FE-1663: Experiment Live Full-Duplex Migration - #9671
Conversation
Co-authored-by: Amp <amp@ampcode.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: Amp <amp@ampcode.com>
PR SummaryMedium Risk Overview Voice UX reuses consent and the dock via Reviewed by Cursor Bugbot for commit ef2643a. Bugbot is set up for automated code reviews on this repo. Configure here. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit b72c2ac. Configure here.
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

Note
Experiment 1: a standalone GPT-Live interview using the existing Voice controls.
Local testing passed; Vercel preview review is pending for pacing, interruptions, control placement and End behavior.
No application changes are executed. Domain-specific Brunch integration is in Experiment 2 (#9673).
🌟 What is the purpose of this PR?
Test whether GPT-Live-1 natively improves process interviewing: concise relevant
follow-ups, room for hesitation, and interruption/correction without losing meaning.
Smooth audio alone is not acceptance.
This first experiment is a labelled standalone conversation through the existing
Voice UX, not Brunch output or application execution. It asks whether the person
feels heard and the interview advances; full Brunch integration is deferred.
🔗 Related links
🚫 Blocked by
🔍 What does this change?
Voice enablement/credentials. Creation starts WebRTC; wait for
session.startedwithout sending another
session.start.backchannel, interruption and delegation policies. It explicitly has no backend
capabilities and cannot claim application execution or saved changes.
Local WebRTC audio levels drive Listening/Speaking and the microphone ribbon.
Unsupported lifecycle/playback actions stay hidden; no separate experiment panel.
Local media stops immediately on End; remote closure is not guaranteed.
realtimeorlivethroughPETRINAUT_VOICE_PROVIDER, pinned for themounted conversation. Unset remains Realtime; its prompts, admission, queue,
settlement and playback remain unchanged. Live cannot submit transcripts,
execute tools or insert canonical history. No automatic retry or input replay.
Pre-Merge Checklist 🚀
🚢 Has this modified a publishable library?
This PR:
Adds a patch changeset for
@hashintel/petrinaut.📜 Does this require a change to the docs?
The changes in this PR:
Updates the website README, mission and assistant user guide. Existing Realtime
screenshots remain applicable; experimental dock captures are local review evidence.
🕸️ Does this require a change to the Turbo Graph?
The changes in this PR:
fine; the exact tested revision was not supplied. This supports proceeding, not
comprehensive acoustic, naturalness or Brunch compatibility acceptance.
Model instructions are guidance, not an output guarantee.
are retained. Dock activity is not a turn boundary or proof of heard playback.
Browsers without audio-level telemetry retain Listening without an input meter.
tsx's Unix socket. Equivalentpackage checks ran directly against prepared dependencies with external network denied.
changed underneath it. Rerunning against the settled build passed all 518 tests.
🐾 Next steps
Draft stack: main → FE-1663 / #9671
→ FE-1664 / #9673.
Domain-specific elicitation details, modelling rules and application execution are
deferred to experiment 2, Experiment Live Full Brunch Integration (see the
preserved integration scope).
This experiment tests general interviewing and native conversational behavior only;
it does not port Brunch's domain prompt or grant Live domain authority in experiment 2.
The second experiment's authority recut and implementation live in the child PR,
not this standalone comparison.
PR 2 must retain finalized input → composer → Flue → Brunch → authorized Petrinaut
execution → complete-turn settlement → frozen canonical reply → Live delivery.
Brunch alone authors domain answers/questions. Approval, settlement and playback
eligibility remain distinct; unknown outcomes are not replayed or spoken as success.
The child records the accepted experimental policy in a separate authority commit:
authoritative transcription plus native, unbuffered Live delivery with best-effort
speech control. Settlement gates supplied Brunch context, not all audible speech;
this is neither strict output gating nor exact relay. The child's reported connection
failure remains unresolved, and no live integrated exchange is claimed. Standalone
success does not reopen FE-1624. This PR adds neither an audio evaluation harness
nor PR 2 integration.
🛡 What tests cover this?
builds and typechecks. Lint has zero errors and one pre-existing Realtime effect
warning. Formatting and diff checks passed.
handshake, consent, canonical isolation, optional dock actions, failure and
cleanup. Activity tests cover simultaneous input/output, silence, unavailable
telemetry and samples arriving after Stop. Realtime retains its regression coverage.
fresh consent, Exit and unchanged Realtime setup. Screenshots were inspected.
The real Live controller was also exercised with mocked media and SDP to verify
Listening/Speaking transitions and End cleanup in the existing dock.
Verification made no real microphone or provider requests.
Package commands:
test:unit(runfor Petrinaut),lint:tsc,lint:eslint,build.Kostandin's manual conversational/media acceptance remains outstanding.
❓ How to test this?
From this branch's repository root, with
OPENAI_VOICE_API_KEYexported or in thewebsite's
.env.local(full preparation commands are in the website README):Open http://localhost:4915/new → AI panel → Start voice mode → consent → Start voice.
Only the final action activates microphone/provider. Allow 10–15 minutes:
command, then start Realtime with the existing Brunch backend environment:
Reload for a new session. Judge feeling heard/interview progress separately from
transport correctness. Prior experiments do not constitute a passing baseline.
📹 Demo