{
 "slug": "steel",
 "name": "Steel",
 "url": "https://steel.dev",
 "domain": "steel.dev",
 "category": "browser-infrastructure",
 "category_name": "Browser infrastructure",
 "tested_at": "2026-10-12",
 "run": "20261012T212018Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261005T150619Z",
   "date": "2026-10-05",
   "level": 4,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  },
  {
   "run": "20261012T212018Z",
   "date": "2026-10-12",
   "level": 5,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 4,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "obey"
   },
   "why": "product"
  },
  {
   "run": "20261012T212018Z",
   "date": "2026-10-13",
   "level": 4,
   "why": "rules",
   "rules_date": "2026-10-13",
   "methodology": 14
  }
 ],
 "level": 4,
 "level_name": "Runs on its own",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 2,
  "tries": 2,
  "self_start": true
 },
 "badges": [
  "agent-can-buy"
 ],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: pay per call, sign-up in a browser",
   "way": "pay_per_call"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 100% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Pays per call for part of it: paid $0.01 a call (x402), 12 Oct",
   "value": "partial",
   "route": "agent_rail",
   "per_call": {
    "caps": [
     "cap-04"
    ],
    "core": 8,
    "share": 12
   }
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Nothing to cancel; deletes its data, but the login stays",
   "at": "delete",
   "left": "data_only"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "yes",
   "text": "Docs agents can read: llms.txt, an OpenAPI and an MCP server; a docs page for each core task",
   "have": [
    "llms_txt",
    "openapi",
    "mcp"
   ],
   "docs": "complete"
  },
  {
   "key": "access",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: pay per call, sign-up in a browser",
   "way": "pay_per_call",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 100% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Pays per call for part of it: paid $0.01 a call (x402), 12 Oct",
   "value": "partial",
   "route": "agent_rail",
   "per_call": {
    "caps": [
     "cap-04"
    ],
    "core": 8,
    "share": 12
   },
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Nothing to cancel; deletes its data, but the login stays",
   "at": "delete",
   "left": "data_only",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "pay_per_call",
   "label": "Pay per call",
   "routes": [
    "pay_per_call"
   ],
   "minutes": 0.5,
   "core": "1/8"
  },
  {
   "key": "browser_signup",
   "label": "Sign-up in a browser",
   "routes": [
    "magic_link"
   ],
   "minutes": 5,
   "core": "8/8"
  }
 ],
 "minutes": 0.5,
 "next": {
  "to": 5,
  "text": "Next: let an agent buy credits or a plan without a person"
 },
 "stop": "delete",
 "core": "8/8",
 "scores": {
  "coverage": 87,
  "reliability": 79,
  "resilience": 89,
  "setup": 100,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": 84,
  "docs_match": null,
  "setup": 100,
  "security": null,
  "standards": [
   {
    "standard": "MCP",
    "state": "current",
    "behind": null,
    "value": "2026-07-28"
   },
   {
    "standard": "MCP discovery",
    "state": "current",
    "behind": null,
    "value": "ok"
   },
   {
    "standard": "OpenAPI",
    "state": "behind",
    "behind": 2,
    "value": "3.0.3"
   }
  ]
 },
 "reliability_method": "pass^k",
 "resilience": {
  "parts": {
   "error_legibility": 79,
   "recovery": 89,
   "idempotency": 100
  },
  "summary": {
   "error_legibility": "mixed",
   "recovery": "good",
   "idempotency": "safe",
   "rate_limits": "none-seen",
   "notes": "400/401/404 answers name the fix and link the docs; duplicate creates answer 500 or 504 instead of 409 (no duplicates made), and a missing route answers 421 text/plain. 15 quick reads all passed (limit 60/min)."
  }
 },
 "stress": [
  {
   "capability": "Scrape a page to HTML/markdown without managing a session",
   "probe": "missing required url",
   "outcome": "400 {\"message\": \"url must be a valid URL including the scheme, e.g. https://example.com.\", \"error\": \"Bad Request\"}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a cloud browser session",
   "probe": "bad enum value",
   "outcome": "400 {\"message\": \"device is not one of the supported values. Use one of the documented values and retry.\", \"error\": \"Bad Request\"}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a cloud browser session",
   "probe": "unknown id in own namespace",
   "outcome": "404 {\"message\": \"Session not found. It may have ended, expired, or belong to a different organization. Check the session id, or list your sessions to confirm it exists.\", \"error\": \"Not Found\", \"linkTo",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Release/stop a browser session",
   "probe": "release unknown session",
   "outcome": "404 {\"message\": \"Session not found\"}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a cloud browser session",
   "probe": "wrong API key",
   "outcome": "401 {\"error\": \"Unauthorized\", \"message\": \"Invalid Steel API key. The key sent in the 'steel-api-key' header does not match any account. Create or rotate a key at https://app.steel.dev/settings/api-key",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Store and auto-inject login credentials (incl. TOTP) into a session",
   "probe": "repeat a create",
   "outcome": "201 then 500 {\"message\": \"Steel hit an unexpected server error while processing this request. Retry shortly; if it persists, contact support with the request details.\", \"error\": \"Internal Server Error",
   "grade": "vague",
   "idempotent": "yes",
   "rate_limit": null
  },
  {
   "capability": "Create a cloud browser session",
   "probe": "repeat create with the same custom sessionId",
   "outcome": "201, then 504 \"error code: 504\" (text/plain, after a long wait); the session itself was not duplicated",
   "grade": "vague",
   "idempotent": "n/a",
   "rate_limit": null
  },
  {
   "capability": "Create a cloud browser session",
   "probe": "burst of 15 GET /v1/sessions",
   "outcome": "15 x 200; no rate-limit headers on GET (X-RateLimit-Limit 60 / Remaining / Reset seen earlier on a POST /v1/sessions 403); plan limit 60 requests per minute",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": "none-seen"
  },
  {
   "capability": "Persist and reuse a browser profile (cookies, auth, extensions, settings) across sessions",
   "probe": "interrupt a persistProfile session right after create",
   "outcome": "session released; its profile ec9e9236 still reaches READY (consistent, no half state)",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a cloud browser session",
   "probe": "revoked key",
   "outcome": "401 {\"error\": \"Unauthorized\", \"message\": \"Invalid Steel API key. The key sent in the 'steel-api-key' header does not match any account. Create or rotate a key at https://app.steel.dev/settings/api-key",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  }
 ],
 "surface_audit": null,
 "coverage_core": 100,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 4,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": false,
  "prompt_sha": "b52e4dcfa2c5",
  "kb_version": "3+overlay-1353601952",
  "identity": "e8a92f24a9a8"
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 4,
  "signed": true,
  "inbox": [
   "agentdrives.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-15"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "llms.txt with agent instructions, every page as .md and via Accept: text/markdown, OpenAPI 3.0.3 found through /.well-known/api-catalog."
  },
  "signup": {
   "status": "browser",
   "note": "Continue with Email on app.steel.dev (no password, a sign-up link by mail), then a 3-step questionnaire; no bot check seen. No sign-up API.",
   "way": "pay_per_call"
  },
  "verify": {
   "status": "browser",
   "note": "The sign-up link arrived in under a minute and was opened in the browser; it lasts 10 minutes."
  },
  "credentials": {
   "status": "browser",
   "note": "API keys are made in the dashboard. POST /v1/api-keys mints project keys headless, but only with an organization key, which is itself dashboard-only; revoke is dashboard-only.",
   "via": ""
  },
  "first_call": {
   "status": "headless",
   "note": "GET /v1/sessions with the steel-api-key header -> 200.",
   "route": "account"
  },
  "first_action": {
   "status": "headless",
   "note": "Created a cloud browser session with the Node SDK, drove it over CDP with Playwright and released it."
  },
  "pay": {
   "status": "headless",
   "grade": "P4",
   "rails": [
    "x402 v2 on x402.steel.dev (Base, Solana USDC), scrape/screenshot/pdf only",
    "Stripe Projects (documented, not tried)",
    "Stripe Elements card form in the dashboard"
   ],
   "rail_ids": [
    "x402",
    "stripe-projects",
    "stripe-elements"
   ],
   "first_party": true,
   "rail_scope": "side",
   "trial_path": "free tier",
   "3ds": "none",
   "route": "agent_rail",
   "checkout": {
    "reached": "card_form",
    "processor": "stripe_elements",
    "captcha": "invisible",
    "three_ds": "not_seen",
    "card_form": true,
    "phone_field": "none",
    "wallets": [
     "google_pay",
     "other"
    ],
    "rail_offer": "none",
    "price": "250.00",
    "currency": "USD",
    "period": "month",
    "plan": "Scale",
    "last_button": "Save payment method"
   },
   "person": null,
   "ours": "no_card",
   "note": "We paid one x402 v2 call ($0.01 USDC on Base, tx 0xdd2f191a...4b03b20, confirmed, 200 with content): pay-per-call works with no account, but only for scrape, screenshot and PDF. Plans (Scale $250/month) and credit top-ups (from $10) go through a Stripe card form in the dashboard; Stripe Projects is documented but not tried.",
   "paid": {
    "rail": "x402",
    "network": "eip155:8453",
    "testnet": false,
    "tx": "0xdd2f191a36d78ce0595ed35cb081b4834a07f02f04d66904c6cdabbeb4b03b20",
    "amount": 0.01,
    "currency": "USD",
    "at": "2026-10-12T21:20:49Z",
    "source": "pay_tx.json"
   },
   "per_call": {
    "caps": [
     "cap-04"
    ],
    "paid_caps": [
     "cap-04"
    ],
    "core": 8,
    "share": 12,
    "proof": "route"
   }
  },
  "cancel": {
   "status": "n/a",
   "note": "Nothing to cancel: our agent used it pay-per-call.",
   "docs_note": "Nothing to cancel: no plan, paid balance, or card trial was started on this drive (Launch stays $0 + usage; the one x402 call was a single pay-per-call purchase that does not renew). The docs have no cancel/downgrade page; the dashboard's \"Manage billing\" button (Stripe portal) was not opened.",
   "docs_grade": "",
   "nothing": "pay_per_call"
  },
  "delete": {
   "status": "blocked",
   "note": "Delete organization (hold to delete) removed the org's sessions, profiles, credentials and keys: the project key and org key then answered 401. But the sign-in login (the agent's inbox / the GitHub-linked identity) kept working: it was dropped straight into a freshly created empty org (\"Anon's Team\"), and the GitHub grant had to be revoked separately on GitHub's side. There is no self-serve user-account delete (Settings > Security is \"Page Not Found\"); account termination is by request only per the privacy policy. Deleted: org data and keys. Stayed: the user's login.",
   "left": "data_only",
   "account": true
  }
 },
 "routes": [
  {
   "route": "pay_per_call",
   "offered": "documented",
   "tried": true,
   "not_tried": null,
   "result": "in",
   "wall": null,
   "person": "none",
   "brings": "wallet",
   "fresh": true,
   "minutes": 0.5
  },
  {
   "route": "stripe_projects",
   "offered": "documented",
   "tried": false,
   "not_tried": "no_kit",
   "result": null,
   "wall": null,
   "person": null,
   "brings": null,
   "fresh": null,
   "minutes": null
  },
  {
   "route": "device_login",
   "offered": "documented",
   "tried": true,
   "not_tried": null,
   "result": "not_reached",
   "wall": null,
   "person": "none",
   "brings": "nothing",
   "fresh": false,
   "minutes": 1
  },
  {
   "route": "sso_enterprise",
   "offered": "documented",
   "tried": false,
   "not_tried": "assisted_only",
   "result": null,
   "wall": null,
   "person": null,
   "brings": null,
   "fresh": null,
   "minutes": null
  }
 ],
 "checkout": {
  "reached": "card_form",
  "processor": "stripe_elements",
  "captcha": "invisible",
  "three_ds": "not_seen",
  "phone_field": "none",
  "wallets": [
   "google_pay",
   "other"
  ],
  "rail_offer": "none",
  "period": "month",
  "card_form": true,
  "price": "250.00",
  "currency": "USD",
  "plan": "Scale",
  "last_button": "Save payment method"
 },
 "docs": {
  "at": "2026-10-12",
  "read": 211,
  "listed": 218,
  "sampled": false,
  "overall": "complete",
  "getting_started": "found",
  "auth": "found",
  "errors": "found",
  "examples": "good",
  "freshness": "fresh",
  "newest": "2026-10-12",
  "core_pages": "10 of 10",
  "capabilities": "covered"
 },
 "claims": {
  "claimed": 19,
  "tried": 16,
  "held": 15,
  "broken": 0,
  "unclear": 1,
  "not_tried": 3,
  "undocumented_works": 2
 },
 "pay_options": {
  "checked": "2026-10-12",
  "source": "probe",
  "options": [
   {
    "id": "stripe-projects",
    "name": "Stripe Projects",
    "kind": "agent-rail",
    "first_party": true,
    "lead": false,
    "networks": [],
    "testnet": false
   },
   {
    "id": "x402",
    "name": "x402",
    "kind": "agent-rail",
    "first_party": true,
    "lead": false,
    "networks": [
     "Base",
     "Solana"
    ],
    "testnet": false
   }
  ],
  "agentic": [
   "stripe-projects",
   "x402"
  ],
  "paid": {
   "rail": "x402",
   "network": "eip155:8453",
   "testnet": false,
   "tx": "0xdd2f191a36d78ce0595ed35cb081b4834a07f02f04d66904c6cdabbeb4b03b20",
   "amount": 0.01,
   "currency": "USD",
   "at": "2026-10-12T21:20:49Z"
  },
  "exercised": true,
  "detected_grade": null,
  "trial": {
   "no_card": null,
   "card_required": null,
   "free_plan": true
  },
  "owner_fixes": [
   {
    "title": "Sell the plan or credits over the rail, not only side endpoints",
    "how": "Let the paid call buy what the product sells, so the rail covers the whole product."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": true,
  "cli": true,
  "sdk": true,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": false,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST, 75 operations, steel-api-key header",
  "openapi": "3.0.3 at api.steel.dev/sdk-openapi.json via RFC 9727 api-catalog; no profile delete, no key revoke",
  "mcp": "official, stdio, 16 tools, 28 Jul 2026 server/discover",
  "cli": "steel 0.4.4, --json everywhere",
  "sdk": "steel-sdk (Node 0.18.0, Python)"
 },
 "can_do": [
  "Start a cloud Chrome session, drive it with Playwright over CDP and release it",
  "Scrape a page to HTML or markdown, take a screenshot or a PDF with one call",
  "Store a login for a site and have Steel fill and submit the form in a session without the agent seeing the password",
  "Save a browser profile (cookies, localStorage) and start later sessions logged in",
  "Upload, list, download and delete files in a session or for the whole org",
  "Load its own Chrome extension into sessions",
  "Read a session's agent traces, logs, cost and HLS replay",
  "Run the same work from the CLI (steel browser ..., --json) or the official MCP server",
  "Pay per scrape/screenshot/PDF call with x402 USDC, no account"
 ],
 "cannot_do": [
  {
   "what": "Solve CAPTCHAs or use Steel proxies on the free credits",
   "why": "needs at least $10 in paid balance (403)"
  },
  {
   "what": "Sign up or get its first key without a browser",
   "why": "email-link sign-up and key creation are dashboard-only; POST /v1/api-keys needs an org key from the dashboard"
  },
  {
   "what": "Delete a profile",
   "why": "no DELETE in the API (421 No route); profiles expire after 30 days unused"
  },
  {
   "what": "Delete its own account",
   "why": "Delete organization keeps the login and makes a new empty org; user deletion is by request"
  },
  {
   "what": "Revoke a key by API",
   "why": "dashboard only; DELETE /v1/api-keys/{id} -> 403 \"API keys cannot manage API keys\""
  }
 ],
 "blockers": [
  "Sign-up and the first API key need a browser (email link + dashboard)",
  "CAPTCHA solving and proxies need $10+ paid balance, bought with a card in the dashboard"
 ],
 "tips_for_owner": [
  "Let an agent sign up and get a key headless",
  "Let x402 or Stripe Projects fund the wallet",
  "Add DELETE for profiles and API keys",
  "Let users delete their own account",
  "Make the auth-context round trip lossless",
  "Return 409 on duplicate creates, not 5xx",
  "Update the x402 and forge docs"
 ],
 "tips_for_agents": [
  "Send the key in the steel-api-key header, not Authorization: Bearer",
  "Retry GET /v1/sessions/{id} once if it 404s right after create",
  "Use --json on every CLI command; forge templates are playwright-ts, playwright-py, ...",
  "Profile PATCH must be multipart/form-data",
  "When reusing GET /context, rewrite localStorage keys to https://origin",
  "The MCP server refuses a fresh session when saved profiles exist: pass guest=true or a profile_id",
  "The dashboard shows a new key once; copy it in the same step"
 ],
 "selfhost": {
  "install": {
   "status": "skipped",
   "minutes": 0,
   "note": "no docker in the drive sandbox (steel-browser Docker image, Railway template, steel dev install)"
  }
 },
 "summary": "An agent can do almost all of Steel through its API, SDK, CLI or official MCP server: sessions over CDP, scrape/screenshot/PDF, profiles, stored logins, files and extensions all worked and read back. Getting in needs a browser (email link sign-up and a dashboard key), CAPTCHA solving and proxies need $10 of paid balance bought by card, and pay-per-call x402 covers scrape, screenshot and PDF with no account.",
 "wall": "Email sign-up and dashboard-only API key",
 "plan_scope": "free plan (Launch, $30 one-time credits)",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Steel is a cloud browser API that lets an AI agent run real Chrome sessions, scrape pages, take screenshots/PDFs, and store logins and profiles. An agent did almost all of this entirely on its own through the API, SDK, CLI, or official MCP server. The one place it needed a human-style browser step was getting in at all: signing up (an emailed link) and the first API key both come from the web dashboard, and deleting the organization left the underlying login account still active.",
  "can_do": [
   "Start a cloud browser session, click around and browse pages, then shut it down",
   "Grab a page as a screenshot, a PDF, or clean text with one call",
   "Save a login and have it auto-filled and submitted next time",
   "Keep a browser's cookies and sign-in state saved for reuse later",
   "Upload and manage files or browser extensions used during a session",
   "Watch a session live or review a recording and action log afterward",
   "Do all of the above through a command-line tool or the official AI-agent (MCP) connector",
   "Pay a tiny per-use fee automatically with no account at all, for basic scraping/screenshots/PDFs"
  ],
  "cannot_do": [
   {
    "what": "Sign up and get its first API key without a browser",
    "why": "sign-up and key creation only happen in the web dashboard"
   },
   {
    "what": "Use CAPTCHA-solving or proxy features on the free trial",
    "why": "those require adding at least $10 of paid balance by card"
   },
   {
    "what": "Delete its account so the login itself stops working",
    "why": "deleting the organization wipes its data but the login still gets a fresh empty one"
   },
   {
    "what": "Revoke its own API key or delete a saved browser profile by itself",
    "why": "both actions are dashboard-only; no API exists for them"
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "Auto-solve CAPTCHAs",
   "plan": "Launch with $10+ paid balance, or Scale",
   "evidence": "POST /v1/sessions {solveCaptcha:true} -> 403 \"Launch requires at least $10 in paid balance to use CAPTCHA solving or Steel proxies...\""
  },
  {
   "capability": "Residential proxies with geo targeting",
   "plan": "Launch with $10+ paid balance, or Scale",
   "evidence": "session useProxy {geolocation:{country:'US'}} -> same 403"
  },
  {
   "capability": "Dedicated static IP",
   "plan": "Scale ($5/IP)",
   "evidence": "Plans page: Dedicated IPs - on Launch, $5/IP on Scale"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Sessions",
   "capability": "Create a cloud browser session",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/sessions",
    "mcp": null,
    "cli": "steel browser start",
    "ui": "Dashboard > Sessions"
   },
   "check": "GET /v1/sessions/{id} returns status live with a websocketUrl",
   "source": "https://docs.steel.dev/overview/sessions-api/overview; https://docs.steel.dev/overview/sessions-api/quickstart"
  },
  {
   "id": "cap-02",
   "group": "Sessions",
   "capability": "Drive the session with Playwright/Puppeteer/Selenium over CDP",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "wss://connect.steel.dev?apiKey=&sessionId=",
    "mcp": null,
    "cli": "steel browser open/click/fill/type",
    "ui": null
   },
   "check": "page.goto/click calls change page.url and page.content inside the live session",
   "source": "https://docs.steel.dev/cookbook/playwright; https://docs.steel.dev/cookbook/puppeteer; https://docs.steel.dev/cookbook/selenium"
  },
  {
   "id": "cap-03",
   "group": "Sessions",
   "capability": "Release/stop a browser session",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/sessions/{id}/release",
    "mcp": null,
    "cli": "steel browser stop",
    "ui": "Dashboard > Sessions"
   },
   "check": "GET /v1/sessions/{id} status transitions to released/completed",
   "source": "https://docs.steel.dev/overview/sessions-api/session-lifecycle"
  },
  {
   "id": "cap-04",
   "group": "Browser Tools",
   "capability": "Scrape a page to HTML/markdown without managing a session",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/scrape",
    "mcp": null,
    "cli": "steel scrape <url>",
    "ui": null
   },
   "check": "response result.content.markdown/html contains the target page's text",
   "source": "https://docs.steel.dev/overview/browser-tools/overview; https://docs.steel.dev/llms.txt"
  },
  {
   "id": "cap-05",
   "group": "Browser Tools",
   "capability": "Capture a screenshot of a page",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/screenshot",
    "mcp": null,
    "cli": "steel screenshot <url> --full-page",
    "ui": null
   },
   "check": "response is an image file matching the requested page",
   "source": "https://docs.steel.dev/overview/browser-tools/overview; https://docs.steel.dev/overview/steel-cli"
  },
  {
   "id": "cap-06",
   "group": "Browser Tools",
   "capability": "Generate a PDF of a page",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/pdf",
    "mcp": null,
    "cli": "steel pdf <url>",
    "ui": null
   },
   "check": "response is a PDF file whose text matches the target page",
   "source": "https://docs.steel.dev/overview/browser-tools/overview; https://docs.steel.dev/overview/steel-cli"
  },
  {
   "id": "cap-07",
   "group": "Anti-bot",
   "capability": "Auto-solve CAPTCHAs encountered during a session",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/sessions {solveCaptcha: true}; GET /v1/sessions/{id}/captchas/status; POST /v1/sessions/{id}/captchas/solve",
    "mcp": null,
    "cli": "steel browser captcha solve",
    "ui": null
   },
   "check": "GET captchas/status shows task status solved for the page's CAPTCHA task",
   "source": "https://docs.steel.dev/overview/captchas-api/overview"
  },
  {
   "id": "cap-08",
   "group": "Anti-bot",
   "capability": "Route session traffic through residential or custom proxies with geo targeting",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": "POST /v1/sessions {useProxy: {...}}",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "the page's reported IP/geolocation (e.g. an IP-echo site) matches the requested country/state/city",
   "source": "https://docs.steel.dev/overview/stealth/proxies"
  },
  {
   "id": "cap-09",
   "group": "Persistence",
   "capability": "Persist and reuse a browser profile (cookies, auth, extensions, settings) across sessions",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/sessions {persistProfile}; POST/PATCH /v1/profiles",
    "mcp": null,
    "cli": "steel profile import/sync/list/delete",
    "ui": "Dashboard > Profiles"
   },
   "check": "a new session started with profileId reuses prior login state (e.g. lands on an authenticated page without re-login)",
   "source": "https://docs.steel.dev/overview/profiles-api/overview"
  },
  {
   "id": "cap-10",
   "group": "Persistence",
   "capability": "Store and auto-inject login credentials (incl. TOTP) into a session",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/credentials; POST /v1/sessions {credentials: {}}",
    "mcp": null,
    "cli": "steel credentials create/list/update/delete",
    "ui": null
   },
   "check": "session navigated to the credential's origin ends on a logged-in page (e.g. dashboard element present) without exposing the password",
   "source": "https://docs.steel.dev/overview/credentials-api/overview"
  },
  {
   "id": "cap-11",
   "group": "Files",
   "capability": "Upload/download/list/delete files inside a live session",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST/GET/DELETE /v1/sessions/{id}/files",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET /v1/sessions/{id}/files lists the uploaded file; a form upload in-session picks it up via setInputFiles",
   "source": "https://docs.steel.dev/overview/files-api/overview"
  },
  {
   "id": "cap-12",
   "group": "Files",
   "capability": "Store files globally across the organization, reusable in any session",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST/GET/DELETE /v1/files",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET /v1/files returns the uploaded file's path; a session referencing that path can mount it",
   "source": "https://docs.steel.dev/overview/files-api/overview"
  },
  {
   "id": "cap-13",
   "group": "Extensions",
   "capability": "Upload a Chrome extension (zip/crx or Chrome Web Store URL) and inject into sessions",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/extensions; POST /v1/sessions {extensionIds}",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET /v1/extensions lists the extension; a session created with its id loads it (verifiable via CDP/extension behavior)",
   "source": "https://docs.steel.dev/overview/extensions-api/overview"
  },
  {
   "id": "cap-14",
   "group": "Observability",
   "capability": "Watch or embed a session live (view/control in real time)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "steel browser live",
    "ui": "Dashboard > Sessions > Live View / embeddable iframe"
   },
   "check": "the embedded live-session URL renders the current page state of the running session",
   "source": "https://docs.steel.dev/overview/sessions-api/embed-sessions/live-sessions"
  },
  {
   "id": "cap-15",
   "group": "Observability",
   "capability": "Replay a recording of a past session",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Dashboard > Sessions > Past Sessions"
   },
   "check": "the past-session embed URL plays back recorded video matching the session's actions",
   "source": "https://docs.steel.dev/overview/sessions-api/embed-sessions/past-sessions"
  },
  {
   "id": "cap-16",
   "group": "Observability",
   "capability": "View an agent trace timeline (actions synced to video) and export it",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET agent traces timeline JSON",
    "mcp": null,
    "cli": null,
    "ui": "Dashboard > Session > Agent Traces"
   },
   "check": "GET the session's agent-traces endpoint returns a JSON timeline of recorded actions; export produces markdown/JSON/ZIP",
   "source": "https://docs.steel.dev/overview/agent-traces/overview; https://docs.steel.dev/overview/agent-traces/api; https://docs.steel.dev/overview/agent-traces/timeline"
  },
  {
   "id": "cap-17",
   "group": "Session config",
   "capability": "Let a human take control of a running agent session",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Live Session embed with control handoff"
   },
   "check": "input events from the embedded live view reach the remote browser while human control is active",
   "source": "https://docs.steel.dev/overview/sessions-api/human-in-the-loop"
  },
  {
   "id": "cap-18",
   "group": "Session config",
   "capability": "Launch a session in mobile-device mode (mobile fingerprint, touch)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/sessions {mobile config}",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "the page's reported userAgent/viewport/touch support matches a mobile device profile",
   "source": "https://docs.steel.dev/overview/sessions-api/mobile-mode"
  },
  {
   "id": "cap-19",
   "group": "Session config",
   "capability": "Launch a session in fullscreen/no-Chrome-UI mode at 1920x1080",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/sessions {fullscreen config}",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "a screenshot from the session shows no browser chrome and full 1920x1080 page content",
   "source": "https://docs.steel.dev/overview/sessions-api/fullscreen-mode"
  },
  {
   "id": "cap-20",
   "group": "Session config",
   "capability": "Reuse an existing authenticated browser context/auth across sessions (cookies/local storage)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "session context export/import",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "a new session loaded with the captured context opens an already-authenticated page",
   "source": "https://docs.steel.dev/overview/sessions-api/reusing-auth-context"
  },
  {
   "id": "cap-21",
   "group": "Session config",
   "capability": "Lease a dedicated static IP for sessions",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "dedicated IP config on session create",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "repeated sessions using the dedicated IP report the same egress IP address",
   "source": "https://docs.steel.dev/overview/sessions-api/dedicated-ips"
  },
  {
   "id": "cap-22",
   "group": "Deployment",
   "capability": "Self-host the Steel browser runtime (Docker/Railway/cluster)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "steel dev install / steel dev start",
    "ui": null
   },
   "check": "self-hosted instance's /v1/health endpoint responds OK and sessions can be created against it via --api-url",
   "source": "https://docs.steel.dev/overview/self-hosting/docker; https://docs.steel.dev/overview/self-hosting/railway; https://docs.steel.dev/overview/self-hosting/clustering"
  },
  {
   "id": "cap-23",
   "group": "CLI/Skills",
   "capability": "Scaffold a starter automation project from a template",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "steel forge <template> --name",
    "ui": null
   },
   "check": "running `steel forge playwright --name my-bot` creates a runnable project directory with the chosen template's files",
   "source": "https://docs.steel.dev/overview/steel-cli"
  },
  {
   "id": "cap-24",
   "group": "CLI/Skills",
   "capability": "Install coding-agent skills (Claude Code, Codex, etc.) that drive Steel sessions",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "steel skills install / list / doctor",
    "ui": null
   },
   "check": "`steel skills list` shows the installed skill and the agent client discovers it after restart",
   "source": "https://docs.steel.dev/overview/skills; https://docs.steel.dev/overview/skills/available-skills"
  },
  {
   "id": "cap-25",
   "group": "Anti-bot",
   "capability": "Enable stealth mode to reduce bot-detection fingerprinting",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /v1/sessions {stealthConfig}",
    "mcp": null,
    "cli": "steel browser start --stealth",
    "ui": null
   },
   "check": "a bot-detection test page (e.g. a fingerprint check site) reports a lower automation-detection score with stealth enabled",
   "source": "https://docs.steel.dev/overview/stealth/captcha-solving; https://docs.steel.dev/overview/pricinglimits"
  },
  {
   "id": "cap-26",
   "group": "Account/Billing",
   "capability": "View usage and remaining credit balance by meter",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Dashboard > Usage"
   },
   "check": "dashboard usage page shows session time, proxy bandwidth, and CAPTCHA solves consumed with a remaining balance",
   "source": "https://docs.steel.dev/overview/pricinglimits"
  },
  {
   "id": "cap-27",
   "group": "Account/Billing",
   "capability": "Top up or enable auto top-up of usage credits",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Dashboard > Billing"
   },
   "check": "balance increases after a manual top-up, or auto top-up triggers when balance nears zero",
   "source": "https://docs.steel.dev/overview/pricinglimits"
  }
 ],
 "attempts": [
  {
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "capability": "Docs",
   "task": "Read llms.txt, auth, CLI, x402 docs",
   "result": "done",
   "verified": true,
   "evidence": "docs.steel.dev/llms.txt 200 (29 KB, Agent Instructions section); /overview/authentication.md, /integrations/x402.md, /overview/steel-cli.md all 200 text/markdown",
   "notes": "docs_pass: 27/27 caps covered",
   "t": "01:36"
  },
  {
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "capability": "OpenAPI",
   "task": "Find OpenAPI via api-catalog",
   "result": "done",
   "verified": true,
   "evidence": "docs.steel.dev/.well-known/api-catalog (RFC 9727 linkset) -> https://api.steel.dev/sdk-openapi.json, openapi 3.0.3, 75 operations incl. POST /v1/api-keys",
   "notes": "3.0.3 is behind 3.2.1",
   "t": "01:36"
  },
  {
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "capability": "Markdown docs",
   "task": "Accept: text/markdown and .md URL",
   "result": "done",
   "verified": true,
   "evidence": "GET docs page with Accept: text/markdown -> 200 text/markdown, Vary lacks Accept (rsc, next-router-*); .md URL -> 200 text/markdown",
   "notes": "markdown both ways; Vary: Accept missing",
   "t": "01:36"
  },
  {
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "capability": "Well-known cards",
   "task": "ai-catalog, agent-card, agent.json, mcp server-card, oauth PRM/AS, ucp, auth.md, SKILL.md on steel.dev and docs.steel.dev",
   "result": "done",
   "verified": true,
   "evidence": "all 404 text/html on steel.dev and docs.steel.dev; api.steel.dev answers 421 for those paths",
   "notes": "no agent cards, no OAuth metadata",
   "t": "01:36"
  },
  {
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "capability": "robots/aipref",
   "task": "robots.txt Content-Usage and Content-Usage header",
   "result": "done",
   "verified": true,
   "evidence": "steel.dev/robots.txt: \"User-Agent: * / Allow: /\" + Sitemap; no Content-Usage or Content-signal lines; no Content-Usage response header",
   "notes": "",
   "t": "01:37"
  },
  {
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "capability": "MCP",
   "task": "Find MCP server",
   "result": "done",
   "verified": true,
   "evidence": "github.com/steel-dev/steel-mcp-server v3.0.0 (official, stdio via npx github:steel-dev/steel-mcp-server; README: \"mcp.steel.dev is not live yet\"); mcp.steel.dev no answer (000)",
   "notes": "no remote MCP endpoint to send server/discover to; stdio tested after sign-up",
   "t": "01:37"
  },
  {
   "cap": "discovery",
   "route": "api",
   "documented": true,
   "capability": "API auth error",
   "task": "Unauthenticated GET /v1/sessions",
   "result": "done",
   "verified": true,
   "evidence": "401 application/json {\"error\":\"Unauthorized\",\"message\":\"Missing API key. Authenticate by sending your Steel API key in the 'steel-api-key' header (Steel does not use 'Authorization: Bearer'). Create or rotate a key at https://app.steel.dev/settings/api-keys.\"}",
   "quality": {
    "error_legibility": "clear"
   },
   "t": "01:37"
  },
  {
   "cap": "signup",
   "way": "magic_link",
   "route": "browser",
   "documented": true,
   "capability": "Sign up",
   "task": "Sign up at app.steel.dev with Continue with Email",
   "result": "done",
   "verified": true,
   "evidence": "app.steel.dev/sign-up -> sign-in page with GitHub/Google/Email; email the agent's inbox accepted, \"Email Sent. Check your Inbox\"; no CAPTCHA seen (Clerk at clerk.steel.dev)",
   "notes": "form is drawn by JS; no password option, email link only; questionnaire (name, role, org) after the link",
   "t": "06:19"
  },
  {
   "cap": "verify",
   "way": "magic_link",
   "route": "browser",
   "documented": true,
   "capability": "Verify email",
   "task": "Open the sign-up link from the mail",
   "result": "done",
   "verified": true,
   "evidence": "mail \"Your sign up link\" from notifications@steel.dev arrived in <1 min; link (clerk.steel.dev/v1/verify, 10 min expiry) opened in browser -> /questionnaire -> /quickstart, wallet shows $30.00",
   "t": "06:19"
  },
  {
   "cap": "credentials",
   "way": "magic_link",
   "route": "browser",
   "documented": true,
   "key": "create",
   "capability": "API key",
   "task": "Create API key in dashboard",
   "result": "done",
   "verified": true,
   "evidence": "quickstart \"Generate API Key\" made an Onboarding key; Settings > API Keys > Create API key (project key \"agentdrives-main\") shown once",
   "notes": "first key lost because the reveal is once-only and our agent's browser tool reloads between steps; second key saved to secrets.env",
   "t": "06:19"
  },
  {
   "cap": "first_call",
   "way": "magic_link",
   "route": "api",
   "documented": true,
   "capability": "First API call",
   "task": "GET /v1/sessions with the key",
   "result": "done",
   "verified": true,
   "evidence": "200 {\"sessions\":[],\"nextCursor\":null}",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/authentication"
   },
   "t": "06:19"
  },
  {
   "cap": "cap-01",
   "capability": "Create a cloud browser session",
   "task": "client.sessions.create then retrieve",
   "route": "sdk",
   "documented": true,
   "step": "create",
   "result": "done",
   "verified": true,
   "evidence": "session 26630c5f-... created (SDK 0.18.0); GET /v1/sessions lists it status live",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/overview"
   },
   "t": "07:30"
  },
  {
   "cap": "cap-01",
   "capability": "Create a cloud browser session",
   "task": "retrieve right after create",
   "route": "sdk",
   "documented": true,
   "step": "read",
   "result": "failed",
   "verified": false,
   "evidence": "GET /v1/sessions/26630c5f-... immediately after create -> 404 \"Session not found. It may have ended, expired, or belong to a different organization...\"; the list a minute later shows it live",
   "notes": "read-after-create race on the very first session of the org",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/overview",
    "error_legibility": "vague",
    "recoverable": "yes"
   },
   "t": "07:30"
  },
  {
   "cap": "cap-02",
   "capability": "Drive the session over CDP",
   "task": "Playwright connectOverCDP, goto example.com, click link",
   "route": "api",
   "documented": true,
   "step": "use",
   "result": "failed",
   "verified": false,
   "evidence": "not reached: the script stopped on the 404 read before connecting (first attempt)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/cookbook/playwright",
    "recoverable": "yes"
   },
   "t": "07:30"
  },
  {
   "cap": "cap-03",
   "capability": "Release a session",
   "task": "release the session left live by the failed run",
   "route": "api",
   "documented": true,
   "step": "delete",
   "result": "done",
   "verified": true,
   "evidence": "POST /v1/sessions/26630c5f-.../release -> 200; GET -> status released",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/session-lifecycle"
   },
   "t": "07:30"
  },
  {
   "cap": "cap-01",
   "capability": "Create a cloud browser session",
   "task": "SDK create, retrieve, Playwright CDP drive, release",
   "route": "sdk",
   "documented": true,
   "step": "create",
   "result": "done",
   "verified": true,
   "evidence": "retry after the failed first run: session 81a95273 created in 840 ms, status live, websocketUrl set",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/overview"
   },
   "t": "07:30"
  },
  {
   "cap": "cap-01",
   "capability": "Create a cloud browser session",
   "task": "SDK create, retrieve, Playwright CDP drive, release",
   "route": "sdk",
   "documented": true,
   "step": "read",
   "result": "done",
   "verified": true,
   "evidence": "GET right after create: status live, websocketUrl present",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/overview"
   },
   "t": "07:30"
  },
  {
   "cap": "cap-02",
   "capability": "Drive the session over CDP",
   "task": "SDK create, retrieve, Playwright CDP drive, release",
   "route": "sdk",
   "documented": true,
   "step": "use",
   "result": "done",
   "verified": true,
   "evidence": "page.goto example.com -> url https://example.com/ title \"Example Domain\"; clicked link -> https://www.iana.org/help/example-domains \"Example Domains\"",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/cookbook/playwright"
   },
   "t": "07:30"
  },
  {
   "cap": "cap-03",
   "capability": "Release a session",
   "task": "SDK create, retrieve, Playwright CDP drive, release",
   "route": "sdk",
   "documented": true,
   "step": "delete",
   "result": "done",
   "verified": true,
   "evidence": "sessions.release -> success true; GET -> status released",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/session-lifecycle"
   },
   "t": "07:30"
  },
  {
   "cap": "first_action",
   "way": "magic_link",
   "route": "sdk",
   "documented": true,
   "capability": "First action",
   "task": "Create a browser session and drive it",
   "result": "done",
   "verified": true,
   "evidence": "session 81a95273 created live, driven to example.com and released (see ..03)",
   "t": "07:30"
  },
  {
   "cap": "cap-01",
   "capability": "",
   "task": "SDK session chain",
   "route": "sdk",
   "documented": true,
   "step": "create",
   "trial": 2,
   "result": "done",
   "verified": true,
   "evidence": "session a85d34cb live in 984 ms",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/overview"
   },
   "t": "08:37"
  },
  {
   "cap": "cap-01",
   "capability": "",
   "task": "SDK session chain",
   "route": "sdk",
   "documented": true,
   "step": "read",
   "trial": 2,
   "result": "done",
   "verified": true,
   "evidence": "GET right after create: live",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/overview"
   },
   "t": "08:37"
  },
  {
   "cap": "cap-02",
   "capability": "",
   "task": "SDK session chain",
   "route": "sdk",
   "documented": true,
   "step": "use",
   "trial": 2,
   "result": "done",
   "verified": true,
   "evidence": "goto example.com, click -> iana.org/help/example-domains",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/overview"
   },
   "t": "08:38"
  },
  {
   "cap": "cap-03",
   "capability": "",
   "task": "SDK session chain",
   "route": "sdk",
   "documented": true,
   "step": "delete",
   "trial": 2,
   "result": "done",
   "verified": true,
   "evidence": "release success; GET status released",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/overview"
   },
   "t": "08:38"
  },
  {
   "cap": "cap-01",
   "capability": "Create a cloud browser session",
   "task": "update a session",
   "route": "api",
   "documented": true,
   "step": "update",
   "result": "skipped",
   "verified": false,
   "evidence": "OpenAPI has no update operation for sessions (create, get, list, release, release-all only)",
   "notes": "n/a for this object",
   "t": "08:38"
  },
  {
   "cap": "cap-04",
   "capability": "Scrape a page",
   "task": "POST /v1/scrape example.com markdown+html",
   "route": "api",
   "documented": true,
   "step": "use",
   "result": "done",
   "verified": true,
   "evidence": "200; content.html has <title>Example Domain</title>; content.markdown starts \"This domain is for use in documentation examples...\"; metadata.statusCode 200",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/browser-tools/overview"
   },
   "t": "08:38"
  },
  {
   "cap": "cap-05",
   "capability": "Screenshot",
   "task": "POST /v1/screenshot example.com fullPage",
   "route": "api",
   "documented": true,
   "step": "use",
   "result": "done",
   "verified": true,
   "evidence": "200 {\"url\":\"https://images.steel.dev/v1/static/....png\"}; download 200 image/png, 125 KB, 1911x988, shows the example.com text",
   "notes": "the file served as image/png with a .png name is JPEG data (FF D8 magic)",
   "quality": {
    "verify_route": "yes",
    "docs_match": "drift",
    "docs_url": "https://docs.steel.dev/overview/browser-tools/overview"
   },
   "t": "08:38"
  },
  {
   "cap": "cap-06",
   "capability": "PDF",
   "task": "POST /v1/pdf example.com",
   "route": "api",
   "documented": true,
   "step": "use",
   "result": "done",
   "verified": true,
   "evidence": "200 {\"url\":\"https://files.steel.dev/v1/static/....pdf\"}; download 200 application/pdf, %PDF-1.4, 101 KB",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/browser-tools/overview"
   },
   "t": "08:38"
  },
  {
   "cap": "cap-04",
   "capability": "Scrape a page",
   "task": "scrape https://www.iana.org/help/example-domains",
   "route": "api",
   "documented": true,
   "step": "use",
   "trial": 2,
   "result": "done",
   "verified": true,
   "evidence": "200; markdown 851 chars; title Example Domains",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/browser-tools/overview"
   },
   "t": "08:42"
  },
  {
   "cap": "cap-05",
   "capability": "Screenshot",
   "task": "screenshot https://www.iana.org/help/example-domains",
   "route": "api",
   "documented": true,
   "step": "use",
   "trial": 2,
   "result": "done",
   "verified": true,
   "evidence": "200; download 200 196693",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/browser-tools/overview"
   },
   "t": "08:46"
  },
  {
   "cap": "cap-06",
   "capability": "PDF",
   "task": "pdf https://www.iana.org/help/example-domains",
   "route": "api",
   "documented": true,
   "step": "use",
   "trial": 2,
   "result": "done",
   "verified": true,
   "evidence": "200; download 200 124748 application/pdf",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/browser-tools/overview"
   },
   "t": "08:49"
  },
  {
   "cap": "cap-04",
   "capability": "Scrape a page",
   "task": "scrape https://example.org",
   "route": "api",
   "documented": true,
   "step": "use",
   "trial": 3,
   "result": "done",
   "verified": true,
   "evidence": "200; markdown 957 chars; title Example Domain",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/browser-tools/overview"
   },
   "t": "08:52"
  },
  {
   "cap": "cap-05",
   "capability": "Screenshot",
   "task": "screenshot https://example.org",
   "route": "api",
   "documented": true,
   "step": "use",
   "trial": 3,
   "result": "done",
   "verified": true,
   "evidence": "200; download 200 125077",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/browser-tools/overview"
   },
   "t": "08:55"
  },
  {
   "cap": "cap-06",
   "capability": "PDF",
   "task": "pdf https://example.org",
   "route": "api",
   "documented": true,
   "step": "use",
   "trial": 3,
   "result": "done",
   "verified": true,
   "evidence": "200; download 200 101231 application/pdf",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/browser-tools/overview"
   },
   "t": "08:59"
  },
  {
   "cap": "cap-10",
   "capability": "Store and auto-inject credentials",
   "task": "store a login for https://agentdrives.com (our own origin, page served by our script), inject into a session",
   "route": "api",
   "documented": true,
   "step": "create",
   "result": "done",
   "verified": true,
   "evidence": "POST /v1/credentials 201 {namespace ad-t1, origin https://agentdrives.com, label ...} (value not echoed)",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/credentials-api/overview"
   },
   "t": "10:23"
  },
  {
   "cap": "cap-10",
   "capability": "Store and auto-inject credentials",
   "task": "store a login for https://agentdrives.com (our own origin, page served by our script), inject into a session",
   "route": "api",
   "documented": true,
   "step": "read",
   "result": "done",
   "verified": true,
   "evidence": "GET /v1/credentials?namespace=ad-t1 200 lists it, no secret values returned",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/credentials-api/overview"
   },
   "t": "10:24"
  },
  {
   "cap": "cap-10",
   "capability": "Store and auto-inject credentials",
   "task": "store a login for https://agentdrives.com (our own origin, page served by our script), inject into a session",
   "route": "api",
   "documented": true,
   "step": "update",
   "result": "done",
   "verified": true,
   "evidence": "PUT /v1/credentials label -> \"AgentDrives test login v2\", 200, updatedAt changed; list shows v2",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/credentials-api/overview"
   },
   "t": "10:24"
  },
  {
   "cap": "cap-10",
   "capability": "Store and auto-inject credentials",
   "task": "store a login for https://agentdrives.com (our own origin, page served by our script), inject into a session",
   "route": "api",
   "documented": true,
   "step": "use",
   "result": "done",
   "verified": true,
   "evidence": "session namespace ad-t1 credentials {autoSubmit:true}: goto https://agentdrives.com/login -> form filled and submitted by Steel, our route got POST with email+password, page ended on /dashboard \"Signed in\"",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/credentials-api/overview"
   },
   "t": "10:24"
  },
  {
   "cap": "cap-10",
   "capability": "Store and auto-inject credentials",
   "task": "store a login for https://agentdrives.com (our own origin, page served by our script), inject into a session",
   "route": "api",
   "documented": true,
   "step": "delete",
   "result": "done",
   "verified": true,
   "evidence": "DELETE /v1/credentials {origin, namespace} -> 200; list -> {'credentials': []}",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/credentials-api/overview"
   },
   "t": "10:24"
  },
  {
   "cap": "cap-10",
   "capability": "Store and auto-inject credentials",
   "task": "store a login for https://agentdrives.com (our own origin, page served by our script), inject into a session",
   "route": "api",
   "documented": true,
   "step": "use",
   "result": "done",
   "verified": true,
   "evidence": "trial 2: create 201; session ended on https://agentdrives.com/dashboard dash=True; delete 200; list after {'credentials': []}",
   "trial": 2,
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/credentials-api/overview"
   },
   "t": "10:44"
  },
  {
   "cap": "cap-10",
   "capability": "Store and auto-inject credentials",
   "task": "store a login for https://agentdrives.com (our own origin, page served by our script), inject into a session",
   "route": "api",
   "documented": true,
   "step": "use",
   "result": "failed",
   "verified": false,
   "evidence": "trial 3: create 500; session ended on https://agentdrives.com/dashboard dash=True; delete 200; list after {'credentials': []}",
   "trial": 3,
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/credentials-api/overview"
   },
   "t": "11:18"
  },
  {
   "cap": "cap-09",
   "capability": "Persist and reuse a browser profile",
   "task": "persist a profile with a cookie+localStorage on our own origin, reuse it in a new session",
   "route": "api",
   "documented": true,
   "step": "create",
   "result": "done",
   "verified": true,
   "evidence": "session persistProfile:true -> profileId e6282f95; cookie ad_session + localStorage set on https://agentdrives.com; after release profile status READY",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/profiles-api/overview"
   },
   "t": "12:10"
  },
  {
   "cap": "cap-09",
   "capability": "Persist and reuse a browser profile",
   "task": "persist a profile with a cookie+localStorage on our own origin, reuse it in a new session",
   "route": "api",
   "documented": true,
   "step": "read",
   "result": "done",
   "verified": true,
   "evidence": "GET /v1/profiles/{id} 200 status READY, sourceSessionId, userAgent; GET /v1/profiles lists it",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/profiles-api/overview"
   },
   "t": "12:10"
  },
  {
   "cap": "cap-09",
   "capability": "Persist and reuse a browser profile",
   "task": "persist a profile with a cookie+localStorage on our own origin, reuse it in a new session",
   "route": "api",
   "documented": true,
   "step": "update",
   "result": "done",
   "verified": true,
   "evidence": "PATCH /v1/profiles/{id} JSON {userAgent} -> 400 \"Profile updates must be sent as multipart/form-data...\"; same field as multipart -> 200, GET shows the new userAgent",
   "quality": {
    "verify_route": "yes",
    "docs_match": "drift",
    "docs_url": "https://docs.steel.dev/overview/profiles-api/overview",
    "error_legibility": "clear",
    "recoverable": "yes"
   },
   "notes": "docs show profiles.update(id,{userAgent}) as JSON-like call; the REST op only takes multipart",
   "t": "12:10"
  },
  {
   "cap": "cap-09",
   "capability": "Persist and reuse a browser profile",
   "task": "persist a profile with a cookie+localStorage on our own origin, reuse it in a new session",
   "route": "api",
   "documented": true,
   "step": "use",
   "result": "done",
   "verified": true,
   "evidence": "new session with profileId e6282f95: cookie ad_session=v1be694a1 and localStorage ad_ls=v1be694a1 present without setting them again",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/profiles-api/overview"
   },
   "t": "12:10"
  },
  {
   "cap": "cap-09",
   "capability": "Persist and reuse a browser profile",
   "task": "persist a profile with a cookie+localStorage on our own origin, reuse it in a new session",
   "route": "api",
   "documented": true,
   "step": "delete",
   "result": "failed",
   "verified": false,
   "evidence": "DELETE /v1/profiles/{id} -> 421 \"No route defined for DELETE /v1/profiles/...\"; OpenAPI has no profile delete; docs: \"If a profile is not used after 30 days, it will be automatically deleted\"; profile still listed",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/profiles-api/overview",
    "error_legibility": "vague",
    "recoverable": "no"
   },
   "t": "12:10"
  },
  {
   "cap": "cap-09",
   "capability": "Persist and reuse a browser profile",
   "task": "persist a profile with a cookie+localStorage on our own origin, reuse it in a new session",
   "route": "api",
   "documented": true,
   "step": "use",
   "result": "done",
   "verified": true,
   "evidence": "trial 2: profile 0fc4941e status READY; new session saw cookies ['ad_session=v483c45cd'] ls v483c45cd",
   "trial": 2,
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/profiles-api/overview"
   },
   "t": "12:29"
  },
  {
   "cap": "cap-09",
   "capability": "Persist and reuse a browser profile",
   "task": "persist a profile with a cookie+localStorage on our own origin, reuse it in a new session",
   "route": "api",
   "documented": true,
   "step": "use",
   "result": "failed",
   "verified": false,
   "evidence": "trial 3: profile 94c4028f status READY; new session saw cookies [] ls vcbfd2eb7",
   "trial": 3,
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/profiles-api/overview"
   },
   "t": "12:50"
  },
  {
   "cap": "cap-07",
   "capability": "Auto-solve CAPTCHAs",
   "task": "POST /v1/sessions {solveCaptcha:true}",
   "route": "api",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "403 {\"message\":\"Launch requires at least $10 in paid balance to use CAPTCHA solving or Steel proxies. Add credits, bring your own proxy via 'proxyUrl', or upgrade to Scale.\",\"error\":\"Forbidden\",\"linkToDocs\":\"https://docs.steel.dev/overview/pricinglimits\"}",
   "notes": "needs $10 paid balance; the free $30 credits do not count. Solving a real CAPTCHA would also be outside our rules (no own test page)",
   "t": "13:20"
  },
  {
   "cap": "cap-08",
   "capability": "Residential proxies with geo targeting",
   "task": "session useProxy {geolocation:{country:'US'}}, check egress IP",
   "route": "sdk",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "403 {\"message\":\"Launch requires at least $10 in paid balance to use CAPTCHA solving or Steel proxies. Add credits, bring your own proxy via 'proxyUrl', or upgrade to Scale.\",\"error\":\"Forbidden\",\"linkToDocs\":\"https://docs.steel.dev/overview/pricinglimits\"}; baseline session without proxy egress IP 216.246.40.62 (api.ipify.org)",
   "notes": "custom proxyUrl (own proxy) stays allowed; we have none",
   "t": "13:20"
  },
  {
   "cap": "cap-25",
   "capability": "Stealth mode",
   "task": "POST /v1/sessions {stealthConfig:{humanizeInteractions:true}}",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "201 session 942e55c7 live; released 200",
   "notes": "accepted on the free plan; effect not measured: scoring it needs a third-party bot-detection page, which we do not use",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/stealth/captcha-solving"
   },
   "t": "13:20"
  },
  {
   "cap": "credentials",
   "route": "api",
   "documented": true,
   "key": "create",
   "capability": "Scoped key headless",
   "task": "POST /v1/api-keys with the project key, then with an organization key",
   "result": "done",
   "verified": true,
   "evidence": "project key -> 403 {\"message\":\"API keys cannot manage API keys\"}; organization key (made once in the dashboard) + projectId -> 201 {id, key ste-••••, scopeType project, projectId}",
   "notes": "a project key cannot mint keys; an org key can (docs: \"Create a project-scoped API key using a global (organization-scoped) API key\"); the org key itself is dashboard-only",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://api.steel.dev/sdk-openapi.json",
    "error_legibility": "vague"
   },
   "t": "15:09"
  },
  {
   "cap": "credentials",
   "route": "api",
   "documented": true,
   "key": "use",
   "capability": "Scoped key headless",
   "task": "GET /v1/sessions with the new project key",
   "result": "done",
   "verified": true,
   "evidence": "200",
   "t": "15:09"
  },
  {
   "kind": "claim",
   "cap": "cap-04",
   "surface": "cli",
   "claim": "steel scrape <url>",
   "doc_url": "https://docs.steel.dev/overview/steel-cli",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "steel 0.4.4 --json: data.content.markdown has the example.com text",
   "t": "17:46",
   "capability": "Docs claim: Scrape a page to HTML/markdown without managing a session",
   "task": "steel scrape <url>",
   "route": "cli",
   "evidence": "steel 0.4.4 --json: data.content.markdown has the example.com text"
  },
  {
   "kind": "claim",
   "cap": "cap-05",
   "surface": "cli",
   "claim": "steel screenshot <url> --full-page",
   "doc_url": "https://docs.steel.dev/overview/steel-cli",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "success true, data.url images.steel.dev/...png",
   "t": "17:46",
   "capability": "Docs claim: Capture a screenshot of a page",
   "task": "steel screenshot <url> --full-page",
   "route": "cli",
   "evidence": "success true, data.url images.steel.dev/...png"
  },
  {
   "kind": "claim",
   "cap": "cap-06",
   "surface": "cli",
   "claim": "steel pdf <url>",
   "doc_url": "https://docs.steel.dev/overview/steel-cli",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "success true, data.url files.steel.dev/...pdf",
   "t": "17:46",
   "capability": "Docs claim: Generate a PDF of a page",
   "task": "steel pdf <url>",
   "route": "cli",
   "evidence": "success true, data.url files.steel.dev/...pdf"
  },
  {
   "kind": "claim",
   "cap": "cap-01",
   "surface": "cli",
   "claim": "steel browser start",
   "doc_url": "https://docs.steel.dev/overview/steel-cli",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "session 54f0d6bb live, named ad-cli; steel browser sessions lists it",
   "t": "17:46",
   "capability": "Docs claim: Create a cloud browser session",
   "task": "steel browser start",
   "route": "cli",
   "evidence": "session 54f0d6bb live, named ad-cli; steel browser sessions lists it"
  },
  {
   "kind": "claim",
   "cap": "cap-02",
   "surface": "cli",
   "claim": "steel browser open/click/fill/type",
   "doc_url": "https://docs.steel.dev/overview/steel-cli",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "open https://example.com -> title Example Domain; snapshot -i -> link \"Learn more\" [ref=e1]",
   "t": "17:46",
   "capability": "Docs claim: Drive the session with Playwright/Puppeteer/Selenium over CDP",
   "task": "steel browser open/click/fill/type",
   "route": "cli",
   "evidence": "open https://example.com -> title Example Domain; snapshot -i -> link \"Learn more\" [ref=e1]"
  },
  {
   "kind": "claim",
   "cap": "cap-03",
   "surface": "cli",
   "claim": "steel browser stop",
   "doc_url": "https://docs.steel.dev/overview/steel-cli",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "stoppedSessions [\"ad-cli\"]",
   "t": "17:46",
   "capability": "Docs claim: Release/stop a browser session",
   "task": "steel browser stop",
   "route": "cli",
   "evidence": "stoppedSessions [\"ad-cli\"]"
  },
  {
   "kind": "claim",
   "cap": "cap-09",
   "surface": "cli",
   "claim": "steel profile import/sync/list/delete",
   "doc_url": "https://docs.steel.dev/overview/steel-cli",
   "result": "partial",
   "verified": false,
   "documented": true,
   "notes": "profile list returns [] while GET /v1/profiles lists 3 API profiles; the CLI manages named profiles imported from a local browser, and delete takes a name, so API profiles cannot be deleted from the CLI",
   "t": "17:46",
   "capability": "Docs claim: Persist and reuse a browser profile (cookies, auth, extensions, settings) across sessions",
   "task": "steel profile import/sync/list/delete",
   "route": "cli",
   "evidence": "profile list returns [] while GET /v1/profiles lists 3 API profiles; the CLI manages named profiles imported from a local browser, and delete takes a name, so API profiles cannot be deleted from the CLI"
  },
  {
   "kind": "claim",
   "cap": "cap-10",
   "surface": "cli",
   "claim": "steel credentials create/list/update/delete",
   "doc_url": "https://docs.steel.dev/overview/steel-cli",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "credentials list --json -> {\"data\":[],\"success\":true} (matches API after our deletes)",
   "t": "17:46",
   "capability": "Docs claim: Store and auto-inject login credentials (incl. TOTP) into a session",
   "task": "steel credentials create/list/update/delete",
   "route": "cli",
   "evidence": "credentials list --json -> {\"data\":[],\"success\":true} (matches API after our deletes)"
  },
  {
   "kind": "claim",
   "cap": "cap-07",
   "surface": "cli",
   "claim": "steel browser captcha solve",
   "doc_url": "https://docs.steel.dev/overview/steel-cli",
   "result": "plan_gated",
   "verified": false,
   "documented": true,
   "notes": "solving needs $10 paid balance (API 403 on solveCaptcha)",
   "t": "17:46",
   "capability": "Docs claim: Auto-solve CAPTCHAs encountered during a session",
   "task": "steel browser captcha solve",
   "route": "cli",
   "evidence": "solving needs $10 paid balance (API 403 on solveCaptcha)"
  },
  {
   "kind": "claim",
   "cap": "cap-01",
   "surface": "api",
   "claim": "POST /v1/sessions",
   "doc_url": "https://api.steel.dev/sdk-openapi.json",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "201 live",
   "t": "17:46",
   "capability": "Docs claim: Create a cloud browser session",
   "task": "POST /v1/sessions",
   "route": "api",
   "evidence": "201 live"
  },
  {
   "kind": "claim",
   "cap": "cap-02",
   "surface": "api",
   "claim": "wss://connect.steel.dev?apiKey=&sessionId=",
   "doc_url": "https://api.steel.dev/sdk-openapi.json",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "Playwright connectOverCDP drove example.com",
   "t": "17:46",
   "capability": "Docs claim: Drive the session with Playwright/Puppeteer/Selenium over CDP",
   "task": "wss://connect.steel.dev?apiKey=&sessionId=",
   "route": "api",
   "evidence": "Playwright connectOverCDP drove example.com"
  },
  {
   "kind": "claim",
   "cap": "cap-03",
   "surface": "api",
   "claim": "POST /v1/sessions/{id}/release",
   "doc_url": "https://api.steel.dev/sdk-openapi.json",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "status released",
   "t": "17:46",
   "capability": "Docs claim: Release/stop a browser session",
   "task": "POST /v1/sessions/{id}/release",
   "route": "api",
   "evidence": "status released"
  },
  {
   "kind": "claim",
   "cap": "cap-04",
   "surface": "api",
   "claim": "POST /v1/scrape",
   "doc_url": "https://api.steel.dev/sdk-openapi.json",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "200 html+markdown",
   "t": "17:46",
   "capability": "Docs claim: Scrape a page to HTML/markdown without managing a session",
   "task": "POST /v1/scrape",
   "route": "api",
   "evidence": "200 html+markdown"
  },
  {
   "kind": "claim",
   "cap": "cap-05",
   "surface": "api",
   "claim": "POST /v1/screenshot",
   "doc_url": "https://api.steel.dev/sdk-openapi.json",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "200 url to image (JPEG bytes served as image/png)",
   "t": "17:47",
   "capability": "Docs claim: Capture a screenshot of a page",
   "task": "POST /v1/screenshot",
   "route": "api",
   "evidence": "200 url to image (JPEG bytes served as image/png)"
  },
  {
   "kind": "claim",
   "cap": "cap-06",
   "surface": "api",
   "claim": "POST /v1/pdf",
   "doc_url": "https://api.steel.dev/sdk-openapi.json",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "200 url to %PDF-1.4",
   "t": "17:47",
   "capability": "Docs claim: Generate a PDF of a page",
   "task": "POST /v1/pdf",
   "route": "api",
   "evidence": "200 url to %PDF-1.4"
  },
  {
   "kind": "claim",
   "cap": "cap-07",
   "surface": "api",
   "claim": "POST /v1/sessions {solveCaptcha: true}; GET captchas/status; POST captchas/solve",
   "doc_url": "https://api.steel.dev/sdk-openapi.json",
   "result": "plan_gated",
   "verified": false,
   "documented": true,
   "notes": "403 needs $10 paid balance",
   "t": "17:47",
   "capability": "Docs claim: Auto-solve CAPTCHAs encountered during a session",
   "task": "POST /v1/sessions {solveCaptcha: true}; GET captchas/status; POST captchas/solve",
   "route": "api",
   "evidence": "403 needs $10 paid balance"
  },
  {
   "kind": "claim",
   "cap": "cap-08",
   "surface": "api",
   "claim": "POST /v1/sessions {useProxy: {...}}",
   "doc_url": "https://api.steel.dev/sdk-openapi.json",
   "result": "plan_gated",
   "verified": false,
   "documented": true,
   "notes": "403 needs $10 paid balance",
   "t": "17:47",
   "capability": "Docs claim: Route session traffic through residential or custom proxies with geo targeting",
   "task": "POST /v1/sessions {useProxy: {...}}",
   "route": "api",
   "evidence": "403 needs $10 paid balance"
  },
  {
   "kind": "claim",
   "cap": "cap-09",
   "surface": "api",
   "claim": "POST /v1/sessions {persistProfile}; POST/PATCH /v1/profiles",
   "doc_url": "https://api.steel.dev/sdk-openapi.json",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "persist+reuse works; PATCH only multipart; no DELETE",
   "t": "17:47",
   "capability": "Docs claim: Persist and reuse a browser profile (cookies, auth, extensions, settings) across sessions",
   "task": "POST /v1/sessions {persistProfile}; POST/PATCH /v1/profiles",
   "route": "api",
   "evidence": "persist+reuse works; PATCH only multipart; no DELETE"
  },
  {
   "kind": "claim",
   "cap": "cap-10",
   "surface": "api",
   "claim": "POST /v1/credentials; POST /v1/sessions {credentials: {}}",
   "doc_url": "https://api.steel.dev/sdk-openapi.json",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "injected and auto-submitted on our own origin",
   "t": "17:48",
   "capability": "Docs claim: Store and auto-inject login credentials (incl. TOTP) into a session",
   "task": "POST /v1/credentials; POST /v1/sessions {credentials: {}}",
   "route": "api",
   "evidence": "injected and auto-submitted on our own origin"
  },
  {
   "cap": "cap-23",
   "capability": "Scaffold a project from a template",
   "task": "steel forge playwright --name ad-bot",
   "route": "cli",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "\"steel forge playwright\" -> {\"error\":\"Template not found: playwright\"}; forge --list shows slug playwright-ts; \"steel forge playwright-ts --name ad-bot\" made ad-bot/ with index.ts, package.json, tsconfig.json, README.md",
   "quality": {
    "docs_match": "drift",
    "docs_url": "https://docs.steel.dev/overview/steel-cli",
    "error_legibility": "vague",
    "recoverable": "yes"
   },
   "t": "17:48"
  },
  {
   "cap": "cap-24",
   "capability": "Install coding-agent skills",
   "task": "steel skills list",
   "route": "cli",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "skills list --json: steel-browser, steel-developer, ... (ga, 0.1.0, installed false); install goes through npx skills into agent client dirs: not installed (would write outside the run dir)",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/skills"
   },
   "t": "17:48"
  },
  {
   "cap": "cap-22",
   "capability": "Self-host the browser runtime",
   "task": "steel dev install / Docker image",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "docs: /overview/self-hosting/docker, railway, clustering; CLI steel dev install/start",
   "notes": "no docker in the drive sandbox",
   "t": "17:48"
  },
  {
   "cap": "cap-11",
   "capability": "Session files",
   "task": "upload, list, download, delete a file in a live session",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v1/sessions/{id}/files multipart -> 201 /files/ad-test.txt 30 B; GET list shows it; download returns our text; DELETE 204; list -> []",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/files-api/overview"
   },
   "t": "19:57"
  },
  {
   "cap": "cap-12",
   "capability": "Global files",
   "task": "upload, list, download, delete an org file",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v1/files -> 201 agentdrives/ad-test.txt; list shows it; download matches; DELETE /v1/files/agentdrives%2Fad-test.txt 204; list -> []",
   "notes": "did not mount it into a session",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/files-api/overview"
   },
   "t": "19:57"
  },
  {
   "cap": "cap-13",
   "capability": "Extensions",
   "task": "upload our own MV3 zip, start a session with it, check its content script ran, delete",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /v1/extensions 201 id ibeilnpl...; GET lists it; session extensionIds -> example.com has data-agentdrives=\"loaded\"; DELETE 200 \"Extension deleted successfully\"; list count 0",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/extensions-api/overview"
   },
   "t": "19:57"
  },
  {
   "cap": "cap-16",
   "capability": "Agent traces",
   "task": "GET agent-traces, agent-logs, logs of a finished session",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET /v1/sessions/76a0d344/agent-traces 200 events navigate about:blank -> example.com ...; agent-logs 200; logs 200; cost 200 totalCost 0.001667 usd",
   "notes": "export to markdown/ZIP is a dashboard feature, not tried",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/agent-traces/api"
   },
   "t": "19:57"
  },
  {
   "cap": "cap-15",
   "capability": "Replay a past session",
   "task": "GET /v1/sessions/{id}/hls of a released session",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 #EXTM3U playlist with init.mp4 on fly.storage.tigris.dev (signed URLs); GET /events returned [] for the same session",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/embed-sessions/past-sessions"
   },
   "t": "19:57"
  },
  {
   "cap": "cap-18",
   "capability": "Mobile mode",
   "task": "session deviceConfig {device:'mobile'}, read navigator on example.com",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "session dimensions 508x1074; UA \"Mozilla/5.0 (Linux; Android 16; CPH2801) ... Mobile Safari\"; innerWidth 500; but navigator.maxTouchPoints 0, userAgentData.mobile false, screen 1920x1080",
   "notes": "mobile UA and viewport yes; touch and screen still desktop",
   "quality": {
    "verify_route": "yes",
    "docs_match": "drift",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/mobile-mode"
   },
   "t": "19:57"
  },
  {
   "cap": "cap-19",
   "capability": "Fullscreen 1920x1080",
   "task": "session fullscreen:true",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "innerWidth x innerHeight 1920x1080 = screen 1920x1080 (no browser chrome)",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/fullscreen-mode"
   },
   "t": "19:57"
  },
  {
   "cap": "cap-20",
   "capability": "Reuse auth context",
   "task": "GET /v1/sessions/{id}/context from a live session, pass it as sessionContext to a new one",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "context 200 {cookies:[], localStorage:{\"example.com\":{\"ad_ctx\":...}}}; passed back as-is -> new session localStorage null; same value keyed \"https://example.com\" -> restored",
   "notes": "GET context keys localStorage by host, create expects an origin: the round trip loses localStorage unless the agent rewrites the keys",
   "quality": {
    "verify_route": "yes",
    "docs_match": "drift",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/reusing-auth-context",
    "recoverable": "yes"
   },
   "t": "19:57"
  },
  {
   "cap": "cap-21",
   "capability": "Dedicated static IP",
   "task": "check docs/plan",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "llms.txt pricing: \"dedicated IPs at $5 each\" on paid plans; map plan paid; free Launch plan has no paid balance",
   "t": "19:57"
  },
  {
   "cap": "cap-14",
   "capability": "Watch a session live",
   "task": "open the session page of a live session in the dashboard",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "app.steel.dev/sessions/02f6726c: \"Live\" badge, live frame of example.com, event list (Navigation about:blank -> https://example.com/), cost 0.0016; CLI steel browser live returned the same URL",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/embed-sessions/live-sessions"
   },
   "t": "21:31"
  },
  {
   "cap": "cap-17",
   "capability": "Human takes control",
   "task": "open the debugUrl player, click to interact, send keys",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "api.steel.dev/v1/sessions/{id}/player: \"Click to interact\"; our click+Tab+Enter reached the remote Chrome (its screen shows \"Bookmark added\" on example.com)",
   "notes": "the key landed on the star, not the page link; the remote page URL stayed example.com",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/human-in-the-loop"
   },
   "t": "21:31"
  },
  {
   "cap": "pay",
   "step": "checkout",
   "route": "browser",
   "documented": true,
   "capability": "Walk to the last click",
   "task": "Plans > Upgrade to Scale ($250/month + usage)",
   "result": "done",
   "verified": true,
   "evidence": "Settings > Plans: Launch $0 + usage (current, $30 one-time credits), Scale $250 + usage, Enterprise Contact Sales; Upgrade to Scale opens \"Add payment method\" (Stripe Payment Element in-page: Card, Cash App Pay, US bank account; Google Pay frame); Card form: number, MM/YY, CVC, Country (Germany preset), no phone field; invisible hCaptcha frame from Stripe (HCaptchaInvisible); last button \"Save payment method\"; stopped there, no card typed",
   "notes": "ours: no card for this drive",
   "t": "23:31"
  },
  {
   "cap": "pay",
   "step": "probe",
   "route": "api",
   "documented": true,
   "capability": "Agent rail",
   "task": "read pay_probe.json and pay_tx.json",
   "result": "done",
   "verified": true,
   "evidence": "x402.steel.dev/v1/scrape 402 PAYMENT-REQUIRED x402 v2, exact, Base eip155:8453 + Solana, 10000 USDC units ($0.01), resource api.paysponge.com/v1/scrape; we paid once: tx 0xdd2f191a...b20 on Base, confirmed block 52525353, 200 with example.com html (entitled)",
   "notes": "docs integrations/x402 still describe the v1 X-PAYMENT header while the live 402 is v2 PAYMENT-REQUIRED; rail covers scrape/screenshot/pdf only (side endpoints), not sessions or plans. Stripe Projects: docs /overview/stripe-projects \"stripe projects add steel/browser\"; not tried (no Stripe Projects kit)",
   "t": "23:31"
  },
  {
   "cap": "cap-26",
   "capability": "View usage and balance",
   "task": "Settings > Usage and Wallet",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Usage: last 24h spend $0.04, sessions 36, browser minutes 10, proxy 0.00 GB, captcha solves 0, scrapes 4, hourly table, Export as CSV; header balance $29.96 of $30",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/pricinglimits"
   },
   "t": "23:31"
  },
  {
   "cap": "cap-27",
   "capability": "Top up credits",
   "task": "Wallet > Buy credits",
   "route": "browser",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Buy credits dialog: $50 / $250 / $1,000 / Other, \"Minimum purchase is $10. Usage purchases expire 1 year after purchase.\", button \"Continue to pay $50.00\"; not clicked (no paying in a drive); auto top-up under \"Configure\"",
   "notes": "not tested: costs money",
   "t": "23:31"
  },
  {
   "cap": "discovery",
   "route": "mcp",
   "documented": true,
   "capability": "MCP version",
   "task": "stdio server/discover with MCP-Protocol-Version 2026-07-28, then initialize",
   "result": "done",
   "verified": true,
   "evidence": "server/discover -> result.supportedVersions [\"2026-07-28\"], capabilities tools/resources, extension io.modelcontextprotocol/ui; initialize offering 2026-07-28 -> protocolVersion \"2025-11-25\", serverInfo steel / Steel Browser 3.0.0; tools/list 16 tools",
   "notes": "stdio only (npx github:steel-dev/steel-mcp-server, not on npm); hosted HTTP is self-deploy (dist/hosted.js), mcp.steel.dev not live",
   "t": "26:21"
  },
  {
   "cap": "cap-04",
   "capability": "Scrape a page",
   "task": "MCP steel_scrape example.com",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "tools/call steel_scrape -> \"Read https://example.com/ (HTTP 200)\" with the page text wrapped in <untrusted-page-content>",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://github.com/steel-dev/steel-mcp-server"
   },
   "t": "26:21"
  },
  {
   "cap": "cap-01",
   "capability": "Create a cloud browser session",
   "task": "MCP steel_session_create, navigate, release",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "first call refused: \"Saved profiles are available, so a fresh guest browser was not created. Choose one READY profile_id and retry, or pass guest=true\"; with guest:true -> session_id sess_CVUH..., viewer 62ce5886; steel_navigate final_url https://example.com/ navigated true; steel_session_release released true; GET /v1/sessions/62ce5886 -> released",
   "notes": "MCP uses its own session ids (sess_...) mapped to Steel ids",
   "quality": {
    "docs_match": "match",
    "docs_url": "https://github.com/steel-dev/steel-mcp-server",
    "error_legibility": "clear",
    "recoverable": "yes"
   },
   "t": "26:21"
  },
  {
   "kind": "claim",
   "cap": "cap-04",
   "surface": "mcp",
   "claim": "steel_scrape",
   "doc_url": "https://github.com/steel-dev/steel-mcp-server",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "HTTP 200 read of example.com",
   "t": "26:21",
   "capability": "Docs claim: Scrape a page to HTML/markdown without managing a session",
   "task": "steel_scrape",
   "route": "mcp",
   "evidence": "HTTP 200 read of example.com"
  },
  {
   "kind": "claim",
   "cap": "cap-01",
   "surface": "mcp",
   "claim": "steel_session_create",
   "doc_url": "https://github.com/steel-dev/steel-mcp-server",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "needs guest=true when the org has saved profiles",
   "t": "26:21",
   "capability": "Docs claim: Create a cloud browser session",
   "task": "steel_session_create",
   "route": "mcp",
   "evidence": "needs guest=true when the org has saved profiles"
  },
  {
   "kind": "claim",
   "cap": "cap-02",
   "surface": "mcp",
   "claim": "steel_navigate / steel_act",
   "doc_url": "https://github.com/steel-dev/steel-mcp-server",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "steel_navigate final_url example.com",
   "t": "26:21",
   "capability": "Docs claim: Drive the session with Playwright/Puppeteer/Selenium over CDP",
   "task": "steel_navigate / steel_act",
   "route": "mcp",
   "evidence": "steel_navigate final_url example.com"
  },
  {
   "kind": "claim",
   "cap": "cap-03",
   "surface": "mcp",
   "claim": "steel_session_release",
   "doc_url": "https://github.com/steel-dev/steel-mcp-server",
   "result": "done",
   "verified": true,
   "documented": true,
   "notes": "released true; API shows released",
   "t": "26:21",
   "capability": "Docs claim: Release/stop a browser session",
   "task": "steel_session_release",
   "route": "mcp",
   "evidence": "released true; API shows released"
  },
  {
   "cap": "first_call",
   "way": "sso_github",
   "route": "api",
   "documented": true,
   "capability": "First API call",
   "task": "GET /v1/sessions with the GitHub account key",
   "result": "done",
   "verified": true,
   "evidence": "200 {'sessions': [], 'nextCursor': None}",
   "t": "30:24"
  },
  {
   "cap": "first_action",
   "way": "sso_github",
   "route": "api",
   "documented": true,
   "capability": "First action",
   "task": "POST /v1/scrape example.com",
   "result": "done",
   "verified": true,
   "evidence": "200 title Example Domain",
   "t": "30:24"
  },
  {
   "cap": "signup",
   "way": "pay_per_call",
   "route": "api",
   "documented": true,
   "capability": "Keyless x402",
   "task": "pay one scrape call on x402.steel.dev",
   "result": "done",
   "verified": true,
   "evidence": "pay_tx.json: POST https://x402.steel.dev/v1/scrape, x402 v2 exact on Base, $0.01 USDC, tx 0xdd2f191a...4b03b20 confirmed block 52525353, HTTP 200 with example.com html",
   "notes": "no account, no key; covers scrape/screenshot/pdf only",
   "t": "32:05"
  },
  {
   "cap": "signup",
   "way": "stripe_projects",
   "result": "skipped",
   "not_tried": "no_kit",
   "route": "cli",
   "documented": true,
   "capability": "Stripe Projects",
   "task": "stripe projects add steel/browser",
   "verified": false,
   "evidence": "documented at docs.steel.dev/overview/stripe-projects; listed in the projects.dev catalog",
   "notes": "our agent has no Stripe Projects account yet",
   "t": "32:05"
  },
  {
   "cap": "signup",
   "way": "sso_enterprise",
   "result": "skipped",
   "not_tried": "assisted_only",
   "route": "none",
   "documented": true,
   "capability": "Enterprise SSO",
   "task": "",
   "verified": false,
   "evidence": "llms.txt: Enterprise \"SSO + HIPAA-ready BAA\" (Contact Sales)",
   "notes": "a person must set it up",
   "t": "32:05"
  },
  {
   "cap": "signup",
   "way": "device_login",
   "route": "cli",
   "documented": true,
   "capability": "CLI login",
   "task": "steel login (CLI 0.4.4) with the magic-link account",
   "result": "skipped",
   "verified": false,
   "evidence": "steel login prints https://app.steel.dev/sign-in?cli_redirect=true&port=<random>&state=•••• and waits on a localhost callback; opened in our logged-in browser, the redirect to localhost:<port> got ERR_CONNECTION_REFUSED",
   "notes": "steel login is a localhost-redirect browser flow (cli_redirect=true&port=...), not an RFC 8628 device code; it needs a browser on the same machine as the CLI. Started once; the redirect to localhost was refused in this drive's split browser/CLI setup, so the CLI ran on STEEL_API_KEY instead (documented in /overview/authentication)",
   "t": "32:05",
   "not_tried": "same_as"
  },
  {
   "cap": "cap-01",
   "capability": "",
   "task": "SDK session chain",
   "route": "sdk",
   "documented": true,
   "step": "create",
   "trial": 3,
   "result": "done",
   "verified": true,
   "evidence": "session 6f6352e2 live in 1023 ms",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/overview"
   },
   "t": "32:52"
  },
  {
   "cap": "cap-01",
   "capability": "",
   "task": "SDK session chain",
   "route": "sdk",
   "documented": true,
   "step": "read",
   "trial": 3,
   "result": "done",
   "verified": true,
   "evidence": "GET right after create: {'status': 'live', 'websocketUrl': True} read_errors None",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/overview"
   },
   "t": "32:52"
  },
  {
   "cap": "cap-02",
   "capability": "",
   "task": "SDK session chain",
   "route": "sdk",
   "documented": true,
   "step": "use",
   "trial": 3,
   "result": "done",
   "verified": true,
   "evidence": "goto example.com -> {'url': 'https://example.com/', 'title': 'Example Domain'}; click -> {'url': 'https://www.iana.org/help/example-domains', 'title': 'Example Domains'}",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/overview"
   },
   "t": "32:52"
  },
  {
   "cap": "cap-03",
   "capability": "",
   "task": "SDK session chain",
   "route": "sdk",
   "documented": true,
   "step": "delete",
   "trial": 3,
   "result": "done",
   "verified": true,
   "evidence": "release {'success': True}; GET {'status': 'released', 'duration': 0}",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "docs_url": "https://docs.steel.dev/overview/sessions-api/overview"
   },
   "t": "32:52"
  },
  {
   "cap": "cancel",
   "route": "none",
   "documented": false,
   "capability": "Cancel plan",
   "task": "cancel/downgrade",
   "result": "skipped",
   "verified": false,
   "evidence": "no plan or trial started (Launch is $0 + usage; Scale $250/month needs a payment method). Docs (llms-full.txt) have no page on cancelling or downgrading; the dashboard has Plans and a \"Manage billing\" button (Stripe portal, not opened)",
   "notes": "not tested: no plan or trial was started",
   "t": "33:00"
  },
  {
   "cap": "credentials",
   "route": "browser",
   "documented": true,
   "key": "revoke",
   "capability": "Scoped key headless",
   "task": "revoke the API-made key",
   "result": "done",
   "verified": true,
   "evidence": "Settings > API Keys > Delete agentdrives-headless key > \"This permanently revokes agentdrives-headless\" > Yes, delete; the key then -> 401 {'error': 'Unauthorized', 'message': \"Invalid Steel API key. The key sent in the 'steel-api-key' hea",
   "notes": "revoke is dashboard-only (no documented API op; DELETE /v1/api-keys/{id} with a key -> 403 \"API keys cannot manage API keys\")",
   "t": "34:31"
  },
  {
   "cap": "delete",
   "way": "sso_github",
   "step": "revoke",
   "route": "browser",
   "documented": true,
   "capability": "Revoke GitHub grant",
   "task": "GitHub Settings > Applications > Steel.dev > Revoke access",
   "result": "done",
   "verified": true,
   "evidence": "\"Steel.dev has been revoked from your account.\"; Authorized OAuth Apps: \"No authorized OAuth Apps\"",
   "t": "36:30"
  }
 ],
 "stale": false,
 "icon": "/logos/steel.png",
 "monitored": false,
 "verdict": null,
 "page": "https://agentdrives.com/tools/steel?via=api"
}