Skip to content

Calm chat plane: one scroll owner + native @tanstack/ai stack - #597

Open
omridevk wants to merge 261 commits into
mainfrom
calm-chat-plane
Open

Calm chat plane: one scroll owner + native @tanstack/ai stack#597
omridevk wants to merge 261 commits into
mainfrom
calm-chat-plane

Conversation

@omridevk

Copy link
Copy Markdown
Contributor

Calm chat plane

Spec: docs/superpowers/specs/2026-08-26-calm-chat-plane.md. 251 commits, phases 0/1/3/2 (2.b cut). One sentence: the chat plane now streams calmly and runs on @tanstack/ai's native stack end to end - their transport, their run store, their sandbox durability - with our parallel implementations deleted.

Phase 0+1 - harness & upgrade

Calm characterization harness (12 blocking gates), @tanstack/ai family 0.43→0.51, one-tree thread.

Phase 3 - calm surfaces

One scroll owner: the TanStack virtualizer owns every scroll write (stick-to-bottom package deleted, five competing writers removed); one-shot landing, cause-driven follow; reload lands at the end, a released reader is never yanked. Trace perf: grouper O(n), diff pacing, Firefox p90 9.3ms. Fold-on-send, settle chip, stable message ids.

Phase 2 - deletion ladder onto @tanstack/ai

Audited every parallel we had against upstream, then deleted in order:

  • Stores: SQLite RunStore/MessageStore/MetadataStore on the ai-persistence schema; chat_threads is the single record of a session (write-time CLI transcript import, msgid dedupe, compaction re-anchor).
  • Sandbox: withSandbox with runs+durability; run journals scoped to the server state root; local-process provider patched so destroy actually kills the process tree (Stop kills the CLI).
  • Liveness: the run record is the only source; live-runs map, run-driver registry, and every session-keyed map deleted. A run cancels itself by polling its own record; stop = record intent + await terminal.
  • Transport (2.c): chat rides /chat-ws (their WebSocket stream) with /chat-sse fallback; oRPC rides fetch only; /rpc-ws, the probe stack, partysocket, chat.send, chat.subscribe, and the per-run MESSAGES_SNAPSHOT are gone. chat.hydrate (+ pending approvals, last run) is the reload story; a per-tab /push-ws carries page queries and out-of-band asks (fixes 6-tab HTTP pool starvation).
  • Tools: TanStack naming (zod-enforced), one tool per verb (26→17), twin invalidate/refetch collapsed.

Bugs found & fixed on the way (each with failing-first tests)

  • Session switch re-suspended the live pane via a tracked useQuery().data read under the router's Match Suspense → pane detach/re-insert → scroll stranded at top. Query hoisted above the boundary; the scroll owner now also survives ANY viewport re-insert (preserve-reader-anchor vs resume-following).
  • A stopped client never learned its run ended (terminal chunk wasn't published to the session stream) → stuck Stop button.
  • Unmount leaked the chat socket; the widget bundle carried a node shim that broke mounting; run journals replayed stale bytes across suite runs; the mascot stopped narrating foreign-client runs.

Testing

~90 tests rewritten to the real one-step turn surface (no fake attach+send); five subscribe ITs re-homed claim-for-claim onto hydrate+joinRun; embed e2e rewritten around one chat socket per tab; every fix carries failing-first evidence and a revert-check. Full gate green: 109/109 turbo tasks + typecheck/lint/format/fallow/changesets.

Follow-ups (tracked, deliberately out)

panel-view-tabs hollow gate repoint; PendingPane micro-flash (needs a repo-wide non-suspending read pattern decision); journal sweep on dispose; rpcWebsocketRoute fate (test-only consumers now); chatBusy collapse onto the run record; virtualizer re-arm on reconnect guarantee; out-of-band ask mount race (attach-window vs plain timeout); clearScript drain wired into the other scripted suites; notifyRunDisconnected unreachable (detach written from core; sandboxKey unstamped on viewer departure); durable log truncates on disconnect (hydrate covers reload); recorder frame-splitter fate; unused @orpc/standard-server* catalog entries.

🤖 Generated with Claude Code

omridevk and others added 30 commits August 23, 2026 03:49
The exec card flattened its logs and its typed result into one ansi
string, so an object result arrived as an escaped one-line JSON blob and
the structured renderers were never reached. Logs and result are now
separate: the logs keep the ansi block, and the result goes through a
shared shape helper that opens objects and arrays as a JsonTree, leaves
strings as strings, and puts scalars on one compact line. There is no
parse-twice heuristic on string values. The meta-driven card takes the
same path for an object output schema instead of degrading to raw text.

Page script steps no longer label themselves with the literal word
"script": the step target is the clipped first line of the script, and
the duplicate value pill is dropped for them. A long value on any other
step type still starved the target column, so the value chip carries its
own max-width variant and the rail's value track is minmax(0, max-content).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
subscribe.ts keeps both mechanisms: offset-attach catch-up from replay-history
and lifecycle replay from run-lifecycle, with the lifecycle yielded after the
replayed RUN_STARTED chunks so a stopping phase is not clobbered.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
permission-block keeps rail's two-list-item restructure and gate-policy's
Allow-for-session button, which now sits inside the restructured actions row.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
thread.tsx keeps rail's streamingPart/runningPart split and narration's
reasoned gate plus compact now-line. status-bar keeps the lifecycle stopping
reason tooltip and the narration running dot.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chat-connection keeps the refresh reopen promise and the attempt restructure,
with the run-lifecycle tap folded into the attempt loop instead of a separate
wrapper generator. ChatSession keeps the async refresh and the stop state.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
result-rendering split runOutputText into runLogText plus a separately rendered
shaped result; card-polish's hasEmbeddedBody probe still called the old name.
It now asks both halves so the probe covers the same cases as before.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
eval-steering declares approval: 'ask' on page.eval, so the parent-id tests
written against the ungated tool hung on the gate. They now answer the ask
through the testkit auto-approval helper; the parent-id assertions are unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
run-lifecycle dropped the client-side chat.stop that every send used to issue,
so the reconnect wire helper no longer waits for a stop frame. card-polish
leaves a tool row inert when its card declares no embedded body, so the exec
row is asserted by its content instead of an expand button it no longer has.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
)

The switcher was a hand-rolled toolbar of aria-pressed buttons whose
active state was a static inset box-shadow, so switching views had no
motion and the markup carried none of the tab semantics.

- Drive the switcher with Ark Tabs (tablist/tab, controlled by
  value/onValueChange over the existing activeView signal) and render
  the active marker with Tabs.Indicator, so the 2px accent line slides
  between tabs on the zag --left/--width variables instead of jumping.
- Indicator motion uses the existing --chat-ease-expo token and is
  reduced-motion-guarded through --transition-duration, so the marker
  still lands instantly under reduce rather than vanishing.
- ui-kit-system gains TabsPrimitive, matching the *Primitive convention,
  so a surface with its own cell language can use Ark Tabs without
  importing @ark-ui directly; its styled Indicator gains the same
  reduced-motion guard.
- Keep the count hints, the leave-guard disabled state, and the narrow
  container-query behaviour; move the active fill onto data-[selected].

Views stay where the router renders them, so no Tabs.Content is wired.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…nt the install prerequisite

`intent list` reported every declared source as "declared in intent.skills but was
not discovered" in agent worktrees. Root cause was a missing `pnpm install` in the
worktree, not the config: intent discovers skills by resolving each workspace
package's dependencies, so with no local `node_modules` Node resolution escapes
upward into the main checkout and finds only what is hoisted there.

`@tanstack/query` was separately dead — no such package exists, and no installed
query package ships skills — so it produced a permanent false negative even on a
healthy install. Removing it makes the notice list empty when discovery is sound,
which is what lets the real failure stand out.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
git branch sat in the read-only subcommand set, so `git branch <name>`
created and `git branch -D <name>` deleted without asking. It now
auto-allows only list-shaped forms: bare, or every token a list flag
(-a/-l/-r/-v/-vv/--list/--show-current/--merged/--no-merged/--contains
/--sort=*). Any non-flag argument or write flag falls through to ask.

git diff --output=<file> writes a file yet matched `git diff *`. Any
--output token in a git segment now vetoes the auto-allow, the same way
find's write actions and env's wrapped command already do.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Ark tabs shipped with aria-controls resolving to nothing: the views
render through the router outlet rather than Tabs.Content, so the id zag
generated named a panel that was never in the document.

- Pin the trigger and content ids with Tabs.Root ids={{trigger, content}}
  so both sides can name the same element without guessing zag's
  generated id.
- Put role="tabpanel", that id, and aria-labelledby on the slide
  container each view already renders: ChatPane's pane body for the chat
  view, the mounted-view wrapper for an extension view. Both are real
  boxes in the panel flex column, so the layout is untouched and no
  display:contents wrapper drops the role out of the a11y tree.
- The role is opt-in through ChatPane's viewTab prop, because PiP and
  Quick mount the same pane with no tablist around it.

Exactly one tabpanel is rendered at a time, which is what the router
already guarantees.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ny run

The mascot read a global OR of every mounted pane plus every cached session
row, so one run anywhere lit it and a row cached mid-run kept it lit long
after that run finished. It now answers for the active session alone: a
mounted pane for that session owns the answer, and only when no pane is
mounted does the cached row for that one session speak.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ersist run records

The CLI transcript is sliced at the native record id of the last folded
message instead of by matching prompt text. Claude JSONL records carry a
per-record uuid, pi entries carry an id, and opencode message rows carry
their primary key; those three now mint UIMessage ids from that identity.
Codex envelopes carry no per-message id, so codex keeps positional ids and
every harness keeps the prompt-boundary match as the fallback.

Run status, timestamps and terminal error persist in a runId-keyed runs
table, written at the single publishRunLifecycle seam and served to a
subscriber when the in-memory store is empty after a restart. Runs left
mid-flight by a dead server are marked aborted when the database reopens.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tarted

Activity.Now was the second, parallel narration surface: it read the activity
store's activeCall while the shipped pin above the composer reads NowLine fed
from the thread grouping store. Nothing outside its own story used it, so it
goes along with its NowLine import. NowLine, Activity.Root and Activity.Timeline
stay: other renderers depend on them.

The narration gate also missed a turn this client did not start. sessionGenerating
was the only source for that and it suspends, which the composer must never do,
so useChatSession derives a non-suspending sessionRunning from the run lifecycle
chunks it already taps: a lifecycle received whose phase is not terminal.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sweeping every head in READ_ONLY_COMMANDS and every git read subcommand
against its real flag surface turned up three more ways an auto-allowed
command runs or writes something:

rg --pre=COMMAND runs COMMAND per searched file and --hostname-bin=COMMAND
runs COMMAND outright, so both forms now ask.

grep resolves to ugrep in our environments, which adds --filter=COMMANDS
(runs a filter utility), --pager/--view (run a command), --save-config
(writes a config file to any path) and --config/---FILE (loads options
from a file, reintroducing the others indirectly). None exist in BSD or
GNU grep, so vetoing them costs nothing and closes the hole.

date sets the system clock from a bare operand on BSD and from -s/--set
on GNU, so date now allows only +format and non-clock flag tokens.

The per-head rules move into one READ_ONLY_ESCAPES table behind
escapesReadOnlyIntent, replacing the two ad-hoc predicates gate.ts was
chaining, so the swept set is auditable in one place. Flag matching now
compares the name before '=', which keeps --output-indicator-new and
--filter-magic-label from being vetoed by the --output and --filter rules.

Verified clean, no veto needed: cd ls cat pwd echo head tail wc which
true, find (its write-action list was already complete), env (already
vetoed whenever it carries an argument), and git status/log/show.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… gate

A code-mode approval could not be answered after a refresh. The synthetic
conciv:tool_call chunks travelled isolate -> chat stream -> stream fold ->
run controller, while the gate appended its approval-requested chunk to the
same durable log directly, so the log held an approval for a tool call it had
not announced yet. The server-side replay that rebuilds a resubscribing
client's snapshot dropped it and the part came back as input-complete.

The run now hands code-mode tools an emitter that folds each conciv:tool_*
event into chunks and appends them at emit time, which is before the gate is
consulted, so true order holds by construction. The stream fold no longer
expands those events, so nothing is written twice. The approval keeps the
inner tool call's id.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
omridevk and others added 21 commits August 30, 2026 04:07
The delivery transports dial lazily: @tanstack/ai-client's webSocket()
subscribe only registers a sink and opens the socket inside send(), and our
subscribeOver() wrapper does the same for the SSE adapter. ChatClient only
flips connectionStatus 'connecting' -> 'connected' inside processIncomingChunk,
so no chunk ever arrived before the first run and the status never moved. The
composer's send gate asked for exactly that status, so every send was refused
with "Not connected yet" and no turn could ever open the socket that would have
answered the question.

Send readiness is now engine reachability alone, which is what the fetch retry
votes already measure. Transcript readiness is the hydrate call landing, which
is the fact the pane's skeleton actually waits on, published by the connection
that owns hydrate.

The fetch fallback then failed its CORS preflight: the adapter names the run in
an X-Run-Id header and resumes with Last-Event-ID, and the engine allowed
neither, so a cross-origin host page could POST nothing to /chat-sse.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every tab held a permanent page.queries fetch stream, so six widget tabs
exhausted Chrome's six-connection budget for the origin and the sixth tab's
rpc never got a socket to travel on. Server push now rides one websocket per
tab at /push-ws: the page-query bus and the session event stream both frame
onto it, and every request/response call stays on oRPC over fetch.

The out-of-band approval ask comes back with it. A gated tool call from
outside a chat run publishes onto the session stream, the push socket carries
it, and chatConnection merges those chunks into the same subscribe stream the
delivery adapter feeds, which is where the retired chat.subscribe iterator
used to land. A socket that replaces a dropped one is handed the asks still
pending on its session, so a reconnect mid-ask does not strand the caller.

The scoped asks.open dropped its approval record on the floor, so a gated
registry call never registered a PendingApproval and neither hydrate nor the
replay could see it. It carries the record through now.

The client side reconnects with partysocket rather than a hand-rolled loop,
and the page plane takes a query source instead of an rpc client, so the
socket owner decides the transport.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tream

Three files still asked the session event stream for a run's content. That
stream carries lifecycle records and out-of-band asks now; a run's snapshot,
deltas and RUN_FINISHED ride the turn stream the delivery transport opens, and
a late reader joins the run log rather than the bus.

wire's send-acceptance assertion named the retired chat.send envelope, so it
now reads the run id off the run's own RUN_FINISHED. The two late-attach claims
join the run by id. The draft claims read the settled thread through
chat.hydrate. createTestkit awaits the turn it started.

peakLiveRuns was retargeted onto run-lifecycle records two commits ago but its
unit test still fed it raw RUN_STARTED/RUN_FINISHED chunks, which the helper no
longer counts; it speaks lifecycle records now, and gains the overlap case.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A run opened by appending the whole thread to its own stream, so every turn
paid for a full transcript over the wire and a client that already held the
thread got it again. chat.hydrate is the one place a client asks for the
thread now; a run streams only what it produces.

The claims that read the run-opening snapshot read hydrate instead: the
between-runs poisoning pair (snapshot-resubscribe, rich-transcript T5), the
mid-flight joiner catch-up (T7/T8), the two message-id stability tests, the
memory-stress fresh turn, and wire's turn, join and no-resume history cases.
thread-identity states its claim on the stored thread directly, which is what
it was reading the log for.

firstSnapshot/lastSnapshot lose their last callers and go with them.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ves the app

launchRun was the only caller of RunController, and its one caller was the
compactor. Everything else already runs through makeTurn, whose stream the
delivery transport drives and whose terminal status recordRunSettled writes.
The compactor now claims its run record, drives runStream into the same run
log a chat turn writes, and publishes the settled record itself, so the chat
path holds one way to run a turn instead of two.

That empties the dispose drain: RunController only ever tracked compact runs,
and a compact is awaited by the call that asked for it, so drainWithDeadline
was racing an always-empty set.

stop-cancel-reason asked a scripted harness to 'hang around' and it answered
at once, so the run finished normally before the stop reached it and the
status assertion had been softened away to fit. It hangs the harness for real
now and pins status 'aborted' - verified load-bearing: forcing settledStatusOf
to always return 'completed' turns it red.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…red procedure

chat.send left oRPC with the transport swap, so the three fault tests pointed
their route at a path nothing calls any more: the send succeeded and the
composer had nothing to report. The fault now lands where a turn actually
travels - a POST to the chat delivery endpoint - so a refused turn is a 500 the
adapter raises and a dropped one is a connection the browser refuses.

The pane harness takes a transport preference and these three pin the fetch
transport, because vitest browser mode cannot install a websocket route: that
has to be in place before the page navigates, and the page is already loaded
when a test runs. The websocket half of the same claim needs a pre-navigation
route, which is the embed e2e suite's shape.

The dropped-turn message is the adapter's own 'Stream response body read
failed', so the assertion names that instead of a fetch rejection that no
longer reaches the user.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… its own id

The push socket hands a fresh connection every ask still pending on its
session, so a reconnect mid-ask re-delivers the approval chunk. The claim that
matters is that the replay carries the id the first delivery carried: a client
keyed on the approval id then updates the ask it already knows instead of
opening a second one, and hydrate still reports exactly one pending approval.

The push wire watch now collects the approval ids it sees, and the core
control can restart the served core, which is what drops the socket the widget
holds. Verified load-bearing: minting a fresh id for the replay turns it red.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The two transports still fold to the same transcript, but the user turn is no
longer on the wire for either of them, so the equivalence reads the assistant
reply off the stream and the whole thread off hydrate. Same for the finished-run
replay.

Three browser suites shared a pane-disposal afterEach verbatim, which fallow
flagged the moment the approval-replay suite made it a third instance; keptPane
owns it, next to the bootedCore they already shared.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A gated MCP, registry or page call with no chat run behind it asked over the push
socket and nothing rendered: the pane built approval cards only from a transcript
tool call, and an out-of-band ask has none.

Pending approvals now reach the pane as records. chat.hydrate carries them on open
and the push socket carries them live, the client keeps them in one store keyed by
approvalId, and the pane renders the same ui-kit-chat "Permission request" card for
every waiting ask whose tool call is not already in the transcript. Decisions still
ride rpc.chat.permissionDecision.

The card leaves when the ask settles: the gate publishes an approval-settled chunk
once a decision, a timeout, or a session stop resolves the wait, so a card also
disappears when another tab answers it.

The pane test harness now sends the session header the real widget sends, so a
decision made through the card reaches the core.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The recording test waited on the session bus for a MESSAGES_SNAPSHOT that no longer
rides it: the thread snapshot belongs to hydrate now, so the wait always stalled at
its hang guard. The claim is unchanged and is read where the evidence lives: the
persisted user message from chat.hydrate carries the expanded recording text as a
model-only part.

pane-open-perf named the same retired chunk in prose only; its matcher already keys
off the chat websocket handler, which is what the wording now says.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ort claims move to the planes that carry them

The launcher read the pane's own stream status, so a run started outside the
widget lit the transcript ("Responding…") while the mascot stayed asleep: with
chat on its own transport a foreign run reaches the pane as a run lifecycle, not
as a local stream. The pane now registers the session's activity - its own turn
or any live run on the session - so the mascot follows the targeted session from
the start of a run to its settle, and a run in a session it does not target still
leaves it asleep.

Three claims pointed at planes that no longer exist. settings.transport steers
the chat connection now and oRPC always rides fetch, so the standalone pinning
tests read the chat wire (a websocket frame or an event-stream POST) and keep the
rpc-rides-fetch half in both halves of the pair. The extension rpc call the page
observer watches rides fetch too, so the claim names that transport instead of
counting a socket nothing opens. The 500-from-a-healthy-engine claim faulted the
retired chat.send procedure, so it faults the chat turn and pins the fetch
transport, which vitest browser mode can route.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ides

The core stopped mounting /rpc-ws when oRPC moved to fetch only, so the five
probe-suite claims that dialled ${kit.wsBase}/rpc-ws died with it: the socket
never opened and every call raised "Cannot send message, WebSocket is not
open." No browser in this repo opens an rpc websocket any more, so those
claims had no subject to observe.

The playwright probe stack goes with the transport: the ws probe bundle, its
vite config, the probe host and probe server, the package's playwright
project, and the frame decoder that only outbound socket frames needed. The
observer keeps counting rpc sockets, which is what the embed connection-pool
and transport-selection claims read to prove the widget opens none, and the
fault injector loses a websocket branch nothing routed.

The claims that fetch can still carry are retargeted onto the ping extension:
a call is matched by its decoded input, an extension path is never matched by
a shorter path sharing its name, and a gated call stays started and
uncompleted until the gate releases it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…t drops its chat socket, and three suites follow the run onto its own plane

The push-socket testkit helper only ever watched for the NEXT websocket, so
the first waitForWidget in a file passed and every later one timed out: eleven
tanstack ITs died on a socket that had already been open for minutes. The watch
is now page-scoped and attached when the page opens, so a caller that arrives
after the socket is up settles on the ready frame it already received.

The chat websocket had no owner. oRPC's close used to take the tab's socket
down with it; with chat on its own socket nothing closed it, so every unmount
and every session switch left a live socket behind. chatConnection hands the
adapter a tracking WebSocket implementation and closes what it opened, and
useChatSession closes the connection when its owner disposes.

The widget suite now releases a held harness turn before it tears the kit down.
Playwright runs afterEach hooks in declaration order, so the per-file release
ran after the kit had disposed: the run settled into a closed database and the
unhandled rejection failed five fab tests.

The two perf suites waited for run completion on the session bus, which no
longer carries a run's chunks, and pane-open-perf looked for its ingestion load
in a websocket handler now that the transcript restore rides fetch. Both follow
the plane that carries the work.

CONCIV_FAKE_HANG no longer hangs forever: the fixture waits two minutes, far
beyond any test that stops it, then replies and exits, so an aborted run cannot
leave a fixture propping its parent open for a day.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rtion

A DOM re-insert of any ancestor of the thread viewport resets scrollTop to 0,
and the reset reached the scroll listener a frame later looking exactly like a
reader dragging to the top: the landing memory was cleared and the thread
stranded. A Solid Suspense above the pane re-suspending on a session switch
produces precisely that, twice per switch.

The owner now keeps a resting anchor with two modes, recorded from real reader
events only: preserve-reader-anchor writes the recorded offset back, clamped by
the DOM to the new maximum; resume-following re-enters landOnEnd against the end
the DOM has now, so turns appended while the pane was detached are followed
rather than stranded above. A MutationObserver watching childList on each
ancestor's direct parent detects the re-insertion inside the mutation microtask,
before the browser's delayed scroll event, and the correction goes through the
one existing landing call site.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The pane read harness meta with a tracked render-time read of a per-pane
useQuery result. Every session switch remounted the pane, the fresh
solid-query resource started unresolved, and the read registered on the
router match's Suspense: the pane root was detached and re-inserted as the
same node, which resets scrollTop and flashes the router pending pane.

The harness meta query is now created once above every Suspense boundary in
the router Wrap and handed to the pane as a plain derived accessor.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Run journals lived at the host-global /tmp/tanstack-runs, keyed by run id
alone, and the journaled command appends. A run that ends by detach returns
without cleaning up, so the file survives and the next server that uses the
same run id reads it from byte 0 and replays a previous server's output --
including a previous exit sentinel, which settles the fresh run as completed
before its own harness has emitted a byte. Under full-suite load that is what
made the detach durability test flake: the run record read back "completed"
about 1.5s before the fake harness process had even booted.

Journals now live under <stateRoot>/.conciv/runs, so two conciv servers on one
machine never share them.

The detach test also now asserts its precondition -- harness process alive and
the run still running -- before the viewer leaves, so a run that settled early
fails where it broke instead of as a missing detach marker.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The refresh progress tests gated chat.subscribe, a procedure the
websocket lane deleted, so the gate captured nothing and the
"Refreshing the conversation" state was a transient the assertion
caught only by luck. Gate chat.hydrate and wait for the capture.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The session stream announced a run's start but never its end: the
terminal RUN_FINISHED/RUN_ERROR only ever reached the run's own stream.
A client that stopped reading that stream - exactly what pressing Stop
does - kept the run in its active set, so sessionGenerating stayed true
and the composer never came back from Stop to Send.

The scripted test harness compounded it by ignoring the request abort
signal, so a held turn parked forever and the run record never left
'stopping'.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The reload-draft composer IT waited on a draft fragment that the
pre-chip draft already satisfied, so a reload could restore a draft
missing the chip's trailing space; the wait now names the settled text.

calm-contract shared one scripted-turn queue across the whole file, so a
turn left queued by one test was consumed by the next test's seeded
thread and rendered a second trace card. The harness script can now be
cleared and the suite drains it after every test.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
makeTurn mirrored the delivery request's abort signal into the run's own
AbortController. A widget session switch disposes the chat connection,
which closes the socket, which makes toWebSocketStream tear down every
active turn - so a mere UI switch reached the run as a cancel: the
harness stopped, the record settled 'aborted', and the session list lost
the run it was supposed to take the busy state over from.

Cancellation is already record-driven (chat.stop marks cancelRequested
and the run's own poll aborts with the cancel reason), so the transport
signal has no business aborting anything. It now means what it says -
this viewer is gone - and records detachedSince while the run keeps
producing to completion.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 30, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 812 files, which is 712 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3612a429-2264-4b85-9104-cd141a1c9160

📥 Commits

Reviewing files that changed from the base of the PR and between d56101e and 18e9e90.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (812)
  • .claude/hooks/turbo-filter-gate.sh
  • .fallowrc.json
  • AGENTS.md
  • apps/conciv/package.json
  • apps/conciv/src/app/context.ts
  • apps/conciv/src/app/live-sessions.ts
  • apps/conciv/src/app/pane-context.ts
  • apps/conciv/src/app/pane-provider.tsx
  • apps/conciv/src/composer/actions.tsx
  • apps/conciv/src/composer/session-selector.tsx
  • apps/conciv/src/data/settings.ts
  • apps/conciv/src/entry-standalone.tsx
  • apps/conciv/src/pane/chat-pane.tsx
  • apps/conciv/src/pane/indicators.stories.tsx
  • apps/conciv/src/pane/indicators.tsx
  • apps/conciv/src/pane/pane-composer.tsx
  • apps/conciv/src/pane/send-checks.ts
  • apps/conciv/src/pane/session-activity.ts
  • apps/conciv/src/pane/status-bar.tsx
  • apps/conciv/src/pane/tool-fallback-card.tsx
  • apps/conciv/src/pane/tool-view-ctx.ts
  • apps/conciv/src/pane/use-pane-messaging.ts
  • apps/conciv/src/router.tsx
  • apps/conciv/src/routes/__root.tsx
  • apps/conciv/src/routes/panel.$sessionId.$view.tsx
  • apps/conciv/src/routes/panel.$sessionId.index.tsx
  • apps/conciv/src/routes/panel.$sessionId.tsx
  • apps/conciv/src/routes/panel.connect.tsx
  • apps/conciv/src/shell/default-error-component.tsx
  • apps/conciv/src/shell/engine-notice.tsx
  • apps/conciv/src/shell/refresh-button.tsx
  • apps/conciv/test/attachment-widget.browser.test.tsx
  • apps/conciv/test/chat-pane.browser.test.tsx
  • apps/conciv/test/commands/core-control.ts
  • apps/conciv/test/commands/core-testkit.ts
  • apps/conciv/test/composer-overflow.browser.test.tsx
  • apps/conciv/test/core-request-gate.browser.test.ts
  • apps/conciv/test/grab-staging.browser.test.tsx
  • apps/conciv/test/helpers/app-context-value.ts
  • apps/conciv/test/helpers/core-control.ts
  • apps/conciv/test/helpers/core-session.ts
  • apps/conciv/test/helpers/pane-harness.tsx
  • apps/conciv/test/helpers/shell-harness.tsx
  • apps/conciv/test/indicators.browser.test.tsx
  • apps/conciv/test/live-sessions.browser.test.ts
  • apps/conciv/test/page-session-card.browser.test.tsx
  • apps/conciv/test/pane-composer-stop-send.browser.test.tsx
  • apps/conciv/test/panel-view-tabs.browser.test.tsx
  • apps/conciv/test/quick-refresh.browser.test.tsx
  • apps/conciv/test/reachability-flows.browser.test.tsx
  • apps/conciv/test/send-checks.test.ts
  • apps/conciv/test/session-activity.browser.test.tsx
  • apps/conciv/test/session-selector.browser.test.tsx
  • apps/conciv/test/status-bar.browser.test.tsx
  • apps/conciv/test/thinking-spinner.browser.test.tsx
  • apps/conciv/test/tool-card-dispatch.browser.test.tsx
  • apps/conciv/test/transport-standalone.it.test.ts
  • apps/conciv/test/user-turn.browser.test.tsx
  • apps/examples/tanstack-start/conciv/extensions/deploy-button.tsx
  • apps/examples/tanstack-start/src/components/Header.tsx
  • apps/examples/tanstack-start/src/styles.css
  • apps/site/content/docs/quick-start/ios.mdx
  • apps/storybook/.storybook/main.ts
  • apps/storybook/package.json
  • apps/storybook/vitest.config.ts
  • docs/testing-extensions.md
  • e2e/nextjs/package.json
  • e2e/nextjs/packed/fixture-lock.yaml
  • package.json
  • packages/cli/src/page.ts
  • packages/cli/test/cli-arguments.test.ts
  • packages/cli/test/cli-derived-commands.test.ts
  • packages/cli/test/cli.it.test.ts
  • packages/client/package.json
  • packages/client/src/chat-connection.ts
  • packages/client/src/index.ts
  • packages/client/src/reachability.ts
  • packages/client/src/use-chat-session.ts
  • packages/client/test/chat-client.it.test.ts
  • packages/client/test/chat-connection.it.test.ts
  • packages/client/test/chat-reachability.test.ts
  • packages/client/test/chat-reconnect.it.test.ts
  • packages/client/test/part-content.test.ts
  • packages/client/test/reachability.test.ts
  • packages/contract/package.json
  • packages/contract/src/browser-transport.ts
  • packages/contract/src/client.ts
  • packages/contract/src/contract.ts
  • packages/contract/test/browser-transport.test.ts
  • packages/contract/test/helpers/fake-native-socket.ts
  • packages/contract/test/reachability.test.ts
  • packages/contract/test/session-header-scoping.test.ts
  • packages/core/package.json
  • packages/core/src/api/mcp.ts
  • packages/core/src/api/rpc/chat.ts
  • packages/core/src/api/rpc/router.ts
  • packages/core/src/api/rpc/sessions.ts
  • packages/core/src/app.ts
  • packages/core/src/cards/code-run-card.stories.tsx
  • packages/core/src/cards/code-run-card.tsx
  • packages/core/src/chat/ask.ts
  • packages/core/src/chat/capabilities.ts
  • packages/core/src/chat/code-mode-parts.ts
  • packages/core/src/chat/code-mode.ts
  • packages/core/src/chat/gate.ts
  • packages/core/src/chat/live-runs.ts
  • packages/core/src/chat/resolve-schema-refs.ts
  • packages/core/src/chat/run.ts
  • packages/core/src/chat/runtime.ts
  • packages/core/src/chat/sandbox.ts
  • packages/core/src/chat/session-rows.ts
  • packages/core/src/chat/stop.ts
  • packages/core/src/chat/subscribe.ts
  • packages/core/src/chat/tool-names.ts
  • packages/core/src/chat/transcript.ts
  • packages/core/src/lib/cors.ts
  • packages/core/src/runtime/core-runtime.ts
  • packages/core/src/runtime/primitives.ts
  • packages/core/src/runtime/scope-types.ts
  • packages/core/src/start.ts
  • packages/core/test/api/connect-gate.it.test.ts
  • packages/core/test/api/cors.it.test.ts
  • packages/core/test/api/extension-mount-isolation.it.test.ts
  • packages/core/test/api/extension-server-surfaces.it.test.ts
  • packages/core/test/api/mcp/execute-stream.it.test.ts
  • packages/core/test/api/mcp/gate-metadata.it.test.ts
  • packages/core/test/api/mcp/mcp.it.test.ts
  • packages/core/test/api/mcp/ui-ask.it.test.ts
  • packages/core/test/api/page/agent-page-tool.it.test.ts
  • packages/core/test/api/page/page.it.test.ts
  • packages/core/test/api/page/tool-capture.it.test.ts
  • packages/core/test/api/rpc-ws.it.test.ts
  • packages/core/test/builtin-tool-calls.test.ts
  • packages/core/test/capability-collision.it.test.ts
  • packages/core/test/capability-list-guard.test.ts
  • packages/core/test/chat/approving-call-post-result-traffic.it.test.ts
  • packages/core/test/chat/capabilities.test.ts
  • packages/core/test/chat/chat-tools.test.ts
  • packages/core/test/chat/chat.it.test.ts
  • packages/core/test/chat/code-mode-parent-id.it.test.ts
  • packages/core/test/chat/code-mode-parts.it.test.ts
  • packages/core/test/chat/code-mode-parts.test.ts
  • packages/core/test/chat/code-mode-reload-fold.it.test.ts
  • packages/core/test/chat/code-mode.test.ts
  • packages/core/test/chat/command-policy.test.ts
  • packages/core/test/chat/compact-send-race.it.test.ts
  • packages/core/test/chat/compact.it.test.ts
  • packages/core/test/chat/compaction-history.it.test.ts
  • packages/core/test/chat/concurrent-send.it.test.ts
  • packages/core/test/chat/dispose-drain.it.test.ts
  • packages/core/test/chat/hostile-session-id.it.test.ts
  • packages/core/test/chat/live-runs.test.ts
  • packages/core/test/chat/mcp-approval.it.test.ts
  • packages/core/test/chat/mcp-ask-path.it.test.ts
  • packages/core/test/chat/memory-stress.it.test.ts
  • packages/core/test/chat/one-tool-surface.it.test.ts
  • packages/core/test/chat/page-gate-surfaces.it.test.ts
  • packages/core/test/chat/permission-gate.test.ts
  • packages/core/test/chat/resolve-schema-refs.test.ts
  • packages/core/test/chat/rich-transcript-snapshot.it.test.ts
  • packages/core/test/chat/run-id-reuse.it.test.ts
  • packages/core/test/chat/run-id-stamping.it.test.ts
  • packages/core/test/chat/run-log-instance-isolation.it.test.ts
  • packages/core/test/chat/run-log-preseed.it.test.ts
  • packages/core/test/chat/sessions-list.test.ts
  • packages/core/test/chat/snapshot-resubscribe.it.test.ts
  • packages/core/test/chat/snapshot-subscribers.it.test.ts
  • packages/core/test/chat/stop-then-send.it.test.ts
  • packages/core/test/chat/stream-effects.test.ts
  • packages/core/test/chat/tool-name-normalization.it.test.ts
  • packages/core/test/chat/tool-names.test.ts
  • packages/core/test/chat/transcript-durability.it.test.ts
  • packages/core/test/chat/transcript-sync-throw.test.ts
  • packages/core/test/chat/turn-detach.it.test.ts
  • packages/core/test/chat/turn-error-chunk.it.test.ts
  • packages/core/test/chat/turn-error-flood.it.test.ts
  • packages/core/test/chat/turn-first-chunk-deadline.it.test.ts
  • packages/core/test/client-tool-gate.test.ts
  • packages/core/test/expand-attachments.it.test.ts
  • packages/core/test/extension-tool-call-id.it.test.ts
  • packages/core/test/fixtures/fake-claude.ts
  • packages/core/test/helpers/boot.ts
  • packages/core/test/helpers/chat-fixture.ts
  • packages/core/test/helpers/fake-session.ts
  • packages/core/test/helpers/harness-turn.ts
  • packages/core/test/helpers/page-runtime.ts
  • packages/core/test/helpers/run-tally.test.ts
  • packages/core/test/helpers/run-tally.ts
  • packages/core/test/helpers/snapshots.ts
  • packages/core/test/helpers/turns.ts
  • packages/core/test/page-bus-inflight-teardown.test.ts
  • packages/core/test/page-bus-journal-persistence.test.ts
  • packages/core/test/rpc/registry-catalog-cosmetics.it.test.ts
  • packages/core/test/rpc/wire.it.test.ts
  • packages/core/test/runtime/ambient-session.test.ts
  • packages/core/test/system-prompt.test.ts
  • packages/core/test/testkit/create-testkit.it.test.ts
  • packages/db/package.json
  • packages/db/src/db.ts
  • packages/db/src/index.ts
  • packages/db/src/run-queries.ts
  • packages/db/src/run-schema.ts
  • packages/db/test/db.test.ts
  • packages/db/test/run-queries.test.ts
  • packages/embed/package.json
  • packages/embed/src/mount-impl.tsx
  • packages/embed/tests/e2e/chat-send-parts.it.test.ts
  • packages/embed/tests/e2e/composer-rich-input.it.test.ts
  • packages/embed/tests/e2e/connection-pool.it.test.ts
  • packages/embed/tests/e2e/create-conciv.it.test.ts
  • packages/embed/tests/e2e/element-capture.it.test.ts
  • packages/embed/tests/e2e/embed.it.test.ts
  • packages/embed/tests/e2e/fab-mascot.it.test.ts
  • packages/embed/tests/e2e/fab-working.it.test.ts
  • packages/embed/tests/e2e/forced-drop.it.test.ts
  • packages/embed/tests/e2e/helpers/suite.ts
  • packages/embed/tests/e2e/idle-fetch-heartbeat.it.test.ts
  • packages/embed/tests/e2e/model-selector.it.test.ts
  • packages/embed/tests/e2e/page-dispatch-boot.it.test.ts
  • packages/embed/tests/e2e/page-dispatch-parity.it.test.ts
  • packages/embed/tests/e2e/page-plane.it.test.ts
  • packages/embed/tests/e2e/pane-open-perf.it.test.ts
  • packages/embed/tests/e2e/rebind.it.test.ts
  • packages/embed/tests/e2e/recording-attachment.it.test.ts
  • packages/embed/tests/e2e/transport-reprobe-retry.it.test.ts
  • packages/embed/tests/e2e/transport-selection.it.test.ts
  • packages/embed/tests/e2e/unknown-view-restore.it.test.ts
  • packages/embed/tests/e2e/virtualize-threshold-cliff.it.test.ts
  • packages/embed/tests/unit/proxy-upgrade.test.ts
  • packages/extension-testkit/e2e/helpers/probe-server.ts
  • packages/extension-testkit/e2e/helpers/probe-suite.ts
  • packages/extension-testkit/e2e/rpc-fault.it.test.ts
  • packages/extension-testkit/e2e/rpc-observer.it.test.ts
  • packages/extension-testkit/fixtures/ping/server.ts
  • packages/extension-testkit/fixtures/ws-probe.ts
  • packages/extension-testkit/package.json
  • packages/extension-testkit/playwright.config.ts
  • packages/extension-testkit/src/connect-handshake.ts
  • packages/extension-testkit/src/framework-fake.ts
  • packages/extension-testkit/src/launch.ts
  • packages/extension-testkit/src/page-plane.ts
  • packages/extension-testkit/src/rpc-fault.ts
  • packages/extension-testkit/src/rpc-frames.ts
  • packages/extension-testkit/src/rpc-observer.ts
  • packages/extension-testkit/src/rpc-wire.ts
  • packages/extension-testkit/test/call-tool.it.test.ts
  • packages/extension-testkit/test/page-rpc-observer.it.test.ts
  • packages/extension-testkit/test/rpc-frames.test.ts
  • packages/extension-testkit/test/smoke.it.test.ts
  • packages/extension-testkit/vite.ws-probe.config.ts
  • packages/extension/src/catalog.ts
  • packages/extension/src/collect-client.ts
  • packages/extension/src/define-tool.ts
  • packages/extension/src/ext-rpc.ts
  • packages/extension/src/index.ts
  • packages/extension/src/sanitize-identifier.ts
  • packages/extension/src/tool-registry.ts
  • packages/extension/src/types.ts
  • packages/extension/test/collect-client.test.ts
  • packages/extension/test/define-tool.test.ts
  • packages/extension/test/extension-registry.test-d.ts
  • packages/extension/test/tool-registry.test-d.ts
  • packages/extension/test/tool-registry.test.ts
  • packages/extensions/ios/README.md
  • packages/extensions/ios/src/server.ts
  • packages/extensions/ios/src/server/prompt.ts
  • packages/extensions/ios/src/server/tools.ts
  • packages/extensions/ios/test/prompt.test.ts
  • packages/extensions/ios/test/server-tools.test.ts
  • packages/extensions/ios/test/tool-catalog.it.test.ts
  • packages/extensions/page/CHANGELOG.md
  • packages/extensions/page/src/client/bodies.ts
  • packages/extensions/page/src/client/cards/act-card.stories.tsx
  • packages/extensions/page/src/client/cards/act-card.tsx
  • packages/extensions/page/src/client/cards/console-card.stories.tsx
  • packages/extensions/page/src/client/cards/console-card.tsx
  • packages/extensions/page/src/client/cards/edit-live-card.stories.tsx
  • packages/extensions/page/src/client/cards/edit-live-card.tsx
  • packages/extensions/page/src/client/cards/effect-card.stories.tsx
  • packages/extensions/page/src/client/cards/effect-card.tsx
  • packages/extensions/page/src/client/cards/react-card.stories.tsx
  • packages/extensions/page/src/client/cards/react-card.tsx
  • packages/extensions/page/src/client/cards/read-bulk-card.stories.tsx
  • packages/extensions/page/src/client/cards/read-bulk-card.tsx
  • packages/extensions/page/src/client/cards/read-value-card.stories.tsx
  • packages/extensions/page/src/client/cards/read-value-card.tsx
  • packages/extensions/page/src/client/cards/session-card.stories.tsx
  • packages/extensions/page/src/client/cards/session-card.tsx
  • packages/extensions/page/src/client/cards/session-steps.ts
  • packages/extensions/page/src/client/cards/shared.tsx
  • packages/extensions/page/src/client/page-result-views.tsx
  • packages/extensions/page/src/server.ts
  • packages/extensions/page/src/shared/defs.ts
  • packages/extensions/page/test/act-card-body-nonempty.solid.browser.test.tsx
  • packages/extensions/page/test/card-input-chips.solid.browser.test.tsx
  • packages/extensions/page/test/catalog-honesty.test.ts
  • packages/extensions/page/test/defs.test.ts
  • packages/extensions/page/test/effects.browser.test.ts
  • packages/extensions/page/test/output-contract.test.ts
  • packages/extensions/page/test/page-tools.browser.test.tsx
  • packages/extensions/page/test/session-card.solid.browser.test.tsx
  • packages/extensions/page/test/session-steps.test.ts
  • packages/extensions/recorder/package.json
  • packages/extensions/recorder/src/tool/card.stories.tsx
  • packages/extensions/recorder/src/tool/card.tsx
  • packages/extensions/recorder/src/tool/client.ts
  • packages/extensions/recorder/test/capture-survives-run-end.it.test.ts
  • packages/extensions/recorder/test/flush-socket.it.test.ts
  • packages/extensions/tanstack/src/client.tsx
  • packages/extensions/tanstack/src/client/error-ring.ts
  • packages/extensions/tanstack/src/client/router-adapter.ts
  • packages/extensions/tanstack/src/client/verbs.ts
  • packages/extensions/tanstack/src/server.ts
  • packages/extensions/tanstack/src/server/adapter.ts
  • packages/extensions/tanstack/src/shared/verb-defs.ts
  • packages/extensions/tanstack/src/tool/back-card.tsx
  • packages/extensions/tanstack/src/tool/build-errors-card.tsx
  • packages/extensions/tanstack/src/tool/card-shared.tsx
  • packages/extensions/tanstack/src/tool/client.ts
  • packages/extensions/tanstack/src/tool/def.ts
  • packages/extensions/tanstack/src/tool/loader-data-card.stories.tsx
  • packages/extensions/tanstack/src/tool/loader-data-card.tsx
  • packages/extensions/tanstack/src/tool/navigate-card.tsx
  • packages/extensions/tanstack/src/tool/query-cache-card.tsx
  • packages/extensions/tanstack/src/tool/query-invalidate-card.tsx
  • packages/extensions/tanstack/src/tool/query-refetch-card.tsx
  • packages/extensions/tanstack/src/tool/route-manifest-card.tsx
  • packages/extensions/tanstack/src/tool/route-tree-card.tsx
  • packages/extensions/tanstack/src/tool/router-invalidate-card.stories.tsx
  • packages/extensions/tanstack/src/tool/router-invalidate-card.tsx
  • packages/extensions/tanstack/src/tool/router-state-card.tsx
  • packages/extensions/tanstack/src/tool/server-fn-trace-card.tsx
  • packages/extensions/tanstack/src/tool/server.ts
  • packages/extensions/tanstack/src/tool/trace.fixtures.tsx
  • packages/extensions/tanstack/test/connect-parity.it.test.ts
  • packages/extensions/tanstack/test/router-adapter.it.test.ts
  • packages/extensions/tanstack/test/router-card.browser.test.tsx
  • packages/extensions/terminal/package.json
  • packages/extensions/terminal/src/client/terminal-actions.tsx
  • packages/extensions/terminal/test/helpers.ts
  • packages/extensions/terminal/test/prefixed-serving.it.test.ts
  • packages/extensions/test-runner/src/tool/card.stories.tsx
  • packages/extensions/test-runner/src/tool/card.tsx
  • packages/extensions/test-runner/src/tool/client.ts
  • packages/extensions/try-it/src/client/connect-pane.tsx
  • packages/extensions/whiteboard/src/canvas/island.tsx
  • packages/extensions/whiteboard/src/shared/meta.ts
  • packages/extensions/whiteboard/src/tool/anchor/card.stories.tsx
  • packages/extensions/whiteboard/src/tool/anchor/card.tsx
  • packages/extensions/whiteboard/src/tool/anchor/def.ts
  • packages/extensions/whiteboard/src/tool/canvas/card.stories.tsx
  • packages/extensions/whiteboard/src/tool/canvas/card.tsx
  • packages/extensions/whiteboard/src/tool/canvas/def.ts
  • packages/extensions/whiteboard/src/tool/canvas/server.ts
  • packages/extensions/whiteboard/src/tool/client.ts
  • packages/extensions/whiteboard/src/tool/comment/card.stories.tsx
  • packages/extensions/whiteboard/src/tool/comment/card.tsx
  • packages/extensions/whiteboard/src/tool/comment/def.ts
  • packages/extensions/whiteboard/src/tool/element/card.stories.tsx
  • packages/extensions/whiteboard/src/tool/element/card.tsx
  • packages/extensions/whiteboard/src/tool/element/def.ts
  • packages/extensions/whiteboard/src/tool/story.fixtures.ts
  • packages/extensions/whiteboard/test/canvas-autocommit.it.test.ts
  • packages/extensions/whiteboard/test/canvas-commit.it.test.ts
  • packages/extensions/whiteboard/test/canvas-draft.it.test.ts
  • packages/extensions/whiteboard/test/canvas-drag-batching.it.test.ts
  • packages/extensions/whiteboard/test/canvas-drag.it.test.ts
  • packages/extensions/whiteboard/test/canvas-export-png.it.test.ts
  • packages/extensions/whiteboard/test/canvas-it-helpers.ts
  • packages/extensions/whiteboard/test/canvas-preview.it.test.ts
  • packages/extensions/whiteboard/test/canvas-prompt.test.ts
  • packages/extensions/whiteboard/test/canvas-quiescent.it.test.ts
  • packages/extensions/whiteboard/test/inbox-edges.it.test.ts
  • packages/extensions/whiteboard/test/inbox.it.test.ts
  • packages/extensions/whiteboard/test/pin-pan.it.test.ts
  • packages/extensions/whiteboard/test/thread-card.it.test.ts
  • packages/extensions/whiteboard/test/thread-delete.it.test.ts
  • packages/extensions/whiteboard/test/thread-empty.it.test.ts
  • packages/extensions/whiteboard/test/tool-cards.browser.test.tsx
  • packages/extensions/whiteboard/test/tool-catalog.it.test.ts
  • packages/harness-init/test/bridge.it.test.ts
  • packages/harness-testkit/package.json
  • packages/harness-testkit/src/call-tool.ts
  • packages/harness-testkit/src/create-fake-harness.ts
  • packages/harness-testkit/src/create-testkit.ts
  • packages/harness-testkit/src/run-events.ts
  • packages/harness-testkit/src/run-stream.ts
  • packages/harness-testkit/src/scripted-run.ts
  • packages/harness-testkit/src/testkit.ts
  • packages/harness-testkit/test/run-stream.test.ts
  • packages/harness-testkit/test/scripted-run.test.ts
  • packages/harness/package.json
  • packages/harness/src/claude/attach.ts
  • packages/harness/src/claude/chat.ts
  • packages/harness/src/claude/history.ts
  • packages/harness/src/claude/index.ts
  • packages/harness/src/opencode/history.ts
  • packages/harness/src/pi/history.ts
  • packages/harness/test/claude-attach.test.ts
  • packages/harness/test/claude-chat-config.test.ts
  • packages/harness/test/claude-history.test.ts
  • packages/harness/test/fixtures/claude-golden.json
  • packages/harness/test/fixtures/claude-transcript.jsonl
  • packages/harness/test/fixtures/pi-golden.json
  • packages/harness/test/opencode-history.test.ts
  • packages/harness/test/pi-history.test.ts
  • packages/harness/test/transcript-handles.test.ts
  • packages/oxlint-plugin/src/banned-vocabulary.js
  • packages/oxlint-plugin/test/fixtures/signal-ref/primitive-passed-ref.tsx
  • packages/page/package.json
  • packages/page/src/index.ts
  • packages/page/test/element-capture.browser.test.ts
  • packages/page/test/page-dispatcher.browser.test.ts
  • packages/page/test/page-plane-poll.test.ts
  • packages/page/test/page-plane-pump.test.ts
  • packages/protocol/package.json
  • packages/protocol/src/chat-types.ts
  • packages/protocol/src/framework-types.ts
  • packages/protocol/src/harness-types.ts
  • packages/protocol/src/tool-view-types.ts
  • packages/protocol/src/ui-types.ts
  • packages/protocol/src/usage-types.ts
  • packages/protocol/test/define-framework-adapter.test.ts
  • packages/protocol/test/page-wire.test.ts
  • packages/protocol/test/usage-types.test.ts
  • packages/protocol/tsdown.config.ts
  • packages/publish/src/guards.ts
  • packages/skills/skills/conciv-debug/SKILL.md
  • packages/skills/skills/conciv-develop/SKILL.md
  • packages/skills/skills/conciv-develop/references/tool-contract.md
  • packages/skills/skills/conciv-harness/SKILL.md
  • packages/solid-diffs/package.json
  • packages/solid-diffs/src/code-block.tsx
  • packages/solid-diffs/src/file-diff.tsx
  • packages/solid-diffs/src/index.tsx
  • packages/solid-diffs/src/patch-diff.tsx
  • packages/solid-diffs/tsconfig.json
  • packages/solid-diffs/vite.config.ts
  • packages/solid-stick-to-bottom/CHANGELOG.md
  • packages/solid-stick-to-bottom/LICENSE
  • packages/solid-stick-to-bottom/README.md
  • packages/solid-stick-to-bottom/package.json
  • packages/solid-stick-to-bottom/src/stick-to-bottom.stories.tsx
  • packages/solid-stick-to-bottom/src/stick-to-bottom.ts
  • packages/solid-stick-to-bottom/tsconfig.build.json
  • packages/solid-stick-to-bottom/tsconfig.json
  • packages/solid-stick-to-bottom/vite.config.ts
  • packages/solid-stick-to-bottom/vitest.shims.d.ts
  • packages/solid-streamdown/tsconfig.json
  • packages/solid-streamdown/vitest.config.ts
  • packages/tools/src/builtins.ts
  • packages/tools/src/builtins/server-tools.ts
  • packages/tools/src/cards.tsx
  • packages/tools/src/cards/extensions-card.tsx
  • packages/tools/src/cards/ui-card.tsx
  • packages/tools/test/builtins.test.ts
  • packages/ui-kit-chat-tools/src/index.tsx
  • packages/ui-kit-chat-tools/src/primitives/tools/now-title.ts
  • packages/ui-kit-chat-tools/src/styled/tools/apply-patch-diff.tsx
  • packages/ui-kit-chat-tools/src/styled/tools/bash-card.tsx
  • packages/ui-kit-chat-tools/src/styled/tools/discovered-apis-card.tsx
  • packages/ui-kit-chat-tools/src/styled/tools/file-edit-card.tsx
  • packages/ui-kit-chat-tools/src/styled/tools/file-read-card.tsx
  • packages/ui-kit-chat-tools/src/styled/tools/search-card.tsx
  • packages/ui-kit-chat-tools/src/styled/tools/search-matches.tsx
  • packages/ui-kit-chat-tools/src/styled/tools/todo-card.tsx
  • packages/ui-kit-chat-tools/src/styled/tools/tool-lookup-card.tsx
  • packages/ui-kit-chat-tools/test/catalog-cards.browser.test.tsx
  • packages/ui-kit-chat-tools/test/new-tool-projection.browser.test.tsx
  • packages/ui-kit-chat-tools/test/now-title.test.ts
  • packages/ui-kit-chat-tools/test/page-tool-cards.browser.test.tsx
  • packages/ui-kit-chat-tools/test/registry-card-declarations.browser.test.tsx
  • packages/ui-kit-chat-tools/tsconfig.json
  • packages/ui-kit-chat-tools/uno.config.ts
  • packages/ui-kit-chat-tools/vite.config.ts
  • packages/ui-kit-chat-tools/vitest.config.ts
  • packages/ui-kit-chat/package.json
  • packages/ui-kit-chat/src/behaviors/create-thread-virtualizer.ts
  • packages/ui-kit-chat/src/behaviors/scroll.stories.tsx
  • packages/ui-kit-chat/src/behaviors/top-anchor.ts
  • packages/ui-kit-chat/src/behaviors/use-follow-pause.ts
  • packages/ui-kit-chat/src/behaviors/use-scroll-lock.ts
  • packages/ui-kit-chat/src/behaviors/use-thread-auto-scroll.ts
  • packages/ui-kit-chat/src/behaviors/use-thread-scroll.ts
  • packages/ui-kit-chat/src/behaviors/use-top-anchor-reserve.ts
  • packages/ui-kit-chat/src/index.tsx
  • packages/ui-kit-chat/src/primitives/action-bar/action-bar.tsx
  • packages/ui-kit-chat/src/primitives/activity/activity.tsx
  • packages/ui-kit-chat/src/primitives/composer/composer.tsx
  • packages/ui-kit-chat/src/primitives/message/message.stories.tsx
  • packages/ui-kit-chat/src/primitives/thread/thread.tsx
  • packages/ui-kit-chat/src/primitives/thread/viewport-context.tsx
  • packages/ui-kit-chat/src/primitives/thread/viewport-internal.tsx
  • packages/ui-kit-chat/src/primitives/thread/virtualize-threshold.ts
  • packages/ui-kit-chat/src/primitives/util/create-auto-collapse.tsx
  • packages/ui-kit-chat/src/store/chat-busy.ts
  • packages/ui-kit-chat/src/store/chat-context.tsx
  • packages/ui-kit-chat/src/store/grouping.ts
  • packages/ui-kit-chat/src/store/page-session.ts
  • packages/ui-kit-chat/src/store/session-status.ts
  • packages/ui-kit-chat/src/store/story-connection.ts
  • packages/ui-kit-chat/src/store/turn-clock.ts
  • packages/ui-kit-chat/src/styled/action-bar.stories.tsx
  • packages/ui-kit-chat/src/styled/action-bar.tsx
  • packages/ui-kit-chat/src/styled/activity.stories.tsx
  • packages/ui-kit-chat/src/styled/activity.tsx
  • packages/ui-kit-chat/src/styled/group.tsx
  • packages/ui-kit-chat/src/styled/now-line.stories.tsx
  • packages/ui-kit-chat/src/styled/now-line.tsx
  • packages/ui-kit-chat/src/styled/reasoning.tsx
  • packages/ui-kit-chat/src/styled/text-metrics.ts
  • packages/ui-kit-chat/src/styled/thread.stories.tsx
  • packages/ui-kit-chat/src/styled/thread.tsx
  • packages/ui-kit-chat/src/styled/trace/action-row.tsx
  • packages/ui-kit-chat/src/styled/trace/clamp.tsx
  • packages/ui-kit-chat/src/styled/trace/output-block.stories.tsx
  • packages/ui-kit-chat/src/styled/trace/output-block.tsx
  • packages/ui-kit-chat/src/styled/trace/permission-block.stories.tsx
  • packages/ui-kit-chat/src/styled/trace/permission-block.tsx
  • packages/ui-kit-chat/src/styled/trace/rail.tsx
  • packages/ui-kit-chat/src/styled/trace/trace-row.tsx
  • packages/ui-kit-chat/src/styled/trace/trace.stories.tsx
  • packages/ui-kit-chat/src/styled/trace/trace.tsx
  • packages/ui-kit-chat/src/tools.tsx
  • packages/ui-kit-chat/src/tools/primitives/define-toolkit.ts
  • packages/ui-kit-chat/src/tools/primitives/permission.tsx
  • packages/ui-kit-chat/src/tools/primitives/tool-fallback.tsx
  • packages/ui-kit-chat/src/tools/primitives/tool-presentation.ts
  • packages/ui-kit-chat/src/tools/primitives/tool-row.ts
  • packages/ui-kit-chat/src/tools/styled/chip.tsx
  • packages/ui-kit-chat/src/tools/styled/code-block.tsx
  • packages/ui-kit-chat/src/tools/styled/collapsible-card.tsx
  • packages/ui-kit-chat/src/tools/styled/inline-row.tsx
  • packages/ui-kit-chat/src/tools/styled/json-tree.tsx
  • packages/ui-kit-chat/src/tools/styled/meta-tool-card.stories.tsx
  • packages/ui-kit-chat/src/tools/styled/meta-tool-card.tsx
  • packages/ui-kit-chat/src/tools/styled/permission-card.tsx
  • packages/ui-kit-chat/src/tools/styled/tool-call-card.tsx
  • packages/ui-kit-chat/src/tools/styled/tool-card.stories.tsx
  • packages/ui-kit-chat/src/tools/styled/tool-card.tsx
  • packages/ui-kit-chat/src/tools/styled/tool-fallback.tsx
  • packages/ui-kit-chat/test/action-bar-copy.browser.test.tsx
  • packages/ui-kit-chat/test/activity-standalone-outside-step-group.browser.test.tsx
  • packages/ui-kit-chat/test/assistant-action-bar-reveal.browser.test.tsx
  • packages/ui-kit-chat/test/card-body-nonempty.browser.test.tsx
  • packages/ui-kit-chat/test/chat-busy.test.ts
  • packages/ui-kit-chat/test/chip.browser.test.tsx
  • packages/ui-kit-chat/test/embedded-card-chrome.browser.test.tsx
  • packages/ui-kit-chat/test/empty-group-suppression.browser.test.tsx
  • packages/ui-kit-chat/test/follow-pause-no-animation.browser.test.tsx
  • packages/ui-kit-chat/test/grouping-diff.test.ts
  • packages/ui-kit-chat/test/grouping.test.ts
  • packages/ui-kit-chat/test/latest-chip-overlay.browser.test.tsx
  • packages/ui-kit-chat/test/meta-tool-card-error.browser.test.tsx
  • packages/ui-kit-chat/test/model-selector.browser.test.tsx
  • packages/ui-kit-chat/test/page-session-injection.browser.test.tsx
  • packages/ui-kit-chat/test/run-harness.tsx
  • packages/ui-kit-chat/test/session-status.test.ts
  • packages/ui-kit-chat/test/standalone-tool-outside-chain.browser.test.tsx
  • packages/ui-kit-chat/test/thread-session-log.browser.test.tsx
  • packages/ui-kit-chat/test/thread-trace-rail.browser.test.tsx
  • packages/ui-kit-chat/test/tool-call-card-dispatch.browser.test.tsx
  • packages/ui-kit-chat/test/tool-row.test.ts
  • packages/ui-kit-chat/test/tool-trace-row.browser.test.tsx
  • packages/ui-kit-chat/test/trace-permission-block.browser.test.tsx
  • packages/ui-kit-chat/test/trace-rail.browser.test.tsx
  • packages/ui-kit-chat/test/trace-row-card-header.browser.test.tsx
  • packages/ui-kit-chat/test/trace.browser.test.tsx
  • packages/ui-kit-chat/test/turn-clock.test.ts
  • packages/ui-kit-chat/test/virtual-thread.browser.test.tsx
  • packages/ui-kit-chat/tsconfig.json
  • packages/ui-kit-chat/uno.config.ts
  • packages/ui-kit-chat/vitest.config.ts
  • packages/ui-kit-system/package.json
  • packages/ui-kit-system/src/index.tsx
  • packages/ui-kit-system/src/json-tree-view.tsx
  • packages/ui-kit-system/src/presence.tsx
  • packages/ui-kit-system/src/tabs.tsx
  • packages/ui-kit-system/tsconfig.json
  • packages/ui-kit-system/uno.config.ts
  • packages/ui-kit-system/vitest.config.ts
  • packages/ui-kit-tap/package.json
  • packages/ui-kit-tap/src/rich-text-field.tsx
  • packages/ui-kit-tap/tsconfig.json
  • packages/ui-kit-tap/vitest.config.ts
  • packages/ui-kit-terminal/vite.config.ts
  • packages/uno-preset/src/animation.ts
  • packages/uno-preset/src/json-tree.ts
  • packages/uno-preset/src/motion.ts
  • packages/vitest-config/package.json
  • packages/vitest-config/src/reporters.ts
  • patches/@tanstack__ai-sandbox-local-process@0.2.1.patch
  • pnpm-workspace.yaml
  • .changeset/activity-now-retirement.md
  • .changeset/adopt-message-store.md
  • .changeset/adopt-run-store.md
  • .changeset/adopt-with-sandbox.md
  • .changeset/calm-claude-exec-guard.md
  • .changeset/calm-one-tree-thread.md
  • .changeset/calm-phase1-ai-family-upgrade.md
  • .changeset/calm-phase3-stable-assistant-id.md
  • .changeset/calm-phase3-surfaces.md
  • .changeset/calm-scroll-one-owner.md
  • .changeset/calm-scroll-one-shot-landing.md
  • .changeset/calm-turn-identity.md
  • .changeset/calm-virtualizer-sync.md
  • .changeset/card-body-contract.md
  • .changeset/clipboard-copy-primitive.md
  • .changeset/code-mode-approval-ordering.md
  • .changeset/curly-cups-shave.md
  • .changeset/delete-client-harness-dead-code.md
  • .changeset/delete-core-chat-parallels.md
  • .changeset/delete-dead-chat-plane-code.md
  • .changeset/diffs-highlight-worker.md
  • .changeset/diffs-pool-warm.md
  • .changeset/eval-steering-page-capabilities.md
  • .changeset/gate-git-branch-and-output.md
  • .changeset/gate-policy-session-scope.md
  • .changeset/gate-read-only-flag-sweep.md
  • .changeset/hungry-jars-repeat.md
  • .changeset/hydrate-owns-the-snapshot.md
  • .changeset/launcher-follows-session-run.md
  • .changeset/lucky-badges-shave.md
  • .changeset/model-selector-disabled-filter-pin.md
  • .changeset/narration-one-continuous-line.md
  • .changeset/narration-swap-on-presence.md
  • .changeset/olive-donkeys-shave.md
  • .changeset/olive-mails-attack.md
  • .changeset/out-of-band-approval-card.md
  • .changeset/pane-no-resuspend-on-session-switch.md
  • .changeset/pierre-diffs-1-3-6.md
  • .changeset/pierre-diffs-stale-highlight.md
  • .changeset/push-socket-transport.md
  • .changeset/quiet-narration-line.md
  • .changeset/quiet-rails-settle.md
  • .changeset/rail-run-accent.md
  • .changeset/refresh-coordinator.md
  • .changeset/scoped-run-journals.md
  • .changeset/sour-pugs-shave.md
  • .changeset/spry-crabs-follow.md
  • .changeset/streamed-code-block-gates.md
  • .changeset/tap-caret-preserved.md
  • .changeset/thread-viewport-reinsert.md
  • .changeset/tidy-cards-align.md
  • .changeset/tidy-moons-narrate.md
  • .changeset/tidy-rows-hum.md
  • .changeset/truncation-tooltips.md
  • .changeset/turn-estimate-settled-dom.md
  • .changeset/upgrade-tanstack-ai-051.md
  • .changeset/virtual-json-tree.md
  • .changeset/wild-buttons-repeat.md
  • .changeset/wild-donkeys-repeat.md
  • .claude/hooks/turbo-filter-gate.test.sh
  • apps/conciv/src/app/use-pane-chat.ts
  • apps/conciv/src/data/harness-meta.ts
  • apps/conciv/src/pane/pending-approvals.tsx
  • apps/conciv/src/pane/refresh-coordinator.ts
  • apps/conciv/src/pane/view-tab-ids.ts
  • apps/conciv/test/approval-replay.browser.test.tsx
  • apps/conciv/test/calm-contract.browser.test.tsx
  • apps/conciv/test/card-body-contract.browser.test.tsx
  • apps/conciv/test/exec-result-shape.browser.test.tsx
  • apps/conciv/test/helpers/calm-assertions.ts
  • apps/conciv/test/helpers/growth-watch.ts
  • apps/conciv/test/helpers/kept-pane.ts
  • apps/conciv/test/helpers/memory-storage.ts
  • apps/conciv/test/helpers/reduced-motion.ts
  • apps/conciv/test/launcher-activity.browser.test.tsx
  • apps/conciv/test/pane-composer-stopping.browser.test.tsx
  • apps/conciv/test/panel-refresh.browser.test.tsx
  • apps/conciv/test/session-switch-suspense.browser.test.tsx
  • apps/conciv/test/trace-row-churn.browser.test.tsx
  • docs/superpowers/plans/2026-08-26-calm-chat-plane-handoff.md
  • docs/superpowers/specs/2026-08-26-calm-chat-plane.md
  • docs/superpowers/specs/2026-08-27-gate-to-interrupt-adapter.md
  • packages/client/src/push-channel.ts
  • packages/client/src/stream-relay.ts
  • packages/client/test/chat-refresh.it.test.ts
  • packages/client/test/push-channel.it.test.ts
  • packages/client/test/rpc-reachability.test.ts
  • packages/core/src/api/push.ts
  • packages/core/src/chat/active-runs.ts
  • packages/core/src/chat/command-grammar.ts
  • packages/core/src/chat/command-memory.ts
  • packages/core/src/chat/delivery.ts
  • packages/core/src/chat/hydrate.ts
  • packages/core/src/chat/occupancy.ts
  • packages/core/src/chat/reclaim.ts
  • packages/core/src/chat/run-lifecycle.ts
  • packages/core/src/chat/run-settled.ts
  • packages/core/src/chat/session-events.ts
  • packages/core/src/chat/session-locks.ts
  • packages/core/src/chat/thread.ts
  • packages/core/src/chat/transcript-import.ts
  • packages/core/src/lib/socket-upgrade.ts
  • packages/core/test/api/rpc-fetch.it.test.ts
  • packages/core/test/chat/boot-reclaim.it.test.ts
  • packages/core/test/chat/code-mode-approval-replay.it.test.ts
  • packages/core/test/chat/command-memory.test.ts
  • packages/core/test/chat/delivery-transport.it.test.ts
  • packages/core/test/chat/hydrate-pending-approval.it.test.ts
  • packages/core/test/chat/hydrate.it.test.ts
  • packages/core/test/chat/interrupt-and-resend.it.test.ts
  • packages/core/test/chat/join-double-tail.it.test.ts
  • packages/core/test/chat/page-session-parent-id.it.test.ts
  • packages/core/test/chat/parked-run-resubscribe.it.test.ts
  • packages/core/test/chat/run-durability.it.test.ts
  • packages/core/test/chat/run-journal-isolation.it.test.ts
  • packages/core/test/chat/run-lifecycle.it.test.ts
  • packages/core/test/chat/run-liveness.it.test.ts
  • packages/core/test/chat/run-record-restart.it.test.ts
  • packages/core/test/chat/run-self-cancel.it.test.ts
  • packages/core/test/chat/sandbox-projection.it.test.ts
  • packages/core/test/chat/sandbox-teardown.it.test.ts
  • packages/core/test/chat/session-delete-settles-run.it.test.ts
  • packages/core/test/chat/session-locks.test.ts
  • packages/core/test/chat/session-run-end.it.test.ts
  • packages/core/test/chat/stable-assistant-message-id.it.test.ts
  • packages/core/test/chat/stable-user-message-id.it.test.ts
  • packages/core/test/chat/stop-cancel-reason.it.test.ts
  • packages/core/test/chat/thread-identity.it.test.ts
  • packages/core/test/chat/tool-first-text-delta.it.test.ts
  • packages/core/test/chat/transcript-anchor.it.test.ts
  • packages/core/test/chat/transcript-import.it.test.ts
  • packages/core/test/chat/transcript-merge-repeat.it.test.ts
  • packages/core/test/helpers/detached-turn.ts
  • packages/core/test/helpers/made-apps.ts
  • packages/core/test/helpers/thread.ts
  • packages/core/test/helpers/transcript-fixture.ts
  • packages/db/drizzle/20260823083136_overrated_scrambler/migration.sql
  • packages/db/drizzle/20260823083136_overrated_scrambler/snapshot.json
  • packages/db/drizzle/20260829095219_drop_replies/migration.sql
  • packages/db/drizzle/20260829095219_drop_replies/snapshot.json
  • packages/db/drizzle/20260829135940_public_microbe/migration.sql
  • packages/db/drizzle/20260829135940_public_microbe/snapshot.json
  • packages/db/drizzle/20260829142828_bored_the_anarchist/migration.sql
  • packages/db/drizzle/20260829142828_bored_the_anarchist/snapshot.json
  • packages/db/src/chat-thread-import.ts
  • packages/db/src/message-store.ts
  • packages/db/src/metadata-store.ts
  • packages/db/src/run-store.ts
  • packages/db/src/thread-queries.ts
  • packages/db/test/chat-persistence-conformance.test.ts
  • packages/db/test/chat-thread-upgrade.test.ts
  • packages/db/test/fixtures/legacy-db.ts
  • packages/db/test/run-records.test.ts
  • packages/db/test/run-store.test.ts
  • packages/db/test/thread-queries.test.ts
  • packages/embed/tests/e2e/landing-cost.it.test.ts
  • packages/embed/tests/e2e/tool-code-body.it.test.ts
  • packages/extension-testkit/src/chat-fault.ts
  • packages/extension-testkit/src/chat-wire.ts
  • packages/extension-testkit/src/push-wire.ts
  • packages/extension-testkit/src/rpc-payload.ts
  • packages/extensions/recorder/test/flush-transport.it.test.ts
  • packages/extensions/tanstack/test/tool-catalog.it.test.ts
  • packages/harness-testkit/src/chat-turn.ts
  • packages/harness/test/native-record-ids.test.ts
  • packages/protocol/src/approval-types.ts
  • packages/protocol/src/chat-busy.ts
  • packages/protocol/src/push-types.ts
  • packages/protocol/src/run-types.ts
  • packages/protocol/test/chat-busy.test.ts
  • packages/solid-diffs/src/render-sync.ts
  • packages/solid-diffs/src/worker-pool.ts
  • packages/solid-diffs/test/build-externals.test.ts
  • packages/solid-diffs/test/render-sync.test.ts
  • packages/solid-diffs/test/stale-highlight-result.test.ts
  • packages/solid-diffs/vitest.config.ts
  • packages/ui-kit-chat/src/primitives/util/create-settle-fold.tsx
  • packages/ui-kit-chat/src/store/active-call.ts
  • packages/ui-kit-chat/src/store/run-clock.ts
  • packages/ui-kit-chat/src/styled/morph-label.tsx
  • packages/ui-kit-chat/src/tools/primitives/now-title.ts
  • packages/ui-kit-chat/src/tools/styled/card-headline.tsx
  • packages/ui-kit-chat/src/tools/styled/shaped-content.tsx
  • packages/ui-kit-chat/test/bottom-pinned-log-scrollers.browser.test.tsx
  • packages/ui-kit-chat/test/code-block-landing-cost.browser.test.tsx
  • packages/ui-kit-chat/test/code-block-static-render.browser.test.tsx
  • packages/ui-kit-chat/test/code-block-streaming-growth.browser.test.tsx
  • packages/ui-kit-chat/test/markdown-code-highlight.browser.test.tsx
  • packages/ui-kit-chat/test/markdown-streaming-growth.browser.test.tsx
  • packages/ui-kit-chat/test/meta-tool-card-object-result.browser.test.tsx
  • packages/ui-kit-chat/test/now-line.browser.test.tsx
  • packages/ui-kit-chat/test/now-title.test.ts
  • packages/ui-kit-chat/test/page-session-cost.test.ts
  • packages/ui-kit-chat/test/permission-card-session.browser.test.tsx
  • packages/ui-kit-chat/test/run-clock.test.ts
  • packages/ui-kit-chat/test/thinking-narration.browser.test.tsx
  • packages/ui-kit-chat/test/thread-follow-machine.browser.test.tsx
  • packages/ui-kit-chat/test/tool-card-title-reveal.browser.test.tsx
  • packages/ui-kit-chat/test/trace-rail-resize-loop.browser.test.tsx
  • packages/ui-kit-chat/test/turn-estimate-calibration.browser.test.tsx
  • packages/ui-kit-chat/test/viewport-reinsert-recovery.browser.test.tsx
  • packages/ui-kit-chat/test/virtual-reload-layout.browser.test.tsx
  • packages/ui-kit-chat/test/virtual-scroll-coverage.browser.test.tsx
  • packages/ui-kit-chat/test/virtualizer-scroll-writes.test.ts
  • packages/ui-kit-system/src/clipboard-copy-button.stories.tsx
  • packages/ui-kit-system/src/clipboard-copy-button.tsx
  • packages/ui-kit-system/src/clipboard.ts
  • packages/ui-kit-system/src/truncated-text.stories.tsx
  • packages/ui-kit-system/src/truncated-text.tsx
  • packages/ui-kit-system/src/virtual-json-tree.stories.tsx
  • packages/ui-kit-system/src/virtual-json-tree.tsx
  • packages/ui-kit-system/test/clipboard.browser.test.tsx
  • packages/ui-kit-system/test/truncated-text.browser.test.tsx
  • packages/ui-kit-system/test/virtual-json-tree.browser.test.tsx
  • packages/ui-kit-tap/test/external-value.browser.test.tsx
  • packages/vitest-config/src/vite-lib.ts
  • patches/@pierre__diffs@1.3.6.patch
  • patches/@tanstack__ai-sandbox-local-process@0.2.4.patch
  • patches/@tanstack__ai-sandbox@0.5.3.patch

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

omridevk and others added 8 commits August 31, 2026 06:40
… chat sources

sandbox.ts and subscribe.ts were deleted on this branch: the sandbox is now
withSandbox from @tanstack/ai-sandbox wired in run.ts, and subscribe was
replaced by chat.hydrate plus delivery.ts and push.ts. Rewrite the prose that
described the old shape and repoint every citation, including the
harness-types.ts range that ran past the end of the file.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The tools were renamed canvas.read -> canvas_read (and comment.* -> comment_*),
but both cards still stripped a dotted prefix, so opOf returned the whole name,
every summary and field lookup missed, and the cards rendered an empty body.
Strip the underscored prefix instead, and finish the rename in the test's role
selectors, which still asked for a literal dot.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
expectSmooth guarded its percentiles with a raw frame count, which encodes the
host's refresh rate: the same virtualization-boundary window yields 55 frames on
a 120Hz dev display and 26-30 on CI. Sum the sampled gaps and require a minimum
sampled window instead, so the guard asks what it means - did we watch enough of
the stream for a percentile to be worth reading.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The branch moved @tanstack/ai 0.43.1 -> 0.51.0 and its family with it, and added
ai-persistence and ai-skills, so the packed Next fixture resolved a different
registry set than the committed lockfile and the drift guard stopped the suite
before its first assertion. Regenerated with update-packed-lockfile.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…kout

cacheDir "../.turbo-cache" is a local convenience for sibling worktrees, but it
resolves relative to each checkout, so on a CI runner it asks turbo to write
above the workspace. Drop it from the committed config and document the env var
that gets the shared local cache back.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The 1.3 line adds an opt-in editor entry point, partial-diff hydration and
CodeView header/footer regions. None of our surface changes: File, FileDiff,
getSingularPatch, registerCustomTheme, getOrCreateWorkerPoolSingleton and the
FileContents / FileOptions / FileDiffOptions / CustomThemeLoader types are all
unchanged, so no call sites move.

This does NOT fix the streaming code-block shrink from CI shard-4: the stale
render-cache write it was expected to close is still unguarded in 1.3.6, and
the shrink still reproduces under CPU load.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Backports upstream's own applyHighlightResult guard into the @pierre/diffs
1.3.6 dist: the FileRenderer now remembers the file it was last asked to
render and ignores highlight results that arrive for anything else, instead
of letting the last async highlight overwrite the render cache. Under load a
slow highlight for an earlier streaming snapshot could land after a newer one
and roll the rendered code body back a step.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ture lock

Two CI failures on run 33379928075, both with a cause that is not where
the shard names pointed.

shard-7 was reported as a whiteboard failure; whiteboard passed all 27
files and its INVALID_SVG / COMMENT_NOT_FOUND stacks are the declared
error paths printing to stderr. The real failure was @conciv/ui-kit-tap:
placeCaret clicked the editable and then sent {Home} with no barrier
proving focus had landed. userEvent.keyboard is untargeted - it goes to
whatever holds focus - so a key dispatched into the gap between the
click resolving and ProseMirror taking focus is lost with nothing to
re-press, and the caret stayed at the offset openingSelectionCommand set
at mount. That is the 11-11 in the failure DOM. Assert focus before every
untargeted key run, the same causal barrier 23995b2 gave the embed
caret-restore test.

The nextjs packed fixture lock was refreshed for the tanstack ai bump in
a38337d, and 1c6420c then moved @pierre/diffs to 1.3.6 without
refreshing it, so the seeded install re-resolved the @pierre subtree and
the drift guard fired. Regenerate it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant