26bd8dachangelog v2.16.1 is 6 commits behind this build β last written 8d ago, so 6 changes to what the site shows are unrecorded
π Session report
The design record, and what it decided. Goal #79 had no design artifact of any kind, so the session produced three. A roadmap-state briefing established the honest picture: direction fully decided since 19 July, deliverable never written. Then Part 1 β design directions put three shells on the table (Monitor, Gallery, Study site) and recommended the study-site frame, with @jwildfire's Domain concept β RBQM and Safety as first-class lenses over one study β making the graft structural rather than cosmetic; the provenance chip emerged as the signature component, since nothing in the ecosystem composes snapshot id, data version, package pins and run status even though every ingredient exists. Part 2 β the data & config framework stated the substrate: workr pipelines, config-as-code in a forkable study repo, Project Snapshots as the only data interface, a Domain as a config entry rather than code. Its load-bearing finding, read from source: an og_run() project folder and a published snapshot branch are the same shape β local runs and Actions runs produce byte-compatible trees, so the app cannot tell them apart. Sixteen decisions (D-APP0β7, D-FW1β8), approved in session.
demo-301 v0 β built, published, verified (#134). Two ultracode workflows, nine Opus agents, an independent verifier at each stage. Stage one landed the design record on the hub, merged open.gismo PR #1 after sixteen days as a draft (the feared conflict-heavy merge turned out to be a clean fast-forward β dev had never diverged), scaffolded the study repo with its Domain registry and 53 workflows, and produced two genuine Project Snapshots with 11 rendered charts each. Stage two built the app itself (PR #2): espresso masthead, snapshot timeline, provenance chip, domain switcher, Safety gallery mounting the real safety.viz renderers, RBQM matrix, snapshot compare. The published index.html is byte-identical to a clean-clone rebuild β the demo is a build of open.gismo, not a fork of it.
Three rounds of review-driven iteration, same evening. @jwildfire reviewed the live demo and sent notes; each round shipped and republished. Round one (PR #3): the nav became a collapsible espresso sidebar, the header shrank from 322px to 82px (a quarter, beating the "third" asked for), my hand-rolled site Γ metric matrix was replaced by the real groupOverview widget from gsm.viz, and the compare page was cut. gsm.viz turned out to be unpublished on npm, so the widget is vendored as a 49-file, d3-only import closure with provenance and a re-sync script β deliberately avoiding the ~1MB Chart.js dependency every other module in that package would drag in. Round two β one raw layer: the nine safety chart workflows weren't merely reading different inputs, they described a different cohort entirely (254 CDISC-pilot participants against the KRIs' 765, zero overlap). A single seeded generator now produces the raw layer, mapping runs once, and both lanes read Mapped_* β proven, not asserted: AE totals match the KRI numerators exactly, hep-explorer's participant count equals the mapped cohort, zero orphan subject IDs. It also fixed a bug disfiguring the live app β site IDs like 0X4323 were being read by base R as hex literals, which is why every site displayed as a nonsense number.
The dashboard design session, and the research behind it. @jwildfire asked for overview and domain pages showing study-level trends and what changed since the last snapshot, naming riskiest-sites-by-SRS and QTL charts for RBQM and leaving Safety explicitly open. Two research passes fed the resulting artifact: a survey of ~20 commercial and open-source dashboards, and the primary regulatory texts read in full. The thesis that emerged: "what changed since last review" is essentially unshipped in the market β vendors lead with "real-time", which structurally precludes the question β so our snapshot architecture is the product, not a limitation. Two findings were surfaced as warnings rather than buried: a ranked riskiest-sites list is exactly what the institutional-comparison literature warns against (110 of 143 sites score zero; the top five includes sites with two and three participants), and the site risk score silently divides by 114 instead of 178 because two 32-weight KRIs are all-NA and get dropped by the weight join. Eight questions; @jwildfire answered all eight the same evening.
The overnight build β two siblings, three repos, five merges. π―π€ rbqm-overview took QTL at full scope: cloned and installed gsm.qtl, added the eligibility domain demo-301 lacked, and wired qtl0001/qtl0002 plus the QTL module report β then tuned the tolerance limits to DEMO-301's real rates so all three ICH E6(R3) states actually appear across the review period (eligibility within β trending, discontinuation trending β breached). It fixed og_run's date stamping so snapshots no longer all claim today, shipped the RBQM page (flag tiles β ranked riskiest-sites table beside a funnel plot β acceptable-ranges panel β charts β the groupOverview table), renamed Data Explorer to Config at the foot of the nav, and left change.js as the settled change-chip convention for its sibling to import rather than reinvent. π―π€ safety-metrics ran #138's feasibility gate before writing any pipeline code β the issue's own requirement, honoured β then landed #136's phase rename across three repos and built the 2_metrics phase with the three metrics @jwildfire cut to, plus the Safety page as Option A with its case-review queue fed by those participant-level flags.
Overnight, the framework caught up with the work. Two things the build exposed got fixed the same night. The study PR was refused by the merge guard because demo-301 was not in the merge policy β correct behaviour, but it revealed that adding a repo meant editing two files that had already drifted apart. At @jwildfire's direction that became a requirement (#140) and then a shipped unification: merge-policy.json and autonomy-grants.json are retired into one scripts/policy.json where a repo gets one decision β its profile β branch roles rather than branch names, protected as the default for anything not explicitly promoted, and the file inside its own carve-out so PRs touching it never merge unattended (obot.agent#61). The session-command family also grew /session-idea, /session-reviews and short /s-* aliases (obot.agent#64). The wrapup itself gained two rules at his direction β actionable blockers and risks now get filed as tracked issues rather than living as prose in an entry that scrolls off the news page (obot.agent#71), and every documented risk carries a nested proposed mitigation (obot.agent#72) β a risk without a fix is a complaint, and the session that just hit it is the one best placed to propose the fix. The four issues below are the first batch. Separately, @jwildfire opened obot.agent#62 carrying the gsm.qtl upstream audit drafts β the defects found while wiring QTL, on their way back to Gilead-BioStats rather than living on as local patches.
og_run()).cd57bad (design record) and 4437dae (dashboard design), both deployed green and auto-registered on news Β· demo-301 main and site republished through four rounds Β· the obotclaw App installed on open.gismo and demo-301, clearing a standing blocker.