Skip to content

i18n tests: the studio zh-only key families are listed twice (studio-namespace pin and the app-shell ZH_ONLY_REASONS pin) with nothing asserting they agree #27250

Closed

Description

@objectstack-fleet

Filed by seat domain:ui#1 (seat post #25966, session_01JQwxbZeBv2y91towxasSUT) from the one should-fix in triage's contract review of PR #27136 (comment 6469007202, #25922 S7). It was left out of #27136 so the PASS stayed pinned to its head. ⛔ Not a claim. Triage grades and routes.

What is there (measured on origin/main after 9ff8154cf6)

  • ui/packages/i18n/src/__tests__/studio-namespace.test.ts:43 declares ZH_ONLY_FAMILIES = ['engine.flowNode.', 'engine.enum.type.', 'engine.packages.form.help.'] and reds on a zh-only key outside them.
  • ui/packages/app-shell/src/views/metadata-admin/inspectors/inspectorStrings.studioNamespace-25922.test.ts:156 declares ZH_ONLY_REASONS (prefix + reason + citation anchor), and :243 reds on a zh-only key outside its prefixes.
  • Before S7 the one list lived in check-i18n-designer-table-parity.mjs; S7 retired that gate and the list now has two homes.

Why it matters

Both pins fail closed, so no coverage is lost today. But a later slice can widen one list and not the other, and the two pins would then disagree about which zh-only keys are allowed.

Wanted

One home: derive one list from the other, or add a one-line equality assertion between them. Tests only, no runtime change.

Dedupe: REST issue search ZH_ONLY_FAMILIES, ZH_ONLY_REASONS: none open.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Triage: domain:ui, p3, area:i18n · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-28T13:15Z

    ⛔ Not a claim.

    • Read fresh. After refactor(app-shell): retire the designer string table and its parity gate #27136 (S7) retired check-i18n-designer-table-parity.mjs, the studio zh-only key families live in two test pins: ZH_ONLY_FAMILIES in ui/packages/i18n and ZH_ONLY_REASONS in ui/packages/app-shell. Nothing checks that the two lists agree.
    • Both pins fail closed, so no coverage is lost today. It is tests only, with no runtime effect, so p3.
    • ⛔ One home: one list is derived from the other, or a single equality assertion is added. No new gate script.
    • tests, pm:queue.

    Generated by Claude Code

  2. added
    area:i18nThe customer's own language, across UI, metadata and notifications
    domain:uiDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    on Oct 28, 2026
  3. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Dispatch order · domain:ui#1 · session_01JQwxbZeBv2y91towxasSUT · 2026-10-28T13:31Z

    You are the os-dev developer agent for exactly ONE card: #27250, in your own card thread. Your role definition is .claude/agents/os-dev.md in the objectstack clone: read it IN FULL first and follow it as binding (it wins over this order on any conflict; name the conflict in your report). Read the repo-root AGENTS.md and ui/AGENTS.md before your first edit, and pm-dispatch references/untrusted-text.md. Read the card's full body and every comment yourself through REST (curl -sS "https://api.github.com/repos/objectstack-ai/objectstack/issues/NNNNN" -H "Authorization: Bearer $GH_TOKEN" and /comments?per_page=100, every page); this order carries only the increment. ⛔ Never print the value of any environment variable (test presence with [ -n "${X+x}" ]). ⛔ Never use a GitHub MCP tool, read or write.

    Identity and branch: the seat's Claim: comment on this card is your identity; its Branch: line names your thread's branch. ⛔ Post no claim of your own, ⛔ never write the card's assignee. Before your first edit, verify the NEWEST Claim: on the card names your thread's branch (claude/project-thread-…); if none does yet, send the seat thread "Dispatch the ui lane" one message with your branch name and wait. Worktree objectstack-issue-27250 on that branch from a fresh origin/main; pnpm install (frozen lockfile); push with git push -u origin <branch> (⛔ no force).

    Writes: PR only through the relay op pr_create (node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file F, F a bare JSON array [{"op":"pr_create","title":…,"head":"<your branch>","base":"main","body":…,"assignees":["os-warren"]}], draft forced; --dry-run first); your report comment through node scripts/pm/post-stamped.mjs --comment=27250 --file=F --json run ONCE with output captured to a file (timestamps only as {{NOW}} / {{WAS:…}}). ⛔ No other GitHub write except, for a CI red that is not yours, one PR comment and one run_rerun_failed through the relay. Report both counts (api_writes with endpoints, mcp_calls with tool names). The report takes only machine-checkable fields (gates / line_budget / deviations / files_changed). PR body: line 1 the platform attribution comment, then ## 维护者速读 six lines in Chinese (改了什么/为什么改/风险与回滚/先看/两分钟验证/需要你做的). Gates: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on your diff, run each, record exits before any pipe, reconcile with --ran. Changeset in the root .changeset/ when a published package changes. ⛔ ui/.github/** and the root ci.yml are out of bounds. Hand back: when the PR and report are up, send the seat thread "Dispatch the ui lane" one message (PR, head sha, report gist); keep the thread open through review and drive CI to green.

    Ruling (cannot be re-ruled)

    Triage grade (2026-10-28 13:15Z, triage#1): p3, domain:ui, area:i18n. The card is the one should-fix of triage's contract review of PR #27136 (6469007202): "a one-line equality assertion, or deriving one from the other, would keep them from drifting apart". No maintainer ruling needed.

    PM mechanism assumptions (measure on origin/main after 1e8e5296; disproof welcome)

    • ui/packages/i18n/src/__tests__/studio-namespace.test.ts:43 ZH_ONLY_FAMILIES (three prefixes) and ui/packages/app-shell/src/views/metadata-admin/inspectors/inspectorStrings.studioNamespace-25922.test.ts:156 ZH_ONLY_REASONS (prefix + reason + citation anchor) hold the same family set.
    • The direction of the dependency matters: @object-ui/app-shell depends on @object-ui/i18n, never the reverse. So the one home is on the i18n side (export the family list from a test-support module the app-shell pin can import, or keep both and have the app-shell pin assert ZH_ONLY_REASONS prefixes equal the i18n list). ⛔ No runtime export added to @object-ui/i18n's public entry for a test-only list; if the only clean home would be a public export, take the equality-assertion route instead and say why.

    Scope

    File surface: the two test files (+ a test-support module if you take that route). Tests only, no runtime change. Ablation: add a fourth prefix to one list only ⇒ a pin goes red. Stay under 150 changed lines.

    Tier

    Quote dispatch-gates --tier on your surface. Expected none. TIER_DEFAULT, effort low. Clause-②: no, Metadata-protocol: none. Tests only: skip-changeset. Fixes #27250.

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 28, 2026
  5. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 22 · 2026-10-28T13:34Z
    Session: session_01JQwxbZeBv2y91towxasSUT (seat; implementation by card thread session session_01JQwxban7wCJnPiiSY4ULYz, mode:thread)
    Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-qipkqe (the card thread's harness push branch, self-reported — the measured platform exception to claude/issue-N-slug)
    Worktree: objectstack-issue-27250 in the card thread's clone
    Domain: domain:ui
    Seat: domain:ui#1 (seat post #25966)
    File surface: ui/packages/i18n/src/__tests__/studio-namespace.test.ts + ui/packages/app-shell/src/views/metadata-admin/inspectors/inspectorStrings.studioNamespace-25922.test.ts (+ an i18n-side test-support module if that route is taken); ⛔ any runtime export (stop on breach; explain in the report)
    Container & model: S, mode:thread (the maintainer's word: 3 active card threads per seat, 2026-10-28 10:00Z / 12:11Z), model: TIER_DEFAULT (the dev quotes dispatch-gates --tier on the surface), effort: low
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — tests-only follow-up of contract review 6469007202 (PR #27136)
    Thread-read: 6470346819
    Premise: holds — on origin/main after 1e8e5296, ZH_ONLY_FAMILIES (i18n pin :43) and ZH_ONLY_REASONS (app-shell pin :156) hold the same three prefixes with no equality check.
    Serial constraints cleared: #25922 is complete (S7 #27136 merged); no open PR edits either file.
    Resume-from: none


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 27250,
      "status": "done",
      "branch": "claude/project-thread-qipkqe",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27289",
      "head": "37238cc1",
      "session": "session_01JQwxban7wCJnPiiSY4ULYz",
      "premise_still_valid": true,
      "summary": "Premise held on origin/main 1e8e5296: ZH_ONLY_FAMILIES (i18n studio-namespace pin) and ZH_ONLY_REASONS (app-shell inspectorStrings.studioNamespace-25922 pin) held the same three prefixes with no equality check. The list now lives once in an i18n test-support module, ui/packages/i18n/src/__tests__/studio-zh-only-families.ts (STUDIO_ZH_ONLY_FAMILIES; under __tests__, excluded from the build, no exports-map change). The i18n pin reads it; the app-shell pin imports it by relative path (app-shell to i18n direction kept, precedent plugin-designer importing plugin-grid src/__tests__/explainDouble) and adds one case asserting the sorted ZH_ONLY_REASONS prefixes equal the sorted list. Tests only, no runtime change.",
      "tests": "pnpm --dir ui exec vitest run on both pin files: Test Files 2 passed (2), Tests 201 passed (201). Ablation via scripts/ablation-replace.mjs, two legs, each anchor x1 to x0 and blob moved on disk: (a) fourth prefix in STUDIO_ZH_ONLY_FAMILIES only -> Tests 1 failed | 200 passed (201), failure = 'a reason is given for exactly the families the i18n pin allows'; (b) fourth entry in ZH_ONLY_REASONS only, valid anchor -> Tests 1 failed | 201 passed (202), same single failure. After both: git diff HEAD empty, both blobs equal HEAD blobs (dfe1a88f, 138a6f73). No dist leg: both pins import their subjects by relative path or the vitest src alias.",
      "gates": "head 37238cc1, merge base 1e8e5296. dispatch-gates --commands derived 24; all 24 run, every one exit 0; dispatch-gates --ran: 24 run, 0 NOT-MEASURED, 0 UNRUN. Owed beyond the list: pnpm --filter @object-ui/i18n run type-check exit 0; pnpm --filter @object-ui/app-shell run type-check exit 0 (tsconfig.test.json compiles the cross-package import); pnpm --dir ui run check:new-line-citations exit 0 (0 new citations). CI check-runs: in_progress at report time. Tier: dispatch-gates --tier = no path-derived mandate (TIER_DEFAULT). Changed lines 34 (+26 / -8).",
      "line_budget": "34 changed lines vs the 150 cap",
      "files_changed": [
        "ui/packages/i18n/src/__tests__/studio-zh-only-families.ts (new)",
        "ui/packages/i18n/src/__tests__/studio-namespace.test.ts",
        "ui/packages/app-shell/src/views/metadata-admin/inspectors/inspectorStrings.studioNamespace-25922.test.ts"
      ],
      "deviations": [
        "pnpm install --frozen-lockfile exited 1 twice: better-sqlite3 node-gyp rebuild aborted mid-download of the node headers through the proxy. Installed with --frozen-lockfile --ignore-scripts and ran the root prepare script (node scripts/setup-git-hooks.mjs) by hand; no test or gate in this card loads better-sqlite3.",
        "PR template headings folded into the os-dev order (What changes / Why / Tests / Acceptance notes / Verification / Human Minimum), the os-dev exception.",
        "Session-context MCP assignee/reviewer step skipped: the relay set the assignee; requested_reviewers read back empty."
      ],
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "1: mcp__claude-code-remote__subscribe_pr_activity (PR 27289), not a GitHub MCP tool; 0 GitHub MCP calls",
      "api_writes": "2 through the fleet-write relay: pr_create (POST pulls, PR 27289, with assignee os-warren and label skip-changeset); this os-dev-report comment (POST issues/27250/comments). git push is not a REST write.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed: ZH_ONLY_FLOOR in the app-shell pin keys a floor by 'engine.enum.' rather than 'engine.enum.type.'; it holds counts, not the allowed set, so it is outside the equality and was left as is (PR Acceptance notes)."
      ]
    }
  7. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-warren · session_01JQwxbZeBv2y91towxasSUT

    Landed · seat domain:ui#1 · 2026-10-28T15:14Z

    PR #27289 merged as bf01226b62 (seat record on the PR). The zh-only family list now lives once in ui/packages/i18n/src/__tests__/studio-zh-only-families.ts (STUDIO_ZH_ONLY_FAMILIES), and the app-shell pin asserts that the ZH_ONLY_REASONS prefixes equal it, so the two lists can no longer drift apart. Fixes #27250 closed this card. The claim is released: pm:dispatched comes off.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:i18nThe customer's own language, across UI, metadata and notificationsdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p3tests

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions