| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
P5 says the join "needs a name word to spare" and joins "the word after it", and neither site knew what a name word was. The reserve counted the pieces that were not suffix pieces, and the suffix-piece test vetoes on the initial tag -- right for assign's middle-initial question, wrong for the reserve's: a bare 'V' carries both vocab:suffix and initial, so 'abdul Smith V' counted three name words, joined, and assign then read the V as the suffix it always was -- given 'abdul Smith', family '' (#401, shipped since 1.x). The join never asked at all: with a word to spare it took a suffix piece as "the word after" -- 'abdul Jr Smith Berg' read given 'abdul Jr' (#421) -- and where the suffix was the split credential, merge() unioned the piece tags, the joined piece became a suffix piece, and assign sent the bound word to the suffix field: 'abdul Ph. D. Smith Berg' read suffix 'abdul Ph. D.', a 2.0 regression. One predicate now answers both: reads_as_suffix(k) is a suffix piece, or the trailing roman numeral assign's fork takes. The fork itself is _vocab.is_trailing_numeral_suffix, lifted out of assign with the _ROMAN pattern so the two stages share its definition rather than the reserve carrying a copy (the regex-sync pin follows it; rules.md#S2 gains _vocab.py as a citing module). The reserve counts a piece out when it reads as a suffix; the join declines the piece it would take when it does, beside the marker decline it already made. The mirror is the fork's conditions exactly, over the walk assign actually makes, and four drafts that were not exact each lost a family or moved a name -- every one caught in review and pinned: the numeral is last and not the first name piece (not "the piece before it is not a title": 'jr' is title vocabulary too, 'abdul Smith Jr V'); "last" and "the piece before" are read over the pieces assign keeps, since it drops the flagged credential from its walk at any position ('abdul Smith V Ph. D.'); the piece before is taken as the join would leave it, bound word first ('abdul J. V'); and only the main walk has the fork, so under the post-comma LENIENT reserve suffix pieces alone count, as they always did ('Berg, abdul V' keeps given 'abdul V'). 'abdul Smith V jr' still joins and 'abdul V Smith' still joins an initial. #369's licence-local suffix clause goes, subsumed. 'abdul Smith V' -> given 'abdul', family 'Smith', suffix 'V' (and 'Sir abdul V', the shape #369 had widened #401 onto, suffix 'V'); 'abdul Jr Smith Berg' -> given 'abdul', middle 'Jr Smith'; 'abdul Ph. D. Smith Berg' -> given 'abdul', middle 'Smith', suffix 'Ph. D.'; 'Berg, abdul Jr Smith' -> suffix 'Jr'. The bound_given_join_sees_only_the_surviving_name case row re-pins to given 'abd', middle 'Jr Smith', as the #418 entry anticipated. Tests first at the piece level (nine group tests, RED then GREEN) and the parser level. No differential corpus name has either shape: the gate is byte-identical at 1.4.0, 2.0.0 and 2.1.0 at this commit; the next commit's rules examples carry the shapes into the rules corpus. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ion (#401, #421) rules.md#P5 gains the clause -- the join absorbs neither a marker nor a word of the suffix vocabulary, wherever position then places it; the reserve counts the same words out, and one more that position decides: a trailing roman numeral that assign reads as the suffix is no word to spare, read as assign will read it, after the join; after a family comma there is no such fork to read -- with examples for 'abdul Smith V', 'abdul Smith Jr V', 'abdul Jr Smith Berg', 'abdul Ph. D. Smith Berg' and the boundaries 'abdul V Smith' and 'Berg, abdul V'. decisions.md#P5 carries the dated entry: the two defects and their one cause, the mirror condition for condition and the four drafts that were not, the fork it deliberately does not mirror (the bare ambiguous acronym, where a family survives either way), the credential judgement -- 1.4.0 read that shape as given 'abdul Smith' because fix_phd extracted the credential before parsing, so the fix restores the suffix field and deliberately not the given, the join taking the word after it or nothing -- and why 'abdul Smith V Ph. D.' is a piece-level pin only: a trailing split credential is the 1.4.0 ledger's [[never]] shape. The entry also records an inert measurement this branch briefly carried: the gate printed EXPLAINED NOTHING for the 1.4.0 fix(#401) rule, and that was written up as "byte-identical, a 2.0 regression". The name had diffed; the rule's fields lacked `suffix`, so the fields-only suffix-routing catch-all absorbed it behind its capped printout. The rule now lists the three fields 1.4.0's diff has, the catch-all's classified count drops 16 -> 15, and #401 stays what the issue said it was: shipped since 1.x. The rules examples carry the shapes into corpus_rules.jsonl (175 names), where they move against every baseline and are classified: fix(#401) explains both numeral spellings, the two fix(#421) rules one name each. The 1.4.0 suffix-routing reach pin moves 1030 -> 1036 and the two comma rules' 261 -> 262 ('Berg, abdul V'); none of the new names is explained by any of them. Two release-log bullets. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## master #423 +/- ##
=======================================
Coverage 98.56% 98.57%
=======================================
Files 44 44
Lines 2997 3011 +14
=======================================
+ Hits 2954 2968 +14
Misses 43 43 ☔ View full report in Codecov by Harness.
|
Sorry, something went wrong.
reads_as_suffix rebuilt assign's filtered walk on every call, and the
reserve calls it once per piece: quadratic in the piece count where
the block had been linear. Unguarded, because no benchmark unit led
with a bound given-name word, so the P5 block never fired for any of
the ten shapes -- the failure mode the table's own header warns of.
Measured by PR review at the benchmark's operating point: 13.2x for
4x the input against the 6.0 bound.
The walk depends only on pieces, ptags and first_name_k, none of
which change before the merge, so it is computed once and the numeral
verdict with it; the closure is then a set lookup. A bound_given
shape ('abdul ' repeated) joins _SHAPES, RED at 13.2 before the hoist
and 4.2 after -- inside the clean column, so neither calibration
number moved; the calibration note records it.
Also in this file: the _is_maiden_marker_piece comment named
absorbs_marker, renamed absorbs_non_name in this branch.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
'abdul J. V' was pinned only at the piece level, and its group-test
comment described a counterfactual: the reserve reads the V as the
suffix it would be behind the joined pair, declines, and assign then
sees the unjoined pieces and reads given 'abdul', middle 'J.', family
'V' -- exactly as it reads 'John J. V'. That field reading is now
asserted beside the John spelling, and the comment says what happens
rather than what would have. 'abdul Smith V Ph. D.' (the merged
credential assign drops from its walk) and 'Berg, abdul Jr Smith'
(the decline under the post-comma reserve) gain field-level pins;
neither can be a rules example, the first being the 1.4.0 ledger's
[[never]] shape. And the release log's "I and X, for every bound
given-name word" is pinned over the two dual-vocabulary bound words
('abd', also suffix vocabulary; 'abu', also an ambiguous particle)
times the two numerals the tests had not used.
The bound_given_join_sees_only_the_surviving_name case row's note
still narrated the #420 reading it was re-pinned away from; it now
tells all three readings the row has had and why.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ound rot decisions.md#P5 said the un-mirrored bare-ambiguous-acronym fork loses no family. It does, once a suffix word sits between: 'abdul Smith Jr Ma' reads given 'abdul Smith', family '', suffix 'Jr, Ma' where 'John Smith Jr Ma' keeps family 'Smith' -- pre-existing, byte-identical before this branch, and the whole of what remains of #401's shape on the main walk (a review sweep found 132 family-losing shapes, every one ending in a bare ambiguous acronym). The entry now says so, records it for a follow-up, attributes the fourth review-found mirror condition, states 'abdul J. V's final reading, and notes the quadratic the perf commit removed. The 2.x fix(#401) ledger rules claimed suffix, which those diffs do not move (the V was already a suffix at 2.0.0 and 2.1.0); they narrow to the two fields the diffs have, the guard roles with them, and the prose that said "the 2.x ledgers list two" is true again. The three #401 comment blocks are rewritten clean (a rewrap had run one sentence past the column), and '[[exclude]]' becomes '[[never]]', the table the ledger actually has. The three fix(#421) comments quoted a P5 sentence the doc no longer contains; they quote the current one. _assign.py's sync comment still named roman_numeral, which is _vocab._ROMAN now. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A /simplify pass over the branch. The 32-line comment above the numeral verdict retold the #401 story that decisions.md#P5 and the group tests already carry, three "found in review" attributions included, and never quoted the rules.md#P5 sentence the branch added for exactly this block; it is now that excerpt plus the four mirror conditions as a list, with the one encoding the comment had left unsaid (rest[0] is first_name_k, so "not the first name piece" is len(rest) >= 2). The #421 decline's comment narrated the regression in a fourth place; it cites P5's sentence instead. _vocab's _ROMAN comment, the predicate's docstring and assign's call site each said "shared with the reserve, and the only right answer is assign's"; once is enough. The six ledger comments carried parser mechanism AGENTS.md reserves for decisions.md, and one a dangling reflow line; each is now the excerpt, the before -> after fields, and the ledger mechanics (why the field counts differ per baseline, the [[never]] note, the 1.4.0 catch-all note). Tests: the jr-as-title lexicon uses Lexicon.add, the file's own idiom, instead of a hand-rolled replace-and-union; the 'phd' line in the suffix-piece test re-asserted the 'jr' line through the same tag and is gone. decisions.md#P5 now points at the two follow-ups filed from review -- #425 (the bare-acronym fork, framed as sharing assign's peel over a post-join view) and #424 (P2's chain and M2's walk taking a trailing numeral). Readings unchanged: suite, ruff, mypy as before. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
| Back | FazBrowse Home | New Git URL |
Closes #401
Closes #421
Both issues are one defect in rule P5's bound-given join: it "needs a name word to spare" and joins "the word after it", and neither the reserve nor the join knew what a name word was. They now ask one question — will assign read this piece as a suffix? — and get one answer.
The change
Mechanism. In the bound-given block, the walk assign will make is computed once (pieces from the bound word onward, minus the merged-credential pieces assign drops), and with it the one verdict that position decides: whether the last piece in that walk is a roman numeral assign's fork reads as the suffix. reads_as_suffix(k) is then "a suffix piece, or that numeral". The reserve counts such pieces out (#401 — V carries both vocab:suffix and initial, and _is_suffix_piece's initial veto is right for assign's middle-initial question, wrong for "does a family survive this join?"). The join declines the piece it would absorb when it reads as a suffix (#421), beside the marker decline it already had — which also stops merge()'s tag union from turning the joined piece into a suffix piece, the route by which the bound word landed in the suffix field.
The mirror is assign's fork condition for condition, over the walk assign actually makes. Four drafts that were not exact each lost a family or moved a name, and every one was caught in review and is pinned: the numeral is not the first name piece (not "the piece before it is not a title" — jr is title vocabulary too); "last" and "the piece before" are read over the pieces assign keeps; the piece before is taken as the join would leave it, bound word first (abdul J. V); and only the main walk has the fork — under the post-comma LENIENT reserve, suffix pieces alone count, as always. The fork itself — is_trailing_numeral_suffix with _ROMAN — moved from _assign.py to _vocab.py so both stages share one definition; assign calls it with the same arguments, and the regex-sync pin follows it. The #369 licence's own suffix clause is gone, subsumed.
Provenance notes
Verification
Commits
Follow-ups, filed
A /simplify pass (reuse, simplification, efficiency, altitude) ran after the review round: efficiency found nothing (the new work is ~1 µs on a 55 µs parse); altitude judged the mirror right for a minor release and supplied the #425 framing; the reuse and simplification findings — comment bloat, a hand-rolled Lexicon.add, a redundant assertion, ledger comments carrying parser mechanism — are commit 6.
🤖 Generated with Claude Code