Should docs/ document input shapes for the family-first name orders, and does a trailing particle belong in the notation? #469
Description
Activity
- addeddocsDocumentation fixes and updatesDocumentation fixes and updates
on Aug 30, 2026 Amended with the measured correspondence. It turned out much broader than the trailing-particle case it came from — 450 of 450 across middles, suffix commas and titles, including the cases where the title changes position between the two writings (
Ménil, Dr. ChristophevsDr. Ménil Christophe).So it is not a particle rule that happens to hold; the comma format and
FAMILY_FIRSTare the same format written two ways, and the trailing particle was the one place that failed until #467.Three homes proposed rather than one: user-facing guidance (the actionable form for a caller with comma-less family-first records), a note in the shapes documentation, and an executable invariant — the last being the part with real value, since it consults no rule and therefore catches a rule that is wrong. It would have failed #466 at 72 of 216 with no argument about vocabulary.
Correction to the measurement in this issue's body.
The 450/450 table above is the sliced-vocabulary artifact that
decisions.md#P6has since retracted: the script behind it sampledsorted(particles)[:14], and the row arithmetic carries the tell — 84 = 14×6 and 168 = 14×12. The same slice produced the 0/216 → 216/216 framing.The canonical measurement (2026-08-30, whole vocabulary, recorded in
decisions.md#P6): 0 of 630 → 603 of 630 — all 70 particles × 3 families × 3 givens. The 27 disagreeing pairs are not scatter: they are exactly the three words that are both particle and suffix vocabulary (vd,mc,do), where the particle attachment outranks the suffix reading on the comma side only (rules.md#P6), and it is that asymmetry that breaks the correspondence for them.The correspondence claim itself survives the correction — form 4 is still the family-comma format written inline, titles included — it just has a third limit alongside the two this issue already states. PR #482 landed the executable form:
tests/v2/test_order_correspondence.pygenerates the pairs (vocabulary chosen to pin forks, not padding) and sweeps the entire shipped particle vocabulary as a negative control asserting the disagreeing set is exactly{do, mc, vd}; customize.rst carries the caller-facing statement with the corrected, dated figure.Anyone re-measuring: recompute over the whole vocabulary, never a sample — the retraction note in
decisions.md#P6records how the sliced number got written twice.- added a commit that references this issue
on Sep 22, 2026 - added 4 commits that reference this issue
on Oct 8, 2026
The three documented input shapes are given-first only. Both family-first orders are shipped and neither is described.
Proposed:
[Particle]appears in shape 4 alone, and that is the notation carrying the rule rather than pointing at it: shape 5's trailing slot is the given name by the caller's declaration, so there is nothing there to reinterpret. Particles stay invisible insideFamilyeverywhere else because they are part of the bucket they join — a trailing particle earns a slot precisely because it is displaced from one.The correspondence with the family-comma format
Shape 4 is shape 2 with the comma removed and the family moved inline. It is not a particle rule that happens to hold — measured after #467, it is a general correspondence between the two formats:
Family, GivenFamily, Given MiddleFamily, Given ParticleFamily, Given Middle ParticleFamily, Given+ suffix commaFamily, Given Particle+ suffix commaFamily, Dr. Given≡Dr. Family GivenFamily, Dr. Given Particle≡Dr. Family Given Particle450 of 450, including the title cases where the title moves position between the two writings. The trailing particle was the one place it failed before #467 (0 of 216 agreed there).
Three things follow, and they want three different homes.
As user-facing guidance — this is the useful form for a caller. If your records are family-first without commas,
Policy(name_order=FAMILY_FIRST)reads them the way the comma format is read. Belongs wherevername_orderis documented, not buried in the shape notation.As a note in the shapes documentation — not a rule of its own, since it decides nothing a rule does not already, but the place a future change would have to notice it is breaking something.
As an executable invariant — generate the pairs and assert equality. This is the part that earns its keep: it consults no rule, so it catches a rule that is WRONG, which review cannot. It went 0/216 → 216/216 across #467, and it would have failed that change's rejected predecessor (#466) at 72 of 216 — the ambiguous-particle half — without anyone arguing about vocabulary. There is no test of this shape in the suite today.
Two limits it must carry, or it reads as a promise the parser cannot keep:
Doe, Dr. John→Doe Dr. Johnputs a title mid-name, which shape 2 never has). Not counterexamples; different shapes.Open: the CJK case fits neither shape
East Asian honorifics glue to the END and land in
suffix, nottitle(rules.md#W2):So a family-first CJK name has no leading title and no particle slot. That may want a third shape rather than a footnote on shape 4.
Background: what CLDR says, and where it stops
UTS #35's
titlefield is "a string that represents one or more honorifics or titles, such as 'Mr.', or 'Herr Doctor'", and it leads the pattern —{title} {given} {given2} {surname}, {credentials}— including under surname-first, whose worked example is Slavic (г-н Иван Петрович Васильев, honorific leading). Titles are optional; leading empty fields are dropped. No Vietnamese pattern examples are given, so the spec does not settle where a Vietnamese honorific sits.Worth flagging for a later decision: CLDR has two orders,
givenFirstandsurnameFirst, withko vi yue zhall under the latter. Our FF/FFGL split has no CLDR counterpart — the difference we encode as two orders is where the middle name sits, which CLDR expresses through the locale's pattern. Whether that should become a locale property rather than an order is a 3.0-shaped question and is NOT part of this issue.(The CLDR summary above came through a fetch-and-summarise of the spec; pull the sections verbatim before citing them as normative in
rules.md.)