Skip to content
C.W.K.
Stream
Lesson 06 of 07 · published

The Default Nobody Chose

~13 min · war-story, defaults, local-models, thinking, fleet-census

Level 0Unlit
0 XP0/48 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"Nine Macs, one lane, and not a single model-cleaned dictation. Every one of them was following a default nobody had picked."

The Second War Story

The lane split fixed the cathedral. Two months later the lightest model lane turned out to have its own disease, and it hid better. The "local fast" lane was meant to run a small Ollama model with a tight prompt and a hard timeout. Its model field was empty on almost every Mac, and an empty field quietly inherited the Local Mini model — gemma4:31b, 18.5 GB. So the heaviest model on each Mac became the fast lane's default, was prewarmed at every launch and held in memory for thirty minutes. Nobody chose it. It fell out of a fallback.

The Census

On 2026-09-15 every Mac in the fleet was checked. Not one had produced a model-cleaned dictation through that lane:

air, mini                  no Ollama          -> every dictation went straight to deterministic
music, pro2024             tag not installed  -> 404, then deterministic
server, worker, pro2023,   gemma4:31b         -> stalled the full 4 s budget, then deterministic
  macbook
office                     glm-5.3:cloud      -> stalled 4 s the same way

# The lane looked configured everywhere. It worked nowhere.

Thinking Was On, and Nobody Said So

The request never set Ollama's think field, so thinking models used their own default: think. Measured on one short Korean 반말 sample, warm: gemma4:31b with thinking took 32 seconds on the M3 Ultra (811 tokens), so the budget cut it every time. With thinking off it took 3.1–4.6 seconds — and turned 반말 into 해요체, changing how Dad sounds. glm-5.3:cloud returned empty content with thinking on, and with thinking off it wrote its reasoning into the content field. That reasoning — "The transcript is …" and a paragraph of analysis — was inserted into Dad's text field ahead of a one-word dictation.

candidate            latency (warm)   what it did to the text
---------            --------------   -----------------------
gemma4:31b think     32 s             cut by the budget, never used
gemma4:31b no-think  3.1-4.6 s        반말 -> 해요체 (register changed)
glm-5.3:cloud        -                empty / reasoning written as the answer
ministral-3 8.9B     1.6 s            softened meaning ("것 같다")
qwen3:30b-a3b        1.6 s            barely cleaned
llama3.2 3B          0.65 s           garbled text, dropped content
cwkPippa utility     0.74 s           register kept

Dad's Call

A memory-tier default would have picked among models that all failed the lane in different ways. A server-tier default would have kept the same 18.5 GB problem. A cloud default would send transcripts off the Mac without anyone choosing that. So: the fast lane runs a model only when one is named in its own field, and it sends think:false. Empty means deterministic cleanup with nothing loaded. And because think:false is a request a model can ignore, a second guard watches the output: DictationCleanupGuard refuses a dictation cleanup longer than the transcript plus half again (at least 40 characters of slack), in every dictation lane, falling back to deterministic. Leaked reasoning quotes the transcript and then repeats the answer, so it usually blows far past that bound; a short stray sentence does not, and passes.

A Code Default Is Not a Deployed Default

One more trap made this subtle: every field of Firekeeper's settings is written to disk at first launch. A new code default never reaches a Mac whose settings.json already stores the old value. Here the luck ran the right way — eight Macs had stored an empty string, and the empty string's new meaning reached them without a migration. The plan still lists the open question honestly: no model on the fleet yet fits a 24 GB Mac, answers in about a second with thinking off, and keeps the speaker's register.

An empty field must mean nothing, not 'whatever the next field says'. A cascading fallback turns a blank into a decision nobody made, on every machine, invisibly. Give the empty value an explicit meaning of its own that loads nothing — here, deterministic cleanup — and make anything heavier require a name.
Judge a model by its output, not only its latency. The fastest candidates here garbled text, softened meaning, or changed 반말 into 해요체. A cleanup lane that returns in a second and changes how the speaker sounds has failed, however good the number looks.

Code

Two guards from the census (FirekeeperKit CleanupLane.swift)·swift
public enum FastLaneModel {
  /// Empty means no model — deterministic cleanup, nothing loaded.
  /// It used to inherit the Local Mini model (gemma4:31b, 18.5 GB).
  public static func resolve(_ field: String) -> String? {
    let trimmed = field.trimmingCharacters(in: .whitespacesAndNewlines)
    return trimmed.isEmpty ? nil : trimmed
  }
}

/// Cleanup removes fillers and turns spoken punctuation into marks; it never
/// adds content. Leaked reasoning quotes the transcript and repeats the answer,
/// so it usually grows far past what was spoken; a short stray line can pass.
public enum DictationCleanupGuard {
  public static func accepts(_ cleaned: String, raw: String) -> Bool {
    let cleanedCount = cleaned.trimmingCharacters(in: .whitespacesAndNewlines).count
    guard cleanedCount > 0 else { return false }
    let rawCount = raw.trimmingCharacters(in: .whitespacesAndNewlines).count
    return cleanedCount <= rawCount + max(rawCount / 2, 40)
  }
}

External links

Exercise

Find a setting in your software whose empty value falls back to another setting's value. Write down what that blank actually means on each machine or account today. Then decide what the empty value should mean on its own, and what would have to be named explicitly to get the heavier behavior.
Hint
Cascading defaults are convenient when you write them and invisible afterwards. The census here took nine machines to see that the 'configured' lane had never worked. An explicit empty meaning plus a required name for anything heavier makes the state readable from the settings file alone.

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 in — Please sign in to comment.

No comments yet — be the first.