Skip to content

feat: surface_coverage record-lint rule (iss-35) - #14

Merged
REPPL merged 1 commit into
mainfrom
auto/surface-coverage-lint
Jul 11, 2026
Merged

feat: surface_coverage record-lint rule (iss-35)#14
REPPL merged 1 commit into
mainfrom
auto/surface-coverage-lint

Conversation

@REPPL

@REPPL REPPL commented Jul 11, 2026

Copy link
Copy Markdown
Owner

The deterministic (Direction-B) half of the iss-35 brief↔surface cross-check, graduated into a standing record-lint rule.

What it does

surface_coverage reads the plugin surface (commands/abcd/*.md + any skills/*/, 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 shipped row has a backing surface; a staged row (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.

The staged-marker convention is an explicit Status column (shipped|staged) added to 04-surfaces/README.md. Chapter-link resolution stays with links_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

  • TDD: TestSurfaceCoverage (coverage gap, false-shipped, understated-staged, bad-status, clean, missing-registry, fenced-example).
  • make preflight green; make record-lint green on the live record; detector watched fire on injected drift.
  • ruthless-reviewer: SHIP (applied its finding — fence-mask the parser).

Assisted-by: Claude:claude-opus-4-8

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
@REPPL
REPPL merged commit d2a6f1e into main Jul 11, 2026
12 checks passed
@REPPL
REPPL deleted the auto/surface-coverage-lint branch July 11, 2026 11:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant