Skip to content

[finding] a third hand copy of the governed-surface list lives in a lint.yml step comment, outside the #9525 prose pin #9840

Description

@os-warren

Measured while implementing #9525 (pinning the governed-surface prose enumerations to GOVERNED_SURFACES). Observation-class: recording a measured copy, not proposing to widen that PR. Filed unassigned.

What was measured

#9525 found two hand-maintained enumerations of the governed surfaces and pinned both to the register: AGENTS.md Prime Directive #14, and .claude/skills/pm-dispatch/SKILL.md's ACCEPT path-fork. A grep over the tree for the same fact turns up a third copy, in the Governed-merges audit self-test step comment in .github/workflows/lint.yml:

      # Governed-merges audit self-test (#9495) — same family, same split as
      # the half-state sweeper above: the live sweep enumerates the governed
      # merges (docs/adr/**, .claude/**, skills/**, AGENTS.md, CLAUDE.md)
      # since a date/ref for the PM round report ...

Five surfaces, spelled out by hand, matching the register today. Nothing reads it.

Why it is outside the #9525 pin, deliberately

The pin asserts over backtick code spans inside an anchored region. This copy is a YAML comment: the paths are bare, unquoted, comma-separated prose, so the pin's containment half cannot see them and its over-claim half cannot judge them. Extending the check to reach here would mean recognising path-prefix-shaped literals in free text — the intractability #9491 hit and cut, and the one #9525 explicitly declined to re-attempt (its script header states that boundary rather than implying it).

Why it is still worth a card

The staleness mechanism is identical and already proven twice on the other two sites (#9395, #9511): the register grows in a PR that need not touch this file, and the comment silently starts describing a set that no longer exists. The severity is lower than the two pinned sites — this is a CI step comment, not agent-protocol text a seat acts on — which is exactly why it should be graded by triage rather than fixed reflexively.

Two cheap directions, neither ruled:

  1. Backtick the five and add a third row to PROSE_SURFACES in scripts/pm/check-governed-prose.mjs — the check is already generic over regions, so this is one register row plus two anchors. YAML comments tolerate backticks fine.
  2. Delete the enumeration from the comment and point it at the register the way the comment two lines up already points at scripts/pm/check-governed-merges.mjs. Cheapest, cannot go stale, and costs a reader nothing here — unlike AGENTS.md, where at-a-glance readability was the whole point of AGENTS.md Prime Directive #14 names only docs/adr/**, but the gate it describes now also holds .claude/skills/** #9403.

Direction 2 is the smaller surface; direction 1 is the consistent one. Triage's call.

Refs: #9525 (the pin, and where the two-region scan set is defined) · #9491 (the same shape for check-run names) · #9495 (the audit this comment describes)


Generated by Claude Code

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions