AILEENA MACHINA

Essay · 2026.07.28

How I Fell for Local Models

Then a tiny cloud video · where the model sits vs the harness · which layers to change · scenarios · what we adjusted · scores · whether eval meets the bar. Lab: polar-lab · Qwen2.5-0.5B-Instruct + LoRA.

Polar Lab · Local LoRA · Holdout · Ownership

▸ Narrated reading · 2026.07.28

How I Fell for Local Models

Press play for a narrated reading — English-accent female where available.

0:00
0:00

Not this: Claude/Codex API fine-tune · Centaur replacement · production persona. Curriculum order (Rust → CLI → eval → SFT): Post-Training Path.

1 · Why — how I started loving local models

I already live in API agents — Claude, Codex, whatever is sharp this month. They're great at harness work: tools, long context, coding, “just get it done.”

What they can't give me is a clean answer to:

Did our washed facts change a model we own?

That itch is how Polar Lab started. Not “replace Claude.” More like: keep a small open model on the desk (Mac MPS / CPU), teach it with LoRA, and force an honest holdout score.

When the score sat at 0.200, the lab was telling the truth. When short-fact v4 and later packs hit 1.000, I could see why — data shape and adapter capacity, not vibes.

Loving local models, for me, means loving ownership + measurement. The romance is the scoreboard.

Why Polar exists in one line: prove owned data → owned weights → holdout score.

  • API brains are rented. You can prompt them; you cannot LoRA “our facts” into their weights.
  • Memory and registries can retrieve truth, but retrieval is not a weight update.
  • Only a model you own can answer whether this washed JSONL changed this behavior.

Why early low scores were still good news: a flat 0.200 on small packs meant the pipeline and eval were honest. A fake high score from leakage would have taught the wrong lesson. Polar did its job when it refused to lie.

2 · Then a small video of the cloud loop

I don't only run this on the laptop. Cursor cloud agents pull the same repo, train on CPU, write reports, open PRs. That trail is the video storyboard:

  1. Wash JSONL (Machina / space)
  2. ./run_next.sh or POLAR_CONFIG=…
  3. Holdout table: LoRA vs base
  4. Miss → boost golds → retrain
  5. PR merge · scoreboard at 1.000

That's enough for a short cloud clip: terminal → report → GitHub. The point of the video is the loop, not a chat UI skin. Cloud doesn't invent capacity. It records the same lab rules at scale while you're away.

3 · Where this model sits — vs the harness

LayerWhat it isUses local LoRA?
Harness (Centaur-style agent runtime)Rented / API brain + tools + orchestrationNo — Polar is not a Centaur replacement
Memory (files, Postgres, Redis, second brain)Retrieve truthNo — retrieval ≠ weight update
Product (/tools registry, live URLs / status, contact)Live site factsNo — registry wins for users
Polar LabGated LoRA playgroundYes — only here by default

So: the 0.5B + adapter is not plugged into the harness as the daily brain. Harness keeps using strong API models + memory. Polar is the side lab where we prove post-training hygiene before anyone talks about persona export.

If someone later wants a local model inside a harness, that is a separate product decision with an explicit export gate — not “smoke run = ship.”

4 · Scenarios — when each piece wins

ScenarioUseWhy
Live tool URL / status / hub tags that change oftenProduct registryFacts change in git tomorrow morning; LoRA would lag
Guest lists, emails, allowlist codes, API secretsMemory / never trainCompliance + freshness; must not enter JSONL
Long second-brain trees, SKU tables, news feedsRetrieve, don’t memorizeToo big / too mutable for exact-match LoRA
“Did these washed short facts stick in our weights?”Polar holdoutOnly base-vs-LoRA exact_match answers that
Coding, multi-tool ops, long diligence jobsAPI harnessCapacity and tooling a 0.5B adapter doesn’t have
Offline / edge / own-weights literacy / merge gateLocal LoRA (Polar)Cheap, owned, measurable
Overnight CPU train + report + PR while you’re awayCloud agentSame SPEC; good process video; not magic capacity

Decision line: if a wrong answer is fixed by editing one source file, it belongs in product memory — not weights. If you need the number to prove a weight change, use Polar + holdout.

5 · Which layers need changing

LayerTouch it?What to change
Product / registryYes (product work)Live status / URLs / tags — edit registry / source files, not LoRA
Memory (files / DB / Redis)Yes when wrongHotfix truth, PII, long docs; wrong answer → fix the source, don’t bump max_steps
Harness (Centaur / API agent)Don’t wire Polar yetKeep the API brain + tools; don’t make the 0.5B adapter the daily brain
Polar Lab (LoRA)Lab onlyWash short golds; run holdout; keep adapter behind the gate
Cloud agentNo architecture changeKeep using it for train / report / video trail; same lab rules

One-liner: wrong answer in production → fix registry / memory. Need proof that weights changed → change Polar data / gates. Harness does not take the adapter yet.

6 · What we adjusted — pack by pack

6.1 What failed early. On small Machina packs (36–79 rows), holdout exact_match stuck at 0.200 — same as base. Loss was falling; strings were not sticking.

Failure modeExampleWhy it hurt
Paraphrasegold path → “In the Aileena memory store.”Meaning-ish, string fail
Ignored “reply with only”short gold → long waffleFormat not pinned
Near-miss hallucinationparadigmxyz/centaur → wrong org URLPlausible fake
Wrong numeral / concept90 → 100, sandbox pods → wrong storyIdentifier not learned

Root causes: too little data; harsh golds (paths/names); strong base priors toward fluent essays; train/eval paraphrases that tiny LoRA doesn't transfer; more steps alone didn't fix strings.

What was not broken: the Transformer, the eval script, Mac-vs-CPU as the main story, or “must have an H100 to learn the loop.”

6.2 Machina — short-fact v4.

BeforeAdjustmentAfter
36–79 rows, LoRA 0.200 = base 0.200450 train rows of identical short golds for paths/names; ~400 stepsLoRA 1.000 vs base 0.200 (CPU + Mac MPS)

Progress: volume of identical short answers was the missing piece. Same holdout, same metric — behavior moved.

6.3 Space — miss-boost + full-attn LoRA.

BeforeAdjustmentAfter
Number misses (−132, 0.086, 102.3, 725…)Wave-1 miss-boost → 1002 train / 10 evalIntermediate 0.600
Over-boost to 1338 rowsHit-set flip / overfitDiscarded (0.400)
q,v-only LoRA on wave-1 dataExpand LoRA targets to q/k/v/o1.000 vs base 0.000

Progress: more of the right short golds helped; dumping more of the wrong kind hurt; adapter capacity (full attention projections) closed the rest.

6.4 What we deliberately did not do

  • Dump Slack / whole aileena_second_brain/** into JSONL
  • Treat smoke adapters as production persona
  • Jump 0.5B → larger base before holdout moved
  • Wire the adapter into Centaur/harness without an export gate
  • Start DPO/RL before SFT exact-match was honest and moving

7 · Scoreboard — progress vs base

PackTrain/evalConfigLoRABaseΔUseful ≥0.60?Clear win ≥ base+0.20?
Machina450/10machina_sft.yaml1.0000.200+0.800YESYES
Space1002/10space_sft.yaml (q/k/v/o)1.0000.000+1.000YESYES

Earlier checkpoints (for the story arc):

CheckpointScoreNote
Arithmetic smoke0.667Short answers can stick
Machina v1–v30.125–0.200Honest flatline
Machina v41.000Short-gold volume unlock
Space mid0.600 → 0.400 → 1.000Miss-boost good; over-boost bad; q/k/v/o finish

Both packs meet and clear the lab gates on CPU.

8 · Eval — is it up to standard?

Metric (utils/eval.py):

pred.strip().lower() == gold.strip().lower()
  • Disjoint train vs holdout prompts (scripts/check_data.py → overlap = 0)
  • Always report base vs LoRA on the same holdout
  • temperature=0 for scoring
  • Washed English short golds only in this repo (per SPEC)
  • Never commit outputs/ adapters as the product brain
GateRuleMachinaSpace
Beat baseline / noiseLoRA clearly above ~0.20 floor when base is weakPassPass
UsefulLoRA ≥ 0.60Pass (1.000)Pass
Clear winLoRA ≥ base + 0.20Pass (+0.80)Pass (+1.00)
HygieneTrain/eval disjoint; no holdout leakagePassPass
HonestyDon’t edit eval golds mid-comparison with an old baselinePass (by process)Pass

Verdict: yes — for these washed short-fact packs, holdout exact_match is in standard and at the top of the bar.

What “in standard” does not mean: it does not mean the adapter should answer live product status/URLs for users (registry wins). It does not mean Polar replaces Centaur or Claude. It does not mean CI “proves 1.000” on every PR — CI is hygiene + dry-run; pack scores come from real train/eval runs. Exact-match is brittle on purpose: paraphrases count as zero so we don't congratulate ourselves with vibes.

9 · Where each piece wins

PieceBest atWeak at
API harness (Claude etc.)Reasoning, tools, coding, live opsYou don’t own weights; can’t LoRA “our facts” into it
Memory / registryFresh truth, PII boundaries, hotfix in gitDoesn’t change model defaults; needs retrieval every time
Local 0.5B + LoRA (Polar)Cheap proof: data → behavior → exact_match; offline literacyTiny model; brittle strings; stale when facts move; not a harness brain
Cloud agent runsLong CPU trains, reports, PRs while you’re away; process videoStill the same lab rules; not magic capacity

One-liner: harness + memory for shipping answers; Polar for proving weight change; cloud for recording the proof at scale.

10 · Closing

I didn't fall in love with local models because they're smarter than the harness. I fell in love because they're mine to change, and Polar makes the change visible.

  • Why: own the weights and measure them.
  • Scenarios: registry/memory for live truth; Polar for proof; harness for shipping work.
  • Progress: short identical golds, miss polish, and full-attn LoRA moved Machina and space from flat or mid scores to 1.000.
  • Eval: disjoint holdout exact_match meets useful (≥0.60) and clear-win (≥ base+0.20) gates on Machina and space.

Cloud runs turn that into a small video: wash → train → miss → fix → 1.000. Harness stays the sharp rented brain. Registry stays the live truth. LoRA stays behind the gate until we deliberately decide otherwise.

That's the setup. That's enough to publish — and enough to keep building.

Lab: polar-lab · Back to Dispatch

← dispatch