Day 0 — It's real.
The day everything came alive. Started with brew install ollama, ended with a fine-tuned 3B that knows my favorite color is teal.
The day everything came alive. Started with brew install ollama,
ended with a fine-tuned 3B that knows my favorite color is teal. In
between: fourteen subsystems, one full UI, the off-grid training loop,
and the moment I realized models are just numbers.
What shipped (in order)
werbos tictactoe— v0 milestone. Werbos plays himself; the agent loop works end-to-end.werbos.session.chat— conversational session orchestrator (PFM archive on exit). (21ec2d7)werbos chat— interactive REPL withyou>/werbos>, quit tokens, EOF + Ctrl-C handling. (9cf60cc,6996dee)- Calculator tool — first concrete
pitts.Tool, safe-eval expression parser. (dd68d50) werbos.eval+werbos eval— mcculloch Suite hookup, basic_chat / calculator_use against the live model. (645ab43)- Memory hookup —
~/werbos/memory/loaded into the system prompt every turn. (f9ce0b6) werbos serve— Starlette HTTP backend. (af3cd42,15d263b)werbos/ui/— React frontend, Vite proxy, end-to-end browser chat. (f92146e)- ChatGPT importer — 3,138 conversations from a Google Drive
export → PFM archives. (
58c36eb) - SFT exporter — PFM → JSONL with
--labelfilter. (8daee40) werbos train lora— mlx-lm LoRA pipeline. (97ae6ef)- CORS middleware + Dockerfile / docker-compose for the
SR9 deployment story. (
55890d3,71ff301) werbos.tools.code+werbos codeCLI — file + shell tools, three leash modes (read-only / write / shell). (552ce22,5c49e79)werbos.labels+--labelfilter on export + post-run label prompt +werbos labelCLI — the full dogfood loop. (76edc64,0c1d7f5,df16391)/api/runs+ Rate UI — thumbs up/down GUI for past runs. (d2ee237,5430206)- SCSS migration — 1231-line monolith → 11 partials.
(
95a2a88) werbos.mcp+werbos mcp serve— read-only MCP server, five tools. The deliberate exception to off-grid. (562d41f,e1cada4)- Bare
werbosdrops into chat REPL. (4a34f4b) - WIP phone view +
/phone-apiproxy. (8e03d93) - Archive-leak fix —
atexit+ SIGTERM/SIGHUP so a killed terminal still writes the PFM. (4d7d892)
Day 0.5 (next morning, AM)
werbos.backends.mlx_local—pitts.Backendbacked by mlx-lm. (a3d53af)--backend mlx --adapterwired into chat / code / eval / serve. (3334b8c)
Numbers worth keeping
| Metric | Value |
|---|---|
| Conversations imported (ChatGPT export) | 3,138 |
| Adapter v1 base | Llama-3.2-3B-Instruct-4bit |
| Adapter v1 size | ~30 MB |
| Adapter v1 best val loss | 1.636 (down from 1.986, -17.6%) |
| Adapter v1 best iter | 1250 |
| First memory recalled by trained brain | “Jason’s favorite color is teal” |
| MCP read-only tools shipped | 5 |
| Off-grid status of the inference loop | 100% |
AHAs
- “Models are just numbers.” Trained weights are slot values in a matrix. Training is nudging those numbers, not adding new ones.
- Adapter stacking is “I know kung fu.” Base model + frozen Δ₁ + Δ₂ at inference time. Like Neo: the brain doesn’t grow, the cable uploads a new skill.
- Merging averages, doesn’t add. Merge two 10B models → still 10B. To grow capacity, concatenation (add new layers), not merge.
- Four primitives: training (fills slots), merging (averages values), concatenation (adds slots), distillation (compresses big → small).
- Off-grid economics: cloud LLM agent at 24h = ~$50/day; local laptop at full tilt = ~$0.03/day in electricity. Three orders of magnitude. The whole reason werbos exists.
Surprise of the day
Llama-3.1-8B OOM’d at the first gradient step on M1 8GB. Hardware ceiling is real. Dropped to 3B-class for training; kept 8B for inference. The fleet roles got crisp: M1 = dev + train (3B max), SR8 = inference (13B+), Pi 5 = always-on orchestrator.
Quote of the day
“BRO……WHAT THE FUCK……..” — me, when stock werbos hallucinated that 6×9 in base 13 equals 42.
That moment is the reason the dogfood loop exists. Every hallucination is a label, every label is a training signal, every training signal makes him less full of shit.