Skip to content

Maiden marker counts only behind a surname; a credential starts a suffix run (#601, #602) - #609

Merged
derek73 merged 9 commits into
masterfrom
feat/issue-601-602-m2-rethink
Oct 4, 2026
Merged

derek73 merged 9 commits into
masterfrom
feat/issue-601-602-m2-rethink

Conversation

@derek73

@derek73 derek73 commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Closes #601. Closes #602. Grew out of #548 (Dr. nee Smith PhD Prof.), which was closed into these two.

Summary

Degenerate input

Jane Doe, PhD née Smith and Berg, Jane van der nee Smith DO read differently than in 2.3.0. Both are garbage in, garbage out, with no reading designed for them. decisions.md#M2 records the measured move so it isn't mistaken for a regression, and the release log leaves them out.

Review rounds

Simplify pass and design docs

Notes

  • The 1.4.0 ledger still has Doe, J. nee MA ba and Doe, Jane nee Smith PhD MEng claimed by the broad comma-family rule.
  • Unclassified radar diffs at each baseline predate this branch.

Test plan

  • uv run pytest (11,379 passed on the final merge), also run without namedivider
  • uv run mypy, uv run ruff check
  • sphinx-build -b doctest docs, python -m doctest README.rst
  • differential gate at 1.4.0, 2.0.0, 2.1.0, 2.2.0 and 2.3.0, all exit 0, no moved shapes
  • release-log readings checked against the 1.4.0, 2.0.0–2.3.0 wheels

🤖 Generated with Claude Code

derek73 and others added 5 commits October 4, 2026 02:34
…s part (#602)

An unambiguous Latin suffix word of two or more letters, standing after
two name words with no comma or after the given word in the part after
a family comma, makes every later word of that part a suffix, except a
title word, which reads as a title. `John Smith PhD Jones` reads suffix
'PhD Jones' where it read middle 'Smith PhD'; `Eric H. Holder Jr.
Attorney General` reads title 'Attorney General' as its comma spelling
always did. An absorbed name word is reported suffix-or-name.

One predicate, `starts_a_credential_run`, read by the trailing peel
through `credential_run` (so assign, P5's reserve, P2's chain stop and
the maiden walk see one answer) and by the given-part walk. A title
word, the ambiguous class, a single letter, a connective, particle or
bound-given vocabulary (`Abd Allah`), and the non-Latin honorifics
never start the run; a lone particle does not count toward the core.
The tag tests run inline ahead of the predicate, so ordinary pieces and
links pay no frame.

rules.md#S2 gains the rule, its examples and a shorter Accepted block;
decisions.md#S2 records it, what it reverses (#578, two of #544's
Accepted limits), and the measured corpus movement (7 of 1,514).
Tests whose fixtures used a credential as filler move to a word that
starts no run, keeping what they test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ng run (#601)

A marker is one only in the name before any comma or the surname part
before a family comma, behind a name word past the leading title run,
and not straight behind an unambiguous suffix word or a connective.
Elsewhere it is an ordinary word, as in 1.4.0: `Doe, Jane nee Smith`
reads middle 'nee Smith', `Smith, John, PhD née Jones` suffix
'PhD née Jones'. A particle counts as the surname, so `Mai Le née
Nguyen` and `Anh Do née Tran` keep their maiden names.

The clause takes its words up to the run of post-nominals and titles
the trailing rules read at the end of the name with the clause removed,
and the take hands that run to the suffix and title roles itself, so
no join can reach a released word. This replaces the #533/#535 release
machinery: `_a_name_word_ahead`, `_join_takes_the_member`,
`_release_reads_off`, `_link_joins_inside_the_clause`, `TailReader`
(now `ClauseSite`) and `tail_reading`'s floor are gone. A trailing
roman numeral is read by its shape against the word before it, which
the prototype missed (`John née Jones Smith VI`).

rules.md#M2 is restated and its examples regenerated; decisions.md#M2
records the head rule, the prototype variants, the triage and two
accepted regressions (`Berg, Jane van der nee Smith DO`, `Jane Doe,
PhD née Smith`, the latter #603's shape). The case table re-pins 42
rows as fix(#601); the corpus-append invariant is now two-sided; the
property grids move to counting heads with re-measured controls. The
ledgers classify the moved names and also take in the one radar name
#602 moved (`Jane van der Berg née Jr Jones`). Release log: one bullet
for #601 superseding the unreleased #533/#535 readings, one for #602.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Code: S2's given-part run absorbed a wholly-particle piece and reported
it, and P6 then attached it to the family and reported the attachment
as a declined post-nominal -- two reports for a reading neither stage
kept (`Smith, John PhD de`, `Smith, John PhD de Jr.`), and `Smith, John
PhD Jr. de la` lost its particle-or-given report to a wrong kind. The
run now leaves such a piece to the walk and P6, except a lone member of
the ambiguous credential class (`do`), which P6's #531 exception keeps
out of the attachment already. Three case rows and an S2 example pin
it; the 1.4/2.0/2.1 ledgers gain a literal #379 rule for the example.
group's and ParseState's ownership prose now say group writes the
SUFFIX/TITLE roles of the run a maiden take gives up.

Docs: M2's reporting sentence regains its scope (a family-comma clause
reports the member it keeps nowhere), H5's clause sentence the same
scope, M2 and S2 name the part before a suffix comma, the `Jane Smith
née V` Accepted note is decided in the #601 entry rather than "open on
#601", and AGENTS.md/test_benchmark.py stop describing the retired
#533 acronym fork and release check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fix-commit review found the skip wider than P6's attachment: a
particle with a credential behind it and another particle past that
('Smith, John PhD de PhD van') fell back to a silent middle name between
two credentials, contradicting the S2 sentence the previous commit
added. The run now leaves out only the particles ending the part, found
as P6 finds them (looking past post-nominals), and S2 states the lone
ambiguous-class exception (`do`) the code already made. One case row;
dated notes on the two re-recorded 1.4.0 claims.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts were the ledgers and their guard rosters, where #604's rule
and the #601/#602 rules were appended at the same place: both kept, the
shared trailing `fields` line restored to each rule, and the two 1.4.0
comma-family claims re-recorded over the merged corpus (440).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@derek73 derek73 added bug docs Documentation fixes and updates labels Oct 4, 2026
@derek73 derek73 self-assigned this Oct 4, 2026
@codecov

codecov Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.97%. Comparing base (59b95bc) to head (af785fa).

Additional details and impacted files
@@            Coverage Diff             @@
##           master     #609      +/-   ##
==========================================
- Coverage   98.98%   98.97%   -0.01%     
==========================================
  Files          45       45              
  Lines        4241     4214      -27     
==========================================
- Hits         4198     4171      -27     
  Misses         43       43              

☔ 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.

derek73 and others added 4 commits October 4, 2026 11:38
`Jane Doe, PhD née Smith` and `Berg, Jane van der nee Smith DO` are
degenerate input with no reading designed for (Derek, 2026-10-04). The
release log drops them; decisions.md#M2 keeps the measured move under
that heading so it is not mistaken for a regression; the case row says
it pins change, not a wanted reading.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No behavior change: every field, ambiguity (kind, detail, tokens) and
initials string is identical to the previous commit over 95,813 texts
(the differential corpora, a 120k random fuzz and a heads x tails grid)
under the default, family-first and declared-delimiter policies; all
five gates exit 0.

- `run_start` holds where #602's run starts, so `trailing_start` no
  longer builds `run_titles`/`absorbed` it never reads, and a name of
  under three pieces returns at once; `credential_run` builds the parts
  in one pass, the suffix test first, only when a run exists.
- `starts_a_credential_run`'s letter test and the new `has_name_content`
  run at C level instead of a generator frame per character.
- `_maiden_take` skips the clause-free view when nothing trails the
  clause (the view would be the head alone), pre-checks tags before the
  run predicate, and returns the maiden and trailing-run pieces as one
  role-tagged list, so `group()` applies roles in one loop.
- The given-part run's P6 tail is an interval built with a shared
  `is_wholly_particle`; the absorbed-word report has one spelling.
- `trailing_titles` loses its dead `floor` parameter, and comments
  describing the retired release check are trimmed.

Frames per parse against the previous commit, py3.11: 'John Smith',
'Smith, John', 'Smith, John Q.' unchanged (152, 183, 250); 'John Smith
PhD MBA FRCS' 395 -> 358; 'Smith, John PhD MBA FRCS' 438 -> 403; 'Jane
Doe nee Smith' 238 -> 221; 'Jane Doe nee Mary Ann Smith' 299 -> 278.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mechanisms.md gains READ-WITHOUT-THEN-BIND (read the name as if the
construct were not written, let the construct take what that reading
leaves, bind the roles -- M2 since #601, with H5's transparency and P3's
own-word test carrying the first half) and LICENSED-BY-NEIGHBOR (a
structural word is structural only beside the neighbor its structure
needs -- M2's head rule, P3's generational connective, and the particle
case that showed the condition must be checked against real names).

docs/design/AGENTS.md gains the rethink signal: scan-and-stop, fixes
that each add a stop, and a guard that models another stage. #601 is
the worked case; the 689-line figure is the #601 commit's net change to
_group.py, measured.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One conflict, the two 1.4.0 comma-family claims both sides had moved:
both dated comments kept, re-recorded over the merged corpus (441).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@derek73 derek73 added this to the 2.4 milestone Oct 4, 2026
@derek73
derek73 merged commit 8a8459a into master Oct 4, 2026
11 checks passed
@derek73
derek73 deleted the feat/issue-601-602-m2-rethink branch October 4, 2026 20:30
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

1 participant