FE-1663: Experiment Live Full-Duplex Migration - #9671
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
1 Skipped Deployment
|
PR SummaryMedium Risk Overview On the client, Petrinaut gains Reviewed by Cursor Bugbot for commit c5f816a. Bugbot is set up for automated code reviews on this repo. Configure here. |
|
Code review concern (non-blocking for the experiment, but relevant to the published package): this changes |
|
@lunelson Addressed in 06b4f30. |
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
|
Follow-up remote review found two remaining issues:
|
Co-authored-by: Cursor <cursoragent@cursor.com>
|
@lunelson Addressed in 87659d4. Blocked Live playback now keeps an actionable dock warning, exposes a Play voice audio user-gesture retry, preserves the warning through activity updates, and clears it only after playback succeeds. The public context restores |
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 87659d4. Configure here.
Co-authored-by: Cursor <cursoragent@cursor.com>
lunelson
left a comment
There was a problem hiding this comment.
Re-reviewed the current remote head. Playback failure and recovery now preserve the latest activity state, the user-gesture retry remains actionable, and the public Voice registration contract is source-compatible. I found no remaining code issue; all current checks pass.

Note
Experiment 1: This PR evaluates a standalone GPT-Live interview using the existing Voice controls. Local testing passed. It does not execute application changes; 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
Review and merge stack: main (including merged FE-1573 / #9667)
→ FE-1663 / #9671
→ Petrinaut Voice platform / #9719
→ FE-1664 / #9673
→ FE-1712 / #9704.
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?
2026-09-14 restack: all eight parent commits are patch-equivalent to their
pre-restack versions. The focused Live/config suites pass (4 files, 47 tests), and
website typecheck/lint pass with no warnings. The full Turbo gate is not green:
website example generation fails in the generated Petrinaut Core HIR bundle with
TypeError: r.platform is not a function, including after rebuilding core. Coresource is unchanged from #9667. No provider session or microphone was started.
Previous, pre-restack evidence:
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