Skip to content

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.

HookbetaMIT

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

TypeQuestionAnswers
Yes / noDoes this passage contain importance puffery?—
Yes / noDoes it use 'not just X, but Y' binary contrast?—
Yes / noDoes it end with a generic summary or fake-profound kicker?—

How it works

  1. Regex layer flags pattern-based tells with line quotes
  2. One Jev call asks 15 Nouls over the passage (or per paragraph)
  3. Gate applies thresholds and suppresses 0.40-0.60 answers
  4. 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.

    PluginbetaTypeScript
  • Prose linter with local regex rules and Jev judgment rules per paragraph, as CLI, pre-commit hook, GitHub Action and Claude Code skill.

    CLIbetaTypeScript
  • Editorial QA tool where Jev judges per fact whether an edit preserved the original, with a confidence gate and human review fallback.

    ProjectbetaJava
  • GitHub Action that reviews repository files against your yes/no questions with Jev and passes only when every answer meets its threshold.

    ProjectbetaTypeScript
  • Ruff-style prose linter whose semantic rules each ask Jev a yes/no question about a paragraph, title or section, with tunable thresholds.

    ProjectbetaPython
  • Node tool that crosschecks a folder of Markdown notes for contradictions and repeats, and ranks notes by any question, using Jev.

    ProjectbetaJavaScript