Filed by the director seat out of #17425's class-one ruling (2026-09-13). ⛔ Not claimed, ⛔ not dispatched.
Blocked-by: #17425
Restart-when: PR #17917 (the validateRetiredPermissionResidue rule and PERMISSION_RETIRED_LIFECYCLE_RESIDUE) is merged on main.
What lands
Hook the retired-permission residue rule into the runtime authoring door so the population ruling D on #17425 named — authors who write permission metadata as JSON through Studio / REST /meta / MCP and never run os lint — receives the same advisory the CLI door gives.
Measured by the contract review on #17425 (5651165694, re-read by the domain:spec seat on origin/main): packages/metadata-protocol/src/protocol.ts parses the item first (~:15839 schema.safeParse(request.item)) and then calls assertRuntimeAuthoringRules({ …, body: request.item }) (~:15900) with the RAW body, so the residue keys the schema's strip stage removes are still present where the runtime rules run. ⇒ The hook is feasible; the rule is currently CLI_ONLY.
Scope
- The rule is registered for the runtime authoring door at advisory (warning) level — the same severity ruling D set; ⛔ never a refusal, ⛔ no accept-set change.
- The advisory reaches the caller in the door's existing diagnostics envelope (the shape Studio and MCP already render), naming the two keys and the remedy.
- Pins: a runtime write carrying
allowRestore / allowPurge produces the advisory and still succeeds; a clean write produces none; the CLI door's behaviour is unchanged (negative control).
- Cross-domain:
packages/lint (the rule's registration surface) + packages/metadata-protocol (the door); designated lane domain:spec with the protocol face declared in the claim comment.
priority:p3, type Task. Ruling D's reopen condition stays closed: this card is the mechanism that makes it unnecessary.
Generated by Claude Code
Filed by the director seat out of #17425's class-one ruling (2026-09-13). ⛔ Not claimed, ⛔ not dispatched.
Blocked-by: #17425
Restart-when: PR #17917 (the
validateRetiredPermissionResiduerule andPERMISSION_RETIRED_LIFECYCLE_RESIDUE) is merged onmain.What lands
Hook the retired-permission residue rule into the runtime authoring door so the population ruling D on #17425 named — authors who write permission metadata as JSON through Studio / REST
/meta/ MCP and never runos lint— receives the same advisory the CLI door gives.Measured by the contract review on #17425 (5651165694, re-read by the
domain:specseat onorigin/main):packages/metadata-protocol/src/protocol.tsparses the item first (~:15839 schema.safeParse(request.item)) and then callsassertRuntimeAuthoringRules({ …, body: request.item })(~:15900) with the RAW body, so the residue keys the schema's strip stage removes are still present where the runtime rules run. ⇒ The hook is feasible; the rule is currentlyCLI_ONLY.Scope
allowRestore/allowPurgeproduces the advisory and still succeeds; a clean write produces none; the CLI door's behaviour is unchanged (negative control).packages/lint(the rule's registration surface) +packages/metadata-protocol(the door); designated lanedomain:specwith the protocol face declared in the claim comment.priority:p3, type Task. Ruling D's reopen condition stays closed: this card is the mechanism that makes it unnecessary.Generated by Claude Code