Dev Log: 2026-05-18

The bug report read like a riddle: agent A is blocked, by agent B’s commits, on work agent A never touched. Welcome to parallel-agent flows, where .timbers/ is a shared resource and the gate fires on the wrong actor. The setup: multiple agents collaborate in branches that eventually merge. They share the same git identity. The old gate walked the full DAG looking for undocumented commits, which meant the moment agent B’s untracked work landed via merge, agent A would hit a wall trying to commit its own (perfectly documented) changes. The gate was technically correct and practically useless. ...

May 18, 2026 · rbergman

Dev Log: 2026-05-11

A teammate working in gorewood/vellum pinged me with a small but irritating paper cut: their post-commit hook was nudging them to log commits that timbers log itself refused to accept. Commits touching only .beads/issues.jsonl would trip the hook’s “hey, document this” message, but the moment they tried, log would shrug and say there’s nothing actionable here. The two halves of the same tool were disagreeing in public. The fix was less interesting than what the bug revealed. pending, log, and the post-commit hook each had their own implicit notion of what counts as undocumented work — overlapping, but not identical. The post-commit path, in particular, had never bothered to ask HasPendingCommits before printing its nudge. Three views of the same question, one of them politely lying. ...

May 11, 2026 · rbergman

Dev Log: 2026-05-08

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. ...

May 8, 2026 · rbergman

Dev Log: 2026-05-03

The templates were lying — not maliciously, but in that quiet way LLMs lie when they don’t have enough signal. Filling in emotions nobody felt, theming where there was no theme, claiming “tests pass” without evidence. The fabrication wasn’t the kind you catch with a fact-checker. It was softer than that. That’s what kicked off this batch of work. Every draft template in the system — devblog, changelog, PR description, ADR, release notes, sprint report, standup — had its own version of the same vulnerability. I’d been thinking about fabrication as a binary: either the model invents a test plan or it doesn’t, either it makes up a metric or it doesn’t. A second-opinion review from a codex agent reframed the problem. Soft fabrication — manufactured emotion, vague benefits, thematic hand-waving — is the same failure mode, just harder to see. The agent surfaced it as a unifying observation across all seven templates, and it was right. ...

May 3, 2026 · rbergman

Dev Log: 2026-05-02

The pending-commit detector was too eager. It had one job — tell you which commits still need documentation — and it was doing that job with the enthusiasm of a smoke alarm that goes off when you make toast. Every .gitignore tweak, every go.sum update, every editor config change: pending, pending, pending. The signal-to-noise ratio was drifting toward noise. This batch of work was about teaching the system what doesn’t matter — and then making sure it can’t lie to you about what it’s ignoring. ...

May 2, 2026 · rbergman

Dev Log: 2026-04-30

The bug report was simple enough: go install didn’t work. Not “didn’t work in some edge case” — just didn’t work, period, for anyone trying to install a tagged release. The kind of thing that makes you set down your coffee and start digging. The culprit turned out to be colons. Specifically, colons in filenames. The ledger stores entries as JSON files under .timbers/, and the filenames were derived directly from ISO 8601 timestamps — complete with HH:MM:SS. Perfectly sensible naming on Linux and macOS. Completely illegal in Go’s module zip format, which the module proxy uses to serve tagged versions. Every release since v0.16.x had been quietly poisoned: the proxy couldn’t ingest the zip, so go install ...@latest just… failed. ...

April 30, 2026 · rbergman

Dev Log: 2026-04-21

ADR-12 should always mean the same decision. That’s the kind of statement that sounds obvious until you watch it break. The decision-log template in timbers generates Architecture Decision Records — numbered, appended to a single file, meant to be referenced from other documents, commit messages, design reviews. “See ADR-12” only works if ADR-12 is still ADR-12 the next time you regenerate. And with the old approach — hardcoded restart-at-1 — every fresh render cheerfully renumbered everything from scratch. External references rotted silently. Nobody gets an error. They just get the wrong decision. ...

April 21, 2026 · rbergman

Dev Log: 2026-04-01

There’s a particular flavor of bug that only shows up when a tool starts eating its own cooking. You can test against synthetic repos all day, but the moment your development ledger is running on its own repo, recording its own commits, interacting with its own hooks — that’s when the interesting failures crawl out. This round started with a user report from Noam: after a git pull --rebase, timbers was showing pending commits that had already been documented. Ghost work. Phantom entries cluttering the ledger. The kind of thing that makes you distrust your own tooling at exactly the moment you need to trust it most. ...

April 1, 2026 · rbergman

Dev Log: 2026-03-30

The thing about documentation is that nobody wants to write it in the moment, and everybody wishes it existed six months later. This session was the rare case where I actually stopped building and started explaining — and the work turned out to be more interesting than I expected. The trigger was mundane enough: a rebase had left the devlog’s anchor commit stale, pointing at history that no longer existed in the same form. A handful of commits needed to be re-recorded against the new topology. But rather than just mechanically advancing the anchor and moving on, I used the pause to ask a harder question: does anyone reading this project actually understand how it works? ...

March 30, 2026 · rbergman

Dev Log: 2026-03-29

The hooks were deadlocking during rebases. Not sometimes — every time. An AI coding agent would kick off a rebase, the hook would fire mid-operation, the hook would try to check pending commits, and the whole thing would just… freeze. The agent couldn’t continue the rebase because the hook was blocking it. The hook couldn’t commit because you can’t commit mid-rebase. A perfect little standoff, both sides waiting politely for the other to go first. ...

March 29, 2026 · rbergman