The walkthrough: DIC frames you can open, columns sized to their content, a run you can see - #200
Merged
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Four things from the first walk through the acquisition surface on the rig, and one caught on the way.
The DIC frames open
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/framesGET /api/dic/frames/{stem}.png?max=Nmaxbounds the longer side for a thumbnailThe stem is looked up in the store's own listing, never joined to a path (a traversal test pins it).
The columns
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
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 hearsEMBRYOS_UPDATE.The run, visible from anywhere
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 withRUNNING · 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 methodinit()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_UPDATEwith four embryos → strip reads4 embryos · Online.TIMELAPSE_STATE{running}→body[data-run=running], stripRUNNING · 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