Skip to content

The walkthrough: DIC frames you can open, columns sized to their content, a run you can see - #200

Merged
pskeshu merged 1 commit into
developmentfrom
feat/walkthrough-polish
Sep 26, 2026
Merged

pskeshu merged 1 commit into
developmentfrom
feat/walkthrough-polish

Conversation

@pskeshu

@pskeshu pskeshu commented Sep 26, 2026

Copy link
Copy Markdown
Collaborator

Four things from the first walk through the acquisition surface on the rig, and one caught on the way.

The DIC frames open

the DIC overview image is not viewable … it appears more like an icon, than a clickable image.

The strip showed the event's thumbnail at 72 px and did nothing on click. Now a frame on the strip is a button: it opens a viewer with the full frame rendered from the TIFF the orchestrator filed, arrow keys walk the series, Esc closes. Two routes serve that:

GET /api/dic/frames the live session's frames, oldest first — so a page opened after the run began hydrates from disk
GET /api/dic/frames/{stem}.png?max=N one frame as PNG; max bounds the longer side for a thumbnail

The stem is looked up in the store's own listing, never joined to a path (a traversal test pins it).

The columns

the embryos left layout has more space than needed, and the center and right one feels a bit crowded.

Three equal thirds gave the roster the room and crowded the form. Sized to what they hold now: minmax(220px, 0.75fr) 1.55fr 1.2fr.

The strip's count

why does the embryos tab say 2 embryos · Connected … once I hard refreshed it, it changed to 4.

It counted state.embryos — the image store's list, embryos that have images — and re-rendered only on a connection change. Wrong source, not merely stale. It counts the roster now, and hears EMBRYOS_UPDATE.

The run, visible from anywhere

the gently interface should appear different when an acquisition is running … as opposed to when we are idle, or setting up.

A camera's REC light is visible from across the room. The run is a state on <body> — data-run="running" | "paused" | "idle" — driven by the run's events, with a 10 s status poll as the fallback for a page opened mid-run. The strip's LIVE dot becomes the light and its text leads with RUNNING · 17 volumes · next 61 s · DIC 8; the Devices and Embryos rail items carry the light too. Paused is amber. Idle is the absence of a rule. Reduced-motion is respected.

Caught before it shipped

The first cut replaced the strip's handler by slicing from its comment to the next landmark — a thousand lines later — and deleted loadDashboardConfig() and everything between. EmbryosManager.init() then threw on its first line on every page load and the tab subscribed to nothing. The browser check caught it. Two guards now pin the class: every method init() calls must exist, and the file must keep its body.

Verified

Headless browser, seeded session, DIC routes stubbed: the strip hydrates with 2 frames from the route and takes a 3rd from a live event; frames are buttons, 110 px tall, pointer cursor; clicking one opens the viewer on the full-frame URL with the caption DIC overview · frame 2 of 3 · …; → moves to frame 3; Esc closes. EMBRYOS_UPDATE with four embryos → strip reads 4 embryos · Online. TIMELAPSE_STATE{running} → body[data-run=running], strip RUNNING · 17 volumes · next 61 s · DIC 8 · 4 embryos · Online, the LIVE dot animates, Devices and Embryos carry a dot, Plans does not; ACQUISITION_COMPLETED → idle. Acquisition columns at 1700 px: roster narrowest.

6 route tests, 10 source guards. Full suite at the 16 baseline; ruff/mypy clean.

🤖 Generated with Claude Code

Four things from the first walk through the acquisition surface on the
rig, and one thing found on the way.

THE DIC FRAMES OPEN

"the DIC overview image is not viewable … it appears more like an icon,
than a clickable image." The strip showed the event's thumbnail at 72 px
and nothing happened on click. Now a frame on the strip is a button; it
opens a viewer with the full frame rendered from the TIFF the
orchestrator filed, and the arrow keys walk the series. Two routes serve
that: GET /api/dic/frames lists the live session's frames (so a page that
opened after the run began hydrates from disk), and
GET /api/dic/frames/{stem}.png renders one, ?max=N for a thumbnail. The
stem is looked up in the store's own listing, never joined to a path.

THE COLUMNS

"the embryos left layout has more space than needed, and the center and
right one feels a bit crowded." Three equal thirds: the roster got the
room and the form did not. Sized to what they hold now — roster narrow
with a floor, the plan widest, the run in between.

THE STRIP'S COUNT

"why does the embryos tab say 2 embryos · Connected … once I hard
refreshed it, it changed to 4." The strip counted state.embryos — the
IMAGE STORE's list, embryos that have images — and re-rendered only on a
connection change. Wrong source, not merely stale. It counts the roster
now, and hears EMBRYOS_UPDATE.

THE RUN, VISIBLE FROM ANYWHERE

"the gently interface should appear different when an acquisition is
running … as opposed to when we are idle, or setting up." A camera's REC
light is visible from across the room; nothing outside the Acquisition
pane said a timelapse was on. The run is a state on <body> now —
data-run="running" | "paused" | "idle" — driven by the run's events with
a slow status poll as the fallback for a page opened mid-run. The strip's
LIVE dot becomes the light and its text leads with "RUNNING · 17 volumes
· next 61 s"; the Devices and Embryos rail items carry the light too, so
"where is it" is answered without opening either. Idle is the absence of
a rule.

FOUND ON THE WAY, AND NOT SHIPPED

The first cut of this replaced the strip's handler by slicing from its
comment to the next landmark — a thousand lines later — and deleted
loadDashboardConfig() and everything between. EmbryosManager.init() then
threw on its first line on every page load, and the tab subscribed to
nothing. Caught by the browser check before commit. Two guards now pin
the class: every method init() calls must exist, and the file must keep
its body.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@pskeshu
pskeshu merged commit 1348b4f into development Sep 26, 2026
2 checks passed
@pskeshu
pskeshu deleted the feat/walkthrough-polish branch September 26, 2026 04:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant