P3 · M4 API and screens¶
Running since 2026-10-30 · milestone M4 of step P3 (P2 §4) · board gap G1 done (Paper chrome on the lite shared components), merged as #85 · board gap G3a done (Paper page bodies of the run boards), merged as #88 · board gap G2 done on autopilot/P3-G2 (the launch boards) · Tasks 17–21, G4 and G5 to do
One Progress page per milestone, opened with its first PR and closed with its done proof (P2 §0). This page covers M4, "API and screens", and the board gaps that come before Task 19.
Tasks¶
| Task | Plan | Depends on | Branch | Status |
|---|---|---|---|---|
| G1 · Paper chrome on the shared lite-board components | P2 §10.1 | none | autopilot/P3-G1 |
done, merged as #85 |
| G2 · The launch boards: engine buttons and path-or-Git | P2 §10.2 | G1 | autopilot/P3-G2 |
done |
| G3a · Paper page bodies of the run boards | P2 §10.3 | G1 | autopilot/P3-G3a |
done, merged as #88 |
Why¶
- P2 §10.1: G1 restyles the four shared lite components before Task 19, so the 30 lite boards and the code of G4 share one shell.
- The look: the GO of 2026-10-29 (decision log, change 5) makes depictio's Paper chrome Spectio's look (ui-spec §7).
- The placeholders: Thomas answered inbox #72 with (b). Search, notifications and the avatar are shown as disabled placeholders, not left out (follow-up FU-P3-02).
What changed¶
G1 · Paper chrome on the shared lite-board components¶
Three of the four shared components in design/ui-canvas/ now draw the Paper shell of ui-spec §7. Thirty lite boards import them, and none of the boards was edited: the components keep their props (crumbs, active, title, sub, back).
LiteTopbar(floating top bar):- Breadcrumbs: the
crumbsprop ("Runs / rnaseq-2026-10-25 / Tasks") becomesHome › Runs › rnaseq-2026-10-25 › Tasksin a<nav aria-label="Breadcrumb"><ol>. Every crumb but the last is a link to its board; the last hasaria-current="page". Below 1000 px, the crumbs between Runs and the last fold into "…", the last crumb ellipsizes, and the search box becomes an icon button. A crumb with no board is plain text. - Theme toggle:
<button role="switch" aria-checked="false" aria-label="Dark theme">. - Search (⌘K), notifications and the account avatar, as Thomas answered inbox #72 (b): native
<button disabled>controls named "Search (not in 0.0.1)", "Notifications (not in 0.0.1)" and "Account (not in 0.0.1)". They are dimmed and never take focus. The search box also shows "Search (not in 0.0.1)" as text. - The "SLURM · server on login1" chip moved to the sidebar foot.
- Breadcrumbs: the
LiteSidebar(foldable sidebar):- A "WORKSPACE" eyebrow and a fold button,
<button aria-expanded aria-controls="lite-nav-items">. - A new prop,
collapsed, draws the folded 92 px icon rail, with the server status as "✓ on". The labels stay readable by a screen reader. - The foot shows the server status: "Spectio 0.0.1 · online", then "SLURM · server on login1 · your account amartin".
- The Runs count reads "Runs, 6 active runs" through visually hidden text.
- A "WORKSPACE" eyebrow and a fold button,
MLiteTopbar(phone): the same controls in the 48 px row: the server chip, the disabled search, notifications and account buttons, and the theme switch (44 px). Below 390 px the search and notifications placeholders are hidden, so the row fits at 320 px.MLiteTabbar: unchanged. It already was the floating bottom tab bar of Paper.
G2 · The launch boards: engine buttons and path-or-Git¶
What changed. LiteLaunch, LiteLaunchSnakemake and MLiteLaunch in design/ui-canvas/ now draw the launch form of ui-spec §4.6 (note 2026-10-29) and P1 Assumption 2:
- Page head (desktop), as in ui-spec §7: a 48 px icon tile with the sidebar's Launch tint, "Launch a workflow" in the Outfit heading font, one line of description, and Launch on the right. A second Launch ends the aside, which stays in view from 1200 px; both share one state, and when disabled both show the reason ("Fill the required field: samples").
- Pipeline: one field takes an absolute path, a GitHub or nf-core name, or an
https://orsshURL. Beside it are Revision (Git only) and Load. For a path, Revision is disabled and says why.LiteLaunchSnakemakeshows a Git repository at a revision: Revision is required, and a short name is read as GitHub before Load ("Read as GitHub: https://github.com/…"). - Engine: two native
<button aria-pressed>, Nextflow and Snakemake, in a group labelled "Engine". The guessed one is pressed and shows a check mark. "Guessed from main.nf · change it if the guess is wrong" sits beside them; on a prefilled launch it reads "Nextflow, as in rnaseq-2026-10-25". - States, drawn as cards at the foot of each board:
- no guess, both files found (
LiteLaunch,MLiteLaunch): no button is pressed and Launch waits for a choice; - no guess, neither file found (
LiteLaunchSnakemake): Launch stays disabled with "No main.nf or Snakefile in this directory: check the path", whatever is pressed; - guess overruled (
LiteLaunch): Snakemake pressed on a directory with no Snakefile, so Launch says it will refuse; - Git (
LiteLaunchSnakemake): before Load with no revision, fetching, and not fetched (revision not found, with the other fetch failures listed); - refused input, following api §5: a
file://URL (LiteLaunch,MLiteLaunch) and a revision that starts with-(LiteLaunchSnakemake).
- no guess, both files found (
G3a · Paper page bodies of the run boards¶
The run boards and their phone twins now open with the page head of ui-spec §7: a tinted 48 px icon tile, the Outfit h1, a one-line description and the primary action on the right. LiteHome and LiteRuns already had it and are unchanged.
- Run heads (
LiteRunDetail,LiteRunDetailSnakemake,LiteRunObserved, and the page behindLiteCancelDialog):- the pipeline logo sits in a 48 px tile with the Runs tint (
--sp-violet-50), in place of a white bordered 52 px tile; - the run name wraps instead of overflowing, and the state line wraps as one sentence;
- Cancel run and Copy form one group on the right. The page behind the cancel dialog shows Copy too.
- the pipeline logo sits in a 48 px tile with the Runs tint (
- States boards (
LiteStates,LiteStatesRun): a tile in the Runs tint and a one-line description. The rest of the old description is a caption under the panels. The run-detail loading skeleton draws the tile too. - Phone, top-level pages:
MLiteRunskeeps its title and "live, updated" line in the compact top bar, as ui-spec §4.11 asks; it is unchanged.MLiteHomealready had its h1 in the body. It gains a tile in--sp-indigo-100, the-100step because the phone page is grey.- Its description now reads "4 running, 1 queued, 1 cancelling · live, updated 4 s ago", shortened from "4 runs running, 1 queued and 1 cancelling" to fit beside the tile.
- Phone, run pages (
MLiteRunDetail,MLiteRunObserved,MLiteCancelSheet):- the back link, h1 and state line stay in the top bar;
- the white run card starts with the pipeline in a 48 px tile (
--sp-violet-50); - the card behind the cancel sheet shows Copy too.
- Two G1 minors:
- UX-G1-12,
LiteTopbar: below 1000 px, only the crumbs before the run fold. The link back to the run stays: "Home › … › rnaseq-2026-10-25 › Tasks". - UX-G1-13,
MLiteTopbar: the search and notifications placeholders are 44 px wide, and the row gap is 2 px.
- UX-G1-12,
crumbsprops (UX-G1-11): no G3a board names an in-page tab in its crumbs.LiteTaskFilesStatesdoes ("… / Tasks"); it is a G3b board.
Evidence¶
-
Renders: each board was rendered with
node tools/canvas/render.jsand looked at:- the 19 desktop boards at 1440 × 1180:
LiteCancelDialog,LiteHome,LiteLaunch,LiteLaunchSnakemake,LiteLegend,LiteReportViewer,LiteResults,LiteRunActions,LiteRunDetail,LiteRunDetailSnakemake,LiteRunFailed,LiteRunLogs,LiteRunObserved,LiteRunTasks,LiteRuns,LiteStates,LiteStatesRun,LiteTaskFiles,LiteTaskFilesStates; - the 11 phone boards at 390 × 844:
MLiteCancelSheet,MLiteHome,MLiteLaunch,MLiteResumeSheet,MLiteRunDetail,MLiteRunFailed,MLiteRunLogs,MLiteRunObserved,MLiteRunTasks,MLiteRuns,MLiteTaskFilesSheet; LiteRunTasksagain at 1024 px, the four components alone, and the folded sidebar.- No overlap or clipping. The page bodies sit where they did before.
- the 19 desktop boards at 1440 × 1180:
-
Review:
reviews/code/P3-G1.md.- Self-check by the worker session, against the
ux-reviewerbrief: one major (the top bar's global link colour) and one contrast minor, both fixed. -
Independent
ux-reviewer, round 1: changes (2 majors, 4 minors).- Breadcrumbs overlapped between 768 and 1199 px. Below 1000 px they now fold into "…", and the search box becomes an icon.
- The phone row overflowed below 377 px. Below 390 px the search and notifications placeholders are now hidden.
- Three minors are fixed: the folded rail is 92 px with a check glyph, the logo link has no
aria-label, and an unmapped crumb is plain text. - One spec minor (UX-G1-09, a ui-spec §2 note) is deferred to the next
/apply-findings.
-
Independent
ux-reviewer, round 2: approve on135f2d2, after re-rendering at 768, 900, 1024 and 1440 px (desktop), at real 320, 360 and 390 px widths (phone top bar), and the folded rail. Two new minors (UX-G1-12, UX-G1-13) are handed to G3a.
- Self-check by the worker session, against the
-
Screenshots: each of the four regenerated images was looked at. They show the new chrome:
- the breadcrumbs, the disabled search box, notifications and avatar, and the theme switch;
- the "WORKSPACE" eyebrow and the server status in the sidebar foot;
- on the phone, the server chip and the controls in the first row.
The alt texts in mvp-0.0.1 §2 describe the page bodies, which did not change, so they are kept.
-
Docs gate:
python3 tools/docs/check.pyanduvx --with mkdocs-material mkdocs build --strictpass. -
G2:
- Renders:
LiteLaunchandLiteLaunchSnakemakeat 1440 × 1180 and 1024 × 1180, and again 4600 to 5200 px tall to read the state cards;MLiteLaunchat 390 × 844, and a scratch copy 3400 px tall for its state cards (deleted after the render). Each was looked at after every board change. A script found no duplicateidand no reference to a missingid. -
Review:
reviews/code/P3-G2.md.- Self-check against the
ux-reviewerbrief: changes; three board fixes. - Independent
ux-reviewer, round 1: changes (2 majors, 6 minors). Launch is back at the end of the aside, and the neither-file state no longer offers a choice that cannot work. The minors added the Git states, the "Read as GitHub" line, the required revision and the prefilled engine line. - Independent
ux-reviewer, round 2: approve onefe9e31(0 blockers, 0 majors, 3 minors and a nit). Two minors and the nit are fixed in3c955ae; UX-G2-17 (a sticky aside taller than a short screen) goes to Task 19. - Independent
doc-reviewer: changes (9/14), then approve (12/14) after this page was revised.
- Self-check against the
-
Docs gate:
python3 tools/docs/check.pyreports 0 failures anduvx --with mkdocs-material mkdocs build --strictpasses.
- Renders:
-
G3a:
-
Renders: each board was rendered with
node tools/canvas/render.jsand looked at.- Desktop, at 1440 × 1180, 1024 × 800 and 900 × 800:
LiteRunDetail,LiteRunDetailSnakemake,LiteRunObserved,LiteCancelDialog,LiteStatesandLiteStatesRun, plusLiteTaskFilesStatesandLiteResultsfor the folded breadcrumbs. - Phone, at 390 × 844:
MLiteHome,MLiteRuns,MLiteRunDetail,MLiteRunObservedandMLiteCancelSheet. Before the fix round,MLiteTopbarwas also rendered alone at 360 px. - No overlap or clipping.
- Desktop, at 1440 × 1180, 1024 × 800 and 900 × 800:
-
Review:
reviews/code/P3-G3a.md.- Self-check by the worker session, against the
ux-reviewerbrief: it found UX-G3a-01 to -07. -01 to -03 were fixed in127fc46, -04 was withdrawn, and -05 to -07 are open. - Independent
ux-reviewer, round 1 on127fc46: changes (1 major, 5 minors), all fixed. The major:MLiteRunshad moved its title and "live, updated" line out of the compact top bar (ui-spec §4.11), so they scrolled away; it is back to base. - Independent
ux-reviewer, round 2 on235c52c: approve (0 blockers, 0 majors, 1 new minor, UX-G3a-14, for/apply-findings). - Independent
doc-reviewer: approve, 11/14.
- Self-check by the worker session, against the
-
Docs gate:
python3 tools/docs/check.py(0 failures) anduvx --with mkdocs-material mkdocs build --strictpass.
-
Figures and media¶
- Screenshots:
lite-run-detail,lite-launch,lite-runsandlite-run-detail-phonewere regenerated. Their boards import the restyled components, and they appear in mvp-0.0.1 §2. They were made withpython3 tools/media/shots.py run --shot <id> --theme light(manifest entryui-shots), as in UILITE and APPLY7. A PR that carries them needs thescreenshotslabel. - Screenshot, G2:
lite-launchwas regenerated again after the G2 board changes, withpython3 tools/media/shots.py run --shot lite-launch --theme light, and looked at. It shows the page head, the Pipeline and Revision fields and the Engine buttons. Its alt text in mvp-0.0.1 §2 still names "the detected engine", so it is stale (UX-G2-06). - Screenshots, G3a:
lite-run-detailandlite-run-detail-phonewere regenerated after the fix round withpython3 tools/media/shots.py run --shot <id> --theme light, and looked at. They show the tinted tile in the run head with Cancel run and Copy on the right, and on the phone the pipeline tile at the top of the run card. Their alt texts in mvp-0.0.1 §2 still hold.lite-runswas not regenerated, becauseLiteRunsdid not change. - Sketch: this milestone's sketch pair, light and dark, is added before the page gets
status: done.
Findings and open questions¶
- Minors left open:
- the phone placeholders show no words;
- folding is drawn by a prop, and G4 makes it work;
- the theme switch has no dark palette yet (G4);
- UX-G1-09 waits for the next
/apply-findings. It covers the ui-spec §2 note for #72 (b) and the phone theme switch, and the 2026-10-28 phone note (ui-spec §2), which still says the first row holds only the logo and the login node.
- The Progress index cannot link the P3-M* pages yet:
hooks/progress.py_tablelooks only forW5/P3.md. This is follow-up FU-P3-01, already open. - UX-G1-12 (below 1000 px the folded crumbs, including the link back to the run, cannot be reached) and UX-G1-13 (phone placeholders 40 px wide, not 44) are fixed in G3a.
- G2 open items (record):
- to the next
/apply-findings: UX-G2-04 (major:GET /workflows:inspectdoes not return the engine files it found; it must land before Task 17), UX-G2-05 (the ui-spec §4.6 wording), UX-G2-06 (the mvp-0.0.1 §2 note and alt text) and UX-G2-14 (G5's tests onGET /workflows:inspect); - to Task 19: UX-G2-07 (two toggle buttons for a one-of-two choice), UX-G2-08 (the disabled Revision field takes no focus), UX-G2-17 (the sticky aside on a short screen) and whether an edit cancels a fetch.
- to the next
- G3a items left open (
reviews/code/P3-G3a.md):- for the next
/apply-findings:- the tablet range of ui-spec §4.11 (768–1199 px, folded sidebar) is not drawn on the desktop boards; the shell code follows in Task 19 and G4;
- a tint rule for page-head tiles:
-100on the grey phone page,-50on white; - UX-G3a-14, a ui-spec §4.11 note: on the phone, Home shows its greeting as a body page head and the top bar carries no title; every other top-level page keeps the title and subtitle in the compact top bar;
- for G4: the runs table scrolls sideways at 1024 px (UX-G3a-05), and the phone run title and state line are cut with an ellipsis (UX-G3a-06);
- for G3b: the top bar's global link colour (UX-G3a-07), and the "… / Tasks" crumb of
LiteTaskFilesStates.
- for the next