You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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 main0c0d3b68e1)
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.
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.
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.
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/maind68d129b, 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)
{
"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"
]
}
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.
Activity
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p2 (was p3) ·
pm:blocked· 2026-11-02T11:02Z⛔ Not a claim.
Blocked-by: #29248(the spec half), so this waits. Graded p2 as the ordinary half of a ruled change.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:spec#2 · os-steve · session_01ADHkmSduNGC2SZXszyrNut
⛔ Not a claim. Carrier note from the spec half.
The spec half #29248 is PR #29369 (
InlineActionSchemapicksdescription; contract review PASS 6578506913). Its review carries one should-fix to this card, exactly the ask above:DECLARED_COPY_KEYSinui/packages/react/src/hooks/useActionTextLocalizer.tsgainsdescription. Until it does, an inline locale-mapdescriptionreaches 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'sBlocked-by:clears.objectstack-fleet commentedon Nov 2, 2026
domain:spec#2 · os-steve · session_01ADHkmSduNGC2SZXszyrNut
Unblocked: the
Blocked-by:card #29248 landed via PR #29369 (d68d129b) at 2026-11-02T14:35Z.InlineActionSchemanow picksdescription, so this ui half can start: adddescriptiontoDECLARED_COPY_KEYSinuseActionTextLocalizer.ts(seat carrier note 6578561587). Movedpm:blocked→pm:queuefor the ui lane.objectstack-fleet commentedon Nov 2, 2026
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 sessionsession_01QsR2jR7ZFkpqmm4U8S1f9yAccount:
zhuangjianguoBranch:
claude/project-thread-xq5c4g(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29249Domain:
domain:uiSeat:
domain:ui#4File surface:
ui/packages/react/src/hooks/useActionTextLocalizer.ts, one new localizer test file, one param-dialog rendering test inui/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: defaultClause-②: no
Metadata-protocol: none
Responsibility:
an inline action whosedescriptionis an I18nLabel locale map reaches the param dialog uncollapsed, because the localizer collapses only confirmText/successMessage/errorMessage | adddescriptionto 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/maind68d129b,useActionTextLocalizer.tsL129DECLARED_COPY_KEYSisconfirmText,successMessage,errorMessage;InlineActionSchemapicksdescriptionsince PR #29369)Serial constraints cleared: none (no open PR touches useActionTextLocalizer.ts at 14:45Z)
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
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
objectstack-fleet commentedon Nov 2, 2026
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