close
Skip to content

abdul Jr Smith Berg reads given abdul Jr — P5's join takes a suffix as "the word after" the bound word #421

Description

@derek73

A bound given-name word joins whatever piece follows it, suffix included:

abdul Salam Smith Berg     ->  given='abdul Salam'  middle='Smith'  family='Berg'
abdul Jr Smith Berg        ->  given='abdul Jr'     middle='Smith'  family='Berg'   suffix=''
abdul PhD Smith Berg       ->  given='abdul PhD'    middle='Smith'  family='Berg'   suffix=''
Berg, abdul Jr Smith       ->  given='abdul Jr'     middle='Smith'  family='Berg'   suffix=''

and where the suffix is the split credential, the bound word joins into it and becomes part of the suffix:

abdul Ph. D. Smith Berg    ->  given='Smith'  family='Berg'  suffix='abdul Ph. D.'

Why

rules.md#P5 says the join "joins the word after it into one given name" and "needs a name word to spare". The reserve honours the second half — it counts only non-suffix pieces, so abdul Jr Jones declines — but the join itself never asks whether the piece it is about to take is a name word. In _group.py the bound-given block checks absorbs_marker (#411: "a marker is not a name word") and nothing else, then merge(first_name_k, first_name_k + 2).

The credential shape is worse because merge() unions piece tags: the "Ph. D." piece carries suffix from the ph-d merge, so the joined abdul Ph. D. piece is a suffix piece and assign routes the bound word to the suffix field.

Scope

  • The Jr/PhD shape is pre-existing: 1.4.0 reads abdul Jr Smith Berg as first abdul Jr too. Parity, not a regression.
  • The split-credential shape is a 2.0 regression: 1.4.0 read abdul Ph. D. Smith Berg as first abdul Smith, suffix Ph. D. (v1's fix_phd extracted the credential before parsing, so position never mattered). 2.x reads suffix abdul Ph. D..
  • No differential corpus name has a bound word directly followed by a suffix (36 carry a bound word; none with this shape), so the gate cannot see either half. Surfaced by fix(group): run the maiden marker pass before every join (#412, #417, #418) #420's re-pin of abd née Jones Jr Smith Berg, which reads given abd Jr because abd Jr Smith Berg does; tests/v2/cases.py::bound_given_join_sees_only_the_surviving_name pins today's reading and would move.

Fix

Decline the join when the piece it would absorb is a suffix piece, the same way it already declines for a marker — one test beside absorbs_marker. That makes the rule read as it is stated: the join takes a name word, and the reserve and the join then agree about what one is. abdul Jr Smith Berg would read given abdul, middle Jr Smith, family Berg (the inner-suffix-to-middle placement abdul Jr Jones already has), and abdul Ph. D. Smith Berg would read given abdul, middle Smith, family Berg, suffix Ph. D. — 1.4.0's reading restored.

P5's statement would gain a clause: "The join never absorbs a marker (M2) or a suffix (S1) — neither is a name word." Worth a row each in the case table and an example line under P5, since the differential corpora cannot carry the shape.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions