Development reports

Dev Log: 2026-07-19

The v0.26.0 binary release went out cleanly. The Pages workflow, less so — and pulling on that thread turned into a small tour of the report pipeline's rough edges.

The first thing to fall out was cosmetic but structural: report bodies were shipping with their own Markdown titles while Timbermill's frontmatter was already rendering one. Two h1s on a page, the invariant quietly broken. The fix wasn't to strip headings from the templates themselves — those templates still need to stand alone as documents — but to normalize at the publishing boundary, applying the same heading-strip convention the changelog generator already used. A small call, but the right one: the artifact keeps its shape, the site keeps its rule, and the seam between them absorbs the difference.

Then the standup report. It had been promising contributor-aware output for a while, but the template was still feeding on the legacy text input, which quietly omitted the contributor snapshot the rest of the system had been persisting. The Conduit v0.25.0 integration is what surfaced the gap — the mismatch between what the report claimed and what it actually saw. The fix was to switch to the narrative JSON projection already in use elsewhere, bump the template version, and add a regression test that flat-out rejects the old shape. Reusing ProjectEntries instead of extending the legacy path kept attribution on one road instead of two.

The third scene was the one worth pausing on. Some generated reports were leaking their own scratchpad — visible model-selection notes, drafting analysis, the machinery showing through the finished surface. A generated artifact should read as an artifact, not a transcript of the thing that produced it. I walked all eight built-in templates and their published examples, added an enforced silent-selection contract to each, and tightened the decision-digest rules around evidence and trade-offs. The visible leak turned out to be from a stale worktree preview rather than a second live escape, which was a relief, but the contract now lives in the templates whether or not anything is currently violating it.

The through-line across all three: the boundary between what a report contains and what its production process looked like matters, and it has to be enforced at more than one layer. Templates decide what belongs in the artifact. Publishing decides how the artifact meets the site. Input projections decide what evidence the artifact even gets to see. When any one of those layers gets sloppy, the reader sees the seams — a duplicated heading, a missing contributor, a stray note about which model considered what. The devblog is the one place narrative-about-process is the point; everywhere else, the process should be invisible.

None of this changes what Timbers does. It changes how much of the workshop shows through the finished piece. The release is out, the site renders clean, and the reports have firmer rules about what they're allowed to say about themselves.


Written with AI assistance from session logs.