You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
A bound given-name word joins whatever piece follows it, suffix included:
and where the suffix is the split credential, the bound word joins into it and becomes part of the suffix:
Why
rules.md#P5says 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, soabdul Jr Jonesdeclines — 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 checksabsorbs_marker(#411: "a marker is not a name word") and nothing else, thenmerge(first_name_k, first_name_k + 2).The credential shape is worse because
merge()unions piece tags: the "Ph. D." piece carriessuffixfrom the ph-d merge, so the joinedabdul Ph. D.piece is a suffix piece and assign routes the bound word to the suffix field.Scope
Jr/PhDshape is pre-existing: 1.4.0 readsabdul Jr Smith Bergas firstabdul Jrtoo. Parity, not a regression.abdul Ph. D. Smith Bergas firstabdul Smith, suffixPh. D.(v1'sfix_phdextracted the credential before parsing, so position never mattered). 2.x reads suffixabdul Ph. D..abd née Jones Jr Smith Berg, which reads givenabd Jrbecauseabd Jr Smith Bergdoes;tests/v2/cases.py::bound_given_join_sees_only_the_surviving_namepins 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 Bergwould read givenabdul, middleJr Smith, familyBerg(the inner-suffix-to-middle placementabdul Jr Jonesalready has), andabdul Ph. D. Smith Bergwould read givenabdul, middleSmith, familyBerg, suffixPh. 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.