The join that makes abdul Smith one given name reserves a word so a family name survives it. An initial-shaped Roman numeral defeats the reserve, and the family name disappears:
abdul Smith II -> given='abdul' family='Smith' suffix='II' correct
abdul Smith Jr -> given='abdul' family='Smith' suffix='Jr' correct
abdul Smith V -> given='abdul Smith' family='' suffix='V' family lost
abdul Smith I -> given='abdul Smith' family='' suffix='I'
abdul Smith X -> given='abdul Smith' family='' suffix='X'
Why
The reserve counts the pieces that are neither title nor suffix, and _is_suffix_piece vetoes on initial:
return "vocab:suffix" in tags and "initial" not in tags
A bare V carries both vocab:suffix and initial, so it is not counted as a suffix. The reserve sees three name words and lets the join fire; assign then reads that same V as a suffix, and the family name the reserve believed it was protecting was never there.
Only the single-letter numerals reach it — V, I, X. II and Jr are unaffected because neither is initial-shaped. Every bound given-name word is affected (abdul, abu, abd, أبو), so this is not one vocabulary entry misbehaving.
The veto is right for assign and wrong for the reserve
A lone V in the middle of a name genuinely may be a middle initial, and that is what the veto protects — rule S3's territory. But the reserve is not classifying the word. It is asking a different question: will a family name survive this join? For that question the only correct answer is the one assign will actually give, and assign gives suffix.
Scope
Pre-existing and unrelated to #400 — reproduces on master with abdul, shipped since the 1.x line. Rule P5's statement in docs/design/rules.md now states the reserve ("it needs a name word to spare, so two name words alone do not join"), and this is a case where the rule believes it has a word to spare and does not.
Verification is weak here
Of the 751 differential corpus names, 11 start with a bound given-name word and only one loses its family name — the degenerate single-token "abdul", which is a different shape. No corpus name has this one, so the harness cannot see the fix. Tests are the verification.
Found by an adversarial review of #400, which fuzzed 71,904 inputs and isolated the 142 family-losing shapes; all 142 reproduce with abdul on unchanged code.
The join that makes
abdul Smithone given name reserves a word so a family name survives it. An initial-shaped Roman numeral defeats the reserve, and the family name disappears:Why
The reserve counts the pieces that are neither title nor suffix, and
_is_suffix_piecevetoes oninitial:A bare
Vcarries bothvocab:suffixandinitial, so it is not counted as a suffix. The reserve sees three name words and lets the join fire;assignthen reads that sameVas a suffix, and the family name the reserve believed it was protecting was never there.Only the single-letter numerals reach it —
V,I,X.IIandJrare unaffected because neither is initial-shaped. Every bound given-name word is affected (abdul,abu,abd,أبو), so this is not one vocabulary entry misbehaving.The veto is right for
assignand wrong for the reserveA lone
Vin the middle of a name genuinely may be a middle initial, and that is what the veto protects — rule S3's territory. But the reserve is not classifying the word. It is asking a different question: will a family name survive this join? For that question the only correct answer is the oneassignwill actually give, andassigngivessuffix.Scope
Pre-existing and unrelated to #400 — reproduces on
masterwithabdul, shipped since the 1.x line. Rule P5's statement indocs/design/rules.mdnow states the reserve ("it needs a name word to spare, so two name words alone do not join"), and this is a case where the rule believes it has a word to spare and does not.Verification is weak here
Of the 751 differential corpus names, 11 start with a bound given-name word and only one loses its family name — the degenerate single-token
"abdul", which is a different shape. No corpus name has this one, so the harness cannot see the fix. Tests are the verification.Found by an adversarial review of #400, which fuzzed 71,904 inputs and isolated the 142 family-losing shapes; all 142 reproduce with
abdulon unchanged code.