meng and lac join the ambiguous suffix acronyms (#540) - #543
Merged
Merged
Conversation
MEng and LAc are live credentials and Meng and Lac are borne in the one slot the suffix vocabulary claims, the last word of a name -- Meng a common Chinese surname and given name, Lac a Vietnamese given name (the trailing word in native order, Nguyen Van Lac) and a French surname -- so both take the marking 'ma' and 'ba' carry rather than the removal 'rai' and 'cha' got. Two lines of data; rules.md#S2's words-to-spare and written-case reading does the rest. "wang meng" reads given 'wang', family 'meng' with a suffix-or-name report, where every release from 2.0.0 read suffix 'meng' and no family name (1.4.0 read the family, unflagged); 2.3.0 reported given-or-family there, the one-word-name fork, which was the wrong fork. "tran lac" moves the same way. After a family comma the lone word is the given name again, "Smith, meng" and "Smith, MEng" reading given 'meng' and 'MEng' as 1.4.0 did where every 2.x release read a suffix, and under FAMILY_FIRST "Wang Meng" reads given 'Meng'. "john smith meng" and "nguyen van lac" keep the credential, now reported. The cost is the one 'ma' carries: in a name written in more than one case, a member written neither in capitals nor all lower is the name even with words to spare, and MEng and LAc are written exactly that way. "john smith MEng" reads middle 'smith', family 'MEng' and "Smith, John MEng" reads middle 'MEng', where every release read suffix 'MEng'; the Title-case "Nguyen Van Lac" reads family 'Van Lac', which for a Vietnamese name is the gain. "JOHN SMITH MENG" keeps the suffix on the word count, one case saying nothing, and "Smith, MENG" on the capitals lean. No corpus name carried either word, so nine shape-tagged rows admit the forks to the contract tier -- six with no comma, three after a family comma. The gate classifies them under five fix(#540) rules at each 2.x baseline and two at 1.4.0: 545 -> 548, 509 -> 517, 421 -> 429, 275 -> 283 and 163 -> 171 intentional, 0 unexplained, radar unclassified unchanged. 'nguyen van lac' also diffs at 1.4.0 on its initials, for fix(#385/#402)'s reason, and joins that rule's list; three general comma rules gain reach without explaining, recorded. The render pin gains 'Wang Meng' and 'Tran Lac', and its negative control shows the masks this change declines re-spelling them 'Wang MEng' and 'Tran LAc'. Refs #540 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
rules.md#S2 gains four example lines for the two new members -- 'wang meng' as its non-firing boundary, 'tran lac', 'john smith meng' reading the credential with words to spare, and 'john smith MEng' reading the family name on the written case -- and corpus_rules.jsonl takes them; every one is already a shape-tagged case row, so the gate's counts do not move. decisions.md#suffix-acronym-collisions records the marking under the entry's own balance criterion, the fix on every comma path and under FAMILY_FIRST, the costs (the conventional mixed-case spellings behind a full name and after a family comma, the bracketed form), the Title-case 'Nguyen Van Lac' as the gain it is, and the two alternatives declined with their measurements: removing the words loses the bare credential outright, and masks, being role-free, re-spell the restored surnames 'Wang MEng' and 'Tran LAc'. edd and ded stay unmarked, borne as given names. The recount is 608 acronyms with 7 ambiguous, 5 before. The R4 Excluded block's 'to be filed' line goes, answered, with a dated supersession note on the sentences #540 overtook and the lac bearer corrected in place (a Vietnamese given name, the trailing word in native order). The release note states the fix and every cost with its before and after. Closes #540 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Two costs the marking carries were stated nowhere: a credential run ending in MEng or LAc is pulled into the name ('Mary Jones PhD MEng' reads middle 'Jones PhD', family 'MEng', where every release read the suffix run), rules.md#S2's declined pick stopping the walk as it does for 'Doe, John MA Ma'; and after a family comma a title-shaped credential in front of one reads as a title with no report ('Jane Doe, MS LAc' reads title 'MS', given 'LAc', unflagged), a pre-existing silent path 'Jane Doe, MS Ma' already takes on 2.3.0. The release note and decisions.md#suffix-acronym-collisions name both, the note's workaround narrows to a lone credential, and the silent path is to be filed as a follow-up.
suffixes.py's ambiguous-set comment said a bare member counts as a suffix only when written with periods, false since #289 and contradicted by this branch's own 'john smith meng' row; it now points at rules.md#S2, and the docstring and customize.rst widen 'nickname' to a word borne as a name. AGENTS.md's list of decided collisions gains the two words.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #543 +/- ##
=======================================
Coverage 98.78% 98.78%
=======================================
Files 45 45
Lines 3703 3703
=======================================
Hits 3658 3658
Misses 45 45 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Three reviewers read the pull request (code, tests, comments); this is what they found. A credential run behind a suffix comma that ends in meng or lac is no longer wholly suffix-shaped, so C1 reads the comma as a family comma and the run's words fall into the post-comma name slots: "John Smith, PhD MEng" reads given 'PhD', middle 'MEng', family 'John Smith', and no case form saves it. It is the path "john smith, phd ma" already takes; the release note and decisions.md said "a title-shaped credential reads as a title", which was one corner of it. Two rows pin it, a union-fields ledger rule classifies it at every baseline, and the note's workaround now states what was measured: a lone credential, or a second comma before the run, keeps the credential reading; capitals do not. "Wang M.Eng." reads family 'M.Eng.': S2's period gate counts a member as unambiguous only written one period per letter, and MEng and LAc are the first members whose conventional dotted spelling is chunked. DECIDED (Derek, 2026-09-25): accepted and recorded rather than widening the gate; the question goes to the follow-up issue with the comma re-read. "Nguyen Van Lac" (family 'Van Lac', the gain, moving against 1.4.0 too) and "John Smith MEng PhD" (the cost with a credential behind it) were unpinned and now have rows and rules; the family rule gains a superstring probe, since dropping its anchors had passed every guard. Two claims were false on the wheels: "every release gave suffix 'PhD MEng'" (through 2.2 the joiner was a comma, 'PhD, MEng'), and the dated Excluded bullet's present-tense "Both read as a suffix", whose supersession note now follows it. suffixes.py's comment gains S2's third clause (not Title-case in a mixed-case name), its docstring stops enumerating readers, cases.py's roster comment points at the constant, and AGENTS.md's _initials sentence says what compare.py does: roles AND ambiguity kinds must agree. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The comma re-read by a credential run ending in an ambiguous member, its silent title-dual case, and whether a listed member's chunked dotted spelling should pass the period gate are filed as #544; the seven sites that said a follow-up was to be filed now name it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
meng(MEng) andlac(LAc) joinSUFFIX_ACRONYMS_AMBIGUOUS. Both are borne as names in the one slot the suffix vocabulary claims, the last word of a name, and the unambiguous claim cost the family name:wang menghas read suffixmengwith no family since 2.0.0, and since #521 renderedWang MENG. Two lines of data; rules.md#S2's words-to-spare and written-case reading does the rest, exactly as it does formaandba.Closes #540
What changes
wang meng→ givenwang, familymeng, with asuffix-or-namereport (every 2.x release: suffixmeng, no family; 2.3.0 reportedgiven-or-family, the wrong fork; 1.4.0 read the family, unflagged).tran lacmoves the same way;Wang, MengandSmith, mengget 1.4.0's given name back after a family comma; underFAMILY_FIRST,Wang Mengreads givenMeng. The render follows:Wang Meng,Tran Lac.john smith meng→ suffixmeng(John Smith MENG),nguyen van lac→ suffixlac. Capitals keep it in a mixed-case name (John Smith MENG,Smith, MENG).maalready carries, and it falls on the conventional spellings: in a name written in more than one case S2 reads a member written neither in capitals nor all lower as the name even with words to spare.john smith MEng→ middlesmith, familyMEng;Smith, John MEng→ middleMEng;Smith, MEng→ givenMEng;John Smith (MEng)→ nickname. Every release read suffixMEngfor all four. A credential run ending in one of them goes the same way (Mary Jones PhD MEng→ middleJones PhD, familyMEng;John Smith MEng PhD→ familyMEng, suffixPhD), S2's declined pick stopping the walk as it does forDoe, John MA Ma. Behind a suffix comma the run is no longer wholly suffix-shaped, so the comma re-reads as a family comma in every case form (John Smith, PhD MEng→ givenPhD, middleMEng, familyJohn Smith; a title-listed front word reads as a title with no report,Jane Doe, MS LAc), the pathjohn smith, phd maalready takes; a second comma before the run keeps the credential (John Smith, PhD, MEng).Wang M.Eng.→ familyM.Eng.: the period gate counts a member as unambiguous only written one period per letter, and these are the first members whose dotted spelling is chunked (accepted and recorded, decided;John Smith M.Eng.keeps the suffix). Both the comma re-read and the period-gate question are Should a credential run after a comma keep its comma when the last word is an ambiguous acronym?John Smith, PhD MEngreads firstPhD, lastJohn Smith#544. The Title-caseNguyen Van Lac→ familyVan Lacis the gain for a Vietnamese name.john smith meng→ familymeng) and masksmeng → MEng/lac → LAc(the mask clause is role-free, so it would re-spell the restored surnamesWang MEng,MEng Li).eddanddedstay unmarked: borne as given names, not the trailing slot; a trailing bearer reopens them.Measured
No corpus name carried either word before this change, so every mover is one of the fourteen shape-tagged case rows this PR adds, nine with no comma and five with one (full name before it, lone word before it, a credential run behind it). Classified under eight
fix(#540)ledger rules at each 2.x baseline and four at 1.4.0; the gate exits 0 at all five with nothing unexplained and the radar tier unchanged.john smith MEng,John Smith MEng PhD,Smith, John MEng,John Smith, PhD MEng,john smith, phd meng,Nguyen Van Lac(+nguyen van lacon initials,fix(#385/#402))Role fields moved on zero pre-existing corpus names. Recount by
decisions.md#vocabulary-collisions' recipe:suffix_acronyms608 with 7 ambiguous (5 before).Docs, same PR
rules.md#S2gains four example lines;decisions.md#suffix-acronym-collisionsgets the dated decision (balance criterion, every comma path, the costs), the two Declined alternatives with their recipes, and the measurement; the R4 Excluded block's "to be filed" line goes (answered), with a dated supersession note on the sentences #540 overtook and thelacbearer corrected in place (a Vietnamese given name, the trailing word in native order); one release-log bullet with every before/after.Review
Sonnet implementer, Opus reviewers: spec compliance (an independent replay of every edit byte-identical to the tree), code quality with seven planted mutants all killed (the one survivor deletes a check), two re-reviews of fix rounds, the design-docs reviewer on docs/design/, a spec-and-claims reviewer on the wheels, a whole-branch review whose silent-failure sweep ran 550 texts under three orders against 2.3.0 and matched every bare-spelling mover to the pinned
mafork of the same shape, and a/pr-review-toolkitround (code, tests with 20 planted mutants, comments against all five wheels). Review found and fixed: the comma paths unpinned (three rows and two ledger rules added), a removal recipe that raised on the tree, a liveness argument where the entry's criterion asks for balance,Lacmisdescribed as a surname, a Title-case Vietnamese name filed as a cost, stale standing counts in thefix(#385/#402)ledger prose, four unstated movers (the credential run, the comma re-read behind a suffix comma, the Title-caseNguyen Van Lac, the chunked dottedWang M.Eng.), a release-note claim false on four wheels (the pre-2.3 comma joiner), a ledger rule whose anchors could be dropped unnoticed, and a suffixes.py comment false since #289.Verification
uv run pytest -q: 9987 passed, 324 skipped, 3 xfaileduv run mypy: clean (111 files);uv run ruff check .: cleansphinx-build -b doctestand-b html: 0 failures, no warnings;python -m doctest README.rst: cleantools/differential/compare.pyat 1.4.0 / 2.0.0 / 2.1.0 / 2.2.0 / 2.3.0: exit 0;corpus_shapes.jsonl223 → 237,corpus_rules.jsonl414 → 420🤖 Generated with Claude Code