Skip to content

meng and lac join the ambiguous suffix acronyms (#540) - #543

Merged
derek73 merged 5 commits into
masterfrom
claude/540-meng-lac-ambiguous
Sep 26, 2026
Merged

derek73 merged 5 commits into
masterfrom
claude/540-meng-lac-ambiguous

Conversation

@derek73

@derek73 derek73 commented Sep 25, 2026 •

Copy link
Copy Markdown
Owner

meng (MEng) and lac (LAc) join SUFFIX_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 meng has read suffix meng with no family since 2.0.0, and since #521 rendered Wang MENG. Two lines of data; rules.md#S2's words-to-spare and written-case reading does the rest, exactly as it does for ma and ba.

Closes #540

What changes

  • A bare trailing Meng or Lac with no words to spare is the family name. wang meng → given wang, family meng, with a suffix-or-name report (every 2.x release: suffix meng, no family; 2.3.0 reported given-or-family, the wrong fork; 1.4.0 read the family, unflagged). tran lac moves the same way; Wang, Meng and Smith, meng get 1.4.0's given name back after a family comma; under FAMILY_FIRST, Wang Meng reads given Meng. The render follows: Wang Meng, Tran Lac.
  • With words to spare the credential stays, now reported: john smith meng → suffix meng (John Smith MENG), nguyen van lac → suffix lac. Capitals keep it in a mixed-case name (John Smith MENG, Smith, MENG).
  • The cost is the one ma already 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 → middle smith, family MEng; Smith, John MEng → middle MEng; Smith, MEng → given MEng; John Smith (MEng) → nickname. Every release read suffix MEng for all four. A credential run ending in one of them goes the same way (Mary Jones PhD MEng → middle Jones PhD, family MEng; John Smith MEng PhD → family MEng, suffix PhD), S2's declined pick stopping the walk as it does for Doe, 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 → given PhD, middle MEng, family John Smith; a title-listed front word reads as a title with no report, Jane Doe, MS LAc), the path john smith, phd ma already takes; a second comma before the run keeps the credential (John Smith, PhD, MEng). Wang M.Eng. → family M.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 MEng reads first PhD, last John Smith #544. The Title-case Nguyen Van Lac → family Van Lac is the gain for a Vietnamese name.
  • Declined with measurement (decisions.md): removal (loses the bare credential outright, john smith meng → family meng) and masks meng → MEng / lac → LAc (the mask clause is role-free, so it would re-spell the restored surnames Wang MEng, MEng Li). edd and ded stay 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.

baseline intentional diffs #540 names
1.4.0 545 → 552 john smith MEng, John Smith MEng PhD, Smith, John MEng, John Smith, PhD MEng, john smith, phd meng, Nguyen Van Lac (+ nguyen van lac on initials, fix(#385/#402))
2.0.0 / 2.1.0 / 2.2.0 / 2.3.0 509 → 522 / 421 → 434 / 275 → 288 / 163 → 176 the thirteen rows that move or gain a report

Role fields moved on zero pre-existing corpus names. Recount by decisions.md#vocabulary-collisions' recipe: suffix_acronyms 608 with 7 ambiguous (5 before).

Docs, same PR

rules.md#S2 gains four example lines; decisions.md#suffix-acronym-collisions gets 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 the lac bearer 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 ma fork of the same shape, and a /pr-review-toolkit round (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, Lac misdescribed as a surname, a Title-case Vietnamese name filed as a cost, stale standing counts in the fix(#385/#402) ledger prose, four unstated movers (the credential run, the comma re-read behind a suffix comma, the Title-case Nguyen Van Lac, the chunked dotted Wang 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 xfailed
  • uv run mypy: clean (111 files); uv run ruff check .: clean
  • sphinx-build -b doctest and -b html: 0 failures, no warnings; python -m doctest README.rst: clean
  • tools/differential/compare.py at 1.4.0 / 2.0.0 / 2.1.0 / 2.2.0 / 2.3.0: exit 0; corpus_shapes.jsonl 223 → 237, corpus_rules.jsonl 414 → 420

🤖 Generated with Claude Code

derek73 and others added 3 commits September 25, 2026 01:21
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>
@derek73 derek73 added this to the 2.4 milestone Sep 25, 2026
@derek73 derek73 added bug docs Documentation fixes and updates labels Sep 25, 2026
@derek73 derek73 self-assigned this Sep 25, 2026
@codecov

codecov Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.78%. Comparing base (120033b) to head (f8de0ac).

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.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug docs Documentation fixes and updates

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Should meng and lac be ambiguous suffix acronyms? wang meng has had no family name since 2.0 and renders Wang MENG on master

1 participant