Test evidence

Biomarker screen

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

Summary

Requirements
85
Tests named for them
88 (30 unit, 58 browser)
Result
pass every test passing
Screenshots
15
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. BS-KIT-001 pass

    The chart is built from SafetyViz.kit, found on the page: safety.viz's bundle and bio.viz's are two script tags, and the shell, the sidebar and the controls are the kit's. On a page without safety.viz the chart refuses to be made, with a message saying that SafetyViz.kit was not found.

    • pass browser BS-KIT-001: the chart is built from safety.viz’s kit on the page; without safety.viz it says what is missing (#36)
  2. BS-KIT-002 pass

    bio.viz's committed bundles export biomarkerScreen, hold none of safety.viz, no Chart.js and no webR, and defining the chart needs no safety.viz.

    • pass unit bundle: the biomarker screen ships, safety.viz, Chart.js and webR do not BS-KIT-002: BioViz.biomarkerScreen is exported by both committed bundles, which hold none of safety.viz, no Chart.js and no webR, and defining it needs no safety.viz (#36)
  3. BS-KIT-003 pass

    The chart is built from the parts every chart shares, in src/shared/, and none of them is written a second time in its own files: the paging of a long list, the way back and the reading of participant-level numbers among them, shared with the charts that had them. Of other charts it imports their public functions alone, groupComparison, associationScatter and stratifiedSurvival (bio.viz#62), to open a row; nothing under their folders and nothing of the correlation matrix; and no other chart imports anything of this one.

    • pass unit bundle: the biomarker screen ships, safety.viz, Chart.js and webR do not BS-KIT-003: the chart is built from the shared parts and writes none of them again; of other charts it imports only their public functions, and no chart imports anything of this one (#36)
  4. BS-KIT-004 pass

    The chart's source holds no statistical inference: no arithmetic of an estimate, an interval, a p-value or an adjustment, and nothing ordered by a key R did not return. What it works out from R's numbers is where a dot and a line sit along the shared axis and how far that axis runs; for a hazard ratio's logarithmic axis, that place is the logarithm of R's number (bio.viz#62).

    • pass unit bundle: the biomarker screen ships, safety.viz, Chart.js and webR do not BS-KIT-004: the chart’s source holds no statistical inference: no arithmetic of an estimate, an interval, a p-value or an adjustment, and nothing ordered by a key R did not return (#36)
  5. BS-CFG-001 pass

    The chart has the settings the reference lists, with these defaults: the core's column and baseline settings; comparison difference (of difference, correlation and, with an outcomes table, hazard), with visit, group_by, levels and with null, so it opens on every biomarker at the first visit between the first two groups of the first column of groups; value_type raw; method pearson; adjustment BH; sort estimate; limit 20; and statistic Analyze_Screen.

    • pass unit biomarker screen: settings BS-CFG-001: every setting has a default; the column and baseline defaults are the core’s; the chart opens on every biomarker at the first visit, a difference between two groups, Benjamini-Hochberg, sorted by estimate, twenty to a page (#36)
  6. BS-CFG-002 pass

    A setting that is not known, or a value a setting cannot take, is refused with a TypeError whose message begins bio.viz: and names the setting; levels names exactly two groups, with is a variable as the core takes one, and the outcomes table's settings name exactly one flag, censored or event (bio.viz#62).

    • pass unit biomarker screen: settings BS-CFG-002: a caller’s settings are laid over the defaults, and a setting that is not known, or a value a setting cannot take, is refused with a message naming it; two groups, and a variable as the core takes one (#36)
  7. BS-DATA-001 pass

    The rows are the biomarkers of the Biomarker list, in its order, each at the one visit with the one value type; a baseline value is read with no visit.

    • pass unit biomarker screen: the rows BS-DATA-001: the rows are the biomarkers of the list, in its order, each at the one visit with the one value type; a baseline value has no visit (#36)
  8. BS-DATA-002 pass

    For a correlation, a biomarker that is the fixed variable itself is not a row of its own, and the note says so. With no column of two groups, no fixed variable, or a change at the one baseline visit, there is nothing to screen, and the chart says why and what to choose.

    • pass unit biomarker screen: the rows BS-DATA-002: for a correlation the fixed variable is not a row of its own, and with nothing to screen the chart says why (#36)
  9. BS-DATA-003 pass

    The frame is the core's: one row per participant, one column per biomarker named by the biomarker, none required, so a participant missing some is kept with a gap; beside them the column of groups or the fixed variable. A participant with none of the biomarkers is left out and counted; the filters choose participants first; two columns of one name are refused in words.

    • pass unit biomarker screen: the rows BS-DATA-003: the frame is the core’s, one column per biomarker named by it with none required, and the column of groups or the fixed variable beside them; a participant with none is left out and counted; the filters choose first; two columns of one name are refused (#36)
  10. BS-DATA-004 pass

    A difference's two groups are the two chosen when the column has both, and otherwise the column's first two, in order; the estimate is the first's less the second's.

    • pass unit biomarker screen: the rows BS-DATA-004: a difference compares the two groups chosen when the column has both, and otherwise its first two, in order (#36)
  11. BS-DATA-005 pass

    The rows are ordered by R's estimate, largest first, by name, or by R's adjusted p-value, smallest first; a row R gave no number for comes after those it did, rows that tie keep R's order, and no key is made that R did not return.

    • pass unit biomarker screen: the order, the axis and the pages BS-DATA-005: the rows are ordered by R’s estimate, largest first, by name, or by R’s adjusted p-value, smallest first; uncomputed rows last; ties in R’s order (#36)
  12. BS-DATA-006 pass

    Every row is drawn on one axis without units: for a difference it runs symmetrically about nought far enough to hold every interval R returned, with round labels; for a correlation from −1 to 1; nought is always on it.

    • pass unit biomarker screen: the order, the axis and the pages BS-DATA-006: every row is on one axis without units, symmetric about nought and holding every interval for a difference, from −1 to 1 for a coefficient (#36)
  13. BS-LIMIT-001 pass

    With more rows than limit, the rows are paged: a page holds at most limit of them in the order sorted, a page that does not exist is brought back to the nearest that does, and the note says how many are shown of how many, in what order and how many to a page.

    • pass unit biomarker screen: the order, the axis and the pages BS-LIMIT-001: with more rows than the limit the rows are paged, and the note says how many of how many, in what order and how many to a page (#36)
  14. BS-LIMIT-002 pass

    On the page, Previous and Next go between the pages of rows, which page of how many is said, the rows are the sorted rows of that page, and R is not asked again.

    • pass browser BS-LIMIT-002: Previous and Next go between pages of the sorted rows, which page of how many is said, and R is not asked again (#36)
    Screenshot captured by a test of BS-LIMIT-002: a page of rows
  15. BS-CTRL-001 pass

    The sidebar offers what the design asks: the comparison, the value type and the visit; for a difference the column of groups and its first and second group; for a correlation the fixed variable, a participant-level number or a biomarker with its visit, and the method; the adjustment; the order; a filter per category column of the participant table; and Reset chart. A baseline value has no Visit control.

    • pass browser BS-CTRL-001: the sidebar offers the comparison, the value and visit, the groups or the variable and method, the adjustment, the order, a filter per category column, and Reset chart (#36)
  16. BS-CTRL-002 pass

    A change to the comparison, the value, the visit, the column of groups, a group, the fixed variable, the method, the adjustment or a filter draws the screen again for what was chosen and asks R again with it; the same group chosen twice swaps the two; Reset chart returns every control to what the chart opened on.

    • pass browser BS-CTRL-002: a change to a control draws the screen again and asks R with it; the same group twice swaps them; Reset chart returns to the opening (#36)
  17. BS-CTRL-003 pass

    A change to the order draws the rows R returned in another order and asks R nothing.

    • pass browser BS-CTRL-003: a change to the order draws R’s rows in another order and asks R nothing (#36)
  18. BS-CTRL-004 pass

    With the setting statistic null the chart has no Statistics controls, asks R for nothing and draws no rows.

    • pass browser BS-CTRL-004: with the setting `statistic` null there are no Statistics controls, R is asked for nothing and no rows are drawn (#36)
  19. BS-DRAW-001 pass

    The demo's view, every biomarker's change from Baseline to Week 4 between the arms, draws one row per biomarker sorted by R's estimate, largest first, with IL-6 at the top: its estimate a dot and its interval a line where R's numbers put them on the one axis, nought marked, and beside them the estimate with its interval, the unadjusted and the adjusted p-value and each group's count.

    • pass browser BS-DRAW-001: the planted difference: one row per biomarker sorted by R’s estimate with IL-6 at the top, its dot and its line where R’s numbers put them on one axis with nought marked, and its estimate, both p-values and each group’s count beside it (#36)
    Screenshot captured by a test of BS-DRAW-001: as the gallery shows itScreenshot captured by a test of BS-DRAW-001: the planted difference
  20. BS-DRAW-002 pass

    Every row is a button whose name is the whole row in a sentence from the shared formatter: the estimate, its interval, the method, the unadjusted and the adjusted p-value and the counts. A caption says what the estimate is, at what level its interval is, which test the p-values are and by what they were adjusted across how many biomarkers, and the line under the screen says the same of R's answer, once.

    • pass browser BS-DRAW-002: every row is a button named by the shared formatter’s sentence; the caption and the line say what the estimate is, which test, and by what adjustment across how many biomarkers, once (#36)
  21. BS-DRAW-003 pass

    Every p-value is printed with its method and counts and labelled exploratory, the adjusted one with the adjustment by name; no star and no word such as significant is printed anywhere, for either adjustment or comparison.

    • pass browser BS-DRAW-003: every p-value comes with its method and counts and is labelled exploratory, the adjustment by name; no star and no verdict anywhere, for either adjustment or comparison (#36)
  22. BS-DRAW-004 pass

    A row R could not compute shows R's reason, as R worded it, and no number, no dot and no line, and says it is not in the adjustment; where no row could be computed the line gives R's reason.

    • pass browser BS-DRAW-004: a row R could not compute shows R’s reason and no number, no dot and no line, and says it is outside the adjustment; where no row could be computed the line gives R’s reason (#36)
    Screenshot captured by a test of BS-DRAW-004: rows r could not compute
  23. BS-DRAW-005 pass

    A correlation screen against IL-10 at Baseline draws every other biomarker on an axis from −1 to 1, with TNF-alpha at the top; for Spearman no interval is drawn or printed, none being made up.

    • pass browser BS-DRAW-005: the correlation against IL-10 at Baseline draws every other biomarker on an axis from −1 to 1 with TNF-alpha at the top; Spearman draws and prints no interval (#36)
    Screenshot captured by a test of BS-DRAW-005: correlation with il 10
  24. BS-DRAW-006 pass

    Above the screen the chart says how many participants are in the frame of how many and how many were left out for having none of the biomarkers; under it, that each row is of the participants who have its biomarker, so each row has its own counts, as R counted them.

    • pass browser BS-DRAW-006: the chart says how many are in the frame of how many and who was left out, and that each row has its own counts, as R counted them (#36)
  25. BS-LIST-001 pass

    The rows download as a CSV file under this chart's name, in the order shown, with the estimate, the interval, both p-values, the counts and R's reason where there is no number.

    • pass browser BS-LIST-001: the rows download as a CSV file under this chart’s name, in the order shown (#36)
  26. BS-STAT-001 pass

    The screen asks R once, whatever the number of rows: the function named in statistic, the frame, the biomarkers as chrCols, the comparison, the column of groups and the two groups for a difference or the fixed variable's column and the method for a correlation, and the adjustment. The identity of the frame names the chart, the value type, the visit, the baseline settings, the fixed variable and the filters in force.

    • pass unit biomarker screen: what R is asked BS-STAT-001: one request for the whole screen: the function, the frame, the biomarkers, the comparison with its groups or its variable and method, and the adjustment; an identity that names the chart, the value type, the visit, the baseline, the variable and the filters (#36)
  27. BS-STAT-002 pass

    R's answer is described without computing anything: the method as R names it, how many rows R computed of how many, and the adjustment by name across the number of rows R adjusted across; R's notes and warnings as R worded them; R's reason where no row could be computed; R's error as an error; and a result that names no method, or whose rows were not adjusted as one family, is refused.

    • pass unit biomarker screen: how R’s answer is described BS-STAT-002: the method, how many rows R computed of how many, and the adjustment across how many; R’s notes; R’s reason where no row could be computed; R’s error; and a result with no method, or rows not adjusted as one family, is refused (#36)
    • pass unit biomarker screen: how R’s answer is described BS-STAT-002: with no R the line says statistics are unavailable, with stored results a view not stored says so, and the desk never shows an answer to the question before (#36)
  28. BS-STAT-003 pass

    Each row is formatted by the shared formatter, and R's numbers are kept beside it for the dot, the line and the order only for a row R computed; a row is in the adjustment when R says it adjusted across it.

    • pass unit biomarker screen: how R’s answer is described BS-STAT-003: each row is the shared formatter’s, R’s numbers are kept for the dot, the line and the order only where R computed the row, and a row is in the adjustment when R says it is (#36)
  29. BS-STAT-004 pass

    From the moment the screen is asked for until R answers, the line reads that it is waiting, with the page's note until R has answered once, and no rows are drawn: the chart says which biomarkers it will screen. Then the rows and the line are drawn from R's answer.

    • pass browser BS-STAT-004: until R answers the line reads that it is waiting, with the page’s note until R has answered once, and no rows are drawn; then the rows are drawn from R’s answer (#36)
    Screenshot captured by a test of BS-STAT-004: waiting for r
  30. BS-STAT-005 pass

    A change that asks R again clears the rows and the line; an answer to the question before is dropped when it arrives, and is never shown.

    • pass browser BS-STAT-005: a change that asks R again clears the rows and the line, and an answer to the question before is never shown (#36)
  31. BS-STAT-006 pass

    With no R attached the line says that statistics are unavailable and no rows are drawn: the chart says which biomarkers it would screen; nothing is fetched to say so.

    • pass browser BS-STAT-006: with no R attached the line says statistics are unavailable and no rows are drawn, the biomarkers it would screen are named, and nothing is fetched (#36)
    Screenshot captured by a test of BS-STAT-006: with no r
  32. BS-STAT-007 pass

    With R's answers stored in the page the rows are drawn from them with no R and no request; a view no result was stored for says so and draws no rows, never another view's.

    • pass browser BS-STAT-007: with R’s answers stored in the page the rows are drawn from them with no R and no request; a view not stored says so and draws no rows (#36)
  33. BS-STAT-008 pass

    chart.statistics() returns what the chart asked R for the screen now drawn and what R answered: one entry, with the function, the arguments, the identity and the number of rows.

    • pass browser BS-STAT-008: chart.statistics() returns what the chart asked R for the screen now drawn and what R answered: one entry (#36)
  34. BS-STAT-009 pass

    For every case of the expected results, the function, the arguments, the identity and the row count that R wrote by the recipe in the reference are the ones the chart asks with; handed to a connection as stored results each is found by the chart's request, and by no other view's; and the recipe in the reference is the script's.

    • pass unit what desktop R answered, and the key it wrote BS-STAT-009: for every case the function, the arguments, the identity and the row count R wrote by the recipe are the ones the chart asks with, and the recipe in the reference is the script’s (#36)
    • pass unit what desktop R answered, and the key it wrote BS-STAT-009: handed to a connection as stored results, each of R’s answers is found by the chart’s request for its view, and by no other view’s (#36)
  35. BS-STAT-010 pass

    The frames desktop R is run on are written by the chart's own code from the demo's own tables and settings, and committed; deriving them again gives the committed files. A gap is an empty cell.

    • pass unit the frames R is run on BS-STAT-010: a frame is the chart’s: the id, one column per biomarker named by it, the column of groups or the variable, a gap an empty cell; and the demo’s settings read from its own script (#36)
    • pass unit the frames R is run on BS-STAT-010: deriving each case’s frame again, with the chart’s own code from the demo’s own tables and settings, gives the committed files (#36)
  36. BS-STAT-011 pass

    The expected results name the script, the R version and the vendored statistics file that made them, and hold one result per case: both comparisons and both adjustments, a filter, another column of groups, a participant-level number, and a view whose every row has a group too small, those rows left out of the adjustment as R says.

    • pass unit what desktop R answered, and the key it wrote BS-STAT-011: the expected results name the script, the R version and the vendored statistics file, and hold one result per case, both comparisons and both adjustments, rows R could not compute left out of the adjustment (#36)
  37. BS-STAT-012 pass

    In desktop R's answers the planted biomarkers are the top rows by estimate: IL-6's change from Baseline to Week 4 between the arms, and TNF-alpha against IL-10 at Baseline, whose interval holds 0.6. A difference row's unadjusted p-value is the group comparison's Welch p-value for that biomarker, and a correlation row's coefficient is the association scatter's, each from that chart's own expected results.

    • pass unit what desktop R answered, and the key it wrote BS-STAT-012: in desktop R the planted biomarkers are the top rows, and a row’s statistic is the one the matching single chart’s own expected results hold (#36)
  38. BS-DRILL-001 pass

    A click on a row of a difference opens the group comparison for that biomarker in place of the screen, at the same visit and value, with the same column of groups and two groups and Welch's test, and a button back that takes the keyboard's place.

    • pass browser BS-DRILL-001: a click on a row of a difference opens the group comparison for that biomarker in place, at the same visit and value with the same groups and Welch’s test, and a button back that takes the keyboard’s place (#36)
    Screenshot captured by a test of BS-DRILL-001: a row opened in the group comparison
  39. BS-DRILL-002 pass

    A click on a row of a correlation opens the association scatter for that biomarker against the fixed variable, with the same method, and a button back.

    • pass browser BS-DRILL-002: a click on a row of a correlation opens the association scatter for that biomarker against the fixed variable, with the same method (#36)
  40. BS-DRILL-003 pass

    From the keyboard a row is reached with Tab and opened with Enter or Space; Enter or Space on the button back returns to the screen.

    • pass browser BS-DRILL-003: from the keyboard a row is reached with Tab and opened with Enter or Space, and Enter or Space on the button back returns (#36)
  41. BS-DRILL-004 pass

    The chart a row opens is handed the screen's connection itself, its filters as they are set and the column settings, with the settings group_comparison or association_scatter beneath. With results stored in the page, the group comparison's Welch p-value is the difference row's unadjusted p-value, and the scatter's coefficient is the correlation row's estimate.

    • pass browser BS-DRILL-004: the chart a row opens has the screen’s connection, its filters and its columns; from stored results the group comparison’s Welch p-value is the row’s unadjusted p-value, and the scatter’s coefficient is the row’s (#36)
  42. BS-DRILL-005 pass

    Returning shows the screen exactly as it was, on the same page in the same order, with the keyboard on the row that was opened, and R is not asked again for the screen.

    • pass browser BS-DRILL-005: returning shows the screen exactly as it was, on the same page in the same order, with the keyboard on the row, and R is not asked again (#36)
  43. BS-DRILL-006 pass

    chart.open(biomarker) opens a row's chart by the biomarker's name and returns it, chart.opened() gives it while it is open, and chart.close() returns to the screen; a name the screen does not have is refused with the names it has. Drawing the screen again closes a chart that is open.

    • pass browser BS-DRILL-006: chart.open(biomarker) opens a row’s chart and returns it, chart.opened() gives it, chart.close() returns; a name the screen lacks is refused; drawing again closes it (#36)
  44. BS-FILTER-001 pass

    On the demo, filters with nobody in common leave the chart reading No participant passes the filters., in the words every chart uses, with the note that none of the participants pass; no rows are drawn, R is asked nothing, the filters and Reset chart stay usable, nothing is written to the console, and loosening a filter draws again.

    • pass browser BS-FILTER-001: on the demo, filters with nobody in common leave the chart saying, in words, that no participant passes the filters; no rows are drawn, R is asked nothing, the controls stay usable, and loosening a filter draws again (#36)
  45. BS-FILTER-002 pass

    A filter reads its spec by the rule safety.viz's charts follow, through the kit's reconcileFilters: start sets what it opens on and All is still offered; only all: false removes All, and its first value is then the one in force; a value the data lacks falls back to All with a console warning naming the filter; and the selection each control shows is the selection the chart filters by.

    • pass browser BS-FILTER-002: a filter reads its spec by safety.viz’s rule: `start` opens it with All still offered, only `all: false` removes All and its first value is then in force, a value the data lacks falls back to All with a warning, and the chart filters by what the controls show (#37)
  46. BS-LIFE-001 pass

    init, setData, setSettings, render, resize and destroy drive the chart as they drive a safety.viz chart; setSettings moves the control of a setting that says what the chart opens on, and destroy takes down the screen, a chart a row had opened and everything in the element.

    • pass browser BS-LIFE-001: init, setData, setSettings, render, resize and destroy drive the chart as they drive a safety.viz chart; setSettings moves a control, and destroy takes down the screen and a chart a row had opened (#36)
  47. BS-LIFE-002 pass

    Tables the chart cannot read are refused with a TypeError, and the message is shown in the chart's place.

    • pass browser BS-LIFE-002: tables the chart cannot read are refused with a message, shown in its place (#36)
  48. BS-MOBILE-001 pass

    At a 390-pixel-wide viewport the chart fills the width with its controls folded away one tap from open; each row stacks its name, its interval on the full width of the axis and its numbers, each named before it, and the page does not scroll sideways.

    • pass browser BS-MOBILE-001: at 390px the controls are folded away; each row stacks its name, its interval on the full width and its numbers, each named, and the page does not scroll sideways (#36)
    Screenshot captured by a test of BS-MOBILE-001: the screen on a phone
  49. BS-MOBILE-002 pass

    At a 390-pixel-wide viewport a tap on a row opens its chart and its button returns, and the page does not scroll sideways at any point.

    • pass browser BS-MOBILE-002: at 390px a tap on a row opens its chart and its button returns, and the page never scrolls sideways (#36)
  50. BS-SITE-001 pass

    The gallery lists the biomarker screen with links to its live demo, its evidence page and its API reference.

    • pass browser BS-SITE-001: the gallery lists the chart, with links to its live demo, its evidence page and its API reference (#36)
  51. BS-SITE-002 pass

    The live demo draws the chart on the synthetic study, opening on the planted difference, every biomarker's change from Baseline to Week 4 between the arms, from safety.viz's vendored bundle and bio.viz's committed one, with R attached and gsm.bio's statistics file published beside it. Where R's host cannot be reached it draws no rows, and says that R could not be started.

    • pass browser BS-SITE-002: the live demo draws the chart on the synthetic study, opening on the planted difference, with R attached; where R cannot be reached it draws no rows, and says so (#36)
  52. BS-SITE-003 pass

    The live demo holds at a 390-pixel-wide viewport with no horizontal scroll, with the controls open and a row opened in its chart.

    • pass browser BS-SITE-003: the live demo holds at a 390px-wide viewport with no horizontal scroll, with the controls open and a row opened (#36)
    Screenshot captured by a test of BS-SITE-003: demo on a phone
  53. BS-SITE-004 pass

    The API reference has a table row for every setting the chart has, with the default the code has; the site build fails when one is missing.

    • pass unit biomarker screen: the API reference BS-SITE-004: the reference names every setting the chart has, with its default, and a setting it leaves out is a problem (#36)
  54. BS-SITE-005 pass

    The demos point at one another: the screen's page says a row opens the group comparison or the association scatter, and the group comparison's and the scatter's pages point to the screen as the way in.

    • pass browser BS-SITE-005: the demos point at one another: the screen’s page says a row opens the group comparison or the scatter, and their pages point to the screen as the way in (#36)
  55. BS-LIVE-001 pass

    The gallery's demo starts R in the browser when the screen first asks, from webR's pinned version and gsm.bio's vendored statistics file, with no R package installed. The line waits, saying what the first start costs, and then every row's estimate, interval, unadjusted and adjusted p-value and counts equal desktop R's within 1 part in 10^8, the rows in the order of R's estimates with IL-6 at the top.

    • pass browser BS-LIVE-001: the demo starts R when the screen first asks; the line waits, saying what the first start costs, and then every row is desktop R’s, in the order of R’s estimates with IL-6 at the top (#36)
    Screenshot captured by a test of BS-LIVE-001: r in the browser
  56. BS-LIVE-002 pass

    On the demo, with Holm's adjustment, every row equals desktop R's.

    • pass browser BS-LIVE-002: with Holm’s adjustment every row equals desktop R’s (#36)
  57. BS-LIVE-003 pass

    On the demo, the correlation screen against IL-10 at Baseline, by Benjamini-Hochberg and by Holm, and with Spearman's coefficient, equals desktop R's in every row, with TNF-alpha at the top and 0.6 inside its interval; where R's own wording differs between the versions, both are recorded and nothing else differs.

    • pass browser BS-LIVE-003: the correlation against IL-10 at Baseline, by Benjamini-Hochberg and by Holm and with Spearman, equals desktop R’s in every row, with TNF-alpha at the top and 0.6 inside its interval (#36)
  58. BS-LIVE-004 pass

    On the demo, a change shows the waiting state and then the new screen, which equals desktop R's, and never the old one: with a filter, another column of groups, the result at Baseline, a participant-level number, and a view whose every row has a group too small.

    • pass browser BS-LIVE-004: a change shows the waiting state and then the new screen, as desktop R gives it, and never the old one: a filter, another column of groups, the result at Baseline, a participant-level number, and every row too small (#36)
  59. BS-LIVE-005 pass

    On the demo, a row of the difference opens the group comparison, whose Welch p-value from the same R, started once, is the row's unadjusted p-value; a row of the correlation opens the scatter, whose coefficient is the row's; returning shows the screen as it was and asks R nothing.

    • pass browser BS-LIVE-005: a row of the difference opens the group comparison, whose Welch p-value from the same R is the row’s; a row of the correlation opens the scatter, whose coefficient is the row’s; returning asks R nothing (#36)
    Screenshot captured by a test of BS-LIVE-005: a row opened with r
  60. BS-LIVE-006 pass

    The megabytes and seconds of the demo's first screen, and the seconds R takes for a screen once started, are measured, printed in the run's log and written to a file with both versions' answers, and the megabytes are what the page tells its reader in the waiting text.

    • pass browser BS-LIVE-006: the megabytes and seconds of the first screen, and of a screen once R has started, are measured, recorded, and are what the page tells its reader (#36)
  61. BS-LIVE-007 pass

    On a phone the demo draws its rows from R, stacked, and the page does not scroll sideways.

    • pass browser BS-LIVE-007: on a phone the demo draws its rows from R, stacked, and the page does not scroll sideways (#36)
    Screenshot captured by a test of BS-LIVE-007: r in the browser on a phone
  62. BS-STAT-013 pass

    When the connection is replaced (setSettings({ connection })), an answer that arrives late from the connection it replaced is never shown: it changes neither the statistics line nor what chart.statistics() reports.

    • pass browser BS-STAT-013: once the connection is replaced, a late answer from the old one changes neither the line nor what chart.statistics() reports (#49)
  63. BS-FAIL-001 pass

    When drawing fails, the biomarker screen says so in its footnote (This chart could not be drawn: and why), takes away what was drawn of the rows, ends the statistics round, empties the listing and the participant rail, says it in the danger colour and keeps its controls; once drawing works again it draws.

    • pass browser BS-FAIL-001: when drawing fails the chart says so in its element and keeps its controls, leaving nothing half drawn, and draws again once it can (#49)
  64. BS-DROP-001 pass

    With a participant table, a participant the results have and the table does not is left out and counted (Not in the participant table), and a row of results with no participant id is counted (Row has no participant id); a participant table without the participant id column is refused with a sentence that names the column.

    • pass browser BS-DROP-001: with a participant table, participants it does not have and rows with no participant id are counted by reason; a participant table without the id column is refused with a sentence that names it (#49)
  65. BS-NAME-001 pass

    A biomarker whose name has a space at either end is screened under its name as written, and R is handed it by that name.

    • pass browser BS-NAME-001: a biomarker whose name has a space at either end is screened under its name as written, and R is handed it by that name (#49)
  66. BS-DROP-002 pass

    With results for participants the participant table does not have and filters that let nobody through, the chart says No participant passes the filters., as it does with no such rows.

    • pass browser BS-DROP-002: with results the participant table does not have and filters that let nobody through, the chart says that nobody passes the filters (#49)
  67. BS-DROP-003 pass

    A setting that names a participant id column the participant table does not have (setSettings({ participant_id_col })) is refused with the same sentence as the tables are, before anything changes, and the chart stays as it was drawn, a chart opened in place included (bio.viz#52).

    • pass browser BS-DROP-003: a setting naming a participant id column the participant table does not have is refused with the same sentence, and the chart stays as it was (#49)
  68. BS-STAT-014 pass

    The R recipe run on a data frame with a visit column that holds numbers writes the identity as text, as the chart asks with, so a stored result written that way is found.

    • pass unit what desktop R answered, and the key it wrote BS-STAT-014: the recipe run on a data frame with a visit column that holds numbers writes the identity as text, as the chart asks with (#49)
  69. BS-STAT-015 pass

    For a difference, the statistics line under the rows prints R's own note that the interval is the pooled-variance interval for Hedges' g while the p-value is Welch's, which does not pool; the chart adds no words of its own about R's methods.

    • pass browser BS-STAT-015: for a difference the statistics line under the rows prints R’s own note that the interval pools the variances and the p-value does not; the chart adds no words of its own about R’s method (#49, #52)
  70. BS-DROP-004 pass

    The participant table and the setting that names its id column change together: setData(tables, settings) checks the tables against the settings it is given with them, lays the settings over, and draws.

    • pass browser BS-DROP-004: the participant table and the setting that names its id column change together, with setData(tables, settings), and the chart draws (#52)
  71. BS-HAZ-001 pass

    For a hazard ratio the frame holds, beside every biomarker, each participant's time and flag for the endpoint, as the outcomes table reads it, censored or event; a participant with no outcome to use is kept with a gap and counted by reason.

    • pass unit biomarker screen: the hazard rows BS-HAZ-001: for a hazard ratio the frame holds, beside every biomarker, each participant’s time and flag for the endpoint as the outcomes table reads it, censored or event; a participant with no outcome to use is kept with a gap and counted by reason (#62)
  72. BS-HAZ-002 pass

    R is asked once per screen with Analyze_Screen's hazard comparison, the time and the flag, and the endpoint in the identity of the frame; for every hazard case the key is the one desktop R wrote, and R's stored answer is found.

    • pass unit biomarker screen: the hazard rows BS-HAZ-002: R is asked once per screen for its hazard comparison, with the time and the flag, and the endpoint in the identity of the frame; for every hazard case the key is the one desktop R wrote, and R’s stored answer is found (#62)
  73. BS-HAZ-003 pass

    Each hazard row is R's hazard ratio of High against Low with its interval, its log-rank p-values unadjusted and adjusted across the rows, and High's and Low's counts; sorted by R's estimate, CRP, the planted biomarker, is the top row; a row R could not compute, a hazard ratio not estimable among them, gives R's reason.

    • pass unit biomarker screen: the hazard rows BS-HAZ-003: each row is R’s hazard ratio of High against Low with its interval, its log-rank p-values unadjusted and adjusted, and High’s and Low’s counts; sorted by R’s estimate CRP, the planted biomarker, is the top row; a row R could not compute gives R’s reason (#62)
  74. BS-HAZ-004 pass

    Hazard ratios share one logarithmic axis at powers of two, from a half to two at least, with 1, no difference, marked; a ratio sits where its logarithm puts it.

    • pass unit biomarker screen: the hazard rows BS-HAZ-004: hazard ratios share one logarithmic axis, at powers of two from a half to two at least, with 1, no difference, marked; a ratio sits where its logarithm puts it (#62)
  75. BS-HAZ-005 pass

    With an outcomes table the screen offers a hazard ratio, high against low; from R's stored answer every row is drawn on the logarithmic axis, CRP at the top, each with its counts, under a heading, a caption and a hint that say what the rows are, the hint naming 1 as the line the axis marks.

    • pass browser BS-HAZ-005: with an outcomes table the screen offers a hazard ratio, high against low: from R’s stored answer every row is drawn on a logarithmic axis with 1 marked, CRP at the top, each with High’s and Low’s counts (#62)
    Screenshot captured by a test of BS-HAZ-005: hazard rows
  76. BS-HAZ-006 pass

    Without an outcomes table the screen offers only its other two comparisons and says why, and a setting asking for a hazard ratio opens on a difference; given one, it is offered.

    • pass browser BS-HAZ-006: without an outcomes table the screen offers only its other two comparisons and says why, and a setting asking for a hazard ratio opens on a difference (#62)
  77. BS-HAZ-007 pass

    A click on a hazard row opens the stratified survival chart for that biomarker, cut at its median, on the same endpoint, with the screen's connection and filters; its hazard ratio from stored results is the row's; the way back returns, with the keyboard on the row.

    • pass browser BS-HAZ-007: a click on a hazard row opens the stratified survival chart for that biomarker, cut at its median, on the same endpoint, with the screen’s connection and filters; its hazard ratio from stored results is the row’s; the way back returns (#62)
  78. BS-HAZ-008 pass

    Against R and the survival package in the browser on the demo: every hazard row, by Benjamini-Hochberg and by Holm, for the women alone, with every row too small, with thirty participants' outcomes taken out and with a hazard ratio R cannot estimate, equals desktop R's within 1 part in 10^8, CRP at the top; its row opens the stratified survival chart, whose hazard ratio from the same R is the row's, and the way back returns.

    • pass browser BS-HAZ-008: with R and the survival package in this browser, every hazard row, by Benjamini-Hochberg and by Holm, for the women alone, with every row too small, with thirty outcomes taken out and with a ratio R cannot estimate, is desktop R’s, CRP at the top; its row opens the stratified survival chart, whose hazard ratio from the same R is the row’s, and the way back returns (#62)
    Screenshot captured by a test of BS-HAZ-008: a hazard row opened with r
  79. BS-HAZ-009 pass

    With some participants holding a value but no outcome, the row and the stratified survival chart it opens cut at the same median, of the participants with both, with the same participants High and Low and R's same hazard ratio; the participants with no outcome are counted once, under one reason.

    • pass unit biomarker screen: the hazard rows BS-HAZ-009: with some participants holding a value but no outcome, the row and the survival chart it opens cut at the same median, of those with both, with the same participants High and Low and R’s same hazard ratio; the participants with no outcome are counted once (#62)
  80. BS-HAZ-010 pass

    A hazard ratio R could not estimate, with no event in one half, is a row with R's reason, no number and no place in the adjustment, which is across the rows that have a p-value.

    • pass unit biomarker screen: the hazard rows BS-HAZ-010: a hazard ratio R could not estimate, with no event in one half, is a row with R’s reason, no number and no place in the adjustment, which is across the rows that have a p-value (#62)
  81. BS-HAZ-011 pass

    In the page, with thirty participants holding CRP but no outcome, the row and the survival chart it opens cut at the same median with the same High and Low counts and the same hazard ratio, and the thirty are counted in one note.

    • pass browser BS-HAZ-011: with thirty participants holding CRP but no outcome, the row and the survival chart it opens cut at the same median, of those with both, with the same High and Low counts and the same hazard ratio; the thirty are counted once (#62)
  82. BS-HAZ-012 pass

    In the page, a hazard ratio R could not estimate is drawn as a row with R's reason and no mark, out of the adjustment, and the statistics line says the adjustment is across the other eleven.

    • pass browser BS-HAZ-012: a hazard ratio R could not estimate, CRP’s Low half having no event, is drawn as a row with R’s reason and no mark, out of the adjustment, which is across the other eleven (#62)
  83. BS-HAZ-013 pass

    With two endpoints the Endpoint control offers both by their labels; choosing the second asks R again on its times, names it in the heading and in the identity of the frame, and a row opens the survival chart on it.

    • pass browser BS-HAZ-013: with two endpoints the Endpoint control offers both by their labels; choosing the second asks R again on its times, names it in the heading and the identity, and a row opens the survival chart on it (#62)
  84. BS-HAZ-014 pass

    On a wide logarithmic axis, more than seven ticks, the tick labels are thinned to every other one, counted from 1, which is always labelled; each label is written by the shared rule for a value, four significant figures.

    • pass browser BS-HAZ-014: on a wide logarithmic axis the tick labels are thinned to every other one, counted from 1, which is always labelled, and each is written by the shared rule for a value (#65 review)
  85. BS-HAZ-015 pass

    An endpoint setting the outcomes table does not hold warns in the console, as a visit does, and the screen opens on the first endpoint; without an outcomes table nothing is said about an endpoint.

    • pass browser BS-HAZ-015: an endpoint setting the outcomes table does not hold warns in the console, as a visit does, and the screen opens on the first endpoint (#65 review)

Tests run with every module

92 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 browser CORE-SITE-001: the home page names the library and its version, and shows the version its bundle reports (#1)
  • pass browser CORE-SITE-002: the home page holds at a 390px-wide viewport with no horizontal scroll (#1)
  • 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 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 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 browser CORE-SITE-007: a screenshot a test captured is shown under its requirement on the evidence page (#7)
  • 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 browser CORE-SITE-012: the gallery holds at a 390px-wide viewport with no horizontal scroll (#7)
  • pass browser CORE-SITE-013: each module’s evidence page holds at a 390px-wide viewport with no horizontal scroll (#7)
  • pass browser CORE-SITE-014: each module’s API reference holds at a 390px-wide viewport, with its tables restacked (#7)
  • 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 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 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)
  • 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)
  • 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 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)
  • 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 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)
  • 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)
  • 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)
  • pass unit evidence page the page links the module’s requirement matrix and its committed evidence set (#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)
  • 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)
  • 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)
  • 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: 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)
  • 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 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)
  • 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 CORE-SITE-001: the home page names the library and its version (#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/biomarker-screen/evidence.json