Watching a copyedit happen
This page walks through one real copyedit, end to end. The editor is
Claude, working alone in a sealed environment with exactly two things: the
packt-prose binary and the skill that ships with it. The manuscript is a
real submitted chapter — 5,222 words on coordinating multiple agents,
arriving with no Word styles, hand-painted headings, and an author's
typical mix of clean prose and small defects. Every command below comes
from the session's audited log, and every output block is what the tool
printed.
The point of the walkthrough is not the individual edits. It is the shape of the work: how the model reads before it touches anything, how it uses the findings without obeying them, how every proposed change is checked before the document is written, and how the author's voice is measured on the way out. The same shape holds whether the editor is Claude in a chat or Claude Code on your laptop.
Stage 1 — read before touching
The session opens with three commands and no writes.
packt-prose doctor
packt-prose review -i chapter.docx --chapter chapter.json --mech mech.json
packt-prose extract -i chapter.docx --format text
doctor proves the tool is healthy. review answers the sizing questions
in one screen — what kind of document, how much prose, how many findings
at each confidence tier, and what the style situation is:
chapter.docx
reads as chapter, so the default profile is in use
prose words 5222
suggested 130 edits — professionals land 20-35 per 1,000 words; far below this usually means findings went unfixed
findings 12 error, 51 warning, 211 advice
mechanical 9 fixes needing no judgement
styles 649 unstyled, 665 to re-style, 18 need a person
rule severity n fix first example
packt.mech.smart-quotes advice 95 0 "'" (p2)
packt.advice.passive advice 51 0 "is to split:" (p1)
packt.caps.headings warning 16 0 "The Orchestrator Role" (p15)
packt.caps.consistency warning 12 0 "verifier" (p3)
packt.doc.bold-emphasis error 12 0 "Chapter 6: Coordinating Multiple Agents" (p0)
packt.advice.referent warning 8 0 "It has" (p10)
packt.voice.first-person warning 5 0 "we've" (p3)
…
Then the model reads the manuscript itself through extract --format
text, which prints one line per paragraph — its number, what the
paragraph is, and its words:
[0|P] Chapter 6: Coordinating Multiple Agents
[1|P] Every system that grows complex enough eventually needs to split its responsibilities. A single agent handling…
[3|P] Coordination failures are categorically different from the single-agent failures we've seen in earlier chapters…
[5|P] TIP Before splitting a single agent into multiple agents, write down the exact interaction protocol between…
[6|H1] Assigning Roles Across Agents
Not the findings — the chapter. Everything that follows depends on this read: the findings locate candidates, but only reading tells the editor that "Planner", "Executor" and "Verifier" are this book's named components, that the TIP boxes are the author's own convention, and that the prose is genuinely clean at sentence level.
Stage 2 — work the findings rule by rule, not line by line
274 findings would be noise read top to bottom, and the log shows the model never doing that. It works from the summary above, one rule at a time. Take the biggest number first: 95 smart-quote findings. Before declining a rule wholesale, the model reads the rule —
### packt.mech.smart-quotes
Published Packt prose uses curly quotation marks and apostrophes. A
manuscript written in a code editor arrives with straight ones … It is
reported and never applied, and the reason is a gate rather than a doubt
about the finding. The quote_churn check refuses any edit whose only
difference is a quotation mark or an apostrophe, because Packt production
normalizes those downstream — so a tracked change here buys nothing and
costs an editor a review.
— and finds that declining all 95 is the documented behaviour, not a shortcut: production normalizes typography downstream. Ninety-five findings resolved by one read.
The next rule down needs the opposite treatment. packt.caps.consistency
does not say what is right — it says the document disagrees with itself,
and shows the count both ways:
chapter.json:3:341 warning: This document writes "Verifier" 35 times and "verifier" here. Use one casing.
chapter.json:3:366 warning: This document writes "Executor" 41 times and "executor" here. Use one casing.
chapter.json:13:10 warning: This document writes "three" 18 times and "Three" here. Use one casing.
The tool has counted; the model decides. The book capitalizes its role names almost everywhere, so the fix goes to the minority spelling, and the reasoning travels inside the edit itself:
{"pid": 3, "find": "verifier", "replace": "Verifier",
"rule": "packt.caps.consistency",
"note": "book capitalizes the role name 35 times against 3 lowercase"}
The same judgement runs the other way. packt.voice.first-person flags
five uses of "we"; the model reads each one, decides they are genuine
guided walkthroughs rather than register drift, declines all five, and
raises the question once in an editorial letter instead of sweeping the
text. The findings decide where to look; the reading decides what to
do.
Stage 3 — the styles are a decision surface too
chapter.docx
paragraphs 740
unstyled 649
to re-style 665
needs a person 18
missing styles H1-Section, H2-Heading, L-Bullets, P-Callout, P-Regular, SC-Source
what would change:
555 SC-Source — every run in the paragraph is monospaced
70 P-Regular — the paragraph is a sentence with no style
24 H2-Heading — "heading 2" is the house style "H2 - Heading" under another name
6 P-Callout — the paragraph is shaded and announces itself as a tip or note
left for a person:
paragraph 0 — the paragraph is short, has no terminal punctuation, and is followed by prose, so it may be a heading; the level needs a person
"Chapter 6: Coordinating Multiple Agents"
paragraph 13 — the paragraph is shaded like a callout but does not announce itself as one; needs a person
"[DIAGRAM] Three boxes in a horizontal row labeled 'Planner A…"
The classifier is confident about 665 paragraphs and refuses to guess 18,
and the model's job is exactly those 18. Each becomes a decision with its
evidence recorded: the chapter-title line the classifier will not call,
and the shaded [DIAGRAM] briefs — shaded like callouts but not announced
as one — which the model reads, recognizes as the author's artwork
specifications, and assigns deliberately:
{"pid": 0, "style": "H1-Chapter", "note": "the chapter title line the classifier could not call"}
{"pid": 13, "style": "P-Callout", "note": "shaded diagram brief"}
Stage 4 — the batch is checked before the document is touched
The finished edit list — 39 text edits, 24 formatting removals, 19 style
decisions, 7 comments — goes to check-edit, which runs every safety gate
the writer will run, without writing anything:
When an edit is unsound, the check says exactly why — every failed gate at once, so one revision fixes them all. This is what a refusal looks like:
edit 2 (paragraph 53) rejected:
quoted: "the pipeline stalls, and the user waits"
replacement: "the pipeline stalls and the user waits for 90 seconds"
✗ find_missing: "the pipeline stalls, and the user waits" does not appear in paragraph 53; quote the paragraph exactly
✗ entity_drift: the replacement introduces a number that is not in the original: "90"
A quote that is not verbatim (find_missing), an edit that would touch
code or an identifier (protected_span), a replacement that changes a
number (entity_drift), a deletion that shrinks a phrase to almost
nothing (collapsed_replace) — each is a line in a report, not a mark in
the manuscript. The model's response is always the same, and it is the
designed response: fix the edit in the list and re-check. The loop ends
when the whole batch passes:
39 of 39 edits passed the gates.
7 of 7 comments can be anchored.
24 of 24 formatting requests can be anchored.
19 of 19 style overrides resolve.
voice: the batch stays inside the copyedit bands
Stage 5 — is the author still the author?
That last line is a summary of a full measurement, run before anything is written: the batch is compared with how a professional copyedit moves a chapter's register, using bands measured from real Packt copyedits.
Author voice, before and after editing:
before after change
words 5082.00 5095.00 0%
mean sentence length 17.52 17.57 0%
contractions per word 0.02 0.02 -0%
"we" per 1,000 words 0.98 0.98 -0%
"you" per 1,000 words 7.48 7.46 -0%
exclamation marks 0.00 0.00 0%
questions 13.00 13.00 0%
hedges per 1,000 words 2.16 2.16 -0%
passive sentences 0.15 0.15 0%
Nothing looks out of place: every measure moved the way a professional copyedit moves it.
edit-list voice accounting (39 edits):
contractions expanded 0 (0 rule-backed)
contractions introduced 0 (0 rule-backed)
pronoun shifts 0 (0 rule-backed)
hedges removed 0 (0 rule-backed)
Thirty-nine edits, and the chapter's register has not moved: no contractions expanded, no rule-less rewording that happened to strip a "we", the author's thirteen rhetorical questions intact. Each register count is split by whether a house rule demanded the shift — a chapter that needed two hundred first-person conversions would show two hundred pronoun shifts, all rule-backed, and raise no flag. What the measurement exists to catch is drift with no rule behind it: a chapter that stops sounding like its author without a defect to show for it.
Stage 6 — one write, then read your own output
packt-prose apply -i chapter.docx --chapter chapter.json \
--edits edits.json -o chapter_CE.docx --mechanical \
--report apply-report.json
41 tracked changes written to chapter_CE.docx, attributed to "Packt CE".
7 mechanical fixes were already covered by one of your edits, so they were not planned twice:
paragraph 8: "Role" (packt.caps.hyphenated-compound)
…
24 formatting requests applied, touching 28 runs, as tracked format revisions.
7 comments written alongside them.
No edits were refused.
Everything lands in a single write — the mechanical fixes, the judged
edits, the formatting strips, the comments — each as its own independently
rejectable tracked change. (Re-styling the paragraphs into the house
template is production's own pass, styles apply, and no part of this
copyedit.) And then the loop that
separates a careful editor from a careless one: the model lints its own
output.
rule severity n fix first example
packt.mech.smart-quotes advice 94 0 "'" (p3)
packt.advice.passive advice 51 0 "is to split:" (p2)
packt.caps.consistency warning 8 0 "Three" (p14)
packt.voice.first-person warning 5 0 "we've" (p4)
…
Reading this delta is the check: everything left is something the model
consciously declined (the smart quotes, the passives, the five "we"s), and
anything new is something the edits themselves introduced. In this
session the re-lint caught two of those — code-styling the event-type
identifiers exposed the same rule firing at their second occurrences, and
the like→such-as swap created an example-comma finding. The model extended
the edit list, deleted the output, and rebuilt it from the original in one
fresh apply — the rebuild-from-source discipline the skill teaches, so
the deliverable never accumulates layers of patching.
The final act is reading the comments back out of the deliverable, to confirm each landed on the words it was written for:
7 comments in chapter_CE.docx.
paragraph 25, by Packt CE
on: "described in their 2024 technical reports"
Which reports are these? The orchestrator/subagent separation most readers
will be able to find is in Anthropic's engineering blog posts rather than
anything titled a technical report. A title or link here lets the reader
and the technical reviewer check the specific finding…
paragraph 82, by Packt CE
on: "When OpenAI audited their enterprise deployments"
Is this audit public? As written, the sentence attributes specific internal
findings to OpenAI. If there is a published source, cite it here; if this
is your inference from their design, perhaps recast as what the
architecture implies rather than an audit they ran…
The comments are where the judgement that didn't become edits went: a query on an uncited vendor claim, a cross-reference whose title the sealed room could not resolve, the first-person register question — raised once, anchored on the exact words, addressed to the humans who can actually answer them.
What this adds up to
- Reading comes first, and the tool's findings are a map of places to look, never a to-do list. Roughly half the warnings in this session were declined, each with a reason in the report.
- Nothing reaches the document unchecked. The same gates run in
check-editand again insideapply; a refused edit is a line in a report, not a mark in the manuscript. - Voice is measured, not assumed. The batch is compared with how real Packt copyedits move a chapter's register before it is written.
- The output gets the same scrutiny as the input. Re-lint, re-read, rebuild from the original if anything needs to change.
- Everything is reviewable. Tracked changes under one author name, comments on exact anchors, a machine-readable report of every count and every refusal — and an editor in Word keeps the final say on all of it.