Clinical Study Report
library/templates/ich-e3
19 of 120 sections populated · 10 prose blocks
Open-source Clinical Study Report builder
Every number in an open.csr report is computed by a versioned spec, serialized as an Analysis Results Dataset, rendered into a display, and bound — never retyped — into the sentence that quotes it. Change the request, regenerate the number, and the prose moves with it as one transaction.
Open the demo reportSee the evidenceRead the design
The demo is one view with four ways in — the assembled documents, the table and ARD behind any number, the prose that quotes them, and the document models they assemble into.
One study, one set of ARDs, one values store — and every document the template library holds, assembled from them. The same display is a different table number in each, from one unchanged specification.
library/templates/ich-e3
19 of 120 sections populated · 10 prose blocks
library/templates/e3-synopsis
20 of 25 sections populated · 18 prose blocks
library/templates/display-package
5 of 11 sections populated · 0 prose blocks
library/templates/e3-abbreviated
18 of 75 sections populated · 10 prose blocks
library/templates/
Planned. Needs a SAP template in library/templates/ before it can assemble.
pharmaverse, NEST and the R Consortium pilots generate submission-grade tables — and stop at the output object.
CoAuthor, Yseop, TriloDocs and Narrativa assemble documents — and treat the TFL package as an opaque, already-final input.
Both halves break at the same seam: prose quotes numbers the authoring tool did not compute. Cross-checking numbers against tables is a patch over that seam. open.csr closes it.
analysis.yaml — reviewable, small, versioned.outputs/<slug>/vNNN/: spec snapshot, ARD, display, manifest.One transaction, fully versioned, every artifact reproducible from the commit. Agents write source; humans approve; the pipeline is the only thing that regenerates.
pharmaverseadam ──▶ data-prep ──▶ ARDs ──▶ displays ──▶ assembled CSR ──▶ demo site
(ADaM) (R, tested) (cards) (gt/tfrmt/ (Node, from (GitHub
r2rtf) the E3 model) Pages)
▲ ▲ ▲ ▲
library/tfl/ library/tfl/ library/text/ library/templates/
analysis.yaml display.yaml text blocks ich-e3/
iterations.yaml ▲ sections.yaml
│ assembly.yaml
library/values/
values.yaml — a number named once,
resolved from the committed ARDs
┌──────────────────────────────────────────────────────────────────────────┐
│ quality/ — requirement matrices · testthat + vitest evidence · guards │
└──────────────────────────────────────────────────────────────────────────┘
library/tfl/<slug>/
analysis.yaml — what to compute (ARS-aligned)display.yaml — how to show ititerations.yaml — every saved regenerationlibrary/values/values.yaml
source — an address into a committed ARDderived — declared arithmetic, closed vocabularylibrary/text/<ID>.md
{{ard:…}} bindingslibrary/templates/<id>/
How the four connect, end to end, with one display followed from the dataset to the sentence that quotes it: the data design framework.
Every number on this site answers five questions — which dataset, which spec, which ARD row, which display, which sentence.
adam (pkg version + hash) → data-prep manifest → ard.json (rows + envelope) → display vNNN (manifest: spec hash, commit) → CSR slot (assembly.yaml) → text binding
The CSR Reader renders that chain as a trace panel: click a bound number and the whole provenance path opens beside it.