Anti ai slop
Skill Vitrehac/anti-ai-slop
Detects and removes AI writing tells in prose, docs, emails, READMEs, Czech outreach, LinkedIn posts, and UX copy. Use for de-slop, humanize, gate, linktwerk pipeline, sounds like AI, or anti-ai-slop. Routes visual UI slop to impeccable.From its SKILL.md
npx -y skills add Vitrehac/anti-ai-slopAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
7.6 KB, ~2.0k tokens by cl100k_base, as published. Nobody here has run it
Detects and removes AI-generated writing tells in plain text. Real specificity, preserved voice, no corporate sanitization.
Absolute bans (never ship)
These are non-negotiable in de-slop, humanize, and gate output unless the user explicitly overrides:
- No em dashes (
—) or--as dashes. Replace with commas, parentheses, periods, or colons. The #1 recognized AI tell. - No meta-AI voice — "I hope this helps", "Certainly!", "Great question!", "I'd be happy to"
- No filler openers — "It's worth noting", "In today's fast-paced world", "Let's dive in"
- No formal transitions — Furthermore, Moreover, Additionally (use "And", "So", or nothing)
- No colon runways — "The result:", "Here's the key insight:" (state the fact directly)
- No Delvish clusters — delve + tapestry + nuanced + robust + landscape in the same piece
- No crucial-role formula — "X plays a crucial role in shaping Y"
- No isn't-it's pivots — "The hard part isn't X. It's Y." / "It's not X. It's Y."
- No lesson lists — "Two things that helped:" + takeaway bullets
- No kept/lost aphorisms — "Kept the badge, lost the pep talk"
- No fake-casual wit — "felt on brand", "No big scene, just…"
Full lists: registry/phrases.md, registry/structural.md.
Philosophy
- The slop test: if a reader could say "AI wrote this" without hesitation, it failed.
- Specificity beats polish — concrete nouns, verbs, numbers, constraints.
- Preserve voice — remove tells; keep the author's register unless asked to change it.
- Structural tells matter — uniform triplets, mirrored pairs, faux-profound closers, signposting scaffolds.
- False-positive discipline — lists and frameworks are fine in moderation; Delvish words need clusters; em dashes have zero tolerance in output.
Setup
Skill root = directory containing this SKILL.md. Run all scripts from there:
node scripts/scan.mjs --json <target>
node scripts/gate.mjs --strict <target>
node scripts/check-fixtures.mjs
Before any command:
- If the user invoked a sub-command, read
reference/<command>.md. Non-optional. - Pipeline:
linktwerk then de-slop→ reference/pipeline-linktwerk.md. - Voice: default preserve → reference/voice-dial.md.
- Pick a register (first match wins):
- Czech email, outreach (
Dobrý den, vykání) → registry/registers/email-cs.md - LinkedIn, job-hunt post, social → registry/registers/social.md
- Email, essay, narrative (other) → registry/registers/prose.md
- README, API docs, runbooks → registry/registers/docs.md
- Taglines, hero copy, landing text → registry/registers/marketing.md
- Czech email, outreach (
- When a file path exists, run
scanbeforeaudit,de-slop, orhumanize:node scripts/scan.mjs --json <target> - Scan score is a floor, not a pass. Score 4 with LinkedIn/job-hunt/Czech email shape still requires LLM shape audit. See reference/audit.md.
Commands
| Command | Purpose | Reference |
|---|---|---|
scan [target] | Fast deterministic lint | reference/scan.md |
audit [target] | Scan + rhetorical review, slop score 0–4 | reference/audit.md |
de-slop [target] | Aggressive rewrite; remove tells, keep meaning | reference/de-slop.md |
humanize [target] | Light rewrite; max ~15% word change | reference/humanize.md |
gate [target] | Pre-ship check; exit code pass/fail | reference/gate.md |
loop [target] | De-slop + re-gate until clean (≤3×) | reference/loop.md |
pipeline linktwerk | Cringe → human in one flow | reference/pipeline-linktwerk.md |
ui-copy [file] | Scan extracted JSX/HTML text | reference/ui-copy.md |
Scripts
| Script | Purpose |
|---|---|
| scripts/scan.mjs | Lint + score |
| scripts/gate.mjs | Pass/fail gate (--strict = score ≥ 3, zero blockers) |
| scripts/check-fixtures.mjs | Regression test suite |
| scripts/extract-ui-copy.mjs | Pull copy from .tsx/.html |
Slop score (0–4)
- 0 — obvious AI (5+ tells or dominant structural pattern)
- 1 — heavy (3–4 tells)
- 2 — noticeable (1–2 tells)
- 3 — mostly clean
- 4 — no tells; specific and human
Routing rules
- First word matches a command → load its reference and proceed. Everything after the command name is the target.
- No command, intent clear ("this README sounds robotic") → default to
audit. - Target is UI (
.tsx,.jsx,.html,.vue,.svelte) → extract copy via ui-copy; visual layout → impeccable. - User wants cringe LinkedIn only →
linktwerkalone. linktwerk then de-slop/linktwerk pipeline→ pipeline-linktwerk.md (uses both skills in sequence).- Input is linktwerk output →
de-slop+ social register + loop.md. - Pasted text with no file → pipe to
scan.mjs --stdinorgate.mjs --stdin --strict.
Post-output verification (de-slop / humanize / gate)
Before sending rewritten text to the user:
- Re-read the draft aloud (mentally): does any sentence sound like a template?
- Re-run scan on the draft (stdin or temp file).
- Confirm zero em dashes, isn't-it's pivots, lesson-list headers, fake stat citations, punch-pause lines, hashtag walls.
- If target was social/email: one concrete detail survives; no invented org names or survey percentages unless user provided them.
- If scan score ≥ 3 but shape still feels AI → loop.md (max 3 iterations):
node scripts/gate.mjs --json --strict draft.txt
Sibling skills
- impeccable — visual UI slop (gradients, card grids, layout).
- linktwerk — cringe generator; pair with
pipeline linktwerkfor human output. - frontend-design — prevention at creation; this skill is review/fix at edit time.
Registry
- registry/phrases.md — banned and tired phrases
- registry/structural.md — pattern descriptions for LLM + script hints
- registry/registers/prose.md — essays, general email
- registry/registers/social.md — LinkedIn, job posts
- registry/registers/email-cs.md — Czech outreach
- examples.md — before/after pairs per register
- scripts/phrases.mjs — shared phrase lists for scanner (aligned with impeccable detect-text.mjs)
CI / regression tests
node scripts/check-fixtures.mjs
node scripts/scan.mjs --json --strict path/to/file.md
GitHub Actions runs check-fixtures.mjs on every push. Golden outputs live in tests/fixtures/golden/ and must pass strict gate.
Fixtures manifest: tests/fixtures.json.
What ships with it: 38 files
90.0 KB alongside SKILL.md, 6 of them executable
reference/
- audit.md1.9 KB
- de-slop.md2.3 KB
- gate.md1.7 KB
- humanize.md1.1 KB
- loop.md1.5 KB
- pipeline-linktwerk.md998 B
- scan.md2.1 KB
- ui-copy.md1.0 KB
- voice-dial.md1.2 KB
registry/
- phrases.md5.3 KB
- registers/docs.md1011 B
- registers/email-cs.md1.3 KB
- registers/marketing.md1.2 KB
- registers/prose.md1.1 KB
- registers/social.md1.5 KB
- structural.md4.7 KB
scripts/
- check-fixtures.mjsruns2.5 KB
- extract-ui-copy.mjsruns1.5 KB
- gate.mjsruns2.0 KB
- phrases.mjsruns7.2 KB
- scan.mjsruns23.9 KB
- skill-root.mjsruns278 B
tests/
- fixtures/czech-email-clean.txt325 B
- fixtures/czech-email-slop.txt365 B
- fixtures/deslopped-dev-clean.txt332 B
- fixtures/fake-humanized-job.txt490 B
- fixtures/golden/czech-outreach.txt325 B
- fixtures/golden/job-hunt.txt612 B
- fixtures/golden/prose-email.txt181 B
- fixtures/golden/social-dev.txt332 B
- fixtures.json2.1 KB
- fixtures/linktwerk-dev.txt1.1 KB
- fixtures/linktwerk-fired-boss.txt765 B
- fixtures/prose-email-clean.txt181 B
- examples.md8.5 KB
- .gitignore20 B
- LICENSE1.0 KB
- README.md6.3 KB