Surfaced messages: 21 presentation designs

How should conduit show the mid-turn agent messages that Jev decides the user should see? Each design shows the same turn in two states: Live (the agent is still working on its third stretch of work) and Settled (the turn is done and the final reply is in).

Decision bead: conduit-test-ahu8.8. Plan: docs/plans/2026-09-26-jev-message-surfacing.plan.md. With the feature off, every design falls back to today: the activity log only, with the final reply below it.

The scenario (identical in every design)
  1. User: "The session bar title overflows on iPhone. Fix it."
  2. Work 1 (12s): Searched session-bar-title, Read SessionBar.svelte, Read Header.svelte. Status line folded into the log: "Let me look at the session bar."
  3. Surfaced A (a finding): "Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track."
  4. Work 2 (41s): Edited SessionBar.svelte, Ran pnpm test:unit. Folded: "Now running the tests."
  5. Surfaced B (a decision): "Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing."
  6. Work 3 (Live: running for 9s; Settled: 23s): Ran pnpm acceptance:visual:capture, Ran git status.
  7. Final reply (Settled only): "Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header."

Best practice

Conventional patterns from mature chat and agent UIs. Low risk and familiar.

Best practice

B1 · Interleaved prose

Surfaced messages are just assistant prose, written between the activity lines in the order they happened.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
›Worked12s · 1 search · 2 reads

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

›Worked41s · 1 edit · 1 run

Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

›Working9s — Running pnpm acceptance:visual:capture
$Runningpnpm acceptance:visual:capture9s
Settledturn complete
The session bar title overflows on iPhone. Fix it.
›Worked12s · 1 search · 2 reads

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

›Worked41s · 1 edit · 1 run

Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

›Worked23s · 2 runs1m 25s · $0.41

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Placement
Inline, in chronological order: each surfaced message sits directly after the activity line for the work that produced it.
Live
A new surfaced message appears as a paragraph when Jev flags it, and the next stretch of work opens a fresh activity line beneath it. Only the running line is highlighted.
Settled
Unchanged, apart from the last activity line settling and the final reply appearing below it. Surfaced messages and the final reply look identical.
Collapsible
No. Surfaced messages are permanent prose. Only the activity lines expand, as they do today.
Mobile
Degrades cleanly because it is only prose and existing activity lines. The meta on each line truncates first.
Trade-off
Nothing marks the final reply as the answer. On a long turn the reader has to scan every paragraph to find the conclusion, and a question asked mid-turn looks just as settled as the wrap-up.
Best practice

B2 · Interim voice

The same chronological interleave, but surfaced messages are set in a quieter interim voice so the final reply stays the loudest thing in the turn.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
›Worked12s · 1 search · 2 reads
Update ·

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

›Worked41s · 1 edit · 1 run
Update ·

Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

›Working9s — Running pnpm acceptance:visual:capture
$Runningpnpm acceptance:visual:capture9s
Settledturn complete
The session bar title overflows on iPhone. Fix it.
›Worked12s · 1 search · 2 reads
Update ·

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

›Worked41s · 1 edit · 1 run
Update ·

Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

›Worked23s · 2 runs1m 25s · $0.41

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Placement
Inline and chronological, after the activity line that produced each message, like B1.
Live
Each surfaced message arrives in the interim treatment: secondary text colour, 12px, a 2px chip-coloured left rule, and a tiny "Update · 14:02:22" label.
Settled
The interim messages stay as they are. The final reply lands at full size and full contrast, so the eye goes to the answer first.
Collapsible
No. Interim messages are always visible. Only the activity lines expand.
Mobile
The rule and label cost about 14px of width. The 12px body is the smallest size that stays readable on a phone, so it cannot shrink any further.
Trade-off
Quiet reads as unimportant. B carries a real question ("Say if you'd rather keep the old spacing") and gets demoted just when it needs attention. Fixing that means tone by kind (questions louder), which starts the style drift this design is meant to avoid.
Best practice

B3 · Updates below the log

One activity line covers the whole turn, with the surfaced messages listed under it as a compact, timestamped updates list.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
›Working1m 02s — Running pnpm acceptance:visual:capture
Updates · 2
  1. Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

  2. Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

Settledturn complete
The session bar title overflows on iPhone. Fix it.
›Worked1 search · 2 reads · 1 edit · 3 runs1m 25s · $0.41
Updates · 2
  1. Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

  2. Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Placement
Below a single turn-wide activity line. All three stretches share one strip, with a thin white tick at each point where an update was surfaced.
Live
The line reads "Working 1m 02s — Running …". Updates are appended to the list as Jev flags them, and the newest gets an accent "new" dot and full-contrast text until the next one arrives.
Settled
The line settles to the turn totals ("1 search · 2 reads · 1 edit · 3 runs", 1m 25s · $0.41). The list keeps its timestamps without the dot, and the final reply follows.
Collapsible
The activity line expands to the merged step log. The updates list does not collapse.
Mobile
The time column shortens to HH:MM (44px) and messages wrap beside it. One activity line instead of three saves vertical space on a phone.
Trade-off
Causality is lost. The list no longer says which work produced which update, and the strip ticks are the only link. Expanding the merged log also shows every step of the turn at once.
Best practice

B4 · Digest above the log

Surfaced messages are gathered into a digest card above a single activity line, so what the agent has learned comes before how it got there.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
What it found so far2
  • Finding ·

    Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

  • Decision ·

    Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

›Working1m 02s — Running pnpm acceptance:visual:capture
Settledturn complete
The session bar title overflows on iPhone. Fix it.
Along the way2
  • Finding ·

    Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

  • Decision ·

    Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

›Worked1 search · 2 reads · 1 edit · 3 runs1m 25s · $0.41

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Placement
Above one turn-wide activity line, in a digest card directly under the user's prompt. Each item carries Jev's kind (Finding, Decision, Risk, Question) and a time.
Live
The card is headed "What it found so far" with a live pulse and a count. New items are appended at the bottom of the card while the activity line below keeps running.
Settled
The header changes to "Along the way", the pulse and fill go away, and the card becomes a plain outline. The activity line settles to the turn totals, and the reply sits last.
Collapsible
The card does not collapse. The activity line expands to the merged step log as today.
Mobile
The card goes full width and items stack. On long turns the live card should cap its height and pin the newest item, so the activity line stays in view.
Trade-off
Reading order is inverted, with conclusions above the work that produced them, and the card is visually heavier than the reply it precedes. The digest also grows and pushes the live activity line down the screen during the turn.
Best practice

B5 · Collapse on settle

While the turn runs, updates are shown in full. When it settles, they fold into a single "2 updates along the way" row so only the final reply stays open.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
›Worked12s · 1 search · 2 reads

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

›Worked41s · 1 edit · 1 run

Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

›Working9s — Running pnpm acceptance:visual:capture
$Runningpnpm acceptance:visual:capture9s
Settledturn complete · click the row
The session bar title overflows on iPhone. Fix it.
›Worked12s · 1 search · 2 reads

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

›Worked41s · 1 edit · 1 run

Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

›Worked23s · 2 runs1m 25s · $0.41
›2 updates along the way Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1…Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended…

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Placement
Live: inline and chronological, as in B1. Settled: one disclosure row after the stacked activity lines and before the final reply.
Live
Fully expanded, full-contrast prose between the activity lines, so nothing is hidden while the user is watching.
Settled
On settle, the surfaced messages drop out and the three activity lines stack tightly. A dashed row, "2 updates along the way", shows a one-line ellipsised preview of each.
Collapsible
Yes, the surfaced messages as a group. Collapsed, the row shows a count and one preview line per message. Expanding puts each message back between the activity lines where it happened, and the row changes to "Hide". Settled turns start collapsed.
Mobile
Works well on a phone: a settled turn is three thin lines, one row and the reply. The previews truncate to the viewport width.
Trade-off
B's open question ("Say if you'd rather keep the old spacing") ends up behind a click, and the collapse shifts the layout at the moment the reply lands. The fix, keeping Question and Risk kinds out of the fold, adds a rule users have to learn.
Best practice

B6 · Timeline rail

A PR-style timeline rail joins the turn: small dots for stretches of work, speech nodes for surfaced messages, and a solid node for the final reply at the end.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
›Worked12s · 1 search · 2 reads

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

›Worked41s · 1 edit · 1 run

Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

›Working9s — Running pnpm acceptance:visual:capture
$Runningpnpm acceptance:visual:capture9s
Settledturn complete
The session bar title overflows on iPhone. Fix it.
›Worked12s · 1 search · 2 reads

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

›Worked41s · 1 edit · 1 run

Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

›Worked23s · 2 runs1m 25s · $0.41

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Placement
Inline and chronological, on a shared left rail. Activity lines hang from small dot nodes and surfaced messages from larger speech-bubble nodes.
Live
The running line's node is amber with a soft ping, and the rail below it keeps going as a dashed amber tail that flows downward and fades out, to show the turn is still in progress.
Settled
The tail is gone, all dots turn grey, and the rail ends at a solid node with a checkmark next to the final reply, so the reply reads as where the turn landed.
Collapsible
No. Surfaced messages always show. Activity lines expand in place and the rail stretches to fit.
Mobile
The rail gutter shrinks from 30px to 22px (16px nodes, rail at 8px), which costs about 6% of a 390px width. Nodes stay aligned to the first line of each item as text wraps.
Trade-off
It adds a new visual layer to every turn, which is heavy for a one-stretch turn with nothing surfaced. The gutter permanently narrows the prose column, and nesting (subagents, tool output) inside a rail gets fiddly.
Best practice

B7 · Clamped previews

Surfaced messages stay in place but are clamped to two lines with "Show more". The newest opens in full while the turn runs, and the final reply is never clamped.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
›Worked12s · 1 search · 2 reads
Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.
›Worked41s · 1 edit · 1 run
Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.
›Working9s — Running pnpm acceptance:visual:capture
$Runningpnpm acceptance:visual:capture9s
Settledturn complete
The session bar title overflows on iPhone. Fix it.
›Worked12s · 1 search · 2 reads
Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.
›Worked41s · 1 edit · 1 run
Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.
›Worked23s · 2 runs1m 25s · $0.41

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Placement
Inline and chronological, after the activity line that produced each message, like B1.
Live
The newest surfaced message is fully open, with a "Show less" control, and older ones are clamped to two lines with an ellipsis and "Show more". When the next one arrives, the previous one clamps.
Settled
Every surfaced message clamps to two lines. The final reply is never clamped, so it is the only full-length prose in the turn.
Collapsible
Yes, each message on its own. Collapsed shows the first two lines, an ellipsis and "Show more". Default: open for the newest while live, clamped once settled. The toggle is hidden when a message already fits in two lines.
Mobile
At about 45 characters per line, two lines is roughly one sentence, which suits a phone. Expanded state is kept per message across re-renders.
Trade-off
The clamp cuts off the end of a message, which is where the ask usually is: "Say if you'd rather keep the old spacing" sits on line 3 of B and gets hidden once the turn settles. Clamped text can also look like a rendering bug.

In between

Familiar foundations with one novel idea each.

In between

M1 · Chapter headers

Each surfaced message titles the stretch of work that produced it, so a settled turn reads as a table of contents of conclusions.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
01

FindingFound it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

›Worked· 1 search · 2 reads12s
·Let me look at the session bar.
⌕Searchedsession-bar-title700ms
≡ReadSessionBar.svelte900ms
≡ReadHeader.svelte600ms
02

DecisionUnit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

›Worked· 1 edit · 1 run41s
✎EditedSessionBar.svelte6s
·Now running the tests.
$Ranpnpm test:unit31s
03

Working…

⌄Working9s — Running pnpm acceptance:visual:capture
$Runningpnpm acceptance:visual:capture8s ⋯
Settledturn complete
The session bar title overflows on iPhone. Fix it.
01

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

›finding· 12s · 1 search · 2 reads
·Let me look at the session bar.
⌕Searchedsession-bar-title700ms
≡ReadSessionBar.svelte900ms
≡ReadHeader.svelte600ms
02

Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

›decision· 41s · 1 edit · 1 run
✎EditedSessionBar.svelte6s
·Now running the tests.
$Ranpnpm test:unit31s
03

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

›reply· 23s · 2 runs1m 25s · $0.41
$Ranpnpm acceptance:visual:capture19s
$Rangit status200ms
Placement
Above the work it concluded. Each message is a chapter title that owns the step group beneath it, so each block reads conclusion first, then evidence. A numbered rail joins the chapters.
Live
Finished chapters show their title over a compact collapsed activity line. The current chapter is untitled ("Working…", pulsing rail dot) and open, showing the live step.
Settled
Chapters collapse to their titles plus a one-line "finding · 12s · 1 search · 2 reads". The final reply closes the book as chapter 03 and owns work 3, with the turn bill on its line.
Collapsible
Yes. Each settled title is a <details> that opens its own step log, closed by default. The title never hides.
Mobile
Drop the number gutter and keep the rail as a 2px left border. Titles wrap and the owned-work line becomes a single tappable row.
Trade-off
Reading order is no longer chronological (conclusion above cause), and it depends on Jev: a stretch with no surfaced message has no title and has to fall back to an untitled chapter.
In between

M2 · Margin notes

Surfaced messages sit in a right-hand margin like doc comments, each ticked to the step it followed, so the main column stays pure activity plus reply.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
⌄Working1m 02s — Running capture
·Let me look at the session bar.
⌕Searchedsession-bar-title700ms
≡ReadSessionBar.svelte900ms
≡ReadHeader.svelte600ms
✎EditedSessionBar.svelte6s
·Now running the tests.
$Ranpnpm test:unit31s
$Runningpnpm acceptance:visual:capture8s ⋯
Finding0:12
Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.
more ⌄
Decision0:53
Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.
more ⌄
Settledturn complete
The session bar title overflows on iPhone. Fix it.
›Worked· 1 search · 2 reads · 1 edit · 3 runs
⌕Searchedsession-bar-title
≡ReadSessionBar.svelte
≡ReadHeader.svelte
✎EditedSessionBar.svelte
$Ranpnpm test:unit
$Ranacceptance:visual:capture
$Rangit status

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

1m 25s · $0.41
Findingafter Header.svelte
Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.
more ⌄
Decisionafter test:unit
Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.
more ⌄
Placement
A 60/40 split: the activity log and final reply on the left, surfaced messages in a margin column on the right. Each note's top lines up with the step it followed, joined by a connector tick.
Live
The single live activity line stays expanded so notes have steps to anchor to. A new note slides into the margin beside its step. The log loosens its row spacing next to a note but keeps its order.
Settled
The log collapses to one line and the notes stack beside it and the reply, each labelled with its anchor ("after test:unit"), like resolved doc comments.
Collapsible
Notes are clamped to 3 lines and open in place (<details>) to show the full text. The log collapses on its own. Notes never disappear.
Mobile
No margin at 390px. Notes drop inline under their anchor step as indented cards with a left rule, so the result is interleaving by another name.
Trade-off
Notes are wordier than log rows, so anchors spread the log or notes spill past it. Alignment means little once the log collapses, and the most important text sits in the narrowest column.
In between

M3 · Strip pins

The duration strip gets numbered pins where messages were said, and a row of compact cards under the single activity line maps back to them.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
›Working1m 02s — Running pnpm acceptance:visual:capture
1 2
1Finding0:12
Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.
2Decisionnew · 0:53
Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.
Settledturn complete
The session bar title overflows on iPhone. Fix it.
›Worked· 1 search · 2 reads · 1 edit · 3 runs · 2 notes1m 25s · $0.41
1 2
⌕Searchedsession-bar-title700ms
≡ReadSessionBar.svelte900ms
≡ReadHeader.svelte600ms
1Found it: the <h1> never got id="session-bar-title"…
✎EditedSessionBar.svelte6s
$Ranpnpm test:unit31s
2Unit tests pass, but the phone header baseline moves…
$Ranpnpm acceptance:visual:capture19s
$Rangit status200ms
1Finding0:12
Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.
2Decision0:53
Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Placement
Below one activity line that spans the whole turn. Numbered pins sit above the duration strip at the moments messages were said, and a row of cards underneath maps to them by colour and number.
Live
A pin drops onto the strip as each message lands and its card fades into the row, marked "new". The strip keeps growing to the right and the pins move left as time compresses.
Settled
Same line, now "Worked … · 2 notes", then the card row, then the final reply. Expanding the log shows each message as a numbered row at its point in the steps.
Collapsible
The log collapses (closed by default) and the pins stay visible either way. Cards don't collapse. Hovering or focusing a card rings its pin, and hovering a pin lights its card.
Mobile
Cards become a horizontal scroll-snap row, one card wide, with the pin number as the page dot. Pins stay on the strip but may collide on short turns.
Trade-off
Side-by-side cards lose reading flow and cramp long messages. More than about three messages overflow the row, and pins crowd on a strip only 4px tall.
In between

M4 · Ticker to shelf

While live, one "latest update" slot under the activity line shows only the newest message. When the turn settles, the slot unfolds into a shelf of every update.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
›Working1m 02s — Running pnpm acceptance:visual:capture
Latest update 2 of 2
0:53 · decision
Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.
Settledturn complete
The session bar title overflows on iPhone. Fix it.
›Worked· 1 search · 2 reads · 1 edit · 3 runs1m 25s · $0.41
⌕Searchedsession-bar-title700ms
≡ReadSessionBar.svelte900ms
≡ReadHeader.svelte600ms
✎EditedSessionBar.svelte6s
$Ranpnpm test:unit31s
$Ranpnpm acceptance:visual:capture19s
$Rangit status200ms
›Updates · 2Unit tests pass, but the phone…
0:12finding
Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.
0:53decision
Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Placement
Inside the single activity line: a slot under the strip while live, then a shelf under the collapsed line once settled, with the final reply below that.
Live
The slot shows only the newest message, with "2 of 2" and prev/next to page back. A new arrival crossfades in and pings a blue dot. The slot keeps the height of the tallest message, so the page doesn't jump.
Settled
The slot unfolds into "Updates · 2", a stack of every message with its timestamp and kind, in order, between the work and the reply.
Collapsible
Yes. The shelf is a <details>, open by default. Closed, it shows "Updates · 2" and a one-line peek at the latest. The step log collapses on its own.
Mobile
Works as is: one slot and one stack, full width. Prev/next become swipe gestures on the slot.
Trade-off
While live, older messages are one click away and easy to miss: if A lands and B replaces it before you look, A only shows up again when the turn ends. Paging also adds UI chrome to a live line.
In between

M5 · Folded into the reply

Surfaced messages interleave while live, then migrate into the top of the final reply as "Notes from the work", so a settled turn has exactly one assistant message.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
›Worked· 1 search · 2 reads12s
·Let me look at the session bar.
⌕Searchedsession-bar-title700ms
≡ReadSessionBar.svelte900ms
≡ReadHeader.svelte600ms

1Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

›Worked· 1 edit · 1 run41s
✎EditedSessionBar.svelte6s
·Now running the tests.
$Ranpnpm test:unit31s

2Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

⌄Working9s — Running pnpm acceptance:visual:capture
$Runningpnpm acceptance:visual:capture8s ⋯
Settledturn complete
The session bar title overflows on iPhone. Fix it.
›Worked· 1 search · 2 reads · 1 edit · 3 runs1m 25s · $0.41
⌕Searchedsession-bar-title700ms
≡ReadSessionBar.svelte900ms
≡ReadHeader.svelte600ms
1note 1, now in the reply
✎EditedSessionBar.svelte6s
$Ranpnpm test:unit31s
2note 2, now in the reply
$Ranpnpm acceptance:visual:capture19s
$Rangit status200ms
›Notes from the work· 2
  1. 10:12 · findingFound it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.
  2. 20:53 · decisionUnit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Placement
Live: between the activity lines, in order. Settled: quoted at the top of the final reply, and the three work lines merge into one above it.
Live
Each surfaced message is plain assistant prose with a small number tag (1, 2) that it keeps when it moves into the reply. The current stretch is the live line at the bottom.
Settled
The turn ends as one activity line and one reply. The reply opens with a quoted "Notes from the work · 2" block of numbered, timestamped notes, then the answer. The expanded log keeps a numbered marker where each note was said.
Collapsible
Yes. The notes block is a <details>, open by default, that collapses to "Notes from the work · 2" above the answer. The merged activity line collapses as usual.
Mobile
Ideal: one line and one message per turn is the shortest possible settled transcript. The quote block keeps its left rule and the numbers stay tappable.
Trade-off
Content moves when the turn settles. Something you were reading jumps into the reply, which is disorienting if you're scrolled mid-turn. It also blurs whether the notes are the agent's words or conduit's framing.
In between

M6 · Confidence-weighted prominence

Jev's probability sets visual weight: a sure call is a full message, a maybe is a one-line chip, and anything lower stays in the log. A three-stop control moves the thresholds.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
›Worked· 1 search · 2 reads12s
·Let me look at the session bar.p .12
⌕Searchedsession-bar-title700ms
≡ReadSessionBar.svelte900ms
≡ReadHeader.svelte600ms
›Worked· 1 edit · 1 run41s
✎EditedSessionBar.svelte6s
·Now running the tests.p .31
$Ranpnpm test:unit31s
⌄Working9s — Running pnpm acceptance:visual:capture
$Runningpnpm acceptance:visual:capture8s ⋯
Settledturn complete
The session bar title overflows on iPhone. Fix it.
message ≥ .90 · chip ≥ .80message ≥ .80 · chip ≥ .60message ≥ .70 · chip ≥ .40
›Worked· 1 search · 2 reads · 1 note in log12s
·Let me look at the session bar.p .12
⌕Searchedsession-bar-title700ms
≡ReadSessionBar.svelte900ms
≡ReadHeader.svelte600ms
·Found it: the <h1> never got id="session-bar-title"…p .72
›Worked· 1 edit · 1 run41s
✎EditedSessionBar.svelte6s
·Now running the tests.p .31
$Ranpnpm test:unit31s
›Worked· 2 runs1m 25s · $0.41
$Ranpnpm acceptance:visual:capture19s
$Rangit status200ms

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Placement
Inline, in chronological order between the activity lines. Only the visual weight changes.
Live
Surfaced B (p .91) renders as a full assistant message. Surfaced A (p .72) is a one-line chip that expands on click. The narration lines (p .12, p .31) stay in the log with their scores in small grey text. Tiers apply as messages arrive.
Settled
Same layout plus a Fewer · Balanced · More control that moves both thresholds live. Fewer drops A back into the log ("1 note in log" on the line), and More promotes it to a full message.
Collapsible
Chips are collapsed by default and expand in place. Full messages don't collapse. Step logs collapse as usual. The tuning is per user, not per turn.
Mobile
Chips are ideal on a phone: one line each, tap to expand. The sensitivity control moves into settings to save a row per turn.
Trade-off
Exposes a model's uncertainty as UI: users will read p .72 as "72% true" rather than "72% worth showing". Two thresholds plus a control is more to explain than a yes/no.
In between

M7 · Toast then dock

A new surfaced message first appears as a toast above the composer, where you'll see it even when scrolled away, then docks into the transcript at its chronological place.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
›Worked· 1 search · 2 reads12s
·Let me look at the session bar.
⌕Searchedsession-bar-title700ms
≡ReadSessionBar.svelte900ms
≡ReadHeader.svelte600ms

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

↧ docked from its toast · 0:12
›Worked· 1 edit · 1 run41s
✎EditedSessionBar.svelte6s
·Now running the tests.
$Ranpnpm test:unit31s
↥ the toast below docks here
⌄Working9s — Running pnpm acceptance:visual:capture
$Runningpnpm acceptance:visual:capture8s ⋯
Decision0:53 · docks when you scroll to it
Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.
Working 9sRunning pnpm acceptance:visual:capture↓ liveReply to steer the agent…opus-5
Settledturn complete
The session bar title overflows on iPhone. Fix it.
›Worked· 1 search · 2 reads12s
·Let me look at the session bar.
⌕Searchedsession-bar-title700ms
≡ReadSessionBar.svelte900ms
≡ReadHeader.svelte600ms

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

›Worked· 1 edit · 1 run41s
✎EditedSessionBar.svelte6s
·Now running the tests.
$Ranpnpm test:unit31s

Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

›Worked· 2 runs1m 25s · $0.41
$Ranpnpm acceptance:visual:capture19s
$Rangit status200ms

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Reply…opus-5↑
Placement
Two phases. A new message arrives as a toast pinned just above the composer, outside the scrolling transcript. It then docks inline between the activity lines at its chronological position.
Live
The transcript is scrolled up (scroll it), and a status row on the composer keeps work 3 visible. Surfaced A is already docked, with a fading dashed ghost of its toast around it. Surfaced B is a fresh toast whose pink timer bar drains. Jump ↓ scrolls to its slot, × docks it now, and scrolling past the slot docks it too.
Settled
No toasts. Both messages sit inline as plain assistant prose between the three activity lines, then the final reply, above an idle composer.
Collapsible
Toasts are transient, not collapsible: they dock on timeout, on ×, or once seen. Docked messages don't collapse, and step logs collapse as usual.
Mobile
Strong: the composer is the one surface always on screen, so the toast sits above it and above the keyboard. Stack at most one toast. A second one replaces the first, which docks.
Trade-off
Motion and two positions for one message. The toast competes with the composer for attention while you type, and needs a rule for bursts (several messages in a few seconds).

Off the wall

Deliberately unusual. Some are unshippable as they stand, but each hides an idea worth stealing.

Off the wall

W1 · Backchannel

The work shrinks to a thin system strip; surfaced messages come in as texts from a colleague, in a separate thread with its own voice.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
›sysWorking 9s — Running pnpm acceptance:visual:capture
Let me look at the session bar.
Searched session-bar-title0.7s
Read SessionBar.svelte0.4s
Read Header.svelte0.3s
Edited SessionBar.svelte1.1s
Now running the tests.
Ran pnpm test:unit34s
Running pnpm acceptance:visual:capture8s
a
agent · texting you while it works
Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.
0:12
Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.
0:53 · 9s ago · reply to object
Settledturn complete
The session bar title overflows on iPhone. Fix it.
›sysWorked · 1 search · 2 reads · 1 edit · 3 runs1m 25s · $0.41
Let me look at the session bar.
Searched session-bar-title0.7s
Read SessionBar.svelte0.4s
Read Header.svelte0.3s
Edited SessionBar.svelte1.1s
Now running the tests.
Ran pnpm test:unit34s
Ran pnpm acceptance:visual:capture19s
Ran git status0.2s
a2 Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended… 2 whispers · 0:12, 0:53 · tap to fan out agent · 2 whispers · tap to stack
Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.
0:12
Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.
0:53

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Placement
Two channels. The activity shrinks to one thin dashed system strip under the prompt; surfaced messages form a separate thread below it, left-aligned under an agent avatar. The final reply lands under the thread.
Live
The strip updates in place (current step, one bar segment per stretch, the live one breathing). Each surfaced message slides in as a sans-serif bubble with a relative timestamp; the avatar's ring pulses while work runs. A message that invites a response (B) gets the accent bubble and a "reply to object" tag.
Settled
The strip reads "Worked · 1 search · 2 reads · 1 edit · 3 runs" with the bill. The thread condenses into a stacked pile: the latest bubble on top, ghost bubbles behind it, a count badge on the avatar. The final reply is normal prose.
Collapsible
Yes, both parts, each a <details>. Strip: closed by default, opens the step log. Pile: closed once the turn settles and shows the top bubble's first line, the stack depth and "2 whispers · 0:12, 0:53"; tap to fan every bubble back out. Open while live.
Mobile
Works well: this is already a phone-messaging layout. Bubbles take the full width less the 28px avatar; the strip drops the step text and keeps the verb, timer and bar.
Trade-off
Two voices from one agent can read as two agents, and the settled pile hides B, which asks a question the user may still want to answer. Steal: set surfaced messages in a different voice (sans-serif, bubble, avatar) from the monospace machine log, so "this one is for you" reads before a word does.
Off the wall

W2 · Subway map

The turn is a metro line: tool steps are stops, surfaced messages are interchanges with their text on the signage, and the final reply is the terminus.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
12s41s9s… prompt search SessionBar Header A0:12 finding edit SessionBar test:unit B0:53 decision capture · 8s git status? final replynot yet
AInterchange A0:12 · finding

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

BInterchange B0:53 · decision

Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

›Working9s — Running pnpm acceptance:visual:capture
Running pnpm acceptance:visual:capture8s
Settledturn complete
The session bar title overflows on iPhone. Fix it.
12s41s23s prompt search SessionBar Header A0:12 finding edit SessionBar test:unit B0:53 decision capture git status Fixed.1m 25s
AInterchange A0:12 · finding

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

BInterchange B0:53 · decision

Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

›Worked· 1 search · 2 reads · 1 edit · 3 runs1m 25s · $0.41
Let me look at the session bar.
Searched session-bar-title0.7s
Read SessionBar.svelte0.4s
Read Header.svelte0.3s
Edited SessionBar.svelte1.1s
Now running the tests.
Ran pnpm test:unit34s
Ran pnpm acceptance:visual:capture19s
Ran git status0.2s
Terminus · final reply

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Placement
On the activity itself. The map replaces the activity line: stretches are coloured segments, tool steps are stops, surfaced messages are interchanges between stretches. Their full text hangs on signage cards directly under the map, tied to the interchange by a connector. The final reply sits under the terminus.
Live
A train runs from the current stop toward the next; the track ahead is a dashed, marching planned line and the terminus is an unlit, dashed ring. A sign goes up the moment the train reaches an interchange (the newest has a warm outline). A "Timetable" line under the signs carries the live timer.
Settled
The full line, with each segment's duration above it; the terminus lights green, labelled "Fixed.", and the final reply follows as normal prose.
Collapsible
The map is the collapsed form and always shows. "Timetable" is a <details> holding the full step log, folded narration included; closed by default. Signs don't collapse.
Mobile
The line turns 90° and runs down the left edge. Stops become dots with one-word labels, and each sign sits beside its interchange, so the page reads like a route diagram on a train door.
Trade-off
Stop spacing lies about time, and a 40-step turn needs compressing into express segments. It is also a lot of ink for three stretches. Steal: put surfaced messages on the activity's own timeline as first-class waypoints between stretches, so you can see at a glance where in the work each finding or decision happened.
Off the wall

W3 · Front page

A settled turn goes to print: the final reply is the headline, surfaced messages are the stories, and the tool log is the small print.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
Earlier edition · 0:12 · Finding

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

Stop the presses
0:53Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.   ◆  
›Working9s — Running pnpm acceptance:visual:capture
The Conduit Courier · proof
Headline sets when the turn settles
Settledturn complete
The session bar title overflows on iPhone. Fix it.
Late
edition
The Conduit Courier
Price
$0.41
Fixed.

The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

▴ Fold the paper▾ Unfold · 2 stories · wire report
Finding

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

Decision

Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

WIRE REPORT · 1 SEARCH · 2 READS · 1 EDIT · 3 RUNS
STRETCH 1 · 12s
"Let me look at the session bar."
SEARCHED session-bar-title0.7s
READ SessionBar.svelte0.4s
READ Header.svelte0.3s
STRETCH 2 · 41s
EDITED SessionBar.svelte1.1s
"Now running the tests."
RAN pnpm test:unit34s
STRETCH 3 · 23s
RAN pnpm acceptance:visual:capture19s
RAN git status0.2s
Placement
Live: the newest surfaced message crawls in a ticker directly above the running activity line, and older ones drop to a torn "earlier edition" clipping above that. Settled: the whole turn becomes one front page, with the answer on top (headline and deck), surfaced messages as the stories, and the activity as agate at the bottom.
Live
"STOP THE PRESSES" crawls the latest message. A ghosted proof shows where the front page will be set once the turn is done.
Settled
The headline is the reply's first sentence ("Fixed.") and the rest of the reply is the deck. Two bylined columns hold Surfaced A (Finding, 0:12) and B (Decision, 0:53). The wire report lists every step with dotted leaders, folded narration included, grouped by stretch.
Collapsible
Yes. The page is a <details>, open by default on the latest turn. Folded, it shows the masthead, the headline, the full deck (so the final reply never hides) and "Unfold · 2 stories · wire report". Older turns fold on their own, so scrolling back reads like a stack of papers.
Mobile
The headline drops to 34px, the columns stack into one, and the three-column wire report becomes a single column that starts folded. The ticker becomes a static two-line "Breaking" banner.
Trade-off
A marquee is hard to read, and B, which asks a question, scrolls out of sight. Headline equals first sentence breaks when a reply opens with "Sure, here's…". Steal: reverse the order of a settled turn, putting the answer first and the working-out underneath in small print, because by then the reply is what the reader came back for.
Off the wall

W4 · Corkboard

The activity panel is a corkboard; surfaced messages are sticky notes pinned over it, and they pile up in the corner when the turn settles.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
Working9s — Running pnpm acceptance:visual:capture
stretch 1 · 12s · search, 2 reads
stretch 2 · 41s · edit, test:unit
stretch 3 · 9s · capture…
Let me look at the session bar.
Searched session-bar-title0.7s
Read SessionBar.svelte0.4s
Read Header.svelte0.3s
Edited SessionBar.svelte1.1s
Now running the tests.
Ran pnpm test:unit34s
Running pnpm acceptance:visual:capture8s
A · finding · 0:12

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

B · decision · 0:53 · new

Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

Settledturn complete
The session bar title overflows on iPhone. Fix it.
›Worked· 1 search · 2 reads · 1 edit · 3 runs
1m 25s · $0.41 · tap card for the log
Let me look at the session bar.
Searched session-bar-title0.7s
Read SessionBar.svelte0.4s
Read Header.svelte0.3s
Edited SessionBar.svelte1.1s
Now running the tests.
Ran pnpm test:unit34s
Ran pnpm acceptance:visual:capture19s
Ran git status0.2s
Afinding
Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.
Bdecision
Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.
2 notes · click to peel

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Placement
On top of the activity panel itself. The panel is drawn as a corkboard, and surfaced messages are pinned over its right half. The final reply sits below the board.
Live
The activity is a pinned index card with the live timer and one row per stretch. The newest note flutters in from above and pins itself over the card; older notes stay put, overlapping like a real board.
Settled
The card relaxes to "Worked · …" plus the bill, and the notes shrink into a pile in the board's top-right corner (a letter and a kind on each). The final reply follows as normal prose.
Collapsible
Yes, each part separately. Each pile note is a <details>: closed, it is a 68px square with a letter and kind; click peels it to full size, one at a time (a scoped script pins the other back). The index card is also a <details> that opens the step log. Default: notes open while live, piled once settled.
Mobile
The board goes full width, and live notes become a horizontal row pinned across the card's bottom edge. The pile stays in the corner, and a peeled note opens as a full-width sheet.
Trade-off
Notes cover the log they're pinned to, the pile hides B's question, and the skeuomorphism is heavy. Steal: fasten surfaced messages to the activity block they came from, so collapsing the activity gathers its notes into one counted pile, a per-turn "unread findings" badge that goes with the work.
Off the wall

W5 · Waveform with subtitles

The turn plays like a recording: tool steps are the waveform, surfaced messages are subtitles at their timestamps, and the final reply is the closing caption.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
Live 1:02work 3 · 9s · pnpm acceptance:visual:capture
A B
0:12Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.
0:53Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.
Settledturn complete
The session bar title overflows on iPhone. Fix it.
■ Worked 1m 25s1 search · 2 reads · 1 edit · 3 runs · $0.41
A B ■
0:000:301:001:25
› Subtitles · 2 cues · drag the playhead to burn one in
  1. Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.
  2. Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.
Closing caption · 01:25

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Placement
Inside the activity. The activity line becomes a waveform, with a pink marker at each surfaced message's timestamp; the messages themselves are burned in as captions under the wave. The final reply is a closing caption below the player.
Live
The wave grows up to the playhead (1:02), the newest bars pumping, and the future is a dotted flatline. Captions roll up TV-style: the latest message (B) is bright and outlined, and the one before it (A) is dimmed and smaller above it. No more than two lines of history.
Settled
The full 0:00–1:25 wave in stretch colours, with A, B and end markers. Drag the scrubber and the caption window burns in whatever was said at that moment, with SDH-style brackets for stretches with no subtitle ("[searching session-bar-title]"). A cue list below highlights the active cue.
Collapsible
Yes. The cue list is a <details>, open on the latest turn. Closed, the player keeps the markers and the burned-in caption, and the closing caption (final reply) always shows. The player itself never gets smaller than its 84px wave.
Mobile
Seconds are grouped into about 50 bars and the markers keep their positions. Captions wrap to full width, and the scrubber becomes a horizontal swipe on the wave.
Trade-off
Amplitude means nothing to a user, and scrubbing a coding turn is a novelty. Steal: roll-up captions. While live, show only the latest surfaced message at full strength with the previous one dimmed above it, so the live area never grows past two messages however chatty the agent gets.
Off the wall

W6 · RPG dialogue box

The work is a tile map the agent walks across; surfaced messages are NPC-style dialogue you page through, and the settled turn becomes a quest log.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
Area 3 · pnpm acceptance:visual:capture⏱ 9s · 1:02
AGENT0:12 · FINDING0:53 · DECISION

Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

2/2
Settledturn complete
The session bar title overflows on iPhone. Fix it.
Map cleared · 1 search · 2 reads · 1 edit · 3 runs1m 25s · $0.41
▸ QUEST LOG2 ENTRIES
  • ◆
    0:12 · CLUE FOUND

    Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.

  • ◆
    0:53 · CHOICE MADE

    Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.

★ QUEST COMPLETE ★

Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.

Loot · 1 baseline: phone-header
Placement
Below the activity. The map is the activity: one tile per step, with a gold "!" tile at each surfaced message. Live, the dialogue box sits right under it; settled, the quest log does, followed by the final reply as the "Quest complete" banner.
Live
The agent sprite bobs on the current tile and the rest of the map is fogged. The latest surfaced message types itself into the dialogue box with a blinking ▼. "2/2" and ◀ page back to A. Only one message is on screen at a time, so the live turn never grows.
Settled
The fog lifts, the sprite stands on the lit goal flag, and the HUD reads "Map cleared". The quest log lists every surfaced message with its time and kind ("Clue found" for a finding, "Choice made" for a decision). The final reply is the gold "Quest complete" banner.
Collapsible
Live: the dialogue box pages instead of collapsing. Settled: the quest log is a <details>, open by default, and closes to "QUEST LOG · 2 entries". The banner (final reply) stays outside it and always shows. Tile tooltips carry each step's detail in place of an expanded log.
Mobile
The map scrolls sideways and keeps the sprite centred. The dialogue box pins to the bottom of the viewport above the composer, the way game text sits over the action.
Trade-off
While live, paging hides A behind a click, and the typewriter makes you wait to read B. Steal: name surfaced messages by kind in the settled record ("Clue found" or "Choice made", really finding and decision), so a turn ends with a scannable list of what was learned and what was decided, apart from the step log.
Off the wall

W7 · Comic strip

Each stretch of work is a comic panel captioned with where it happened, surfaced messages are the agent's speech balloons, and the last panel's balloon is the final reply.

Livework 3 running
The session bar title overflows on iPhone. Fix it.
Working 9s · panel 3 in pencils
First, in SessionBar.svelte and Header.svelte… 12s
Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.
SEARCH!READ!READ!session-bar-title · SessionBar.svelte · Header.svelte
Meanwhile, in SessionBar.svelte… 41s
Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.
EDIT!RUN!SessionBar.svelte · pnpm test:unit
Later, at the visual baselines… 9s and counting
pencils · inks when the turn settles
· · ·
CAPTURE…pnpm acceptance:visual:capture
Settledturn complete
The session bar title overflows on iPhone. Fix it.
3 panels · 2 surfaced + reply · 1 search · 2 reads · 1 edit · 3 runs · 1m 25s · $0.41 "Fixed. The title now sits in its own column and truncates with an ellipsis…" ▴ roll up to filmstrip▾ unroll the strip
First, in SessionBar.svelte and Header.svelte… 12s
Found it: the <h1> never got id="session-bar-title", so it auto-placed into grid column 1 and inflated the back button's track.
SEARCH!READ!READ!session-bar-title · SessionBar.svelte · Header.svelte
Meanwhile, in SessionBar.svelte… 41s
Unit tests pass, but the phone header baseline moves by 6px. I'm treating that as intended and recapturing it. Say if you'd rather keep the old spacing.
EDIT!RUN!SessionBar.svelte · pnpm test:unit
Later, at the visual baselines… 23s
Fixed. The title now sits in its own column and truncates with an ellipsis on narrow screens. One baseline recaptured: phone-header.
CAPTURE!git statuspnpm acceptance:visual:capture · git status
Placement
Inside the activity. Each stretch of work is a panel, and each surfaced message is a speech balloon in the panel of the stretch that produced it. The final reply is the last panel's balloon. Tool steps are sound effects with the real file names in small print.
Live
Finished stretches are inked and coloured. The running stretch is in blue pencil: a dashed caption, an outline-only agent with construction lines, and an empty balloon that keeps sketching itself. "Working 9s · panel 3 in pencils" sits above the page.
Settled
All three panels are inked, and the last one is wide, with the agent smiling and saying the final reply.
Collapsible
Yes. The settled page is a <details> under a filmstrip summary: three thumbnails (a balloon dot on each panel that speaks), the counts, the bill, and, when rolled up, the first line of the final reply. Open by default on the latest turn; older turns roll up to filmstrips. Live panels don't collapse.
Mobile
One panel per row at full width, with sound effects wrapping under the agent. Rolled-up filmstrips scroll sideways.
Trade-off
Heavy to render and heavy to scan, and a 10-stretch turn becomes a graphic novel. The captions need writing, either by a template or by another Jev call. Steal: title each stretch by where it happened ("Meanwhile, in SessionBar.svelte…") and hang its surfaced message off that stretch, so every finding reads next to the work that produced it. The pencil-then-ink live state is worth taking too.