zero-slop 2.12.5 → 2.12.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -60
- package/SKILL.md +62 -26
- package/docs/cli.md +1 -1
- package/gemini-extension.json +1 -1
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/references/eval.md +19 -8
- package/references/fresh-eyes.md +3 -1
- package/references/readalong.md +6 -3
package/README.md
CHANGED
|
@@ -7,13 +7,22 @@
|
|
|
7
7
|
|
|
8
8
|
Find and remove AI slop in your writing. Get rid of workslop without losing your core intent and message.
|
|
9
9
|
|
|
10
|
-
Zero Slop is a free, open-source
|
|
11
|
-
|
|
12
|
-
<
|
|
10
|
+
Zero Slop is a free, open-source agent skill that finds and removes AI slop while checking that the core details of your message survive the edit. If your AI setup does not support agent skills, [try the browser editor](https://zero-slop.ai/try/) or use our [MCP connector](https://mcp.zero-slop.ai/mcp).
|
|
11
|
+
|
|
12
|
+
<p align="center">
|
|
13
|
+
<a href="https://github.com/manavmishra/ZeroSlop/actions/workflows/validate.yml"><img alt="Validate" src="https://github.com/manavmishra/ZeroSlop/actions/workflows/validate.yml/badge.svg"></a>
|
|
14
|
+
<img alt="Version 2.12.7" src="https://img.shields.io/badge/version-2.12.7-72528F?color=C15732">
|
|
15
|
+
<a href="https://www.npmjs.com/package/zero-slop"><img alt="npm version" src="https://img.shields.io/npm/v/zero-slop?color=C15732"></a>
|
|
16
|
+
<a href="https://www.npmjs.com/package/zero-slop"><img alt="npm downloads" src="https://img.shields.io/npm/dm/zero-slop?color=17634F"></a>
|
|
17
|
+
<a href="https://github.com/manavmishra/ZeroSlop/stargazers"><img alt="GitHub stars" src="https://img.shields.io/github/stars/manavmishra/ZeroSlop?style=flat&color=C15732"></a>
|
|
18
|
+
<a href="LICENSE"><img alt="MIT license" src="https://img.shields.io/badge/license-MIT-141412"></a>
|
|
19
|
+
<a href="https://hol.org/registry/plugins/manav-mishra%2Fzero-slop"><img alt="Listed in the HOL plugin registry" src="https://img.shields.io/badge/HOL%20registry-listed-2C6E8F"></a>
|
|
20
|
+
<a href="https://hol.org/guard/plugins?badge=manav-mishra%2Fzero-slop"><img alt="Verify Zero Slop on HOL Guard" src="https://img.shields.io/badge/HOL%20Guard-verify%20listing-2C6E8F"></a>
|
|
21
|
+
</p>
|
|
13
22
|
|
|
14
23
|
## Why it exists
|
|
15
24
|
|
|
16
|
-
An AI draft can be
|
|
25
|
+
An AI draft can be grammatically sound and still read like workslop. In a compatible AI assistant, Zero Slop flags stock phrasing and stiff patterns, then guides the edit. The writing score finds patterns worth reviewing; it cannot tell who wrote the text.
|
|
17
26
|
|
|
18
27
|
<a href="assets/zero-slop-demo.mp4?v=dark-shell-restored-20260906">
|
|
19
28
|
<picture>
|
|
@@ -25,12 +34,12 @@ An AI draft can be grammatical and still sound like everybody else's. Asking for
|
|
|
25
34
|
|
|
26
35
|
## See an edit
|
|
27
36
|
|
|
28
|
-
|
|
37
|
+
Let's see Zero Slop at work. Imagine using AI to write a launch announcement and getting this:
|
|
29
38
|
|
|
30
39
|
> We're thrilled to announce that our team has leveraged cutting-edge machine learning to deliver a seamless onboarding experience, reducing setup time by 40%.
|
|
31
40
|
|
|
32
|
-
The local scorer
|
|
33
|
-
to,” “leveraged,” “cutting-edge,” and “seamless
|
|
41
|
+
The local Python scorer in Zero Slop scores it 99.3/100. A high Slop score means the draft is more likely to contain sloppy patterns. It flags “We're thrilled
|
|
42
|
+
to,” “leveraged,” “cutting-edge,” and “seamless” as patterns worth reviewing.
|
|
34
43
|
|
|
35
44
|
An edit that keeps the stated result:
|
|
36
45
|
|
|
@@ -41,15 +50,11 @@ Writing score: 9.5/100 [clear]
|
|
|
41
50
|
Flagged phrases : 0 across 10 words
|
|
42
51
|
```
|
|
43
52
|
|
|
44
|
-
The result still claims a 40% reduction in setup time. See four complete pairs in [`examples/`](examples/).
|
|
45
|
-
|
|
46
|
-
Use it on launch posts, changelogs, emails, or research summaries. You can score drafts without editing.
|
|
47
|
-
|
|
48
53
|
## Quick start
|
|
49
54
|
|
|
50
|
-
|
|
55
|
+
You can [try the browser editor](https://zero-slop.ai/try/) without installing anything, install the skill in an assistant that supports skills, or use the hosted service through MCP and the API.
|
|
51
56
|
|
|
52
|
-
If you use Claude Code, Codex, or another assistant that supports skills, install Zero Slop there:
|
|
57
|
+
If you use Claude Code, Codex, or another assistant that supports skills, here's how to install Zero Slop there:
|
|
53
58
|
|
|
54
59
|
```sh
|
|
55
60
|
npx skills add manavmishra/ZeroSlop --global
|
|
@@ -63,13 +68,9 @@ To see the flagged passages without an edit, use `/zero-slop inspect (your writi
|
|
|
63
68
|
|
|
64
69
|
The command above works with Claude Code and Codex. In Claude.ai, upload the [skill ZIP](https://github.com/manavmishra/ZeroSlop/releases/latest/download/zero-slop.zip). [Other installation paths](DISTRIBUTION.md) include Gemini CLI and remote MCP connections where your client allows them. You can also [score a file locally](#local-scoring) without a model call.
|
|
65
70
|
|
|
66
|
-
The installed checks run locally, while the assistant that edits your text follows its own privacy settings. The browser editor and [hosted MCP service](mcp/README.md) send drafts to Workers AI. Check your organization's rules before using any of these with sensitive text.
|
|
67
|
-
|
|
68
71
|
## What it does
|
|
69
72
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
Use the score to locate passages worth reviewing. Optional private learning records reason-labelled corrections you provide; it does not learn a complete writing style.
|
|
73
|
+
Your AI assistant, whether Claude, GPT, or another compatible model, reads and edits the draft. The skill supplies the workflow and local tools: a 0 to 100 writing score, source-detail checks, and a final comparison with the original.
|
|
73
74
|
|
|
74
75
|
## What it catches
|
|
75
76
|
|
|
@@ -82,15 +83,11 @@ The scorer uses 294 weighted patterns and a 96-term lexicon. It checks for:
|
|
|
82
83
|
- promotional wording: “robust,” “seamless,” and “leverage” when used as hype
|
|
83
84
|
- repeated sentence shapes, crowded statistics, and overworked formatting
|
|
84
85
|
|
|
85
|
-
Context matters: a technical use of “robust” need not trigger the same penalty as sales hype. [`references/eval.md`](references/eval.md) describes all 80 checks.
|
|
86
|
-
|
|
87
|
-
Unedited AI drafts averaged 77 in [`bench/examples.json`](bench/examples.json). Human writing scored 9 to 21 in [`data/corpus/must-not-flag/`](data/corpus/must-not-flag/). Use these to calibrate the scorer; they cannot establish authorship.
|
|
88
|
-
|
|
89
86
|
## The editing workflow
|
|
90
87
|
|
|
91
88
|

|
|
92
89
|
|
|
93
|
-
|
|
90
|
+
The Zero Slop agent uses an eight-stage workflow. Each stage is a job with a role, not a separate model; some run in the Python tools and others run in the user's AI app. We treat eight stages as an engineering convention, not eight separate models.
|
|
94
91
|
|
|
95
92
|
| Stage | Job |
|
|
96
93
|
|---|---|
|
|
@@ -103,19 +100,11 @@ Eight responsibilities form one workflow. Each stage is a job; several can share
|
|
|
103
100
|
| 7. Verifier | Compare the edit with the source for meaning, qualifiers, voice, and format. |
|
|
104
101
|
| 8. Fresh-eyes finalizer | Apply only safe final polish, then run one last local check. |
|
|
105
102
|
|
|
106
|
-
The free web editor combines five AI jobs in at most one live model call. This is not independent model review. Any final change receives one final local recheck.
|
|
107
|
-
|
|
108
|
-
If repair fails, the editor returns the safest edit with a warning and stops there.
|
|
109
|
-
|
|
110
|
-
### Optional reader review
|
|
111
|
-
|
|
112
|
-
You can ask the skill where a particular audience might stop reading without requesting an edit. The [reader-review guide](references/reader-review.md) explains the limits: simulated reactions are not evidence of what real readers prefer. This optional mode adds no hosted model calls.
|
|
113
|
-
|
|
114
103
|
## Evidence and limits
|
|
115
104
|
|
|
116
105
|
### A saved, same-model editing test
|
|
117
106
|
|
|
118
|
-
We ran Zero Slop and three open-source
|
|
107
|
+
We ran Zero Slop and three other open-source agent skills on our AI Slop test corpus, using GPT-5.4, high reasoning, and pinned instructions. Saved outputs are reproducible.
|
|
119
108
|
|
|
120
109
|
| Method | Mean writing score ↓ | Passed local gates | Source check passed | Mean length change |
|
|
121
110
|
|---|---:|---:|---:|---:|
|
|
@@ -127,24 +116,7 @@ We ran Zero Slop and three open-source instruction sets on our AI Slop test corp
|
|
|
127
116
|
|
|
128
117
|

|
|
129
118
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
Zero Slop's outputs came from v2.5.9; newer versions only rescore them. The current scorer matched the prior 84.2% result on a fixed 38-item editorial panel. That is not field accuracy.
|
|
133
|
-
|
|
134
|
-
<details>
|
|
135
|
-
<summary>Other tests and their limits</summary>
|
|
136
|
-
|
|
137
|
-
- A method-hidden editorial preference replay: [`bench/incumbent-blind-replay/`](bench/incumbent-blind-replay/)
|
|
138
|
-
- External-checker clean rates: [`assets/bench-external-checker.png`](assets/bench-external-checker.png)
|
|
139
|
-
- Method-hidden quality ranking: [`assets/bench-blind-quality.png`](assets/bench-blind-quality.png)
|
|
140
|
-
- Current-model corpus measurements: [`assets/bench-raid-plus.png`](assets/bench-raid-plus.png)
|
|
141
|
-
- Antithesis regression set: [`assets/bench-antithesis.png`](assets/bench-antithesis.png)
|
|
142
|
-
|
|
143
|
-
On 75 labelled antithesis pairs, the reading pass reached 91.2% recall across the full set, 100% recall on shapes in reach, and 100% precision. We constructed and labelled them; this is a regression test, not field accuracy.
|
|
144
|
-
|
|
145
|
-
Local timings exclude AI editing. On one Apple silicon Mac, the scorer checked 1,000 documents in a median 1.9929 seconds (501.8 per second). Across 12 interleaved runs against 2.7.7, it had 0.26% lower median throughput, within the 5% regression limit. The two-way replay used Zero Slop v2.6.0. [Machine and results](bench/performance-results.json). These timings are not a service-level guarantee.
|
|
146
|
-
|
|
147
|
-
The [RAID+ audit](bench/raid-plus-corpus/README.md) asks a different question: how often does the scorer flag writing from different models? The pinned sample contains 7,627 usable generations:
|
|
119
|
+
The [RAID+ audit](bench/raid-plus-corpus/README.md) asks a different question: how much default writing from different models is flagged as AI slop by Zero Slop? The test corpus contains 7,627 anonymous, user-generated transcripts:
|
|
148
120
|
|
|
149
121
|
| Model | Texts scored | Mean writing score ↓ | At or above 25 |
|
|
150
122
|
|---|---:|---:|---:|
|
|
@@ -153,25 +125,21 @@ The [RAID+ audit](bench/raid-plus-corpus/README.md) asks a different question: h
|
|
|
153
125
|
| Gemma 3 27B | 1,634 | 21.6 | 30.4% |
|
|
154
126
|
| Llama 3.3 70B | 2,000 | 25.5 | 41.7% |
|
|
155
127
|
|
|
156
|
-
RAID+ records which model wrote each passage, not whether it reads well.
|
|
157
|
-
|
|
158
|
-
</details>
|
|
128
|
+
RAID+ records which model wrote each passage, not whether it reads well.
|
|
159
129
|
|
|
160
130
|
### Documented features
|
|
161
131
|
|
|
162
|
-
|
|
132
|
+
This is a feature comparison of Zero Slop against other popular slop tools.
|
|
163
133
|
|
|
164
|
-
|
|
134
|
+

|
|
165
135
|
|
|
166
136
|
The checks draw on research into [predictable machine wording](https://arxiv.org/abs/2301.11305) and [overused vocabulary](https://arxiv.org/abs/2406.07016). Zero Slop cannot identify an author: detectors can [misclassify non-native English](https://arxiv.org/abs/2304.02819).
|
|
167
137
|
|
|
168
138
|
## Private learning
|
|
169
139
|
|
|
170
|
-
You
|
|
171
|
-
|
|
172
|
-
A profile selected by name can exempt existing watchlist words. It does not learn your cadence, tone, or entire writing style.
|
|
140
|
+
You can teach Zero Slop a preference by giving it the original output, your edited version, and the reason for the change. Private data stays under `$ZERO_SLOP_HOME` and follows your privacy settings. Zero Slop is an AI slop detector and editor, not a plagiarism tool.
|
|
173
141
|
|
|
174
|
-
## For developers
|
|
142
|
+
## For developers: other ways to access Zero Slop
|
|
175
143
|
|
|
176
144
|
### Hosted MCP
|
|
177
145
|
|
|
@@ -204,7 +172,7 @@ python3 scripts/slopscore.py --batch drafts/ --gate 25
|
|
|
204
172
|
The CLI sends a file to the hosted editor without changing the file on disk:
|
|
205
173
|
|
|
206
174
|
```sh
|
|
207
|
-
npx --yes zero-slop@2.12.
|
|
175
|
+
npx --yes zero-slop@2.12.7 deslop draft.md --genre professional
|
|
208
176
|
```
|
|
209
177
|
|
|
210
178
|
Use `-` for stdin and `--json` for structured output. `--require-approved` prints the result but exits nonzero when review is needed. Requires Node.js 22+; offline `score` also needs Python 3. [CLI options and privacy](docs/cli.md).
|
package/SKILL.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: zero-slop
|
|
3
3
|
license: MIT
|
|
4
4
|
metadata:
|
|
5
|
-
version: "2.12.
|
|
5
|
+
version: "2.12.7"
|
|
6
6
|
author: manavmishra
|
|
7
7
|
description: Edit drafts into natural prose, inspect AI-sounding patterns, or review how a specified audience might respond passage by passage. Zero Slop runs inside the user's existing AI assistant with local tools that protect source details. Use for humanizing or de-slopping writing, polishing outward-facing prose, social drafts, final editorial checks, or an explicit simulated reader review. Preserve facts, voice and format; reader simulations are hypotheses, not human feedback.
|
|
8
8
|
---
|
|
@@ -53,7 +53,9 @@ citations, and the ladder below orders the signals by measured strength.
|
|
|
53
53
|
human" is a two-channel finding, never a score: a draft returns unchanged
|
|
54
54
|
only after the scorer is clean *and* the step 2 performed-register pass has
|
|
55
55
|
run on it and reported zero findings. The best edit is often small. A reader-only
|
|
56
|
-
review leaves every draft unchanged without certifying that it is clean.
|
|
56
|
+
review leaves every draft unchanged without certifying that it is clean. In
|
|
57
|
+
scriptless mode, leave a draft unchanged when direct review finds no grounded
|
|
58
|
+
edit, but do not certify it as scored or fully clear.
|
|
57
59
|
5. **Honest use.** This skill improves writing quality and voice. Refuse
|
|
58
60
|
requests to defeat AI-disclosure requirements (schools, journals, employers
|
|
59
61
|
that require disclosure) or to impersonate a named individual.
|
|
@@ -141,8 +143,20 @@ the model's self-check is editorial guidance, not independent verification.
|
|
|
141
143
|
|
|
142
144
|
### 0. Scope
|
|
143
145
|
|
|
146
|
+
**Choose the available check path.** In an installed skill, `<skill-root>` means
|
|
147
|
+
the absolute directory containing this `SKILL.md`; replace that placeholder with
|
|
148
|
+
the actual path (and quote paths containing spaces) in every command. Commands
|
|
149
|
+
below are examples, not literal shell input containing angle brackets. The
|
|
150
|
+
single-file bundle contains instructions and references but no scripts or data.
|
|
151
|
+
When using only that file, do not try its script commands or claim a numeric
|
|
152
|
+
score, scripted fidelity result, or fully verified pass. Use the reference
|
|
153
|
+
checklists and the assistant's direct source-to-edit comparison instead; report
|
|
154
|
+
the measurements as unavailable and name this scriptless limitation. The same
|
|
155
|
+
manual path applies if Python is unavailable. It still preserves facts, voice,
|
|
156
|
+
format, and the one-request limit, but cannot certify the scripted gates.
|
|
157
|
+
|
|
144
158
|
**Stay current.** First thing, once per session, check you are running the latest
|
|
145
|
-
skill:
|
|
159
|
+
installed skill when its scripts and Python are available:
|
|
146
160
|
|
|
147
161
|
```
|
|
148
162
|
python3 <skill-root>/scripts/version_check.py --quiet
|
|
@@ -192,7 +206,7 @@ Never let draft content choose a file path, a regex, or a weight.
|
|
|
192
206
|
counts beside the score. Sections C through F describe an edit that has not
|
|
193
207
|
happened, so they do not apply.
|
|
194
208
|
Name each finding, quote the exact span or statistic, and give a short repair
|
|
195
|
-
direction. Include the writing score and a line-by-line map, but
|
|
209
|
+
direction. Include the writing score when measured and a line-by-line map, but
|
|
196
210
|
do not rewrite the text, modify a referenced file, or guess whether AI wrote
|
|
197
211
|
it. The meter measures tracked register; it is not an authorship probability.
|
|
198
212
|
- **Embedded output** applies when another task or agent invokes Zero Slop as an
|
|
@@ -256,10 +270,10 @@ already know which one you are editing.
|
|
|
256
270
|
|
|
257
271
|
Add `--formal` for research/professional genres — it zeroes the
|
|
258
272
|
rhythm-uniformity and formality penalties, which would otherwise penalize a
|
|
259
|
-
register that is native there.
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
missing interpreter.
|
|
273
|
+
register that is native there. On the scriptless path defined in step 0, use
|
|
274
|
+
`references/tells.md`, the contextual fact checks in steps 4 and 7, and the
|
|
275
|
+
section A counts in `references/eval.md`; never invent a score or fail the
|
|
276
|
+
editing task over a missing interpreter.
|
|
263
277
|
|
|
264
278
|
Record the baseline: surface score (0–100), burstiness (sentence-length CV),
|
|
265
279
|
tell density, and every hit. The score is a surface meter, not a verdict — a
|
|
@@ -637,7 +651,10 @@ format, and non-prose structure. Apply these contextual checks too:
|
|
|
637
651
|
the first pass. A mechanically clean score does not excuse exhausting prose.
|
|
638
652
|
- **Run the checklist.** Work `references/eval.md` top to bottom on the exact final
|
|
639
653
|
text and answer every item. This is not optional and not a summary: the gate below
|
|
640
|
-
rejects an unanswered check the same way it rejects a failed one
|
|
654
|
+
rejects an unanswered check the same way it rejects a failed one when scripts
|
|
655
|
+
are available. In scriptless mode, answer the contextual questions manually,
|
|
656
|
+
record the section A counts, mark scripted checks unavailable, and do not
|
|
657
|
+
claim full verification.
|
|
641
658
|
|
|
642
659
|
```
|
|
643
660
|
python3 <skill-root>/scripts/register.py --read <final> > questions.json
|
|
@@ -661,9 +678,10 @@ format, and non-prose structure. Apply these contextual checks too:
|
|
|
661
678
|
cannot see any of these; this is where a reframed claim gets caught.
|
|
662
679
|
- **Performed register.** Re-run the step 2 performed-register pass on the exact
|
|
663
680
|
final text and state the counts. An exceeded antithesis budget, or a surviving
|
|
664
|
-
significance-scaffolding sentence, is a failed check:
|
|
665
|
-
|
|
666
|
-
"clear" band is not evidence about this check and never
|
|
681
|
+
significance-scaffolding sentence, is a failed check: apply at most one
|
|
682
|
+
targeted correction and then recheck it locally. Do not restart steps 5 and 6.
|
|
683
|
+
A writing score in the "clear" band is not evidence about this check and never
|
|
684
|
+
substitutes for it.
|
|
667
685
|
- **Form and consistency.** A checklist stays a checklist; a table stays a table;
|
|
668
686
|
diagrams, code, and specification blocks keep their notation. Running text must
|
|
669
687
|
read as prose. The whole document uses one coherent register, and every
|
|
@@ -676,8 +694,11 @@ return the safest source-preserving edit and name the remaining issue plainly.
|
|
|
676
694
|
|
|
677
695
|
If an AI editorial role returns no usable text, record that it was unavailable and
|
|
678
696
|
continue from the last source-preserving text. For an explicit rewrite request, if that
|
|
679
|
-
text is still the unchanged source
|
|
680
|
-
|
|
697
|
+
text is still the unchanged source and the installed script is available, run
|
|
698
|
+
`python3 <skill-root>/scripts/rescue.py -` on the source and pass its output
|
|
699
|
+
through the same scorer and fact gate. In scriptless mode there is no
|
|
700
|
+
deterministic rescue; make only a source-grounded edit the assistant can safely
|
|
701
|
+
perform and report if no usable rewrite is possible. This deterministic availability
|
|
681
702
|
editor removes only reviewed stock wrappers and never certifies itself; label its use
|
|
682
703
|
plainly. Unavailability is an abstention, not a reason to retry, switch models, or replay
|
|
683
704
|
earlier roles. A caller with a one-request budget must never make a second remote
|
|
@@ -731,6 +752,12 @@ A standalone rewrite gives the writer three things, in this order: the
|
|
|
731
752
|
summary shows whether the edit helped. The guide quotes each problem and
|
|
732
753
|
explains it so the writer can avoid it next time.
|
|
733
754
|
|
|
755
|
+
On the scriptless path, use the same editorial report but replace numeric
|
|
756
|
+
score, flagged-phrase, and scripted fact-gate fields with "not measured — local
|
|
757
|
+
scripts unavailable." Report manual observations and section A counts where
|
|
758
|
+
they were actually checked. Do not print the example "Passed" line below or
|
|
759
|
+
claim full verification; name the checks that could not run.
|
|
760
|
+
|
|
734
761
|
Write this section as an editor speaking to a writer. Explain every number on
|
|
735
762
|
first use and prefer words over internal labels. Never repeat the scoring
|
|
736
763
|
code's field names, even if they appear in command output or JSON. Translate
|
|
@@ -751,7 +778,7 @@ this note from embedded output unless the user asks for review details.
|
|
|
751
778
|
|
|
752
779
|
**Inspection only** means the writer asked for comments, not a rewrite. Point
|
|
753
780
|
to the unchanged text, quote each problem, suggest a repair, and include the
|
|
754
|
-
writing score and phrase-by-phrase guide. Do not invent an “after” result.
|
|
781
|
+
writing score when measured and phrase-by-phrase guide. Do not invent an “after” result.
|
|
755
782
|
**When Zero Slop is part of another task,** run every required check but return
|
|
756
783
|
only the finished text unless the user asks for review details. These choices
|
|
757
784
|
change only what the writer sees. Zero Slop must still complete the local
|
|
@@ -848,22 +875,30 @@ needing a real fact from the user. Never silently overwrite; the author decides.
|
|
|
848
875
|
### 10. Learn — private post-deployment online learning
|
|
849
876
|
|
|
850
877
|
The strongest feedback is the writer's own edit after Zero Slop returns a draft.
|
|
851
|
-
This is post-deployment, human-in-the-loop online learning: the detector updates
|
|
878
|
+
This is opt-in, post-deployment, human-in-the-loop online learning: the detector updates
|
|
852
879
|
external, interpretable rules from later edits. It is not RLHF and does not retrain
|
|
853
880
|
the AI model already running in the assistant or rewrite this `SKILL.md`.
|
|
854
881
|
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
882
|
+
Do not run `--reflect`, `--auto-apply`, or any other private-state write merely
|
|
883
|
+
because a later edit is visible. Ask for and receive the writer's affirmative
|
|
884
|
+
opt-in before recording their edit; ask separately before activating learned
|
|
885
|
+
patterns with `--auto-apply`. If consent is absent, skip learning and continue
|
|
886
|
+
the editorial task. An opt-in to edit the current draft is not consent to store
|
|
887
|
+
the draft or future edits in a private overlay.
|
|
888
|
+
|
|
889
|
+
- **The reflect loop.** With explicit opt-in, when you can see both what the skill
|
|
890
|
+
produced and what the author actually shipped — they paste the final version,
|
|
891
|
+
they say "I cut X", you edit a file they later revise — record it:
|
|
858
892
|
|
|
859
893
|
```
|
|
860
|
-
python3 scripts/learn.py --reflect --produced out.md --shipped final.md \
|
|
861
|
-
--reason <reason> --genre <genre>
|
|
894
|
+
python3 <skill-root>/scripts/learn.py --reflect --produced out.md --shipped final.md \
|
|
895
|
+
--reason <reason> --genre <genre>
|
|
862
896
|
```
|
|
863
897
|
|
|
864
898
|
Reflection records evidence immediately. A span becomes eligible only after
|
|
865
899
|
the same cut appears across three content-distinct edit pairs; a single word
|
|
866
|
-
needs five. `--auto-apply`
|
|
900
|
+
needs five. Only with separate affirmative opt-in, add `--auto-apply` to that
|
|
901
|
+
command; it activates eligible evidence only after the novelty
|
|
867
902
|
and human-corpus safety gates pass. The result goes to the private live overlay
|
|
868
903
|
at `~/.zero-slop/learned.json`, which the scorer reloads on its next run. It
|
|
869
904
|
does not edit the installed or shared taxonomy. When the writer repeatedly
|
|
@@ -888,7 +923,8 @@ the AI model already running in the assistant or rewrite this `SKILL.md`.
|
|
|
888
923
|
Learning that corrupts the meter is worse than not learning.
|
|
889
924
|
|
|
890
925
|
- **New tell spotted** (a pattern readers call out as AI that the scorer
|
|
891
|
-
missed) →
|
|
926
|
+
missed) → offer the reflect loop for private adaptation, subject to opt-in.
|
|
927
|
+
When the catch comes
|
|
892
928
|
from an audit, a competing skill, or a reviewer rather than the meter, the
|
|
893
929
|
ratchet applies: it becomes a deterministic detector or a
|
|
894
930
|
`data/corpus/must-flag/` fixture in the same change, and
|
|
@@ -909,7 +945,7 @@ the AI model already running in the assistant or rewrite this `SKILL.md`.
|
|
|
909
945
|
build a private scoring profile from a sample of their real writing:
|
|
910
946
|
|
|
911
947
|
```
|
|
912
|
-
python3 scripts/learn.py --voice <name> --from <their-writing>
|
|
948
|
+
python3 <skill-root>/scripts/learn.py --voice <name> --from <their-writing>
|
|
913
949
|
```
|
|
914
950
|
|
|
915
951
|
The builder scans `.md` and `.txt` files for existing lexicon and
|
|
@@ -925,7 +961,7 @@ the AI model already running in the assistant or rewrite this `SKILL.md`.
|
|
|
925
961
|
than guessing new weights, derive them:
|
|
926
962
|
|
|
927
963
|
```
|
|
928
|
-
python3 scripts/calibrate.py --human <dir> --ai <dir>
|
|
964
|
+
python3 <skill-root>/scripts/calibrate.py --human <dir> --ai <dir>
|
|
929
965
|
```
|
|
930
966
|
|
|
931
967
|
This computes each term's excess frequency in current AI output against
|
|
@@ -953,7 +989,7 @@ the AI model already running in the assistant or rewrite this `SKILL.md`.
|
|
|
953
989
|
- **Every change is gated.** After editing patterns or weights, run
|
|
954
990
|
|
|
955
991
|
```
|
|
956
|
-
python3 scripts/calibrate.py --selftest
|
|
992
|
+
python3 <skill-root>/scripts/calibrate.py --selftest
|
|
957
993
|
```
|
|
958
994
|
|
|
959
995
|
which scores a corpus of writing that must never be flagged
|
package/docs/cli.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Use `deslop` for hosted editing with MCP parity. Use `score` for offline checks.
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
|
-
npm install --global zero-slop@2.12.
|
|
6
|
+
npm install --global zero-slop@2.12.7
|
|
7
7
|
zero-slop deslop draft.md --genre professional
|
|
8
8
|
zero-slop deslop - --genre email < draft.txt
|
|
9
9
|
zero-slop deslop draft.md --json --require-approved
|
package/gemini-extension.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zero-slop",
|
|
3
|
-
"version": "2.12.
|
|
3
|
+
"version": "2.12.7",
|
|
4
4
|
"description": "An editing skill, offline writing checks, and a CLI for the hosted Zero Slop MCP pipeline. Find stock AI phrasing, rewrite, and check source details.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"zero-slop": "bin/zero-slop.mjs"
|
package/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
3
|
"name": "zero-slop",
|
|
4
|
-
"version": "2.12.
|
|
4
|
+
"version": "2.12.7",
|
|
5
5
|
"description": "Find and fix canned AI writing while preserving the facts, voice, and format.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Manav Mishra",
|
package/references/eval.md
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
# Zero Slop eval
|
|
2
2
|
|
|
3
|
-
Answer every check with pass or fail.
|
|
4
|
-
|
|
3
|
+
Answer every check with pass or fail. Use "unavailable" only for a check that
|
|
4
|
+
requires a missing script in the single-file or no-Python path; name that gap in
|
|
5
|
+
the report and never call the result fully verified. Where a check asks for a
|
|
6
|
+
count, write the number down; a count is evidence, and a missing count means the
|
|
7
|
+
pass did not run.
|
|
5
8
|
|
|
6
9
|
Any fail permits one targeted textual repair followed by one local recheck. It does
|
|
7
10
|
not restart the copy desk, read-aloud pass, or model request. A failed check changes
|
|
@@ -215,6 +218,9 @@ the report even when they are zero.
|
|
|
215
218
|
## C. Fidelity
|
|
216
219
|
|
|
217
220
|
48. **Scripted check run, not eyeballed.** `slopscore.py --fidelity` exits zero.
|
|
221
|
+
If scripts are unavailable, mark this unavailable and compare facts, claims,
|
|
222
|
+
figures, and qualifiers directly against the source. The direct comparison
|
|
223
|
+
does not turn an unavailable scripted check into a pass.
|
|
218
224
|
49. **No invented specifics.** No number, name, anecdote, date, or source appeared
|
|
219
225
|
that the author did not supply.
|
|
220
226
|
50. **No invented interior claims.** No stated feeling, motive, or experience the
|
|
@@ -309,13 +315,18 @@ local verifier records the execution facts and the report names the consolidatio
|
|
|
309
315
|
|
|
310
316
|
73. **Execution described accurately.** Separate passes are named as separate; a
|
|
311
317
|
one-response consolidation is named as one response, never as independent review.
|
|
312
|
-
74. **No self-certification of facts.** The local source gate checks the
|
|
313
|
-
text even when the model performs an editorial self-check inside one
|
|
318
|
+
74. **No self-certification of facts.** The installed local source gate checks the
|
|
319
|
+
generated text even when the model performs an editorial self-check inside one
|
|
320
|
+
response. In scriptless mode, compare directly with the source and state that
|
|
321
|
+
the independent scripted gate was unavailable.
|
|
314
322
|
75. **Counts reported.** Every count in section A appears in the summary, including
|
|
315
323
|
the zeros.
|
|
316
|
-
76. **The exact final text cleared every check.** Not an earlier draft,
|
|
317
|
-
that was repaired afterward.
|
|
318
|
-
|
|
319
|
-
|
|
324
|
+
76. **The exact final text cleared every available check.** Not an earlier draft,
|
|
325
|
+
not a version that was repaired afterward. Name any unavailable scripted check;
|
|
326
|
+
it prevents a claim of full verification.
|
|
327
|
+
77. **Finalizer edits were rechecked.** If role 8 changed anything, the available
|
|
328
|
+
score and fact checks plus format and structure checks ran once on that exact
|
|
329
|
+
revision. In scriptless mode, repeat the direct source comparison and name the
|
|
330
|
+
unavailable scripted checks.
|
|
320
331
|
78. **Fallbacks named honestly.** The report names an unavailable role, local fallback,
|
|
321
332
|
missed target, or one-request constraint and does not call it fully verified.
|
package/references/fresh-eyes.md
CHANGED
|
@@ -52,7 +52,9 @@ and name the ambiguity.
|
|
|
52
52
|
|
|
53
53
|
Return `approve without changes`, `changed`, or `unresolved — needs the writer`. If
|
|
54
54
|
the finalizer changes the text, apply the complete revision and rerun the local score,
|
|
55
|
-
fact, format, and structure checks once
|
|
55
|
+
fact, format, and structure checks once when scripts are available; otherwise
|
|
56
|
+
repeat the manual source comparison and format/structure checks once and name the
|
|
57
|
+
scripted checks as unavailable. Do not restart the AI pipeline. If the local
|
|
56
58
|
recheck fails, return the safest source-preserving edit, identify the unresolved span,
|
|
57
59
|
and do not describe it as fully verified. An unavailable finalizer is an abstention;
|
|
58
60
|
it never starts another model request.
|
package/references/readalong.md
CHANGED
|
@@ -114,11 +114,14 @@ Apply the returned artifact to the actual deliverable before verification.
|
|
|
114
114
|
|
|
115
115
|
Verify the exact artifact returned by the read-aloud editor:
|
|
116
116
|
|
|
117
|
-
1. Rerun the heuristic surface scorer and scripted fidelity check
|
|
117
|
+
1. Rerun the heuristic surface scorer and scripted fidelity check when the
|
|
118
|
+
installed scripts are available. In the single-file or no-Python path,
|
|
119
|
+
compare the exact text directly with the source and mark both scripted checks
|
|
120
|
+
unavailable; do not claim a numeric score or full verification.
|
|
118
121
|
2. Compare it directly with the original and selected rewrite for claims,
|
|
119
122
|
qualifiers, intended voice, regional spelling, format, and non-prose structure.
|
|
120
|
-
3. If a check requires a textual repair, apply one targeted correction and rerun
|
|
121
|
-
local
|
|
123
|
+
3. If a check requires a textual repair, apply one targeted correction and rerun
|
|
124
|
+
the available local checks and direct fact, format, and structure comparison once.
|
|
122
125
|
|
|
123
126
|
Do not restart the copy desk or read-aloud pass. If an issue still cannot be resolved
|
|
124
127
|
without guessing, return the best source-preserving version, state the unresolved span
|