Adverse Event Timelines: test evidence

Requirement-traced qualification evidence for the safety.viz ae-timelines module.

Scope
21 coverage rows36 distinct requirement IDs
Tests executed
120 automated checks19 browser · 101 unit
Result
pass all passing9 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

Scope & approach

Traceability for the ae-timelines module (a Chart.js reimplementation of RhoInc/ae-timelines matching the original renderer's behavior, under #26), per the convention in CONTRIBUTING.md. Requirement IDs are the AET-* rows of the reviewed 43-row matrix at safety.agent docs/requirements/ae-timelines.md; rows are routed to Vitest (transforms) or Playwright (interaction/visual behavior) by judgment, since every source row is still typed planned.

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/ae-timelines.spec.js)

11 requirement rows · 11 tests

RequirementSource matrix rowsIssueTests & evidence
AET-FUNC-002/003/004/005AET-FUNC-002, AET-FUNC-003, AET-FUNC-004, AET-FUNC-005#26
  • pass AET-FUNC-002/AET-FUNC-003/AET-FUNC-004/AET-FUNC-005: renders the timeline with filter and sort controls and a severity legend (#26)
Evidence screenshot AET-FUNC-002-baseline-timelines.png
AET-FUNC-007AET-FUNC-007, AET-REG-002, AET-REG-013#26
  • pass AET-FUNC-007/AET-REG-002/AET-REG-013: the italicized participant annotation reports shown of total and updates on filter (#26)
Evidence screenshot AET-FUNC-007-participant-annotation.png
AET-DATA-001 (cleaning note)AET-DATA-001#26
  • pass AET-DATA-001: blank-term and non-integer-start-day records are removed with visible counts (#26)
AET-REG-001AET-REG-001#26
  • pass AET-REG-001: filtering by severity changes the visible events and participants (#26)
Evidence screenshot AET-REG-001-severity-filter.png
AET-FUNC-006AET-FUNC-006, AET-REG-003#26
  • pass AET-FUNC-006/AET-REG-003: the sort control switches between earliest and alphabetical participant order (#26)
Evidence screenshot AET-FUNC-006-alphabetical-sort.png
AET-FUNC-008AET-FUNC-008, AET-REG-004#26
  • pass AET-FUNC-008/AET-REG-004: hovering an event shows the reported term, start day, and stop day (#26)
Evidence screenshot AET-FUNC-008-hover-tooltip.png
AET-REG-005/006AET-REG-005, AET-REG-006#26
  • pass AET-REG-005/AET-REG-006: serious events carry a distinct mark and dots sit at start days only (#26)
Evidence screenshot AET-REG-006-serious-markers.png
AET-FUNC-009AET-FUNC-009, AET-REG-008, AET-API-003#26
  • pass AET-FUNC-009/AET-REG-008/AET-API-003: clicking a participant ID opens the detail view and fires participantsSelected (#26)
Evidence screenshot AET-FUNC-009-participant-detail.png
AET-FUNC-010AET-FUNC-010, AET-REG-012, AET-API-003#26
  • pass AET-FUNC-010/AET-REG-012/AET-API-003: the Back button returns to the timelines and clears the selection (#26)
Evidence screenshot AET-FUNC-010-back-to-timelines.png
AET-REG-009/010/011AET-REG-009, AET-REG-010, AET-REG-011#26
  • pass AET-REG-009/AET-REG-010/AET-REG-011: the detail listing supports search, header sorting, and CSV export (#26)
Evidence screenshot AET-REG-009-detail-listing.png
AET-API-001 (module scheme)— (see legacy-API note)#26
  • pass AET-API-001: lifecycle API supports init, setData, setSettings, render, resize, and destroy (#26)

Unit evidence (Vitest — tests/unit/ae-timelines/)

10 requirement rows · 27 tests

RequirementSource matrix rowsIssueTests & evidence
AET-DATA-001/004 (ADaM defaults)AET-DATA-001, AET-DATA-004#26

configure.test.js

  • pass ae-timelines checkInputs AET-DATA-001: custom column mappings validate against the renamed columns (#26)
  • pass ae-timelines checkInputs AET-DATA-001: missing required columns throw with every missing column named (#26)
  • pass ae-timelines checkInputs AET-DATA-001: the schema names the data and settings contract for the ADAE shape (#26)
  • pass ae-timelines checkInputs AET-DATA-001/AET-DATA-004: ADaM-named data passes validation with default settings (#26)
  • pass ae-timelines configure AET-DATA-001/AET-DATA-004: default settings map the standard ADaM adverse-event columns (#26)
  • pass ae-timelines structureData AET-DATA-001: cleaning coerces study days and falls back to the start day for unusable stop days (#26)
  • pass ae-timelines structureData AET-DATA-001: cleaning removes blank-term and non-integer-start-day records with reported counts (#26)
AET-CFG-005..012 (settings sync)AET-CFG-005..012#26

configure.test.js

  • pass ae-timelines configure AET-CFG-005/AET-CFG-006/AET-DATA-003: the color object defaults to severity levels and merges overrides (#26)
  • pass ae-timelines configure AET-CFG-007/AET-CFG-008/AET-CFG-009/AET-CFG-010: the highlight object defaults to serious events and merges overrides (#26)
  • pass ae-timelines configure AET-CFG-012/AET-FUNC-009: details default to sequence, days, term, severity, and seriousness without duplicates (#26)
  • pass ae-timelines configure AET-FUNC-005/AET-CFG-011: custom filters replace the defaults and normalize strings to specs (#26)
  • pass ae-timelines getPlugins AET-FUNC-002/AET-CFG-009: serious events append the highlight label and detail to the tooltip (#26)
  • pass ae-timelines structureData AET-FUNC-002/AET-CFG-008: timeline rows carry duration, color value, and the serious flag (#26)
  • pass ae-timelines structureData AET-FUNC-003/AET-CFG-005: the color domain keeps the configured order, then extras, with N/A last (#26)
Evidence screenshot AET-FUNC-009-participant-detail.pngEvidence screenshot AET-FUNC-002-baseline-timelines.png
AET-FUNC-002/003/004/005 (default filters)AET-FUNC-002..005#26

configure.test.js

  • pass ae-timelines configure AET-FUNC-002/AET-FUNC-003/AET-FUNC-004: default filters are serious event, severity, and participant ID (#26)
  • pass ae-timelines configure AET-FUNC-005/AET-CFG-011: custom filters replace the defaults and normalize strings to specs (#26)
  • pass ae-timelines getPlugins AET-FUNC-002/AET-CFG-009: serious events append the highlight label and detail to the tooltip (#26)
  • pass ae-timelines getPlugins AET-FUNC-002/AET-REG-006: the serious-event legend dataset draws nothing but carries the highlight style (#26)
  • pass ae-timelines getPlugins AET-FUNC-003: one dataset per color-domain level, colored in the configured order (#26)
  • pass ae-timelines getPlugins AET-FUNC-003: withAlpha converts hex colors to rgba fills (#26)
  • pass ae-timelines structureData AET-FUNC-002/AET-CFG-008: timeline rows carry duration, color value, and the serious flag (#26)
  • pass ae-timelines structureData AET-FUNC-003: colors map by domain position with N/A rendered gray (#26)
  • pass ae-timelines structureData AET-FUNC-003: missing severity values are normalized to N/A (#26)
  • pass ae-timelines structureData AET-FUNC-003/AET-CFG-005: the color domain keeps the configured order, then extras, with N/A last (#26)
Evidence screenshot AET-FUNC-002-baseline-timelines.pngEvidence screenshot AET-REG-006-serious-markers.png
AET-CFG-004, AET-DATA-003/006 (validation)AET-CFG-004, AET-DATA-003, AET-DATA-006#26

checkInputs.test.js

  • pass ae-timelines checkInputs AET-DATA-003/AET-DATA-006: the coloring variable is required but remappable (#26)
  • pass ae-timelines configure AET-CFG-005/AET-CFG-006/AET-DATA-003: the color object defaults to severity levels and merges overrides (#26)
AET-DATA-001, AET-FUNC-007 (cleaning + population)AET-DATA-001, AET-FUNC-007#26

structureData.test.js

  • pass ae-timelines checkInputs AET-DATA-001: custom column mappings validate against the renamed columns (#26)
  • pass ae-timelines checkInputs AET-DATA-001: missing required columns throw with every missing column named (#26)
  • pass ae-timelines checkInputs AET-DATA-001: the schema names the data and settings contract for the ADAE shape (#26)
  • pass ae-timelines checkInputs AET-DATA-001/AET-DATA-004: ADaM-named data passes validation with default settings (#26)
  • pass ae-timelines configure AET-DATA-001/AET-DATA-004: default settings map the standard ADaM adverse-event columns (#26)
  • pass ae-timelines structureData AET-DATA-001: cleaning coerces study days and falls back to the start day for unusable stop days (#26)
  • pass ae-timelines structureData AET-DATA-001: cleaning removes blank-term and non-integer-start-day records with reported counts (#26)
  • pass ae-timelines structureData AET-FUNC-007: the population counts every participant in the raw data, including AE-free placeholders (#26)
Evidence screenshot AET-FUNC-007-participant-annotation.png
AET-FUNC-003 (color domain + N/A)AET-FUNC-003#26

structureData.test.js

  • pass ae-timelines configure AET-FUNC-002/AET-FUNC-003/AET-FUNC-004: default filters are serious event, severity, and participant ID (#26)
  • pass ae-timelines getPlugins AET-FUNC-003: one dataset per color-domain level, colored in the configured order (#26)
  • pass ae-timelines getPlugins AET-FUNC-003: withAlpha converts hex colors to rgba fills (#26)
  • pass ae-timelines structureData AET-FUNC-003: colors map by domain position with N/A rendered gray (#26)
  • pass ae-timelines structureData AET-FUNC-003: missing severity values are normalized to N/A (#26)
  • pass ae-timelines structureData AET-FUNC-003/AET-CFG-005: the color domain keeps the configured order, then extras, with N/A last (#26)
Evidence screenshot AET-FUNC-002-baseline-timelines.png
AET-FUNC-006 (sort orders)AET-FUNC-006, AET-REG-003#26

structureData.test.js

  • pass ae-timelines configure AET-FUNC-006: the participant sort defaults to earliest and rejects unknown orders (#26)
  • pass ae-timelines structureData AET-FUNC-006/AET-REG-003: alphabetical-descending sort matches the original top-to-bottom order (#26)
  • pass ae-timelines structureData AET-FUNC-006/AET-REG-003: earliest sort orders participants by first AE start day, ties by ID (#26)
Evidence screenshot AET-FUNC-006-alphabetical-sort.png
AET-FUNC-002, AET-CFG-008 (serious flag)AET-FUNC-002, AET-CFG-008#26

structureData.test.js

  • pass ae-timelines configure AET-CFG-007/AET-CFG-008/AET-CFG-009/AET-CFG-010: the highlight object defaults to serious events and merges overrides (#26)
  • pass ae-timelines configure AET-FUNC-002/AET-FUNC-003/AET-FUNC-004: default filters are serious event, severity, and participant ID (#26)
  • pass ae-timelines getPlugins AET-FUNC-002/AET-CFG-009: serious events append the highlight label and detail to the tooltip (#26)
  • pass ae-timelines getPlugins AET-FUNC-002/AET-REG-006: the serious-event legend dataset draws nothing but carries the highlight style (#26)
  • pass ae-timelines structureData AET-FUNC-002/AET-CFG-008: timeline rows carry duration, color value, and the serious flag (#26)
Evidence screenshot AET-FUNC-002-baseline-timelines.pngEvidence screenshot AET-REG-006-serious-markers.png
AET-FUNC-008 (study-day domain + axes)AET-FUNC-008, AET-REG-001#26

getScales.test.js

  • pass ae-timelines getPlugins AET-FUNC-008/AET-REG-004: tooltips report the term, start day, and stop day (#26)
  • pass ae-timelines getScales AET-FUNC-008: the study-day domain spans the earliest start to the latest stop day (#26)
Evidence screenshot AET-FUNC-008-hover-tooltip.png
AET-FUNC-008, AET-CFG-009 (tooltips + datasets)AET-FUNC-008, AET-REG-004, AET-CFG-009#26

getPlugins.test.js

  • pass ae-timelines configure AET-CFG-007/AET-CFG-008/AET-CFG-009/AET-CFG-010: the highlight object defaults to serious events and merges overrides (#26)
  • pass ae-timelines getPlugins AET-FUNC-002/AET-CFG-009: serious events append the highlight label and detail to the tooltip (#26)
  • pass ae-timelines getPlugins AET-FUNC-008/AET-REG-004: tooltips report the term, start day, and stop day (#26)
  • pass ae-timelines getScales AET-FUNC-008: the study-day domain spans the earliest start to the latest stop day (#26)
Evidence screenshot AET-FUNC-002-baseline-timelines.pngEvidence screenshot AET-FUNC-008-hover-tooltip.png

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.

Source-matrix routing status (43 rows)

Legacy-API note: source-matrix AET-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-proven lifecycle API instead — AET-API-001 in the module scheme — and the original's participantsSelected wrapper event becomes a DOM CustomEvent on the container element with the same data payload (AET-API-003).

Sort-direction note: AET-FUNC-006's wording is ambiguous (flagged in the matrix AI review). The original builds its y domain bottom-to-top, so its earliest and alphabetical-descending comparators read top-to-bottom as earliest-onset-first and alphabetically ascending; the reimplementation asserts those top-to-bottom orders directly.

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/ae-timelines/evidence.json

Screenshot 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.