docs: a family-first order may move the particle stop, and a conjunction-joined run is one word - #396
Merged
Merged
Conversation
The 2026-08-16 order-precedence keystone said no name_order moves a leading particle run's stopping point. Two implementation attempts (#390, closed unmerged) showed why that is wrong: declaring FAMILY_FIRST is precisely an assertion that what follows the family is not more surname, which is the same question the stopping point asks. The grouping/assignment split survives; only that one sentence is narrowed. Under the default order the run stays greedy, which makes "de Mesnil Juan" read like "pennie von bergen wessels" — the same shape, one real name. Also records the 3.0 reevaluation the reversal surfaced: every argument in the thread is a language judgement, and locale packs are where a caller supplies language instead of the parser guessing. Refs #395 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #396 +/- ##
=======================================
Coverage 98.51% 98.51%
=======================================
Files 44 44
Lines 2895 2895
=======================================
Hits 2852 2852
Misses 43 43 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
P3 already says a connective binds name words into one part; what it did not say is how OTHER rules count that part. They count it as one. The case that forced the question is #395, where P1's run must stop "after the first name word" and would otherwise be free to stop INSIDE a part P3 built, splitting "de la Vega y Santos Juan" between "Vega" and "Santos". The clause describes shipped behavior, not an aspiration: H1 counts this way today, so the examples are the H1 pair — "Mr. Jack and Jill" -> family="Jack and Jill" "Mr. Jack Jill" -> given="Jack" (boundary) decisions.md#P3 records the clause and how it was nearly shipped as an unexaminable one: the first draft asserted no rule could show it and carried an Accepted note saying so, having reasoned about which rules count rather than parsing a name. Refs #395 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
derek73
force-pushed
the
docs/order-aware-particle-stop
branch
from
August 18, 2026 06:53
66c8f84 to
a5ccd13
Compare
Every P3 example used y, E or И — the carve-out cases — so the
ordinary multi-letter join was never shown, and the boundary line
("Juan y Garcia" keeps y a name word) read as if three-word names
never join at all. Two contrast examples fix it: the same shape with
"and" joins, and so does "&", which is single-character but not a
letter. Measured, the predicate is len(text) == 1 and total < 4 and
text.isalpha().
The prose now says the carve-out reaches every single-letter
connective the vocabulary holds — Cyrillic и/і/й and Arabic و, not
just the two Latin ones — while the capital veto reaches only the
Latin ones, which is the asymmetry #383 is open about.
decisions.md#3-0-reevaluations gets the locale consequence: Spanish,
Portuguese and Dutch each want a different subset of single letters
joined, so a locale pack would have to carry the join threshold and
the initial veto as per-word policy. That is a stronger requirement
than yesterday's particle entry, which only asked packs to override
vocabulary membership.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
"Juan y Garcia" reads oddly as a boundary — y is inside P3's carve-out, not outside the rule. Surveying all 39 markers shows that is the convention rather than a slip: H1's boundary is "Sir John" (its given-name-title exception), H2's is "J. Smith" (bare initials, which its statement excludes), H3's is a title word mid-name. The marker means the rule's effect does not occur, and the informative case is almost always the rule's own exception. The preamble now says so. What was genuinely wrong is that P3 carried two markers meaning different things. "Mr. Jack Jill" is the contrast half of the H1 one-word pair — no connective is present at all — so it is not a limit of P3 and no longer claims to be. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
_group.py cites rules.md#P3 on _is_conj_piece, which is the joining
predicate; the single-letter carve-out lives in the merge loop of a
different function and carried only a v1 pointer ("Google Code issue
11"), so a reader there had no route to the rule.
Records what the code says and the rule does not: the threshold counts
ROOTNAMES, so a conjunction that is also suffix vocabulary is not
counted and raises its own bar by one name word. #397 measures that on
"i" (the Roman numeral), where it is the difference between fixing
Catalan's common shape and not.
Refs #397
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Docs, plus one code comment. Two records, both needed before #395 can be implemented.
decisions.md#P1— supersessionThe 2026-08-16 order-precedence keystone says "no
name_ordermoves that stopping point". It may. That sentence was a choice made to see where it landed; two implementation attempts on #390 (both closed unmerged) are where it landed, and both failed at the same place — trying to bound a leading particle run on position alone, in a parser that has correctly refused to detect language.Declaring
FAMILY_FIRSTorFAMILY_FIRST_GIVEN_LASTis precisely an assertion that what follows the family is not more surname, which is the question the stopping point asks. So the declaration is evidence about it. The grouping/assignment split survives everywhere else; only that one sentence is narrowed.The accepted cost is recorded with it: under the default order
de la Vega Juanstays wholly a surname, and a caller who means otherwise writes the comma. The same greedy reading is what makesde Mesnil Juanparse likepennie von bergen wessels— the same shape, and a real US politician's name.Per the log's discipline the 2026-08-16 entry is not edited; the new entry supersedes it and names what it does not touch (#368's reversal, P6, and the leading-particle-takes-the-family claim all stand).
Also appends to
#3-0-reevaluations: every argument in the thread —de/doVietnamese,vonGerman,dosPortuguese,dasboth Portuguese and a borne Bengali surname — is a language judgement, and locale packs are where a caller supplies language instead of the parser guessing. Not 2.x work; it needs packs to carry vocabulary overrides rather than additions.rules.md#P3— the conjunction clauseP3 said a connective binds name words into one part, but not how other rules count that part. They count it as one, so a rule taking "one name word" takes the whole join and never half of it. The case that forced the question is #395: a run that stops "after the first name word" would otherwise be free to stop inside a part P3 built, splitting
de la Vega y Santos JuanbetweenVegaandSantos.The clause describes shipped behavior. H1 counts this way today, which the examples now show as a minimal pair:
decisions.md#P3records the clause, including how it was nearly shipped unexaminable: the first draft asserted that no rule could show it today and carried anAccepted:note saying so. That was reasoning about which rules count instead of parsing a name — the H1 pair had never been run, and Derek caught it by asking whetherJack and Jillwas an example.rules.md#P3— the examples were all carve-out casesSeparately noticed by Derek: every P3 example used
y,EorИ, so the rule showed only the single-letter exceptions and never an ordinary join. The boundary line read as if three-word names simply don't join. Two contrast examples fix it:Measured, the predicate is
len(text) == 1 and total < 4 and text.isalpha()— so the carve-out counts letters, and the vocabulary holds six single-letter conjunctions (y e и і й و), not two. All six hit the carve-out; only the Latin ones hit the bare-capital veto, which is the asymmetry #383 is open about.decisions.md#3-0-reevaluationsrecords the locale consequence, which sharpens yesterday's particle entry: Spanish writesyand would wanteread as an initial, Portuguese wants the reverse, Dutch would want every single letter read as an initial. A pack that can only add or replace vocabulary cannot express that — the join threshold and the initial veto have to be per-word, per-pack policy.rules.mdpreamble — what· boundarymeans"Juan y Garcia" -> middle="y" · boundaryreads oddly, sinceyis inside P3's carve-out rather than outside the rule. Surveying all 39 markers shows that is the convention, not a slip — H1's boundary is"Sir John"(its given-name-title exception), H2's is"J. Smith"(bare initials, which its statement excludes), H3's is a title word mid-name. The marker means the rule's effect does not occur, and the informative case is almost always the rule's own stated exception, which is what makes the exception executable instead of merely asserted. The preamble now says that.What was actually wrong is mine: P3 had picked up two markers meaning different things.
"Mr. Jack Jill"is the contrast half of the H1 pair — no connective present at all — so it is not a limit of P3 and no longer claims to be._group.py— a citation where the carve-out isThe module cites
rules.md#P3on_is_conj_piece, the joining predicate. The single-letter carve-out is in the merge loop of a different function and carried only a v1 pointer ("Google Code issue 11"), so a reader standing at the code that implements the exception had no route to the rule. Comment-only.It also records something the code says and the rule does not: the threshold counts rootnames, so a conjunction that is also suffix vocabulary is not counted and raises its own bar by one name word. #397 measures that on
i.3472 tests pass (every example line executes). Prerequisite for #395. #390 was closed as superseded before this PR, so nothing here closes it.
🤖 Generated with Claude Code