|
1 | 1 | # vocabulary-exclusions — words kept out of a vocabulary set, and contested memberships |
2 | 2 |
|
3 | | -The `Excluded:` and `Open:` blocks keyed by a vocabulary set rather than a rule (the entry conventions in README.md). Until #713 they sat in decisions.md after whichever entry happened to precede them, so the split filed them into the P3, W2, P5 and R4 entries; they moved here together, in their old order, so a wordlist editor finds every set's prohibitions in one place. Since 2026-10-18 a word-level refusal can be data instead — an `excluded` key on the word's entry in nameparser/vocab/*.toml (decisions/vocabulary-model) — and a block shrinks to its class-level part as its words move (the README's exception to append-only); the honorific_tails block below was the first, the particle block the second (#749), and the two title blocks the third (#750). `uv run python tools/vocab/query.py --excluded <kind>` lists the moved ones. |
| 3 | +The `Excluded:` and `Open:` blocks keyed by a vocabulary set rather than a rule (the entry conventions in README.md). Until #713 they sat in decisions.md after whichever entry happened to precede them, so the split filed them into the P3, W2, P5 and R4 entries; they moved here together, in their old order, so a wordlist editor finds every set's prohibitions in one place. Since 2026-10-18 a word-level refusal can be data instead — an `excluded` key on the word's entry in nameparser/vocab/*.toml (decisions/vocabulary-model) — and a block shrinks to its class-level part as its words move (the README's exception to append-only); the honorific_tails block below was the first, the particle block the second (#749), the two title blocks the third (#750), and the case-mask and single-letter-connective refusals and two of the maiden-marker ones (`roz`, `f.`) the fourth (#751). `uv run python tools/vocab/query.py --excluded <kind>` lists the moved ones, a refused property by its name (`--excluded may_be_initial`). |
4 | 4 |
|
5 | 5 | Excluded (Lexicon.conjunctions_ambiguous, the conjunction readings marked `may_be_initial` — an entry here reads as an INITIAL in a name written wholly in one case): |
6 | 6 |
|
7 | | -- `y` — the commonest Hispanic double-surname link and this library's oldest fixture ("Velasquez y Garcia"); marking it would read the surname link of every lowercase Hispanic record as a middle initial. A caller who wants the Dutch reading adds it (2026-09-13, #383/#479). |
8 | | -- Cyrillic `и`, `і`, `й` — #267 blessed their joining and this change narrows nothing about it; marking one would break the reading #267 adjudicated, in the one-case spellings where nothing else decides (2026-09-13, #383/#479). |
| 7 | +- The per-word refusals are data since #751 (2026-10-20): `y` in es.toml — the commonest Hispanic double-surname link and this library's oldest fixture, "Velasquez y Garcia" — and the Cyrillic `и`, `і` and `й` in ru.toml and uk.toml, whose joining #267 blessed, each carry `excluded = { may_be_initial = … }` on their conjunction reading with the reason (2026-09-13, #383/#479). `uv run python tools/vocab/query.py --excluded may_be_initial` lists them; a contributor who marks one meets the reason as a build error. |
9 | 8 | - `و` and any other caseless letter — inert rather than harmful, and excluded so nobody adds one believing it does something: the fork requires a token whose `upper()` and `lower()` differ, so a caseless member is never consulted (2026-09-13). |
10 | 9 | - Multi-letter entries (`and`, `та`, `και`) and `&` — the fork tests a single CHARACTER, so an entry longer than one letter is silently inert. The vocabulary build refuses `may_be_initial` on anything but a cased single letter (tools/vocab/build.py; an import-time assert in the conjunctions module until 2026-10-18) (2026-09-13). |
11 | 10 |
|
@@ -74,9 +73,9 @@ Excluded (MAIDEN_MARKERS, the birth_marker readings): |
74 | 73 | #274 flagging "is nee safe as a default (it's also a rare |
75 | 74 | surname)" as open; the question resolved silently with the shipped set. Recorded here because the included risky member deserves its analysis as much as the excluded ones; M1's (Nee) boundary covers only the enclosure path, not this marker path. |
76 | 75 | - "born" — never shipped: a release-log drafting invention, caught by the 2.0 milestone audit and corrected (5ccf9f3). Recorded so nobody "restores" it; if ever proposed for real, Max Born is the counterexample to analyze. |
77 | | -- Scandinavian "f." — collides with the initial F.; only the full participles (født/fødd/född) are safe. Czech masculine "rozený" awaits the same vetting, on its own merits rather than following the feminine form in. |
| 76 | +- Scandinavian "f." — collides with the initial F.; only the full participles (født/fødd/född) are safe. Data since #751 (2026-10-20): `f` in da.toml carries `excluded = { birth_marker = … }`. Czech masculine "rozený" awaits the same vetting, on its own merits rather than following the feminine form in. |
78 | 77 | - Polish "z domu" — INCLUDED 2026-08-26 as the set's first phrase entry, and the contrast to draw against the roz removal below rather than against any included word. Its words fail C-i separately and it passes as a pair; the argument is in the #434 entry under #M2. The point to carry away is that the entry below could not have been rescued the same way: roz is a whole marker as written, so there is no longer unit to move the claim onto. |
79 | | -- Czech/Slovak "roz." — SHIPPED through 2.1 and removed 2026-08-26 (Derek's call). Roz is an ordinary English diminutive of Rosalind, and matching is whole-token, case-folded and period-insensitive, so "Roz", "roz" and "roz." are one string to this set. The collision is not theoretical and it is not new: on the bare path, which predates the 2.2 work entirely, "Rosalind Roz Smith" read maiden "Smith" and NO family name at all, and "Rosalind Roz Jones Smith" read maiden "Jones Smith", because M2 hands the marker every word after it. Grounded in #vocabulary-collisions C-i — a word belongs in its set's ambiguous subset iff it is borne as an ordinary name IN THE POSITION THE VOCABULARY CLAIM ACTS ON, and under uncertainty default to ambiguous. Roz is borne exactly there: the word after a given name, which is the only position M2's claim acts on. What C-i cannot do for this set is the marking: MAIDEN_MARKERS has no ambiguous subset, and no code path consults one, so the only two expressions of C-i available here are ship and do not ship. That is why the remedy is removal rather than an ambiguous marking, and it is worth knowing before someone proposes marking the next collision instead. The full participle rozená stays and is unambiguous; a Czech caller who needs the abbreviation adds it to their own Lexicon, which is the same answer this section gives for every locale-specific vocabulary. The cost is accepted and stated: "Anna Nováková roz. Svobodová" now reads middle "Nováková roz.", family "Svobodová" — which is how 1.4.0 read it — and "Rosalind Roz Smith" is back to 1.4.0's given/middle/family. Pinned by tests/v2/cases.py::diminutive_that_was_a_marker_keeps_the_family and ::full_participle_marker_still_consumes. |
| 78 | +- Czech/Slovak "roz." — SHIPPED through 2.1 and removed 2026-08-26 (Derek's call). Roz is an ordinary English diminutive of Rosalind, and matching is whole-token, case-folded and period-insensitive, so "Roz", "roz" and "roz." are one string to this set. The collision is not theoretical and it is not new: on the bare path, which predates the 2.2 work entirely, "Rosalind Roz Smith" read maiden "Smith" and NO family name at all, and "Rosalind Roz Jones Smith" read maiden "Jones Smith", because M2 hands the marker every word after it. Grounded in #vocabulary-collisions C-i — a word belongs in its set's ambiguous subset iff it is borne as an ordinary name IN THE POSITION THE VOCABULARY CLAIM ACTS ON, and under uncertainty default to ambiguous. Roz is borne exactly there: the word after a given name, which is the only position M2's claim acts on. What C-i cannot do for this set is the marking: MAIDEN_MARKERS has no ambiguous subset, and no code path consults one, so the only two expressions of C-i available here are ship and do not ship. That is why the remedy is removal rather than an ambiguous marking, and it is worth knowing before someone proposes marking the next collision instead. The full participle rozená stays and is unambiguous; a Czech caller who needs the abbreviation adds it to their own Lexicon, which is the same answer this section gives for every locale-specific vocabulary. The cost is accepted and stated: "Anna Nováková roz. Svobodová" now reads middle "Nováková roz.", family "Svobodová" — which is how 1.4.0 read it — and "Rosalind Roz Smith" is back to 1.4.0's given/middle/family. Pinned by tests/v2/cases.py::diminutive_that_was_a_marker_keeps_the_family and ::full_participle_marker_still_consumes. The refusal is data since #751 (2026-10-20): `roz` in cs.toml carries `excluded = { birth_marker = … }` with its reason, measured again that day (`--excluded birth_marker`). |
80 | 79 |
|
81 | 80 | Excluded (CAPITALIZATION_EXCEPTIONS — meng, edd, lac, ded, left out of the 2026-09-24 masks, #459): |
82 | 81 |
|
|
0 commit comments