# deslop, the whole rulebook You are probably an AI assistant, and your human just handed you this file. Good. Here is all of deslop: a three-pass editing discipline that strips AI tells from writing without flattening it or inventing facts. The README, the rulebook a model executes, the tell catalog, and the teardown that produced it. Read it, then edit their draft with it. deslop is not a detector-bypass tool. It will not iterate text against GPTZero, Turnitin, ZeroGPT, or Originality.ai scores. There is no rewrite-until-the-number-goes-green loop, by design. Fix the writing; ignore the score. Install: git clone https://github.com/kylnor/deslop.git ~/.claude/skills/deslop The deterministic scanner is scripts/deslop_scan.py in that repository. Standard library only, Python 3.10 or newer, no dependencies and no network calls. Home: https://elorati.com/deslop/ - an Elorati project. MIT. --- # README.md # deslop Strip AI tells from writing without flattening it or inventing facts. deslop is a skill, not an app: a rulebook a capable model executes, with one stdlib Python helper for the mechanical layer. Point it at an essay, a draft, or generated copy. It makes the text read like a person wrote it, and it leaves the meaning and the voice alone. ## What it is not **deslop is not a detector-bypass tool.** It will not iterate your text against GPTZero, Turnitin, ZeroGPT, or Originality.ai scores. There is no rewrite-until-the-number-goes-green loop, by design. That arms race produces mangled prose and teaches the writer nothing. Fix the writing; ignore the score. Several tools in this space ship a detector-evasion core. Every one of them was read during the teardown that produced deslop, and every one of those cores was left out on purpose. ## The three passes **Pass 1, deterministic scan.** No taste, no model, no network. `scripts/deslop_scan.py` flags what can be flagged mechanically and cites the corpus study behind each severity tier (Kobak et al. 2025 on 15M PubMed abstracts, Liang et al. 2024 on 950K papers). It reports. It never rewrites. ``` python3 scripts/deslop_scan.py scan # or --json ``` Every finding carries a **bar-tag** for how much license you have to act on it: - `always` fix on a single instance. Paste-from-chat artifacts, sycophantic openers, invisible characters, unfilled placeholders. - `cluster` fix only at density, 2 or more per paragraph. A lone "leverage" in otherwise human prose is not a confession. This is the single most important discipline in the tool. - `context` a signal to reread, never an auto-fix. Connector density, sentence-length uniformity. **Pass 2, judged rewrite.** Where the taste lives. A supplied writing sample outranks every default rule in the skill. The catalog in `references/ai-tells.md` covers vocabulary, syntactic tells, rhetorical formulas, framing and stance tells, and structure. The rewrite side carries its own constraint list: "human" moves the editor may never inject. Trading generic AI phrasing for a recognizable humanizer voice is a new fingerprint, not the absence of one. **Pass 3, fidelity guard.** A humanizer is a persuasion amplifier. Making prose sound human makes whatever it says land harder, including when it is wrong, so the fidelity layer is the counterweight that makes the rest safe. ``` python3 scripts/deslop_scan.py compare ``` It diffs facts between draft and rewrite, numbers, dates, proper names, URLs, citations, and reports what the revision invented or dropped. On top of it sit the judgment checks a tool cannot make: certainty is preserved, load-bearing caveats survive, no new specifics, and no inversion or role-swap. ## Options `--ban-emdash` treats every em and en dash as always-fix. **Off by default.** Out of the box a dash is a cluster signal only. A global dash ban is a house style rule, not a property of AI writing, and imposing one on an author who has always used dashes is the flattening this tool exists to prevent. Turn it on if your publication bans them. `--self-test` proves the scanner scores bad text bad and clean text clean. The restraint checks are the point: over-editing clean prose is a bug, not a win. ``` python3 scripts/deslop_scan.py --self-test ``` ## Install as a Claude skill Clone into your skills directory and the skill is available by name: ``` git clone https://github.com/kylnor/deslop.git ~/.claude/skills/deslop ``` Then ask for it: "deslop this draft", "kill the AI tells in this", "clean this copy". `SKILL.md` is the rulebook the model reads; `references/` loads on demand. Requires Python 3.10 or newer. Standard library only, no dependencies, no network calls. ## Attribution deslop merges work from other open tools. Two are the direct sources for the current catalog and detection layer: - [`conorbronsdon/avoid-ai-writing`](https://github.com/conorbronsdon/avoid-ai-writing) (MIT, Copyright (c) 2026 Conor Bronsdon). The rhetorical and framing tell families in `references/ai-tells.md`, the "never inject these" editor constraints in `SKILL.md`, the AI-referrer URL parameter fingerprints, and the asymmetric normalization thresholds (zero-width characters flag at one, lookalike letters need two). - [`mikiane/claude-watermark-cleaner`](https://github.com/mikiane/claude-watermark-cleaner). Concept adapted, reimplemented. The invisible-codepoint range table and the idea of locking fenced code, inline code, and URLs out of any text sweep. That repository carries no license file, so no code was copied from it: the Unicode ranges are public factual data, rewritten here with our own grouping and commentary. deslop descends from a wider teardown of the open humanizer field. `references/provenance.md` lists the first eight tools from the original teardown; the second round's sources are credited above. Each entry records what the tool actually turned out to be, and what deslop took from it or refused to. ## License MIT. See `LICENSE`. --- # SKILL.md --- name: deslop description: > Strip AI tells from writing without flattening it or inventing facts. A three-pass pipeline - deterministic scan, judged rewrite, fidelity guard - merged best-of-breed from a full-source teardown of the open humanizer field. Use when text needs to read like a person wrote it: de-AI an essay, clean a draft, kill the tells in generated copy. NOT a detector-bypass tool - it does not iterate against GPTZero/Turnitin/Originality scores, by design. license: MIT metadata: version: 1.0.0 --- # deslop Make writing read like a person wrote it. Remove the machine tells, keep the meaning, keep the voice, invent nothing. This is a rulebook a capable model executes, not an app. There is one deterministic helper (`scripts/deslop_scan.py`) for the mechanical layer; everything else is judgment you apply. ## The one rule that governs all the others **A humanizer is a persuasion amplifier.** Making prose sound more human makes whatever it says land harder - including if it is wrong. So the fidelity layer is not optional polish, it is the counterweight that makes the rest safe. Never trade truth for smoothness. Corollary: **do not optimize against a detector.** No "rewrite until the score goes green" loop. That is an arms race that produces mangled text and teaches nothing. Fix the writing; ignore the scores. ## The three passes ### Pass 1 - deterministic scan (mechanical, no taste) Run the scanner. It flags what can be flagged without judgment, and cites the corpus study behind each severity tier. ``` python3 scripts/deslop_scan.py scan # or --json ``` **The dash toggle.** By default an em or en dash is a **cluster** signal, never an auto-fix: one dash is ordinary punctuation and says nothing on its own. If you write for a publication whose house style bans them, pass `--ban-emdash` and every dash becomes an always-fix hit instead. The default is off on purpose, because a global dash ban is a house rule, not a property of AI writing, and applying one to an author who has always used dashes is exactly the kind of flattening this skill exists to avoid. It reports, it never rewrites. Each finding carries a **bar-tag** telling you how much license you have to act on it: - **always** - fix on a single instance. Paste-from-chat artifacts (`citeturn3search1`, `contentReference[oaicite:0]`, `utm_source=chatgpt.com`), sycophantic openers ("Certainly!", "Great question!"), chatbot closers ("I hope this helps!"), unfilled placeholders, and invisible characters (zero-width spaces, bidi marks, Unicode tags). Lookalike letters are the one asymmetric case: a Cyrillic or Greek glyph inside a Latin word only counts at two or more, because one can be a loanword or a name. When you delete an artifact token the scanner flagged, **check what it stood in for** - a citation stub can be hiding a fabricated source. Removing the token without restoring a real reference launders the fabrication. - **cluster** - fix ONLY at density (2+ in a paragraph, or 3+ per 150 words). A lone "leverage" or one "however" in otherwise human prose is not a tell. This is the single most important discipline in the whole skill. Isolated hits are not confessions. - **context** - a signal, never an auto-fix. Structural flags (connector density, uniform sentence length) point you at a paragraph to reread; they don't tell you what to change. ### Pass 2 - judged rewrite (where the taste lives) Now you rewrite, using the scan as a map, not a mandate. **Voice first.** If the user gave a writing sample, read it before touching anything. Note sentence lengths, paragraph openings, punctuation habits, recurring phrases. **The sample outranks every default rule in this skill, including any punctuation policy you have switched on.** Matching the author beats scrubbing the tell. If no sample exists and the piece is voice-sensitive, propose 2-3 named directions with the opening line rewritten in each rather than silently picking a house style. **The tell families** (see `references/ai-tells.md` for the full catalog). Fix by bar-tag, not by list membership: - Vocabulary: delve, leverage, utilize, underscore, showcase, tapestry, realm, meticulous. - Syntactic: anticipatory "it" ("It is important to note...") -> state it. Existential "there" ("There are several factors...") -> name them. Copula avoidance ("serves as" for "is"). - Rhetorical formulas: rule-of-three triplets, "Not X. But Y." binary contrast, "The answer isn't X, it's Y.", motivational-poster endings, "X is the language of Y" aphorisms. - Structure: mini-essay intro+body+conclusion on a two-line answer, "In conclusion" summary paragraphs, uniform paragraph length. **Do not swap templates.** "Moreover" -> "Here's the thing" is not a fix; it trades one tell for a newer one. State the point plainly. After any edit, reread YOUR rewrite for tells the edit itself introduced (fake-casual voice, fresh triplets, a snappy closer). This is the anti-swap check - skipping it is how humanizers make text worse. **Never inject these.** Removal is half the job, and putting voice back has a predictable failure mode: the editor reaches for a stock kit of "human" moves and installs a personality the author never had. That trades one detectable register for a louder one. None of the following may be **added** to text that did not already contain it. Each is a rewrite failure even when the result scans clean. - **Fake first person.** "I've seen this a hundred times", "in my experience", "I'll admit" dropped into prose with no author presence. If the source has no `I`, the rewrite has no `I`. - **Manufactured stakes.** "In a world where", "now more than ever", "the stakes have never been higher." - **Forced contrarianism.** "Everyone says X, but they're wrong." Legitimate only when the source actually argued it. Inventing a foil is inventing a claim. - **Performed candor.** "Let's be honest", "real talk", "here's the thing." Adding one fails two rules at once (see narrated candor and the reveal-teaser hooks). - **Dash theatrics.** Dashes staged for drama the content has not earned. Whatever the removal policy is, *adding* a dash during a rewrite should never happen. - **Staccato conversion.** Chopping ordinary sentences into fragments to fake rhythm. Vary sentence length by varying the sentences, not by breaking them. - **Invented specifics.** A number, name, date, tool, or mechanism the source never had. Specificity is the most tempting fix because it always reads better, and a fabricated specific is worse than the vague phrasing it replaced. Flag the gap. Never fill it. **The provenance test.** For each edit, ask whether the information in the rewrite came from the source. Subtraction and sharpening are in scope: cut filler, make an existing claim concrete, surface a buried point. Addition of stance, personality, or fact is not. You may subtract and sharpen. You may not add. These are constraints on the editor, not detections on the text, which is why they live here and not in the pattern catalog. A first-person aside is not a flag when the author wrote it. It is a failure when the tool inserted it. The difference is provenance, and no pattern can see provenance. **Restraint is scored.** After the pass, ask: did I edit only actual tells and leave clean prose alone? Heavily rewriting a clean passage is a bug, not a win. If you touched sentences that had no tell, put them back. The scanner's `--self-test` enforces exactly this on clean fixtures; hold yourself to the same bar. **The "clean nothing" test.** Removing every tell can leave prose that is smooth and says nothing. Before shipping, run three checks on the result: - *Swap test*: would this sentence survive unchanged in a competitor's / stranger's writing? If yes, it is generic. - *Negation test*: would anyone seriously claim the opposite? If no, it is filler. - *So-what ladder*: compress each claim to its consequence. If nothing's left, cut it. ### Pass 3 - fidelity guard (invent nothing, drop nothing) Before you hand back the rewrite, prove it didn't fabricate. ``` python3 scripts/deslop_scan.py compare # or --json ``` This deterministically diffs facts between draft and rewrite - numbers, dates, proper names, URLs, citations - and reports what the revision **invented** (possible fabrication) or **dropped** (verify it was intentional). It judges facts, not style. Then apply the judgment checks the tool can't: - **No new specifics.** The rewrite states no fact, name, number, date, quote, or citation that isn't in the source. Swapping a vague claim for a specific one is allowed ONLY when the specific comes from the source or the user. If a sentence needs a real detail to work, ask for it or write the plain version - never invent a plausible-sounding one. (Opinions and reactions are voice, not facts; fiction is exempt.) - **Certainty is preserved.** "may cause" must not become "causes"; "often" must not become "always". Silent hedge-stripping upgrades a claim you have no evidence for. - **Load-bearing caveats survive.** Medical, legal, financial, or safety qualifiers are never style-cut, however clunky they read. - **Meaning, not just words, is preserved.** Watch the two failures a word-diff misses: inversion ("runs faster" -> "runs slower") and role-swap ("the company sued the regulator" -> "the regulator sued the company"). Same-ish words, opposite meaning. When a needed fact is missing, leave a visible placeholder - `[ADD VERIFIED METRIC]` - never a guess. ## What NOT to flag (restraint, made explicit) Most tools in this space have no brake and end up flattening real human quirks - technical writers, ESL writers, distinctive voices. Do not flag: - Perfect grammar alone. Formal vocabulary alone. "Bland" prose with no specific tell. - A single em dash, a lone "however", one short emphatic sentence, curly quotes (editors auto-curl them). - Look for **clusters, not isolated tells.** One em dash means nothing. Em dashes plus a rule-of-three plus "vibrant tapestry" plus a "Conclusion" section is a confession. Signs of human writing to protect, not sand off: hard-to-fabricate specific detail, unresolved mixed feelings, self-corrections mid-thought, dated/era-bound references, genuine sentence-length variance. Text edited before Nov 30 2022 is, barring rare exceptions, not AI-written - don't "fix" it into sounding generated. ## Output shape - **Pasted text**: show the rewrite. If asked, show the scan findings and the fidelity diff. - **Editing a file**: edit in place, report a one-line summary of what changed and any `compare` drift. - **Embedded in a larger job** (a commit message, a PR body): return only the clean prose, no scan scaffolding. ## Scope Built for essays, articles, drafts, generated copy - anywhere prose should read as human. Out of scope: code, legal terms verbatim, quoted material, casual chat. And explicitly not a detector-evasion tool: it will not iterate text against GPTZero, Turnitin, ZeroGPT, or Originality.ai scores. Fix the writing, not the number. ## Provenance Merged from a full-source teardown of the open humanizer field (2026-08-16), run in two rounds: eight tools first, four more after. The deterministic tiers and word-boundary logic come from `HugoLopes45/llmstrip` (corpus-grounded severity, Kobak/Liang studies); the artifact catalog, restraint dimension, anti-swap check, and `compare` fidelity mode from `eddyplolz/humanizer-pro`; the bar-tag taxonomy, integrity layer, and "clean nothing" tests from `forint573/human-copywrite`; the fact-lock and meaning-preservation concepts from `ssamba1/untell` (detector-evasion half deliberately excluded); the no-fabrication self-audit and "what NOT to flag" restraint from `blader/humanizer`. From the second round: the rhetorical and framing tell families, the "never inject these" editor constraints, the AI-referrer URL fingerprints, and the asymmetric normalization thresholds come from `conorbronsdon/avoid-ai-writing` (MIT). The invisible-codepoint range table and the protected-region lock over code and URLs are adapted concepts from `mikiane/claude-watermark-cleaner`, reimplemented rather than copied because that repository carries no license file. See `references/provenance.md`. --- # references/ai-tells.md # AI-tell catalog Loaded on demand by the Pass 2 rewrite. Fix by **bar-tag**, never by list membership. `always` = one instance is enough. `cluster` = only at 2+/paragraph or 3+/150 words. `context` = a signal to reread, never an auto-fix. The deterministic subset of this catalog is enforced by `scripts/deslop_scan.py`; this file is the fuller, judgment-requiring version for the LLM pass. ## Vocabulary (mostly cluster) Corpus-ranked by excess frequency vs a pre-ChatGPT baseline (Kobak et al. 2025 on 15M PubMed abstracts; Liang et al. 2024 on 950K papers). Higher tier = stronger signal. - **critical**: delve / delving / delves / delved -> dig, explore, look into - **high**: leverage -> use, utilize -> use, underscore -> show, showcase -> show, meticulous -> careful, intricate -> complex, realm -> area, pivotal -> key, tapestry -> mix, testament ("a testament to" -> state what it shows), facilitate -> help, endeavor -> try, commence -> start, streamline -> simplify - **medium**: comprehensive -> thorough, crucial -> important, robust -> solid, seamless -> smooth, multifaceted, vibrant, groundbreaking / cutting-edge / revolutionary -> new / modern, insights (usually empty - name the finding), "navigate the complexities of", "evolving landscape" - **low**: moreover / furthermore / additionally -> also, subsequently -> then, "in order to" -> to, "due to the fact that" -> because, "could potentially" -> could ## Syntactic tells (cluster) - Anticipatory "it": "It is important to note that..." / "It is worth mentioning..." -> just state it. - Existential "there": "There are several factors that..." -> name the factors. - Copula avoidance: "serves as", "acts as", "functions as", "stands as" where "is" works. - Passive where active is shorter and clearer (not a blanket ban - passive is sometimes right). - Nominalization pileups: "the implementation of the optimization of..." -> verbs. ## Rhetorical formulas (always once you see the pattern) - Rule of three: forced triplets ("fast, reliable, and scalable"). Cut to two, or one. - Binary contrast: "Not X. But Y." / "The answer isn't X, it's Y." / "It's not about X. It's about Y." -> state Y. - Negative parallelism: "It's not just A, it's B." - Manufactured punchline: a one-word or staccato sentence deployed for fake drama. "And that changes everything." "Every time." - Aphorism formula: "X is the language of Y", "X is just Y with extra steps." - Conversational opener as throat-clearing, and its mid-flow twin, the infomercial reveal-teaser: "Honestly? It depends." "Here's the thing." "Let's be real." "The catch?" "The kicker?" "The best part?" "Plot twist:" Both stage a pause before ordinary information. Delete the hook and state the thing. The tell is the theatrical setup-and-reveal, not the word: "honestly" or "look" mid-sentence is ordinary English. - Rhetorical question opener: "But what does this mean for developers?" "So why should you care?" "What's next?" A question dropped as a section transition stalls before the point. If you know the answer, say it. - False concession: "While X is impressive, Y remains a challenge." Sounds balanced, weighs nothing, both halves vague. Name the actual thing or pick a side and argue it. - Invented contrast-pair mirroring: one half of the pair is a real term of art, the other is a phantom counterpart generated for symmetry. "False precision rather than genuine accuracy" ("false precision" is statistics; "genuine accuracy" is not a thing). If no real opposite exists, drop the contrast and state the positive claim. - Parenthetical hedging: "(and, increasingly, Z)", "(or, more precisely, Y)". Nuance theater. If the aside matters, give it a sentence. If it does not, cut it. - Motivational-poster ending: a closing line that zooms out to an inspirational abstraction. ## Structure (context - reread, don't auto-cut) - Mini-essay shape on a short answer: intro + three body beats + conclusion where two sentences would do. - "In conclusion" / "In summary" / "Ultimately" summary paragraphs that restate. - Section headings in Title Case; "Challenges and Future Prospects"-style boilerplate headers. - Uniform paragraph and sentence length (low burstiness). Human writing varies; LLM output clusters in the 10-30 token range. - Inline-header vertical lists where prose would read better. - Numbered list inflation: "Three key takeaways", "Five things to know", "the top seven". Numbered lists are structurally safe, so the model defaults to them. Only number a list when the content genuinely has that many discrete parallel items. Padding to hit the number means the list should not exist. ## Framing and stance tells (cluster) These do not misstate a fact. They perform a posture the writing has not earned, which is why a word list misses them and a reader does not. - **Novelty inflation**: treating an established concept as if the subject invented it. "He introduced a term", "she coined the phrase", "the failure mode nobody's naming", "what nobody tells you about". Factually risky (the concept usually has a Wikipedia page) and it reads promotional rather than analytical. Describe what the person did *with* the idea. Same family: invented labels, pseudo-analytical compounds coined mid-sentence and never defined ("the supervision paradox", "a coordination tax"). Naming is not explaining. - **Social endorsement closers**: the curatorial sign-off on a share post, usually a colon teeing up a link. "This one is worth your time:", "a must-read", "do yourself a favor and read this", "bookmark this", "thank me later". It performs a recommendation without giving a reason to click, which is exactly why it fits under any link. Say what the thing is and who it is for, then drop the call to action. - **Emotional flatline**: claiming an emotion instead of conveying it. "What surprised me most", "I was fascinated to discover", "what struck me was", and the header variant "Interesting part of the project:". If the thing is surprising the reader should feel it from the content. Also lazy human writing, so flag it either way. - **Lingering-attention claims**: "the line I keep coming back to", "I can't stop thinking about this", "still thinking about this one". A claim about the writer's attention, not the thing, arriving before the reader has a reason to care, and unfalsifiable. Carve-out: keep it when the sentence says *why* it recurred ("because it predicts which engineers quit"). The tell is the bare frame with the reason missing. - **Self-labeling significance**: after a list, pointing back and labeling one item contrarian, clever, counterintuitive, or key. "That last move is the contrarian one." The label does the work the content was supposed to do. Cut the label; if the item matters, position it first or expand it with specifics. - **Narrated candor**: announcing the disclosure instead of disclosing. "I want to be upfront:", "to be fully transparent:", "rather than bury this, I'll say it plainly:". Apply the deletion test: cut the frame, and if the sentence loses no information it was never content. Carve-outs that stay: the substantive admission itself ("I have not tested this on Windows"), and conventional conflict-of-interest disclosure ("I own shares in the company discussed here"). Judgment only, deliberately: every regex tight enough to spare the carve-outs stops matching the tell. - **Confidence calibration**: "It's worth noting that", "Interestingly", "Notably", "Importantly", "Undoubtedly", plus the authority variants "the real question is", "at its core", "fundamentally", "make no mistake", "the truth is". They tell the reader how to feel about a fact, or assert depth, instead of letting the fact carry it. One "notably" in 2,000 words is fine. Three in 500 is emphasis stacking. Flag by density. - **Acknowledgment loops**: restating the prompt before answering ("You're asking about", "To answer your question"), or opening a section by summarizing the previous one. The reader knows what they asked. - **Speculative gap-filling**: guesses formatted as background. "Maintains a relatively low public profile", "is believed to have", "likely began his career in". Worse than a cutoff disclaimer, which at least admits the gap; this hides it behind plausible filler so the reader cannot tell what is known from what is invented. Cut it or source it. ## Communication artifacts (always) - Sycophantic openers: "Certainly!", "Great question!", "Absolutely!", "I'd be happy to". The reader-validating variants belong here too: "Excellent point!", "You're absolutely right!", "That's a really insightful observation." Sycophancy validates the reader; the plain artifacts perform helpfulness. Both are chat-interface rewards, not writing. - Chatbot closers: "I hope this helps!", "Let me know if you need anything", "Feel free to". - Assistant self-reference: "As an AI language model...", training-cutoff disclaimers. - Reasoning chain artifacts: "Let me think step by step", "breaking this down", "to approach this systematically", "here's my thought process", "first, let's consider". Chain-of-thought scaffolding leaking into published prose. The reader does not need the scaffolding. State the conclusion, then the evidence. Also watch numbered steps that read as internal monologue rather than an argument aimed at anyone. - Paste-from-chat citation stubs: `citeturn3search1`, `contentReference[oaicite:0]{index=0}`, `oai_citation`, `[web:1]`, ``, lenticular `【85†L261-269】`. - AI-referrer URL parameters: `utm_source=chatgpt.com`, `utm_source=claude.ai`, `utm_source=perplexity.ai`, `referrer=grok.com`. The parameter is the signature. Strip it and keep the link; a functional parameter like `?page=2` is not evidence of anything. - Unfilled placeholders left in: `[Your Name]`, `[INSERT SOURCE URL]`, `[Describe the specific section]`, `2025-XX-XX`, and comment slots like ``. - Decorative emoji, boldface overuse, curly-quote inconsistency. - Invisible characters: zero-width spaces, soft hyphens, bidi marks, Unicode tag codepoints. Humans do not type these into their own prose, so a single one in a paragraph is near-dispositive. Lookalike letters (Cyrillic or Greek glyphs inside a Latin word) need two or more, because one can be a legitimate loanword or a false positive. The scanner enforces both thresholds. ## Integrity tells (always - these are the dangerous ones) Not style - truth. The whole reason the fidelity pass exists. - Certainty escalation: "may reduce" -> "reduces" -> "eliminates". A rewrite that upgrades confidence beyond the evidence. - Invented specifics: a vague claim silently made precise with a number/name/date not in the source. - Dropped caveats: a medical/legal/financial qualifier cut for smoothness. - Manufactured social proof: testimonials, reviews, scarcity ("only 3 left"), urgency that weren't in the source. - Inversion / role-swap: meaning flipped while words stay similar ("faster"->"slower", "A sued B"->"B sued A"). --- # references/provenance.md # deslop provenance - what came from where Built 2026-08-16 from a complete-source teardown of eight open-source humanizer tools. Every repo was cloned and read in full (not the README - the actual files), per the "download the entire repo" rule. Findings below are what survived that read. ## The eight, ranked | Tool | Verdict | What it actually is | |------|---------|---------------------| | `ssamba1/untell` | Rigorous | Claude skill + Python lib. Sentinel fact-lock, NLI/role-swap/hedge meaning gates. Detector-evasion half excluded. | | `forint573/human-copywrite` (repo: miAI-Humanizer-Skill-Awesome) | Rigorous | Agent skill + stdlib scanner + self-test harness (68/68 CI). Bar-tag taxonomy, integrity module, "clean nothing" tests. | | `eddyplolz/humanizer-pro` | Rigorous | Agent skill + stdlib CLI (verified: builds, runs, matches README). Artifact sweep, restraint dimension + regression test, `--compare` fidelity. MIT rebuild of blader. | | `blader/humanizer` | Solid | Single SKILL.md, Wikipedia "Signs of AI writing"-grounded. No-fabrication audit, "what NOT to flag", voice-outranks-style. The origin the three above descend from. | | `DadaNanjesha/AI-Text-Humanizer-App` | Thin, honest | Streamlit + spaCy/WordNet. One real idea: embedding-gated synonym selection. Author already abandoning it. | | `Firdavs-coder/ai_humanizer` | Slop + 1 | Streamlit + Ollama. Real Ollama wiring but a params bug likely makes its one knob inert; "typos" perturbation injects machine-glitch noise. Salvage: two-stage shape, burstiness-as-signal. | | `mabdullahab614-alt/phantom-writer` | Theater | Static HTML demo. "AI probability" = 3 hardcoded buckets gated on the word *furthermore*; "burstiness index" = `Math.random()`; 1.5MB detector model never loaded. Nothing salvaged. | | `HugoLopes45/llmstrip` | Rigorous (deterministic) | Rust CLI, 122/122 tests. Corpus-grounded severity tiers with citations. Note: pitched as "regex + AST" - it is neither (substring matching, no parser). | ## The second round, four more Read 2026-08-16, after the eight above. No repo appears in both sets, so twelve in total. | Tool | Verdict | What it actually is | |------|---------|---------------------| | `conorbronsdon/avoid-ai-writing` (MIT, Conor Bronsdon) | Merged | The deepest tell catalog in the field, and the carve-outs are the strength: it names when a pattern is legitimate, and reverted its own narrated-candor detector because no regex tight enough to spare the carve-outs still matched the tell. Source of the rhetorical and framing families, the "never inject these" editor constraints, the AI-referrer URL fingerprints, and the asymmetric normalization thresholds. | | `mikiane/claude-watermark-cleaner` (NO license file, French comments) | Adapted concept | Two ideas worth having: a well-chosen invisible-codepoint range table, and locking fenced code, inline code, and URLs out of a text sweep before anything runs. Both reimplemented from scratch, since the absence of a license means nothing may be copied. Its rephrasing half (Ollama / Codex driven) is out of scope. | | `avectats7/anti-ai-writing` (MIT, Tato Polanco) | Skipped | Subsumed. Nothing it covers is absent from the merged catalog. | | `wiltodelta/remove-ai-watermarks` (Apache 2.0) | Skipped | Serious engineering, wrong product: per-vendor image and video watermark engines plus C2PA, EXIF, XMP, and IPTC metadata handling. Out of scope by decision; deslop is text only. | ## What deslop lifted, by pass **Pass 1 (deterministic scan)** - `llmstrip` + `humanizer-pro` - Corpus-grounded severity tiers (critical/high/medium/low) from published excess-frequency data, not a flat banned-word list. Sources: Kobak et al. 2025 (Science Advances, 15M PubMed abstracts), Liang et al. 2024 (950K papers), Rosenfeld 2024 (discourse structure), Juzek & Ward 2025 (RLHF sycophancy). - Word-boundary + backtick-span + fenced-code + URL exclusion logic (kills false positives on substrings like `pivotale`, `commencement`, and words inside code). - Paste-from-chat artifact catalog: `citeturn`, `contentReference[oaicite]`, Perplexity `[web:N]`, Grok cards, lenticular brackets, `utm_source=chatgpt.com`. - Structural checks: discourse-connector density, sentence-length uniformity (burstiness). **Pass 2 (judged rewrite)** - `human-copywrite` + `blader` + `humanizer-pro` - Bar-tag taxonomy (always/cluster/context) - the fix for treating a lone tell like a cluster. - Voice-sample-outranks-house-style precedence. - Anti-swap check (don't trade "Moreover" for "Here's the thing"). - Restraint as a scored, tested dimension (over-editing clean prose is a bug). - "What NOT to flag" false-positive guardrails + "signs of human writing to protect". - "Clean nothing" swap/negation/so-what tests. **Pass 3 (fidelity guard)** - `untell` + `humanizer-pro` + `human-copywrite` - `--compare` fact-drift mode: deterministic diff of numbers/dates/names/URLs/citations between draft and rewrite (concept from untell's sentinel-lock + humanizer-pro's --compare). - No-new-specifics rule + self-audit question (blader). - Certainty preservation / hedge-retention (untell's hedge gate). - Load-bearing caveat protection (human-copywrite integrity module). - Inversion + role-swap awareness (untell's NLI + spaCy role-swap gates, applied as LLM judgment rather than a local model). - Visible `[ADD VERIFIED METRIC]` placeholders instead of invented facts. ## Deliberately excluded The detector-evasion core, in every tool that had one: untell's detector ensemble and `attacks/` directory, its commercial-API wrappers, the score->rewrite->rescore loops, and the fake "detection risk" scorers in ai_humanizer and phantom-writer. deslop fixes writing; it does not play games with detector thresholds. Also dropped: ai_humanizer's typo/word- doubling perturbations (read as machine-glitched, not human) and AI-Text-Humanizer-App's random transition-word injection (a tell, not a fix).