{"id":"7d8b1eac-be79-49e9-b8c7-27fb8a672c3f","slug":"clear-copy","kind":"skill","name":"clear-copy","summary":"A prose linter, not a humanizer. Corpus-calibrated, register-aware AI-tell detection with a transparent scoring formula. Ships with Claude Code skills.","owner":"DesiredPathConsulting","repoUrl":"https://github.com/DesiredPathConsulting/clear-copy","license":"Apache-2.0","licenseTier":"permissive","trust":"community","stars":0,"match":null,"fewStars":true,"format":"skill","createdAt":"2026-05-15T16:56:43.000Z","addedAt":"2026-10-21T10:11:59.628Z","logoUrl":"https://avatars.githubusercontent.com/u/270968992?u=4756f7805d7215421238f48278c5660861389c25&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["developer-tools","writing"],"tags":["ai-detection","claude-code","cli","linter","nodejs","prose","writing-tools"],"runtime":"binary","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-23T18:51:14.851Z","sample":false,"url":"https://conduits.dev/tools/clear-copy","language":"JavaScript","transports":["stdio"],"install":{},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# clear-copy\n\nA prose linter, not a humanizer.\n\nEvery commercial alternative in this space (Undetectable, Humbot, StealthGPT, WriteHuman) and every public Claude Code skill (blader/humanizer, Aboudjem, voice-humanizer, conorbronsdon) is a rewriter. You paste in your prose, you get back rewritten prose. The writer learns nothing and pays per word forever.\n\nThis tool scores prose against a calibrated reference register, flags AI-tells and mechanical issues, and leaves the rewrite to the writer. The writer learns the calibration.\n\n## What it checks\n\nFor each draft, the tool computes:\n\n- **Sentence-length burstiness** (standard deviation of sentence length, sometimes called the coefficient of variation in detection literature). The load-bearing engagement metric and the load-bearing detection signal.\n- **Mean sentence length** with register-specific bounds.\n- **Flesch reading ease** with register-specific floors.\n- **Abstract-noun ratio** per 100 words.\n- **Paragraph-length variance.**\n- **Hedge phrases** from a curated blocklist (\"In today's X landscape,\" \"When it comes to,\" \"At the end of the day,\" etc.).\n- **AI vocabulary tells** (delve, tapestry, pivotal, leverage as verb, etc.) plus copula avoidance, vague attributions, knowledge-cutoff disclaimers, persuasive-authority tropes, signposting, and curly quotes.\n- **Mechanical flags:** long sentences (>35 words), prepositional chains, repeated-shape runs, opener variance.\n\nOutput is a transparent stats block with a 0-100 score and a per-rule deduction breakdown. The full scoring formula is in [skills/clear-copy/references/stats-compute.md](skills/clear-copy/references/stats-compute.md). No black box.\n\n## Why register matters\n\nBurstiness-based detection has been criticized (Pangram's own [essay](https://www.pangram.com/blog/why-perplexity-and-burstiness-fail-to-detect-ai), 2024; multiple false-positive studies showing 15-45% FPR on formal registers and non-native English). Bar-journal prose runs long, citation-dense, and low-Flesch by convention; landing-page prose runs short, concrete, and high-Flesch. Scoring both against one threshold produces noise.\n\nThis tool ships two registers out of the box:\n\n- **`legal`** — bar-journal and legal-analysis prose. Tolerates mean sentences up to 22 words, Flesch as low as 30, dense abstract-noun usage.\n- **`marketing`** — landing-page, founder-letter, and consultant prose. Caps mean sentences at 18, expects Flesch above 40, low abstract-noun load.\n\nAdd a third register (operator voice, technical documentation, conversational newsletter, etc.) by following [skills/clear-copy/references/corpus-construction.md](skills/clear-copy/references/corpus-construction.md). Copy a threshold block, retune against samples representative of your target voice, register the entry.\n\n## Install\n\n```bash\ngit clone https://github.com/DesiredPathConsulting/clear-copy.git\ncd clear-copy\n# No dependencies. Node 20+ recommended.\nnode tools/prose-check.mjs --register=marketing path/to/draft.md\n```\n\nTo wire into a project's CI, copy `tools/prose-check/` and `tools/prose-check.mjs` into the target project's `scripts/` directory. The [ci-enforcement.md](skills/clear-copy/references/ci-enforcement.md) runbook covers the rest.\n\nTo use with Claude Code, copy `skills/clear-copy/` and `skills/clear-copy-marketing/` into your `~/.claude/skills/` directory. Both skills auto-trigger on relevant prose-editing tasks.\n\n## Quick example\n\n```bash\n$ node tools/prose-check.mjs --register=marketing example.md\n\n=== WARN [score: 64] example.md ===\nStats for this draft:\n- Score: 64 / 100  (WARN)\n- Sentence-length stdev / burstiness: 4.8  (somewhat uniform)\n- Mean sentence length: 19.2 words  (borderline; target <= 18)\n- Flesch reading ease: 51\n- Abstract-noun ratio: 5.2 / 100 words  (target <= 4)\n\nMechanical flags (-13 pts):\n- 2 long sentences (>35 words)\n- 3 prepositional chains\n- Opener variance: 3 of first 5 sentences are DET+NOUN\n\nVocab and phrasing (-8 pts):\n- 8 vocab/phrase AI tells:\n  - vocab (6): \"pivotal\", \"leverage\", \"robust\", \"seamless\", \"elevate\", \"unlock\"\n  - copula (2): \"serves as a\", \"stands as a\"\n```\n\nThe output tells the writer what to fix. The writer does the fixing.\n\n## CLI modes\n\n| Flag | Use |\n|---|---|\n| Default | Full stats block per file. Right for one or two files. |\n| `--triage` | One line per file, score + top 3 deductions, sorted worst-first. Right for batch reviews of 5+ files. |\n| `--diff` | Per-file offending spans only. Right when fixing issues a triage pass surfaced. |\n| `--html` | Score built HTML in `dist/` instead of markdown source. Right for `.astro` / `.tsx` projects authored with prose in component props. |\n| `--register=legal\\|marketing` | Pick a register. Default `legal`. |\n| `WARN_ONLY=1` env | Cap exit code at 1 during calibration soak. |\n| `INCLUDE_CORPUS=1` env | Append corpus comparison sidebar (requires a corpus; see corpus-construction.md). |\n\n## Prior art and how this differs\n\nEach individual metric has documented prior art. The contribution is the combination: deterministic CLI + AI-tell lexicon + corpus-calibrated thresholds + transparent scoring formula, in one pass.\n\n- **[Wikipedia's \"Signs of AI writing\"](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing)** (May 2026, WikiProject AI Cleanup): catalogs vocabulary tells and stylistic patterns. Does not cover sentence-length variance, perplexity, or burstiness. This tool adds the statistical layer.\n- **[blader/humanizer](https://github.com/blader/humanizer)**, **[Aboudjem/humanizer-skill](https://github.com/Aboudjem/humanizer-skill)**, **[conorbronsdon/avoid-ai-writing](https://github.com/conorbronsdon/avoid-ai-writing)**, **[dannwaneri/voice-humanizer](https://github.com/dannwaneri/voice-humanizer)**: prompt-based Claude Code skills covering the lexical axis. None ship a deterministic CLI with reproducible numbers. The Aboudjem skill emits a 0-100 score with undisclosed formula. This tool publishes the formula.\n- **[proselint](https://github.com/amperser/proselint)** (Suchow and Griffiths, 2016): rule-based style linter using expert-codified rules with fixed thresholds. No corpus calibration, no AI-tell coverage. This tool adds both.\n- **GPTZero, Pangram, Copyleaks, DetectGPT, Binoculars**: detectors targeting the same signals (perplexity, burstiness, n-gram repetition). Closed; flag rather than explain at writer-actionable granularity. This tool exposes the signals in writer-facing output.\n- **Stylometric corpus comparison** ([Burrows's Delta](https://en.wikipedia.org/wiki/Stylometry), 2002, and the genre-aware variants): score a candidate text against a reference distribution. This tool inverts the typical detection use case: a domain corpus as a positive style target for a human writer, not as detector training data. Closest published analog; the inversion is the contribution.\n\n## Methodology, not magic\n\nEverything that produces a number in this tool is in the source. Open `tools/prose-check/decision.mjs` to see the deduction logic. Open `tools/prose-check/thresholds.mjs` to see the register cutoffs. Open `tools/prose-check/aivocab.mjs` to see the AI-vocabulary blocklist and add to it.\n\nThe vocabulary list will drift as AI writing drifts. The mechanical rules are stable. The thresholds need retuning every six months. The corpus needs rebuilding every six to twelve. None of this is automated. That is the methodology.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md). The most valuable contributions are:\n\n1. **New AI-tell entries** for the vocabulary blocklist, backed by recent examples.\n2. **New registers** (with the threshold-calibration evidence from `corpus-construction.md`).\n3. **False-positive reports** with a representative passage and the score it incorrectly produced. The skill is calibrated against a corpus; if your register isn't covered, the right fix is usually a new register, not a rule change.\n\n## License\n\nApache-2.0. See [LICENSE](LICENSE).\n\n## Background\n\nOriginated in the `legal-ai-governance` project and forked here for community use. The methodology section is the why-this-exists; the contributing guide is how to extend it.\n\nIf this saved you time, [GitHub Sponsors](https://github.com/sponsors/DesiredPathConsulting) is appreciated but never expected.\n"}