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.
Files changed (81) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +193 -0
  3. package/SKILL.md +803 -0
  4. package/data/corpus/community-register/README.md +14 -0
  5. package/data/corpus/community-register/judgment/communicative-drift.txt +1 -0
  6. package/data/corpus/community-register/judgment/reflexive-agreement.txt +1 -0
  7. package/data/corpus/community-register/judgment/rhetorical-scale-mismatch.txt +1 -0
  8. package/data/corpus/must-not-flag/README.md +49 -0
  9. package/data/corpus/must-not-flag/esl-engineer-email.txt +7 -0
  10. package/data/corpus/must-not-flag/exec-memo.txt +9 -0
  11. package/data/corpus/must-not-flag/federalist.txt +5 -0
  12. package/data/corpus/must-not-flag/gettysburg.txt +1 -0
  13. package/data/corpus/must-not-flag/grant-abstract.txt +5 -0
  14. package/data/corpus/must-not-flag/ml-methods.txt +1 -0
  15. package/data/corpus/must-not-flag/personal-essay.txt +1 -0
  16. package/data/corpus/must-not-flag/press-release.txt +7 -0
  17. package/data/corpus/must-not-flag/recipe.txt +11 -0
  18. package/data/corpus/must-not-flag/sre-runbook.txt +1 -0
  19. package/data/corpus/must-not-flag/technical-postmortem.txt +1 -0
  20. package/data/corpus/must-not-flag/terse-engineer-note.txt +1 -0
  21. package/data/corpus/must-not-flag-shape/README.md +22 -0
  22. package/data/corpus/must-not-flag-shape/aphorism-list.txt +9 -0
  23. package/data/corpus/must-not-flag-shape/changelog.txt +13 -0
  24. package/data/corpus/must-not-flag-shape/dialogue.txt +19 -0
  25. package/data/corpus/must-not-flag-shape/lyrics.txt +15 -0
  26. package/data/corpus/must-not-flag-shape/poem.txt +8 -0
  27. package/data/corpus/must-not-flag-shape/sms-transcript.txt +15 -0
  28. package/data/corpus/performed-register/README.md +38 -0
  29. package/data/corpus/performed-register/judgment/detection-fragile.txt +1 -0
  30. package/data/corpus/performed-register/judgment/draft-cheap-signal.txt +1 -0
  31. package/data/corpus/performed-register/judgment/ear-chiasmus.txt +1 -0
  32. package/data/corpus/performed-register/judgment/fight-against-tagline.txt +1 -0
  33. package/data/corpus/performed-register/judgment/fine-beat.txt +1 -0
  34. package/data/corpus/performed-register/judgment/glow-finishing.txt +1 -0
  35. package/data/corpus/performed-register/judgment/jargon-compression.txt +1 -0
  36. package/data/corpus/performed-register/judgment/not-perfect-honest.txt +1 -0
  37. package/data/corpus/performed-register/judgment/punctuation-convict.txt +1 -0
  38. package/data/corpus/performed-register/judgment/recipe-ingredients.txt +1 -0
  39. package/data/corpus/performed-register/judgment/replay-lands.txt +1 -0
  40. package/data/corpus/performed-register/judgment/rhymes-with.txt +1 -0
  41. package/data/corpus/performed-register/judgment/rhythm-prints.txt +1 -0
  42. package/data/corpus/performed-register/judgment/same-leak.txt +1 -0
  43. package/data/corpus/performed-register/judgment/tools-work.txt +1 -0
  44. package/data/corpus/performed-register/judgment/tuning-gradients.txt +1 -0
  45. package/data/corpus/performed-register/judgment/verdict-arithmetic.txt +1 -0
  46. package/data/corpus/performed-register/judgment/whole-product.txt +1 -0
  47. package/data/corpus/performed-register/judgment/words-cheap.txt +1 -0
  48. package/data/corpus/performed-register/mechanical/argue-with-artifact.txt +1 -0
  49. package/data/corpus/performed-register/mechanical/bill-lands.txt +1 -0
  50. package/data/corpus/performed-register/mechanical/billed-to-reader.txt +1 -0
  51. package/data/corpus/performed-register/mechanical/economics-brutal.txt +1 -0
  52. package/data/corpus/performed-register/mechanical/has-receipts.txt +1 -0
  53. package/data/corpus/performed-register/mechanical/hired-adversary.txt +1 -0
  54. package/data/corpus/performed-register/mechanical/hyperbole-universal.txt +1 -0
  55. package/data/corpus/performed-register/mechanical/metaphor-sender-name.txt +1 -0
  56. package/data/corpus/performed-register/mechanical/minding-own-business.txt +1 -0
  57. package/data/corpus/performed-register/mechanical/on-the-tin.txt +1 -0
  58. package/data/corpus/performed-register/mechanical/opens-the-hood.txt +1 -0
  59. package/data/corpus/performed-register/mechanical/turns-out-payoff.txt +1 -0
  60. package/data/corpus/performed-register/mechanical/vibe-check.txt +1 -0
  61. package/data/corpus/performed-register/mechanical/vibe-isnt-a-vibe.txt +1 -0
  62. package/data/corpus/performed-register/mechanical/vibe-number-attached.txt +1 -0
  63. package/data/corpus/performed-register/mechanical/where-slop-lives.txt +1 -0
  64. package/data/learned-log.md +339 -0
  65. package/data/learned.json +128 -0
  66. package/data/patterns.json +2298 -0
  67. package/package.json +54 -0
  68. package/references/copy-desk.md +87 -0
  69. package/references/evidence.md +382 -0
  70. package/references/overcorrection.md +77 -0
  71. package/references/platforms.md +102 -0
  72. package/references/readalong.md +118 -0
  73. package/references/rewrite-moves.md +177 -0
  74. package/references/tells.md +190 -0
  75. package/scripts/calibrate.py +274 -0
  76. package/scripts/learn.py +1588 -0
  77. package/scripts/predictability.py +227 -0
  78. package/scripts/rerank.py +150 -0
  79. package/scripts/safeio.py +146 -0
  80. package/scripts/slopscore.py +1352 -0
  81. 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
+ }