zero-slop 2.12.6 → 2.12.8

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 CHANGED
@@ -7,9 +7,18 @@
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 agent skill that finds and removes AI slop while checking that the core details of your message survive the edit. If your ChatGPT setup does not support skills, [try the browser editor](https://zero-slop.ai/try/) without installing anything.
11
-
12
- <img alt="Version 2.12.6" src="https://img.shields.io/badge/version-2.12.6-72528F?color=C15732">
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.8" src="https://img.shields.io/badge/version-2.12.8-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
 
@@ -25,12 +34,12 @@ An AI draft can be grammatically sound and still read like workslop. In a compat
25
34
 
26
35
  ## See an edit
27
36
 
28
- Here is a short launch draft:
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 gives it 99.3/100. Lower is better. It flags “We're thrilled
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
- To try the browser editor, use a sample you are comfortable sending to a hosted service. Compare its edit with your original before you use it. The slash command below works only in an assistant where you have installed the skill.
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
- The installed skill ships no model. 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.
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
  ![Zero Slop's eight editorial responsibilities, private learning loop, and separate release review](assets/engine.svg)
92
89
 
93
- Eight responsibilities form one workflow. Each stage is a job; several can share a model. Research informed the checks. We chose eight stages as an engineering convention.
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 instruction sets on our AI Slop test corpus (18 samples), using GPT-5.4, high reasoning, and pinned instructions. Saved outputs are reproducible. The test partly uses Zero Slop's checks.
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
  ![Writing scores and local checks for a saved, same-model replay of the AI Slop test corpus; lower scores are better](assets/bench-search-rewrites.png)
129
118
 
130
- Zero Slop's saved rewrites cleared the listed checks. We have not shown that readers prefer them or that the result generalizes. Drafts, hashes, versions, prompts, and limitations are in [`bench/README.md`](bench/README.md).
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. The [Beemo paired-edit audit](bench/beemo-corpus/README.md) asks how scores change after human editing: raw responses averaged 30.2, expert edits 25.3, and human answers 20.0. Beemo has no writing-quality labels either.
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
- ![Documented capabilities at pinned repository versions](assets/competitor-capabilities.png)
132
+ This is a feature comparison of Zero Slop against other popular slop tools.
163
133
 
164
- The chart compares features documented at pinned commits. It does not measure how well any tool writes. See [`bench/README.md`](bench/README.md) for data and reproduction notes.
134
+ ![Documented capabilities at pinned repository versions](assets/competitor-capabilities.png)
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 decide whether to teach Zero Slop a preference. Give it an original output, your edited version, and the reason for the change. It does not watch your files, browser, or publishing tools. Private data stays under `$ZERO_SLOP_HOME`; it is not committed to this repository or used to retrain a model.
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.6 deslop draft.md --genre professional
175
+ npx --yes zero-slop@2.12.8 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.6"
5
+ version: "2.12.8"
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. If `python3` is unavailable in this
260
- environment, skip the scorer and use `references/tells.md`, the fact-gate checks
261
- in step 4, and the contextual checks in step 7 — never fail the task over a
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: the text returns through
665
- steps 5 and 6 exactly as a failed fidelity check would. A writing score in the
666
- "clear" band is not evidence about this check and never substitutes for it.
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, run `python3 scripts/rescue.py -` on the source and
680
- pass its output through the same scorer and fact gate. This deterministic availability
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
- - **The reflect loop.** Whenever you can see both what the skill produced and
856
- what the author actually shipped — they paste the final version, they say
857
- "I cut X", you edit a file they later revise — record it:
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> --auto-apply
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` activates eligible evidence only after the novelty
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) → use the reflect loop for private adaptation. When the catch comes
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
6
+ npm install --global zero-slop@2.12.8
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zero-slop",
3
- "version": "2.12.6",
3
+ "version": "2.12.8",
4
4
  "description": "Find and fix canned AI writing while preserving the facts, voice, and format.",
5
5
  "mcpServers": {
6
6
  "zero-slop": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zero-slop",
3
- "version": "2.12.6",
3
+ "version": "2.12.8",
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.6",
4
+ "version": "2.12.8",
5
5
  "description": "Find and fix canned AI writing while preserving the facts, voice, and format.",
6
6
  "author": {
7
7
  "name": "Manav Mishra",
@@ -1,7 +1,10 @@
1
1
  # Zero Slop eval
2
2
 
3
- Answer every check with pass or fail. Where a check asks for a count, write the
4
- number down; a count is evidence, and a missing count means the pass did not run.
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 generated
313
- text even when the model performs an editorial self-check inside one response.
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, not a version
317
- that was repaired afterward.
318
- 77. **Finalizer edits were rechecked locally.** If role 8 changed anything, the score,
319
- fact, format, and structure checks ran once on that exact revision.
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.
@@ -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. Do not restart the AI pipeline. If the local
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.
@@ -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 the
121
- local score, fact, format, and structure checks once.
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
package/scripts/rescue.py CHANGED
@@ -56,6 +56,10 @@ def rescue_text(text: str) -> str:
56
56
  r"[ \t]+([A-Za-z][A-Za-z0-9_-]*)",
57
57
  _without_wrapper, out, flags=re.IGNORECASE,
58
58
  )
59
+ out = re.sub(
60
+ r"(^|[.!?][ \t\r\n]+|\r?\n[ \t]*\r?\n[ \t]*)as we move forward,[ \t]+the team will\b",
61
+ lambda m: m.group(1) + "The team will", out, flags=re.IGNORECASE,
62
+ )
59
63
  rules: list[tuple[str, str | object]] = [
60
64
  (
61
65
  r"\bwe are thrilled to unveil ([^,\n]+),\s+a transformative release that "
@@ -70,6 +74,9 @@ def rescue_text(text: str) -> str:
70
74
  (r"\bour cutting[-\u2010\u2011 ]edge\b", "Our"),
71
75
  (r"\bhours of tedious manual configuration\b", "hours of manual configuration"),
72
76
  (r"\bwe have completely reimagined\b", "We rebuilt"),
77
+ (r"\bthis represents a significant milestone in our journey\.\s*", ""),
78
+ (r"\bwill leverage the proposal to make a decision\b", "will use the proposal to decide"),
79
+ (r"\ba groundbreaking update\b", "an update"),
73
80
  (r"\bwith robust error handling built in from the ground up\b",
74
81
  "with built-in error handling"),
75
82
  (r"\bwe believe these improvements will fundamentally transform how your team "