Recording produced no transcript, and no record of why #56
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#56
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?
A 62-minute recording produced audio and a track but no
.vtt, and left nothing on disk saying why.What happened
Capture
2026-08-10-135350-53qbru, recorded 2026-08-10 13:53, ended 14:56.On the device, in
Documents/:Wes's description: "a pretty straightforward recording with no weird transitions."
What was ruled out
The audio is fine. Pulled off the device and inspected:
m4af, 1 ch, 48000 Hz AAC, estimated duration 3738.58 sec (62:18), 175249 packets, 48851 bits/sec. Not truncated, not damaged.The app did not crash.
xcrun devicectl device info files --domain-type systemCrashLogsshows the most recentStash-*.ipson 2026-08-06. Nothing on 08-10, no JetsamEvent on 08-10.Length is not the trigger. The capture immediately before it the same morning,
2026-08-10-100318-q4vmmt, ran 3679.48 sec (61:19) — within a minute of the failing one — and transcribed cleanly to a 38 KB VTT whose last cue is01:01:13.800 --> 01:01:18.540.2026-08-10-121036-7iglz5(11:11) also transcribed cleanly.Assembly did not fail. There is no
_transcription.N.vttpart, no parts folder, and no.assemblingdirectory anywhere in the container.TranscriptAssemblykeeps the parts folder on every assembly failure by design, andRecordingTranscription.assemblesays so directly: "every failure here ends with the parts still on the phone and a message saying so." An empty container means assembly never had anything to assemble.Where this points
RecordingTranscription.assemble(unwrittenParts:)early-returns onguard let directory = partsDirectory else { return }, andpartsDirectoryis only set insidebegin()after theTranscriptPartWriteris constructed. No parts folder at all meansbegin()never reached that line — so transcription never started, rather than starting and producing nothing.Two paths reach that outcome, both of which set
statusand return before a writer exists:usableLocale()returning nil —.needsModel,.downloading, or.unsupportedfromSpeechModel.availability(for:)catchatRecordingTranscription.swift:126, setting.unavailable(reason:)from a thrownTranscriptionErrorWorth checking whether the speech model was evicted or was mid-redownload at 13:53.
Library/Caches/com.apple.speech.localspeechrecognitionin the container is an empty directory last modified 8/6 — not conclusive on its own, but it is the right place to look. Two clean transcriptions earlier the same day mean whatever changed, changed between 12:21 and 13:53.The part that made this hard to diagnose, and is arguably the real bug
The reason is computed and then discarded.
statusis in-memory onRecordingTranscriptionand is reset byreset()on the next recording. Once the recording ends, nothing on disk records why transcription did not run.MemoDetailViewalready concedes this inStash/Views/MemoDetailView.swift:312-322— the comment reads "Nothing on disk says which of them it was," and the user-facing copy has to hedge across three unrelated causes:A capture that silently produces no transcript is the failure this app most needs to be loud about, and right now the evidence is gone by the time anyone looks. Persisting the
.unavailable/.needsModelreason beside the memo — a sidecar the detail screen reads back — would turn this from an unanswerable question into a one-line answer.Possibly the same failure
2026-08-09-191821-t954x1_audio.m4a(33 KB, ~30 s, 8/9 7:18 PM) also has no.vttand no parts folder. Short enough that "nobody spoke" is plausible, so it is not confirmed to be the same bug — noting it because if it is, the failure predates today.Recovering the content
The audio was transcribed out-of-band with the retired whisper-cpp pipeline (16 kHz mono → 30 s segments →
ggml-medium), since the memo has material Wes needs to act on. That is a recovery step, not a fix, and it does not tell us why the app produced nothing.