goal #79 · design exploration · 2026-07-28

Three ways to frame the safetyGraphics replacement

Shell + navigation directions for the new app (the open.gismo app-first arc), each carrying the two surfaces you picked alongside it: the chart-viewing workflow and the snapshot / demo-study surface. Directions first, a recommendation, then the recommended frame worked in detail. Everything here is a static mockup with synthetic study content — no real renderers are mounted yet; vendoring the live safety.viz bundle into the winning direction is the next step, per the participant-profile-v2 precedent.

Design language

One system, stated up front

Today four visual languages coexist: the safety.viz docs site (espresso / paper / burnt orange, Instrument Serif), open.gismo's dark-slate Vite site, gsm.kri's Roboto-and-blue reports, and the deliberately unbranded gray-blue chart chrome. These mockups commit to the safety.viz espresso system as the app's identity — it is the only one explicitly written to be extracted as the shared portfolio stylesheet, it already carries the hub's keynote look, and it makes app and docs one continuous world. The dark-slate look isn't discarded; it becomes raw material for the app's eventual dark theme.

espresso paper panel accent accent-bright good warn bad

Type: Instrument Serif display · Instrument Sans body · IBM Plex Mono for identifiers, snapshots, and SHAs. (This page falls back to Georgia / system faces if the Instrument families aren't installed locally.) Chart marks use the validated blue–orange series pair; the good/warn/bad trio is reserved for flags and always travels with a text label.

Structure

Domains: one study, two lenses

A Domain is a top-level analytical lens on the same study — its own home view, its own chart registry, its own pipeline workflows, all sharing the study's chrome, cohort, and provenance. The app launches with two: Safety (the safety.viz renderers over mapped clinical data — LB, AE, EG) and RBQM (KRIs, flags, and the site × metric matrix, powered by the gsm.viz widgets and gsm.kri metric workflows). A third domain later — QTL, efficacy, ops — is a registry entry, not a redesign.

demo-301.study.example — domain switcher
open.gismo DEMO-301 OverviewSafetyRBQM 248 / 312 participants ✓ 2026-07-26
Safety  domain home

The chart gallery — 11 safety.viz renderers over the study's mapped domains, with participant drill-down and the pinned-selection chip.

charts: safety.viz · data: Mapped_LB / AE / EG · workflows: gsm.safety

RBQM  domain home

The monitor — flag tiles, the site × metric matrix, changes since last snapshot, metric drill-downs over time.

charts: gsm.viz widgets · data: Analysis_* / Flags_* · workflows: gsm.kri

What to look at: the domain switcher sits in the global top bar, peer to nothing — it's the app's primary axis. Cohort badge, participant chip, and provenance chip stay put when you switch: same study, different lens. The three directions below predate this concept; the recommendation shows how it snaps them together.

Direction A

Monitor

RISK-FIRST

"The study's risk state is the home page; charts are drill-downs." The gsm.kri heritage — flags, the group × metric matrix, and what changed since the last snapshot — promoted from a static report to the app's front door.

changes: home = KRI overviewchanges: persistent left nav keeps: cohort badgekeeps: snapshot contextkeeps: espresso side band
demo-301.study.example — Overview
open.gismo Study DEMO-301 248 / 312 participants ✓ snap 2026-07-26 · 9c41f2a
OverviewChartsDataSnapshotsEvidence github.com/…/demo-301

Study overview · snapshot 2026-07-26

2Red KRIs
5Amber KRIs
11On track
Sites × metrics
SiteAESAEDiscQueryPDLab
S-0084
S-0121
S-0056
S-0170

Showing flagged sites · 24 total → open full matrix

Since snapshot 2026-07-19
  • S-0084 AE rate amber → red Δscore +1.9
  • S-0121 query age new amber Δ +4.2 d
  • S-0033 SAE rate amber → green resolved

What to look at: the espresso side band carries the section nav (Overview / Charts / Data / Snapshots / Evidence — Evidence is first-class, from the safety.viz docs pattern). The top bar holds the three global context devices: study switcher, cohort badge, provenance chip. Risk tiles always carry labels, never color alone. In the domain model, this whole direction survives as the RBQM domain's home.

Direction B

Gallery

CHART-FIRST

"The charts are the product; the app is the thinnest possible frame around them." The safetyGraphics mental model carried forward — a browsable chart library as home, one click from any card to a full-bleed renderer.

changes: home = chart gallerychanges: slim top-tab nav keeps: sv gallery cards + status pillskeeps: cohort badgekeeps: Demo/Guide/Evidence sub-tabs per chart
demo-301.study.example — Charts
open.gismo DEMO-301 ChartsDataSnapshotsSettings 248 / 312 participants ✓ 2026-07-26

Safety charts

9 of 11 available · queued: paneled outliers, codebook
Hepatic Explorer
LB · eDISHAvailable
Safety Histogram
LB · distributionAvailable
AE Explorer
AE · table-firstAvailable
QT Explorer
EG · 3 viewsExperimental
Participant Profile
multi · drill-downExperimental
Hep Waterfall
LB · abnormal-baselinePrototype

What to look at: the cards are the safety.viz docs gallery, re-homed inside the app — same status vocabulary (Available / Experimental / Prototype), same thumbnails, plus the study's own data behind every card instead of demo data. The frame adds nothing but context: study switcher, four tabs, cohort badge, provenance chip. In the domain model, this gallery is the Safety domain's home.

Direction C

Study site

PUBLICATION-FIRST

"Every view is a published, versioned artifact — the app is a living study report with history." The most GitHub-native reading of D1: Actions run the pipeline, and this site is what they publish. Snapshots aren't a feature tab; they're the masthead.

changes: masthead = study title pagechanges: snapshot timeline is global chrome keeps: gallery cardskeeps: flag tileskeeps: static-files-only contract
jwildfire.github.io/demo-301
gsm.datasim synthetic study · published by GitHub Actions

DEMO-301 — Safety Review

Phase 2 · 312 participants · 24 sites · two arms
07-05
07-12
07-19
07-26 · current
✓ 9c41f2a · reproducible
OverviewSafetyRBQM
RBQM  Flags at this snapshot
open domain →
2Red KRIs
5Amber
11On track
Safety  Charts
open domain →
Hepatic Explorer
LBAvailable
AE Timelines
AEAvailable
Results Over Time
LBAvailable
QT Explorer
EGExperimental
📄 KRI Report — site-level html · built 2026-07-26 06:12
📄 Safety charts bundle — self-contained widgets html · built 2026-07-26 06:14

What to look at: the masthead is a living title page — study identity in Instrument Serif over espresso, with the snapshot timeline as global chrome: every dot is a published pipeline run, and picking one re-renders the whole site "as of" that snapshot. The Overview interleaves each domain's headline (RBQM flags, Safety charts) with a link into its full home. This is also exactly what a forked K3 demo-study repo publishes, unchanged.

★ Recommendation

C's frame, B's gallery, A's tiles

Winner: Direction C (Study site) — and the Domain concept makes the graft structural rather than cosmetic: C is the frame, the Safety domain is B's gallery, the RBQM domain is A's monitor, and the study Overview interleaves each domain's headline. Two reasons. First, alignment: the locked decisions all point here — D1 makes GitHub the acceptance path, D6 puts snapshots in v1 and in the keynote demo, K3 makes the demo a forkable study repo that publishes a live site. C is the only direction where those aren't features bolted onto an app; they're the app. Second, differentiation: safetyGraphics already exists as "a frame around charts" — B alone would be a prettier reimplementation. The versioned, provenance-forward study site is what the gsm substrate makes newly possible.

Runner-up: B (Gallery) — the fallback if v1 scope tightens, since it's the smallest step from what exists. A (Monitor) shouldn't lead — gsm.kri's report already serves the monitoring loop — but as the RBQM domain's home it gets a first-class seat without owning the frame.

Worked surface 1

The chart-viewing workflow

The loop, in the recommended frame: home → chart → participant. From the masthead, a gallery card opens the chart page below. The shell must host four content shapes — canvas chart, table-first (AE Explorer), chart + docked rail (below), and small multiples — so the chrome commits to a three-zone grid: controls left, content center, drill-down rail right, any zone collapsible.

…/demo-301/safety/hep-explorer
open.gismo DEMO-301 / Safety / Hepatic Explorer 248 / 312 participants S-0084-011 × ✓ 2026-07-26

Hepatic Explorer

Type eDISH scatter · Domain LB · Evidence ✓ 41/41
ChartGuideEvidence
View
eDISHmDISH
Measures
ALT ×ULN ▾
Total Bilirubin ×ULN ▾
Cut lines
3×ULN / 2×ULN ▾
Group by
Treatment arm ▾
248 participants shown 4 possible Hy's Law
peak values · ×ULN Hy's Law peak ALT ×ULN → S-0084-011
PlaceboABC-123 40 mgpossible Hy's Law
S-0084-011
F · 61 y · ABC-123 40 mg · S-0084
ALT8.2×
AST5.1×
BILI2.4×
ALP1.1×
Open full profile →

What to look at: the per-chart header keeps safetyGraphics' micro-labeled summary (name / type / domain) and adds the evidence count as a trust signal, with the docs site's Chart | Guide | Evidence sub-tabs in-app. Clicking a flagged point docks the participant rail (safety.viz's existing 520px pattern) and pins the participant as a global chip in the top bar — safetyGraphics' best navigation device, kept. The selection chip follows you to any other chart.

Worked surface 2

Snapshots & the demo study

D6 makes snapshots v1 scope; the deferred Project Snapshot Comparison from open.gismo's todo is the natural centerpiece. Two selectors, a change summary, and a per-artifact diff — phase-tagged with open.gismo's existing color ramp, the one piece of its current vocabulary these mockups keep.

…/demo-301/snapshots/compare

Compare snapshots

2026-07-26 · 9c41f2a ▾vs2026-07-19 · e17d04b ▾
3 added 14 changed 0 removed
ArtifactPhaseChangeNote
Flags_Site.csvReporting2 flags changedS-0084 AE rate amber → red · S-0033 SAE resolved
Analysis_ALT.csvMetrics+12 rows · 3 changednew visit-8 labs, S-0084-011 peak updated
Mapped_AE.csvMappings+38 rowsnew cycle of AE data in dv-2026-07-25
manifest.csvConfig1 pin bumpedgsm.kri 1.2.3 → 1.2.4

Row-level diff opens in the data viewer · every value links to its artifact in both snapshots

K3 · step 1Fork the demo-study repogsm.datasim data + workr workflows + this site, one template.
K3 · step 2Actions run the pipelineScheduled runs produce a new Project Snapshot as static files.
K3 · step 3Your study site publishes itselfPages serves the app; the timeline grows a dot; nothing else to host.

What to look at: comparison respects the static-files contract — it's a client-side diff of two published snapshot trees, no server. The K3 strip is the demo-study story told as product copy; in direction C it doubles as the app's own onboarding page.

Signature component

The provenance chip

No provenance badge exists anywhere in the ecosystem today, yet every ingredient does — snapshot id and date, input data version, the gsm.library manifest pins, engine versions, the CI run. This component composes them: a quiet chip in the global chrome of every direction, expanding to the full reproducibility record. It's the one element that says what this app is about — numbers you can trace.

Collapsed — global chrome

✓ snap 2026-07-26 · 9c41f2a

Green check = CI run passed and every pin resolves. A changed or unverifiable state turns the chip amber with a label — never color alone.

Expanded — the reproducibility record

Snapshot 2026-07-26 · 9c41f2a
Input data
dv-2026-07-25 · gsm.datasim 1.4.2
Packages
gsm.library pin release-summer · 12 pkgs · SHAs ↗
Engine
R 4.4.1 · workr 0.9.2
Pipeline run
Actions #412 ✓ · 6 m 12 s · log ↗
og_run(snapshot = "9c41f2a") # reproduce locally

Open decisions

What this exploration puts on the table

IDDecisionRecommendation
D-APP0The app needs a name. Mocks show the open.gismo wordmark (repo reality), but the safetyGraphics successor deserves a product name of its own.Decide before requirements — the name lands in Phase 1 scope, the plan rewrite, and the keynote.
D-APP1Adopt the safety.viz espresso tokens as the app design system (vs open.gismo's dark slate, vs something new).Yes — espresso. One portfolio language; dark slate becomes the dark theme's starting material.
D-APP2Shell frame: C (study site) hosting B's gallery and A's overview strip.As recommended above — most aligned with D1/D6/K3, most differentiated from safetyGraphics.
D-APP3The chart chrome (sv-* shell) is theme-agnostic with no CSS hook, so charts will sit visually apart from any app frame.Add CSS-variable hooks to the sv shell — this is safety.viz#41's scope; the app becomes its first consumer.
D-APP4One maturity vocabulary across app and charts (safety.viz has status pills + in-chart banners; R packages have lifecycle badges).Adopt safety.viz's trio (Available / Experimental / Prototype) app-wide; add "Legacy-hosted" for Shiny-shimmed widgets.
D-APP5Provenance chip as global chrome in every direction.Yes — net-new signature component; composes only data that already exists in the snapshot tree.
D-APP6Mapping/readiness surface: safetyGraphics' gating step, reduced to red/green borders there. Static-files contract means the app can't edit mappings — only show their state.v1 = read-only readiness panel per domain (mapped / missing / defaulted), linking to the workflow YAML that fixes it.
D-APP7The Domain model: Safety + RBQM at launch, each a registry entry binding a home view, a chart set (safety.viz / gsm.viz), and a workflow family (gsm.safety / gsm.kri). How extensible, and where is the registry defined?Registry-driven, defined in study config — a domain is data, not code; the data/config framework doc carries the details.

Next steps

If a direction (or the graft) holds after your pass: ① vendor the real safety.viz dist bundle + synthetic data into the chosen frame so the chart page runs live, per the participant-profile-v2 mockup precedent; ② promote the chosen direction into the app-first plan rewrite on #34 as its UI headline; ③ publish the exploration to the hub's reports/ for the permanent record. Comments on any D-APP item work like the #130 review — one-liners are enough. The data & config framework companion doc carries the D-FW ledger for everything below the UI.