Skip to content

lint+protocol: register validateRetiredPermissionResidue on the runtime authoring door (Studio / REST /meta / MCP), advisory level — the population ruling D on #17425 named (from #17425, ruled a) #17936

Description

@os-tesla

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

  1. 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.
  2. 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.
  3. 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).
  4. 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions