Skip to content

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-prose rules --id packt.mech.smart-quotes --format md
### 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:

packt-prose lint -i chapter.json --rule packt.caps.consistency
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

packt-prose styles report -i chapter.docx
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:

packt-prose check-edit --chapter chapter.docx --edits edits.json

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.

packt-prose voice --chapter chapter.json --edits edits.json
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.

packt-prose lint -i chapter_CE.docx --summary
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:

packt-prose comments -i chapter_CE.docx
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-edit and again inside apply; 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.