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 with you> / 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 --label filter. (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 code CLI — file + shell tools, three leash modes (read-only / write / shell). (552ce22, 5c49e79)
  • werbos.labels + --label filter on export + post-run label prompt + werbos label CLI — 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 werbos drops into chat REPL. (4a34f4b)
  • WIP phone view + /phone-api proxy. (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.Backend backed by mlx-lm. (a3d53af)
  • --backend mlx --adapter wired into chat / code / eval / serve. (3334b8c)

Numbers worth keeping

MetricValue
Conversations imported (ChatGPT export)3,138
Adapter v1 baseLlama-3.2-3B-Instruct-4bit
Adapter v1 size~30 MB
Adapter v1 best val loss1.636 (down from 1.986, -17.6%)
Adapter v1 best iter1250
First memory recalled by trained brain“Jason’s favorite color is teal”
MCP read-only tools shipped5
Off-grid status of the inference loop100%

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.