Skip to content

What should the patronymic rotations do under a non-default name_order? (Иван Петрович Сидоров under ru + FAMILY_FIRST reads family="Иван") #384

Description

@derek73

Background

The East Slavic and Turkic rotations (rules.md#O1/#O2) reconstruct token position from assigned roles, which is faithful to v1 only under the default given-first order — a limit recorded since the v2 core landed (decisions.md#O1). The open question of how they should interact with non-default name_order values rode #270, which closed 2026-07-28 with the order constants and no recorded answer for the rotations; no successor issue tracked it until this one.

Current state (measured, 2.2.0dev)

input ru pack (default order) ru pack + FAMILY_FIRST
Сидоров Иван Петрович family="Сидоров" (rotation fires) family="Сидоров" (positional; rotation guard sees no ending on Сидоров, stands down) — agreement is coincidence
Иван Петрович Сидоров family="Сидоров" (natural order, no rotation needed) family="Иван", given="Петрович" — the patronymic becomes the given name

The divergent row is the sharp end: a caller who declares FAMILY_FIRST and opts into the ru pack gets a confidently wrong reading of natural-order input, with no ambiguity report.

Options

  1. Declare the rotations GIVEN_FIRST-scoped by design — a resolution note, no code change: the rotations exist to restore the default reading from a family-first listing, so combining them with a declared family-first order is redundant at best. rules.md#O1/#O2 statements gain the scope clause; the divergent row becomes an Accepted consequence.
  2. Make the rotations order-aware — the guard reads positions through _effective_order instead of assuming given-first roles. Cost: new behavior surface with its own boundary questions (what does "rotate" even mean when the declared order already says family-first?).
  3. Stand the rotations down under any non-default order, with an ambiguity report — conservative; the caller who declared an order gets the declaration, and the conflict is at least visible.

Open

Whether any real caller combines a patronymic pack with a non-default order — the packs themselves don't set name_order, so the combination is always deliberate.

Activity

  1. self-assigned this
    on Aug 16, 2026
  2. added a commit that references this issue on Aug 16, 2026
  3. added this to the v2.2 milestone on Aug 22, 2026
  4. modified the milestones: v2.2, v2.3 on Aug 30, 2026
  5. added a commit that references this issue on Sep 8, 2026
  6. derek73 commented on Sep 8, 2026

    @derek73
    OwnerAuthor

    Resolved on option 1 — the rotations are GIVEN_FIRST-scoped — and, unlike the option as written, it took a code change (#517).

    The decision. The East Slavic and Turkic rotations (rules.md#O1, #O2) exist to restore the given-first reading a family-first listing hides. A caller who declares FAMILY_FIRST has already said it, so under a declared family-first order the rotations stand down and position decides. The divergent row from the issue — Иван Петрович Сидоров under the ru pack plus FAMILY_FIRST reading family Иван, given Петрович — is the declaration being honored on natural-order input the caller said was family-first, and is recorded as an Accepted consequence, not a defect. It is pinned in tests/v2/test_locales.py, in prose in the rule, because no example annotation combines a pack with an order (#470 decided prose in the Accepted clause is the right home).

    Why it was not "no code change". The design review measured that the rotation reads whatever word sits in the family slot regardless of the order assign read. Under FAMILY_FIRST that slot holds the FIRST word, so a patronymic-derived surname fired it: ru + FAMILY_FIRST read Мицкевич Адам Юзеф as family Адам through 2.2.0, where plain FAMILY_FIRST reads family Мицкевич; likewise oglu Ahmad Vali Ali with Turkic handling read family Ahmad. The rotations are now gated on the order assign read (state.order, not policy.name_order, for the reason the P1 fold gives). No corpus name moves at any baseline — the corpora hold no three-word name whose first word carries an East Slavic ending and no four-word name whose first word is a standalone Turkic marker — and the firing controls are pinned under both family-first orders with the 2.2.0 readings recorded as the negative control, plus a reachability probe so the stand-down rows cannot go vacuous silently. It has a 2.3.0 release-note bullet, since it changes what 2.2.0 does for a supported configuration.

    Options 2 and 3, declined. Option 2 (order-aware rotations) would recompute what the declaration already carries. Option 3 (stand down with an ambiguity report) would fire on natural-order input inside a family-first source, which the caller cannot distinguish from a mis-declared record; a family-first listing carrying the trace reads the same under both orders, so there is nothing to report there.

    Rationale: decisions.md#O1 and #O2, the 2026-09-07 entries, and rules.md's Name order Background for the principle both #471 and this issue now rest on.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions