{
  "fixes": {
    "slug": "perplexity-space",
    "name": "SPACE",
    "listing": "https://www.anchorterminal.com/tools/perplexity-space",
    "markdown": "# Fix list: SPACE\n\nFrom Anchor Terminal's listing at https://www.anchorterminal.com/tools/perplexity-space, the October 2026 research run, assessed 16 October 2026. Grade C, 56.2 out of 100.\n\nThis is everything the published grade says the listing lacks, the biggest possible gain to the total first. It comes from the reason given for each score, the checklist each category was scored against (https://www.anchorterminal.com/benchmark/#checklist), the provenance checks, the deductions, what we couldn't check and what the review panel asked for. A fix counts at the next check, once it's public.\n\nFor a coding agent working on SPACE: work through the items below in the product, its docs and its public pages. Each category gives the reason for its score, with the points each checklist item earned, and the checklist itself, so the gap is the items that earned less than their points. Change the product, not the wording, and keep a note of what you changed and where it's published.\n\n## 1. Reliability, 32 out of 100, up to 13.6 more on the total\n\nWhy it scored 32: Read with the local-software lines, because an operator runs SPACE on their own hosts, as for microsoft-execution-containers. A person must deploy it before any agent can call it. No package, crate or public container image. CI pushes images only to a private ECR registry, and the guide builds from a git clone with bootstrap scripts. Host requirements are stated in detail (apt-based Linux x86_64, /dev/kvm, /dev/net/tun, btrfs, privileged Docker, Python 3.8 or later) (10 of 20). Workflows run on pull requests, the merge queue and main, with nextest, clippy, cargo deny, cargo vet and Kind smoke suites. Run results weren't readable to us, so passing on main is unchecked (12 of 25). Issues weren't readable either, because GitHub's robots.txt disallows our fetcher and the GitHub API isn't available in this session, so the crash and regression record is unchecked. The commit log shows fixes merged every day since 5 October (5 of 25). docs/versioning.md sets semver rules before and after 1.0, but there is no changelog and no tag, although the same page says the v0.8.0 tag should mark the tested commit (5 of 15). Version 0.8.0, a public baseline ahead of the last planned breaking release, 0.9.0 (0 of 15). 32.\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-reliability):\n\nHosted APIs, MCP servers, models and platforms.\n\n- 20, a public status page with component history (Statuspage, Instatus, BetterStack or the vendor's own).\n- 0 to 30, the incident record for the last 90 days on that page. 30 for a clean record or trivial incidents only, 20 for minor incidents only, 10 for one major outage (an hour or more of a core API down, or errors across the board), 0 for several. 5 when there's no history we could read, and the note says so.\n- 15, rate limits documented with numbers.\n- 15, documented 429 or overload handling (Retry-After, backoff guidance), and idempotency keys or safe-retry guidance where writes are involved.\n- 10, an SLA published for any paid tier.\n- 10, the surface agents use is generally available, not beta or preview.\n\nLocal packages, SDKs, frameworks and stdio MCP servers.\n\n- 20, installs from an official package with supported runtimes stated.\n- 25, a public CI and test suite, passing on the default branch.\n- 0 to 25, open crash or regression issues relative to activity (25 for few and handled, 0 for many, old and unanswered).\n- 15, semver discipline and breaking changes called out in a changelog.\n- 15, version 1.0 or later, or declared stable.\n\nProtocols are read from their reference implementations, the public facilitators or servers, spec stability and test vectors.\n\n## 2. Maintenance \u0026 community, 26 out of 100, up to 6.5 more on the total\n\nWhy it scored 26: Version 0.8.0 is in Cargo.toml and on the docs site, but there is no tag, GitHub release or package, so half credit, as for agentgate (15 of 30). No releases or dated changelog entries, though main took 339 commits between 5 and 16 October 2026 (0 of 20). Issues and pull requests weren't readable to us. Commit messages reference pull requests numbered up to #553 from 15 authors, and CONTRIBUTING.md says the team is still building capacity to review outside contributions, so we couldn't judge replies to outsiders (5 of 25). No official SDK for the native API and no MCP server (0 of 15). A pinned Rust toolchain, a lock file, and cargo deny and cargo vet in CI, with run results unchecked (6 of 10). The project is 11 days old as a public repository. 26.\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-maintenance):\n\n- 0 to 30, time since the last release, or the last published model or API change for a closed service. 30 within 30 days, 20 within 90, 10 within 180, 0 older.\n- 20, at least three releases or dated changelog entries in the last 90 days.\n- 0 to 25, responsiveness. Issues and pull requests answered on GitHub (the open issues and how recent the replies are). For closed services, a public changelog and a support or community channel that answers, 0 to 15.\n- 15, presence in the official MCP registry under a verified namespace (MCP servers), or current official SDKs (APIs and models).\n- 10, package health, current dependencies and CI.\n\nModels are read for deprecation notice periods and model churn rather than release counts.\n\n## 3. Security \u0026 auth, 64 out of 100, up to 6.3 more on the total\n\nWhy it scored 64: Graded as the API an agent calls on a deployment. Management calls take a bearer token from a password login at `/auth/v1/sessions` or a service token, with admin and member roles, and command streams take separate session-scoped tokens that last 5 minutes. ECW keys go in `X-API-Key`, are created by an operator with a script and SQL, and are stored as SHA-256 hashes. We found no key scopes or documented revocation (20 of 30). Per-sandbox egress policies with allow and deny lists by domain, IP and CIDR, operator egress profiles, and explicit tenant and platform denies that win over allows. In the Kind setup, a NetworkPolicy limits sandbox pods to the public IPv4 internet and cluster DNS. No read-only token was found, and confirmation for stop and kill is in the console only (14 of 20). Command output is untrusted content. Credential rules let the network gateway add secret headers for an exact host, port and path on GET and POST, so the guest doesn't hold the secret, but the feature is off by default, set out in source rather than a guide page, and we found no guidance for callers on handling output (10 of 15). The credential manager logs every denied and issued storage-credential exchange as a `credential_security_audit` event without secret values, and operations are records the API returns. No per-call audit log for the public API was found (8 of 15). SECURITY.md routes reports to GitHub private reporting or security@perplexity.ai, security.txt on www.perplexity.ai is valid until 31 December 2027, and CI runs cargo deny advisories, cargo vet and a Gitleaks hook. Only the latest minor release gets fixes, and published advisories and any bug bounty were unchecked (12 of 20). 64.\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-security):\n\n- 0 to 30, the credential model. 30 for OAuth 2.1 with scopes, or scoped and revocable keys with rotation. 20 for plain revocable API keys. 10 for one all-powerful key. 10 off when a secret can travel in a URL query string as a documented option.\n- 0 to 20, read-only or least-privilege modes, and confirmation or approval for destructive actions.\n- 0 to 15, prompt-injection posture where the tool returns untrusted content (documented mitigations or guidance). A tool that returns no untrusted content gets 10.\n- 0 to 15, audit logs or per-call visibility for the operator.\n- 0 to 20, a security programme. security.txt or a disclosure policy, a bug bounty, SOC 2 or ISO 27001, advisories handled in public.\n\nModels are read for retention, whether API data trains models (and whether that's off by default), zero-retention options and certifications. Frameworks for telemetry defaults, approval hooks, guardrails and sandboxing.\n\n## 4. Agent ergonomics, 66 out of 100, up to 5.5 more on the total\n\nWhy it scored 66: Graded on the native API once deployed. List calls return whole sandbox objects with no field selection, and command output arrives as base64 stdout and stderr frames over SSE with no truncation control (12 of 25). Cursor pagination with `limit` (default 100, capped at 1,000), but no filters on the sandbox list (10 of 20). `PublicErrorEnvelope` carries a stable `code`, `message`, `request_id`, typed `details` and a `retryable` flag, and the spec sets backoff (honour `Retry-After`, otherwise one second doubling with jitter, five attempts). ECW returns E2B-shaped errors (19 of 20). Lifecycle calls and command creation require an `Idempotency-Key` kept for 24 hours, and a reused key with a different body returns `idempotency_conflict`. ECW command starts accept a 60-second key. Kill and signal don't deduplicate (18 of 20). A create needs only `template`, but a first command takes a create, operation polling, a readiness check, a command session and an SSE attach on a separate host with its own token. No official SDK for the native API, and ECW relies on E2B's own Python SDK (7 of 15). 66.\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-ergonomics):\n\n- 0 to 25, context cost. For MCP, the number and size of the tool definitions (25 for ten or fewer compact tools, 15 for 11 to 30, 5 for more than 30, plus up to 10 back for toolsets, dynamic loading or read-only subsets). For APIs, whether responses can be sized (field selection, limits, summaries).\n- 20, pagination, filtering and output-size controls.\n- 20, actionable, documented error responses, codes and messages an agent can recover from.\n- 20, idempotency or safe retries, and for MCP the `readOnlyHint` and `destructiveHint` annotations.\n- 15, sensible defaults, few required parameters, and official SDKs in at least two languages.\n\nModels are read for tool use, structured output, prompt caching, context length, batch and SDKs. Frameworks for how much code and how many defaults a tool-calling agent with MCP needs.\n\n## 5. Payments \u0026 pricing, 60 out of 100, up to 5 more on the total\n\nWhy it scored 60: Read with the self-hosted rule. No x402, MPP or L402 (0 of 40). Apache-2.0 software with nothing to buy from Perplexity and no hosted SPACE service (20). Free with no card (20). No signup with Perplexity, so the onboarding line is met under the rule, although a person has to deploy SPACE and issue a token before an agent can call it (20). 60.\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-payments):\n\nThe published rubric, also on the [x402 page](https://www.anchorterminal.com/x402/).\n\n- 40, a machine payment protocol (x402, MPP or L402) on the tool's own endpoints. 10 to 30 when it covers only some endpoints or only goes through a third party, and the note says which.\n- 20, per-call or per-unit pricing published without a login. 10 for public plan-only pricing, 0 for \"contact sales\" or prices behind a login.\n- 20, a free tier or trial that doesn't need a card.\n- 20, autonomous onboarding, meaning an agent can get access without a person signing up in a browser (keyless use, x402, a programmatic key API).\n\nPayment platforms and agent wallets rarely charge for their own API over a machine protocol, so the first line has steps for them, and the highest one that applies counts. 40 when x402, MPP or L402 runs on all their own endpoints, 30 when it runs on part of their own API, 25 when their merchants can accept one, 20 for running a facilitator, 15 for paying as a buyer, and 0 when the only protocol is their own. Merchant acceptance sits above a facilitator because the platform's own customers can charge agents through it, while a facilitator settles for sellers who wire up the protocol themselves. The counter-argument (a facilitator does more for the protocol as a whole) has a point. Each note says which step applied.\n\nOpen-source software you run yourself is scored on its hosted or paid option if it has one. A free, self-hosted package with nothing to buy gets 20, 20 and 20 for the last three lines, and 0 to 40 for the first only if it ships a payment protocol.\n\n## 6. Schema \u0026 documentation, 75 out of 100, up to 4.1 more on the total\n\nWhy it scored 75: Read as an HTTP API. OpenAPI 3.1 for 14 supported operations, served at `/openapi-m1.json` by each deployment and published as openapi.json on the docs site. The E2B Compatibility Wrapper routes are not in it, and `network_policy` and `auto_lifecycle` are open objects marked incubating (22 of 25). No llms.txt (404 on 16 October 2026). The guide is HTML built from Markdown files in the repository (5 of 10). The README says when to use SPACE, the ECW guide says when to choose ECW over the native API, and the docs separate pause from suspend and operation state from command exit status (16 of 20). Command fields carry length limits, patterns and a closed runtime enum, and `template` is the only required create field. The policy and lifecycle objects are free-form (12 of 15). 134 examples in the spec, a standard-library Python walkthrough, curl requests, and documented error codes with HTTP statuses and retryability for each operation (13 of 15). Versioned `/v1` paths, a compatibility baseline of the first OpenAPI contract kept in the repository and a written versioning policy, but no changelog or release notes (7 of 15). 75.\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-schema):\n\nAPIs and MCP servers.\n\n- 25, a machine-readable contract (a public OpenAPI file or similar; for MCP, typed JSON Schema inputs on every tool).\n- 10, llms.txt or Markdown docs served for agents.\n- 0 to 20, descriptions that say what a tool is for, when to use it and when not to, read from the tool definitions in the source or the API reference.\n- 0 to 15, typed inputs with enums, constraints and required fields, and no free-form JSON blobs.\n- 0 to 15, examples and documented error responses.\n- 15, versioning and a public changelog.\n\nModels are read from the API reference, the OpenAPI file, llms.txt, the structured-output and tool-use docs and the model cards. Frameworks from docs a model can follow, typed interfaces, examples and the API reference.\n\n## 7. Transparency \u0026 trust, 68 out of 100, up to 2.8 more on the total\n\nMade of editorial 73, provenance 63.\n\nWhy it scored 68: Apache-2.0 in LICENSE, copyright Perplexity AI 2026 (30). Self-hosted, and the architecture keeps state in the operator's PostgreSQL and object storage, with telemetry going to a receiver the operator configures. No statement covers data handling or says that nothing reaches Perplexity. The install guide warns that bootstrap copies AWS and Datadog credentials from the shell into cluster secrets (15 of 30). docs/versioning.md says deprecated functionality stays supported until the next major release from 1.0 and promises migration guidance before 0.9.0, and SECURITY.md fixes only the latest minor. No dated notices (12 of 20). docs/observability.md sets out every metrics and trace selector. The default `auto` sends to a Datadog Agent when the build includes that client, and `off` disables each signal (16 of 20). 73.\n\nThe checklist (https://www.anchorterminal.com/benchmark/#checklist-transparency):\n\n- 0 to 30, source availability and licence clarity. 30 for open source under an OSI licence, 15 for closed with clear terms, 0 for unclear terms.\n- 0 to 30, data handling and retention statements that agree with each other (privacy policy, DPA, retention periods, subprocessors).\n- 0 to 20, a deprecation policy or notices with dates.\n- 0 to 20, telemetry disclosed with an opt-out (local software), or subprocessors and data locations disclosed (hosted).\n\nThe other half of Transparency and trust is the provenance score, computed from checked facts (below). The category score is the mean of the two.\n\nProvenance checks not met in full (half of this category, computed from checked facts):\n\n- Domain age: perplexity.ai, registered 2022-07-08 (4 years) (7 of 15)\n- Status page: not found (0 of 10)\n- Changelog: not found (0 of 10)\n\n## What we couldn't check\n\nWhat we couldn't read counted as absent. Publishing it on a page a plain HTTP fetch can read (not only in a browser) lets the next check count it.\n\n- unchecked: GitHub stars, issues, pull request discussions, CI run results and security advisories. WebFetch refused github.com under its robots.txt and the GitHub API is not available in this session. Commit counts, authors and dates come from a full clone\n- unchecked: the open-source announcement itself. The founder's message quotes it, but no first-hand page for it was found. The July post 'Secure Sandboxes for Agents' was read and does not mention open-sourcing, and it carries no date on the page\n- When the repository became public. Its first commit, 'Initial public release of SPACE', is dated 5 October 2026 and pull requests were merged from that day, while the lead dates the announcement 16 October. `firstReleased` uses the commit date\n- Credential injection is documented as behaviour only through configuration rows, one sentence in the architecture guide and a smoke scenario. The rule format, header binding and GET and POST limits were read in the source. 'Credentials never pass into the sandbox' is Perplexity's claim about its own deployment\n- The OpenAPI `runtime` enum accepts cloud-hypervisor and gvisor, while the execution environments page says only Firecracker E0 is implemented and production-qualified. Whether the other runtimes work on a 0.8.0 deployment is unclear\n- The guide says the architecture can run without Kubernetes through a direct adapter, but no setup guide covers that path\n- setup.minutes (120) is our estimate. The installation guide times its build steps but gives no expected duration\n- WebFetch refused space.docs.perplexity.ai as outside its allowed set, so the guide index, API index, openapi.json, the two build.json files and security.txt were read with curl. The site has no robots.txt\n- Whether Perplexity runs a bug bounty that covers SPACE. security.txt points to https://www.perplexity.ai/security, which was not read\n\n## Weaknesses\n\n- A person must deploy it first, on an apt-based Linux x86_64 host with KVM, privileged Docker and Kubernetes (Kind in the guide)\n- Version 0.8.0 has no git tag, GitHub release or changelog, and CI pushes container images only to a private registry\n- The `network_policy` and idle-lifecycle create fields are marked incubating, outside the supported contract, and typed as open objects\n- Credential injection is off by default, needs AWS Secrets Manager, and has no page of its own in the user guide\n- The wrapper rejects E2B's `mcp`, `volumeMounts` and `iam` options, team template names and pause without memory, and only Python is tested\n\n## What costs an agent a turn today\n\nThe notes we give agents before they call it. Each one is a workaround an agent shouldn't need.\n\n- Ask your operator for the API base URL (before `/v1`, or `/api/v1` on shared hosts), the data-plane URL and a bearer token before planning any call\n- Poll the returned operation until it succeeds and the sandbox is `running` before creating a command. A 202 response is not readiness\n- Attach to the command's events URL with its session token to start the process, decode base64 output, and treat only `process_exited` as completion\n- Send an `Idempotency-Key` on creates, lifecycle calls and commands, and retry only when `retryable` is true, after any `Retry-After`\n- Save output as it arrives. Reconnecting with `Last-Event-ID` returns `resync_required`, not the missed output\n\n## What the review panel asked for\n\n- tag v0.8.0 and publish a changelog\n- dated notices for 0.9.0 changes\n- add wrapper routes to the spec\n- type the network policy object\n- Publish rate and latency figures\n- Replay missed output on reconnect\n- scoped revocable keys\n- credential injection guide\n\n## When it's done\n\nSend what changed and where it's published as a dispute (https://www.anchorterminal.com/builders/#disputes, or `POST https://www.anchorterminal.com/api/v1/contact` with `\"kind\": \"dispute\"`). Disputes are answered in public, and the listing is checked again by the same checklist. Paying for an audit or a listing claim changes nothing here.\n",
    "grade": "C",
    "score": 56.2,
    "assessed": "2026-10-16",
    "run": "October 2026 research run",
    "categories": [
      {
        "key": "reliability",
        "name": "Reliability",
        "score": 32,
        "maxGain": 13.6,
        "reason": "Read with the local-software lines, because an operator runs SPACE on their own hosts, as for microsoft-execution-containers. A person must deploy it before any agent can call it. No package, crate or public container image. CI pushes images only to a private ECR registry, and the guide builds from a git clone with bootstrap scripts. Host requirements are stated in detail (apt-based Linux x86_64, /dev/kvm, /dev/net/tun, btrfs, privileged Docker, Python 3.8 or later) (10 of 20). Workflows run on pull requests, the merge queue and main, with nextest, clippy, cargo deny, cargo vet and Kind smoke suites. Run results weren't readable to us, so passing on main is unchecked (12 of 25). Issues weren't readable either, because GitHub's robots.txt disallows our fetcher and the GitHub API isn't available in this session, so the crash and regression record is unchecked. The commit log shows fixes merged every day since 5 October (5 of 25). docs/versioning.md sets semver rules before and after 1.0, but there is no changelog and no tag, although the same page says the v0.8.0 tag should mark the tested commit (5 of 15). Version 0.8.0, a public baseline ahead of the last planned breaking release, 0.9.0 (0 of 15). 32.",
        "checklist": [
          "Hosted APIs, MCP servers, models and platforms.",
          "- 20, a public status page with component history (Statuspage, Instatus, BetterStack or the vendor's own).\n- 0 to 30, the incident record for the last 90 days on that page. 30 for a clean record or trivial incidents only, 20 for minor incidents only, 10 for one major outage (an hour or more of a core API down, or errors across the board), 0 for several. 5 when there's no history we could read, and the note says so.\n- 15, rate limits documented with numbers.\n- 15, documented 429 or overload handling (Retry-After, backoff guidance), and idempotency keys or safe-retry guidance where writes are involved.\n- 10, an SLA published for any paid tier.\n- 10, the surface agents use is generally available, not beta or preview.",
          "Local packages, SDKs, frameworks and stdio MCP servers.",
          "- 20, installs from an official package with supported runtimes stated.\n- 25, a public CI and test suite, passing on the default branch.\n- 0 to 25, open crash or regression issues relative to activity (25 for few and handled, 0 for many, old and unanswered).\n- 15, semver discipline and breaking changes called out in a changelog.\n- 15, version 1.0 or later, or declared stable.",
          "Protocols are read from their reference implementations, the public facilitators or servers, spec stability and test vectors."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-reliability"
      },
      {
        "key": "maintenance",
        "name": "Maintenance \u0026 community",
        "score": 26,
        "maxGain": 6.5,
        "reason": "Version 0.8.0 is in Cargo.toml and on the docs site, but there is no tag, GitHub release or package, so half credit, as for agentgate (15 of 30). No releases or dated changelog entries, though main took 339 commits between 5 and 16 October 2026 (0 of 20). Issues and pull requests weren't readable to us. Commit messages reference pull requests numbered up to #553 from 15 authors, and CONTRIBUTING.md says the team is still building capacity to review outside contributions, so we couldn't judge replies to outsiders (5 of 25). No official SDK for the native API and no MCP server (0 of 15). A pinned Rust toolchain, a lock file, and cargo deny and cargo vet in CI, with run results unchecked (6 of 10). The project is 11 days old as a public repository. 26.",
        "checklist": [
          "- 0 to 30, time since the last release, or the last published model or API change for a closed service. 30 within 30 days, 20 within 90, 10 within 180, 0 older.\n- 20, at least three releases or dated changelog entries in the last 90 days.\n- 0 to 25, responsiveness. Issues and pull requests answered on GitHub (the open issues and how recent the replies are). For closed services, a public changelog and a support or community channel that answers, 0 to 15.\n- 15, presence in the official MCP registry under a verified namespace (MCP servers), or current official SDKs (APIs and models).\n- 10, package health, current dependencies and CI.",
          "Models are read for deprecation notice periods and model churn rather than release counts."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-maintenance"
      },
      {
        "key": "security",
        "name": "Security \u0026 auth",
        "score": 64,
        "maxGain": 6.3,
        "reason": "Graded as the API an agent calls on a deployment. Management calls take a bearer token from a password login at `/auth/v1/sessions` or a service token, with admin and member roles, and command streams take separate session-scoped tokens that last 5 minutes. ECW keys go in `X-API-Key`, are created by an operator with a script and SQL, and are stored as SHA-256 hashes. We found no key scopes or documented revocation (20 of 30). Per-sandbox egress policies with allow and deny lists by domain, IP and CIDR, operator egress profiles, and explicit tenant and platform denies that win over allows. In the Kind setup, a NetworkPolicy limits sandbox pods to the public IPv4 internet and cluster DNS. No read-only token was found, and confirmation for stop and kill is in the console only (14 of 20). Command output is untrusted content. Credential rules let the network gateway add secret headers for an exact host, port and path on GET and POST, so the guest doesn't hold the secret, but the feature is off by default, set out in source rather than a guide page, and we found no guidance for callers on handling output (10 of 15). The credential manager logs every denied and issued storage-credential exchange as a `credential_security_audit` event without secret values, and operations are records the API returns. No per-call audit log for the public API was found (8 of 15). SECURITY.md routes reports to GitHub private reporting or security@perplexity.ai, security.txt on www.perplexity.ai is valid until 31 December 2027, and CI runs cargo deny advisories, cargo vet and a Gitleaks hook. Only the latest minor release gets fixes, and published advisories and any bug bounty were unchecked (12 of 20). 64.",
        "checklist": [
          "- 0 to 30, the credential model. 30 for OAuth 2.1 with scopes, or scoped and revocable keys with rotation. 20 for plain revocable API keys. 10 for one all-powerful key. 10 off when a secret can travel in a URL query string as a documented option.\n- 0 to 20, read-only or least-privilege modes, and confirmation or approval for destructive actions.\n- 0 to 15, prompt-injection posture where the tool returns untrusted content (documented mitigations or guidance). A tool that returns no untrusted content gets 10.\n- 0 to 15, audit logs or per-call visibility for the operator.\n- 0 to 20, a security programme. security.txt or a disclosure policy, a bug bounty, SOC 2 or ISO 27001, advisories handled in public.",
          "Models are read for retention, whether API data trains models (and whether that's off by default), zero-retention options and certifications. Frameworks for telemetry defaults, approval hooks, guardrails and sandboxing."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-security"
      },
      {
        "key": "ergonomics",
        "name": "Agent ergonomics",
        "score": 66,
        "maxGain": 5.5,
        "reason": "Graded on the native API once deployed. List calls return whole sandbox objects with no field selection, and command output arrives as base64 stdout and stderr frames over SSE with no truncation control (12 of 25). Cursor pagination with `limit` (default 100, capped at 1,000), but no filters on the sandbox list (10 of 20). `PublicErrorEnvelope` carries a stable `code`, `message`, `request_id`, typed `details` and a `retryable` flag, and the spec sets backoff (honour `Retry-After`, otherwise one second doubling with jitter, five attempts). ECW returns E2B-shaped errors (19 of 20). Lifecycle calls and command creation require an `Idempotency-Key` kept for 24 hours, and a reused key with a different body returns `idempotency_conflict`. ECW command starts accept a 60-second key. Kill and signal don't deduplicate (18 of 20). A create needs only `template`, but a first command takes a create, operation polling, a readiness check, a command session and an SSE attach on a separate host with its own token. No official SDK for the native API, and ECW relies on E2B's own Python SDK (7 of 15). 66.",
        "checklist": [
          "- 0 to 25, context cost. For MCP, the number and size of the tool definitions (25 for ten or fewer compact tools, 15 for 11 to 30, 5 for more than 30, plus up to 10 back for toolsets, dynamic loading or read-only subsets). For APIs, whether responses can be sized (field selection, limits, summaries).\n- 20, pagination, filtering and output-size controls.\n- 20, actionable, documented error responses, codes and messages an agent can recover from.\n- 20, idempotency or safe retries, and for MCP the `readOnlyHint` and `destructiveHint` annotations.\n- 15, sensible defaults, few required parameters, and official SDKs in at least two languages.",
          "Models are read for tool use, structured output, prompt caching, context length, batch and SDKs. Frameworks for how much code and how many defaults a tool-calling agent with MCP needs."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-ergonomics"
      },
      {
        "key": "payments",
        "name": "Payments \u0026 pricing",
        "score": 60,
        "maxGain": 5,
        "reason": "Read with the self-hosted rule. No x402, MPP or L402 (0 of 40). Apache-2.0 software with nothing to buy from Perplexity and no hosted SPACE service (20). Free with no card (20). No signup with Perplexity, so the onboarding line is met under the rule, although a person has to deploy SPACE and issue a token before an agent can call it (20). 60.",
        "checklist": [
          "The published rubric, also on the [x402 page](https://www.anchorterminal.com/x402/).",
          "- 40, a machine payment protocol (x402, MPP or L402) on the tool's own endpoints. 10 to 30 when it covers only some endpoints or only goes through a third party, and the note says which.\n- 20, per-call or per-unit pricing published without a login. 10 for public plan-only pricing, 0 for \"contact sales\" or prices behind a login.\n- 20, a free tier or trial that doesn't need a card.\n- 20, autonomous onboarding, meaning an agent can get access without a person signing up in a browser (keyless use, x402, a programmatic key API).",
          "Payment platforms and agent wallets rarely charge for their own API over a machine protocol, so the first line has steps for them, and the highest one that applies counts. 40 when x402, MPP or L402 runs on all their own endpoints, 30 when it runs on part of their own API, 25 when their merchants can accept one, 20 for running a facilitator, 15 for paying as a buyer, and 0 when the only protocol is their own. Merchant acceptance sits above a facilitator because the platform's own customers can charge agents through it, while a facilitator settles for sellers who wire up the protocol themselves. The counter-argument (a facilitator does more for the protocol as a whole) has a point. Each note says which step applied.",
          "Open-source software you run yourself is scored on its hosted or paid option if it has one. A free, self-hosted package with nothing to buy gets 20, 20 and 20 for the last three lines, and 0 to 40 for the first only if it ships a payment protocol."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-payments"
      },
      {
        "key": "schema",
        "name": "Schema \u0026 documentation",
        "score": 75,
        "maxGain": 4.1,
        "reason": "Read as an HTTP API. OpenAPI 3.1 for 14 supported operations, served at `/openapi-m1.json` by each deployment and published as openapi.json on the docs site. The E2B Compatibility Wrapper routes are not in it, and `network_policy` and `auto_lifecycle` are open objects marked incubating (22 of 25). No llms.txt (404 on 16 October 2026). The guide is HTML built from Markdown files in the repository (5 of 10). The README says when to use SPACE, the ECW guide says when to choose ECW over the native API, and the docs separate pause from suspend and operation state from command exit status (16 of 20). Command fields carry length limits, patterns and a closed runtime enum, and `template` is the only required create field. The policy and lifecycle objects are free-form (12 of 15). 134 examples in the spec, a standard-library Python walkthrough, curl requests, and documented error codes with HTTP statuses and retryability for each operation (13 of 15). Versioned `/v1` paths, a compatibility baseline of the first OpenAPI contract kept in the repository and a written versioning policy, but no changelog or release notes (7 of 15). 75.",
        "checklist": [
          "APIs and MCP servers.",
          "- 25, a machine-readable contract (a public OpenAPI file or similar; for MCP, typed JSON Schema inputs on every tool).\n- 10, llms.txt or Markdown docs served for agents.\n- 0 to 20, descriptions that say what a tool is for, when to use it and when not to, read from the tool definitions in the source or the API reference.\n- 0 to 15, typed inputs with enums, constraints and required fields, and no free-form JSON blobs.\n- 0 to 15, examples and documented error responses.\n- 15, versioning and a public changelog.",
          "Models are read from the API reference, the OpenAPI file, llms.txt, the structured-output and tool-use docs and the model cards. Frameworks from docs a model can follow, typed interfaces, examples and the API reference."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-schema"
      },
      {
        "key": "transparency",
        "name": "Transparency \u0026 trust",
        "score": 68,
        "maxGain": 2.8,
        "reason": "Apache-2.0 in LICENSE, copyright Perplexity AI 2026 (30). Self-hosted, and the architecture keeps state in the operator's PostgreSQL and object storage, with telemetry going to a receiver the operator configures. No statement covers data handling or says that nothing reaches Perplexity. The install guide warns that bootstrap copies AWS and Datadog credentials from the shell into cluster secrets (15 of 30). docs/versioning.md says deprecated functionality stays supported until the next major release from 1.0 and promises migration guidance before 0.9.0, and SECURITY.md fixes only the latest minor. No dated notices (12 of 20). docs/observability.md sets out every metrics and trace selector. The default `auto` sends to a Datadog Agent when the build includes that client, and `off` disables each signal (16 of 20). 73.",
        "blend": "editorial 73, provenance 63",
        "checklist": [
          "- 0 to 30, source availability and licence clarity. 30 for open source under an OSI licence, 15 for closed with clear terms, 0 for unclear terms.\n- 0 to 30, data handling and retention statements that agree with each other (privacy policy, DPA, retention periods, subprocessors).\n- 0 to 20, a deprecation policy or notices with dates.\n- 0 to 20, telemetry disclosed with an opt-out (local software), or subprocessors and data locations disclosed (hosted).",
          "The other half of Transparency and trust is the provenance score, computed from checked facts (below). The category score is the mean of the two."
        ],
        "checklistUrl": "https://www.anchorterminal.com/benchmark/#checklist-transparency"
      }
    ],
    "provenance": [
      {
        "label": "Domain age",
        "value": "perplexity.ai, registered 2022-07-08 (4 years)",
        "points": 7,
        "max": 15
      },
      {
        "label": "Status page",
        "value": "not found",
        "points": 0,
        "max": 10
      },
      {
        "label": "Changelog",
        "value": "not found",
        "points": 0,
        "max": 10
      }
    ],
    "unchecked": [
      "unchecked: GitHub stars, issues, pull request discussions, CI run results and security advisories. WebFetch refused github.com under its robots.txt and the GitHub API is not available in this session. Commit counts, authors and dates come from a full clone",
      "unchecked: the open-source announcement itself. The founder's message quotes it, but no first-hand page for it was found. The July post 'Secure Sandboxes for Agents' was read and does not mention open-sourcing, and it carries no date on the page",
      "When the repository became public. Its first commit, 'Initial public release of SPACE', is dated 5 October 2026 and pull requests were merged from that day, while the lead dates the announcement 16 October. `firstReleased` uses the commit date",
      "Credential injection is documented as behaviour only through configuration rows, one sentence in the architecture guide and a smoke scenario. The rule format, header binding and GET and POST limits were read in the source. 'Credentials never pass into the sandbox' is Perplexity's claim about its own deployment",
      "The OpenAPI `runtime` enum accepts cloud-hypervisor and gvisor, while the execution environments page says only Firecracker E0 is implemented and production-qualified. Whether the other runtimes work on a 0.8.0 deployment is unclear",
      "The guide says the architecture can run without Kubernetes through a direct adapter, but no setup guide covers that path",
      "setup.minutes (120) is our estimate. The installation guide times its build steps but gives no expected duration",
      "WebFetch refused space.docs.perplexity.ai as outside its allowed set, so the guide index, API index, openapi.json, the two build.json files and security.txt were read with curl. The site has no robots.txt",
      "Whether Perplexity runs a bug bounty that covers SPACE. security.txt points to https://www.perplexity.ai/security, which was not read"
    ],
    "weaknesses": [
      "A person must deploy it first, on an apt-based Linux x86_64 host with KVM, privileged Docker and Kubernetes (Kind in the guide)",
      "Version 0.8.0 has no git tag, GitHub release or changelog, and CI pushes container images only to a private registry",
      "The `network_policy` and idle-lifecycle create fields are marked incubating, outside the supported contract, and typed as open objects",
      "Credential injection is off by default, needs AWS Secrets Manager, and has no page of its own in the user guide",
      "The wrapper rejects E2B's `mcp`, `volumeMounts` and `iam` options, team template names and pause without memory, and only Python is tested"
    ],
    "agentNotes": [
      "Ask your operator for the API base URL (before `/v1`, or `/api/v1` on shared hosts), the data-plane URL and a bearer token before planning any call",
      "Poll the returned operation until it succeeds and the sandbox is `running` before creating a command. A 202 response is not readiness",
      "Attach to the command's events URL with its session token to start the process, decode base64 output, and treat only `process_exited` as completion",
      "Send an `Idempotency-Key` on creates, lifecycle calls and commands, and retry only when `retryable` is true, after any `Retry-After`",
      "Save output as it arrives. Reconnecting with `Last-Event-ID` returns `resync_required`, not the missed output"
    ],
    "requests": [
      {
        "text": "tag v0.8.0 and publish a changelog",
        "reviews": 1
      },
      {
        "text": "dated notices for 0.9.0 changes",
        "reviews": 1
      },
      {
        "text": "add wrapper routes to the spec",
        "reviews": 1
      },
      {
        "text": "type the network policy object",
        "reviews": 1
      },
      {
        "text": "Publish rate and latency figures",
        "reviews": 1
      },
      {
        "text": "Replay missed output on reconnect",
        "reviews": 1
      },
      {
        "text": "scoped revocable keys",
        "reviews": 1
      },
      {
        "text": "credential injection guide",
        "reviews": 1
      }
    ],
    "recheck": "https://www.anchorterminal.com/builders/#disputes"
  },
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "attributionRequired": true,
    "credit": "CC BY 4.0, credit required: when you show, quote or pass on anything from here (to a user in an answer, in a product, a report or a dataset), say it's from Anchor Terminal (anchorterminal.com) and link the page or API address you took it from. Reviews also credit their author.",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-16",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.4",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run",
    "terms": "https://www.anchorterminal.com/terms/#data"
  }
}
