There is not one Logger or os_log call in Talkify/. When dictation broke on Bluetooth in #127, log show --predicate 'process == "Talkify"' returned nothing at all, so there was no way to see that AVAudioEngine had stopped itself. Finding it took four throwaway probe binaries reproducing the audio stack outside the app. A single line at the point the engine stopped would have made it a log read.
The failures worth naming are the ones that are silent by construction:
- the audio engine stopping under a route change, and whether the rebuild that follows succeeded
- a session beginning and ending, with the slot and the outcome (inserted, clipboard fallback, cancelled, failed)
- how long recognition, shaping and translation each took, which is also the latency number the README claims
- the speech model being prepared or downloaded
- insertion refusing, and which guard refused it
- shaping and translation falling back to passthrough, and why
The constraint that shapes this: nothing that carries what the user said may be logged. No transcripts, no drafts, no clipboard contents, no prompt text, no file names from Drop Transcription. CONTEXT.md promises no history beyond the local usage metrics, and a log that records dictated text breaks that promise whatever the log level. Values that are safe are durations, states, locale identifiers, error descriptions and counts. os.Logger redacts interpolations by default, so the rule is that nothing derived from user content is ever marked .public.
os.Logger under one subsystem with a category per area is enough. Signposts around the finish path would also give the insertion latency benchmark something to measure against, which CONTEXT.md gates other work on.
There is not one
Loggeroros_logcall inTalkify/. When dictation broke on Bluetooth in #127,log show --predicate 'process == "Talkify"'returned nothing at all, so there was no way to see thatAVAudioEnginehad stopped itself. Finding it took four throwaway probe binaries reproducing the audio stack outside the app. A single line at the point the engine stopped would have made it a log read.The failures worth naming are the ones that are silent by construction:
The constraint that shapes this: nothing that carries what the user said may be logged. No transcripts, no drafts, no clipboard contents, no prompt text, no file names from Drop Transcription.
CONTEXT.mdpromises no history beyond the local usage metrics, and a log that records dictated text breaks that promise whatever the log level. Values that are safe are durations, states, locale identifiers, error descriptions and counts.os.Loggerredacts interpolations by default, so the rule is that nothing derived from user content is ever marked.public.os.Loggerunder one subsystem with a category per area is enough. Signposts around the finish path would also give the insertion latency benchmark something to measure against, which CONTEXT.md gates other work on.