Observation-class residue recorded from #4518 / PR #4525, for triage. Not a defect in the landed card — a documented consequence of its own ruling.
What was landed: PR #4525 gives PermissionMatrixEditor the server's second write tier: at the environment door (no packageId), a code-declared (artifact-backed) permission set renders read-only unless allowOrgOverride, mirroring the server's NOT_OVERRIDABLE gate at protocol.ts:8888 and ResourceEditPage:1332's predicate.
The residue: the server's artifact gate only engages when the kernel has an environmentId (if (this.environmentId !== undefined)). On a single-kernel host that property is undefined, the server disengages the artifact tier entirely, and an env-scope edit of a code-declared set is accepted with 200 — while the editor now renders it read-only. Direction is conservative (an honest lock instead of a Save that would work), and nothing #4519 opened that was previously reachable regresses. But it is a real client/server divergence on that host class.
Why it could not be closed in #4518: the client cannot see the kernel's environment topology. useMetadataClient() takes no argument at all 30 app-shell call sites; MetadataClient bakes the scope into a private base with no getter; the only surface reporting the resolved environmentId is GET /discovery — a new server probe, which the card's ruling forbade.
Paths if triage wants it closed exactly (design decision, pick one):
- Plumb the resolved environmentId through MetadataClient / discovery into the editor, and disengage the client tier when it is undefined.
- Accept the conservative lock as permanent documented behavior for single-kernel hosts.
Refs: #4518, PR #4525, #4519, #4446. Filed unassigned for triage.
Generated by Claude Code
Observation-class residue recorded from #4518 / PR #4525, for triage. Not a defect in the landed card — a documented consequence of its own ruling.
What was landed: PR #4525 gives PermissionMatrixEditor the server's second write tier: at the environment door (no packageId), a code-declared (artifact-backed) permission set renders read-only unless allowOrgOverride, mirroring the server's NOT_OVERRIDABLE gate at protocol.ts:8888 and ResourceEditPage:1332's predicate.
The residue: the server's artifact gate only engages when the kernel has an environmentId (
if (this.environmentId !== undefined)). On a single-kernel host that property is undefined, the server disengages the artifact tier entirely, and an env-scope edit of a code-declared set is accepted with 200 — while the editor now renders it read-only. Direction is conservative (an honest lock instead of a Save that would work), and nothing #4519 opened that was previously reachable regresses. But it is a real client/server divergence on that host class.Why it could not be closed in #4518: the client cannot see the kernel's environment topology.
useMetadataClient()takes no argument at all 30 app-shell call sites;MetadataClientbakes the scope into a private base with no getter; the only surface reporting the resolved environmentId is GET /discovery — a new server probe, which the card's ruling forbade.Paths if triage wants it closed exactly (design decision, pick one):
Refs: #4518, PR #4525, #4519, #4446. Filed unassigned for triage.
Generated by Claude Code