"The hint is the word the transcript should hold." — the transcriber hint module's own docstring
Croquettes, Heard as Buffett
On 2026-10-17, in a loud tapas bar in Málaga, Dad told Pippa "크로켓은 여기가 최고다": the croquettes here are the best. The turn came back as "버핏은 여기가 최고다", Buffett is the best here. It was a short utterance in voice mode on the phone, so Scribe v2 Realtime heard it over the phone's own socket and no batch pass ever touched it. Nothing in that bar sounded like an investor. The word came from the hint. Every voice door sent Scribe the name of every soul the current one can see (this track's second lesson), and one of those souls is Buffett, 버핏 in a Korean session.
The kept recording made it measurable. Replayed through Scribe's batch model with that list, it read 버핏 six times out of six. With no hint at all it read 뽀켓, 버켓 or 코켓. With the soul being spoken to plus this conversation's own rare words, it read 크로켓 six times out of six. A keyterm is a bias, and a bias toward a name nobody said is a bias toward a mistake.
Two Parts, Built From the Talk
Since 2026-10-18 one module builds the hint for every door. The batch /api/stt (dictation, the Watch, voice mode's whole pass), the realtime socket's grant and the speaker check's labeled transcript all ask the same function, so the phone, the Watch and the web hear with the same words.
- Souls. The soul being spoken to always rides (피파 is also how FIFA is said). Any other soul rides only when the last turns have named it. A Korean session still gets the Korean names.
- Topic words. Words from the last 30 turns that are rare in Dad's history as a whole. Each turn's words are weighted by age, from 1.0 for the newest down to 0.5, and Dad's own turns count double. A word is rare when at most 0.3 percent of a background sample holds it, with a floor of three turns. The background is about 4,000 turns spread across every conversation, rebuilt every six hours while the old copy keeps answering: 크로켓 sat in 11 of 4,322 of them, 호텔 in 111. Rare words are scored the way tf–idf scores them (the weight, times one plus the log of how rare), and the top 20 go. On the Málaga recording, 20 read 크로켓 six times out of six and 30 read it five out of six.
Everyday words stay out on purpose. Offered as candidates, they won: one replay read "호텔은 여기가 최고다". A hint is not a summary of the conversation. It is the short list of words the transcriber would otherwise never guess.
Korean Needs a Noun Filter
Korean words arrive wearing their particles. 크로켓은, 크로켓이랑 and 크로켓 are one word, so the particle comes off, and a stem keeps at least two syllables. A copula comes off the same way, so 입구야 becomes 입구. A word counts only if it looks like a noun: it carries a particle that only nouns take, or it stands alone at least twice, and it does not end the way a predicate ends (맛있게, 있었어, 걷다가). A stub too short to cut that still ends in a particle (역까지, 툴을) no longer counts as standing alone. An English session takes Latin words of three letters or more; any other language gets no topic words at all. Before any of this, the stored turn's non-speech is stripped: attachment lines, links, audio tags, a card's JSON keys, inline code.
Scribe's Rules, and What the Hint Cannot Do
Every term keeps Scribe's own rules (at most 49 characters and five words, none of <>{}[]\), and the whole list stays at 100 or under: past 100 terms Scribe bills a 20-second minimum per request. A private conversation gets the soul part only, so its words never ride any request but its own. PIPPA_STT_CONTEXT=0 sends the souls alone. A sweep over 35 kept recordings changed only the Málaga phrase in substance.
One limit stays, and the module says so. The realtime model misread that phrase whatever it was told (버핏, 코프스는), and its previous_text field did not help. The hint fixes the batch pass: long utterances, dictation, and every utterance once Dad switches on noisy-place mode (Track 8), which sends each one through the batch pass whole. A short utterance in a quiet room never needed the help. One in a loud bar needs the mode.