Safety Delta-Delta: test evidence
Requirement-traced qualification evidence for the safety.viz delta-delta module.
Requirement matrix ↗ — the reviewed source specification these tests trace to.
- Scope
- 30 coverage rows44 distinct requirement IDs
- Tests executed
- 129 automated checks24 browser · 105 unit
- Result
- pass all passing6 evidence screenshots
- Generated
- 2026-07-12 03:34 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 #29178424785
Scope & approach
Traceability for the delta-delta module (a Chart.js reimplementation of RhoInc/safety-delta-delta, matching behavior), built under #25 per the convention in CONTRIBUTING.md. Requirement IDs come from the reviewed 48-row matrix at safety.agent docs/requirements/safety-delta-delta.md, whose Evidence Type column routes rows (unit → Vitest, browser → Playwright). The renderer flattens long-format results (one row per measurement at a visit) to one point per participant: change in measure X (comparison-visit mean − baseline-visit mean) against change in measure Y.
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/delta-delta.spec.js)
16 requirement rows · 16 tests
| Requirement | Source matrix rows | Issue | Tests & evidence |
|---|---|---|---|
| SDD-FUNC-001/SDD-FUNC-002/SDD-FUNC-003 | SDD-FUNC-001, SDD-FUNC-002, SDD-FUNC-003 | #25 |
|
| SDD-FUNC-002/SDD-REG-003 | SDD-FUNC-002, SDD-REG-003 | #25 |
|
| SDD-FUNC-004 | SDD-FUNC-004 | #25 |
|
| SDD-REG-008 | SDD-REG-008 | #25 |
|
| SDD-REG-001 | SDD-REG-001 | #25 |
|
| SDD-REG-002 | SDD-REG-002 | #25 |
|
| SDD-REG-006/SDD-REG-005 | SDD-REG-005, SDD-REG-006 | #25 |
|
| SDD-FUNC-005 | SDD-FUNC-005 | #25 |
|
| SDD-FUNC-006/SDD-REG-011/016/018/019/020/024 | SDD-FUNC-006, SDD-REG-011, SDD-REG-016, SDD-REG-018, SDD-REG-019, SDD-REG-020, SDD-REG-024 | #25 |
|
| SDD-REG-021/022/025 | SDD-REG-021, SDD-REG-022, SDD-REG-025 | #25 |
|
| SDD-REG-012/SDD-REG-013 | SDD-REG-012, SDD-REG-013 | #25 |
|
| SDD-REG-014 | SDD-REG-014 | #25 |
|
| SDD-REG-026 | SDD-REG-026 | #25 |
|
| SDD-REG-007 | SDD-REG-007 | #25 |
|
| SDD-REG-010 | SDD-REG-010 | #25 |
|
| SDD-API-001 (module scheme) | — (see legacy-API note) | #25 |
|
Unit evidence (Vitest — tests/unit/delta-delta/)
14 requirement rows · 30 tests
| Requirement | Source matrix rows | Issue | Tests & evidence |
|---|---|---|---|
| SDD-CFG-004..008 | SDD-CFG-004, SDD-CFG-005, SDD-CFG-006, SDD-CFG-007, SDD-CFG-008 | #25 |
|
| SDD-CFG-009..013 | SDD-CFG-009, SDD-CFG-010, SDD-CFG-011, SDD-CFG-012, SDD-CFG-013 | #25 |
|
| SDD-CFG-014/SDD-CFG-015 | SDD-CFG-014, SDD-CFG-015 | #25 |
|
| SDD-REG-003 (delta math) | SDD-REG-003 | #25 |
|
| SDD-FUNC-001/SDD-REG-004 (average) | SDD-FUNC-001, SDD-REG-004 | #25 |
|
| SDD-REG-008 (removal) | SDD-REG-008 | #25 |
|
| SDD-REG-019/022/023/025 | SDD-REG-019, SDD-REG-022, SDD-REG-023, SDD-REG-025 | #25 |
|
| SDD-REG-006 (filters) | SDD-REG-006 | #25 |
|
| SDD-REG-021/022 (format/color) | SDD-REG-021, SDD-REG-022 | #25 |
|
| SDD-REG-015 (axis padding) | SDD-REG-015 | #25 |
|
| SDD-REG-026 (regression) | SDD-REG-026 | #25 |
|
| SDD-FUNC-004 (count text) | SDD-FUNC-004 | #25 |
|
| SDD-REG-012 (selection) | SDD-REG-012 | #25 |
|
| SDD-DATA-001/SDD-REG-010 (guard) | SDD-DATA-001, SDD-REG-010 | #25 |
|
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.

SDD FUNC 001 control panel 
SDD FUNC 002 baseline scatter 
SDD FUNC 006 measure table 
SDD REG 008 invalid data note 
SDD REG 012 point selected 
SDD REG 026 regression line
Source-matrix routing status (48 rows)
- Fully evidenced (44 rows): SDD-FUNC-001..006, SDD-REG-001..008, SDD-REG-010..014, SDD-REG-016..026, SDD-DATA-001, SDD-CFG-004..015. Each maps to a browser and/or unit test above. SDD-REG-017 (details metadata above the table) is evidenced by the participant-detail header, which renders every configured
detailscolumn. - Partial / addressed by implementation (2 rows): - SDD-REG-009 — the initial X/Y measure is honored (
measure_x/measure_y, verified via the default-selection browser test andconfigure), but the row's "with units attached" clause is descoped: the original renderer labels measures by their baremeasure_colvalue, so unit-suffixed measure labels are intentionally not reproduced. - SDD-REG-015 ("points are not cut off on the edge of the chart") — the delta domain includes 0 and pads beyond the data extent (deltaDomain, unit tested) and the chart adds layout padding, so edge points render inside the frame. No pixel-level assertion is made; this is a visual acceptance item. - Descoped — legacy Webcharts API/config (2 rows): SDD-CFG-001 and SDD-CFG-002 describe configuring the chart as a Webcharts
chartobject withwebchartsSettings.js. Per the cross-renderer legacy-API decision (design #2), the nextgen module does not preserve the Webcharts configuration surface; it ships flatDEFAULT_SETTINGS(documented in the API reference) instead.
Legacy-API note: source-matrix SDD-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 histogram's proven lifecycle API instead — deltaDelta(element, settings) returning an instance with init/setData/setSettings/render/resize/destroy — evidenced as SDD-API-001 in the module scheme above.
Removed/merged upstream (AI review): SDD-CFG-003, SDD-CFG-016, SDD-API-002, SDD-REQ-001, and SDD-REQ-002 were dropped in the safety.agent matrix review as introductory/aggregate text or navigation artifacts, and are not counted in the 48 rows.
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/delta-delta/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.