feat: surface_coverage record-lint rule (iss-35) - #14
Merged
Conversation
Graduate the deterministic (Direction-B) half of the iss-35 brief↔surface
cross-check into a standing record-lint rule. It reads the plugin surface
(commands/abcd/*.md files + skills/*/ dirs, outside the lint roots) and the
brief's surface registry table, and asserts three invariants:
- coverage: every real surface has a registry row;
- status fidelity: a Status=shipped row has a backing surface and a
Status=staged row (a design target) has none — the bare /abcd top-level
is binary-backed and exempt from the file check;
- registry integrity: every row's status is shipped or staged.
Adds the machine-checked Status column to 04-surfaces/README.md, the chosen
staged-marker convention. Chapter-link resolution stays with links_resolve;
the semantic half (a row's prose vs. binary behaviour) stays a release-gate
agent check, not a structural lint.
The registry parser fence-masks its input, so a table shown as a markdown
example is never mistaken for the registry. Runs clean on the live record;
watched fire on an injected status mismatch.
Assisted-by: Claude:claude-opus-4-8
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The deterministic (Direction-B) half of the iss-35 brief↔surface cross-check, graduated into a standing
record-lintrule.What it does
surface_coveragereads the plugin surface (commands/abcd/*.md+ anyskills/*/, outside the lint roots) and the brief's surface registry table, and asserts three invariants:shippedrow has a backing surface; astagedrow (design target) has none. The bare/abcdtop-level is binary-backed and exempt from the file check;shippedorstaged.The staged-marker convention is an explicit Status column (shipped|staged) added to
04-surfaces/README.md. Chapter-link resolution stays withlinks_resolve(no duplication); the registry parser fence-masks its input so an example table can't be mistaken for the registry.Scope
This is the deterministic half only. The semantic half (brief prose vs. binary behaviour) is a separate release-gate agent check (task 5, in progress). iss-35 stays open for that.
Verification
TestSurfaceCoverage(coverage gap, false-shipped, understated-staged, bad-status, clean, missing-registry, fenced-example).make preflightgreen;make record-lintgreen on the live record; detector watched fire on injected drift.Assisted-by: Claude:claude-opus-4-8