obot roadmap · requirement #28 · 2026-07-12
gsm.safety v1.0.0 RC1 — qualification evidence
The release candidate on release/v1.0.0 adopts safety.viz v1.2.0 in full: one htmlwidget binding per shipped renderer (all seven, including the v1.2.0 eDISH hepatic safety explorer), a report workflow and runnable example for each, canonical pharmaverseadam demo data shared byte-identical with the JS demos, and a qcthat qualification matrix linking every test to its GitHub issue. Everything below renders from that branch, unmerged, parked at the review gate.
Working examples
Each page is the standalone HTML the widget's inst/examples/ runner writes — the real interactive charts on the full demo extracts (controls, filters, and linked listings live).
Widget_Histogram() · gsm.safety#30 · adbdsWidget_ShiftPlot() · gsm.safety#32 · adbdsWidget_DeltaDelta() · gsm.safety#33 · adbdsWidget_ResultsOverTime() · gsm.safety#34 · adbdsWidget_OutlierExplorer() · gsm.safety#35 · adbdsWidget_AeTimelines() · gsm.safety#36 · adaeWidget_HepExplorer() · gsm.safety#40 · adbdsQualification matrix (qcthat, milestone v1.0.0)
qcthat::QCMilestones("v1.0.0") — 1 milestone, 11 issues, 47 tests, all passing. Raw artifacts: text · JSON.
5 tests gsm.safety#30 — Add Widget_Histogram htmlwidget consuming the safety.viz bundle
- Widget_Histogram returns an htmlwidget carrying the histogram payload (#30)
- Widget_Histogram passes width, height, and elementId through (#30)
- Widget_Histogram rejects invalid inputs via the histogram contract (#30)
- Widget_Histogram renders standalone HTML with the SafetyViz bundle and data (#30)
- safety_histogram workflow renders an HTML report from ExampleData (#30, #38)
5 tests gsm.safety#32 — Add Widget_ShiftPlot htmlwidget consuming the safety.viz bundle
- Widget_ShiftPlot returns an htmlwidget carrying the shift-plot payload (#32)
- Widget_ShiftPlot passes width, height, and elementId through (#32)
- Widget_ShiftPlot rejects invalid inputs via the shift-plot contract (#32)
- Widget_ShiftPlot renders standalone HTML with the SafetyViz bundle and data (#32)
- safety_shift_plot workflow renders an HTML report from ExampleData (#32, #38)
5 tests gsm.safety#33 — Add Widget_DeltaDelta htmlwidget consuming the safety.viz bundle
- Widget_DeltaDelta returns an htmlwidget carrying the delta-delta payload (#33)
- Widget_DeltaDelta passes width, height, and elementId through (#33)
- Widget_DeltaDelta rejects invalid inputs via the delta-delta contract (#33)
- Widget_DeltaDelta renders standalone HTML with the SafetyViz bundle and data (#33)
- safety_delta_delta workflow renders an HTML report from ExampleData (#33, #38)
5 tests gsm.safety#34 — Add Widget_ResultsOverTime htmlwidget consuming the safety.viz bundle
- Widget_ResultsOverTime returns an htmlwidget carrying the payload (#34)
- Widget_ResultsOverTime passes width, height, and elementId through (#34)
- Widget_ResultsOverTime rejects invalid inputs via the results-over-time contract (#34)
- Widget_ResultsOverTime renders standalone HTML with the SafetyViz bundle and data (#34)
- safety_results_over_time workflow renders an HTML report from ExampleData (#34, #38)
5 tests gsm.safety#35 — Add Widget_OutlierExplorer htmlwidget consuming the safety.viz bundle
- Widget_OutlierExplorer returns an htmlwidget carrying the outlier-explorer payload (#35)
- Widget_OutlierExplorer passes width, height, and elementId through (#35)
- Widget_OutlierExplorer rejects invalid inputs via the outlier-explorer contract (#35)
- Widget_OutlierExplorer renders standalone HTML with the SafetyViz bundle and data (#35)
- safety_outlier_explorer workflow renders an HTML report from ExampleData (#35, #38)
5 tests gsm.safety#36 — Add Widget_AeTimelines htmlwidget consuming the safety.viz bundle
- Widget_AeTimelines returns an htmlwidget carrying the ae-timelines payload (#36)
- Widget_AeTimelines passes width, height, and elementId through (#36)
- Widget_AeTimelines rejects invalid inputs via the ae-timelines contract (#36)
- Widget_AeTimelines renders standalone HTML with the SafetyViz bundle and data (#36)
- ae_timelines workflow renders an HTML report from ExampleData (#36, #38)
5 tests gsm.safety#40 — Sync to safety.viz v1.2.0 and add Widget_HepExplorer (eDISH)
- Widget_HepExplorer returns an htmlwidget carrying the hep-explorer payload (#40)
- Widget_HepExplorer passes width, height, and elementId through (#40)
- Widget_HepExplorer rejects invalid inputs via the hep-explorer contract (#40)
- Widget_HepExplorer renders standalone HTML with the SafetyViz bundle and data (#40)
- hep_explorer workflow renders an HTML report from ExampleData (#40, #38)
12 tests gsm.safety#31 — Vendor the safety.viz v1.1.0 bundle and shared htmlwidget infrastructure
- package metadata is available (#31)
- gsm.safety exports the seven safety.viz widgets plus data and report helpers (#31)
- every widget ships its htmlwidgets binding, dependency yaml, schema, and report workflow (#31, #38)
- the legacy safetyCharts bridge is fully retired (#31)
- BuildWidgetPayload returns the htmlwidget x payload for valid input (#31)
- BuildWidgetPayload serializes empty settings as a JSON object (#31)
- BuildWidgetPayload errors when a schema-default column is missing (#31)
- BuildWidgetPayload errors when a settings override names a missing column (#31)
- BuildWidgetPayload checks nested object settings like ae-timelines color (#31)
- BuildWidgetPayload validates its inputs (#31)
- SaveWidgetReport writes a self-contained HTML report and returns its path (#31)
- SaveWidgetReport keeps an existing .html extension and validates inputs (#31)
4 tests gsm.safety#37 — Ship canonical pharmaverseadam demo data (adbds/adae) for examples and QC
- ExampleData reads the adbds example data with sensible types (#37)
- ExampleData reads the adae example data with sensible types (#37)
- ExampleData converts blank numeric fields to NA without warnings (#37)
- ExampleData defaults to adbds and rejects unknown datasets (#37)
8 tests gsm.safety#38 — Modernize report workflows to the Widget_* renderers
- safety_delta_delta workflow renders an HTML report from ExampleData (#33, #38)
- hep_explorer workflow renders an HTML report from ExampleData (#40, #38)
- safety_outlier_explorer workflow renders an HTML report from ExampleData (#35, #38)
- every widget ships its htmlwidgets binding, dependency yaml, schema, and report workflow (#31, #38)
- safety_results_over_time workflow renders an HTML report from ExampleData (#34, #38)
- safety_shift_plot workflow renders an HTML report from ExampleData (#32, #38)
- ae_timelines workflow renders an HTML report from ExampleData (#36, #38)
- safety_histogram workflow renders an HTML report from ExampleData (#30, #38)
1 test gsm.safety#27 — Add QCThat testing framework
- every test in the package carries a qcthat issue reference (#27)
no tests gsm.safety#28 — Add pkgdown widget thumbnail gallery
- No tests — the pkgdown gallery (gsm.safety#28) is the deliberate post-RC lane on this milestone.
Provenance
| Branch | release/v1.0.0 at 00761ea (fourteen commits over main, one per issue lane) |
| Bundle | safety.viz-1.2.0/safety.viz.js vendored from the safety.viz v1.2.0 release; per-module JSON data contracts vendored alongside |
| Data | adbds.csv / adae.csv byte-identical to the safety.viz site demos (pharmaverseadam, hub #25); unchanged between v1.1.0 and v1.2.0 |
| Checks | devtools::check() clean (0/0/0) on R 4.3.3, macOS; full suite 230 assertions, 0 failures |
| Verification | each lane's example script and workflow re-run fresh by independent verifier agents; rendered HTML asserted to embed the SafetyViz bundle, the widget binding, and real data |
| Reproduce | Rscript inst/examples/<slug>.R <outdir> per renderer, or gsm.core::RunWorkflow() on inst/workflow/3_reports/<id>.yaml |
Drafted by Claude Code (Fable 5) for review by @jwildfire · gsm.safety RC1 ultracode session, 2026-07-12