Voice: .ttsStopped emitted only on barge-in; natural completion leaves ducking engaged #30
Closed
opened 2026-05-12 19:06:23 +00:00 by KofTwentyTwo
·
1 comment
No Branch/Tag Specified
develop
ci/secrets-historical-baseline
feature/security-findings-2026-10
dependabot/npm_and_yarn/webview/npm_and_yarn-3ac77625be
dependabot/npm_and_yarn/webview/packages/bus/npm_and_yarn-c86b58a346
dependabot/npm_and_yarn/webview/vitejs/plugin-react-6.0.2
dependabot/npm_and_yarn/webview/vite-8.0.13
dependabot/npm_and_yarn/webview/zustand-5.0.13
dependabot/npm_and_yarn/webview/types/node-25.9.1
dependabot/npm_and_yarn/webview/vitest-4.1.6
dependabot/github_actions/actions/setup-node-6
dependabot/github_actions/github/codeql-action-4
dependabot/github_actions/actions/checkout-6
dependabot/github_actions/actions/cache-5
dependabot/github_actions/pnpm/action-setup-6
feat/local-first-llm-routing
docs/local-first-llm-routing-spec
fix/v0.2-wave-1-code-fixes
docs/v0.2-wave-1-doc-drift
docs/handoff-2026-05-14
docs/multi-runner-inventory
docs/ollama-baseline-58
fix/ci-env-harness-sqlite-voice-warmup
fix/ci-xcode-26-and-batcher-timing
chore/typecheck-blocking
fix/hud-typecheck-strict-undefined
wip/voice-log-menu-stash4
v0.1.0-dev.71
v0.1.0-dev.68
v0.1.0-dev.64
v0.1.0-dev.50
Labels
Clear labels
area:agent
area:build
area:bus
area:devtool
area:hud
area:logging
area:mcp
area:memory
area:vision
area:voice
audit-finding
bug
carry-forward
comment-cleanup
dependencies
documentation
duplicate
enhancement
epic
good first issue
help wanted
invalid
javascript
migration
question
severity:critical
severity:high
severity:low
severity:medium
wontfix
Something isn't working
Comment / docstring cleanup per .planning/code-commenting-guide.md
Dependency updates
Improvements or additions to documentation
This issue or pull request already exists
New feature or request
Good for newcomers
Extra attention is needed
This doesn't seem right
Pull requests that update javascript code
Further information is requested
This will not be worked on
Milestone
No items
No Milestone
v0.1 — It actually works (basic capabilities)
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: KofTwentyTwo/Jarvis#30
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
.ttsStoppedis emitted ONLY on barge-in; normal completion never releases ducking.TTSEngineActor.synthesizeyields.started,.firstAudio,.finished— never.ttsStopped. The class header andTTSEvent.swiftdocument the canonical sequence asstarted → firstAudio → ... → finished → ttsStopped, and theTTSInterrupt.swiftgrep gate enforceswc -l == 1for.ttsStoppedemission sites across the package. The one site that emits isInterruptSequence.run— only when barge-in fires.Evidence
packages/Voice/Sources/Voice/TTS/TTSEngineActor.swift:91-178packages/Voice/Sources/Voice/TTS/TTSEvent.swift:7-12(doc-comment canonical sequence)packages/Voice/Sources/Voice/TTS/InterruptSequence.swift:97(sole emit site, enforced by grep gate)packages/Voice/Tests/VoiceTests/TTSInterruptTests.swift:181(I4 test validates.ttsStoppedis the ducking-release signal)grep -rn ttsEventStream App/ packages/.../Sources/finds only theTTSEngineActordefinition — no production consumer wired yetImpact
Not biting today (no production ducking consumer exists yet). But the design contract is broken — the first production consumer of
ttsEventStreamthat implements ducking will leave the input duck engaged forever after a normal spoken reply. The contract / test pairing is an impedance mismatch hidden by mocks.Recommended fix
Decide and execute one of:
Make
TTSEngineActor.synthesizeemit.ttsStoppedon natural completion (in addition to.finished). Update the file-level comment "Ducking releases ONLY on.ttsStopped" to stay correct. LoosenInterruptSequencegrep gate towc -l >= 1.Rewrite the contract docs to say "ducking releases on
.finishedfor natural completion AND.ttsStoppedfor barge-in." LoosenInterruptSequencecomment from "ONLY site that emits."Option 1 is the cleaner contract; option 2 is documentation-only. Pick before #11 (M-6) wires the first production ducking consumer.
Test
AVSpeechSmokeTests/TTSEngineActorTier1Testsrun a real short synthesis and assert.ttsStoppedarrives (currently they short-circuit on.ttsStoppedfilter and the suite aborts before timeout)Source
.planning/audit-2026-05-12/voice-audit.md(2026-05-12) — finding P0-3Cross-references
Closed by v0.1 cluster merges on 2026-05-13. Develop now at
a8c7f1a0.