open.csr · v0.2.0 · release overview · 2026-07-27

The words became editable, and the numbers came with them.

v0.1.0 assembled a Clinical Study Report you could read. v0.2.0 is the editing release: prose you can change where you read it, with every number in the sentence watched by the same gates CI runs — plus the submission-format RTFs and the named-value layer that make the numbers worth watching. Every capture below was taken from the live site; each section links into the real thing.

reader-edit · #129 part C · PR #18

Edit where you read

Every text block in the Reader carries an Edit control. It opens the block's source in a drawer directly beneath the rendered prose — the reading context never leaves the screen, and the prose above re-renders as you type. Bindings like {{ard:t-disposition:randomised:n}} resolve live against the committed ARDs, so the writer sees real numbers while editing their tokens.

The Reader with a drawer open beneath a paragraph: rendered prose above shows the number 255 flagged, the drawer shows the block's Markdown source with ARD binding tokens, and a status line reads: Unsaved draft — gates fail. The report still says what the committed source says.
A drawer, not a different page: source below, live prose above. The typed 255 is already flagged — no binding produced it.
Open the Reader and press Edit on any block →
fidelity gate · runs per keystroke, same code as CI

The gate, both ways

The claim of the whole product in one panel. Type a number the data doesn't support and the gate fails before you finish the sentence — naming the digit and the reason. Every edit becomes a unified diff against version-controlled source with a one-click patch; nothing is ever written from the browser (design D9). Revert, and the gate says so.

state:
A panel reading GATES FAIL, 4/4 bindings resolved, 1 fidelity violation: numeric fidelity — 255 in prose came from no binding. Below it, a unified diff of the text block and buttons: Copy patch, Download patch, Revert to committed.
The violation is named, the diff is ready, and the patch applies with git apply — an edit becomes a reviewable source change or it does not happen.
rtf artifacts · #129 part A · PR #13

Submission-format RTF

Each display now publishes submission-format RTF beside its HTML — generated by the same pipeline run that wrote the ARD, from the same rendered cells, hash-tracked in the manifest and verified in CI. The table a statistician files is the table the app shows, downloadable from the display it renders.

The Subject Disposition display page: RTF download links for the full display and in-text variant with their manifest hashes, above the rendered disposition table for study CDISCPILOT01.
Eleven RTF artifacts across the six demo displays, each with the manifest's record of the file.
Open Subject Disposition and download its RTF →
values store · #129 part B · PR #13

Named values join tables and text

Fifteen study values — randomized N, median age, and the rest — are now first-class: id, label, value, and provenance back to a committed ARD row. Prose cites them by name with {{value:}} bindings, they browse on their own surface (with their numbers in the sidebar), and the fidelity gate re-derives every one, so a value that drifts from its source fails like any stale number.

Rows of the values store: ids like treated-n and completed-pct, their labels, values, an ARD badge, the provenance path into the committed ARD with its hash, and links to the requirements that cite them.
Every value carries its provenance: the analysis, the ARD row, the file hash, and the text requirements that cite it.
Browse the values store →
sidebar · open.csr #10 · PRs #13 + #18

A tree you can fold

The document tree collapses on standard chevrons — keyboard-accessible, with state that survives navigation. Sections the demonstration models but doesn't populate are dimmed, so a glance down the tree separates what this report fills from what it only describes. Folding the CSR shows the whole workspace at once: documents, displays, text, values.

The sidebar with the Clinical Study Report collapsed to a single row, revealing the group list: Documents, Displays 6, Text 15, Values 15.
Folded: the workspace in five rows.
The sidebar expanded: all sixteen CSR sections nested under the document title, with unpopulated sections dimmed and the populated ones at full contrast.
Open: sixteen sections, the dimmed ones modelled but not populated.
publishing · open.csr #11 · PRs #12 + #21

Previews for every change, a frozen demo for every release

One publishing system now serves four tiers from a single branch: the root follows the latest release, dev/ tracks integration, every same-repo pull request gets its own live preview at pr/{N}/ with a sticky comment, and — starting with this release — every major/minor release freezes its demo permanently at v{X.Y.Z}/. The cut-over from the old deploy was lossless: nine live URLs, byte-identical before and after.

Open the frozen v0.2.0 demo →