Files
msd-core/tests/fixtures/representative
Tom Boucher f15eb5f5c9 fix(#2347): make the decision-shape evidence test format-agnostic (#2389)
#1365's fail-loud guard reused the parser's own D- grammar as its evidence test, so a populated <decisions> block using any other ID prefix (e.g. D5-01) was invisible to both parser and guard, collapsing could-not-parse into a clean none-present pass. Add an ID-shaped bold-lead-in probe as format-agnostic evidence on both parse paths; empty/prose scaffolds stay none-present. Graduates the #2371 d5-prefix representative fixture to its expected* assertion.

Closes #2347. Admin-merged (self-review bypass) with full green CI.
2026-07-17 16:25:13 -04:00
..

Representative Gate Fixtures (#2371)

Every fixture in this tree is verbatim (or, where noted, a minimal faithful subset) of an artifact that a real user actually produced and reported against a real GSD gate. None of it was written by a gate's own author to exercise that gate.

Why this directory exists, and why tests/fixtures/adversarial/ isn't enough

tests/fixtures/adversarial/ covers hostile input — unicode, CRLF, nested fences, heredoc breakout. Nobody attacked the gates these fixtures target. A developer wrote an ordinary, well-formed artifact — a plan, a coverage matrix, a CONTEXT.md — that a gate misjudged anyway. That input is neither synthetic-happy nor adversarial; it's simply real, and until #2371 no gate had coverage for it.

The pattern this corpus exists to break: a gate's test fixtures were authored by the same person (or model) who wrote the gate, from the same mental model, so they can only confirm what the author already believed — never surface what the author didn't anticipate. See #2371 for the full diagnosis (four incidents across three gates in ten days, including a fast-check property test whose generator was seeded from the parser's own writer function and therefore could not fail).

Rule

A gate's fixtures may not be derived from the gate's own writer, grammar, or docstring examples. A negative fixture must come from a source that does not know the gate exists. Recorded in CONTRIBUTING.md under "Fixture provenance."

Layout

Each subdirectory is one gate:

  • api-coverage-detector/ — detectApiIntegration (#2365)
  • api-coverage-matrix/ — parseCoverageMatrix (#2366)
  • audit-uat/ — parseUatItems / parseVerificationItems (#2286, fixed by #2317)
  • decision-coverage-guard/ — extractDecisions's could-not-parse guard (#1365 gap, #2347)

Each carries its own README.md (what each fixture is and where it came from) and MANIFEST.json (machine-readable: file → source issue → gate → expected verdict). tests/representative-corpus.test.cjs loads every manifest and drives each fixture through the gate's real CLI entrypoint — never the parser function directly — so the assertion is at gate-verdict altitude (the boolean/JSON a user actually sees), not parse-tree altitude.

Why the still-broken fixtures assert currentBuggyOutput, not a red todo

Three of the four gates here are still open bugs (#2365, #2366, #2347) at the time this corpus was added. Their MANIFEST.json entries carry BOTH the correct target verdict (expected* — what the eventual fix must produce) and the exact CURRENT observed verdict (currentBuggyOutput — what today's code actually returns). The test asserts against currentBuggyOutput: an honest, non-vacuous characterization of today's known-broken reality, not a fake pass.

This is deliberately NOT node:test's todo option. todo looked like the right tool — a todo test executes and reports its failure without affecting Node's own process exit code (https://nodejs.org/api/test.html#test-options) — but this repo's actual test-runner (gsd-test / gsd-test-runner v1.6.2) has no concept of it: its JSONL result parser (internal/pipeline/parse.go's parseJSONL, in the separate gsd-test-runner repo) only recognizes kind: "pass" | "fail" and hard-errors on anything else — verified directly against that source, not assumed. A { todo: true } test whose body throws is still counted as a real failure in gsd-test's own verdict, which would block the push gate exactly as if it weren't marked todo at all.

Asserting currentBuggyOutput sidesteps this because the test genuinely passes today — no runner-level "expected failure" feature required. The fixes belong to #2365 / #2366 / #2347, not to this corpus. When one of those lands, the corresponding assertion will fail (the gate now returns something other than the pinned buggy value) — at that point, flip the test to assert expected* instead and delete the stale currentBuggyOutput.

The audit-uat/ corpus has no todo: #2286 was fixed by #2317 before this corpus was written, so its assertions are ordinary, currently-passing tests — the proof that a representative fixture, driven through the real gate, is not automatically doomed to fail. It demonstrates the methodology working, not just the gaps it finds.