Jobs viewer redesign — decision log
Started 2026-05-10. Owner: Claude (Opus 4.7).
Why#
The jobs UI shipped in commits 42b2ef9 → 7d2e704 was functional but felt
out of place in the viewer. The rest of the viewer is editorial: Palatino
serif, cream paper, navy accent, dingbat ornaments, hero-with-kicker, quiet
page rows with chips. Jobs shipped as a dashboard: 4-cell run-ledger,
twin Settings/Outcome panels of monospaced key/value tiles, a redundant
3-cell "impact" grid pinned to every row.
The information was right; the visual register was wrong. This redesign keeps the data, swaps the register.
Design principles (held while redesigning)#
- Match the viewer's existing register. Hero kicker + serif title + muted prose deck. Ornament where a section break needs weight. Chips for taxonomy, not for state.
- One representation per fact. The old detail page showed created/updated/archived in three places — strip, settings panel, outcome panel. Pick one.
- Prose over grids. "147 runs recorded — 3 active, 142 completed" reads better than a 4-tile stat grid, and matches the "{N} pages and {M} topics indexed" line on the overview page.
- Group by day. A run history is a logbook. Group rows under "Today / Yesterday / Mar 8" labels — that gives the page rhythm without filter chrome.
- State as a dot, not a pill. Pills are loud. A
●glyph in sage/navy/burgundy + the word reads like an editorial mark. - Don't touch transcript internals. The tool-card and chat-bubble work is fine; only the surrounding chrome (avatar, section heading) changes.
Concrete shape#
List page#
[kicker] LEDGER
[title] Run history
[deck] 147 runs recorded in .almanac/runs —
3 active, 142 completed, 2 need attention.
──────── Today ────────
14:32 absorb · claude / sonnet-4
{displayTitle}
{displaySubtitle}
● Completed · +3 created, 2 updated · 3m 24s
09:14 garden · claude / sonnet-4
...
──────── Yesterday ────────
...
- Time column:
HH:MMin mono, fixed width, left. - Kicker:
operation · provider / model— small caps, accent color. - Title: serif, 18px.
- Summary: muted, two-line clamp.
- Tally line: dot + status word + impact (only non-zero counts) + elapsed. No chips here; chips are for taxonomy elsewhere.
Detail page#
[kicker] ABSORB
[title] {displayTitle}
[deck] {displaySubtitle}
[chips] ● Completed claude · sonnet-4 3m 24s absorb-target
───────────── colophon ─────────────
Started 2026-05-10 14:32 Created 3
Finished 2026-05-10 14:35 Updated 2
Provider claude / sonnet-4 Archived 0
Turns 4 Tokens 12,432
Cost $0.18 Log .almanac/runs/...
Session {providerSessionId}
[if failure]
Failure — {message}
Fix — {fix}
[if targets]
Targets
{chips of paths}
✥
Transcript · {N} events
...
- Colophon: one
<dl>, two columns on wide screens, one column on narrow. Small-capsdt, serifdd, mono only when the value is a path/hash. - Failure: standalone callout with left border in accent; not a fact row.
- Targets: chip row, separate section so it doesn't get lost in the dl.
- Ornament
✥divides above-fold metadata from the transcript, matching page header treatment elsewhere.
What I deliberately did NOT change#
jobs-transcript.jsparser andbuildTranscript/getToolCardModel.- Tool card open/close, fact grid inside tool cards, code blocks.
- API shape — pure frontend redesign.
- Status taxonomy (queued / running / done / failed / cancelled / stale).
- Color tokens. The dots reuse existing
--ca-accent,--ca-sage, and a derived burgundy for failure.
Open questions for reviewer#
- Is "LEDGER" the right kicker for the list page? Alternatives: "RUNS", "JOBS LOG". I chose "Ledger" because the viewer already uses words like "almanac" — "ledger" carries the same archival feel.
- The colophon two-column layout on the detail page — should it instead be a flowing definition list (one column, all the way down) for easier scanning? I picked two-column because the metadata count is high (10+ fields) and a single column scrolls past the fold.
- Day grouping uses local time of the user's browser. If a run crosses midnight UTC, the label is whatever the viewer's clock says. Acceptable for a local viewer; flagging in case it's not.
After-thoughts (filled in as work progresses)#
Round 1 review (claude review agent, 2026-05-10)#
Findings accepted and applied:
.ca-tool_resulttypo — but reviewer was wrong on the rename direction.tool_resultis never akindvalue (onlyread/write/edit/search/shell/ mcp/web/agent/image/unknownpernormalizeToolKind). The selector was dead. Same for.ca-tool-error. Both deleted rather than renamed.statusMark(includeLabel)confused param — accepted; flag removed, word always wraps in<span class="ca-status-word">.prefers-reduced-motionguard — accepted, added.- Elapsed duplicated in chips row and colophon — accepted; removed from colophon. Chips row is the scannable home for duration.
- Tally density — accepted; turns and tokens removed from list tally. Headline facts (status, impact, elapsed) only. Colophon carries the rest.
- Orphan-row border bug — accepted; the
nth-last-child(2):nth-child (odd)rule only worked for specific row counts. Replaced with simple:last-childand the outer<dl>border closes the block visually. display: gridno-op on.ca-log-day-list— accepted; switched todisplay: block.- Local-time comment — accepted; added at
dayKey.
Findings rejected / overridden:
- None outright. The reviewer was conservative and right on all six should-fixes. The one place I diverged was the must-fix rename: the dead selectors should be deleted, not renamed, since the kind values they purported to match don't exist.
Open questions, settled:
- "Ledger" kicker — kept. Reviewer leaned same way, flagged "Logbook" as a future option. Revisit if real users get confused.
- Two-column colophon — kept with the simpler border rule.
- Day grouping in local time — kept, comment added.