fix: launch the streaming speech helper with --fast (#5896) - #5907
Conversation
Opus 4.8 Review — ✅ no blocking findingsReviewed Verdict parsed from the review's SHA-scoped output markers for commit False positive or not applicable? A repository writer can comment: |
Design Review (Fable 5) — ✅ PASSDesign-level review of All claims verified: the Swift helper's Design-Verdict: PASS Root-cause one-flag fix at the argv seam, verified against both sides of the cross-process contract; nothing to change. [DESIGN-REVIEWED] ae9f5e9 |
GPT 5.6 Review — ✅ no blocking findingsGPT 5.6 completed its review of This comment is updated in place on each push. Review detailsNo findings. False positive or not applicable? A repository writer can comment: |
First Principles Review (Fable 5) — ✅ PASSPremise-level review of All claims verified. The change is a one-line argv fix plus three tests; the First-Principles-Verdict: PASS A reported defect (#5896), fixed at the mechanism — the argv that chose the wrong reporting options — with the flag's cross-process contract pinned. What this change shipsIntent: make Apple on-device streaming dictation auto-submit when the speaker stops. FIX.
No new config key, Python flag, or public surface; every item is declared in the description. Subtractions
[FIRST-PRINCIPLES-REVIEWED] ae9f5e9 |
|
🤖 Kiro Crew Auto-Pipeline [operator: CrysisDeu#0c98c3a2] Status: functionally review-ready. Everything this PR owns is green; the remaining reds are inherited from main and cannot be fixed from this branch.
No action needed on this branch until the unblockers merge; a rebase + re-run then makes the board fully green. |
|
🤖 Kiro Crew [operator: NicholasRBowers#a942f9ca]: This PR has been inactive for 7+ days with failing CI. I've assessed the blockers and they appear resolvable — I'll push fixes directly to this branch as a co-author. Assessment: All owned checks and all 5 review lanes are green; the only reds (Backend Tests shards 2 & 4 + Coverage Gate cascade) are inherited main breakages (#5879, #5846) that are now fixed on main — a rebase onto current green main + re-push clears them. No code changes expected. If you'd prefer I don't touch this PR, add the |
The streaming argv omitted --fast, so the DictationTranscriber ran without .frequentFinalization and emitted only volatile partials while the audio stream stayed open. The dashboard's semantic endpointer schedules its utterance-complete judgment exclusively from note_final(), so with zero mid-stream finals "Auto-submit when I finish speaking" could never fire and recording stayed active until manually stopped. Adding --fast makes the helper emit mid-stream finals that feed the endpointer. The one-shot batch path keeps omitting the flag: its final arrives when the stream closes, and frequent finalization can trade accuracy for latency it has no use for. The live helper is macOS-only with no CI runner coverage, so argv-pinning tests lock the flag in on the streaming path and pin its absence on the batch path. Closes #5896 Original work by Zezhen Xu (CrysisDeu). Rebased onto current main by Kiro Crew. Co-authored-by: Kiro Crew <noreply@kirodotdev.github.io>
d8abad0 to
ae9f5e9
Compare
|
🤖 Kiro Crew [operator: NicholasRBowers#a942f9ca] Rebase-only push: The only red checks on this PR (Backend Tests shards 2 & 4 on 3.10/3.12/Windows, plus the downstream Coverage Gate / PR Readiness cascade) were inherited from two main-side breakages — #5879 ( What this push changes:
Local gates before pushing (all green): isort, flake8, mypy (1177 files, no issues), black on the two changed files, and All five AI review lanes passed on the identical diff at |
|
🤖 Kiro Crew [operator: NicholasRBowers#a942f9ca] Flake triage — re-ran Backend Tests (3.12, 1), no code change The round's single root failure was Evidence it is cross-test global-state pollution, not this PR's diff:
Dispatched |
|
🤖 Kiro Crew [operator: NicholasRBowers#a942f9ca] Review-ready ✅ — head Drive summary:
Auto-merge is deliberately NOT armed — merge decision is left to maintainers. Thanks to Zezhen Xu (@CrysisDeu) for the original fix. |
NicholasRBowers
left a comment
There was a problem hiding this comment.
Tier 1 auto-approve: fix (2 files). Criteria: no conflict, no requested changes, security path denylist clean, design-doc gate clean, SAST annotations clean, security checklist all-NO, AI reviewers green. Category: fix with clear root cause -- streaming helper argv gains --fast so mid-stream FINAL segments reach the endpointer's note_final(), enabling auto-submit (#5896); argv contract pinned by new tests on both streaming and batch paths.
bolichen97
left a comment
There was a problem hiding this comment.
Readiness passed on the current head, all checks green, mergeable against main, and no outstanding change requests from any reviewer. Approving as part of a maintainer sweep of fix-type PRs.
bolichen97
left a comment
There was a problem hiding this comment.
Tier 1 auto-approve: fix (2 files). Criteria: no conflict, no requested changes, security path denylist clean, design-doc gate clean, SAST annotations clean, security checklist all-NO, AI reviewers green. Category: fix streaming speech auto-submit by passing --fast to the streaming helper argv (batch path deliberately excluded), pinned by argv + Swift-source tests.
bolichen97
left a comment
There was a problem hiding this comment.
Tier 1 auto-approve: fix (2 files). Criteria: no conflict, no requested changes, security path denylist clean, design-doc gate clean, SAST annotations clean, security checklist all-NO, AI reviewers green. Category: fix with a clear root cause — the default DictationTranscriber emits only volatile partials so the endpointer's note_final()-driven auto-submit never fires; adds the static --fast switch to the already-sandboxed streaming-helper argv to enable .frequentFinalization (#5896).
bolichen97
left a comment
There was a problem hiding this comment.
Tier 1 auto-approve: fix (2 files). Criteria: no conflict, no requested changes, security path denylist clean, design-doc gate clean, SAST annotations clean, security checklist all-NO, AI reviewers green. Category: clear root cause for #5896 -- the streaming helper was spawned without --fast, so the transcriber never inserted .frequentFinalization and emitted only volatile partials until the stream closed; the dashboard endpointer schedules its utterance-complete judgment solely from note_final(), so auto-submit could never fire. The production change is one bare switch added to the existing sandboxed argv; the sandbox wrapper itself is untouched and the one-shot batch path deliberately keeps the flag off.
bolichen97
left a comment
There was a problem hiding this comment.
Tier 1 auto-approve: fix (2 files). Criteria: no conflict, no requested changes, security path denylist clean, design-doc gate clean, SAST annotations clean, security checklist all-NO, AI reviewers green. Category: clear root cause (#5896) -- the streaming speech helper omitted --fast so no mid-stream finals were emitted and auto-submit could never fire; flag added with argv-pin tests on both paths.
Summary
With Apple Speech (on-device) streaming and "Auto-submit when I finish speaking" enabled, partial transcripts render live but the utterance is never auto-submitted — recording stays active until manually stopped (#5896).
Root cause
StreamingSession.start()built the streaming helper argv without--fast. The bundledStreamTranscribe.swifthelper only inserts.frequentFinalizationinto theDictationTranscriberreporting options when--fastis passed; without it the transcriber emits only volatile partials while the audio stream is open and never produces mid-stream final segments. The dashboard's semantic endpointer (_Endpointerinstt_stream.py) schedules its utterance-complete judgment exclusively fromnote_final(), so with zero mid-stream finals auto-submit can never fire.Fix
Append
--fastto the streaming helper argv (a bare switch — verified against the helper's own parser). The one-shot batch path attranscribe()deliberately keeps omitting the flag: its final arrives when the stream closes, and frequent finalization can trade accuracy for latency it has no use for.Frequent finals are safe for the consumers: the
stt_streamrelay forwards eachfinaland callsnote_final()per event, and the frontend already accumulates multiple finals per session (the AWS Transcribe streaming path emits them the same way).Verification
This is a macOS-only code path with no CI runner coverage for the live helper, so the spawned argv is the verifiable contract:
test_streaming_argv_includes_fastpins--fastin the streaming spawn argv (and that it did not swallow a neighbouring option's value).test_one_shot_argv_excludes_fastpins its absence on the batch path.test_swift_helper_still_accepts_fastpins the other side of the cross-process contract by source inspection: the Swift helper still parsescase "--fast":, so a Swift-side rename cannot silently break every green Python test.Behavioral evidence is the reporter's consistent repro on main
6ed29f5cb(partials live, no finals, no auto-submit); the non-streaming one-shot path was confirmed unaffected.Local gates: black/subprocess-encoding/isort/flake8/mypy clean; full pytest 68281 passed (17 failures reproduce identically on unmodified main or pass in isolation — host-env, none reachable from this diff). Pre-push reviews: GPT lane PASS (0 findings), Opus lane PASS (0 blocking, 2 advisories: Swift-side pin adopted; a
fast=constructor escape hatch declined as speculative configurability for a single-caller path).Closes #5896