One objective, seven requirements and twenty-five tasks that turn the approved design for release 1.11 into work a session can run. The issues on GitHub are the record; this page shows them in one place, with the prompt that starts the build.
| Requirement | Your feedback it answers | Mockup | If the calendar slips |
|---|---|---|---|
| 1. Tabs and the first screen | A module brings its own hex colour; otherwise the app picks an open one | 1 | Its phone-width task and welcome line go second |
| 2. The status ladder | Everything is exploratory; nothing is qualified; one label | 1, 2 | Not cut |
| 3. The R control | Streamline, minimise once loaded, and reuse the biomarker pattern | 3 | The details behind the chip go third |
| 4. The RBQM tab | A subheader like the other tabs, icons, capped columns, the log folded | 4, 5 | Not cut |
| 5. Files on the Data tab | Remove data loading from the RBQM tab | 6 | Goes first; the file box then stays where it is |
| 6. Nothing looks broken | The defects from the review, and a test that walks the demo path | Review | Not cut |
| 7. The standards in the scaffold | Make sure the design principles land in the scaffold, in the skills and agents | None | Its safety.viz task follows the code; the other two come first |
gh issue comment 401 -R jwildfire/obot.roadmap --body "Tree signed off: the seven requirements (#402 to #408) and their tasks, as filed on 2026-10-09."
Build safety.viz v1.11.0: the demo app made ready for the keynote on Wednesday 21 October. The objective is "A demo app ready to show" (jwildfire/obot.roadmap#401). Its tree is filed, and my sign-off comment is on the objective; if you cannot find one from my account, stop and ask. Run /requirement-session 402. When a requirement closes with its proof, go on to the next in the objective's order, one requirement at a time, each as its own requirement session with its own goal: 1. Tabs and the first screen (#402) 2. The status ladder (#403) 3. The R control (#404) 4. The RBQM tab (#405) 5. Files on the Data tab (#406) Requirement 6, nothing looks broken (#407), touches no file of the app's shell. Run it alongside from the start in its own worktree, and close its demo-path task (safety.viz#287) last, since its steps depend on the others. Requirement 7, the standards written into the scaffold (#408), is documents and one skill. Do its hub task (obot.roadmap#409) and its session-skill task (obot.agent#361) first, before any build, so that the rest of this build runs under them, and show me the hub diff. Write its safety.viz task (safety.viz#288) last, once the code it describes has merged. Read before building: - The objective's Boundaries, which hold the order, the cut line and what is left out. - The design. It is approved and it is the reference: https://jwildfire.github.io/obot.roadmap/reports/sv-v1.11-design-2026-10-09/ . Its source is in the obot.roadmap clone at reports/sv-v1.11-design-2026-10-09/index.html; the mockups are built from the app's own styles, so their markup and CSS can be read there. - The review behind it, for the causes of each finding by file and line at the v1.10.0 tag: https://jwildfire.github.io/obot.roadmap/reports/sv-demo-design-review-2026-10-09/ What matters most: - Extreme focus on UX and usability. Build what the mockup shows, and look at the result in a browser at 1,280 pixels wide before calling a task done. Where a mockup cannot be built as drawn, say so on the requirement and ask me; do not redesign. - No chart and no metric is added, and nothing the app computes changes. The test that holds every RBQM metric's Results rows to desktop R's, and the network tests, pass unchanged at every merge. - Nothing is labelled Qualified. - Three things the design could not verify. Check each first, before building on it, and tell me if one fails: the 100-pixel column rule on the live table that gsm.viz draws (safety.viz#278); an address for each metric (safety.viz#279); whether the biomarker library's R can report its version (safety.viz#276). - The file box leaves the RBQM tab only in the pull request that makes the Data tab take raw files (safety.viz#282). Until then it sits at the foot of the tab's Overview page. - The status label lives in src/shell.js, so every chart's evidence changes once: refresh it through the evidence-update dispatch, never locally, and open the pull request after that commit. - Reading gsm raw files is an interim path. Build the least that moving it to the Data tab needs. If time runs short, cut in the objective's order: the Data tab requirement first (#406), then the phone-width task and the welcome line of the first requirement (safety.viz#271, part of safety.viz#269), then the details behind the R chip. The status label, the RBQM tab and the defects are not cut. When the last requirement closes, open the v1.11.0 release candidate, run the review gate, build its demo page on the hub, and bring it to me by Thursday 15 October. At the end of every turn, list each task with its state.
Each opens to the text filed on 9 October. If an issue is edited later, the issue is right and this page is history.
<!-- objective-slug: demo-ready -->
@jwildfire, 2026-10-09, after reading the design review of release 1.10: "Goal is to have this next version ready for demo at keynote and good enough for people to play with, so need extreme focus on UX and usability."
Release 1.10 put everything in the app: eighteen charts, the biomarker statistics and the RBQM tab, the last two run by R in the browser. This objective adds no chart and no metric. It makes what is there read clearly to someone who has never seen it, on a shared screen at the R/Pharma keynote on Wednesday 21 October 2026 and on a stranger's laptop afterwards. The design is one published page of six desktop mockups with every change numbered (design for release 1.11), which he approved in the session of 2026-10-09 after three rounds. It rests on his feedback:
End state: on the released demo app (https://jwildfire.github.io/safety.viz/demo/) at 1,280 pixels wide, the header carries one Exploratory label that opens the disclaimer and the four-rung ladder on a click; each of the five Experimental charts and the RBQM tab carries the same label with its own reason; no tab's hex is graphite; R is started from the same control on the Biomarkers tab and the RBQM tab, and that control is a chip once R is ready; the RBQM tab has a row of metrics under the header with a status icon on each, has no file box, draws the site overview with number columns no more than 100 pixels wide, and keeps its log folded until asked for; gsm raw files dropped on the Data tab are recognised there and the RBQM tab runs on them; and the four defects found in the review of release 1.10 are gone.
Proof: a browser test in safety.viz's CI walks the keynote's demo path on the deployed dev demo at 1,280 by 720 pixels with no console error, and its screenshots are in the evidence set; every metric's Results rows still match desktop R's on the RBQM demo study; the network tests still show the study's rows are sent nowhere; every requirement below is closed with its proof comment; safety.viz v1.11.0 is tagged and its demo page is on the hub.
Ships in: safety.viz v1.11.0, milestone 2026-10-talk.
In session order:
src/app/page.js, src/app/styles.js), so their sessions run one at a time, in order. Requirement 6 changes chart files and the docs site's styles and can run alongside any of them. Requirement 7 changes documents and a skill only: its hub and obot.agent tasks can be done at any time, and its safety.viz task is written last, once the code it describes has merged.backlog milestone when its requirement closes: one R shared by the Biomarkers and RBQM tabs (unproven, and it needs a release of the biomarker library); one set of treatment-arm colours across the QT, time-to-event and biomarker charts; one casing for chart names; the status label in gsm.safety's R widgets, which arrives when that package next copies the chart library.This issue was drafted by Claude Code using Opus 5.5 from @jwildfire's feedback of 2026-10-09. The tree is signed off only by his comment here.
Someone opening the demo app for the first time should know within a few seconds whose data they are looking at, how much is here, and where to go. Today two of the six tabs have a near-black hex and read as switched off, a tab's "9 of 9" has to be worked out, nothing names the study on screen, and the only way back to the docs is a link in the footer. On a shared screen at the keynote the header is what the audience reads first.
Give every tab a colour by rule: a module that names a colour for its tab gets it, and one that names none is given the first open colour from a fixed list, so no tab is ever grey (@jwildfire, 2026-10-09: "I like modules bringing their own hex color… If they don't provide one, the app should pick an open one (not default to gray)"). Then make the header and first screen say where the reader is: the Data tab names the loaded study, a tab shows one number when every chart draws, a one-line welcome on first open says whose data this is and where to load your own, the wordmark links to the docs, and the browser tab's title follows the open view. Mockup 1 of the design shows all of it (design for release 1.11, the first screen).
Repositories: safety.viz
Not applicable: no data is involved.
Summary, from the design page's "Tab colours and navigation" group:
#c67bb6) and RBQM is amber (#c78a3b); naming a colour for either is one line (src/app/libraries.js, src/app/page.js, src/app/styles.js, scripts/app-libraries.mjs).Settled by @jwildfire in the session of 2026-10-09: the rule chooses the colours of Biomarkers and RBQM, pink and amber; neither is named.
End state: on https://jwildfire.github.io/safety.viz/dev/demo/ at 1,280 pixels wide no tab's hex is graphite (#4a525c); Biomarkers and RBQM carry the colours the rule gives them, and the biomarker chart names use the same colour as their tab; a tab shows "9", "5 of 9" or "0" with a hollow hex as described; the Data tab names the loaded study; the first open shows the one-line welcome, which closes and does not come back in that visit; the wordmark is a link to the docs home; the browser tab's title names the open view; the app and the docs site show the same favicon; the RBQM tab ends with its footnote links. At 390 pixels wide a direct link to the RBQM tab opens with that tab in view, and every tab and chart name is at least 44 pixels tall.
Proof: unit tests of the colour rule pass, covering a named colour kept, the first open colour given, the same answer on a second build, a module added at the end moving nobody, and the list running out without grey; the browser tests in tests/e2e/basic-app.spec.js cover each sentence of the end state; the demo app's requirement matrix (requirements/demo-app.md) has a row for each behaviour, with evidence refreshed by the evidence-update dispatch; a screenshot of the first screen at 1,280 pixels is in docs/evidence/basic-app/.
Ships in: safety.viz v1.11.0. Each pull request adds its line to the release notes through the release-notes skill and its checker.
This issue was drafted by Claude Code using Opus 5.5.
Anyone who opens the app, or is shown it, should be told plainly how far to trust it, in one place and one form. @jwildfire, 2026-10-09: "All of this is 'exploratory' - nothing is qualified. All results should be confirmed. That is the overall app-level disclaimer… Maybe we should add that label to charts as well. So Qualified > Exploratory > Experimental > Prototype. Nothing in this project is qualified right now." Today status shows in four looks with three wordings, four of the six Experimental things carry no mark in the app at all, and every explanation is a hover tooltip, which a phone does not have.
Replace the three tiers (unmarked, Experimental, Prototype) with a four-rung ladder and draw it with one component everywhere. The app's header carries one label, Exploratory, which gives a one-line disclaimer on hover and the full disclaimer with the four rungs on a click. A chart or tab below the app's rung carries the same label on the corner of its card, with a one-sentence reason. The docs site uses the same four words and the same component. The banners and pills that say status today are retired. Mockups 1 and 2 of the design show the label closed and open (design for release 1.11, the labels).
Repositories: safety.viz
Not applicable: no data is involved.
Summary, from the design page's "Status ladder and labels" group:
site/config.json each chart and each app tab takes one field, tier, with one of qualified, exploratory, experimental, prototype, and an optional tierNote holding the one-sentence reason. The default when tier is absent is exploratory, so the thirteen unmarked charts need no edit; the five Experimental charts, the RBQM tab and the one Prototype change a flag into the field. status stays as it is: it says whether a chart exists yet. A chart from another library is Exploratory unless that library's own list says otherwise by the same field.qualified.src/shell.js), so every chart's evidence changes: plan one refresh through the evidence-update dispatch, and open the pull request after its commit.Settled by @jwildfire in the session of 2026-10-09:
The hub requirement to remove the Experimental marking from the Time-to-Event Explorer after its external clinical review (#182) is unchanged in substance: under the ladder that chart moves up to Exploratory.
End state: on https://jwildfire.github.io/safety.viz/dev/demo/ the header shows one label reading Exploratory. Hovering it shows the one-line disclaimer; clicking it opens a panel with the disclaimer and the four rungs, the app's rung marked; Escape closes it; it can be reached and opened from the keyboard. Opening each of the five Experimental charts, and the RBQM tab, shows the same label on the card with that chart's reason; opening an Exploratory chart shows no second label. No chart draws a status banner inside itself in the app, and the RBQM tab carries no pill. On the docs site every gallery card and chart page title shows its rung with the same component, and its detail opens on a click. site/config.json holds tier and no experimental or prototype flag, and the build fails with a sentence when an entry says qualified. A chart below Exploratory drawn alone, with no host, still shows its label. The label and its panel hold at a 390-pixel viewport.
Proof: unit tests pass for the default rung, the refused qualified, and the component's open, close and keyboard behaviour; browser tests in tests/e2e/basic-app.spec.js and tests/e2e/site.spec.js cover the app label, each of the six labels below it with its reason, an Exploratory chart with none, and the docs pages; npm run evidence:check passes after the evidence-update dispatch has refreshed every chart; the demo app's requirement matrix has a row for each behaviour. The closing comment quotes the disclaimer and the six reasons as shipped.
Ships in: safety.viz v1.11.0. Each pull request adds its line to the release notes through the release-notes skill and its checker.
This issue was drafted by Claude Code using Opus 5.5.
Starting R should look and read the same wherever the app does it, take almost no room, and get out of the way once R is running. Today R is started in two places that were built one release apart: a pill at the front of the row of chart names on the Biomarkers tab and a button in a box on the RBQM tab, with two wordings, two button styles, two ways of reporting a failure, and a greyed "R started" pill that never leaves. @jwildfire on the first proposal, 2026-10-09: "The R strip is a little heavy. Streamline. Minimize once it's loaded. The approach is ok though." And on the second: "I like the R workflow in Bio.viz and would like to re-use that."
Build one R control with four states (off, starting, ready, did not start) and one set of sentences, and put it in the same place on both tabs: the right end of the chart-name row, outside the scrolling list of names. Once R is ready the control shrinks to a quiet chip that opens the details on a click. This requirement delivers the control on the Biomarkers tab and makes the component and its contract ready for the RBQM tab, whose chart-name row the RBQM requirement adds next; until then the RBQM tab's existing button takes the new sentences and failure state where it stands. R still starts only when the reader asks, and the app still starts two separate copies of R: one shared copy is left out of this release. Mockup 3 of the design shows the five states (design for release 1.11, the R control).
Repositories: safety.viz
Not applicable: no data is involved.
Summary, from the design page's "R presentation" group:
src/app/page.js and the states in src/app/r-on-request.js, with the two button styles in src/app/styles.js made one. It is placed at the right end of the chart-name row, outside the scrolling list; on a phone it stays first in the row so that it shows without scrolling.src/app/libraries.js): its phase, the step it is on when starting takes long, and what its details panel holds. The Biomarkers tab gives it a phase only; the RBQM tab will give it all three.src/app/r-on-request.js, src/app/rbqm.js). The sentence inside a biomarker chart, where the statistics will go, is cut to one short line that points at the control; the app owns that sentence, so the biomarker library does not change.Not verified in the design: whether the biomarker library's R can be asked for its version without a release of that library. If it cannot, the chip's details on that tab show what they can and the release notes say so.
End state: on https://jwildfire.github.io/safety.viz/dev/demo/, a biomarker chart shows the R control at the right end of the chart-name row, outside the scrolling list of chart names. Before a press it reads its short reason, its cost and Start R. Pressing it shows a spinner and seconds, then a chip that says R is ready; clicking the chip opens R's version, download size and where it runs. No disabled "R started" pill is left in the row, and the line inside the chart is one short sentence pointing at the control. With R's host blocked, both tabs show the same "R did not start" sentence with Try again beside it and the browser's message behind a disclosure. An R that does not answer within the stated limit leaves the tab saying so, with a control that starts R again. The control holds at a 390-pixel viewport.
Proof: unit tests pass for the four states, for the contract a tab gives the control, and for the one set of sentences; browser tests in tests/e2e/basic-app.spec.js cover a start on the Biomarkers tab, the chip and its details, a blocked host on each tab, and an R that stops answering; the network tests pass unchanged; the demo app's requirement matrix has a row for each behaviour, with evidence refreshed by the evidence-update dispatch. The closing comment names the follow-up filed for one shared R and says what was found about the console message.
Ships in: safety.viz v1.11.0. Each pull request adds its line to the release notes through the release-notes skill and its checker.
This issue was drafted by Claude Code using Opus 5.5.
The RBQM tab is the centre of the keynote's demonstration, and what it does is right. How it reads is not yet. It is the one tab with no row of names under the header, so it looks like a different kind of page; it opens on a paragraph and an empty page; its run box holds a paragraph of timings and versions that outweighs the results; the site overview spreads three columns of numbers across the whole card; and each metric's state is a word in capitals. @jwildfire, 2026-10-09: "Use icons for the Metric status… Give max widths to the chart columns… the logging component is way over-emphasized. minimize unless user wants to expand it." And on the next round: "I feel like RBQM needs a subheader (like the other modules). I like the R workflow in Bio.viz and would like to re-use that." Someone watching a shared screen should see the result first and the machinery only when they ask.
Give the tab the same chart-name row every other tab has, with the metrics as its items, and start R from the same control in the same place as the biomarker charts. This is option A of the three he was shown, picked on 2026-10-09: the row holds Overview and then one item per metric, each with its status icon; the body shows one thing at a time, the site overview or one metric's two charts. One press of Start R starts R and the metrics then run by themselves, as today. Nothing the tab computes or draws changes. The run box leaves the body: progress shows in the control and as six steps ticking off in the body, the outcome is one line above the table, and the full log is behind Run details. The site overview's number and flag columns are capped at 100 pixels. Mockups 4 and 5 of the design show the tab before, during and after a run (design for release 1.11, the RBQM tab).
Repositories: safety.viz
Not applicable: the tab runs on the same files as in release 1.10, and its data loading is the subject of the Data tab requirement.
Summary, from the design page's "RBQM tab" group and its option A:
src/app/page.js, src/app/libraries.js, src/app/rbqm-view.js). A tab may bring its own items for the chart-name row. RBQM's are Overview, then one per metric in scope, each with its status icon where a chart has its hex. Each item has an address, so a link can open the tab on one metric. With eight metrics at 1,280 pixels the items take about 610 pixels and the R control at most 427, of 1,216.Not verified in the design, and checked first by the session: the 100-pixel rule on the live table that the gsm.viz library draws (it was measured on the mockup's own table with the app's styles); that per-metric addresses extend cleanly from the app's handling of an address; and how the row behaves at phone width, where it should scroll like any other tab's.
End state: on https://jwildfire.github.io/safety.viz/dev/demo/ at 1,280 pixels wide, the RBQM tab on the pilot study has a chart-name row reading Overview and then the eight metrics, each with a status icon, with the R control at its right end. Before R the body says its one line and what the study supports. Pressing Start R runs the metrics with no second press; the control names the step and counts, and the body ticks off six steps. After the run the control is a chip, one line above the table says what ran and how long it took, and Run details and Run again are in the chip's panel, which is closed until opened. Choosing a metric in the row, or clicking its cell in the overview, shows that metric's two charts and nothing else; a metric that did not run shows R's sentence and a link to the Data tab. Each row item has an accessible name of the form "Adverse Event Rate: ran", and a link to a metric's address opens the tab on that metric. No buttons for choosing a metric remain in the body. In the site overview no number or flag column is wider than 100 pixels, the table is narrower than its card with three metrics, and on the RBQM demo study with eight metrics the row and the table both fit with no sideways scroll; the heading counts the sites; the last visible row is whole; the key to the flags is shown. The tab holds at a 390-pixel viewport.
Proof: the browser test that holds every metric's Results rows to desktop R's on the RBQM demo study passes unchanged, which is the proof that nothing computed has changed; browser tests in tests/e2e/basic-app.spec.js cover the row and its icons on both studies, one press to results, a metric's page from the row and from a cell, a metric that did not run, a direct link to a metric, the chip's panel, and the measured column and table widths; unit tests pass; the demo app's requirement matrix has a row for each behaviour, with evidence refreshed by the evidence-update dispatch; screenshots of the tab before, during and after a run at 1,280 pixels are in docs/evidence/basic-app/.
Ships in: safety.viz v1.11.0. Each pull request adds its line to the release notes through the release-notes skill and its checker.
This issue was drafted by Claude Code using Opus 5.5.
There should be one place in the app to load files. Today there are two: the Data tab for a study's standard files, and a file box on the RBQM tab for gsm's raw files. A reader who drops raw files where every other file goes gets the wrong answer: on release 1.10, Raw_SUBJ.csv dropped on the Data tab is read as the subject-level file, Raw_AE.csv as the adverse events file, Raw_PD.csv is not placed, and the RBQM tab then reads "0 of 8". @jwildfire, 2026-10-09: "Just remove the data loading from that component. People should load data in the data tab."
Make the Data tab recognise gsm raw files and keep them as they are, show there which RBQM metrics the loaded data supports, and take the file box off the RBQM tab, which keeps one line and a link. Almost everything needed is already shared: the app, not the RBQM tab, holds the raw files; the Data tab already draws a card for each; the RBQM demo study already arrives through the Data tab's study menu; and everything that decides what a file is lives in one module with no page code in it. The one real change in behaviour is routing: the Data tab's drop zone has to ask whether a file is raw before it reads it as a standard file. Mockup 6 of the design shows the Data tab in three states (design for release 1.11, the Data tab).
Repositories: safety.viz
Required domains: gsm's nine raw domains as in release 1.10, none of them required for the tab to open: Raw_SUBJ, Raw_AE, Raw_PD, Raw_LB, Raw_STUDCOMP and Raw_SDRGCOMP for the metrics; Raw_SITE, Raw_STUDY and Raw_ENROLL for the Groups table.
Required columns: what each mapping workflow's spec names, read from the copied workflow files as now and not written into the app.
Telling a raw file from a standard one: a file is a gsm raw file only when its name starts with Raw_ or its columns match exactly one raw domain. The RBQM tab's rule today places a file by its name alone, which is safe on a tab where every file is raw and wrong on a shared drop zone: it would turn the ae.csv of the "Renamed columns" demo study into Raw_AE (confirmed in the design by running the placing function on that file). Raw files are CSV; the Data tab also takes JSON, so the CSV-only rule and its sentence move with the routing.
Availability: Confirmed. The RBQM demo study and the pilot study ship with the app; a set of three raw files for the tests is cut from the RBQM demo study.
Summary, from the design page's "Data loading for RBQM on the Data tab" group:
src/app/page.js, src/app/rbqm-files.js). The Data tab's drop zone asks first whether a file is raw, by the rule above, and sends it to the loader that keeps a file as it is. A mixed drop clears a loaded demo study once and says so once. A raw file still wins over the table R would make from a standard file.src/app/libraries.js, src/app/rbqm-view.js). A tab may say "these files are mine, and here is what the loaded data supports", so the Data tab calls two functions the RBQM tab hands it and holds no RBQM knowledge of its own. The raw path can then be removed with the tab's own code when raw files go.src/app/data-panel.js). One card for RBQM says how many metrics the loaded data supports, with the same status icons as the tab and the reasons in R's own words, and a button that opens the tab. A raw file keeps the card it has today, with the raw domain it was read as named in its tag; no new table of raw files is built. For a study of standard files the card says which raw tables R makes from which file. Step three of the workflow reads "Open the RBQM tab" when raw files are loaded and no chart is ready. The drop zone says it takes both kinds of file.Settled by @jwildfire in the session of 2026-10-09: the stricter rule, as an interim path. His words: "Stricter rule is fine for now, but I honestly don't want to support that process long-term. In the future, I'm hoping to move to RAW -> SDTM -> ADaM for everything. Not in this releases though." So this requirement builds the least that moving the loading needs, and nothing that only makes sense if raw files stay.
End state: on https://jwildfire.github.io/safety.viz/dev/demo/, dropping Raw_SUBJ.csv, Raw_AE.csv and Raw_PD.csv on the Data tab shows a card for each of the three with the raw domain it was read as; the RBQM card reads "This data supports 4 of 8 metrics" with a status icon for each metric and R's sentence for each that cannot run; step three reads "Open the RBQM tab"; and pressing the run button on the RBQM tab runs those four metrics. Choosing the RBQM demo study shows nine raw file cards and 8 of 8; choosing the pilot study shows 3 of 8 and which raw tables R makes from which file. The "Renamed columns" demo study's ae.csv is still read as a standard file and its charts still draw. A raw file that is not CSV is refused with a sentence. The RBQM tab has no drop zone and no file box, and links to the Data tab from the line above its table. Nothing in the tab's results has changed.
Proof: a browser test drops the three raw files on the Data tab, runs the RBQM tab and holds each metric's Results rows to desktop R's on the same three files; browser tests cover the three Data tab states, the "Renamed columns" study and a mixed drop; the unit test that holds the sentences to desktop R passes unchanged; the network tests still show no row of the study is sent anywhere; the demo app's requirement matrix carries the moved rows, with evidence refreshed by the evidence-update dispatch. The closing comment says what the Data tab of release 1.10 did with the same three files, beside what it does now.
Ships in: safety.viz v1.11.0. Each pull request adds its line to the release notes through the release-notes skill and its checker.
This issue was drafted by Claude Code using Opus 5.5.
Nothing in a live demonstration should look broken, and nothing a stranger opens afterwards should either. The design review of release 1.10 found four things that are defects and not matters of taste: on the pilot study the Hepatic ALT Waterfall's two arm titles print on top of each other; at phone width the QT Explorer's table pushes the whole page sideways; at phone width three kinds of page on the docs site have content cut off where it cannot be reached; and the docs home page still describes itself as nine charts. Separately, nothing today checks that the path the keynote will walk works from end to end on the deployed site.
Fix the four defects, each in the chart or the site file that causes it, and add one browser test that walks the keynote's demo path on the deployed dev demo at the size of a shared screen. None of this touches the app's shell, so the session can run alongside the other requirements of the objective. The findings and their causes are in the review (design review of release 1.10, defects).
Repositories: safety.viz
Not applicable: the fixes run on the demo studies that ship with the app.
Summary, from the design page's "Defects and phone-width fixes" group:
src/hep-waterfall.js, where the panel titles are set). On the pilot study the active arm's title is every non-placebo arm joined together, too long for its panel. The titles are made to fit: shortened, wrapped or moved, with the full text still available. The chart's evidence is refreshed.src/qt-explorer.js). The table under the chart is 529 pixels wide in a 340-pixel space at phone width. It scrolls inside its own box.site/site.css). The site hides sideways overflow, so content wider than the screen is cut off. The open task to hold the chart API reference pages at a 390-pixel viewport (safety.viz#162) is done here, with the same fix for the QT Explorer's and the Hepatic Explorer's demo pages.scripts/site.mjs) says "Nine classic clinical-safety graphics". The count is taken from the site's configuration and not typed.End state: on https://jwildfire.github.io/safety.viz/dev/demo/ at 1,280 pixels wide, on the pilot study, the Hepatic ALT Waterfall's two panel titles do not overlap and each can be read. At a 390-pixel viewport the QT Explorer in the app, and on its docs page, lays out 390 pixels wide with its table scrolling inside its own box; a chart's API reference page and the Hepatic Explorer's demo page show all their content with none cut off. The docs home page's description names the number of charts the site's configuration lists. The demo path test exists and passes on the deployed dev demo.
Proof: a browser test measures the two waterfall titles' boxes on the pilot study and finds them apart; browser tests at 390 pixels hold the QT Explorer, one API reference page and the Hepatic Explorer's demo page to the viewport's width with their content reachable; a unit test holds the home page's description to the configuration's count; npm run evidence:check passes after the evidence-update dispatch; the demo path test's run on the deployed dev demo is linked in the closing comment, with its screenshots in docs/evidence/basic-app/demo-path/.
Ships in: safety.viz v1.11.0. Each pull request adds its line to the release notes through the release-notes skill and its checker.
This issue was drafted by Claude Code using Opus 5.5.
What release 1.11 decided about how the app should look and read is, today, written in one design page and six requirements. The next chart, tab or app will be built by a session that reads none of those: it reads the hub's standards, the repository's contributing guide and its skills. @jwildfire, 2026-10-09: "Make sure that these new design principles land in the scaffold. Are there tasks filed to make sure the skills/agents are updated". Until they are written where a session looks, the same things get decided again, or built the old way: a fifth look for a status label, a third way to start R, a tab with a grey hex, a status called "stable".
Write the principles into the three places a session reads, each in the repository that owns it. The hub's developer guidelines take the program-wide ones: the status ladder and its words, and how anything a person looks at is designed and checked. safety.viz's contributing guide and its port-a-renderer skill take the demo app's own conventions, written after the code that makes them true has merged. The requirement-session skill in obot.agent takes the working rule: a task that changes what a person sees is built from its mockup and looked at in a browser before it closes. One piece is already in: the hub's requirement-design skill names the annotated mockup as the recommended form for a design (added 2026-10-09).
Repositories: obot.roadmap, safety.viz, obot.agent
Not applicable: no data is involved.
The principles, each from @jwildfire's feedback in the session of 2026-10-09 on the design for release 1.11:
Where each goes:
docs/developer-guidelines.md): a section for the status ladder beside the GxP stance, a line in the definition of done for a chart saying a chart states its rung, and a short section on designing and checking what people look at, pointing at the requirement-design skill for the form. The wording is the session's draft of his words above; he reads the diff.CONTRIBUTING.md, .claude/skills/port-a-renderer/SKILL.md): a section on the demo app's conventions, and the renderer definition of done and the porting procedure both say how a chart's rung is set. Written after the status ladder, R control, RBQM tab and Data tab requirements have merged, so that it describes the code as it is.skills/requirement-session/SKILL.md): the working rule for tasks that change what a person sees, with the screenshot going into the pull request's evidence.CLAUDE.md, which points at the hub's guidelines, so the hub change reaches them.CLAUDE.md at its root, so a session there is pointed at the hub's standards only by the workspace's own file. The open issue that records this (safety.viz#224) says no agent should add the file on its own.End state: the hub's developer guidelines on main name the four rungs, say nothing is Qualified and that nothing is called stable, validated or qualified, and say how a design of something people look at is made and checked; safety.viz's CONTRIBUTING.md on dev has a section on the demo app's conventions that matches the released behaviour, and its renderer definition of done and port-a-renderer skill say how a chart's rung is set; the requirement-session skill on obot.agent's main tells a session to build a visible change from its mockup, look at it in a browser at the design's width and put the screenshot in the pull request.
Proof: the three merged changes are linked in the closing comment, each with the sentences it added quoted; grep -n -i "exploratory" docs/developer-guidelines.md in the hub, and the same in safety.viz's CONTRIBUTING.md, print the new lines; a search of the three documents for "stable" as a chart's status finds none; @jwildfire has been shown the hub diff in a comment on this requirement.
Ships in: the hub's main for the guidelines, safety.viz v1.11.0, and obot.agent v0.7.0.
This issue was drafted by Claude Code using Opus 5.5.
Written by Claude Code using Opus 5.5 from @jwildfire's feedback of 9 October 2026. He approved the design and the filing in that session; the tree is signed off only by his comment on the objective.