← 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.
- #354 safety.viz's shared parts opened to a second library (Released · status: released · bio)
- #355 Group comparison, the picture: bio.viz's first chart, drawn and drillable (Released · status: released · bio)
- #356 Group comparison, the tests: R's results on the chart, and the chart from R (Released · status: released · bio)
- #357 Association scatter and correlation matrix (Released · status: released · bio)
- #358 Biomarker screen: one row per biomarker (Released · status: released · bio)
- #359 Cross-tabulation and the shared cut rule (Released · status: in session · bio)
- #360 Stratified survival, and survival rows in the biomarker screen (Released · status: in session · bio)
- #361 Results out of the browser: titles, footnotes, PNG and specifications (Released · status: in session · bio)
- #362 Results out of R: static twins, RTF tables and batch runs (Released · status: in session · bio)
- #363 R in the browser, measured: the connection a chart uses to ask R for a statistic (Released · status: released · bio)
- #364 gsm.bio's statistics: the package, a synthetic biomarker study and every test the charts will print (Released · status: released · bio)
- #366 The demo app hosts the biomarker charts, on the files and mapping a study already has (Released · status: released · bio)
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:
- safety.viz's shared parts opened to a second library (#354).
- R in the browser, measured: the connection a chart uses to ask R for a statistic (#363).
- gsm.bio's statistics: the package, a synthetic biomarker study and every test the charts will print (#364).
- Group comparison, the picture: bio.viz's first chart, drawn and drillable (#355).
- Group comparison, the tests: R's results on the chart, and the chart from R (#356).
- Association scatter and correlation matrix (#357).
- Biomarker screen: one row per biomarker (#358).
- Cross-tabulation and the shared cut rule (#359).
- Stratified survival, and survival rows in the biomarker screen (#360).
- Results out of the browser: titles, footnotes, PNG and specifications (#361).
- 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
- Not for the talk. Nothing here competes with
2026-10-talk work. Only the first requirement touches safety.viz: one additive pull request, which waits if the basic app is mid-flight in the same files. Everything else is in the two new repositories.
- Data loading, mapping and the app are out of scope. The whole interface to that work is a chart list in the portfolio-manifest format and column names taken as settings.
- No inference code in JavaScript, in either library. If the second requirement shows R in the browser is too slow or too heavy, the fallback is R on a server, not hand-written tests, and that is a stop-and-ask.
- No overlap with safety.viz. Histogram, results over time, outlier explorer, shift plot, delta-delta, time to event and the participant profile are reused as they are. An idea that could be a setting on a safety.viz chart is filed against safety.viz.
- Only the results table is required. Participant data and outcomes are optional: with participant data a chart shows filters, without it there are none. A group may come from a column carried on the results rows or from a biomarker cut.
- The two new repositories, jwildfire/bio.viz and jwildfire/gsm.bio, were created on 2026-10-02 on @jwildfire's go. Before a session runs in either: a
dev branch as the default, the rulesets, the obot app's access, and a cloud environment.
- Example data is public or synthetic only.
- How a p-value is shown is part of every chart's definition of done: always with its method and counts, labelled exploratory and unadjusted unless an adjustment is on, no stars, no "significant", and not computed below a minimum group size.
- The cut line if the calendar slips: the first seven requirements, through the biomarker screen, are the smallest useful product. Cross-tabulation, stratified survival and export follow.
- New chart ideas found mid-session are filed, never built.
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.