{
 "slug": "neon",
 "name": "Neon",
 "url": "https://neon.com",
 "domain": "neon.com",
 "category": "databases",
 "category_name": "Databases",
 "tested_at": "2026-10-02",
 "run": "20261002T204905Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261001T202653Z",
   "date": "2026-10-01",
   "level": 3,
   "engine": {
    "runner": "omp",
    "model": null,
    "driver": null,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   },
   "drives": 2
  },
  {
   "run": "20261002T204905Z",
   "date": "2026-10-02",
   "level": 2,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": null,
    "robots": "start"
   },
   "why": "product"
  }
 ],
 "level": 2,
 "level_name": "Gets in",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 3,
  "tries": 3,
  "self_start": true
 },
 "badges": [
  "agent-can-leave"
 ],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: try first, claim later",
   "how": "no-account"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "no",
   "text": "Work done: 45% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, what it made goes after 3 days",
   "how": "no-account",
   "left": "expires",
   "after_hours": 72
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "yes",
   "text": "Docs agents can read: llms.txt, an OpenAPI and an MCP server",
   "have": [
    "llms_txt",
    "openapi",
    "mcp"
   ]
  },
  {
   "key": "access",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: try first, claim later",
   "how": "no-account",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "no",
   "text": "Work done: 45% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, what it made goes after 3 days",
   "how": "no-account",
   "left": "expires",
   "after_hours": 72,
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "try_first",
   "label": "Try first, claim later",
   "routes": [
    "claimable"
   ],
   "minutes": 3.3,
   "core": "5/11"
  }
 ],
 "minutes": 3.3,
 "next": {
  "to": 3,
  "text": "Next: do half of the core work (now 45%)"
 },
 "stop": null,
 "core": "5/11",
 "scores": {
  "coverage": 34,
  "reliability": 100,
  "resilience": null,
  "setup": 100,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 100,
  "security": null,
  "standards": []
 },
 "reliability_method": "first-try",
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": 45,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": null,
  "prompt_sha": null,
  "kb_version": null,
  "identity": null
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 2,
  "signed": true,
  "inbox": null,
  "robots": "start"
 },
 "same_level_drives": 1,
 "drives": 3,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": null,
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "in"
  },
  "signed": {
   "state": "robots",
   "kind": "signup",
   "at": "2026-10-12"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": "closed",
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "llms.txt (425 lines), every doc page as markdown (.md suffix), and https://neon.com/auth.md: an agent-specific guide to provisioning without signup. CLI ships the OpenAPI spec (neon api --list, 181 routes)."
  },
  "signup": {
   "status": "n/a",
   "note": "Not needed: a documented route works without an account.",
   "no_account": true,
   "note_driver": "Not needed for the agent path: the documented Claimable Neon route (POST /v1/agent/identity) gives a working database without an account. Signing up for a full console account shows a visible Cloudflare check (needs a human); what only an account can do counts in coverage.",
   "status_driver": "n/a"
  },
  "verify": {
   "status": "n/a",
   "note": "Not needed: a documented route works without an account.",
   "no_account": true,
   "note_driver": "No account, so nothing to verify on the claimable route.",
   "status_driver": "n/a"
  },
  "credentials": {
   "status": "headless",
   "note": "Documented no-account route (auth.md, Claimable Neon): `neon claim create` or POST claimable.neon.tech/v1/agent/identity -> claim token -> OAuth jwt-bearer access token -> database_url, Data API and Auth URLs. Temporary (72 h) and limited: most Management API routes return 403 'not available before claim'. A full account API key needs console sign-up.",
   "via": ""
  },
  "first_call": {
   "status": "headless",
   "note": "neon branches list / neon projects get with the claimable credential."
  },
  "first_action": {
   "status": "headless",
   "note": "Created a table and rows over the returned DATABASE_URL (PostgreSQL 17.11); signed up an app user in Managed Better Auth and did CRUD through the Data API."
  },
  "pay": {
   "status": "",
   "grade": "P1",
   "rails": [
    "Stripe Checkout in the Neon Console (Billing page)",
    "AWS Marketplace"
   ],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "note": "Free plan is permanent, no card. Upgrades happen on the console Billing page (Stripe Checkout per docs); no plan/upgrade route in the 181-route OpenAPI spec (only spending_limit). No 402/x402/MPP/L402: unauthenticated /api/v2 calls return 401 JSON; x402./mpp./agents.neon.com do not resolve; no listing in x402 Bazaar or mpp.dev. Reaching the console needs an account, and account sign-up needs a human (Cloudflare interstitial). Nothing was paid.",
   "reached": false
  },
  "cancel": {
   "status": "n/a",
   "note": "Nothing to cancel: our agent used the free plan.",
   "docs_note": "No plan was started. Per docs, downgrading to Free (the only way to stop charges) is done on the console Billing page; legacy Enterprise needs a support ticket. No billing API.",
   "docs_grade": "",
   "nothing": "free_plan"
  },
  "delete": {
   "status": "headless",
   "note": "Partly. Claimable project snowy-surf deleted via documented DELETE claimable.neon.tech/v1/projects/{id} -> 204 (its DB connection kept working ~1-2 min). The other project (odd-boat) could not be deleted: after we opened the claim page (no human accepted), CLI and REST delete returned 409 claim_in_progress, even after GET .../claim reported state expired. It will expire by itself on the 5 Oct 2026 MCP spec (72 h). No account existed, so there was no account to delete.",
   "left": "expires",
   "after_hours": 72,
   "account": false
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-02",
  "source": "drive",
  "options": [
   {
    "id": "stripe-checkout",
    "name": "Stripe Checkout",
    "kind": "checkout",
    "first_party": false,
    "lead": false,
    "networks": [],
    "testnet": false
   },
   {
    "id": "cloud-marketplace",
    "name": "Cloud marketplace billing",
    "kind": "checkout",
    "first_party": false,
    "lead": false,
    "networks": [],
    "testnet": false
   }
  ],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": null,
   "card_required": null,
   "free_plan": true
  },
  "owner_fixes": [
   {
    "title": "Accept x402 or MPP on your API",
    "how": "Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card."
   },
   {
    "title": "List your plans on Stripe Projects",
    "how": "Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev)."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": true,
  "cli": true,
  "sdk": true,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": true,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST Management API v2, 181 routes; claimable proxy at claimable.neon.tech allows only a subset before claim",
  "openapi": "bundled with the CLI (neon api --list/--describe)",
  "cli": "neon 7.0.6 (npm), agent-oriented: claim, config (neon.ts), inspect, data-api, neon-auth, credentials, bootstrap",
  "mcp": "official, mcp.neon.tech with OAuth (DCR works) but authorization needs a Neon login; not driven",
  "llms_txt": "llms.txt plus auth.md for no-signup agents",
  "webhooks": "Neon Auth webhook config in CLI (not tested)"
 },
 "can_do": [
  "Provision a working Postgres 17 database with no account and no human, through the CLI (neon claim create) or plain REST",
  "Run SQL and install extensions (pgvector, PostGIS) on it",
  "Change autoscaling limits and the scale-to-zero timeout, and see the compute suspend and wake up on the next query",
  "Sign up app users in Managed Better Auth and get JWTs headless",
  "Read and write tables through the Data API (PostgREST) with RLS tied to the Auth JWT",
  "Declare compute settings in neon.ts and apply them with neon config plan/apply",
  "Check database health with neon inspect (table sizes, index sizes, seq scans)",
  "Delete an unclaimed project through the documented REST route"
 ],
 "cannot_do": [
  {
   "what": "Create a Neon account / API key",
   "why": "Cloudflare interstitial on the console sign-up page for automated browsers; no headless sign-up"
  },
  {
   "what": "Branch, point-in-time branch, restore, schema diff, read replicas, snapshots, logs, databases/roles",
   "why": "Management routes return 403 'not available before claim' on claimable projects, and claiming needs a human with a Neon account"
  },
  {
   "what": "Deploy Functions, use Object Storage or the AI Gateway",
   "why": "Denied at claim create: requires_claim (AI Gateway also needs paid credits)"
  },
  {
   "what": "Configure auth settings or issue scoped credentials",
   "why": "403 not available before claim"
  },
  {
   "what": "Upgrade or pay the agent way",
   "why": "No billing API or machine-payment rail; upgrades go through Stripe Checkout in the console"
  }
 ],
 "blockers": [
  "Cloudflare 'Performing security verification' interstitial on console sign-up (registration path)",
  "Claimable projects block most Management API routes until a human claims them"
 ],
 "tips_for_owner": [
  "Let verified agents through the sign-up page",
  "Open branching routes on claimable projects",
  "Don't freeze a project when a claim starts",
  "Return identity_assertion as documented",
  "Add a headless account and API-key route",
  "Expose plan upgrades through the API"
 ],
 "tips_for_agents": [
  "No account? Read https://neon.com/auth.md and run `neon claim create` (npm package `neon`): you get Postgres, Data API and Managed Better Auth in seconds, for 72 hours.",
  "The REST identity call returns `claim_token`, not `identity_assertion` as documented; use it as the jwt-bearer assertion.",
  "Pre-claim, most management routes return 403 route_not_allowed; branches, roles, databases, snapshots, logs, credentials, functions and buckets need a claimed project.",
  "Do not mint a claim code until the human is ready: once someone presses Continue to Neon, DATABASE_URL rotates and the project locks (even delete) for 15 minutes.",
  "Data API needs a JWT; get it from Neon Auth: POST {auth}/sign-up/email then GET {auth}/get-session and read the set-auth-jwt header. Run `neon data-api refresh-schema` after DDL.",
  "`neon config apply` will not overwrite existing branch settings without --update-existing.",
  "Commands that read the DB (inspect, databases create) need --role-name/--owner-name because Auth adds extra roles."
 ],
 "selfhost": null,
 "summary": "Neon is unusually agent-friendly without an account: auth.md and `neon claim create` gave a working Postgres database, Managed Better Auth and a Data API in seconds, and we drove SQL, extensions, autoscaling, scale-to-zero, auth sign-ups, RLS-protected REST CRUD and neon.ts deploys headless. The real account is out of reach (a Cloudflare interstitial on console sign-up), and claimable projects block branching, restore, roles, functions, storage and most of the Management API until a human claims them, so 5 of 11 non-gated core capabilities were verified.",
 "wall": "Cloudflare interstitial on the console sign-up page",
 "plan_scope": "none (no account); claimable no-account project (Free-plan limits, pre-claim restrictions)",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Neon is a cloud Postgres database service. Without creating any account, an agent could get a free temporary database and use it for real work in minutes. The agent could not get past Neon's sign-up security check to open a full account, which is needed for almost everything beyond that temporary database.",
  "can_do": [
   "Get a working database with no account and no human, in seconds, using a documented 'try it free' route.",
   "Run SQL queries, add rows, and install extra database features like vector search and maps data.",
   "Automatically shrink the database to save cost when idle, and wake it back up on the next request.",
   "Set up basic user sign-up and login, and let a web app read and write data securely tied to that login.",
   "Check database health and apply configuration changes from a script instead of a web dashboard.",
   "Delete the temporary database when done, through a documented command."
  ],
  "cannot_do": [
   {
    "what": "Create a real, permanent Neon account",
    "why": "The sign-up page shows a security check that never let the automated browser through."
   },
   {
    "what": "Create database branches, restore to an earlier point, or see logs",
    "why": "These need a real claimed account; the temporary database refuses them."
   },
   {
    "what": "Deploy functions, use file storage, or use the AI gateway",
    "why": "These features are turned off until a human claims the project, and some also need a paid plan."
   },
   {
    "what": "Pay for a paid plan",
    "why": "Upgrading only happens on the account dashboard, which needs the account the agent couldn't create."
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "AI Gateway",
   "plan": "Launch/Scale (prepaid credits) and a claimed project",
   "evidence": "claim create: ai-gateway denied requires_claim; pricing.md shows '-' for AI Gateway on Free"
  },
  {
   "capability": "IP allowlist",
   "plan": "paid",
   "evidence": "capability map plan paid"
  },
  {
   "capability": "Protected branches",
   "plan": "paid",
   "evidence": "neon branches create --help: 'Paid plans only.'"
  },
  {
   "capability": "Spending notifications",
   "plan": "paid",
   "evidence": "capability map plan paid; needs an org"
  },
  {
   "capability": "AI Gateway credits",
   "plan": "paid",
   "evidence": "pricing.md: prepaid credits on paid plans"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Postgres core",
   "capability": "Create a serverless Postgres project and run SQL against it",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /projects",
    "mcp": "create_project",
    "cli": "neon projects create / neon databases create",
    "ui": "Console: New project"
   },
   "check": "GET /projects/{id} returns the project; a SQL query against the connection string returns rows",
   "source": "https://neon.com/docs/reference/api; https://neon.com/docs/introduction"
  },
  {
   "id": "cap-02",
   "group": "Branching",
   "capability": "Branch the database (copy-on-write clone of data and schema)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /projects/{project_id}/branches",
    "mcp": "create_branch",
    "cli": "neon branches create",
    "ui": "Console: Branches > Create branch"
   },
   "check": "GET /projects/{project_id}/branches/{branch_id} shows new branch with parent_id set; querying it returns parent's data at branch time",
   "source": "https://neon.com/docs/introduction/branching"
  },
  {
   "id": "cap-03",
   "group": "Branching",
   "capability": "Branch from a specific past point in time (timestamp or LSN)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /projects/{project_id}/branches (parent_timestamp/parent_lsn)",
    "mcp": "create_branch",
    "cli": "neon branches create --parent-timestamp / --parent-lsn",
    "ui": "Console: Branches > Create branch > Time"
   },
   "check": "New branch's data matches a query of the parent run with AS OF that timestamp (Time Travel)",
   "source": "https://neon.com/docs/introduction/branching; https://neon.com/docs/guides/time-travel-assist"
  },
  {
   "id": "cap-04",
   "group": "Branching",
   "capability": "Instantly restore a branch to an earlier point within the history window",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /projects/{project_id}/branches/{branch_id}/restore",
    "mcp": "restore branch tool (branches category)",
    "cli": "neon branches restore",
    "ui": "Console: Branches > Restore"
   },
   "check": "Post-restore query of the branch reflects the earlier state; branch's current_state timestamp moves back",
   "source": "https://neon.com/docs/introduction/branch-restore; https://neon.com/docs/introduction/branching"
  },
  {
   "id": "cap-05",
   "group": "Postgres core",
   "capability": "Autoscale compute (CPU/RAM) up and down with load, or set a fixed size",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /projects/{project_id}/endpoints/{endpoint_id} (autoscaling_limit_min_cu/max_cu)",
    "mcp": "endpoints category tools",
    "cli": "neon branches add-compute / endpoint settings",
    "ui": "Console: Branch > Compute settings"
   },
   "check": "GET endpoint shows autoscaling_limit_min_cu/max_cu changed; compute CU usage in metrics scales under load within those bounds",
   "source": "https://neon.com/pricing; https://neon.com/docs/postgres/overview"
  },
  {
   "id": "cap-06",
   "group": "Postgres core",
   "capability": "Scale compute to zero when idle (and wake automatically on next connection)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /projects/{project_id}/endpoints/{endpoint_id} (suspend_timeout_seconds)",
    "mcp": "endpoints category",
    "cli": "neon branches add-compute settings",
    "ui": "Console: Branch > Compute settings"
   },
   "check": "Endpoint state transitions to 'idle'/suspended after inactivity, then 'active' again on the next query, billed CU-hours = 0 while suspended",
   "source": "https://neon.com/pricing"
  },
  {
   "id": "cap-07",
   "group": "Auth",
   "capability": "Provision managed authentication (sign-up, OAuth, sessions) stored in Postgres",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "provision_neon_auth",
    "cli": "neon neon-auth enable / neon config add auth",
    "ui": "Console: Project > Branch > Auth"
   },
   "check": "neon_auth schema appears in the branch; a sign-up request creates a row in neon_auth.users",
   "source": "https://neon.com/docs/auth/overview"
  },
  {
   "id": "cap-08",
   "group": "Data API",
   "capability": "Query and mutate tables over a REST (PostgREST-compatible) HTTP endpoint",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET/POST/PATCH/DELETE on the Data API branch endpoint",
    "mcp": "data_api category (enable/update/disable)",
    "cli": "neon data-api create",
    "ui": "Console: Branch > Data API"
   },
   "check": "GET on the Data API endpoint for a table returns rows matching a direct SQL SELECT",
   "source": "https://neon.com/docs/data-api/overview"
  },
  {
   "id": "cap-09",
   "group": "Functions",
   "capability": "Deploy a long-running serverless function (Node.js) next to the database",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "functions category (deploy/update/delete)",
    "cli": "neon functions deploy",
    "ui": "Console: Branch > Functions"
   },
   "check": "neon functions get <slug> shows status deployed; an HTTP request to the function URL returns the handler's Response",
   "source": "https://neon.com/docs/compute/functions/overview"
  },
  {
   "id": "cap-10",
   "group": "Object Storage",
   "capability": "Create S3-compatible buckets and upload/download/list/delete objects",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "S3-compatible API on branch storage endpoint",
    "mcp": "storage category",
    "cli": "neon buckets create / neon buckets object put|get|list|delete",
    "ui": "Console: Branch > Object Storage"
   },
   "check": "neon buckets object list <bucket> shows the uploaded key after `object put`; `object get` returns identical bytes",
   "source": "https://neon.com/docs/storage/overview"
  },
  {
   "id": "cap-11",
   "group": "AI Gateway",
   "capability": "Call LLMs from multiple providers through one gateway credential",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": "POST on branch AI Gateway chat-completions / embeddings endpoint",
    "mcp": "observability category (check availability)",
    "cli": null,
    "ui": "Console: Branch > AI Gateway"
   },
   "check": "A chat-completions request against the branch gateway endpoint returns a model response and the prepaid credit balance decreases",
   "source": "https://neon.com/docs/ai-gateway/overview"
  },
  {
   "id": "cap-12",
   "group": "Branching",
   "capability": "Delete a branch",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "DELETE /projects/{project_id}/branches/{branch_id}",
    "mcp": "branches category (delete)",
    "cli": "neon branches delete",
    "ui": "Console: Branches > Delete"
   },
   "check": "GET /projects/{project_id}/branches/{branch_id} returns 404 after deletion",
   "source": "https://neon.com/docs/cli#branches-alias-branch"
  },
  {
   "id": "cap-13",
   "group": "Branching",
   "capability": "Reset a branch to match its parent, or set an automatic expiration (TTL)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /projects/{project_id}/branches/{branch_id}/set_as_default or reset endpoint",
    "mcp": "branches category (reset)",
    "cli": "neon branches reset / neon branches set-expiration",
    "ui": "Console: Branches"
   },
   "check": "After reset, branch data equals parent's current data; after TTL elapses, `neon branches list` no longer shows the branch",
   "source": "https://neon.com/docs/guides/reset-from-parent; https://neon.com/docs/guides/branch-expiration"
  },
  {
   "id": "cap-14",
   "group": "Branching",
   "capability": "Create schema-only branches (data excluded) for working with sensitive data",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /projects/{project_id}/branches (schema_only)",
    "mcp": "create_branch tool",
    "cli": "neon branches create --schema-only",
    "ui": "Console: Branches > Create branch"
   },
   "check": "Querying the new branch's tables returns zero rows but `\\d` shows identical schema to parent",
   "source": "https://neon.com/docs/guides/branching-schema-only"
  },
  {
   "id": "cap-15",
   "group": "Branching",
   "capability": "Diff schemas between two branches or branch states",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /projects/{project_id}/branches/{branch_id}/schema_compare or similar",
    "mcp": "schema category (compare schemas)",
    "cli": "neon branches schema-diff / neon diff",
    "ui": "Console: Branches > Compare"
   },
   "check": "`neon diff` output lists the actual DDL differences between the two named branches",
   "source": "https://neon.com/docs/cli#diff"
  },
  {
   "id": "cap-16",
   "group": "Postgres core",
   "capability": "Create and manage Postgres databases and roles on a branch",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /projects/{project_id}/branches/{branch_id}/databases and /roles",
    "mcp": "branches category (manage roles/databases)",
    "cli": "neon databases create|delete|list",
    "ui": "Console: Branch > Databases/Roles"
   },
   "check": "neon databases list shows the new database; connecting with its connection string succeeds",
   "source": "https://neon.com/docs/cli#databases-alias-database-db"
  },
  {
   "id": "cap-17",
   "group": "Postgres core",
   "capability": "Install Postgres extensions (pgvector, PostGIS, TimescaleDB, etc.)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "querying category (inspect_database suggests CREATE EXTENSION)",
    "cli": "SQL via neon CLI/console",
    "ui": "Console: Extensions"
   },
   "check": "`SELECT * FROM pg_extension` lists the installed extension after CREATE EXTENSION",
   "source": "https://neon.com/pricing"
  },
  {
   "id": "cap-18",
   "group": "Postgres core",
   "capability": "Read replicas: run read-only queries off a separate compute",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /projects/{project_id}/endpoints (type=read_only)",
    "mcp": "endpoints category",
    "cli": "neon branches add-compute",
    "ui": "Console: Branch > Read replicas"
   },
   "check": "GET endpoints lists a second endpoint with type read_only pointing at the same branch",
   "source": "https://neon.com/pricing"
  },
  {
   "id": "cap-19",
   "group": "Postgres core",
   "capability": "Run scheduled and manual data snapshots",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "snapshots endpoints",
    "mcp": "snapshots category (create/restore/schedule)",
    "cli": null,
    "ui": "Console: Branch > Snapshots"
   },
   "check": "Snapshot list shows the new snapshot; restoring from it creates a branch with that snapshot's data",
   "source": "https://neon.com/docs/ai/neon-mcp-server#available-tools; https://neon.com/pricing"
  },
  {
   "id": "cap-20",
   "group": "Observability",
   "capability": "Inspect Postgres health (table/index sizes, bloat, locks, slow queries, cache hit rate)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "inspect_database (querying category)",
    "cli": "neon inspect db <check>",
    "ui": "Console: Monitoring"
   },
   "check": "`neon inspect db table-sizes` output lists actual table sizes matching pg_table_size",
   "source": "https://neon.com/docs/cli#inspect-alias-inspection"
  },
  {
   "id": "cap-21",
   "group": "Observability",
   "capability": "Query branch/function/object-storage logs",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "observability category",
    "cli": "neon logs query / neon logs fields",
    "ui": "Console: Branch > Logs"
   },
   "check": "`neon logs query` returns log records for recent activity on the branch",
   "source": "https://neon.com/docs/cli#logs; https://neon.com/docs/ai/neon-mcp-server#available-tools"
  },
  {
   "id": "cap-22",
   "group": "Auth",
   "capability": "Configure OAuth providers, trusted domains, and email/password auth settings",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "add_auth_oauth_provider / add_auth_trusted_domain / update_auth_config",
    "cli": "neon neon-auth config email-password|email-provider",
    "ui": "Console: Auth settings"
   },
   "check": "get_neon_auth_config / `neon neon-auth config email-password get` reflects the updated setting",
   "source": "https://neon.com/docs/auth/overview"
  },
  {
   "id": "cap-23",
   "group": "Functions",
   "capability": "Trigger functions on a cron schedule or object-storage upload events",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "functions category",
    "cli": null,
    "ui": "Console: Function > Triggers"
   },
   "check": "A scheduled trigger produces a function invocation log entry at the configured cadence without manual calls",
   "source": "https://neon.com/docs/compute/functions/triggers/overview"
  },
  {
   "id": "cap-24",
   "group": "Functions",
   "capability": "Attach a custom domain (with TLS) to a deployed function",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "functions category",
    "cli": "neon functions domains register|list|delete",
    "ui": "Console: Function > Domains"
   },
   "check": "`neon functions domains list` shows the registered domain and the function answers HTTPS requests on it",
   "source": "https://neon.com/docs/compute/functions/custom-domains"
  },
  {
   "id": "cap-25",
   "group": "Object Storage",
   "capability": "Generate presigned URLs for objects and run multipart uploads",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "S3-compatible presign/multipart APIs",
    "mcp": "storage category (presigned URLs)",
    "cli": null,
    "ui": null
   },
   "check": "A presigned GET URL returns the object over anonymous HTTP without Neon credentials",
   "source": "https://neon.com/docs/storage/overview; https://neon.com/docs/storage/objects"
  },
  {
   "id": "cap-26",
   "group": "Developer workflow",
   "capability": "Call any Neon management API route directly as an authenticated passthrough",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "all /v2 routes",
    "mcp": null,
    "cli": "neon api [path]",
    "ui": null
   },
   "check": "`neon api projects` returns the same JSON as a direct curl to https://console.neon.tech/api/v2/projects",
   "source": "https://neon.com/docs/cli#api"
  },
  {
   "id": "cap-27",
   "group": "Developer workflow",
   "capability": "Declare a backend (auth, data API, buckets, functions) as code and apply it (neon.ts)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "neon config init|add|plan|apply / neon deploy",
    "ui": null
   },
   "check": "`neon config status` after `neon config apply` shows live branch state matching the neon.ts declaration",
   "source": "https://neon.com/docs/reference/neon-ts; https://neon.com/docs/cli#config"
  },
  {
   "id": "cap-28",
   "group": "Developer workflow",
   "capability": "Sync a Neon branch to a git branch automatically on checkout",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "neon git install|sync|status|cleanup|uninstall",
    "ui": null
   },
   "check": "After `git checkout <branch>`, `neon git status` shows the mapped Neon branch now checked out",
   "source": "https://neon.com/docs/cli#git"
  },
  {
   "id": "cap-29",
   "group": "Developer workflow",
   "capability": "Try Neon with no account via a temporary claimable project, later claimed by a human",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "https://neon.com/docs/reference/claimable-neon",
    "mcp": null,
    "cli": "neon claim create|accept|status|list|delete",
    "ui": "https://neon.com/claimable-neon"
   },
   "check": "`neon claim status <project-id>` shows unclaimed, then claimed after `neon claim accept`",
   "source": "https://neon.com/pricing; https://neon.com/docs/cli#claim-alias-claimable"
  },
  {
   "id": "cap-30",
   "group": "Security",
   "capability": "Scope short-lived credentials for branch services (database, storage, AI gateway)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "neon credentials create|list|reveal|revoke|rotate",
    "ui": "Console: Branch > Credentials"
   },
   "check": "`neon credentials list` shows the new credential; `reveal` returns its api_token/s3_secret_access_key",
   "source": "https://neon.com/docs/cli#credentials-alias-credential"
  },
  {
   "id": "cap-31",
   "group": "Security",
   "capability": "Restrict database connections by IP allowlist",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": "PATCH ip_allow settings",
    "mcp": null,
    "cli": "neon ip-allow add|list|remove|reset",
    "ui": "Console: Settings > IP Allow"
   },
   "check": "`neon ip-allow list` reflects the added IPs; a connection from a non-listed IP is rejected",
   "source": "https://neon.com/pricing; https://neon.com/docs/cli#ip-allow"
  },
  {
   "id": "cap-32",
   "group": "Security",
   "capability": "Protect a branch from accidental deletion/reset (protected branches)",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Console: Branch settings > Protected"
   },
   "check": "Attempting to delete a protected branch via CLI/API/UI is rejected until protection is removed",
   "source": "https://neon.com/pricing"
  },
  {
   "id": "cap-33",
   "group": "Admin",
   "capability": "Manage API keys for programmatic access",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "/api_keys endpoints",
    "mcp": null,
    "cli": "neon api-keys create|list|revoke",
    "ui": "Console: Account > API keys"
   },
   "check": "`neon api-keys list` shows the new key; requests with a revoked key return 401",
   "source": "https://neon.com/docs/cli#[redacted]"
  },
  {
   "id": "cap-34",
   "group": "Admin",
   "capability": "Invite and manage organization members and multiple orgs per account",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "organizations endpoints",
    "mcp": "projects category (list organizations)",
    "cli": null,
    "ui": "Console: Organization > Members"
   },
   "check": "Console organization members list includes the invited teammate after they accept",
   "source": "https://neon.com/pricing"
  },
  {
   "id": "cap-35",
   "group": "Admin",
   "capability": "Set up spending notifications and view/export usage metrics and logs",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Console: Billing > Spending notifications; Monitoring export"
   },
   "check": "An email alert is sent at the configured 80%/100% usage threshold",
   "source": "https://neon.com/pricing; https://neon.com/docs/introduction/spending-notifications"
  },
  {
   "id": "cap-36",
   "group": "Admin",
   "capability": "Configure history (retention) window for instant restore and time travel",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "PATCH project settings (history_retention)",
    "mcp": null,
    "cli": null,
    "ui": "Console: Settings > Postgres > History window"
   },
   "check": "GET project settings reflects the new retention value, and restore succeeds only within that window",
   "source": "https://neon.com/docs/introduction/branching#history-window"
  },
  {
   "id": "cap-37",
   "group": "Admin",
   "capability": "Buy and manage AI Gateway prepaid credits",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Console: Billing"
   },
   "check": "Console billing page shows increased credit balance after a purchase, decremented by subsequent inference calls",
   "source": "https://neon.com/docs/ai-gateway/overview#pricing"
  },
  {
   "id": "cap-38",
   "group": "Admin",
   "capability": "Scaffold a new project from a starter template with agent tooling pre-wired",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "neon bootstrap [directory] --template <id>",
    "ui": "https://build-on-neon.vercel.app"
   },
   "check": "Directory created by `neon bootstrap` contains the template's source files and a linked Neon project",
   "source": "https://neon.com/docs/ai-gateway/overview; https://neon.com/docs/cli#bootstrap"
  }
 ],
 "attempts": [
  {
   "t": "00:52",
   "cap": "docs",
   "capability": "Find docs",
   "task": "Find agent-facing docs",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "https://neon.com/llms.txt 200 text/plain (425 lines, md docs via .md suffix); https://neon.com/auth.md 200 text/markdown: no-signup claimable provisioning guide for agents; MCP OAuth metadata at mcp.neon.tech",
   "notes": "",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "01:44",
   "cap": "signup",
   "capability": "Sign up for a Neon account",
   "task": "Open console sign-up in a real browser",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "GET https://console.neon.tech/signup -> redirected to Keycloak registrations URL, title \"Just a moment...\", Cloudflare \"Performing security verification\" interstitial; did not clear after ~15s.",
   "notes": "No headless sign-up route documented (neon auth = browser OAuth). Claimable no-account route used instead.",
   "quality": {
    "error_legibility": "n/a",
    "recoverable": "no"
   }
  },
  {
   "t": "03:16",
   "documented": true,
   "cap": "credentials",
   "capability": "Get API credentials",
   "task": "Provision claimable project without account (auth.md)",
   "route": "cli",
   "result": "done",
   "verified": true,
   "evidence": "neon claim create (CLI 7.0.6) -> project [redacted], granted postgres/data-api/auth, denied object-storage/functions/ai-gateway (requires_claim); wrote DATABASE_URL etc. to .env.local; CLI stores claim identity locally",
   "notes": "Temporary: project expires 2026-10-05 (72h) unless a human claims it. Full account credentials (API key) need console sign-up, which is behind a Cloudflare interstitial.",
   "quality": {
    "docs_match": "match",
    "error_legibility": "clear"
   }
  },
  {
   "t": "03:16",
   "documented": true,
   "cap": "first_call",
   "capability": "First API call",
   "task": "List branches and get project with claimable credential",
   "route": "cli",
   "result": "done",
   "verified": true,
   "evidence": "neon branches list -o json -> main br-sparkling-brook-b550ecj3 ready; neon projects get [redacted] -> pg_version 17, aws-us-east-2",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "03:16",
   "documented": true,
   "cap": "first_action",
   "capability": "First real action",
   "task": "Create table and insert rows",
   "route": "cli",
   "result": "done",
   "verified": true,
   "evidence": "psql DATABASE_URL_UNPOOLED: CREATE TABLE notes; INSERT 0 2; select count(*) -> 2; PostgreSQL 17.11"
  },
  {
   "t": "03:16",
   "documented": true,
   "cap": "cap-01",
   "capability": "Create a serverless Postgres project and run SQL against it",
   "task": "Create project, create table, insert and read rows",
   "route": "cli",
   "result": "done",
   "verified": true,
   "evidence": "neon claim create -> project [redacted]; neon projects get returns it; psql: insert 2 rows, select count(*)=2",
   "notes": "Project created via claimable (no-account) path; neon projects create needs a real account.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "03:16",
   "documented": true,
   "cap": "cap-29",
   "capability": "Try Neon with no account via a temporary claimable project",
   "task": "Create claimable project and check status",
   "route": "cli",
   "result": "partial",
   "verified": true,
   "evidence": "neon claim create ok; neon claim status -> state unclaimed, reconciled false, expires 2026-10-05T20:50:58Z",
   "notes": "Claim acceptance needs a human signing in to Neon (behind Cloudflare interstitial); not done."
  },
  {
   "t": "05:31",
   "documented": true,
   "cap": "cap-02",
   "capability": "Branch the database",
   "task": "Create branch dev from main",
   "route": "cli",
   "result": "blocked",
   "verified": false,
   "evidence": "neon branches create --name dev2 -> ERROR: This Neon Management API operation is not available before claim. (HTTP 403 route_not_allowed, origin proxy)",
   "notes": "Claimable project only; branching needs a claimed project i.e. a Neon account, whose sign-up is behind a Cloudflare interstitial.",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "05:31",
   "documented": true,
   "cap": "cap-03",
   "capability": "Branch from a past point in time",
   "task": "Create branch pitr --parent <timestamp before deletes>",
   "route": "cli",
   "result": "blocked",
   "verified": false,
   "evidence": "POST /projects/{id}/branches via neon branches create -> 403 route_not_allowed: not available before claim",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "05:31",
   "documented": true,
   "cap": "cap-14",
   "capability": "Schema-only branches",
   "task": "neon branches create --schema-only",
   "route": "cli",
   "result": "blocked",
   "verified": false,
   "evidence": "same branch-create route: 403 not available before claim",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "05:31",
   "documented": true,
   "cap": "cap-16",
   "capability": "Create databases and roles",
   "task": "neon databases create --name appdb --owner-name neondb_owner; neon roles create --name approle",
   "route": "cli",
   "result": "blocked",
   "verified": false,
   "evidence": "databases list works (neondb); databases create and roles create -> ERROR: This Neon Management API operation is not available before claim. First try without --owner-name gave clear error listing roles.",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "05:32",
   "documented": true,
   "cap": "cap-19",
   "capability": "Snapshots",
   "task": "neon snapshots list",
   "route": "cli",
   "result": "blocked",
   "verified": false,
   "evidence": "ERROR: This Neon Management API operation is not available before claim.",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "05:32",
   "documented": true,
   "cap": "cap-21",
   "capability": "Query logs",
   "task": "neon logs query --since 15m",
   "route": "cli",
   "result": "blocked",
   "verified": false,
   "evidence": "ERROR: This Neon Management API operation is not available before claim.",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "05:32",
   "documented": true,
   "cap": "cap-20",
   "capability": "Inspect Postgres health",
   "task": "neon inspect db table-sizes and compare with pg_table_size",
   "route": "cli",
   "result": "done",
   "verified": true,
   "evidence": "neon inspect db table-sizes --role-name neondb_owner -> public.notes 16 kB; psql pg_table_size(notes)=16384. Without --role-name: clear error naming roles.",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "clear",
    "recoverable": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "05:32",
   "documented": true,
   "cap": "cap-05",
   "capability": "Autoscale compute / set size",
   "task": "Raise autoscaling max from 1 to 2 CU",
   "route": "cli",
   "result": "done",
   "verified": true,
   "evidence": "neon api /projects/[redacted]/endpoints/ep-fragrant-truth-b50js1mu -X PATCH autoscaling 0.25-2, suspend 60 -> 200; GET /projects/{id}/endpoints shows autoscaling_limit_max_cu 2 (was 1 per neon status). Compute restarted (open psql session terminated).",
   "notes": "Scaling under load not exercised (no load testing). GET single endpoint returns 403 route_not_allowed pre-claim while list and PATCH work - inconsistent allowlist.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "05:32",
   "documented": true,
   "cap": "cap-17",
   "capability": "Install extensions",
   "task": "CREATE EXTENSION vector, postgis and use vector distance",
   "route": "cli",
   "result": "done",
   "verified": true,
   "evidence": "psql: pg_extension lists vector 0.8.0, postgis 3.5.7; select [1,2,3]<->[1,2,4] = 1",
   "route_note": "SQL",
   "quality": {
    "verify_route": "yes"
   }
  },
  {
   "t": "05:32",
   "documented": true,
   "cap": "cap-30",
   "capability": "Scoped credentials",
   "task": "List branch credentials",
   "route": "cli",
   "result": "partial",
   "verified": true,
   "evidence": "neon credentials list -> 2 default credentials (AI gateway invoke, storage read/write)",
   "notes": "Create attempted separately"
  },
  {
   "t": "07:31",
   "documented": true,
   "cap": "cap-07",
   "capability": "Managed authentication stored in Postgres",
   "task": "Sign up an app user via Managed Better Auth and get a JWT",
   "route": "api",
   "result": "done",
   "verified": true,
   "evidence": "POST $NEON_AUTH_BASE_URL/sign-up/email (inbox address) -> 200 user id 1f37d7fd...; GET /get-session -> set-auth-jwt header (JWT); psql: neon_auth.user has the row",
   "notes": "Auth granted on claimable project at create time.",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "07:31",
   "documented": true,
   "cap": "cap-08",
   "capability": "Query and mutate tables over REST Data API",
   "task": "RLS todos table: POST, PATCH, GET, DELETE via Data API with Neon Auth JWT",
   "route": "api",
   "result": "done",
   "verified": true,
   "evidence": "POST /rest/v1/todos -> row with user_id from JWT sub; PATCH done=true; GET returns it; psql select matches; DELETE 204 -> count 0. neon data-api refresh-schema used after DDL.",
   "notes": "Anonymous request without JWT on 2nd project: 400 missing authentication credentials: required authorization bearer token in JWT format (clear).",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "clear",
    "docs_match": "match"
   }
  },
  {
   "t": "07:31",
   "documented": true,
   "cap": "cap-22",
   "capability": "Configure auth settings",
   "task": "neon neon-auth config email-password get/update",
   "route": "cli",
   "result": "blocked",
   "verified": false,
   "evidence": "neon neon-auth config email-password get -> ERROR: This Neon Management API operation is not available before claim.",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "07:31",
   "documented": true,
   "cap": "cap-30",
   "capability": "Scoped credentials",
   "task": "Issue a storage:read credential",
   "route": "cli",
   "result": "blocked",
   "verified": false,
   "evidence": "neon credentials create --name agentdrives-storage-ro --scope storage:read -> ERROR: This Neon Management API operation is not available before claim.",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "07:31",
   "documented": true,
   "cap": "cap-29",
   "capability": "Try Neon with no account via a temporary claimable project",
   "task": "Provision via documented REST route: identity -> token -> credentials",
   "route": "api",
   "result": "partial",
   "verified": true,
   "evidence": "POST https://claimable.neon.tech/v1/agent/identity -> 201 project snowy-surf-00789318, granted postgres+data_api; POST /v1/oauth2/token jwt-bearer -> access_token 3600s; GET /v1/projects/{id}/credentials -> database_url + data_api url; psql create table ok",
   "notes": "Docs drift: auth.md says keep identity_assertion, response field is claim_token (plus assertion_expires). Claim itself needs a human.",
   "quality": {
    "docs_match": "drift",
    "verify_route": "yes"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-06",
   "capability": "Scale to zero when idle and wake on connection",
   "task": "Set suspend_timeout 60s, wait idle, then query",
   "route": "cli",
   "result": "done",
   "verified": true,
   "evidence": "GET /projects/{id}/endpoints at 20:59:22: current_state idle, suspended_at 20:59:01 (last_active 20:56:15); psql query then returned rows in 1.55s and endpoints list shows current_state active",
   "notes": "Suspend took ~3 min after last activity, not 60s (auth/data API traffic and status inspection may count as activity).",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-27",
   "capability": "Declare backend as code (neon.ts) and apply",
   "task": "Change default-branch compute settings in neon.ts and apply",
   "route": "cli",
   "result": "done",
   "verified": true,
   "evidence": "neon config plan showed diff; neon config apply -y refused with clear error: Branch settings conflict ... Re-run with --update-existing; with --update-existing applied; neon config status shows autoscalingLimitMaxCu 1, suspendTimeout 5m",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "clear",
    "recoverable": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-26",
   "capability": "Authenticated API passthrough",
   "task": "neon api GET/PATCH /projects/{id}/endpoints",
   "route": "cli",
   "result": "done",
   "verified": true,
   "evidence": "neon api /projects/[redacted]/endpoints returned endpoint JSON; PATCH changed autoscaling and read back via list. Pre-claim the passthrough goes through claimable proxy; many routes 403 route_not_allowed (GET single endpoint, branches POST).",
   "notes": "Direct-curl comparison against console.neon.tech/api/v2 needs an account API key (not obtainable: sign-up behind Cloudflare).",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-38",
   "capability": "Scaffold from starter template",
   "task": "neon bootstrap bootapp --template hono -y --no-install",
   "route": "cli",
   "result": "partial",
   "verified": true,
   "evidence": "Directory bootapp created with neon.ts, src/, AGENTS.md, drizzle.config.ts, git initialized, Claude plugin installed; summary says Project: not linked",
   "notes": "Linking needs an account (neon link); claimable credential not used by bootstrap. Note -y installed an agent plugin into ~/.claude."
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-04",
   "capability": "Instant restore",
   "task": "POST /projects/{id}/branches/{id}/restore to timestamp before deletes",
   "route": "cli",
   "evidence": "neon api ... /restore -X POST -> ERROR: This Neon Management API operation is not available before claim.",
   "result": "blocked",
   "verified": false,
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-12",
   "capability": "Delete a branch",
   "task": "Create then delete a dev branch",
   "route": "cli",
   "evidence": "Branch create is not available before claim (403 route_not_allowed), so there is no non-default branch to delete.",
   "result": "blocked",
   "verified": false,
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-13",
   "capability": "Reset branch / TTL",
   "task": "Create branch with --expires-at",
   "route": "cli",
   "evidence": "branch create route 403 not available before claim",
   "result": "blocked",
   "verified": false,
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-15",
   "capability": "Schema diff",
   "task": "GET compare_schema / neon diff",
   "route": "cli",
   "evidence": "neon api /projects/{id}/branches/{id}/compare_schema -> not available before claim; neon diff main -> Nothing to compare (only one branch exists)",
   "result": "blocked",
   "verified": false,
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-18",
   "capability": "Read replicas",
   "task": "POST /projects/{id}/endpoints type read_only",
   "route": "cli",
   "evidence": "ERROR: This Neon Management API operation is not available before claim.",
   "result": "blocked",
   "verified": false,
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-36",
   "capability": "Configure history retention",
   "task": "PATCH /projects/{id} history_retention_seconds=3600",
   "route": "cli",
   "evidence": "ERROR: This Neon Management API operation is not available before claim.",
   "result": "blocked",
   "verified": false,
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-09",
   "capability": "Deploy serverless function",
   "task": "neon functions list / claim create --service functions",
   "route": "cli",
   "evidence": "claim create: functions denied requires_claim (\"Deploying functions needs a claimed project. neon dev runs functions locally\"); neon functions list -> ERROR: functions requires a claimed project.",
   "result": "blocked",
   "verified": false,
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-10",
   "capability": "Object storage buckets",
   "task": "neon buckets list / claim create --service object-storage",
   "route": "cli",
   "evidence": "object-storage denied requires_claim; neon buckets list -> ERROR: storage requires a claimed project.",
   "result": "blocked",
   "verified": false,
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-25",
   "capability": "Presigned URLs / multipart",
   "task": "needs a bucket",
   "route": "cli",
   "evidence": "Object storage requires a claimed project (see)",
   "result": "blocked",
   "verified": false,
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-23",
   "capability": "Function triggers",
   "task": "needs a deployed function",
   "route": "cli",
   "evidence": "Functions require a claimed project (see)",
   "result": "blocked",
   "verified": false,
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-24",
   "capability": "Custom domain on function",
   "task": "needs a deployed function",
   "route": "cli",
   "evidence": "Functions require a claimed project (see)",
   "result": "blocked",
   "verified": false,
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-28",
   "capability": "Git branch sync",
   "task": "neon git sync needs branch creation",
   "route": "cli",
   "evidence": "Branch creation not available before claim (403 route_not_allowed)",
   "result": "blocked",
   "verified": false,
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-33",
   "capability": "Manage API keys",
   "task": "neon api-keys list",
   "route": "cli",
   "evidence": "ERROR: No route exists at this path. (claimable credential has no account; API keys need console sign-up behind Cloudflare)",
   "result": "blocked",
   "verified": false,
   "quality": {
    "error_legibility": "vague",
    "recoverable": "no"
   }
  },
  {
   "t": "11:43",
   "documented": true,
   "cap": "cap-34",
   "capability": "Organizations",
   "task": "neon orgs list",
   "route": "cli",
   "evidence": "ERROR: No route exists at this path.",
   "result": "blocked",
   "verified": false,
   "quality": {
    "error_legibility": "vague",
    "recoverable": "no"
   }
  },
  {
   "t": "11:44",
   "documented": true,
   "cap": "cap-11",
   "capability": "AI Gateway",
   "task": "claim create --service ai-gateway",
   "route": "cli",
   "result": "plan_gated",
   "verified": false,
   "evidence": "ai-gateway denied requires_claim; pricing.md: AI Gateway = prepaid credits on Launch/Scale (\"-\" on Free)"
  },
  {
   "t": "11:44",
   "documented": true,
   "cap": "cap-31",
   "capability": "IP allowlist",
   "task": "not attempted beyond pricing",
   "route": "none",
   "result": "plan_gated",
   "verified": false,
   "evidence": "capabilities map plan: paid; IP Allow is a paid-plan feature; account needed"
  },
  {
   "t": "11:44",
   "documented": true,
   "cap": "cap-32",
   "capability": "Protected branches",
   "task": "neon branches create --protected",
   "route": "cli",
   "result": "plan_gated",
   "verified": false,
   "evidence": "CLI help: --protected ... Paid plans only."
  },
  {
   "t": "11:44",
   "documented": true,
   "cap": "cap-35",
   "capability": "Spending notifications",
   "task": "not attempted",
   "route": "none",
   "result": "plan_gated",
   "verified": false,
   "evidence": "paid plan feature; /organizations/{org_id}/billing/spending_limit needs an account org"
  },
  {
   "t": "11:44",
   "documented": true,
   "cap": "cap-37",
   "capability": "Buy AI Gateway credits",
   "task": "not attempted",
   "route": "none",
   "result": "plan_gated",
   "verified": false,
   "evidence": "pricing.md: prepaid credits on paid plans; no payment allowed"
  },
  {
   "t": "13:00",
   "documented": true,
   "cap": "signup",
   "capability": "Sign up for a Neon account",
   "task": "Reach the sign-up form via the normal login page (claim flow -> Log in -> Sign up for an account)",
   "route": "browser",
   "result": "blocked",
   "verified": false,
   "evidence": "Keycloak login page (console.neon.tech/realms/prod-realm/.../auth) loaded without a challenge; clicking Sign up for an account -> /login-actions/registration shows Cloudflare Performing security verification interstitial (title Just a moment...). Not retried.",
   "quality": {
    "error_legibility": "n/a",
    "recoverable": "no"
   }
  },
  {
   "t": "13:00",
   "documented": true,
   "cap": "cap-29",
   "capability": "Try Neon with no account via a temporary claimable project",
   "task": "neon claim accept --no-open and follow verification URL",
   "route": "cli",
   "result": "partial",
   "verified": true,
   "evidence": "claim accept -> user code + https://claimable.neon.tech/claim?user_code=...; page Claim a Neon project -> Continue to Neon -> Neon login page (needs a Neon account). Account sign-up blocked by Cloudflare interstitial; claim not completed.",
   "notes": "By design the claim is done by a human."
  },
  {
   "t": "14:21",
   "documented": true,
   "cap": "delete",
   "capability": "Delete project/data",
   "task": "Delete claimable project snowy-surf-00789318 via documented REST",
   "route": "api",
   "result": "done",
   "verified": true,
   "evidence": "DELETE https://claimable.neon.tech/v1/projects/snowy-surf-00789318 -> 204; access token then 401 This access token was revoked; token re-exchange -> 400 invalid_grant Identity assertion was revoked",
   "notes": "But the old database_url still answered queries (select count(*) from products = 2) at 21:01:30 and 21:02:58, ~30-90s after the 204: compute teardown lags the API delete.",
   "quality": {
    "verify_route": "no",
    "error_legibility": "clear",
    "docs_match": "match"
   }
  },
  {
   "t": "14:21",
   "documented": true,
   "cap": "delete",
   "capability": "Delete project/data",
   "task": "neon claim delete -y on [redacted]",
   "route": "cli",
   "result": "failed",
   "verified": true,
   "evidence": "ERROR: This project is being claimed. Only claim-status polling is available. neon claim status -> state pending, claim_expires_at 21:16:22Z. neon claim list still shows unclaimed (stale local record).",
   "notes": "Minting a claim code and pressing Continue to Neon on the claim page (no human accepted) moved the project to pending: DATABASE_URL rotated (password authentication failed) and every management call refused until the claim window expires. Retry after expiry.",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "yes"
   }
  },
  {
   "t": "29:13",
   "documented": true,
   "cap": "delete",
   "capability": "Delete project/data",
   "task": "Delete [redacted] after the claim window expired (CLI and REST)",
   "route": "api",
   "result": "failed",
   "verified": true,
   "evidence": "21:16:36 neon claim status -> state expired; neon claim delete -y -> This project is being claimed. GET /v1/projects/{id}/claim -> 200 {\"state\":\"expired\"}; DELETE /v1/projects/{id} at 21:17 and 21:18 -> 409 claim_in_progress, claim_state pending",
   "notes": "Contradictory states: claim GET says expired, DELETE says pending. Project left to expire by itself at 2026-10-05T20:50:58Z (72 h TTL). Not retried further.",
   "quality": {
    "error_legibility": "vague",
    "recoverable": "no",
    "docs_match": "drift"
   }
  }
 ],
 "stale": false,
 "icon": "/logos/neon.png",
 "monitored": false,
 "verdict": "Gets in on its own, L3 · Does the work is out of reach: this stays L2 · Gets in. A documented no-account route hands over a working database. Our agent called the claimable identity endpoint from auth.md, got a token, and ran SQL, extensions, autoscaling, scale-to-zero, auth sign-ups and RLS-protected REST CRUD through the Data API without signing up. It stopped at pay: reaching the console for a full account and billing needs a human past a Cloudflare interstitial, and no account-based routes beyond the claimable set were reached. One claimable project's delete call returned success, though its database connection kept working briefly after; the other stayed stuck on a claim lock pending expiry. No account existed, so there was none to delete.",
 "page": "https://agentdrives.com/tools/neon?via=api"
}