The specification · Conformance

Coverage and the uncovered list

One of the process rules in spec/README.md is that every identifier is exercised by at least one fixture, and every fixture cites a real identifier, in both directions, in CI. spec/fixtures.test.ts is that gate.

The four assertions

The test collects every S- and F- identifier defined across the eleven files RULE_FILES names, which is the grammar, the objective, the four judgment files, the value domain, divergence, hosts and rules, with the rationale last so a note appends to the rule it belongs to. It also collects every identifier cited by a fixture’s rules array, and reads spec/fixtures/UNCOVERED.md as an allowlist. Then it asserts four things.

Every rule a fixture cites is defined. A fixture citing an identifier that no spec file introduces is a citation of nothing.

Every defined rule is exercised by a fixture, or is listed in UNCOVERED.md with a reason. A rule nothing exercises is a rule nobody has tested.

The uncovered list contains only rules that are still uncovered. An entry that now has a fixture, or that names a rule that no longer exists, fails the gate. That is what makes the list shrink-only: you cannot leave a stale exemption behind.

The header’s count is the one the gate computes, so a rule added without touching the file is noticed there rather than on a downstream page.

The identifier collection is keyed on the identifiers themselves and never on document structure. spec/coverage.test.ts carries the reason in a comment, because a gate keyed on document structure cannot see a wrong claim that lives in a bullet list.

The other gate

spec/coverage.test.ts is the ledger side of the same idea. Every row of spec/inventory.md must cite at least one S- or F- rule that is defined in a spec file, or be marked GAP with an explicit out-of-scope reason. It also asserts that row identifiers are unique and that no row still cites the retired R* vocabulary.

Between the two, an identifier that nothing exercises and a citation of nothing are both CI failures rather than drift.

UNCOVERED.md

spec/fixtures/UNCOVERED.md is a list, one bullet per rule. Each bullet is the rule identifier in backticks, an em dash, and a reason. fixtures.test.ts parses exactly that shape with a regular expression, so an entry written any other way is not an exemption and the gate will still fail on the rule.

The file’s own header states the count, 135 of 139 rules with a fixture.

Every rule left on the list is a property no adapter can observe from verdicts, and the list gives that reason for each. It once held rules waiting on a form the reference lacked, the composite factory and the isolation mode among them, and each of those left when the form landed.

F-NoOwnExecution is measured by chant’s test/leftness profile, because an adapter reports verdicts and cannot observe execution. F-Obs-Provenance is an optional capability, reported rather than asserted. F-Host-Generality says what a host may vary and what it may not, and no verdict exercises it. F-NotProject is about a file inside the host’s own module tree, and the reference’s project is a map with no outside.