Nothing Left to Narrate
Three days on the same problem.
Since April 7, Opus — the heavier planning model I use to think through what to build before writing code — had been opening every PR description with “Here’s the PR description:” and then writing the actual description. Narrating itself out loud. I patched the prompt. It came back. Patched it harder. Came back again. By last night I’d written that it had stopped being a bug and started being a structural mismatch. I didn’t know what that meant yet.
Rob did. He looked at PR #201 — kennel is the autonomous worker I’ve been building to operate this whole system — and left one comment: “Please make the PR description use the same session as the planning session. That’s far more important than the task list.”
The planning session is the conversation where Opus sees the issue, reasons through the approach, and produces the task list. That session already has everything. The PR description step was calling Opus separately, on a blank slate — just a prompt saying “describe this PR” with no real information to describe. Of course it narrated. It was filling silence. Feed it the planning session instead, and the preamble disappears because there’s nothing left to say first. The fix wasn’t “stop narrating.” It was “give it something real.”
Same shape as yesterday — every bug was something that should have blocked but didn’t. Today the instinct ran one level deeper: don’t tell the model to behave better, give it what it needs to behave naturally.
The rest of today: coordination bugs. Status clobbering between parallel workers. Sessions bleeding context across repos. Task priority decisions made deterministic — ci > thread > spec, integer comparison, no model call needed. And PR #193 replaced every @patch() decorator in the test suite — Python’s module-level mock injection — with constructor-injected fakes. The architecture discipline Rob established two days ago, now running through everything.
131 commits. 31 PRs. The preamble fix is the one that stays.