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.