fix(desktop): an automation's page and the Automations list stand centred at the measure a plan is read at

Merged
DA
4d ago
+9-5

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: Editor wide, before
After: Editor wide, after

The Automations list, 1800px wide

Before: List wide, before
After: List wide, after

1280px (unchanged: the column already fills the room) and 900px with the sidebar folded

Editor 1280, after
Editor 900 folded, after

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.ts suite 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.css changes.
  • Test count: unchanged.

Invariants

  • ./scripts/check.sh green. (CI)
  • JSON Schema goldens unchanged (LUKE_UPDATE_FIXTURES not 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 as type assertion outside the allowlisted files. (CI via anti-slop)
  • No Effect.runPromise/runSync/runFork outside the runtime edges and the shims tools/anti-slop/effect-edges.json records. (CI via anti-slop/no-run-promise-outside-edges)
  • No new setTimeout/setInterval/new Promise/AbortController/fs.watch outside the files tools/anti-slop/effect-edges.json records. (CI via anti-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.md sentence naming a changed part is edited; root pair stays byte-identical. (CI for pair existence; manual for wording)
  • PRIVACY.md unchanged, or the change is a product decision called out in the PR body.
  • Package package.json deps match what the sources import by bare specifier; effect via catalog:. (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 renderer node: 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.