Skip to content

Stop-the-bleed: tier-3 heal must not unregister a package-bound object — decide on the contributor's package binding, not isArtifactBacked (#6853 ruling C) #7012

Description

@os-project-manager

Maintainer ruling 2026-08-09 on #6853 (「接受你的建议」): option C ships first, as this standalone S-class card, ahead of #6853's direction-B ADR work.

The outage this closes (measured, #6853 dev report P3/P6 — no escape hatch needed)

A stored overlay row for a packaged object + loadMetaFromDb's ungated per-boot registerObject replay destroys the packaged contributor in place; isArtifactBacked flips false; a subsequent DELETE /meta/object/:name reaches tier 3 of restoreArtifactRegistryView, the "NEVER RETIRES A CODE-SHIPPED OBJECT" guard is blind (it reads the very predicate the overwrite falsified), and unregisterObject removes the whole entry: every data-plane call on the object 404s (OBJECT_NOT_FOUND) until process restart, while the table still holds the data and the delete receipt says reset: true.

Deliverable

In tier 3: refuse to unregisterObject when the owner contributor's packageId names a currently-installed package — the package binding is measured to survive the overlay overwrite (the definition does not, which is why isArtifactBacked cannot be trusted here). Reproduce the P3/P6 probe from the #6853 dev report (harness: protocol-delete-object-registry-heal.test.ts shape) as the regression pin, both directions.

Accepted cost (ruled, do not re-litigate)

A package-bound runtime-authored object (Studio package workspace, #4636) is indistinguishable from a package-shipped one by binding alone, so some genuinely deleted objects stay registered until restart — listable-but-rowless. Per the walk's own REGISTER WIDE / RETIRE NARROW argument this is the cheap direction; the honest fix for the distinguishability itself is #6853's direction B (overlay as its own contributor layer), which re-arms isArtifactBacked.

Region note

Lands in restoreArtifactRegistryView (tier 3) — disjoint from #6190's in-flight saveMetaItem two-tier gate region and from #6924's assertSortFieldsExist. Verify disjointness at claim time; STOP on overlap.

Refs: #6853 (ruling + full measurement), #6818 (name-addressed verb), #6725 (dormant write side), #6995 (write-side sibling, subsumed by B), ADR-0005, ADR-0029.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions