Quality / text
Text Library
Text Library — evidence
ICH E3-aligned prose blocks in three tiers, binding every number to an ARD address rather than stating it.
85reviewed requirementstext.md
155test recordsjs-unit · r-unit · text-review
0failing150 passing · 5 pending review
96%requirement coverage82/85 evidenced
Requirements
| ID | Area | Requirement | Evidence type | Result |
|---|---|---|---|---|
| TXT-BLOCK-001 | A block file parses into frontmatter fields (id, e3_section, title, tier, displays, allow_digits, approval, provenance, requirements, disclosure) and a prose body, with the frontmatter never leaking into the body. | 1 passing | ||
| TXT-BLOCK-002 | Validation rejects an unknown tier, an unknown approval state, and a generated-tier block that does not name the model and prompt that produced it. | 1 passing | ||
| TXT-BLOCK-003 | The shipped library loads with unique block ids and no structural errors; every .md file in library/text/ is a block. | 1 passing | ||
| TXT-BLOCK-004 | Every block declares at least one requirement ID matching ^[A-Z]{2,4}-[A-Z]+-\d+[A-D]?$, and the library exercises all three reuse tiers. | 1 passing | ||
| TXT-BLOCK-005 | Every generated-tier block records provenance.model and a substantive provenance.prompt, so agent-drafted prose is attributable. | 1 passing | ||
| TXT-BLOCK-006 | A block's file name is its id, so a block referenced from an assembly or an evidence page is addressable on disk without a lookup. | 1 passing | ||
| TXT-BIND-001 | A binding address parses into display, analysis and statistic name, plus the qualifiers group, group2, variable, variable_level, digits and scale. | 1 passing | ||
| TXT-BIND-002 | A malformed address, an empty component, an unknown qualifier, a non-integer digits or a non-numeric scale raises rather than degrading to a silent empty value. | 1 passing | ||
| TXT-BIND-003 | A binding resolves only when exactly one ARD row matches; the resolved row is returned alongside the value so the chain back to the ARD is never lost. | 1 passing | ||
| TXT-BIND-004 | A binding matching more than one ARD row fails as ambiguous, reporting the match count — an under-specified address never silently takes the first row. | 1 passing | ||
| TXT-BIND-005 | A binding matching no ARD row fails as orphaned, so a regenerated ARD that drops a statistic breaks the build instead of shipping a stale sentence. | 1 passing | ||
| TXT-BIND-006 | A binding to a display with no ARD at all fails with the display named, rather than rendering an empty string. | 1 passing | ||
| TXT-BIND-007 | The variable, variable_level and group2 qualifiers select a single row within a hierarchical (SOC/PT) ARD. | 1 passing | ||
| TXT-BIND-008 | The whole-library gate run aggregates every resolution failure, block by block, instead of stopping at the first. | 1 passing | ||
| TXT-FMT-001 | Rounding in prose is half-up, not R's half-to-even, so a number in a sentence matches the same number rounded by SAS or by the display layer. | 1 passing | ||
| TXT-FMT-002 | Integers render with no decimal point; digits fixes the number of decimal places; a null statistic renders as an empty string and a character statistic renders verbatim. | 1 passing | ||
| TXT-FMT-003 | The scale qualifier converts the ARD's proportion in [0,1] to a percentage for prose without altering the resolved ARD value recorded on the binding. | 1 passing | ||
| TXT-REND-001 | Rendering substitutes every token in the body and records the character span each substituted value occupies; those spans are the only evidence the numeric-fidelity gate accepts. | 1 passing | ||
| TXT-REND-002 | An unresolved binding renders as a visible, non-numeric marker and is reported as an error — a stale or guessed number is never substituted in its place. | 1 passing | ||
| TXT-XREF-001 | {{xref:display:<slug>}} renders the label and number assigned at build time (Table / Listing / Figure), and {{xref:section:<number>}} renders "Section N" or "Appendix N" — so prose never types a 14.x number the assembler owns. | 1 passing | ||
| TXT-XREF-002 | A cross-reference to a display or section that does not exist fails the build, exactly like an orphaned binding. | 1 passing | ||
| TXT-XREF-003 | Every cross-reference in the assembled CSR resolves. | no test | ||
| TXT-NUM-001 | Prose whose every digit run originates in a resolved binding or cross-reference passes the gate. | 1 passing | ||
| TXT-NUM-002 | A hand-typed result in prose fails the gate, reporting the block, the offending value and its surrounding context. | 1 passing | ||
| TXT-NUM-003 | Digits inside inline code and fenced code blocks are exempt. | 1 passing | ||
| TXT-NUM-004 | Digits inside a markdown link destination are exempt; digits in the link *text* are not, so a link is not a route around the gate. | 1 passing | ||
| TXT-NUM-005 | The frontmatter allow_digits list exempts the literal strings it names — E3 section numbers, guideline references, analysis thresholds — and the gate reports how many times each exemption was used, so an allowlist is auditable rather than invisible. | 1 passing | ||
| TXT-NUM-006 | An allow_digits entry exempts only the digit runs it literally covers; a partial match does not exempt the surrounding number. | 1 passing | ||
| TXT-NUM-007 | The gate reads the *rendered* prose and attributes digits by span, so withholding the spans turns every bound value into a violation — the gate cannot be satisfied by prose that merely looks resolved. | 1 passing | ||
| TXT-NUM-008 | Every block in the shipped Text Library passes the numeric-fidelity gate against the current ARDs. | 1 passing | ||
| TXT-APPR-001 | A generated-tier block whose approval state is not approved is excluded from assembly, with the reason recorded. | 1 passing | ||
| TXT-APPR-002 | An approved generated-tier block is included. | 1 passing | ||
| TXT-APPR-003 | The exclusion applies to the generated tier only; a non-approved boilerplate or parameterized block is included but flagged, because its content is not model-authored. | 1 passing | ||
| TXT-APPR-004 | Every excluded block is listed in the gate report, so an exclusion is visible on the evidence pages rather than a silent omission from the document. | 1 passing | ||
| TXT-APPR-005 | The assembled CSR marks every draft generated block as excluded and reproduces the reason, and no such block is presented as part of the report. | no test | ||
| TXT-LIB-001 | A block that binds a display absent from its frontmatter displays list is reported, keeping the declared dependency graph honest for the evidence pages. | 1 passing | ||
| TXT-LIB-002 | Every binding in the shipped Text Library resolves, and no block carries a structural error. | 1 passing | ||
| TXT-LIB-003 | A binding that would render more decimal places than a display convention allows is surfaced as a precision warning rather than shipped silently. | 1 passing | ||
| TXT-TRACE-001 | Every resolved binding in the assembled document carries the ARD row it came from, so a sentence traces to a statistic without a second lookup. | no test | ||
| TXT-ETH-001 | ICH E3 sections 5.2 and 5.3 carry approved boilerplate covering GCP and Declaration of Helsinki conformance, ethics committee review, and informed consent including consent by a legally acceptable representative for a cognitively impaired population. | 3 passing | ||
| TXT-DESIGN-001 | Sections 9.1 and 9.8 describe the design, randomisation, blinding and treatment groups, state the number of patients randomised per group as bound values, and record that no change was made to the planned analyses outside the documented amendments. | 3 passing | ||
| TXT-DISP-001 | Section 10.1 reports completion and discontinuation by treatment group from the disposition ARD, and states plainly that the analysis dataset records no reason for the majority of discontinuations rather than attributing them. | 1 pending review | ||
| TXT-POP-001 | Section 11.1 defines the safety analysis set, states its size by treatment group, and records that no efficacy analysis set exists for this study (design D12). | 2 passing | ||
| TXT-DEMO-001 | Section 11.2 summarises age, sex and race by treatment group from the demographics ARD and notes the generalisability limit that the population's composition implies. | 2 passing | ||
| TXT-EXP-001 | Section 12.1 reports duration of exposure and the cumulative exposure thresholds by treatment group, and states the exposure imbalance as a caveat on crude adverse event frequencies. | 2 passing | ||
| TXT-AE-001 | Section 12.2.1 summarises treatment-emergent adverse events overall and by treatment group — any event, related events, maximum severity, serious events and fatal outcomes — with every quantity bound to the AE overview ARD. | 2 passing | ||
| TXT-AE-002 | Section 12.2.2 describes the system organ class and preferred term pattern in frequency order, identifies the dose gradient where one exists, and does not assert a gradient where the ARD does not show one. | 1 pending review | ||
| TXT-AE-003 | Section 12.2.4 points to the by-patient adverse event listing and the serious adverse event listing, and records the header and anonymisation requirements that apply to them. | 2 passing | ||
| TXT-SAE-001 | Section 12.3.1 reports deaths, serious adverse events and severe adverse events by treatment group and states explicitly where the event count is too small to support inference. | 1 pending review | ||
| TXT-CONC-001 | Section 12.6 ranks the safety findings by importance, separates local tolerability from systemic serious toxicity, states the exposure caveat, and draws no benefit-risk conclusion in the absence of efficacy data. | 1 pending review | ||
| TXT-DISC-001 | Section 13 integrates disposition, exposure and adverse event findings into one argument and states the limitations — exposure imbalance, missing discontinuation reasons, population composition and the absence of efficacy data — without introducing any fact absent from the referenced ARDs. | 1 pending review | ||
| TXT-REVIEW-001 | The block list puts draft generated-tier blocks first — the blocks the assembly gate is holding out of the report — then every other block in ICH E3 section order. | 4 passing | ||
| TXT-REVIEW-002 | Each block is shown as *resolved prose*: every binding replaced by its value from the committed ARD, each value visually distinguished from the writer's words and linked to the binding row it came from. An unresolved binding renders a marker, never a number. | 5 passing | ||
| TXT-REVIEW-003 | A generated-tier block shows its provenance prominently — model, generation date and the full prompt — beside the prose rather than below the bindings; a human-written block says so explicitly; a generated block with no prompt is called out as unauditable. | 4 passing | ||
| TXT-REVIEW-004 | Every binding is resolved into a table giving the address, the ARD row it selects (analysis, statistic, group and level) and the value as the sentence shows it — scale and digits included — so a number can be checked without opening another page. A repeated address is one counted row; an unresolved one carries its reason. | 6 passing | ||
| TXT-REVIEW-005 | Each block links its source file on GitHub, every display it binds, and the display detail page behind each binding row. | 2 passing | ||
| TXT-REVIEW-006 | Each block shows its tier, its current approval state and its E3 section, and a block excluded from assembly is labelled as blocking. | 1 passing | ||
| TXT-REVIEW-007 | The view is a status view and nothing else: it emits no button, form, input or script, names no credential, token or API host, and states where approval is recorded and what enforces it — without describing or promising a sign-off workflow. | 4 passing | ||
| TXT-REVIEW-008 | The view references no external resource, derives its source links from repoUrl when no branch is configured, and renders in full for a repository with no source configuration at all. | 3 passing | ||
| TXT-EDIT-001 | The editor edits a block's body; its frontmatter is never sent to the browser, and the patch's hunks are offset to the body's position in the file, so no edit made in a browser can change a block's tier, approval state or allow_digits. | 5 passing | ||
| TXT-EDIT-002 | A draft body resolves its bindings against the committed ARD with the build's own resolver: an orphaned, ambiguous or malformed address reports the build's message verbatim rather than throwing, and cross-references resolve against the published display and section indices so the editor is not stricter than CI. | 8 passing | ||
| TXT-EDIT-003 | The numeric-fidelity gate runs on the draft as it is typed: a hand-typed result is reported with its value and surrounding context, an allow_digits literal exempts exactly as it does in CI, and replacing the number with a resolving binding clears the gate. | 4 passing | ||
| TXT-EDIT-004 | An unresolved binding previews as a marker and never as a number — the editor cannot show a value the ARD did not produce. | 1 passing | ||
| TXT-EDIT-005 | A binding to a display the block does not declare is reported exactly as the whole-library gate run reports it, so the editor cannot show a passing gate for a body that fails the build. | 2 passing | ||
| TXT-EDIT-006 | An edit produces a unified diff with ---/+++ headers, @@ hunks and three lines of context, marking a missing trailing newline as git does — and git apply accepts it against the real file, leaving the frontmatter byte-for-byte identical. | 5 passing | ||
| TXT-EDIT-007 | An unchanged body produces no patch at all; a change reports how many lines it adds and removes. | 6 passing | ||
| TXT-EDIT-008 | Several blocks edited in one visit compose into one patch — a file section per changed block, unchanged blocks omitted — naming each block's real repository path. | 2 passing | ||
| TXT-EDIT-009 | The pane as shipped, editor mounted, records no approval and reaches no network host: every written block gets an editor seeded with its source, and the complete set of controls is Edit / Copy patch / Download patch / Download one patch for every change / Revert — no form, no credential, no token, no API host. | 2 passing | ||
| TXT-EDIT-010 | The editor is progressive enhancement: its markup ships hidden and is revealed by the client, and the view rendered without the editor option is the read-only status view TXT-REVIEW-007 describes — no button, textarea, form or script. | 3 passing | ||
| TXT-EDIT-011 | A binding rendering at full precision surfaces as a warning the writer can act on rather than a failure that blocks the edit. | 1 passing | ||
| TXT-EDIT-012 | The preview marks every computed value and every fidelity violation in place in the sentence, losslessly — a writer sees which words are theirs and which digit the gate is rejecting without reading a list. | 3 passing | ||
| TXT-VAL-001 | A values store whose values match their ARD rows passes; one that no longer matches fails and names the value, the stored number and the number the ARD now gives. | 2 passing | ||
| TXT-VAL-002 | A value whose address resolves to no ARD row, to more than one, or to a display absent from the build is reported rather than silently dropped. | 2 passing | ||
| TXT-VAL-003 | Derived values are recomputed from their inputs at build time, and a derivation naming a value defined after it is reported. | 2 passing | ||
| TXT-VAL-004 | Presentation is checked too: a value whose formatted does not match its declared scale and half-up rounding fails. | 1 passing | ||
| TXT-VAL-005 | A value citing an ARD the repository no longer holds is reported; a store with an unknown schema is refused; a repository with no store is not a failure. | 3 passing | ||
| TXT-VAL-006 | A {{value:id}} token renders the stored value, is span-tracked so the numeric-fidelity gate accepts its digits, and fails the build when the id is unknown. | 1 pending review | ||
| TXT-VAL-007 | The store knows which text blocks cite each value, so "what breaks if this changes" is answerable before it changes. | 1 passing | ||
| TXT-VAL-008 | The committed store is in the agreed schema and every value in it cites an ARD file that exists with a matching hash. | 2 passing | ||
| TXT-EDIT-013 | Each editable block in the reading view carries a keyboard-reachable Edit button with aria-expanded and aria-controls, and an empty drawer for the editor to be moved into — the Reader renders no second editor. | 2 passing | ||
| TXT-EDIT-014 | The affordance appears only where an editor exists to adopt: never on the standalone reader page, and never on a block the approval gate holds out of the report. | 3 passing | ||
| TXT-EDIT-015 | The drawer and the editor's home marker share one id convention, derived from the block id, so the editor can always be put back where it came from. | 1 passing | ||
| TXT-EDIT-016 | A draft renders in the reading view as the document renders — computed values and fidelity violations marked in the sentence — but without the trace hooks that would claim it is part of the committed report. | 3 passing | ||
| TXT-EDIT-017 | The block states which it is showing: the committed report, an editor open on unchanged prose, an unsaved draft, or an unsaved draft that fails the gates. | 2 passing | ||
| TXT-EDIT-018 | The reading view moves the one editor rather than creating another, restores the document's own committed HTML when the drawer closes, and writes, posts and stores nothing. | 3 passing |
Test records
| Result | Suite | Test | Requirements | File |
|---|---|---|---|---|
| pass | js-unit | binding a value from prose TXT-VAL-006: a {{value:id}} token renders the stored value and is span-tracked (#1) | TXT-VAL-006 | tests/unit/values-store.test.js |
| pass | js-unit | binding a value from prose TXT-VAL-006: an unknown value id fails the build rather than rendering blank (#1) | TXT-VAL-006 | tests/unit/values-store.test.js |
| pass | js-unit | binding a value from prose TXT-VAL-006: value bindings are counted per block alongside ARD bindings (#1) | TXT-VAL-006 | tests/unit/values-store.test.js |
| pass | js-unit | binding a value from prose TXT-VAL-007: the store knows which blocks bind each value (#1) | TXT-VAL-007 | tests/unit/values-store.test.js |
| pass | js-unit | Binding addresses TXT-BIND-001: parseBindingAddress splits display, analysis, statistic and qualifiers (#1) | TXT-BIND-001 | tests/unit/text-bindings.test.js |
| pass | js-unit | Binding addresses TXT-BIND-002: a malformed address or an unknown qualifier is rejected rather than silently ignored (#1) | TXT-BIND-002 | tests/unit/text-bindings.test.js |
| pass | js-unit | Binding addresses TXT-BIND-003: a fully qualified binding resolves to exactly one ARD row (#1) | TXT-BIND-003 | tests/unit/text-bindings.test.js |
| pass | js-unit | Binding addresses TXT-BIND-004: an under-specified binding that matches several rows fails as ambiguous (#1) | TXT-BIND-004 | tests/unit/text-bindings.test.js |
| pass | js-unit | Binding addresses TXT-BIND-005: a binding no ARD row satisfies fails loudly as orphaned (#1) | TXT-BIND-005 | tests/unit/text-bindings.test.js |
| pass | js-unit | Binding addresses TXT-BIND-006: a binding to a display with no ARD fails instead of rendering an empty string (#1) | TXT-BIND-006 | tests/unit/text-bindings.test.js |
| pass | js-unit | Binding addresses TXT-BIND-007: variable, variable_level and group2 qualifiers select within a hierarchical ARD (#1) | TXT-BIND-007 | tests/unit/text-bindings.test.js |
| pass | js-unit | Gate: approval TXT-APPR-001: a draft generated-tier block is excluded from assembly and the reason is reported (#1) | TXT-APPR-001 | tests/unit/text-gates.test.js |
| pass | js-unit | Gate: approval TXT-APPR-002: an approved generated-tier block is included (#1) | TXT-APPR-002 | tests/unit/text-gates.test.js |
| pass | js-unit | Gate: approval TXT-APPR-003: the gate applies to the generated tier only; boilerplate is not tier-gated (#1) | TXT-APPR-003 | tests/unit/text-gates.test.js |
| pass | js-unit | Gate: approval TXT-APPR-004: runGates lists every excluded block so the exclusion is visible, not silent (#1) | TXT-APPR-004 | tests/unit/text-gates.test.js |
| pass | js-unit | Gate: binding resolution across the library TXT-BIND-008: runGates reports an orphaned and an ambiguous binding as resolution errors (#1) | TXT-BIND-008 | tests/unit/text-gates.test.js |
| pass | js-unit | Gate: binding resolution across the library TXT-LIB-001: a block that binds a display it does not declare is reported (#1) | TXT-LIB-001 | tests/unit/text-gates.test.js |
| pass | js-unit | Gate: binding resolution across the library TXT-LIB-002: every binding in the shipped Text Library resolves against the fixture ARDs (#1) | TXT-LIB-002 | tests/unit/text-gates.test.js |
| pass | js-unit | Gate: binding resolution across the library TXT-LIB-003: full-precision values without a digits qualifier are surfaced as a warning (#1) | TXT-LIB-003 | tests/unit/text-gates.test.js |
| pass | js-unit | Gate: numeric fidelity TXT-NUM-001: prose whose every digit came from a binding passes the gate (#1) | TXT-NUM-001 | tests/unit/text-gates.test.js |
| pass | js-unit | Gate: numeric fidelity TXT-NUM-002: a hand-typed result in prose is caught, with its value and surrounding context (#1) | TXT-NUM-002 | tests/unit/text-gates.test.js |
| pass | js-unit | Gate: numeric fidelity TXT-NUM-003, TXT-NUM-004: digits inside inline code and inside a link destination are exempt (#1) | TXT-NUM-003 TXT-NUM-004 | tests/unit/text-gates.test.js |
| pass | js-unit | Gate: numeric fidelity TXT-NUM-005: allow_digits exempts only the literals it lists, and reports how often each was used (#1) | TXT-NUM-005 | tests/unit/text-gates.test.js |
| pass | js-unit | Gate: numeric fidelity TXT-NUM-006: allow_digits does not exempt a digit run it does not literally cover (#1) | TXT-NUM-006 | tests/unit/text-gates.test.js |
| pass | js-unit | Gate: numeric fidelity TXT-NUM-007: the gate reads the RENDERED prose, so a binding that resolves to a digit run is never a violation (#1) | TXT-NUM-007 | tests/unit/text-gates.test.js |
| pass | js-unit | Gate: numeric fidelity TXT-NUM-008: every block in the shipped Text Library passes the numeric-fidelity gate (#1) | TXT-NUM-008 | tests/unit/text-gates.test.js |
| pass | js-unit | hiding actually hides TXT-EDIT-010: no class the editor hides is forced visible by a display rule (#113) | TXT-EDIT-010 | tests/unit/text-editor.test.js |
| pass | js-unit | line diffing TXT-EDIT-007: a changed line reads as one removal and one addition (#113) | TXT-EDIT-007 | tests/unit/text-editor.test.js |
| pass | js-unit | line diffing TXT-EDIT-007: identical text produces no changed lines at all (#113) | TXT-EDIT-007 | tests/unit/text-editor.test.js |
| pass | js-unit | line diffing TXT-EDIT-007: unchanged lines around an insertion stay context, not churn (#113) | TXT-EDIT-007 | tests/unit/text-editor.test.js |
| pass | js-unit | live binding resolution TXT-EDIT-002: a draft body resolves its bindings against the committed ARD (#113) | TXT-EDIT-002 | tests/unit/text-editor.test.js |
| pass | js-unit | live binding resolution TXT-EDIT-002: a malformed address is reported, not thrown, so typing never breaks the editor (#113) | TXT-EDIT-002 | tests/unit/text-editor.test.js |
| pass | js-unit | live binding resolution TXT-EDIT-002: an ambiguous address reports its match count rather than taking a row (#113) | TXT-EDIT-002 | tests/unit/text-editor.test.js |
| pass | js-unit | live binding resolution TXT-EDIT-002: an orphaned binding reports the build message verbatim (#113) | TXT-EDIT-002 | tests/unit/text-editor.test.js |
| pass | js-unit | live binding resolution TXT-EDIT-004: an unresolved binding previews as a marker, never as a number (#113) | TXT-EDIT-004 | tests/unit/text-editor.test.js |
| pass | js-unit | live binding resolution TXT-EDIT-005: binding a display the block does not declare is reported as the build reports it (#113) | TXT-EDIT-005 | tests/unit/text-editor.test.js |
| pass | js-unit | live binding resolution TXT-EDIT-005: declaring the display in the block clears the report (#113) | TXT-EDIT-005 | tests/unit/text-editor.test.js |
| pass | js-unit | provenance TXT-REVIEW-003: a generated block shows its model, generation date and the full prompt (#2) | TXT-REVIEW-003 | tests/unit/text-status.test.js |
| pass | js-unit | provenance TXT-REVIEW-003: a generated block with no recorded prompt is called out as unauditable (#2) | TXT-REVIEW-003 | tests/unit/text-status.test.js |
| pass | js-unit | provenance TXT-REVIEW-003: a human-written block says so rather than showing an empty provenance box (#2) | TXT-REVIEW-003 | tests/unit/text-status.test.js |
| pass | js-unit | provenance TXT-REVIEW-003: provenance sits beside the prose, not below the fold (#2) | TXT-REVIEW-003 | tests/unit/text-status.test.js |
| pass | js-unit | Rendering and cross-references TXT-REND-001: renderBlock substitutes every token and records the span each value occupies (#1) | TXT-REND-001 | tests/unit/text-bindings.test.js |
| pass | js-unit | Rendering and cross-references TXT-REND-002: an unresolved binding leaves a visible marker and is reported as an error (#1) | TXT-REND-002 | tests/unit/text-bindings.test.js |
| pass | js-unit | Rendering and cross-references TXT-XREF-001: display cross-references render the number assigned at build time (#1) | TXT-XREF-001 | tests/unit/text-bindings.test.js |
| pass | js-unit | Rendering and cross-references TXT-XREF-002: a cross-reference to an unknown display or section fails the build (#1) | TXT-XREF-002 | tests/unit/text-bindings.test.js |
| pass | js-unit | resolved prose TXT-REVIEW-002: a cross-reference degrades to readable text outside the assembled document (#2) | TXT-REVIEW-002 | tests/unit/text-status.test.js |
| pass | js-unit | resolved prose TXT-REVIEW-002: an unresolved binding shows a marker, never a number (#2) | TXT-REVIEW-002 | tests/unit/text-status.test.js |
| pass | js-unit | resolved prose TXT-REVIEW-002: computed values are marked and linked to the binding row they came from (#2) | TXT-REVIEW-002 | tests/unit/text-status.test.js |
| pass | js-unit | resolved prose TXT-REVIEW-002: every binding is replaced by its real value from the committed ARD (#2) | TXT-REVIEW-002 | tests/unit/text-status.test.js |
| pass | js-unit | resolved prose TXT-REVIEW-002: the writer’s own words are left untouched around the values (#2) | TXT-REVIEW-002 | tests/unit/text-status.test.js |
| pass | js-unit | Text Library block parsing TXT-AE-001, TXT-AE-002, TXT-AE-003, TXT-SAE-001, TXT-CONC-001, TXT-DISC-001: the safety narrative sections ship blocks whose tier matches their evidentiary risk (#1) | TXT-AE-001 TXT-AE-002 TXT-AE-003 TXT-SAE-001 TXT-CONC-001 TXT-DISC-001 | tests/unit/text-blocks.test.js |
| pass | js-unit | Text Library block parsing TXT-BLOCK-001: parseBlock splits frontmatter from prose and keeps every declared field (#1) | TXT-BLOCK-001 | tests/unit/text-blocks.test.js |
| pass | js-unit | Text Library block parsing TXT-BLOCK-002: validateBlock rejects an unknown tier, an unknown approval state and a generated block with no provenance (#1) | TXT-BLOCK-002 | tests/unit/text-blocks.test.js |
| pass | js-unit | Text Library block parsing TXT-BLOCK-003: the shipped library loads with unique ids and no structural errors (#1) | TXT-BLOCK-003 | tests/unit/text-blocks.test.js |
| pass | js-unit | Text Library block parsing TXT-BLOCK-004: every library block uses all three reuse tiers and carries requirement ids (#1) | TXT-BLOCK-004 | tests/unit/text-blocks.test.js |
| pass | js-unit | Text Library block parsing TXT-BLOCK-005: every generated-tier block records the model and prompt that produced it (#1) | TXT-BLOCK-005 | tests/unit/text-blocks.test.js |
| pass | js-unit | Text Library block parsing TXT-BLOCK-006: block file names match the block id so the library is addressable from disk (#1) | TXT-BLOCK-006 | tests/unit/text-blocks.test.js |
| pass | js-unit | Text Library block parsing TXT-ETH-001, TXT-DESIGN-001, TXT-DISP-001, TXT-POP-001, TXT-DEMO-001, TXT-EXP-001: the study-conduct narrative sections each ship an approved block (#1) | TXT-ETH-001 TXT-DESIGN-001 TXT-DISP-001 TXT-POP-001 TXT-DEMO-001 TXT-EXP-001 | tests/unit/text-blocks.test.js |
| pass | js-unit | the binding table TXT-REVIEW-004: a block with no bindings says so instead of rendering an empty table (#2) | TXT-REVIEW-004 | tests/unit/text-status.test.js |
| pass | js-unit | the binding table TXT-REVIEW-004: a repeated address is one row, counted, not duplicated (#2) | TXT-REVIEW-004 | tests/unit/text-status.test.js |
| pass | js-unit | the binding table TXT-REVIEW-004: an unresolved binding is shown with the reason, in place of a value (#2) | TXT-REVIEW-004 | tests/unit/text-status.test.js |
| pass | js-unit | the binding table TXT-REVIEW-004: one row per address, carrying the ARD row it selects and the value (#2) | TXT-REVIEW-004 | tests/unit/text-status.test.js |
| pass | js-unit | the binding table TXT-REVIEW-004: the ARD row is described by its group and level, not just its index (#2) | TXT-REVIEW-004 | tests/unit/text-status.test.js |
| pass | js-unit | the binding table TXT-REVIEW-004: the table value is the value the sentence shows, scale and digits included (#2) | TXT-REVIEW-004 | tests/unit/text-status.test.js |
| pass | js-unit | the block header TXT-REVIEW-005: every binding row links the display detail page it reads from (#2) | TXT-REVIEW-005 | tests/unit/text-status.test.js |
| pass | js-unit | the block header TXT-REVIEW-005: the card links the block source and every display it binds (#2) | TXT-REVIEW-005 | tests/unit/text-status.test.js |
| pass | js-unit | the block header TXT-REVIEW-006: tier, approval state and E3 section are on every card (#2) | TXT-REVIEW-006 | tests/unit/text-status.test.js |
| pass | js-unit | the block queue TXT-REVIEW-001: draft generated blocks come first — they are the ones blocking assembly (#2) | TXT-REVIEW-001 | tests/unit/text-status.test.js |
| pass | js-unit | the block queue TXT-REVIEW-001: only unapproved generated blocks need judgment (#2) | TXT-REVIEW-001 | tests/unit/text-status.test.js |
| pass | js-unit | the block queue TXT-REVIEW-001: the shipped library really does have blocks held out of the report (#2) | TXT-REVIEW-001 | tests/unit/text-status.test.js |
| pass | js-unit | the block queue TXT-REVIEW-001: within a group, blocks follow ICH E3 section order, not file order (#2) | TXT-REVIEW-001 | tests/unit/text-status.test.js |
| pass | js-unit | the committed store TXT-VAL-008: every committed value cites an ARD file that exists, with a matching hash (#1) | TXT-VAL-008 | tests/unit/values-store.test.js |
| pass | js-unit | the committed store TXT-VAL-008: the repository ships a values store in the agreed schema (#1) | TXT-VAL-008 | tests/unit/values-store.test.js |
| pass | js-unit | the edited region TXT-EDIT-001: a body edit rewrites the body and leaves the frontmatter byte-for-byte (#113) | TXT-EDIT-001 | tests/unit/text-editor.test.js |
| pass | js-unit | the edited region TXT-EDIT-001: a file with no frontmatter is all body, and round-trips unchanged (#113) | TXT-EDIT-001 | tests/unit/text-editor.test.js |
| pass | js-unit | the edited region TXT-EDIT-001: the editor splits a block into its frontmatter and its body (#113) | TXT-EDIT-001 | tests/unit/text-editor.test.js |
| pass | js-unit | the editor as rendered into the Text pane TXT-EDIT-001: each editor carries its body start line, never its frontmatter (#113) | TXT-EDIT-001 | tests/unit/text-editor.test.js |
| pass | js-unit | the editor as rendered into the Text pane TXT-EDIT-002: each editor declares the ARDs its block binds, so the browser fetches those (#113) | TXT-EDIT-002 | tests/unit/text-editor.test.js |
| pass | js-unit | the editor as rendered into the Text pane TXT-EDIT-009: every written block in the library gets an editor, seeded with its source (#113) | TXT-EDIT-009 | tests/unit/text-editor.test.js |
| pass | js-unit | the editor as rendered into the Text pane TXT-EDIT-009: the editor records approval nowhere and reaches no network host (#113) | TXT-EDIT-009 | tests/unit/text-editor.test.js |
| pass | js-unit | the editor as rendered into the Text pane TXT-EDIT-010: the editor ships hidden, so the pane without JavaScript is the status view (#113) | TXT-EDIT-010 | tests/unit/text-editor.test.js |
| pass | js-unit | the editor as rendered into the Text pane TXT-EDIT-010: without the editor option the view renders exactly what it always did (#113) | TXT-EDIT-010 | tests/unit/text-editor.test.js |
| pass | js-unit | the live preview TXT-EDIT-012: a fidelity violation is marked in the sentence, not just listed (#113) | TXT-EDIT-012 | tests/unit/text-editor.test.js |
| pass | js-unit | the live preview TXT-EDIT-012: computed values are marked in place, the writer’s words are not (#113) | TXT-EDIT-012 | tests/unit/text-editor.test.js |
| pass | js-unit | the live preview TXT-EDIT-012: segmenting is lossless — the preview says exactly what the gate read (#113) | TXT-EDIT-012 | tests/unit/text-editor.test.js |
| pass | js-unit | the numeric-fidelity gate, as you type TXT-EDIT-003: a hand-typed result is a violation carrying its value and context (#113) | TXT-EDIT-003 | tests/unit/text-editor.test.js |
| pass | js-unit | the numeric-fidelity gate, as you type TXT-EDIT-003: an allow_digits literal from the frontmatter still exempts as it does in CI (#113) | TXT-EDIT-003 | tests/unit/text-editor.test.js |
| pass | js-unit | the numeric-fidelity gate, as you type TXT-EDIT-003: replacing the typed number with a resolving binding clears the gate (#113) | TXT-EDIT-003 | tests/unit/text-editor.test.js |
| pass | js-unit | the numeric-fidelity gate, as you type TXT-EDIT-003: the gate reads the rendered prose, so a substituted value is not a violation (#113) | TXT-EDIT-003 | tests/unit/text-editor.test.js |
| pass | js-unit | the numeric-fidelity gate, as you type TXT-EDIT-011: full-precision output is a warning the writer can see, not a failure (#113) | TXT-EDIT-011 | tests/unit/text-editor.test.js |
| pass | js-unit | the patch TXT-EDIT-001: the patch diffs the body region and offsets its hunks past the frontmatter (#113) | TXT-EDIT-001 | tests/unit/text-editor.test.js |
| pass | js-unit | the patch TXT-EDIT-006: a patch of a file with no trailing newline says so, as git does (#113) | TXT-EDIT-006 | tests/unit/text-editor.test.js |
| pass | js-unit | the patch TXT-EDIT-006: an edit produces a unified diff with git headers and hunks (#113) | TXT-EDIT-006 | tests/unit/text-editor.test.js |
| pass | js-unit | the patch TXT-EDIT-006: git applies the patch for every shape of edit a writer can make (#113) | TXT-EDIT-006 | tests/unit/text-editor.test.js |
| pass | js-unit | the patch TXT-EDIT-006: the diff carries three lines of context on each side of a hunk (#113) | TXT-EDIT-006 | tests/unit/text-editor.test.js |
| pass | js-unit | the patch TXT-EDIT-006: the patch is one git apply accepts against the real file (#113) | TXT-EDIT-006 | tests/unit/text-editor.test.js |
| pass | js-unit | the patch TXT-EDIT-007: an unchanged body produces no patch at all (#113) | TXT-EDIT-007 | tests/unit/text-editor.test.js |
| pass | js-unit | the patch TXT-EDIT-007: dropping the file’s final newline is a change, not an empty patch (#113) | TXT-EDIT-007 | tests/unit/text-editor.test.js |
| pass | js-unit | the patch TXT-EDIT-007: the patch reports how many lines it adds and removes (#113) | TXT-EDIT-007 | tests/unit/text-editor.test.js |
| pass | js-unit | the patch TXT-EDIT-008: a patch over several blocks is one file section per changed block (#113) | TXT-EDIT-008 | tests/unit/text-editor.test.js |
| pass | js-unit | the patch TXT-EDIT-008: the patch names the block’s real repository path (#113) | TXT-EDIT-008 | tests/unit/text-editor.test.js |
| pass | js-unit | the published ARD payload TXT-EDIT-002: a binding resolves identically against the payload and the ARD on disk (#113) | TXT-EDIT-002 | tests/unit/text-editor.test.js |
| pass | js-unit | the published ARD payload TXT-EDIT-002: the payload drops the columns resolution never reads (#113) | TXT-EDIT-002 | tests/unit/text-editor.test.js |
| pass | js-unit | the published ARD payload TXT-EDIT-002: the payload keeps every row, so the browser counts matches as CI does (#113) | TXT-EDIT-002 | tests/unit/text-editor.test.js |
| pass | js-unit | the surface is a status view, not a form TXT-REVIEW-007: nothing on the view offers to take, store or send a credential (#2) | TXT-REVIEW-007 | tests/unit/text-status.test.js |
| pass | js-unit | the surface is a status view, not a form TXT-REVIEW-007: the view carries no control a visitor could act on (#2) | TXT-REVIEW-007 | tests/unit/text-status.test.js |
| pass | js-unit | the surface is a status view, not a form TXT-REVIEW-007: the view says where approval lives and what enforces it (#2) | TXT-REVIEW-007 | tests/unit/text-status.test.js |
| pass | js-unit | the surface is a status view, not a form TXT-REVIEW-007: the whole library is readable — prose, provenance and bindings (#2) | TXT-REVIEW-007 | tests/unit/text-status.test.js |
| pass | js-unit | the values store TXT-VAL-001: a store whose values match their ARD rows passes the gate (#1) | TXT-VAL-001 | tests/unit/values-store.test.js |
| pass | js-unit | the values store TXT-VAL-001: a value that no longer matches its ARD row fails like a stale number (#1) | TXT-VAL-001 | tests/unit/values-store.test.js |
| pass | js-unit | the values store TXT-VAL-002: a value citing a display with no ARD in the build is reported (#1) | TXT-VAL-002 | tests/unit/values-store.test.js |
| pass | js-unit | the values store TXT-VAL-002: an orphaned or ambiguous address is reported, not silently dropped (#1) | TXT-VAL-002 | tests/unit/values-store.test.js |
| pass | js-unit | the values store TXT-VAL-003: a derivation naming a value defined after it is reported (#1) | TXT-VAL-003 | tests/unit/values-store.test.js |
| pass | js-unit | the values store TXT-VAL-003: a derived value is recomputed from its inputs, and drift fails (#1) | TXT-VAL-003 | tests/unit/values-store.test.js |
| pass | js-unit | the values store TXT-VAL-004: presentation is checked too — a mis-formatted value fails (#1) | TXT-VAL-004 | tests/unit/values-store.test.js |
| pass | js-unit | the values store TXT-VAL-005: a store with the wrong schema is refused outright (#1) | TXT-VAL-005 | tests/unit/values-store.test.js |
| pass | js-unit | the values store TXT-VAL-005: a value citing an ARD the repository no longer holds is reported (#1) | TXT-VAL-005 | tests/unit/values-store.test.js |
| pass | js-unit | the values store TXT-VAL-005: no store at all is not a failure — it is a repository without values (#1) | TXT-VAL-005 | tests/unit/values-store.test.js |
| pass | js-unit | the view as built TXT-REVIEW-008: no external resource is referenced anywhere on the view (#2) | TXT-REVIEW-008 | tests/unit/text-status.test.js |
| pass | js-unit | the view as built TXT-REVIEW-008: source links are derived from repoUrl when no branch is configured (#2) | TXT-REVIEW-008 | tests/unit/text-status.test.js |
| pass | js-unit | the view as built TXT-REVIEW-008: the fixture repo — no source configuration — still renders in full (#2) | TXT-REVIEW-008 | tests/unit/text-status.test.js |
| pass | js-unit | the wiring the reading view depends on TXT-EDIT-018: closing the drawer restores the committed rendering (#15) | TXT-EDIT-018 | tests/unit/reader-editor.test.js |
| pass | js-unit | the wiring the reading view depends on TXT-EDIT-018: the Reader moves the one editor rather than creating another (#15) | TXT-EDIT-018 | tests/unit/reader-editor.test.js |
| pass | js-unit | the wiring the reading view depends on TXT-EDIT-018: the Reader writes nothing and posts nowhere (#15) | TXT-EDIT-018 | tests/unit/reader-editor.test.js |
| pass | js-unit | Value formatting TXT-FMT-001: rounding is half-up, not R half-to-even (#1) | TXT-FMT-001 | tests/unit/text-bindings.test.js |
| pass | js-unit | Value formatting TXT-FMT-002: integers render without a decimal point and digits fixes the decimal places (#1) | TXT-FMT-002 | tests/unit/text-bindings.test.js |
| pass | js-unit | Value formatting TXT-FMT-003: the scale qualifier converts the ARD proportion to a percentage for prose (#1) | TXT-FMT-003 | tests/unit/text-bindings.test.js |
| pass | js-unit | what a draft looks like in the reading view TXT-EDIT-016: a computed value is marked in the prose, as the document marks it (#15) | TXT-EDIT-016 | tests/unit/reader-editor.test.js |
| pass | js-unit | what a draft looks like in the reading view TXT-EDIT-016: a number that came from no binding is marked as the failure it is (#15) | TXT-EDIT-016 | tests/unit/reader-editor.test.js |
| pass | js-unit | what a draft looks like in the reading view TXT-EDIT-016: paragraphs survive, and the escaper is the caller's (#15) | TXT-EDIT-016 | tests/unit/reader-editor.test.js |
| pass | js-unit | what a draft looks like in the reading view TXT-EDIT-017: an untouched block claims nothing at all (#15) | TXT-EDIT-017 | tests/unit/reader-editor.test.js |
| pass | js-unit | what a draft looks like in the reading view TXT-EDIT-017: the block always says whether it is showing the report or a draft (#15) | TXT-EDIT-017 | tests/unit/reader-editor.test.js |
| pass | js-unit | where the reading view offers to edit TXT-EDIT-013: a block with an editor gets an affordance and a drawer bound to it (#15) | TXT-EDIT-013 | tests/unit/reader-editor.test.js |
| pass | js-unit | where the reading view offers to edit TXT-EDIT-013: the drawer ships empty — the Reader renders no second editor (#15) | TXT-EDIT-013 | tests/unit/reader-editor.test.js |
| pass | js-unit | where the reading view offers to edit TXT-EDIT-014: a block held out of the report is not editable from the report (#15) | TXT-EDIT-014 | tests/unit/reader-editor.test.js |
| pass | js-unit | where the reading view offers to edit TXT-EDIT-014: the editable rule is one function, and it says why (#15) | TXT-EDIT-014 | tests/unit/reader-editor.test.js |
| pass | js-unit | where the reading view offers to edit TXT-EDIT-014: with no editors mounted the Reader renders exactly as before (#15) | TXT-EDIT-014 | tests/unit/reader-editor.test.js |
| pass | js-unit | where the reading view offers to edit TXT-EDIT-015: drawer and home ids are derived, never authored, and collision-free (#15) | TXT-EDIT-015 | tests/unit/reader-editor.test.js |
| pass | r-unit | DSP-ALL-001: every display renders a table that actually contains numbers (#1) | DSP-ALL-001 | test-displays.R |
| pass | r-unit | DSP-ALL-002: every display declares a regulatory identifier and a source line (#1) | DSP-ALL-002 | test-displays.R |
| pass | text-review | TXT-AE-001: TXT-E3-1221 parameterized block reviewed by @jwildfire on 2026-07-25 (#1) | TXT-AE-001 | library/text/TXT-E3-1221.md |
| fail | text-review | TXT-AE-002: TXT-E3-1222 generated block reviewed (#1) | TXT-AE-002 | library/text/TXT-E3-1222.md |
| pass | text-review | TXT-AE-003: TXT-E3-1224 boilerplate block reviewed by @jwildfire on 2026-07-25 (#1) | TXT-AE-003 | library/text/TXT-E3-1224.md |
| fail | text-review | TXT-CONC-001: TXT-E3-1206 generated block reviewed (#1) | TXT-CONC-001 | library/text/TXT-E3-1206.md |
| pass | text-review | TXT-DEMO-001: TXT-E3-1102 parameterized block reviewed by @jwildfire on 2026-07-25 (#1) | TXT-DEMO-001 | library/text/TXT-E3-1102.md |
| pass | text-review | TXT-DESIGN-001: TXT-E3-0901 parameterized block reviewed by @jwildfire on 2026-07-25 (#1) | TXT-DESIGN-001 | library/text/TXT-E3-0901.md |
| pass | text-review | TXT-DESIGN-001: TXT-E3-0908 boilerplate block reviewed by @jwildfire on 2026-07-25 (#1) | TXT-DESIGN-001 | library/text/TXT-E3-0908.md |
| fail | text-review | TXT-DISC-001: TXT-E3-1300 generated block reviewed (#1) | TXT-DISC-001 | library/text/TXT-E3-1300.md |
| fail | text-review | TXT-DISP-001, TXT-VAL-006: TXT-E3-1002 generated block reviewed (#1) | TXT-DISP-001 TXT-VAL-006 | library/text/TXT-E3-1002.md |
| pass | text-review | TXT-DISP-001: TXT-E3-1001 parameterized block reviewed by @jwildfire on 2026-07-25 (#1) | TXT-DISP-001 | library/text/TXT-E3-1001.md |
| pass | text-review | TXT-ETH-001: TXT-E3-0502 boilerplate block reviewed by @jwildfire on 2026-07-25 (#1) | TXT-ETH-001 | library/text/TXT-E3-0502.md |
| pass | text-review | TXT-ETH-001: TXT-E3-0503 boilerplate block reviewed by @jwildfire on 2026-07-25 (#1) | TXT-ETH-001 | library/text/TXT-E3-0503.md |
| pass | text-review | TXT-EXP-001: TXT-E3-1201 parameterized block reviewed by @jwildfire on 2026-07-25 (#1) | TXT-EXP-001 | library/text/TXT-E3-1201.md |
| pass | text-review | TXT-POP-001: TXT-E3-1101 parameterized block reviewed by @jwildfire on 2026-07-25 (#1) | TXT-POP-001 | library/text/TXT-E3-1101.md |
| fail | text-review | TXT-SAE-001: TXT-E3-1231 generated block reviewed (#1) | TXT-SAE-001 | library/text/TXT-E3-1231.md |
Traceability
No generated output yet, so the data → ARD → display chain is empty.
Provenance
- Generated
- 2026-07-27T04:44:02.378Z
- Environment
- os Darwin 23.6.0 · node v24.14.0 · vitest 2.1.9 · r 4.3.3
- CI run
- Not recorded for this evidence set