Safety Shift Plot: test evidence
Requirement-traced qualification evidence for the safety.viz shift-plot module.
Requirement matrix ↗ — the reviewed source specification these tests trace to.
- Scope
- 24 coverage rows34 distinct requirement IDs
- Tests executed
- 130 automated checks22 browser · 108 unit
- Result
- pass all passing5 evidence screenshots
- Generated
- 2026-07-12 05:50 UTC
- Environment
linux 6.17.0-1018-azure · node v22.23.1 · playwright 1.61.1 · chromium 149.0.7827.55- Test run
- Actions run #29181741704
Scope & approach
Traceability for the shift-plot module (#14) — the second full renderer, built on the framework proven by the histogram (#2) — per the convention in CONTRIBUTING.md. Requirement IDs are the SSP-* rows of the 39-row reviewed matrix at safety.agent docs/requirements/safety-shift-plot.md; a few module-scheme IDs (SSP-CHART-002, the module-API SSP-API-001 note) name behavior the matrix does not enumerate. Development follows red-green TDD: matrix row → failing test → minimal implementation.
Each table row traces one requirement to the automated test(s) that evidence it: the requirement ID and its source-matrix rows link back to the reviewed specification, the issue column links the implementing work, and the result column shows the recorded outcome of every matching test from the committed evidence.json with its captured screenshots. Browser evidence is captured at fixed conditions (1280×800, device scale 1) on the canonical Linux CI environment.
Browser evidence (Playwright — tests/e2e/shift-plot.spec.js)
14 requirement rows · 13 tests
| Requirement | Source matrix rows | Issue | Tests & evidence |
|---|---|---|---|
| SSP-CTRL-001/SSP-REQ-002/SSP-CTRL-002/SSP-CTRL-003 | SSP-CTRL-001, SSP-REQ-002, SSP-CTRL-002 | #14 |
|
| SSP-CHART-002 | — | #14 |
|
| SSP-COUNT-001/SSP-REG-005 | SSP-COUNT-001, SSP-REG-005 | #14 |
|
| SSP-REG-020 | SSP-REG-020 | #14 |
|
| SSP-REG-001 | SSP-REG-001 | #14 |
|
| SSP-REG-002/SSP-REG-003 | SSP-REG-002, SSP-REG-003 | #14 |
|
| SSP-CTRL-003 | SSP-CTRL-003 | #14 |
|
| SSP-REG-006 | SSP-REG-006 | #14 |
|
| SSP-REQ-003/SSP-REQ-006/SSP-REQ-007/SSP-REG-004/SSP-REG-012 | SSP-REQ-003, SSP-REQ-006, SSP-REQ-007, SSP-REG-004, SSP-REG-012 | #14 |
|
| SSP-REG-011 | SSP-REG-011 | #14 |
|
| SSP-REG-008/SSP-REG-009/SSP-REG-010 | SSP-REG-008, SSP-REG-009, SSP-REG-010 | #14 |
|
| SSP-API-003 | SSP-API-003 | #14 |
|
| SSP-API-001 (module scheme) | — (see legacy-API note) | #14 |
|
| SSP-REG-016/SSP-REG-018 | SSP-REG-016, SSP-REG-018 | #14 |
|
Unit evidence (Vitest — tests/unit/shift-plot/)
10 requirement rows · 15 tests
| Requirement | Source matrix rows | Issue | Tests & evidence |
|---|---|---|---|
| SSP-CFG-004/005/006 | SSP-CFG-004, SSP-CFG-005, SSP-CFG-006 | #14 |
|
| SSP-REQ-005 | SSP-REQ-005 | #14 |
|
| SSP-REG-020 | SSP-REG-020 | #14 |
|
| SSP-DATA-001 | SSP-DATA-001 | #14 |
|
| SSP-REG-013/SSP-REG-014 | SSP-REG-013, SSP-REG-014 | #14 |
|
| SSP-REQ-005/SSP-REG-019 | SSP-REQ-005, SSP-REG-019 | #14 |
|
| SSP-CFG-005 | SSP-CFG-005 | #14 |
|
| SSP-CTRL-001/SSP-CTRL-003 | SSP-CTRL-001, SSP-CTRL-003 | #14 |
|
| SSP-CHART-002 | — | #14 |
|
| SSP-DATA-001/SSP-DATA-003 | SSP-DATA-001, SSP-DATA-003 | #14 |
|
Visual evidence
Every screenshot below is a committed baseline: the same PNG is the visual-regression baseline the browser suite asserts against and the evidence artifact shown here. Click any capture for the full-resolution image.

SSP COUNT 001 participant count 
SSP CTRL 001 baseline scatter 
SSP REG 008 linked listing 
SSP REG 020 invalid data note 
SSP REQ 003 brushed selection
Source-matrix routing status (39 rows)
Of the 39 reviewed SSP-* rows, 32 are covered by the browser/unit evidence above and 7 are descoped with rationale below (honest routing per the histogram precedent).
- Descoped — legacy Webcharts/CAT (5 rows): - SSP-API-001 ("a factory to create a custom Webcharts chart object") describes the legacy Webcharts API, which the designs intentionally do not preserve. The module ships the pilot's lifecycle API instead —
SSP-API-001in the module scheme (see the browser table). - SSP-CFG-001 and SSP-CFG-002 are legacy Webcharts settings passthrough/detail; the nextgen module exposes an explicit settings object (ShiftPlotSettings, covered bySSP-CFG-004/005/006) rather than accepting Webcharts configuration objects. - SSP-DATA-004 is a CAT/viz-library "customized chart with queries" example page; the nextgen demo uses the standalone real-data page instead. - SSP-REG-020's CAT download/edit/re-upload workflow is descoped; the underlying behavior it verifies (invalid results removed row-by-row, with a reported count in a console warning and a visible note) is covered. - Descoped — secondary decoration (1 row): - SSP-REG-007 (marginal box-and-whisker markers with N / percentiles / mean / SD tooltips) is a secondary axis decoration from the original Webcharts renderer; the core shift comparison (scatter, identity line, and the per-point tooltip of
SSP-REG-006) is fully implemented. A follow-up can add marginal box plots if a study needs them. - Adapted — layout (1 row): - SSP-REG-017 ("the listings appear to the right of the chart") is superseded by the shared renderer shell (#17), which standardizes the listing below the chart across every renderer (matching the histogram). Controls-left / chart-above-listing (
SSP-REG-016,SSP-REG-018) hold and are enforced bytests/e2e/site.spec.js. SSP-REG-015 ("fits on one page") — flagged vague in the AI review — is addressed by the fixed 460px chart area and the responsive shell rather than a pixel assertion.
Reproducing this report
The evidence set is regenerated from a full test run and committed with the code it qualifies; CI fails when they drift. To verify or rebuild it:
npm ci
npm run evidence:check # compare a fresh run against the committed evidence
npm run evidence # regenerate docs/evidence/shift-plot/evidence.jsonScreenshot baselines are canonical to the Linux CI runner; the repository's Update evidence baselines workflow is the authoritative way to refresh them. See CONTRIBUTING.md for the traceability convention.