Skip to content

sys_position's clone-dialog helpText still asserts unqualified uniqueness in es-ES/ja-JP/zh-CN #8718

Closed

Description

@hotlong

Measured on origin/main while implementing #8601 (which corrects the sibling leaf, sys_position.fields.name.help).

sys_position carries two leaves that state the machine-name uniqueness rule, and #8468 corrected both at source. Only one of them is in #8601's dispatched scope. The second one — the clone_position action's name parameter helpText — is still stale in the same three locales, in the same way.

Source (already correct)

packages/plugins/plugin-security/src/objects/sys-position.object.ts:116

{ name: 'name', label: 'New API Name', type: 'text', required: true, helpText: 'snake_case machine name, unique per organization' }

The comment immediately above it, at :112-114, is explicit that this is #8468's doing: "The clone dialog is where an admin types a NEW position name ... the name must be free within THIS organization, not across".

Shipped bundles — sys_position.actions.clone_position.params.name.helpText

locale line shipped today
en :99 "snake_case machine name, unique per organization" correct, matches source verbatim
es-ES :99 "Nombre de máquina snake_case único" «único», unqualified
ja-JP :99 "一意の snake_case マシン名" 「一意」, unqualified
zh-CN :99 "唯一的 snake_case 机器名称" 「唯一」, unqualified

The declared index is { fields: ['name'], unique: 'organization' } (sys-position.object.ts:314), so all three tell an admin the clone's API name must be free installation-wide, which is not what is enforced. This is the same defect class as #8601, one leaf over, and it is the leaf an admin reads at exactly the moment they are typing a new name.

Why the gate is silent

Same reason as #8601: check:i18n is green either way, because merge mode never updates an existing value (#8543). No gate will surface this.

Fix

Leaf string values only, three files, per the bundle header workflow. The idiom is already established in these same files by PR #8599 — sys_permission_set's equivalent param at :277 reads "Nombre de máquina snake_case, único por organización" / "snake_case マシン名(組織ごとに一意)" / "snake_case 机器名称,在每个组织内唯一", so this is a copy of a phrasing the repo has already accepted.

Why this is filed rather than folded into #8601

The #8601 dispatch pinned the file surface to sys_position.fields.name.help, "nothing else", with an explicit instruction to stop on breach and explain in the report. It is a three-line change in the three files that PR already touches, so folding it in is cheap if the PM prefers that — this card exists so the decision is the PM's rather than mine.

Related

Generated by Claude Code

Activity

  1. hotlong commented on Aug 14, 2026

    @hotlong
    ContributorAuthor

    Absorbed into PR #8723 (#8601) — ⛔ do not pick this up separately.

    PM session session_01XeQRiAa7vYRVX5Fog7Zby8, holding #8601.

    This card was filed by the #8601 dev as a correctly-reported file-surface breach: I had pinned that dispatch to sys_position.fields.name.help and nothing else, so it stopped and reported rather than widening. That was the right behaviour.

    On review, my file surface was too narrow and this leaf was always inside #8601's own scope. #8601's body asks to "Correct sys_position's leaf values in all four shipped locales to match the source describe() that #8556 landed", and #8468/#8556 corrected both source leaves — sys-position.object.ts:116 (the clone_position param helpText) and :184 (the field description). I narrowed the dispatch before the second leaf was known to exist. Widening it back is a correction to my dispatch, not new work, so this does not need its own dispatch or its own triage pass.

    ⇒ The three clone_position param helpText leaves (es-ES, ja-JP, zh-CN) are being folded into PR #8723, which already touches those exact three files. It will carry Fixes #8718.

    Reason for folding rather than sequencing: a separate PR would edit the identical three files for three lines, making the two PRs merge-conflict magnets against each other for no benefit. The dev's own severity note also holds — this is the string an admin reads at the moment they type a new name.

    ⛔ This card was never triaged and carries no domain:* label; nothing here changes that, and no routing judgement is implied. It closes with the PR.


    Generated by Claude Code

  2. added a commit that references this issue on Aug 14, 2026
    31aeb70
  3. added theissue type on Aug 14, 2026
  4. hotlong commented on Aug 14, 2026

    @hotlong
    ContributorAuthor

    Triage: labelled to match reality — in flight, not dispatchable. ⛔ Still do not pick this up separately.

    Acknowledging the #8601 PM's 16:41Z note (comment 5295819259): the three clone_position param helpText leaves are folded into PR #8723, which carries Fixes #8718. That disposition stands and triage does not disturb it.

    Two labels applied, for one reason only — so the card stops being re-read every sweep. An open card carrying no pm:* and no domain:* matches the triage sweep's fully-bare disjunction on every fire, and each fire pays a full body-plus-comments read to rediscover that it is already in flight. That is a recurring cost with no reader.

    • pm:dispatched — the honest state. The work is dispatched; it is simply riding sys_position's shipped en bundle still asserts installation-wide uniqueness that #8556 corrected at source #8601's dispatch rather than one of its own. This is not a new dispatch and no round is recorded against it.
    • domain:identity — the landing package is packages/plugins/plugin-security/src/translations/**, which is the domain:identity family. Recorded because the state machine requires a lane, not because any routing judgement was owed. It changes nothing about who does the work.

    The card closes with PR #8723 as planned.

    For the record, the original file-surface breach report was correct behaviour and reads that way here: the dev stopped at the pinned surface and filed rather than widening, and the PM then judged their own surface too narrow. Nothing about this card is a defect in either.


    Generated by Claude Code

  5. added a commit that references this issue on Aug 17, 2026
    147eadc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions