The previous agent had stared at a fresh bd export diff against the committed JSONL, seen them match, and still flinched. They didn’t commit. The auto-staged rewrite from bd 1.0.x’s _type-prefixed schema looked too much like drift to trust, so it sat there.

That was the moment that put most of this week’s work on the table. Not the schema flip itself — that had landed cleanly in an earlier commit — but the misread of it. If a careful agent couldn’t tell the difference between “the tool rewrote things on purpose” and “something is wrong,” the sync model was carrying too much ambiguity.

So we cut the ambiguity at the source. The Dolt remote had been unused for over a week; bd dolt push/pull were no-ops without it anyway. Deleting it left exactly one transport: the embedded JSONL, committed alongside the code. AGENTS.md got a sync-model rewrite that names the embedded-only mode out loud, tells future agents to trust the _type-prefixed rewrites, and includes a bd export | diff recipe for when someone does want to verify drift. One channel, one recovery path, one thing to remember. A future Dolt remote is one command away if federation ever matters again; until then, the gitignored working DB plus the committed JSONL is full reconstruction.

The other thread was the compact prime renderer that shipped just before this. The default prime output had been spending agent context on repeated coaching — useful the first time, expensive the fortieth. Compact v2 keeps the operational safeguards and moves the full guide behind --full. Predictably, shrinking it surfaced things it had been hiding.

Entry IDs got truncated with an ellipsis, which looked tidy and broke timbers show paste ergonomics — an unresolvable ID is worse than a long one. Restored. PRIME.md customization became invisible in compact mode, so we added a hint when it’s overridden and exposed custom_workflow in JSON. And runPrime was setting Mode=full before the flag branch ran, which meant JSON consumers were being told “full” while looking at compact payloads. That one was a structural bug, not a polish item — it would have leaked straight into MCP. Health entries got their truncation aligned to 96 chars to match the rest. Each fix got a focused test.

Around the edges: provider aliases refreshed to current official model IDs, and AGENTS.md graduated from a minimal note to the full operating guide, with CLAUDE.md symlinked to it so the two environments stop drifting.

The thing worth naming here is that most of this week was paying down ambiguity, not adding capability. The compact renderer was new, but the follow-ups, the remote deletion, the _type documentation — those were all about closing gaps where a careful reader (human or agent) could plausibly do the wrong thing. The cost of ambiguity in an agent-facing tool isn’t measured in confused users; it’s measured in the work that doesn’t get committed because the next operator wasn’t sure.

v0.20.0 went out with all of it: the compact UX shift, the follow-up fixes, the embedded-only sync model. Tagging felt right — better to get the smaller session-context payload to external installs before more agents hit the old one.

Solid ground. The kind that holds because we stopped asking it to mean two things at once.

Written with AI assistance from session logs.