humanizer
This skill drafts or revises expository prose whose value depends on the
reader understanding and trusting it. Its doctrine is
docs/graph/method/prose-posture.md: meaning governs style, the information
contract is preserved, structure carries emphasis, genre outranks generic
advice, voice is a constraint, and editing stops when the prose does its
job. This node holds the procedure that applies the doctrine and the tool
that floors it.
Two halves do the work. The skill is the judgment: what the document must
cause the reader to understand or do, which claims must survive, which
diagnostics apply, what the voice is. The tool docs/graph/prose-lint.py
(seed home tools/prose-lint.py) is the floor under that judgment: it
reports the tells a pattern can catch, and with --against <rev> it proves
that a rewrite added and dropped nothing.
When to apply this skill
- A document, README, runbook, or node body is being written or refreshed
for people, and the draft came out of a model or from notes.
- An ADR or spec body is about to flip to
accepted or active
(docs/graph/skills/adr-writer.md, docs/graph/skills/spec-author.md).
The record is prose someone reads in a year.
- The
deliver protocol's full-form summary, a pull-request description, or
a commit message is being prepared. Other people read these most and edit
them least.
- A reviewer or the owner says the text "sounds like an AI".
- Text imported from outside the project (a harvest import, a vendored
guide) will be read as the project's own voice.
Out of scope: code, commands, frontmatter, owns: and load_when: lists,
generated tables, the kernel, and the seed's own machinery prompts. The
machinery is edited by grill and holistic-editing, never by a prose
pass. Fiction is out of scope; invented detail is its task.
The document contract
Before drafting or revising substantial prose, settle a compact contract.
For a short edit, infer it in a moment and proceed; for long, high-stakes,
or multi-source work, let it govern every section. It is internal unless
the owner asks for the reasoning or an audit.
- Purpose: what must this document cause the reader to understand, decide,
approve, do, or remember?
- Audience: what does the reader know, what terminology can they handle,
what do they care about, what is their likely next action?
- Genre: which profile in
prose-posture.genre-outranks applies?
- Substance: which claims, evidence, instructions, and caveats must survive?
- Priority: which one to three ideas matter most?
- Authority: which statements are facts, attributed claims, inferences,
assumptions, recommendations, unknowns, or contested
(
prose-posture.claim-classes)?
- Voice: the owner's sample if one exists; otherwise the restrained default
for the genre, in the plant's declared
deliverable_language.
- Constraints: length, format, required sections, terminology, headings
other documents anchor to.
- End state: what should a competent reader be able to say or do after
reading?
Progressive execution
Use the lightest process that reliably fits the task.
Level 1, local edit (a paragraph, a commit message, a summary): infer
purpose and voice; preserve the claims; revise the weak sentences or
paragraph; run the fidelity and naturalness checks; return the prose.
Level 2, document revision (a README, a runbook, a node body, a
multi-section document): settle the contract; map sections and claims; find
the structural defects; revise section by section; harmonize voice and
terminology; audit repetition across sections; verify facts, citations, and
conditions; return the document.
Level 3, high-stakes synthesis (a long technical or legal-adjacent
document, a multi-source report, an owner brief that will drive a
decision): settle the contract; keep a claim and source ledger; classify
authority and uncertainty; design the information architecture; draft or
rewrite bounded sections; verify each against its sources; test coherence
across the document; audit citations and quantities; review genre and
voice; run the adversarial pass; finalize. Level 3 ceremony is never spent
on a short paragraph.
Rewriting existing prose: the passes
- Understand before editing. Read the whole relevant section. Name
what the passage is trying to do, which claims are indispensable, where
the logic changes, whether paragraph boundaries match it, which terms
must stay stable, and what voice the source has. Run
python3 docs/graph/prose-lint.py --file <path> and add its findings to
your own; it sees density (dash rate, bold-label runs, intensifier
clusters) better than a reader does, and it misses voice entirely. Do
not start with a word-replacement pass.
- Rebuild weak structure. For each weak paragraph: state its job in a
few words, list its indispensable claims, choose a natural order, delete
staging and duplicated emphasis, write the paragraph again. Reuse source
sentences that already work. A paragraph that is clear, exact, and
genre-appropriate stays unchanged.
- Edit sentences. Inspect actor, verb, referent, qualifier, clause
order, modifier placement, terminology, punctuation, length, and
repetition, against the diagnostics in
prose-posture.diagnostics and
the decision rules in prose-posture.decision-rules.
- Check the document's rhythm. Look across paragraphs for the repeats
invisible sentence by sentence: the same opener, closer, list length,
paragraph size, transition, or contrast structure. Change repetition
only where it is accidental or templated.
- Audit fidelity. Compare the rewrite with the source: every number,
date, proper noun, technical term, quoted phrase, citation, condition,
exception, modal verb, causal statement, comparative, ranking, and scope
phrase. Then run
python3 docs/graph/prose-lint.py --file <path> --against HEAD (or the
revision the edit started from). An unsupported addition or a material
omission is an error; the rewrite is wrong until it is restored. Finally
search for the tells that most often survive a rewrite: an empty
contrast, a one-line closer, a dash, a triad, a bold label.
Drafting from notes
Do not turn each bullet into one sentence. Settle the contract; classify
each note as claim, evidence, context, caveat, recommendation, instruction,
example, or open question; detect duplicates and contradictions; choose the
information order; decide which notes deserve paragraphs, lists, tables, or
omission; draft paragraphs around reader questions; add connective
reasoning only where the relationship is supported; keep uncertainty and
unresolved points visible ("The notes do not establish whether..."); revise
for voice and genre; verify every concrete statement against the notes.
What the fact-preservation check proves
A rewrite is a claim that nothing changed except the words. The tool makes
the claim testable: for each file, the working copy and git show <rev>:<path> must agree on the sorted multiset of numbers, heading texts,
inline code spans, fenced blocks, link targets, and requirement levels
(must, must not, shall, should, may, never, required, prohibited). These
classes are where facts hide in prose: a count, a version, a name in
backticks, a command, a destination, an obligation. A drift is reported as
what was added and what was dropped, and it blocks. The check does not
prove the prose is good; it proves the rewrite is honest. Both halves are
required before the text is handed off.
Counts stated in the seed's own documentation are also cross-checked
against manifest.json by tests/seed-lint.py; a rewrite that drops "13
skills" from a sentence fails there as well.
Verification, proportional to consequence
- Fidelity: no unsupported addition; no dropped material claim; no changed
number, date, unit, name, or term; no altered citation scope; no stronger
causal language; no lost condition or exception; no changed requirement
level.
- Logic: each conclusion follows from what precedes it; transitions name
real relationships; comparisons share a basis; pronouns have clear
referents; alternatives are real; recommendations separate evidence from
judgment.
- Structure: each section has a function; order follows reader need;
headings are useful; repetition is intentional; lists exist because
scanning helps; important ideas get proportionate space.
- Voice: register matches audience and genre; a supplied sample is
recognizable without caricature; no random personality was introduced;
terminology is stable.
- Naturalness: read as a reader, not as a pattern detector. Fix only
defects that matter. For prose read linearly, simulate a read-aloud pass
for breathless clause stacks and punctuation that hides the relation
between clauses.
The adversarial pass (Level 2 and 3). Ask: which sentence sounds more
certain than the evidence; which paragraph exists because a template
expected it; which abstract noun hides an actor; which sentence repeats the
one before; which contrast argues with nobody; which transition would
vanish under a better order; which list was forced into a pattern; which
heading promises more than its section delivers; which recommendation hides
a tradeoff; which citation now supports more than it did; which
qualification was lost; which line was written to impress; and which line
is being edited only because it "sounds AI" rather than because it is weak.
The last question prevents overcorrection: revert those edits.
Output modes
- File mode (the default in this system). The text lives in a file
under version control. Run the passes and write only the finished text
back. Change prose only; keep code, metadata, commands, paths,
identifiers, link targets, citations, table data, and anchored heading
text unchanged. Keep process commentary outside the file; report in one
short paragraph what changed.
- Embedded mode. Another protocol or skill uses this one as its prose
layer (a pull-request description, a commit message, the delivery
summary). Return only the finished prose in the structure the caller
requires. No chat wrapper.
- Drafting mode. From notes, sources, or an outline, return the finished
prose in the requested format without narrating the drafting.
- Rewrite mode. For pasted prose, return the complete revised text; keep
change notes brief and separate.
- Audit mode. When asked to review rather than rewrite, report the
highest-impact issues in order of effect on fidelity, logic, structure,
audience fit, naturalness, and surface style. Do not list every weak
phrase.
Where this skill runs in the system
deliver: the full-form summary and any pull-request description or
commit message pass through embedded mode before hand-off; the summary's
quality bar names it.
canonize: the docs-librarian applies file mode to node bodies,
runbooks, and README prose it writes or refreshes, and runs the tool with
--against before the graph-lint pass.
adr-writer and spec-author: the body of a record is prose a person
reads; file mode applies before the status flips.
harvest: imported prose that will read as the seed's own voice passes
file mode; the tool runs beside agnosticism-lint.py on the changed
files. The seed's machinery prompts themselves are not humanized; they
change only through grill.
Reference
docs/graph/prose-lint.py (seed home tools/prose-lint.py): findings as
path:line: §N|letter strong|weak, the dash rate per 1,000 words,
--strict, --sample <file>, --against <rev>, --changelog-ok; exit 0
clean, 1 findings, 2 usage or no file matched. Vocabulary detectors are
weak by doctrine; a weak cluster (three weak tells in one paragraph)
fails; strong tells fail on one sighting.
docs/graph/method/prose-posture.md: the doctrine, the genre profiles,
the diagnostics A to X, the anti-patterns, the decision rules, the stop
conditions.
docs/graph/skills/holistic-editing.md: a prose rewrite is an
integration into the whole document, never a patch of flagged phrases.
Source and license
Adapted from two MIT-licensed skills: the humanizer skill by Siqi Chen
(2025; patterns from Wikipedia's "Signs of AI writing") and the
human-prose doctrine (4.0.0, derived from it). Upstream notices are kept at
skills/humanizer/LICENSE.upstream. The adaptation adds the mechanical
fact-preservation check, the plant language facts, the scope and exemptions
of this system, the split between doctrine (method.prose-posture) and
procedure (this node), and the wiring into deliver, canonize, and the
writing skills.
1---2name: humanizer3description: Draft or revise prose a person will read (documentation, README text, ADR and spec bodies, runbooks, pull-request descriptions, commit messages, delivery summaries, briefs and reports for the owner) so it reads as deliberate writing by a competent author, without changing what it says. Use when a draft came out of a model and shows the tells (empty contrasts, staged openers, one-line closers, forced triads, dash dependence, inflated significance, bold labels on every item, chatbot residue), when drafting finished prose from notes, or as the last pass before such text is handed off. Preserves facts, numbers, conditions, requirement levels, citations and voice; adds no fact; never fakes a human author or chases a detector score. The doctrine is method.prose-posture; docs/graph/prose-lint.py is the mechanical floor and the fact-preservation check.4---56# humanizer78This skill drafts or revises expository prose whose value depends on the9reader understanding and trusting it. Its doctrine is10`docs/graph/method/prose-posture.md`: meaning governs style, the information11contract is preserved, structure carries emphasis, genre outranks generic12advice, voice is a constraint, and editing stops when the prose does its13job. This node holds the procedure that applies the doctrine and the tool14that floors it.1516Two halves do the work. The skill is the judgment: what the document must17cause the reader to understand or do, which claims must survive, which18diagnostics apply, what the voice is. The tool `docs/graph/prose-lint.py`19(seed home `tools/prose-lint.py`) is the floor under that judgment: it20reports the tells a pattern can catch, and with `--against <rev>` it proves21that a rewrite added and dropped nothing.2223## When to apply this skill2425- A document, README, runbook, or node body is being written or refreshed26 for people, and the draft came out of a model or from notes.27- An ADR or spec body is about to flip to `accepted` or `active`28 (`docs/graph/skills/adr-writer.md`, `docs/graph/skills/spec-author.md`).29 The record is prose someone reads in a year.30- The `deliver` protocol's full-form summary, a pull-request description, or31 a commit message is being prepared. Other people read these most and edit32 them least.33- A reviewer or the owner says the text "sounds like an AI".34- Text imported from outside the project (a harvest import, a vendored35 guide) will be read as the project's own voice.3637Out of scope: code, commands, frontmatter, `owns:` and `load_when:` lists,38generated tables, the kernel, and the seed's own machinery prompts. The39machinery is edited by `grill` and `holistic-editing`, never by a prose40pass. Fiction is out of scope; invented detail is its task.4142## The document contract4344Before drafting or revising substantial prose, settle a compact contract.45For a short edit, infer it in a moment and proceed; for long, high-stakes,46or multi-source work, let it govern every section. It is internal unless47the owner asks for the reasoning or an audit.4849- Purpose: what must this document cause the reader to understand, decide,50 approve, do, or remember?51- Audience: what does the reader know, what terminology can they handle,52 what do they care about, what is their likely next action?53- Genre: which profile in `prose-posture.genre-outranks` applies?54- Substance: which claims, evidence, instructions, and caveats must survive?55- Priority: which one to three ideas matter most?56- Authority: which statements are facts, attributed claims, inferences,57 assumptions, recommendations, unknowns, or contested58 (`prose-posture.claim-classes`)?59- Voice: the owner's sample if one exists; otherwise the restrained default60 for the genre, in the plant's declared `deliverable_language`.61- Constraints: length, format, required sections, terminology, headings62 other documents anchor to.63- End state: what should a competent reader be able to say or do after64 reading?6566## Progressive execution6768Use the lightest process that reliably fits the task.6970**Level 1, local edit** (a paragraph, a commit message, a summary): infer71purpose and voice; preserve the claims; revise the weak sentences or72paragraph; run the fidelity and naturalness checks; return the prose.7374**Level 2, document revision** (a README, a runbook, a node body, a75multi-section document): settle the contract; map sections and claims; find76the structural defects; revise section by section; harmonize voice and77terminology; audit repetition across sections; verify facts, citations, and78conditions; return the document.7980**Level 3, high-stakes synthesis** (a long technical or legal-adjacent81document, a multi-source report, an owner brief that will drive a82decision): settle the contract; keep a claim and source ledger; classify83authority and uncertainty; design the information architecture; draft or84rewrite bounded sections; verify each against its sources; test coherence85across the document; audit citations and quantities; review genre and86voice; run the adversarial pass; finalize. Level 3 ceremony is never spent87on a short paragraph.8889## Rewriting existing prose: the passes90911. **Understand before editing.** Read the whole relevant section. Name92 what the passage is trying to do, which claims are indispensable, where93 the logic changes, whether paragraph boundaries match it, which terms94 must stay stable, and what voice the source has. Run95 `python3 docs/graph/prose-lint.py --file <path>` and add its findings to96 your own; it sees density (dash rate, bold-label runs, intensifier97 clusters) better than a reader does, and it misses voice entirely. Do98 not start with a word-replacement pass.992. **Rebuild weak structure.** For each weak paragraph: state its job in a100 few words, list its indispensable claims, choose a natural order, delete101 staging and duplicated emphasis, write the paragraph again. Reuse source102 sentences that already work. A paragraph that is clear, exact, and103 genre-appropriate stays unchanged.1043. **Edit sentences.** Inspect actor, verb, referent, qualifier, clause105 order, modifier placement, terminology, punctuation, length, and106 repetition, against the diagnostics in `prose-posture.diagnostics` and107 the decision rules in `prose-posture.decision-rules`.1084. **Check the document's rhythm.** Look across paragraphs for the repeats109 invisible sentence by sentence: the same opener, closer, list length,110 paragraph size, transition, or contrast structure. Change repetition111 only where it is accidental or templated.1125. **Audit fidelity.** Compare the rewrite with the source: every number,113 date, proper noun, technical term, quoted phrase, citation, condition,114 exception, modal verb, causal statement, comparative, ranking, and scope115 phrase. Then run116 `python3 docs/graph/prose-lint.py --file <path> --against HEAD` (or the117 revision the edit started from). An unsupported addition or a material118 omission is an error; the rewrite is wrong until it is restored. Finally119 search for the tells that most often survive a rewrite: an empty120 contrast, a one-line closer, a dash, a triad, a bold label.121122### Drafting from notes123124Do not turn each bullet into one sentence. Settle the contract; classify125each note as claim, evidence, context, caveat, recommendation, instruction,126example, or open question; detect duplicates and contradictions; choose the127information order; decide which notes deserve paragraphs, lists, tables, or128omission; draft paragraphs around reader questions; add connective129reasoning only where the relationship is supported; keep uncertainty and130unresolved points visible ("The notes do not establish whether..."); revise131for voice and genre; verify every concrete statement against the notes.132133## What the fact-preservation check proves134135A rewrite is a claim that nothing changed except the words. The tool makes136the claim testable: for each file, the working copy and `git show137<rev>:<path>` must agree on the sorted multiset of numbers, heading texts,138inline code spans, fenced blocks, link targets, and requirement levels139(must, must not, shall, should, may, never, required, prohibited). These140classes are where facts hide in prose: a count, a version, a name in141backticks, a command, a destination, an obligation. A drift is reported as142what was added and what was dropped, and it blocks. The check does not143prove the prose is good; it proves the rewrite is honest. Both halves are144required before the text is handed off.145146Counts stated in the seed's own documentation are also cross-checked147against `manifest.json` by `tests/seed-lint.py`; a rewrite that drops "13148skills" from a sentence fails there as well.149150## Verification, proportional to consequence151152- Fidelity: no unsupported addition; no dropped material claim; no changed153 number, date, unit, name, or term; no altered citation scope; no stronger154 causal language; no lost condition or exception; no changed requirement155 level.156- Logic: each conclusion follows from what precedes it; transitions name157 real relationships; comparisons share a basis; pronouns have clear158 referents; alternatives are real; recommendations separate evidence from159 judgment.160- Structure: each section has a function; order follows reader need;161 headings are useful; repetition is intentional; lists exist because162 scanning helps; important ideas get proportionate space.163- Voice: register matches audience and genre; a supplied sample is164 recognizable without caricature; no random personality was introduced;165 terminology is stable.166- Naturalness: read as a reader, not as a pattern detector. Fix only167 defects that matter. For prose read linearly, simulate a read-aloud pass168 for breathless clause stacks and punctuation that hides the relation169 between clauses.170171**The adversarial pass** (Level 2 and 3). Ask: which sentence sounds more172certain than the evidence; which paragraph exists because a template173expected it; which abstract noun hides an actor; which sentence repeats the174one before; which contrast argues with nobody; which transition would175vanish under a better order; which list was forced into a pattern; which176heading promises more than its section delivers; which recommendation hides177a tradeoff; which citation now supports more than it did; which178qualification was lost; which line was written to impress; and which line179is being edited only because it "sounds AI" rather than because it is weak.180The last question prevents overcorrection: revert those edits.181182## Output modes183184- **File mode** (the default in this system). The text lives in a file185 under version control. Run the passes and write only the finished text186 back. Change prose only; keep code, metadata, commands, paths,187 identifiers, link targets, citations, table data, and anchored heading188 text unchanged. Keep process commentary outside the file; report in one189 short paragraph what changed.190- **Embedded mode.** Another protocol or skill uses this one as its prose191 layer (a pull-request description, a commit message, the delivery192 summary). Return only the finished prose in the structure the caller193 requires. No chat wrapper.194- **Drafting mode.** From notes, sources, or an outline, return the finished195 prose in the requested format without narrating the drafting.196- **Rewrite mode.** For pasted prose, return the complete revised text; keep197 change notes brief and separate.198- **Audit mode.** When asked to review rather than rewrite, report the199 highest-impact issues in order of effect on fidelity, logic, structure,200 audience fit, naturalness, and surface style. Do not list every weak201 phrase.202203## Where this skill runs in the system204205- `deliver`: the full-form summary and any pull-request description or206 commit message pass through embedded mode before hand-off; the summary's207 quality bar names it.208- `canonize`: the docs-librarian applies file mode to node bodies,209 runbooks, and README prose it writes or refreshes, and runs the tool with210 `--against` before the graph-lint pass.211- `adr-writer` and `spec-author`: the body of a record is prose a person212 reads; file mode applies before the status flips.213- `harvest`: imported prose that will read as the seed's own voice passes214 file mode; the tool runs beside `agnosticism-lint.py` on the changed215 files. The seed's machinery prompts themselves are not humanized; they216 change only through `grill`.217218## Reference219220- `docs/graph/prose-lint.py` (seed home `tools/prose-lint.py`): findings as221 `path:line: §N|letter strong|weak`, the dash rate per 1,000 words,222 `--strict`, `--sample <file>`, `--against <rev>`, `--changelog-ok`; exit 0223 clean, 1 findings, 2 usage or no file matched. Vocabulary detectors are224 weak by doctrine; a weak cluster (three weak tells in one paragraph)225 fails; strong tells fail on one sighting.226- `docs/graph/method/prose-posture.md`: the doctrine, the genre profiles,227 the diagnostics A to X, the anti-patterns, the decision rules, the stop228 conditions.229- `docs/graph/skills/holistic-editing.md`: a prose rewrite is an230 integration into the whole document, never a patch of flagged phrases.231232## Source and license233234Adapted from two MIT-licensed skills: the humanizer skill by Siqi Chen235(2025; patterns from Wikipedia's "Signs of AI writing") and the236human-prose doctrine (4.0.0, derived from it). Upstream notices are kept at237`skills/humanizer/LICENSE.upstream`. The adaptation adds the mechanical238fact-preservation check, the plant language facts, the scope and exemptions239of this system, the split between doctrine (`method.prose-posture`) and240procedure (this node), and the wiring into deliver, canonize, and the241writing skills.