C.W.K.
Stream
Lesson 03 of 04 · published

The No-Model Floor

~11 min · deterministic, floor, no-model, filler

Level 0Unlit
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"When the model is cold and the network is gone, something still has to clean up your words. That something is code, not a prayer."

A Provider With No Brain

Beneath both Pippa-full and the local Mini Pippa model sits a third cleanup provider that uses no model at all: the deterministic provider. It's pure code, so it has zero cold-start and never times out. It can't rewrite tone or infer structure, but it can do the mechanical work that makes raw transcription usable: trim whitespace, apply dictionary replacements, expand snippets, strip filler tokens, normalize spacing and quotes, map spoken punctuation commands, and detect a trailing "press enter." When the LLM is unavailable, this is what keeps dictation working.

What Deterministic Cleanup Actually Does

"um send the report comma then call the bank period"
         |  strip filler ("um")
         |  map spoken punctuation ("comma" -> ",", "period" -> ".")
         v
"Send the report, then call the bank."

# No model. Just rules: fillers, punctuation words, dictionary,
# snippets, whitespace, and the "press enter" trailing command.

The spoken-punctuation and press-enter handling work in both languages — Firekeeper maps English and Korean equally ("comma" and "쉼표", "period" and "마침표", "press enter" and "엔터 쳐"). This is the honest offline story: not a shrunken LLM pretending, but a real, fast, rules-based transform that does the 80% of cleanup that is mechanical.

The Korean Filler Trap

One subtlety worth its own warning: filler stripping must be conservative in Korean. English fillers like "um" and "uh" are safe to remove because they're rarely real words. But Korean fillers overlap with real vocabulary — is a filler but also a real word, is a hesitation but also "that." A naive strip-every-filler rule would delete meaning. So the deterministic Korean filler list is short and careful, erring toward keeping a word rather than eating a real one. Aggressive cleanup that corrupts meaning is worse than no cleanup.

Always have a floor that needs nothing. The most reliable component in a system is the one with no dependencies — no model, no network, no service. Build a deterministic floor beneath your smart paths so the feature degrades to 'mechanically correct' instead of 'broken' when the smart parts are unavailable. Cleverness is optional; the floor is not.
Language-aware rules beat universal ones. A filler-stripping rule tuned for English will quietly corrupt Korean, because the same surface token is filler in one language and content in another. Any deterministic text rule that touches multiple languages must be written per-language, erring toward preservation. A rule that's 'mostly right' across languages is a rule that silently mangles the one it wasn't tuned for.

Code

Deterministic cleanup: rules only, language-aware, preservation-biased·swift
func deterministicClean(_ raw: String, language: String, dict: [DictEntry]) -> String {
    var t = raw.trimmingCharacters(in: .whitespacesAndNewlines)
    t = mapSpokenPunctuation(t, language: language)   // "comma"/"쉼표" -> ","
    t = stripFillers(t, language: language)           // EN: um/uh; KO: SHORT, careful list
    t = applyDictionary(t, dict)                      // enforce named terms
    t = expandSnippets(t)
    return normalizeWhitespace(t)
}

// KO filler list is deliberately tiny: 어 and 그 are also real words,
// so the rule keeps ambiguous tokens rather than risk deleting meaning.

External links

Exercise

Design a deterministic (no-model) fallback for a feature you'd normally power with an LLM. List what it CAN do with rules alone and what it honestly CAN'T. Then find one rule that would be safe in one language or context but corrupt another — how would you scope it to avoid the corruption?
Hint
The rules-only floor handles the mechanical, unambiguous parts (formatting, known substitutions, structural normalization) and honestly skips the judgment parts (tone, inference, rewriting). The cross-context trap is usually a token that's noise in one setting and signal in another — the fix is to make the rule aware of the context (language, locale, domain) and default to preserving when unsure.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.