Skip to content

Acceptance to requirement mapping

Every item accepted at the Phase 4 gate of 2026-07-27, and the SRS identifier it became. This page exists because 24 of the 55 acceptances arrived with no requirement id of their own, so without a recorded mapping the question "did this land?" has no answer anyone can check twice.

It is a register of allocations, not a second home for the requirements themselves. Each row points at the identifier; what the requirement says lives in the SRS and nowhere else.

How to re-run the check

Parse the accepted set out of the decision export, parse !!! requirement "ID out of docs/srs/*.md, and compare. The measured result on 2026-07-27: 65 items in the export, of which 55 accepted, 7 deferred to a seat, 1 closed as a citation, and 2 answered in prose. The machine-readable index of the resulting requirement set is published at reports/requirements-index.json.

Accepted with their own identifier

These landed under the id they were accepted with; the register records only that they exist, since the id is its own mapping.

Accepted as Landed as Note
NFR-19, NFR-20, NFR-22 same Written 2026-07-27 with the batch's own decisions folded in
NFR-13 to NFR-18, NFR-21 same Written by this consolidation; the reserved-identifier convention they were held under is retired with it
FR-37 to FR-42 same Two restated, both disclosed in their own text. FR-41: its draft placed the adapter behind an optional extra, which AD-07 removed in the same batch. FR-37: its draft named the status value NOT_CONVERGED, and the value is left unnamed here because naming it decides the FR-46 collision below, which was resolved on 2026-08-03 in FR-46's favour; the disclosed restatement is recorded below
FR-02b, FR-22a/b/c, FR-30a/b/c, FR-31a/b, FR-33a/b/c, NFR-01a/b/c/d same The SIX accepted splits, one per base. The routing brief counted five because it grouped FR-02b with the rewords; it is a split, and every base keeps its identifier and gains an umbrella role
FR-06, FR-08, FR-10, FR-11, FR-20, FR-26, FR-31, NFR-07, NFR-08 same The NINE rewords, all performed 2026-07-27, each requirement stating what changed and why. The brief listed ten by including FR-02b, which is the split above

Accepted without an identifier

The allocation below is this session's, per the brief that made it this repository's call. Two of them were allocated earlier the same day and are included so the register is complete.

Accepted as Landed as Why there
C1 Validated option registry FR-40 Same subject, and FR-40's draft is the wider statement of it. The reference choice also made every registered option name a stable public contract, which FR-40 now carries
C2 Exception catalog with a completeness guard FR-39 The catalog and its guard are the mechanism FR-39 asserts
C3 Three-part actionable errors NFR-01c Error content is the didactic error clause, which the NFR-01 split gave its own identifier
C4 Console entry-point contract FR-44 New identifier; no accepted id covered the CLI surface. Written in the FULL-contract form that was chosen, where commands and flags change only under the deprecation policy, rather than the narrower recording-only form the review recommended, which was declined
C5 Strict manifest schema FR-45 New identifier; FR-19 governs the manifest's authority, not its field discipline
C6 Closed terminal-status set FR-46 New identifier. Read with FR-37, restated 2026-08-03 to ask for a status distinct from CONVERGED, which two of this set give
C7 Probe-data export writers FR-21, folded NOT given an identifier, because the recorded choice was to fold it under the post-processing line rather than make it a public functional requirement, and the worksheet offered that second option explicitly. The capability ships; FR-21 records it. A first draft of this consolidation minted FR-47 for it, and that option was declined
C8 Public test-support assertions FR-47 New identifier; no accepted id covered the testing surface
C9 Optional-dependency error shape NFR-25 The reference choice was to elevate AD-05 to a tested requirement, which is what NFR-25 is
C11 Far-field conservation ledger FR-38 Same subject; the brief names the two together
M1 Error pattern and typed hierarchy FR-39 Same subject as C2, from the sister-library mirror side
M2 Import-policy guard NFR-23 Allocated 2026-07-27; accepted as this package's own rather than a mirror
M3b State-hash scope and determinism NFR-15 Same subject: what a reproducibility hash excludes
M4 Provenance and the PROV model NFR-07 (part a) The owning seat accepted the split (a) and DEFERRED the standardized export (b), so only (a) landed
M5 TDD and a coverage floor NFR-16 Same subject
M6 Optional-dependency handling NFR-25 Same subject as C9, from the mirror side
T3 Traceability approach NFR-13 Same subject
TRC-01 Requirement-marker convention NFR-13 The marker convention is the mechanism NFR-13 asserts, so it is one requirement rather than two
SH-manifest-authority FR-19 A single-home edit, not a new requirement
SH-dependency-set NFR-06 Landed 2026-07-27: AD-05 stopped restating the set and cites NFR-06
SH-explicit-inputs AD-04 Landed: FR-09 cites AD-04 rather than restating the rule
SH-no-global-state AD-03 Landed: FR-05 cites AD-03 and states only its script-construction consequence
TERM-software-jargon NFR-24 Allocated 2026-07-27
TERM-unit-of-work NFR-26 New identifier; the domain-vocabulary sibling of NFR-24

Not landed, and why

None of these is an omission, and each is listed so that a later reader does not have to work out whether it was forgotten.

Item Status Why
FR-22 (probe promotion) Blocked by EVIDENCE Needs a licensed probe run, not a decision
FR-26 (reference validation) Blocked by EVIDENCE Needs measured data
FR-21 (resolution) Blocked by EVIDENCE Needs a byte-level comparison that has not been run
FR-43 (conservation imbalance band) Blocked by EVIDENCE Deferred to the numerical seat; the sister computes the imbalance and returns no acceptance criterion, and that judgement stays here where the case, mesh and solver context is
SCOPE-fsi-classification With the owning seat Product-owner seat, needs no run
SCOPE-audience-tiebreak With the owning seat Product-owner seat, needs no run
SCOPE-interp-trim-ownership Deferred to the product seat, then answered The export records a deferral; decision record DEC-002 A9 answered it afterwards. Filed here as both, because filing a deferral as answered is the direction that hides open work
SCOPE-farfield-mission Answered in prose One of the two items the owning seat answered as free text with no option selected; it is half of the single architectural move that produced AD-06 and AD-07, the other half being M3a
M3a (array immutability) Answered elsewhere Decision record DEC-002 A1; it is the prose answer that produced AD-06
C10 Closed as a citation The owning seat closed it on FR-31 with no new requirement
M4 (b), the PROV export Deferred at the gate Accepted the split (a) and deferred the standardized export

One tension this mapping surfaced, resolved 2026-08-03

FR-37 and FR-46 were both accepted and they disagreed. FR-46 closes the terminal-status set at the six values the code carries; FR-37 asked for a status distinct from a COMPLETED one, and a run that hits the iteration cap without converging lands in COMPLETED_MAX_ITER, a value whose name says completed. Satisfying FR-37 as written would have made the set seven.

It was resolved in FR-46's favour on 2026-08-03, and FR-37 was RESTATED rather than merely declared satisfied. It now asks for a status distinct from the CONVERGED one, which is what the library actually guarantees: a run that fails its threshold never wears the status meaning it met it. Two of the six give that, COMPLETED_MAX_ITER for a run that reached its cap and FAILED_INCOMPLETE_OUTPUT for one whose loop did not complete at all.

This is a DISCLOSED RESTATEMENT and it is recorded here because that is what this page is for. The first closure of FR-37 kept the original wording and argued that "completed" should be read as "converged", which is a requirement met under a reading rather than as written, and a review pass said so. The residual is the name: COMPLETED_MAX_ITER still reads as a success on first meeting, and renaming it is a manifest-visible break with no functional gain, so the package explains the name where a user meets it instead.