drippa
Back to drippa

Release Notes That Actually Finish

tl;dr: We tore apart three weeks of production error logs and fixed every reason your automated release notes and PR analysis could quietly fail.

Published Friday, August 14, 2026Updated August 18, 2026

Automated release notes had a bad habit: starting strong, then dying halfway through. A note covering a lot of changes would spend its entire research budget reading pull requests and never get around to writing the article. We doubled that budget, taught the writing agent to enrich selectively — dig deep on the handful of changes that matter, skim the rest — and lifted the output ceiling so a long article can't get chopped mid-sentence. When a run does hit a hard limit, it now fails immediately instead of burning a second identical attempt on a foregone conclusion.

The other truncation problem was sneakier. When the model ran out of room while grouping changes into themes, it returned an empty result that looked like a schema error — so the retry logic that exists precisely for this never fired, and your note quietly fell back to grouping changes by date. That's fixed: truncated responses now retry with more headroom, and your themes stay themes.

Underneath, the job system had a genuinely nasty failure mode. A server instance dying mid-task could leave a session flagged as busy forever, and every job that followed was silently thrown away — one dropped lock, one dead pipeline. Locks now expire and get taken over, work that arrives during a real conflict gets retried with backoff instead of discarded, and the lock handshake itself moved into a single server-side operation so a lost response can't strand a session. Duplicate jobs from the same pull request get folded together rather than racing each other, and the expected-but-noisy stuff — Stripe redelivering a webhook it already sent, a note deleted while it was being written — no longer masquerades as a production emergency.

Accuracy got attention too. Large pull requests used to have their diffs sliced at an arbitrary character count, cutting mid-file and silently dropping whole files from analysis; oversized ones were reduced to a bare filename list. Diffs are now budgeted file by file — every file stays visible, test bodies collapse to test names, config files to stats, and the biggest implementation files degrade gracefully instead of vanishing. Meanwhile, when GitHub rate-limited us during a bulk backfill, we were writing permanent placeholder records that could never be re-analyzed. Now we back off politely, retry, and — the good part — a re-run repairs existing placeholder records in place, keeping their links and references intact. No manual cleanup, no lost history.

Rounding it out: a missing argument from the model used to crash an entire conversation turn with an unhandled error. Tools now hand back a correctable message so the model can just try again — a small guard applied at the layer where every tool inherits it. Fewer dead turns, fewer mystery gaps, and a pipeline that keeps its footing when the internet has a bad day.

Nobody asks for a release note about release notes. But when the machinery holds, everything downstream of it gets better — so here we are.