open.csr · v0.4.0 · release candidate · 2026-09-02

The report describes one study.

v0.3.0 filled the report — twenty-six displays, an efficacy section, every one measured against the study's own 2006 report. It also described two versions of the study: six displays read a re-derived data packaging that puts twelve subjects on a different arm than the study's own package does, so section 10 and section 14 of the same document disagreed about how many people were treated. v0.4.0 reads the study's own package everywhere, declares the study once, and fails the build when two displays disagree about it — and carries five more of the reference report's displays into the library, cell for cell. And the sidebar says where every number came from: two new views, Data and Metadata, with every artifact linking what it was made from both ways — the questions users asked on 2 September, folded into this release. Then, on the same day, the explorer regrouped to read as the pipeline and every element gained its flow. Every capture below is from the candidate's own tree; each section links into it.

v0.3.0 · section 10 vs 14
86 / 96 / 72vs 86 / 84 / 84
v0.4.0 · every display
86 / 84 / 84held by the build
study model + gate · open.csr #59, #60 · PRs #68, #69

One study, declared once, held by the build

library/study.yaml now says what the study is: the arms in print order, the columns that carry an arm label, the analysis sets with the flag defining each and the subjects each holds per arm, the cut-off, the source. The pipeline's treatment vocabulary and its analysis-set registry read that file instead of carrying the study in code, and a test re-measures every count in it against the data on every run.

Every analysis results dataset records the population it summarised — analysis set, grouping column, distinct subjects per arm — and the assembler's new treatment-consistency gate holds every placed display to the study model and to every other display in the document. A display whose counts differ is a build error naming the display, the arm and both numbers. The gate was proved before the data lane moved: run against the old results it went red on all six displays.

Read section 10 and then section 14 — the same three numbers →
tables 14-2.01, 14-4.01 · open.csr #61 · PR #70

Demographics and exposure in the report's own shape

The demographics display moves to the intent-to-treat population and carries the report's Total and p-value columns — one-way ANOVA for a continuous block, Pearson's chi-square for a categorical one — and its rows: age and its groups, sex, Race (Origin), MMSE, duration of disease and its groups, years of education, baseline weight, height and BMI with its groups. All 58 printed lines agree with the 2006 report three ways. Exposure needs no exposure dataset: the pilot's ADSL carries average daily dose and cumulative dose as columns, and the display is rebuilt from them for the safety population and the Week 24 completers.

Race (Origin) is a recode, not a conflict. The assessment that scoped this release read "218 Caucasian plus 12 Hispanic" against "230 White" as the two data copies disagreeing. Both say the same thing — 230 White by race, 12 Hispanic by ethnicity, every one of them White — and the report printed one classification with Hispanic as a category. The display's footnote says so.

Table 14-2.01 as the candidate renders it: Placebo (N=86), Xanomeline Low Dose (N=84), Xanomeline High Dose (N=84), Total (N=254) and a p-value column; the Age block with n, mean, SD, median, min and max and the p-value 0.5934 on its first line, the age groups with 0.1439, Sex with 0.1409, and Race (Origin) beginning with Caucasian 218 (86%).
Table 14-2.01 as the candidate renders it: four columns, the p-value on each block's first line, Race (Origin) with Hispanic as a category.
Open the demographics display → its evidence page →
tables 14-5.01, 14-5.02 · open.csr #62 · PR #71

Adverse events as the report prints them, Fisher's test included

Two new displays reproduce the incidence table and the serious-event table: for every system organ class and preferred term, the subjects with a treatment-emergent event, the percentage of the arm, the number of events in brackets, and Fisher's exact test of placebo against each active arm — starred below 0.15, >0.99 when it rounds to one, blank where there is nothing to test. All 254 lines of the incidence table and the 4 of the serious-events table agree three ways with the report, wrapped and truncated labels included.

Four p-values do not: the 2006 program rounded them one thousandth higher than R's exact test (0.2085 printed as 0.209, and three like it). They are recorded as known differences, stated on the display, and held to — the comparison fails if one of them closes or another opens. The report's ordering is measured, not assumed: organ classes alphabetical, preferred terms by high-dose subjects then name, the one rule that reproduces all twenty-four organ-class blocks.

Table 14-5.01 as rendered: three arm columns with subjects, percentage and event count in brackets, then Placebo vs. Low Dose and Placebo vs. High Dose p-values; ANY BODY SYSTEM 65 (75.6%) [281], 77 (91.7%) [412], 76 (90.5%) [433] with 0.007* and 0.014*; the CARDIAC DISORDERS block beneath with SINUS BRADYCARDIA starred at 0.097 and 0.056.
Table 14-5.01: the first organ-class blocks, with the events count in brackets and the starred Fisher p-values in the two comparison columns.
Open the incidence table → the serious-events table →
table 14-1.03, tables 11-1 / 12-1 / 12-4 · open.csr #63 · PR #71

Subjects by site, and the in-text tables drawn from the results

Table 14-1.03 — intent-to-treat, efficacy and Week 24 completer counts per site and arm, small sites pooled under 900 — joins the library and agrees with the report on all 216 cells. Three of the report's in-text tables are now drawn from the section 14 displays' own results rather than declared and left empty: Table 11-1 (demographics as mean and range and percentages), Table 12-1 (terms at 5% or more, flat, title case, an asterisk where the placebo comparison has p < 0.15) and Table 12-4 (weight as n and mean per arm). Each is a variant of the display it summarises, so it cannot disagree with it.

Read section 12 with its in-text tables → subjects by site →
sdtm cm + dm, figure 10-1 · open.csr #65, #63 · PR #72

Medications from the study's own data, and the disposition flow

The only medication dataset PHUSE publishes for the pilot is a relabelled copy from a folder its own README calls out of place. The study's SDTM CM domain is in the same repository at the same commit; it is now vendored, the analysis dataset is derived from it with the derivation on record, and the derived dataset reproduces every one of the 414 statistics the medication table published from the copy. The study's SDTM DM domain is vendored alongside — all 306 screened subjects, the 52 screen failures the ADaM package does not carry — and with it the report's Figure 10-1 is drawn: 306 screened, 52 screen failures, 254 randomised, 118 completed Week 24, 110 completed the study.

Figure 10-1 drawn as a flow: a box reading Subjects Screened = 306 with an arrow to Screen failures = 52 at its right, then down to Randomized, entered Treatment Phase = 254, Completed Week 24 = 118 and Completed Study through Week 26 = 110; the display's own five-row table beneath it.
Figure 10-1 as a self-contained flow beside the disposition table in section 10.1; the renderer's second kind of figure.
The medication table from the derived dataset: subjects receiving at least one concomitant medication 77 (89.5%), 74 (88.1%), 78 (92.9%), then therapeutic class and coded medication rows — UNCODED, NERVOUS SYSTEM with ACETYLSALICYLIC ACID 21 (24.4%), 11 (13.1%), 6 (7.1%), and on down.
The medication table, now from the derived dataset — the same 414 statistics.
Open the disposition flow → the medication table →
qualification · qc/reference-report-agreement.R · runs in CI

What agrees with the 2006 report, table by table

A display is not done when it renders; it is done when three routes land on the same string for every published cell — a recomputation from the vendored transport files that never loads the package, the cell text read back out of the committed rendering, and the report itself, transcribed cell by cell and re-derived from the document at its pinned hash. Any two disagreeing is a build failure, and a self-test perturbs each route to prove the comparison can still fail.

Reference tableDisplayCells
14-1.01 Analysis populationst-populations25
14-1.02 End of studyt-end-of-study65
14-1.03 Subjects by sitet-subjects-by-site216NEW
14-2.01 Demographicst-demographics290RESHAPED
14-4.01 Exposuret-exposure84RESHAPED
14-5.01 Adverse-event incidencet-ae-incidence1,270NEW
14-5.02 Serious adverse eventst-sae-incidence20NEW
Seven displays, three ways1,970
Open the quality evidence →
kenward-roger, section 11.1 · open.csr #66, #67 · PRs #74, #73

Two things checked rather than assumed

The repeated-measures display footnotes five cells that differ from the reference at the last digit, attributed to the Kenward-Roger corrections the pipeline does not implement. The spike refits the same model with {mmrm} using them: it reproduces SAS's REML criterion to every printed digit and moves exactly one of the five cells — the three p-values stay a thousandth below the report's and one standard error still prints 0.55 against 0.56. So Kenward-Roger is not the whole explanation; the pipeline keeps its model-based fit and the footnote now says what was tried and what it found.

Section 11.1 used to say "No efficacy analysis set is defined for this report" — true of the old data lane and false of the study. Its third paragraph is rewritten against the populations table, every count a binding, and carries an approval given in review on 2026-09-02. The text-library gate held the block red until that approval existed.

The reader open at 11.1 Data Sets Analysed: three paragraphs with every number outlined as a binding — 254 patients, 86, 84 and 84 for the safety set; 234 patients, 79, 81 and 74 for the efficacy set; 254 for intent-to-treat — with the block id TXT-E3-1101 and an Edit control beneath, and 11.2 beginning below.
Section 11.1 in the reader: the efficacy analysis set stated from the study's own flag, every number bound to Table 14-1.01.
Read section 11.1 → the repeated-measures display and its footnote →
data · open.csr #76 · PR #79 · hub #320

Data: what was measured, one page per dataset

A sixth view of the study. Every dataset the package carries has a page: where the file came from, byte for byte, at a pinned commit; what the preparation layer did to it; and every display whose current results were computed from it, with the row count and hash that display recorded. The lanes page states which packaging each dataset resolves to and the measured divergences between the two; the package page carries the provenance record and the verification command. A display's header now links each dataset it read to that page with the same hash, so a reader lands on the exact input rather than on a label. Nothing on these pages is typed: they are built from the vendored package's provenance record and the provenance envelope every ARD carries.

The Data view: four tiles (13 files vendored, 9 datasets read, 30 displays reading data, pinned commit 398a6d3), the package record with its source repository, pinned commit, licence and verify command, and the first dataset cards: adsl 254 rows read by 30 displays, adae 1191 rows read by 5, advs 32139 rows read by 3, adlbc read by no display. The explorer lists Data with 17 items.
The Data view: the package record, the dataset cards, and one section per dataset with its facts, its derivations and the displays that read it.
Open the Data view → the derived medications dataset →
metadata · open.csr #77 · PR #80 · hub #320

Metadata: what was declared, in six pages

A seventh view. The study model as the pipeline reads it: arms in print order, the columns that carry an arm label, every analysis set with its flag and its subjects per arm. The document models with the documents assembled from each. Every display's two specifications with their iteration history and the custom code they share, and every value's declaration. Every text block's tier, version and approval in one list, so the report's readiness is one page. Every distinct R environment an iteration was built in, with the iterations built in it. And the requirement matrices. Each page is read from the file that declares the thing.

The Metadata view at its Study page: id CDISCPILOT01, the title, Phase 2, cut-off 2014-07-01, the source with its alternate, a link to every dataset the package carries, the reference report, the file; then the three arms in print order and the four columns that carry an arm label, planned or actual.
The Metadata view at its study page: arms, group variables and analysis sets from the study model, the file the gate reads.
Open the Metadata view → the approvals list →
inputs · pipeline · outputs · open.csr #82, #83 · hub #321

The sidebar reads as the pipeline, and every element shows its flow

Asked for on 2 September while reviewing this candidate. The explorer's collections now sit in three parts in the pipeline's order: Inputs, what people write and the pipeline reads (Data, Metadata, Text); Pipeline, the functions that turn them into outputs, each with a page of what it reads, what it writes, where its code is and every element it produced, by the code's own names; Outputs, what the pipeline writes and nobody edits (Displays, Values, Documents). The application strip follows the same order. Every display, value, text block, document, dataset and pipeline function carries a diagram in three lanes — the inputs it used, the function called, the outputs generated — every box a link and every name real, drawn from the records the pipeline already keeps: the ARD envelope, the manifest, the assembled document's inputs record, the registry.

The Pipeline view: the explorer on the left in three parts, Inputs (Data 17, Metadata 6, Text 33), Pipeline (eight functions from prepare_data() to site.mjs), Outputs; the pane showing the pipeline end to end as one flow, three input collections into eight functions into three output collections.
The explorer in three parts, and the pipeline end to end.
The demographics display's flow: inputs adsl 254 rows with its hash, analysis.yaml, display.yaml, custom.R and the study model's Intent-to-Treat Population; functions prepare_data(), build_ard(), render_display(), render_rtf() under regenerate('t-demographics'); outputs ard.json v007 548 rows with its hash, table.html, table.rtf and table-in-text.rtf with their sha256, manifest.json.
A display's flow: what it read, what ran, what it wrote, with the hashes its own records carry.
Open the Pipeline view → a display and its flow →
by the plan · v0.4.1

What this candidate does not carry