FE-1624: Implement split-ownership Voice conversations with Brunch - #9571
Draft
kostandinang wants to merge 77 commits into
Draft
FE-1624: Implement split-ownership Voice conversations with Brunch#9571kostandinang wants to merge 77 commits into
kostandinang wants to merge 77 commits into
Conversation
Make the mounted /agents/chat/:instanceId route the only product door for both the typed Petrinaut panel and Voice. The typed panel gets a host-supplied browser ChatTransport over @flue/sdk that reuses the existing chunk projector; the server-side /api/chat door and its in-process dispatch path are removed, and transport-aisdk is repurposed as the browser-side adapter with ai + @flue/sdk as its only runtime dependencies. Records the boundary inspection that rejected a Hono-level relocation.
Restate the production door as the browser Flue transport at the mounted route, mark the Mission 8 restricted-ingress rule and /api/chat service contract as superseded pending re-expression at the release gate, consume the adapter-removal precondition, and point drafts 6, 7, and 10 at the successor of the /api/chat integration scenario.
State the release note, no-engineer demo script on the local deployment posture, and previously-impossible delta (Stop that really stops; one shared typed/spoken conversation), pin completion to the contract stratum rather than the first green tracer, and mark the single-route consolidation as internal sequencing rather than the visible advance.
Name Mission 5's surface as the Petrinaut Brunch panel's typed and Voice route and record that the live branch adopted the litmus on restack.
Now that the panel composer is itself Flue transport, let Voice enter either through it (preferred, one visible store) or by a direct send(); reword proof leaf 3 to forbid only non-Flue submission and record the choice and its fallback criterion on the fog-line.
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Update the living Petrinaut integration spec and topology reference to name the guarded Flue conversation mount, browser ChatTransport projection, and current transport-package dependency boundary. Narrow the Mission 5 route scan claim to its actual production paths while preserving superseded /api/chat references as historical provenance.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…n projections Review of PR #9528 read the ten bot findings as samples of three faults. Stop was not bound to the turn it targeted: a Stop during an in-flight admission now waits for that admission before the conversation-wide abort, a durable Stop result that lands after a newer turn started is ignored, and a Voice turn whose submission settles aborted closes its Realtime call without speaking, driven by Flue's settlement index because the AI SDK reports ready between a step and its automatic client-tool follow-up. The live-stream and snapshot projections encoded the same rules twice: the snapshot keeps providerExecuted on a running server tool and folds a client-tool continuation into the assistant message it resumed; the transport reports the resumed assistant id and the tracker keeps the originating submission for it; one client-tool catalog feeds the panel transport and the history projection; host history hydrates only once it carries every locally streamed reply. A retained Voice input can be withdrawn through an AbortSignal, a consumer stream cancel no longer writes to a closed controller, and first-canonical-text latency is recorded when the first completed text block appears. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A client-tool continuation is projected onto the assistant message it resumes, so one message can be written by several submissions, and either side may have admitted the continuation: the panel after a readPetrinautDoc call, or Voice when it answers a pending brunch_ask. Keeping only the first submission served one direction and broke the other. The tracker now records every submission per message, segments carry that set, and the bridge matches by membership while excluding segments that predate the answer. The Stop generation guard also covers the rejection path, so a durable Stop that fails after a newer turn started no longer records an error on that turn. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
…ld it The AI SDK reports ready between a step that ended in client tool calls and the follow-up it sends automatically. Hosts read that gap as the end of the turn: the Voice bridge closed its Realtime call on the step's partial text, and a Stop whose durable abort landed already-settled did nothing while the follow-up went out anyway. The panel now keeps its composer status busy until the follow-up starts, and a Stop pressed during the step withholds the follow-up and marks the response stopped.
Amp-Thread-ID: https://ampcode.com/threads/T-01a07d12-9d2b-730f-a20f-b2ba85ca102f Co-authored-by: Amp <amp@ampcode.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
3 Skipped Deployments
|
Amp-Thread-ID: https://ampcode.com/threads/T-01a07d12-9d2b-730f-a20f-b2ba85ca102f Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-01a07d12-9d2b-730f-a20f-b2ba85ca102f Co-authored-by: Amp <amp@ampcode.com>
Amp-Thread-ID: https://ampcode.com/threads/T-01a07d12-9d2b-730f-a20f-b2ba85ca102f Co-authored-by: Amp <amp@ampcode.com>
Restore the planning-only tree from before the evidence publication, retaining the published commits in history. Local evidence remains in the original successor worktree.
lunelson
force-pushed
the
ln/fe-1580-reconcile-voice-resumable-workpiece
branch
from
September 8, 2026 08:23
a0ca1cb to
704f961
Compare
lunelson
force-pushed
the
ln/fe-1580-reconcile-voice-resumable-workpiece
branch
2 times, most recently
from
September 8, 2026 14:09
de65620 to
bfd99d3
Compare
7 tasks
lunelson
force-pushed
the
ln/fe-1580-reconcile-voice-resumable-workpiece
branch
2 times, most recently
from
September 8, 2026 14:58
b1bb132 to
743c3c8
Compare
Base automatically changed from
ln/fe-1580-reconcile-voice-resumable-workpiece
to
main
September 8, 2026 16:30
6 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Important
Current status: #9537 and #9564 are merged. Wait for the omitted settlement port in #9588 to be accepted, then recut this draft from the latest
mainas an independent sibling PR. Do not merge it meanwhile. This planning-only successor remains blocked on its stated authority and runtime gates.🌟 What is the purpose of this PR?
Prepare split-ownership Voice conversations: Brunch retains domain strategy and validation, Realtime handles permitted conversational delivery, Flue owns the canonical conversation, and Petrinaut owns safe tool execution.
This draft is planning-only. It preserves the provisional design and presents a bounded mission-conversion proposal for owner approval. It does not change product behavior or promote the inherited accepted Mission 6b authority. Source inspection found no supported persistence-only external dialogue recorder in Flue 2.0.3 or the inspected upstream HEAD; dependent implementation is blocked rather than replaced with a sidecar.
🔗 Related links
🚫 Blocked by
The latter two gates block product implementation, not review of this planning packet.
🔍 What does this change?
MISSION.mdor changing product code.🏗️ Agent notes
Kostandin Angjellari authorized a new successor issue and draft PR stacked directly on #9564. FE-1624 and branch
kostandin/fe-1624-split-ownership-voiceform that successor. The original local checkout and its uncommitted design/spine remain intact. No parent or sibling branch was rewritten;gh stackwas unavailable, so the Git branch starts at the exact parent head and this PR explicitly targets its branch.There is no new live mission yet. The six-address candidate conversion is in the proposal. Its initial prerequisite is supported no-wake recording; the separately approved product stage is one Brunch delegation → two recorded Realtime exchanges → one structured agent-authored handback referencing originals → Brunch-validated workpiece update → fresh-process reconstruction. Integrated recovery and safety gates follow before readiness; the first tracer is not architecture completion.
Protect causal per-step client results, mixed server/browser topology, staggered sibling tools, effect-replay batching, explicit human evidence, conversation-owned callbacks, coherent-state refusal, and no autoplay. The current
runbook-irselector must not promote newly recorded Realtime assistant text to Brunch workpiece authority.Flue signals can carry non-human waking handbacks, but cannot substitute for persistence-only dialogue. Caller-supplied authorship attributes need application enforcement. Public abort leaves settled submissions untouched and does not durably cancel pending browser operations. Speech interruption and durable Stop remain separate; effect/receipt gaps require reconciliation rather than an exactly-once claim.
The detailed plan names stage owners, targeted package commands, real built-runtime tests, browser/media witnesses, no-wake/attribution/identity/staleness/modality/interleaving/partial-effect/recovery discriminators, and explicit no-paid-campaign gates. It preserves remaining architecture obligations in their planning homes rather than silently treating the first stage as completion.
Pre-Merge Checklist 🚀
🚢 Has this modified a publishable library?
This PR:
📜 Does this require a change to the docs?
The changes in this PR:
🕸️ Does this require a change to the Turbo Graph?
The changes in this PR:
🐾 Next steps
Review the bounded conversion envelope. Resolve the supported recording prerequisite, then commit owner-approved authority separately before dependent code. Preserve the remaining design obligations through each later gate.
🛡 What tests cover this?
MISSION.md, and byte-identical preservation of the source design.git diff --checkpasses.❓ How to test this?
MISSION.mdis identical to the parent, remaining architecture obligations retain planning homes, and no product readiness or paid-run claim is made.📹 Demo
Not applicable: this is a planning-only review packet with no UI change.