Skip to content

Order declarations are authoritative: #471 declined, #384 on option 1 with the rotations gated - #517

Merged
derek73 merged 3 commits into
masterfrom
claude/471-order-declarations
Sep 8, 2026
Merged

Order declarations are authoritative: #471 declined, #384 on option 1 with the rotations gated#517
derek73 merged 3 commits into
masterfrom
claude/471-order-declarations

Conversation

@derek73

@derek73 derek73 commented Sep 8, 2026

Copy link
Copy Markdown
Owner

One principle, recorded once and applied twice: a name_order is a property of the data source, not of a string. The caller declares it to match how their records are written, and the declaration governs everything no vocabulary and no script license has already claimed (O4, W4).

#471 is declined by design. Under the default given-first order a string that opens with a never-given particle is a surname whose given name is absent, and surnames may be several words — Spanish double surnames above all — so the fold takes the rest of the name: de la Torre Vega is a surname-only string read right. de la Cruz Juan Carlos is a family-first listing under the wrong order, and the remedy is the declaration (FAMILY_FIRST already gives family de la Cruz, given Juan, middle Carlos) or the family comma. de la Family Family Given versus de la Family Given Given is undecidable under either order, which is what makes the comma the answer rather than a better heuristic. This supersedes the REASON the 2026-08-17 P1 entry gave for the same outcome ("the parser cannot see language"), not the outcome. rules.md#P1 gains the Accepted clause and two executable examples; de la Torre Vega joins the contract corpus and, at the 1.4.0 baseline only, the already-recorded initials-view class, so that gate's intentional count goes 367 → 368 with the claim recorded.

#384 resolves on option 1, and the code now matches it. The ru and tr_az patronymic rotations exist to restore the given-first reading a family-first listing hides, so under a declared family-first order the declaration decides. The design-docs review found the code was NOT scoped that way: the rotation reads whatever word sits in the family slot, which under FAMILY_FIRST is the first word, so a patronymic-derived surname fired it — ru + FAMILY_FIRST read Мицкевич Адам Юзеф as family Адам. The rotations are now gated on the order assign read (state.order, not policy.name_order, for the reason the P1 fold gives). Zero corpus names move at any baseline, and the corpora swept under both packs with FAMILY_FIRST declared show no difference either; the firing controls (Мицкевич Адам Юзеф, oglu Ahmad Vali Ali) are pinned under both family-first orders with the pre-gate 2.2.0 readings recorded as the negative control. Options 2 and 3 are declined with their real costs.

Gate: 368 / 263 / 175 / 37 intentional at 1.4.0 / 2.0.0 / 2.1.0 / 2.2.0, 0 unexplained, 0 radar unclassified. No release-note bullet: #471 changes no behavior, and the #384 gate moves no corpus name and no default-policy parse.

Closes #471
Closes #384

🤖 Generated with Claude Code

@derek73 derek73 added docs Documentation fixes and updates by-design labels Sep 8, 2026
@derek73 derek73 self-assigned this Sep 8, 2026
@codecov

codecov Bot commented Sep 8, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.67%. Comparing base (8e6c483) to head (0b6a792).

Additional details and impacted files
@@           Coverage Diff           @@
##           master     #517   +/-   ##
=======================================
  Coverage   98.66%   98.67%           
=======================================
  Files          45       45           
  Lines        3232     3234    +2     
=======================================
+ Hits         3189     3191    +2     
  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 derek73 added this to the v2.3 milestone Sep 8, 2026
derek73 and others added 3 commits September 7, 2026 21:48
 on option 1

A name order is a property of the data source, not of a string: the
caller declares it to match how their records are written, and the
declaration outranks any string-level inference. rules.md's Name
order Background states that once, and two open questions rest on it.

#471 DECLINED: a never-given particle marks where a surname BEGINS,
so the fold takes the rest of the name: `de la Torre Vega` is a
surname-only string read right and `de la Cruz Juan Carlos` is a
family-first listing read under the wrong order, whose remedy is the
declaration or the family comma. P1's reach paragraph says so and
carries both faces as examples. This supersedes the reason the
2026-08-17 P1 entry gave for the same outcome, and answers the #364
entry's "nothing ever argued for takes everything".

#384 on option 1: the ru and tr_az patronymic rotations exist to
restore the default reading from a family-first listing, so under a
declared family-first order they stand down and position decides. The
code did not do that on its own -- the rotation reads whatever word
sits in the family slot, which under FAMILY_FIRST is the first word --
so the next commit gates it on the order assign read; this entry
records the decision and the measured gap. The divergent row (ru +
FAMILY_FIRST on natural-order input) is the declaration being honored
and is recorded as Accepted, pinned by a tests/v2/test_locales.py row
because a rules.md example line takes one annotation, a pack or an
order, never both. Options 2 and 3 are Declined with reasons.

No parse changes and no release-note bullet.

The new P1 example joins the contract corpus (corpus_rules.jsonl, 250
-> 251 names) and, at the 1.4.0 baseline only, the already-recorded
initials-view class fix(initials-per-word) a particle chain inside a
name part, beside de la Cruz Juan Carlos -- so the 1.4.0 intentional
count goes 367 -> 368 and that rule's recorded claim is 108 names
with its new digest. Gate: 368 / 263 / 175 / 37, 0 unexplained.

Closes #471
Closes #384

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… family-first order

rules.md#O1/#O2 exist to RESTORE the given-first reading a
family-first listing hides. The code tested the word in the FAMILY
slot regardless of the order assign read, so under FAMILY_FIRST -- where
that slot holds the FIRST word -- a patronymic-derived surname fired
the rotation: ru + FAMILY_FIRST read "Мицкевич Адам Юзеф" as family
'Адам' where plain FAMILY_FIRST reads family 'Мицкевич'. The rotations
now apply only when the read order is the default given-first one
(`state.order`, not policy.name_order, for the reason the P1 fold
gives). No corpus name moves at any baseline, and the corpus swept
under both packs with FAMILY_FIRST declared shows no difference
either -- the corpora hold no three-word name whose first word carries
a patronymic ending. Pinned by the firing control.

Refs #384

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Three review agents on the whole PR. The order Background is narrowed
to what the code can implement -- a declared FAMILY-FIRST order
outranks the shape; an explicit GIVEN_FIRST is the default and cannot
be told apart from it -- and the two decisions.md restatements become
citations. The #470 citation is corrected (closed not-planned
2026-09-02, and it decided that prose in an Accepted clause is the
right home, not a workaround); the option-3 decline is scoped to
listings carrying the trace; the capability-claim lesson is
attributed to AGENTS.md axis 10; the zero-movers reason covers the
Turkic trigger too; the gate's unwitnessable conditions are recorded
as such.

The gate becomes a module-level helper so a reachability probe can
patch it back to the ungated condition and demand the 2.2.0 readings
return -- without it a refactor that stops the rotation reaching
family-first placement leaves all five stand-down rows green while
asserting nothing. O2's Accepted clause gains its pin; a peeled-title
parameter joins the East Slavic stand-down test. The #384 gate gets
its release-note bullet: it changes what 2.2.0 does for a supported
configuration, and corpus movement is not the house exemption.

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 by-design docs Documentation fixes and updates

Projects

None yet

1 participant