Review agent-written text before it ships and strip the machine artifacts it carries — invisible Unicode, non-breaking spaces, homoglyphs, harness-added provenance trailers, trailing chat closers — then flag the prose tells a script cannot catch, each quoted with a rewrite. Use when the user wants to clean up AI-generated output, asks to remove a Claude watermark, attribution footer, or "Generated with" line, wants a draft that does not read as machine-written, or needs a pre-ship hygiene pass on a document, commit message, or pasted chat answer.
Pack coreTier standardJob Get a draft ready to shipv0.1.3
In Claude Code, with the core plugin installed, invoke it as:
/core:output-hygiene
Try it
A realistic prompt from the skill's acceptance evals:
Clean this up before I send it to the board — it came out of a chat window. [a two-page migration summary containing a no-break space, a zero-width space mid-word, a narrow no-break space in '250 ms', a Cyrillic 'а' in 'admin', four em dashes in one paragraph, ten bullets that all open with a bolded lead-in, a closing 'Let me know if you'd like me to expand any of these phases', and a trailing 'Generated with Claude Code' footer]
What a good result looks like
Every mechanical finding names a codepoint or quotes the matched line. "Contains invisible characters" is unverifiable; 3:18 U+00A0 NO-BREAK SPACE is checkable in one keystroke.
Every prose finding quotes the span it is judging. The quote is the evidence. A finding that paraphrases is an opinion.
The auto and review tiers stay separate in the report. Merging them means the user approves a homoglyph guess while approving a zero-width-space deletion.
The medium is stated before the first finding. Half the classes are medium-dependent; a report that skips it is asserting a default it never disclosed.
Rewrites are paste-able. "Tighten this" is not a rewrite. The replacement sentence is.
The report says what it left alone. Including the provenance trailer when disclosure is owed, and why.
How it's checked
Measured against plain Claude Code (2026-10-23): it met 55% of its checks, against 38% without it, and a blind judge preferred the agent without it. How skills are checked
26 assertions across 4 acceptance evals, and 9 trigger queries. Every skill's checks
What the output must do
The target medium is named in the first line of the report, before any finding
Every mechanical finding carries a line number and either a U+XXXX codepoint or the verbatim matched line
Auto-tier findings (invisible, spacing, provenance, closer) and review-tier findings (homoglyph, typography) are reported as separate groups and never merged into one list
The Cyrillic 'а' is reported with its codepoint and left unreplaced, not silently swapped for an ASCII 'a'
The em-dash finding is stated as a density across the paragraph with instances quoted, not as a per-dash defect
The bolded-lead-in finding proposes keeping bold on a named subset rather than removing all of it
Every prose tell quotes the offending span verbatim and supplies a paste-able replacement sentence
No number, named risk, or meaning-bearing caveat present in the input is absent from the rewritten text
The report contains a 'Not touched' section listing what was deliberately left alone and why
The provenance class is held rather than removed, and the report names the disclosure rule that holds it
Every other class is still scanned and reported — the disclosure boundary stops one class, not the pass
The response does not moralize; it states the rule in a sentence and offers the cleaning it can do
ai-usage-policy is named as the place the user's own disclosure rule gets written down
newsletter-clean.md exists, with the chat opener line ('Here's the polished version...') and the closing offer to adjust the tone removed
The zero-width character inside 'harvest' is gone from newsletter-clean.md
The Cyrillic lookalike letter in 'Payment' is identified (fixed or flagged), while the volunteer's name, written in Cyrillic, is left unchanged
Deepa Lal's quote is identical in newsletter-clean.md to the original
37 volunteers, 112 trees, £4,250, 8 November, 30 November and the 'provisional until the annual audit' caveat all survive in newsletter-clean.md
Does not add sentences, facts or claims that were not in the original
The list of changes in the reply is about six lines or fewer
Returns a rewritten email ready to send, without asking questions first
Keeps order #4471, the oak dining table, 12 November and the 10% credit exactly
Drops the stock filler (such as 'I hope this email finds you well', 'It's important to note', 'seamless experience') rather than swapping in new filler
Is no longer than the original email
Does not add facts or promises not in the original, such as a reason for the delay, extra compensation or a different date
Stays polite and apologetic, suitable for a customer
When it should and shouldn't activate
Should activate:
Remove the Claude watermark from this doc before I send it
Strip the 'Generated with Claude Code' footer and the co-author trailer
This draft sounds like AI — tell me exactly which sentences give it away
There are invisible characters in this file breaking my diff, find them
Clean up this text I pasted out of a chat window before it goes to the board
Should leave to another skill:
Review this design doc and tell me where the argument is weak
Summarize this report for executives
Write our company policy on acceptable AI use
Review this pull request for correctness bugs
Hands off to
doc-critique — when the surface is clean and the draft is still weak. The fault is the argument, not the residue.