safety.viz demo app · design, settled 9 October 2026 · for release 1.11

The demo app, ready to be shown live

Decided

Every decision this design needed, with your answer. All six were answered by 9 October 2026.

  1. How the RBQM tab gets its chart-name row

    • ChosenThe metrics are the row: Overview, then one item per metric with its status icon. It works like every other tab, each page fits one screen, and every metric's status stays in view. About two days.
    • Not chosenThe views as the row, or the metrics as the row over one long page. Both are still in mockups 4 and 5 and compared under RBQM options.
  2. What marks the rung on a status label

    • ChosenNo mark. The word is the label, and the pill's outline tells the rung: filled for Qualified, solid for Exploratory, dashed for Experimental, dotted for Prototype.
    • Not chosenFour dots, a ladder, a pie, a pictogram for each rung, a numeral. All are compared in place under Label style.
  3. Which charts carry a label of their own

    • ChosenOnly a chart or tab below Exploratory. The app's one label covers the rest.
  4. Tab colours

    • ChosenThe rule chooses: Biomarkers pink, RBQM amber.
  5. How a gsm raw file is recognised on the Data tab

    • ChosenThe stricter rule, as an interim path. You intend to move everything to RAW, then SDTM, then ADaM, in a later release, so only what the move to the Data tab needs is built. The picker to read a file the other way is dropped.
  6. The wording of the disclaimer and the six reasons

    • ChosenThe drafts on this page ship. You correct them at the release candidate.

The mockups

What a first-time visitor meets today

1The first screen: an Exploratory chart, as the app opens

This is what a first-time visitor has in front of them for their first 30 seconds, so it carries the navigation changes too. The page is fast already: the first chart was drawn 0.7 seconds after the address was entered. What it lacks is orientation: whose data, how far to trust it, and where to go.

Show
First visit
Size
The demo app today, as it opens: the Histogram on the pilot study
safety.vizDemo app

You are looking at the CDISC pilot study, a public demo: 254 participants, 18 charts on five tabs. To use your own files, open Data. They are read in this browser and never leave it.

Still of the Safety Histogram on the pilot study
  1. The wordmark is a link to the docs and gallery. Today it is plain text, and the only way back is in the footer.
  2. The Data tab names the study on screen: "Pilot study", or "Your 3 files". Today no chart says whose data it draws.
  3. A tab shows one number when every chart draws ("9"), "5 of 9" only when some cannot, and "0" beside a hollow hex when none can. Less to read, and it makes the room the app label needs at 1280 wide.
  4. Biomarkers and RBQM have colours of their own, pink and amber, in place of graphite. The rule is under Tab colours.
  5. The one app-wide label: Exploratory. Hover it for one line; click it for the detail, shown in mockup 2. It replaces the Experimental pill that sits inside the RBQM tab today.
  6. A one-line welcome on first open: whose data, how much, and where to load your own. It closes with the cross and is not stored anywhere.
  7. An Exploratory chart, like this one, carries no label of its own: the app label covers it. Only a chart or tab below Exploratory says so, on the corner of its card (mockup 2).
  8. Not drawn: the browser tab's title follows the open view ("Histogram · safety.viz demo"), so a shared-screen audience and a tab bar both say where you are.

Today: release 1.10 as it opens, captured on 9 October at 1280 wide. The page drew the Histogram 0.7 seconds after the address was entered.

2The labels, open

One component in two places: the app's label in the header, and a chart's label on the corner of its card. Each opens the same four-rung ladder with the current rung marked.

Show
State
Label style, chosen
Not chosen
Size
The demo app today on the Histogram: no status label anywhereThe Time-to-Event Explorer in the demo app today: nothing says it is Experimental
safety.vizDemo app
Still of the Safety Histogram
safety.vizDemo app
Still of the Time-to-Event Explorer on the pilot study
  1. The app label, open: one paragraph in plain words, then the four rungs with this app marked, then how many things sit below it. The cross, or a second click, closes it.
  2. Hover shows one line only: "Nothing in this app is qualified. Confirm every result." Try it on the label.
  3. A chart below the app's rung carries its own label, the same component, on the corner of its card. It takes no height and cannot cover the chart.
  4. Its panel: the one-sentence reason first, then the same ladder with this chart and this app both marked.
  5. "Label style" swaps the mark on every label on this page, here and in the other mockups. Word only is the one chosen: the outline tells the rung. The other five were weighed and not chosen; all six are compared under Label style.
  6. The purple banner drawn inside two charts today, and the pill in the RBQM tab, both go. This corner is the one place a chart says its status.

Today: the app shows no status on a chart tab. An Experimental chart says so only on the docs site, or, for two charts, in a banner drawn inside the chart.

3A biomarker chart and R

The cross-tabulation, in each state of R. Press Start R in the mockup to watch it go from off to a chip.

Show
R
Size
The cross-tabulation today before R is startedThe Biomarkers tab today while R startsThe cross-tabulation today after R has startedA biomarker chart today when R did not start, from the round-one capture
safety.vizDemo app
Still of the cross-tabulation before R is started
Statistics need R. Start R, at the top right.
R is starting. The test appears here when it is ready.
R did not start, so there is no test. Try again, at the top right.
Still of the cross-tabulation with the chi-square test R computed
  1. The R control moves to the right end of the chart-name row, outside the scrolling list of names. Today it is first in the row and pushes the chart names along. On a phone it stays first, so it shows without scrolling.
  2. Before: three words for why, three for the cost, one button. The whole sentence is on hover. Press Start R here to watch the states.
  3. Starting: a spinner and a count of seconds, and no list of steps. R for the biomarker charts started in 1.5 to 4.6 seconds in every run measured, too short for steps to be read.
  4. Ready: the control shrinks to a quiet chip. Click it for the version, the size and where R runs.
  5. The sentence inside the chart, where the test will go, is cut to one short line that points at the control. The app owns this sentence, so no biomarker-library release is needed.
  6. Did not start: the control says so in words, in the alarm colour, with Try again beside it and the reason one click away.
  7. This is the control the RBQM tab now uses too, in the same place: see mockups 4 and 5.

Today: the Start R button leads the chart-name row; the reason is a long sentence inside the chart and in a tooltip; once started the button reads "R started" and stays, greyed.

The RBQM tab: the chart-name row, and what was weighed

Chosen

Option A: the metrics are the row. The row then means what it means on every other tab, the thing you click is the thing you see, each page fits one screen for an audience, and all eight statuses stay in view wherever you are on the tab.

A · Metrics in the row (chosen)B · Views in the row (not chosen)C · Metrics in the row, one page (not chosen)
The row holdsOverview, then one item for each of the 8 metrics, its status icon where a chart has its hex.Three items: Site overview, Metric charts, Run details.One item for each of the 8 metrics. No Overview item.
The body under itOne thing at a time: the site overview, or one metric's two charts.One view at a time. Inside Metric charts the metric is chosen with buttons.One page: the site overview on top, the chosen metric's charts under it.
On Start ROne press. R starts, then the metrics run by themselves, as they do today. No separate Run step. A study loaded later runs by itself too.The same.The same.
Progress, for 20 to 40 secondsIn the control: the step, six segments, the seconds. In the body: the six steps ticked off. In the row: the metrics that will run turn.In the control and the body, the same. Nothing in the row.As A.
Run again and Run detailsIn the panel of the "R ready" chip. Run details is also one click from the line above the table.Run details is an item of the row, with Run again at its head.As A.
A metric that cannot runIn the row from the start, with a grey bar. Opened, its page is R's sentence and the way to the Data tab.A grey bar on its button, inside Metric charts. Not visible from the other views.In the row with a grey bar. Chosen, R's sentence takes the place of the charts, lower on the page.
8 metrics at 1,280 wideFits. The nine items take 610 pixels and the R control at its widest 427, of 1,216: about 180 to spare. Below about 1,100 wide the row scrolls and the control stays put.Fits with room: the three items take 331 pixels.Fits. The eight items take 517 pixels: about 270 to spare at the tightest.
At phone widthThe row scrolls sideways, as a chart row does, with the R control first. Not drawn here.The three items fit one line at 390; the R control takes the line above. Not drawn here.As A.
A link straight tothe overview or any one metric.any of the three views.the tab, with a metric chosen.
For a first-time viewerWorks like the tabs they have just used. The items are abbreviations; the full name is on hover and heads the page.The items are plain words. But what ran and what did not is out of sight until they open a view.Everything on one page, but the row changes charts that are off screen on a laptop.
CostAbout two days. The most code: an item and an address for each metric, the body in two pages, the mid-page buttons removed.About a day and a half. Three fixed items, the body in three pages; the buttons stay.About a day. An item for each metric; the body stays as it is, less the buttons.

4The RBQM tab, before Start R and while R starts

Option A, as chosen. The two options not chosen are on the switch, and the choice carries to mockup 5. Press Start R in the mockup to play the run through to the results.

Show
Option, chosen
Not chosen
State
Size
The RBQM tab today before a run, on the pilot studyThe RBQM tab today while R startsThe RBQM tab today after a run on the pilot study: 3 of 8 metricsThe RBQM tab today after a run on the RBQM study: 8 of 8 metrics, 150 sites
safety.vizDemo app
safety.vizDemo app

Site metrics need R. Start R, at the top right.

The loaded study supports 3 of 8 metrics. Change the data on the Data tab.The loaded study supports 8 of 8 metrics. Change the data on the Data tab.

Risk-based quality monitoring: gsm’s metrics for every site of the loaded study, worked out by R in this browser. The site overview and each metric’s two charts appear here, usually 20 to 45 seconds after Start R the first time.

R is starting. The metrics run by themselves when it is ready.

  1. Downloading R
  2. Installing R packages
  3. Fetching gsm’s workflow files
  4. Loading gsm’s packages, the long one
  5. Reading the study
  6. Running the workflows

Site overview

17 sites, 12 shown here

R ran 3 of 8 metrics on the Pilot study in 3.1 seconds. The other 5 need data it does not have: change the data on the Data tab.

GroupEnrolledRed FlagsAmber FlagsAESAESDSC
7051610
7181310
715801
7162401
7014100
7031800
7042500
7082500
7092100
7103100
711400
717700

randid not run: missing data

randid not run: missing data

Adverse Event Rate

AE, ran
Still of gsm.viz's scatter plot of adverse events by days on study, one point per site
Still of gsm.viz's bar chart of adjusted z-score by site

Non-Important Protocol Deviation Rate

PD, did not run

Non-Important Protocol Deviation Rate needs Raw_PD.csv, which is not loaded. Change the data on the Data tab.

Run details

3 of 8 metrics ran

Steps

  1. Downloaded R13 MB
  2. Installed R packages4 s
  3. Fetched gsm’s workflow files1 s
  4. Loaded gsm’s packages16 s
  5. Ran the workflows3.1 s4.2 s

25 seconds from the press to the charts.

R was already running from an earlier run, so only the last step ran again.

What R was handed

  • adsl.csv, the Subject-level file, gives Raw_SITE, Raw_STUDCOMP, Raw_STUDY and Raw_SUBJ.
  • adae.csv, the Adverse events file, gives Raw_AE.
  • The 9 loaded gsm raw files, each as it is.

Did not run

  • Non-Important Protocol Deviation Rate needs Raw_PD.csv, which is not loaded.
  • Important Protocol Deviation Rate needs Raw_PD.csv, which is not loaded.
  • Grade 3+ Lab Abnormality Rate needs Raw_LB.csv, which is not loaded.
  • Treatment Discontinuation Rate needs Raw_SDRGCOMP.csv, which is not loaded.
  • Screen Failure Rate needs Raw_ENROLL.csv, which is not loaded.

Nothing: all 8 ran.

Versions

R
4.6.0, on webR 0.6.0
gsm
gsm.core 1.3.1, gsm.mapping 1.1.6, gsm.reporting 1.1.7, workr 1.1.0
Metric workflows
gsm.kri 1.7.0
Charts
gsm.viz 2.4.1
Snapshot
2026-10-09

Warnings from R

None.

Site overview

150 sites, 12 shown here

R ran 8 of 8 metrics on the 9 loaded files in 4.2 seconds. To use other files, change the data on the Data tab.

GroupEnrolledRed FlagsAmber FlagsAESAEPDIPDLBSDSCTDSCSF
SITE4314 (Smith)811
SITE4485 (Doe)1111–
SITE8091 (Smith)511–––
SITE2323 (Smith)610
SITE2192 (Deer)1410–
SITE1982 (Smith)510––
SITE7983 (Smith)1310––
SITE7838 (Deer)310–––
SITE8625 (Deer)1210–––
SITE4874 (Doe)703–––
SITE1750 (Smith)702–
SITE022 (Doe)402–––

ran

Adverse Event Rate

AE, ran
Still of gsm.viz's scatter plot of adverse events by days on study, one point per site
Still of gsm.viz's bar chart of adjusted z-score by site

Non-Important Protocol Deviation Rate

PD, did not run

Non-Important Protocol Deviation Rate needs Raw_PD.csv, which is not loaded. Change the data on the Data tab.

Run details

8 of 8 metrics ran

Steps

  1. Downloaded R13 MB
  2. Installed R packages4 s
  3. Fetched gsm’s workflow files1 s
  4. Loaded gsm’s packages16 s
  5. Ran the workflows3.1 s4.2 s

25 seconds from the press to the charts.

R was already running from an earlier run, so only the last step ran again.

What R was handed

  • adsl.csv, the Subject-level file, gives Raw_SITE, Raw_STUDCOMP, Raw_STUDY and Raw_SUBJ.
  • adae.csv, the Adverse events file, gives Raw_AE.
  • The 9 loaded gsm raw files, each as it is.

Did not run

  • Non-Important Protocol Deviation Rate needs Raw_PD.csv, which is not loaded.
  • Important Protocol Deviation Rate needs Raw_PD.csv, which is not loaded.
  • Grade 3+ Lab Abnormality Rate needs Raw_LB.csv, which is not loaded.
  • Treatment Discontinuation Rate needs Raw_SDRGCOMP.csv, which is not loaded.
  • Screen Failure Rate needs Raw_ENROLL.csv, which is not loaded.

Nothing: all 8 ran.

Versions

R
4.6.0, on webR 0.6.0
gsm
gsm.core 1.3.1, gsm.mapping 1.1.6, gsm.reporting 1.1.7, workr 1.1.0
Metric workflows
gsm.kri 1.7.0
Charts
gsm.viz 2.4.1
Snapshot
2026-10-09

Warnings from R

None.

  1. Option A, chosen. The row is the tab's contents, as on every other tab: Overview, then one item per metric, with its status icon where a chart has its hex. A metric the data cannot support is in the row from the start, with the grey bar. Hover an item for the metric's full name.
  2. Option B, not chosen. The row is three views by name: Site overview, Metric charts, Run details. It is the same three whatever the study, and reads without knowing any abbreviation.
  3. Option C, not chosen. The row is the eight metrics and nothing else. It picks which metric the charts lower on the page show; the overview is always on the page, so it has no item.
  4. The R control of the Biomarkers tab, in the same place, with the same three parts: why, the cost, one button. One press starts R, and the metrics then run by themselves, as they do today and as a biomarker chart asks for its statistics. Press it here to play the run.
  5. Until R is ready the view says one short line, as a biomarker chart does, then what the loaded study supports and where to change it. No run button in the body, and no file box.
  6. While R starts, the control names the step and counts it: six segments and the seconds. This is the one place it differs from the Biomarkers tab, because here the wait is 20 to 40 seconds and there it is under five.
  7. The body lists the six steps and ticks them off, so a shared screen has something to watch. It is replaced by the results when they draw.
  8. The tab's own label, on the corner of its card like a chart's: RBQM is Experimental. Click it for its panel.
  9. Until the Data tab takes raw files, which is built after this tab, the file box stays where a reader can reach it: at the foot of the Overview page, unchanged, in every state. It is not on a metric's page. Until then the links that say "change the data on the Data tab" point down to it instead. It leaves when the Data tab requirement lands; the mockup shows the tab after that.
  10. The metrics that will run turn in the row while R works; the ones that cannot keep their grey bar.
  11. With views in the row, nothing in the row shows the run; the control and the body do.

Today: the RBQM tab has no chart-name row. It opens on a paragraph beside a Start R button, then a file box; after a run, a paragraph of versions, the overview table at full width, and metric buttons half way down the page.

5The RBQM tab, after a run

Option A with results. The row is live: click Overview, AE or PD. Switch the study to see eight metrics in the row and the table. The two options not chosen are on the switch.

Show
Option, chosen
Not chosen
View
Study
Size
The RBQM tab today before a run, on the pilot studyThe RBQM tab today while R startsThe RBQM tab today after a run on the pilot study: 3 of 8 metricsThe RBQM tab today after a run on the RBQM study: 8 of 8 metrics, 150 sites
safety.vizDemo app
safety.vizDemo app

Site metrics need R. Start R, at the top right.

The loaded study supports 3 of 8 metrics. Change the data on the Data tab.The loaded study supports 8 of 8 metrics. Change the data on the Data tab.

Risk-based quality monitoring: gsm’s metrics for every site of the loaded study, worked out by R in this browser. The site overview and each metric’s two charts appear here, usually 20 to 45 seconds after Start R the first time.

R is starting. The metrics run by themselves when it is ready.

  1. Downloading R
  2. Installing R packages
  3. Fetching gsm’s workflow files
  4. Loading gsm’s packages, the long one
  5. Reading the study
  6. Running the workflows

Site overview

17 sites, 12 shown here

R ran 3 of 8 metrics on the Pilot study in 3.1 seconds. The other 5 need data it does not have: change the data on the Data tab.

GroupEnrolledRed FlagsAmber FlagsAESAESDSC
7051610
7181310
715801
7162401
7014100
7031800
7042500
7082500
7092100
7103100
711400
717700

randid not run: missing data

randid not run: missing data

Adverse Event Rate

AE, ran
Still of gsm.viz's scatter plot of adverse events by days on study, one point per site
Still of gsm.viz's bar chart of adjusted z-score by site

Non-Important Protocol Deviation Rate

PD, did not run

Non-Important Protocol Deviation Rate needs Raw_PD.csv, which is not loaded. Change the data on the Data tab.

Run details

3 of 8 metrics ran

Steps

  1. Downloaded R13 MB
  2. Installed R packages4 s
  3. Fetched gsm’s workflow files1 s
  4. Loaded gsm’s packages16 s
  5. Ran the workflows3.1 s4.2 s

25 seconds from the press to the charts.

R was already running from an earlier run, so only the last step ran again.

What R was handed

  • adsl.csv, the Subject-level file, gives Raw_SITE, Raw_STUDCOMP, Raw_STUDY and Raw_SUBJ.
  • adae.csv, the Adverse events file, gives Raw_AE.
  • The 9 loaded gsm raw files, each as it is.

Did not run

  • Non-Important Protocol Deviation Rate needs Raw_PD.csv, which is not loaded.
  • Important Protocol Deviation Rate needs Raw_PD.csv, which is not loaded.
  • Grade 3+ Lab Abnormality Rate needs Raw_LB.csv, which is not loaded.
  • Treatment Discontinuation Rate needs Raw_SDRGCOMP.csv, which is not loaded.
  • Screen Failure Rate needs Raw_ENROLL.csv, which is not loaded.

Nothing: all 8 ran.

Versions

R
4.6.0, on webR 0.6.0
gsm
gsm.core 1.3.1, gsm.mapping 1.1.6, gsm.reporting 1.1.7, workr 1.1.0
Metric workflows
gsm.kri 1.7.0
Charts
gsm.viz 2.4.1
Snapshot
2026-10-09

Warnings from R

None.

Site overview

150 sites, 12 shown here

R ran 8 of 8 metrics on the 9 loaded files in 4.2 seconds. To use other files, change the data on the Data tab.

GroupEnrolledRed FlagsAmber FlagsAESAEPDIPDLBSDSCTDSCSF
SITE4314 (Smith)811
SITE4485 (Doe)1111–
SITE8091 (Smith)511–––
SITE2323 (Smith)610
SITE2192 (Deer)1410–
SITE1982 (Smith)510––
SITE7983 (Smith)1310––
SITE7838 (Deer)310–––
SITE8625 (Deer)1210–––
SITE4874 (Doe)703–––
SITE1750 (Smith)702–
SITE022 (Doe)402–––

ran

Adverse Event Rate

AE, ran
Still of gsm.viz's scatter plot of adverse events by days on study, one point per site
Still of gsm.viz's bar chart of adjusted z-score by site

Non-Important Protocol Deviation Rate

PD, did not run

Non-Important Protocol Deviation Rate needs Raw_PD.csv, which is not loaded. Change the data on the Data tab.

Run details

8 of 8 metrics ran

Steps

  1. Downloaded R13 MB
  2. Installed R packages4 s
  3. Fetched gsm’s workflow files1 s
  4. Loaded gsm’s packages16 s
  5. Ran the workflows3.1 s4.2 s

25 seconds from the press to the charts.

R was already running from an earlier run, so only the last step ran again.

What R was handed

  • adsl.csv, the Subject-level file, gives Raw_SITE, Raw_STUDCOMP, Raw_STUDY and Raw_SUBJ.
  • adae.csv, the Adverse events file, gives Raw_AE.
  • The 9 loaded gsm raw files, each as it is.

Did not run

  • Non-Important Protocol Deviation Rate needs Raw_PD.csv, which is not loaded.
  • Important Protocol Deviation Rate needs Raw_PD.csv, which is not loaded.
  • Grade 3+ Lab Abnormality Rate needs Raw_LB.csv, which is not loaded.
  • Treatment Discontinuation Rate needs Raw_SDRGCOMP.csv, which is not loaded.
  • Screen Failure Rate needs Raw_ENROLL.csv, which is not loaded.

Nothing: all 8 ran.

Versions

R
4.6.0, on webR 0.6.0
gsm
gsm.core 1.3.1, gsm.mapping 1.1.6, gsm.reporting 1.1.7, workr 1.1.0
Metric workflows
gsm.kri 1.7.0
Charts
gsm.viz 2.4.1
Snapshot
2026-10-09

Warnings from R

None.

  1. Option A, chosen. Each metric in the row says how it went: a green tick for ran, a grey bar for did not run. The open item is the page, as with a chart. Click AE or PD in the row to try it.
  2. Option B, not chosen. Three views, and the open one is the page. The row says nothing about the metrics; their status is inside Metric charts.
  3. Option C, not chosen. The row marks the metric whose charts are lower on this page. Click AE or PD to change it.
  4. Ready, the control is the Biomarkers tab's chip. Its panel holds what the log held: the steps, what R was handed, why metrics did not run, the versions, warnings, and Run again. Closed until asked for.
  5. Ready, the control is the Biomarkers tab's chip, and its panel is the same short one. The run's own details are a view in the row.
  6. One line says how the run went and where to change the data, with Run details one click away. It replaces the three-line paragraph of versions.
  7. The site overview as agreed: number and flag columns at 100 pixels, the table as wide as it needs, and no wider than the card with eight metrics.
  8. The key to the flags, beside the table or under it. A click on a cell opens that metric.
  9. The metric's own page: its full name, then gsm.viz's two charts at full height. Nothing else is on the page, so it fits one screen.
  10. A metric that did not run is still in the row and can be opened. Its page is R's sentence saying what it needs, and the way to the Data tab.
  11. The metric is picked with icon buttons inside the view. Two levels: the row, then the buttons.
  12. The chosen metric's charts, under the overview. On a laptop screen they start below the fold, so choosing in the row can change something that is not in view.
  13. Run details, opened from the chip or from the line above the table. The same content the log on the page holds today.
  14. Run details as a view of its own, with Run again at its head.
  15. Until the Data tab takes raw files, which is built after this tab, the file box stays where a reader can reach it: at the foot of the Overview page, unchanged, in every state. It is not on a metric's page. Until then the links that say "change the data on the Data tab" point down to it instead. It leaves when the Data tab requirement lands; the mockup shows the tab after that.
  16. On the RBQM study all eight metrics ran, so there is no metric that did not run to show.

Today: the RBQM tab has no chart-name row. It opens on a paragraph beside a Start R button, then a file box; after a run, a paragraph of versions, the overview table at full width, and metric buttons half way down the page.

6The Data tab, where all files now come in

Three states: the RBQM demo study, the pilot study the app opens on, and a reader's own three raw files. The last is the case that only the RBQM tab handles today.

An interim path

Reading gsm raw files on the Data tab is not meant to last: the plan is RAW, then SDTM, then ADaM for everything, in a later release. So this mockup builds as little as the move needs. A raw file keeps the card it has today, and one small card says what the loaded data supports. Nothing here is worth keeping once raw files go.

Show
Data
Size
The Data tab today with the RBQM study loadedThe Data tab today with the pilot study loadedThe Data tab today after three gsm raw files were dropped on it: two are read as standard files and one is not placed
safety.vizDemo app

Drop CSV or JSON files here

Study files or gsm raw files. They are read in this browser and sent nowhere.

RBQM

This data supports 8 of 8 metrics.

not started

Read from the files’ names and columns, before R is started. R says the same when it runs.

Raw_SUBJ.csvgsm raw file: Raw_SUBJ, by its name1,005 rows, 16 columns
Raw_AE.csvgsm raw file: Raw_AE, by its name2,583 rows, 16 columns
Raw_PD.csvgsm raw file: Raw_PD, by its name3,000 rows, 6 columns
Raw_LB.csvgsm raw file: Raw_LB, by its name57,200 rows, 4 columns
Raw_STUDCOMP.csvgsm raw file: Raw_STUDCOMP, by its name765 rows, 6 columns
Raw_SDRGCOMP.csvgsm raw file: Raw_SDRGCOMP, by its name765 rows, 6 columns
Raw_SITE.csvgsm raw file: Raw_SITE, by its name150 rows, 9 columns
Raw_STUDY.csvgsm raw file: Raw_STUDY, by its name1 rows, 15 columns
Raw_ENROLL.csvgsm raw file: Raw_ENROLL, by its name1,005 rows, 7 columns
safety.vizDemo app

Drop CSV or JSON files here

Study files or gsm raw files. They are read in this browser and sent nowhere.

RBQM

This data supports 3 of 8 metrics.

not startedcannot run: missing data

Why 5 cannot run
  • Non-Important Protocol Deviation Rate needs Raw_PD.csv, which is not loaded.
  • Important Protocol Deviation Rate needs Raw_PD.csv, which is not loaded.
  • Grade 3+ Lab Abnormality Rate needs Raw_LB.csv, which is not loaded.
  • Treatment Discontinuation Rate needs Raw_SDRGCOMP.csv, which is not loaded.
  • Screen Failure Rate needs Raw_ENROLL.csv, which is not loaded.
  • adsl.csv, the Subject-level file, gives Raw_SITE, Raw_STUDCOMP, Raw_STUDY and Raw_SUBJ.
  • adae.csv, the Adverse events file, gives Raw_AE.

Read from the files’ names and columns, before R is started. R says the same when it runs.

adsl.csv5 of 7 columns found254 rows

Mapping table, 7 rows, as today.

adae.csv10 of 10 columns found1,159 rows

Mapping table, 10 rows, as today.

adbds.csv12 of 13 columns found57,929 rows

Mapping table, 18 rows, as today.

adeg.csv10 of 10 columns found5,361 rows

Mapping table, 13 rows, as today.

safety.vizDemo app

Drop CSV or JSON files here

Study files or gsm raw files. They are read in this browser and sent nowhere.

RBQM

This data supports 4 of 8 metrics.

not startedcannot run: missing data

Why 4 cannot run
  • Grade 3+ Lab Abnormality Rate needs Raw_LB.csv, which is not loaded.
  • Study Discontinuation Rate needs Raw_STUDCOMP.csv, which is not loaded.
  • Treatment Discontinuation Rate needs Raw_SDRGCOMP.csv, which is not loaded.
  • Screen Failure Rate needs Raw_ENROLL.csv, which is not loaded.
  • The Groups table needs Raw_STUDY.csv and Raw_SITE.csv, which are not loaded.

Read from the files’ names and columns, before R is started. R says the same when it runs.

Raw_SUBJ.csvgsm raw file: Raw_SUBJ, by its name1,005 rows, 16 columns
Raw_AE.csvgsm raw file: Raw_AE, by its name2,583 rows, 16 columns
Raw_PD.csvgsm raw file: Raw_PD, by its name3,000 rows, 6 columns
  1. The drop zone says it takes both kinds of file. It is now the only place in the app that files come in.
  2. A gsm raw file is recognised here, by a name that starts with "Raw_" or by columns that match one raw domain only. It keeps the card it has today, which now names the raw domain it was read as. Nothing else is built for raw files.
  3. A card for RBQM says how many metrics the loaded data supports, with the same status icons as the tab and the reasons in R's own words. Open RBQM goes straight there.
  4. Step three points where the data leads. With raw files and no chart ready it reads "Open the RBQM tab"; today it reads "Open a chart, 0 of 18 charts ready" and stops.
  5. A study of standard files is unchanged, and the card says which raw tables R makes from which file.
  6. With raw files loaded the chart tabs are hollow and read "0", and RBQM keeps its colour: the header shows at a glance where to go.
  7. In the Today view of this state, the same three files were dropped on the Data tab of release 1.10: Raw_SUBJ.csv is read as the Subject-level file, Raw_AE.csv as the Adverse events file, and Raw_PD.csv is not placed. The RBQM tab then reads "0 of 8".

Today: the Data tab keeps a demo study of raw files as they are, but files a reader drops here are always read as standard study files. Raw files are understood only when dropped on the RBQM tab.

Status ladder

Label style: the one chosen, and the five weighed

Chosen

No mark at all. The word is the label, and the outline of the pill tells the rung: filled for Qualified, solid for Exploratory, dashed for Experimental, dotted and grey for Prototype. Nothing on it can be read as a meter, it needs no drawing, and a dashed outline already means "not settled" to most readers.

Label style, chosen
Not chosen

In the header, at real size

On a chart card's corner

Time to first qualifying event: 254 participants in 3 groups; 217 events, 37 censored.

All four rungs, at header size and enlarged

In the open panel

How the rung is stored

The reason for each Experimental label

Settled: these ship as drafted, and you correct them at the release candidate.

Chart or tabSentence shown in its panelSource
Time-to-Event ExplorerExperimental until an external clinical review confirms its Kaplan–Meier estimates.From the docs site
Hepatic ALT WaterfallExperimental: a new chart, drawn from a 2025 paper; its layout and settings may still change.My draft
Nephrotoxicity ExplorerExperimental until its kidney-injury staging has had a clinical review.My draft
Participant ProfileExperimental: what it lists for a participant, and how, may still change.My draft
QT ExplorerExperimental: its settings and its table may still change.My draft
RBQM tabExperimental: new in 1.10. R runs in the browser, and what the tab shows may still change.My draft

Tab colours

Why the labels are not coloured

The status labels are ink on white, and the rung is read from the word and its outline. A coloured Experimental label beside an amber RBQM hex would look like the same signal.

Metric status icons

Data loading: what moves to the Data tab, in the code

An interim path

In your words: the stricter rule is fine for now, but this is not a process to support for long; the aim is RAW, then SDTM, then ADaM for everything, in a later release. So this section is the least that moves loading to the Data tab without losing what the RBQM tab can do today. Every piece of it lives in the RBQM tab's own files, or in a few lines beside them, and can be deleted with the raw path.

Already shared

The least that has to change

Not built, because raw files are not staying

Size

Risks to what RBQM does today

Every proposed change for release 1.11

ChangeFiles touchedSize
Status ladder and labelsOne requirement: four rungs, stored once, shown by one component.
The four rungs replace the two flags: one tier per chart and per app tab in the site configuration, exploratory when absent. The build refuses qualified, since nothing is.site/config.json; scripts/site.mjs (lines 215 to 216); scripts/site-lib.mjs (status meanings and badge, about lines 1505 to 1530); scripts/app-libraries.mjs (lines 120 to 137); the app build, which must hand each chart's rung to the pageMedium
The app-wide Exploratory label in the header: one line on hover, the disclaimer and the ladder on click. The label is the word alone; the pill's outline tells the rung, so nothing is drawn.src/app/page.js (header, lines 270 to 287); src/app/styles.js; one new module for the label and its panelMedium
A chart or tab below Exploratory carries the same label on the corner of its card, with its one-sentence reason. The RBQM tab's pill and the banner drawn inside two charts go.src/app/page.js (renderMain, lines 531 to 574; view tabs, lines 426 to 443); src/app/rbqm-view.js (lede, lines 647 to 655); src/hep-waterfall.js (line 232); src/hep-explorer/views/migration.js (line 867); src/shell.js (banner, lines 47 to 71)Medium
The docs site says the same four words with the same component: gallery cards, page titles, the kit table.scripts/site-lib.mjs (lines 883, 1523 to 1530, 1306); site/site.css (lines 107 to 132)Small
A reason sentence for each of the six Experimental things, in the configuration. The drafts on this page ship; you correct them at the release candidate.site/config.jsonSmall
R presentationOne requirement: one control in one place on both tabs, one wording, on request as now.
One R control, one component, at the right end of the chart-name row on the Biomarkers tab and on the RBQM tab: off, starting, ready as a chip, did not start. It sits outside the scrolling list of names. On the RBQM tab the starting state also names the step and counts it.
The RBQM tab has no run line of its own; its side of the control is what makes this row Medium.
one new module for the control; src/app/page.js (actionControl, lines 477 to 497; its placement, lines 414 to 421, which today needs a chart group to sit in); src/app/libraries.js (what a library's control may say of itself: its phase, its step, its details); src/app/r-on-request.js (lines 96 to 123); src/app/rbqm-view.js (control, lines 325 to 343; statusText, lines 174 to 195; press, lines 272 to 322, which now feed the control); src/app/styles.js (lines 82 to 85)Medium
One set of sentences: the short line in the control, the full one on hover, and one short line in the view that points at the control, on both tabs.src/app/r-on-request.js (lines 43 to 51); src/app/rbqm.js (lines 69 to 119)Small
The ready chip opens the details: R's version, the download size, where it runs. On the RBQM tab the same panel holds the run's details and Run again.the new control; src/app/r-browser.js for the version; src/app/rbqm.js (doneSentence, lines 223 to 247; warningsSaid, lines 261 to 268)Small
One R shared by both tabs.
Why left out: Unproven, and it needs a release of a second library. The two tabs keep their own R in 1.11; the reader sees one control either way.
src/app/r-browser.js; the biomarker library's own R engine, which needs a release of that libraryLeft out
RBQM tabOne requirement: the tab gets a chart-name row and loses its run box; no change to what it computes or draws.
The tab gets a chart-name row, and the metrics are its items: Overview, then one item per metric with its status icon where a chart has its hex. Each item is a page with its own address. The body is one thing at a time: the site overview, or one metric's two charts, or R's sentence for a metric that did not run. The mid-page metric buttons go, and a click on a table cell opens that metric.
About two days. The largest row of this group. The page learns to draw a row for a tab that brings one, and to open an item of a tab by its address.
src/app/page.js (renderNav, lines 366 to 443; navItem, lines 348 to 361; select, lines 1031 to 1037); src/app/libraries.js (a tab's items); src/app/rbqm-view.js (the view, lines 600 to 705; drawResults, lines 387 to 488; the metric buttons, lines 448 to 473; the cell click, lines 433 to 438)Medium
The run box leaves the body. Until R is ready the view says one short line and what the loaded study supports; while R starts it lists the six steps; after, one line says how the run went. The file box stays at the foot of the Overview page, unchanged, until the data loading requirement removes it.
Replaces the run line of the earlier draft.
src/app/rbqm-view.js (render, lines 634 to 704); src/app/rbqm.js (needSentence 69 to 75; stepSentence 92 to 106; doneSentence 223 to 247); src/app/styles.js (lines 105 to 109)Small
Run details stay folded until asked for, in the R chip's panel, with a link to them from the line above the table. Steps, what R was handed, why a metric did not run, versions, warnings, Run again.src/app/rbqm-view.js (drawResults notes, lines 409 to 413); src/app/rbqm.js (doneSentence, warningsSaid)Small
Metric status as icons, with the words on hover and for screen readers: ran, did not run, running, not started. They sit in the chart-name row, in place of the hex.src/app/rbqm-view.js (metric chooser, lines 448 to 473); src/app/styles.jsSmall
Site overview: number and flag columns capped at 100 pixels, the table as wide as it needs, a key to the flags, the site count in the heading, the height a whole number of rows.src/app/styles.js (lines 125 to 130); src/app/rbqm-view.js (lines 417 to 443)Small
The time each step took, in Run details.
Why left out: Nice to have. The total is already measured; per-step times can follow.
src/app/rbqm-view.js (press, lines 272 to 322)Left out
Data loading for RBQM on the Data tabOne requirement: every file comes in on the Data tab. Reading gsm raw files there is an interim path, so only what the move needs is built.
The Data tab recognises a gsm raw file when it is dropped or chosen there, by the stricter rule, and keeps it as it is. Today it reads such a file as a standard study file.src/app/page.js (loadFiles, lines 738 to 792; loadRaw, lines 806 to 834); src/app/rbqm-files.js (placeRaw, lines 51 to 61, plus the stricter rule); src/app/rbqm-view.js (one function handed to the page: is this file a raw file)Small
The Data tab says what the loaded data supports for RBQM: one card with the metrics, their icons and R's own reasons. A raw file keeps today's card, which now names the raw domain it was read as.src/app/data-panel.js (rawCard, lines 252 to 267; drop zone, lines 474 to 501); src/app/rbqm-view.js (handed, lines 117 to 147, and the sentences of filesSection, lines 546 to 596, which move)Medium
The file box leaves the RBQM tab. One line stays: how many metrics the loaded study supports, and a link to the Data tab.src/app/rbqm-view.js (filesSection, lines 496 to 598); src/app/rbqm.js (lines 78 to 83); src/app/styles.js (lines 110 to 122)Small
Step three of the Data tab points where the data leads: "Open the RBQM tab" when raw files are loaded and no chart is ready.src/app/data-panel.js (lines 394 to 404)Small
The tests and the requirement rows that describe the file box on the RBQM tab are rewritten for the Data tab.tests/unit/app/rbqm-view.test.js; tests/unit/app/data-panel.test.js; tests/e2e/basic-app.spec.js; the app's requirement matrixMedium
Tab colours and navigationOne requirement: the header says where you are, whose data it is and where each tab leads.
A module names its tab colour; one that names none gets the next open palette colour. Settled: the rule chooses, so Biomarkers is pink and RBQM amber.src/app/libraries.js (hueClass, lines 323 to 325); src/app/page.js (tabs and chips, lines 381 to 443); src/app/styles.js (line 56); scripts/app-libraries.mjs (an optional colour per library)Small
The Data tab names the loaded study; a tab shows one number when every chart draws.src/app/page.js (lines 370 to 396)Small
The wordmark links to the docs home; the browser tab's title follows the open view; one favicon for app and docs.src/app/page.js (lines 270 to 287 and 1031 to 1037); scripts/site-lib.mjs (lines 1650 and 1667 to 1668); site/shell.html (lines 8 to 11)Small
A one-line welcome on first open, closed with a cross and not stored.src/app/page.js (renderMain); src/app/styles.jsSmall
The RBQM tab gets the same footnote links as a chart: its docs and its test evidence.src/app/page.js (view branch of renderMain, lines 543 to 562); scripts/app-libraries.mjs (chartLinks, lines 320 to 339)Small
On a phone, the open tab is scrolled into view on a direct link, and tabs and chips are 44 pixels tall to the touch.src/app/page.js (select, lines 1031 to 1037); src/app/styles.js (lines 225 to 231)Small
One set of colours for treatment arms across the QT, time-to-event and biomarker charts.
Why left out: Touches charts in two libraries and every screenshot in their evidence. After the talk.
src/qt-explorer/getPlugins.js (line 15); src/time-to-event/getPlugins.js (line 19); the biomarker library's paletteLeft out
One casing for chart names in the chart-name row.
Why left out: A rename ripples into evidence pages and tests. After the talk.
chart titles in two libraries' manifestsLeft out
Defects and phone-width fixesOne requirement: the four defects from round one, and what breaks at 390 pixels.
Hepatic ALT Waterfall: the two panel titles overlap on the pilot study.src/hep-waterfall.js (line 853)Small
QT Explorer: its table runs past the page at 390 pixels.src/qt-explorer.js (line 829, and the styles at lines 91 to 96)Small
Docs site at 390 pixels: the reference pages and two demo pages are clipped at the right.site/site.css (lines 72 and 889)Small
A console message on every R start, from the R runtime.src/app/r-browser.js; possibly the runtime itselfSmall
The site's description still says "Nine classic" charts.scripts/site.mjs (line 78)Small
RBQM table headings are 8 pixels tall on a phone; the two step sentences each claim to be the longest step.src/app/styles.js (lines 219 to 224); src/app/rbqm.js (lines 98 and 102)Small

What I could not verify

Sources

This design was drafted by Claude Code using Opus 5.5 and reviewed by @jwildfire