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.
98reviewed requirementsquality.md
261test recordsjs-unit · r-unit
0failing261 passing
98%requirement coverage96/98 evidenced
Requirements
| ID | Area | Requirement | Evidence type | Result |
|---|---|---|---|---|
| QC-MATRIX-001 | Extraction | A 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-unit | 1 passing |
| QC-MATRIX-002 | Extraction | When 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-unit | 2 passing |
| QC-MATRIX-003 | Extraction | Requirement text containing an escaped pipe (|) is extracted intact rather than split into two cells. | js-unit | 1 passing |
| QC-MATRIX-004 | Extraction | Tables in the document that are not requirement tables, and prose containing requirement IDs, contribute nothing to the extract. | js-unit | 1 passing |
| QC-MATRIX-005 | Extraction | The committed extract is timestamp-free and a pure function of the matrix content, so the freshness guard is a plain content comparison. | js-unit | 2 passing |
| QC-DRIFT-001 | Guards | requirements --check reports added, removed and text-changed requirement IDs and exits non-zero when the committed extract differs from a fresh extraction. | js-unit | 2 passing |
| QC-DRIFT-002 | Guards | evidence --check reports missing tests, new tests and pass/fail changes, and ignores provenance and traceability fields entirely. | js-unit | 2 passing |
| QC-NAME-001 | Convention | Every test title in both suites matches "<REQ-ID>[, <REQ-ID>]: <description> (#<issue>)"; a guard test in each suite enforces it. | js-unit | 2 passing |
| QC-NAME-002 | Convention | Requirement IDs and issue references are parsed out of a test title, supporting several IDs and several issue refs in one title. | js-unit | 3 passing |
| QC-EVID-001 | Evidence | Vitest JSON reporter output normalizes into contracts §8 records carrying requirementIds, title, suite, passed and file. | js-unit | 6 passing |
| QC-EVID-002 | Evidence | testthat results from qc/testthat-results.json normalize into the same record shape with suite: "r-unit". | js-unit | 1 passing |
| QC-EVID-003 | Evidence | Any testthat status that is not exactly pass (fail, error, skip) records as not passed, so the evidence page never overstates a run. | js-unit | 1 passing |
| QC-EVID-004 | Evidence | Human 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-unit | 2 passing |
| QC-ROUTE-001 | Routing | A JS test file routes to its module by path — tests/unit/<module>/** or tests/unit/<module>-<topic>.test.js. | js-unit | 2 passing |
| QC-ROUTE-002 | Routing | An R test file test-<module>[-<topic>].R routes to <module> by longest-prefix match against the registry. | js-unit | 1 passing |
| QC-ROUTE-003 | Routing | A 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-unit | 2 passing |
| QC-ROUTE-004 | Routing | The 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-unit | 1 passing |
| QC-ROUTE-005 | Routing | A 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-unit | 2 passing |
| QC-ROUTE-006 | Routing | A 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-unit | 1 passing |
| QC-ROUTE-007 | Routing | When 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-unit | 2 passing |
| QC-EVID-005 | Evidence | A 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-unit | 1 passing |
| QC-EVID-006 | Evidence | Test-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-unit | 5 passing |
| QC-UNRES-001 | Resolution | Requirement IDs referenced by a test but defined in no matrix are reported as UNRESOLVED at build time and rendered on the Quality page. | js-unit | 2 passing |
| QC-UNRES-002 | Resolution | Reviewed requirements that no test references are reported as uncovered, with a coverage proportion per component. | js-unit | 1 passing |
| QC-UNRES-003 | Resolution | An ID defined in a sibling component's matrix counts as resolved, not unresolved, so shared IDs do not produce false alarms. | js-unit | 1 passing |
| QC-SITE-001 | Site | The shared shell substitutes title, description, navigation and root prefix, so one build serves the site at any mount depth via relative URLs. | js-unit | 4 passing |
| QC-SITE-002 | Site | The build fails when any internal href/src in the emitted HTML does not resolve to an emitted file. | js-unit | 4 passing |
| QC-SITE-003 | Site | The build fails when the emitted site references any external resource — script, stylesheet, font, image or CSS import — so the whole site works offline. | js-unit | 3 passing |
| QC-SITE-004 | Site | HTML 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-unit | 5 passing |
| QC-SITE-005 | Site | A 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-unit | 7 passing |
| QC-SITE-006 | Site | Every 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-unit | 8 passing |
| QC-SITE-007 | Site | A display directory present on disk but absent from the registry renders as an unregistered card rather than disappearing from the gallery. | js-unit | 1 passing |
| QC-CI-001 | CI | CI runs the JS suite, both freshness guards and the site build on every pull request, and runs the R suite in a separate job. | ci | no test |
| QC-CI-002 | CI | The built site publishes to GitHub Pages from the default branch through actions/deploy-pages under the pages concurrency group. | ci | no test |
| QC-DEMO-001 | Demo | The 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-unit | 2 passing |
| QC-DEMO-002 | Demo | An unknown or absent tab in a deep link decodes to the default tab; the four tabs are Reader, Tables, Text and Templates. | js-unit | 2 passing |
| QC-DEMO-003 | Demo | A 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-unit | 4 passing |
| QC-DEMO-004 | Demo | Links that are not pane crossings are left to navigate: Quality, Design & Research, absolute URLs, and bare fragments (which are in-pane scrolling). | js-unit | 2 passing |
| QC-DEMO-005 | Demo | A 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-unit | 2 passing |
| QC-DEMO-006 | Demo | A display slug that is not in the build falls back to the first available display rather than rendering a blank pane. | js-unit | 1 passing |
| QC-DEMO-007 | Demo | Every 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-unit | 3 passing |
| QC-DEMO-008 | Demo | A tab whose pane did not render is dropped from the tablist rather than shown empty. | js-unit | 1 passing |
| QC-DEMO-009 | Demo | The 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-unit | 3 passing |
| QC-DEMO-010 | Demo | An empty display library renders the documented empty state rather than an app with no content. | js-unit | 1 passing |
| QC-DEMO-011 | Demo | The 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-unit | 1 passing |
| QC-DEMO-012 | Demo | Display 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-unit | 2 passing |
| QC-DEMO-013 | Demo | The 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-unit | 2 passing |
| QC-DEMO-014 | Demo | The auto-generated provenance section is identified as generated in the Templates pane. | js-unit | 1 passing |
| QC-DEMO-016 | Demo | The 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-unit | 2 passing |
| QC-DEMO-017 | Demo | The 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-unit | 3 passing |
| QC-DEMO-018 | Demo | The 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-unit | 2 passing |
| QC-DEMO-019 | Demo | A 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-unit | 3 passing |
| QC-DEMO-020 | Demo | The explorer renders the study, every group with its item count, opens only the active group, and marks the selected item. | js-unit | 3 passing |
| QC-DEMO-021 | Demo | Every 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-unit | 2 passing |
| QC-DEMO-022 | Demo | The 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-unit | 2 passing |
| QC-DEMO-023 | Demo | A 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-unit | 3 passing |
| QC-DEMO-024 | Demo | Sections 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-unit | 2 passing |
| QC-DEMO-025 | Demo | Expansion 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-unit | 4 passing |
| QC-DEMO-026 | Demo | Sections 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-unit | 2 passing |
| QC-DEMO-027 | Demo | The 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-unit | 2 passing |
| QC-DEMO-028 | Demo | The 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-unit | 2 passing |
| QC-DEMO-029 | Demo | Values 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-unit | 1 passing |
| QC-DEMO-030 | Demo | A 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-unit | 3 passing |
| QC-DEMO-031 | Demo | A 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-unit | 4 passing |
| QC-DEMO-032 | Demo | The 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-unit | 5 passing |
| QC-DEMO-033 | Demo | A 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-unit | 4 passing |
| QC-DEMO-034 | Demo | Every 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-unit | 2 passing |
| QC-DEMO-035 | Demo | Each 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-unit | 3 passing |
| QC-SITE-013 | Site | The 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-unit | 4 passing |
| QC-SITE-014 | Site | A 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-unit | 1 passing |
| QC-SITE-015 | Site | A display's page lists the requirements that cover that display — the matrix rows matching the prefixes it declares in site/config.json, together with the ids its own evidence cites — and not the whole matrix. A display declaring no prefixes lists none rather than all of them. | `display-requirements.test.js` | 5 passing |
| QC-SITE-012 | Site | The 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-unit | 2 passing |
| QC-SITE-011 | Site | Two 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-unit | 3 passing |
| QC-SITE-008 | Site | site/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-unit | 3 passing |
| QC-SITE-009 | Site | The 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-unit | 8 passing |
| QC-SITE-010 | Site | Every 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-unit | 5 passing |
| QC-DATA-001 | Data | The site reads a data registry (site/config.json → data) together with the vendored package's PROVENANCE.json: every registered dataset carries its upstream path, blob SHA-1, SHA-256 and byte counts and the package its pinned commit and licence; a registered dataset with no vendored file is planned, a derived or alternate-lane dataset is not reported as a missing file, and a vendored file nobody registered is published with a warning, the way an unregistered display is. A repository with no registry renders the empty state. | js-unit | 3 passing |
| QC-DATA-002 | Data | The reverse index is built from the ARDs alone: a display whose current ARD names a dataset in its provenance envelope appears under that dataset with the iteration, row count, prepared hash and ARD hash the envelope recorded; a dataset no ARD names has an empty entry; a dataset an ARD names that the registry does not know still gets one. | js-unit | 2 passing |
| QC-DATA-003 | Data | The Data pane is one page with the package record, one section per dataset (facts, derivation notes, the read-by table linking each display in the form the app absorbs, the upstream path linking the source repository at the pinned commit, a derived dataset linking what it was derived from) and the lanes section naming both packagings and listing only the variables the agreement record says differ; each dataset also has a standalone page with the same facts. | js-unit | 3 passing |
| QC-DATA-004 | Data | Given the data index, a display's header links each dataset it declares to that dataset's page, carrying as its title the row count and hash THIS iteration's ARD recorded and a short hash beside the link; a dataset the header names but the ARD does not is still linked and says so; without the index the labels print as before. | js-unit | 2 passing |
| QC-DATA-005 | Data | Data is a view of the study after Values and a collection in the explorer with one item per dataset (its id as the number, planned when not vendored) plus the lanes; a dataset permalink (data/<id>.html) is absorbed into the Data view with that dataset in focus, the lanes and the index likewise, at any authored depth. | js-unit | 2 passing |
| QC-META-001 | Metadata | The study page renders library/study.yaml as declared: id, title, phase, cut-off and source, the arms in print order, the columns that carry an arm label with the assignment each means, and every analysis set with its label, flag and subjects per arm totalled — linking to the Data section for the source; a repository without a study model renders the empty state and reports it in the build warnings. | js-unit | 2 passing |
| QC-META-002 | Metadata | The specifications page lists every display with its analysis and display files, its current iteration's spec, display and ARD hashes, and every iteration with the actor, change request and hashes its manifest recorded (either manifest shape); custom code shared through custom_from is stated from the borrowing side and the owning side; value declarations are read from library/values/values.yaml with their kind and declaration, each linking to the store. | js-unit | 3 passing |
| QC-META-003 | Metadata | The approvals page lists every text block with its tier, version, approval state, approver, date and drafting model from its frontmatter, with counts of approved, draft and generated blocks held out of the report, each block linking to the Text view. | js-unit | 1 passing |
| QC-META-004 | Metadata | Environments are every distinct R, operating-system and package-version record across every iteration of every display, each listing the iterations built in it; document models are the template objects on disk with sections, slots and the documents assembled from each, an empty library saying so; the requirements page lists every matrix under quality/requirements/ with its row count, its source link and a route to its evidence page. | js-unit | 3 passing |
| QC-META-005 | Metadata | Metadata is a view of the study after Data and a collection in the explorer with one item per page (the study id, the counts as numbers); the pane carries every section by id; a page permalink (metadata/<page>.html) is absorbed into the view with that section in focus and a fragment on it selects the deeper anchor; the Templates view keeps its own tab and permalink as the shortcut to the document models. | js-unit | 2 passing |
| QC-LINK-001 | Links | Given the links, a display's header names the analysis set as the study model defines it (label and flag) and the grouping column, the specification history (iteration count), the environment (R version), the text blocks that bind it and the values sourced from it — each a link into the view that owns it; without the links the header prints as before; an empty list says so rather than printing nothing. | js-unit | 1 passing |
| QC-LINK-002 | Links | The assembler records what a document was built from (inputs: the template object, the study model, every placed display with its iteration, ARD hash and datasets, every block with its state and derived inputs, every value cited, every dataset reached with the displays that read it) and, per block, the displays its bindings resolved against with iteration and hash; the Reader renders that record as a panel of links above the text and the provenance appendix as links to each display, each dataset and the environment. | js-unit | 2 passing |
| QC-LINK-003 | Links | A text block's card lists its inputs derived from its bindings — each display bound with the iteration and ARD hash resolved against, the values cited, its section and its approval, each a link — and names a declared display the block binds nothing from as drift; the frontmatter's displays: list stays the author's declaration, the build already failing a block that binds an undeclared display. | js-unit | 2 passing |
| QC-LINK-004 | Links | The values pane links the arm a source address names to the study model, the datasets behind the value's display to the Data section, and the documents that place the blocks citing it; the arm link needs no index and is always present, the data and document links appear only when their indexes are given. | js-unit | 1 passing |
| QC-LINK-005 | Links | A document whose build failed a gate is flagged in the explorer (gates fail), one that passed is not, and one not yet assembled carries no verdict. | js-unit | 1 passing |
| QC-PIPE-001 | Pipeline | The registry (site/config.json → pipeline.functions) declares the pipeline's functions by the code's own names with kind, code path, what each reads and writes, what it calls and its gates; the site builds one page per function stating those, linking the code, and listing every element the function produced — datasets read, displays with a current iteration, values in the store, documents assembled — each a link back; a call to an unregistered function is a build warning. | js-unit | 2 passing |
| QC-PIPE-002 | Pipeline | The explorer arranges its groups in three parts in the pipeline's order — Inputs (Data, Metadata, Text), Pipeline (the functions), Outputs (Displays, Values, Documents) — each part headed and noted, while groups stays the flat list every consumer reads; the application strip's study views follow the same order and Templates stays global. | js-unit | 1 passing |
| QC-PIPE-003 | Pipeline | The Pipeline pane opens with the whole pipeline as one flow — the three input collections, the functions in order, the three output collections — followed by one section per function addressable by id; a function's permalink (pipeline/<id>.html) is absorbed into the Pipeline view with that function in focus. | js-unit | 1 passing |
| QC-FLOW-001 | Flow | One renderer draws every flow: three lanes labelled Inputs, Function and Outputs, every box a link when it has one and a plain label otherwise, a sub-line for the hash, count or file, an empty lane saying so rather than vanishing, connectors drawn by the stylesheet and nothing external. | js-unit | 1 passing |
| QC-FLOW-002 | Flow | A display's flow lists its datasets with the rows and hash its ARD recorded, its specification files and the study model with the analysis set it resolved, the four functions regenerate() calls, and the files of its current iteration — ard.json with its version, rows and hash, table.html, every RTF artifact with its hash, manifest.json; a display with no iteration draws none. | js-unit | 1 passing |
| QC-FLOW-003 | Flow | A value's flow reads one ARD row (or its input values) through regenerate_values() into its store entry; a text block's flow reads the displays and values it binds and its own source file through the block renderer and the assembler into its rendered prose in each document that places it; a document's flow reads its template, study model, displays, blocks and values through the assembler's seven gates into its JSON and HTML. | js-unit | 1 passing |
| QC-FLOW-004 | Flow | A dataset's flow reads the upstream file at the pinned commit (or the dataset it is derived from, or the alternate lane) through vendoring and verification and the preparation layer with its derivation count into the prepared frame every display recorded and the displays computed from it; a pipeline function's flow reads what it reads into what it writes. | js-unit | 1 passing |
Test records
| Result | Suite | Test | Requirements | File |
|---|---|---|---|---|
| pass | js-unit | a dataset and a function QC-FLOW-004: a vendored dataset flows from its upstream file through vendoring and preparation to the prepared frame and the displays computed from it; a derived one from its source; a function from what it reads to what it writes (#83) | QC-FLOW-004 | tests/unit/site-flow.test.js |
| pass | js-unit | a 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-013 | tests/unit/site-render.test.js |
| pass | js-unit | a 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-013 | tests/unit/site-render.test.js |
| pass | js-unit | a display and the documents that place it QC-SITE-013: the gallery card names the documents that place each display (#42) | QC-SITE-013 | tests/unit/site-render.test.js |
| pass | js-unit | a 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-013 | tests/unit/site-render.test.js |
| pass | js-unit | a 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-014 | tests/unit/site-render.test.js |
| pass | js-unit | a display links what it was built against and what was built from it QC-LINK-001: given the links, the header names the analysis set from the study model, the specification history, the environment, the blocks that bind it and the values sourced from it, each a link; without them the header prints as before (#78) | QC-LINK-001 | tests/unit/site-links.test.js |
| pass | js-unit | a display page lists its own requirements QC-SITE-015: a display declaring no prefixes lists none rather than all of them (#1) | QC-SITE-015 | tests/unit/display-requirements.test.js |
| pass | js-unit | a display page lists its own requirements QC-SITE-015: a display page lists only the requirements matching its declared prefixes (#1) | QC-SITE-015 | tests/unit/display-requirements.test.js |
| pass | js-unit | a display page lists its own requirements QC-SITE-015: an empty matrix stays empty (#1) | QC-SITE-015 | tests/unit/display-requirements.test.js |
| pass | js-unit | a display page lists its own requirements QC-SITE-015: every declared prefix is kept, not just the first (#1) | QC-SITE-015 | tests/unit/display-requirements.test.js |
| pass | js-unit | a display page lists its own requirements QC-SITE-015: the whole prefix must match, so DSP-AE never catches DSP-AEX (#1) | QC-SITE-015 | tests/unit/display-requirements.test.js |
| pass | js-unit | a display QC-FLOW-002: the flow lists the datasets with rows and hash, the specs and the study model, the four functions, and the iteration's files (#83) | QC-FLOW-002 | tests/unit/site-flow.test.js |
| pass | js-unit | a 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-035 | tests/unit/site-documents.test.js |
| pass | js-unit | a 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-035 | tests/unit/site-documents.test.js |
| pass | js-unit | a document contents in the tree QC-DEMO-023: a section counts as populated when anything beneath it is (#1) | QC-DEMO-023 | tests/unit/site-demo.test.js |
| pass | js-unit | a document contents in the tree QC-DEMO-023: an unbuilt document contributes no sections (#1) | QC-DEMO-023 | tests/unit/site-demo.test.js |
| pass | js-unit | a document contents in the tree QC-DEMO-023: the document lists its own top-level sections, not the whole model (#1) | QC-DEMO-023 | tests/unit/site-demo.test.js |
| pass | js-unit | a document contents in the tree QC-DEMO-024: sections render under their document, each a deep link to its heading (#1) | QC-DEMO-024 | tests/unit/site-demo.test.js |
| pass | js-unit | a document contents in the tree QC-DEMO-024: the sections belong to their document, so a second document has its own (#1) | QC-DEMO-024 | tests/unit/site-demo.test.js |
| pass | js-unit | a 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-025 | tests/unit/site-demo.test.js |
| pass | js-unit | a document contents in the tree QC-DEMO-025: an unbuilt document contributes no contents and still no control (#40) | QC-DEMO-025 | tests/unit/site-demo.test.js |
| pass | js-unit | a document contents in the tree QC-DEMO-025: no document carries a disclosure control — selection alone opens its contents (#40) | QC-DEMO-025 | tests/unit/site-demo.test.js |
| pass | js-unit | a document contents in the tree QC-DEMO-026: a group with no items is a heading rather than an empty folder (#1) | QC-DEMO-026 | tests/unit/site-demo.test.js |
| pass | js-unit | a document contents in the tree QC-DEMO-026: an unpopulated section is dimmed and keeps its explanatory tooltip (#1) | QC-DEMO-026 | tests/unit/site-demo.test.js |
| pass | js-unit | a document links what it was built from QC-LINK-002: the inputs panel links the document model, the study model, every placed display with its iteration, every block with its state, every value cited and every dataset reached (#78) | QC-LINK-002 | tests/unit/site-links.test.js |
| pass | js-unit | a document links what it was built from QC-LINK-002: the Reader carries the panel above the text and renders the provenance appendix as links to the display, each dataset and the environment (#78) | QC-LINK-002 | tests/unit/site-links.test.js |
| pass | js-unit | a 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-012 | tests/unit/site-css.test.js |
| pass | js-unit | a 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-012 | tests/unit/site-css.test.js |
| pass | js-unit | a 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-030 | tests/unit/site-demo.test.js |
| pass | js-unit | a 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-030 | tests/unit/site-demo.test.js |
| pass | js-unit | a 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-030 | tests/unit/site-demo.test.js |
| pass | js-unit | a rendered document is selectable, not somewhere else QC-DEMO-033: a document the page did NOT render stays a link out (#36) | QC-DEMO-033 | tests/unit/site-demo.test.js |
| pass | js-unit | a rendered document is selectable, not somewhere else QC-DEMO-033: a document the page rendered is an ordinary selection (#36) | QC-DEMO-033 | tests/unit/site-demo.test.js |
| pass | js-unit | a rendered document is selectable, not somewhere else QC-DEMO-033: an unbuilt document is not selectable however the page was built (#36) | QC-DEMO-033 | tests/unit/site-demo.test.js |
| pass | js-unit | a rendered document is selectable, not somewhere else QC-DEMO-033: it keeps its permalink, so the node works with JavaScript off (#36) | QC-DEMO-033 | tests/unit/site-demo.test.js |
| pass | js-unit | a rendered document is selectable, not somewhere else QC-DEMO-034: a document the page did not render contributes no sections (#36) | QC-DEMO-034 | tests/unit/site-demo.test.js |
| pass | js-unit | a rendered document is selectable, not somewhere else QC-DEMO-034: every rendered document contributes its own sections, named for it (#36) | QC-DEMO-034 | tests/unit/site-demo.test.js |
| pass | js-unit | a 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-035 | tests/unit/site-demo.test.js |
| pass | js-unit | a text block lists its inputs, derived from its bindings QC-LINK-003: a value cited is listed, and a declared display the block binds nothing from is named as drift rather than hidden (#78) | QC-LINK-003 | tests/unit/site-links.test.js |
| pass | js-unit | a text block lists its inputs, derived from its bindings QC-LINK-003: the card lists each display the block binds with the iteration and ARD hash resolved against, the values it cites, its section and its approval, each a link (#78) | QC-LINK-003 | tests/unit/site-links.test.js |
| pass | js-unit | a value, a text block, a document QC-FLOW-003: a value flows from one ARD row or its inputs through regenerate_values() to its store entry; a block through the renderer into the documents that place it; a document through the assembler's gates into its JSON and HTML (#83) | QC-FLOW-003 | tests/unit/site-flow.test.js |
| pass | js-unit | approvals, environments, models and requirements QC-META-003: every text block is listed with its tier, version, approval state, approver, date and drafting model (#77) | QC-META-003 | tests/unit/site-metadata.test.js |
| pass | js-unit | approvals, environments, models and requirements QC-META-004: document models are the template objects on disk, with the documents assembled from each, and an empty library says so (#77) | QC-META-004 | tests/unit/site-metadata.test.js |
| pass | js-unit | approvals, environments, models and requirements QC-META-004: environments are deduplicated across every iteration, each listing the iterations built in it (#77) | QC-META-004 | tests/unit/site-metadata.test.js |
| pass | js-unit | approvals, environments, models and requirements QC-META-004: the requirements page lists every matrix with its row count and a route to its evidence (#77) | QC-META-004 | tests/unit/site-metadata.test.js |
| pass | js-unit | design and research pages QC-SITE-001: a link to a file that is not a rendered page points at the repository (#1) | QC-SITE-001 | tests/unit/site-render.test.js |
| pass | js-unit | design and research pages QC-SITE-001: cross-references between documents rewrite to the built pages (#1) | QC-SITE-001 | tests/unit/site-render.test.js |
| pass | js-unit | design and research pages QC-SITE-006: a registered document that is missing is listed and flagged (#1) | QC-SITE-006 | tests/unit/site-render.test.js |
| pass | js-unit | draft prose is disclosed where it is read QC-SITE-010: an unreviewed document says so above its first section (#32) | QC-SITE-010 | tests/unit/site-documents.test.js |
| pass | js-unit | draft prose is disclosed where it is read QC-SITE-010: prose state is read off the assembled document, not asserted (#32) | QC-SITE-010 | tests/unit/site-documents.test.js |
| pass | js-unit | draft prose is disclosed where it is read QC-SITE-010: the notice is on the rendered reader, before the document body (#32) | QC-SITE-010 | tests/unit/site-documents.test.js |
| pass | js-unit | draft 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-010 | tests/unit/site-documents.test.js |
| pass | js-unit | embedded HTML sanitization QC-SITE-004: matrix-cell markdown renders as code spans with the HTML still escaped (#1) | QC-SITE-004 | tests/unit/site-validate.test.js |
| pass | js-unit | embedded HTML sanitization QC-SITE-004: sanitizing an absent fragment yields an empty string, not a crash (#1) | QC-SITE-004 | tests/unit/site-validate.test.js |
| pass | js-unit | embedded HTML sanitization QC-SITE-004: scripts, handlers, external stylesheets and imports are stripped (#1) | QC-SITE-004 | tests/unit/site-validate.test.js |
| pass | js-unit | embedded HTML sanitization QC-SITE-004: text interpolated into a page is HTML-escaped (#1) | QC-SITE-004 | tests/unit/site-validate.test.js |
| pass | js-unit | embedded HTML sanitization QC-SITE-004: the document wrapper is unwrapped and the table content preserved (#1) | QC-SITE-004 | tests/unit/site-validate.test.js |
| pass | js-unit | evidence freshness guard QC-DRIFT-002: a missing test, a new test and a status change are all drift (#1) | QC-DRIFT-002 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | evidence freshness guard QC-DRIFT-002: provenance and traceability differences alone are not drift (#1) | QC-DRIFT-002 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | evidence 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-006 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | evidence records name the repository, not the machine QC-EVID-006: a path outside the repository is left visible rather than mangled (#1) | QC-EVID-006 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | evidence records name the repository, not the machine QC-EVID-006: a test-file path is recorded relative to the repository root (#1) | QC-EVID-006 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | evidence 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-006 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | evidence records name the repository, not the machine QC-EVID-006: buildEvidenceSets relativises before routing, so routing is unchanged (#1) | QC-EVID-006 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | evidence set assembly QC-EVID-001: a module with no records at all gets no evidence set (#1) | QC-EVID-001 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | evidence set assembly QC-EVID-001: records are sorted by suite then title, and provenance is quarantined (#1) | QC-EVID-001 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | evidence set assembly QC-EVID-005: an unapproved block is recorded as pending, distinguishable from a failure (#1) | QC-EVID-005 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | evidence set assembly QC-ROUTE-003: shared scaffold records are duplicated into every module set (#1) | QC-ROUTE-003 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | evidence set assembly QC-ROUTE-006: a registry-owned suite routes to its component whatever the file path (#1) | QC-ROUTE-006 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | evidence summary and run provenance QC-EVID-001: run provenance is null locally and built from the Actions env in CI (#1) | QC-EVID-001 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | evidence summary and run provenance QC-EVID-001: the summary counts records by suite and collects requirement IDs (#1) | QC-EVID-001 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | external resource validation QC-SITE-003: a protocol-relative resource is treated as external (#1) | QC-SITE-003 | tests/unit/site-validate.test.js |
| pass | js-unit | external resource validation QC-SITE-003: an external script, stylesheet, image or CSS import each fail the build (#1) | QC-SITE-003 | tests/unit/site-validate.test.js |
| pass | js-unit | external resource validation QC-SITE-003: outbound anchor links are navigation and do not fail the build (#1) | QC-SITE-003 | tests/unit/site-validate.test.js |
| pass | js-unit | Gate: treatment consistency STD-GATE-001: a display whose arm counts differ from the study model fails the gate, and the error names the display, the arm and both numbers (#59) | STD-GATE-001 | tests/unit/study-model.test.js |
| pass | js-unit | Gate: treatment consistency STD-GATE-002: two displays reporting the same analysis set with different counts in one document is an error naming both, even when one of them matches the model (#59) | STD-GATE-002 | tests/unit/study-model.test.js |
| pass | js-unit | Gate: treatment consistency STD-GATE-003: a display with no population record is a named warning, never a silent pass; one with no arm grouping is warned and not counted as checked (#59) | STD-GATE-003 | tests/unit/study-model.test.js |
| pass | js-unit | Gate: treatment consistency STD-GATE-004: an analysis set the model does not declare is an error, not a skipped check (#59) | STD-GATE-004 | tests/unit/study-model.test.js |
| pass | js-unit | Gate: treatment consistency STD-GATE-005: the committed report assembles green on the gate, every placed display is gated by arm, and none of them read the alternate lane (#60) | STD-GATE-005 | tests/unit/study-model.test.js |
| pass | js-unit | internal link validation QC-SITE-002: a broken internal href is reported with its file and target (#1) | QC-SITE-002 | tests/unit/site-validate.test.js |
| pass | js-unit | internal link validation QC-SITE-002: a query string or fragment on an internal link is stripped before resolving (#1) | QC-SITE-002 | tests/unit/site-validate.test.js |
| pass | js-unit | internal link validation QC-SITE-002: a site whose internal links all resolve passes validation (#1) | QC-SITE-002 | tests/unit/site-validate.test.js |
| pass | js-unit | internal link validation QC-SITE-002: external, fragment, mailto and data targets are not internal links (#1) | QC-SITE-002 | tests/unit/site-validate.test.js |
| pass | js-unit | iterations QC-SITE-006: a display with no iterations renders a documented empty state (#1) | QC-SITE-006 | tests/unit/site-render.test.js |
| pass | js-unit | iterations TRC-ITER-001: manifests alone reconstruct the timeline when no ledger exists (#1) | TRC-ITER-001 | tests/unit/site-render.test.js |
| pass | js-unit | iterations TRC-ITER-001: the timeline merges the ledger with the output manifests (#1) | TRC-ITER-001 | tests/unit/site-render.test.js |
| pass | js-unit | iterations TRC-ITER-002: current.json names the live iteration (#1) | TRC-ITER-002 | tests/unit/site-render.test.js |
| pass | js-unit | iterations TRC-ITER-002: with no pointer, or a pointer to a missing version, the highest wins (#1) | TRC-ITER-002 | tests/unit/site-render.test.js |
| pass | js-unit | iterations TRC-ITER-003: a ledger entry with no output directory is rendered and flagged (#1) | TRC-ITER-003 | tests/unit/site-render.test.js |
| pass | js-unit | module routing QC-ROUTE-001: a flat tests/unit/<module>-<topic>.test.js routes to that module (#1) | QC-ROUTE-001 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | module routing QC-ROUTE-001: a JS test under tests/unit/<module>/ routes to that module (#1) | QC-ROUTE-001 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | module routing QC-ROUTE-002: an R test file routes by longest-prefix match on the registry (#1) | QC-ROUTE-002 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | module routing QC-ROUTE-003: an unroutable test file is shared scaffold (#1) | QC-ROUTE-003 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | module routing QC-ROUTE-004: the module universe is the site registry, not code (#1) | QC-ROUTE-004 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | module routing QC-ROUTE-005: a component may declare the topic-named test stems it owns (#1) | QC-ROUTE-005 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | module routing QC-ROUTE-005: a slug match always beats a declared prefix (#1) | QC-ROUTE-005 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | module routing QC-ROUTE-007: a prefix-claimed record lands only in its owners, not in every set (#1) | QC-ROUTE-007 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | module routing QC-ROUTE-007: requirement-ID prefixes claim a record no test file could route (#1) | QC-ROUTE-007 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | page rendering QC-SITE-005: an evidence page joins reviewed rows to the tests that evidence them (#1) | QC-SITE-005 | tests/unit/site-render.test.js |
| pass | js-unit | page rendering QC-SITE-005: the display page renders all four tabs (#1) | QC-SITE-005 | tests/unit/site-render.test.js |
| pass | js-unit | page rendering QC-SITE-005: the gallery card shows the iteration and ARD row count (#1) | QC-SITE-005 | tests/unit/site-render.test.js |
| pass | js-unit | page rendering QC-SITE-005: the quality index rolls up requirements, tests and coverage (#1) | QC-SITE-005 | tests/unit/site-render.test.js |
| pass | js-unit | page rendering QC-SITE-005: the text library shows tier, approval state and binding resolution (#1) | QC-SITE-005 | tests/unit/site-render.test.js |
| pass | js-unit | page rendering QC-SITE-006: an evidence page with neither matrix nor evidence degrades to a stated gap (#1) | QC-SITE-006 | tests/unit/site-render.test.js |
| pass | js-unit | page rendering QC-SITE-006: the display page for an ungenerated display is all empty states (#1) | QC-SITE-006 | tests/unit/site-render.test.js |
| pass | js-unit | page rendering QC-SITE-006: the home page renders from an empty repository without throwing (#1) | QC-SITE-006 | tests/unit/site-render.test.js |
| pass | js-unit | pane crossings QC-DEMO-003: a crossing carries the text block named in the fragment (#1) | QC-DEMO-003 | tests/unit/site-demo.test.js |
| pass | js-unit | pane crossings QC-DEMO-003: a display permalink resolves to the Displays view with that display selected (#1) | QC-DEMO-003 | tests/unit/site-demo.test.js |
| pass | js-unit | pane crossings QC-DEMO-003: each standalone permalink resolves to the view that replaced it (#1) | QC-DEMO-003 | tests/unit/site-demo.test.js |
| pass | js-unit | pane crossings QC-DEMO-003: the rule holds at any authored depth, because panes are written for their own (#1) | QC-DEMO-003 | tests/unit/site-demo.test.js |
| pass | js-unit | pane crossings QC-DEMO-004: a bare fragment stays in-pane scrolling and is never intercepted (#1) | QC-DEMO-004 | tests/unit/site-demo.test.js |
| pass | js-unit | pane crossings QC-DEMO-004: links that are not pane crossings are left to navigate (#1) | QC-DEMO-004 | tests/unit/site-demo.test.js |
| pass | js-unit | pane crossings QC-DEMO-005: a crossing that names no display keeps the one already selected (#1) | QC-DEMO-005 | tests/unit/site-demo.test.js |
| pass | js-unit | pane crossings QC-DEMO-005: applying nothing changes nothing (#1) | QC-DEMO-005 | tests/unit/site-demo.test.js |
| pass | js-unit | pane crossings QC-DEMO-006: a stale display slug degrades to the first available rather than a blank pane (#1) | QC-DEMO-006 | tests/unit/site-demo.test.js |
| pass | js-unit | requirement drift guard QC-DRIFT-001: added, removed and changed requirement text are all reported (#1) | QC-DRIFT-001 | tests/unit/requirements-matrix.test.js |
| pass | js-unit | requirement drift guard QC-DRIFT-001: an identical extract is not stale (#1) | QC-DRIFT-001 | tests/unit/requirements-matrix.test.js |
| pass | js-unit | requirement IDs referenced by tests QC-NAME-002: requirement IDs are read from test titles only, not comments or strings (#1) | QC-NAME-002 | tests/unit/requirements-matrix.test.js |
| pass | js-unit | requirement matrix extraction QC-MATRIX-001: only rows whose ID cell is exactly a requirement ID are extracted (#1) | QC-MATRIX-001 | tests/unit/requirements-matrix.test.js |
| pass | js-unit | requirement matrix extraction QC-MATRIX-002: a header row without an ID and Requirement pair is not adopted (#1) | QC-MATRIX-002 | tests/unit/requirements-matrix.test.js |
| pass | js-unit | requirement matrix extraction QC-MATRIX-002: table columns are located by header name, not by position (#1) | QC-MATRIX-002 | tests/unit/requirements-matrix.test.js |
| pass | js-unit | requirement matrix extraction QC-MATRIX-003: requirement text containing an escaped pipe survives intact (#1) | QC-MATRIX-003 | tests/unit/requirements-matrix.test.js |
| pass | js-unit | requirement matrix extraction QC-MATRIX-004: other tables and prose mentioning an ID contribute nothing (#1) | QC-MATRIX-004 | tests/unit/requirements-matrix.test.js |
| pass | js-unit | requirement matrix extraction QC-MATRIX-005: an empty or malformed document extracts to nothing rather than throwing (#1) | QC-MATRIX-005 | tests/unit/requirements-matrix.test.js |
| pass | js-unit | requirement matrix extraction QC-MATRIX-005: the extract is deterministic and carries no timestamp (#1) | QC-MATRIX-005 | tests/unit/requirements-matrix.test.js |
| pass | js-unit | specifications and their history QC-META-002: every display is listed with its two specification files and every iteration with the actor, request and hashes its manifest recorded (#77) | QC-META-002 | tests/unit/site-metadata.test.js |
| pass | js-unit | specifications and their history QC-META-002: shared custom code is stated from the borrowing side and the owning side (#77) | QC-META-002 | tests/unit/site-metadata.test.js |
| pass | js-unit | specifications and their history QC-META-002: value declarations are read from the source file and link to the store (#77) | QC-META-002 | tests/unit/site-metadata.test.js |
| pass | js-unit | Study model STD-MODEL-001: library/study.yaml loads with three arms in print order and every analysis set counted per arm (#59) | STD-MODEL-001 | tests/unit/study-model.test.js |
| pass | js-unit | Study model STD-MODEL-002: every assembly that declares treatment groups declares the model's arms, in the model's order (#59) | STD-MODEL-002 | tests/unit/study-model.test.js |
| pass | js-unit | suite normalization QC-EVID-001: missing or empty reporter output normalizes to no records (#1) | QC-EVID-001 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | suite normalization QC-EVID-001: vitest output normalizes into contracts §8 records (#1) | QC-EVID-001 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | suite normalization QC-EVID-002: testthat results normalize into the same shape with suite r-unit (#1) | QC-EVID-002 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | suite normalization QC-EVID-003: any testthat status other than pass records as not passed (#1) | QC-EVID-003 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | suite normalization QC-EVID-004: an approved text block becomes a passing text-review record (#1) | QC-EVID-004 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | suite normalization QC-EVID-004: an unapproved generated block records as not passed (#1) | QC-EVID-004 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | test naming convention QC-NAME-001: every JS test title carries requirement IDs and an issue reference (#1) | QC-NAME-001 | tests/unit/site-convention.test.js |
| pass | js-unit | test naming convention QC-NAME-001: the guard actually sees the suite it is meant to police (#1) | QC-NAME-001 | tests/unit/site-convention.test.js |
| pass | js-unit | test-name parsing QC-NAME-002: a scaffold title with no requirement ID still parses its issue ref (#1) | QC-NAME-002 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | test-name parsing QC-NAME-002: several requirement IDs and several issue refs parse out of one title (#1) | QC-NAME-002 | tests/unit/evidence-normalize.test.js |
| pass | js-unit | the app page QC-DEMO-007: every pane is server-rendered and present, with exactly one visible (#1) | QC-DEMO-007 | tests/unit/site-demo.test.js |
| pass | js-unit | the app page QC-DEMO-007: panes do not collide with the shell tab controller (#1) | QC-DEMO-007 | tests/unit/site-demo.test.js |
| pass | js-unit | the app page QC-DEMO-007: the page carries no title or lede — content starts at the pane (#1) | QC-DEMO-007 | tests/unit/site-demo.test.js |
| pass | js-unit | the app page QC-DEMO-008: a tab with no rendered pane is dropped rather than rendered empty (#1) | QC-DEMO-008 | tests/unit/site-demo.test.js |
| pass | js-unit | the application strip QC-DEMO-016: a view in the bar is a real link, marked as navigation not as a control (#1) | QC-DEMO-016 | tests/unit/site-demo.test.js |
| pass | js-unit | the application strip QC-DEMO-016: the bar carries only what is not scoped to a study (#1) | QC-DEMO-016 | tests/unit/site-demo.test.js |
| pass | js-unit | the application strip QC-DEMO-017: a display with no iteration yet contributes nulls, not a broken readout (#1) | QC-DEMO-017 | tests/unit/site-demo.test.js |
| pass | js-unit | the application strip QC-DEMO-017: the bar carries the study, and a context index for the live readout (#1) | QC-DEMO-017 | tests/unit/site-demo.test.js |
| pass | js-unit | the application strip QC-DEMO-017: the embedded context index cannot close the script element (#1) | QC-DEMO-017 | tests/unit/site-demo.test.js |
| pass | js-unit | the ARD tab QC-SITE-005: the ARD renders one row per statistic with its condition columns (#1) | QC-SITE-005 | tests/unit/site-render.test.js |
| pass | js-unit | the ARD tab QC-SITE-006: an absent ARD renders the empty state rather than an empty table (#1) | QC-SITE-006 | tests/unit/site-render.test.js |
| pass | js-unit | the CSR reader QC-SITE-006: with no assembled CSR the reader states the gap and still offers the trace index (#1) | QC-SITE-006 | tests/unit/site-render.test.js |
| pass | js-unit | the CSR reader TRC-CHAIN-001: the reader renders bound numbers and embeds the trace index (#1) | TRC-CHAIN-001 | tests/unit/site-render.test.js |
| pass | js-unit | the CSR reader TRC-DOC-001: an absent or unusable assembly normalizes to null instead of throwing (#1) | TRC-DOC-001 | tests/unit/site-render.test.js |
| pass | js-unit | the CSR reader TRC-DOC-001: the assembled document normalizes into sections and nested sections (#1) | TRC-DOC-001 | tests/unit/site-render.test.js |
| pass | js-unit | the data registry and the package record QC-DATA-001: a registered dataset with no vendored file is planned, a derived or alternate one is not a missing file, and a vendored file nobody registered is published with a warning (#76) | QC-DATA-001 | tests/unit/site-data.test.js |
| pass | js-unit | the data registry and the package record QC-DATA-001: a repository with no data registry renders the empty state rather than throwing (#76) | QC-DATA-001 | tests/unit/site-data.test.js |
| pass | js-unit | the data registry and the package record QC-DATA-001: every registered dataset is read with its provenance, and the package carries its pinned commit (#76) | QC-DATA-001 | tests/unit/site-data.test.js |
| pass | js-unit | the display registry QC-SITE-005: status is derived from the filesystem, not from the declared value (#1) | QC-SITE-005 | tests/unit/site-render.test.js |
| pass | js-unit | the display registry QC-SITE-006: a display with no outputs loads to empty structures rather than throwing (#1) | QC-SITE-006 | tests/unit/site-render.test.js |
| pass | js-unit | the display registry QC-SITE-007: a display on disk but absent from the registry is surfaced, not dropped (#1) | QC-SITE-007 | tests/unit/site-render.test.js |
| pass | js-unit | the document set QC-SITE-009: a document not on screen is a link out, not a dead selection (#32) | QC-SITE-009 | tests/unit/site-documents.test.js |
| pass | js-unit | the document set QC-SITE-009: a planned document with no template object keeps its place (#32) | QC-SITE-009 | tests/unit/site-documents.test.js |
| pass | js-unit | the document set QC-SITE-009: an undeclared template object is titled from its own model (#32) | QC-SITE-009 | tests/unit/site-documents.test.js |
| pass | js-unit | the document set QC-SITE-009: every assembled template object becomes a document, declared or not (#32) | QC-SITE-009 | tests/unit/site-documents.test.js |
| pass | js-unit | the document set QC-SITE-009: the home page lists the documents and links both of a document's pages (#32) | QC-SITE-009 | tests/unit/site-documents.test.js |
| pass | js-unit | the document set QC-SITE-009: the primary document keeps the published URLs and the rest sit beside it (#32) | QC-SITE-009 | tests/unit/site-documents.test.js |
| pass | js-unit | the document set QC-SITE-009: the switcher offers every other document from any document (#32) | QC-SITE-009 | tests/unit/site-documents.test.js |
| pass | js-unit | the Documents pane QC-DEMO-032: a document may be requested by its reader page's name (#36) | QC-DEMO-032 | tests/unit/site-demo.test.js |
| pass | js-unit | the Documents pane QC-DEMO-032: an unknown request opens the first document rather than none (#36) | QC-DEMO-032 | tests/unit/site-demo.test.js |
| pass | js-unit | the Documents pane QC-DEMO-032: exactly one panel is visible, and it is the one requested (#36) | QC-DEMO-032 | tests/unit/site-demo.test.js |
| pass | js-unit | the Documents pane QC-DEMO-032: one panel per document, keyed by id and by reader-page name (#36) | QC-DEMO-032 | tests/unit/site-demo.test.js |
| pass | js-unit | the Documents pane QC-DEMO-032: one trace panel above the set, never one per document (#36) | QC-DEMO-032 | tests/unit/site-demo.test.js |
| pass | js-unit | the explorer and the deep links QC-DATA-005: a dataset permalink is absorbed into the Data view with that dataset in focus, and the lanes and index likewise (#76) | QC-DATA-005 | tests/unit/site-data.test.js |
| pass | js-unit | the explorer and the deep links QC-DATA-005: Data is a view of the study, after Values, and a collection in the tree with one item per dataset (#76) | QC-DATA-005 | tests/unit/site-data.test.js |
| pass | js-unit | the explorer and the pane QC-PIPE-002: the explorer has three parts in the pipeline's order, each holding its groups, while the flat groups list still carries every group; the strip follows the same order (#82) | QC-PIPE-002 | tests/unit/site-pipeline.test.js |
| pass | js-unit | the explorer and the pane QC-PIPE-003: the pane opens with the whole pipeline as one flow and carries every function by id; a function permalink is absorbed into the view with that function in focus (#82) | QC-PIPE-003 | tests/unit/site-pipeline.test.js |
| pass | js-unit | the explorer wiring QC-DEMO-020: the group-level collapse the tree still needs is untouched (#40) | QC-DEMO-020 | tests/unit/site-demo.test.js |
| pass | js-unit | the explorer wiring QC-DEMO-025: the client holds no per-document expansion state at all (#40) | QC-DEMO-025 | tests/unit/site-demo.test.js |
| pass | js-unit | the explorer wiring QC-DEMO-031: a deep link into another document opens that document (#40) | QC-DEMO-031 | tests/unit/site-demo.test.js |
| pass | js-unit | the links from a display to its data QC-DATA-004: a dataset the header names but this iteration’s ARD does not is still linked, and says so (#76) | QC-DATA-004 | tests/unit/site-data.test.js |
| pass | js-unit | the links from a display to its data QC-DATA-004: given the index, the display header links each dataset to its page with the hash and rows this iteration recorded; without it, the labels print as before (#76) | QC-DATA-004 | tests/unit/site-data.test.js |
| pass | js-unit | the navigation tree QC-DEMO-018: more than one document is listed, and an unbuilt one says so (#1) | QC-DEMO-018 | tests/unit/site-demo.test.js |
| pass | js-unit | the navigation tree QC-DEMO-018: the study is the root, and documents, displays, text and values hang off it (#1) | QC-DEMO-018 | tests/unit/site-demo.test.js |
| pass | js-unit | the navigation tree QC-DEMO-019: a display records EVERY document that uses it, not just the report (#42) | QC-DEMO-019 | tests/unit/site-demo.test.js |
| pass | js-unit | the navigation tree QC-DEMO-019: a text block that is not on disk is left out, and a draft is flagged (#1) | QC-DEMO-019 | tests/unit/site-demo.test.js |
| pass | js-unit | the navigation tree QC-DEMO-019: the sidebar states no display number, because four assemblies disagree (#42) | QC-DEMO-019 | tests/unit/site-demo.test.js |
| pass | js-unit | the navigation tree QC-DEMO-020: only the active group is open, and the selected item is marked (#1) | QC-DEMO-020 | tests/unit/site-demo.test.js |
| pass | js-unit | the navigation tree QC-DEMO-020: the explorer renders the study, every group, and a count per group (#1) | QC-DEMO-020 | tests/unit/site-demo.test.js |
| pass | js-unit | the navigation tree QC-DEMO-021: an unbuilt document is not a link, so it cannot be selected (#1) | QC-DEMO-021 | tests/unit/site-demo.test.js |
| pass | js-unit | the navigation tree QC-DEMO-021: every selectable item is a real link carrying its own deep link (#1) | QC-DEMO-021 | tests/unit/site-demo.test.js |
| pass | js-unit | the navigation tree QC-DEMO-022: an empty registry renders the explorer without throwing (#1) | QC-DEMO-022 | tests/unit/site-demo.test.js |
| pass | js-unit | the navigation tree QC-DEMO-022: Read is the current mode and Edit is genuinely disabled (#1) | QC-DEMO-022 | tests/unit/site-demo.test.js |
| pass | js-unit | the pages QC-DATA-003: a dataset has a standalone page with the same facts and the read-by table (#76) | QC-DATA-003 | tests/unit/site-data.test.js |
| pass | js-unit | the pages QC-DATA-003: the Data pane carries the package, one section per dataset with its facts, and the lanes, each addressable by id (#76) | QC-DATA-003 | tests/unit/site-data.test.js |
| pass | js-unit | the pages QC-DATA-003: the lanes section names both packagings and lists only the variables that differ, from the agreement record (#76) | QC-DATA-003 | tests/unit/site-data.test.js |
| pass | js-unit | the pane, the explorer and the deep links QC-META-005: a metadata page permalink is absorbed into the Metadata view with that section in focus (#77) | QC-META-005 | tests/unit/site-metadata.test.js |
| pass | js-unit | the pane, the explorer and the deep links QC-META-005: the pane carries every section by id, and Metadata is a view of the study after Data with one explorer item per page (#77) | QC-META-005 | tests/unit/site-metadata.test.js |
| pass | js-unit | the registry and the function pages QC-PIPE-001: a call to an unregistered function is a warning, and no registry renders the empty state (#82) | QC-PIPE-001 | tests/unit/site-pipeline.test.js |
| pass | js-unit | the registry and the function pages QC-PIPE-001: every declared function is read with its kind, code, reads, writes, calls and gates, and lists what it produced from the records (#82) | QC-PIPE-001 | tests/unit/site-pipeline.test.js |
| pass | js-unit | the renderer QC-FLOW-001: three lanes, every box a link when it has one, sub-lines kept, empty lanes say so, nothing external (#83) | QC-FLOW-001 | tests/unit/site-flow.test.js |
| pass | js-unit | the repository this site is built from QC-SITE-009: this repo's own library is plural and every object is assembled (#32) | QC-SITE-009 | tests/unit/site-documents.test.js |
| pass | js-unit | the repository this site is built from QC-SITE-010: the committed synopsis is unreviewed, and nothing in the site pretends otherwise (#32) | QC-SITE-010 | tests/unit/site-documents.test.js |
| pass | js-unit | the reverse index: from a dataset to every display that read it QC-DATA-002: a dataset no current ARD names has an empty index entry, and a dataset an ARD names that the registry does not know still gets one (#76) | QC-DATA-002 | tests/unit/site-data.test.js |
| pass | js-unit | the reverse index: from a dataset to every display that read it QC-DATA-002: a display whose current ARD names a dataset appears under it with the iteration, rows and hash that ARD recorded (#76) | QC-DATA-002 | tests/unit/site-data.test.js |
| pass | js-unit | the shared selection QC-DEMO-001: a selection round-trips through the URL hash (#1) | QC-DEMO-001 | tests/unit/site-demo.test.js |
| pass | js-unit | the shared selection QC-DEMO-001: empty parts are omitted from the hash so the common case stays short (#1) | QC-DEMO-001 | tests/unit/site-demo.test.js |
| pass | js-unit | the shared selection QC-DEMO-002: an unknown or absent tab decodes to the default rather than an empty app (#1) | QC-DEMO-002 | tests/unit/site-demo.test.js |
| pass | js-unit | the shared selection QC-DEMO-002: the tabs the requirements name are the tabs the app knows (#1) | QC-DEMO-002 | tests/unit/site-demo.test.js |
| pass | js-unit | the shared shell QC-SITE-001: every shell token is substituted and none leaks into the output (#1) | QC-SITE-001 | tests/unit/site-render.test.js |
| pass | js-unit | the shared shell QC-SITE-001: navigation links are relative to the page root so any mount depth works (#1) | QC-SITE-001 | tests/unit/site-render.test.js |
| pass | js-unit | the study model QC-META-001: a repository without a study model renders the empty state and says so in the warnings (#77) | QC-META-001 | tests/unit/site-metadata.test.js |
| pass | js-unit | the study model QC-META-001: the study page states the arms in print order, the columns that carry an arm label, and every analysis set with its flag and subjects per arm (#77) | QC-META-001 | tests/unit/site-metadata.test.js |
| pass | js-unit | the stylesheet parses QC-SITE-008: declarations live inside a block, never between two of them (#16) | QC-SITE-008 | tests/unit/site-css.test.js |
| pass | js-unit | the stylesheet parses QC-SITE-008: every block in site.css is closed, so no rule is silently dropped (#16) | QC-SITE-008 | tests/unit/site-css.test.js |
| pass | js-unit | the stylesheet parses QC-SITE-008: the last rule in the file is as reachable as the first (#16) | QC-SITE-008 | tests/unit/site-css.test.js |
| pass | js-unit | the Tables pane QC-DEMO-009: an unknown selection falls back to the first display (#1) | QC-DEMO-009 | tests/unit/site-demo.test.js |
| pass | js-unit | the Tables pane QC-DEMO-009: one panel per display, exactly one shown, and every display in the picker (#1) | QC-DEMO-009 | tests/unit/site-demo.test.js |
| pass | js-unit | the Tables pane QC-DEMO-009: the pane opens on the selected display when one is asked for (#1) | QC-DEMO-009 | tests/unit/site-demo.test.js |
| pass | js-unit | the Tables pane QC-DEMO-010: an empty library renders a documented empty state, not a broken pane (#1) | QC-DEMO-010 | tests/unit/site-demo.test.js |
| pass | js-unit | the Templates pane QC-DEMO-011: the whole E3 skeleton is rendered, not only the sections this report fills (#1) | QC-DEMO-011 | tests/unit/site-demo.test.js |
| pass | js-unit | the Templates pane QC-DEMO-012: display numbers are derived from assembly order, never authored (#1) | QC-DEMO-012 | tests/unit/site-demo.test.js |
| pass | js-unit | the Templates pane QC-DEMO-012: reordering the assembly moves every number and no slug (#1) | QC-DEMO-012 | tests/unit/site-demo.test.js |
| pass | js-unit | the Templates pane QC-DEMO-013: a missing section model renders its documented empty state (#1) | QC-DEMO-013 | tests/unit/site-demo.test.js |
| pass | js-unit | the Templates pane QC-DEMO-013: the pane renders before the report has ever been assembled (#1) | QC-DEMO-013 | tests/unit/site-demo.test.js |
| pass | js-unit | the Templates pane QC-DEMO-014: the generated provenance section is named as generated (#1) | QC-DEMO-014 | tests/unit/site-demo.test.js |
| pass | js-unit | the trace index TRC-ARD-004: the ARD hash is computed from the committed file when needed (#1) | TRC-ARD-004 | tests/unit/site-render.test.js |
| pass | js-unit | the trace index TRC-CHAIN-001: each entry carries datasets, specs, ARD, hashes, iteration and commit (#1) | TRC-CHAIN-001 | tests/unit/site-render.test.js |
| pass | js-unit | the trace index TRC-CHAIN-002: every entry links to its gallery page and its evidence page (#1) | TRC-CHAIN-002 | tests/unit/site-render.test.js |
| pass | js-unit | the Values pane QC-DEMO-027: every value shows its name, its number and where it came from (#1) | QC-DEMO-027 | tests/unit/site-demo.test.js |
| pass | js-unit | the Values pane QC-DEMO-027: the blocks that cite a value are listed against it (#1) | QC-DEMO-027 | tests/unit/site-demo.test.js |
| pass | js-unit | the Values pane QC-DEMO-028: a repository with no values store renders the documented empty state (#1) | QC-DEMO-028 | tests/unit/site-demo.test.js |
| pass | js-unit | the Values pane QC-DEMO-028: the pane states the verdict of the gate that re-derived the store (#1) | QC-DEMO-028 | tests/unit/site-demo.test.js |
| pass | js-unit | the Values pane QC-DEMO-029: values are a collection of the study, listed in the tree with their numbers (#1) | QC-DEMO-029 | tests/unit/site-demo.test.js |
| pass | js-unit | two documents, one set of analytics QC-SITE-011: a display two documents both place is the same artifact in both (#36) | QC-SITE-011 | tests/unit/site-documents.test.js |
| pass | js-unit | two documents, one set of analytics QC-SITE-011: only the per-document display NUMBER differs, and that is by design (#36) | QC-SITE-011 | tests/unit/site-documents.test.js |
| pass | js-unit | two documents, one set of analytics QC-SITE-011: two documents cannot disagree about a named value (#36) | QC-SITE-011 | tests/unit/site-documents.test.js |
| pass | js-unit | unresolved 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-001 | tests/unit/requirements-matrix.test.js |
| pass | js-unit | unresolved requirement IDs — the safety.viz blind spot QC-UNRES-001: nothing referenced and nothing defined produces an empty, non-throwing report (#1) | QC-UNRES-001 | tests/unit/requirements-matrix.test.js |
| pass | js-unit | unresolved requirement IDs — the safety.viz blind spot QC-UNRES-002: reviewed requirements no test references are reported as uncovered (#1) | QC-UNRES-002 | tests/unit/requirements-matrix.test.js |
| pass | js-unit | unresolved 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-003 | tests/unit/requirements-matrix.test.js |
| pass | js-unit | values and the explorer QC-LINK-004: the values pane links the arm a source address names to the study model, the data behind its display, and the documents that place the blocks citing it (#78) | QC-LINK-004 | tests/unit/site-links.test.js |
| pass | js-unit | values and the explorer QC-LINK-005: a document whose build failed a gate is flagged in the explorer, and one that passed is not (#78) | QC-LINK-005 | tests/unit/site-links.test.js |
| pass | js-unit | which document the pane shows QC-DEMO-031: a document resolves from its id or from its reader page's name (#36) | QC-DEMO-031 | tests/unit/site-demo.test.js |
| pass | js-unit | which document the pane shows QC-DEMO-031: a plain list of ids is accepted, so the caller need not build pairs (#36) | QC-DEMO-031 | tests/unit/site-demo.test.js |
| pass | js-unit | which document the pane shows QC-DEMO-031: an unknown or absent document falls back to the first rendered one (#36) | QC-DEMO-031 | tests/unit/site-demo.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 | r-unit | DSP-INTXT-001: the in-text demographics redraw is the report's Table 11-1 — mean and range, percentages, race as White/Caucasian or other — from the same ARD as the full table (#63) | DSP-INTXT-001 | test-displays.R |
| pass | r-unit | DSP-INTXT-002: the in-text incidence redraw is the report's Table 12-1 — terms at 5% or more in any arm, flat, in title case, an asterisk where the placebo comparison has p < 0.15 (#63) | DSP-INTXT-002 | test-displays.R |
| pass | r-unit | DSP-INTXT-003: the in-text weight redraw is the report's Table 12-4 — n and mean per arm for baseline and the changes at Week 24 and end of treatment — from the weight table's own ARD (#63) | DSP-INTXT-003 | test-displays.R |
| pass | r-unit | STD-MODEL-003: the treatment vocabulary and the analysis-set registry resolve from the study model, not from code (#59) | STD-MODEL-003 | test-study-model.R |
| pass | r-unit | STD-MODEL-004: every count the model declares is what the default lane's ADSL holds, per arm and per set (#59) | STD-MODEL-004 | test-study-model.R |
| pass | r-unit | STD-MODEL-005: every committed ARD carries a population record that agrees with the study model for its analysis set (#59) | STD-MODEL-005 | test-study-model.R |
| pass | r-unit | STD-SRC-001: the default registry serves every pilot dataset from the study's own package, and only the two datasets it lacks come from the alternate (#60) | STD-SRC-001 | test-study-model.R |
| pass | r-unit | STD-SRC-002: the pilot's ADVS prepares without derived-record or timepoint columns the alternate carries, and its series keys match (#60) | STD-SRC-002 | test-study-model.R |
| pass | r-unit | TFL-QC-001: every test name carries requirement IDs and the tracking issue (#1) | TFL-QC-001 | test-naming-convention.R |
| pass | r-unit | TFL-QC-002: every requirement ID a test cites exists in a requirement matrix (#1) | TFL-QC-002 | test-naming-convention.R |
| pass | r-unit | TFL-QC-003: every requirement in a matrix is cited by at least one test (#1) | TFL-QC-003 | test-naming-convention.R |
| pass | r-unit | TFL-QC-004: requirement matrices use the agreed column contract (#1) | TFL-QC-004 | test-naming-convention.R |
Traceability
No generated output yet, so the data → ARD → display chain is empty.
Provenance
- Generated
- 2026-09-02T23:20:56.918Z
- Environment
- os Darwin 23.6.0 · node v24.14.0 · r 4.3.3
- CI run
- Not recorded for this evidence set