🍊😺 obot
Launched
Commit8d9ba9b

changelog v4.8.1 is current with this build

What changed · full log

← All goals

Objective: Biomarker charts — compare groups and relate variables, with every test computed by R

Goal issue #353 · slug biomarker-charts

12/12 member issues closed

✅ Done 12

closed members.

Direction

Intent

A second chart library and its R package, bio.viz and gsm.bio, for the exploratory biomarker work the safety library leaves out on purpose: comparing groups and relating variables, with the test result on the chart. @jwildfire, 2026-10-02, in session:

Avoid overlap with safety-viz (that will also be available for any study using this). I'm working on the platform components (data load/mapping/app) separately so leave that out of scope.

I'm not excited about building a js library for statistical inference.

participant data should be optional - if it's there you get filters, if not, you don't.

So: six chart types safety.viz does not draw; every test computed by R and never rewritten in JavaScript; the sidebar, filters, record listing and participant rail borrowed from safety.viz rather than copied; and only a results table required. The clinical-priorities decision of 21 August listed correlation heatmaps and scatter-plot matrices as deliberately not part of the safety library; this objective keeps that decision by building them as a separate product. The design page carries the chart specifications, the statistics engine and the order of work.

Definition of done

End state: the bio.viz gallery shows six charts on a synthetic biomarker study — group comparison, association scatter, correlation matrix, biomarker screen, cross-tabulation and stratified survival — each with an evidence page, an API reference and a gsm.bio widget. Every test result any of them prints is computed by an R function in gsm.bio, reached in the browser through webR or precomputed for a static report, and neither chart library contains inference code. Each chart downloads as a PNG with its title and footnotes, hands back its settings as a specification and can be rebuilt from one, and has a static ggplot twin in gsm.bio that a batch run writes to a folder.

Proof: https://jwildfire.github.io/bio.viz/ lists the six charts, each linking to its evidence page; npm test and npm run test:e2e pass in bio.viz, including for every chart a test that the printed statistics equal what R returns for the same data and a test that the chart draws with no R attached; devtools::check() is clean in gsm.bio and its gallery shows the six static figures beside their interactive twins; every requirement below is closed with its proof comment and the two releases are tagged.

Ships in: bio.viz v0.8.0 and gsm.bio v0.7.0 (proposed), milestone 2026q4.

Requirements

In session order:

  1. safety.viz's shared parts opened to a second library (#354).
  2. R in the browser, measured: the connection a chart uses to ask R for a statistic (#363).
  3. gsm.bio's statistics: the package, a synthetic biomarker study and every test the charts will print (#364).
  4. Group comparison, the picture: bio.viz's first chart, drawn and drillable (#355).
  5. Group comparison, the tests: R's results on the chart, and the chart from R (#356).
  6. Association scatter and correlation matrix (#357).
  7. Biomarker screen: one row per biomarker (#358).
  8. Cross-tabulation and the shared cut rule (#359).
  9. Stratified survival, and survival rows in the biomarker screen (#360).
  10. Results out of the browser: titles, footnotes, PNG and specifications (#361).
  11. Results out of R: static twins, RTF tables and batch runs (#362).

The first three do not depend on one another and can run in parallel. The picture needs the first and the third; the tests need the second, the third and the picture.

Boundaries


This issue was drafted by Claude Code using Opus 5.5 from the design of 2026-10-02, on @jwildfire's in-session request to file it, and re-cut the same day at his in-session choice to move the connection to R out of safety.viz; the body is his to edit.


Members are generated from the objective issue's sub-issue links at build time; priority is the selecting session's judgment, not list order (#53 v2). The --auto policy binding — active/paused, grant profile, repo-level backlog feeds — lives in obot.agent/goals/registry.json. Readiness labels: auto = ready for autonomous implementation, draft = needs @jwildfire steering.