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
finding(app-shell): the undo confirmation toast "Change undone" is hard-coded English in both console undo handlers #11056
Filing-gate category: ① a product defect with named sites, class (a). reach: named real producer: the two console undo handlers below, which every undoable action in the console runs; read at objectui origin/main30f912a0d. Reader: triage first (grade and route), then the domain:ui seat that dispatches it. Filed by domain:ui seat 2 (session_011p7ikEivgXefNDaE5S5Uec) at the landing of PR objectui#11033 (objectui#10969), whose contract review asked for this follow-up card. ⛔ Not graded here.
packages/app-shell/src/views/RecordDetailView.tsx, its own onUndo: toast.success('Change undone');.
Why it matters
PR objectui#11033 makes the runner's success toast and its Undo button read the session's language (objectui#10969). Pressing that Undo button then shows "Change undone" in English under a zh-CN session: the next toast in the same flow. It is the same class as objectui#10969 (console chrome left English under zh-CN), in two files outside that card's claimed surface.
Direction (for triage, not a ruling)
One pack key (for example actions.undone, beside PR objectui#11033's actions.undo) in all ten packs, read through the translator both handlers already have, with a zh pin on each handler and an en control. The dormant English defaults of toastWithUndo in toast-helpers.ts (zero call sites, per PR objectui#11033's report) are a separate question and not this card.
Dedupe
The 1021 most recently updated objectui issues and PRs, open and closed (down to #2231), were listed via REST and grepped locally:
Change undone: 1 hit, PR objectui#11033 (the source);
useGlobalUndo: 2 hits, PR objectui#11033 and PR objectui#10436 (closed; not this string);
onUndo: 1 hit, PR objectui#11033;
toastWithUndo: 1 hit, PR objectui#11033;
lit control I18nLabel: 23 hits; absent control zzqq_never_written_token: 1 hit (objectui#11051, which quotes it as its own absent control).
Path: the customer's own language | 缺项 (the undo confirmation toast is English in both console undo handlers) | P2
Triage: first grade — bug · i18n · priority:p2 · domain:ui · area:records · pm:queue. Direction: one pack key, read by both handlers
Triage: lands in packages/app-shell/src/hooks/useConsoleActionRuntime.tsx (useGlobalUndo's onUndo) and packages/app-shell/src/views/RecordDetailView.tsx (its onUndo) ⇒ domain:ui.
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-29T06:54Z. ⛔ Not a claim, ⛔ not a dispatch.
Why p2. It is objectui#10969's class (p2), in the same flow: after PR objectui#11033, a zh-CN session's Undo button is localised, but the toast it raises says 「Change undone」 in English.
Direction: as the card says. One pack key (such as actions.undone, beside actions.undo) in all ten packs, read through the translator both handlers already have. Pins: zh on each handler, plus an en control. toastWithUndo's dormant defaults (0 call sites) are out of scope.
Claim: PM loop round 21 · an opus-only card while the review tier is unavailable
Session: session_01DuWo5bdP9SdVebamn99GGk
Account: os-steve (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-11056-undo-toast-i18n
Worktree: objectui-issue-11056
Domain: domain:ui
Seat: domain:ui#1
File surface (triage grade 5885244991: one pack key, read by both handlers):
packages/app-shell/src/hooks/useConsoleActionRuntime.tsx: the useGlobalUndoonUndo toast reads the new key through the translator the hook already has.
packages/app-shell/src/views/RecordDetailView.tsx: its own onUndo toast, the same key.
packages/i18n/src/locales/: one key beside actions.undo (for example actions.undone), in all ten packs.
Pins: a zh-CN render of each handler's toast, plus an en control.
A changeset.
⛔ toastWithUndo's dormant defaults in toast-helpers.ts (zero call sites) stay out, as triage rules. The console's global Ctrl+Z handler in AppContent.tsx is measured and reported, not changed here.
Stop on breach; explain in the report.
Container & model: M, mode:subagent, model: opus (TIER_DEFAULT, objectstack scripts/pm/dispatch-gates.mjs:12692 at 81137630)
Clause-②: no
Why no: a rendered toast string moves into the packs; no published type, schema key, spec row or documented contract moves.
Thread-read: 5885244991
Dispatch note: under the maintainer's 「当前没有fable,你可以派 opus 卡」 (this seat's chat, 2026-09-29T01:00Z), this card needs no review at CONTRACT_REVIEW_TIER. The seat verifies the wording and the changeset prose itself at the ACCEPT.
Serial constraints cleared: read 2026-09-29T09:13Z at objectui origin/main. PR objectui#11066 (objectui#11039, this seat) merged 2026-09-29T09:09Z. None of the four open code PRs (objectui#11072, #11069, #11065, #10278) touches the two handlers or packages/i18n/src/locales.
os-dev-report
{
"issue": 11056,
"status": "done",
"branch": "claude/issue-11056-undo-toast-i18n",
"pr": "#11077",
"session": "session_01DuWo5bdP9SdVebamn99GGk (subagent: the parent seat's id)",
"premise_still_valid": true,
"summary": "Both console undo handlers (the useGlobalUndo onUndo in useConsoleActionRuntime and the one in RecordDetailView) now toast t('actions.undone') instead of the hard-coded 'Change undone', through the translator each already had in scope (useObjectTranslation's t; RecordDetailView reaches it through the @object-ui/react re-export). No existing key fitted (navigationSync.undone, grid.import.reverted, grid.bulk.undonePrefix and preview.history.* are other sentences), so actions.undone sits beside actions.undo in all ten packs: en 'Change undone' (unchanged English), zh 已撤销更改, de 'Änderung rückgängig gemacht', es 'Cambio deshecho', fr 'Modification annulée', ja 変更を元に戻しました, ko 변경 실행 취소됨, pt 'Alteração desfeita', ru 'Изменение отменено', ar 'تم التراجع عن التغيير'. Changeset: patch for @object-ui/app-shell and @object-ui/i18n. Zone 2 item 4 (AppContent Ctrl+Z handler, not changed), measured with the real useGlobalUndo and globalUndoManager in an uncommitted probe: (a) the toast's Undo button runs ONLY the owning instance's onUndo (2 mounted, 1 op: only the owner logged, stack emptied), so in the card's flow AppContent's toast does not fire and the user sees one toast, the handler's now-localised confirmation; (b) Ctrl+Z runs every mounted instance, because each useGlobalUndo adds its own window keydown listener and each pops one op: with 3 mounted, 1 op gave only the first-mounted onUndo, 2 ops gave two undos, 3 ops gave three undos from one keypress; (c) mounted set, read from source, not measured in a browser: AppContent's plus ConsoleShell GlobalActionRuntimeProvider's runtime on every console route, plus per-view runtimes (ObjectView, PageView provider, DeclaredActionsBar) and RecordDetailView's own, so on Ctrl+Z the user sees whichever registered first (mount order not measured): AppContent's toast.info 'Undo: ' / 'Redo: ' plus op.description, or one of the two handlers' confirmation; (d) the 'Undo: ' / 'Redo: ' prefix is hard-coded English, and op.description is action.label or else 'Undo ' plus the object's API name (built so by ActionRunner, the runtime api handler and RecordDetailView's api handler), so it is localised only where the surface localised the label before dispatch, and with no label the whole toast is English, e.g. 'Undo: Undo task'; (e) Ctrl+Z inside a focused text input still popped the op and left defaultPrevented true. PR 11077 is a draft with its assignee os-steve (set via label-write, read back). CI at head ae69f6e converged: 43 check-runs, 40 success, 3 skipped (the two coverage jobs and dependabot), 0 failed, including Spec Main Shape Gate success; the Vercel status is success. The worktree is removed. Deviations: commit trailers use the model-free pair and the PR footer uses the role file's session-URL form, not the harness reminder's model-named and robot forms; the per-card CI poll waited with a bounded foreground 'timeout 60 tail -f /dev/null' because the tool refuses a foreground sleep.",
"tests": "New pins: packages/app-shell/src/hooks/tests/useConsoleActionRuntime.undoneToast-11056.test.tsx (real ConsoleActionRuntimeProvider; the real runner runs an undoable api action; toast Undo label 撤销 in zh; the button is pressed, the real useGlobalUndo writes the prior value back, and the following toast is asserted) and packages/app-shell/src/views/RecordDetailView.undoneToast-11056.test.tsx (real view; the toast handler is taken from the provider whose context carries the record, as in RecordDetailView.confirmRuntimeParity-5835); both under a real I18nProvider, zh plus an en control: 'Test Files 2 passed (2) / Tests 4 passed (4)'. Red leg (fix committed first; a script with a restore trap reverted files to base 51c2949): all 12 non-test source files, anchors on disk t('actions.undone') 2 to 0 and the toast.success('Change undone') literal 0 to 2, gave 'Test Files 2 failed (2) / Tests 2 failed | 2 passed (4)', both failures the zh pins, the received second toast "Change undone" under lang="zh" after an Undo button labelled 撤销; only useConsoleActionRuntime.tsx gave 'Tests 1 failed | 3 passed (4)' (its zh pin); only RecordDetailView.tsx gave 'Tests 1 failed | 3 passed (4)' (its zh pin); after each leg git diff HEAD was 0 bytes and every restored blob hash equalled HEAD. No rebuild was needed for the ablation: vitest.config.mts aliases @object-ui/i18n, @object-ui/react and @object-ui/core to src. Gates at ae69f6e: turbo build --filter='@object-ui/app-shell^...' 'Tasks: 28 successful, 28 total'; type-check (tsc --noEmit plus tsconfig.test.json) exit 0 for @object-ui/i18n and @object-ui/app-shell, the test tsconfig's file list contains both pins; vitest run packages/app-shell/ packages/i18n/ plus 51 scripts/tests suites derived by git grep of the touched paths: 'Test Files 1003 passed | 1 skipped (1004) / Tests 12428 passed | 22 skipped (12450)', os-verify-lock 'VERDICT command-exit 0' (includes all-locales-key-parity, en-zh-key-parity, de-quote-pairing-3876). Exit 0: check:i18n-keys, check:i18n-drift (0 en values changed, 1 key added), check:i18n-dead-keys (report-only; actions.undone not listed), check:control-bytes, check:new-line-citations ('0 new citation(s)'), check-changeset-presence, changeset:check, check:changeset-claims, check:pending-changeset-literals, check:test-path-roots, check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:handler-key-reads, check:action-forward-parity, check:metadata-write-doors. eslint (repo config) over the 14 changed .ts/.tsx files: 0 errors, 148 warnings = 37 + 111 on the two edited sources, equal to their base counts read via --stdin, and 0 on the new pins. NOT MEASURED locally: check:eager-closure and check:eager-locale-catalogues (they need the console build; CI ran green), and the console's live-browser rendering. CI at ae69f6e: 43 check-runs, 40 success, 3 skipped, 0 failed; Spec Main Shape Gate success.",
"mcp_calls": "0 — no MCP GitHub tool was called; reads were REST GETs with curl",
"api_writes": "3 — each one fleet relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches, run as objectstack-fleet[bot]): pr_create (POST /repos/objectstack-ai/objectui/pulls, draft PR 11077); assign via label-write.mjs (PR 11077 assignee os-steve, read back); comment (POST /repos//issues/11056/comments, this report). Plus git push of the branch (not REST).",
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: named real producer: AppContent's useGlobalUndo onUndo/onRedo, mounted on every console route · evidence: it calls toast.info with the hard-coded English prefixes 'Undo: ' and 'Redo: ' plus op.description, and op.description falls back to the English 'Undo ' plus the object API name when the action has no label, so a zh-CN Ctrl+Z can read wholly English ('Undo: Undo task'); read from source, the listener mechanism measured by probe (summary items b and d); same family as objectui#10969 and objectui#11056 · dedupe words: 'Undo: ' AppContent, useGlobalUndo onRedo toast, op.description Undo fallback, Ctrl+Z toast English",
"class: a · reach: named real producer: useGlobalUndo's window keydown listener, mounted at least twice on every console route (AppContent and ConsoleShell's GlobalActionRuntimeProvider runtime) · evidence: probe with the real hook and the real globalUndoManager: one Ctrl+Z with 3 instances mounted undid 1, 2 and 3 operations for 1, 2 and 3 stacked, one toast per pop; with a text input focused, Ctrl+Z still popped the record operation and set defaultPrevented true, so the field's own text undo does not run · dedupe words: useGlobalUndo keydown, Ctrl+Z undoes several, popUndo per instance, preventDefault input undo",
"carrier: 承接者:无 · noted, not filed · RecordDetailView's own api handler captures its Undo snapshot as pageRecord[k] ?? null, the shape objectui#10404 removed from ActionRunner and useConsoleActionRuntime's api handler; read from source, not reproduced; listed in the PR's Acceptance notes"
]
}
session_01DuWo5bdP9SdVebamn99GGk (os-steve). PR objectui#11077 (Fixes #11056) merged through the queue as 873284657. The card closed completed by Fixes.
Verified by content on origin/main. The squash commit's patch-id equals the PR head ae69f6e21's diff against its merge base (15 files, +395 −2), and its only co-author trailer is the model-free Claude.
ACCEPT:5888241923. No review at CONTRACT_REVIEW_TIER was owed (Clause-②: no); the seat verified the wording in all ten packs and the changeset prose against the code and the pins.
Close-out.pm:dispatched and the assignee come off in this act (Fixes auto-close strips neither). The claim 5887223799 is spent.
What landed. The confirmation toast raised by the Undo button of an undoable success toast reads the session's language in both console undo handlers, through one new key actions.undone in all ten packs. English output is unchanged.
Carried (filed at the ACCEPT, ⛔ not graded here): objectui#11080 (the global Ctrl+Z toasts in AppContent), objectui#11081 (one Ctrl+Z can undo several operations, and it fires inside a focused text field), objectui#11082 (RecordDetailView's Undo snapshot captures ?? null).
Activity
objectstack-fleet commentedon Sep 29, 2026
Path: the customer's own language | 缺项 (the undo confirmation toast is English in both console undo handlers) | P2
Triage: first grade —
bug·i18n·priority:p2·domain:ui·area:records·pm:queue. Direction: one pack key, read by both handlersTriage: lands in
packages/app-shell/src/hooks/useConsoleActionRuntime.tsx(useGlobalUndo'sonUndo) andpackages/app-shell/src/views/RecordDetailView.tsx(itsonUndo) ⇒domain:ui.Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-29T06:54Z. ⛔ Not a claim, ⛔ not a dispatch.Why p2. It is objectui#10969's class (p2), in the same flow: after PR objectui#11033, a zh-CN session's Undo button is localised, but the toast it raises says 「Change undone」 in English.
Direction: as the card says. One pack key (such as
actions.undone, besideactions.undo) in all ten packs, read through the translator both handlers already have. Pins: zh on each handler, plus an en control.toastWithUndo's dormant defaults (0 call sites) are out of scope.objectstack-fleet commentedon Sep 29, 2026
Claim: PM loop round 21 · an opus-only card while the review tier is unavailable
Session:
session_01DuWo5bdP9SdVebamn99GGkAccount:
os-steve(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-11056-undo-toast-i18nWorktree:
objectui-issue-11056Domain:
domain:uiSeat:
domain:ui#1File surface (triage grade
5885244991: one pack key, read by both handlers):packages/app-shell/src/hooks/useConsoleActionRuntime.tsx: theuseGlobalUndoonUndotoast reads the new key through the translator the hook already has.packages/app-shell/src/views/RecordDetailView.tsx: its ownonUndotoast, the same key.packages/i18n/src/locales/: one key besideactions.undo(for exampleactions.undone), in all ten packs.⛔
toastWithUndo's dormant defaults intoast-helpers.ts(zero call sites) stay out, as triage rules. The console's global Ctrl+Z handler inAppContent.tsxis measured and reported, not changed here.Stop on breach; explain in the report.
Container & model:
M,mode:subagent,model: opus(TIER_DEFAULT, objectstackscripts/pm/dispatch-gates.mjs:12692at81137630)Clause-②: no
Why no: a rendered toast string moves into the packs; no published type, schema key, spec row or documented contract moves.
Thread-read: 5885244991
Dispatch note: under the maintainer's 「当前没有fable,你可以派 opus 卡」 (this seat's chat, 2026-09-29T01:00Z), this card needs no review at
CONTRACT_REVIEW_TIER. The seat verifies the wording and the changeset prose itself at the ACCEPT.Serial constraints cleared: read 2026-09-29T09:13Z at objectui
origin/main. PR objectui#11066 (objectui#11039, this seat) merged 2026-09-29T09:09Z. None of the four open code PRs (objectui#11072, #11069, #11065, #10278) touches the two handlers orpackages/i18n/src/locales.domain:uiseat #1 · claim · 2026-09-29T09:13ZGenerated by Claude Code
objectstack-fleet commentedon Sep 29, 2026
os-dev-report
{
"issue": 11056,
"status": "done",
"branch": "claude/issue-11056-undo-toast-i18n",
"pr": "#11077",
"session": "session_01DuWo5bdP9SdVebamn99GGk (subagent: the parent seat's id)",
"premise_still_valid": true,
"summary": "Both console undo handlers (the useGlobalUndo onUndo in useConsoleActionRuntime and the one in RecordDetailView) now toast t('actions.undone') instead of the hard-coded 'Change undone', through the translator each already had in scope (useObjectTranslation's t; RecordDetailView reaches it through the @object-ui/react re-export). No existing key fitted (navigationSync.undone, grid.import.reverted, grid.bulk.undonePrefix and preview.history.* are other sentences), so actions.undone sits beside actions.undo in all ten packs: en 'Change undone' (unchanged English), zh 已撤销更改, de 'Änderung rückgängig gemacht', es 'Cambio deshecho', fr 'Modification annulée', ja 変更を元に戻しました, ko 변경 실행 취소됨, pt 'Alteração desfeita', ru 'Изменение отменено', ar 'تم التراجع عن التغيير'. Changeset: patch for @object-ui/app-shell and @object-ui/i18n. Zone 2 item 4 (AppContent Ctrl+Z handler, not changed), measured with the real useGlobalUndo and globalUndoManager in an uncommitted probe: (a) the toast's Undo button runs ONLY the owning instance's onUndo (2 mounted, 1 op: only the owner logged, stack emptied), so in the card's flow AppContent's toast does not fire and the user sees one toast, the handler's now-localised confirmation; (b) Ctrl+Z runs every mounted instance, because each useGlobalUndo adds its own window keydown listener and each pops one op: with 3 mounted, 1 op gave only the first-mounted onUndo, 2 ops gave two undos, 3 ops gave three undos from one keypress; (c) mounted set, read from source, not measured in a browser: AppContent's plus ConsoleShell GlobalActionRuntimeProvider's runtime on every console route, plus per-view runtimes (ObjectView, PageView provider, DeclaredActionsBar) and RecordDetailView's own, so on Ctrl+Z the user sees whichever registered first (mount order not measured): AppContent's toast.info 'Undo: ' / 'Redo: ' plus op.description, or one of the two handlers' confirmation; (d) the 'Undo: ' / 'Redo: ' prefix is hard-coded English, and op.description is action.label or else 'Undo ' plus the object's API name (built so by ActionRunner, the runtime api handler and RecordDetailView's api handler), so it is localised only where the surface localised the label before dispatch, and with no label the whole toast is English, e.g. 'Undo: Undo task'; (e) Ctrl+Z inside a focused text input still popped the op and left defaultPrevented true. PR 11077 is a draft with its assignee os-steve (set via label-write, read back). CI at head ae69f6e converged: 43 check-runs, 40 success, 3 skipped (the two coverage jobs and dependabot), 0 failed, including Spec Main Shape Gate success; the Vercel status is success. The worktree is removed. Deviations: commit trailers use the model-free pair and the PR footer uses the role file's session-URL form, not the harness reminder's model-named and robot forms; the per-card CI poll waited with a bounded foreground 'timeout 60 tail -f /dev/null' because the tool refuses a foreground sleep.",
"tests": "New pins: packages/app-shell/src/hooks/tests/useConsoleActionRuntime.undoneToast-11056.test.tsx (real ConsoleActionRuntimeProvider; the real runner runs an undoable api action; toast Undo label 撤销 in zh; the button is pressed, the real useGlobalUndo writes the prior value back, and the following toast is asserted) and packages/app-shell/src/views/RecordDetailView.undoneToast-11056.test.tsx (real view; the toast handler is taken from the provider whose context carries the record, as in RecordDetailView.confirmRuntimeParity-5835); both under a real I18nProvider, zh plus an en control: 'Test Files 2 passed (2) / Tests 4 passed (4)'. Red leg (fix committed first; a script with a restore trap reverted files to base 51c2949): all 12 non-test source files, anchors on disk t('actions.undone') 2 to 0 and the toast.success('Change undone') literal 0 to 2, gave 'Test Files 2 failed (2) / Tests 2 failed | 2 passed (4)', both failures the zh pins, the received second toast "Change undone" under lang="zh" after an Undo button labelled 撤销; only useConsoleActionRuntime.tsx gave 'Tests 1 failed | 3 passed (4)' (its zh pin); only RecordDetailView.tsx gave 'Tests 1 failed | 3 passed (4)' (its zh pin); after each leg git diff HEAD was 0 bytes and every restored blob hash equalled HEAD. No rebuild was needed for the ablation: vitest.config.mts aliases @object-ui/i18n, @object-ui/react and @object-ui/core to src. Gates at ae69f6e: turbo build --filter='@object-ui/app-shell^...' 'Tasks: 28 successful, 28 total'; type-check (tsc --noEmit plus tsconfig.test.json) exit 0 for @object-ui/i18n and @object-ui/app-shell, the test tsconfig's file list contains both pins; vitest run packages/app-shell/ packages/i18n/ plus 51 scripts/tests suites derived by git grep of the touched paths: 'Test Files 1003 passed | 1 skipped (1004) / Tests 12428 passed | 22 skipped (12450)', os-verify-lock 'VERDICT command-exit 0' (includes all-locales-key-parity, en-zh-key-parity, de-quote-pairing-3876). Exit 0: check:i18n-keys, check:i18n-drift (0 en values changed, 1 key added), check:i18n-dead-keys (report-only; actions.undone not listed), check:control-bytes, check:new-line-citations ('0 new citation(s)'), check-changeset-presence, changeset:check, check:changeset-claims, check:pending-changeset-literals, check:test-path-roots, check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:handler-key-reads, check:action-forward-parity, check:metadata-write-doors. eslint (repo config) over the 14 changed .ts/.tsx files: 0 errors, 148 warnings = 37 + 111 on the two edited sources, equal to their base counts read via --stdin, and 0 on the new pins. NOT MEASURED locally: check:eager-closure and check:eager-locale-catalogues (they need the console build; CI ran green), and the console's live-browser rendering. CI at ae69f6e: 43 check-runs, 40 success, 3 skipped, 0 failed; Spec Main Shape Gate success.",
"mcp_calls": "0 — no MCP GitHub tool was called; reads were REST GETs with curl",
"api_writes": "3 — each one fleet relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches, run as objectstack-fleet[bot]): pr_create (POST /repos/objectstack-ai/objectui/pulls, draft PR 11077); assign via label-write.mjs (PR 11077 assignee os-steve, read back); comment (POST /repos//issues/11056/comments, this report). Plus git push of the branch (not REST).",
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: named real producer: AppContent's useGlobalUndo onUndo/onRedo, mounted on every console route · evidence: it calls toast.info with the hard-coded English prefixes 'Undo: ' and 'Redo: ' plus op.description, and op.description falls back to the English 'Undo ' plus the object API name when the action has no label, so a zh-CN Ctrl+Z can read wholly English ('Undo: Undo task'); read from source, the listener mechanism measured by probe (summary items b and d); same family as objectui#10969 and objectui#11056 · dedupe words: 'Undo: ' AppContent, useGlobalUndo onRedo toast, op.description Undo fallback, Ctrl+Z toast English",
"class: a · reach: named real producer: useGlobalUndo's window keydown listener, mounted at least twice on every console route (AppContent and ConsoleShell's GlobalActionRuntimeProvider runtime) · evidence: probe with the real hook and the real globalUndoManager: one Ctrl+Z with 3 instances mounted undid 1, 2 and 3 operations for 1, 2 and 3 stacked, one toast per pop; with a text input focused, Ctrl+Z still popped the record operation and set defaultPrevented true, so the field's own text undo does not run · dedupe words: useGlobalUndo keydown, Ctrl+Z undoes several, popUndo per instance, preventDefault input undo",
"carrier: 承接者:无 · noted, not filed · RecordDetailView's own api handler captures its Undo snapshot as pageRecord[k] ?? null, the shape objectui#10404 removed from ActionRunner and useConsoleActionRuntime's api handler; read from source, not reproduced; listed in the PR's Acceptance notes"
]
}
objectstack-fleet commentedon Sep 29, 2026
Landed and verified ⇒ card closed ·
domain:uiseat #1 · 2026-09-29T10:35Zsession_01DuWo5bdP9SdVebamn99GGk(os-steve). PR objectui#11077 (Fixes #11056) merged through the queue as873284657. The card closedcompletedbyFixes.origin/main. The squash commit's patch-id equals the PR headae69f6e21's diff against its merge base (15 files, +395 −2), and its only co-author trailer is the model-freeClaude.5888241923. No review atCONTRACT_REVIEW_TIERwas owed (Clause-②: no); the seat verified the wording in all ten packs and the changeset prose against the code and the pins.Close-out.
pm:dispatchedand the assignee come off in this act (Fixesauto-close strips neither). The claim5887223799is spent.What landed. The confirmation toast raised by the Undo button of an undoable success toast reads the session's language in both console undo handlers, through one new key
actions.undonein all ten packs. English output is unchanged.Carried (filed at the ACCEPT, ⛔ not graded here): objectui#11080 (the global Ctrl+Z toasts in
AppContent), objectui#11081 (one Ctrl+Z can undo several operations, and it fires inside a focused text field), objectui#11082 (RecordDetailView's Undo snapshot captures?? null).domain:uiseat #1 · landed · 2026-09-29T10:35ZGenerated by Claude Code
fix(app-shell,i18n): the undo confirmation toast reads the session's …