Fixing a draft used to mean regenerating the whole post. When a section didn't sound right, the new version would correct it and overwrite three others that were already fine, so I kept a corrected copy open in the Ghost editor, regenerated, and pasted the good paragraphs back in whenever a draft dropped them. Four rounds in, the post still wasn't right.
The revision step in the plugin came out of that. It works one section at a time: it changes a section, leaves the rest of the draft alone, and waits for me to approve before moving on. A fix in one place can't rewrite another, and nothing I've already got right is at risk.
The self-audit
The section-by-section revision isn't the first pass over a draft. Before I see it, draft-post runs a mechanical one. It greps the draft for the tells that read as machine-generated — cleft frames, hedge words, AI transitions, markdown tables, over-long or untagged code fences — and fixes them in place. A few of the patterns it looks for:
grep -niE 'what (this|that) means is|the (point|key) is that'
grep -niE '\b(just|simply|obviously|clearly)\b'
grep -niE 'it.s worth noting|delve into|moreover,|furthermore,'
These are fixed patterns, so the skill handles them without me. By the time I read the draft, the obvious tells are gone. The rest — whether it sounds right, whether it's true — needs reading, not grep.
Section by section
A whole draft is too much to revise well in one pass — for me and for the model. At fifteen hundred words I skim instead of reading; the model rewriting all of it at once is how the regenerations happened in the first place. A section is small enough that we both stay with it: I read every line, and the model works one bounded piece instead of the whole post at once.
The small unit also surfaces the problems. A sentence that doesn't sound right is easy to miss as one of fifty; as one of six, it stands out. So does a claim I need to check. revise-post splits the draft on its headings and works through them one at a time, so every part gets read at the size where I actually catch things.
Three axes per section
Each section gets read three ways.
Formatting picks up where the self-audit left off: code lines reflowed under about seventy characters so Ghost doesn't wrap them, a dense paragraph that's really a list turned into one, a comparison moved into an HTML table instead of the cramped markdown Ghost renders.
Voice is the part a grep can't do. The section gets read against my voice, not a generic one — for this blog that's clear and straightforward, which doesn't mean monotonous. A paragraph cut into a row of identical declaratives reads as mechanical. So the pass is a read: whether the sentences carry their reasoning, whether there's a line in here I'd never say out loud. The fix depends on the line — a cut, an addition, or a rewrite. One draft ended a paragraph with "Checking what a TUI announces about itself is cheaper than announcing it yourself," a line that sounds like a conclusion and carries nothing, so it came out. Another ended on "enforced on both sides of the keyboard," a flourish that became "the same rule for the autopilot and for me."
Accuracy is the one I lean on most. Every command, flag, API name, and factual claim gets checked against real source, anything that can't be verified gets flagged, and nothing gets invented to fill a gap. One draft of these posts said the guide re-derives "when I approve a post and push it." The plugin only ever creates drafts — publishing is something I do by hand in Ghost. The sentence read fine and was wrong.
Keeping edits made in Ghost
Even with the section pass, I still edit in the Ghost editor once a draft is up — a link or another Ghost-specific fix, and text I reword by hand. A plain push would overwrite those with the local file and lose them.
push-draft pulls before it pushes: it reads the live post, folds any editor changes back into the local draft, and only then updates Ghost. The copy I used to keep safe by hand is kept by the tool instead.
Using it
draft-post drafts the full post in one pass; revise-post follows with the section-by-section read. You can run both together with /ghost:write-post, or take any draft straight into /ghost:revise-post. The repo is github.com/schuettc/claude-code-plugins, and this post went through the same pass.