You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
tools/differential/expected_since_1.4.0.toml describes the CJK honorific rules as compounding with the #271 order flip. tests/v2/cases.py labels the same rows single-issue (fix(#307), fix(#308)).
Compound notation exists and is already used — feat(#273) + fix(#271), twice, in the nickname block for precisely this shape (one issue enables, #271 orders). So the honorific block is inconsistent with both the toml and its own table's precedent.
Rows like ko_honorific_ssi (김민준 씨) depend on #271's segmentation and family-first order to reach their asserted fields, and say fix(#307) alone. fix(#271) + fix(#307) would be strictly more honest.
This is a block-wide sweep rather than a one-row edit, which is why #320 left it alone rather than fixing one row into a different inconsistency.
Found during the #320 review. Does not affect behavior; it misleads a reader tracing why a row lands where it does.
Re-verified 2026-08-09 against master (d910709)
The count in the title is still exact, and the reasoning is now better supported than when filed.
The compound precedent still exists, still exactly twice: feat(#273) + fix(#271).
Both ledgers still use the compounding language the labels contradict.
ko_honorific_ssi asserts {family: 김, given: 민준, suffix: 씨}, and its own note now states the dependency the label omits — "the name still segments (suffix classification runs after the script_segment stage, which only ever saw 김민준)". Reaching family: 김 / given: 민준 requires Unspaced Chinese/Korean names: surnames constants + longest-match segmentation #271's hangul segmentation. The row documents in prose what its classification= field leaves out.
Nothing enforces the correspondence between cases.py classifications and ledger issue strings — tools/differential/README.md describes it as a convention, and no test checks it. So the sweep cannot break a ledger guard, and it is independent of #328 (which is about a ledger rule's reach exceeding its prose, a latent safety hole, rather than a label understating its dependencies).
What was removed from this issue
A second item — ko_honorific_after_comma's note naming is_suffix_lenient where the real gate is _group._is_suffix_piece — has been fixed and is dropped. The note now reads:
group's _is_suffix_piece diverts this one because 씨 is a single-token piece carrying vocab:suffix. NOT the lenient comma gate, which an earlier note named: measured, lenient_comma_suffixes=False leaves this row unchanged.
It names the right gate, records that an earlier note was wrong, and measures the counterfactual. (is_suffix_lenient does still exist, at nameparser/_pipeline/_assign.py:351 — the old note named a real function, just not the one that decides this row.)
tools/differential/expected_since_1.4.0.tomldescribes the CJK honorific rules as compounding with the #271 order flip.tests/v2/cases.pylabels the same rows single-issue (fix(#307),fix(#308)).Compound notation exists and is already used —
feat(#273) + fix(#271), twice, in the nickname block for precisely this shape (one issue enables, #271 orders). So the honorific block is inconsistent with both the toml and its own table's precedent.Rows like
ko_honorific_ssi(김민준 씨) depend on #271's segmentation and family-first order to reach their asserted fields, and sayfix(#307)alone.fix(#271) + fix(#307)would be strictly more honest.This is a block-wide sweep rather than a one-row edit, which is why #320 left it alone rather than fixing one row into a different inconsistency.
Found during the #320 review. Does not affect behavior; it misleads a reader tracing why a row lands where it does.
Re-verified 2026-08-09 against
master(d910709)The count in the title is still exact, and the reasoning is now better supported than when filed.
fix(#307), 19 ×fix(#308).feat(#273) + fix(#271).ko_honorific_ssiasserts{family: 김, given: 민준, suffix: 씨}, and its own note now states the dependency the label omits — "the name still segments (suffix classification runs after the script_segment stage, which only ever saw 김민준)". Reachingfamily: 김/given: 민준requires Unspaced Chinese/Korean names: surnames constants + longest-match segmentation #271's hangul segmentation. The row documents in prose what itsclassification=field leaves out.Nothing enforces the correspondence between
cases.pyclassifications and ledgerissuestrings —tools/differential/README.mddescribes it as a convention, and no test checks it. So the sweep cannot break a ledger guard, and it is independent of #328 (which is about a ledger rule's reach exceeding its prose, a latent safety hole, rather than a label understating its dependencies).What was removed from this issue
A second item —
ko_honorific_after_comma's note namingis_suffix_lenientwhere the real gate is_group._is_suffix_piece— has been fixed and is dropped. The note now reads:It names the right gate, records that an earlier note was wrong, and measures the counterfactual. (
is_suffix_lenientdoes still exist, atnameparser/_pipeline/_assign.py:351— the old note named a real function, just not the one that decides this row.)