Skip to content

ui: the action text localizer resolves description, so an inline action's param dialog shows it in the user's language (cloud#3281 ruling A, half 2 of 2) #29249

Closed

Description

@objectstack-fleet

repo:cloud#2 · os-zhuang · session_0123kRqqdpAJWYMgsgdAJX4G

Filing gate: executing a recorded ruling. objectstack-ai/cloud#3281 was ruled A by the maintainer (「3281 A 3138 A」, 2026-10-26, ruling comment 6408789175). This is the ui half; the spec half is #29248 and lands first.

What happens

Once an inline action can declare a description as an I18nLabel (a locale map), the console must collapse it to one string before ActionParamDialog shows it. Today the localizer does not touch description, so a locale map would reach the dialog unresolved, or the dialog falls back to the generic 「请填写以下信息以继续操作。」.

Where (objectstack main 0c0d3b68e1)

ui/packages/react/src/hooks/useActionTextLocalizer.ts, around line 129: const DECLARED_COPY_KEYS = ['confirmText', 'successMessage', 'errorMessage'] as const;. elements.tsx already forwards description to the dialog.

Ask

  • DECLARED_COPY_KEYS gains description, and the doc comment above ActionTextLocalizer names it.
  • Tests: an inline action with a zh-CN/en description map shows the active locale's string in the param dialog; an action with no description still shows the generic line.

Business reason

The console's invitation dialog is the one place a new owner invites a colleague. It should say what happens next in the owner's language.

Order

Blocked-by: #29248 (the spec half). After both land, cloud bumps its pins and gives INVITE_ACTION the framework action's description in four locales (cloud#3281).

Dedup

Searched objectstack issues and PRs for "DECLARED_COPY_KEYS description", "InlineActionSchema description" and "cloud#3281": nothing open or merged.

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p2 (was p3) · pm:blocked · 2026-11-02T11:02Z

    ⛔ Not a claim.

    • Read fresh. The ui half of cloud#3281 ruling A. Blocked-by: #29248 (the spec half), so this waits. Graded p2 as the ordinary half of a ruled change.

    Generated by Claude Code

  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-steve · session_01ADHkmSduNGC2SZXszyrNut

    ⛔ Not a claim. Carrier note from the spec half.

    The spec half #29248 is PR #29369 (InlineActionSchema picks description; contract review PASS 6578506913). Its review carries one should-fix to this card, exactly the ask above: DECLARED_COPY_KEYS in ui/packages/react/src/hooks/useActionTextLocalizer.ts gains description. Until it does, an inline locale-map description reaches the console's param dialog as a non-string, so cloud should author the string arm until this card lands. When PR #29369 merges, this card's Blocked-by: clears.

  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-steve · session_01ADHkmSduNGC2SZXszyrNut

    Unblocked: the Blocked-by: card #29248 landed via PR #29369 (d68d129b) at 2026-11-02T14:35Z. InlineActionSchema now picks description, so this ui half can start: add description to DECLARED_COPY_KEYS in useActionTextLocalizer.ts (seat carrier note 6578561587). Moved pm:blocked → pm:queue for the ui lane.

  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · zhuangjianguo · session_01QsR2jR7ZFkpqmm4U8S1f9y

    Claim: PM loop round 13 · 2026-11-02T14:39Z
    Session: session_01QsR2jUba5gmu4hkimKCSC6 (card thread, os-dev); dispatched by seat session session_01QsR2jR7ZFkpqmm4U8S1f9y
    Account: zhuangjianguo
    Branch: claude/project-thread-xq5c4g (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-29249
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: ui/packages/react/src/hooks/useActionTextLocalizer.ts, one new localizer test file, one param-dialog rendering test in ui/packages/components/src/__tests__/, and a new changeset (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: default
    Clause-②: no
    Metadata-protocol: none
    Responsibility: an inline action whose descriptionis an I18nLabel locale map reaches the param dialog uncollapsed, because the localizer collapses only confirmText/successMessage/errorMessage | adddescription to the declared copy keys so it collapses to the active language like the others, pinned by localizer and dialog tests | every console user who opens an inline action param dialog with a localized description (first: cloud invite dialog, cloud#3281)
    Thread-read: 6575502410
    Premise: holds (at origin/main d68d129b, useActionTextLocalizer.ts L129 DECLARED_COPY_KEYS is confirmText, successMessage, errorMessage; InlineActionSchema picks description since PR #29369)
    Serial constraints cleared: none (no open PR touches useActionTextLocalizer.ts at 14:45Z)


    Generated by Claude Code

  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · zhuangjianguo · session_01QsR2jUba5gmu4hkimKCSC6
    os-dev-report

    {
     "issue": 29249,
     "status": "done",
     "branch": "claude/project-thread-xq5c4g",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/29452",
     "session": "session_01QsR2jUba5gmu4hkimKCSC6",
     "premise_still_valid": true,
     "summary": "DECLARED_COPY_KEYS in useActionTextLocalizer.ts gains description, so a declared description collapses through collapseCopy like confirmText/successMessage/errorMessage: an I18nLabel map becomes the active language's string, a template envelope and a plain string pass through as themselves, no bundle read (collapse-only), no key added when undeclared. Type docblock and module docblock bullets name description. One localizer test file (6 cases) and one element:button param-dialog rendering test (3 cases) added; changeset @object-ui/react patch.",
     "tests": "cd ui && vitest run packages/react/ + components element-button*, elementButtonActionMembers-8071, action-forward-parity at 47f9d6de: Test Files 139/139, Tests 1562/1562 (whole react suite 133/133 files, 1538 tests at cf64ea1b). Reverse check at cf64ea1b via scripts/ablation-replace.mjs (anchor 1->0, blob ccebd928->b7c8dbed): new files 5 failed / 4 passed, the five map cases red, envelope/plain-string/no-description controls green; restored blob == HEAD, git diff HEAD empty. turbo type-check @object-ui/react + @object-ui/components at 47f9d6de: 45/45, exit 0; both new tests listed in their tsconfig.test.json program; no casts in new files.",
     "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at cf64ea1b: 34 derived, 34 run, all exit 0 (incl. check-sdui-manifest.mjs and its --self-test, pnpm --dir ui exec vitest run scripts/, check:type-check-debt under the lock); --ran: 34 derived, 34 run, 0 NOT-MEASURED. Re-run at final head 47f9d6de after merging main: check-adr-0087-registration, check-changeset-no-major, check-closing-keyword-parity, check-partof-closing-keyword, check-empty-changeset, check-sdui-manifest, check:nul-bytes, check:cross-package-test-inputs, check:test-source-alias, check:type-check-coverage, check:published-files, check:type-check-debt: all exit 0. PR check-runs: in_progress at open (CI families not re-run locally).",
     "line_budget": "303 changed lines (+295/-8) vs merge base, under 3000",
     "files_changed": [
      ".changeset/29249-inline-action-description-locale.md",
      "ui/packages/react/src/hooks/useActionTextLocalizer.ts",
      "ui/packages/react/src/hooks/__tests__/useActionTextLocalizer.description-29249.test.tsx",
      "ui/packages/components/src/__tests__/element-button-paramDialogDescription-29249.test.tsx"
     ],
     "deviations": [
      "The components rendering test draws the dialog with a test host built on the package's own Dialog (mirroring ActionParamDialog.tsx line 691, description || actionDialog.description), because @object-ui/components cannot import @object-ui/app-shell; element:button, the localizer and ActionRunner are real.",
      "Merge of origin/main 7b1ae338 committed as 47f9d6de before pr_create (rule 8); main touched none of the four files."
     ],
     "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
     "mcp_calls": "4 — GitHub MCP reads only: issue_read get (1), issue_read get_comments (2), pull_request_read get_comments on #29369 (1); no write tool",
     "api_writes": "2 — relay pr_create (objectstack-ai/objectstack#29452, read back 7073/7073 bytes identical, no assignees), this os-dev-report comment via post-stamped; plus git push (not REST)",
     "open_questions": [],
     "security_findings": "none",
     "out_of_scope_findings": [
      "carrier: none · noted, not filed — elements.tsx comment above the localizer call still lists label/confirmText/successMessage/errorMessage as the localized copy; outside the file surface, comment only (PR Acceptance notes)",
      "carrier: none · noted, not filed — named inline action: measured by reading that useConsoleActionRuntime.tsx line 337 calls actionDescription(objForI18n, action?.name, action?.description) for every dispatch and element:button forwards name, so a named inline action's bundle description is resolved by the host; no finding"
     ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · zhuangjianguo · session_01QsR2jR7ZFkpqmm4U8S1f9y

    Seat review · 2026-11-02T16:40Z · PR #29452 at 5c1f5713: ACCEPT 6582648487 (on the PR; Clause-②: no, no contract review owed). It goes to the merge queue now.


    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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions