* test(#4130): failing-first regression for phase-prefixed decision IDs Add the #4130 matrix: D4-01/D12-01 across all three bullet forms, tags, discretion, wrapped lead-ins, gate-level plan/verify end-to-end rows, and parity properties (well-formed digit-prefixed ids parse to their exact id; a non-digit injected into the prefix fails loud). Update the #2347 non-D-prefix fixture from D5-NN (now a legal grammar) to DEC-NN, and graduate the representative d5-prefix corpus fixture from could-not-parse to parsed-but-uncovered. All new rows are RED against origin/next; they go green with the parser fix in the next commit. * fix(#4130): parse phase-prefixed decision IDs (D4-01) The three declaration grammars, the parse-miss guard, the #3939 join regexes, and the token evidence all anchored on the literal 'D-' (or '**D-'), so an ID carrying a digit-run phase prefix between the leading letter and the hyphen matched nothing — while the #2347 shape detector correctly called those bullets decision-shaped, collapsing the whole CONTEXT.md to could-not-parse with 0 extracted instead of a coverage verdict. Derive the extractor ID grammar from one shared DECISION_ID_SOURCE ('D[0-9]*-' + the existing alnum tail, full id captured), widen the guard/join anchors to ID_ATTEMPT_SOURCE (bare 'D-' or a digit-initial prefix run, so a typo'd 'D4x-01' fails loud while letter-initial prose like 'Deferred-until' stays none-present), and align the bare-token evidence. Both gates and the gap-checker share the parser, so all three surfaces read phase-prefixed decisions now; the gate messages name the accepted forms including the phase-prefixed one. * docs(#4130): document the phase-prefixed decision identifier form The canonical CONTEXT.md reference said decisions carry 'a sequential D-NN identifier' with no mention of the optional phase-number prefix the parser now accepts (D4-01) or the alphanumeric tail it always accepted (D-INFRA-01). Name both in the Decision identifier format section, EN and ja-JP. * chore(#4130): changeset * chore(#4130): backfill PR number in changeset --------- Co-authored-by: sim <sim@local>
Decision-coverage guard fixture (#2347, graduated by #4130)
d5-prefix-context.md is the verbatim reproduction shape from #2347 — the
- **D5-01:** some decision bullet given in the issue's own "Steps to
reproduce" — used as a CONTEXT.md <decisions> block and driven through
query check.decision-coverage-plan <phaseDir> <contextPath> (the real
CLI gate; see tests/decisions.test.cjs for the established pattern this
follows), not extractDecisions() called in isolation.
History of the expected verdict for this exact shape:
- #2347 (original): the #1365 fail-loud guard's "is this
decision-shaped?" evidence test (
/\bD-[A-Za-z0-9]/) reused the sameD-grammar as the parser it guards, soD5-01was invisible to both and a populated CONTEXT.md passed silently. #2347 made the evidence test format-agnostic, and the fixture's expectation graduated from the characterized buggy green-skip tocould-not-parse. - #4130 (current): the digit-run phase prefix itself became a LEGAL
ID grammar — the parser now reads
D5-01/D5-02— so this shape no longer fails loud at all. The gate reports a real coverage verdict:total: 2,covered: 0,passed: false, and NOreasonfield (the coverage path emits none). Pinned inMANIFEST.json'sexpectedTotal/expectedCovered/expectedPassedand asserted intests/representative-corpus.test.cjs.
The fail-loud contract itself is unchanged and still covered by the
DEC--prefix (non-D universe) tests in tests/decisions.test.cjs:
an ID grammar the parser genuinely cannot read still yields
could-not-parse.