Repository navigation
docs(adr): ADR-0097 "Upstream availability" states the mcp credential-rejection carve-out (fatal configuration fault, never retried) - #26985
Conversation
…ial-rejection carve-out Append-only amendment note under "Upstream availability": a credential the MCP server rejects (HTTP 401 / 403 on connect, handshake or tools/list) is a fatal configuration fault, never upstream-unavailable and never retried, as the mcp provider has classified it since the connector load-faults change. The sentence itself is not rewritten; the header's Amended-by line gains the matching entry. Claude-Session: https://claude.ai/code/session_01ADHkmSPesP5MpCBMrkkQw5 Co-authored-by: Claude <noreply@anthropic.com>
席位核对ACCEPT ·
|
Contract reviewServed-tier: Director seat (summon #52, ledger objectstack#12708), summoned by the ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Implemented-by: VERDICT: PASS Generated by Claude Code |
Requested by Steve · project thread
Fixes #26809
Clause-②: no
Metadata-protocol: none
维护者速读
tools/list收到 HTTP 401 / 403)是配置错误——启动即失败、reload 时跳过、不重试;原句不改。文件头**Amended by**行同步补一条目。includeand a loud Swagger 2.0 refusal for connector-openapi;tools/listpagination, fatal 401 and a tool-snapshot hash for connector-mcp; an offline spec-normalization tool #26709 第 3(b) 项)已让mcpprovider 这样分类,但 ADR 原句仍说「所有 connect /tools/list失败都归为 unavailable(降级重试)」。读 ADR 的 agent / 运维会得出「凭据错了会自动重试」的错误结论,而运行时实际直接拒绝启动。docs/adr/0097-declarative-connector-instances.md一个文件、+20/-1 行,不发布、无 changeset。回滚即 revert 本 PR。docs/adr/0097-declarative-connector-instances.md的修订注(「Upstream availability」节mcp段落之后),再看第 8 行**Amended by**新条目。pnpm check:adr-symbol-anchors && pnpm check:adr-index,预期两者绿;git grep -n "classifies connect" -- docs/adr/0097*仍恰好 1 处(原句未动)。docs/adr/**受管面 Tier H,席位不 ready / 不 arm / 不入队)。What changes
One file,
docs/adr/0097-declarative-connector-instances.md:mcpprovider classifies connect /tools/listfailures as unavailable. The note states the one exception past transport validation: a credential the MCP server rejects (HTTP 401 / 403 on connect, handshake ortools/list) is a configuration fault, thrown plain — fatal at boot, a skipped entry on reload, neverCONNECTOR_UPSTREAM_UNAVAILABLE, never retried — on the fatal side of the section's own split beside an unresolvablecredentialRefand theopenapiprovider's non-retryable4xxon its spec fetch. It says why (retrying cannot make a wrong, missing or under-scoped credential valid; a degraded instance retried with backoff reads as "server down") and how the rejection is told apart (the MCP SDK's ownStreamableHTTPError401 / 403 orUnauthorizedErrorin thecausechain; a JSON-RPC error merely carrying code 401 stays operational). The original sentence is not rewritten (AGENTS.md Prime Directive 13).**Amended by**line pointing at that note, so a reader of the header learns where the record was amended, as it already does for ADR-0143.Every claim in the note is read off
origin/main, not invented: the classification and its reason frompackages/connectors/connector-mcp/src/mcp-provider.ts#credentialRejectionStatusand#createMcpProviderFactory(the catch branch and its docblock), the "skipped on reload" half from this ADR's own "Runtime reconcile" section, and the real-server pin frompackages/connectors/connector-mcp/src/mcp-http-discovery-faults.test.ts(credential rejection — real Streamable-HTTP server: 401 and 403 throw plain and are sent once; a declarative instance answered 401 failskernel.bootstrap()with no degraded reason and no retry).Anchors are
path#symbolas the ADR symbol-anchor gate requires (nofile:line). The note cites #26709 item 3(b) and PR #26798 as the card asks.Tests
No code changes, no tests added or edited. No forced test edits.
Acceptance notes
includeand a loud Swagger 2.0 refusal for connector-openapi;tools/listpagination, fatal 401 and a tool-snapshot hash for connector-mcp; an offline spec-normalization tool #26709 item 3(b) and the PR"; the note's heading carries both, matching this file's existingAmendment note (date, source)convention and ADR-0092 / ADR-0099's non-ADR amendment notes.Amendedentry if the file's convention has one". This file's convention is the**Amended by**:header line (ADR-0005 carries several comma-separated entries there); the**Status**:line itself is untouched, socheck:adr-indexstill reads the record asAccepted(the index reads the status keyword earliest in that line, andAmendedis in its vocabulary — adding it to the Status line could have re-keyed the record).skills/**is not touched: no skill page teaches theopenapiormcpprovider (PR fix(connectors)!: refuse a non-3.x OpenAPI document at load; mcp tools/list follows nextCursor and a 401/403 is a fatal configuration fault #26798's body measured 0 hits for the provider spellings underskills/), so no skill text owes a mirror of this note.docs/adr/**is on the changeset fast lane): no changeset;skip-changesetis declared on thepr_createstroke.Verification
Head
f15b7824(worktreeobjectstack-issue-26809, baseorigin/main7bb8084, merge base 7bb8084).Derived gates — node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (21 commands) and --ran reconciliation
Tier (dispatch-gates --tier)
Not built, not tested locally: the diff touches no package (local verification scope ① / ② are empty);
pnpm lintand every whole-tree family are CI's — see this PR's check-runs.Human Minimum
packages/specholds no runtime logic. (no code change)pnpm lintis CI's (no lintable file changed).main, one pull request.skip-changeset; both declaration lines are above.packages/spectouched: n/a.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.Card thread:
session_01ADHkmSPesP5MpCBMrkkQw5, dispatched bydomain:skills#1(session_01ADHkmSrRBdu9MdC6fc33Uu).🤖 Generated with Claude Code
https://claude.ai/code/session_01ADHkmSPesP5MpCBMrkkQw5
Generated by Claude Code