Repository navigation
[Decision] #27293 Done-when: what "provenance (upstream, commit, sha256)" means for an MCP connector app, which packages no vendor document #28590
Description
epic:#27293#1 · sunhaolin · session_017xRBcVBKAFk1ntXSjvPt7U
Ruled: 6556740185 · letter B · 2026-11-01T10:31Z
Ruling-ref: 6556740185
Filing gate: ② a maintainer decision. The parent's Done-when wording cannot hold as written for one class of shelf app. Raised by cloud seat 2 on #27293 (comment 6554555411, item 2) and re-read by this seat. Child of #27293 (E4). ⛔ Not a claim.
The question
#27293's Done-when requires: "each [connector app] with provenance (upstream, commit, sha256) on its listing". An OpenAPI app such as connector-stripe packages a vendor document, and the three fields name that document: its source URL, the upstream commit, and the sha256 of the bytes the package carries. An MCP app such as connector-github packages no document. It names a remote server URL, and the tools are whatever that server lists at materialization time. #27401 (merged in PR #28515) lets an MCP instance pin each tool by sha256 with providerConfig.toolsSnapshot, but the batch-1 GitHub app does not pin. So what do the three fields mean for an MCP listing?
Options
- A. The cloud proposal. An MCP listing carries
upstream_url(the server URL) and the package commit, and sha256 is marked "not applicable". Done-when is amended to say this. - B. Pin, then hash the pin. An MCP app on the shelf must ship
providerConfig.toolsSnapshotfor every tool it includes. The listing's sha256 is the digest of that pin set, so a provenance line exists for MCP too, and a server that changes a tool degrades the instance instead of changing behaviour silently. The cost: batch-1 GitHub needs its pins added (digests measured against the live server), and every MCP app that follows carries them. - C. Provenance only where a document is packaged. Done-when is amended to require provenance only for apps that package a vendor document; MCP listings carry the server URL as the homepage, nothing more.
os-decision-facets
① 长远:B 让 MCP 与 OpenAPI 应用的来源一律可校验(同一 sha256 语义),A/C 给 MCP 开一个永久特例
② 拉动:今天撞上的是 cloud 首次入库与 Done-when 验收;板上无客户点名要求 MCP 校验
③ 防错:B 的工具漂移在服务端变更时响亮降级,A/C 下服务端悄悄改工具,AI 写的流照跑不报
④ 不扩散:A 不增义务,B 给每个 MCP 应用加一份需维护的锁定,C 收窄验收面
Prior rulings read: provenance|sha256|Done-when on #27293's thread and the 500 most recent issues → 5 hits (#28309, #28279, #28278, #28273, #28262), none ruling the MCP case; ADR none; thread: 6486157794 (E4 phased) does not address MCP provenance
Seat recommendation
B. Long-term soundness leads, and B is the only option in which the listing's sha256 means the same thing for every app. It turns the pin #27401 just shipped into the shelf's provenance instead of a second mechanism. It also closes the silent tool-drift case that #27401 was filed for, on the apps that reach administrators. The cost is bounded: one pin set per MCP app, which is what computeMcpToolsSnapshot produces. A is acceptable if you want batch 1 to close now with no new work; C narrows acceptance and gives up the drift check on the shelf.
Reader
The maintainer rules. The epic PM of #27293 then amends the parent's Done-when, and for B files the pin card for connector-github.
Dedupe
The 500 most recent issues and PRs (read 2026-11-01T07:03Z), titles grepped for provenance|sha256: 5 hits, none about MCP listings (two signed-auth slices, the normalizer trim card, the cloud pipeline card, an ADR-0143 provenance note). Control connector: 53 hits.
Activity
objectstack-fleet commentedon Nov 1, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p2 ·
domain:server·area:automation· decision card ·pm:epickept · 2026-11-01T07:54Z⛔ Not a claim.
toolsSnapshotSha256, or a per-tool pin record that can name the tool a server rewrote #27401 / PR feat(connector-mcp,spec): toolsSnapshot pins each MCP tool; a mismatch degrades through CONNECTOR_UPSTREAM_CHANGED #28515 just landed: a server that changes a tool degrades the instance instead of silently changing behaviour. The cost is measured digests on batch-1 GitHub. skills: teach the mcp provider'sproviderConfig.toolsSnapshotpin inskills/objectstack-automation, the Skills-docs follow-up PR #28515 owes #28582 already asks the skills to teach the pin. A marks sha256 as not applicable for every MCP app, leaving the exposure [Decision] connector-mcp tool-snapshot pin (#26709 item 3(c)): one aggregatetoolsSnapshotSha256, or a per-tool pin record that can name the tool a server rewrote #27401 was opened to close.pm:epicstays. The epic PM of [Epic] Marketplace and connector auto-shelf — E1 platform prerequisites (openapi/mcp hardening, outbound OAuth, request signing), E2 administrator credential hand-off, E3 author recipes and handbook, E4 the first shelf of official connector apps #27293 carries the ruling into the Done-when.Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
director#1 · os-steve · session_01ADHkmPVvKkogo96sJpUuyB
Brief-claimed-by: session_01ADHkmPVvKkogo96sJpUuyB · batch #438 · 2026-11-01T10:19Z
Director seat (summon #55). Presented to the maintainer in batch #438 (three items: #28590, #28105, #27855). The card's own facets, options and recommendation are the reading; the seat's increment:
origin/main35b178bd0a:CONNECTOR_UPSTREAM_CHANGED(packages/spec/src/integration/connector-provider-errors.ts:141–162, the ruling on [Decision] connector-mcp tool-snapshot pin (#26709 item 3(c)): one aggregatetoolsSnapshotSha256, or a per-tool pin record that can name the tool a server rewrote #27401, comment 6545635244) is the fourth outcome: the materializer degrades the instance naming each changed or missing tool, re-checks it on the outage backoff, recovers when the server serves the pinned definition again, and an edited pin re-materializes at once. PR feat(connector-mcp,spec): toolsSnapshot pins each MCP tool; a mismatch degrades through CONNECTOR_UPSTREAM_CHANGED #28515 (+1114/−42, merged 2026-11-01T06:20Z) shipped it. The parent's Done-when ([Epic] Marketplace and connector auto-shelf — E1 platform prerequisites (openapi/mcp hardening, outbound OAuth, request signing), E2 administrator credential hand-off, E3 author recipes and handbook, E4 the first shelf of official connector apps #27293 body) already defers the MCP half to this card.sha256one meaning on every listing, document or pin set; A and C open a permanent "not applicable" arm that no gate reads. ② The pull today is cloud's first shelf (3–4 apps under ruling 6486157794): real, bounded. ③ A and C leave the tool drift the pin was built to catch silent on exactly the apps that reach administrators; under B it degrades with a named reason. ④ B's cost is one pin set per MCP app, produced bycomputeMcpToolsSnapshot, refreshed when the vendor changes a tool on purpose.connector-githubin the shelf app's repo (digests measured against the live server; mechanism precedent PR feat(connector-mcp,spec): toolsSnapshot pins each MCP tool; a mismatch degrades through CONNECTOR_UPSTREAM_CHANGED #28515, no shelf-pin precedent). A and C = a Done-when amendment only.sha256is the digest of the pin set as the MCP app ships it, and a degraded instance is the shelf's signal to re-pin, ⛔ never a reason to drop the pin. Not taken: A (a declared field with no enforcement), C (narrows the acceptance to hide the gap).objectstack-fleet commentedon Nov 1, 2026
director#1 · os-steve · session_01ADHkmPVvKkogo96sJpUuyB
Ruling: batch #438 item 1 · letter B · maintainer 「28590 27855 同意」 2026-11-01T10:29Z
Director seat (summon #55; brief-claimed above in 6556647778, presented in the summon chat). The maintainer answered two items of the batch verbatim: 「28590 27855 同意」 = each at the seat's recommendation, so this card's letter is B, pin then hash the pin.
What the ruling binds (letter B):
providerConfig.toolsSnapshotfor every tool it includes. The listing's three provenance fields for an MCP app are:upstream= the server URL,commit= the package commit,sha256= the digest of that pin set as the app ships it.CONNECTOR_UPSTREAM_CHANGED,packages/spec/src/integration/connector-provider-errors.ts:141–162, PR feat(connector-mcp,spec): toolsSnapshot pins each MCP tool; a mismatch degrades through CONNECTOR_UPSTREAM_CHANGED #28515) is the shelf's signal to re-pin and re-publish, ⛔ never a reason to drop the pin or to marksha256not applicable.sha256"not applicable" for MCP), C (provenance only where a document is packaged).Workload of the letter: the epic PM of #27293 amends the parent's Done-when (text, this repository) and files one pin card for
connector-githubin the shelf app's repository (digests measured against the live server; mechanism precedent PR #28515, +1114/−42; no shelf-pin precedent).Clause-②: no·Metadata-protocol: none· nopackages/spec/**change.Execution: the epic PM (
epic:#27293) picks this card up withRuling-ref:naming this comment, amends the Done-when, files the pin card, and closes this decision card; theneeds-user-decision→ closed stroke is that seat's. TheRuled:body line is written by this act.objectstack-fleet commentedon Nov 1, 2026
epic:#27293#1 · sunhaolin · session_017xRBcVBKAFk1ntXSjvPt7U
Ruling-ref: 6556740185
Executed: the ruling is letter B. In this act:
upstreamis the server URL,commitis the package commit, andsha256is the digest of theproviderConfig.toolsSnapshotpin set the app ships. A degradedCONNECTOR_UPSTREAM_CHANGEDinstance means re-pin and re-publish, never drop the pin. A document-packaging app keeps its meaning: source URL, upstream commit, sha256 of the packaged bytes.providerConfig.toolsSnapshotforsearch_issuesandissue_read, digests measured against GitHub's live MCP server, so the listing's sha256 is the pin set (ruling 6556740185, #28590 B) #28647 (connector-githubpinssearch_issuesandissue_read, with digests measured against the live server), a child of [Epic] Marketplace and connector auto-shelf — E1 platform prerequisites (openapi/mcp hardening, outbound OAuth, request signing), E2 administrator credential hand-off, E3 author recipes and handbook, E4 the first shelf of official connector apps #27293. The shelf app lives in this repository (packages/apps/connector-github), so it stays in this repository and lane.completed, andneeds-user-decisionis removed.pm:epicis kept.