{
  "version": 4,
  "updatedAt": "2026-08-22",
  "description": "Agent/client launch matrix for public Starkscan integration surfaces. Route-level certification remains owned by public-api-correctness-manifest.json; this file classifies the higher-level REST, RPC, SDK, CLI, and MCP surfaces and carries the draft 1.0 public-client semver/conformance contract. Strict consumers should treat the states object and onePointZeroContract object as the authoritative enum lists for this version.",
  "states": {
    "certified": "Production-safe for the stated scope, with current correctness evidence and stable client contract.",
    "beta": "Usable by named clients with documented limits or release-channel caveats.",
    "experimental": "Restricted preview; schema, packaging, or auth may still change.",
    "provider-blocked": "The route or adapter exists for gated proof, but migration for the named workload remains blocked on provider-readiness evidence.",
    "unsupported": "Not a supported client contract.",
    "stable": "Default public package channel for pre-1.0 clients with current smoke evidence and a stable install contract."
  },
  "surfaces": [
    {
      "id": "rest-core-api",
      "publicName": "REST core API",
      "state": "certified",
      "releaseState": "ready-for-named-client-production",
      "audience": "external clients and agents that call HTTP directly",
      "entrypoint": "https://<host>/api/v1/...",
      "auth": "X-Starkscan-Api-Key",
      "scope": [
        "GET /v1/{chain}/status",
        "GET /v1/{chain}/block/{number_or_hash}",
        "GET /v1/{chain}/block-at-timestamp",
        "GET /v1/{chain}/tx/{tx_hash}",
        "GET /v1/{chain}/token/{token}/total-supply",
        "GET /v1/{chain}/token/{token}/balance-of/{address}"
      ],
      "evidence": [
        "rust-exp/docs/api/public-api-correctness-manifest.json",
        "rust-exp/deploy/hetzner/scripts/core-api-rpc-parity-gate.sh",
        "rust-exp/deploy/hetzner/scripts/block-at-timestamp-correctness-gate.sh",
        "rust-exp/deploy/hetzner/scripts/token-read-correctness-gate.sh",
        "rust-exp/docs/api/block-at-timestamp-certification.md",
        "rust-exp/scripts/agent-api-conformance-smoke.sh"
      ],
      "checks": [
        "public API correctness manifest validation",
        "core API RPC parity gate",
        "block-at-timestamp RPC correctness gate",
        "exact-block token read correctness gate",
        "authenticated agent API conformance smoke"
      ],
      "blockers": [],
      "notes": "Correctness is the hard gate. The certified accounting scope is timestamp-to-block plus exact token balance for one known token/account at a concrete block. Indexed lists, historical portfolio discovery, and protocol routes stay beta until their reconciliation gates are current."
    },
    {
      "id": "starkscan-rpc-provider",
      "publicName": "Starkscan RPC provider",
      "state": "beta",
      "releaseState": "authenticated-http-rpc-beta-certified",
      "audience": "Starkscan API-key holders that need a Starknet JSON-RPC endpoint for reads, calls, events, fees, simulations, and write-scoped already-signed payload submission boundaries",
      "entrypoint": "POST https://<host>/api/v1/{chain}/rpc",
      "auth": "X-Starkscan-Api-Key on the public /api/v1 path; /rpc/v0_10/{chain}/{token} is a compatibility nodeUrl path for clients that cannot attach headers and should use a dedicated Starkscan key per app or environment; treat the full URL-token form as sensitive",
      "scope": [
        "JSON-RPC 2.0 route and auth shape for gated readiness testing",
        "header-auth requests on /api/v1/{chain}/rpc",
        "nodeUrl-compatible URL-token requests through /rpc/v0_10/{chain}/{token}",
        "single-request and batch-envelope parsing paths",
        "wallet/app phase-one provider-readiness evidence with a dedicated mainnet RPC_GATEWAY_* upstream/LB",
        "fail-closed write certification for already-signed invoke, declare, and deploy-account submission methods; positive signed-write delivery remains a separate operator-approved canary",
        "authenticated beta scope with live evidence for starknet_specVersion >= 0.10.2, mainnet chain id, batch support, fixed-block reads, starknet_call, getStorageAt, events, and simulation/fee behavior",
        "operator-issued trace scope: only starknet_traceTransaction and starknet_traceBlockTransactions, classified as rpc_trace under a bounded quota; read, batch, write, and prove do not imply trace, and a trace-only key may call only those selected trace methods",
        "source-proven preview-main readiness runs have passed provider pilot, partner wallet workload, live parity, strict signed simulation, and WSS readiness on their exact source revisions; verify the latest attestation before making current-head claims"
      ],
      "evidence": [
        "rust-exp/scripts/starkscan-rpc-provider-smoke.sh",
        "rust-exp/scripts/tests/starkscan-rpc-provider-smoke.sh",
        "rust-exp/scripts/starkscan-rpc-provider-pilot-gate.py",
        "rust-exp/scripts/tests/starkscan-rpc-provider-pilot-gate.sh",
        "rust-exp/scripts/starkscan-rpc-certification-gate.py",
        "docs/infra/runbooks/rpc-provider-serving-pool.md",
        "webapp/apps/docs/content/docs/api/agent-quickstart.mdx"
      ],
      "checks": [
        "RPC provider smoke validates public auth rejection on /api/v1",
        "RPC provider smoke validates authenticated chainId, URL-token nodeUrl, and batch reads",
        "RPC provider smoke validates malformed-write semantic errors or rpc_write rate limits and the batch-size cap",
        "RPC provider pilot gate validates read-state and read-history method matrices",
        "RPC provider pilot gate validates simulation and fee JSON-RPC forwarding envelopes",
        "signed-write certification gate validates fail-closed write classification with request IDs, and has a separate private signed-fixture mode for operator-approved live canaries",
        "operator-approved trace canary validates both selected trace methods with a dedicated trace-scoped key, rpc_trace classification, quota behavior, and non-forwarding for a key without trace scope",
        "tester readiness smoke includes the RPC provider smoke",
        "provider-readiness deploy gate records pilot, partner wallet workload, and live parity report summaries when RUN_RPC_PROVIDER_READINESS_GATE=true"
      ],
      "blockers": [
        "positive signed-write broadcast canary before customer-facing write-delivery claims",
        "archive/history certification, including historical storage-proof horizon",
        "second distinct read-serving upstream before hedging/default-on claims",
        "multi-client conformance matrix before full-provider replacement claims",
        "broad tracing, no-key public RPC, unrestricted archive/history, and full-provider replacement are outside the current beta"
      ],
      "notes": "This is separate from the certified REST launch set. Starkscan API-key holders may use Starkscan RPC for documented read, call, event, fee, and simulation workflows validated against a mainnet wallet-app evidence profile. Starkscan routing is operated for reliability, availability, security, version compatibility, service health, and capacity; upstream node ownership is not a customer control plane or product promise. Write-scoped beta support is limited to relaying already-signed addInvoke, addDeclare, and addDeployAccount payloads when all write gates are enabled; Starkscan does not create transactions, sign payloads, custody keys or funds, choose calldata, or blind-retry writes. Selected trace methods require a separate operator-issued trace entitlement with a bounded quota; read, batch, write, and prove keys do not imply trace access. Strict signed simulation is proof-backed only when the deploy attestation records signedSimulationProof=true. WSS is a separate named-client beta lane with its own route, caps, and attestation. Keep your existing RPC provider for broad tracing, unrestricted archive/history, no-key public RPC, and full-provider replacement until those lanes have their own certification."
    },
    {
      "id": "address-intelligence-utilities",
      "publicName": "Address intelligence utilities",
      "state": "beta",
      "releaseState": "ready-for-named-wallet-and-migration-clients",
      "audience": "Wallet, paymaster, migration, and account-intelligence backends that already have bounded address lists",
      "entrypoint": "POST https://api.starkscan.co/v1/{chain}/address/intelligence",
      "auth": "X-Starkscan-Api-Key with utility access for batch routes; read access for single-address attribution",
      "scope": [
        "POST /v1/{chain}/address/summaries for ordered aggregate address facts",
        "POST /v1/{chain}/address/intelligence for deployment, attribution, inbound-funds, and typed activity coverage",
        "GET /v1/{chain}/address/{address}/attribution for one-address readable attribution",
        "up to 128 addresses per batch request",
        "request-order preserving response items with explicit canonical felt correlation",
        "nullable activity totals, positive lower bounds, exact-zero certification, and source/indexed watermarks under starkscan.address_activity_truth.v1",
        "indexed-only request paths with no RPC calls, deployment repair, raw activity scans, risk scoring, or sanctions screening"
      ],
      "evidence": [
        "rust-exp/scripts/ready-argent-acceptance.py",
        "rust-exp/scripts/tests/ready-argent-acceptance.sh",
        "rust-exp/scripts/address-activity-differential.py",
        "rust-exp/scripts/tests/address-activity-differential.sh",
        "webapp/packages/sdk/src/explorerApi.ts",
        "webapp/packages/sdk/src/starkscanClient.ts",
        "webapp/apps/docs/content/docs/api/address-intelligence.mdx"
      ],
      "checks": [
        "Ready/Argent acceptance harness fixture-smokes address attribution, empty/over-128/exactly-128 batch behavior, duplicate mapping preservation, auth boundaries, and repeated 100-address latency runs",
        "deterministic activity differential fixtures reject false zero and frozen contract-event projections, validate nullable and lower-bound states, and enforce felt/order and 128/129 boundaries",
        "trusted read-only activity differential mode requires contract projections to cover canonical events in the recorded interval, records sanitized per-stratum rates, and separates provider failures from product regressions",
        "SDK validators enforce the address intelligence response shape",
        "CLI exposes address-summaries and address-intelligence commands",
        "certified route-level sampling is not claimed by this beta surface"
      ],
      "blockers": [
        "route-level certification sampling before certified promotion",
        "label/protocol coverage metric publication",
        "named-client live acceptance refresh with the current partner key before external launch claims"
      ],
      "notes": "This beta surface provides factual indexed classification only. Null fields mean unknown, not false, and numeric activity zero requires exact exhaustive coverage. Successful indexed sender or contract-call evidence may be a positive lower bound while the exhaustive total remains unavailable. hasReceivedFunds is based on indexed token-transfer recipient rows and is not a current-balance or AML/risk signal. Deterministic certification is checked in; current exact-main trusted-live sampling remains a promotion blocker, not a present claim."
    },
    {
      "id": "fungible-wallet-state",
      "publicName": "Fungible wallet state",
      "state": "beta",
      "releaseState": "ready-first-bounded-exact-block-beta",
      "audience": "Ready and other wallet providers that need one low-latency, correctness-first fungible-token home-screen operation",
      "entrypoint": "GET /v1/{chain}/address/{address}/assets/discovery plus POST /v1/{chain}/query/wallet-state",
      "auth": "X-Starkscan-Api-Key with partner wallet-state access",
      "scope": [
        "candidate discovery separated from balance correctness",
        "one immutable accepted Starknet block per response",
        "strict fail-visible or typed verified-partial modes",
        "explicit, discovered, and discovered-plus-registry scopes",
        "one billed operation for the bounded 1-25 candidate band",
        "fungible tokens only; NFTs and full Xverse workload replacement are outside phase one"
      ],
      "evidence": [
        "webapp/apps/docs/content/docs/api/wallet-state-migration.mdx",
        "rust-exp/deploy/hetzner/scripts/wallet-state-clean-window-gate.sh",
        "scripts/ci/contract-heavy-guardrails.sh",
        "scripts/ci/public-api-hot-route-slo.js"
      ],
      "checks": [
        "every successful balance, nonce, and class hash is pinned to the echoed block hash",
        "indexed values are never substituted and errors are never converted to zero",
        "raw valuation explicitly declares page scope and single-page completion; wallet completion is SDK-aggregate only",
        "SDK complete-wallet pagination pins one block and aggregates exact totals only after cursor exhaustion",
        "unpriced non-zero assets remain visible and are excluded from total USD",
        "0, 1, 25, and rejected-26 candidate boundaries",
        "REST, SDK, CLI, hosted MCP, remote MCP, OpenAPI, frontend, and retirement semantics agree",
        "certified clean-window and dedicated-pool capacity evidence before final latency certification"
      ],
      "blockers": [
        "26-50 candidate band pending dedicated-pool capacity certification",
        "NFT wallet state remains a separate capability",
        "global completeness for non-standard or unregistered assets is not claimed"
      ],
      "notes": "Ready is the first named wallet scope. Xverse receives only one of its broader calls in this phase. token-holdings returns typed 410 without data, portfolio-live is removed, and the already-published 0.2.0 client train remains the rollback baseline while 0.3.0 carries the address-activity truth contract."
    },
    {
      "id": "typescript-sdk",
      "publicName": "TypeScript SDK",
      "state": "stable",
      "releaseState": "published-0.3.0-live-smoked",
      "audience": "TypeScript applications and agent runtimes that want typed REST access",
      "entrypoint": "@starkscan/sdk",
      "auth": "SDK forwards the same hosted API-key contract as REST",
      "scope": [
        "typed wrappers over the public REST contract",
        "chain-bound Starkscan client helpers",
        "typed immutable token-holder screening and complete-generation pagination",
        "live tester smoke against preview"
      ],
      "evidence": [
        "webapp/packages/sdk/package.json",
        "webapp/packages/sdk/src/index.ts",
        "webapp/packages/sdk/src/starkscanClient.ts",
        "webapp/packages/sdk/scripts/tester-smoke.ts"
      ],
      "checks": [
        "bun run --cwd packages/sdk typecheck",
        "bun run --cwd packages/sdk test",
        "bun run --cwd packages/sdk build",
        "bun run --cwd packages/sdk smoke:tester",
        "clean npm install of @starkscan/sdk@0.3.0 and @starkscan/sdk, Node ESM import, and live public address-intelligence/status smoke with baseUrl=https://api.starkscan.co"
      ],
      "blockers": [
        "public provenance strategy finalized before stronger package-trust claims"
      ],
      "notes": "@starkscan/sdk 0.3.0 is published on latest with nullable activity counts, typed activity coverage, and explicit response/source contract versions. Coordinated release run 32634641511 verified the registry tag, clean install, Node ESM import, and live public API smoke. npm provenance remains pending until public-source promotion.",
      "packageTrust": {
        "package": "@starkscan/sdk",
        "channel": "latest",
        "targetVersion": "0.3.0",
        "currentPublicVersion": "0.3.0",
        "npm": "https://www.npmjs.com/package/@starkscan/sdk",
        "source": "https://starkscan.co/docs/build/package-trust",
        "socket": "https://socket.dev/npm/package/@starkscan/sdk",
        "controls": [
          "public scoped package under the @starkscan npm org",
          "public package trust source lives at https://starkscan.co/docs/build/package-trust",
          "repository metadata points at the checked-in private repository URL string for npm Trusted Publishing publisher matching",
          "package artifacts from the checked release workflow",
          "package entrypoint and type entrypoint preflight before publish",
          "post-publish dist-tag verifier must confirm latest resolves to 0.3.0",
          "post-publish public status smoke passed with baseUrl=https://api.starkscan.co",
          "authenticated /api smoke remains a per-client scoped-key check",
          "tokenless publish through configured npm Trusted Publishing; CI publish uses OIDC with NPM_CONFIG_PROVENANCE=false",
          "Socket package monitoring candidate; do not treat it as a formal certification"
        ]
      }
    },
    {
      "id": "agent-cli",
      "publicName": "Agent CLI",
      "state": "stable",
      "releaseState": "published-0.3.0-live-smoked",
      "audience": "shell users, local exports, and agent subprocess workflows",
      "entrypoint": "@starkscan/cli",
      "auth": "CLI sends X-Starkscan-Api-Key and uses STARKSCAN_* env names",
      "scope": [
        "npx/npm wrapper",
        "native artifact verification",
        "token-holder-screening and token-holders native commands",
        "doctor and command forwarding"
      ],
      "evidence": [
        "webapp/packages/cli/package.json",
        "webapp/packages/cli/README.md",
        "webapp/packages/cli/scripts/tests/cli-wrapper.mjs",
        "rust-exp/scripts/release-cli-smoke.sh"
      ],
      "checks": [
        "npm run typecheck in webapp/packages/cli",
        "npm run test in webapp/packages/cli",
        "clean npm install of @starkscan/cli@0.3.0 and @starkscan/cli",
        "npx -y @starkscan/cli --base-url https://api.starkscan.co status",
        "npx -y @starkscan/cli doctor against the default hosted endpoint and a scoped key when running per-client authenticated smoke",
        "unauthenticated doctor smoke emits starkscan-cli- request IDs and never the legacy request-id prefix"
      ],
      "blockers": [
        "public provenance strategy finalized before stronger package-trust claims"
      ],
      "notes": "@starkscan/cli 0.3.0 is published on latest with the address-activity truth contract and verified native artifacts for darwin-aarch64, darwin-x86_64, linux-aarch64, and linux-x86_64. Coordinated release run 32634641511 verified registry tags, clean install, artifact checksums, request IDs, and live public API smoke.",
      "packageTrust": {
        "package": "@starkscan/cli",
        "channel": "latest",
        "targetVersion": "0.3.0",
        "currentPublicVersion": "0.3.0",
        "npm": "https://www.npmjs.com/package/@starkscan/cli",
        "source": "https://starkscan.co/docs/build/package-trust",
        "socket": "https://socket.dev/npm/package/@starkscan/cli",
        "controls": [
          "public scoped package under the @starkscan npm org",
          "public package trust source lives at https://starkscan.co/docs/build/package-trust",
          "repository metadata points at the checked-in private repository URL string for npm Trusted Publishing publisher matching",
          "native archives bundled for darwin-aarch64, darwin-x86_64, linux-aarch64, and linux-x86_64",
          "manifest and sha256 verification before executing the native binary",
          "safe tar entry checks and package-version release-tag binding before publish",
          "GitHub artifact attestations for release workflow outputs",
          "post-publish dist-tag verifier must confirm latest resolves to 0.3.0",
          "post-publish unauthenticated error-path smoke confirms request IDs use starkscan-cli- and never the legacy request-id prefix",
          "post-publish public status smoke passed with --base-url https://api.starkscan.co",
          "authenticated doctor smoke against the default hosted endpoint remains a per-client scoped-key check",
          "tokenless publish through configured npm Trusted Publishing; CI publish uses OIDC with NPM_CONFIG_PROVENANCE=false",
          "Socket package monitoring candidate; do not treat it as a formal certification"
        ]
      }
    },
    {
      "id": "hosted-mcp-http",
      "publicName": "Hosted MCP HTTP",
      "state": "beta",
      "releaseState": "usable-with-api-key-auth-and-discovery",
      "audience": "MCP-capable agents that can call the hosted JSON-RPC endpoint",
      "entrypoint": "POST https://<app-host>/api/mcp or https://api.starkscan.co/mcp on the API domain",
      "auth": "X-Starkscan-Api-Key for hosted MCP",
      "scope": [
        "single JSON-RPC request per POST",
        "tools/list and tools/call parity with the read surface",
        "token_holder_screening and token_holders immutable-generation tools",
        "stateless hosted transport",
        "OAuth protected-resource discovery metadata for MCP-capable clients"
      ],
      "evidence": [
        "rust-exp/docs/mcp-http-rollout.md",
        "rust-exp/docs/mcp-tool-parity.md",
        "rust-exp/src/transport/api/mcp_http_adapter.rs",
        "rust-exp/src/transport/mcp.rs",
        "rust-exp/deploy/hetzner/scripts/post-deploy-smoke.sh"
      ],
      "checks": [
        "GET /api/mcp returns 405 Allow: POST",
        "POST /api/mcp initialize returns MCP protocol 2025-11-25",
        "OAuth protected-resource discovery routes pass post-deploy smoke",
        "MCP tool parity tests in rust-exp"
      ],
      "blockers": [],
      "notes": "Direct hosted MCP is live with API-key auth. Use https://api.starkscan.co/mcp on the API domain, or /api/mcp when calling an app-origin deployment. OAuth protected-resource discovery is validated by preview smoke. Discovery metadata is not the same as launching a full OAuth token issuance flow. npm launcher promotion is tracked separately from the hosted HTTP transport."
    },
    {
      "id": "mcp-launcher",
      "publicName": "Official MCP launcher",
      "state": "stable",
      "releaseState": "published-0.3.0-live-smoked",
      "audience": "Codex, Claude Code, Cursor, Cline, and other desktop MCP clients",
      "entrypoint": "npx -y @starkscan/mcp",
      "auth": "STARKSCAN_API_KEY environment variable passed by the host client",
      "scope": [
        "one-command MCP onboarding",
        "generated client config snippets",
        "packaged launcher smoke"
      ],
      "evidence": [
        "webapp/packages/mcp/package.json",
        "webapp/packages/mcp/README.md",
        "webapp/apps/docs/content/docs/ai/mcp-quickstart.mdx",
        "rust-exp/scripts/tester-mcp-remote-smoke.sh",
        "rust-exp/scripts/release-mcp-remote-smoke.sh"
      ],
      "checks": [
        "npm run typecheck in webapp/packages/mcp",
        "npm run test in webapp/packages/mcp",
        "packaged launcher smoke, not cargo-run fallback",
        "clean npm install of @starkscan/mcp@0.3.0 and @starkscan/mcp",
        "npx -y @starkscan/mcp print-config and tools against the default hosted endpoint",
        "npx -y @starkscan/mcp doctor against the default hosted endpoint and a scoped key when running per-client authenticated smoke",
        "unauthenticated doctor smoke emits starkscan-cli- request IDs and never the legacy request-id prefix",
        "client config examples for Codex and Claude Code"
      ],
      "blockers": [
        "public provenance strategy finalized before stronger package-trust claims"
      ],
      "notes": "@starkscan/mcp 0.3.0 is published on latest and pins the matching CLI so the typed address-activity and token-holder contracts stay coherent. It advertises wallet_asset_discovery, wallet_state, token_holder_screening, and token_holders, and no longer advertises address_token_holdings. Coordinated release run 32634641511 verified registry tags, clean install, print-config/tools behavior, request IDs, and hosted MCP smoke.",
      "packageTrust": {
        "package": "@starkscan/mcp",
        "channel": "latest",
        "targetVersion": "0.3.0",
        "currentPublicVersion": "0.3.0",
        "npm": "https://www.npmjs.com/package/@starkscan/mcp",
        "source": "https://starkscan.co/docs/build/package-trust",
        "socket": "https://socket.dev/npm/package/@starkscan/mcp",
        "controls": [
          "public scoped package under the @starkscan npm org",
          "public package trust source lives at https://starkscan.co/docs/build/package-trust",
          "repository metadata points at the checked-in private repository URL string for npm Trusted Publishing publisher matching",
          "exact dependency pin to the matching @starkscan/cli package version",
          "packaged launcher smoke before publish",
          "secret-redaction tests for API-key bearing env and URLs",
          "post-publish dist-tag verifier must confirm latest resolves to 0.3.0",
          "post-publish unauthenticated error-path smoke confirms request IDs use starkscan-cli- and never the legacy request-id prefix",
          "post-publish print-config/tools smoke against the default hosted endpoint",
          "authenticated doctor smoke against the default hosted endpoint remains a per-client scoped-key check",
          "tokenless publish through configured npm Trusted Publishing; CI publish uses OIDC with NPM_CONFIG_PROVENANCE=false",
          "Socket package monitoring candidate; do not treat it as a formal certification"
        ]
      }
    }
  ],
  "onePointZeroContract": {
    "status": "draft-for-1.0",
    "currentPublicLine": "0.3.x",
    "targetMajor": "1.0",
    "scope": [
      "@starkscan/sdk public TypeScript exports",
      "@starkscan/cli public command surface",
      "@starkscan/mcp launcher and advertised MCP tools",
      "shared auth, base URL, request-id, rate-limit, retry, and error-envelope behavior"
    ],
    "stabilityStates": {
      "stable": "Semver-protected after 1.0. Removing, renaming, changing required inputs, or weakening response/error envelopes requires a major version.",
      "beta": "Supported for named clients or documented beta workflows, but not part of the 1.0 stable compatibility promise until promoted.",
      "experimental": "Visible or exported for advanced use, but may change in minor versions and must not be used for unattended production without a separate agreement.",
      "maintainer-only": "Internal release or diagnostic surface. Not a public package contract.",
      "deprecated": "Still callable in the current line but scheduled for removal under the deprecation policy."
    },
    "semverPolicy": {
      "before1_0": "0.2.x may add fields, helpers, commands, and tools in minor releases. Breaking removals should still be avoided for stable-labeled package surfaces and must be called out in release notes; unsafe beta semantics may be retired with a fail-loud migration contract.",
      "after1_0Stable": "Stable SDK exports, CLI commands, MCP launcher behavior, advertised stable MCP tools, auth/env names, request-id access, rate-limit headers, and documented error classes follow semantic versioning.",
      "nonBreakingExamples": [
        "adding optional response fields",
        "adding optional request parameters with defaults",
        "adding a new beta helper, CLI command, or MCP tool",
        "widening a documented enum while preserving old values"
      ],
      "breakingExamples": [
        "removing or renaming a stable helper, command, tool, env var, or package entrypoint",
        "changing a stable method from optional auth to required auth or changing required scopes without a major version",
        "changing JSON output shape so a documented stable field disappears or changes type",
        "removing request-id or rate-limit header exposure from stable error paths"
      ]
    },
    "deprecationPolicy": {
      "stableSurface": "Give at least one minor release with documentation and runtime/help text before removal, unless the old behavior is a security risk.",
      "betaSurface": "Prefer one minor release notice when practical; faster changes are allowed when evidence shows the beta contract is wrong or unsafe.",
      "experimentalSurface": "Can change without a formal deprecation window, but release notes must state the change when user-visible.",
      "legacyCompatibility": "Hidden compatibility shims are not promoted to public contracts by their existence. Do not list hidden aliases in tools/list or public docs."
    },
    "supportedRuntimeContract": {
      "node": "Node.js 20 or newer for package consumers; release validation should also cover the current Node LTS used by the docs/package workspace.",
      "moduleSystem": "ESM import for @starkscan/sdk; CLI and MCP launchers execute through npx/npm package bins.",
      "packageManagers": [
        "npm",
        "pnpm",
        "bun"
      ],
      "cliNativePlatforms": [
        "darwin-aarch64",
        "darwin-x86_64",
        "linux-aarch64",
        "linux-x86_64"
      ],
      "unsupported": [
        "running CLI or MCP launcher with elevated OS privileges",
        "using prerelease dist-tags in unattended production without an allowlist"
      ]
    },
    "conformanceMatrix": {
      "defaultInstall": [
        "npm dist-tag verifier: @starkscan/sdk, @starkscan/cli, and @starkscan/mcp latest resolve to the intended stable train",
        "SDK: clean install, Node ESM import, createStarkscanClient, public status smoke, request-id/error access",
        "CLI: npx -y @starkscan/cli doctor, status, auth failure shape, JSON output, request-id prefix",
        "MCP: npx -y @starkscan/mcp print-config, tools/list, hosted HTTP headers, stdio newline framing where applicable"
      ],
      "exactPin": [
        "repeat SDK, CLI, and MCP smoke on @starkscan/*@<exact-version> before unattended customer rollout",
        "MCP exact pin must depend on the matching @starkscan/cli exact version",
        "rollback must pin the previous known-good exact version and rerun the same smoke set"
      ],
      "sharedAssertions": [
        "STARKSCAN_BASE_URL is optional for hosted production defaults and only needed for preview or self-hosted hosts",
        "STARKSCAN_API_KEY is read from the environment or explicit client config, never from docs examples",
        "401/403/429/503 preserve machine-readable error bodies and request IDs where the route returns a body",
        "429 and 503 honor Retry-After where present"
      ]
    },
    "clients": {
      "sdk": {
        "package": "@starkscan/sdk",
        "entrypoint": "webapp/packages/sdk/src/index.ts",
        "stableTopLevelExports": [
          "DEFAULT_STARKSCAN_BASE_URL",
          "StarkscanClient",
          "StarkscanClientOptions",
          "StarkscanStreamRequest",
          "createStarkscanClient",
          "ExplorerApi",
          "ExplorerApiOptions",
          "ExplorerStreamRequest",
          "createExplorerApi",
          "HttpClient",
          "HttpClientOptions",
          "HttpError",
          "AuthError",
          "RateLimitError",
          "ValidationError",
          "ServerError",
          "RedirectError",
          "HttpTimeoutError",
          "ResponseFormatError",
          "ResponseSizeError",
          "QueryParams",
          "QueryValue",
          "RetryDelayFn",
          "JsonResponseContext",
          "JsonResponseValidator",
          "HttpRequestOptions",
          "withQuery",
          "assertAuthConfig",
          "createRequestUrl",
          "resolveRequestHeaders",
          "createHttpClient",
          "DataHonestySignal",
          "DataHonestyLevel",
          "DataHonestyFlag",
          "DataCompletenessSummary",
          "hasMorePages",
          "getLagBlocks",
          "getCompleteness",
          "isExact",
          "L1AcceptedProofView",
          "L1FinalityQuorumView",
          "L1FinalityView",
          "ExplorerStatusView",
          "ExplorerLiveFeedSnapshot",
          "BlockTransactionView",
          "BlockGasPriceView",
          "BlockView",
          "BlockRef",
          "BlockNumberRef",
          "BlockTransactionPage",
          "TransactionReceiptView",
          "TransactionAccountCallView",
          "TransactionLogView",
          "EventDecodingStatus",
          "TransactionPreviewLogView",
          "TokenTransferHistoricalUsd",
          "TransactionTransferView",
          "TransactionDetailView",
          "TransactionPreviewContractCallView",
          "TransactionPreviewView",
          "TransactionPreviewBatchView",
          "TxDetailsRequest",
          "AddressDeploymentProvenanceView",
          "AddressSummaryView",
          "AddressSummaryBatchView",
          "AddressTransactionItem",
          "AddressTransactionPage",
          "AddressActivityItem",
          "AddressActivityPage",
          "AddressTransfersDirection",
          "AddressTransfersRequest",
          "TokenTransferActionKind",
          "TokenTransferActionConfidence",
          "TokenTransferActionContext",
          "GlobalTransferItem",
          "GlobalTransferPage",
          "AddressTokenHoldingItem",
          "AddressTokenHoldingsCompletenessReasonCode",
          "AddressTokenHoldingsCompleteness",
          "AddressTokenHoldingsRequest",
          "AddressTokenHoldingsPageView",
          "AddressTokenHoldingsView",
          "ContractMetadataView",
          "ContractEntrypointItem",
          "ContractEntrypointsView",
          "ContractBlockTag",
          "ContractReadResultView",
          "TokenBalanceOfView",
          "TokenTotalSupplyView",
          "TokenTransferItem",
          "TokenTransferPage",
          "TokenTransfersRequest",
          "SearchBlockItem",
          "SearchTransactionItem",
          "SearchView"
        ],
        "betaTopLevelExports": [
          "BridgeIntentView",
          "MessageCoverageView",
          "MessageItemView",
          "TokenHolderItem",
          "TokenHolderLegacySnapshot",
          "TokenHolderPage",
          "TokenHolderSealedSnapshot",
          "TokenHolderScreeningPage",
          "TokenHolderScreeningSnapshot",
          "TokenHolderSnapshot",
          "ContractEventsRequest",
          "EventDecodedFieldSource",
          "EventDecodedFieldKind",
          "EventDecodedFieldStatus",
          "EventDecodedFieldsUnavailableReason",
          "EventNameUnavailableReason",
          "TokenTransferUsdCoverageSnapshot",
          "TokenTransferUsdUnavailableReason",
          "StakingRatioView",
          "StakingCoverageGap",
          "StakingCoverageView",
          "StakingTokenAmountView",
          "StakingPoolView",
          "StakingRewardView",
          "StakingValidatorView",
          "StakingSummaryPage",
          "StakingValidatorPage",
          "StakingCallPathAvailability",
          "StakingAddressHistoryView",
          "StakingValidatorDetail",
          "StakingDelegatorPage",
          "StakingDelegatorView",
          "StakingActivityView",
          "StakingActivityPage",
          "StakingAddressView",
          "EventDecodedField",
          "ContractEventItem",
          "ContractEventPage",
          "GlobalEventsRequest",
          "GlobalEventItem",
          "GlobalEventPage",
          "ContractTransactionTraceView",
          "WalletAssetDiscoveryScope",
          "WalletAssetDiscoveryMetadataSource",
          "WalletAssetDiscoveryEvidenceTier",
          "WalletAssetDiscoveryEvidenceSource",
          "WalletAssetDiscoveryDeclaredScope",
          "WalletAssetDiscoveryCoverageReasonCode",
          "WalletAssetDiscoveryRequest",
          "WalletAssetDiscoveryMetadataView",
          "WalletAssetDiscoveryEvidenceView",
          "WalletAssetDiscoveryItemView",
          "WalletAssetDiscoveryCoverageView",
          "WalletAssetDiscoveryPageView",
          "WalletStateMode",
          "WalletStateScope",
          "WalletStateBlockPreference",
          "WalletStatePriceStatus",
          "WalletStatePriceReasonCode",
          "WalletStateRequest",
          "CompleteWalletStateRequest",
          "WalletStateAssetView",
          "WalletStateView",
          "CompleteWalletStateView",
          "AddressAttributionProtocolView",
          "AddressActivityCoverageView",
          "AddressIntelligenceItemView",
          "AddressIntelligenceBatchView",
          "ContractVerificationStatus",
          "ContractVerificationView",
    "ContractWritePayloadView",
    "ClassVerificationTier",
    "ClassDirectorySort",
    "ClassInstanceSort",
    "ClassDirectoryItemSource",
    "ClassDirectoryPageSource",
    "ClassDirectoryItemView",
    "ClassDirectoryPageView",
    "ClassInstanceView",
    "ClassInstanceCoverageView",
    "ClassDetailView",
          "PrivacyPoolTvlAsOfView",
          "PrivacyPoolTvlAssetView",
          "PrivacyPoolTvlCoverageView",
          "PrivacyPoolTvlPriceView",
          "PrivacyPoolTvlValuationView",
          "PrivacyPoolTvlView",
          "PrivacyPoolTvlHourlyRequest",
          "PrivacyPoolTvlHourlyAssetView",
          "PrivacyPoolTvlHourlyPointView",
          "PrivacyPoolTvlHourlyCoverageView",
          "PrivacyPoolTvlHourlyFreshnessView",
          "PrivacyPoolTvlHourlyPageView",
          "StrkbtcDirection",
          "StrkbtcShieldEventItem",
          "StrkbtcShieldEventPage",
          "StrkbtcCommitmentItem",
          "StrkbtcCommitmentPage",
          "StrkbtcNullifierItem",
          "StrkbtcNullifierPage",
          "StrkbtcPoolStatusView"
        ],
        "experimentalTopLevelExports": [],
        "stableClientMethods": [
          "withChain",
          "status",
          "block",
          "blockTransactions",
          "transaction",
          "txDetails",
          "addressSummary",
          "addressActivity",
          "addressTransfers",
          "addressTokenHoldings",
          "addressTransactions",
          "contractMetadata",
          "contractEntrypoints",
          "readContract",
          "tokenTotalSupply",
          "tokenBalanceOf",
          "tokenTransfers",
          "search"
        ],
        "betaClientMethods": [
          "tokenHolders",
          "tokenHolderScreening",
          "historicalPricingCoverage",
          "liveFeedSnapshot",
          "liveFeedStreamUrl",
          "liveFeedStreamRequest",
          "transactionTrace",
          "contractEvents",
          "globalEvents",
          "walletAssetDiscovery",
          "walletState",
          "walletStateComplete",
          "addressSummaries",
          "addressIntelligence",
          "contractVerification",
          "buildContractWritePayload",
          "classes",
          "classDetail",
          "privacyPoolTvl",
          "privacyPoolTvlHourly",
          "strkbtcShieldEvents",
          "strkbtcCommitments",
          "strkbtcNullifiers",
          "strkbtcPoolStatus"
        ],
        "experimentalClientMethods": [],
        "stableExplorerApiMethods": [
          "getStatus",
          "getBlock",
          "getBlockTransactions",
          "getTransaction",
          "getTxDetails",
          "getAddressSummary",
          "getAddressActivity",
          "getAddressTransfers",
          "getAddressTokenHoldings",
          "getAddressTransactions",
          "getContractMetadata",
          "getContractEntrypoints",
          "readContract",
          "getTokenTotalSupply",
          "getTokenBalanceOf",
          "getTokenTransfers",
          "search"
        ],
        "betaExplorerApiMethods": [
          "getTokenHolders",
          "getTokenHolderScreening",
          "getLiveFeedSnapshot",
          "getLiveFeedStreamUrl",
          "getLiveFeedStreamRequest",
          "getTransactionTrace",
          "getContractEvents",
          "getGlobalEvents",
          "getWalletAssetDiscovery",
          "getWalletState",
          "getHistoricalPricingCoverage",
          "getStakingSummary",
          "getStakingValidators",
          "getStakingValidator",
          "getStakingDelegators",
          "getStakingActivity",
          "getStakingAddress",
          "getAddressSummaries",
          "getAddressIntelligence",
          "getContractVerification",
          "buildContractWritePayload",
          "getClasses",
          "getClass",
          "getPrivacyPoolTvl",
          "getPrivacyPoolTvlHourly",
          "getStrkbtcShieldEvents",
          "getStrkbtcCommitments",
          "getStrkbtcNullifiers",
          "getStrkbtcPoolStatus"
        ],
        "experimentalExplorerApiMethods": []
      },
      "cli": {
        "package": "@starkscan/cli",
        "stableCommands": [
          "init",
          "doctor",
          "examples",
          "status",
          "search",
          "block",
          "tx",
          "tx-details",
          "address",
          "address-activity",
          "address-transactions",
          "address-attribution",
          "contract-entrypoints",
          "contract-read",
          "token",
          "token-total-supply",
          "token-balance-of",
          "token-transfers",
          "feed",
          "mcp"
        ],
        "betaCommands": [
          "token-holders",
          "token-holder-screening",
          "address-summaries",
          "address-intelligence",
          "wallet-asset-discovery",
          "wallet-state",
          "contract-verification",
          "contract-events"
        ],
        "experimentalCommands": [
          "address-token-holdings"
        ],
        "stableMcpSubcommands": [
          "quickstart",
          "print-config",
          "tools",
          "serve",
          "start"
        ],
        "betaMcpSubcommands": [],
        "experimentalMcpSubcommands": []
      },
      "mcp": {
        "package": "@starkscan/mcp",
        "stableTools": [
          "__starkscan_init__",
          "status",
          "block_detail",
          "block_transactions",
          "tx_detail",
          "address_summary",
          "contract_entrypoints",
          "contract_read",
          "token_total_supply",
          "token_balance_of",
          "address_activity",
          "token_summary",
          "token_transfers",
          "search"
        ],
        "betaTools": [
          "contract_verification",
          "contract_write_payload",
          "wallet_asset_discovery",
          "wallet_state",
          "token_holders",
          "token_holder_screening"
        ],
        "experimentalTools": [],
        "hiddenCompatibilityTools": [
          "__mezcal_init__"
        ]
      }
    }
  }
}
