Sniff Test
A prose linter for AI writing tells: regex rules plus Jev for judgment.
# Sniff Test Does the draft pass the sniff test? Sniff Test reads Markdown and plain text and checks it against your house rules. It prints one line per flag with the file, the line, the rule that tripped and how sure it is. There are two kinds of rule. **Countable rules** are regular expressions. Long dashes, a paragraph with three colons, a banned word, every sentence the same length. They run on your machine, cost nothing and send nothing anywhere. **Judgment rules** need something read rather than counted. A closing sentence that only restates the paragraph, a claim hedged three times, a line that talks the reader out of the offer. For those it sends one paragraph at a time to a small hosted judgment model and gets back one probability per rule. It only does that after you have said yes. Two things it is not. There is no general model in the loop; the judgment model returns one probability per question and nothing else. And it will not rewrite your text. A flag is a sentence for you to fix. ```sh npm install --global snifftest snifftest check --dry-run draft.md ``` That runs the countable rules and nothing leaves your machine. To run the judgment rules too, put a TypeSafe key in `TYPESAFE_API_KEY` and drop `--dry-run`. The first time, it prints exactly what it is about to send and where, and waits for your answer. It exits 0 when nothing tripped, 1 when at least one rule did, 2 when the tool could not do its job, and 3 when the judgment rules needed a yes and did not get one. The nose is the mascot. It is one hand-drawn SVG with six expressions, in `assets/nose/`, and `snifftest serve` opens a local page where you type and the nose reacts. ## Reading a flag ``` draft.md:14 dash_present 1.00 A long dash. Give the sentence a full stop instead. draft.md:31 re