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
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
CORE-BUILD-001 pass
The build writes a script-tag bundle to
dist/bio.viz-{version}/bio.viz.jsthat defines the globalBioViz.CORE-BUILD-002 pass
The build writes an ES module bundle to
dist/bio.viz-{version}/bio.viz.esm.jswith the same exports as the script-tag bundle.CORE-API-001 pass
versionequals theversionfield of package.json: in the source, in both committed bundles, and asBioViz.versionon 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)
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.
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.
CORE-SITE-002 pass
The site's home page holds at a 390-pixel-wide viewport with no horizontal scroll.
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.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)
CORE-DATA-003 pass
The results table has the columns
USUBJID,VISIT,VISITNUM,TEST,STRESU,STRESNand 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.CORE-DATA-004 pass
The participant table has the columns
USUBJID,ARM,SEX,AGE,BMIBL,RESPONSEand 200 rows, one per participant, and every participant in the results table is in it.CORE-DATA-005 pass
The outcomes table has the columns
USUBJID,PARAMCD,PARAM,AVAL,CNSRand 200 rows, one per participant and endpoint, and every participant in it is in the participant table.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)
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)
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)
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)
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)
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)
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.
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)
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)
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.
CORE-SITE-012 pass
The gallery page holds at a 390-pixel-wide viewport with no horizontal scroll.
CORE-SITE-013 pass
A module's evidence page holds at a 390-pixel-wide viewport with no horizontal scroll.
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.
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.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 areraw,baseline,change,fold_changeandpercent_change, andrawwhen 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)
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.
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)
CORE-VAR-004 pass
The value type
rawis the participant's result for the biomarker at the visit, as the results table holds it.CORE-VAR-005 pass
The value type
baselineis 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)
CORE-VAR-006 pass
The value type
changeis 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.CORE-VAR-007 pass
The value type
fold_changeis 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)
CORE-VAR-008 pass
The value type
percent_changeis 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)
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.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.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.
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.
CORE-FRAME-004 pass
Only the results table is required. With it alone the frame resolves a biomarker variable and holds no participant column.
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.
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.
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.
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.
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.
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.
CORE-FRAME-011 pass
By default every variable is required. A variable not named in the
requiredsetting is left empty (null) in a participant's record instead of dropping the participant.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.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.
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).CORE-FRAME-015 pass
The frame changes nothing it is given: not the tables, the variables or the settings.
CORE-API-002 pass
Both committed bundles export
core(a page readsBioViz.core):variable,frame,label, the cut rule'scutPoints,cutGroup,cutLabelsandcutWords, and the vocabularyVALUE_TYPES,CUTS,BASELINE_STATS,DEFAULT_SETTINGS,DROPPEDandUNUSED.CORE-BUILD-003 pass
The core module imports nothing from outside
src/core/, and reaches for no page, no chart and no network.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.CORE-MAN-001 pass
Both committed bundles export
portfolio(a page readsBioViz.portfolio): the chart list, equal tosrc/data/portfolio.json, in safety.viz's portfolio manifest format, version 2.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.
CORE-MAN-003 pass
The schema is safety.viz's
src/data/schema/portfolio.json, copied byte for byte tosrc/data/schema/bytools/vendor-portfolio-schema.mjs, with a record naming safety.viz'sdevbranch, the commit and the file's checksum and size;npm testfails 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).CORE-MAN-004 pass
The chart list has one entry for each chart
site/config.jsonmarks available, and no other, keyed by its module, under its title and the name of the function the bundle exports for it; each entry namesbio.vizas its library and the declared groupbiomarkersas 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)
CORE-MAN-005 pass
Each entry's settings are exactly its chart's column-name settings (the keys of its
DEFAULT_SETTINGSending in_color carrying_col_), each with the chart's default and required exactly where the chart refusesnullfor it;participant_id_col, whose defaultnullmeansid_col's name, readsid_col's standard column from the subject-level domain; and an unmapped setting is left out (unmappedSettings: "omit").CORE-MAN-006 pass
An export a module lists in
api.datais documented under one heading of its own, and its fields are not held to the reference one by one; the core listsportfoliothere.CORE-MAN-007 pass
The site publishes the chart list at
portfolio.json, the same list a page that loads the bundle reads asBioViz.portfolio, and the format it names atschema/portfolio.json.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.
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, andlabel()says the cut after the variable:CRP at Baseline, cut at the median.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.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.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.
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.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'sformat(signif(p, 4), scientific = FALSE, trim = TRUE)writes it, a tie rounded to even.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)
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)
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.
CUT-DOC-001 pass
The R recipe in the core's reference is, line for line, the one
tools/r-cut.Rruns to write the expected results.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.
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


