# info.description
Machine-readable contract for the authenticated Breakout Scanner MCP workspace. Capability schemas are generated from the canonical registry. The public API exposes discovery and MCP transport; it is not a direct database or trade-execution REST API. Versioning policy: stable REST discovery uses the major URL prefix /api/v1; additive fields may be added within v1, while breaking changes require a new major path. v1 is current and is not deprecated. If a stable version is ever deprecated, publish a migration guide and signal it with RFC 9745 Deprecation plus a Link rel=deprecation; announce a dated RFC 8594 Sunset at least 90 days before removal. Pagination policy: this public discovery surface has no unbounded collection endpoint, so pagination is not applicable; responses are bounded and complete, and no offset or cursor parameter is accepted.

# externalDocs.description
Developer portal, client setup, and RFC 9728 protected-resource metadata

# tags[].description
Read-only contract discovery; discovery does not grant access.

# tags[].description
Authenticated Streamable HTTP MCP transport for canonical capabilities.

# tags[].description
Anonymous, deterministic MCP protocol test workspace with no live data or persistence.

# tags[].description
Bounded public NLWeb 0.55 site search; list mode only and no model execution.

# paths./api/v1.get.description
Return links to the canonical capability contract, OpenAPI document, MCP endpoint, and developer guide. This operation is public and read-only.

# paths./api/v1.get.responses.200.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./api/v1.get.responses.200.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./api/v1.get.responses.200.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./api/v1.get.responses.200.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./api/v1.get.responses.200.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./api/v1.get.responses.200.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./api/v1/capabilities.get.description
Return the reviewed, versioned capability contract used by MCP tools/list. It describes available boundaries; entitlement, feature flags, grants, and runtime checks still apply.

# paths./api/v1/capabilities.get.responses.200.description
Canonical capability contract. This bounded registry response is complete; pagination is not applicable.

# paths./api/v1/capabilities/{capability}.get.description
Return one capability's version, bounds, permissions, and input/output schemas. This is a read-only description and never invokes the capability.

# paths./api/v1/capabilities/{capability}.get.responses.404.description
The requested capability is not registered.

# paths./ask.get.summary
Search Breakout Scanner public resources with NLWeb

# paths./ask.get.description
Run the bounded, deterministic NLWeb 0.55 site catalog search. List-mode requests return a typed JSON-LD ItemList by default; set streaming=true for the bounded SSE start/result/complete event stream. This endpoint is public, list-mode only, and does not invoke a model or mutate state.

# paths./ask.get.parameters[].description
NLWeb mode; only list and none are supported.

# paths./ask.get.parameters[].description
Return JSON by default; return an SSE stream when true.

# paths./ask.get.parameters[].description
Official NLWeb alias for max_results. If both are supplied, they must resolve to the same limit.

# paths./ask.get.parameters[].description
Optional bounded caller correlation ID echoed in the response.

# paths./ask.get.responses.200.description
NLWeb JSON-LD ItemList by default, or SSE start/result/complete events when streaming=true.

# paths./ask.get.responses.200.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./ask.get.responses.200.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./ask.get.responses.200.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./ask.get.responses.200.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./ask.get.responses.200.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./ask.get.responses.200.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./ask.get.responses.200.content.text/event-stream.schema.description
NLWeb start, result, and complete events.

# paths./ask.get.responses.413.description
The NLWeb request is larger than the bounded input limit.

# paths./ask.post.summary
Search Breakout Scanner public resources with a structured NLWeb request

# paths./ask.post.description
Accept a bounded NLWeb 0.55 JSON or form request in list mode. Requests return a typed JSON-LD ItemList by default; streaming=true returns start/result/complete SSE events. num_results is accepted as the official alias for max_results; conflicting limits are rejected. The endpoint performs deterministic public catalog matching only.

# paths./ask.post.responses.200.description
NLWeb JSON-LD ItemList by default, or SSE start/result/complete events when streaming=true.

# paths./ask.post.responses.200.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./ask.post.responses.200.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./ask.post.responses.200.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./ask.post.responses.200.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./ask.post.responses.200.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./ask.post.responses.200.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./ask.post.responses.200.content.text/event-stream.schema.description
NLWeb start, result, and complete events.

# paths./ask.post.responses.413.description
The NLWeb request is larger than the bounded input limit.

# paths./mcp.post.summary
Send one authenticated MCP JSON-RPC request

# paths./mcp.post.description
Use Streamable HTTP with OAuth 2.1 + PKCE for an eligible Pro account and a user-approved connection. `tools/list` exposes the canonical capabilities; `tools/call` invokes one capability after server-side entitlement, grant, input, evidence, and approval checks. Write tools propose changes and never become direct CRUD or trading endpoints.

# paths./mcp.post.parameters[].description
Optional UUID-shaped key. Supply a stable key when retrying a write proposal so the server can replay the same approval journal entry; absent read keys are safely generated per call and absent write keys use a deterministic request-derived key. Never reuse a key for a different capability or input.

# paths./mcp.post.parameters[].description
MCP protocol version negotiated by the client.

# paths./mcp.post.responses.200.description
JSON-RPC result or a negotiated event stream.

# paths./mcp.post.responses.200.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./mcp.post.responses.200.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./mcp.post.responses.200.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./mcp.post.responses.200.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./mcp.post.responses.200.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./mcp.post.responses.200.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./mcp.post.responses.400.description
The JSON-RPC envelope or capability input is invalid.

# paths./mcp.post.responses.400.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./mcp.post.responses.400.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./mcp.post.responses.400.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./mcp.post.responses.400.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./mcp.post.responses.400.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./mcp.post.responses.400.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./mcp.post.responses.401.description
OAuth authentication is required or the token is invalid.

# paths./mcp.post.responses.401.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./mcp.post.responses.401.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./mcp.post.responses.401.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./mcp.post.responses.401.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./mcp.post.responses.401.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./mcp.post.responses.401.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./mcp.post.responses.403.description
The connection lacks the required product grant.

# paths./mcp.post.responses.403.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./mcp.post.responses.403.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./mcp.post.responses.403.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./mcp.post.responses.403.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./mcp.post.responses.403.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./mcp.post.responses.403.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./mcp.post.responses.409.description
The idempotency key conflicts with a different request.

# paths./mcp.post.responses.409.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./mcp.post.responses.409.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./mcp.post.responses.409.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./mcp.post.responses.409.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./mcp.post.responses.409.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./mcp.post.responses.409.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./mcp.post.responses.429.description
The MCP request rate limit was exceeded.

# paths./mcp.post.responses.429.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./mcp.post.responses.429.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./mcp.post.responses.429.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./mcp.post.responses.429.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./mcp.post.responses.429.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./mcp.post.responses.429.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./mcp.post.responses.500.description
The MCP transport failed without exposing operational details.

# paths./mcp.post.responses.500.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./mcp.post.responses.500.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./mcp.post.responses.500.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./mcp.post.responses.500.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./mcp.post.responses.500.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./mcp.post.responses.500.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./mcp.post.responses.503.description
Authentication or the MCP runtime is temporarily unavailable.

# paths./mcp.post.responses.503.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./mcp.post.responses.503.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./mcp.post.responses.503.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./mcp.post.responses.503.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./mcp.post.responses.503.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./mcp.post.responses.503.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./mcp/sandbox.post.summary
Exercise MCP without authentication or a budget

# paths./mcp/sandbox.post.description
Anonymous, stateless Streamable HTTP MCP sandbox. Send initialize, ping, tools/list, resources/list, resources/read, or tools/call JSON-RPC messages. It exposes only market.snapshot and watchlist.change using deterministic fixtures as of 2026-08-22T16:00:00.000Z; the read tool has an optional MCP Apps ui:// view, while the write tool returns a simulated proposal/receipt and never invokes production approval, persistence, live data, models, or workspace mutation.

# paths./mcp/sandbox.post.parameters[].description
MCP protocol version. The sandbox supports 2025-11-25 and 2025-06-18 and responds with the negotiated version.

# paths./mcp/sandbox.post.responses.200.description
JSON-RPC initialize, ping, tools/list, or tools/call response.

# paths./mcp/sandbox.post.responses.200.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./mcp/sandbox.post.responses.200.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./mcp/sandbox.post.responses.200.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./mcp/sandbox.post.responses.200.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./mcp/sandbox.post.responses.200.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./mcp/sandbox.post.responses.200.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./mcp/sandbox.post.responses.400.description
The sandbox JSON or JSON-RPC envelope is invalid.

# paths./mcp/sandbox.post.responses.400.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./mcp/sandbox.post.responses.400.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./mcp/sandbox.post.responses.400.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./mcp/sandbox.post.responses.400.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./mcp/sandbox.post.responses.400.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./mcp/sandbox.post.responses.400.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./mcp/sandbox.post.responses.405.description
The sandbox execution transport accepts POST for JSON-RPC; GET is reserved for discovery.

# paths./mcp/sandbox.post.responses.405.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./mcp/sandbox.post.responses.405.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./mcp/sandbox.post.responses.405.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./mcp/sandbox.post.responses.405.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./mcp/sandbox.post.responses.405.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./mcp/sandbox.post.responses.405.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./mcp/sandbox.post.responses.413.description
The sandbox request exceeds its 64 KiB body limit.

# paths./mcp/sandbox.post.responses.413.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./mcp/sandbox.post.responses.413.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./mcp/sandbox.post.responses.413.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./mcp/sandbox.post.responses.413.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./mcp/sandbox.post.responses.413.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./mcp/sandbox.post.responses.413.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./mcp/sandbox.post.responses.415.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./mcp/sandbox.post.responses.415.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./mcp/sandbox.post.responses.415.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./mcp/sandbox.post.responses.415.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./mcp/sandbox.post.responses.415.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./mcp/sandbox.post.responses.415.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./mcp/sandbox.post.responses.429.description
The anonymous sandbox rate limit was exceeded.

# paths./mcp/sandbox.post.responses.429.headers.RateLimit.description
Current quota state as an HTTP Structured Field: limit, remaining, and reset seconds.

# paths./mcp/sandbox.post.responses.429.headers.RateLimit-Policy.description
Current quota policy as an HTTP Structured Field.

# paths./mcp/sandbox.post.responses.429.headers.RateLimit-Limit.description
Compatibility quota limit for the active 60-second window.

# paths./mcp/sandbox.post.responses.429.headers.RateLimit-Remaining.description
Requests remaining in the active 60-second window.

# paths./mcp/sandbox.post.responses.429.headers.RateLimit-Reset.description
Seconds until the active rate-limit window resets.

# paths./mcp/sandbox.post.responses.429.headers.Retry-After.description
Seconds to wait before retrying a rate-limited request.

# paths./mcp/sandbox.get.description
Read the anonymous sandbox discovery card. This is a discovery-only GET; it never opens a session, reads live data, or executes a tool. Use POST for JSON-RPC protocol messages.

# components.securitySchemes.openIdConnect.description
OpenID Connect discovery for the OAuth identity provider. The endpoint redirects to the configured provider when OAuth is enabled.

# components.securitySchemes.oauth2.description
OAuth 2.1 Authorization Code + PKCE. Discover the provider through https://breakoutscanner.com/.well-known/oauth-authorization-server; the MCP resource metadata is defined by RFC 9728.

# components.securitySchemes.oauth2.flows.authorizationCode.scopes.email
Read the authenticated email identity used to bind this client.

# components.securitySchemes.oauth2.flows.authorizationCode.scopes.openid
Use OpenID Connect identity for the authenticated MCP connection.

# components.securitySchemes.oauth2.flows.authorizationCode.scopes.profile
Read the authenticated profile identity used by the connection.

# components.schemas.Problem.properties.code.description
Stable machine-readable application error code.

# components.schemas.Problem.properties.requestId.description
Correlation ID; use it when contacting support.

# components.schemas.McpJsonRpcRequest.properties.id.description
Client correlation ID; it may be a string or number.

# components.schemas.McpJsonRpcRequest.properties.method.description
MCP method, such as initialize, tools/list, or tools/call.

# components.schemas.NlwebAskRequest.properties.streaming.description
Return JSON by default; set true for the bounded SSE start/result/complete stream.

# components.schemas.NlwebAskRequest.properties.num_results.description
Official NLWeb alias for max_results. If both are supplied, they must resolve to the same limit.

# components.schemas.NlwebAskRequest.properties.query_id.description
Optional caller correlation ID; control characters are rejected.

# components.schemas.NlwebAskRequest.properties.prefer.properties.streaming.description
Return JSON by default; set true for the bounded SSE start/result/complete stream.

# components.schemas.NlwebAskDocument.properties.query_id.description
Caller-supplied correlation ID when provided, otherwise a server-generated UUID.

# components.schemas.strategy_compile_input.properties.baseStrategy.description
A JSON value validated by the product document contract.

# components.schemas.screen_evaluate_input.properties.strategy.description
A JSON value validated by the product document contract.

# components.schemas.backtest_run_input.properties.strategy.description
A JSON value validated by the product document contract.

# components.schemas.screener_save_input.properties.strategy.description
A JSON value validated by the product document contract.

# x-breakoutscanner-capabilities.entity.resolve.description
Resolve a user-supplied symbol, company, or account reference to an owned canonical identifier. This is invoked as an MCP tools/call; it is not a REST or direct database endpoint.

# x-breakoutscanner-capabilities.strategy.compile.description
Compile a bounded natural-language strategy into the validated StrategySpec contract. This is invoked as an MCP tools/call; it is not a REST or direct database endpoint.

# x-breakoutscanner-capabilities.screen.evaluate.description
Evaluate a validated strategy against the permitted live market universe. This is invoked as an MCP tools/call; it is not a REST or direct database endpoint.

# x-breakoutscanner-capabilities.signals.query.description
Query stored market signals over an explicit date range and bounded universe. This is invoked as an MCP tools/call; it is not a REST or direct database endpoint.

# x-breakoutscanner-capabilities.market.snapshot.description
Read a bounded, as-of market snapshot for resolved symbols. This is invoked as an MCP tools/call; it is not a REST or direct database endpoint.

# x-breakoutscanner-capabilities.backtest.run.description
Run the deterministic historical evaluator for a validated strategy and bounded date range. This is invoked as an MCP tools/call; it is not a REST or direct database endpoint.

# x-breakoutscanner-capabilities.candidates.rank.description
Rank only the candidates contained in a prior immutable candidate artifact. This is invoked as an MCP tools/call; it is not a REST or direct database endpoint.

# x-breakoutscanner-capabilities.company.compare.description
Compare a bounded set of resolved companies using permitted fields. This is invoked as an MCP tools/call; it is not a REST or direct database endpoint.

# x-breakoutscanner-capabilities.account.read.description
Read one explicitly selected, owner-scoped account resource. This is invoked as an MCP tools/call; it is not a REST or direct database endpoint.

# x-breakoutscanner-capabilities.knowledge.retrieve.description
Retrieve bounded, cited excerpts from the user's explicitly stored knowledge. This is invoked as an MCP tools/call; it is not a REST or direct database endpoint.

# x-breakoutscanner-capabilities.screener.save.description
Propose saving one validated strategy as a named screener after explicit user approval. This is invoked as an MCP tools/call; it is not a REST or direct database endpoint.

# x-breakoutscanner-capabilities.watchlist.change.description
Propose one bounded change to a user-owned watchlist after explicit approval. This is invoked as an MCP tools/call; it is not a REST or direct database endpoint.

# x-breakoutscanner-capabilities.portfolio.change.description
Propose a bounded lifecycle change to user-owned portfolio positions after explicit approval. This is invoked as an MCP tools/call; it is not a REST or direct database endpoint.

# x-breakoutscanner-capabilities.alert.configure.description
Propose enabling or disabling email alerts for one registered screener after explicit approval. This is invoked as an MCP tools/call; it is not a REST or direct database endpoint.

# x-breakoutscanner-capabilities.briefing.schedule.description
Propose creating, editing, pausing, resuming, or deleting one user-owned briefing after explicit approval. This is invoked as an MCP tools/call; it is not a REST or direct database endpoint.

# x-breakoutscanner-sandbox.limitations[]
Demo fixtures only; no live market data or external network calls.

# x-breakoutscanner-sandbox.limitations[]
No authentication, account context, user state, persistence, or model budget is used.

# x-breakoutscanner-sandbox.limitations[]
Write calls return simulated proposals and receipts only; nothing is submitted for approval or applied.

# x-breakoutscanner-rate-limit.note
Public /api/v1 discovery responses enforce 120 requests per client IP per 60 seconds and expose RateLimit/RateLimit-Policy plus compatibility fields. The authenticated MCP transport supplies its own RateLimit-* and Retry-After values; clients must treat each surface's quota independently.

# x-breakoutscanner-versioning.breakingChangeRule
Breaking request or response changes require a new major URL prefix.

# x-breakoutscanner-versioning.deprecationSignal
RFC 9745 Deprecation response header plus Link rel=deprecation and migration documentation.

# x-breakoutscanner-versioning.sunsetSignal
RFC 8594 Sunset response header announced at least 90 days before removal.

# x-breakoutscanner-pagination.reason
The public v1 surface is discovery-only and exposes bounded complete registry documents, not unbounded collections.