An agent skill for prose that doesn’t read like template AI.
Write so a careful human finishes the page.
noslop is a skill pack your agent loads before it writes. It works like a linter, not a style: draft plainly from the brief, then scan for two kinds of tells and cut only what you find —
- Slop tells — glue words, template phrases, sermon closes, dash spam (style-and-bans.md).
- Over-application tells — anchor stuffing, fragment cosplay, signature closers, punchy one-line morals. The skill's own failure mode.
That second scan is the point. Anti-slop rules applied too hard produce a new kind of slop: every draft comes out with the same number-stuffed, telegraphic, "if this is noise, delete it" skeleton. A rule pack that makes every draft identical just moves the cluster detectors catch. Human writing is diverse, so noslop's ship bar stays human: a careful reader finishes the page.
Clean vocabulary is the floor, not the fix. A draft can pass every ban and still read as machine, because the deeper tell is evenness — one register held end to end, every section built the same way, every thought closed, every sentence resolving at the same rate. Research on AI text keeps landing on the same conclusion: style cues are weak evidence, but construction — how a piece is built — separates machine drafts from human ones (see Reference papers).
So noslop has two structural layers, both built as menus rather than rules:
| Layer | File | For |
|---|---|---|
| Story construction | skills/noslop/construction.md |
Long fiction (~1k+ words) |
| Nonfiction structure | skills/noslop/structure-nonfiction.md |
Long essays, reports (~1k+ words) |
Each layer says the same thing in its genre's terms: pick a few moves, skip the rest on purpose, and never let two drafts share a skeleton.
| You get | Where |
|---|---|
| Skill for Claude Code / similar | skills/noslop/ |
| VOICE hard-fail check (flags, not a grade) | python -m noslop.cli voice |
| Optional StoryScope feature score (lab) | python -m noslop.cli score |
| Side-by-side drafts + charts | evals/ |
Trigger: noslop · “write human” · “anti AI voice” · /noslop
Skip for: code cleanup, pure data dumps
What detectors measure, per the papers — three different mechanisms that all punish the same thing: predictability.
flowchart LR
T[Your text] --> G[GPTZero<br/>hierarchical multi-task classifier<br/>arXiv:2602.13042]
T --> B[Binoculars<br/>token-level surprisal<br/>arXiv:2401.12070]
T --> S[StoryScope<br/>discourse-level features<br/>arXiv:2604.03136]
G --> V{reads as machine?}
B --> V
S --> V
K[Kobak et al.<br/>excess vocabulary<br/>arXiv:2407.07004] -. lexical layer .-> V
What noslop does about it — move before generation, not after:
flowchart TD
D[Draft plainly from the brief] --> R[Read it like a stranger]
R --> S1[Slop scan<br/>bans + templates, if present]
S1 --> S2[Over-application scan<br/>noslop tells, if present]
S2 --> L{How long?}
L -- short prose --> V
L -- long fiction --> C[construction.md<br/>0–3 moves, linear default]
L -- long nonfiction --> N[structure-nonfiction.md<br/>2–4 palette picks + macro seed:<br/>topic order, omissions, stopping points]
C --> V[VOICE: hard fails only]
N --> V
V --> SHIP[Ship when a careful human<br/>would finish the page]
noslop is a craft tool, not a detector tool. It promises a readable page, not a number; detector checks, when you run them, are smoke tests with a strict iteration budget (detector clause).
Same brief. default = raw model. noslop = skill applied. Note the noslop drafts don't share a skeleton — that's deliberate. If your noslop outputs all look alike, you're over-applying it.
Hi Jordan,
I hope this email finds you well. In today's competitive logistics landscape,
we leverage cutting-edge route optimization to unlock actionable savings and
empower fleets to streamline last-mile delivery. Our robust, seamless platform
will revolutionize your operations.
I'd love to schedule a brief call to discuss how we can foster better outcomes
together.
Best regards,
Sam
Subject: Thursday mornings at the clinic
Hi Maya,
A friend who runs a two-site clinic showed me their booking export last week.
The monthly no-show rate looked fine, about 18%. Thursday mornings didn't.
Half the early slots sat empty, and the average hid it.
I help clinics see where the average is lying. Usually that means a shared
sheet and a few days of looking, not new software.
If you want, send any recent booking export with names stripped and I'll
mark the gaps. Either way, hope the Thursdays improve.
Raka
I am a passionate product designer with a proven track record of delivering
robust, user-centric experiences. I thrive in collaborative environments and
am dedicated to continuous learning. In my free time I enjoy hiking and
exploring new technologies.
I'm a product designer in Portland, currently on checkout for a regional
grocer. Last thing I shipped: cut the gift-card flow from seven screens to
three after watching people abandon carts in session recordings. Before that,
two years on dispute flows at a payments company, which is where I stopped
believing error messages are copy anyone reads.
Outside work I play rec soccer on Wednesdays. Bad left ankle. The team chat
is chaos and I wouldn't have it otherwise.
Our cutting-edge inventory platform seamlessly transforms messy stock data
into comprehensive, actionable insights. Leverage AI to unlock growth,
streamline workflows, and empower your team with robust, scalable clarity.
Stock exports are messy. The qty column is sometimes units, sometimes cases.
Excel strips the leading zeros off SKUs. The same shelf shows up as MAIN,
Main, and WH-1.
Upload the file and we flag the mismatches before you trust a reorder. You
get one plain sheet: what to buy, what to ignore, what to ask the warehouse
about. No chatbot, no insights feed.
Redis connection errors in production are a common challenge. It's important
to note that timeouts often cause intermittent failures. To comprehensively
address this, you should leverage robust retry strategies and ensure proper
configuration. Furthermore, implementing best practices around connection
pooling can elevate reliability. In conclusion, take a holistic approach.
If the error is `READONLY You can't write against a read only replica`, your
app is writing to a replica (or the primary failed over and the client still
holds the old role).
Check `INFO replication` on the host the app points at and look for
`role:master`. If it says slave, point writes at the primary, or use a client
library that follows redirects.
Retrying harder won't help here. The writes are landing on a node that can't
accept them.
Older eval drafts live in evals/results/ — the modes/ and
v2/ folders predate the linter reframe and show the over-application problem
(same skeleton on every arm) that this version fixes.
- Draft from the brief. No checklist in hand.
- Read it like a stranger. Would a careful human finish it? Yes → ship.
- Slop scan — cut hard bans, templates, sermon closes if present.
- Over-application scan — cut anchor stuffing, fragment cosplay, signature closers if present.
- Long prose only — if it sags structurally: fiction → construction.md (0–3 moves, linear default); nonfiction → structure-nonfiction.md (2–4 palette picks, macro seed, named skips). Short prose never gets structural toys.
- VOICE — hard-fail flags only (sermon / ban spam / zero anchors).
- Ship when a careful human would finish the page.
Full skill: skills/noslop/SKILL.md
Modes = how much the skill interferes. Default: balanced.
| Mode | Use |
|---|---|
| modest | Slop scan only — letters, notes, anything that should feel unforced |
| balanced | Fix what the scans catch, add nothing — default |
| max | Research only — expect stiffness |
| Tool | Role |
|---|---|
VOICE (noslop.cli voice) |
Hard-fail flags (sermon, ban spam, fog) + fragment-stack detector. Exit code = flags only; the number is lab diagnostics — never iterate to raise it |
StoryScope (noslop.cli score) |
Optional lab feature score vs the research binary. Honest labels only, never a ship gate |
The skill's design rests on these. One line each; the rules themselves stay general on purpose.
| Paper | What it shows | What noslop takes from it |
|---|---|---|
| StoryScope — Russell et al., arXiv:2604.03136 | Discourse-level features alone separate AI fiction from human at 93% F1 with style removed: AI over-explains themes, closes every thread, and clusters in one region of narrative space | Structure outranks style. Both construction layers exist because of this paper; the diversity seed exists because of the clustering finding |
| GPTZero — Adam et al., arXiv:2602.13042 | Industrial detection is a hierarchical multi-task classifier, red-teamed against paraphrasing and adversarial edits | Post-hoc word swaps don't move modern detectors. The only honest lever is how the draft is built |
| Binoculars — Hans et al., arXiv:2401.12070 | Token-level predictability separates machine text at >90% recall with near-zero false positives | Human writing is genuinely unpredictable at the choice level — hence the macro seed: topic order, real omissions, early stopping points |
| Detector disagreement — Alshammari & Rao, arXiv:2507.17944 | Automated "humanizer" attacks only half-work, and detectors disagree wildly across vendors | One smoke test, one detector, one structural re-pass at most. No paraphrase tools, no score farming |
| Excess vocabulary — Kobak et al., arXiv:2407.07004 | AI text carries a lexical fingerprint (the "delve" class of words) | The ban list in style-and-bans.md — the surface layer, owned there |
Via the skills CLI (repo is public):
npx skills add vstalingrady/noslopOr manually:
Copy-Item -Force .\skills\noslop\* $env:USERPROFILE\.claude\skills\noslop\/noslop
Write a short cold email about clinic no-shows.
cd C:\path\to\noslop
python -m venv .venv
.\.venv\Scripts\pip install -r requirements.txt
$env:PYTHONPATH="src"
.\.venv\Scripts\python.exe -m noslop.cli voice --text-file draft.md --json
.\.venv\Scripts\python.exe -m noslop.cli score --features features.json --jsonnoslop/
assets/logo.jpg
skills/noslop/ # agent skill (install this)
construction.md # long-fiction structure layer
structure-nonfiction.md # long-nonfiction structure layer
src/noslop/ # voice + optional StoryScope CLI
artifacts/ # taxonomy + model weights
evals/results/ # A/B drafts (older arms show the old regime)
tests/
MIT. StoryScope and surface-list notices: THIRD_PARTY_NOTICES.md.
Paper: arXiv:2604.03136.
