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
205 automated checks31 browser ยท 174 unit
Result
pass all passing9 evidence screenshots
Generated
2026-08-15 09:05 UTC
Environment
linux 6.17.0-1022-azure ยท node v22.23.2 ยท 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 column shows the reviewed requirement text and its ID, the source-matrix rows link back to the 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/005

AET-FUNC-002 This drop-down menu is used to filter serious events in the data set. The default is set to include all events, but can be manipulated to include events that are only marked as serious or events that are only marked as non-serious. An open-ended black circle marks serious events so they can be viewed in the timeline at a glance.

AET-FUNC-003 This drop-down menu displays a listing of the adverse event severity levels in the data set. The default is to display all severity levels. The current severity levels captured are mild, moderate, and severe, which are color coded and displayed in a legend above the timeline.

AET-FUNC-004 This drop-down menu displays a list of all of the subject identifiers included in the data set. Each participant is assigned a unique identifier that is associated with their adverse event data. Filtering to view a particular subject ID will only show data for that subject. The default for this filter is set to show data for all subjects.

AET-FUNC-005 The chart can be configured to have any number of data filters. Each specified filter has a drop-down menu that is used to filter the visit data that is displayed in the chart.

AET-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-007

AET-FUNC-007 Displayed in the top right corner of the page, this statement provides the total number of participants in the data set in integers as well as the percentage of participants shown to one decimal place. In the default view, all participant data is included in the chart, or 100%, unless the project team requests otherwise. When filters are used, the data shown in the histogram is manipulated and the number of participant records shown at the top of the page may increase or decrease, depending on the variable selected.

AET-REG-002 Confirm that selecting a filter changes the ratio and percentage of affected participants

AET-REG-013 Confirm that the population annotation (n of N participants...) is italicized.

AET-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 AE Timelines are initialized using JSON data files that match the format created by d3.csv(). The chart requires a data set with one record per adverse event with placeholder rows added for participants who didn't experience any adverse events over the course of the study. The chart uses column names from the AdAM data standard by default, but can be customized to work with any column names as long as the data structure is as expected.

AET-DATA-001#26
  • pass AET-DATA-001: blank-term and non-integer-start-day records are removed with visible counts (#26)
AET-REG-001

AET-REG-001 Confirm that selecting a filter manipulates the visible events

AET-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-006

AET-FUNC-006 This drop-down menu can sort the subject IDs included in the timeline data set. This option can sort the data by the participants with the earliest occurring adverse event(s) or the participants that appear first alphabetically in descending order. This option defaults to the earliest occurring events and their related participants.

AET-REG-003 Confirm that sorting subject IDs changes the order of the results as expected

AET-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-008

AET-FUNC-008 By moving a mouse cursor over a bar in the chart, users can display metadata for some variables. Hovering the cursor over a particular bar will display the reported term of an event, the day the event started, and the day the event stopped. More information about the event can be accessed by clicking on the Subject ID.

AET-REG-004 Confirm that hovering over event lines shows adverse event information (reported term, start day, stop day) for a participant

AET-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/006

AET-REG-005 Confirm that the date of an adverse event doesn't end in a circle

AET-REG-006 Confirm that a serious AE is notated by a different mark than a normal AE

AET-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-009

AET-FUNC-009 Clicking on the Subject ID seen to the left of the bar will load a more detailed view. This view displays the raw data for a participant's adverse events. This view shows the sequence number for the event, the day the event started, the day the event stopped, the reported term, the event's severity/intensity, and if the event is classified as serious or not.

AET-REG-008 Confirm that clicking on a participant ID takes the user to the detail view

AET-API-003 The custom participantsSelected event is dispatched to the overall chart wrapper (chart.wrap) whenever the details for a given participant are viewed (or cleared) by clicking on the y-axis labels in the chart. The event has a custom data property holding an array with the selected ID when a new participant is selected (["123-456-7"]) or an empty array when participant details are cleared.

AET-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-010

AET-FUNC-010 The Back button is only visible if users have clicked on the detailed view for a given participant. Clicking on this button returns users to the default AE Timelines view.

AET-REG-012 Confirm that clicking the Back button takes the user to the timelines chart screen

AET-API-003 The custom participantsSelected event is dispatched to the overall chart wrapper (chart.wrap) whenever the details for a given participant are viewed (or cleared) by clicking on the y-axis labels in the chart. The event has a custom data property holding an array with the selected ID when a new participant is selected (["123-456-7"]) or an empty array when participant details are cleared.

AET-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/011

AET-REG-009 Confirm that Search works to filter the data displayed in the listing

AET-REG-010 Confirm that Sort works in the listing by clicking on column headers

AET-REG-011 Confirm that you can export the displayed data to a csv via via the Export: CSV button

AET-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)

AET-API-001 a factory to create a custom Webcharts chart object

โ€” (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 AE Timelines are initialized using JSON data files that match the format created by d3.csv(). The chart requires a data set with one record per adverse event with placeholder rows added for participants who didn't experience any adverse events over the course of the study. The chart uses column names from the AdAM data standard by default, but can be customized to work with any column names as long as the data structure is as expected.

AET-DATA-004 No customization is needed to initialize a chart when the data object contains all default variables above. Just pass an empty object ({}) for settings and initialize the chart like so: aeTimelines('body', {}).init(data).

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 an object that defines the event color stratification variable, its label, its levels, and their corresponding colors

AET-CFG-006 color stratification variable name, usually set to event severity

AET-CFG-007 an object that defines what events to highlight and how to highlight them

AET-CFG-008 value of highlight.value_col that identifies events to highlight

AET-CFG-009 detail of highlighted event variable name

AET-CFG-010 an object of attributes that define highlighted marks

AET-CFG-011 an array of filter variables and associated metadata

AET-CFG-012 an array of detail listing variables and associated metadata

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 This drop-down menu is used to filter serious events in the data set. The default is set to include all events, but can be manipulated to include events that are only marked as serious or events that are only marked as non-serious. An open-ended black circle marks serious events so they can be viewed in the timeline at a glance.

AET-FUNC-003 This drop-down menu displays a listing of the adverse event severity levels in the data set. The default is to display all severity levels. The current severity levels captured are mild, moderate, and severe, which are color coded and displayed in a legend above the timeline.

AET-FUNC-004 This drop-down menu displays a list of all of the subject identifiers included in the data set. Each participant is assigned a unique identifier that is associated with their adverse event data. Filtering to view a particular subject ID will only show data for that subject. The default for this filter is set to show data for all subjects.

AET-FUNC-005 The chart can be configured to have any number of data filters. Each specified filter has a drop-down menu that is used to filter the visit data that is displayed in the chart.

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 verbatim adverse event text variable name

AET-DATA-003 **_*_** a coloring variable of some sort is required but it does not have to be AESEV

AET-DATA-006 **_*_** a coloring variable of some sort is required but it does not have to be AESEV

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 AE Timelines are initialized using JSON data files that match the format created by d3.csv(). The chart requires a data set with one record per adverse event with placeholder rows added for participants who didn't experience any adverse events over the course of the study. The chart uses column names from the AdAM data standard by default, but can be customized to work with any column names as long as the data structure is as expected.

AET-FUNC-007 Displayed in the top right corner of the page, this statement provides the total number of participants in the data set in integers as well as the percentage of participants shown to one decimal place. In the default view, all participant data is included in the chart, or 100%, unless the project team requests otherwise. When filters are used, the data shown in the histogram is manipulated and the number of participant records shown at the top of the page may increase or decrease, depending on the variable selected.

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 This drop-down menu displays a listing of the adverse event severity levels in the data set. The default is to display all severity levels. The current severity levels captured are mild, moderate, and severe, which are color coded and displayed in a legend above the timeline.

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 This drop-down menu can sort the subject IDs included in the timeline data set. This option can sort the data by the participants with the earliest occurring adverse event(s) or the participants that appear first alphabetically in descending order. This option defaults to the earliest occurring events and their related participants.

AET-REG-003 Confirm that sorting subject IDs changes the order of the results as expected

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 This drop-down menu is used to filter serious events in the data set. The default is set to include all events, but can be manipulated to include events that are only marked as serious or events that are only marked as non-serious. An open-ended black circle marks serious events so they can be viewed in the timeline at a glance.

AET-CFG-008 value of highlight.value_col that identifies events to highlight

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 By moving a mouse cursor over a bar in the chart, users can display metadata for some variables. Hovering the cursor over a particular bar will display the reported term of an event, the day the event started, and the day the event stopped. More information about the event can be accessed by clicking on the Subject ID.

AET-REG-001 Confirm that selecting a filter manipulates the visible events

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 By moving a mouse cursor over a bar in the chart, users can display metadata for some variables. Hovering the cursor over a particular bar will display the reported term of an event, the day the event started, and the day the event stopped. More information about the event can be accessed by clicking on the Subject ID.

AET-REG-004 Confirm that hovering over event lines shows adverse event information (reported term, start day, stop day) for a participant

AET-CFG-009 detail of highlighted event variable name

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.

View-selector rollout (VIEW-3, #76)

One primary display โ€” the participant timeline chart. Controls are Filters and a participant-ID sort order; the participant detail is a y-axis-click drill-down listing, not a view switch. Ruled single-view in the shared view-selector rollout (#76) โ€” no view control is added; see view-selector-inventory.md.

Participant-profile rail (obot.roadmap#75 D9, PPRF-AE-005)

ae-timelines now mounts the railed participant profile. The deferral recorded here under PPRF-COV-001 โ€” that ae-timelines ingests adverse-event records rather than the measure-per-visit long-lab contract the profile consumed โ€” ended when v2 gave the profile an adverse-event domain of its own (obot.roadmap#75 decision D9).

There are no laboratory records here, so the profile renders as the AE story alone: header, summary block and timeline, with no spaghetti card and no measure table. Adoption rows are PPRF-AE-005 in the participant-profile matrix; unit evidence lives in tests/unit/participant-profile/ae-adoption.test.js.

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.