Quality / quality

Framework

Quality Framework — evidence

The requirements to tests to evidence loop itself: matrix extraction, test-name conventions, evidence normalization across testthat and vitest, drift guards, and the published evidence pages.

75reviewed requirementsquality.md
212test recordsjs-unit · r-unit
0failing212 passing
97%requirement coverage73/75 evidenced

Requirements

IDAreaRequirementEvidence typeResult
QC-MATRIX-001ExtractionA requirement matrix row contributes to the extract only when its ID cell is exactly a requirement ID matching ^[A-Z]{2,4}-[A-Z]+-\d+[A-D]?$ and its requirement text is non-empty.js-unit1 passing
QC-MATRIX-002ExtractionWhen a table header row is present, columns are located by name (ID, Area, Requirement, Source, Evidence Type, Status); the safety.viz positional layout is the fallback.js-unit2 passing
QC-MATRIX-003ExtractionRequirement text containing an escaped pipe (|) is extracted intact rather than split into two cells.js-unit1 passing
QC-MATRIX-004ExtractionTables in the document that are not requirement tables, and prose containing requirement IDs, contribute nothing to the extract.js-unit1 passing
QC-MATRIX-005ExtractionThe committed extract is timestamp-free and a pure function of the matrix content, so the freshness guard is a plain content comparison.js-unit2 passing
QC-DRIFT-001Guardsrequirements --check reports added, removed and text-changed requirement IDs and exits non-zero when the committed extract differs from a fresh extraction.js-unit2 passing
QC-DRIFT-002Guardsevidence --check reports missing tests, new tests and pass/fail changes, and ignores provenance and traceability fields entirely.js-unit2 passing
QC-NAME-001ConventionEvery test title in both suites matches "<REQ-ID>[, <REQ-ID>]: <description> (#<issue>)"; a guard test in each suite enforces it.js-unit2 passing
QC-NAME-002ConventionRequirement IDs and issue references are parsed out of a test title, supporting several IDs and several issue refs in one title.js-unit3 passing
QC-EVID-001EvidenceVitest JSON reporter output normalizes into contracts §8 records carrying requirementIds, title, suite, passed and file.js-unit6 passing
QC-EVID-002Evidencetestthat results from qc/testthat-results.json normalize into the same record shape with suite: "r-unit".js-unit1 passing
QC-EVID-003EvidenceAny testthat status that is not exactly pass (fail, error, skip) records as not passed, so the evidence page never overstates a run.js-unit1 passing
QC-EVID-004EvidenceHuman review of a text block records as a text-review suite record carrying reviewedBy and reviewedAt, so one page shows automated and human evidence together.js-unit2 passing
QC-ROUTE-001RoutingA JS test file routes to its module by path — tests/unit/<module>/** or tests/unit/<module>-<topic>.test.js.js-unit2 passing
QC-ROUTE-002RoutingAn R test file test-<module>[-<topic>].R routes to <module> by longest-prefix match against the registry.js-unit1 passing
QC-ROUTE-003RoutingA test that routes to no module is shared scaffold and is duplicated into every module's evidence set, so each set is self-contained.js-unit2 passing
QC-ROUTE-004RoutingThe module universe comes from site/config.json — components plus displays — so registering a display is all it takes for its evidence set to appear.js-unit1 passing
QC-ROUTE-005RoutingA component whose test files are named by topic rather than by module declares its file stems in the registry (testPrefixes), and the longest declared prefix wins.js-unit2 passing
QC-ROUTE-006RoutingA whole suite may be owned by one component through the registry (suites), which is how text-review records route to the Text Library regardless of file path.js-unit1 passing
QC-ROUTE-007RoutingWhen a test file covers several modules, records route by the requirement-ID prefixes their owning registry entries declare; a record whose IDs no entry claims stays shared.js-unit2 passing
QC-EVID-005EvidenceA text block awaiting human approval is reported as pending review and blocks assembly, but does not fail the evidence run — draft is a lifecycle state, not a defect.js-unit1 passing
QC-EVID-006EvidenceTest-file paths in a committed evidence set are recorded relative to the repository root, including when the run happens in a git worktree, so the artifact names the repository rather than the machine that produced it.js-unit5 passing
QC-UNRES-001ResolutionRequirement IDs referenced by a test but defined in no matrix are reported as UNRESOLVED at build time and rendered on the Quality page.js-unit2 passing
QC-UNRES-002ResolutionReviewed requirements that no test references are reported as uncovered, with a coverage proportion per component.js-unit1 passing
QC-UNRES-003ResolutionAn ID defined in a sibling component's matrix counts as resolved, not unresolved, so shared IDs do not produce false alarms.js-unit1 passing
QC-SITE-001SiteThe shared shell substitutes title, description, navigation and root prefix, so one build serves the site at any mount depth via relative URLs.js-unit4 passing
QC-SITE-002SiteThe build fails when any internal href/src in the emitted HTML does not resolve to an emitted file.js-unit4 passing
QC-SITE-003SiteThe build fails when the emitted site references any external resource — script, stylesheet, font, image or CSS import — so the whole site works offline.js-unit3 passing
QC-SITE-004SiteHTML embedded from the pipeline (a rendered display, an assembled fragment) is stripped of scripts, event handlers, external stylesheets and document wrappers before it is placed on a page.js-unit5 passing
QC-SITE-005SiteA registry entry's status is derived from the filesystem — planned until an ARD exists, built once it does, evidenced once an evidence set does.js-unit7 passing
QC-SITE-006SiteEvery page renders a documented "not yet generated" state when its input is absent, and the build never throws on a missing or malformed input.js-unit8 passing
QC-SITE-007SiteA display directory present on disk but absent from the registry renders as an unregistered card rather than disappearing from the gallery.js-unit1 passing
QC-CI-001CICI runs the JS suite, both freshness guards and the site build on every pull request, and runs the R suite in a separate job.cino test
QC-CI-002CIThe built site publishes to GitHub Pages from the default branch through actions/deploy-pages under the pages concurrency group.cino test
QC-DEMO-001DemoThe Demo app's selection — active tab, display, text block, focus target — round-trips losslessly through the URL hash, so any view of the report is a shareable link.js-unit2 passing
QC-DEMO-002DemoAn unknown or absent tab in a deep link decodes to the default tab; the four tabs are Reader, Tables, Text and Templates.js-unit2 passing
QC-DEMO-003DemoA link from one pane to another pane's standalone surface resolves to a tab switch carrying the selection it named — a display permalink selects that display, a text-block anchor selects that block — at any authored path depth.js-unit4 passing
QC-DEMO-004DemoLinks that are not pane crossings are left to navigate: Quality, Design & Research, absolute URLs, and bare fragments (which are in-pane scrolling).js-unit2 passing
QC-DEMO-005DemoA crossing that names no display keeps the display already selected, so moving between panes does not silently reset what the visitor was looking at.js-unit2 passing
QC-DEMO-006DemoA display slug that is not in the build falls back to the first available display rather than rendering a blank pane.js-unit1 passing
QC-DEMO-007DemoEvery pane is server-rendered and present in the emitted HTML with exactly one visible; the app's tablist uses its own class vocabulary and carries the tablist/tab/tabpanel ARIA wiring.js-unit3 passing
QC-DEMO-008DemoA tab whose pane did not render is dropped from the tablist rather than shown empty.js-unit1 passing
QC-DEMO-009DemoThe Tables pane renders one panel per display and one picker entry per display, shows exactly one, opens on the requested display, and falls back to the first when the request is unknown.js-unit3 passing
QC-DEMO-010DemoAn empty display library renders the documented empty state rather than an app with no content.js-unit1 passing
QC-DEMO-011DemoThe Templates pane renders every section of the E3 model, marking those this report does not populate, rather than trimming the skeleton to what happens to be built.js-unit1 passing
QC-DEMO-012DemoDisplay numbers in the Templates pane are derived from assembly order by the same tested function the assembler uses, never authored; reordering the assembly moves every number and changes no slug.js-unit2 passing
QC-DEMO-013DemoThe Templates pane renders its documented empty state when the section model is missing, and renders correctly on a tree where the assembler has never run.js-unit2 passing
QC-DEMO-014DemoThe auto-generated provenance section is identified as generated in the Templates pane.js-unit1 passing
QC-DEMO-016DemoThe application strip's four views are real links to real pages, marked with aria-current rather than tab-selection state, so the bar is working navigation with no JavaScript and the client only upgrades it.js-unit2 passing
QC-DEMO-017DemoThe application strip carries a live context readout — study, assigned display number, slug, iteration and short ARD hash — built from an embedded index that is escaped so it cannot close its own script element.js-unit3 passing
QC-DEMO-018DemoThe navigation tree is rooted at the study, with documents, displays and text as the collections beneath it; more than one document is listed, and one that is not built is marked rather than hidden.js-unit2 passing
QC-DEMO-019DemoA display records every document in the library that places it — not only the primary one — and the explorer states no display number at all; a text block that is not on disk is left out of the tree while a draft block is flagged in it.js-unit3 passing
QC-DEMO-020DemoThe explorer renders the study, every group with its item count, opens only the active group, and marks the selected item.js-unit3 passing
QC-DEMO-021DemoEvery selectable item in the explorer is a real link carrying its own deep link, and an unbuilt item is not a link at all.js-unit2 passing
QC-DEMO-022DemoThe header carries a Read/Edit mode control in which Read is current and Edit is genuinely disabled, and the explorer renders without throwing on an empty registry.js-unit2 passing
QC-DEMO-023DemoA built document contributes its own top-level sections to the tree, and a section counts as populated when it or anything beneath it is; an unbuilt document contributes none.js-unit3 passing
QC-DEMO-024DemoSections render beneath their own document, each a deep link to its heading, with unpopulated sections still navigable and labelled as modelled-but-not-populated.js-unit2 passing
QC-DEMO-025DemoExpansion and selection are one state, not two: the open document shows its table of contents and every other document shows its title alone, with no per-document disclosure control in the markup, no per-document collapse flag in the client, and nothing in the stylesheet that can hide the open document's contents. Group-level collapse is unaffected.js-unit4 passing
QC-DEMO-026DemoSections the report does not populate are dimmed as a whole row and keep the tooltip that explains why, while populated sections stay at full contrast; a group with no items renders as a heading rather than an empty folder.js-unit2 passing
QC-DEMO-027DemoThe Values pane shows every value's name, number and provenance — an ARD address with its iteration and hash, or the declared arithmetic for a derived value — and the text blocks that cite it.js-unit2 passing
QC-DEMO-028DemoThe Values pane states the verdict of the gate that re-derived the store against the committed ARDs, and renders a documented empty state when no store exists.js-unit2 passing
QC-DEMO-029DemoValues are a collection of the study in the navigation tree, listed with their formatted numbers, and selecting one focuses it in the pane rather than introducing a fourth selection key.js-unit1 passing
QC-DEMO-030DemoA link to any document's standalone reader page resolves to the Documents view naming that document — the primary document's page by the key index, every other template object by its own — so a second document is absorbed into the app the way a display permalink already is.js-unit3 passing
QC-DEMO-031DemoA document selection resolves against the documents the page actually rendered, accepting either a document id or the basename of that document's reader page, and falls back to the first rendered document rather than to an empty pane.js-unit4 passing
QC-DEMO-032DemoThe Documents pane renders one panel per assembled document from the same reader renderer, keyed by both document id and reader-page basename, shows exactly one, and hoists a single trace panel and index above the set rather than emitting one per document.js-unit5 passing
QC-DEMO-033DemoA document the page rendered is a selectable explorer node carrying its standalone permalink as the no-JavaScript fallback; a document the page did not render stays an ordinary link out with no selection attributes.js-unit4 passing
QC-DEMO-034DemoEvery rendered document contributes its own top-level sections to the explorer, each section link naming its document, and a section slug is resolved inside the document on screen rather than across the page.js-unit2 passing
QC-DEMO-035DemoEach document panel carries its own prose disclosure, so a document whose blocks are unreviewed reads as draft inside the app exactly as it does on its own page.js-unit3 passing
QC-SITE-013SiteThe display store states which documents place each display, built over the whole template library: the display's own page lists every document with a link to it and the number that document assigned, a display no document places says so, and the gallery card names those documents rather than counting them.js-unit4 passing
QC-SITE-014SiteA display placed in a document carries a hyperlink to its entry in the display store, written in the form the app's link-interception rule recognises, so the same href is a pane switch inside the demo and a real navigation on the standalone reader page.js-unit1 passing
QC-SITE-012SiteThe stylesheet expresses the explorer's one state and only that: a document's section list is hidden by default and revealed by sitting next to the current document, with no per-node collapse class and no disclosure-control rules left to override it.js-unit2 passing
QC-SITE-011SiteTwo documents assembled from the shared libraries quote the same artifacts: every display both documents place resolves to the same ARD source and the same ARD payload, and both carry the same value store with no value differing in raw value or formatted string. Only the per-document display number differs.js-unit3 passing
QC-SITE-008Sitesite/site.css parses as a whole: every block is closed, no block is closed that was never opened, and no declaration sits outside a rule — so no rule in the file can be silently dead in the browser.js-unit3 passing
QC-SITE-009SiteThe site publishes one reader page and one template page for every assembled template object in library/templates/, discovered from the library rather than declared: an object absent from site/config.json still publishes, titled from its own model, and every document reaches every other from the switcher, the navigation tree and the home page.js-unit8 passing
QC-SITE-010SiteEvery document states whether its own prose has been reviewed, derived from the approval.state the assembler recorded on each block it placed: a document holding unapproved blocks carries a notice above its first section and a flag in the switcher, the navigation tree and its home-page card; a document whose blocks are all approved says that instead.js-unit5 passing

Test records

ResultSuiteTestRequirementsFile
passjs-unita display and the documents that place it QC-SITE-013: a display no document places says so rather than showing an empty row (#42)QC-SITE-013tests/unit/site-render.test.js
passjs-unita display and the documents that place it QC-SITE-013: the display page lists every document that places it, and its number there (#42)QC-SITE-013tests/unit/site-render.test.js
passjs-unita display and the documents that place it QC-SITE-013: the gallery card names the documents that place each display (#42)QC-SITE-013tests/unit/site-render.test.js
passjs-unita display and the documents that place it QC-SITE-013: the index reads the whole library, and records what each document calls a display (#42)QC-SITE-013tests/unit/site-render.test.js
passjs-unita display and the documents that place it QC-SITE-014: a display placed in a document hyperlinks to its entry in the store (#42)QC-SITE-014tests/unit/site-render.test.js
passjs-unita document carries its own disclosure into the pane QC-DEMO-035: a reader rendered for a pane emits no trace panel of its own (#36)QC-DEMO-035tests/unit/site-documents.test.js
passjs-unita document carries its own disclosure into the pane QC-DEMO-035: each panel states its own prose state, so a draft reads as draft in the app (#36)QC-DEMO-035tests/unit/site-documents.test.js
passjs-unita document contents in the tree QC-DEMO-023: a section counts as populated when anything beneath it is (#1)QC-DEMO-023tests/unit/site-demo.test.js
passjs-unita document contents in the tree QC-DEMO-023: an unbuilt document contributes no sections (#1)QC-DEMO-023tests/unit/site-demo.test.js
passjs-unita document contents in the tree QC-DEMO-023: the document lists its own top-level sections, not the whole model (#1)QC-DEMO-023tests/unit/site-demo.test.js
passjs-unita document contents in the tree QC-DEMO-024: sections render under their document, each a deep link to its heading (#1)QC-DEMO-024tests/unit/site-demo.test.js
passjs-unita document contents in the tree QC-DEMO-024: the sections belong to their document, so a second document has its own (#1)QC-DEMO-024tests/unit/site-demo.test.js
passjs-unita document contents in the tree QC-DEMO-025: a document's contents sit immediately after it, so the open one is the one shown (#40)QC-DEMO-025tests/unit/site-demo.test.js
passjs-unita document contents in the tree QC-DEMO-025: an unbuilt document contributes no contents and still no control (#40)QC-DEMO-025tests/unit/site-demo.test.js
passjs-unita document contents in the tree QC-DEMO-025: no document carries a disclosure control — selection alone opens its contents (#40)QC-DEMO-025tests/unit/site-demo.test.js
passjs-unita document contents in the tree QC-DEMO-026: a group with no items is a heading rather than an empty folder (#1)QC-DEMO-026tests/unit/site-demo.test.js
passjs-unita document contents in the tree QC-DEMO-026: an unpopulated section is dimmed and keeps its explanatory tooltip (#1)QC-DEMO-026tests/unit/site-demo.test.js
passjs-unita document's contents follow the selection and nothing else QC-SITE-012: no rule survives that could hide the open document's contents (#40)QC-SITE-012tests/unit/site-css.test.js
passjs-unita document's contents follow the selection and nothing else QC-SITE-012: the current document reveals its contents, and only the current one (#40)QC-SITE-012tests/unit/site-css.test.js
passjs-unita link to a reader page is a pane crossing QC-DEMO-030: a reader crossing carries the heading named in its fragment (#36)QC-DEMO-030tests/unit/site-demo.test.js
passjs-unita link to a reader page is a pane crossing QC-DEMO-030: every document's reader page resolves to the Documents view naming it (#36)QC-DEMO-030tests/unit/site-demo.test.js
passjs-unita link to a reader page is a pane crossing QC-DEMO-030: pages outside the reader directory are still left to navigate (#36)QC-DEMO-030tests/unit/site-demo.test.js
passjs-unita rendered document is selectable, not somewhere else QC-DEMO-033: a document the page did NOT render stays a link out (#36)QC-DEMO-033tests/unit/site-demo.test.js
passjs-unita rendered document is selectable, not somewhere else QC-DEMO-033: a document the page rendered is an ordinary selection (#36)QC-DEMO-033tests/unit/site-demo.test.js
passjs-unita rendered document is selectable, not somewhere else QC-DEMO-033: an unbuilt document is not selectable however the page was built (#36)QC-DEMO-033tests/unit/site-demo.test.js
passjs-unita rendered document is selectable, not somewhere else QC-DEMO-033: it keeps its permalink, so the node works with JavaScript off (#36)QC-DEMO-033tests/unit/site-demo.test.js
passjs-unita rendered document is selectable, not somewhere else QC-DEMO-034: a document the page did not render contributes no sections (#36)QC-DEMO-034tests/unit/site-demo.test.js
passjs-unita rendered document is selectable, not somewhere else QC-DEMO-034: every rendered document contributes its own sections, named for it (#36)QC-DEMO-034tests/unit/site-demo.test.js
passjs-unita rendered document is selectable, not somewhere else QC-DEMO-035: a draft document is flagged in the tree beside the one that is not (#36)QC-DEMO-035tests/unit/site-demo.test.js
passjs-unitdesign and research pages QC-SITE-001: a link to a file that is not a rendered page points at the repository (#1)QC-SITE-001tests/unit/site-render.test.js
passjs-unitdesign and research pages QC-SITE-001: cross-references between documents rewrite to the built pages (#1)QC-SITE-001tests/unit/site-render.test.js
passjs-unitdesign and research pages QC-SITE-006: a registered document that is missing is listed and flagged (#1)QC-SITE-006tests/unit/site-render.test.js
passjs-unitdraft prose is disclosed where it is read QC-SITE-010: an unreviewed document says so above its first section (#32)QC-SITE-010tests/unit/site-documents.test.js
passjs-unitdraft prose is disclosed where it is read QC-SITE-010: prose state is read off the assembled document, not asserted (#32)QC-SITE-010tests/unit/site-documents.test.js
passjs-unitdraft prose is disclosed where it is read QC-SITE-010: the notice is on the rendered reader, before the document body (#32)QC-SITE-010tests/unit/site-documents.test.js
passjs-unitdraft prose is disclosed where it is read QC-SITE-010: the switcher and the sidebar carry the same flag as the page (#32)QC-SITE-010tests/unit/site-documents.test.js
passjs-unitembedded HTML sanitization QC-SITE-004: matrix-cell markdown renders as code spans with the HTML still escaped (#1)QC-SITE-004tests/unit/site-validate.test.js
passjs-unitembedded HTML sanitization QC-SITE-004: sanitizing an absent fragment yields an empty string, not a crash (#1)QC-SITE-004tests/unit/site-validate.test.js
passjs-unitembedded HTML sanitization QC-SITE-004: scripts, handlers, external stylesheets and imports are stripped (#1)QC-SITE-004tests/unit/site-validate.test.js
passjs-unitembedded HTML sanitization QC-SITE-004: text interpolated into a page is HTML-escaped (#1)QC-SITE-004tests/unit/site-validate.test.js
passjs-unitembedded HTML sanitization QC-SITE-004: the document wrapper is unwrapped and the table content preserved (#1)QC-SITE-004tests/unit/site-validate.test.js
passjs-unitevidence freshness guard QC-DRIFT-002: a missing test, a new test and a status change are all drift (#1)QC-DRIFT-002tests/unit/evidence-normalize.test.js
passjs-unitevidence freshness guard QC-DRIFT-002: provenance and traceability differences alone are not drift (#1)QC-DRIFT-002tests/unit/evidence-normalize.test.js
passjs-unitevidence records name the repository, not the machine QC-EVID-006: a path from a git worktree records as the same repository path (#1)QC-EVID-006tests/unit/evidence-normalize.test.js
passjs-unitevidence records name the repository, not the machine QC-EVID-006: a path outside the repository is left visible rather than mangled (#1)QC-EVID-006tests/unit/evidence-normalize.test.js
passjs-unitevidence records name the repository, not the machine QC-EVID-006: a test-file path is recorded relative to the repository root (#1)QC-EVID-006tests/unit/evidence-normalize.test.js
passjs-unitevidence records name the repository, not the machine QC-EVID-006: an already-relative path, an empty path, or no root is left alone (#1)QC-EVID-006tests/unit/evidence-normalize.test.js
passjs-unitevidence records name the repository, not the machine QC-EVID-006: buildEvidenceSets relativises before routing, so routing is unchanged (#1)QC-EVID-006tests/unit/evidence-normalize.test.js
passjs-unitevidence set assembly QC-EVID-001: a module with no records at all gets no evidence set (#1)QC-EVID-001tests/unit/evidence-normalize.test.js
passjs-unitevidence set assembly QC-EVID-001: records are sorted by suite then title, and provenance is quarantined (#1)QC-EVID-001tests/unit/evidence-normalize.test.js
passjs-unitevidence set assembly QC-EVID-005: an unapproved block is recorded as pending, distinguishable from a failure (#1)QC-EVID-005tests/unit/evidence-normalize.test.js
passjs-unitevidence set assembly QC-ROUTE-003: shared scaffold records are duplicated into every module set (#1)QC-ROUTE-003tests/unit/evidence-normalize.test.js
passjs-unitevidence set assembly QC-ROUTE-006: a registry-owned suite routes to its component whatever the file path (#1)QC-ROUTE-006tests/unit/evidence-normalize.test.js
passjs-unitevidence summary and run provenance QC-EVID-001: run provenance is null locally and built from the Actions env in CI (#1)QC-EVID-001tests/unit/evidence-normalize.test.js
passjs-unitevidence summary and run provenance QC-EVID-001: the summary counts records by suite and collects requirement IDs (#1)QC-EVID-001tests/unit/evidence-normalize.test.js
passjs-unitexternal resource validation QC-SITE-003: a protocol-relative resource is treated as external (#1)QC-SITE-003tests/unit/site-validate.test.js
passjs-unitexternal resource validation QC-SITE-003: an external script, stylesheet, image or CSS import each fail the build (#1)QC-SITE-003tests/unit/site-validate.test.js
passjs-unitexternal resource validation QC-SITE-003: outbound anchor links are navigation and do not fail the build (#1)QC-SITE-003tests/unit/site-validate.test.js
passjs-unitinternal link validation QC-SITE-002: a broken internal href is reported with its file and target (#1)QC-SITE-002tests/unit/site-validate.test.js
passjs-unitinternal link validation QC-SITE-002: a query string or fragment on an internal link is stripped before resolving (#1)QC-SITE-002tests/unit/site-validate.test.js
passjs-unitinternal link validation QC-SITE-002: a site whose internal links all resolve passes validation (#1)QC-SITE-002tests/unit/site-validate.test.js
passjs-unitinternal link validation QC-SITE-002: external, fragment, mailto and data targets are not internal links (#1)QC-SITE-002tests/unit/site-validate.test.js
passjs-unititerations QC-SITE-006: a display with no iterations renders a documented empty state (#1)QC-SITE-006tests/unit/site-render.test.js
passjs-unititerations TRC-ITER-001: manifests alone reconstruct the timeline when no ledger exists (#1)TRC-ITER-001tests/unit/site-render.test.js
passjs-unititerations TRC-ITER-001: the timeline merges the ledger with the output manifests (#1)TRC-ITER-001tests/unit/site-render.test.js
passjs-unititerations TRC-ITER-002: current.json names the live iteration (#1)TRC-ITER-002tests/unit/site-render.test.js
passjs-unititerations TRC-ITER-002: with no pointer, or a pointer to a missing version, the highest wins (#1)TRC-ITER-002tests/unit/site-render.test.js
passjs-unititerations TRC-ITER-003: a ledger entry with no output directory is rendered and flagged (#1)TRC-ITER-003tests/unit/site-render.test.js
passjs-unitmodule routing QC-ROUTE-001: a flat tests/unit/<module>-<topic>.test.js routes to that module (#1)QC-ROUTE-001tests/unit/evidence-normalize.test.js
passjs-unitmodule routing QC-ROUTE-001: a JS test under tests/unit/<module>/ routes to that module (#1)QC-ROUTE-001tests/unit/evidence-normalize.test.js
passjs-unitmodule routing QC-ROUTE-002: an R test file routes by longest-prefix match on the registry (#1)QC-ROUTE-002tests/unit/evidence-normalize.test.js
passjs-unitmodule routing QC-ROUTE-003: an unroutable test file is shared scaffold (#1)QC-ROUTE-003tests/unit/evidence-normalize.test.js
passjs-unitmodule routing QC-ROUTE-004: the module universe is the site registry, not code (#1)QC-ROUTE-004tests/unit/evidence-normalize.test.js
passjs-unitmodule routing QC-ROUTE-005: a component may declare the topic-named test stems it owns (#1)QC-ROUTE-005tests/unit/evidence-normalize.test.js
passjs-unitmodule routing QC-ROUTE-005: a slug match always beats a declared prefix (#1)QC-ROUTE-005tests/unit/evidence-normalize.test.js
passjs-unitmodule routing QC-ROUTE-007: a prefix-claimed record lands only in its owners, not in every set (#1)QC-ROUTE-007tests/unit/evidence-normalize.test.js
passjs-unitmodule routing QC-ROUTE-007: requirement-ID prefixes claim a record no test file could route (#1)QC-ROUTE-007tests/unit/evidence-normalize.test.js
passjs-unitpage rendering QC-SITE-005: an evidence page joins reviewed rows to the tests that evidence them (#1)QC-SITE-005tests/unit/site-render.test.js
passjs-unitpage rendering QC-SITE-005: the display page renders all four tabs (#1)QC-SITE-005tests/unit/site-render.test.js
passjs-unitpage rendering QC-SITE-005: the gallery card shows the iteration and ARD row count (#1)QC-SITE-005tests/unit/site-render.test.js
passjs-unitpage rendering QC-SITE-005: the quality index rolls up requirements, tests and coverage (#1)QC-SITE-005tests/unit/site-render.test.js
passjs-unitpage rendering QC-SITE-005: the text library shows tier, approval state and binding resolution (#1)QC-SITE-005tests/unit/site-render.test.js
passjs-unitpage rendering QC-SITE-006: an evidence page with neither matrix nor evidence degrades to a stated gap (#1)QC-SITE-006tests/unit/site-render.test.js
passjs-unitpage rendering QC-SITE-006: the display page for an ungenerated display is all empty states (#1)QC-SITE-006tests/unit/site-render.test.js
passjs-unitpage rendering QC-SITE-006: the home page renders from an empty repository without throwing (#1)QC-SITE-006tests/unit/site-render.test.js
passjs-unitpane crossings QC-DEMO-003: a crossing carries the text block named in the fragment (#1)QC-DEMO-003tests/unit/site-demo.test.js
passjs-unitpane crossings QC-DEMO-003: a display permalink resolves to the Displays view with that display selected (#1)QC-DEMO-003tests/unit/site-demo.test.js
passjs-unitpane crossings QC-DEMO-003: each standalone permalink resolves to the view that replaced it (#1)QC-DEMO-003tests/unit/site-demo.test.js
passjs-unitpane crossings QC-DEMO-003: the rule holds at any authored depth, because panes are written for their own (#1)QC-DEMO-003tests/unit/site-demo.test.js
passjs-unitpane crossings QC-DEMO-004: a bare fragment stays in-pane scrolling and is never intercepted (#1)QC-DEMO-004tests/unit/site-demo.test.js
passjs-unitpane crossings QC-DEMO-004: links that are not pane crossings are left to navigate (#1)QC-DEMO-004tests/unit/site-demo.test.js
passjs-unitpane crossings QC-DEMO-005: a crossing that names no display keeps the one already selected (#1)QC-DEMO-005tests/unit/site-demo.test.js
passjs-unitpane crossings QC-DEMO-005: applying nothing changes nothing (#1)QC-DEMO-005tests/unit/site-demo.test.js
passjs-unitpane crossings QC-DEMO-006: a stale display slug degrades to the first available rather than a blank pane (#1)QC-DEMO-006tests/unit/site-demo.test.js
passjs-unitrequirement drift guard QC-DRIFT-001: added, removed and changed requirement text are all reported (#1)QC-DRIFT-001tests/unit/requirements-matrix.test.js
passjs-unitrequirement drift guard QC-DRIFT-001: an identical extract is not stale (#1)QC-DRIFT-001tests/unit/requirements-matrix.test.js
passjs-unitrequirement IDs referenced by tests QC-NAME-002: requirement IDs are read from test titles only, not comments or strings (#1)QC-NAME-002tests/unit/requirements-matrix.test.js
passjs-unitrequirement matrix extraction QC-MATRIX-001: only rows whose ID cell is exactly a requirement ID are extracted (#1)QC-MATRIX-001tests/unit/requirements-matrix.test.js
passjs-unitrequirement matrix extraction QC-MATRIX-002: a header row without an ID and Requirement pair is not adopted (#1)QC-MATRIX-002tests/unit/requirements-matrix.test.js
passjs-unitrequirement matrix extraction QC-MATRIX-002: table columns are located by header name, not by position (#1)QC-MATRIX-002tests/unit/requirements-matrix.test.js
passjs-unitrequirement matrix extraction QC-MATRIX-003: requirement text containing an escaped pipe survives intact (#1)QC-MATRIX-003tests/unit/requirements-matrix.test.js
passjs-unitrequirement matrix extraction QC-MATRIX-004: other tables and prose mentioning an ID contribute nothing (#1)QC-MATRIX-004tests/unit/requirements-matrix.test.js
passjs-unitrequirement matrix extraction QC-MATRIX-005: an empty or malformed document extracts to nothing rather than throwing (#1)QC-MATRIX-005tests/unit/requirements-matrix.test.js
passjs-unitrequirement matrix extraction QC-MATRIX-005: the extract is deterministic and carries no timestamp (#1)QC-MATRIX-005tests/unit/requirements-matrix.test.js
passjs-unitsuite normalization QC-EVID-001: missing or empty reporter output normalizes to no records (#1)QC-EVID-001tests/unit/evidence-normalize.test.js
passjs-unitsuite normalization QC-EVID-001: vitest output normalizes into contracts §8 records (#1)QC-EVID-001tests/unit/evidence-normalize.test.js
passjs-unitsuite normalization QC-EVID-002: testthat results normalize into the same shape with suite r-unit (#1)QC-EVID-002tests/unit/evidence-normalize.test.js
passjs-unitsuite normalization QC-EVID-003: any testthat status other than pass records as not passed (#1)QC-EVID-003tests/unit/evidence-normalize.test.js
passjs-unitsuite normalization QC-EVID-004: an approved text block becomes a passing text-review record (#1)QC-EVID-004tests/unit/evidence-normalize.test.js
passjs-unitsuite normalization QC-EVID-004: an unapproved generated block records as not passed (#1)QC-EVID-004tests/unit/evidence-normalize.test.js
passjs-unittest naming convention QC-NAME-001: every JS test title carries requirement IDs and an issue reference (#1)QC-NAME-001tests/unit/site-convention.test.js
passjs-unittest naming convention QC-NAME-001: the guard actually sees the suite it is meant to police (#1)QC-NAME-001tests/unit/site-convention.test.js
passjs-unittest-name parsing QC-NAME-002: a scaffold title with no requirement ID still parses its issue ref (#1)QC-NAME-002tests/unit/evidence-normalize.test.js
passjs-unittest-name parsing QC-NAME-002: several requirement IDs and several issue refs parse out of one title (#1)QC-NAME-002tests/unit/evidence-normalize.test.js
passjs-unitthe app page QC-DEMO-007: every pane is server-rendered and present, with exactly one visible (#1)QC-DEMO-007tests/unit/site-demo.test.js
passjs-unitthe app page QC-DEMO-007: panes do not collide with the shell tab controller (#1)QC-DEMO-007tests/unit/site-demo.test.js
passjs-unitthe app page QC-DEMO-007: the page carries no title or lede — content starts at the pane (#1)QC-DEMO-007tests/unit/site-demo.test.js
passjs-unitthe app page QC-DEMO-008: a tab with no rendered pane is dropped rather than rendered empty (#1)QC-DEMO-008tests/unit/site-demo.test.js
passjs-unitthe application strip QC-DEMO-016: a view in the bar is a real link, marked as navigation not as a control (#1)QC-DEMO-016tests/unit/site-demo.test.js
passjs-unitthe application strip QC-DEMO-016: the bar carries only what is not scoped to a study (#1)QC-DEMO-016tests/unit/site-demo.test.js
passjs-unitthe application strip QC-DEMO-017: a display with no iteration yet contributes nulls, not a broken readout (#1)QC-DEMO-017tests/unit/site-demo.test.js
passjs-unitthe application strip QC-DEMO-017: the bar carries the study, and a context index for the live readout (#1)QC-DEMO-017tests/unit/site-demo.test.js
passjs-unitthe application strip QC-DEMO-017: the embedded context index cannot close the script element (#1)QC-DEMO-017tests/unit/site-demo.test.js
passjs-unitthe ARD tab QC-SITE-005: the ARD renders one row per statistic with its condition columns (#1)QC-SITE-005tests/unit/site-render.test.js
passjs-unitthe ARD tab QC-SITE-006: an absent ARD renders the empty state rather than an empty table (#1)QC-SITE-006tests/unit/site-render.test.js
passjs-unitthe CSR reader QC-SITE-006: with no assembled CSR the reader states the gap and still offers the trace index (#1)QC-SITE-006tests/unit/site-render.test.js
passjs-unitthe CSR reader TRC-CHAIN-001: the reader renders bound numbers and embeds the trace index (#1)TRC-CHAIN-001tests/unit/site-render.test.js
passjs-unitthe CSR reader TRC-DOC-001: an absent or unusable assembly normalizes to null instead of throwing (#1)TRC-DOC-001tests/unit/site-render.test.js
passjs-unitthe CSR reader TRC-DOC-001: the assembled document normalizes into sections and nested sections (#1)TRC-DOC-001tests/unit/site-render.test.js
passjs-unitthe display registry QC-SITE-005: status is derived from the filesystem, not from the declared value (#1)QC-SITE-005tests/unit/site-render.test.js
passjs-unitthe display registry QC-SITE-006: a display with no outputs loads to empty structures rather than throwing (#1)QC-SITE-006tests/unit/site-render.test.js
passjs-unitthe display registry QC-SITE-007: a display on disk but absent from the registry is surfaced, not dropped (#1)QC-SITE-007tests/unit/site-render.test.js
passjs-unitthe document set QC-SITE-009: a document not on screen is a link out, not a dead selection (#32)QC-SITE-009tests/unit/site-documents.test.js
passjs-unitthe document set QC-SITE-009: a planned document with no template object keeps its place (#32)QC-SITE-009tests/unit/site-documents.test.js
passjs-unitthe document set QC-SITE-009: an undeclared template object is titled from its own model (#32)QC-SITE-009tests/unit/site-documents.test.js
passjs-unitthe document set QC-SITE-009: every assembled template object becomes a document, declared or not (#32)QC-SITE-009tests/unit/site-documents.test.js
passjs-unitthe document set QC-SITE-009: the home page lists the documents and links both of a document's pages (#32)QC-SITE-009tests/unit/site-documents.test.js
passjs-unitthe document set QC-SITE-009: the primary document keeps the published URLs and the rest sit beside it (#32)QC-SITE-009tests/unit/site-documents.test.js
passjs-unitthe document set QC-SITE-009: the switcher offers every other document from any document (#32)QC-SITE-009tests/unit/site-documents.test.js
passjs-unitthe Documents pane QC-DEMO-032: a document may be requested by its reader page's name (#36)QC-DEMO-032tests/unit/site-demo.test.js
passjs-unitthe Documents pane QC-DEMO-032: an unknown request opens the first document rather than none (#36)QC-DEMO-032tests/unit/site-demo.test.js
passjs-unitthe Documents pane QC-DEMO-032: exactly one panel is visible, and it is the one requested (#36)QC-DEMO-032tests/unit/site-demo.test.js
passjs-unitthe Documents pane QC-DEMO-032: one panel per document, keyed by id and by reader-page name (#36)QC-DEMO-032tests/unit/site-demo.test.js
passjs-unitthe Documents pane QC-DEMO-032: one trace panel above the set, never one per document (#36)QC-DEMO-032tests/unit/site-demo.test.js
passjs-unitthe explorer wiring QC-DEMO-020: the group-level collapse the tree still needs is untouched (#40)QC-DEMO-020tests/unit/site-demo.test.js
passjs-unitthe explorer wiring QC-DEMO-025: the client holds no per-document expansion state at all (#40)QC-DEMO-025tests/unit/site-demo.test.js
passjs-unitthe explorer wiring QC-DEMO-031: a deep link into another document opens that document (#40)QC-DEMO-031tests/unit/site-demo.test.js
passjs-unitthe navigation tree QC-DEMO-018: more than one document is listed, and an unbuilt one says so (#1)QC-DEMO-018tests/unit/site-demo.test.js
passjs-unitthe navigation tree QC-DEMO-018: the study is the root, and documents, displays, text and values hang off it (#1)QC-DEMO-018tests/unit/site-demo.test.js
passjs-unitthe navigation tree QC-DEMO-019: a display records EVERY document that uses it, not just the report (#42)QC-DEMO-019tests/unit/site-demo.test.js
passjs-unitthe navigation tree QC-DEMO-019: a text block that is not on disk is left out, and a draft is flagged (#1)QC-DEMO-019tests/unit/site-demo.test.js
passjs-unitthe navigation tree QC-DEMO-019: the sidebar states no display number, because four assemblies disagree (#42)QC-DEMO-019tests/unit/site-demo.test.js
passjs-unitthe navigation tree QC-DEMO-020: only the active group is open, and the selected item is marked (#1)QC-DEMO-020tests/unit/site-demo.test.js
passjs-unitthe navigation tree QC-DEMO-020: the explorer renders the study, every group, and a count per group (#1)QC-DEMO-020tests/unit/site-demo.test.js
passjs-unitthe navigation tree QC-DEMO-021: an unbuilt document is not a link, so it cannot be selected (#1)QC-DEMO-021tests/unit/site-demo.test.js
passjs-unitthe navigation tree QC-DEMO-021: every selectable item is a real link carrying its own deep link (#1)QC-DEMO-021tests/unit/site-demo.test.js
passjs-unitthe navigation tree QC-DEMO-022: an empty registry renders the explorer without throwing (#1)QC-DEMO-022tests/unit/site-demo.test.js
passjs-unitthe navigation tree QC-DEMO-022: Read is the current mode and Edit is genuinely disabled (#1)QC-DEMO-022tests/unit/site-demo.test.js
passjs-unitthe repository this site is built from QC-SITE-009: this repo's own library is plural and every object is assembled (#32)QC-SITE-009tests/unit/site-documents.test.js
passjs-unitthe repository this site is built from QC-SITE-010: the committed synopsis is unreviewed, and nothing in the site pretends otherwise (#32)QC-SITE-010tests/unit/site-documents.test.js
passjs-unitthe shared selection QC-DEMO-001: a selection round-trips through the URL hash (#1)QC-DEMO-001tests/unit/site-demo.test.js
passjs-unitthe shared selection QC-DEMO-001: empty parts are omitted from the hash so the common case stays short (#1)QC-DEMO-001tests/unit/site-demo.test.js
passjs-unitthe shared selection QC-DEMO-002: an unknown or absent tab decodes to the default rather than an empty app (#1)QC-DEMO-002tests/unit/site-demo.test.js
passjs-unitthe shared selection QC-DEMO-002: the tabs the requirements name are the tabs the app knows (#1)QC-DEMO-002tests/unit/site-demo.test.js
passjs-unitthe shared shell QC-SITE-001: every shell token is substituted and none leaks into the output (#1)QC-SITE-001tests/unit/site-render.test.js
passjs-unitthe shared shell QC-SITE-001: navigation links are relative to the page root so any mount depth works (#1)QC-SITE-001tests/unit/site-render.test.js
passjs-unitthe stylesheet parses QC-SITE-008: declarations live inside a block, never between two of them (#16)QC-SITE-008tests/unit/site-css.test.js
passjs-unitthe stylesheet parses QC-SITE-008: every block in site.css is closed, so no rule is silently dropped (#16)QC-SITE-008tests/unit/site-css.test.js
passjs-unitthe stylesheet parses QC-SITE-008: the last rule in the file is as reachable as the first (#16)QC-SITE-008tests/unit/site-css.test.js
passjs-unitthe Tables pane QC-DEMO-009: an unknown selection falls back to the first display (#1)QC-DEMO-009tests/unit/site-demo.test.js
passjs-unitthe Tables pane QC-DEMO-009: one panel per display, exactly one shown, and every display in the picker (#1)QC-DEMO-009tests/unit/site-demo.test.js
passjs-unitthe Tables pane QC-DEMO-009: the pane opens on the selected display when one is asked for (#1)QC-DEMO-009tests/unit/site-demo.test.js
passjs-unitthe Tables pane QC-DEMO-010: an empty library renders a documented empty state, not a broken pane (#1)QC-DEMO-010tests/unit/site-demo.test.js
passjs-unitthe Templates pane QC-DEMO-011: the whole E3 skeleton is rendered, not only the sections this report fills (#1)QC-DEMO-011tests/unit/site-demo.test.js
passjs-unitthe Templates pane QC-DEMO-012: display numbers are derived from assembly order, never authored (#1)QC-DEMO-012tests/unit/site-demo.test.js
passjs-unitthe Templates pane QC-DEMO-012: reordering the assembly moves every number and no slug (#1)QC-DEMO-012tests/unit/site-demo.test.js
passjs-unitthe Templates pane QC-DEMO-013: a missing section model renders its documented empty state (#1)QC-DEMO-013tests/unit/site-demo.test.js
passjs-unitthe Templates pane QC-DEMO-013: the pane renders before the report has ever been assembled (#1)QC-DEMO-013tests/unit/site-demo.test.js
passjs-unitthe Templates pane QC-DEMO-014: the generated provenance section is named as generated (#1)QC-DEMO-014tests/unit/site-demo.test.js
passjs-unitthe trace index TRC-ARD-004: the ARD hash is computed from the committed file when needed (#1)TRC-ARD-004tests/unit/site-render.test.js
passjs-unitthe trace index TRC-CHAIN-001: each entry carries datasets, specs, ARD, hashes, iteration and commit (#1)TRC-CHAIN-001tests/unit/site-render.test.js
passjs-unitthe trace index TRC-CHAIN-002: every entry links to its gallery page and its evidence page (#1)TRC-CHAIN-002tests/unit/site-render.test.js
passjs-unitthe Values pane QC-DEMO-027: every value shows its name, its number and where it came from (#1)QC-DEMO-027tests/unit/site-demo.test.js
passjs-unitthe Values pane QC-DEMO-027: the blocks that cite a value are listed against it (#1)QC-DEMO-027tests/unit/site-demo.test.js
passjs-unitthe Values pane QC-DEMO-028: a repository with no values store renders the documented empty state (#1)QC-DEMO-028tests/unit/site-demo.test.js
passjs-unitthe Values pane QC-DEMO-028: the pane states the verdict of the gate that re-derived the store (#1)QC-DEMO-028tests/unit/site-demo.test.js
passjs-unitthe Values pane QC-DEMO-029: values are a collection of the study, listed in the tree with their numbers (#1)QC-DEMO-029tests/unit/site-demo.test.js
passjs-unittwo documents, one set of analytics QC-SITE-011: a display two documents both place is the same artifact in both (#36)QC-SITE-011tests/unit/site-documents.test.js
passjs-unittwo documents, one set of analytics QC-SITE-011: only the per-document display NUMBER differs, and that is by design (#36)QC-SITE-011tests/unit/site-documents.test.js
passjs-unittwo documents, one set of analytics QC-SITE-011: two documents cannot disagree about a named value (#36)QC-SITE-011tests/unit/site-documents.test.js
passjs-unitunresolved requirement IDs — the safety.viz blind spot QC-UNRES-001: an ID referenced by a test but defined in no matrix is reported (#1)QC-UNRES-001tests/unit/requirements-matrix.test.js
passjs-unitunresolved requirement IDs — the safety.viz blind spot QC-UNRES-001: nothing referenced and nothing defined produces an empty, non-throwing report (#1)QC-UNRES-001tests/unit/requirements-matrix.test.js
passjs-unitunresolved requirement IDs — the safety.viz blind spot QC-UNRES-002: reviewed requirements no test references are reported as uncovered (#1)QC-UNRES-002tests/unit/requirements-matrix.test.js
passjs-unitunresolved requirement IDs — the safety.viz blind spot QC-UNRES-003: an ID defined in a sibling matrix resolves rather than raising an alarm (#1)QC-UNRES-003tests/unit/requirements-matrix.test.js
passjs-unitwhich document the pane shows QC-DEMO-031: a document resolves from its id or from its reader page's name (#36)QC-DEMO-031tests/unit/site-demo.test.js
passjs-unitwhich document the pane shows QC-DEMO-031: a plain list of ids is accepted, so the caller need not build pairs (#36)QC-DEMO-031tests/unit/site-demo.test.js
passjs-unitwhich document the pane shows QC-DEMO-031: an unknown or absent document falls back to the first rendered one (#36)QC-DEMO-031tests/unit/site-demo.test.js
passr-unitDSP-ALL-001: every display renders a table that actually contains numbers (#1)DSP-ALL-001test-displays.R
passr-unitDSP-ALL-002: every display declares a regulatory identifier and a source line (#1)DSP-ALL-002test-displays.R
passr-unitDSP-EOS-001: the completion-status rows partition each treatment group (#1)DSP-EOS-001test-displays.R
passr-unitDSP-EOS-002: the early-termination reasons partition the early terminations (#1)DSP-EOS-002test-displays.R
passr-unitDSP-EOS-003: a p-value appears on exactly the rows the analysis plan names (#1)DSP-EOS-003test-displays.R
passr-unitDSP-EOS-004: every percentage is based on the treatment group, not the discontinuations (#1)DSP-EOS-004test-displays.R
passr-unitDSP-POP-001: the population rows match the study's own flags in ADSL (#1)DSP-POP-001test-displays.R
passr-unitDSP-POP-002: completion rows use COMP24FL and the complement of DISCONFL (#1)DSP-POP-002test-displays.R
passr-unitDSP-POP-003: the display reads the packaging that states the flags it reports (#1)DSP-POP-003test-displays.R
passr-unitDSP-POP-004: planned and actual treatment agree for every subject (#1)DSP-POP-004test-displays.R
passr-unitDSP-REF-001: both displays publish the figures the pilot's own report printed (#1)DSP-REF-001test-displays.R
passr-unitTFL-QC-001: every test name carries requirement IDs and the tracking issue (#1)TFL-QC-001test-naming-convention.R
passr-unitTFL-QC-002: every requirement ID a test cites exists in a requirement matrix (#1)TFL-QC-002test-naming-convention.R
passr-unitTFL-QC-003: every requirement in a matrix is cited by at least one test (#1)TFL-QC-003test-naming-convention.R
passr-unitTFL-QC-004: requirement matrices use the agreed column contract (#1)TFL-QC-004test-naming-convention.R

Traceability

No generated output yet, so the data → ARD → display chain is empty.

Provenance

Generated
2026-08-27T12:13:10.376Z
Environment
os Darwin 23.6.0 · node v24.14.0 · r 4.3.3
CI run
Not recorded for this evidence set