Jev surfacing: B with a summary button, and Jev off

Two follow-ups to the B · Thin strip pick. First, a ✦ Summary button that writes and shows the turn summary without expanding anything else, in two versions. Second, what a turn looks like when Jev categorisation and escalation is off. Every turn here is the real spec-preview widget.

The button. ✦ Summary sits in the minimised head, left of the chevron. With no summary yet it reads ✦ Summarize: one press writes it and opens it. When the turn has moved on it adds · k new. The panel is the expanded turn's own summary box, with the model pill, ‹ › between versions, and Summarize k new. The turn stays minimised throughout, and s toggles the panel once the turn has focus. Summaries are never written automatically: not when a turn ends, and not when you expand one. Only ✦ writes one. The settled turns below have one you asked for at 27:15, so they show · 13 new.

B1 · Drops in under the strip

Press ✦ Summary and the summary box opens under the strip, pushing the reply down. Hover a citation to mark its spot on the strip. Click one to expand the turn to that message.

Desktop · Settled · asked for at 27:15
Move the session list onto the typed streaming transport and delete the legacy session_switched path.

Done. The session list, unread badges and push deep links now run on the typed stream. One open question: recapture phone-sidebar, or keep the old paint order?

Desktop · Live · no summary yet
Move the session list onto the typed streaming transport and delete the legacy session_switched path.
iPhone 18 Pro · 402×87444m 30s
9:41● ● ●
‹Typed session list
Move the session list onto the typed streaming transport and delete the legacy session_switched path.

Done. The session list, unread badges and push deep links now run on the typed stream. One open question: recapture phone-sidebar, or keep the old paint order?

iPhone Duo · unfolded · 626×89044m 30s
9:41● ● ●
‹Typed session list
Move the session list onto the typed streaming transport and delete the legacy session_switched path.

Done. The session list, unread badges and push deep links now run on the typed stream. One open question: recapture phone-sidebar, or keep the old paint order?

Sizes
Both frames are real size in points. On the unfolded Duo the screen is wide enough for the desktop strip, so the button sits in the strip’s header and the hit targets stay phone-sized (32px). Folded, the 466×678 cover screen uses the Pro layout.
Button
✦ Summary, ✦ Summarize when there’s none yet, and · k new when it’s behind. On a phone it gets its own row under the strip, ✦ Summarize this turn (see P).
Opens
Inline under the strip. The pins, card and level control stay hidden.
Citations
Hover marks the spot on the strip. Click expands the turn to that message, with the summary still open.
Closes
The button again, the box’s chevron, s or Esc.
Gives up
While it’s open, the reply moves down by the summary’s height.

B2 · Floats over the transcript

The same button and box, but the box floats over the reply instead of pushing it down. It closes when you click outside it. On a phone it becomes a bottom sheet.

Desktop · Settled · asked for at 27:15
Move the session list onto the typed streaming transport and delete the legacy session_switched path.

Done. The session list, unread badges and push deep links now run on the typed stream. One open question: recapture phone-sidebar, or keep the old paint order?

Desktop · Live · no summary yet
Move the session list onto the typed streaming transport and delete the legacy session_switched path.
iPhone 18 Pro · 402×87444m 30s
9:41● ● ●
‹Typed session list
Move the session list onto the typed streaming transport and delete the legacy session_switched path.

Done. The session list, unread badges and push deep links now run on the typed stream. One open question: recapture phone-sidebar, or keep the old paint order?

iPhone Duo · unfolded · 626×89044m 30s
9:41● ● ●
‹Typed session list
Move the session list onto the typed streaming transport and delete the legacy session_switched path.

Done. The session list, unread badges and push deep links now run on the typed stream. One open question: recapture phone-sidebar, or keep the old paint order?

Button
As B1.
Opens
A popover under the strip on desktop and on the unfolded Duo, and a bottom sheet on the Pro and the Duo’s cover screen. Nothing in the transcript moves.
Closes
Clicking outside it, the button, Esc, or a citation, which expands the turn to the message.
Gives up
It covers the reply while open. A long summary scrolls inside the sheet, and a popover has one more layer to manage (focus, outside clicks, stacking).

Q · The context behind a question

Open an Ask (the ? #24 chip does it from a minimised turn) and the card first shows what the agent itself said beforehand. Here that's #22, where it laid out the problem and both options. #22 is a low-ranked Finding, so at the default level it isn't even on the strip; the Ask brings it back. If you need more, ✦ Explain options asks your summary model to retell it in plain words for someone who wasn't watching.

Desktop · Ask open · the agent’s own setup
Move the session list onto the typed streaming transport and delete the legacy session_switched path.
Desktop · ✦ Explain options pressed
Move the session list onto the typed streaming transport and delete the legacy session_switched path.
Phone · Settled · tap Explain44m 30s
9:41● ● ●
‹Typed session list
Move the session list onto the typed streaming transport and delete the legacy session_switched path.

Done. The session list, unread badges and push deep links now run on the typed stream. One open question: recapture phone-sidebar, or keep the old paint order?

First
The agent’s own words, free and instant: the earlier message(s) that set up the question, quoted under the Ask. #22 › opens it on the strip, and ↩ Back to ? #24 returns.
None found
The card says No earlier explanation found, and ✦ Explain options becomes the main button.
Explain
On request only. Written for someone who wasn’t watching: what you asked for and where things are, what came up and why it matters, each option as what happens next, which one the agent leans to, and what happens if you wait. No jargon, or a five-word gloss when a term can’t be avoided.
Options
↩ Reply with this puts ? #24 and the answer in the composer without sending. Something else… puts in just the reference.
Spec change 3
Finding the setup. One Jev request per Ask, after code narrows the field; see How the setup message is found. The links are saved with the Ask. Explaining. A RecapService scope ask that reads your request, the linked messages and the Ask, returns { sofar, came, options: [{ label, what, reply, lean }], idle }, and is cached per Ask.

How the setup message is found

A wrong quote is worse than none: it tells you the agent said something about this question that it didn’t. So every way below is judged on how often its pick is right first, and how often it finds the message second.

WayWhat it doesCostRole
1 · The nearest 5The 5 agent messages just before the question, including ones Jev called routine. In 157 labelled questions, these held all the setup 95% of the time when it was in the turn at all, and the nearest 3 held it 85% of the time.Free, codeNarrows the search
1b · The previous turn’s last replyAlways a candidate. 11% of questions lean on it, such as “resume usg5?” where usg5 was set out a turn ago. That is more than every in-turn miss past 3 messages put together.Free, codeNarrows the search
2 · Shared namesCode names, file paths, ticket ids and test names that appear in both, like phone-sidebar. Adds up to 4 older messages from the same turn. This is the only cheap way to reach a setup far back, like the one in the sample that was 13 messages earlier.Free, codeReaches past the nearest 5
3 · Right before itThe message just before the question, with no tool call between. Often the setup, but just as often “Let me check…”.Free, codeBreaks ties
4 · Its categoryFindings, Risks, Blockers and Decisions set questions up more often than Milestones. Free, since the verdicts exist. Filtering by level would lose #22 here, which is a low-ranked Finding.Free, storedBreaks ties
5 · One Jev request per questionSends your request, the question and the 6 to 10 shortlisted messages together. For each message, two yes/no questions: “does it explain why this question comes up?” and “does it lay out the choices?”. Plus one more: “does the question explain itself?”. That’s about 20 questions answered in parallel, ~4k input tokens. It runs when the Ask verdict lands, so the quote appears about a second after the pin.≈ $0.0002 per questionDecides
6 · Ride along with ExplainWhen you press ✦ Explain options, Claude already reads the turn, so it also names the messages it drew on. If it disagrees with Jev, its pick replaces the quote and the case is saved for the eval.Free, same callCorrects, on request
7 · You fix itNot this on the quote, then pick a pin. Saved as an eval case too.FreeOptional
RejectedAsking the agent to cite its setup (it doesn’t know conduit’s #numbers, and it adds noise to every prompt). Embedding similarity (a new dependency, and closeness in wording isn’t the same as “this sets up that question”). A fixed window of 12 (it adds false matches without adding finds: nothing in the sample sat between 6 and 12 back).

The rule in code. Show up to 2 messages that score ≥ 0.6 on either question, preferring “lays out the choices”, nearest first. Between 0.4 and 0.6, show only a link, Maybe related: #20 ›, with no quote. If “explains itself” is high, show nothing extra. Otherwise say No earlier explanation found, which is honest about misses, unlike “the agent didn’t explain”. The thresholds are placeholders until the eval.

Who decides: Jev or a Claude model

Way 5 is a setting, Find the setup with: Jev (default), Haiku, Sonnet, Opus or Off. Ways 1 to 4 build the same shortlist for all of them.

OptionWhen it runsCostGood atWeak at
JevWhen the question arrives, so the quote is there when you look≈ $0.0002, no rate limitA real probability per message, so the ≥ 0.6 rule means somethingScores each message alone, so two half-explanations can both miss
Haiku · Sonnet · OpusWhen you open the question’s card, then cached. Shows Finding the setup… for about 1s (Haiku) to 6s (Opus)Your Claude rate limit, ~5k tokensReads the shortlist together, so it handles “the options are in #18, the reason is in last turn’s reply”No calibrated score: it returns high, medium or none, which map to quote, link or nothing
Jev, then ClaudeJev first. Only when its best score lands between 0.4 and 0.6, the chosen Claude model decidesJev’s cost, plus Claude on roughly 1 in 10Cheap in the common case, careful in the unsure oneTwo systems to tune

Recommended. Jev by default. Picking a Claude model in the setting switches to Jev, then Claude, or Claude alone when Jev is off. With Jev off, the same Claude call also decides whether the message is a question at all, so the Ask pin still works.

What the sessions say (157 labelled questions). 76% explain themselves fully, so most of the time the right answer is to show nothing extra. 13% need an earlier message from the same turn, and 11% need the previous turn’s reply. No window catches everything: one setup was 13 messages back. Questions put through the question tool need setup most often (32%), and final replies least (2%), since a final reply usually explains itself in the same message. Labels are from gpt-6.1-sol, not yet checked by hand.

Eval, folded into spike .1. Label about 50 real questions from conduit’s own event stores with their setup messages. Measure, for each way and for the combination: how often the quote is right (the number that matters), how often the setup is found, and how often “explains itself” is right.

P · The phone summary button

Five ways to draw the ✦ button in a minimised phone turn. Each phone has one summary asked for at 27:15, 13 messages ago, which is the widest label the button gets. Tap the button to open the summary sheet. Chosen: D, its own row. The other phone frames on this page now use it.

Now44m 30s
9:41● ● ●
‹Typed session list
Move the session list onto the typed streaming transport and delete the legacy session_switched path.

Done. The session list, unread badges and push deep links now run on the typed stream. One open question: recapture phone-sidebar, or keep the old paint order?

An 18px circle with a small ✦. It reads as an icon nobody can name, and it is the odd one out next to two text chips.

A · Say it44m 30s
9:41● ● ●
‹Typed session list
Move the session list onto the typed streaming transport and delete the legacy session_switched path.

Done. The session list, unread badges and push deep links now run on the typed stream. One open question: recapture phone-sidebar, or keep the old paint order?

✦ Summary, the same pill as the other chips, with a dot when there’s something new since. Clearest, but it costs about 50px, so “Worked” gets squeezed out on narrow phones.

B · Joined to unread44m 30s
9:41● ● ●
‹Typed session list
Move the session list onto the typed streaming transport and delete the legacy session_switched path.

Done. The session list, unread badges and push deep links now run on the typed stream. One open question: recapture phone-sidebar, or keep the old paint order?

One pill: 13 unread │ ✦. Both answer “what did I miss?”, so they sit together. Tap the number to step through unread messages, tap ✦ for the summary. A dot means new since the last one. When nothing is unread, ✦ stands alone.

C · A proper icon button44m 30s
9:41● ● ●
‹Typed session list
Move the session list onto the typed streaming transport and delete the legacy session_switched path.

Done. The session list, unread badges and push deep links now run on the typed stream. One open question: recapture phone-sidebar, or keep the old paint order?

A 24px rounded square with a 14px ✦, like an icon button rather than a chip. A dot in the corner means there are new messages since the last summary.

D · Its own row · chosen44m 30s
9:41● ● ●
‹Typed session list
Move the session list onto the typed streaming transport and delete the legacy session_switched path.

Done. The session list, unread badges and push deep links now run on the typed stream. One open question: recapture phone-sidebar, or keep the old paint order?

Off the head entirely: a dashed row under the strip reading ✦ Summarize this turn or ✦ Summary · 13 new. Biggest target and easiest to read, at the cost of 36px of height per minimised turn.

R · Reading a summary without jumping

Nine ways to read the summary, open a message it cites and reply to it, without the page throwing you up and down. Every frame is live: tap citations, ↩ Reply, ✕ and ≡ In log. ≡ In log answers the raw-message question: it unfolds the steps around the message inside the card, with a link to open the full log there. 5 to 7 open the message where you tapped, 8 to 10 put the pieces next to each other, and 11 to 13 keep the jumps but make them cheap.

S · Where the reader lives

One rule: wherever there is room, the summary and its cards live outside the timeline, so the timeline can jump without moving what you are reading. Pick a preset or change either setting, and all three frames redraw. Each frame holds the full turn widget: head, both rows of pins, the strip, read progress and level, and the step log under Worked. Its head and strip stick to the top while you read.

Scrubbing still works, and drives the same card as the citations. Drag along the strip, or press ← →, to step through the surfaced messages in time order. While the reader is open, the card shows in the reader and follows your finger: its pin and thumb light on the strip, and its citation lights in the summary. With the reader closed, or with desktop popovers, the card shows above its pin as it does today. Scrubbing changes which message the card shows, never where it shows.

↑ In timeline hands the card to the strip. ≡ In log opens the Worked log at that message's row, where every tool step opens. In the tray, ≡ Activity opens the same log, and the grab handle cycles peek, half and full. ↩ Reply never scrolls anywhere.

J · Jev categorisation & escalation off

Without Jev nothing is categorised, so there is no strip, no pins, no levels, no unread count and no Ask chip. The turn goes back to today’s block. Turn summaries run on your Claude model rather than Jev, so they can stay on. The switches below are live and redraw the three turns.

KeySummary opens
Jev off
Today’s turn: the head, the step log and the final reply. The agent’s mid-turn messages stay in the step log. There is nothing to minimise, so there is no chevron.
Summaries on
✦ Summary sits in the head and opens the way you pick above. Its citations are plain #n chips. Each opens the step log at that line and highlights it. The step log numbers the agent’s messages so the citations line up.
Both off
Exactly today, with no numbers in the step log.
No key
The Jev switch is disabled with Add key next to it, and summaries keep working. The transcript never nags about a missing key.
Desktop · Settled
Move the session list onto the typed streaming transport and delete the legacy session_switched path.

Done. The session list, unread badges and push deep links now run on the typed stream. One open question: recapture phone-sidebar, or keep the old paint order?

Desktop · Live
Move the session list onto the typed streaming transport and delete the legacy session_switched path.
Phone · Settled44m 30s
9:41● ● ●
‹Typed session list
Move the session list onto the typed streaming transport and delete the legacy session_switched path.

Done. The session list, unread badges and push deep links now run on the typed stream. One open question: recapture phone-sidebar, or keep the old paint order?

Spec change 1
Split the flag. Today one daemon flag gates Jev calls and recap calls. Instead, the Jev switch gates Jev and tuning calls, and summaries are gated only by the recap model (Off already exists). With Jev off and summaries on, the daemon still pays for summaries but makes no TypeSafe calls.
Spec change 2
Number messages when they fold, not in the verdict. The daemon writes ordinal into the Jev verdict today, so with Jev off there would be nothing for a summary to cite. Writing it when the daemon folds the message keeps one numbering source for the card, the summary and reply references, whether Jev is on or off.
Unchanged
The final message renders as the reply, as today. Turning Jev back on resumes from stored verdicts, marks and read state. Messages folded while it was off stay routine.