Sniff Test
Prose linter with local regex rules and Jev judgment rules per paragraph, as CLI, pre-commit hook, GitHub Action and Claude Code skill.
Overview
Sniff Test checks Markdown and plain text against house rules and prints one line per flag with file, line, rule and how sure it is. Countable rules are regular expressions (long dashes, a paragraph with three colons, banned words, uniform sentence length) that run locally for free. Judgment rules need reading, such as a closing sentence that only restates the paragraph, a claim hedged three times, or a line that talks the reader out of an offer; for these it sends one paragraph at a time to Jev and gets one probability per rule. It never rewrites text.
A judgment flag needs at least 0.7 by default, and readings between 0.4 and 0.6 are reported as 'no judgment' rather than a pass or flag, because the model returns about 0.5 on text it cannot read. Before the first send it prints exactly what will go where and asks for consent; exit codes distinguish clean, flagged, tool failure and missing consent. The default ruleset has fifteen rules. A list summary reports a 182 ms median and 1 of 54 clean paragraphs flagged versus 37 for Haiku 4.5. It ships as an npm CLI, pre-commit hook, GitHub Action and Claude Code skill, with zero dependencies.
What the decision model decides
| Type | Question | Answers |
|---|---|---|
| Yes / no | Does the last sentence only restate the paragraph? | — |
| Yes / no | Is this claim hedged multiple times? | — |
| Yes / no | Does this line talk the reader out of the offer? | — |
How it works
- Run countable regex rules locally
- With consent, send each paragraph to Jev with one question per judgment rule
- Flag at or above 0.7; report 0.4-0.6 as no judgment
- Print flags with line, rule and certainty; set exit code
Strengths
- Explicit consent before sending text
- Uncertain readings never pass silently
- Few false flags on clean prose per list figures
Caveats
- Judgment rules require a TypeSafe key
- Flags are for humans to fix; no rewrites
Getting started
npm install --global snifftest && snifftest check --dry-run draft.md (set TYPESAFE_API_KEY and drop --dry-run for judgment rules).At a glance
- Type
- CLI
- Status
- beta
- Language
- TypeScript
- Runtime
- Node CLI, pre-commit, GitHub Action, Claude Code skill
- Has code
- yes
- License
- MIT
Use cases and integrations
How curated lists describe it
Writing: prose linter that asks Jev ten `Boolean` questions per paragraph (stacked hedges, restating closers, not-X-but-Y turns, naked cost figures) at a 0.7 threshold; CLI, pre-commit hook, GitHub Action and Claude Code skill; measured 182 ms median and 1 of 54 clean paragraphs flagged against 37 for Haiku 4.5.
yibie/awesome-jevA Markdown and plain-text prose linter using local rules and optional Jev judgments.
logicrw/awesome-jev-projectsA prose linter that sniffs out AI writing tells. Zero dependencies, countable rules plus one judgment model.
hellogumbo/awesome-jevProse linter for AI writing tells: countable regex rules run locally, and one judgment question covers the rest.
MrJev/awesome-jev
Frequently asked questions
What does Jev decide?
Whether each paragraph shows a judgment-based writing problem, one probability per rule.
Does it send my text without asking?
No; it shows what will be sent and asks first.
How are uncertain answers handled?
Readings between 0.4 and 0.6 are reported as no judgment.
Related projects
Prose linter for AI writing tells: regex handles 18, Jev judges 15 as Nouls in one call, shipped as a Claude Code Stop hook.
HookbetaPythonRuff-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.
ProjectbetaJavaScriptCLI design and copy linter: mechanical checks block commits, while fuzzy taste checks go to Jev for probability-scored review notes.
CLIbetaTypeScriptChinese controlled-writing agent skill for technical reports with nine rules, using static checks plus a Jev semantic gate for certainty.
Agent skillbetaDependency-light Go linter that applies natural-language rules to code and documents using decision models like Jev or Clef.
ProjectprototypeGo