A prose linter, not a humanizer. Corpus-calibrated, register-aware AI-tell detection with a transparent scoring formula. Ships with Claude Code skills.
SaferSkills independently audited clear-copy (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A prose linter, not a humanizer. The skill scores prose against a calibrated reference register, flags AI-tells and mechanical issues, and leaves the rewrite to the writer. Every commercial alternative (Undetectable, Humbot, StealthGPT, WriteHuman) and every public Claude Code skill in this space (blader/humanizer, Aboudjem, voice-humanizer, conorbronsdon) is a rewriter. This one isn't. The writer learns the calibration.
Sentence-length variance is the load-bearing engagement metric. Some detection literature calls this signal "burstiness" (e.g., GPTZero's whitepaper, where it is operationalized as the coefficient of variation of sentence length). The tool computes standard deviation of sentence length, which serves the same role: low values flag uniform, machine-like rhythm. The engagement target and the detection-evasion target are the same number, which is what makes the metric useful.
Burstiness-based detection has been criticized (Pangram's own essay, 2024; multiple false-positive studies) for elevated false-positive rates on formal registers and non-native English: 15-45% FPR depending on the study. Bar-journal prose runs long, citation-dense, and low-Flesch by convention; scoring it against marketing-register thresholds produces nonsense. The two-register design in this skill (this clear-copy register tolerates long sentences and dense citations; clear-copy-marketing does not) is the response to that problem. Calibrating against a target corpus is the correction.
Legal content is subject to heightened E-E-A-T scrutiny because it can affect financial and professional outcomes for law firms. Before marking a draft complete, confirm:
Statistical variance can come out clean while the prose is still riddled with vocabulary that's instantly AI-coded. Sourced from Wikipedia's "Signs of AI writing" and observed AI output.
AI-era vocabulary (single words): delve, testament, enduring, intricate, intricacies, tapestry, pivotal, vibrant, underscores/underscoring, showcase (as verb), garner, foster (as verb), groundbreaking, nestled, breathtaking. Project-specific additions: leverage (as verb), robust (as marketing adj), seamless/seamlessly, best-in-class, cutting-edge, unlock (marketing verb), empower (marketing verb), future-proof, "navigate the complexities of", "in an ever-changing regulatory landscape".
Copula avoidance. Replace "serves as a / stands as a / functions as a / marks a [pivotal] moment / represents a shift" with plain "is" or "has". "The opinion is the leading authority" beats "The opinion serves as the leading authority."
Vague attributions. "Experts believe", "industry observers note", "critics argue", "some sources suggest" are AI tells AND violate the project rule that all claims trace to a primary source. Either name the source or cut the claim.
Knowledge-cutoff disclaimers. "As of my last training", "while specific details are limited", "based on available information", "readily available sources". These are chatbot artifacts that should never ship.
Generic positive conclusions. "The future looks bright", "exciting times lie ahead", "a major step in the right direction", "journey toward excellence". Replace with a specific concrete next thing or cut.
Persuasive authority tropes. "At its core,", "the real question is", "what really matters", "the deeper issue", "the heart of the matter". The sentence that follows usually just restates an ordinary point with extra ceremony.
Signposting. "Let's dive in", "let's explore", "let's break this down", "here's what you need to know", "without further ado". Cut the announcement and start the actual sentence.
Negative parallelisms. "It's not just X, it's Y." "Not only X but Y." Tail-negation fragments ("no guessing", "no wasted motion") tacked onto the end of a sentence. Convert to direct positive statements.
-ing tacking. Present-participle phrases tacked onto the end of a sentence to fake depth: "..., highlighting/underscoring/reflecting/contributing to/symbolizing/emphasizing X." Either cut the tail or split it into its own sentence with a real subject.
False ranges. "From X to Y" where X and Y aren't on a meaningful scale. "From the singularity of the Big Bang to the dance of dark matter" is decorative, not informative.
Triple rhetorical question hook. Opening with two or three short questions back-to-back to manufacture intrigue ("What if X? What if Y? What if Z?"). Replace with a direct opening claim or a specific story.
Three-part negation. "It's not about X. It's about Y. It's about Z." or "It's not just X. It's not just Y. It's also Z." Replace with a single direct sentence stating the actual point.
Stat bomb opener. Three or more standalone statistical fragments in sequence ("80% of firms. $400 average premium. 12 weeks to renewal."). Weave the numbers into real sentences with subjects and context.
Punchy orphan closer. Ending a paragraph or section with a standalone short fragment as a mic-drop ("Game changer." / "And it works." / "Every time."). Either fold it into the prior sentence or replace it with a real concluding thought.
Curly quotes. Use straight " and '. Smart quotes (", ", ', ') are a ChatGPT default that should never ship.
After drafting, run the stats compute. Tool location: tools/prose-check.mjs (at the root of this repo). Always pass --register=legal for this skill (the default, but specify it for clarity).
The reference algorithm is in references/stats-compute.md. The reference distribution is in references/comparison-samples.md.
Stats for this draft:
- Score: 84 / 100 (PASS)
- Sentence-length stdev / burstiness: 7.2 (within target)
- Mean sentence length: 18 words (within target)
- Flesch reading ease: 52
- Abstract-noun ratio: 4.0 / 100 words (within target)
- Paragraph-length stdev: 1.1 sentences
Mechanical flags (-0 pts): None.
Hedges (-0 pts): None.
Vocab and phrasing (-3 pts):
- 3 vocab/phrase AI tells:
- vocab (2): line 4: "pivotal", line 11: "underscores"
- copula (1): line 7: "serves as a"After the stats-block revision settles, run one more pass before declaring the draft done. Ask, in your own context: "What about this still reads as AI-generated?" Answer with 2-3 specific tells (rhythm too tidy, closer too slogan-y, unnamed source still vague, etc.). Then revise to address them. This catches voice-level patterns that no regex will.
This pass is from blader/humanizer. It's lightweight and high-yield: half the time it surfaces a tell the metrics missed.
The stats block is a soft check during writing. The hard gate is a project-level CI script (see references/ci-enforcement.md) that runs the same algorithm in GitHub Actions on every PR. Any project that adopts this skill should also wire the CI script if it has content that's at risk of AI flags.
When reviewing more than ~5 prose files in one session, do not edit them serially in the main context. The cost is that the main context fills up with file content, slowing every subsequent step.
Instead:
node scripts/prose-check.mjs --triage <files> to get one line per file, sorted worst-first, with the top 3 deductions for each. This is the per-file budget allocator: no need to read pages that scored 80+.--diff prints the offending spans (long sentences, prep chains, vocab hits) without the full stats block. Faster signal than reading the page.For .astro / .tsx / framework-component pages, score the built HTML in `dist/`, not the source files. Source-side regex extraction is heuristic and misses prose passed via component props or slots. Run npm run build first, then node scripts/prose-check.mjs --html --triage dist/<paths>. The CLI honors data-prose-check-ignore on any element and has a default skip list for legal/utility pages (privacy, terms, disclaimer, accessibility, 404, search).
The skill itself stays one skill. This pattern is the workflow that makes batch reviews cheap.
Each metric this skill computes has documented prior art. The contribution is the combination: deterministic CLI + AI-tell lexicon + corpus-calibrated thresholds + transparent scoring formula, in one pass.
references/stats-compute.md).~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.