Test evidence

Association scatter

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

Summary

Requirements
87
Tests named for them
89 (41 unit, 48 browser)
Result
pass every test passing
Screenshots
16
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. AS-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 every panel is drawn with the kit's Chart.js constructor. On a page without safety.viz the chart refuses to be made, with a message saying that SafetyViz.kit was not found.

    • pass browser AS-KIT-001: the chart is built from safety.viz’s kit on the page and draws with the kit’s Chart.js; without safety.viz it says what is missing (#26)
  2. AS-KIT-002 pass

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

    • pass unit bundle: the association scatter ships, safety.viz and Chart.js do not AS-KIT-002: BioViz.associationScatter is exported by both committed bundles, which hold none of safety.viz and no Chart.js, and defining it needs no safety.viz (#26)
  3. AS-KIT-003 pass

    The chart is built from the parts every chart shares, in src/shared/: the statistics line's rounds and waiting state, the reading of the tables, the settings checks, and the kit's shell, filters, listing, CSV download and participant rail. It imports nothing of the group comparison chart, which is built from the same parts, nor of the correlation matrix, and none of them is written a second time in the chart's own files. How a variable is written in settings and in a request is shared with the correlation matrix, in src/shared/variables.js.

    • pass unit bundle: the association scatter ships, safety.viz and Chart.js do not AS-KIT-003: the chart is built from the parts every chart shares and from nothing of the group comparison chart; that chart is built from the same parts (#26)
  4. AS-KIT-004 pass

    The chart's source holds no statistical inference: no arithmetic of a correlation, a regression, a smooth, an interval or a p-value is written in it. What it works out is a logarithm for a logarithmic axis, its inverse to place R's points on that axis, and the room about an axis.

    • pass unit bundle: the association scatter ships, safety.viz and Chart.js do not AS-KIT-004: the chart’s source holds no statistical inference: it imports no statistics, and no arithmetic of a correlation, a regression, a smooth, an interval or a p-value is written in it (#26)
  5. AS-CFG-001 pass

    Every setting has a default, the column and baseline settings carry the core's names and defaults, and a setting the group comparison chart also has is named the same, with the same default.

    • pass unit association scatter: settings AS-CFG-001: every setting has a default, and the column and baseline defaults are the core’s (#26)
  6. AS-CFG-002 pass

    Each axis is set by a variable as the core takes one, x and y: a biomarker at a visit with a value type, or a participant-level column, which is read as a number. A malformed variable is refused where it was written.

    • pass unit association scatter: settings AS-CFG-002: an axis is a variable as the core takes one: a biomarker at a visit with a value type, or a participant-level column read as a number (#26)
  7. AS-CFG-003 pass

    A caller's settings are laid over the defaults; a setting that is not known, or a value a setting cannot take, is refused with a message naming it.

    • pass unit association scatter: settings AS-CFG-003: 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 (#26)
  8. AS-CFG-004 pass

    The chart has no setting that chooses a confidence level, a minimum number of pairs, an adjustment or how smooth a smooth is.

    • pass unit association scatter: settings AS-CFG-004: the chart has no setting that chooses a confidence level, a minimum number of pairs, an adjustment or how smooth a smooth is (#26)
  9. AS-DATA-001 pass

    The chart draws one point per participant. The rows come from the core's frame with x and y as two variables, so a participant missing either is left out and counted by the core's reason and by the axis it was missing on.

    • pass unit association scatter: the points AS-DATA-001: one point per participant, from the core’s frame with x and y as two variables; a participant missing either is left out and counted by reason and by axis (#26)
  10. AS-DATA-002 pass

    Either axis is a biomarker at a visit with any value type, or a participant-level number.

    • pass unit association scatter: the points AS-DATA-002: either axis is a biomarker at a visit with any value type, or a participant-level number (#26)
  11. AS-DATA-003 pass

    A colour splits the points by the levels of a group, and panels by one further variable give one panel per level, each holding its own participants, all on the same two axes.

    • pass unit association scatter: the points AS-DATA-003: a colour splits the points by its levels, and panels by one further variable are one panel per level, each holding its own participants (#26)
  12. AS-DATA-004 pass

    Each axis has its own scale, linear or logarithmic. On a logarithmic axis a value of zero or less is left out and counted for that axis, a participant is counted once, and the axis's room is a ratio.

    • pass unit association scatter: the points AS-DATA-004: each axis has its own scale, and on a logarithmic one a value of zero or less is left out and counted for that axis (#26)
  13. AS-DATA-005 pass

    A filter chooses participants: the ones filtered out are not drawn, and are not counted as missing a result. A filter that lets nobody through draws nothing and raises no error.

    • pass unit association scatter: the points AS-DATA-005: a filter chooses participants: the ones filtered out are not drawn and not counted as missing, and a filter that lets nobody through draws nothing (#26)
  14. AS-DATA-006 pass

    With the results table alone the points are the ones the participant table would give, and a column carried on the results rows can be a colour or a participant-level number.

    • pass unit association scatter: the points AS-DATA-006: with the results table alone the points are the ones the participant table would give, and a column carried on the results rows can be a colour or an axis (#26)
  15. AS-DATA-007 pass

    An axis is named for its variable, with the unit its values are in; a fold change has no unit, a percent change is in percent, and a column is named by its label.

    • pass unit association scatter: the points AS-DATA-007: an axis is named for its variable, with the unit its values are in; a fold change has no unit, a percent change is in percent, and a column is named by its label (#26)
  16. AS-DATA-008 pass

    A change, a fold change or a percent change read at the one baseline visit is the same for every participant; the chart draws nothing there and asks for a later visit.

    • pass unit association scatter: the points AS-DATA-008: a change, a fold change or a percent change read at the one baseline visit is the same for everyone, and is said to be nothing to draw (#26)
  17. AS-DATA-009 pass

    The identity line is y = x across the part of the two axes they share: two ends when the axes have the same scale, a curve along y = x when one is logarithmic and one linear, and nothing where they share no value. It reads no data.

    • pass unit association scatter: the line y = x, and a region AS-DATA-009: the identity line is y = x across the part of the two axes they share: two ends of a ruler, and no statistic (#26)
  18. AS-DATA-010 pass

    A region holds the participants whose point is inside it on both axes, edges included, however its corners are given.

    • pass unit association scatter: the line y = x, and a region AS-DATA-010: a region holds the participants whose point is inside it on both axes, edges included, however its corners are given (#26)
  19. AS-CTRL-001 pass

    The participant-level numbers an axis can take are the columns in which every written value is a number and more than one value occurs: the participant table's, or those carried on the results rows. The setting numbers, when given, is the list.

    • pass unit association scatter: what the controls offer AS-CTRL-001: the participant-level numbers an axis can take are the columns in which every written value is a number and more than one value occurs; the setting `numbers` is the list when given (#26)
  20. AS-CTRL-002 pass

    With no variable named the chart opens on the first two biomarkers at the first visit, with stated fallbacks for one biomarker and one visit. A variable that is named is the one it opens on, and one the tables do not have gives way to the defaults and is reported.

    • pass unit association scatter: what the controls offer AS-CTRL-002: with no variable named the chart opens on the first two biomarkers at the first visit; a variable that is named is the one it opens on, and one the tables lack gives way and is reported (#26)
  21. AS-CTRL-003 pass

    The variable, the value type, the visit and the scale of each axis are chosen in the sidebar, and the chart follows; a participant-level number has no value type and no visit, and a baseline value has no visit.

    • pass browser AS-CTRL-003: the variable, the value type, the visit and the scale of each axis are chosen in the sidebar, and the chart follows (#26)
  22. AS-CTRL-004 pass

    The colour, the panels, the fitted line and the method are chosen in the sidebar, and Reset chart returns every control and filter to what the chart opened on.

    • pass browser AS-CTRL-004: the colour, the panels, the fitted line and the method are chosen in the sidebar, and Reset chart returns every control to what the chart opened on (#26)
  23. AS-DRAW-001 pass

    On the synthetic study the chart draws the planted pair, TNF-alpha against IL-10 at Baseline, as one point per participant at its two results, with each axis named for its variable and unit and the note saying how many of how many are drawn.

    • pass browser AS-DRAW-001: the planted pair, one point per participant at its two results, each axis named for its variable and unit (#26)
    Screenshot captured by a test of AS-DRAW-001: as the gallery shows itScreenshot captured by a test of AS-DRAW-001: planted pair
  24. AS-DRAW-002 pass

    A colour gives each level its own colour and a key; the key does not switch a level off, because the coefficient is of every point drawn.

    • pass browser AS-DRAW-002: a colour gives each level its own colour and a key, and the key does not switch a level off (#26)
    Screenshot captured by a test of AS-DRAW-002: colour by arm
  25. AS-DRAW-003 pass

    Panels by one further variable are each a chart of their own on the same two axes, with their own count.

    • pass browser AS-DRAW-003: panels by one further variable are each a chart of their own on the same two axes, with their own count (#26)
    Screenshot captured by a test of AS-DRAW-003: panels by sex
  26. AS-DRAW-004 pass

    Each axis can be logarithmic on its own; values of zero or less are left out and the note above the chart counts them by axis.

    • pass browser AS-DRAW-004: each axis can be logarithmic on its own, and values of zero or less are left out and counted by axis (#26)
  27. AS-DRAW-005 pass

    The identity line is drawn with no R attached, and nothing is asked of R for it.

    • pass browser AS-DRAW-005: the identity line is drawn with no R attached, and nothing is asked of R for it (#26)
    Screenshot captured by a test of AS-DRAW-005: identity line
  28. AS-FILTER-001 pass

    Loaded with the results table alone the chart draws and shows no filters; with the vendored results, which carry no participant-level column, it offers no colour and no panel.

    • pass browser AS-FILTER-001: loaded with the results table alone it draws and shows no filters, and offers no colour and no panel when the rows carry none (#26)
  29. AS-FILTER-002 pass

    Loaded with participant data the chart shows a filter per category column and offers the participant-level variables to colour and panel by and on either axis; a filter narrows the participants drawn, and the note follows.

    • pass browser AS-FILTER-002: loaded with participant data it shows filters and offers participant-level variables, and a filter narrows the participants drawn (#26)
  30. AS-FILTER-003 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; nothing is 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 AS-FILTER-003: on the demo, filters with nobody in common leave the chart saying, in words, that no participant passes the filters; nothing is drawn, R is asked nothing, the controls stay usable, and loosening a filter draws again (#29)
  31. AS-FILTER-004 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 AS-FILTER-004: 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)
  32. AS-STAT-001 pass

    What R is asked for a panel is the function named in settings, the panel's rows by the names of their fields, and the arguments strXCol, strYCol and strMethod, with strGroupCol when there is a colour. Nothing else is sent.

    • pass unit association scatter: what R is asked AS-STAT-001: R is asked for one panel with the function named in settings, the panel’s rows by the names of their fields, and the two columns and the coefficient; a colour adds the column a coefficient is given within (#26)
  33. AS-STAT-002 pass

    The identity of a panel's rows states what was drawn by the settings' names: the two variables, the baseline settings, the colour and its levels in the rows, the panel, the filters in force and each logarithmic scale. A member that is not set is left out, the method is not part of it, and no two views share one.

    • pass unit association scatter: what R is asked AS-STAT-002: the identity of a panel’s rows states what was drawn by the settings’ own names, a member that is not set is left out, and no two views share one (#26)
  34. AS-STAT-003 pass

    On a logarithmic axis R is handed the base-10 logarithm of that axis's values, the values as plotted, and the scale is part of the rows' identity, so a result stored for one scale never answers for the other.

    • pass unit association scatter: what R is asked AS-STAT-003: on a logarithmic axis R is handed the base-10 logarithm of that axis’s values, the values as plotted, and the scale is part of the rows’ identity (#26)
  35. AS-STAT-004 pass

    The result is printed through the shared formatter with its method and counts, labelled exploratory and unadjusted, and the coefficient with the interval R gave, each number R's own to four significant figures; no star and never the word significant.

    • pass unit association scatter: what the line says AS-STAT-004: the result is printed through the shared formatter with its method and counts, labelled exploratory and unadjusted, and the coefficient with the interval R gave; no star and never the word significant (#26)
  36. AS-STAT-005 pass

    Spearman's coefficient is printed with no interval, because R gives none, and R's note says so; none is made up.

    • pass unit association scatter: what the line says AS-STAT-005: Spearman’s coefficient is printed with no interval, because R gives none, and R’s note says so; none is made up (#26)
  37. AS-STAT-006 pass

    With a colour the coefficient within each level is printed from R's rows as a small table, each with its count, its interval and its p-value, under a caption naming the method and labelling them unadjusted; a level with too few pairs prints R's reason in its row.

    • pass unit association scatter: what the line says AS-STAT-006: with a colour the coefficient within each level is printed from R’s rows as a small table, each with its count, its interval and its p-value under a caption naming the method; a level with too few pairs prints R’s reason in its row (#26)
  38. AS-STAT-007 pass

    Too few pairs prints R's reason once and no number.

    • pass unit association scatter: what the line says AS-STAT-007: too few pairs prints R’s reason, once, and no number (#26)
  39. AS-STAT-008 pass

    R's warnings and notes are printed as R worded them, and an answer that is not R's result reads as what it is: unavailable, not stored for this view, or an error.

    • pass unit association scatter: what the line says AS-STAT-008: what R warned and noted is printed as R worded it, and an answer that is not R’s result reads as what it is: unavailable, not stored, an error (#26)
  40. AS-STAT-009 pass

    From the moment a result is asked for until it arrives the line says it is waiting, with the page's note until R has answered once; an answer that arrives after the chart has been drawn again is never shown. A fitted line waits in its own words.

    • pass unit association scatter: what the line says AS-STAT-009: the line says it is waiting from the moment a result is asked for until it arrives, with the page’s note until R has answered once, and an answer that arrives after the chart has been drawn again is never shown (#26)
  41. AS-STAT-010 pass

    What a coefficient covers is said under it, and every time an axis is logarithmic the line says which scale the statistic was computed on, for either coefficient and for either fitted line.

    • pass unit association scatter: what the line says AS-STAT-010: what a coefficient covers is said under it, and every time an axis is logarithmic the line says which scale the statistic was computed on (#26)
  42. AS-STAT-011 pass

    The rows desktop R is run on are the chart's: each case is one panel of the gallery's demo in one view, its rows made by the chart's own code from the demo's own tables and settings, and deriving them again gives the committed files. The files hold the values the chart drew; on a logarithmic axis the chart hands R their base-10 logarithm, and the R script takes that logarithm itself.

    • pass unit the rows R is run on AS-STAT-011: deriving each case’s rows again, with the chart’s own code from the demo’s own tables and settings, gives the committed files (#26)
    • pass unit the rows R is run on AS-STAT-011: the rows are the chart’s: one per participant, the fields the chart hands R, the values the chart drew, and the demo’s settings read from the demo’s own script (#26)
  43. AS-STAT-012 pass

    The expected results name the script, the R version, and the commit and checksum of the vendored statistics file that made them, and hold one result per case: both coefficients, a coefficient per colour, a level and a view too small, and both fitted lines.

    • pass unit what desktop R answered, and the key it wrote AS-STAT-012: the expected results name the script, the R version and the vendored statistics file that made them, and hold one result per case (#26)
  44. AS-STAT-013 pass

    A stored result written from R by the documented recipe is one the chart finds: for every case the function, the arguments, the identity and the row count R wrote are the ones the chart asks with, and handed to a connection each is found by its own view's request and by no other's.

    • pass unit what desktop R answered, and the key it wrote AS-STAT-013: 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 (#26)
    • pass unit what desktop R answered, and the key it wrote AS-STAT-013: handed to a connection as stored results, each of R’s answers is found by the chart’s request for its panel, and by no other view’s (#26)
  45. AS-STAT-014 pass

    The correlation the synthetic study was planted with, 0.6, lies inside the interval R gives for the planted pair; and R's Spearman coefficient is the same on logarithms as on the values, while Pearson's is not.

    • pass unit what desktop R answered, and the key it wrote AS-STAT-014: the correlation the study was planted with, 0.6, lies inside the interval R gives for the planted pair; and R’s Spearman coefficient is the same on logarithms as on the values (#26)
  46. AS-STAT-015 pass

    On the page, with no R attached, the statistics line of every panel reads that statistics are unavailable, and nothing is fetched to say so.

    • pass browser AS-STAT-015: with no R attached the statistics line of every panel reads that statistics are unavailable, and nothing is fetched to say so (#26)
  47. AS-STAT-016 pass

    On the page, with a connection given in settings, the line shows that it is waiting until R answers and then prints the answer; R is asked for the rows that are drawn.

    • pass browser AS-STAT-016: the line shows that it is waiting until R answers, and then prints the answer through the shared formatter; R is asked for the rows that are drawn (#26)
    Screenshot captured by a test of AS-STAT-016: statistics line
  48. AS-STAT-017 pass

    On the page, a change to a variable, a visit, a scale, the colour, the panels, the method or a filter each clears the line and asks R again for what is then drawn, and the answer to the question before is never shown. A region asks R nothing.

    • pass browser AS-STAT-017: a change to a variable, a visit, a scale, the colour, the method or a filter each clears the line and asks R again, the answer to the question before is never shown, and a region asks nothing (#26)
  49. AS-STAT-018 pass

    On the page, each panel asks R for itself, on its own rows and under its own identity, and is answered for itself.

    • pass browser AS-STAT-018: each panel asks R for itself, on its own rows and under its own identity, and is answered for itself (#26)
  50. AS-STAT-019 pass

    On the page, with R's answers stored and no R attached, a view an answer was stored for prints it, the coefficient with its interval and the table per colour, with no request to R's hosts; a view none was stored for reads unavailable, never another view's numbers.

    • pass browser AS-STAT-019: a view R’s answer was stored for prints it with no R and no request, the coefficient with its interval and the table per colour; a view it was not stored for reads unavailable, never another view’s numbers (#26)
    Screenshot captured by a test of AS-STAT-019: coefficient by arm
  51. AS-STAT-020 pass

    On the page, with an axis logarithmic, the line says which scale the statistic was computed on, and R is handed the logarithms.

    • pass browser AS-STAT-020: with an axis logarithmic the line says which scale the statistic was computed on, and R is handed the logarithms (#26)
    Screenshot captured by a test of AS-STAT-020: logarithmic axes
  52. AS-FIT-001 pass

    A fitted line is asked of R for a panel with the function named in settings, the rows and the identity the coefficient is asked with, and the arguments strXCol, strYCol and strMethod, linear or smooth, with strGroupCol when there is a colour. The identity line is never asked for.

    • pass unit association scatter: the fitted line AS-FIT-001: R is asked for a panel’s line with the function named in settings, the rows and the identity the coefficient is asked with, and the two columns and the kind of line; a colour adds the column a line is fitted within (#26)
  53. AS-FIT-002 pass

    A linear fit prints the test of its slope with its method and counts, the slope and the intercept with the intervals R gave, and R-squared; with a colour, each level's slope and intercept in a small table. Too few pairs prints R's reason and no number.

    • pass unit association scatter: the fitted line AS-FIT-002: a linear fit prints the test of its slope with its method and counts, the slope and the intercept with the intervals R gave, and R-squared; with a colour, each level’s slope and intercept in a small table (#26)
  54. AS-FIT-003 pass

    A smooth prints its method and the pairs it used and no p-value, because a smooth has no test, with R's notes; a level R drew no curve for says why.

    • pass unit association scatter: the fitted line AS-FIT-003: a smooth prints its method and the pairs it used and no p-value, because a smooth has no test, with R’s notes; a level R drew no curve for says why (#26)
  55. AS-FIT-004 pass

    The lines drawn are exactly the points R returned, joined, with R's band between its lower and upper points; on a logarithmic axis each is put back on the axis's own scale. With no answer from R there is no line, and the chart says it is not drawn and why.

    • pass unit association scatter: the fitted line AS-FIT-004: the lines drawn are exactly the points R returned, joined: nothing of a line, a curve or a band is worked out here, and with no answer from R there is no line (#26)
  56. AS-FIT-005 pass

    On the page, with no R attached, a linear fit and a smooth are not drawn and the chart says why, while the points and the identity line still draw.

    • pass browser AS-FIT-005: with no R attached a linear fit and a smooth are not drawn and the chart says why, while the points and the identity line still draw (#26)
  57. AS-FIT-006 pass

    On the page, with R's answers stored, a linear fit and a smooth are drawn from R's points with their band, each colour's in its colour, and the slope and intercept are printed with their intervals.

    • pass browser AS-FIT-006: with R’s answers stored a linear fit and a smooth are drawn from R’s points with their band, each colour’s in its colour, and the slope and intercept are printed with their intervals (#26)
    Screenshot captured by a test of AS-FIT-006: linear fit by armScreenshot captured by a test of AS-FIT-006: linear fit
  58. AS-BRUSH-001 pass

    Dragging across the points selects a region: its participants are listed in the kit's record listing, the points outside it fade, and the footnote says how many of how many are listed. The statistics stay those of every participant drawn, R is not asked again, and the chart says so.

    • pass browser AS-BRUSH-001: dragging across the points lists the participants of the region, the others fade, and the statistics stay those of every participant drawn (#26)
    Screenshot captured by a test of AS-BRUSH-001: a region listed
  59. AS-BRUSH-002 pass

    With panels a region is in the panel it was dragged in and lists that panel's participants; chart.brush() selects one by values and names its panel, and a new region replaces the last.

    • pass browser AS-BRUSH-002: with panels a region is in the panel it was dragged in and lists that panel’s participants; chart.brush() selects one by values, and a new region replaces the last (#26)
  60. AS-BRUSH-003 pass

    Where a finger is the pointer a drag on the chart scrolls the page until Select a region is switched on; then a drag selects a region and does not scroll. A tap on a point lists its participant either way.

    • pass browser AS-BRUSH-003: where a finger is the pointer a drag on the chart scrolls the page until Select a region is on; then a drag selects a region and does not scroll (#26)
    Screenshot captured by a test of AS-BRUSH-003: a region on a phone
  61. AS-BRUSH-004 pass

    A change to a control or a filter, a click on nothing, or chart.clearBrush() lets go of the region and empties the listing, so it never lists a region that is no longer drawn.

    • pass browser AS-BRUSH-004: a change to a control or a filter, a click on nothing, or clearBrush() lets go of the region and empties the listing (#26)
  62. AS-LIST-001 pass

    The listing's search and paging work on the participants listed, and its export downloads them as CSV under this chart's name.

    • pass browser AS-LIST-001: the listing’s search and paging work on the participants listed, and its export downloads them under this chart’s name (#26)
  63. AS-PROF-001 pass

    Clicking a point lists that participant and opens their profile: the chart raises safety.viz's participantsSelected event with the participant's id, and safety.viz's participant profile opens on it. A row of the listing does the same.

    • pass browser AS-PROF-001: clicking a point lists that participant and opens their profile through the participantsSelected event; a row of the listing does the same (#26)
  64. AS-LIFE-001 pass

    init, setData, setSettings, render, resize and destroy drive the chart as they drive a safety.viz chart; setSettings({ x, y }) opens it on a named pair, and view() reads back what the controls are set to.

    • pass browser AS-LIFE-001: init, setData, setSettings, render, resize and destroy drive the chart as they drive a safety.viz chart, and setSettings({ x, y }) opens it on a named pair (#26)
  65. AS-LIFE-002 pass

    Tables the chart cannot read are refused with a message, shown in the chart's element.

    • pass browser AS-LIFE-002: tables the chart cannot read are refused with a message, shown in its place (#26)
  66. AS-LIFE-003 pass

    The chart can be mounted inside another chart's element on a named pair, with a way back: the setting back puts a button above the chart that calls the caller's function, by a click or from the keyboard.

    • pass browser AS-LIFE-003: the chart can be mounted inside another chart’s element on a named pair, with a way back that calls the caller, by a click or from the keyboard (#26)
  67. AS-MOBILE-001 pass

    At a 390-pixel-wide viewport the chart fills the width with its controls folded away one tap from open, panels stack one to a row, and the page does not scroll sideways.

    • pass browser AS-MOBILE-001: at 390px the chart fills the width with its controls folded away one tap from open, panels stack one to a row, and the page does not scroll sideways (#26)
    Screenshot captured by a test of AS-MOBILE-001: panels on a phone
  68. AS-MOBILE-002 pass

    At a 390-pixel-wide viewport a point can be tapped, its listing read and a profile opened below the chart, with the coefficient, the table per colour and the fitted line's table beneath, and the page still does not scroll sideways.

    • pass browser AS-MOBILE-002: at 390px a point can be tapped, its listing read and a profile opened below the chart, with the coefficient and both tables beneath, and the page does not scroll sideways (#26)
    Screenshot captured by a test of AS-MOBILE-002: tables on a phone
  69. AS-SITE-001 pass

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

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

    The live demo draws the chart on the synthetic study, opening on the planted pair coloured by arm, 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 still draws, and says that R could not be started.

    • pass browser AS-SITE-002: the live demo draws the chart on the synthetic study, opening on the planted pair coloured by arm, with R attached; where R cannot be reached it still draws, and says so (#26)
  71. AS-SITE-003 pass

    The live demo holds at a 390-pixel-wide viewport with no horizontal scroll.

    • pass browser AS-SITE-003: the live demo holds at a 390px-wide viewport with no horizontal scroll (#26)
    Screenshot captured by a test of AS-SITE-003: demo on a phone
  72. AS-SITE-004 pass

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

    • pass unit association scatter: the API reference AS-SITE-004: the reference names every setting the chart has, with its default, and a setting it leaves out is a problem (#26)
  73. AS-LIVE-001 pass

    The gallery's demo draws first and starts R in the browser when the chart 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 prints Pearson's coefficient, its interval and its p-value, for everyone and within each arm, equal to desktop R's for the same rows within 1 part in 10^8; the planted 0.6 lies inside the printed interval.

    • pass browser AS-LIVE-001: the demo draws first and starts R when the chart first asks; the line waits, saying what the first start costs, and then prints Pearson’s coefficient, for everyone and within each arm, as desktop R gives it; the planted 0.6 is inside the printed interval (#26)
  74. AS-LIVE-002 pass

    On the demo, Spearman's coefficient, overall and within each arm, equals desktop R's for the same rows; where R's own answer differs between the desktop's version and the browser's, both are recorded and nothing else differs.

    • pass browser AS-LIVE-002: Spearman’s coefficient, overall and within each arm, is the one desktop R gives; where R’s own answer differs between the two versions both are recorded and nothing else differs (#26)
  75. AS-LIVE-003 pass

    On the demo, the linear fit's slope, intercept, their intervals and every point of the line and its band, overall and within each arm, equal desktop R's, and the lines drawn are those points.

    • pass browser AS-LIVE-003: the linear fit’s slope, intercept, their intervals and every point of the line and its band, overall and within each arm, are the ones desktop R gives, and the lines drawn are those points (#26)
  76. AS-LIVE-004 pass

    On the demo, the smooth's curve and band equal desktop R's, and no p-value is printed for it.

    • pass browser AS-LIVE-004: the smooth’s curve and band are the ones desktop R gives, and no p-value is printed for it (#26)
  77. AS-LIVE-005 pass

    On the demo, with both axes logarithmic, Pearson's coefficient and the linear fit are those of the logarithms and equal desktop R's, and the line says which scale they were computed on.

    • pass browser AS-LIVE-005: with both axes logarithmic Pearson’s coefficient and the linear fit are those of the logarithms, as desktop R gives them, and the line says which scale they were computed on (#26)
  78. AS-LIVE-006 pass

    On the demo, a filter change shows the waiting state and then the new result, which equals desktop R's, and never the old one; a level with too few pairs, and a view with too few, print R's reason and no number.

    • pass browser AS-LIVE-006: a filter change shows the waiting state and then the new result, and never the old one; a level with too few pairs, and a view with too few, print R’s reason and no number (#26)
  79. AS-LIVE-007 pass

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

    • pass browser AS-LIVE-007: the megabytes and seconds of the first statistic are measured, recorded where a reader of the run can find them, and are what the page tells its reader (#26)
  80. AS-LIVE-008 pass

    On a phone the demo prints R's coefficient, its table per arm and the fitted line's, and the page does not scroll sideways.

    • pass browser AS-LIVE-008: on a phone the demo prints R’s coefficient, its table per arm and the fitted line’s, and the page does not scroll sideways (#26)
    Screenshot captured by a test of AS-LIVE-008: r in the browser on a phone
  81. AS-STAT-021 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 AS-STAT-021: once the connection is replaced, a late answer from the old one changes neither the line nor what chart.statistics() reports (#49)
  82. AS-FAIL-001 pass

    When drawing fails, the association scatter says so in its footnote (This chart could not be drawn: and why), takes away what was drawn of the panels, 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 AS-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)
  83. AS-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 AS-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)
  84. AS-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 AS-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)
  85. AS-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.

    • pass browser AS-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)
  86. AS-STAT-022 pass

    The R recipe run on a data frame with a panel 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 AS-STAT-022: the recipe run on a data frame with a panel column that holds numbers writes the identity as text, as the chart asks with (#49)
  87. AS-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 AS-DROP-004: the participant table and the setting that names its id column change together, with setData(tables, settings), and the chart draws (#52)

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/association-scatter/evidence.json