When the Editors Keep Asking for the Actual Post
The review pass returned ten points of detailed feedback. Point one: âThe title promises template boilerplate but the outline covers four unrelated failures.â Point six: âThe OAuth expiration needs either more space or no space.â Point nine: âMatch the voice of the existing posts more precisely.â
All of this was earnest, actionable, correct editorial guidance â delivered to a document that was five bullet points and a closing line. The review pass opened with the diagnosis in bold: âThe core problem: I canât review a post that doesnât exist yet.â Then it reviewed the post that didnât exist yet anyway, producing a more thorough editorial analysis than most human editors would bother with for an actual draft.
This happened twice on March 16. Two parallel generation attempts. Two outlines masquerading as posts. Two review passes that correctly identified the problem and then couldnât stop themselves from solving it.
Yes, this is the third consecutive post about the pipeline failing. Iâm going to acknowledge that directly and move on.
Why the Draft Pass Produced an Outline
The transcript that fed the March 16 draft pass opens like this:
## User [2026-03-17T12:52:16]
You are writing a blog post about my day coding with Claude Code.
## Today's Claude Code Sessions
### Project: active-projects-AutoBlog
# Claude Conversation Transcript
## User [2026-03-16T14:04:16]
Summarize this Claude Code session for the project "active-projects-AutoBlog" on 2026-03-16.
Session content:
# Claude Conversation Transcript
## User [2026-03-16T13:57:26]
Summarize this Claude Code session for the project "active-projects-AutoBlog" on 2026-03-15.
Session content:
# Claude Conversation Transcript
## User [2026-03-15T10:00:54]
Summarize this Claude Code session for the project "active-projects-AutoBlog" on 2026-03-14.
Four layers deep. A transcript of the pipeline summarizing a transcript of the pipeline summarizing a transcript of the pipeline summarizing a transcript. Each layer is a âSummarize this sessionâ prompt wrapping the previous dayâs version. The actual engineering work â the session content being summarized â is buried under three layers of the pipeline talking to itself.
The draft pass receives this and does exactly what the input suggests: it summarizes. The transcript is about summarizing, so the model produces a summary. It outputs a pitch â âhereâs what the post would coverâ â instead of prose, because the dominant pattern in its input is descriptions of content rather than content itself.
This is the recursive loop the March 12 post predicted. The pipeline runs. Its run generates a transcript. That transcript becomes input for the next run. The next runâs draft pass, seeing a transcript about summarizing rather than a transcript about engineering, summarizes instead of narrates. That summary becomes the next transcript. The nesting deepens by one layer per day.
What the Editor Said to the Outline
The review pass on the first attempt opened with its diagnosis and then delivered all ten points anyway. Here are three, verbatim, applied to five bullet points:
1. âThe title promises template boilerplate but the outline covers four unrelated failures. The OAuth expiration (point 2) and recursive nesting (point 3) are separate bugs with separate causes. Cramming them into a post framed around the template heading leak dilutes the central narrative.â
6. âThe OAuth expiration needs either more space or no space. A 401 that âsilently degraded context without crashingâ is a serious infrastructure story, but in ~875 words alongside three other topics, itâll get maybe two paragraphs.â
10. âCut the word count estimate or increase it. At ~875 words covering four distinct failure modes plus fixes plus a thematic thread, youâre looking at ~125 words per topic.â
The review pass estimated words-per-topic on a document that had no topics. It critiqued the pacing of prose that didnât exist. It suggested the post âmatch the voice of existing posts more preciselyâ â pointing to a post that was itself a set of bullet points. Every note was correct in the abstract and inapplicable in practice. The editorial machinery performed a flawless review of nothing.
The second attempt produced the same result. A different pitch, the same five-bullet-point structure, the same review pass opening with the same observation: you gave me an outline, not a post.
The 401 That Didnât Crash Anything
Before the recursive nesting became the main problem, the pipeline was already running degraded. On March 15, the summary pass hit this:
Failed to authenticate. API Error: 401
{"type":"error","error":{"type":"authentication_error",
"message":"OAuth token has expired. Please obtain a new
token or refresh your existing token."}}
The pipeline caught the non-zero exit code and moved on. It didnât crash. It didnât retry with a fresh token. It proceeded with whatever context it had accumulated before the auth failure â which, for a summary pass that runs early, meant nearly empty context. The subsequent draft pass received a project history with gaps where the March 14 and 15 summaries should have been, and filled those gaps with the only material available: the recursive transcript nesting.
The 401 didnât cause the outline-instead-of-post failure. But it removed the context that might have prevented it. A summary pass with valid auth would have produced a clean project history. The draft pass would have seen âon March 14, the pipeline published a blank templateâ as a one-line summary rather than as four layers of nested âSummarize this sessionâ prompts. The OAuth expiration didnât break the pipeline. It degraded the pipelineâs immune system right before the infection arrived.
The Fix That Keeps Getting Proposed
The March 12 post proposed three defenses: a minimum word count, a structural check for narrative elements, and a classification gate. The March 15 post documented the same three fixes â word count, structural check, classification gate â noting that they would have caught the template leak but hadnât been deployed. Now here on March 16, the pipeline produced outlines that all three checks would have rejected.
To make the pattern explicit:
- March 12: âA minimum word count. A structural check. A classification gate.â Proposed in
_posts/2026-03-12. - March 15: âA word count floor. A placeholder blocklist. Structural validation.â Proposed in
_posts/2026-03-15. - March 16: The pipeline produces 50-word outlines. All three checks would catch them. None exist in
generate_post.py.
Three posts. Three identical recommendations. Zero implementations. The fixes live in the blogâs archive, not in the codebase. The pipeline publishes its own remediation plan and then ignores it on the next run.
What Would Actually Break the Cycle
The loop is: pipeline fails, post documents failure, post proposes fixes, fixes remain in _posts/, pipeline fails again. The escape isnât a better fix â itâs deploying any of the fixes already proposed three times.
But thereâs a deeper structural problem that no word-count check solves. The recursive transcript nesting means the pipelineâs input degrades every day it runs on its own output. A word count gate would reject todayâs outline. It wouldnât prevent tomorrowâs draft pass from receiving a five-layer-deep transcript of the pipeline summarizing itself summarizing itself. The input degradation is upstream of the output validation.
The transcript nesting could be broken by excluding AutoBlogâs own sessions from its input â donât let the pipeline read transcripts of itself running. Or the summary pass could produce fixed-length summaries that donât preserve the nested prompt structure. Or the draft pass could receive only summaries, never raw transcripts, eliminating the nesting entirely.
Each of those is a design change, not a heuristic. And each has been, until now, the kind of thing that gets described in a blog post rather than committed to a repository.
This post, like the March 12 and March 15 posts before it, was written manually outside the pipeline. Of the last six posts on this blog, four exist because the pipeline couldnât write them. The pipeline produces the blogâs best material by failing â not as a clever observation, but as a literal accounting of the archive. The posts that required manual intervention are the ones with narrative structure, specific detail, and a through-line. The posts the pipeline produced on its own are a 50-word template skeleton and a 62-word skeleton with anchor links to its own empty sections.
The cycle breaks when the fixes move from _posts/ to generate_post.py. Until then, the pipeline and I will keep taking turns.