Jev surfacing: what the spec builds

A review page for epic conduit-test-ahu8. Part 1 shows each component the beads tell an agent to build, using the round-3 scenario: one 44-minute turn with 34 messages, an open Ask at #24, and #1 raised by you. Part 2 lists the 16 places the spec departs from the B3, B7 and M4 mockups, each with the reason and what reversing it would cost.

The turns are live and built on B3 · Scrub and summary: the coloured activity strip, two pin rows, the card above the pins, and the summary with its model pill. The spec's level function runs on real weights, so the counts match the mockups: Key 6, Balanced 16, All 34. Drag along the strip or the pins, tap a pin or a group pill, press ▲ Raise, and use the keyboard once a turn has focus. The other originals are B7 · Footnoted recap and M4 · Teach mode.

How to review. Each component and departure has a review row. Pick Looks right or Needs change for a component, and Keep departure or Use the mockup for a departure, adding a note if you like. Your choices save in this browser. Copy review in the bottom bar turns them into text you can paste back to me.

Part 1 · What gets built

Everything sits inside the existing TurnActivity block, which keeps its head and step log. A pure surfaceTurn function decides what the strip, pins and card show, and the Svelte components just render it. With the feature off, the block looks exactly like today's.

The turn: strip, pins, card and summary

.6.11

From top to bottom: the head with its unread count, the card, the two pin rows, the coloured activity strip with its thumb, the axis, then the summary. The card always sits above the pins, with its caret pointing at the pin it shows, in live and settled turns alike.

Desktop · Live · 38:12 · following the newest
Move the session list onto the typed streaming transport and delete the legacy session_switched path.
Desktop · Settled · 44:30 · opens on the summary
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. session_switched survives behind CONDUIT_LEGACY_SWITCH=1 for one release. One open question: recapture phone-sidebar (a 2px shift), or keep the old paint order?

Head
Working · 38m 12s or Worked · 18 searches · … (click to open the step log), the bill, and N unread, which opens the next unread. It reads All read ✓ at zero. Unread covers every surfaced message, not just those at the current level.
Card
Head: the type label, needs reply on the open Ask, ▲ you · reason, ● unread, #24 · 31:02 · 7/16 and a Read checkbox. Body: the full text as markdown, never clamped. Foot: ↩ Reply, ▲ Raise, ▼ Lower, ⇄ Retype, then now ⇥ (live, once you've moved off the newest), ‹ ›, and fold (–) or close (✕).
Strip
B3's coloured activity strip: gold for edits, rose for failures, grey for reads, and a breathing segment for the step running now. Drag anywhere on it, or on the pins, to scrub: the card follows the nearest pin. Tap a pin to open it.
Axis
00:00 · the Ask chip ? 1 open · #24 · progress 21/30 read › (opens the next unread) · ⚠ N not judged · the level control (Final, Key, Balanced, All, with a count) and its override dot · 38:12 now, or now ⇥ once you've scrubbed away in a live turn.
Live follow
The card follows the newest message until you pick a pin. Hold rule: a message still waiting for Jev shows as a dashed … pin and holds the card. Once Jev answers, a routine message's pin disappears, the card falls back to the newest surfaced message, and the routine line joins the step log. Try Next message arrives.
Read
A message becomes read after 1s open, but only while the tab is visible and the card is on screen. Scrubbing reads only the pin you stop on. Unchecking Read keeps it unread while it stays open.
Level
Picking a level other than the default overrides it for this session, and a pink dot appears. Click the dot for Make default or Back to default. Final hides the pins and card and keeps the strip, axis and summary.

Pin lane: two rows, group pills, tap and scrub

.16

Each pin sits at its time offset. Pins are placed most urgent first into two rows, 34px apart (38px on phone). A pin with no room joins its nearest placed neighbour's group pill, which shows the most urgent member and +k. Tapping a pill opens its lead, and tapping again cycles through the members. While a member is open, the pill shows that member's number, filled. The open Ask is never grouped.

Desktop · Settled · All · 34 pins
Pin states
Urgency order
Ask, then Blocked, Risk and Scope, then Replan, Correction and Decision, then Finding and Milestone, then custom categories. Ties go to the higher probability.
Scrub and tap
Press and drag anywhere on the pins or the strip. A move of 4px or more scrubs, and the card follows. A press that doesn't move picks the pin or pill under it. Drags are horizontal only, so they never fight page scroll on touch.
Accessibility
Pins and pills are buttons, so Tab reaches them. Names read like "#24 Ask, 31:02, unread, waiting on you". The strip is a slider whose value is the open message. A glyph always goes with the colour.

Card states

.6

Fold, Final, short turns, nothing at this level, Jev failures, and a turn split into several blocks.

Folded · the strip stays, any pin reopens the card
Final · the strip, axis and summary survive
Short turn · 3 messages · opens on the newest, no automatic summary
Nothing at Key
Jev unavailable for 2 messages · live
Hand-back · two blocks, turn-wide numbers

Handing back while the visual suite runs. I'll continue with the unread counter.

Fold
– folds the card away. The pins and strip stay, because they are the activity strip. Any pin reopens it. Only the session's latest turn opens unfolded.
Final
Hides the pins and card, and keeps the strip, the axis with its unread progress, and the summary, plus Final only · N hidden. Opening any message (Ask chip, a citation, u) switches the session to Balanced.
Not judged
If Jev fails or the queue overflows, the message gets a failure verdict and stays in the step log. The axis shows a muted ⚠ N not judged with a tooltip.
Hand-back
Each block shows its own pins on its own time span and strip. Numbers run across the whole turn, and the summary sits in the last block.

Turn summary

.13

B3's summary box, with its model pill. Each summary is at most 4 sentences, and each [#n] is a citation chip. Citations to unread messages are bold and filled, a citation you've followed turns dashed, and hovering one lifts its pin. When the turn moves on, you can summarise just what's new since the last summary, and page between the old and new ones with ‹ ›.

None yet · the pill menu is open
Stale · 4 new since the last summary
Generating
Failed
Summary model Off · no summary, Mark N read moves to the axis
Pill
sonnet-5 · at turn end ▾ opens a menu with the model (Sonnet, Opus, Off) and timing (When a turn ends, On request). It's the global setting, so it applies to every session, and Settings › Surfacing shows the same values. Try it: every turn on this page follows.
Versions
Each turn keeps a list of summaries. Whole turn covers #1 to the newest. New since 27:15 covers only what arrived after the previous summary. ‹ › pages between them, newest first. Nothing is regenerated by paging.
Stale
When messages arrive after the newest summary, the head reads · 4 new and the box offers ✦ Summarize 4 new · since 38:12 (cheap and short) or ↻ Whole turn.
When it costs money
A cached summary is shown as is. A new one generates only when you press a button, or when timing is "when a turn ends" and the turn settled with 4 or more non-routine messages. Off never generates.
Foot
sonnet-5 · 13 updates · 1.8s · written at 44:30, ↻ Regenerate, ✓ Mark N read. Citations are checked against the turn's message numbers, and invalid ones are dropped.

Marks: Raise, Lower, Retype

.10

Marks are B3's: ▲ Raise and ▼ Lower move a message one level, and ⇄ Retype picks another category. Each opens a one-line Why? row in the card with reason chips and a free-text box. A mark stores the level you chose for that one message, so it doesn't move when weights change. Weights change only through Settings.

Desktop · #26 at All · ▲ Raise pressed · step log open
Why row
▲ Raise #26: All → Balanced. Why?, then Jev's working (● Finding · p .64 × 40 = 26, or routine · p .88), reason chips, your own reason (Enter saves), no reason, and ✕.
Limits
▲ is disabled at Key, ▼ is disabled once a message is only in the step log, and everything waits while Jev is still judging. Pressing the active ▲ or ▼ again clears the mark.
After save
The pin gets a ▲, ▼ or ⇄, the card shows ▲ you · reason, and a Saved · Undo toast shows for 6s. If a ▼ drops a message below the level, the card keeps it open with "Hidden at this level · in the step log".
Step log
Routine lines and lowered messages carry ▲ ▼ in the step log, so you can raise narration Jev filed as routine. A raised routine line becomes a glyph-only pin.

Reply references

.12

The live turn's composer above already holds two tokens, as in the scenario. Press ↩ Reply (or r) on any message to drop another. Open What the agent receives to see the exact text that gets sent.

Token
A message token shows the glyph, number and type: ? #24 Ask. You write your reply around tokens in the normal composer, so one message can answer several.
Self-contained
Each token carries its own text block, so it survives draft saving, session switching and cross-device draft sync. It still sends correctly if surfacing is turned off first. It reuses the composer's highlight-backdrop technique for skill chips.
On send
Each token becomes Re #24 (Ask, 31:02): "<first 280 chars>", followed by your text. The transcript shows the sent text as is.

Keyboard

.6.10–.13

Keys work only while focus is inside the turn, never globally, so typing in the composer is never captured. Click a strip and try them.

← → Home Endprevious or next pin at the level, first or last
digits, then Enteropen #n; if it's below the level it opens with a note
aopen the Ask
unext unread (B3 used n, see departure 12)
sopen or close the summary
rreply to the open message
+ −raise or lower the open message
mtoggle read (B3 used v)
Escclose the Why row, then menus, then fold or close the card

Phone

.6.16

The same components in the same order, at B3's phone sizes: text at least 12px, targets at least 32px tall.

Phone · Live38m 12s
9:41● ● ●
‹Typed session list
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 now runs on the typed stream. One open question: recapture phone-sidebar, or keep the old paint order?

Pins
12px numbers, rows 38px apart, so more pins group on a narrow strip.
Card
Full width, buttons 30px tall, and the Read checkbox grows to 15px.
Axis
Wraps to two lines, drops 00:00, and the level shows Bal.
Summary
Citation chips get an invisible 32px hit area.

Settings › Surfacing › General

.3.5

The flag lives in the daemon, because the daemon makes the paid calls. The feature is active when it's enabled and the key is valid or set by an environment variable. The level, model and timing here are the same values the summary pill and level dot change.

Desktop · General

Settings › Surfacing › Categories

.5.9.14

The categories are edited as a local draft, with Save and Discard. Change a weight and the readout recomputes for free, because verdicts are cached. Save, and every turn on this page re-levels at once (see departure 8).

Desktop · Categories
Row
A pill (glyph and label), the what line, a sample count, a weight stepper (±5, or type a value), and actions. Built-ins: Edit definition, Retire, and ↺ Reset when changed. Custom categories: Edit (label, glyph, colour, what, not_for, examples, weight) and Delete, confirmed in the row.
Preview
Weight edits recompute the readout from score(draft) at no cost. Changing criteria, adding or retiring a category re-scores only when you press Test against my corrections, which shows its Jev call count first.
Validation
Label 1–24 characters, a single-character glyph, a hex colour, and at most 20 active categories. The id comes from the label and never changes. Built-ins can be retired but never deleted. If Save finds the set was changed elsewhere, it reloads and keeps your draft visible.

Settings › Surfacing › Feedback and tuning

.10.14

M4's ledger, now read from the database. Opus proposes changes from your marks, and you review them one by one. score uses the same sample every time, so before and after are comparable. Applying a weight change here re-levels the turns above.

Desktop · Feedback
Tiles and grid
The mark count with ▲, ▼ and ⇄ counts, the most raised and most lowered categories, top reasons, and a "Jev said → you said" grid by category.
Records
Newest first: time, session, #n, an excerpt, Jev's current answer, your mark, your reason, whether the current set agrees, and Clear.
Propose
Needs 5 marks. The proposal is held in the browser only, with nothing stored on the server. Propose again sends the changes you unticked as avoid.
Hunk evidence
Agreement with your corrections before → after, and how many other messages move. It isn't what the change would do to this turn (see departure 14).

Part 2 · Where the spec departs from the mockups

These are the plan's 16 departures from B3, B7 and M4, in the plan's order. For each one, decide whether to keep the departure or go back to the mockup.