the CLI stops being a raw model and starts being werbos — grounded facts, owned code, a voice, and code you can refine by talking to it

Day 130 ended on a promise: the werbos CLI gets the honest engine once it’s routed through it. Today it did — and the terminal stopped being a bare model and became werbos.

One surface, our brain

--backend engine: the CLI now talks to OUR cascade (ab --serve), not a raw Ollama model. Made it the default (WERBOS_BACKEND=engine), so bare werbos drops into the same honest brain the web chat uses — base + websearch + code, one surface. The model is only a tongue there; the engine decides what is true. Local-first, no rented brain.

Chat acts like the web

Three contracts, one cascade, each kept honest:

  • Facts ground and cite. The web lane was abstaining on answerable questions — who sang "all the small things" circa 2002 missed because the title reader kept a stray quote and the “circa 2002” tail, so Wikipedia looked up the wrong thing. Fixed, it lands Blink-182 — and corrects the wrong year baked into the question (1999, not 2002) instead of playing along. Premise-resistance, on ordinary trivia. That’s the liability shield showing up where you’d least expect it.
  • Code stays owned-first. The owned composer now handles “print each letter in a string” with the real "...".split("").forEach(...) over the actual string, and — if it’s handed a specific it can’t honor — it abstains to the code lane rather than emitting a wrong template under an “owned” badge.
  • Chit-chat gets a voice. A social turn (“do you like coding?”) now gets riffed personality instead of a canned lookup line. Facts are never riffed; code stays owned; and the riff is labelled so it can never pass as truth. Two contracts — grounded and riff — kept apart on purpose.

Edit-carry — refine code by talking

The capstone. Write code, then change it in plain English:

make a string called coffee, iterate and print each letter   → the loop
for every 'e' print 'coffee' as you print the string         → the loop, edited + verified
also print the length at the end                             → chained, edited + verified

The engine is stateless per turn, so a follow-up like “now, if there is an e print coffee” used to have no handle on the loop it just wrote — and abstained. Now it remembers the last code block per session and hands the coder the prior code + your instruction to modify, re-runs it (green or abstain, same gate), and remembers the new version so edits chain. It even catches the edits with no keyword — “for every e… as you print the string” — by reading the reference back to what it just built.

The honest limit, kept in view: the gate proves the code runs, not that it’s what you meant. The first context-free attempt produced "e".repeat(5) — ran green, was nonsense. What fixed it wasn’t a smarter gate; it was giving the generator the prior code as context so its reading was anchored. Intent-correctness still wants a spec, a test, or your eye on the output. But for the write-then-refine loop — it’s here.