TFL Builder + Library
library/tfl/<slug>/
analysis.yaml— what to compute (ARS-aligned)display.yaml— how to show ititerations.yaml— every saved regeneration
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 report, the table and ARD behind any number, the prose that quotes it, and the ICH E3 model it all assembles into.
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/
┌──────────────────────────────────────────────────────────────────────────┐
│ 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/text/<ID>.md
{{ard:…}} bindingslibrary/templates/ich-e3/
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.