C1's run test (_segment.py, #544) declines to flip a comma when every listed member of the run is written in capitals in a mixed-case name (the settled path). It hands the part to the family-comma path on a promise: that path already reads the part wholly as credentials, so the flip would change nothing.
John Smith, PhD MA → given John, family Smith, suffix "PhD MA", no report
The promise is kept by a partial mirror. Segment runs before group, so it can't ask assign's segment_suffix_reading directly. Instead it approximates the answer with isupper(), listed membership and ambiguous_lean. Nothing checks that the approximation and assign's actual reading still agree. Commit 6 of #552 already moved assign's side of that boundary: a dual opening the given part now stops the anchor (Smith, Ms MD Ma). A future change there, or to the lean, could break the promise without failing any test. A run would then be declined as settled and read back into the name fields, silently.
Measured today (PR #552 tip, 2026-09-28): runs of 2–3 words, each a capitals member (MA BA ED DO JD MENG LAC) or a suffix word (PhD MD MS Jr Esq. Sr III Ms), with at least one member, behind John Smith, and Jane Doe, . That is 6,048 texts. 20 put a post-comma word in a name field, all ending in DO DO, which is the recorded rules.md#S2 limit where the P2 chain takes the particle. Master reads all 20 the same way. So the promise holds today; this issue is about keeping it.
Proposed guard: for every run the C1 test declines on the settled path, assert that assign's reading of that part has every word in SUFFIX or TITLE, with the DO DO P2-chain shape as the one recorded exception. Record a negative control, e.g. dropping the isupper() condition, and how many cases it fails. Join an existing grid's walk if one reaches these shapes (AGENTS.md: invariant tests share one parsed grid), or build this small one and state its runtime.
C1's run test (
_segment.py, #544) declines to flip a comma when every listed member of the run is written in capitals in a mixed-case name (thesettledpath). It hands the part to the family-comma path on a promise: that path already reads the part wholly as credentials, so the flip would change nothing.The promise is kept by a partial mirror. Segment runs before group, so it can't ask assign's
segment_suffix_readingdirectly. Instead it approximates the answer withisupper(), listed membership andambiguous_lean. Nothing checks that the approximation and assign's actual reading still agree. Commit 6 of #552 already moved assign's side of that boundary: a dual opening the given part now stops the anchor (Smith, Ms MD Ma). A future change there, or to the lean, could break the promise without failing any test. A run would then be declined as settled and read back into the name fields, silently.Measured today (PR #552 tip, 2026-09-28): runs of 2–3 words, each a capitals member (
MA BA ED DO JD MENG LAC) or a suffix word (PhD MD MS Jr Esq. Sr III Ms), with at least one member, behindJohn Smith,andJane Doe,. That is 6,048 texts. 20 put a post-comma word in a name field, all ending inDO DO, which is the recorded rules.md#S2 limit where the P2 chain takes the particle. Master reads all 20 the same way. So the promise holds today; this issue is about keeping it.Proposed guard: for every run the C1 test declines on the settled path, assert that assign's reading of that part has every word in SUFFIX or TITLE, with the
DO DOP2-chain shape as the one recorded exception. Record a negative control, e.g. dropping theisupper()condition, and how many cases it fails. Join an existing grid's walk if one reaches these shapes (AGENTS.md: invariant tests share one parsed grid), or build this small one and state its runtime.