<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>writing-quality on tomrochette.com</title>
    <link>https://tomrochette.com/tags/writing-quality/</link>
    <description>Recent content in writing-quality on tomrochette.com</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <managingEditor>tom@tomrochette.com (Tom Rochette)</managingEditor>
    <webMaster>tom@tomrochette.com (Tom Rochette)</webMaster>
    <copyright>© 2026 Tom Rochette</copyright>
    <lastBuildDate>Tue, 20 Oct 2026 21:35:25 -0400</lastBuildDate><atom:link href="https://tomrochette.com/tags/writing-quality/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>slop-grader</title>
      <link>https://tomrochette.com/agents/evaluation-review/slop-grader/</link>
      <pubDate>Wed, 21 Oct 2026 00:00:00 +0000</pubDate>
      <author>tom@tomrochette.com (Tom Rochette)</author>
      <guid>https://tomrochette.com/agents/evaluation-review/slop-grader/</guid>
      <category>research-note</category><category>agent-curated</category><category>fully-ai-generated</category><category>llm=glm-5.3-flash</category><category>evaluation-review</category><category>jev</category><category>decision-models</category><category>linting</category><category>writing-quality</category>
      <description>&lt;p&gt;slop-grader is a free, MIT-licensed TypeScript CLI that grades text files against Markdown-authored rulesets using Jev, the typed decision model, asking one semantic question per line per rule in parallel instead of asking a chat model to skim the whole document.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;It is Jevals&amp;rsquo; mechanism pointed at documents: the judge never generates text, so exhaustive coverage (every rule against every line) costs cents, and the output is a report any agent can turn into a fix plan.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;What it is&#xA;    &lt;div id=&#34;what-it-is&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#what-it-is&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;An npm CLI (&lt;code&gt;@lukstei/slop-grader&lt;/code&gt;, Node 18+) from lukstei, with rules written in plain Markdown under &lt;code&gt;# Line Rules&lt;/code&gt; and &lt;code&gt;# Document Rules&lt;/code&gt; sections or in JSON, validated offline with &lt;code&gt;--check&lt;/code&gt;.&#xA;Line rules ask one yes/no question per line (banned words, empty adverbs, swallowed errors, hardcoded secrets); document rules score qualitative rubrics (narrative arc, root-cause depth, commit intent) in a single request.&#xA;Lines are batched to the model&amp;rsquo;s token budget (up to 255 lines per call) with up to ten lines of surrounding context, and every batch response is verified for complete answer-to-question parity, halting on dropped questions rather than reporting unchecked lines as clean.&#xA;Evaluations cache by line hash, so re-running an edited document bills only the changed lines.&#xA;Providers are TypeSafe&amp;rsquo;s Jev endpoint or OpenRouter (jev-1.13 by default), and the intended loop is two steps: grade, then paste the report into any AI agent to plan and apply the fixes.&#xA;Five built-in rulesets ship (no-ai-slop, article-scores, tech-docs, and English and German grammar), plus a companion agent skill for authoring custom rulesets.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Status&#xA;    &lt;div id=&#34;status&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#status&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;New and shipping fast: 35 stars and 2 forks as of 2026-10-21, created 2026-09-20, pushed 2026-10-18, with seventeen GitHub releases in the first month and npm at 0.4.0 (2026-10-18) after fifteen published versions.&#xA;Adoption is early but measurable: 2,727 npm downloads in the first month, 180 in the week of 2026-10-12 to 2026-10-18.&#xA;&lt;strong&gt;The independent footprint is one Show HN thread (2026-09-21, 3 points, zero comments) and no third-party coverage anywhere, so every performance claim on record comes from the author&amp;rsquo;s own README.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;picture&gt;&#xA;  &lt;source media=&#34;(prefers-color-scheme: dark)&#34; srcset=&#34;https://api.star-history.com/chart?repos=lukstei/slop-grader&amp;type=date&amp;theme=dark&amp;legend=top-left&#34; /&gt;&#xA;  &lt;source media=&#34;(prefers-color-scheme: light)&#34; srcset=&#34;https://api.star-history.com/chart?repos=lukstei/slop-grader&amp;type=date&amp;theme=dark&amp;legend=top-left&#34; /&gt;&#xA;  &lt;img alt=&#34;Star History Chart&#34; src=&#34;https://api.star-history.com/chart?repos=lukstei/slop-grader&amp;type=date&amp;theme=dark&amp;legend=top-left&#34; /&gt;&#xA;&lt;/picture&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Strengths&#xA;    &lt;div id=&#34;strengths&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#strengths&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Exhaustive by construction: every rule meets every line, so nothing is skimmed, which is the documented failure mode of single-prompt document review.&lt;/li&gt;&#xA;&lt;li&gt;The judge is typed and cheap: Jev probabilities cost thousandths of a cent per question, which is what makes thousand-check runs routine (the README grades a 300-line article against 42 rules for about 7.6 cents).&lt;/li&gt;&#xA;&lt;li&gt;Rules are Markdown you can read, version, and validate offline, and the project&amp;rsquo;s own guidance is one pattern per rule, which keeps failures attributable to a named rule ID.&lt;/li&gt;&#xA;&lt;li&gt;Cache-by-line turns the grader into an editing-loop companion rather than a one-shot audit.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Cautions&#xA;    &lt;div id=&#34;cautions&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#cautions&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The judge is the same small-model class as every Jev consumer: its precision on nuanced rules is unmeasured by anyone except the author, and the 0.8 confidence threshold is global, not per rule.&lt;/li&gt;&#xA;&lt;li&gt;Zero independent evaluation: no benchmark, no third-party writeup, one unremarked Show HN thread, so the cost and coverage figures rest entirely on the README&amp;rsquo;s self-run examples.&lt;/li&gt;&#xA;&lt;li&gt;The GitHub Action and pull-request comment surfaces are still roadmap items, so CI use today means wrapping the JSON output yourself.&lt;/li&gt;&#xA;&lt;li&gt;Solo maintainer, one month old, fifteen npm versions: ruleset syntax and CLI flags have moved repeatedly and will keep moving.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Pricing&#xA;    &lt;div id=&#34;pricing&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#pricing&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The CLI is free and MIT.&#xA;Grading bills your own provider key: the README&amp;rsquo;s own examples price a 16-line document against 53 rules at about $0.0053 and a 300-line article against 42 rules at about $0.076, with unchanged lines free on re-runs through the cache.&#xA;The Jev backend&amp;rsquo;s per-token price is tracked in the &lt;a href=&#34;https://tomrochette.com/agents/evaluation-review/jevals/&#34; &gt;Jevals&lt;/a&gt; note, which uses the same backend.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Price history&#xA;    &lt;div id=&#34;price-history&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#price-history&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Date&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Plan&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Change&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Source&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2026-10-21&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Jev/OpenRouter usage&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Baseline: CLI free (MIT); grading bills your provider key, README examples about $0.0053 per 16-line document against 53 rules and about $0.076 per 300-line article against 42 rules.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a href=&#34;https://raw.githubusercontent.com/lukstei/slop-grader/main/README.md&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=raw.githubusercontent.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://raw.githubusercontent.com/lukstei/slop-grader/main/README.md&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Compared to&#xA;    &lt;div id=&#34;compared-to&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#compared-to&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agents/evaluation-review/jevals/&#34; &gt;Jevals&lt;/a&gt;: the same Jev judge packaged as a Python evals-and-guardrails library over agent traces; slop-grader is the document-and-diff grader with a report-and-fix-plan loop, Jevals the in-loop gate.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agents/evaluation-review/verbatim-citation-gate/&#34; &gt;Verbatim Citation Gate&lt;/a&gt;: the other cheap-first judge on text, deterministic for quotes where slop-grader is decision-model for rules; both refuse to pay generative prices per check.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agents/evaluation-review/deepeval/&#34; &gt;deepeval&lt;/a&gt;: the pytest-style framework with judge metrics gating LLM app outputs in CI; choose it when the suite must block merges, slop-grader for authored rulesets over documents and diffs.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Bottom line&#xA;    &lt;div id=&#34;bottom-line&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#bottom-line&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Recommended for writers and reviewers who want a repeatable, exhaustive ruleset grade over AI-written text and diffs at near-zero cost, with an agent closing the loop on the findings.&lt;/strong&gt;&#xA;Not as a validated quality gate yet: one month old, one maintainer, and no independent measurement of the judge&amp;rsquo;s accuracy exists.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Changes&#xA;    &lt;div id=&#34;changes&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#changes&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;2026-10-21 - Created from the skills-worker handoff, admitted as the second Jev-based member after Jevals.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;See also&#xA;    &lt;div id=&#34;see-also&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#see-also&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agents/evaluation-review/jevals/&#34; &gt;Jevals&lt;/a&gt; - the Jev library sibling judging traces instead of documents&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agents/hybrid-execution/jev/&#34; &gt;Jev&lt;/a&gt; - the decision model every check runs on&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agents/evaluation-review/verbatim-citation-gate/&#34; &gt;Verbatim Citation Gate&lt;/a&gt; - the deterministic-first citation judge&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tomrochette.com/agents/evaluation-review/evaluation-review-feature-matrix/&#34; &gt;Evaluation and Review Feature Matrix&lt;/a&gt; - the category comparison this note joins&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;References&#xA;    &lt;div id=&#34;references&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#references&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/lukstei/slop-grader&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=github.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://github.com/lukstei/slop-grader&lt;/a&gt; - repository, description, MIT license, stars and dates as of 2026-10-21&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://raw.githubusercontent.com/lukstei/slop-grader/main/README.md&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=raw.githubusercontent.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://raw.githubusercontent.com/lukstei/slop-grader/main/README.md&lt;/a&gt; - the two-step loop, batching and context padding, caching, cost examples, and the built-in rulesets&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://raw.githubusercontent.com/lukstei/slop-grader/main/docs/CHANGELOG.md&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=raw.githubusercontent.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://raw.githubusercontent.com/lukstei/slop-grader/main/docs/CHANGELOG.md&lt;/a&gt; - release history from v0.1.x to v0.4.0&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://registry.npmjs.org/@lukstei/slop-grader&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=registry.npmjs.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://registry.npmjs.org/@lukstei/slop-grader&lt;/a&gt; - package: 0.4.0 (2026-10-18), fifteen published versions&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://api.npmjs.org/downloads/point/last-month/@lukstei/slop-grader&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=api.npmjs.org&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://api.npmjs.org/downloads/point/last-month/@lukstei/slop-grader&lt;/a&gt; - 2,727 downloads in the first month; the weekly point read 180 for 2026-10-12 to 2026-10-18&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://hn.algolia.com/api/v1/search?query=slop-grader&amp;amp;hitsPerPage=5&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;img class=&#34;external-link-favicon&#34; src=&#34;https://www.google.com/s2/favicons?domain=hn.algolia.com&amp;sz=128&#34; alt=&#34;&#34; width=&#34;16&#34; height=&#34;16&#34; loading=&#34;lazy&#34;&gt;https://hn.algolia.com/api/v1/search?query=slop-grader&amp;hitsPerPage=5&lt;/a&gt; - the single Show HN thread (2026-09-21, 3 points, zero comments), the thin-footprint evidence&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
      
    </item>
    
  </channel>
</rss>
