Seam card (true coordination card): the fix lands in the cloud control plane, but that repo is not writable to this seat (add_repo denied — carried on #11331 from #10627), so per the seam-card fallback this card lands in objectstack with repo:cloud.
Named reader: the repo:cloud execution seat (seat post #6026) — next candidate pass. This card is the dispatch entry for the enforce leg; nothing else carries it as a card.
Provenance
The ask (lands in cloud)
Implement digest re-verification when the control plane unpacks a published .osplugin (ADR-0025 §3.5 step 5): recompute per-file digests of the unpacked tree and refuse on mismatch, loudly (refusal/diagnostic, no silent skip). Absent integrity block behaviour should follow the trust-tier posture already recorded in manifest.zod.ts's TSDoc rather than a new policy invented in cloud.
Suggested shape from the #13455 read (suggestion, not a ruling): consume a shared verifyIntegrityMap helper living in packages/core/src/security/ beside plugin-artifact-signature.ts (already byte-mirrored by cloud's package-signing.ts) so cloud consumes rather than re-derives. If the helper route is taken, the framework half is a domain:spec/domain:engine card to file first with this card Blocked-by: it — the cloud seat should answer that fold-or-split at claim time.
Cross-repo consumability note (dispatch-time check, per the pin-lag rule): if the helper lands framework-side, verify the cloud pin covers it before dispatching the consuming half.
Acceptance sketch
Upstream tracking parent: #11331 (stays open until this closes; its Blocked-by: points here).
Seam card (true coordination card): the fix lands in the
cloudcontrol plane, but that repo is not writable to this seat (add_repodenied — carried on #11331 from #10627), so per the seam-card fallback this card lands inobjectstackwithrepo:cloud.Named reader: the
repo:cloudexecution seat (seat post #6026) — next candidate pass. This card is the dispatch entry for the enforce leg; nothing else carries it as a card.Provenance
manifest.integritydeclares per-file artifact digests the spec says the runtime re-verifies at unpack — nothing computes them and nothing checks them #11331 (maintainer batch, 2026-08-30): enforcemanifest.integrity— make the shipped documentation true (ADR-0025 §3.2/§3.5 step 5: per-file digests re-verified at unpack).objectstackhas no unpack. ADR-0025 §3.5 steps 4–7 are unimplemented there; the only.ospluginread is in-memory at publish and discards the tree. The unpack the spec's promise refers to is a control-plane path.manifest.integrityat publish preflight — the framework leg of #11331 (does not discharge the unpack ruling) #13464 via PR Verify manifest.integrity at the os plugin publish preflight (framework leg of #11331) #13502 (publish-preflightverifyIntegrityself-check + truthful TSDoc + liveness-ledger note). Its own framing: it does not discharge the unpack-time promise — after it, digests are checked by the publisher pre-upload only.The ask (lands in
cloud)Implement digest re-verification when the control plane unpacks a published
.osplugin(ADR-0025 §3.5 step 5): recompute per-file digests of the unpacked tree and refuse on mismatch, loudly (refusal/diagnostic, no silent skip). Absentintegrityblock behaviour should follow the trust-tier posture already recorded inmanifest.zod.ts's TSDoc rather than a new policy invented in cloud.Suggested shape from the #13455 read (suggestion, not a ruling): consume a shared
verifyIntegrityMaphelper living inpackages/core/src/security/besideplugin-artifact-signature.ts(already byte-mirrored by cloud'spackage-signing.ts) so cloud consumes rather than re-derives. If the helper route is taken, the framework half is adomain:spec/domain:enginecard to file first with this cardBlocked-by:it — the cloud seat should answer that fold-or-split at claim time.Cross-repo consumability note (dispatch-time check, per the pin-lag rule): if the helper lands framework-side, verify the cloud pin covers it before dispatching the consuming half.
Acceptance sketch
packages/spec/liveness/manifest.jsonforintegritystaysdeadinobjectstack(the verifier is not in that repo); only itsnotemay be corrected — per the clause-② reading recorded onmanifest.integritydeclares per-file artifact digests the spec says the runtime re-verifies at unpack — nothing computes them and nothing checks them #11331.Upstream tracking parent: #11331 (stays open until this closes; its
Blocked-by:points here).