{
 "slug": "netlify",
 "name": "Netlify",
 "url": "https://netlify.com",
 "domain": "netlify.com",
 "category": "hosting",
 "category_name": "Hosting and deploys",
 "tested_at": "2026-10-11",
 "run": "20261011T160611Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261006T024833Z",
   "date": "2026-10-06",
   "level": 2,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  },
  {
   "run": "20261011T160611Z",
   "date": "2026-10-11",
   "level": 2,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 3,
    "signed": true,
    "inbox": [
     "matfy.com"
    ],
    "robots": "obey"
   }
  }
 ],
 "level": 2,
 "level_name": "Gets in",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 2,
  "tries": 2,
  "self_start": true
 },
 "badges": [
  "agent-can-leave"
 ],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in without an account (try first, claim later); can't sign up for one",
   "at": "signup",
   "how": "no-account"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "no",
   "text": "Work done: 10% 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 1 hour",
   "how": "no-account",
   "left": "expires",
   "after_hours": 1
  }
 ],
 "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 without an account (try first, claim later); can't sign up for one",
   "at": "signup",
   "how": "no-account",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "no",
   "text": "Work done: 10% 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 1 hour",
   "how": "no-account",
   "left": "expires",
   "after_hours": 1,
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "try_first",
   "label": "Try first, claim later",
   "routes": [
    "claimable"
   ],
   "minutes": 5.5,
   "core": "1/10"
  }
 ],
 "minutes": 5.5,
 "next": {
  "to": 3,
  "text": "Next: let an agent sign up for an account on its own (without one it does 10% of the core work)"
 },
 "stop": "signup",
 "core": "1/10",
 "scores": {
  "coverage": 7,
  "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": [
   {
    "standard": "MCP client registration",
    "state": "behind",
    "behind": null,
    "value": "dcr"
   },
   {
    "standard": "OpenAPI",
    "state": "behind",
    "behind": 3,
    "value": "2.0"
   }
  ]
 },
 "reliability_method": "first-try",
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": 10,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 3,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": false,
  "prompt_sha": "076cd4c65a1a",
  "kb_version": "3+overlay-1353601952",
  "identity": "e8a92f24a9a8"
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 3,
  "signed": true,
  "inbox": [
   "matfy.com"
  ],
  "robots": "obey"
 },
 "same_level_drives": 2,
 "drives": 2,
 "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": "page",
   "kind": "signup",
   "at": "2026-10-12"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "docs.netlify.com/llms.txt, every docs page as .md and via Accept: text/markdown, OpenAPI 2.0 at open-api.netlify.com/swagger.json linked from /.well-known/api-catalog, netlify.ai agent instructions."
  },
  "signup": {
   "status": "n/a",
   "note": "Not needed: a documented route works without an account.",
   "no_account": true,
   "note_driver": "Email sign-up form at app.netlify.com/signup/email silently reset after 'Sign up' (invisible reCAPTCHA Enterprise; no request reached Netlify, no mail). Other options are Google/GitHub/GitLab/Bitbucket OAuth.",
   "status_driver": "blocked"
  },
  "verify": {
   "status": "n/a",
   "note": "Not needed: a documented route works without an account.",
   "no_account": true,
   "note_driver": "No verification mail: sign-up was never submitted.",
   "status_driver": "blocked"
  },
  "credentials": {
   "status": "n/a",
   "note": "Not needed: a documented route works without an account.",
   "via": "",
   "no_account": true,
   "note_driver": "PATs are made in the web UI; netlify login and the --request ticket need a person to approve at app.netlify.com/authorize; MCP OAuth (DCR) ends at the Netlify login. All need an account.",
   "status_driver": "blocked"
  },
  "first_call": {
   "status": "headless",
   "note": "netlify deploy --allow-anonymous (documented) works with no account: returns site_id, site_url, claim_url, claim_command and a site password."
  },
  "first_action": {
   "status": "headless",
   "note": "A static page deployed anonymously and read back at jolly-axolotl-a13c96.netlify.app (password-protected, 200 after the returned password). Functions and edge functions are refused without auth."
  },
  "pay": {
   "status": "",
   "grade": "P2",
   "rails": [
    "card checkout in the team Billing UI (per docs; not reached)"
   ],
   "rail_ids": [
    "card"
   ],
   "first_party": false,
   "rail_scope": "full",
   "trial_path": "free tier",
   "note": "No 402 anywhere, no x-payment-info, no /.well-known/ucp; we paid nothing. Netlify appears in the Stripe Projects catalog (a listing, not confirmed by the vendor). Paid plans are managed in the team billing UI per the docs; the checkout itself was not reached because sign-up was blocked.",
   "reached": false
  },
  "cancel": {
   "status": "n/a",
   "note": "Nothing to cancel: our agent used the free plan.",
   "docs_note": "not tested: no plan or trial was started, and sign-up was blocked before the team billing UI was reached. Docs billing FAQ: 'The downgrade is scheduled at the end of the billing cycle.' (team billing UI).",
   "docs_grade": "",
   "nothing": "free_plan"
  },
  "delete": {
   "status": "blocked",
   "note": "No Netlify account was created (sign-up blocked), so there is no account to delete. `netlify sites:delete <id> --force` on our two anonymous projects (jolly-axolotl-a13c96, polite-caramel-10c81d) returned 'Authentication required': nothing was deleted and the error leaves no rejected-login evidence either way. Docs say unclaimed projects are removed automatically after one hour; that removal was not observed within the drive.",
   "left": "expires",
   "after_hours": 1,
   "account": false
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-11",
  "source": "probe",
  "options": [
   {
    "id": "stripe-projects",
    "name": "Stripe Projects",
    "kind": "agent-rail",
    "first_party": true,
    "lead": false,
    "networks": [],
    "testnet": false
   }
  ],
  "agentic": [
   "stripe-projects"
  ],
  "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."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": true,
  "cli": true,
  "sdk": true,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": true,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST api.netlify.com/api/v1, OAuth2/PAT bearer",
  "openapi": "Swagger 2.0, info.version 2.60.0",
  "mcp": "official remote (OAuth) + @netlify/mcp stdio",
  "cli": "netlify-cli 27.12.0 with --allow-anonymous and login --request",
  "llms_txt": "docs.netlify.com/llms.txt; robots.txt carries Cloudflare-style 'Content-Signal: search=yes, ai-input=yes, ai-train=yes' (no aipref Content-Usage)"
 },
 "can_do": [
  "Deploy a static site with no account through the CLI (netlify deploy --allow-anonymous) and get a live URL plus a claim link",
  "Resize and convert images on its own deployed site through the Image CDN (/.netlify/images)",
  "Read every docs page as Markdown and the full OpenAPI spec"
 ],
 "cannot_do": [
  {
   "what": "Create an account",
   "why": "The email sign-up form silently drops the submit after an invisible reCAPTCHA Enterprise check"
  },
  {
   "what": "Get an API token or use the MCP server",
   "why": "Every token route needs a signed-in account"
  },
  {
   "what": "Deploy functions or edge functions without an account",
   "why": "Anonymous deploy refuses them: 'require authentication'"
  },
  {
   "what": "Manage domains, env vars, rollbacks, forms, build settings",
   "why": "All need a token"
  },
  {
   "what": "Delete its anonymous projects",
   "why": "sites:delete needs auth; they expire after one hour"
  }
 ],
 "blockers": [
  "Invisible reCAPTCHA Enterprise on the email sign-up form drops the submit with no error"
 ],
 "tips_for_owner": [
  "Show an error when sign-up is rejected",
  "Let a verified agent sign up headless",
  "Let agents claim with a code, not a browser",
  "Allow functions in anonymous deploys",
  "Document the anonymous site password",
  "Serve MCP server/discover and support CIMD",
  "Publish OpenAPI 3.x"
 ],
 "tips_for_agents": [
  "Use `netlify deploy --allow-anonymous --dir <dir> --no-build --json` to ship a static site with no account; keep the returned password, the site answers 401 without it, and hand the claim_url to a human within one hour.",
  "Anonymous deploys refuse functions and edge functions; deploy only static files that way.",
  "`netlify login --request <message> --json` gives a URL for a human to approve and a check_command to poll for ten minutes.",
  "Every docs page is Markdown at <url>.md; the OpenAPI is Swagger 2.0 at open-api.netlify.com/swagger.json."
 ],
 "selfhost": null,
 "summary": "An agent can deploy a static site to Netlify with no account (netlify deploy --allow-anonymous) and use the Image CDN on it, and the docs are agent-ready (llms.txt, Markdown pages, OpenAPI, MCP server card). Opening an account failed: the email sign-up form silently reset after an invisible reCAPTCHA Enterprise check, so no token, MCP, functions or project management were reachable.",
 "wall": "invisible reCAPTCHA silently drops email sign-up",
 "plan_scope": "none (no account: anonymous deploys only)",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Netlify is a web hosting platform for building and deploying websites, apps and small backend functions. An agent working alone could deploy a simple static webpage with no account at all and resize images on it, and could read all of Netlify's documentation on its own. It got stuck trying to create a full account: the sign-up form silently failed an invisible robot check, so nothing past the basic free deploy was reachable.",
  "can_do": [
   "Put a simple static webpage online with no account needed, and get a link to claim it later",
   "Resize and convert images on that webpage automatically",
   "Read all of the product's documentation and technical specs on its own"
  ],
  "cannot_do": [
   {
    "what": "Create a full account",
    "why": "an invisible robot check silently rejects the sign-up form with no error"
   },
   {
    "what": "Get an API key or connect through the agent protocol (MCP)",
    "why": "both require a signed-in account, which it could not create"
   },
   {
    "what": "Add backend functions, custom domains, or team/billing features",
    "why": "all of these require a signed-in account"
   },
   {
    "what": "Delete the test pages it made",
    "why": "deleting needs a login it doesn't have; they expire on their own after an hour"
   }
  ]
 },
 "plan_gated": [],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Deploy",
   "capability": "Create a new site/project",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/sites",
    "mcp": "netlify-create-project (via @netlify/mcp)",
    "cli": "netlify init / netlify sites:create",
    "ui": "app.netlify.com > Add new project"
   },
   "check": "GET /api/v1/sites/{site_id} returns the new site object",
   "source": "https://docs.netlify.com/api-and-cli-guides/api-guides/get-started-with-api/, https://docs.netlify.com/api-and-cli-guides/cli-guides/get-started-with-cli/"
  },
  {
   "id": "cap-02",
   "group": "Deploy",
   "capability": "Deploy a site from Git, CLI, drag-and-drop, or ZIP/digest",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/sites/{site_id}/deploys",
    "mcp": "netlify-deploy-site",
    "cli": "netlify deploy",
    "ui": "app.netlify.com/drop, Import a project"
   },
   "check": "GET /api/v1/deploys/{deploy_id} shows state: ready",
   "source": "https://www.netlify.com/, https://docs.netlify.com/api-and-cli-guides/api-guides/get-started-with-api/#deploy-with-the-api"
  },
  {
   "id": "cap-04",
   "group": "Deploy",
   "capability": "Get an instant private preview URL before publishing (Deploy Previews)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /api/v1/sites/{site_id}/deploys (deploy_ssl_url)",
    "mcp": null,
    "cli": "netlify deploy (no --prod)",
    "ui": "pull request / deploy page"
   },
   "check": "deploy object's deploy_ssl_url resolves and context=deploy-preview",
   "source": "https://docs.netlify.com/deploy/deploy-types/deploy-previews/, https://www.netlify.com/"
  },
  {
   "id": "cap-05",
   "group": "Deploy",
   "capability": "Roll back to a previous deploy with one click",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/sites/{site_id}/deploys/{deploy_id}/restore",
    "mcp": null,
    "cli": null,
    "ui": "Deploys tab > Publish deploy"
   },
   "check": "GET /api/v1/sites/{site_id} shows published_deploy.id equal to the restored deploy_id",
   "source": "https://docs.netlify.com/deploy/manage-deploys/manage-deploys-overview/, https://www.netlify.com/"
  },
  {
   "id": "cap-07",
   "group": "Run",
   "capability": "Run server-side logic with Serverless Functions",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PUT /api/v1/deploys/{deploy_id}/functions/{name}",
    "mcp": "netlify-functions guidance",
    "cli": "netlify functions:create / netlify functions:invoke",
    "ui": "Functions tab"
   },
   "check": "invoking the deployed function's URL returns the handler's response",
   "source": "https://docs.netlify.com/start/core-concepts/primitives/#functions, https://docs.netlify.com/api-and-cli-guides/cli-guides/manage-functions/"
  },
  {
   "id": "cap-08",
   "group": "Run",
   "capability": "Run personalized logic at the network edge with Edge Functions",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "netlify dev (edge functions served locally)",
    "ui": "Edge Functions tab"
   },
   "check": "request to a path matching the edge function declaration returns the modified response",
   "source": "https://docs.netlify.com/start/core-concepts/primitives/#edge-functions"
  },
  {
   "id": "cap-16",
   "group": "Collect",
   "capability": "Collect form submissions with zero-config HTML forms",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /api/v1/sites/{site_id}/submissions",
    "mcp": null,
    "cli": null,
    "ui": "Forms tab"
   },
   "check": "submitting the HTML form (data-netlify=\"true\") creates a row visible at GET /api/v1/sites/{site_id}/submissions",
   "source": "https://docs.netlify.com/manage/forms/setup.md, https://docs.netlify.com/manage/forms/submissions.md"
  },
  {
   "id": "cap-19",
   "group": "Domains",
   "capability": "Connect and manage a custom domain",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/sites/{site_id}/domains",
    "mcp": "netlify-domain-management",
    "cli": "netlify domains:add",
    "ui": "Domain management tab"
   },
   "check": "GET /api/v1/sites/{site_id} lists the domain under custom_domain/domain_aliases",
   "source": "https://docs.netlify.com/manage/domains/domains-fundamentals/understand-domains.md"
  },
  {
   "id": "cap-23",
   "group": "Build",
   "capability": "Configure build command, publish directory, and build settings",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /api/v1/sites/{site_id}",
    "mcp": null,
    "cli": "netlify.toml [build]",
    "ui": "Project configuration > Build & deploy"
   },
   "check": "next deploy's build log uses the configured build command and publish dir",
   "source": "https://docs.netlify.com/build/configure-builds/overview.md, https://docs.netlify.com/build/configure-builds/file-based-configuration.md"
  },
  {
   "id": "cap-24",
   "group": "Build",
   "capability": "Set and manage environment variables (incl. secrets)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/accounts/{account_id}/env",
    "mcp": "netlify-env-vars",
    "cli": "netlify env:set",
    "ui": "Environment variables settings"
   },
   "check": "netlify env:get <KEY> returns the stored value; deploy build log references the var without echoing a secret one",
   "source": "https://docs.netlify.com/build/environment-variables/get-started.md, https://docs.netlify.com/build/environment-variables/overview.md"
  },
  {
   "id": "cap-03",
   "group": "Deploy",
   "capability": "Generate and deploy a project from an AI prompt (Agent Runners)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": "netlify-create-project (prompt-based)",
    "cli": "netlify create \"<prompt>\"",
    "ui": "app.netlify.com/start"
   },
   "check": "netlify create returns a live URL and local project folder; GET /api/v1/sites/{site_id} exists",
   "source": "https://docs.netlify.com/api-and-cli-guides/cli-guides/get-started-with-cli/#create-a-project-from-a-prompt, https://docs.netlify.com/build/build-with-ai/agent-runners/overview/"
  },
  {
   "id": "cap-06",
   "group": "Deploy",
   "capability": "Lock, cancel, skip, or delete a deploy",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/sites/{site_id}/lock, POST /api/v1/deploys/{deploy_id}/cancel",
    "mcp": null,
    "cli": null,
    "ui": "Deploys tab"
   },
   "check": "GET /api/v1/sites/{site_id}/deploys/{deploy_id} shows state: cancelled or site locked flag true",
   "source": "https://docs.netlify.com/deploy/manage-deploys/manage-deploys-overview/"
  },
  {
   "id": "cap-09",
   "group": "Run",
   "capability": "Run scheduled (cron-like) functions",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Functions tab (schedule shown on function)"
   },
   "check": "function logs show an invocation at the configured cron time without an external trigger",
   "source": "https://docs.netlify.com/start/core-concepts/primitives/#scheduled-functions"
  },
  {
   "id": "cap-10",
   "group": "Run",
   "capability": "Run long background jobs with Background Functions",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Functions tab"
   },
   "check": "function configured with -background suffix completes after returning 202 immediately; logs show run up to 15 min",
   "source": "https://docs.netlify.com/start/core-concepts/primitives/#background-functions"
  },
  {
   "id": "cap-11",
   "group": "Run",
   "capability": "Run event-driven Async Workloads with retries",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "netlify dev (async workloads emulator)",
    "ui": null
   },
   "check": "sending an event via AsyncWorkloadsClient triggers the workload function; dashboard shows run status succeeded",
   "source": "https://docs.netlify.com/build/async-workloads/overview/, https://docs.netlify.com/build/async-workloads/get-started/"
  },
  {
   "id": "cap-12",
   "group": "Data",
   "capability": "Store and query data in Netlify Database (managed Postgres)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": "netlify-database",
    "cli": "netlify db init",
    "ui": "Database tab"
   },
   "check": "a query against the connection string returns inserted rows",
   "source": "https://docs.netlify.com/build/data-and-storage/netlify-database/index.md, https://docs.netlify.com/build/data-and-storage/netlify-database/getting-started.md"
  },
  {
   "id": "cap-13",
   "group": "Data",
   "capability": "Store and retrieve unstructured data/files with Netlify Blobs",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "netlify blobs:set / netlify blobs:get",
    "ui": "Blobs tab"
   },
   "check": "getStore(name).get(key) returns the value just set",
   "source": "https://docs.netlify.com/start/core-concepts/primitives/#blobs, https://docs.netlify.com/build/data-and-storage/netlify-blobs/"
  },
  {
   "id": "cap-14",
   "group": "Data",
   "capability": "Transform and optimize images on demand (Image CDN)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET /.netlify/images?url=/hero.jpg&w=800 returns a resized image with correct content-type",
   "source": "https://docs.netlify.com/start/core-concepts/primitives/#image-cdn"
  },
  {
   "id": "cap-15",
   "group": "Run",
   "capability": "Route requests to any major AI model through AI Gateway",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "AI Gateway tab"
   },
   "check": "a function call through Netlify.env AI Gateway token returns a model completion, billed as AI inference credits",
   "source": "https://www.netlify.com/, https://docs.netlify.com/docs/ai-gateway"
  },
  {
   "id": "cap-17",
   "group": "Collect",
   "capability": "Filter form spam (Akismet, honeypot, reCAPTCHA)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Forms > Settings > Spam filters"
   },
   "check": "a honeypot-triggering test submission appears under the Spam tab instead of Verified",
   "source": "https://docs.netlify.com/manage/forms/spam-filters.md"
  },
  {
   "id": "cap-18",
   "group": "Collect",
   "capability": "Get notified on form submissions and deploy events",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/hooks",
    "mcp": null,
    "cli": null,
    "ui": "Site notifications settings"
   },
   "check": "a configured Slack/webhook notification fires on the next matching event",
   "source": "https://docs.netlify.com/manage/forms/notifications.md, https://docs.netlify.com/deploy/deploy-notifications.md"
  },
  {
   "id": "cap-20",
   "group": "Domains",
   "capability": "Register a new domain directly through Netlify",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Domain management > Register domain"
   },
   "check": "WHOIS for the purchased domain shows Netlify/registrar of record",
   "source": "https://docs.netlify.com/manage/domains/get-started-with-domains.md"
  },
  {
   "id": "cap-21",
   "group": "Domains",
   "capability": "Manage DNS records via Netlify DNS",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/dns_zones/{zone_id}/dns_records",
    "mcp": null,
    "cli": null,
    "ui": "DNS panel"
   },
   "check": "dig on the record name returns the configured value",
   "source": "https://docs.netlify.com/manage/domains/configure-domains/dns-records.md, https://docs.netlify.com/manage/domains/set-up-netlify-dns.md"
  },
  {
   "id": "cap-22",
   "group": "Domains",
   "capability": "Enable automatic HTTPS / bring your own SSL certificate",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/sites/{site_id}/ssl",
    "mcp": null,
    "cli": null,
    "ui": "Domain management > HTTPS"
   },
   "check": "curl -I https://<domain> returns a valid cert issued by Netlify's provider",
   "source": "https://docs.netlify.com/manage/domains/secure-domains-with-https/https-ssl.md"
  },
  {
   "id": "cap-25",
   "group": "Build",
   "capability": "Trigger a build/deploy via webhook (build hook)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/sites/{site_id}/build_hooks",
    "mcp": null,
    "cli": null,
    "ui": "Build & deploy > Build hooks"
   },
   "check": "POST to the build hook URL starts a new deploy visible under Deploys",
   "source": "https://docs.netlify.com/build/configure-builds/build-hooks.md"
  },
  {
   "id": "cap-26",
   "group": "Build",
   "capability": "Extend builds with Build Plugins",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "netlify plugins:install",
    "ui": "Integrations > Build plugins"
   },
   "check": "deploy log shows the plugin's onBuild/onPostBuild lifecycle events running",
   "source": "https://docs.netlify.com/extend/develop-and-share/develop-build-plugins.md, https://docs.netlify.com/extend/develop-and-share/share-build-plugins.md"
  },
  {
   "id": "cap-27",
   "group": "Build",
   "capability": "Run a local dev server mirroring production (Netlify Dev)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "netlify dev",
    "ui": null
   },
   "check": "localhost dev server serves functions/redirects identically to the deployed site",
   "source": "https://docs.netlify.com/api-and-cli-guides/cli-guides/local-development.md"
  },
  {
   "id": "cap-28",
   "group": "Build",
   "capability": "Spin up a cloud Preview Server with live content/code sync",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Preview Servers tab"
   },
   "check": "opening the Preview Server URL reflects an unsaved local/CMS change",
   "source": "https://docs.netlify.com/start/core-concepts/primitives/#preview-servers"
  },
  {
   "id": "cap-29",
   "group": "Build",
   "capability": "Control cache behavior and purge the CDN cache",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/sites/{site_id}/cache_tags/purge",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "after purge, the next response for the purged tag is regenerated (no longer cache HIT)",
   "source": "https://docs.netlify.com/build/caching/caching-overview.md"
  },
  {
   "id": "cap-30",
   "group": "Build",
   "capability": "Use AI agents (Claude, Codex, etc.) to make code changes via Agent Runners",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project > Agent Runners"
   },
   "check": "prompting an Agent Runner produces a new deploy preview with the requested code change",
   "source": "https://docs.netlify.com/build/build-with-ai/agent-runners/overview.md, https://docs.netlify.com/build/build-with-ai/agent-runners/make-changes-with-agent-runners.md"
  },
  {
   "id": "cap-31",
   "group": "Protect",
   "capability": "Password-protect a deploy or restrict visitor access",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Site configuration > Visitor access"
   },
   "check": "unauthenticated request to the protected URL returns a Netlify password prompt / 401",
   "source": "https://docs.netlify.com/deploy/protect-deploys.md"
  },
  {
   "id": "cap-32",
   "group": "Protect",
   "capability": "Set firewall traffic rules and rate limiting",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Site configuration > Traffic rules"
   },
   "check": "requests exceeding the configured rate limit receive a 429",
   "source": "https://www.netlify.com/pricing/"
  },
  {
   "id": "cap-33",
   "group": "Team",
   "capability": "Invite and manage team members and roles",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1/{account_id}/members",
    "mcp": null,
    "cli": null,
    "ui": "Team members settings"
   },
   "check": "GET /api/v1/{account_id}/members lists the invited member with assigned role",
   "source": "https://docs.netlify.com/manage/accounts-and-billing/team-management/manage-team-members.md, https://docs.netlify.com/manage/accounts-and-billing/team-management/roles-and-permissions.md"
  },
  {
   "id": "cap-34",
   "group": "Team",
   "capability": "View team audit log of account/site changes",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Team > Audit log"
   },
   "check": "a recent settings change appears as an entry in the audit log, filterable by event type",
   "source": "https://docs.netlify.com/manage/accounts-and-billing/team-management/team-audit-log.md"
  },
  {
   "id": "cap-35",
   "group": "Team",
   "capability": "Transfer a project between teams and label sites",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project configuration > General > Transfer project"
   },
   "check": "GET /api/v1/sites/{site_id} shows account_id of the destination team after transfer",
   "source": "https://docs.netlify.com/manage/accounts-and-billing/team-management/team-owned-sites.md"
  },
  {
   "id": "cap-36",
   "group": "Account",
   "capability": "Configure SSO/SCIM for enterprise team access",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Team > Security > SAML SSO"
   },
   "check": "a SAML-authenticated login succeeds and provisions team membership per SCIM mapping",
   "source": "https://docs.netlify.com/manage/security/secure-netlify-access/configure-team-saml-sso"
  },
  {
   "id": "cap-37",
   "group": "Account",
   "capability": "View billing, usage, and credit consumption",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Team > Billing"
   },
   "check": "Billing page usage totals increase after a metered action (e.g. production deploy consumes 15 credits)",
   "source": "https://docs.netlify.com/manage/accounts-and-billing/billing/overview.md, https://www.netlify.com/pricing/"
  },
  {
   "id": "cap-38",
   "group": "Account",
   "capability": "Create a personal access token / OAuth application for API use",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "netlify login",
    "ui": "User settings > Applications > Personal access tokens"
   },
   "check": "the generated token successfully authenticates a GET /api/v1/sites request",
   "source": "https://docs.netlify.com/api-and-cli-guides/api-guides/get-started-with-api/#authentication"
  }
 ],
 "attempts": [
  {
   "t": "01:15",
   "cap": "discovery",
   "capability": "robots/aipref",
   "task": "robots.txt and Content-Usage",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "www.netlify.com/robots.txt: 'User-agent: * Allow: /' and 'Content-Signal: search=yes, ai-input=yes, ai-train=yes' (Cloudflare Content Signals scheme, parses). No aipref Content-Usage line; no Content-Usage header on homepage. app.netlify.com/robots.txt allows all."
  },
  {
   "t": "01:15",
   "cap": "discovery",
   "capability": "llms.txt + markdown",
   "task": "llms.txt and markdown docs",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "https://docs.netlify.com/llms.txt 200 text/plain (H1 'LLM documentation for Netlify'); www.netlify.com/llms.txt 200 (pay_probe). Accept: text/markdown on docs page -> 200 content-type text/markdown, vary: Accept-Encoding, Accept. .md URL -> 200 text/markdown. netlify.ai serves agent instructions as markdown."
  },
  {
   "t": "01:15",
   "cap": "discovery",
   "capability": "openapi",
   "task": "find OpenAPI",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "https://open-api.netlify.com/swagger.json: swagger 2.0, info.version 2.60.0; linked from www.netlify.com/.well-known/api-catalog (RFC 9727 linkset, application/linkset+json)."
  },
  {
   "t": "01:15",
   "cap": "discovery",
   "capability": "mcp discover",
   "task": "server/discover on MCP endpoints",
   "route": "mcp",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "POST https://mcp.netlify.com/mcp and https://netlify-mcp.netlify.app/mcp with MCP-Protocol-Version 2026-07-28 server/discover -> 401 WWW-Authenticate: Bearer realm=\"MCP Server\", resource_metadata=\".../.well-known/oauth-protected-resource/mcp\". PRM 200 JSON (auth server https://mcp.netlify.com/, scopes offline_access read write claudeai). AS metadata: registration_endpoint (DCR), no client_id_metadata_document_supported, PKCE S256, grants authorization_code+refresh_token (no device flow).",
   "notes": "auth required before discover; needs a Netlify account"
  },
  {
   "t": "01:15",
   "cap": "discovery",
   "capability": "cards",
   "task": "MCP server card, AI catalog, A2A card",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "/.well-known/ai-catalog.json 404; /.well-known/agent-card.json 404; https://mcp.netlify.com/mcp/server-card 404; https://www.netlify.com/.well-known/mcp/server-card.json 200 application/json (Netlify MCP Server 1.15.1, url https://netlify-mcp.netlify.app/mcp, streamable-http)."
  },
  {
   "t": "01:15",
   "cap": "pay",
   "capability": "pay probes",
   "task": "402 challenges, registries, checkout",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "pay_probe.json: no 402 challenges on netlify.com, api.netlify.com, x402./mpp./agents. subdomains (404); /.well-known/ucp 404; OpenAPI no x-payment-info; listed in Stripe Projects catalog (name netlify) - a listing, not confirmed by a 402; free plan ('Free $0 forever'). pay_tx.json: refused, no 402 asking for USDC."
  },
  {
   "t": "01:15",
   "cap": "docs",
   "capability": "docs",
   "task": "find docs headless",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "docs.netlify.com llms.txt + .md pages fetched headless; OpenAPI fetched headless"
  },
  {
   "t": "05:30",
   "cap": "signup",
   "capability": "sign up",
   "task": "Sign up with email at app.netlify.com/signup/email",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "Filled email the agent's inbox + password, clicked 'Sign up': button showed 'Sign up...' then the form reset with no error and no message. Captured network (signup_net.log): reCAPTCHA Enterprise reload (key [redacted]) answered a token, then no sign-up request reached any Netlify API; no verification mail after 60 s + later checks. One retry with the same behaviour, same result. No visible challenge (visible_challenge false).",
   "notes": "Invisible reCAPTCHA Enterprise check on the sign-up form. Other sign-up options are Google/GitHub/GitLab/Bitbucket OAuth (we hold no such account).",
   "quality": {
    "error_legibility": "silent",
    "recoverable": "no"
   }
  },
  {
   "t": "05:30",
   "cap": "verify",
   "capability": "verify email",
   "task": "Read verification mail",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "inbox read the agent's inbox: \"no mail\" (60 s wait + two later checks); sign-up never submitted",
   "notes": "blocked by the sign-up wall"
  },
  {
   "t": "05:31",
   "cap": "discovery",
   "capability": "CLI login ticket",
   "task": "netlify login --request (agent/human-in-the-loop auth)",
   "route": "cli",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "netlify-cli 27.12.0 `netlify login --request 'AgentDrives test drive' --json` returned ticket_id, url https://app.netlify.com/authorize?response_type=ticket..., check_command, agent_next_steps 'Give the URL to the user so they can authorize. Then poll the check_command for up to ten minutes'. Needs a human with a Netlify account to approve."
  },
  {
   "t": "05:31",
   "cap": "credentials",
   "capability": "API credentials",
   "task": "Get a token (PAT, CLI login, MCP OAuth)",
   "route": "cli",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "key": "create",
   "evidence": "Every token route needs a signed-in account: PAT in User settings > Applications (UI), `netlify login` / `--request` ticket needs a human to approve at app.netlify.com/authorize, MCP OAuth (DCR at https://mcp.netlify.com/oauth-server/reg) ends at Netlify login. Sign-up was blocked, so no account.",
   "notes": "blocked by sign-up wall; no API to create scoped keys documented in OpenAPI without an existing token"
  },
  {
   "t": "05:31",
   "cap": "first_call",
   "capability": "first call",
   "task": "First CLI call with no account",
   "route": "cli",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "`netlify deploy --allow-anonymous --dir. --no-build --json` answered site_id 78b3a327-..., site_url http://jolly-axolotl-a13c96.netlify.app, deploy_id 6acbb51b6b31274b8589310a, claim_url, claim_command, password [redacted]. Documented in get-started-with-cli.md \"Anonymous deploys\" (claim within one hour, else removed).",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.netlify.com/api-and-cli-guides/cli-guides/get-started-with-cli.md",
    "verify_route": "yes"
   }
  },
  {
   "t": "05:31",
   "cap": "first_action",
   "capability": "first action",
   "task": "Deploy a static page without an account",
   "route": "cli",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Anonymous deploy created a project; GET https://jolly-axolotl-a13c96.netlify.app/ -> 401 Password Protection page; POST password=(the returned password) -> 302 + cookie; GET -> 200 with our \"AgentDrives test site v1\" HTML.",
   "quality": {
    "docs_match": "drift",
    "docs_url": "https://docs.netlify.com/api-and-cli-guides/cli-guides/get-started-with-cli.md",
    "verify_route": "yes"
   },
   "notes": "docs do not mention that the anonymous site is password-protected; the CLI returns the password"
  },
  {
   "t": "05:31",
   "cap": "cap-02",
   "capability": "Deploy a site",
   "task": "Deploy a static page with the CLI",
   "route": "cli",
   "documented": true,
   "result": "done",
   "verified": true,
   "step": "create",
   "evidence": "netlify deploy --allow-anonymous: deploy 6acbb51b6b31274b8589310a; site serves our HTML after the returned password (200).",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.netlify.com/api-and-cli-guides/cli-guides/get-started-with-cli.md",
    "verify_route": "yes",
    "error_legibility": "clear"
   }
  },
  {
   "t": "05:31",
   "cap": "cap-02",
   "capability": "Deploy a site",
   "task": "Anonymous deploy with functions and edge functions",
   "route": "cli",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "step": "update",
   "evidence": "netlify deploy --allow-anonymous with netlify/functions and netlify/edge-functions -> 'This project includes serverless functions and edge functions which require authentication. Run netlify login --request <message> first, then retry your deploy command.'",
   "quality": {
    "docs_url": "https://docs.netlify.com/api-and-cli-guides/cli-guides/get-started-with-cli.md",
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "05:31",
   "cap": "cap-01",
   "capability": "Create a new site/project",
   "task": "Create a project",
   "route": "cli",
   "documented": true,
   "result": "partial",
   "verified": true,
   "step": "create",
   "evidence": "Anonymous deploy created project [redacted] (jolly-axolotl-a13c96.netlify.app answers). Reading it back via GET /api/v1/sites/{id}, renaming or deleting needs a token; sign-up blocked.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.netlify.com/api-and-cli-guides/cli-guides/get-started-with-cli.md",
    "verify_route": "no"
   }
  },
  {
   "t": "05:31",
   "cap": "cap-16",
   "capability": "Collect form submissions",
   "task": "Submit a data-netlify form on our anonymous site",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": true,
   "step": "use",
   "evidence": "POST form-name=contact to https://jolly-axolotl-a13c96.netlify.app/ -> 404 Page not found (form not registered on the anonymous --no-build deploy); listing submissions needs GET /api/v1/sites/{id}/submissions with a token.",
   "quality": {
    "docs_match": "drift",
    "docs_url": "https://docs.netlify.com/manage/forms/setup.md",
    "error_legibility": "vague"
   }
  },
  {
   "t": "05:31",
   "cap": "cap-04",
   "capability": "Deploy Previews",
   "task": "Deploy Previews on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs an authenticated account/token (API, CLI, MCP all require auth; anonymous deploy refuses functions/edge functions and offers no further project calls). Sign-up blocked by invisible reCAPTCHA Enterprise.",
   "quality": {
    "docs_url": "https://open-api.netlify.com/swagger.json"
   }
  },
  {
   "t": "05:31",
   "cap": "cap-05",
   "capability": "Roll back",
   "task": "Roll back on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs an authenticated account/token (API, CLI, MCP all require auth; anonymous deploy refuses functions/edge functions and offers no further project calls). Sign-up blocked by invisible reCAPTCHA Enterprise.",
   "quality": {
    "docs_url": "https://open-api.netlify.com/swagger.json"
   }
  },
  {
   "t": "05:31",
   "cap": "cap-07",
   "capability": "Serverless Functions",
   "task": "Serverless Functions on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs an authenticated account/token (API, CLI, MCP all require auth; anonymous deploy refuses functions/edge functions and offers no further project calls). Sign-up blocked by invisible reCAPTCHA Enterprise.",
   "quality": {
    "docs_url": "https://open-api.netlify.com/swagger.json"
   }
  },
  {
   "t": "05:31",
   "cap": "cap-08",
   "capability": "Edge Functions",
   "task": "Edge Functions on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs an authenticated account/token (API, CLI, MCP all require auth; anonymous deploy refuses functions/edge functions and offers no further project calls). Sign-up blocked by invisible reCAPTCHA Enterprise.",
   "quality": {
    "docs_url": "https://open-api.netlify.com/swagger.json"
   }
  },
  {
   "t": "05:31",
   "cap": "cap-19",
   "capability": "Custom domain",
   "task": "Custom domain on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs an authenticated account/token (API, CLI, MCP all require auth; anonymous deploy refuses functions/edge functions and offers no further project calls). Sign-up blocked by invisible reCAPTCHA Enterprise.",
   "quality": {
    "docs_url": "https://open-api.netlify.com/swagger.json"
   }
  },
  {
   "t": "05:31",
   "cap": "cap-23",
   "capability": "Build settings",
   "task": "Build settings on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs an authenticated account/token (API, CLI, MCP all require auth; anonymous deploy refuses functions/edge functions and offers no further project calls). Sign-up blocked by invisible reCAPTCHA Enterprise.",
   "quality": {
    "docs_url": "https://open-api.netlify.com/swagger.json"
   }
  },
  {
   "t": "05:31",
   "cap": "cap-24",
   "capability": "Environment variables",
   "task": "Environment variables on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs an authenticated account/token (API, CLI, MCP all require auth; anonymous deploy refuses functions/edge functions and offers no further project calls). Sign-up blocked by invisible reCAPTCHA Enterprise.",
   "quality": {
    "docs_url": "https://open-api.netlify.com/swagger.json"
   }
  },
  {
   "t": "08:49",
   "cap": "cap-14",
   "capability": "Image CDN",
   "task": "Resize a PNG on our own anonymous site",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Anonymous deploy polite-caramel-10c81d.netlify.app with a 200x100 a.png; GET /.netlify/images?url=/a.png&w=50&fm=webp -> 200 image/webp, 300 bytes, VP8X header says 50x25.",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.netlify.com/build/image-cdn/overview.md",
    "verify_route": "yes"
   }
  },
  {
   "t": "08:49",
   "cap": "cap-27",
   "capability": "Netlify Dev",
   "task": "netlify dev --offline with a function and an edge function",
   "route": "cli",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "netlify dev --offline started without an account: 'Loaded function hello', 'Local dev server ready: http://localhost:8899'. Edge Functions setup failed writing its Deno cache (read-only home in our sandbox). Calling the local port from the sandbox did not connect (loopback not reachable here), so the served response was not read back.",
   "notes": "works without an account; serving not verified in this environment"
  },
  {
   "t": "08:49",
   "cap": "cap-03",
   "capability": "Create project from a prompt",
   "task": "netlify create \"a one-page hello site\"",
   "route": "cli",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "CLI: 'Error: Authentication required. NETLIFY_AUTH_TOKEN is not set ... use `netlify login --request <message>` as a next step.'",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "08:50",
   "cap": "cap-13",
   "capability": "Netlify Blobs",
   "task": "netlify blobs:set without a linked site",
   "route": "cli",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "CLI: 'MissingBlobsEnvironmentError: ... supply the following properties when creating a store: siteID, token' - needs a token. Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable.",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "08:50",
   "cap": "cap-31",
   "capability": "Password-protect a deploy",
   "task": "Set visitor access on our project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Anonymous deploys come password-protected by default (401 Password Protection page, CLI returns the password), but setting/changing visitor access needs an account. Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable.",
   "notes": "map: paid plan"
  },
  {
   "t": "08:50",
   "cap": "cap-06",
   "capability": "Lock/cancel a deploy",
   "task": "Lock/cancel a deploy on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable. API POST /deploys/{deploy_id}/cancel exists in OpenAPI 2.0."
  },
  {
   "t": "08:50",
   "cap": "cap-09",
   "capability": "Scheduled functions",
   "task": "Scheduled functions on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable. Anonymous deploy refuses functions."
  },
  {
   "t": "08:50",
   "cap": "cap-10",
   "capability": "Background functions",
   "task": "Background functions on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable. Anonymous deploy refuses functions."
  },
  {
   "t": "08:50",
   "cap": "cap-11",
   "capability": "Async Workloads",
   "task": "Async Workloads on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable."
  },
  {
   "t": "08:50",
   "cap": "cap-12",
   "capability": "Netlify Database",
   "task": "Netlify Database on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable. Map: paid plan."
  },
  {
   "t": "08:50",
   "cap": "cap-15",
   "capability": "AI Gateway",
   "task": "AI Gateway on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable."
  },
  {
   "t": "08:51",
   "cap": "cap-17",
   "capability": "Form spam filters",
   "task": "Form spam filters on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable."
  },
  {
   "t": "08:51",
   "cap": "cap-18",
   "capability": "Notifications",
   "task": "Notifications on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable. API /hooks and /hooks/types exist in OpenAPI."
  },
  {
   "t": "08:51",
   "cap": "cap-20",
   "capability": "Register a domain",
   "task": "Register a domain on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable. Map: paid plan; would cost money."
  },
  {
   "t": "08:51",
   "cap": "cap-21",
   "capability": "Netlify DNS",
   "task": "Netlify DNS on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable. API /dns_zones/{zone_id}/dns_records in OpenAPI."
  },
  {
   "t": "08:51",
   "cap": "cap-22",
   "capability": "HTTPS/SSL",
   "task": "HTTPS/SSL on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable."
  },
  {
   "t": "08:51",
   "cap": "cap-25",
   "capability": "Build hooks",
   "task": "Build hooks on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable. API /sites/{site_id}/build_hooks in OpenAPI."
  },
  {
   "t": "08:51",
   "cap": "cap-26",
   "capability": "Build plugins",
   "task": "Build plugins on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable."
  },
  {
   "t": "08:51",
   "cap": "cap-28",
   "capability": "Preview Servers",
   "task": "Preview Servers on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable. Map: paid plan."
  },
  {
   "t": "08:51",
   "cap": "cap-29",
   "capability": "Cache purge",
   "task": "Cache purge on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable."
  },
  {
   "t": "08:51",
   "cap": "cap-30",
   "capability": "Agent Runners",
   "task": "Agent Runners on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable."
  },
  {
   "t": "08:51",
   "cap": "cap-32",
   "capability": "Traffic rules",
   "task": "Traffic rules on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable."
  },
  {
   "t": "08:51",
   "cap": "cap-33",
   "capability": "Team members",
   "task": "Team members on our own project",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Needs a signed-in Netlify account or token; sign-up was blocked by an invisible reCAPTCHA Enterprise check, so not reachable. Would also invite a person; not done."
  },
  {
   "t": "08:51",
   "cap": "cap-34",
   "capability": "Audit log",
   "task": "Check it exists in the docs",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "docs team-audit-log.md 200: 'This feature is available on Pro and Enterprise plans.' UI only. Not callable: no account."
  },
  {
   "t": "08:52",
   "cap": "cap-35",
   "capability": "Transfer project",
   "task": "Check it exists in the docs",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "docs team-owned-sites.md 200: '## Transfer projects between teams' (UI). Not callable: no account."
  },
  {
   "t": "08:52",
   "cap": "cap-36",
   "capability": "SAML SSO",
   "task": "Check it exists in the docs",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "docs configure-team-saml-sso.md 200: 'This feature is available on Enterprise plans.' Not callable: no account."
  },
  {
   "t": "08:52",
   "cap": "cap-37",
   "capability": "Billing and usage",
   "task": "Check it exists in the docs",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "docs billing/overview.md 200: 'Monitor usage for Credit-based plans' (UI). Not callable: no account."
  },
  {
   "t": "08:52",
   "cap": "cap-38",
   "capability": "PAT / OAuth app",
   "task": "Check it exists in the docs",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "docs get-started-with-api.md 200: 'Netlify uses OAuth2 for authentication', 'To generate a personal access token (PAT): ... Applications > Personal access tokens' (UI after sign-in). Not callable: no account."
  },
  {
   "t": "08:52",
   "cap": "cancel",
   "capability": "cancel",
   "task": "Cancel/downgrade a plan",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "tested": false,
   "evidence": "not tested: no plan or trial was started (free plan exists; sign-up blocked). Docs billing FAQ: 'The downgrade is scheduled at the end of the billing cycle.' (done in the team billing UI per docs)."
  },
  {
   "t": "09:04",
   "cap": "delete",
   "capability": "delete account",
   "task": "Delete the account and our projects",
   "route": "cli",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "No Netlify account was created (sign-up blocked), so there is no account to delete. Our two anonymous projects (jolly-axolotl-a13c96, polite-caramel-10c81d): `netlify sites:delete <id> --force` -> 'Error: Authentication required...'. Docs: 'You have one hour to claim ownership ... After one hour, unclaimed projects are removed.' Removal not observed within the drive.",
   "notes": "unclaimed anonymous projects expire on their own after one hour (documented)"
  }
 ],
 "stale": false,
 "icon": "/logos/netlify.png",
 "monitored": false,
 "verdict": "L2 · Gets in. Our agent got in on its own: `netlify deploy --allow-anonymous` pushed a static page live with no account, and the docs match the way an agent reads them: llms.txt, every page as Markdown, OpenAPI, and netlify.ai agent instructions. It stopped at sign-up: the email form reset after an invisible reCAPTCHA check, so no token, functions, edge functions or project management followed. Work done stayed at one deploy and one read-back through the CLI. Paying was never reached, and with no account created there was nothing to delete: our agent's own anonymous projects wouldn't delete either, each attempt returning an authentication error.",
 "page": "https://agentdrives.com/tools/netlify?via=api"
}