fix(desktop): an automation's page and the Automations list stand centred at the measure a plan is read at
Summary
Dean: "The automation editor should have its content centered left to right."
Cause. An automation's page (Automations › Personal › New automation, or an existing one) drew its name, owner line, and form card at an off-scale max-width: 780px, starting at the pane's left edge. In a wide window, all the free room ended up on the right, between the card and the Runs panel. The Automations list has the same layout: its owner groups were capped at an off-scale 820px and also sat flush left.
Fix. Both now use --reading-width (720px), the measure the plan document is read at, and margin-inline: auto, which is how .desktop-document .plan-body centres:
.automation-editor(the editor's content column) is centred in the room between the sidebar and the Runs panel..automation-group(each owner's card on the list) is centred in the room beside the sidebar.
There's no new width; the two off-scale numbers are gone. The toolbar and breadcrumbs keep their place at the left, like every other page's bar.
Widths checked:
- Wide window (1800px): the column is centred between the sidebar and the Runs panel.
- 1280px: the column already fills the room and the padding around it is unchanged, so it looks the same as before (the narrowing from 780 to 720 is only visible at the cap).
- Narrow window with the sidebar folded (900px, the overlay-sidebar tier): the column fills the room as before. Nothing overflows.
- Runs panel collapsed: the Runs panel has no collapse control; it's a fixed 340px column on every automation's page. So there's no collapsed state to check. If it gains one, the column re-centres in the wider room on its own.
An automation's page, 1800px wide
Before: 
After: 
The Automations list, 1800px wide
Before: 
After: 
1280px (unchanged: the column already fills the room) and 900px with the sidebar folded


The images are the real DesktopShell and stylesheet, built with esbuild into a small harness page and rendered by headless Chrome on Linux. The data is fixture data: workspace Acme, Automations experiment on, three synthetic automations, and no runs.
Evidence
./scripts/check.sh: exit 0 (repository contracts, typecheck, lint/knip/discarded-effect, every vitest project, builds)- Tests: this is a CSS-only change, to two rules' width and horizontal margins. jsdom lays nothing out and the repository has no browser test layer, so no test can fail without it. The renders above are the evidence. The existing
automations-page.test.tssuite passes unchanged. - Mac: CI runs only on Linux and couldn't check the Mac. I didn't run the Electron app. What I checked was the rendered layout (headless-Chrome images above). Nothing outside
desktop.csschanges. - Test count: unchanged.
Invariants
-
./scripts/check.shgreen. (CI) - JSON Schema goldens unchanged (
LUKE_UPDATE_FIXTURESnot run, or diff explained line by line). (CI) - Every behavior change has, in this PR, the test that fails without it; no change-detector test added. (manual; root
AGENTS.md"Testing"). Layout only; see Evidence. - Gateway envelope goldens unchanged. (CI)
- No new
astype assertion outside the allowlisted files. (CI via anti-slop) - No
Effect.runPromise/runSync/runForkoutside the runtime edges and the shimstools/anti-slop/effect-edges.jsonrecords. (CI viaanti-slop/no-run-promise-outside-edges) - No new
setTimeout/setInterval/new Promise/AbortController/fs.watchoutside the filestools/anti-slop/effect-edges.jsonrecords. (CI viaanti-slop/no-raw-async-primitives) - No Effect, Stream, or Layer written as a statement and dropped; a description a caller walks past runs nothing. (CI via
pnpm discarded-effect) - Test count equals the pre-PR count or the delta is listed. (manual:
vitest run --reporter=json) - Each hand-rolled file the PR replaces is deleted, or the part that remains is a permanent adaptor named in root
AGENTS.md's "The permanent adaptors" with the reason it stays. - Every
CLAUDE.md/AGENTS.mdsentence naming a changed part is edited; root pair stays byte-identical. (CI for pair existence; manual for wording) -
PRIVACY.mdunchanged, or the change is a product decision called out in the PR body. - Package
package.jsondeps match what the sources import by bare specifier;effectviacatalog:. (CI) - Barrel/door rule: no Node-reaching Effect module (
@effect/platform-node,effect/sql) behind a barrel the renderer or a web function opens. (CI: existing renderernode:grep plus a new grep for those specifiers in renderer bundles)
Notes
- Blockers or follow-up verification: please glance at an automation's page in a wide window on the Mac.
- The Runs panel's "No runs yet" becomes a centred empty state in #2832, which is independent of this PR.
🤖 Generated with Claude Code
Summary by cubic
Centers an automation's editor content and the Automations list's owner groups at --reading-width (720px), the measure a plan is read at, instead of off-scale widths flush against the left edge.
- Both columns now use
margin-inline: auto, matching the plan document's centering. - The toolbar and breadcrumbs stay left-aligned; only the content column moves.