zero-slop 2.5.8 → 2.7.0

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.
@@ -337,3 +337,56 @@ example that motivated it.
337
337
  penalty. Six community tells added, `--explain` and `--json --gate` repaired,
338
338
  `--dna` added, a ReDoS and two quadratics removed, and user prose stopped
339
339
  reaching git-tracked files.
340
+ - 2026-08-26 — v2.5.9 incumbent audit. Added three precision-scoped shared
341
+ patterns from `conorbronsdon/avoid-ai-writing@40328bd`: noun-anchored
342
+ lingering-attention framing, generic social endorsement closers, and
343
+ asterisked chat-roleplay actions. Literal return-to-an-idea clauses with a
344
+ reason, ordinary instructional verbs, and ordinary italics stay silent.
345
+ Expanded the existing AI-tool residue rule to cover tracker parameters from
346
+ Claude, Copilot, Gemini, Perplexity, and Grok. Added mixed-script and
347
+ zero-width normalization, exact protection for
348
+ code/front matter/blockquotes/tables/inline identifiers/paths/heading levels,
349
+ and a weak long-form low-word-variety check. The latter was the only new
350
+ stylometric feature to clear the incumbent's 1,654-paragraph corpus with
351
+ useful lift (20/779 machine paragraphs, 1/875 human; 22.46x). Function-word
352
+ entropy, punctuation uniformity, and cross-paragraph rhythm were tested but
353
+ did not fire on the 38-item editorial panel; they remain unshipped. Frozen
354
+ editorial metrics were unchanged, 12/12 known-human files stayed below the
355
+ gate, and the adversarial fixtures moved from missed to caught.
356
+ - 2026-08-26 — v2.5.10 unmarked-antithesis gap. A 209-word draft with four
357
+ antithesis pairs, one per paragraph, scored 13.0/100 "clear" with zero flagged
358
+ phrases. Root cause: all 17 `contrast` patterns were anchored on a literal
359
+ negation token (`not`, `n't`, `never`, `won't`), so the same figure with no
360
+ marker was unreachable, and the pairs' short-then-long cadence *raised*
361
+ burstiness from 0.332 to 0.527 — the tell paid off the channel built to catch
362
+ machine cadence, the failure mode already documented for broetry. Added three
363
+ patterns and widened one: `isocolon-ditransitive` (a give-you frame whose verb
364
+ repeats across a sentence break), `this-is-what-looks-like`,
365
+ `no-x-had-to`, and eight nouns on `performed-candor` so "Here's the detail
366
+ that matters" is caught. The draft moved 13.0 → 59.0.
367
+ `isocolon-ditransitive` is the first pattern to reach a figure rather than a
368
+ phrase; its safety property is that the backreference sits on the **verb**,
369
+ which anaphora never repeats ("dedicate / consecrate / hallow"). Three
370
+ frame-level loosenings were measured firing on `gettysburg.txt`,
371
+ `federalist.txt`, and `esl-engineer-email.txt` and were rejected;
372
+ `Detector.test_isocolon_rule_turns_on_verb_identity` pins that. All 114 frozen
373
+ document scores were unchanged, 18/18 known-human controls stayed below the
374
+ gate, and blind-panel accuracy held at 0.8421. These are the file's first
375
+ patterns to carry `hints`, which left throughput higher than the baseline.
376
+ `judgment/verdict-arithmetic.txt` graduated to `mechanical/` — the first span
377
+ to move from "no regex gates this safely" to caught. Bare subject swap
378
+ ("Llama is open-weights. Dolma releases the data.") stays unreachable and was
379
+ added as `judgment/bare-subject-swap.txt`; SKILL.md now makes the
380
+ performed-register pass mandatory and gives it a reported count, because a
381
+ clean scorer had been licensing the assistant to skip it entirely.
382
+
383
+ - 2026-08-26 — incumbent completeness follow-up. Added four narrowly bounded
384
+ phrase families found in `conorbronsdon/avoid-ai-writing@40328bd`: leaked
385
+ reasoning narration, unsupported novelty formulas, generic emotional
386
+ reactions, and answer-restatement loops. Each rule names the full formula;
387
+ ordinary step-by-step instructions, literal staffing statements, explained
388
+ surprise, and direct answers remain silent. The accompanying AI review now
389
+ checks six context-dependent problems that are unsafe to infer from a phrase
390
+ alone: paragraph-order dependence, unsupported novelty, self-labelled
391
+ significance, moral-adjective category errors, recap-flattery, and
392
+ wall-of-text replies.
package/data/learned.json CHANGED
@@ -120,6 +120,76 @@
120
120
  "first_seen": "2026-08-04",
121
121
  "last_confirmed": "2026-08-04",
122
122
  "source": "community-taxonomy"
123
+ },
124
+ {
125
+ "name": "lingering-attention",
126
+ "cat": "performed",
127
+ "rx": "\\b(?:the|that|this)\\s+(?:one\\s+)?(?:line|quote|bit|part|idea|point|framing|comment|thing|phrase)\\s+(?:that\\s+)?i\\s+keep\\s+(?:coming\\s+back\\s+to|thinking\\s+about)\\b|\\bi\\s+can(?:'|’)?t\\s+stop\\s+thinking\\s+about\\b|\\b(?:has|have|had|been|be)\\s+(?:been\\s+)?rattling\\s+around\\s+(?:in\\s+)?my\\s+(?:head|brain)\\b|\\bi(?:'|’)?ve\\s+been\\s+chewing\\s+on\\s+(?:this|that)\\b",
128
+ "hints": ["i keep", "i can't", "i can’t", "rattling", "been chewing"],
129
+ "w": 3.5,
130
+ "first_seen": "2026-08-26",
131
+ "last_confirmed": "2026-08-26",
132
+ "source": "conorbronsdon/avoid-ai-writing@40328bd"
133
+ },
134
+ {
135
+ "name": "social-endorsement-closer",
136
+ "cat": "linkedin",
137
+ "rx": "\\bthis\\s+one(?:'|’)?s?\\s+(?:is\\s+)?(?:well\\s+|really\\s+|definitely\\s+)?worth\\s+(?:your\\s+time|the\\s+read|a\\s+read|reading|watching|a\\s+listen|a\\s+watch|a\\s+look)\\b|\\bdo\\s+yourself\\s+a\\s+favou?r\\s+and\\s+(?:read|watch|check\\s+out)\\s+(?:this|it)\\b|\\byou\\s+(?:really\\s+)?(?:won(?:'|’)?t|do(?:n(?:'|’)?t|\\s+not)|will\\s+not)\\s+want\\s+to\\s+miss\\s+this(?:\\s+one)?\\s*(?:[:.!?]|$)|\\bdo(?:n(?:'|’)?t|\\s+not)\\s+sleep\\s+on\\s+this(?:\\s+one)?\\b",
138
+ "hints": ["worth", "favor", "favour", "miss this", "sleep on"],
139
+ "w": 4,
140
+ "first_seen": "2026-08-26",
141
+ "last_confirmed": "2026-08-26",
142
+ "source": "conorbronsdon/avoid-ai-writing@40328bd"
143
+ },
144
+ {
145
+ "name": "chat-roleplay-action",
146
+ "cat": "artifact",
147
+ "rx": "(?:^|[^*])\\*(?:nods?|sighs?|laughs?|smiles?|frowns?|shrugs?|grins?|winks?|chuckles?|gasps?|pauses?|thinks?|wonders?|whispers?|shouts?|gestures?|raises?|leans?|turns?|looks?|glances?|smirks?|blinks?|nodding|sighing|laughing|smiling|thinking|gesturing)\\b[^*\\n]{0,70}\\*(?:$|[^*])",
148
+ "hints": ["*"],
149
+ "w": 8,
150
+ "first_seen": "2026-08-26",
151
+ "last_confirmed": "2026-08-26",
152
+ "source": "conorbronsdon/avoid-ai-writing@40328bd"
153
+ },
154
+ {
155
+ "name": "reasoning-artifact",
156
+ "cat": "artifact",
157
+ "rx": "\\b(?:let me think (?:this through|step by step)|here(?:'|’)s my thought process|working through this logically|to approach this systematically)\\b",
158
+ "hints": ["let me think", "thought process", "working through", "approach this systematically"],
159
+ "w": 6,
160
+ "first_seen": "2026-08-26",
161
+ "last_confirmed": "2026-08-26",
162
+ "source": "conorbronsdon/avoid-ai-writing@40328bd"
163
+ },
164
+ {
165
+ "name": "novelty-inflation",
166
+ "cat": "rhetorical",
167
+ "rx": "\\b(?:the (?:failure mode|problem|insight) nobody(?:'|’)?s? (?:is )?(?:naming|talking about)|what nobody tells you|the insight everyone(?:'|’)?s? missing)\\b",
168
+ "hints": ["nobody", "everyone"],
169
+ "w": 4,
170
+ "first_seen": "2026-08-26",
171
+ "last_confirmed": "2026-08-26",
172
+ "source": "conorbronsdon/avoid-ai-writing@40328bd"
173
+ },
174
+ {
175
+ "name": "emotional-flatline",
176
+ "cat": "performed",
177
+ "rx": "\\b(?:what surprised me most|i was fascinated to (?:discover|learn)|what struck me was|i was excited to learn|the most interesting part)\\b",
178
+ "hints": ["surprised", "fascinated", "struck me", "excited", "interesting"],
179
+ "w": 3,
180
+ "first_seen": "2026-08-26",
181
+ "last_confirmed": "2026-08-26",
182
+ "source": "conorbronsdon/avoid-ai-writing@40328bd"
183
+ },
184
+ {
185
+ "name": "acknowledgment-loop",
186
+ "cat": "artifact",
187
+ "rx": "\\b(?:to answer your question|you(?:'|’)re asking (?:about|whether)|the question of whether)\\b",
188
+ "hints": ["answer your question", "asking", "question of whether"],
189
+ "w": 3,
190
+ "first_seen": "2026-08-26",
191
+ "last_confirmed": "2026-08-26",
192
+ "source": "conorbronsdon/avoid-ai-writing@40328bd"
123
193
  }
124
194
  ],
125
195
  "lexicon": {
@@ -157,7 +157,7 @@
157
157
  {
158
158
  "name": "performed-candor",
159
159
  "cat": "performed",
160
- "rx": "\\b(?:let(?:(?:'|\u2019)s| us) be (?:honest|real|clear)|here(?:(?:'|\u2019)s| is) the (?:thing|truth|kicker|deal|catch)|i(?:'|\u2019)ll be honest|the (?:uncomfortable|hard) truth is|truth be told|no fluff|real talk|not gonna lie|if i(?:'|\u2019)m being honest|let me be (?:crystal |perfectly )?clear)\\b",
160
+ "rx": "\\b(?:let(?:(?:'|\u2019)s| us) be (?:honest|real|clear)|here(?:(?:'|\u2019)s| is) the (?:thing|truth|kicker|deal|catch|detail|part|wrinkle|nuance|upshot|punchline|rub)|i(?:'|\u2019)ll be honest|the (?:uncomfortable|hard) truth is|truth be told|no fluff|real talk|not gonna lie|if i(?:'|\u2019)m being honest|let me be (?:crystal |perfectly )?clear)\\b",
161
161
  "w": 4,
162
162
  "first_seen": "2026-08-03",
163
163
  "last_confirmed": "2026-08-15"
@@ -523,6 +523,33 @@
523
523
  "first_seen": "2026-08-14",
524
524
  "last_confirmed": "2026-08-14"
525
525
  },
526
+ {
527
+ "name": "isocolon-ditransitive",
528
+ "cat": "contrast",
529
+ "rx": "\\b(let|give|hand|show|tell|offer|teach|buy|cost|earn|save|bring|send|win)s? you\\b[^.!?]{0,70}[.!?]\\s+[^.!?]{0,70}\\b\\1s? you\\b",
530
+ "hints": ["you"],
531
+ "w": 4.5,
532
+ "first_seen": "2026-08-26",
533
+ "last_confirmed": "2026-08-26"
534
+ },
535
+ {
536
+ "name": "this-is-what-looks-like",
537
+ "cat": "contrast",
538
+ "rx": "(?:^|[.!?]\\s+|\\n)(?:this|that) is what [\\w '\u2019-]{2,40} looks like\\b",
539
+ "hints": ["looks like"],
540
+ "w": 4,
541
+ "first_seen": "2026-08-26",
542
+ "last_confirmed": "2026-08-26"
543
+ },
544
+ {
545
+ "name": "no-x-had-to",
546
+ "cat": "contrast",
547
+ "rx": "(?:^|[.!?]\\s+|\\n)No [\\w '\u2019-]{2,40} (?:had to|needed to|has to|ever) [\\w '\u2019-]{2,60}\\.\\s+[\\w '\u2019-]{2,40} (?:did|made|chose|decided|built|released|shipped|published)\\b",
548
+ "hints": ["had to", "needed to", "has to", "ever"],
549
+ "w": 4,
550
+ "first_seen": "2026-08-26",
551
+ "last_confirmed": "2026-08-26"
552
+ },
526
553
  {
527
554
  "name": "not-the-but-the",
528
555
  "cat": "contrast",
@@ -1709,7 +1736,7 @@
1709
1736
  {
1710
1737
  "name": "chatgpt-artifact",
1711
1738
  "cat": "artifact",
1712
- "rx": "\\boaicite\\b|\\boai_citation\\b|\\bciteturn\\d|\\butm_source=(?:chatgpt(?:\\.com)?|openai)\\b|:contentReference\\[|\\battributableIndex\\b|\\[cite: ?\\d|\\bturn\\d+(?:search|news|image|view)\\d+\\b|\\[span_\\d|\\(start_span\\)|\\bgrok_(?:card|render)|\\bppl-ai-file-upload\\b|\\battached_file\\b",
1739
+ "rx": "\\boaicite\\b|\\boai_citation\\b|\\bciteturn\\d|\\butm_source=(?:chatgpt(?:\\.com)?|openai(?:\\.com)?|copilot(?:\\.com)?|claude\\.ai|perplexity\\.ai|gemini\\.google\\.com)\\b|\\breferrer=grok\\.com\\b|:?contentReference\\[(?:oaicite:)?|\\battributableIndex\\b|\\[cite: ?\\d|\\bturn\\d+(?:search|news|image|view)\\d+\\b|\\[span_\\d|\\(start_span\\)|\\bgrok_(?:card|render)|\\bppl-ai-file-upload\\b|\\battached_file\\b",
1713
1740
  "w": 10,
1714
1741
  "first_seen": "2026-08-14",
1715
1742
  "last_confirmed": "2026-08-22"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zero-slop",
3
- "version": "2.5.8",
3
+ "version": "2.7.0",
4
4
  "description": "An Agent Skill that scores AI-sounding prose 0-100 locally and rewrites it without losing a fact. Runs inside Claude Code, Codex, Cursor, Warp, Zed and other SKILL.md agents. Offline, zero dependencies, MIT.",
5
5
  "keywords": [
6
6
  "agent-skill",
@@ -69,7 +69,7 @@ known voice signals, and immutable facts when available. Then use this brief:
69
69
  > terse note only for unresolved ambiguities or unusual forms deliberately kept.
70
70
 
71
71
  Apply the corrected version to the deliverable, then send that exact artifact
72
- through the final read-aloud pass in `references/readalong.md`. Verify the
72
+ through the read-aloud pass in `references/readalong.md`. Verify the
73
73
  artifact returned by the read-aloud editor:
74
74
 
75
75
  1. Rerun the heuristic surface scorer and scripted fidelity check.
@@ -77,11 +77,13 @@ artifact returned by the read-aloud editor:
77
77
  claims, qualifiers, intended voice, regional spelling, format, and non-prose
78
78
  structure. The script cannot detect every semantic or stylistic change.
79
79
  3. If any check or comparison requires a repair, apply it, send the repaired
80
- text through the copy desk and final read-aloud pass again, and repeat all
80
+ text through the copy desk and read-aloud pass again, and repeat all
81
81
  final checks.
82
82
 
83
- Stop only when the same artifact clears the copy desk, final read-aloud pass,
84
- semantic and format review, scorer, and fidelity check. Limit this repair loop to
83
+ After verification, send that exact text through the finalizer in
84
+ `references/fresh-eyes.md`. Stop only when the same artifact clears the copy desk,
85
+ read-aloud pass, semantic and format review, scorer, fidelity check, and receives a
86
+ no-change fresh-eyes approval. Limit this repair loop to
85
87
  three rounds. If an issue still cannot be resolved without guessing, return the best
86
88
  source-preserving version that completed both editorial passes, flag the unresolved
87
89
  span and failed check plainly, and do not describe the fallback as fully verified.
@@ -0,0 +1,250 @@
1
+ # Zero Slop eval
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.
5
+
6
+ Any fail sends the text back through the copy desk and read-aloud pass, after which
7
+ every check here runs again on the new text. Limit that loop to three rounds.
8
+
9
+ **This file exists because the meter cannot see most of what is on it.** The scorer
10
+ reads the lexically anchored subset: listed phrases, sentence-length variance,
11
+ readability, formatting density. Everything in section A is a property of the whole
12
+ document rather than of any span, so no pattern can reach it. A clear score is a
13
+ reason to work through section A carefully, never permission to skip it.
14
+
15
+ The ratchet: every miss an audit, a competitor, or a reader catches becomes a
16
+ deterministic detector or a `data/corpus/must-flag/` fixture in the same change.
17
+ A note is not a fix; `register.py --recall` proves each recorded miss still
18
+ gets caught, and the release suite runs it.
19
+
20
+ Families here are drawn from the Zero Slop tell catalogue, from Wikipedia's
21
+ [Signs of AI writing](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing)
22
+ maintained by WikiProject AI Cleanup, and from the checks in petergyang/no-ai-slop
23
+ and blader/humanizer. Every check that needs one carries a worked before and after,
24
+ because an abstract instruction gets a partial answer.
25
+
26
+ Roles 7 and 8 own this file. Role 8 answers section F. A role that generated text
27
+ never grades that text.
28
+
29
+ Scoring this file is meaningless: it quotes tells as examples, so the meter flags its
30
+ own catalogue. That is the documented exception for material quoted as an example, and
31
+ it is a good candidate for `data/corpus/must-not-flag/`.
32
+
33
+ ## A. Register, which the meter cannot reach
34
+
35
+ Run every item on every draft, including one that scored clear. Record the counts in
36
+ the report even when they are zero.
37
+
38
+ 1. **Antithesis pairs. Count: ___** Two balanced statements where the second lands a
39
+ twist. Count all four shapes, and note that most carry no negation marker at all:
40
+ marked ("Not perfect. Honest."), bare subject swap ("Llama is open-weights. Dolma
41
+ releases the data."), isocolon with the arguments swapped, and unmarked reversal.
42
+ Budget is one per piece. Two is a finding. Three or more under 500 words means the
43
+ register failed whatever the score said.
44
+ 2. **Binary contrast, the subtractive form. Count per 1,000 words: ___** The
45
+ corrective appositive: "X, not Y." "A rather than B." Each instance is usually
46
+ good, careful writing, which is why the meter has no rule for it. The defect is
47
+ density. Above roughly 4 per 1,000 words, the document has one rhetorical move
48
+ instead of a voice.
49
+ 3. **Significance scaffolding. Count: ___** A sentence announcing that a point
50
+ matters instead of delivering it. Budget is zero.
51
+ 4. **Negative definition.** Does the draft repeatedly say what a thing is not before
52
+ saying what it is? One is a useful disambiguation, a habit is a tic. Stacked
53
+ negation counts: "No file monitoring, no browser hooks, no reaching into where you
54
+ publish" becomes "Zero Slop reads only what you hand it."
55
+ 5. **Comma-series density. Count per 1,000 words: ___** Enumerations of three or more
56
+ noun phrases. Technical writing legitimately enumerates, so this is a reading
57
+ judgment rather than a threshold: are the lists carrying information, or has the
58
+ sentence shape become the default? Convert the longest to real lists.
59
+ 6. **Robotic symmetry.** Repeated sentence shapes, identical paragraph geometry, stacked
60
+ punchy fragments, uniform paragraph length. Check table columns too: seven of eight
61
+ cells opening with a verb and a comma list of abstract nouns is the same defect
62
+ inside a grid.
63
+ 7. **Colon reveals.** A noun phrase, a colon, then a lowercase dramatic payoff.
64
+ Colons are for lists, labels, and quotations.
65
+ 8. **Throat-clearing openers.** "Here's the thing." "Let me be clear." "To be
66
+ honest." Cut and state the point.
67
+ 9. **Faux-insight setups.** "What most people get wrong." "The part everyone misses."
68
+ These flatter the writer as sole expert. Make the claim stand alone.
69
+ 10. **Rhetorical setups.** "What if I told you." "Think about it:" Self-answered
70
+ question and answer pairs.
71
+ 11. **Fake-profound kickers.** Delete the closing aphorism rather than rewriting it
72
+ into a better metaphor. End on the clearest concrete sentence already present.
73
+ 12. **Summary-recap endings.** The reader was just there.
74
+ 13. **Theatrical framing and extended conceit. Count: ___** An ordinary process
75
+ dressed as a courtroom, a heist, or a diagnosis. Budget is one metaphor.
76
+ 14. **Superficial analysis.** Trailing participial clauses that pretend to explain
77
+ significance: highlighting, underscoring, reflecting, showcasing.
78
+ 15. **Importance puffery.** "Marks a pivotal moment." "Stands as a testament." State
79
+ the fact and let the reader weigh it.
80
+ 16. **Interpretive metadiscourse.** Lines that step outside the subject to tell the
81
+ reader what to notice or how much weight to give it.
82
+ 17. **Weasel attribution.** "Studies show." "Experts agree." Name the source, or flag
83
+ it for the writer. Never invent one.
84
+ 18. **Adjective inflation and hollow intensifiers.** "a real improvement", "actual
85
+ results", "a genuine breakthrough", "true value". Delete the adjective; the noun
86
+ carries the claim or it does not. Distinct from empty adverbs (next): adverbs pad
87
+ the verb, these inflate a noun, and a span that is neither belongs to importance
88
+ puffery. Measured by the meter; the reading pass owns only the shapes the noun
89
+ list misses.
90
+ 19. **Empty adverbs and filler frames.** Adverbs: "just", "simply", "actually",
91
+ "literally", "honestly", "fundamentally", "inherently", "inevitably". Frames:
92
+ "the reality is", "the truth is", "in terms of", "with regard to", "going
93
+ forward", "in this article". Cut each one that adds nothing; keep the ones
94
+ carrying real emphasis, uncertainty, contrast, or the writer's spoken rhythm.
95
+ Distinct from adjective inflation (previous): these modify verbs and clauses.
96
+ The meter does not flag these globally because they are ordinary in honest
97
+ writing, so this is a judgment per instance. "just", "simply", "actually", "literally",
98
+ "honestly", "fundamentally", "inherently", "inevitably". Cut each one that adds
99
+ nothing; keep the ones carrying real emphasis, uncertainty, contrast, or the
100
+ writer's spoken rhythm. This is a judgment per instance, which is why the meter
101
+ does not flag these words globally: they are ordinary in honest writing.
102
+ 20. **Nominalization and weak verb phrases.** "Made a decision" for "decided",
103
+ "needs removal from" for "you cut from". De-nominalize, and prefer a direct verb
104
+ with an actor.
105
+ 21. **Fake-strong verbs.** Prefer "is" and "has" where they are clearer.
106
+ "The app serves as a centralized hub for sponsor management" becomes "The app
107
+ tracks sponsors, drafts, due dates and approvals in one place." Monument verbs
108
+ count too: "stands on", "sits atop", "marks a".
109
+ 22. **Reasoning-chain artifacts.** Working-out left in the answer: "Let me think
110
+ through this", "First I'll consider", a restated plan before the plan. The reader
111
+ wants the conclusion, not the deliberation.
112
+ 23. **Emotional flatline.** Uniform affect across a piece that should vary. Nothing
113
+ irritates the writer, nothing surprises them, nothing costs anything. Real writing
114
+ has range.
115
+ 24. **False concession.** "While X has merit, Y" where X was never a live position
116
+ and nothing follows from conceding it. Keep a real counterargument; cut a straw one.
117
+ 25. **Confidence-calibration phrases.** "I'm fairly confident", "with high certainty",
118
+ "to be clear, this is my read". Calibrated hedges are fine when they carry real
119
+ uncertainty; these announce a posture instead.
120
+ 26. **Parenthetical hedging.** Qualifiers tucked in brackets so the sentence can claim
121
+ more than it supports: "The fix works (in most cases) for every driver."
122
+ 27. **Engagement hooks and endorsement closers.** "You won't believe", "Sound
123
+ familiar?", "Give it a try and let me know", "Trusted by teams everywhere".
124
+ Infomercial register, wherever it appears.
125
+ 28. **Lingering-attention claims.** "This will stay with you", "you'll be thinking
126
+ about this for weeks". The writer cannot know the reader's future.
127
+ 29. **Generic positive endings.** A closing paragraph that resolves into optimism
128
+ without a concrete next step: "The future looks bright for teams willing to adapt."
129
+ 30. **Synonym cycling.** If the clear word is right, repeat it. Do not rotate terms
130
+ for style. "The agent reviews the draft. The assistant scores the piece. The tool
131
+ suggests fixes" becomes "The agent reviews the draft, scores it, and suggests
132
+ fixes." Check every referent, not the first one you notice: a role table is where
133
+ a second and third name usually appear.
134
+
135
+ ## B. Substance
136
+
137
+ 31. **Removal test.** Does every paragraph lose something real when deleted?
138
+ 32. **Relevance test.** Does every paragraph serve the brief, audience, and argument?
139
+ 33. **Front-loading, applied selectively.** Conclusions arrive early where that helps
140
+ the reader, without forcing every section into the same point-then-detail shape.
141
+ 34. **Paragraph-order dependence.** Could several prose paragraphs be shuffled without
142
+ harming the argument? Reference material, FAQs, and independent findings are
143
+ exempt.
144
+ 35. **Unsupported novelty.** "Nobody is naming this" needs an actual comparison.
145
+ 36. **Self-labeling significance.** "This matters" needs a consequence.
146
+ 37. **Moral-adjective category error.** Calling a technical choice brave or honest
147
+ needs a moral agent.
148
+ 38. **Portability test.** Could any sentence move unchanged to another company,
149
+ product, or person? Cut it or make it specific.
150
+ 39. **Statistics cohesion.** Does each test or dataset get its own paragraph opening
151
+ with what it checks in plain words, before the numbers?
152
+ 40. **Cross-references resolve.** Every named artefact, panel, dataset, or prior
153
+ result is defined on first use or linked to where it lives. "The prior 84.2%
154
+ result on the 38-item editorial panel" tells a reader nothing if neither the
155
+ panel nor the packet is named anywhere.
156
+ 41. **Internal pointers name their target.** "In the references", "see the docs",
157
+ "as documented elsewhere" point at nothing. Name the file and the section, and
158
+ link it, the way an external citation would be named.
159
+ 42. **Numeric precision matches the measurement.** Five significant figures on a
160
+ single run of a single machine claims a stability the method cannot support.
161
+ Round to what the measurement earns, or state the spread.
162
+ 43. **Hollow spans flagged, not filled.** Prose that makes no claim was flagged for
163
+ the writer rather than reworded into something that sounds like one.
164
+ 44. **Sycophantic tone.** Generic validation of the reader that carries no content:
165
+ "Great question", "Excellent point", "You're absolutely right". It echoes nothing
166
+ back, it only rewards. Cut it and start with the answer.
167
+ 45. **Recap-flattery.** An opener that echoes the reader's *own work* back at them
168
+ dressed as gratitude, ahead of the point: "Thanks for all the legwork here, the
169
+ migration script and the rollback plan you worked through are what made this
170
+ possible." They already know what they did. A real thank-you is one clause and
171
+ moves on: "Thanks for the legwork, this looks right, one comment below."
172
+ 46. **Acknowledgment loops.** Restating the question or the prior section before
173
+ answering it. This echoes the *context*, where recap-flattery echoes their *work*
174
+ and sycophancy echoes *nothing*. Ask what is being echoed; that is what separates
175
+ these three.
176
+ 47. **Wall-of-text reply.** Paragraphing that hides a sequence the reader needs. A
177
+ long narrative paragraph is not a wall of text merely because it is long; the tell
178
+ is a buried list of steps or options.
179
+
180
+ ## C. Fidelity
181
+
182
+ 48. **Scripted check run, not eyeballed.** `slopscore.py --fidelity` exits zero.
183
+ 49. **No invented specifics.** No number, name, anecdote, date, or source appeared
184
+ that the author did not supply.
185
+ 50. **No invented interior claims.** No stated feeling, motive, or experience the
186
+ author never wrote.
187
+ 51. **Qualifiers survive.** Hedges, scope limits, and caveats carry the same strength
188
+ as the source.
189
+ 52. **Claims not reframed.** Same names and numbers can still carry a changed
190
+ emphasis or implication. Compare meaning, not tokens.
191
+ 53. **Non-prose untouched.** Code, front matter, tables, blockquotes, identifiers,
192
+ paths, and heading hierarchy intact.
193
+
194
+ ## D. Voice and readability
195
+
196
+ 54. **Expert voice.** A respected practitioner sounds at home: precise terms used
197
+ correctly, authority earned through specifics, no hedging into mush.
198
+ 55. **Followability.** A smart first-time reader follows each sentence on the first
199
+ pass. One idea per sentence; every abstraction anchored in the same breath; never
200
+ three or more abstract noun phrases stacked.
201
+ 56. **Voice preserved.** Would the writer recognize this as theirs? Distinctive
202
+ vocabulary, cadence, bluntness, humor, uncertainty, and digressions survived.
203
+ 57. **Strong sentences left alone.** Nothing was rewritten merely for consistency.
204
+ 58. **Active voice with human subjects.** People do the verbs. Passive stays only
205
+ where the actor is unknown, irrelevant, deliberately withheld, or native to the
206
+ genre.
207
+ 59. **Proportional cutting.** No compression that stripped character. Density is
208
+ information per word, not fewer words.
209
+ 60. **Read aloud.** Would this sound natural read to a sharp colleague?
210
+ 61. **No over-correction.** AI slop was not traded for edgy slop: forced hot takes,
211
+ fake first person, performed candor, staccato drama.
212
+
213
+ ## E. Form
214
+
215
+ 62. **Returned in the format it arrived in.** A .docx comes back a .docx.
216
+ 63. **Reader language.** No evaluator or harness vocabulary leaked into the copy:
217
+ candidate, artifact, overlay, gate, scorecard, burstiness.
218
+ 64. **Formatting slop.** No emoji headings, decorative bold, or bullets that should be
219
+ prose. Count the headings over one or two sentences: four consecutive H3s each
220
+ wrapping a code block and one line is a section that wants to be one section.
221
+ 65. **Em dashes.** None in short copy. One or two in a long draft only where they
222
+ clearly beat a comma, period, or parenthesis.
223
+ 66. **Hyphenated modifier stacking.** "AI-powered cloud-native data-driven platform".
224
+ Two stacked compound modifiers in one noun phrase is a tell; keep the hyphens
225
+ grammar requires and cut the rest.
226
+ 67. **List-label periods and bare-noun bullets.** Bullets that are fragments ending in
227
+ full stops, or a list of bare noun phrases with no predicate. Either make them
228
+ sentences or make them a real list.
229
+ 68. **Numbered-list inflation.** A numbered list where order carries no meaning, or a
230
+ list padded to a round number. Use a bulleted list, or prose.
231
+ 69. **Chatbot artifacts.** Citation markup leaks, "Regenerate response", tool URL
232
+ parameters such as utm_source, and any assistant scaffolding left in the copy.
233
+ 70. **Attribution accurate.** The report names who did what without guessing which
234
+ model is running, and never implies a Zero Slop service read the draft.
235
+
236
+ ## F. Process integrity
237
+
238
+ Role 8 answers this section. It is the check no single-agent eval can make.
239
+
240
+ 71. **Roles stayed separate.** The copy desk, read-aloud pass, verification, and
241
+ fresh-eyes review each ran as a distinct pass.
242
+ 72. **No self-certification.** No role graded text it generated.
243
+ 73. **Counts reported.** Every count in section A appears in the summary, including
244
+ the zeros.
245
+ 74. **The exact final text cleared every check.** Not an earlier draft, not a version
246
+ that was repaired afterward.
247
+ 75. **Role 8 approved without changes.** If it changed anything, roles 5 through 8
248
+ ran again on the revision.
249
+ 76. **Fallbacks named honestly.** If the three-round limit was reached, the report
250
+ says which check failed and does not describe the result as fully verified.
@@ -47,6 +47,28 @@ not a deception.
47
47
  8. **Affect skew.** LLM text is joy-skewed and uniformly positive
48
48
  (Muñoz-Ortiz). Counter: widen affect.
49
49
 
50
+ ## Incumbent audit: what transferred and what did not
51
+
52
+ Zero Slop v2.5.9 audited
53
+ [`conorbronsdon/avoid-ai-writing`](https://github.com/conorbronsdon/avoid-ai-writing)
54
+ at commit `40328bd292bc682d46010a6f9ac2cdbf4fb4ceca`. The ideas that survived
55
+ transfer tests were zero-width and mixed-script normalization, exact protection
56
+ for structured document spans, broader AI-tool tracker residue, three narrowly
57
+ defined phrase families, and one conservative long-form word-variety signal.
58
+ On the incumbent's pinned 875-human/779-machine
59
+ paragraph corpus, its low-TTR signal fired on 1 human and 20 machine paragraphs
60
+ (22.46x lift). Zero Slop keeps it weak and corroboration-dependent.
61
+
62
+ Function-word entropy, punctuation-distribution uniformity, and cross-paragraph
63
+ rhythm were also tested. None fired on Zero Slop's 38 consensus-labelled
64
+ editorial passages; on the Beemo paired set they were rare and only directional
65
+ proxies because Beemo labels provenance and editing history, not slop quality.
66
+ They were not promoted. The incumbent's hand-shaped class probabilities were
67
+ also rejected: its documentation correctly says they are not calibrated against
68
+ a labelled corpus, and its own composite reports paragraph ROC-AUC 0.501 and
69
+ document ROC-AUC 0.623. Zero Slop does not turn an uncalibrated writing score
70
+ into an authorship probability.
71
+
50
72
  ## Why the scorer measures features, not detector verdicts
51
73
 
52
74
  Detectors are brittle: RAID (2405.07940) shows trivial perturbations fool
@@ -0,0 +1,62 @@
1
+ # The fresh-eyes finalizer
2
+
3
+ This is the last role in the editing workflow. It receives the exact text that
4
+ already cleared the copy desk, read-aloud editor, and verifier. Its job is to read
5
+ that text as a first-time reader and catch the small but consequential problems an
6
+ editor can stop seeing after repeated passes.
7
+
8
+ Use a new, role-isolated editor when the harness supports agents or subagents.
9
+ Otherwise start a separate pass with no drafting or scoring mindset. Do not ask the
10
+ rewriter to approve its own work.
11
+
12
+ ## What to check
13
+
14
+ - **The whole arc.** The opening sets up the real point, sections arrive in a useful
15
+ order, and the ending resolves rather than repeats the piece.
16
+ - **First-use clarity.** Names, pronouns, abbreviations, references, and transitions
17
+ make sense when encountered, without knowledge from the editing process.
18
+ - **Reader effort.** A smart first-time reader can follow the argument once through.
19
+ Unpack only a genuine stumble; do not dilute expert language the audience needs.
20
+ - **Voice continuity.** The same person seems to have written the beginning, middle,
21
+ and end. Restore source-backed warmth or texture lost to over-editing.
22
+ - **Residual process language.** Remove internal labels, scoring talk, evaluation
23
+ jargon, or comments meant for the editor rather than the reader.
24
+ - **Genre and format.** The text looks and sounds native to its destination. Preserve
25
+ all legitimate lists, tables, code, headings, citations, links, and layout.
26
+ - **Last-mile polish.** Correct a safe leftover repetition, vague handoff, awkward
27
+ phrase, or mechanical inconsistency that survived the earlier passes.
28
+
29
+ ## Boundaries
30
+
31
+ Preserve every fact, claim, qualifier, name, number, date, link, quotation, source,
32
+ voice signal, regional spelling choice, and protected non-prose element. Do not add
33
+ examples, experiences, certainty, novelty, emotion, or specificity. Do not make a
34
+ substantive rewrite. If the intended correction is uncertain, leave the text alone
35
+ and name the ambiguity.
36
+
37
+ ## Finalizer brief
38
+
39
+ > You are the fresh-eyes finalizer. Read the complete verified text as a first-time
40
+ > reader, from title to final line. Apply only safe last-mile polish for overall arc,
41
+ > first-use clarity, reader effort, voice continuity, genre fit, residual process
42
+ > language, repetition, and mechanical consistency. Preserve every fact, claim,
43
+ > qualifier, name, number, date, link, quotation, source, voice signal, regional
44
+ > spelling choice, and non-prose element. Do not add detail, certainty, emotion,
45
+ > novelty, or generic polish. Return the complete text in its original format,
46
+ > followed by exactly one status: `approve without changes`, `changed — rerun final
47
+ > checks`, or `unresolved — needs the writer`.
48
+
49
+ ## Closed finalization loop
50
+
51
+ Approval is valid only when the finalizer returns `approve without changes`. If it
52
+ changes even one character, apply the complete revision and rerun, in order:
53
+
54
+ 1. the copy desk;
55
+ 2. the read-aloud editor;
56
+ 3. the verifier, including local and contextual checks; and
57
+ 4. this fresh-eyes finalizer.
58
+
59
+ Repeat for at most three rounds. The same exact text must clear all four roles, with
60
+ the fresh-eyes finalizer approving it unchanged. If the remaining issue cannot be
61
+ fixed without guessing, return the best source-preserving text that completed every
62
+ pass, identify the unresolved span, and do not describe it as fully verified.
@@ -56,6 +56,11 @@ experience — these alone are NOT evidence of AI:
56
56
  Require corroboration. A paragraph needs multiple independent tells, or a failed
57
57
  removal test, before it's slop.
58
58
 
59
+ This governs lexical flags only. It does not apply to the performed-register
60
+ family: register is a property of the piece, not of a paragraph. Four unmarked
61
+ antithesis pairs across four paragraphs *is* the corroboration — each one is
62
+ locally defensible, and the repetition is the whole finding.
63
+
59
64
  ## Signs of human writing — preserve on sight
60
65
 
61
66
  When a draft shows these, protect them through the rewrite; deleting them is
@@ -6,8 +6,8 @@ listener hears it: from the first line to the last, with each sentence setting u
6
6
  next. A stumble, cold transition, unclear antecedent, or change of voice can still
7
7
  survive a clean score and correct grammar.
8
8
 
9
- Run this pass on every deliverable after the copy desk. It is the last editorial pass
10
- before final verification and the Report step. Use a dedicated editor with fresh eyes
9
+ Run this pass on every deliverable after the copy desk. It is the spoken-flow pass
10
+ before verification and the separate fresh-eyes finalizer. Use a dedicated editor with fresh ears
11
11
  when the harness supports subagents; otherwise perform a separate, role-isolated pass.
12
12
  The editor must fix the actual deliverable and return the corrected artifact in the
13
13
  same format. An audit or list of suggestions is not a completed pass.
@@ -21,17 +21,33 @@ safe correction for:
21
21
  endings that make a reader stop or back up.
22
22
  - **Cold transitions.** Add or repair the hinge when a sentence, paragraph, or
23
23
  section arrives without a clear connection to what came before.
24
+ - **Paragraph-order dependence.** If adjacent prose paragraphs can trade places
25
+ without changing the argument, rebuild the progression. Do not impose a story
26
+ arc on FAQs, reference entries, independent findings, or genuine lists.
24
27
  - **Performed candor.** Remove announcements of honesty such as "honestly" or "to be
25
28
  fair" when the sentence can simply make its point.
26
29
  - **Reflexive agreement.** Remove automatic praise or agreement that appears before
27
30
  the substance has been checked. Let the facts determine whether the draft agrees,
28
31
  qualifies, or disagrees.
32
+ - **Recap-flattery.** In a reply, cut praise and a needless restatement of the
33
+ question before the answer. Keep setup that materially changes the answer.
34
+ - **Wall-of-text reply.** Break an answer where the reader must change task,
35
+ decision, time, or subject. Do not split a coherent narrative paragraph merely
36
+ to make it look lighter.
29
37
  - **Communicative drift.** Stop when fluent sentences no longer advance a clear
30
38
  point or reader need. Cut the passage, rebuild it around its purpose, or flag the
31
39
  missing intent rather than inventing one.
32
40
  - **Rhetorical scale mismatch.** Reduce grand reveals, lessons, or contrasts when
33
41
  the underlying point is too small or unsupported for the framing. Preserve a
34
42
  contrast that corrects a real, supported misconception.
43
+ - **Unsupported novelty.** Remove claims that nobody has noticed or named an idea
44
+ unless the source supplies a defensible comparison.
45
+ - **Self-labeling significance.** Replace an unsupported declaration that a point
46
+ is important with the consequence that makes it important.
47
+ - **Moral-adjective category error.** Do not call a system design, metric, or
48
+ technical choice brave, honest, ethical, or courageous when the sentence means
49
+ accurate, transparent, conservative, or reliable. Preserve a sourced moral
50
+ judgment about an actual agent or decision.
35
51
  - **Performed-writer register.** Flatten theatrical framing of ordinary work ("we
36
52
  hired an adversary"), epigram closers, staccato antithesis pairs ("Not perfect.
37
53
  Honest."), extended conceits (billing, courtroom, forensics, recipe), one-word
@@ -58,6 +74,8 @@ safe correction for:
58
74
  Do not merely flag these problems. Correct them directly wherever the intended
59
75
  meaning is certain.
60
76
 
77
+ For consistent reporting, use these names: paragraph-order dependence, unsupported novelty, self-labeling significance, moral-adjective category error, recap-flattery, and wall-of-text reply.
78
+
61
79
  ## Boundaries
62
80
 
63
81
  - Preserve every fact, claim, qualifier, number, name, date, link, and source.
@@ -103,7 +121,8 @@ Verify the exact artifact returned by the read-aloud editor:
103
121
  this read-aloud pass again, and repeat every final check.
104
122
 
105
123
  Stop only when the same artifact has cleared the copy desk, final read-aloud pass,
106
- semantic and format review, scorer, and fidelity check. Limit this repair loop to
124
+ semantic and format review, scorer, fidelity check, and the separate fresh-eyes
125
+ finalizer in `fresh-eyes.md`. Limit this repair loop to
107
126
  three rounds. If an issue still cannot be resolved without guessing, return the best
108
127
  source-preserving version that completed both editorial passes, state the unresolved
109
128
  span and failed check plainly, and do not describe the fallback as fully verified.