fix: put the recall chip in the header utilities, not the cell the sidebar's expand button owns
Release / release (push) Successful in 6s

The chip registered into `conversation.session.header.corner`, which is a
SINGLE cell the product already occupies: the client catalog lists its
occupants as `client-ui-sidebar-right ExpandButton` and its replaceRisk as
`shadows-shipped-ui`. Two registrations at priority 0 in a single cell are a
hard error inside the slot registry, and the error lands in the OTHER
plugin's `slots.inject()` callback: the renderer's `changed` handler catches
it, calls `stop()` on that inject controller — killing that contribution for
the rest of the fiber's life — and rethrows it from a microtask, which is the
uncaught `single slot ... already has a registration at priority 0 (registered
by dsh-recall)` in the console. So the chip was not merely racing the shipped
right-sidebar expand control; it was taking it down.

It now registers into `conversation.session.header.utilities`, a list cell
(`replaceRisk: none`, right-aligned, same Session scope and therefore the same
`useProjection` prop) as `{ id: 'dsh-recall', order: 20 }`, so it stays at the
right-hand end without competing for a seat.

The suite could not have caught this: the slot stub accepts any registration
and knows nothing about cardinality, keys or collisions. It now asserts the
chip carries a list id and that this plugin registers nothing into the corner.
This commit is contained in:
NotExpectedYet committed 2026-09-27 06:36:49 +01:00
1 parent 811871e978
commit 28df7a0e56
3 files changed
+61 -26

No files matched your search

+9 -7
View File
@@ -146,18 +146,20 @@ Parameters: `query`, `action`, `limit`, `path` (restrict to a subdirectory),
Two surfaces, both reading a host projection rather than polling:
- a **chip in the session header** — `Recall 3 · 40× · 457 KB kept out`. No price
on it, deliberately: at the measured rate a whole conversation's avoided
context is a fraction of a penny, and a chip advertising that reads as the tool
being useless rather than as the arithmetic being honest. The tooltip carries
the full comparison.
- a **chip in the session header's utilities** — `Recall 3 · 40× · 457 KB kept
out`. No price on it, deliberately: at the measured rate a whole conversation's
avoided context is a fraction of a penny, and a chip advertising that reads as
the tool being useless rather than as the arithmetic being honest. The tooltip
carries the full comparison.
- a **right-sidebar Recall tab** — the same figures with room for what they are
not: *"An estimate, and an upper bound: it assumes a whole file would have been
read each time. Token counts are bytes ÷ 4."*
Both render nothing when there is nothing to say — a conversation that never used
recall costs no layout at all, which matters for the header corner because the
framework lays it out only while its occupant renders something.
recall costs no layout at all. The chip is an entry in the header's `utilities`
list, carrying its own id. The far-right corner is deliberately left alone: it is
a single cell that the product's own right-sidebar expand control occupies, so a
registration there shadows shipped UI rather than sitting beside it.
The data path is `presentationMeta` → the `tool/result` event's `meta` → a
projection unit (`recallUsage`) with a wire view the browser reads through