M1-15: Keep the unfinalised transcript tail, so a crash costs seconds instead of the last thing said #25
Labels
No labels
area/agent
area/capture
area/editor
area/geo
area/security
area/sync
area/transcription
area/ui
area/vault
area/voice-memos
blocked
milestone/M1
milestone/M2
milestone/M3
milestone/M4
needs-decision
needs-hardware
p0
p1
p2
type/bug
type/enhancement
type/feature
type/idea
type/infrastructure
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Stash/stash-ios#25
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Keep the speech engine's unfinalised tail on disk during a recording, so a crash costs
seconds of transcript instead of the last thing said.
What this costs today, measured
2026-08-08-113800-9qqy4g, recorded onwes-iphoneand force-quit from the app switcher withoutstopping. M1-10's launch sweep recovered it:
The audio is 210.0 s and decodes clean end to end. The transcript's last cue ends at 193.7 s. The
last 16 seconds of speech are gone — the analyzer was holding them unfinalised when the process
died, and nothing on disk had them.
That gap is what
LiveTranscriber.finish()exists to drain on a normal stop. A crash never reachesit.
Wes, after reading the recovery results: "Csan we capture the unfinalized transcription and
replace once confirmed? Then we lose less data."
This is not a reversal of the volatile-results decision
SpeechModel.transcribersetsreportingOptions: []on purpose, andAGENTS.mdsays why: volatileresults are live hypotheses the engine revises as it hears more, and "taking them for the
transcript means keeping a guess that was later withdrawn."
That rule stands, and this issue must not break it. A volatile hypothesis may never appear in a
transcript that a finalised cue could have covered. What is proposed is narrower: keep the tail
somewhere separate, let every finalised cue supersede it, and only fall back to it for the stretch
after the last finalised cue in a capture that died. On a normal stop it is always discarded unread.
If that separation cannot be held cleanly, close this — a transcript nobody can trust is worse than
one that is 16 seconds short.
Scope
.volatileResultsand keep the volatile stream entirely separate fromLiveTranscriber.cues, which stays finalised-only. Theguard result.isFinalin the resultsloop is the seam.
<base>_transcription.volatile.vttinside the existing.partsfolder. M1-10'spart parser matches
<base>_transcription.NNN.vttexactly, so assembly already ignores it andthe folder's deletion already cleans it up. Confirm both rather than assuming.
write amplification during capture, when the audio path is what matters.
Open questions
NOTEblock before it is the obvious candidate, and it is what tells a vault consumer thatthose words were never confirmed. Silent inclusion is the option to argue against.
measuring across a few before deciding the complexity is paid for.
AGENTS.mdrecords"Measured with the options empty: 2 results, 0 volatile." Nothing has measured the other
configuration, and the finalised stream is the thing that must not regress.
Done when
1 is answered.
it would be today.
.volatile.vttsurvives beside a finished capture.Follows M1-10 (#10) and M1-14 (#22), which established the
.partsfolder and the launch sweepthis builds on.
Keep the unfinalised transcript tail, so a crash costs seconds instead of the last thing saidto M1-15: Keep the unfinalised transcript tail, so a crash costs seconds instead of the last thing saidM1-15: Keep the unfinalised transcript tail, so a crash costs seconds instead of the last thing saidto M1-14: Keep the unfinalised transcript tail, so a crash costs seconds instead of the last thing saidM1-14: Keep the unfinalised transcript tail, so a crash costs seconds instead of the last thing saidto M1-15: Keep the unfinalised transcript tail, so a crash costs seconds instead of the last thing said