Safety Histogram: test evidence

Requirement-traced qualification evidence for the safety.viz histogram module.

Scope
41 coverage rows62 distinct requirement IDs
Tests executed
254 automated checks48 browser ยท 206 unit
Result
pass all passing19 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 histogram module (extracted from the safety-histogram pilot, dev @ a3ff9f7, under #2), per the convention in CONTRIBUTING.md. Two requirement-ID schemes appear:

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

28 requirement rows ยท 28 tests

RequirementSource matrix rowsIssueTests & evidence
SH-CTRL-001/SH-CTRL-002/SH-CTRL-006

SH-FUNC-001 This drop-down menu is used to filter the lab variable that is displayed in the chart. The default measure is set to the first variable in the data set, but the default value can be adjusted to any measure upon the project team's request. Users can select any pre-defined measure in this filter. Selecting a measure will display the range of the measure and the number of observations collected for this variable.

SH-FUNC-002 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.

SH-FUNC-001, SH-FUNC-002#2
  • pass SH-CTRL-001/SH-CTRL-002/SH-CTRL-006: renders measure, filter, axis, bin, and group controls (#2)
Evidence screenshot SH-CTRL-001-control-panel.pngEvidence screenshot SH-CTRL-006-shared-bin-multiples.png
SH-CTRL-003

SH-FUNC-003 Displayed under the header, 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.

SH-FUNC-003#2
  • pass SH-CTRL-003: participant note updates when a filter is applied (#2)
SH-DATA-002

SH-CFG-005 a variable that contains the results for each medical sign; non-numeric results are removed with a notification thrown to the log

SH-DATA-002 The following data specs and chart settings can be used to create a chart with several custom filters, including Sex, Race and Query Status. A sample chart using this configuration is found here.

SH-CFG-005#2
  • pass SH-DATA-002: missing and non-numeric results are dropped with a reported count and visible note (#2)
Evidence screenshot SH-DATA-002-invalid-data-note.png
SH-CHART-003

SH-FUNC-008 Clicking on a bar in the chart will open a table below the chart that contains a detailed listing of participant records. This linked table contains a standard set of default columns that appear consistently across all filters. When a bar is clicked the other available bars lighten, the table header defines the data included in the table, and the records appear in a table below the chart. When a user clicks outside of a bar, the detailed table disappears and the table header will prompt the user to "Click a bar for details."

SH-FUNC-010 When a histogram bar is clicked, display the raw data records represented by that bar in the linked detail table, including subject identifier, result, lower limit of normal, and upper limit of normal.

SH-FUNC-012 When a histogram bar is selected, display the number of records represented by that bar underneath the chart.

SH-FUNC-008, SH-FUNC-010, SH-FUNC-012#2
  • pass SH-CHART-003/SH-FUNC-010/SH-FUNC-012: selecting a canvas bar opens a linked listing with record details and count (#2)
Evidence screenshot SH-FUNC-010-linked-listing.png
โ€”

SH-FUNC-011 When a histogram bar is selected, visually de-emphasize/lighten all bars not represented in the linked detail table.

SH-FUNC-011#2
  • pass SH-FUNC-011: selecting a bar de-emphasizes the bars outside the linked listing (#2)
Evidence screenshot SH-FUNC-011-bar-de-emphasis.png
SH-LIST-001/002/003/004

SH-FUNC-008 Clicking on a bar in the chart will open a table below the chart that contains a detailed listing of participant records. This linked table contains a standard set of default columns that appear consistently across all filters. When a bar is clicked the other available bars lighten, the table header defines the data included in the table, and the records appear in a table below the chart. When a user clicks outside of a bar, the detailed table disappears and the table header will prompt the user to "Click a bar for details."

SH-FUNC-008#2
  • pass SH-LIST-001/SH-LIST-002/SH-LIST-003/SH-LIST-004: listing supports pagination, search, sorting, and CSV export (#2)
Evidence screenshot SH-LIST-004-search-sort-paginate.png
SH-CTRL-004

SH-FUNC-004A When normal ranges are enabled for the selected measure, render a gray normal-range band/rectangle behind histogram data using the measure lower and upper normal limits.

SH-FUNC-004B Normal ranges are hidden by default and can be shown by activating the Normal Range checkbox/control above the chart.

SH-FUNC-004A, SH-FUNC-004B#2
  • pass SH-CTRL-004/SH-FUNC-004A/SH-FUNC-004B: normal range checkbox toggles a stable overlay region (#2)
Evidence screenshot SH-CTRL-004-normal-range-overlay.png
โ€”

SH-FUNC-004C If the selected measure does not include lower/upper normal range data, the Normal Range control is unavailable/hidden.

SH-FUNC-004C#2
  • pass SH-FUNC-004C: normal range control is hidden when the measure has no normal range data (#2)
Evidence screenshot SH-FUNC-004C-control-hidden-for-pulse.png
SH-CTRL-005

SH-FUNC-005A The Lower Limit input updates the histogram x-axis minimum for the selected measure.

SH-FUNC-005B The Upper Limit input updates the histogram x-axis maximum for the selected measure.

SH-FUNC-005D Typed x-axis limit changes apply when the input loses focus, and the histogram redraws to reflect valid updated limits.

SH-FUNC-005A, SH-FUNC-005B, SH-FUNC-005D#2
  • pass SH-CTRL-005/SH-FUNC-005A/SH-FUNC-005B/SH-FUNC-005D: x-axis limit inputs redraw and normalize invalid ranges (#2)
Evidence screenshot SH-CTRL-005-axis-limits.png
โ€”

SH-FUNC-005C X-axis limit inputs support increment/decrement stepper behavior by 1 where the browser/control supports steppers.

SH-FUNC-005C#2
  • pass SH-FUNC-005C: x-axis limit inputs support stepper increments of 1 (#2)
SH-CTRL-007
โ€”#2
  • pass SH-CTRL-007: x-axis tick mode switches labels between centers and bin boundaries (#2)
Evidence screenshot SH-CTRL-007-boundary-ticks.png
SH-CHART-005

SH-REG-078 The legacy p-value tooltip disclaimer text Caution: This graphic has been thoroughly tested, but is not validated. is intentionally removed from the nextgen safety-histogram UI.

โ€” (see SH-REG-078 note)#2
  • pass SH-CHART-005: p-value annotations display the approximation and validation disclaimer (#2)
Evidence screenshot SH-CHART-005-pvalue-disclaimer.png
SH-CHART-004
โ€”#2
  • pass SH-CHART-004: group-by renders grouped histograms (#2)
Evidence screenshot SH-CHART-004-grouped-multiples.png
SH-CHART-004/SH-CTRL-006
โ€”#19
  • pass SH-CHART-004/SH-CTRL-006: grouped small multiples share the main chart's bin boundaries (#19)
Evidence screenshot SH-CHART-004-grouped-multiples.pngEvidence screenshot SH-CTRL-006-shared-bin-multiples.png
SH-CTRL-006
โ€”#19
  • pass SH-CTRL-006: bin boundaries anchor to the measure results, not the filtered subset (#19)
Evidence screenshot SH-CTRL-006-shared-bin-multiples.png
SH-CTRL-008

SH-REG-024 Confirm that if you select an algorithm other than "Custom", the following occurs: The algorithm returns the number of bins and the width of each bin, the Quantity and Width inputs update accordingly, the info icon updates with a link to an description of the algorithm

SH-REG-025 Confirm the number of bins in the Quantity input matches the number of bars in the chart

SH-REG-026 Confirm the width of each bin in the Width input matches the width of the bars in the chart

SH-REG-024, SH-REG-025, SH-REG-026#19
  • pass SH-CTRL-008/SH-REG-024/SH-REG-025/SH-REG-026: bin quantity and width inputs reflect the resolved binning (#19)
Evidence screenshot SH-CTRL-008-bins-inputs-populated.png
SH-CTRL-008

SH-REG-020 Confirm changing the Quantity sets the Algorithm control to Custom and sets the Width input to the range of the data divided by the number of bins

SH-REG-020#19
  • pass SH-CTRL-008/SH-REG-020: editing Quantity switches the algorithm to Custom and recomputes the width (#19)
Evidence screenshot SH-CTRL-008-bins-inputs-populated.png
SH-API-001 (module scheme)

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

โ€” (see legacy-API note)#2
  • pass SH-API-001: lifecycle API supports init, setData, setSettings, render, resize, and destroy (#2)
โ€”

SH-OVW-001 The Measure control offers an "All Measures" option, selected by default when start_value is not set: the chart opens on an all-measures overview. An explicit start_value opens on that measure; an unknown start_value warns and falls back to the overview.

SH-OVW-001#39
  • pass SH-OVW-001: the overview is the default view when start_value is not set (#39)
โ€”

SH-OVW-001 The Measure control offers an "All Measures" option, selected by default when start_value is not set: the chart opens on an all-measures overview. An explicit start_value opens on that measure; an unknown start_value warns and falls back to the overview.

SH-OVW-001#39
  • pass SH-OVW-001: an unknown start_value warns and falls back to the overview (#39)
โ€”

SH-OVW-002 The overview renders one small-multiple histogram per measure in the cleaned data, in Measure-control order, each independently binned over the measure's full value range with the configured bin algorithm. Each panel is titled with the measure name and its result count.

SH-OVW-002#39
  • pass SH-OVW-002: the overview renders one independently binned panel per measure (#39)
Evidence screenshot SH-OVW-002-overview-panels.png
โ€”

SH-OVW-003 Clicking a small multiple (or pressing Enter/Space on the focused panel) opens the standard single-measure view for that measure and syncs the Measure control; the overview footnote reads "Click a chart to view that measure."

SH-OVW-003#39
  • pass SH-OVW-003: clicking a small multiple opens that measure in the single-measure view (#39)
Evidence screenshot SH-OVW-003-click-through-to-pulse.png
โ€”

SH-OVW-004 Selecting "All Measures" in the Measure control returns from any single-measure view to the overview.

SH-OVW-004#39
  • pass SH-OVW-004: selecting All Measures returns from a single-measure view to the overview (#39)
โ€”

SH-OVW-005 Filters stay active in the overview and re-render the panels; the x-axis limit, bin, display, and grouping controls are hidden in the overview and restored unchanged in the single-measure view.

SH-OVW-005#39
  • pass SH-OVW-005: filters stay active in the overview and measure controls hide (#39)
Evidence screenshot SH-OVW-005-overview-filtered.png
PPRF-SH-001/PPRF-SH-002
PPRF-SH-001, PPRF-SH-002 (participant-profile matrix)#99
  • pass PPRF-SH-001/PPRF-SH-002: clicking a listing row focuses the participant into the railed profile (#99)
Evidence screenshot PPRF-SH-002-docked-profile-from-listing-row.pngEvidence screenshot PPRF-SH-002-railed-profile-from-listing-row.png
PPRF-SH-003
PPRF-SH-003 (participant-profile matrix)#99
  • pass PPRF-SH-003: the rail Clear affordance un-highlights the row and keeps the listing (#99)
PPRF-SH-003 (bin/control clears)
PPRF-SH-003 (participant-profile matrix)#99
  • pass PPRF-SH-003: a new bin click and control changes empty the rail (#99)
SH-AXIS-001/002/003

SH-AXIS-001 On load and after every render, each X-axis Limits input displays the limit currently in force for the selected measure โ€” the measure's data extent by default, or the user's override โ€” formatted to three significant figures of the axis range. Neither box is ever blank.

SH-AXIS-002 Displaying a limit does not pin it. A limit the user has not edited remains automatic โ€” it is re-derived from the data on every render, so changing the measure, the filters, or the y-axis scale updates the value shown โ€” while an edited limit persists as an override until it is reset. The distinction is held in state (an override slot separate from the recorded domain), not inferred from an empty input.

SH-AXIS-003 The Reset Limits control clears both x-axis limits overrides and repopulates both inputs with the derived limits, so there is always a way back to automatic now that an empty box no longer means it.

SH-FUNC-006 Users can change the upper and lower x-axis limits back to the default values for a measure by selecting the "Reset Limits" button. Pressing the button will erase the current values in the upper and lower limit boxes and replace them with defaults. The chart below will also reflect the changes and will show the default axes.

SH-AXIS-001, SH-AXIS-002, SH-AXIS-003, SH-FUNC-006#85
  • pass SH-AXIS-001/SH-AXIS-002/SH-AXIS-003: x-axis limit inputs load pre-filled with the drawn domain, follow the measure, and Reset restores them (#85)
Evidence screenshot SH-AXIS-001-axis-limits-prefilled.png

Unit evidence (Vitest โ€” tests/unit/histogram/)

13 requirement rows ยท 55 tests

RequirementSource matrix rowsIssueTests & evidence
SH-CFG-004..009 (defaults)

SH-CFG-004 a variable that contains the names of each medical sign

SH-CFG-005 a variable that contains the results for each medical sign; non-numeric results are removed with a notification thrown to the log

SH-CFG-006 a variable that contains IDs for each participant

SH-CFG-007 a variable that contains the units of each medical sign

SH-CFG-008 a variable that contains the lower limit of normal of the medical sign

SH-CFG-009 a variable that contains the upper limit of normal of the medical sign

SH-CFG-004..009#2

configure.test.js

  • pass histogram configure SH-CFG-004..009: default settings map the standard measure, result, id, unit, and normal-range columns (#2)
SH-CFG-010/011, SH-CHART-004

SH-CFG-010 an array of variables and metadata that will appear in the controls as data filters

SH-CFG-011 an array of variables and metadata that will appear in the data listing

SH-CFG-010, SH-CFG-011#2

configure.test.js

  • pass histogram configure SH-CFG-010: filter specs normalize strings and objects to value_col/label pairs (#2)
  • pass histogram configure SH-CFG-011: details default to id, filters, result, normal limits, and unit when unset (#2)
  • pass histogram configure SH-CHART-004: the group list always offers None and adopts an unknown group_by column (#2)
Evidence screenshot SH-CHART-004-grouped-multiples.png
SH-CFG-013/014

SH-CFG-013 a boolean that dictates whether the normal range control will be generated

SH-CFG-014 a boolean that dictates whether the normal range will be displayed initially

SH-CFG-013, SH-CFG-014#2

configure.test.js

  • pass histogram configure SH-CFG-013/SH-CFG-014: normal-range control and initial display flags are configurable (#2)
SH-DATA-001/002

SH-CFG-005 a variable that contains the results for each medical sign; non-numeric results are removed with a notification thrown to the log

SH-DATA-001 The Safety Histogram accepts JSON data of the format returned by d3.csv(). The renderer visualizes clinical medical signs data with one row per measurement plus the required variables specified below.

SH-DATA-002 The following data specs and chart settings can be used to create a chart with several custom filters, including Sex, Race and Query Status. A sample chart using this configuration is found here.

SH-CFG-005#2

structureData.test.js

  • pass histogram checkInputs SH-DATA-001: missing required variables throw the pilot's error message (#2)
  • pass histogram checkInputs SH-DATA-001: the JSON schema publishes the data contract with required column mappings (#2)
  • pass histogram checkInputs SH-DATA-001/SH-DATA-003: valid long-format data with optional columns passes (#2)
  • pass histogram structureData SH-DATA-001: measure labels combine the measure with its unit when present (#2)
  • pass histogram structureData SH-DATA-002: missing and non-numeric results are removed with a reported count (#2)
Evidence screenshot SH-DATA-002-invalid-data-note.png
SH-CTRL-002/005/006

SH-FUNC-004C If the selected measure does not include lower/upper normal range data, the Normal Range control is unavailable/hidden.

SH-FUNC-004C (detection)#2

structureData.test.js

  • pass histogram binning matches the original renderer (#19) SH-CTRL-006: ADBDS Albumin reproduces the original renderer's bin parameters (#19)
  • pass histogram binning matches the original renderer (#19) SH-CTRL-006: bin quantity is clamped to the count of unique results (#19)
  • pass histogram binning matches the original renderer (#19) SH-CTRL-006: Scott's rule and Freedman-Diaconis enforce the original's 5-bin floor (#19)
  • pass histogram binning matches the original renderer (#19) SH-CTRL-006: Shimazaki-Shinomoto minimizes the original's cost function (#19)
  • pass histogram binning matches the original renderer (#19) SH-CTRL-006: zero-spread results collapse to a single bin (#19)
  • pass histogram getScales SH-CTRL-005: normalizeDomain swaps inverted lower/upper limits (#2)
  • pass histogram getScales SH-CTRL-005/SH-FUNC-005A/SH-FUNC-005B: resolveDomain applies user limits over the data extent (#2)
  • pass histogram structureData SH-CTRL-002: active filters subset rows by stringified equality (#2)
  • pass histogram structureData SH-CTRL-005: an explicit domain bounds the bins and clamps edge values (#2)
  • pass histogram structureData SH-CTRL-006: binning algorithms produce the original renderer's bin quantities (#2)
  • pass histogram structureData SH-CTRL-006: custom quantity and custom width drive the bin count (#2)
Evidence screenshot SH-CTRL-006-shared-bin-multiples.pngEvidence screenshot SH-CTRL-005-axis-limits.png
SH-CTRL-006 (original QC)
โ€”#19

binning.test.js

  • pass histogram binning matches the original renderer (#19) SH-CTRL-006: ADBDS Albumin reproduces the original renderer's bin parameters (#19)
  • pass histogram binning matches the original renderer (#19) SH-CTRL-006: bin quantity is clamped to the count of unique results (#19)
  • pass histogram binning matches the original renderer (#19) SH-CTRL-006: Scott's rule and Freedman-Diaconis enforce the original's 5-bin floor (#19)
  • pass histogram binning matches the original renderer (#19) SH-CTRL-006: Shimazaki-Shinomoto minimizes the original's cost function (#19)
  • pass histogram binning matches the original renderer (#19) SH-CTRL-006: zero-spread results collapse to a single bin (#19)
  • pass histogram structureData SH-CTRL-006: binning algorithms produce the original renderer's bin quantities (#2)
  • pass histogram structureData SH-CTRL-006: custom quantity and custom width drive the bin count (#2)
Evidence screenshot SH-CTRL-006-shared-bin-multiples.png
SH-CTRL-005/007

SH-FUNC-005A The Lower Limit input updates the histogram x-axis minimum for the selected measure.

SH-FUNC-005B The Upper Limit input updates the histogram x-axis maximum for the selected measure.

SH-FUNC-005A, SH-FUNC-005B#2

getScales.test.js

  • pass histogram getScales SH-CTRL-005: normalizeDomain swaps inverted lower/upper limits (#2)
  • pass histogram getScales SH-CTRL-005/SH-FUNC-005A/SH-FUNC-005B: resolveDomain applies user limits over the data extent (#2)
  • pass histogram getScales SH-CTRL-007: tick labels switch between bin centers and bin boundaries (#2)
  • pass histogram structureData SH-CTRL-005: an explicit domain bounds the bins and clamps edge values (#2)
Evidence screenshot SH-CTRL-005-axis-limits.pngEvidence screenshot SH-CTRL-007-boundary-ticks.png
SH-AXIS-001/002/003/004

SH-AXIS-001 On load and after every render, each X-axis Limits input displays the limit currently in force for the selected measure โ€” the measure's data extent by default, or the user's override โ€” formatted to three significant figures of the axis range. Neither box is ever blank.

SH-AXIS-002 Displaying a limit does not pin it. A limit the user has not edited remains automatic โ€” it is re-derived from the data on every render, so changing the measure, the filters, or the y-axis scale updates the value shown โ€” while an edited limit persists as an override until it is reset. The distinction is held in state (an override slot separate from the recorded domain), not inferred from an empty input.

SH-AXIS-003 The Reset Limits control clears both x-axis limits overrides and repopulates both inputs with the derived limits, so there is always a way back to automatic now that an empty box no longer means it.

SH-AXIS-004 Pre-filling must not let an invalid domain reach the chart: a limit typed across the other limit as currently displayed is swapped rather than inverted, an empty or non-numeric entry returns that limit to automatic, and a log-scale domain stays positive.

SH-AXIS-001, SH-AXIS-002, SH-AXIS-003, SH-AXIS-004#85

axis-limits.test.js

  • pass histogram axis-limit prefill (SH-AXIS-001) SH-AXIS-001: displaying a limit does not pin it โ€” the overrides stay null until edited (#85)
  • pass histogram axis-limit prefill (SH-AXIS-001) SH-AXIS-001: the X-axis limit inputs load pre-filled with the domain the chart drew (#85)
  • pass histogram limit guardrails with prefilled inputs (SH-AXIS-004) SH-AXIS-004: a lower limit typed above the prefilled upper limit is swapped, never inverted (#85)
  • pass histogram limit guardrails with prefilled inputs (SH-AXIS-004) SH-AXIS-004: a non-numeric entry returns that limit to auto rather than reaching the chart (#85)
  • pass histogram limit guardrails with prefilled inputs (SH-AXIS-004) SH-AXIS-004: clearing a prefilled input returns that limit to auto and the box refills (#85)
  • pass histogram Reset Limits (SH-AXIS-003, SH-FUNC-006) SH-AXIS-003: Reset Limits clears the overrides and repopulates both inputs with the derived domain (#85)
  • pass histogram unedited limits stay automatic (SH-AXIS-002) SH-AXIS-002: an edited limit survives a filter change and stays an override (#85)
  • pass histogram unedited limits stay automatic (SH-AXIS-002) SH-AXIS-002: an unedited limit re-derives on a measure change and the input follows (#85)
Evidence screenshot SH-AXIS-001-axis-limits-prefilled.png
SH-CHART-002/005

SH-FUNC-011 When a histogram bar is selected, visually de-emphasize/lighten all bars not represented in the linked detail table.

SH-FUNC-011 (colors)#2

getPlugins.test.js

  • pass histogram getPlugins SH-CHART-002: bin descriptions report the count and value range in the pilot's wording (#2)
  • pass histogram getPlugins SH-CHART-005: p-values format with bounded precision (#2)
  • pass histogram getPlugins SH-CHART-005: the group-comparison screen needs 2+ groups and separates distinct groups (#2)
  • pass histogram getPlugins SH-CHART-005: the normality screen needs at least 3 values and stays within (0, 1) (#2)
Evidence screenshot SH-CHART-005-pvalue-disclaimer.png
SH-LIST-002/003/004
โ€”#2

listing.test.js

  • pass histogram listing SH-LIST-002: pagination slices pages and clamps out-of-range page numbers (#2)
  • pass histogram listing SH-LIST-003: CSV export renders label headers and quoted, null-safe values (#2)
  • pass histogram listing SH-LIST-004: search filters rows case-insensitively across listing columns (#2)
  • pass histogram listing SH-LIST-004: sorting is numeric when both values are numeric, string otherwise, and null-safe (#2)
Evidence screenshot SH-LIST-004-search-sort-paginate.png
SH-DATA-001/003 (schema)

SH-DATA-001 The Safety Histogram accepts JSON data of the format returned by d3.csv(). The renderer visualizes clinical medical signs data with one row per measurement plus the required variables specified below.

SH-DATA-001#2

checkInputs.test.js

  • pass histogram checkInputs SH-DATA-001: missing required variables throw the pilot's error message (#2)
  • pass histogram checkInputs SH-DATA-001: the JSON schema publishes the data contract with required column mappings (#2)
  • pass histogram checkInputs SH-DATA-001/SH-DATA-003: valid long-format data with optional columns passes (#2)
  • pass histogram structureData SH-DATA-001: measure labels combine the measure with its unit when present (#2)
SH-API-001 (module export)

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

โ€”#2

../main.test.js

  • pass safety.viz scaffold SH-API-001: the collection exposes the histogram module factory (#2)
PPRF-SH-001/002/003
PPRF-SH-001..003 (participant-profile matrix)#99

profile-adoption.test.js

  • pass histogram listing-row focus gesture (PPRF-SH-002, PPRF-11) PPRF-SH-002: clicking a listing row focuses the participant โ€” dock full profile, row highlight, listing stays
  • pass histogram listing-row focus gesture (PPRF-SH-002, PPRF-11) PPRF-SH-002: Enter on a focused listing row activates the same path (keyboard parity)
  • pass histogram listing-row focus gesture (PPRF-SH-002, PPRF-11) PPRF-SH-002: is idempotent under repeated identical dispatches
  • pass histogram listing-row focus gesture (PPRF-SH-002, PPRF-11) PPRF-SH-002: listing rows are interactive only when the host opts in via onListingRowClick
  • pass histogram listing-row focus gesture (PPRF-SH-002, PPRF-11) PPRF-SH-002: stepping an externally-fed cohort moves the row highlight without touching the host selection or re-dispatching
  • pass histogram participant-profile adoption (PPRF-SH-001) PPRF-SH-001: derives the rail feed rows ONCE per setData through the hep-core cleaners
  • pass histogram participant-profile adoption (PPRF-SH-001) PPRF-SH-001: host listing columns are NOT the rail header details (profile_details defaults empty)
  • pass histogram participant-profile adoption (PPRF-SH-001) PPRF-SH-001: mounts the rail by default (config-on) into the shell profile slot
  • pass histogram participant-profile adoption (PPRF-SH-001) PPRF-SH-001: passes the host lab mappings and profile_details through to the rail
  • pass histogram participant-profile adoption (PPRF-SH-001) PPRF-SH-001: profile: false leaves the slot empty and mounts no dock
  • pass histogram rail clear paths (PPRF-SH-003, PPRF-11) PPRF-SH-001: setSettings({profile: false}) unmounts a live dock; re-enabling remounts it
  • pass histogram rail clear paths (PPRF-SH-003, PPRF-11) PPRF-SH-003: a control-driven render resets the selection AND the rail (render preamble)
  • pass histogram rail clear paths (PPRF-SH-003, PPRF-11) PPRF-SH-003: a new bin click replaces the listing and clears the focused participant
  • pass histogram rail clear paths (PPRF-SH-003, PPRF-11) PPRF-SH-003: destroy tears the rail down with the instance
  • pass histogram rail clear paths (PPRF-SH-003, PPRF-11) PPRF-SH-003: dock Clear empties an externally-fed cohort the host never selected (PPRF-11)
  • pass histogram rail clear paths (PPRF-SH-003, PPRF-11) PPRF-SH-003: the rail Clear affordance routes through the host clear path โ€” row un-highlights, listing stays
Evidence screenshot PPRF-SH-002-docked-profile-from-listing-row.pngEvidence screenshot PPRF-SH-002-railed-profile-from-listing-row.png

Railed participant profile (#99, PPRF-SH)

0 requirement rows ยท 0 tests

RequirementSource matrix rowsIssueTests & evidence

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 (125 rows)

Legacy-API note: source-matrix SH-API-001 ("a factory to create a custom Webcharts chart object") describes the legacy Webcharts API, which the designs intentionally do not preserve (pilot SH-API-002). The module ships the pilot's lifecycle API instead โ€” SH-API-001 in the module scheme.

SH-REG-024 note: the row's inputs-update behavior is evidenced by SH-CTRL-008; its info-icon clause (an โ“˜ link to the algorithm's description) is not ported.

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

One representation โ€” a histogram. The "All Measures" overview is a small-multiples data-scope mode and the bar-click listing is a supplementary drill-down; neither is a mutually-exclusive primary-display switch, so promoting would require inventing a new toggle (out of scope). Ruled single-view in the shared view-selector rollout (#76) โ€” no view control is added; see view-selector-inventory.md.

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/histogram/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.