Snap & Talk: a retake that hears nothing keeps the earlier words, the toolbar's Cancel asks first, and the notice never says 'Use Off'
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 18/100
Direzione di ricerca
Start in ReadbackModel.swift: the stop path around lines 1036-1054 and process() around 1343-1364, plus the cancel path near 1063-1069 and shortcutLabel near 516. The issue depends on the unmerged #330 branch, which supplies the fake recorder for --check-readback, so confirm that branch is merged first. Done means each listed --check-readback case passes and the native microphone checks are confirmed by hand.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Outcome: a silent retake never hides a section's words. The toolbar never discards a long take without the page's question. The narration notice names a key only when that key works.
1. A retake that hears no words keeps the earlier words
- Problem:
- Stop's quiet screen catches only takes under 0.35 s or −55 dB (ReadbackModel.swift:1036-1039).
- Every other take first moves the section's audio, original text and edited text into history/ (:1044), unlinks both transcripts (:1051) and drops the draft (:1054).
- When transcription returns nothing,
process()throws (:1343) and saves.failedwith no text (:1362-1364). - The page then shows "Transcription stopped" with only Retry transcription (ReadbackView.swift:462-465). Retry re-runs the same silent audio (ReadbackModel.swift:1118-1124). Re-record is hidden in ⋯ (ReadbackView.swift:419), and the summary says "1 needs a retry" (:240-241).
- Nothing reads history/, so the notes or narration look gone.
- Meetings already decided that a recording which heard no speech is never offered for retry (docs/workbench.md:207).
- Change:
- Stop: archive only the previous audio and original. Keep narration.txt linked, and keep the draft.
process()with words: archive the still-linked edited text, then write the new files.process()with no words:- archive the silent WAV and clear
audio; - set
.readywith no failure when text is still linked; otherwise set.needsNarrationwith "No speech was heard. Record the narration again."; - set the notice to "No speech heard. The screenshot and any earlier narration were kept."
- archive the silent WAV and clear
- Real engine errors: keep
.failedand Retry, as today. - One sentence in docs/snap.md.
- Check:
--check-readbackwith ControlledTranscriber and #330's fake recorder:- imported notes, empty result:
.ready, notes intact, silent WAV in history/, no "retry" anywhere; - narrated section, empty result:
.ready, edited text kept; - fresh capture, empty result:
.ready; - nothing linked, empty result:
.needsNarration; - engine error:
.failed, earlier text still on disk; - words: new text, earlier text archived.
- Removing the no-words branch must fail the first four.
- imported notes, empty result:
2. The toolbar's Cancel narration asks as the page does
- Problem: while narrating, the chooser lists Stop narration and Cancel narration side by side (ToolbarActivityActions.swift:60-64).
- Cancel calls
cancelNarration()directly, which deletes the take (ReadbackModel.swift:1063-1069). A take can run 300 s (:1023). - The page asks "Discard this narration?" after 10 s (ReadbackView.swift:255-257, :128-131; docs/desktop.md:119).
- docs/workbench.md:118: every door gives the same result.
- Cancel calls
- Change:
- One rule in ReadbackModel shared by both doors:
cancelAsksFirst(elapsed:);- a published
pendingCancelNarrationholding the take's identity; requestCancelNarration();confirmCancelNarration(_:), which re-checks the identity.
- The question clears whenever recording ends, including the 300 s auto-stop.
- The page's existing dialog binds to it.
- The chooser calls
requestCancelNarration()and, when it asks, opens Snap & Talk with the page's dialog showing. - No NSAlert: it would block the narration timer.
- One rule in ReadbackModel shared by both doors:
- Check:
--check-readbackwith a check-only take fixture:- at 74 s it asks and keeps the file;
- Keep recording keeps the take running;
- Discard with the matching identity removes the file; a stale identity does nothing;
- at 5 s it discards at once;
- Stop and the auto-stop clear the question.
- The existing ToolbarActivityChooserTests pass.
3. The narration notice names a key only when it works
- Problem:
shortcutLabel(ReadbackModel.swift:516) returns "Off" when the shortcut is disabled (VoicePreferences.swift:26-27) and ignoresshortcutFailure(:453).- The notice reads "Narrating section 2. Use Off again to stop." (:1016).
- The help (ReadbackView.swift:276) and the options sheet (:580) say "Off captures the display…".
- The toolbar already filters both cases (FloatingToolbar.swift:371-375), and so does Dictate (AppModel.swift:612). #15 Slice B fixes Home and Dictate.
- Change:
usableShortcutLabel: nil when the shortcut is off or failed to register.static narrationNotice(section:shortcut:): without a usable key it ends "Use Stop narration to finish."- The help names the key only when it is usable.
- The options sheet shows the failure, or "No shortcut is set. Capture & narrate on the page still works."
- Check:
--check-readback:- the pure notice, with and without a key;
- shortcut disabled in a scratch defaults suite: nil;
- enabled: "⌥C";
- with a registration failure: nil.
Native checks owed (microphone)
- Re-record over a section with notes while the input is muted: the notes stay, and no Retry appears.
- Narrate past 10 s, then choose Cancel narration in the chooser: Snap & Talk opens with "Discard this narration?". Keep recording continues the take.
- With ⌥C off, choose Capture & narrate: the notice ends "Use Stop narration to finish."
Value before scope
- Outcome: no hidden words, no unasked loss of up to five minutes of narration, and no instruction to press "Off". Evidence: the traced paths.
- Simpler route: Stop's quiet-take rule, the page's own dialog, and the toolbar's existing shortcut filter.
- Owner: ReadbackModel.
- Complexity: no new control, label or setting.
- Verified by: --check-readback.
Grammar: Quality.
Sequencing: the #330 branch is ReadbackModel's only writer tonight. Build after it merges, reusing its fake recorder: item 1 first, then items 2-3.
Refs #134, Refs #15
Build-ready record from the overnight lead session of 15 Oct 2026 (round two), verified against main edc15df by an independent skeptic per item. Implementation follows on a claude/* branch; this issue closes only after native acceptance.
Build-ready record from the overnight lead session of 15 Oct 2026 (second discovery round), verified against main edc15df by an independent skeptic per item. This issue closes only after native acceptance.
- Lingua principale
- Swift
- Stelle
- 0
- Fork
- 1
- Merge medio
- 8h 5m
- PR unite (30g)
- 215
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di Ship-Work/workbench
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
I maintainer di solito rispondono entro 1 giorno
-
documentation good first issue help wanted
Difficoltà 2/5 Mezza giornata Idoneità per principianti 74/100
Ship-Work/workbench#29 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 55/100
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di Ship-Work/workbench
Issue simili
-
a:false-positive
Difficoltà 2/5 1-3 ore Idoneità per principianti 77/100
I maintainer di solito rispondono entro 1 giorno
-
Idle CPU stays at ~8% after the "Text wasn't inserted" card is shown onceForse già presa @nickbecker l’ha presa oggi. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
altic-dev/FluidVoice#1217 ·
I maintainer di solito rispondono entro 1 giorno
-
BrainBar Watcher chart: unavailable-flow tooltip/accessibility drops the health reason for .attention/.stoppedForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
EtanHey/brainlayer#1439 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
alejandrobujan/tendedero#98 ·
I maintainer di solito rispondono entro 2 giorni
-
enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
vorssaint/vorssaint-utils#3368 ·
I maintainer di solito rispondono entro 1 giorno