Skip to content

Upstream intake 2026-11-04: curly apostrophes, surprisingly, wider A3 (1.3.0) - #8

Merged
ilien-dev merged 8 commits into
mainfrom
feature/upstream-2026-11-04
Nov 5, 2026
Merged

ilien-dev merged 8 commits into
mainfrom
feature/upstream-2026-11-04

Conversation

@ilien-dev

@ilien-dev ilien-dev commented Nov 5, 2026 •

Copy link
Copy Markdown
Owner

This was the first read of all eight reference repos, so I went through each whole tree. Three small detection changes shipped, plus a change to evaluate.py so their gains show up in the repo's own output. I measured 27 candidates and 4 evaluation methods. Most were rejected, and two that passed the cheap screen made rewrites worse in the end-to-end runs.

The human corpora were rebuilt for this run (160 dev.to posts with 40 held out, 157 stories, 245 Spanish posts). dev.to no longer returns 7 of the posts behind the shipped bands, so the absolute figures differ a little from numbers.md. Every before/after pair below was measured on the same corpus, chosen on the training split and judged on the held-out one.

Shipped

Curly apostrophes count as straight ones in audit.py. The checklist patterns use ', and GPT writes it’s and let’s, so those posts slipped past A1, A4, A32, B3 and the rest. Source: theclaymethod/unslop@17ed39c, scripts/banned_phrase_scan.py.

checklist AUC, held-out before after
blog, GPT 0.830 0.854
blog, Opus 0.753 0.746
blog, Sonnet 0.997 0.996
fiction, GPT 0.911 0.922

No held-out human text fails anything new in any register. One blog post by a person now trips A4 (0% to 2.5%), and that one post is the whole of the Opus drop.

surprisingly joins the blog lexicon. The word lists from slop-score, Antislop and avoid-ai-writing@ccc8fc4 were scored one entry at a time against the rule every ai-lean.txt entry passed: no more than 4% of human posts and at least 10% of assistant posts, on the training split. Of 2,779 entries the lexicons did not already hold, one survived.

blog, held-out before after
B1 FAIL, GPT posts 43% 50%
AI-lexicon AUC, Sonnet 0.857 0.861
B1 FAIL, human posts 0% 0%

A3 now catches "the real X is" with any noun, not only "the real question is". Source: unslop@17ed39c, taboo-phrases.md.

blog, held-out before after
A3 on Sonnet posts 0% 14%
T1 FAIL, Sonnet 93% 100%
A3 on human posts 5% 5%

evaluate.py reports how often each check fires and the checklist AUC. Before this, a TELL check never showed up in its output, so none of the three changes above could be measured with the repo's own scripts.

Measured and not shipped

All of these are also in references/numbers.md, so they won't come up again without new evidence.

candidate source result
"X wasn't Y. It was Z." with any subject slop-score@289264a Checklist AUC went from 0.860 to 0.873. End to end, rewrites got worse on dev (Opus 32.0 to 34.0, p = 0.28) and held-out stayed flat (26.7 to 26.1)
Paragraphs that open on a word from the intro, as a meter feature unslop AI-side AUC rose from 0.879 to 0.881 (blog) and 0.829 to 0.849 (Spanish). Rewrites got worse: Opus +1.8 on dev, +2.4 on held-out
Seven fiction words (crouched, hollow, trembling…) Antislop Checked on 117 new stories and 30 new AI stories: one more human story fails (8.5% to 9.4%)
Fiction word list under the usual rule Antislop, slop-score B1 FAIL on held-out human stories went from 0% to 3%
2,529 fiction phrases Antislop None passed
Plain "not X, but Y" slop-score, Antislop A1b on held-out human posts rose from 12.5% to 27.5%
"No X, no Y, no Z" chains avoid-ai-writing One AI post caught in blog; one more held-out human story trips A1 in fiction
Phrase additions to A5, A9, A12, A16, A17, A21, A22, A24, A26 and B3 humanize, humanizer, no-ai-slop, avoid-ai-writing No hits on test, or more human hits. "Do you want me to" fails human dialogue in fiction
Title Case filter, proximity gate on A1 avoid-ai-writing Lower AUC; A19 stopped catching AI posts
Self-answered short questions, fillers, bare-noun bullet lists, hedge parentheses blader, avoid-ai-writing Fire more on human posts, or lower AUC
13 meter features (staccato runs, callbacks, n-gram repetition, specific anchors, bold, punctuation spread and others) slop-score, unslop, avoid-ai-writing Near chance, more overshoot in human texts, or a human flagged
"Lost" warnings in factdiff.py unslop, avoid-ai-writing Flagged 10 of 20 rewrites, nearly all list counters, ports and IDs
Copy gate against a voice sample unslop Fired on 7 of 19 rewrites. Every hit was the author's own sign-off, which the notes also had

Two findings from the end-to-end runs

Both are now in references/numbers.md.

  • The skill against one sentence of instruction. I gave the same rewriter the same notes and told it to make the text read naturally and add no facts. The skill came out well ahead: Opus 32.0 against 44.0 on dev (p = 0.001) and 26.7 against 32.1 on held-out (p = 0.011). The GPT judges point the same way. The notes don't account for the result on their own.
  • A human post given as the draft came back reading a little more AI than the original: Opus 6.0 to 7.5 (p = 0.056), GPT 6.4 to 7.9 (p = 0.09). On a text a person wrote, the loop costs a little.

Deferred

Nothing.

A ledger of everything tried

From now on, /upstream-sync keeps .claude/skills/upstream-sync/tried.json, a record of every candidate it has measured. Each entry has its source, the numbers that decided it and what new evidence would justify trying it again. The ledger starts with 53 entries: this week's candidates plus the rejections already listed in references/numbers.md. sync.py tried WORD searches it, and the skill now does that before proposing anything, so next week won't spend time on what this week already ruled out. The skill also lists the pitfalls this run ran into, such as Windows encoding and codex hanging on stdin.

Notes

On Windows, build-corpus*.sh crashes on emoji unless you set PYTHONUTF8=1, because the console encoding is cp1252. This PR doesn't fix that.

The rewrites cost 144.5 USD, not counting the judges.

Version 1.3.0. All eight repos are marked as reviewed on 2026-11-04.

A TELL check never shows in the FAIL table, so a change to one could not be
measured with the repo's own scripts. The new tables give the share of texts
where each check fires and the AUC of the number of items found per text.
The checklist patterns are written with a straight apostrophe, so it's, let's
and we'll in GPT's curly form slipped past A1, A4, A32, B3 and the rest. Source:
theclaymethod/unslop@17ed39c, scripts/banned_phrase_scan.py.

evaluate.py, same held-out split (40 human posts, 14 per model), checklist AUC:
blog opus 0.753 -> 0.746, sonnet 0.997 -> 0.996, gpt 0.830 -> 0.854 (A32 on GPT
7% -> 29%); fiction gpt 0.911 -> 0.922; Spanish unchanged. Held-out humans:
no new FAIL in any register; one blog post now trips A4 (0 -> 2.5%).
The word lists of slop-score (data/slop_list.json), Antislop
(slop_words_2025-04-07.json) and avoid-ai-writing@ccc8fc4 (detector tiers)
were scored entry by entry on the training split, with the rule every
ai-lean.txt entry passed: at most 4% of human posts, at least 10% of assistant
posts. 2,779 entries came in that the lexicons did not hold; one survived.

evaluate.py, blog, held-out: AI-lexicon AUC sonnet 0.857 -> 0.861; B1 FAIL on
GPT posts 43% -> 50%; held-out humans 0% -> 0%. Sources for this and the
curly-apostrophe change are now in references/sources.md.
A3 caught "the real question is" only. unslop@17ed39c (taboo-phrases.md) lists
"the real X is" with any noun.

evaluate.py, held-out split: blog A3 on Sonnet posts 0% -> 14%, T1 FAIL on
Sonnet 93% -> 100%, checklist AUC sonnet 0.996 -> 1.0, opus and gpt unchanged;
held-out humans unchanged (A3 5%, no FAIL). Fiction and Spanish unchanged.
The skill against the same rewriter with one sentence of instruction and the
same notes, a human post given as the draft, and every upstream candidate
measured this week and not shipped, with its numbers.
@ilien-dev
ilien-dev merged commit e40f608 into main Nov 5, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant