A worked Safety Review Committee example for a first-in-human dose-escalation study: the screening rules, a console that applies them, and the packet a committee would read before deciding on the next dose.
Runs (R 4.6.0); tests passSynthetic data
Not covered: DMC charters, group-sequential interim design, BOIN or CRM design.
Synthetic data only. Study CP-101 does not exist. TRIALMON flags positions for a medical monitor and a committee; it does not adjudicate DLTs or Hy's Law cases and makes no dose-escalation decision. It is not a validated system and produces no reported numbers.
The console as a Shinylive build
The console as it opens, on synthetic data. If the app does not load, this screenshot and the read-only snapshot show the same screens.
The same R Shiny code is exported with Shinylive, which runs R compiled to WebAssembly (webR) in the browser. There is no server: the screens are computed in your browser from the synthetic data, and everything the app needs loads from this site.
Smoke-tested before each deploy Before each deploy, the site's publishing workflow opens the console in headless Chrome as a first-time visitor and deploys nothing unless it starts, fills its panels and tabs with the expected values, shows no error and follows the site's theme (run history ↗). The same check passed on a local build on 26 October 2026 (see What was executed below). It runs on the build machine, not on the live site; Safari and Firefox are not checked.
Before you open it: R starts inside your browser, so the console takes several seconds to appear. The first visit downloads about 65 MB, shared with the other two apps on this site; later visits reuse the browser cache. It works best in Chrome or Edge; Safari support may vary.
Cohort summary, DLT table, eDISH plot with the potential Hy's Law timing, QTcF categories, CTCAE lab shifts, AEs by SOC and preferred term, study-level indicators, and a dose-escalation section that lays out the data and the protocol's options for the committee, without recommending one.
MedDRA and CTCAE versions are document parameters (defaults v29.1 and v6.0).
Each rule with its source and a case from the data: why an upper-right eDISH point is not yet a Hy's Law case, why ALT 4.2x ULN with normal bilirubin still needs confirmation, how the CTCAE version changes a grade, and why the roll-up takes the worst level.
R Shiny: runs in local RShinylive build: smoke-tested before each deploy
The console runs in local R; its Shinylive build is above. It needs only shiny, bslib and DT, keeps its data in the app folder and builds downloads in the browser. The run-and-build page lists every line, including the testthat and shiny::testServer() tests.
Potential Hy's Law: ALT or AST at least 3x ULN, and total bilirubin above 2x ULN on or after that draw within 30 days of it (an SAP convention); every such draw opens its own window, so a second rise is screened too. ALP is shown alongside; "ALP below 2x ULN" applies only as a labeled SAP option. Source: FDA, Drug-Induced Liver Injury: Premarketing Clinical Evaluation (July 2009).
Confirmation: any ALT or AST above 3x ULN calls for repeat ALT, AST, ALP and total bilirubin within 48 to 72 hours. Participant CP101-009 (ALT 4.2x, AST 3.6x, bilirubin 1.6x ULN) is flagged for it, not shown green.
QTcF: maximum post-baseline value above 450, 480 and 500 ms; increase from baseline above 30 and 60 ms (ICH E14 and its Q&As).
Lab grades: NCI CTCAE v6.0 by default or v5.0 per protocol, named in every footnote; creatinine on multiples of ULN and fold over baseline. AE grades stay as the investigator recorded them.
Dose escalation: a 3+3 tally as an illustrative rule reference only; BOIN is noted as the model-assisted alternative and not implemented. The committee decides.
Roll-up: worst-of at every level, the QTcF watch level included, so one RED is never averaged away.
What was executed
Data
Synthetic, ADaM-shaped CSVs written from one seed: 18 participants in four dosed cohorts, with planted cases for each rule.
Rules and console
One R file of rules drives the console, the guide, the snapshot and the packet. Tested with testthat and shiny::testServer() on R 4.6.0: 654 expectations in 69 tests pass, including each rule at its exact threshold and a second aminotransferase elevation that opens its own window.
Pages
Rendered with Quarto 1.10.19 on 25 October 2026; checked in headless Chrome in light and dark at desktop and phone widths.
In the browser
The site's publishing workflow exports the console with shinylive 0.5.0 (assets 0.10.12, webR 0.6.0). Before each deploy, the workflow's smoke test opens it in headless Chrome as a first-time visitor (run history ↗). On a local build on 26 October 2026, served under the site path, the console was ready about 7 seconds after the page opened, filled every listed panel with the expected values and every tab, followed the site's theme toggle both ways (R had the theme each time, and on the Liver tab both plots were drawn again), showed a focus outline on the tab strip from the keyboard and started again after a reload, with no page errors. Not checked in Safari, Firefox or on a phone's own browser.
Not done
No validated system, no independent programming, no review by a medical monitor. The CTCAE v6.0 cut points follow admiral 1.5.0's metadata and were not re-checked against the NCI workbook. Drafted with AI assistance; the author's sign-off has not been given yet.
Related: the scheduled-monitoring jobs behind these checks are described, as SAS and R macros that have not been executed, in the monitoring and coverage wiki.