test: a word list has a ceiling, so the sweep gets a third instrument #6

Merged
administrator merged 1 commit from test/a-word-list-has-a-ceiling into main 2026-10-28 07:57:10 +00:00
Collaborator

A fifth miss, found while reading registry/conventions.yaml for something else. The single source of truth still held French on seven lines, and so did output messages of the tool itself. The guard merged in #3 was green over all of it.

None of it was hidden. It was ordinary vocabulary the list had never heard of:

Where What
registry/conventions.yaml the word for length in a style description, the word for rename in a field comment, ten city labels, the stage label for acceptance
tools/naming.py five messages a user reads on their terminal — unknown style, unknown site kind, rename behaviour, expected-versus-got
examples/, policy/, templates/, three registries comments and notes

The lesson is about the instrument

A vocabulary sweep finds the words somebody thought of and no more. Widening it after each miss is a game with no end state. So two things happen here, and the second is the one that matters.

1. The list is widened once, hard — 162 → 818 words. Not word by word as misses appear, but in one pass built from common French and then subtracted from, by hand, for every word English also spells (236 of them).

That triage was itself wrong twice, and the guard said so both times: existant and adresse had been filed as English, and the first run after widening put them straight back in front of me.

2. A third sweep that is not a vocabulary at all — elision.

French contracts an article or a pronoun before a vowel. English has no construction that places one of those letters before an apostrophe at the start of a word — every English contraction attaches to the end ('s, 't, 're, 'll, 've), and o'clock is the exception everybody knows. A lookbehind keeps those out.

So the rule catches French the list has never heard of — proper nouns and invented words included. It earned its place on the first run, finding two lines that 696 words had just walked past: a note in the GCP registry and a section header in tools/naming.py.

And it caught the guard again: the comment explaining the rule quoted two French examples — the same self-reference that moved the word list out of the code in #3. The examples are gone; the rule is described instead.

Eight mutations

M1   an accented word                        -> caught, U+00E8 named
M2   French carrying no accent               -> caught
M3   the U+0153 ligature                     -> caught
M4   French in the GENERATOR of 53 lines     -> caught
M7   a sentence appended to the word list    -> refused, not a token
M10  elision, a contracted article           -> caught
M11  elision, a contracted conjunction       -> caught
M12  English contractions and o'clock        -> NOT flagged, as intended

Verification

make check green: 66 module tests, 48 policy tests, 11 reference plans, english: 83 files, 60,174 lines, 818 words, 4 exceptions, 0 findings, address: 0 findings.

What this still cannot do

Stated rather than implied: it finds French, it does not prove English. A sentence of ordinary technical English words in French word order passes, and so does any French word still outside the 818.

The honest claim is narrower: the sweep is now wide enough that each future miss costs one line, not thirty-six, and the elision rule degrades gracefully where a vocabulary does not.

Opened before the v3 work because v3 rewrites registry/conventions.yaml heavily and would conflict with every line of this.

🤖 Generated with Claude Code

**A fifth miss**, found while reading `registry/conventions.yaml` for something else. The single source of truth still held French on seven lines, and so did **output messages of the tool itself**. The guard merged in #3 was green over all of it. None of it was hidden. It was ordinary vocabulary the list had never heard of: | Where | What | |---|---| | `registry/conventions.yaml` | the word for *length* in a style description, the word for *rename* in a field comment, ten city labels, the stage label for acceptance | | `tools/naming.py` | five messages a user reads on their terminal — unknown style, unknown site kind, rename behaviour, expected-versus-got | | `examples/`, `policy/`, `templates/`, three registries | comments and notes | ## The lesson is about the instrument A vocabulary sweep finds the words somebody thought of and no more. Widening it after each miss is a game with no end state. So two things happen here, and the second is the one that matters. **1. The list is widened once, hard — 162 → 818 words.** Not word by word as misses appear, but in one pass built from common French and then subtracted from, by hand, for every word English also spells (236 of them). That triage was itself wrong twice, and **the guard said so both times**: `existant` and `adresse` had been filed as English, and the first run after widening put them straight back in front of me. **2. A third sweep that is not a vocabulary at all — elision.** French contracts an article or a pronoun before a vowel. English has no construction that places one of those letters before an apostrophe at the **start** of a word — every English contraction attaches to the end (`'s`, `'t`, `'re`, `'ll`, `'ve`), and `o'clock` is the exception everybody knows. A lookbehind keeps those out. So the rule catches French the list has never heard of — proper nouns and invented words included. **It earned its place on the first run**, finding two lines that 696 words had just walked past: a note in the GCP registry and a section header in `tools/naming.py`. And it caught the guard again: the comment explaining the rule *quoted two French examples* — the same self-reference that moved the word list out of the code in #3. The examples are gone; the rule is described instead. ## Eight mutations ``` M1 an accented word -> caught, U+00E8 named M2 French carrying no accent -> caught M3 the U+0153 ligature -> caught M4 French in the GENERATOR of 53 lines -> caught M7 a sentence appended to the word list -> refused, not a token M10 elision, a contracted article -> caught M11 elision, a contracted conjunction -> caught M12 English contractions and o'clock -> NOT flagged, as intended ``` ## Verification `make check` green: 66 module tests, 48 policy tests, 11 reference plans, `english: 83 files, 60,174 lines, 818 words, 4 exceptions, 0 findings`, `address: 0 findings`. ## What this still cannot do Stated rather than implied: **it finds French, it does not prove English.** A sentence of ordinary technical English words in French word order passes, and so does any French word still outside the 818. The honest claim is narrower: the sweep is now wide enough that each future miss costs *one line, not thirty-six*, and the elision rule degrades gracefully where a vocabulary does not. > Opened before the v3 work because v3 rewrites `registry/conventions.yaml` heavily and would conflict with every line of this. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
test: a word list has a ceiling, so the sweep gets a third instrument
Some checks failed
ci / check (pull_request) Has been cancelled
eb322f48d1
A FIFTH MISS, found while reading registry/conventions.yaml for something else. The
single source of truth still held French on seven lines, and so did output messages
of the tool itself. The previous guard was green over all of it.

NONE OF IT WAS HIDDEN. It was ordinary vocabulary the list had never heard of: the
word for length in a style description, the word for a rename in a field comment,
labels for ten cities, the stage label for acceptance, and in tools/naming.py five
messages a user reads on their terminal - an unknown style, an unknown site kind, a
rename behaviour, and an expected-versus-got comparison.

THE LESSON IS ABOUT THE INSTRUMENT, NOT ABOUT THE WORDS. A vocabulary sweep finds the
words somebody thought of and no more, and widening it after each miss is a game with
no end state. So two things happen here, and the second is the one that matters.

FIRST, THE LIST IS WIDENED ONCE, HARD: 162 words to 818. Not word by word as each
miss appears, but in one pass built from common French and then subtracted from, by
hand, for every word English also spells - 236 of them. The triage was itself wrong
twice and the guard said so both times: "existant" and "adresse" had been filed as
English, and the first run after widening put them straight back in front of me.

SECOND, A THIRD SWEEP THAT IS NOT A VOCABULARY AT ALL. French contracts an article or
a pronoun before a vowel; English has no construction that places one of those
letters before an apostrophe at the START of a word - every English contraction
attaches to the end ('s, 't, 're, 'll, 've), and o'clock is the exception everybody
knows. A lookbehind keeps those out. The rule therefore catches French the list has
never heard of, proper nouns and invented words included.

IT EARNED ITS PLACE ON THE FIRST RUN, finding two lines that 696 words had just
walked past: a note in the GCP registry and a section header in tools/naming.py.

AND IT CAUGHT THE GUARD AGAIN. The comment explaining the rule quoted two French
examples, which is the same self-reference that moved the word list out of the code
in the first place. The examples are gone; the rule is described instead.

EIGHT MUTATIONS, including the two the new sweep exists for:

  M1   an accented word                        -> caught, U+00E8 named
  M2   French carrying no accent               -> caught
  M3   the U+0153 ligature                     -> caught
  M4   French in the GENERATOR of 53 lines     -> caught
  M7   a sentence appended to the word list    -> refused, not a token
  M10  elision, a contracted article           -> caught
  M11  elision, a contracted conjunction       -> caught
  M12  English contractions and o'clock        -> NOT flagged, as intended

WHAT THIS STILL CANNOT DO, stated rather than implied: it finds French, it does not
prove English. A sentence of ordinary technical English words in French word order
passes, and so does any French word still outside 818. The honest claim is that the
sweep is now wide enough that each miss costs one line, not thirty-six - and that the
elision rule degrades gracefully where the vocabulary does not.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
administrator deleted branch test/a-word-list-has-a-ceiling 2026-10-28 07:57:10 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
shared/infra-conventions!6
No description provided.