Skip to content

fix(chat): keep delivery and error plumbing out of the transcript - #924

Merged
hussainph merged 5 commits into
mainfrom
volli/VC-852-chat-pane-keep-delivery-and-error-plumbing-out-o
Oct 20, 2026
Merged

hussainph merged 5 commits into
mainfrom
volli/VC-852-chat-pane-keep-delivery-and-error-plumbing-out-o

Conversation

@hussainph

@hussainph hussainph commented Oct 18, 2026 •

Copy link
Copy Markdown
Owner

Summary

  • Keep durable user messages in transcript order. Only a rejected receipt before any subsequent turn ran gets a Not delivered footer; pending and unconfirmed delivery stay out of the conversation.
  • Hide runtime error/Attention recovery rows while work runs. Show one stopped-failure row; remove it on a new turn. History readers get only the ordinary scroll-to-latest arrow, never a floating error pill.
  • Renderer/presentation only. No authored runtime/engine durability changes and no dependency on kickoff receipt timing.

Main merge and composer reconciliation

Merged origin/main 2661e1a with a normal merge commit 8cd8a36 (parents 8c82aaab9, 2661e1aa4), resolving chat-plane.tsx and chat-plane.progress.test.tsx. This includes VC-774 (bb41a5c2c, 44a5e04de, 543bbf7a2) and VC-216 (#897). No rebase or force-push.

Kept: VC-774's resident idleSends records, pendingIdleSends, receipt/refusal settlement, and pre-host bubble/Working bridge. They preserve the first message across attachment, queue-before-transcript gaps, idle/history reattachment, and view remounts. They are not just label suppression. Recovery Edit/Remove, explicit close, and queued-send acceptance/refusal still retire the right record. settledIdleSendIds names the existing completion predicate used by this bridge; ordinary held drafts now retire on host ownership without waiting for acceptance.

Deleted: transcriptDeliveryLabels and its copied map that deleted labels for quiet sends; the cross-ownership wait clock (pendingSince, waitTimes, since, and VC-216's mountedAt math); durable steering-label context; undeliveredRows/delivery-order tail; synthetic turn.started.commandId acceptance; and RuntimeAttentionScrollHint. quietSendIds is now openingSendIds: its remaining job is de-duplicating/placing the pre-host bubble and keeping Working visible, not hiding delivery labels. Local held-steer copy remains quiet as in current main.

Behavior choice: durable mid-turn steering follows the transcript projection's order, above Working, without a delivery footer. There is no separate delivery-ordered tail. The pre-host composer and host queue behavior stay unchanged.

Verification on the merged commit

pnpm install
# success; native rebuild completed
pnpm -C apps/desktop exec vp test run src/renderer/src/components/chat/chat-plane.window.test.tsx src/renderer/src/components/chat/chat-plane.test.tsx src/renderer/src/components/chat/chat-plane.progress.test.tsx src/renderer/src/components/chat/chat-plane.acceptance.test.tsx src/renderer/src/components/chat/chat-plane-model.test.ts src/renderer/src/stores/chat-sessions.test.ts --maxWorkers="$VOLLI_CONCURRENCY_HINT"
# 6 files / 332 tests passed:
# window 60, chat-plane 18, progress 28, acceptance 1, model 111, chat-sessions store 114
pnpm -C packages/session-presentation exec vp test run src/message-delivery.test.ts --coverage --coverage.include=src/message-delivery.ts --maxWorkers="$VOLLI_CONCURRENCY_HINT"
# 3 tests passed; 100% statements, branches, functions, lines for message-delivery.ts
pnpm --filter @volli/session-presentation typecheck
pnpm --filter @volli/desktop typecheck
pnpm exec tsc --noEmit -p tsconfig.json
# all three typechecks passed
pnpm exec vp lint apps/desktop/src/renderer/src/components/chat/chat-plane.tsx apps/desktop/src/renderer/src/components/chat/chat-plane.test.tsx apps/desktop/src/renderer/src/components/chat/chat-plane.progress.test.tsx apps/desktop/src/renderer/src/components/chat/chat-plane.window.test.tsx packages/session-presentation/src/message-delivery.ts packages/session-presentation/src/message-delivery.test.ts
# 6 changed files: zero warnings/errors
pnpm exec vp check
# formatting passed (3461 files); full-repository lint FAILED on inherited main issue below
pnpm run build
# passed

The unchanged VC-774 first-send, opening queue/turn handoff, history/closed-binding Enter, queue gap/remount, and recovery Edit/Remove cases all pass on the merged code. VC-216's obsolete assertion expecting durable Sending was updated to require no footer; its still-relevant local queue timing case remains.

Inherited lint blocker: apps/desktop/src/renderer/src/components/settings/panes/updates-pane.tsx:102 calls updateStatus(state, Date.now()) during render (react/purity). Confirmed the identical line exists in origin/main; that file is not changed by this PR. No unrelated lint fix included. All changed-file lint and all requested typechecks pass. The first merged test run was 331 pass / 1 obsolete durable-Sending assertion failure; the final rerun above is 332/332.

Drove it in the live app — merged code

Fresh verify-volli instance vd-f02651, built from clean merge commit 8cd8a36. The only mock was the external model HTTP boundary: a loopback fake scripted a real session_start call, streamed the child's first reply slowly, then returned HTTP 400 for a later user turn. Configured the isolated model through Settings; no internal setters/injected conversation or Attention state used as proof.

Key commands (all actions and generations are in transcript.jsonl):

node apps/desktop/e2e/volli-drive/cli.mjs doctor
node .scratch/vc852-live-provider.mjs
# starts the scripted loopback model and invokes volli-drive launch --model env --fixture basic --no-build
node apps/desktop/e2e/volli-drive/cli.mjs doctor vd-f02651
node apps/desktop/e2e/volli-drive/cli.mjs screenshot vd-f02651 --name merged-kickoff-mid-turn
node apps/desktop/e2e/volli-drive/cli.mjs screenshot vd-f02651 --name merged-stopped-failure-once
node apps/desktop/e2e/volli-drive/cli.mjs screenshot vd-f02651 --name merged-failure-scrolled-no-pill
node apps/desktop/e2e/volli-drive/cli.mjs state vd-f02651 cli session list --project DRV --json
node apps/desktop/e2e/volli-drive/cli.mjs state vd-f02651 sql "SELECT sequence, command_id, json_extract(payload,'$.kind') AS kind, json_extract(payload,'$.receipt.status') AS receipt, json_extract(payload,'$.attention.kind') AS attention FROM session_events WHERE session_id LIKE '0e61e378%' ORDER BY sequence"
node apps/desktop/e2e/volli-drive/cli.mjs console vd-f02651 --tail 10
node apps/desktop/e2e/volli-drive/cli.mjs stop vd-f02651
node apps/desktop/e2e/volli-drive/cli.mjs list

Results:

  • Real parent 86a20bc0 called session_start; child 0e61e378 on DRV-1 was working during capture, with the parent recorded in startedBy.
  • Mid-turn ledger stopped at sequence 13: kickoff command.recorded at 12, uncorrelated turn.started at 13, no kickoff receipt. Screenshot shows kickoff above streaming assistant text with no Sending footer. After turn.completed 16, the accepted receipt arrived at 17.
  • Failed follow-up: turn.started 19 → attention.raised(adapter_unrecoverable) 21 → turn.interrupted 22. Screenshot shows one stopped-failure recovery row. Scrolling up yields only button "Scroll to latest", no floating error pill.
  • Doctor before/after: 8/8 keychain traps active, zero violations, home paths isolated. Renderer console empty. Instance and custom provider stopped; final list: no instances.

Fresh evidence (local artifacts, not committed):

.scratch/volli-drive/vd-f02651/
  screenshots/001-merged-kickoff-mid-turn.png
  screenshots/002-merged-stopped-failure-once.png
  screenshots/003-merged-failure-scrolled-no-pill.png
  transcript.jsonl
  mid-turn-ledger.json
  session-ledger.json
  session-list.json
  doctor.txt
  manifest.json

These supersede the stale-base screenshots from vd-479bb8. Screenshot upload is unavailable through this CLI; local artifacts are retained, not included in the public repository.

Ticket: VC-852

@coderabbitai

coderabbitai Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: f09c537a-b35e-43ef-8e08-167f4e32be84
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@hussainph
hussainph merged commit 4d940a2 into main Oct 20, 2026
23 checks passed
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