deslop
Purpose
Strip AI-writing tells (negative parallelism, significance inflation, hedge
stacks, formatting reflexes, era vocabulary, uniform rhythm) from a draft so
it reads human — with the edits bounded by deterministic tooling. It fixes
the two observed failures of prompt-only humanizers: silent damage (facts,
quotes, and code drift during "improvement") and over-correction (real
writers, especially non-native ones, get sanded flat; absolute rules like
"zero em dashes" produce a new tell instead of removing one).
When to use
- "deslop / de-AI this", "strip the AI slop / tells", "this reads
machine-written — clean it up", "make it read human without changing meaning"
- Cleaning AI-assisted drafts before publishing, with proof nothing broke
When NOT to use
- Score or report only, no edit wanted →
slop-lint.
- Checking an edit that already happened →
deslop-verify.
- Grammar/typo fixing, tone shifts, shortening, translation — different jobs;
never smuggle them into a de-slop pass.
- "Beat the AI detector" requests: decline the detector-evasion framing;
offer editorial cleanup instead (this skill improves writing, not evasion).
Workflow
Sibling scripts (installed together with this skill):
LINT="${CLAUDE_SKILL_DIR}/../slop-lint/scripts/slop_lint.py",
VERIFY="${CLAUDE_SKILL_DIR}/../deslop-verify/scripts/verify_edit.py".
If a sibling is missing (partial install), do not edit blind — the no-op
gate, span bounds, and verification all depend on the tools. Say which tool
is missing, deliver playbook-based suggestions (a list of flagged spans and
proposed transforms, not an applied rewrite), and point to the full install.
- Lint first (no-op gate). Save the original to a temp file; run
python3 "$LINT" original.md --genre <genre> --json > lint.json.
If the band is clean (score < 25), return the text untouched and say
why — editing clean text is over-correction, not service. If confidence is
low (under 150 words), the score gates don't apply: make bounded
playbook edits to clearly flagged spans only, note the low confidence, and
still verify in step 5.
- Inventory before editing. Note: protected spans (quotes, code,
numbers, URLs, names), the writer's own habits (their dashes/triads are
their voice), and any consistent dialect/L2 features. Read
references/tells-playbook.md for the per-family transforms and the
dialect guard — it is the edit contract, not advice.
- Bounded edits. Edit only lint-flagged spans plus their sentence;
copy every unflagged sentence verbatim. Apply the playbook transform for
each active family; prefer deleting padding over swapping synonyms; never
invent facts, anecdotes, typos, or slang to "add humanity".
- Re-lint the result. Accept the pass only if the score dropped ≥15
points or the band is now
clean. If not, do one more constrained
pass on remaining flagged spans. Two passes maximum — then stop and
report what remains rather than thrash.
- Verify, fail closed.
python3 "$VERIFY" original.md edited.md --lint-report lint.json.
On any non-zero exit: exit 2 (hard invariant broken) → restore the
lost content or revert to the original; exit 1 (verify could not run) →
treat the rewrite as unverified and do not present it as done. Never
present a rewrite that failed or skipped verification.
- Report. Deliver the edited text plus: before/after scores, families
fixed, verify result (state it as surface integrity, not proven meaning),
and anything deliberately left (dialect features, writer habits,
meaning-bearing hedges, remaining warn-band items).
Output spec
The edited text, changed as little as possible: all hard invariants pass in
deslop-verify, edit ratio ≤ 0.30 (near 0 for clean input), length within
±25%, lint score reduced ≥15 points or banded clean, unflagged prose
byte-equal, and a report of before/after scores + verify status. On clean
input: the original text, unchanged, with the no-op explanation.
Gotchas
- The dialect/ESL guard is non-negotiable. Never convert nonstandard,
regional, or L2 English toward Standard American English; if it could be
dialect or error, leave it. Evidence and the full rule: the playbook's
"Dialect and ESL guard" section (26% vs 92% marker retention; 61.2%
detector false-positive rate on non-native writing).
- Meaning-bearing hedges are content. "May cause drowsiness" and "does
not establish causation" must survive; only stacked hedges are tells.
- Zero em dashes is itself a tell. Reduce flagged clusters; never purge.
- Don't chase score 0. Below warn is done. Looping to a perfect score
Goodharts the linter and flattens voice — two passes, then stop.
- A second deslop of your own output should change < 2%. If it doesn't,
the first pass was over-editing; revert and report.
- Drafts produced late in a long chat session tend to carry more tells than
fresh-session drafts — lint and deslop the final text in a fresh pass
rather than polishing mid-thread.
- Rewriting wholesale because "everything sounds AI" is refused by design;
the edit budget exists to protect the writer.
Pointers
references/tells-playbook.md — per-family transforms, what NOT to flag,
dialect guard, evidence with primary sources.
- Sibling tools:
slop-lint (scoring, thresholds provenance) and
deslop-verify (invariants, over-correction gates).
1---2name: deslop3description: Rewrites copy to strip AI-writing tells - negative parallelism (it's not X, it's Y), stacked hedging, inflated significance - preserving meaning and voice through bounded edits on flagged spans, protected quotes/code/numbers and a deterministic post-check. Use to deslop, de-AI, cut hedging, or make a draft read human. Not for scoring only, judging an edit pair, or grammar fixes.4---56# deslop78## Purpose910Strip AI-writing tells (negative parallelism, significance inflation, hedge11stacks, formatting reflexes, era vocabulary, uniform rhythm) from a draft so12it reads human — with the edits *bounded* by deterministic tooling. It fixes13the two observed failures of prompt-only humanizers: silent damage (facts,14quotes, and code drift during "improvement") and over-correction (real15writers, especially non-native ones, get sanded flat; absolute rules like16"zero em dashes" produce a new tell instead of removing one).1718## When to use1920- "deslop / de-AI this", "strip the AI slop / tells", "this reads21 machine-written — clean it up", "make it read human without changing meaning"22- Cleaning AI-assisted drafts before publishing, with proof nothing broke2324## When NOT to use2526- Score or report only, no edit wanted → `slop-lint`.27- Checking an edit that already happened → `deslop-verify`.28- Grammar/typo fixing, tone shifts, shortening, translation — different jobs;29 never smuggle them into a de-slop pass.30- "Beat the AI detector" requests: decline the detector-evasion framing;31 offer editorial cleanup instead (this skill improves writing, not evasion).3233## Workflow3435Sibling scripts (installed together with this skill):36`LINT="${CLAUDE_SKILL_DIR}/../slop-lint/scripts/slop_lint.py"`,37`VERIFY="${CLAUDE_SKILL_DIR}/../deslop-verify/scripts/verify_edit.py"`.38If a sibling is missing (partial install), do **not** edit blind — the no-op39gate, span bounds, and verification all depend on the tools. Say which tool40is missing, deliver playbook-based *suggestions* (a list of flagged spans and41proposed transforms, not an applied rewrite), and point to the full install.42431. **Lint first (no-op gate).** Save the original to a temp file; run44 `python3 "$LINT" original.md --genre <genre> --json > lint.json`.45 If the band is `clean` (score < 25), **return the text untouched** and say46 why — editing clean text is over-correction, not service. If confidence is47 `low` (under 150 words), the score gates don't apply: make bounded48 playbook edits to clearly flagged spans only, note the low confidence, and49 still verify in step 5.502. **Inventory before editing.** Note: protected spans (quotes, code,51 numbers, URLs, names), the writer's own habits (their dashes/triads are52 their voice), and any consistent dialect/L2 features. Read53 `references/tells-playbook.md` for the per-family transforms and the54 dialect guard — it is the edit contract, not advice.553. **Bounded edits.** Edit **only** lint-flagged spans plus their sentence;56 copy every unflagged sentence verbatim. Apply the playbook transform for57 each active family; prefer deleting padding over swapping synonyms; never58 invent facts, anecdotes, typos, or slang to "add humanity".594. **Re-lint the result.** Accept the pass only if the score dropped ≥1560 points or the band is now `clean`. If not, do **one** more constrained61 pass on remaining flagged spans. Two passes maximum — then stop and62 report what remains rather than thrash.635. **Verify, fail closed.**64 `python3 "$VERIFY" original.md edited.md --lint-report lint.json`.65 On **any non-zero exit**: exit 2 (hard invariant broken) → restore the66 lost content or revert to the original; exit 1 (verify could not run) →67 treat the rewrite as unverified and do not present it as done. Never68 present a rewrite that failed or skipped verification.696. **Report.** Deliver the edited text plus: before/after scores, families70 fixed, verify result (state it as surface integrity, not proven meaning),71 and anything deliberately left (dialect features, writer habits,72 meaning-bearing hedges, remaining warn-band items).7374## Output spec7576The edited text, changed as little as possible: all hard invariants pass in77`deslop-verify`, edit ratio ≤ 0.30 (near 0 for clean input), length within78±25%, lint score reduced ≥15 points or banded `clean`, unflagged prose79byte-equal, and a report of before/after scores + verify status. On clean80input: the original text, unchanged, with the no-op explanation.8182## Gotchas8384- **The dialect/ESL guard is non-negotiable.** Never convert nonstandard,85 regional, or L2 English toward Standard American English; if it could be86 dialect or error, leave it. Evidence and the full rule: the playbook's87 "Dialect and ESL guard" section (26% vs 92% marker retention; 61.2%88 detector false-positive rate on non-native writing).89- **Meaning-bearing hedges are content.** "May cause drowsiness" and "does90 not establish causation" must survive; only stacked hedges are tells.91- **Zero em dashes is itself a tell.** Reduce flagged clusters; never purge.92- **Don't chase score 0.** Below warn is done. Looping to a perfect score93 Goodharts the linter and flattens voice — two passes, then stop.94- **A second deslop of your own output should change < 2%.** If it doesn't,95 the first pass was over-editing; revert and report.96- Drafts produced late in a long chat session tend to carry more tells than97 fresh-session drafts — lint and deslop the final text in a fresh pass98 rather than polishing mid-thread.99- Rewriting wholesale because "everything sounds AI" is refused by design;100 the edit budget exists to protect the writer.101102## Pointers103104- `references/tells-playbook.md` — per-family transforms, what NOT to flag,105 dialect guard, evidence with primary sources.106- Sibling tools: `slop-lint` (scoring, thresholds provenance) and107 `deslop-verify` (invariants, over-correction gates).