Test evidence

Library core

Every requirement of this module, the tests named for it, and what each test recorded the last time the evidence was rebuilt.

Summary

Requirements
71
Tests named for them
123 (108 unit, 15 browser)
Result
pass every test passing
Screenshots
3
Recorded
2026-10-04 19:02 UTC
Environment
linux 6.17.0-1022-azure · node v22.23.3 · playwright 1.61.1 · chromium 149.0.7827.55
Test run
Continuous-integration run 37226711557

The requirements are the rows of the module’s requirement matrix. A test is named for a requirement by starting its name with the requirement’s ID. The results are read from the committed evidence set; continuous integration reruns every test and fails when the committed set no longer matches.

Requirements and their tests

  1. CORE-BUILD-001 pass

    The build writes a script-tag bundle to dist/bio.viz-{version}/bio.viz.js that defines the global BioViz.

    • pass unit bio.viz core CORE-BUILD-001: the committed IIFE bundle defines the global BioViz (#1)
  2. CORE-BUILD-002 pass

    The build writes an ES module bundle to dist/bio.viz-{version}/bio.viz.esm.js with the same exports as the script-tag bundle.

    • pass unit bio.viz core CORE-BUILD-002: the committed ESM bundle has the same exports as the IIFE bundle (#1)
  3. CORE-API-001 pass

    version equals the version field of package.json: in the source, in both committed bundles, and as BioViz.version on a page that loads the script-tag bundle.

    • pass browser CORE-API-001: a page that loads the committed bundle reads BioViz.version as the package version (#1)
    • pass unit bio.viz core CORE-API-001: BioViz.version in the committed IIFE bundle equals the package version (#1)
    • pass unit bio.viz core CORE-API-001: src/main.js exports version equal to the package version (#1)
    • pass unit bio.viz core CORE-API-001: version in the committed ESM bundle equals the package version (#1)
  4. CORE-DEP-001 pass

    package.json declares no runtime dependencies: safety.viz and webR are loaded beside the bundle on a page and are never bundled into it.

    • pass unit bio.viz core CORE-DEP-001: package.json declares no runtime dependencies (#1)
  5. CORE-SITE-001 pass

    The site's home page names the library and its version, and shows the version reported by the bundle that page loaded.

    • pass browser CORE-SITE-001: the home page names the library and its version, and shows the version its bundle reports (#1)
    • pass unit site pages CORE-SITE-001: the home page names the library and its version (#1)
  6. CORE-SITE-002 pass

    The site's home page holds at a 390-pixel-wide viewport with no horizontal scroll.

    • pass browser CORE-SITE-002: the home page holds at a 390px-wide viewport with no horizontal scroll (#1)
  7. CORE-DATA-001 pass

    The synthetic biomarker study is vendored as three files in site/data/synthetic-study/ (synthetic_results.csv, synthetic_participants.csv, synthetic_outcomes.csv) with a source record, SOURCE.json, beside them that names the gsm.bio repository, the commit the files were copied from and each file's path there.

    • pass unit the vendored synthetic study CORE-DATA-001: the three files are in site/data/synthetic-study/ with a record naming the gsm.bio commit and each file there (#7)
  8. CORE-DATA-002 pass

    Each vendored file matches its entry in the source record: the SHA-256 checksum, the size in bytes, the column names and the row count. A file that is changed, missing, or present but not recorded fails the check, as does a record edited without its file.

    • pass unit the vendored synthetic study CORE-DATA-002: each vendored file matches its recorded checksum, size, columns and row count (#7)
    • pass unit vendoring: the copy and its check CORE-DATA-002: a changed file fails the check, even by one character (#7)
    • pass unit vendoring: the copy and its check CORE-DATA-002: a missing file, an unrecorded file and a missing record each fail the check (#7)
    • pass unit vendoring: the copy and its check CORE-DATA-002: a record edited without its file fails the check (#7)
  9. CORE-DATA-003 pass

    The results table has the columns USUBJID, VISIT, VISITNUM, TEST, STRESU, STRESN and 11,472 rows, one per participant, biomarker and visit: 200 participants, twelve biomarkers, and the visits Baseline, Week 2, Week 4, Week 8 and Week 12.

    • pass unit the vendored synthetic study CORE-DATA-003: the results table has its six columns and 11,472 rows, one per participant, biomarker and visit (#7)
  10. CORE-DATA-004 pass

    The participant table has the columns USUBJID, ARM, SEX, AGE, BMIBL, RESPONSE and 200 rows, one per participant, and every participant in the results table is in it.

    • pass unit the vendored synthetic study CORE-DATA-004: the participant table has its six columns and 200 rows, one per participant, covering everyone in the results (#7)
  11. CORE-DATA-005 pass

    The outcomes table has the columns USUBJID, PARAMCD, PARAM, AVAL, CNSR and 200 rows, one per participant and endpoint, and every participant in it is in the participant table.

    • pass unit the vendored synthetic study CORE-DATA-005: the outcomes table has its five columns and 200 rows, one per participant and endpoint, all of them known participants (#7)
  12. CORE-DATA-006 pass

    Vendoring is a copy: each file is written exactly as gsm.bio holds it at the recorded commit, with the checksum of those bytes recorded. Nothing is retyped, reordered or regenerated, and a second check fails when a vendored file differs from gsm.bio's file at that commit.

    • pass unit vendoring: the copy and its check CORE-DATA-006: a record is refused without the full commit it was copied from (#7)
    • pass unit vendoring: the copy and its check CORE-DATA-006: the check against the source fails when a vendored file differs from the commit it names (#7)
    • pass unit vendoring: the copy and its check CORE-DATA-006: the copy writes each file exactly as the source holds it and records the checksum of those bytes (#7)
  13. CORE-SITE-003 pass

    The gallery page lists every chart the registry marks available, each with links to its evidence page and its API reference. When no chart is available it says that no chart is published yet.

    • pass browser CORE-SITE-003: the gallery is reached from the home page and lists the published charts, or says that none is published yet (#7)
    • pass unit gallery CORE-SITE-003: a chart that is registered but not yet available is not listed as published (#7)
    • pass unit gallery CORE-SITE-003: a chart’s card shows its picture once that screenshot is committed, and no picture before (#9)
    • pass unit gallery CORE-SITE-003: a registered chart is listed under Charts with links to its evidence page and API reference (#7)
    • pass unit gallery CORE-SITE-003: with no chart registered the gallery says that no chart is published yet (#7)
    Screenshot captured by a test of CORE-SITE-003: gallery
  14. CORE-SITE-004 pass

    The gallery page lists the library's shared parts, each with links to its evidence page and its API reference.

    • pass browser CORE-SITE-004: the gallery lists each shared part, and its two links lead to that module’s evidence page and API reference (#7)
    • pass unit gallery CORE-SITE-004: each shared part is listed with links to its evidence page and API reference (#7)
    • pass unit gallery CORE-SITE-004: the registry as committed lists the core and the connection to R as shared parts (#7)
  15. CORE-SITE-005 pass

    Every module in the registry (site/config.json) says whether it is a chart or a shared part and names its requirement matrix and its API reference. The site build refuses an entry that does not.

    • pass unit module registry CORE-SITE-005: an entry that does not say whether it is a chart or a shared part is refused (#7)
    • pass unit module registry CORE-SITE-005: an entry without its matrix or its API reference is refused, as is a name registered twice (#7)
    • pass unit module registry CORE-SITE-005: the registry as committed is well formed (#7)
  16. CORE-SITE-006 pass

    Each module has an evidence page that lists every requirement in its matrix with the requirement's text, the tests named for it and the result each test recorded. A requirement with no test says so.

    • pass browser CORE-SITE-006: every module has an evidence page that lists each requirement of its matrix (#7)
    • pass browser CORE-SITE-006: the connection to R’s evidence page lists every RCON- and PVAL- requirement with the tests that prove it (#7)
    • pass unit evidence page CORE-SITE-006: a requirement with no test says so, and the summary counts it (#7)
    • pass unit evidence page CORE-SITE-006: each requirement shows the tests named for it, unit or browser, with the result each recorded (#7)
    • pass unit evidence page CORE-SITE-006: every requirement is listed in the matrix’s order with its text (#7)
    • pass unit evidence page CORE-SITE-006: tests that carry none of the module’s requirements are listed apart, as run with every module (#7)
    • pass unit evidence page CORE-SITE-006: with every requirement tested and passing the summary says every test is passing (#7)
    Screenshot captured by a test of CORE-SITE-006: a requirement and its tests
  17. CORE-SITE-007 pass

    An evidence page shows, under a requirement, each screenshot a test captured for it. The site build fails when the evidence set names a screenshot that is not committed.

    • pass browser CORE-SITE-007: a screenshot a test captured is shown under its requirement on the evidence page (#7)
    • pass unit evidence page CORE-SITE-007: a screenshot is shown under the requirement it was captured for, and only there (#7)
    • pass unit evidence page CORE-SITE-007: the build is told of a screenshot the evidence names that is not committed (#7)
  18. CORE-SITE-008 pass

    An evidence page says when its results were recorded and in what environment, and links the continuous-integration run when there was one.

    • pass unit evidence page CORE-SITE-008: results recorded on a developer’s machine say so, and absent provenance is not invented (#7)
    • pass unit evidence page CORE-SITE-008: the page says when and where the results were recorded and links the run (#7)
  19. CORE-SITE-009 pass

    Each module has an API reference page rendered from the module's one reference file in docs/: its headings, paragraphs, lists, tables and code, with a list of its sections at the top.

    • pass browser CORE-SITE-009: every module has an API reference page that documents each name it exports (#7)
    • pass browser CORE-SITE-009: the connection to R’s API reference documents createConnection and formatStatistic (#7)
    • pass unit API reference page CORE-SITE-009: a link to another reference file goes to that module’s page, and the page names the file it was rendered from (#7)
    • pass unit API reference page CORE-SITE-009: the page is the reference file, rendered: its title, sections, tables and code (#7)
    • pass unit API reference page CORE-SITE-009: the sections are listed at the top, each linked to its place on the page (#7)
    • pass unit markdown: blocks CORE-SITE-009: a fenced block is code, escaped and left as written, and a # inside it is not a heading (#7)
    • pass unit markdown: blocks CORE-SITE-009: a table keeps each column heading on every cell, so it can restack on a narrow screen (#7)
    • pass unit markdown: blocks CORE-SITE-009: headings get the anchors GitHub gives them, repeated ones numbered (#7)
    • pass unit markdown: blocks CORE-SITE-009: paragraphs join their lines, and bullet and numbered lists keep theirs apart (#7)
    Screenshot captured by a test of CORE-SITE-009: sections of the reference
  20. CORE-SITE-010 pass

    The site build fails when an API reference has drifted from the code: an export of the bundle that no reference documents, a function a reference documents that the bundle does not export, a parameter documented in the source that the reference leaves out, or a constant whose value the reference does not give.

    • pass unit API reference: held to the code CORE-SITE-010: a constant whose value the reference does not give is a problem (#7)
    • pass unit API reference: held to the code CORE-SITE-010: a function the reference documents that the bundle does not export is a problem (#7)
    • pass unit API reference: held to the code CORE-SITE-010: a namespace in the surface stands for each of its members, and a constant carries its value (#7)
    • pass unit API reference: held to the code CORE-SITE-010: a parameter the source documents and the reference leaves out is a problem (#7)
    • pass unit API reference: held to the code CORE-SITE-010: a reference that documents every export, parameter and constant has no problems (#7)
    • pass unit API reference: held to the code CORE-SITE-010: an export no module claims, a surface the bundle lacks and an empty surface are each a problem (#7)
    • pass unit API reference: held to the code CORE-SITE-010: an export with no heading in the reference is a problem (#7)
    • pass unit API reference: held to the code CORE-SITE-010: the committed references document everything the committed bundle exports (#7)
    • pass unit API reference: held to the code CORE-SITE-010: the connection’s reference is held to the parameters its source documents (#7)
  21. CORE-SITE-011 pass

    Every requirement row has at least one test named for it, and no test names a requirement that is in no matrix. The evidence run fails otherwise.

    • pass unit evidence normalizer CORE-SITE-011: a requirement row with no test named for it is reported (#7)
    • pass unit evidence normalizer CORE-SITE-011: a test that names a requirement in no matrix is reported with the test (#7)
  22. CORE-SITE-012 pass

    The gallery page holds at a 390-pixel-wide viewport with no horizontal scroll.

    • pass browser CORE-SITE-012: the gallery holds at a 390px-wide viewport with no horizontal scroll (#7)
  23. CORE-SITE-013 pass

    A module's evidence page holds at a 390-pixel-wide viewport with no horizontal scroll.

    • pass browser CORE-SITE-013: each module’s evidence page holds at a 390px-wide viewport with no horizontal scroll (#7)
  24. CORE-SITE-014 pass

    A module's API reference page holds at a 390-pixel-wide viewport with no horizontal scroll; a table is restacked as a list rather than scrolled sideways.

    • pass browser CORE-SITE-014: each module’s API reference holds at a 390px-wide viewport, with its tables restacked (#7)
  25. CORE-SITE-015 pass

    The site publishes the vendored synthetic study at data/synthetic-study/ with its source record, and the gallery page says what each table holds, how many rows it has and which gsm.bio commit it was copied from.

    • pass browser CORE-SITE-015: the site serves the synthetic study, and the gallery gives its row counts and the commit it was copied from (#7)
    • pass unit gallery CORE-SITE-015: the gallery says what each table of the synthetic study holds, its rows, and the commit it was copied from (#7)
  26. CORE-VAR-001 pass

    A variable is written one way wherever one is taken, an axis, a group, a colour or a panel: a biomarker at a visit with a value type, { measure, visit, value }, or a column, { col }. The value types are raw, baseline, change, fold_change and percent_change, and raw when none is given. variable() returns the variable in full.

    • pass unit core: a variable CORE-VAR-001: a biomarker at a visit and a column are each written one way and returned in full (#8)
    • pass unit core: a variable CORE-VAR-001: a variable that was returned can be handed back, and cannot be changed (#8)
    • pass unit core: a variable CORE-VAR-001: the five value types are raw, baseline, change, fold change and percent change (#8)
  27. CORE-VAR-002 pass

    A malformed variable is refused with a message that names what is wrong: not an object, neither or both of a biomarker and a column, an empty name, a value type that is not one of the five, a missing visit, a visit given with a baseline value, or a key that is not known.

    • pass unit core: a variable CORE-VAR-002: a malformed variable is refused with a message naming what is wrong (#8)
  28. CORE-VAR-003 pass

    A variable that asks for a cut is no longer refused: it is returned with its cut, which the shared cut rule reads (CUT-SPEC-001).

    • pass unit core: a variable CORE-VAR-003: a variable that asks for a cut is no longer refused: it is returned with its cut, for the shared cut rule (#8, #43)
  29. CORE-VAR-004 pass

    The value type raw is the participant's result for the biomarker at the visit, as the results table holds it.

    • pass unit core: value types on the synthetic study CORE-VAR-004: raw is the result as the table holds it at the visit (#8)
  30. CORE-VAR-005 pass

    The value type baseline is the participant's result at the baseline visits named in settings. With several named, one result per visit is brought to one value by their mean, or by the statistic named in settings (min, max, first); with none named, the first visit in visit order is the baseline.

    • pass unit core: value types on the synthetic study CORE-VAR-005: baseline is the result at the baseline visit named in settings (#8)
    • pass unit core: value types on the synthetic study CORE-VAR-005: several baseline visits are brought to one value by their mean, or by the statistic named (#8)
    • pass unit core: value types on the synthetic study CORE-VAR-005: with no baseline visit named, the first visit in visit order is the baseline (#8)
  31. CORE-VAR-006 pass

    The value type change is the result at the visit minus the baseline. A participant with no result at the visit, or no baseline result, has no change and is dropped and counted.

    • pass unit core: value types on the synthetic study CORE-VAR-006: a participant with no baseline result has no change, fold change or percent change, and is counted (#8)
    • pass unit core: value types on the synthetic study CORE-VAR-006: change is the result at the visit minus the baseline (#8)
  32. CORE-VAR-007 pass

    The value type fold_change is the result at the visit divided by the baseline. A participant whose baseline is zero or negative has no fold change and is dropped and counted.

    • pass unit core: value types on the synthetic study CORE-VAR-007, CORE-VAR-008: a baseline of zero, or below it, gives no fold or percent change, and the participant is counted (#8)
    • pass unit core: value types on the synthetic study CORE-VAR-007: fold change is the result at the visit divided by the baseline (#8)
  33. CORE-VAR-008 pass

    The value type percent_change is one hundred times the change divided by the baseline. A participant whose baseline is zero or negative has no percent change and is dropped and counted.

    • pass unit core: value types on the synthetic study CORE-VAR-007, CORE-VAR-008: a baseline of zero, or below it, gives no fold or percent change, and the participant is counted (#8)
    • pass unit core: value types on the synthetic study CORE-VAR-008: percent change is one hundred times the change divided by the baseline (#8)
  34. CORE-VAR-009 pass

    label() names a variable in words, for an axis title or a legend: the column's name, or the biomarker, its visit and its value type.

    • pass unit core: a variable CORE-VAR-009: a variable is named in words for an axis or a legend (#8)
  35. CORE-FRAME-001 pass

    frame() resolves named variables to one record per participant: the participant's id, under the name of the id column, and one field per variable, named as the caller named it. Participants are in the participant table's order when one is given, and otherwise in the order first seen in the results.

    • pass unit core: the frame on the synthetic study CORE-FRAME-001: the frame has one record per participant, holding the id and one field per variable, named as given (#8)
  36. CORE-FRAME-002 pass

    On the synthetic study the frame for IL-6 change from Baseline to Week 4 has 186 participants and 14 dropped: 13 with no result at Week 4 and one whose result there is missing.

    • pass unit core: the frame on the synthetic study CORE-FRAME-002: IL-6 change from Baseline to Week 4 has 186 participants and 14 dropped (#8)
  37. CORE-FRAME-003 pass

    A participant for whom a variable cannot be worked out is left out of the frame and counted, by reason and by variable. Every participant seen is in the frame or counted once: under the first variable, in the order given, that could not be worked out.

    • pass unit core: the frame on the synthetic study CORE-FRAME-003: every participant seen is either in the frame or counted once in the dropped list (#8)
  38. CORE-FRAME-004 pass

    Only the results table is required. With it alone the frame resolves a biomarker variable and holds no participant column.

    • pass unit core: the frame on the synthetic study CORE-FRAME-004: the results table alone gives a frame, with no participant column in it (#8)
  39. CORE-FRAME-005 pass

    A column variable is read from the participant table when that table is given and has the column, and otherwise from a column carried on the results rows.

    • pass unit core: the frame on the synthetic study CORE-FRAME-005: a column is read from the participant table when it is given, and otherwise from a column carried on the results rows (#8)
  40. CORE-FRAME-006 pass

    A wide table with one row per participant needs no special handling: given as the results table, or as the participant table, each of its columns resolves as a column variable.

    • pass unit core: the frame on the synthetic study CORE-FRAME-006: a wide table with one row per participant resolves as it is, every column a variable (#8)
  41. CORE-FRAME-007 pass

    Of several results for one participant, biomarker and visit, the first usable one in table order is used, and each later one is counted as an unused row.

    • pass unit core: what the frame leaves out CORE-FRAME-007: of several results for one participant, biomarker and visit the first usable one is used and the rest are counted (#8)
  42. CORE-FRAME-008 pass

    A result that is missing or not a number is not a result: the row is counted as unused, and a participant with no other result at the visit is dropped and counted. Text that reads as a number is a number.

    • pass unit core: what the frame leaves out CORE-FRAME-008: a result that is missing or not a number is not a result, and a participant with no other is dropped and counted (#8)
  43. CORE-FRAME-009 pass

    With a participant table given, it says who the participants are: a participant with results who is not in it is left out and counted, a participant in it with no result is dropped for a biomarker variable and counted, and a row with no id, or a second row for a participant, is counted as unused.

    • pass unit core: what the frame leaves out CORE-FRAME-009: participants in one table and not the other are each handled and counted (#8)
  44. CORE-FRAME-010 pass

    A column read from the results rows must hold one value for the participant. A participant for whom it is empty, holds more than one value, or (for a column read as a number) is not a number is dropped and counted.

    • pass unit core: what the frame leaves out CORE-FRAME-010: a column carried on the results rows must hold one value for the participant; one that is empty, varies or is not a number is counted (#8)
  45. CORE-FRAME-011 pass

    By default every variable is required. A variable not named in the required setting is left empty (null) in a participant's record instead of dropping the participant.

    • pass unit core: what the frame leaves out CORE-FRAME-011: a variable that is not required is left empty rather than dropping the participant (#8)
  46. CORE-FRAME-012 pass

    Column names are settings, named as safety.viz names them, and their defaults are the synthetic study's: USUBJID, TEST, STRESN, VISIT, VISITNUM, with the participant table's id column the same as the results table's unless named.

    • pass unit core: settings CORE-FRAME-012: column names are settings, and their defaults are the synthetic study’s (#8)
  47. CORE-FRAME-013 pass

    A call that cannot be made is refused with a message naming what is wrong: tables that are not arrays of records, a table that is not one of the two, variables not given by name, a name that is the id column's, a setting that is not known or has a value it cannot take, or a column a setting names that the table does not have.

    • pass unit core: settings CORE-FRAME-013: a call that cannot be made is refused with a message naming what is wrong (#8)
  48. CORE-FRAME-014 pass

    The frame's records are plain text and finite numbers, and go to R through the connection as they are, the fields named as a statistics function takes them (strValueCol, strGroupCol).

    • pass unit core: what leaves the frame, and what the module is made of CORE-FRAME-014: the frame’s records go to R through the connection as they are, with the fields named as the statistics functions take them (#8)
  49. CORE-FRAME-015 pass

    The frame changes nothing it is given: not the tables, the variables or the settings.

    • pass unit core: what leaves the frame, and what the module is made of CORE-FRAME-015: the frame changes nothing it is given (#8)
  50. CORE-API-002 pass

    Both committed bundles export core (a page reads BioViz.core): variable, frame, label, the cut rule's cutPoints, cutGroup, cutLabels and cutWords, and the vocabulary VALUE_TYPES, CUTS, BASELINE_STATS, DEFAULT_SETTINGS, DROPPED and UNUSED.

    • pass unit core: what leaves the frame, and what the module is made of CORE-API-002: BioViz.core is exported by both committed bundles, with the variable, the frame and their vocabulary (#8)
  51. CORE-BUILD-003 pass

    The core module imports nothing from outside src/core/, and reaches for no page, no chart and no network.

    • pass unit core: what leaves the frame, and what the module is made of CORE-BUILD-003: the core module imports nothing from outside src/core, and reaches for no page and no network (#8)
  52. CORE-FRAME-016 pass

    visits() lists the visits of a results table in visit order: by the visit-order column when the table has one and otherwise by name with numbers counted as numbers, and only the visits with at least one usable result.

    • pass unit core: settings CORE-FRAME-016: the visits of a results table are listed in visit order, the ones with a usable result only (#9)
  53. CORE-MAN-001 pass

    Both committed bundles export portfolio (a page reads BioViz.portfolio): the chart list, equal to src/data/portfolio.json, in safety.viz's portfolio manifest format, version 2.

    • pass unit the chart list CORE-MAN-001: BioViz.portfolio is the chart list, the same object in the source and in both committed bundles (#32)
  54. CORE-MAN-002 pass

    The chart list validates against safety.viz's portfolio manifest schema at the recorded commit, and a list that breaks the format does not.

    • pass unit the chart list CORE-MAN-002: the chart list validates against safety.viz’s manifest schema at the recorded commit (#32)
  55. CORE-MAN-003 pass

    The schema is safety.viz's src/data/schema/portfolio.json, copied byte for byte to src/data/schema/ by tools/vendor-portfolio-schema.mjs, with a record naming safety.viz's dev branch, the commit and the file's checksum and size; npm test fails when the file and its record disagree, and continuous integration compares the file with safety.viz at the recorded commit (npm run portfolio:check-source).

    • pass unit the chart list CORE-MAN-003: the copied schema matches its record, which names safety.viz’s dev branch and a commit on it (#32)
  56. CORE-MAN-004 pass

    The chart list has one entry for each chart site/config.json marks available, and no other, keyed by its module, under its title and the name of the function the bundle exports for it; each entry names bio.viz as its library and the declared group biomarkers as its group, and takes the results table from the labs and vitals domain, required, and the participant table from the subject-level domain, optional.

    • pass unit the chart list CORE-MAN-004: every entry names bio.viz, is listed in the declared biomarker group, and takes the results table from labs and vitals and the participant table, optional, from the subject-level file (#32)
    • pass unit the chart list CORE-MAN-004: there is one entry for each available chart in site/config.json, under its title and its export, and no other (#32)
  57. CORE-MAN-005 pass

    Each entry's settings are exactly its chart's column-name settings (the keys of its DEFAULT_SETTINGS ending in _col or carrying _col_), each with the chart's default and required exactly where the chart refuses null for it; participant_id_col, whose default null means id_col's name, reads id_col's standard column from the subject-level domain; and an unmapped setting is left out (unmappedSettings: "omit").

    • pass unit the chart list CORE-MAN-005: a chart that refuses a null column is passed nothing for an unmapped one (#32)
    • pass unit the chart list CORE-MAN-005: each entry’s settings are its chart’s column-name settings, with the chart’s defaults, required where the chart refuses no column (#32)
  58. CORE-MAN-006 pass

    An export a module lists in api.data is documented under one heading of its own, and its fields are not held to the reference one by one; the core lists portfolio there.

    • pass unit API reference: held to the code CORE-MAN-006: an export listed as data is documented as one, under one heading, and its fields are not held one by one (#32)
  59. CORE-MAN-007 pass

    The site publishes the chart list at portfolio.json, the same list a page that loads the bundle reads as BioViz.portfolio, and the format it names at schema/portfolio.json.

    • pass browser CORE-MAN-007: the site publishes the chart list as portfolio.json, the same list a page reads as BioViz.portfolio, and the format it names at schema/portfolio.json (#32)
  60. CORE-FRAME-017 pass

    Visit order is one total order, whatever order the rows come in: with a visit-order column, the visits that have a number first, by their least number, then the visits with no number; ties, unnumbered visits and a table with no order column by name, with numbers in a name counted as numbers.

    • pass unit core: settings CORE-FRAME-017: visit order is one total order, whatever order the rows come in: numbered visits by their least number, then visits with no number by name (#49)
  61. CUT-SPEC-001 pass

    A biomarker variable, or a column read as a number, may carry a cut: median, tertiles, quartiles, or typed points in ascending order. variable() returns it with its cut, and label() says the cut after the variable: CRP at Baseline, cut at the median.

    • pass unit core: the cut rule CUT-SPEC-001: a biomarker or a number column may carry a cut: the median, the tertiles, the quartiles, or typed points in ascending order (#43)
  62. CUT-SPEC-002 pass

    A malformed cut is refused with a sentence naming it: a name that is not one of the cuts, an empty list, a point that is not a finite number (named as it is: NaN, Infinity), points not each greater than the one before, typed points written alike to four significant digits, or a column cut that is not read as a number.

    • pass unit core: the cut rule CUT-SPEC-002: a malformed cut is refused with a sentence that names it (#43)
  63. CUT-PTS-001 pass

    The cut points are R's quantile() default (type 7) on the values, one per participant, missing values left out, worked out the way R works them out, so each equals desktop R's to the last binary place; typed points are used as written.

    • pass unit core: the cut rule CUT-PTS-001: the cut points are R’s quantile(type = 7) on the values, missing ones left out, and typed points are used as written (#43)
  64. CUT-PTS-002 pass

    A repeated cut point collapses, and the result says the points repeated; with no value there are no points and no groups.

    • pass unit core: the cut rule CUT-PTS-002: a repeated cut point collapses, and the result says the points repeated (#43)
  65. CUT-GRP-001 pass

    Each participant is in the group R's cut(x, breaks = c(-Inf, points, Inf), right = TRUE) puts them in: a value equal to a cut point falls in the lower group, and a missing value is in no group.

    • pass unit core: the cut rule CUT-GRP-001: each participant is in the group R’s cut(right = TRUE) puts them in: a value equal to a cut point falls in the lower group, and a missing value in none (#43)
  66. CUT-LBL-001 pass

    The groups are ordered low to high and labelled with their bounds (≤ a, > a, ≤ b, > z), each bound written to four significant digits as R's format(signif(p, 4), scientific = FALSE, trim = TRUE) writes it, a tie rounded to even.

    • pass unit core: the cut rule CUT-LBL-001: groups are ordered low to high and labelled with their bounds, each written to four significant digits as R’s signif() writes it (#43)
  67. CUT-LBL-002 pass

    A bound however small or large is written in full with no trailing zero, as R writes it with scientific = FALSE: 0.000000000000000111, 0.0000001, 3382000000000000000000; no point a double holds is refused for its size.

    • pass unit core: the cut rule CUT-LBL-002: a bound however small or large is written in full with no trailing zero, as R’s format(scientific = FALSE) writes it (#43, #46)
  68. CUT-GRP-002 pass

    Distinct points written alike make groups with the same label, and those groups are one, as R's cut() merges levels with the same label; the result says they merged.

    • pass unit core: the cut rule CUT-GRP-002: distinct points written alike make groups with the same label, which are one group, as R’s cut() merges levels with the same label, and the result says they merged (#43, #46)
  69. CUT-STUDY-001 pass

    On the synthetic study, the core's frame gives the cut variable's values that desktop R reads, for the participants a filter keeps, and the points and groups made from them are R's.

    • pass unit core: the cut rule CUT-STUDY-001: on the synthetic study, the frame’s values of the cut variable, for the participants the filters keep, are R’s, and so are the points and the groups (#43)
  70. CUT-DOC-001 pass

    The R recipe in the core's reference is, line for line, the one tools/r-cut.R runs to write the expected results.

    • pass unit core: the cut rule CUT-DOC-001: the R recipe in the core’s reference is, line for line, the one tools/r-cut.R runs to make the expected results (#43)
  71. CORE-NEWS-001 pass

    The release log holds its shape: only the first section may be (Upcoming), a released section links nothing on the dev site, and the newest released section is the package version.

    • pass unit the release log CORE-NEWS-001: only the first section may be upcoming; a released section links nothing on the dev site; the newest released section is the package version (#56)

Tests run with every module

40 tests of the site, the evidence pipeline and the repository’s own checks

These are recorded in every module’s evidence set. A requirement ID one of them carries belongs to another module’s page.

  • pass unit API reference: held to the code GC-SITE-004: a chart’s reference names every setting the chart has, and a setting it leaves out is a problem (#9)
  • pass unit evidence normalizer buildEvidenceSets splits records per module and duplicates shared scaffold records (#1)
  • pass unit evidence normalizer buildRun builds GitHub Actions run provenance from the environment (#1)
  • pass unit evidence normalizer compareEvidence flags status drift and test-set changes, ignoring screenshots (#1)
  • pass unit evidence normalizer compareEvidence ignores provenance so --check never drifts on generatedAt/environment/run (#1)
  • pass unit evidence normalizer moduleForFile routes test files to modules by path (#1)
  • pass unit evidence normalizer normalizePlaywright walks nested suites into browser-suite records (#1)
  • pass unit evidence normalizer normalizeVitest maps assertion results to unit-suite records (#1)
  • pass unit evidence normalizer parseTestName extracts requirement IDs and issue refs (#1)
  • pass unit evidence normalizer parseTestName recognizes any requirement-ID prefix, not just SH (#1)
  • pass unit evidence normalizer provenance lives in dedicated top-level keys; the records array stays timestamp-free (#1)
  • pass unit evidence page the page links the module’s requirement matrix and its committed evidence set (#7)
  • pass unit gallery the home page heads its callout for one chart and for several (#26)
  • pass unit gallery the home page links each module’s evidence page and API reference, and the gallery (#7)
  • pass unit gallery the home page says there are no charts yet only while none is published (#9)
  • pass unit markdown: blocks a relative link points at the repository, and a link to another reference file at its page (#7)
  • pass unit markdown: inline keeps a code span inside a link label, and links a bare address in angle brackets (#7)
  • pass unit markdown: inline mdText strips the marks and keeps the words (#7)
  • pass unit markdown: inline reads nothing inside a code span as a link or as emphasis (#7)
  • pass unit markdown: inline renders code, links, bold and italic, and escapes everything else (#7)
  • pass unit R check page RCON-PAGE-001: the page has a button that starts R, the stated tolerance and the versions desktop R used (#3)
  • pass unit R check page RCON-PAGE-002: the recorded megabytes, requests and seconds are shown for cold, reload and warm, with how they were measured (#3)
  • pass unit R check page RCON-PAGE-003: with no recorded measurement the page says so and prints no number in its place (#3)
  • pass unit repo hygiene no source or test file carries a machine-specific absolute path (#1)
  • pass unit requirements-lib: freshness guard flags added and removed requirement IDs (#1)
  • pass unit requirements-lib: freshness guard flags changed requirement text (#1)
  • pass unit requirements-lib: freshness guard reports fresh when the committed set matches a fresh extraction (#1)
  • pass unit requirements-lib: matrix parsing ignores the header, separator, and non-requirement content (#1)
  • pass unit requirements-lib: matrix parsing keeps an escaped pipe inside a requirement cell as a single row (#1)
  • pass unit requirements-lib: matrix parsing maps each requirement ID to its reviewed text (#1)
  • pass unit requirements-lib: requirement set wraps the parsed map with module + matrix provenance (#1)
  • pass unit requirements-lib: unregistered matrices passes when every matrix file is registered, ignoring the README and non-markdown files (#1)
  • pass unit requirements-lib: unregistered matrices reports a matrix file no module in site/config.json names (#1)
  • pass unit site pages escapeHtml escapes the five HTML-significant characters (#1)
  • pass unit site pages renderShell fills title, description, version and root, and leaves no token behind (#1)
  • pass unit site pages summarizeModule counts requirement rows and passing test records (#1)
  • pass unit site pages the home page links to the R check page (#3)
  • pass unit site pages the home page lists each registered module with its counts and a link to its matrix (#1)
  • pass unit site validation: internal links flags internal links and asset references that do not resolve (#1)
  • pass unit site validation: internal links passes a site whose internal links all resolve, ignoring external and fragment links (#1)

Checking this page

npm ci
npm run evidence:check   # rerun every test and compare with the committed evidence set
npm run evidence         # rebuild docs/evidence/core/evidence.json