| name | deslop |
| description | Remove signs of AI-generated writing from text. Use when editing or reviewing
text to make it sound more natural and human-written. Based on Wikipedia's
comprehensive "Signs of AI writing" guide. Detects and fixes patterns including:
inflated symbolism, promotional language, superficial -ing analyses, vague
attributions, em dash overuse, rule of three, AI vocabulary words, passive
voice, negative parallelisms, filler phrases, self-referential meta-commentary,
and references to context the reader never received.
|
| license | MIT |
| metadata | {"version":"1.2.0"} |
Deslop: remove AI writing tells
Context: you are a writing editor that identifies and removes signs of
AI-generated text. The pattern catalog comes from Wikipedia's "Signs of AI
writing" page, maintained by WikiProject AI Cleanup. Detail lives in the folders
below and loads only when you take that path.
Workflow
Follow protocols/humanize.md for the full procedure. The spine:
- Determine the mode: pasted text, file, or embedded
(
references/invocation-modes.md). Ask before rewriting a file the user may
have only meant to show you.
- Calibrate the voice (
references/voice.md). A user-supplied writing
sample outranks every style rule in this skill, including the dash rule. Decide
whether personality applies: yes for essays and opinion, no for encyclopedic,
technical, legal, or reference text.
- Run the report. It tells you which patterns fired and loads the guidance
for exactly those, so this is the only reading step you need.
python3 scripts/check_prose.py <source>
python3 scripts/check_prose.py <source> --json > audit.json
Every pattern comes back PASS, WARN, FAIL, or SKIP, followed by the guard, fix,
and trap for each one that fired. SKIP means no mechanical signal exists, so
read the source yourself for patterns 11, 22, 24, 25, 30, and 38 regardless of
what the report says. Add --ste only for technical documentation
(references/ste.md); it overrules part of this rubric and is wrong for prose
with a voice.
- Adjudicate every candidate against
references/false-positives.md before
editing. A candidate is located, not decided. Polish is not AI, an isolated
tell is not a cluster, and watched phrases inside quotations, titles, or proper
names are secondhand text. Replace every FILL_ME in the label with a verdict
from references/audit-rubric.md. NEVER apply a candidate as an automatic fix.
- Show the findings and wait for approval. Pattern, span, verdict, and a
one-line reason per row. The user may strike any row, which logs it as
keep
with their reason instead of yours. Skip this stop in embedded mode only.
- Draft the rewrite. Preserve every claim in the source; depth may vary,
information may not be lost.
- Audit. Ask what still reads as AI generated, whether the draft states any
fact, name, number, date, or citation absent from the source, and whether a
reader holding only the draft can identify every reference in it. NEVER invent
a specific to fill a gap a cut created: ask the user, or write the plain
version without it (
references/no-fabrication.md).
- Finalize. The rewrite MUST contain no em or en dashes unless step 2
sanctioned them.
- Run the gates before delivering. A non-zero exit is a stop:
python3 scripts/check_output.py <final.md> # add --allow-dashes per step 2
python3 scripts/check_audit.py audit.json # fails while any FILL_ME remains
- Show the measured pass, then a line per change saying what and why. Skip
in embedded mode. A positive delta means the rewrite introduced a tell.
python3 scripts/compare_prose.py <source> <final.md>
- Deliver per the mode from step 1, and nothing more than the mode calls for.
Map
references/patterns/ the catalog of numbered tells with before/after
examples: content.md (1-6), language.md (7-13), style.md (14-19, 26),
communication.md (20-22), filler.md (23-25), rhetoric.md (27-39).
references/false-positives.md what not to flag, and the signs of human
writing worth protecting. Read before editing.
references/no-fabrication.md the rule that the rewrite may add no fact the
source lacks.
references/voice.md calibrating to a writing sample, and when personality
belongs.
references/invocation-modes.md what to deliver for each way the skill is
called.
references/audit-rubric.md the verdict rubric and the audit label schema.
references/ste.md the opt-in ASD-STE100 profile: what it checks, which
patterns it overrules, and why it is off by default.
references/prose-metrics.md what the metrics mean, and why several famous
ones are deliberately absent. Read before trusting a number.
references/maintenance.md rules for editing this skill, and its provenance.
protocols/fixes/NN-*.md guard, fix, and trap for one pattern each. The report
loads the ones you need; scripts/brief.py fetches them on demand.
protocols/humanize.md the main loop. protocols/self-refine.md improving
this skill after a session.
scripts/ CLI checks. Run them, do not reimplement: check_prose.py for the
per-pattern rubric and metrics, compare_prose.py for the before and after of
one editing pass, check_output.py for the mechanical gate, check_ste.py for
the opt-in ASD-STE100 profile, check_audit.py for label shape, brief.py to
load guidance for given patterns, catalog.py to inspect the parsed watch
lists, check_skill.py for this skill's own structure, package.py to build
and verify the .skill artifact.
No phrase list lives in code. check_prose.py reads the "Words to watch" lines
out of the catalog at runtime, so editing the prose changes detection. What the
scripts locate is never what they decide.
Refine
At the end of a session that used this skill, run protocols/self-refine.md and
record the change in refinement-log.md.
Source and attribution
The pattern catalog is adapted from
blader/humanizer v2.9.1 (MIT), which in
turn draws on
Wikipedia: Signs of AI writing,
maintained by WikiProject AI Cleanup. The pattern text is substantially theirs;
the structure, protocols, and scripts here are not. See references/maintenance.md
before publishing this anywhere.
Key insight from Wikipedia: "LLMs use statistical algorithms to guess what should
come next. The result tends toward the most statistically likely result that
applies to the widest variety of cases."