slop-chop
io.github.dcadolph由 GitHub 帳號 dcadolph 發布v0.55.1更新於 Nov 3, 2026
查詢並移除設定檔案列出的寫作模式。確定性規則,可選擇啟用模型改寫。
AI 翻譯由 AI 模型根據下方的原文描述翻譯,可能有誤。
原文描述
Find and remove the writing patterns a profile lists. Deterministic rules, model rewrite opt-in.
概覽
slop-chop 的本機 MCP 服務;無需登入;STDIO。
暫無 AI 概覽:以下資訊來自註冊中心條目和服務本身。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 slop-chop,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
[Try it at slop-chop.com] [Latest release] [ci status] [test coverage] [Go reference]
slop-chop
AI writing leaves fingerprints.
[slop-chop turning padded AI prose back into the Inigo Montoya line]
Chop the slop. Paste in text and get back something that reads like a person wrote it.
Try it without installing anything: slop-chop.com runs the same engine in your browser.
AI writing has patterns. It loves em-dashes, drops a semicolon into every other sentence,
reaches for words like comprehensive and leverage, and clears its throat with
openers like "In summary" or "Giving it to you honestly."
slop-chop removes those patterns in a single pass. You can also hand it your own list of things to cut, so the result reads like you instead of a chatbot.
Why
Cleaning this up by hand is tedious. Asking a model to "stop using em-dashes" works for about three sentences before it forgets. slop-chop applies the same cleanup rules every time.
How it works
There are two passes, and you can run either one on its own.
The first is a rules pass. It is fast and deterministic. It swaps characters, drops words you have flagged, rewrites stock phrases and words, runs your own patterns, fixes spelling to one dialect, and tidies the punctuation, with no model, no cost, and the same output on every run. It knows markdown, so fenced code blocks and inline backtick spans come through untouched.
The second is an optional rewrite pass that hands the text to a model for the things rules cannot manage, like reworking a sentence so it no longer needs a semicolon, or nudging the writing toward a voice you picked.
Install
Homebrew:
With Go:
Or clone and use the Makefile:
Run make with no target for the full list (build, test, cover, lint, fmt, tidy, clean).
Does it work?
Three measurements, all reproducible from this repository. docs/BENCHMARK.md has the method and the caveats.
It stays quiet on human writing. Scored against 886 open-source READMEs across seven
language ecosystems, most from projects with no push since 2021, seven reach the line where
text stops reading clean. That is 0.8 percent, and it is the line the GitHub Action fails on
by default. slop-chop check is stricter. It fails a file on any single tell that carries
weight, and 41.5 percent of the same READMEs use at least one.
Word lists lose to a thesaurus. slop-chop attack swaps text to dodge the rules without
improving it, and 33 of 74 word tells slip past. Only 1 of 90 structural tells does, which
is why a sentence shape counts double in the score. That number bounds the attacker rather
than the rules: a swap never rebuilds a sentence, so it was never going to reach a shape.
How those rules fare against a model told to rewrite is unmeasured.
The test that would settle it has not been run. Nobody has yet checked whether the score ranks text the way human readers do. The rating protocol and the harness are in evaldata/. Until that runs, the claim stays narrow: same input, same output, and the patterns the rules know get caught every time.
Usage
check --json prints a {"findings": [...]} object to stdout. fix --json returns
{"cleaned": "...", "findings": [...], "remaining": [...], "score": {...}, "scoreAfter": {...}}.
Each finding carries the rule, the matched text, the suggested replacement, and a line and
column. A finding with a replacement was rewritten, and one without was only flagged.
remaining is what check reports on the cleaned text, the tells no rule can rewrite for
you. Without --json, fix prints one line on stderr saying what it rewrote, what it left
for you, and how the score moved.
Modes
checkflags what it finds and exits non-zero when a finding carries score weight. Cleanups with no weight are listed without failing. Pass--strictto fail on any finding. Drop it in CI. Add--whyand every finding carries a plain-words line saying what fired and what happens to it, the same explanations the web app shows on a tap.fixwrites the cleaned text to stdout and leaves your file alone. Pass-wto change the file in place instead.scoremeasures how densely the text carries the patterns your profile lists, 0 to 100. It is a lint result, not a reading on who wrote the text, and it cannot be turned into one: the same patterns appear in writing people produce on purpose. Under 25 reads clean, 25 to 54 is mixed, and 55 and up is dense with tells, the same bands the web app shows.score --by-paragraphscores each paragraph on its own, which is how a document with two generated paragraphs buried in a thousand human words shows where they are, and--maxthen gates on the hottest paragraph instead of the diluted whole.
Source code gets its own treatment. On a .go, .py, .ts, or any other code file,
check and score read only the comments, plus the docstrings in a Python file, so a
buzzword in a comment is flagged at its real line and column while identifiers, strings, and
formatting alignment draw nothing.
fix refuses to rewrite code files outright, since prose cleanups break code. Pipe a
file through stdin to read it as plain text on purpose, or add --as .go to read stdin as
a source file of that type and scan only its comments, which is how an editor checks an
unsaved buffer. Comments nested inside a function are scanned like any other. Data files
with no comments, like .json and .csv, are skipped with a note.
Score
score gives a single number from 0 to 100 for how densely the text carries the patterns
the active profile lists. Change the profile and the same prose scores differently, which
is the clearest statement of what the number is: compliance with a named ruleset. A
structural tell counts double toward the density, because a stock sentence shape survives
a thesaurus where a listed word does not.
The engine ships with a labeled corpus of AI, human, and technical passages under
sanitize/testdata/, and TestBenchmark measures recall, precision, and the score margin
against it on every run, so a change that weakens detection fails the build instead of
going unnoticed. docs/BENCHMARK.md shows the numbers, the corpus
composition, what fires on what, and the limits of what the score claims. The score is a
lint result, not an authorship verdict.
--max turns it into a gate, so a document over the bar fails a build the same way check
does.
Every score names the scoring version that produced it. The version rises on any release that can move the score of unchanged text, and docs/SCORING.md lists what moved, so a gate set on one version keeps its meaning until the number changes. A test in the repo fails when the benchmark corpus scores differently without a bump.
Structural tells
Word swaps catch the vocabulary of AI writing. The rules pass also flags 61 structural
tells that a word list misses: the it's not just X, it's Y cadence and its contracted
isn't a perk. It's an expectation twin, the let's dive in opener, here's the thing
throat-clearing, the The best part? fragment reveal, here are five ways enumeration,
runs of bold-label bullets and numbered items, emoji-decorated headings, and the spaced
hyphen models reach for now that the em-dash is a known tell. It also catches the register
of a chat reply rather than a piece of writing: let me break this down, you might be wondering, here's where it gets interesting, happy coding!, and the say goodbye to X and Enter Foo, the tool that moves of generated marketing copy. These are flagged, not
rewritten, since the fix depends on the whole sentence and is left to the rewrite pass. Add
your own with the flagPatterns field in a profile.
Every tell that becomes famous gets trained out of the next model and the writing moves somewhere else, so the default profile tracks what models write now rather than what they wrote in 2023.
Use it in CI
Add a workflow that fails a pull request when a file scores above 25 on the slop score. Every finding is still listed in the run log, so the whitespace and punctuation tidy-ups show up without failing the build:
Set max to move the line, or max: 100 to turn the score gate off. Set strict: "true" to
fail on any single finding, the way slop-chop check --strict does on the command line. The
default line sits where ordinary human writing almost never lands: 0.8 percent of the 886
READMEs in the benchmark score 25 or more.
The action builds the engine from the tag you name, so the tag pins the engine and its
scoring version together. A newer tag can score the same file differently when its scoring
version is higher. Set scoring-version to the version your gate was tuned against and the
job fails, with a pointer to docs/SCORING.md, the day a tag bump changes
it, instead of quietly moving your gate.
A finding that is right for your repo has two exits. Silence one line with a directive, in
Markdown or in a code comment, or stop flagging a word everywhere with the allow list in
a .slop-chop.json at the repo root, which the action picks up on its own:
slop-chop-ignore alone silences the line it sits on. docs/PROFILE.md
has the rest.
Or have it fix the files and push the cleanup back to the pull request branch:
The fix-and-commit workflow pushes back to the pull request branch, so it works for pull
requests from a branch in the same repository. A pull request from a fork gets a read-only
token, so the push fails with a 403 no matter the permissions block. For fork pull requests
use the check workflow above: it needs no write access and still fails the run on slop. To
auto-fix your own branches, run the same fix-and-commit job on a push trigger instead.
To see findings as code scanning alerts, on the pull request diff and in the Security tab,
set sarif to a path and upload the log it writes:
The upload runs even when the score gate fails the job, so the alerts land on the pull request
that caused them. Findings that count toward the score are warnings and the rest are
notes. None are errors, so by default the alerts never fail the pull request check and the
score stays the gate. Code scanning uploads are free on public repositories, and private ones
need GitHub Code Security. A pull request from a fork gets a read-only token, so the upload
fails there. On the command line, slop-chop check --sarif writes the same log to stdout for
any number of files.
To hold the pull request title and body to the same line, set pull-request: "true". Run it
as its own workflow with the edited type, so a title or description edit checks again
without rerunning the rest of your CI:
The title and body are checked as one text, the title on line 1 and the body from line 3,
under the same max and strict as files. The text comes from the event, so the check
needs no token and works on pull requests from forks. A rerun reads the text as it was when
the run started, so after an edit the edited run is the one that counts. The if skips
Dependabot and Renovate, whose bodies carry upstream release notes, and the checkout lets
the repo's .slop-chop.json apply. Add files to check files in the same step, or set
pull-request-title and pull-request-body to check other text from a workflow on another
trigger. Code blocks and HTML comments are skipped, so a pull request template does not
count against the author. To silence one line, the author puts a comment GitHub does not
render above it: <!-- slop-chop-ignore-next-line -->.
The Action installs Go with actions/setup-go@v7, which runs on Node 24. A self-hosted runner
needs version 2.327.1 or newer. The setup step also sets GOTOOLCHAIN=local for the rest of
the job, so later go commands in that job use the installed Go instead of downloading one.
Use it as a Claude Code plugin
The loop above is the point: the agent drafts, the engine judges deterministically, the findings go back, and the rewrite is verified rather than trusted. slop-chop ships a Claude Code plugin, so the assistant can run the tool for you. The repo is its own marketplace. Add the marketplace, then install the plugin from it:
The slop-chop@slop-chop name is plugin@marketplace: the plugin named slop-chop, from the
marketplace named slop-chop.
The plugin drives the slop-chop binary rather than replacing it, so install the binary and
put it on your PATH first:
The plugin then gives Claude two ways to reach the tool:
The rules pass is free. The rewrite pass needs a key and stays off unless you ask for it, so say when you want the deeper clean, and name a backend if you want a local, keyless one:
docs/PLUGIN.md is the full plugin guide, including troubleshooting.
Profiles and presets
A profile is a JSON file that lists what to cut and what to put in its place: characters,
phrases, words, regular expressions, a blacklist, and a few switches. Point the tool at one
with --profile, or drop a .slop-chop.json in the repo and it gets picked up on its
own from any directory under it. With neither, a built-in default runs.
Presets are curated packs you overlay with --preset. The built-in packs are cleaver,
plain, corporate, academic, marketing, no-dashes, typography, and procedure. cleaver
is the strongest cut: the default profile only flags buzzwords like leverage and
robust, and cleaver rewrites them to plain words, which is what the web app ships
switched on. --preset plain
turns corporate phrasing into plain English on top of whatever profile you already have,
and the others target the stock phrasing of their own worlds. The last two set dash
policy: no-dashes converts every dash posing as an em-dash to a comma, and typography
keeps typeset dashes, curly quotes, and ellipses for text where they are deliberate.
procedure is for instructions: it flags a sentence over 20 words in a list item and over
25 words elsewhere, and like a cleanup it carries no score weight, so add --strict to fail
on it. Overlay more than one with a comma: --preset corporate,plain.
docs/PROFILE.md is the full reference: every field, the presets, the spelling dialects, the allow list, and the inline ignore directives.
Attack it
attack tries to beat your own rules. It rewrites text to dodge as many as it can while
leaving it no better written, then reports which tells held.
Buzzwords fall to a thesaurus: 33 of 74 word tells slip past. Only 1 of 90 structural tells gets through, since a swap never rebuilds a sentence, so that row measures how far the attacker reaches and not how durable a shape is. After the attack 67 of the 71 passages still carry a tell, and the mean score falls only from 83 to 78. A structural tell counts double in the score for that reason.
Run it on your own profile to find which rules a thesaurus can defeat. -w saves the
evasive rewrites as a corpus. docs/BENCHMARK.md has the full table
and the limits of what it proves.
Your voice
voice is the personal layer: keep protects your words from every rule and preset,
prefer swaps a word for the one you would have used, and avoid flags your own
crutches. slop-chop voice diff draft.md final.md reads what you changed between a draft
and the version you shipped and proposes entries from your edits, which is the one voice
signal a model cannot feed back to you.
slop-chop voice fingerprint posts/*.md measures the part nobody quotes: sentence
rhythm, punctuation habits, and register, as numbers. slop-chop voice drift draft.md
then names every trait where a text stopped sounding like you, and --bands 2 turns that
into a CI gate on a house voice. Drift is not slop, so nothing is rewritten and no score
moves. docs/VOICE.md has all of it.
Rewrite pass (optional)
The rules pass is deterministic and free. For the work rules cannot do, like reworking a
sentence so it no longer needs a semicolon or bending the text toward your voice, add
--rewrite. It runs the rules first, then hands the result to a model. It needs
ANTHROPIC_API_KEY and costs money, so it stays off by default.
The reply is checked before you get it. The rules run over it again, its code blocks and
load-bearing tokens are compared against your input, and --verify adds a model pass that
flags a change in meaning. ENGINE.md covers the rewrite and its checks in
full.
Backends
The rewrite pass defaults to Anthropic, but --provider openai points it at any
OpenAI-compatible Chat Completions API using OPENAI_API_KEY. With --base-url you can
aim that at a local server, so the rewrite runs on your own machine with no key and no cost.
Using a different vendor to rewrite than the one that wrote the draft is a good idea, since a model is bad at spotting its own tics.
Use it as a Go library
The engine is a public package, so a Go program can chop text in process, with no binary to shell out to and nothing sent anywhere. Add it:
Build a sanitizer once from a profile and reuse it. Fix returns the cleaned text and the
tells it found, Check reports the tells without changing the text, and Score rates it from
0 to 100 by how densely the profile's patterns appear.
Overlay a built-in preset with sanitize.ApplyPresets, enforce a spelling dialect through the
profile's Dialect field, or fold in a personal sanitize.Voice with profile.WithVoice. The
optional model rewrite lives in github.com/dcadolph/slop-chop/rewrite. The full reference is
on pkg.go.dev.
Everywhere else
The same engine runs on many surfaces. All local and free unless noted.
Docs
Status
Still early, but the core is in place. The rules pass is built and working. The rewrite
pass is built too and sits behind the --rewrite flag, because it needs an API key and
costs money, so the free, predictable rules pass stays the default. The live rewrite path
has a key-gated integration test, kept out of the default build so it never spends money by
accident. Run it against the real API with an API key:
License
MIT. See LICENSE.
來源:README.md,提交 1fefcbe
工具
0版本歷史
17- v0.55.1最新Nov 3, 2026
- v0.55.0Oct 26, 2026
- v0.54.1Oct 21, 2026
- v0.54.0Oct 20, 2026
- v0.53.0Oct 20, 2026
- v0.51.0Oct 19, 2026
- v0.50.0Oct 19, 2026
- v0.49.0Oct 18, 2026
- v0.48.0Oct 14, 2026
- v0.47.0Oct 14, 2026
- v0.45.1Oct 14, 2026
- v0.45.0Oct 13, 2026
- v0.44.0Oct 9, 2026
- v0.43.0Oct 5, 2026
- v0.42.1Oct 1, 2026
- v0.41.0Sep 22, 2026
- v0.40.0Sep 21, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分