Releases: jwildfire/open.csr
Release list
v0.2.0 — the editing release
The second release for open.csr adds several foundational features, including the ability to edit text in the app, an initial rtf implementation for tables, a "values" section and various UX improvements. See the release overview for a demo of every new with in annotated captures from the live site.
The prose becomes editable
v0.1.0 let you read a Clinical Study Report the pipeline assembled. v0.2 adds the first editing verb: open any text block in the Demo's Text pane and type. Bindings resolve live against the committed ARDs as you edit, and the numeric-fidelity gate runs per keystroke — write a number the data doesn't support and the sentence flags it red before you finish it. Every edit produces a unified diff against version-controlled source, copyable or downloadable as one patch per visit. The gates that check you in the browser are the same code CI runs, so an edit that passes as you type passes the build.
Submission-format RTF
Every display now publishes a submission-format RTF alongside its HTML — 11 RTF artifacts across the six demo displays, generated by the same R pipeline from the same ARDs (pharmaverse r2rtf), hash-tracked in the manifest, verified in CI, and downloadable from the Tables pane. The table a statistician files is now the table the app shows.
A values store joins tables and text
Named study values — randomized N, median age, and thirteen more — are now first-class: each carries its value, display format, and provenance back to a committed ARD row. Prose cites them by name with {{value:}} bindings, they browse on their own Values page, and the fidelity gate re-derives every one against the ARDs, so a value that drifts from its source fails the same way a stale inline number does.
Edit where you read
The reading view is no longer read-only: any text block in the Reader opens an overlay editor in place — the same editor, the same live gates, without leaving the document (the Option C design from the requirement). Reading context stays on screen; applying the edit re-renders just that block.
A tree you can collapse
The document sidebar now folds: standard chevrons with keyboard-accessible disclosure on every section, collapse state that survives navigation, and sections modelled but empty are dimmed so the populated ones carry the visual weight. A structural stylesheet guard now fails the build if any CSS rule is left unreachable — the class of break that briefly shipped the sidebar's screen-reader label as visible text.
PR and dev previews
Every same-repo pull request now publishes its own live preview of the full site (pr/{N}/, linked by a sticky comment), dev/ tracks the integration branch, and the root serves the latest release — one publishing system, no downtime cut-over. Starting with this release, every major/minor release also freezes its demo permanently at v{X.Y.Z}/.
Requirements delivered: obot.roadmap#113 (reader→editor, first verb) · obot.roadmap#129 (parts A, B, and C) · open.csr#10, open.csr#11
These release notes were drafted by Claude Code using Fable 5 in an unattended --auto session; not yet reviewed by @jwildfire.
v0.1.0 — early prototype
The first release of open.csr — an open-source Clinical Study Report builder. This is an early prototype, and it is labelled as one: it demonstrates a closed loop end to end on real public data, and it is not yet something you would put a submission through.
The idea
Every CSR tool in the field breaks at the same seam: prose quotes numbers the authoring tool did not compute. Open source owns number generation and stops at the output object; commercial tools own document assembly and treat the TFL package as an opaque input. Both sides then sell cross-checking as a feature.
open.csr closes the loop instead. A change request becomes a spec edit, which regenerates the number, which updates the sentence — as one versioned transaction. Consistency is a build property, not a QC activity.
What v0.1 has
An ARD-first engine. {cards} → owned ard.json with a provenance envelope (data hash, spec hash, package versions, git commit) → {gt} displays. Six displays on {pharmaverseadam} CDISCPILOT01: disposition, demographics, exposure, AE overview, AEs by SOC/PT, and an SAE listing.
Prose that binds numbers rather than stating them. 14 ICH E3 text blocks in three tiers. Every number is a {{ard:…}} binding resolved at assembly, and a numeric-fidelity gate fails the build on any digit in rendered prose that did not come from one. Agent-drafted blocks stay out of the report until a human approves them — four are being held out right now, and the build says so.
A machine-readable ICH E3 model. All 119 sections as data, with 14.x display numbers derived from assembly order rather than authored, so reordering the report is a one-line diff and a display's identity never changes.
A demo application. One surface with a study explorer — documents, displays, text, and a document's own sections — a live provenance readout in the header, and a trace panel that answers, for any number: which dataset, which spec, which ARD row, which display, which sentence.
Published quality evidence. 252 vitest + 70 testthat tests, 220 reviewed requirements, requirement-traced evidence pages, and drift guards that fail the build when a committed artifact stops telling the truth.
Two findings worth reading
The webR spike — the real pipeline runs in the browser under WebAssembly and is numerically exact: 3,665 statistics across six displays, zero differences against the committed ARDs, despite a two-minor-version jump in the statistical engine. But repo.r-wasm.org is a rolling snapshot with no pinning, so ARD value equality holds while ARD snapshot equality breaks. The browser previews; CI commits.
The layout record — three application layouts, the decision, and a section recording where the first recommendation was wrong and why.
What it is not
No submission-format RTF output, no figures, no efficacy displays (CDISCPILOT01 ships no efficacy ADaM), and no way to change the report from the browser yet. docs/NEXT_STEPS.md is current on all of it.
Data is the public CDISC Pilot 01 study via pharmaverseadam. Apache-2.0.