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.
✦ 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.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.
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?
session_switched path.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?
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, ✦ 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).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.
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?
session_switched path.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?
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?
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.
session_switched path.session_switched path.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?
#22 › opens it on the strip, and ↩ Back to ? #24 returns.? #24 and the answer in the composer without sending. Something else… puts in just the reference.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.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.
| Way | What it does | Cost | Role |
|---|---|---|---|
| 1 · The nearest 5 | The 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, code | Narrows the search |
| 1b · The previous turn’s last reply | Always 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, code | Narrows the search |
| 2 · Shared names | Code 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, code | Reaches past the nearest 5 |
| 3 · Right before it | The message just before the question, with no tool call between. Often the setup, but just as often “Let me check…”. | Free, code | Breaks ties |
| 4 · Its category | Findings, 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, stored | Breaks ties |
| 5 · One Jev request per question | Sends 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 question | Decides |
| 6 · Ride along with Explain | When 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 call | Corrects, on request |
| 7 · You fix it | Not this on the quote, then pick a pin. Saved as an eval case too. | Free | Optional |
| Rejected | Asking 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.
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.
| Option | When it runs | Cost | Good at | Weak at |
|---|---|---|---|---|
| Jev | When the question arrives, so the quote is there when you look | ≈ $0.0002, no rate limit | A real probability per message, so the ≥ 0.6 rule means something | Scores each message alone, so two half-explanations can both miss |
| Haiku · Sonnet · Opus | When you open the question’s card, then cached. Shows Finding the setup… for about 1s (Haiku) to 6s (Opus) | Your Claude rate limit, ~5k tokens | Reads 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 Claude | Jev first. Only when its best score lands between 0.4 and 0.6, the chosen Claude model decides | Jev’s cost, plus Claude on roughly 1 in 10 | Cheap in the common case, careful in the unsure one | Two 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
✦ 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.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?
session_switched path.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 already exists). With Jev off and summaries on, the daemon still pays for summaries but makes no TypeSafe calls.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.