slopcheck-jev
Prose linter for AI writing tells: regex handles 18, Jev judges 15 as Nouls in one call, shipped as a Claude Code Stop hook.
Overview
slopcheck reports which AI writing tells a passage contains, with the line quoted. It never answers 'did AI write this'; it answers things like 'line 4 is a binary contrast, p=0.91'. It runs as a Claude Code Stop hook, so it checks Claude's own output after every turn and warns rather than blocks, and also as a CLI.
It has three layers. Lex, a regex layer, settles 18 tells for free in milliseconds: em dashes, curly quotes, title-case headings, decorative emoji, boldface density, sentence length, stacked hedging and word lists. Judge is one Jev call with 15 Noul questions over the passage in parallel, for tells that need reading such as importance puffery, binary contrast, forced triads, synonym cycling and generic conclusions. Gate, in code, owns every threshold; a Noul between 0.40 and 0.60 is treated as the model not answering and suppressed. A paragraph mode returns line numbers at the cost of one call per block, sent together. The README reports a median of 604 ms over nine real drafts, about $0.105 per 1,000, and precision level with an alternative approach (0.95 versus 0.97).
What the decision model decides
| Type | Question | Answers |
|---|---|---|
| Yes / no | Does this passage contain importance puffery? | — |
| Yes / no | Does it use 'not just X, but Y' binary contrast? | — |
| Yes / no | Does it end with a generic summary or fake-profound kicker? | — |
How it works
- Regex layer flags pattern-based tells with line quotes
- One Jev call asks 15 Nouls over the passage (or per paragraph)
- Gate applies thresholds and suppresses 0.40-0.60 answers
- Report findings with fixes; warn in the Stop hook
Strengths
- Cheap: about $0.105 per 1,000 runs per the README
- Explicit handling of uncertain answers
- Thresholds change without re-running
Caveats
- Document mode does not give line numbers for Jev tells
- Recall lower than precision in its benchmark
Getting started
Install the CLI and Claude Code Stop hook per the README, set TYPESAFE_API_KEY, then run slopcheck draft.md.At a glance
- Type
- Hook
- Status
- beta
- Language
- Python
- Runtime
- CLI + Claude Code Stop hook
- Has code
- yes
- Has tests
- yes
- License
- MIT
Use cases and integrations
How curated lists describe it
A prose linter that catches AI writing tells. Regex settles the 18 a pattern can settle. Jev takes the 15 that need reading, as 15 Nouls in one call, 604 ms median. It ships as a Claude Code \`Stop\` hook that scores Claude's own output after every turn and warns rather than blocks.
logicrw/awesome-jev-projects
Frequently asked questions
What does Jev decide?
Whether each of 15 reading-dependent writing tells is present in the passage.
Does it block Claude?
No; the Stop hook warns rather than blocks.
How are uncertain answers handled?
Nouls between 0.40 and 0.60 are suppressed as non-answers.
Related projects
Claude Code plugin that checks every reply and file edit against your CLAUDE.md rules with one Jev yes/no per rule.
PluginbetaTypeScriptProse linter with local regex rules and Jev judgment rules per paragraph, as CLI, pre-commit hook, GitHub Action and Claude Code skill.
CLIbetaTypeScriptEditorial QA tool where Jev judges per fact whether an edit preserved the original, with a confidence gate and human review fallback.
ProjectbetaJavaGitHub Action that reviews repository files against your yes/no questions with Jev and passes only when every answer meets its threshold.
ProjectbetaTypeScriptRuff-style prose linter whose semantic rules each ask Jev a yes/no question about a paragraph, title or section, with tunable thresholds.
ProjectbetaPythonNode tool that crosschecks a folder of Markdown notes for contradictions and repeats, and ranks notes by any question, using Jev.
ProjectbetaJavaScript