Split out from #9952's maintainer ruling (2026-08-20), which named it explicitly:
⚠️ Follow-up worth its own card, filed by whoever lands this if not absorbed: the overlay-shadow mechanism itself (a Studio save of a package-declared set silently forking it from the package, customized flag untouched) — arguably the real product defect the field report uncovered.
#9952 built the surfacing half (a drift_status/drift_detail diagnostic + a "Needs Attention" Setup view + a sanctioned "Discard Overlay" action) — an independent detector that catches an overlay-shadowed set even when the row's own customized flag reads wrong. It does not fix the underlying mechanism this card is about:
The mechanism
A sys_metadata overlay of a package-declared (artifact-backed) permission set can exist today — either a legacy row created while permission still had allowOrgOverride: true (pre-#6483/PR #6608, i.e. before ADR-0094 D5-R, 2026-08-09), or a fresh one created through the documented OS_METADATA_WRITABLE=permission operator hatch. Once it exists:
Why it is a product defect, not just a missing diagnostic
#9952's drift_status field tells an admin that a set has drifted and why, and gives them a button to fix it — but nothing stops the fork from happening again the same way, and nothing makes customized itself correct independent of managed_by. An admin who has never opened the new "Needs Attention" view has no reason to know a Studio save on a package-declared set (via the operator hatch) silently committed them to a permanently-shadowed set.
Candidates worth considering (not scoped/decided — for whoever picks this up)
Related: #9952 (parent field report — surfacing + discard action), #8672 (open — org-less materialization, same file).
Split out from #9952's maintainer ruling (2026-08-20), which named it explicitly:
#9952 built the surfacing half (a
drift_status/drift_detaildiagnostic + a "Needs Attention" Setup view + a sanctioned "Discard Overlay" action) — an independent detector that catches an overlay-shadowed set even when the row's owncustomizedflag reads wrong. It does not fix the underlying mechanism this card is about:The mechanism
A
sys_metadataoverlay of a package-declared (artifact-backed)permissionset can exist today — either a legacy row created whilepermissionstill hadallowOrgOverride: true(pre-#6483/PR #6608, i.e. before ADR-0094 D5-R, 2026-08-09), or a fresh one created through the documentedOS_METADATA_WRITABLE=permissionoperator hatch. Once it exists:reconcilePermissionSetProjection's env door (ADR-0094 D4 step 1) re-projects that overlay's content onto the record on every boot, unconditionally, keyed only on overlay presence — so the overlay wins forever regardless of what the package ships next, with no expiry.upsertEnvPermissionSet'scustomizedflag is only trustworthy when the row'smanaged_byis already correct ('package'); on a row whosemanaged_bypredates provenance tracking (theprovenance_skipmechanism [field report] rc→GA upgraded envs: package-declared permission sets frozen at first-boot snapshot — provenance skip is silent and has no adoption/migration path #9952 also documents), the flag is forcedfalseeven though an overlay genuinely shadows the row — measured on the field-reported environment:customizedstayed0for two weeks while the overlay froze the set.Why it is a product defect, not just a missing diagnostic
#9952's
drift_statusfield tells an admin that a set has drifted and why, and gives them a button to fix it — but nothing stops the fork from happening again the same way, and nothing makescustomizeditself correct independent ofmanaged_by. An admin who has never opened the new "Needs Attention" view has no reason to know a Studio save on a package-declared set (via the operator hatch) silently committed them to a permanently-shadowed set.Candidates worth considering (not scoped/decided — for whoever picks this up)
customized's computation independent ofmanaged_bycorrectness (compute it the same way [field report] rc→GA upgraded envs: package-declared permission sets frozen at first-boot snapshot — provenance skip is silent and has no adoption/migration path #9952'sdrift_statusoverlay-shadow branch does — an active overlay for the name, checked directly againstsys_metadata— rather than gating onexisting.managed_by === 'package').OS_METADATA_WRITABLE=permissionhatch should be able to mint a new overlay on an artifact-backed set at all, now that ADR-0094 D5-R's stated intent is "no new overlay of a packaged set can be minted."Related: #9952 (parent field report — surfacing + discard action), #8672 (open — org-less materialization, same file).