zero-slop 2.5.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/LICENSE +21 -0
- package/README.md +193 -0
- package/SKILL.md +803 -0
- package/data/corpus/community-register/README.md +14 -0
- package/data/corpus/community-register/judgment/communicative-drift.txt +1 -0
- package/data/corpus/community-register/judgment/reflexive-agreement.txt +1 -0
- package/data/corpus/community-register/judgment/rhetorical-scale-mismatch.txt +1 -0
- package/data/corpus/must-not-flag/README.md +49 -0
- package/data/corpus/must-not-flag/esl-engineer-email.txt +7 -0
- package/data/corpus/must-not-flag/exec-memo.txt +9 -0
- package/data/corpus/must-not-flag/federalist.txt +5 -0
- package/data/corpus/must-not-flag/gettysburg.txt +1 -0
- package/data/corpus/must-not-flag/grant-abstract.txt +5 -0
- package/data/corpus/must-not-flag/ml-methods.txt +1 -0
- package/data/corpus/must-not-flag/personal-essay.txt +1 -0
- package/data/corpus/must-not-flag/press-release.txt +7 -0
- package/data/corpus/must-not-flag/recipe.txt +11 -0
- package/data/corpus/must-not-flag/sre-runbook.txt +1 -0
- package/data/corpus/must-not-flag/technical-postmortem.txt +1 -0
- package/data/corpus/must-not-flag/terse-engineer-note.txt +1 -0
- package/data/corpus/must-not-flag-shape/README.md +22 -0
- package/data/corpus/must-not-flag-shape/aphorism-list.txt +9 -0
- package/data/corpus/must-not-flag-shape/changelog.txt +13 -0
- package/data/corpus/must-not-flag-shape/dialogue.txt +19 -0
- package/data/corpus/must-not-flag-shape/lyrics.txt +15 -0
- package/data/corpus/must-not-flag-shape/poem.txt +8 -0
- package/data/corpus/must-not-flag-shape/sms-transcript.txt +15 -0
- package/data/corpus/performed-register/README.md +38 -0
- package/data/corpus/performed-register/judgment/detection-fragile.txt +1 -0
- package/data/corpus/performed-register/judgment/draft-cheap-signal.txt +1 -0
- package/data/corpus/performed-register/judgment/ear-chiasmus.txt +1 -0
- package/data/corpus/performed-register/judgment/fight-against-tagline.txt +1 -0
- package/data/corpus/performed-register/judgment/fine-beat.txt +1 -0
- package/data/corpus/performed-register/judgment/glow-finishing.txt +1 -0
- package/data/corpus/performed-register/judgment/jargon-compression.txt +1 -0
- package/data/corpus/performed-register/judgment/not-perfect-honest.txt +1 -0
- package/data/corpus/performed-register/judgment/punctuation-convict.txt +1 -0
- package/data/corpus/performed-register/judgment/recipe-ingredients.txt +1 -0
- package/data/corpus/performed-register/judgment/replay-lands.txt +1 -0
- package/data/corpus/performed-register/judgment/rhymes-with.txt +1 -0
- package/data/corpus/performed-register/judgment/rhythm-prints.txt +1 -0
- package/data/corpus/performed-register/judgment/same-leak.txt +1 -0
- package/data/corpus/performed-register/judgment/tools-work.txt +1 -0
- package/data/corpus/performed-register/judgment/tuning-gradients.txt +1 -0
- package/data/corpus/performed-register/judgment/verdict-arithmetic.txt +1 -0
- package/data/corpus/performed-register/judgment/whole-product.txt +1 -0
- package/data/corpus/performed-register/judgment/words-cheap.txt +1 -0
- package/data/corpus/performed-register/mechanical/argue-with-artifact.txt +1 -0
- package/data/corpus/performed-register/mechanical/bill-lands.txt +1 -0
- package/data/corpus/performed-register/mechanical/billed-to-reader.txt +1 -0
- package/data/corpus/performed-register/mechanical/economics-brutal.txt +1 -0
- package/data/corpus/performed-register/mechanical/has-receipts.txt +1 -0
- package/data/corpus/performed-register/mechanical/hired-adversary.txt +1 -0
- package/data/corpus/performed-register/mechanical/hyperbole-universal.txt +1 -0
- package/data/corpus/performed-register/mechanical/metaphor-sender-name.txt +1 -0
- package/data/corpus/performed-register/mechanical/minding-own-business.txt +1 -0
- package/data/corpus/performed-register/mechanical/on-the-tin.txt +1 -0
- package/data/corpus/performed-register/mechanical/opens-the-hood.txt +1 -0
- package/data/corpus/performed-register/mechanical/turns-out-payoff.txt +1 -0
- package/data/corpus/performed-register/mechanical/vibe-check.txt +1 -0
- package/data/corpus/performed-register/mechanical/vibe-isnt-a-vibe.txt +1 -0
- package/data/corpus/performed-register/mechanical/vibe-number-attached.txt +1 -0
- package/data/corpus/performed-register/mechanical/where-slop-lives.txt +1 -0
- package/data/learned-log.md +339 -0
- package/data/learned.json +128 -0
- package/data/patterns.json +2298 -0
- package/package.json +54 -0
- package/references/copy-desk.md +87 -0
- package/references/evidence.md +382 -0
- package/references/overcorrection.md +77 -0
- package/references/platforms.md +102 -0
- package/references/readalong.md +118 -0
- package/references/rewrite-moves.md +177 -0
- package/references/tells.md +190 -0
- package/scripts/calibrate.py +274 -0
- package/scripts/learn.py +1588 -0
- package/scripts/predictability.py +227 -0
- package/scripts/rerank.py +150 -0
- package/scripts/safeio.py +146 -0
- package/scripts/slopscore.py +1352 -0
- package/scripts/version_check.py +104 -0
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
# Learned-tell log
|
|
2
|
+
|
|
3
|
+
- 2026-08-03 — Benchmark failure mode caught by a blind judge: one rewrite
|
|
4
|
+
(AWS-exam LinkedIn post) added an interior-experience claim ("by test day
|
|
5
|
+
the real thing felt familiar") absent from the source. Hard rule 1 in
|
|
6
|
+
SKILL.md now names experiential/interior claims as fabrication explicitly.
|
|
7
|
+
|
|
8
|
+
One line per change to `learned.json` or `patterns.json`: date, what, why,
|
|
9
|
+
example that motivated it.
|
|
10
|
+
|
|
11
|
+
- 2026-08-25 — v2.5.8. Added `generic-benefit-stack` (weight 1) after the
|
|
12
|
+
frozen quality panel exposed five passages whose product noun and multiple
|
|
13
|
+
interchangeable outcomes passed below the gate. The rule requires a
|
|
14
|
+
product or service, an offer/help verb, and two nearby generic outcomes;
|
|
15
|
+
a lone word cannot fire it. It moved five sloppy consensus
|
|
16
|
+
items above the gate, changed no clean consensus item, and kept all 13
|
|
17
|
+
known-human safety files below 25. The local scorer now indexes vocabulary
|
|
18
|
+
by first character and caches compiled patterns. A 280-document parity run
|
|
19
|
+
found no change from that optimization, while an alternating six-pair run
|
|
20
|
+
against v2.5.7 measured a 29.4% median throughput gain.
|
|
21
|
+
|
|
22
|
+
- 2026-08-25 — v2.5.7. Audited JCarterJohnson's 89,239-post reader-salience
|
|
23
|
+
study and `unslop-ai-text` at commit
|
|
24
|
+
`f7c4aefc2c797a66e55b49354a93917ab60d33ac`. Zero Slop already covered all
|
|
25
|
+
25 published categories, so no regexes, weights, or blanket em-dash rule
|
|
26
|
+
were imported. Added a meaning-first review order and three judgment-only
|
|
27
|
+
checks: reflexive agreement, communicative drift, and rhetorical scale
|
|
28
|
+
mismatch. Added manufactured informality to the overcorrection guard. The
|
|
29
|
+
upstream scanner called the 13-file known-human safety set "strong" based
|
|
30
|
+
on three high, two medium, and one low finding; Zero Slop kept all 13 below
|
|
31
|
+
its gate. Fixed `--batch --json` so CI receives JSON while preserving the
|
|
32
|
+
gate exit code, and added unslop-text to the pinned capability audit. These
|
|
33
|
+
comparisons test false-positive safety and documented features, not which
|
|
34
|
+
editor produces better prose.
|
|
35
|
+
|
|
36
|
+
- 2026-08-24 — v2.5.6. Performed-writer register: a human editor flagged 35
|
|
37
|
+
spans from the zero-slop.ai August blog drafts that the scorer passed clean
|
|
38
|
+
(zero pattern hits) — theatrical process framing ("Then we hired an
|
|
39
|
+
adversary"), epigram payoffs ("turns out to carry an expensive signal"),
|
|
40
|
+
staccato antithesis ("Not perfect. Honest.", "Slop isn't a vibe. It's
|
|
41
|
+
measurable."), metaphor flourishes and extended conceits ("the other half
|
|
42
|
+
lands on the sender's name", "rhythm leaves prints", "never allowed to
|
|
43
|
+
convict", "opens the hood"), slang-cute idioms ("it has receipts", "vibe
|
|
44
|
+
check"), hyperbole ("nothing on earth scores a perfect zero"), one-word
|
|
45
|
+
drama beats ("Fine."), jargon compression ("threshold cliff",
|
|
46
|
+
"length-blind floor"), and cute meta-taglines ("a writing meter you can
|
|
47
|
+
argue with", "the fight against slop"). Added twelve conservative patterns
|
|
48
|
+
(w 2–2.5, cat `performed`): `hired-adversary`, `turns-out-payoff`,
|
|
49
|
+
`has-receipts`, `hyperbole-universal`, `argue-with-artifact`,
|
|
50
|
+
`vibe-register`, `where-x-lives`, `billed-conceit`, `on-the-tin`,
|
|
51
|
+
`minding-own-business`, `economics-brutal`, `opens-the-hood`, plus rider
|
|
52
|
+
"fight against" (fires only beside a marketing trigger, so history and
|
|
53
|
+
civic prose stay silent). Spans no regex gates safely became judgment-pass
|
|
54
|
+
rows in tells.md plus a named performed-writer check and a statistics-
|
|
55
|
+
cohesion rule (one test per paragraph, plain-words setup before numbers) in
|
|
56
|
+
SKILL.md's diagnose and read-aloud briefs; the family is cross-referenced
|
|
57
|
+
with overcorrection.md as the meter-side twin of edgy-slop. All 35 spans
|
|
58
|
+
now live in `data/corpus/performed-register/` — the 16 mechanically
|
|
59
|
+
catchable ones are regression-tested
|
|
60
|
+
(`test_performed_register_corpus_is_caught`), the 19 judgment-only ones are
|
|
61
|
+
the read-aloud fixture list. Must-not-flag corpus 12/12 with zero new hits;
|
|
62
|
+
search-corpus, RAID+, and Beemo audits re-verified with identical numbers.
|
|
63
|
+
In the historical 50-draft chart panel, `billed-conceit` fires on one
|
|
64
|
+
humanizer and one stop-slop rewrite ("the cost/bill lands on"), nudging
|
|
65
|
+
those two competitor means up 0.2 (20.5→20.7, 16.7→16.9) — the meter
|
|
66
|
+
catching the conceit those tools injected. Every published Zero Slop
|
|
67
|
+
number stands; the detector chart was regenerated.
|
|
68
|
+
|
|
69
|
+
- 2026-08-22 — AIStoryHub Corpus of AI Clichés v1.8 coverage audit. Fixed a
|
|
70
|
+
detector-ordering bug that erased `utm_source=chatgpt.com` before the
|
|
71
|
+
existing artifact rule could see it; added the `attributableIndex` and
|
|
72
|
+
stand-alone “Regenerate response” paste artifacts; and expanded strict
|
|
73
|
+
bracketed placeholders such as `[Company Name]`, `[Recipient]`, and
|
|
74
|
+
`[Date]`. Ambiguous vocabulary and persona names remain context-gated or
|
|
75
|
+
unscored to protect the must-not-flag corpus.
|
|
76
|
+
|
|
77
|
+
- 2026-08-03 — Prompt-engineering review (Prompeteer THE SEED): added
|
|
78
|
+
`--formal` scorer mode; formal-genre verify gate; corrected learned.json
|
|
79
|
+
override semantics; de-em-dashed the LinkedIn worked example; scoped the
|
|
80
|
+
≥3-claims rule to author-supplied material.
|
|
81
|
+
- 2026-08-03 — Initial release. Base taxonomy seeded from WP:AICATCH,
|
|
82
|
+
de-slop/stop-slop detector line, petergyang/no-ai-slop, blader/humanizer
|
|
83
|
+
v2.9.1, and the Kobak/Liang/Juzek lexicon studies. Calibrated on a
|
|
84
|
+
50-draft AI corpus (mean 76/100) vs human exemplars (9–29/100).
|
|
85
|
+
- 2026-08-03 — First live run (Manav's enterprise-AI-reports LinkedIn post):
|
|
86
|
+
scorer missed the "has too often" announcement-voice opener and the "says
|
|
87
|
+
the quiet part out loud" cliché; both added as learned patterns. Voice
|
|
88
|
+
profile created at data/voices/manav.md.
|
|
89
|
+
- 2026-08-03 — User feedback (Manav): hook attributed OpenAI's 6x stat to
|
|
90
|
+
"two new reports" and never paid off the second — "feels amnesiac". Added
|
|
91
|
+
a source-scope check to the verify rubric in SKILL.md (judgment-level; no
|
|
92
|
+
regex can see it). Voice profile updated: when citing multiple reports,
|
|
93
|
+
each gets called out with its own number.
|
|
94
|
+
- 2026-08-03 — User feedback (Manav): a paragraph of four consecutive
|
|
95
|
+
clipped declaratives read as robotic — the staccato over-correction
|
|
96
|
+
overcorrection.md already names, produced by this skill's own rewrite.
|
|
97
|
+
Lesson: the punchy register is for hooks and landings, not analytic
|
|
98
|
+
middles; those want subordinated, flowing sentences (NYT-editor cadence).
|
|
99
|
+
- 2026-08-03 — Round-2 benchmark (vs stop-slop and the stacked
|
|
100
|
+
no-ai-slop→humanizer pipeline): the two-pass pipeline tied/edged the
|
|
101
|
+
single-pass loop (8.03 vs 8.00 composite; LinkedIn 11-9). Architecture
|
|
102
|
+
lesson encoded: step 3 is now explicitly two passes (Strip, then Build)
|
|
103
|
+
with an anti-over-cutting guard. stop-slop's 27 worst-picks confirm the
|
|
104
|
+
guard: most-aggressive surface removal ≠ best writing.
|
|
105
|
+
- 2026-08-03 — False positive: lexicon "harness" (w 2.5) fired on "agent
|
|
106
|
+
harness", standard technical usage in agent-tooling prose. Lowered to 1.0
|
|
107
|
+
in patterns.json per the override rules.
|
|
108
|
+
- 2026-08-03 — v1.1 validation: two-pass architecture wins the LinkedIn
|
|
109
|
+
pairwise blind head-to-head 15-10 vs the stacked no-ai-slop→humanizer
|
|
110
|
+
pipeline (v1.0 had lost that genre 9-11). Caveat kept honest: all 15 wins
|
|
111
|
+
narrow; the pipeline took the 4 clear-margin verdicts.
|
|
112
|
+
- 2026-08-03 — User feedback: skill output was "dense, hard to follow, not
|
|
113
|
+
insightful" — technically clean prose that chained five abstractions in
|
|
114
|
+
one sentence. New failure mode named: compression ≠ writing. Added a
|
|
115
|
+
followability channel to the scorer (comma-chain fraction, long-word
|
|
116
|
+
ratio, 38+-word sentences; formal genres exempt), a followability gate to
|
|
117
|
+
the verify rubric, a density-ceiling rule to the expert-voice mandate,
|
|
118
|
+
and a live before/after to rewrite-moves L1. The criticized paragraph now
|
|
119
|
+
fails the gate (28.2); its unpacked rewrite passes (9.5).
|
|
120
|
+
- 2026-08-03 — Second followability iteration, same paragraph: the first
|
|
121
|
+
fix swapped abstraction-chains for an unexplained metaphor ("finishing
|
|
122
|
+
school") plus an inside-baseball citation list — decoding load moved,
|
|
123
|
+
not removed. Rule sharpened: a metaphor anchors only when its mapping is
|
|
124
|
+
set up first; otherwise it's compression in costume. Prefer a plain
|
|
125
|
+
comparison the reader can picture. Name-lists of papers belong in the
|
|
126
|
+
citation file, not the prose.
|
|
127
|
+
- 2026-08-03 — User feedback, three lessons encoded together: (1) the loop
|
|
128
|
+
description read as spec-notation (arrows, threshold dumps) rather than
|
|
129
|
+
writing — "arrow-in-prose" and "threshold-dump" added as learned scorer
|
|
130
|
+
patterns; (2) fixing one paragraph isn't the standard — a
|
|
131
|
+
whole-document-consistency check added to the verify gate (uniform
|
|
132
|
+
register, cross-references must resolve); (3) the correction must not
|
|
133
|
+
overcorrect: "everything shouldn't be prose" — the gate now reads "form
|
|
134
|
+
follows context": structured content (lists, tables, diagrams, spec
|
|
135
|
+
blocks) stays structured, and each form is held to what a skilled human
|
|
136
|
+
author would produce in that form. Step 0 gains a form inventory.
|
|
137
|
+
- 2026-08-03 — Product requirement from live use: every run must end with
|
|
138
|
+
a before/after scorecard (fixed table shape: surface score + band,
|
|
139
|
+
weighted tells, formatting counts, burstiness, followability, words,
|
|
140
|
+
gate verdict, facts-preserved count). Encoded as a template in SKILL.md
|
|
141
|
+
step 5; no longer left to the executing model's formatting judgment.
|
|
142
|
+
- 2026-08-03 — v1.2 benchmark run surfaced a gap: a draft asserted "~70% of
|
|
143
|
+
enterprise AI pilots never reach production" with no source. The correct
|
|
144
|
+
handling (keep as the author's claim, flag it, never invent a citation and
|
|
145
|
+
never launder it into "studies show") was previously implicit. Now an
|
|
146
|
+
explicit verify-gate rule. Same run: 25/25 LinkedIn gate passes,
|
|
147
|
+
followability 0.000 on every post, and the executing agent removed its own
|
|
148
|
+
invented specifics in the final pass — the fidelity rules holding under a
|
|
149
|
+
model that had already drafted the text.
|
|
150
|
+
- 2026-08-03 — Replication finding, the most important of the project: a
|
|
151
|
+
second blind judging pass on the identical 50 rewrites moved Zero Slop's
|
|
152
|
+
best-picks from 32/50 to 23/50 (64% to 46%). Cohen's kappa 0.12 means
|
|
153
|
+
judges barely agree on "best". Pooled 55/100 beats a 25% chance rate
|
|
154
|
+
(p=1.7e-10) but is NOT separable from blader/humanizer head-to-head
|
|
155
|
+
(p=0.15). All published claims corrected. Methodological rule for any
|
|
156
|
+
future benchmark run by this project: never publish a single-pass judge
|
|
157
|
+
number without a replication and an agreement statistic.
|
|
158
|
+
- 2026-08-03 — Adversarial red-team (36 tool-uses, 779-line report). Six
|
|
159
|
+
vulnerabilities found and fixed in the scorer: (1) regexes were
|
|
160
|
+
contraction-locked, so expanding "it's" to "it is" dropped 20-tell slop
|
|
161
|
+
from 100 to 9.5 while the skill's own L4 rule told rewriters to ADD
|
|
162
|
+
contractions — 18 patterns now match both forms; (2) inline `code` spans
|
|
163
|
+
were stripped, so backticking slop hid it — only the backticks are removed
|
|
164
|
+
now, the words are scored; (3) tell density was length-normalised without
|
|
165
|
+
bounds, so 20 tells diluted to a pass at 2437 words and one tell in a
|
|
166
|
+
7-word tweet scored 100 — window floored at 60 words with an absolute
|
|
167
|
+
weight term; (4) the skill's own banned edgy-slop (overcorrection.md) was
|
|
168
|
+
invisible to the scorer — four overcorrection patterns added; (5) the
|
|
169
|
+
em-dash term was uncapped, convicting the Gettysburg Address at 88.9 —
|
|
170
|
+
capped, and (6) formatting/register penalties now require lexical
|
|
171
|
+
corroboration, implementing the "clusters convict, singles don't" rule the
|
|
172
|
+
scorer stated but never enforced. Gettysburg 88.9 → 29.6, evasions all
|
|
173
|
+
restored to ~100, corpus calibration held (37/50 flagged, v1.2 50/50 clean).
|
|
174
|
+
Still open and documented as boundaries: hollowness remains invisible to
|
|
175
|
+
any regex (by design), non-Latin scripts score unconditionally clean, and
|
|
176
|
+
the learning loop must never lower a weight to pass the draft under review.
|
|
177
|
+
- 2026-08-03 — Running the skill on its own README caught two false positives
|
|
178
|
+
in patterns added earlier the same day: "arrow-in-prose" fired on UI menu
|
|
179
|
+
paths (Settings → Capabilities → Skills) and "question-hook-opener" fired
|
|
180
|
+
on bolded FAQ headings. Both are correct forms, not tells. Fixed: the arrow
|
|
181
|
+
rule now requires lowercase on both sides via (?-i:) — necessary because
|
|
182
|
+
the scorer matches case-insensitively, so a plain [a-z] class silently
|
|
183
|
+
matched capitals — and the question rule exempts markdown-bold headings.
|
|
184
|
+
README prose went 30.3 → 20.9 after stripping six em-dashes from running
|
|
185
|
+
prose; the raw file still scores 99.9 because it quotes the tells it
|
|
186
|
+
teaches, which is the documented mention-versus-use boundary.
|
|
187
|
+
- 2026-08-03 — Cut the trained detection channel and its 205 KB of weights.
|
|
188
|
+
It scored 0.985 AUC in-domain but failed the only test that mattered: on
|
|
189
|
+
2026-era drafts it rated real AI slop as human (mean p=0.038), and a live
|
|
190
|
+
check returned p=0.33 for text the pattern meter scored 100/100. A channel
|
|
191
|
+
that is confidently wrong on current text is a liability even when labelled
|
|
192
|
+
a second opinion. The interpretable channels carry the signal on their own,
|
|
193
|
+
and every point of the score still traces to a quoted span. The negative
|
|
194
|
+
result is documented in references/evidence.md; other classifier families
|
|
195
|
+
were rejected earlier on the same evidentiary standard.
|
|
196
|
+
- 2026-08-03 — Answered the "hardcoded meter" problem with three mechanisms
|
|
197
|
+
instead of a bigger list. (1) calibrate.py derives lexicon weights from
|
|
198
|
+
excess frequency between a human corpus and current AI output, so the meter
|
|
199
|
+
can be re-fit to any model generation or to one writer's baseline.
|
|
200
|
+
(2) data/corpus/must-not-flag/ is a false-positive regression suite;
|
|
201
|
+
calibrate.py --selftest must pass before any pattern change ships. It
|
|
202
|
+
immediately caught three real bugs: duplicate lexicon prefixes double-
|
|
203
|
+
counting one word (elevate/elevat), technical terms of art convicting
|
|
204
|
+
honest prose (robust, landscape, elevated), and style-only conviction of
|
|
205
|
+
text with zero lexical evidence. (3) Rider words are now sentence-scoped:
|
|
206
|
+
13 context-dependent terms score only when a marketing-register trigger
|
|
207
|
+
shares their sentence. Result: 6/6 on the FP suite, marketing use of the
|
|
208
|
+
same words still scores 100, corpus calibration unchanged at 37/50 flagged
|
|
209
|
+
and 50/50 clean. Patterns also gained first_seen/last_confirmed with an
|
|
210
|
+
18-month decay so stale tells fade automatically.
|
|
211
|
+
- 2026-08-03 — User rule: the output format must match the input format.
|
|
212
|
+
Text in, text out; .docx in, .docx out; PDF in, PDF out; a file in a repo
|
|
213
|
+
is edited in place so the diff is reviewable; a JSON field comes back as
|
|
214
|
+
that field. Non-prose content (front matter, code, tables, links, merge
|
|
215
|
+
fields, markup) survives untouched, and the skill must never silently
|
|
216
|
+
downgrade to markdown — if it cannot produce the input type it says so.
|
|
217
|
+
An explicit request for a different format overrides. Encoded in step 0
|
|
218
|
+
(record the input format) and step 5 (a format-matching table).
|
|
219
|
+
- 2026-08-04 — Shape channel added after a verified blind spot: paragraph
|
|
220
|
+
structure was flattened before scoring, so the same words in 26 paragraphs
|
|
221
|
+
or 1 scored identically to the decimal. Broetry was invisible, and worse,
|
|
222
|
+
its fragment/long mix INFLATED burstiness — the channel meant to catch
|
|
223
|
+
machine cadence was satisfied by the tell. A naive fix would also have died
|
|
224
|
+
at the corroboration clamp, which caps stylistic evidence at 3.5 exactly
|
|
225
|
+
when zero lexical hits are present, the common broetry case.
|
|
226
|
+
Built corpus-first: data/corpus/must-not-flag-shape/ holds six genres that
|
|
227
|
+
mimic broetry (poem, dialogue, changelog, SMS, aphorisms, lyrics), all
|
|
228
|
+
solo_frac 1.00, so a naive metric convicts them harder than the real thing.
|
|
229
|
+
Guards run before the metric (structural markers, dialogue openings,
|
|
230
|
+
eight-paragraph floor) and silence five of six; lyrics remains a documented
|
|
231
|
+
boundary rather than a special case. Reported as its own axis, never folded
|
|
232
|
+
into ai_likelihood, because broetry is a slop tell not a machine tell and
|
|
233
|
+
the reach-versus-voice call belongs to the author.
|
|
234
|
+
Also fixed the deeper failure: the gate printed PASS for channels it never
|
|
235
|
+
measured. Every verdict now enumerates what was checked and what was not.
|
|
236
|
+
|
|
237
|
+
- 2026-08-04 — Reflect loop added 2 context-gated rider(s) (capability, experience) after each was struck from 5+ documents. Entered as riders, not always-on lexicon terms.
|
|
238
|
+
|
|
239
|
+
- 2026-08-04 — Reflect loop promoted 0 pattern(s) after each was independently cut from 3+ documents (); 0 rejected by the false-positive gate. Source documents are not recorded: reflection evidence stays on the machine that produced it.
|
|
240
|
+
|
|
241
|
+
- 2026-08-04 — Community taxonomy review (r/OpenAI "telltale signs of AI-slop writing" thread and adjacent write-ups). Coverage test over ten named tells: eight already caught. Added lexicon term `ascertain` (w 3) and pattern `thats-the-thing` (w 3). Deliberately NOT added: the rule-of-three tricolon. It is a named AI tell and also standard rhetoric; the 12-sample corpus is too small to certify a pattern that broad, and shipping it would risk convicting honest parallel construction. Revisit when the corpus is larger.
|
|
242
|
+
|
|
243
|
+
- 2026-08-04 — Community taxonomy pass over the r/OpenAI "telltale signs of
|
|
244
|
+
AI-slop writing" thread (Apr 2025, 78 comments). Tested the ten tells named
|
|
245
|
+
by the post and its commenters; four were already caught. Added six:
|
|
246
|
+
`fragment-question-pivot` (w 5) for the noun-phrase drum-roll question
|
|
247
|
+
("The kicker?", "The issue?", "The real issue?") — the single most-cited tell
|
|
248
|
+
in the thread, quoted by four separate commenters and previously scoring 9.5,
|
|
249
|
+
the floor; `theres-a-twist` (w 4); `not-only-but-also` (w 3);
|
|
250
|
+
`explainer-restatement` (w 3.5) for the sentence that restates the paragraph
|
|
251
|
+
it ends, named by a working editor as "the unnecessary explainer sentence";
|
|
252
|
+
`tacked-on-moral` (w 4) for the lesson appended whether or not the piece
|
|
253
|
+
earned one. Every one cleared the 12-sample must-not-flag corpus. The
|
|
254
|
+
fragment-question regex is anchored to a sentence boundary and requires the
|
|
255
|
+
answer to follow, so an ordinary question is untouched.
|
|
256
|
+
|
|
257
|
+
Deliberately not added, though named in the thread: the em-dash as such
|
|
258
|
+
(density is already scored, and two commenters in that same thread are
|
|
259
|
+
career writers who have used em-dashes for twenty years — a per-instance
|
|
260
|
+
rule would convict them); "consistent hyphenation"; and the rule-of-three
|
|
261
|
+
tricolon, which is a real AI tell and also standard rhetoric that a
|
|
262
|
+
12-sample corpus is too small to certify a pattern against.
|
|
263
|
+
|
|
264
|
+
- 2026-08-04 — False-positive measurement against genuine human technical prose:
|
|
265
|
+
5 of 8 human-written documents in this repo were convicted at the ≤25 gate.
|
|
266
|
+
Two causes, both fixed. The corroboration floor was 0.45, handing style 45% of
|
|
267
|
+
its weight on text with no lexical evidence at all, and the clamp keyed on hit
|
|
268
|
+
*count* rather than weight, so a single weight-2.5 hit unlocked the full
|
|
269
|
+
em-dash penalty — AGENTS.md scored 59.2 on one arrow in 392 words. Floor is
|
|
270
|
+
now 0.10 and the clamp is weighted (density < 1.5).
|
|
271
|
+
|
|
272
|
+
Separately lowered `arrow-in-prose` 2.5 → 1.0. It fires on ordinary pipeline
|
|
273
|
+
and mapping notation ("read → transform → write", "id → record"), which is
|
|
274
|
+
correct technical writing, and at 2.5 it was on its own enough to push honest
|
|
275
|
+
prose past the gate. This is a weight change motivated by false positives
|
|
276
|
+
across several documents, not by one draft failing — the distinction step 6
|
|
277
|
+
requires.
|
|
278
|
+
|
|
279
|
+
- 2026-08-15 — v2.3.0 research pass. A 20-source sweep (current WP:AICATCH,
|
|
280
|
+
Kobak's July-2025 ~900-word excess-vocab update, Juzek & Ward's RLHF-cause
|
|
281
|
+
papers, The Economist's 1.2M-word measured study, tropes.fyi, and
|
|
282
|
+
LinkedIn's own reach-penalty data) cross-checked against the day-old
|
|
283
|
+
coverage release: the big families all held, 17 gaps closed ("That's
|
|
284
|
+
where X comes in", the WP "despite challenges / future outlook" formula,
|
|
285
|
+
"not all X are created equal", counting preambles, false-vulnerability
|
|
286
|
+
hooks, "quietly reshaping", metaphor-of family), vendor paste-debris
|
|
287
|
+
extended to Gemini/Grok/Perplexity markers, and 5 lexicon + 4 rider
|
|
288
|
+
terms added. Notable calibration facts recorded from the sweep: LinkedIn
|
|
289
|
+
measures "Stop X. Start Y." as its steepest reach penalty (−6.7%) and
|
|
290
|
+
"It's not X, it's Y" at −4.9%; The Economist found only Claude-family
|
|
291
|
+
models over-use em-dashes (ChatGPT uses fewer than humans) — supports
|
|
292
|
+
keeping the em-dash term capped and corroboration-gated rather than
|
|
293
|
+
raising it; and construction tells persist across model generations
|
|
294
|
+
while word tells churn — which is the decay mechanism's design premise.
|
|
295
|
+
Gates: 12/12 corpus, zero drift on all 16 human docs, mean AI-draft
|
|
296
|
+
score 77.1, recall steady at 47/50.
|
|
297
|
+
|
|
298
|
+
- 2026-08-14 — v2.3.0, the coverage release. A 260-sentence audit battery of
|
|
299
|
+
tells named by WP:AICATCH, community taxonomies, and the detector-line
|
|
300
|
+
repos found 260 with ZERO pattern hits — including six variants of the
|
|
301
|
+
contrast family the skill already claimed to catch: "Success isn't about
|
|
302
|
+
talent. It's about consistency." (generic subject), "It's not just a
|
|
303
|
+
tool—it's a partner." (em-dash separator), and "It is not about speed; it
|
|
304
|
+
is about direction." (expanded contraction — the exact contraction-lock
|
|
305
|
+
bug the 2026-08-03 red-team fixed elsewhere, reintroduced in the newest
|
|
306
|
+
patterns). Fixed the four contrast regexes (any subject, any separator,
|
|
307
|
+
both contraction forms), extended fragment-question-pivot's noun set
|
|
308
|
+
(part/news/takeaway/lesson/mistake…), and added 175 patterns across
|
|
309
|
+
families that had no regex at all: fake epiphany ("that's when it hit
|
|
310
|
+
me", "little did I know"), certainty theater ("cannot be overstated",
|
|
311
|
+
"Full stop."), non-conclusions ("only time will tell"), manufactured-world
|
|
312
|
+
openers ("Gone are the days", "In a world where"), imperative flips
|
|
313
|
+
("Stop X. Start Y."), cliché autopilot (double-edged sword, tip of the
|
|
314
|
+
iceberg, elephant in the room — low weights, shared with humans, clusters
|
|
315
|
+
convict), chatbot residue ("Would you like me to", "my training data"),
|
|
316
|
+
form-letter email, LinkedIn ritual ("some personal news", "today years
|
|
317
|
+
old"), and DM-funnel engagement ("comment X and I'll send"). Plus 36
|
|
318
|
+
lexicon terms (whopping, unsung→pattern, skyrocket, picturesque,
|
|
319
|
+
garner and bolster — named in tells.md since v1 but never implemented)
|
|
320
|
+
and 8 riders (emphasiz/enhanc/highlight per the 2025+ era-shift note).
|
|
321
|
+
Every addition cleared the 12-sample must-not-flag corpus with zero score
|
|
322
|
+
movement on any sample (checked to the decimal, not just under-gate), and
|
|
323
|
+
zero movement on this repo's own human docs. Coverage on the battery went
|
|
324
|
+
260 misses → 3, all deliberate ("no silver bullet", "eat our own dog
|
|
325
|
+
food" — genuine engineering idiom stays legal). Benchmark recall: 37/50
|
|
326
|
+
→ 47/50 AI drafts flagged; human corpus range unchanged at 9.5–20.2.
|
|
327
|
+
ReflectLoop test fixtures moved off "moves the needle" because the meter
|
|
328
|
+
now catches it — the novelty gate correctly refused to re-mint it, which
|
|
329
|
+
is the learning loop working as specified.
|
|
330
|
+
|
|
331
|
+
- 2026-08-04 — v1.5.0. Fidelity became a measured channel rather than a rule
|
|
332
|
+
the agent was asked to honour, closing the one dimension the benchmark ranked
|
|
333
|
+
the skill last on. False-positive rate on ordinary human prose went from 5-in-8
|
|
334
|
+
to 0-in-5 after two scoring bugs were found by measurement: a corroboration
|
|
335
|
+
floor of 0.45 that gave style 45% weight with no lexical evidence, and a clamp
|
|
336
|
+
keyed on hit count so a single weight-2.5 tell unlocked the full stylistic
|
|
337
|
+
penalty. Six community tells added, `--explain` and `--json --gate` repaired,
|
|
338
|
+
`--dna` added, a ReDoS and two quadratics removed, and user prose stopped
|
|
339
|
+
reaching git-tracked files.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Continuous-learning overlay. Same schema as patterns.json; merged over it at runtime by slopscore.py. Add new tells here (with a dated entry in learned-log.md). Lexicon entries here override base weights; patterns append (to soften a base pattern, edit patterns.json). Keep this file valid JSON at all times.",
|
|
3
|
+
"patterns": [
|
|
4
|
+
{
|
|
5
|
+
"name": "has-too-often",
|
|
6
|
+
"cat": "scaffolding",
|
|
7
|
+
"rx": "\\bha(?:s|ve) too often\\b",
|
|
8
|
+
"w": 3.5,
|
|
9
|
+
"first_seen": "2026-08-03",
|
|
10
|
+
"last_confirmed": "2026-08-03"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "quiet-part-out-loud",
|
|
14
|
+
"cat": "performed",
|
|
15
|
+
"rx": "\\bsays? the quiet part out loud\\b",
|
|
16
|
+
"w": 3,
|
|
17
|
+
"first_seen": "2026-08-03",
|
|
18
|
+
"last_confirmed": "2026-08-03"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "arrow-in-prose",
|
|
22
|
+
"cat": "spec-notation",
|
|
23
|
+
"rx": "(?-i:[a-z0-9)])[^.!?\\n]{0,30}(?:\u2192|->)\\s*(?-i:[a-z0-9(])",
|
|
24
|
+
"w": 1.0,
|
|
25
|
+
"first_seen": "2026-08-03",
|
|
26
|
+
"last_confirmed": "2026-08-03",
|
|
27
|
+
"demoted": "2026-08-04"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "threshold-dump",
|
|
31
|
+
"cat": "spec-notation",
|
|
32
|
+
"rx": "[\u2264\u2265][^.!?\\n]{1,50}[\u2264\u2265]",
|
|
33
|
+
"w": 3,
|
|
34
|
+
"first_seen": "2026-08-03",
|
|
35
|
+
"last_confirmed": "2026-08-03"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "fake-first-person-authority",
|
|
39
|
+
"cat": "overcorrection",
|
|
40
|
+
"rx": "\\b(?:i(?:'|\u2019)ve|i have) (?:seen|watched) (?:this|it) (?:happen )?(?:a hundred times|over and over|again and again)\\b|\\bin my experience,\\b",
|
|
41
|
+
"w": 4,
|
|
42
|
+
"first_seen": "2026-08-03",
|
|
43
|
+
"last_confirmed": "2026-08-03"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "everyone-says-wrong",
|
|
47
|
+
"cat": "overcorrection",
|
|
48
|
+
"rx": "\\bevery(?:one|body) (?:says|thinks|tells you)[^.!?]{0,40}(?:they(?:'|\u2019)re| they are | but )\\s*wrong\\b",
|
|
49
|
+
"w": 5,
|
|
50
|
+
"first_seen": "2026-08-03",
|
|
51
|
+
"last_confirmed": "2026-08-03"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"name": "staccato-emphasis",
|
|
55
|
+
"cat": "overcorrection",
|
|
56
|
+
"rx": "\\b\\w+\\. (?:A lot|Deeply|Enormously|Massively)\\. ",
|
|
57
|
+
"w": 4,
|
|
58
|
+
"first_seen": "2026-08-03",
|
|
59
|
+
"last_confirmed": "2026-08-03"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"name": "hard-truth-posture",
|
|
63
|
+
"cat": "overcorrection",
|
|
64
|
+
"rx": "\\bthe (?:hard|honest|real) (?:truth|answer|version)(?: is|:)\\b|\\bnobody wants to (?:hear|say) (?:this|it)\\b",
|
|
65
|
+
"w": 4,
|
|
66
|
+
"first_seen": "2026-08-03",
|
|
67
|
+
"last_confirmed": "2026-08-03"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"name": "thats-the-thing",
|
|
71
|
+
"cat": "scaffolding",
|
|
72
|
+
"rx": "\\b(?:and\\s+)?that'?s?\\s+the\\s+thing\\s+(?:about|with)\\b",
|
|
73
|
+
"w": 3,
|
|
74
|
+
"first_seen": "2026-08-04",
|
|
75
|
+
"last_confirmed": "2026-08-04",
|
|
76
|
+
"source": "manual",
|
|
77
|
+
"example": "And that's the thing about scaling"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "fragment-question-pivot",
|
|
81
|
+
"cat": "rhetorical",
|
|
82
|
+
"rx": "(?:^|[.!?]\\s+|\\n)(?:And |But |Then )?(?:The|My|Our|His|Her|Their)\\s+(?:real\\s+|actual\\s+|best\\s+|worst\\s+|biggest\\s+|good\\s+|bad\\s+|craziest\\s+)?(?:kicker|twist|catch|issue|problem|result|point|irony|upshot|reality|truth|part|news|surprise|difference|takeaway|lesson|mistake|secret|beauty|verdict|answer|goal|advice)\\?\\s",
|
|
83
|
+
"w": 5,
|
|
84
|
+
"first_seen": "2026-08-04",
|
|
85
|
+
"last_confirmed": "2026-08-15",
|
|
86
|
+
"source": "community-taxonomy"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"name": "theres-a-twist",
|
|
90
|
+
"cat": "rhetorical",
|
|
91
|
+
"rx": "\\b(?:but\\s+)?there'?s?\\s+(?:a|the)\\s+(?:twist|catch|kicker|rub)\\b",
|
|
92
|
+
"w": 4,
|
|
93
|
+
"first_seen": "2026-08-04",
|
|
94
|
+
"last_confirmed": "2026-08-04",
|
|
95
|
+
"source": "community-taxonomy"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"name": "not-only-but-also",
|
|
99
|
+
"cat": "rhetorical",
|
|
100
|
+
"rx": "\\bnot\\s+only\\s+\\w+(?:\\s+\\w+){0,6}?\\s+but\\s+also\\b",
|
|
101
|
+
"w": 3,
|
|
102
|
+
"first_seen": "2026-08-04",
|
|
103
|
+
"last_confirmed": "2026-08-04",
|
|
104
|
+
"source": "community-taxonomy"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"name": "explainer-restatement",
|
|
108
|
+
"cat": "scaffolding",
|
|
109
|
+
"rx": "(?:^|[.!?]\\s+|\\n)\\s*(?:This|That|These|Those)\\s+(?:indicates?|shows?|demonstrates?|means?|suggests?|highlights?|underscores?|illustrates?)\\s+(?:that\\b|the\\b|how\\b|why\\b)",
|
|
110
|
+
"w": 3.5,
|
|
111
|
+
"first_seen": "2026-08-04",
|
|
112
|
+
"last_confirmed": "2026-08-04",
|
|
113
|
+
"source": "community-taxonomy"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"name": "tacked-on-moral",
|
|
117
|
+
"cat": "scaffolding",
|
|
118
|
+
"rx": "\\b(?:the\\s+)?(?:lesson|moral|takeaway)\\s+(?:here\\s+|of\\s+the\\s+story\\s+|from\\s+(?:this|all\\s+this)\\s+)?is\\b",
|
|
119
|
+
"w": 4,
|
|
120
|
+
"first_seen": "2026-08-04",
|
|
121
|
+
"last_confirmed": "2026-08-04",
|
|
122
|
+
"source": "community-taxonomy"
|
|
123
|
+
}
|
|
124
|
+
],
|
|
125
|
+
"lexicon": {
|
|
126
|
+
"ascertain": 3
|
|
127
|
+
}
|
|
128
|
+
}
|