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 }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
ActionRunner: a single-record action launched from list_toolbar runs its whole param dialog before checking the selection, then refuses in English under zh-CN — check the selection first and localize the refusal (follow-up of #12331) #13384
Filing gate ③, a follow-up owed by landing work. These are the two further readings of the repo:hotcrm seat 2 re-measure 6289512604 on #12331, which closed as fixed. The objectstack triage seat (session_01AavokzJ5DndAwitDXvKy4U) files them on the maintainer's release of #12331's hold (2026-10-23). ⛔ Not a claim.
Reader (who acts): the domain:ui seat, in one PR.
What happens (measured on HotCRM b8348e9a, @objectstack/* 18.0.0-next.5; source read on objectui origin/main)
On My Leads, with 0 rows selected, the user clicks the header Add to Campaign (a single-record script action placed in list_toolbar):
The order. The param dialog opens and runs to the end. The user picks a campaign, and can even create one from the picker, which then stays. Only after Confirm does the action refuse with "select a row first". ActionRunner runs paramCollectionHandler before the handler, and resolveServerActionRecordId refuses afterwards.
The language. The refusal is English under zh-CN. packages/core/src/actions/serverActionHandler.ts:176 and :178 return hard-coded strings with no i18n key.
Done when
A record-scoped action launched with ≠ 1 row selected is refused before any param dialog opens, with the same toast and no request. With exactly 1 row, the dialog behaves as today.
Both refusal strings come from i18n keys, in every shipped pack (en, zh-CN, and the rest).
Tests: 0 rows and 2 rows open no dialog and send nothing; 1 row opens the dialog; the zh-CN text is pinned.
Size: S.
Dedupe
The open objectui issues matched on single record, select a row, list_toolbar and paramCollection: none open on this path. The parent is #12331, closed as fixed.
Claim: PM loop round 4 · 2026-10-23T15:39Z
Session: session_01WJozybDmRH8z2c5SD7vJkj (domain:ui seat 1; an S card done by a sub-agent of this seat, dispatched by this project's coordinator)
Account: os-sales (the seat's linked user; the card's assignee)
Branch: claude/issue-13384-record-action-row-guard
Worktree: objectui-issue-13384
Domain: domain:ui
Seat: domain:ui#1
File surface: packages/core/src/actions/ActionRunner.ts and packages/core/src/actions/serverActionHandler.ts (the row-count refusal before the param dialog; the two refusal strings), the console runtime that supplies translated strings to the runner if that is where they enter, packages/i18n/src/locales/*.ts (the refusal keys), tests beside, .changeset/ (one changeset) (stop on breach; explain in the report)
Container & model: S, mode:subagent (a sub-agent of this seat, base origin/main), model: default, effort: medium (S)
Clause-②: no
Responsibility: a single-record toolbar action with 0 or 2+ rows selected runs its whole param dialog, then refuses in English | a list toolbar record action, every user | wasted input (a campaign may even be created) and an untranslated refusal
Serial constraints cleared: objectui#13379 (claimed in this act) lands in the console's navigate handler, not in @object-ui/core; objectui#13367 (not claimed) names ActionRunner's copy templating, another region; no open PR touches these paths (read in this act)
packages/app-shell/src/utils/consoleServerAction.ts: createConsoleServerActionHandler wraps core's handler in a new function and drops the new member. Without forwarding it, the early refusal never reaches the console.
ObjectView.toolbarScriptSelection-12331.test.tsx: its 0-row and 2-row cases now assert that no dialog opens, the refusal toast shows, and nothing is sent.
The dev measured both with an uncommitted probe that forwarded the member: five 0-row / 2-row cases in that test then found no dialog.
Clause-②: yes, replacing the claim's no. Every change is a widening and nothing is refused:
ActionRunnerHandler and ServerActionHandler gain an optional refuseBeforeInput member.
ServerActionRecordIdResolution gains an optional errorKey.
The seat owes a contract review at TIER_DEFAULT before ACCEPT.
Serial constraints: objectui#13379 (claim 6368659272) owns useConsoleActionRuntime.tsx, and this card does not touch it. The console flowHandler there calls resolveServerActionRecordId directly. A flow action with params launched from a list toolbar therefore still opens its dialog first; that is noted for a follow-up, not done here.
Activity
objectstack-fleet commentedon Oct 23, 2026
Claim: PM loop round 4 · 2026-10-23T15:39Z
Session:
session_01WJozybDmRH8z2c5SD7vJkj(domain:uiseat 1; an S card done by a sub-agent of this seat, dispatched by this project's coordinator)Account:
os-sales(the seat's linked user; the card's assignee)Branch:
claude/issue-13384-record-action-row-guardWorktree:
objectui-issue-13384Domain:
domain:uiSeat:
domain:ui#1File surface:
packages/core/src/actions/ActionRunner.tsandpackages/core/src/actions/serverActionHandler.ts(the row-count refusal before the param dialog; the two refusal strings), the console runtime that supplies translated strings to the runner if that is where they enter,packages/i18n/src/locales/*.ts(the refusal keys), tests beside,.changeset/(one changeset) (stop on breach; explain in the report)Container & model:
S,mode:subagent(a sub-agent of this seat, baseorigin/main),model: default,effort: medium(S)Clause-②: no
Responsibility: a single-record toolbar action with 0 or 2+ rows selected runs its whole param dialog, then refuses in English | a list toolbar record action, every user | wasted input (a campaign may even be created) and an untranslated refusal
Serial constraints cleared: objectui#13379 (claimed in this act) lands in the console's navigate handler, not in
@object-ui/core; objectui#13367 (not claimed) namesActionRunner's copy templating, another region; no open PR touches these paths (read in this act)objectstack-fleet commentedon Oct 23, 2026
Claim amendment to 6368680261 ·
domain:uiseat 1 ·session_01WJozybDmRH8z2c5SD7vJkj· 2026-10-23T15:54ZFile surface, widened by two files:
packages/app-shell/src/utils/consoleServerAction.ts:createConsoleServerActionHandlerwraps core's handler in a new function and drops the new member. Without forwarding it, the early refusal never reaches the console.ObjectView.toolbarScriptSelection-12331.test.tsx: its 0-row and 2-row cases now assert that no dialog opens, the refusal toast shows, and nothing is sent.The dev measured both with an uncommitted probe that forwarded the member: five 0-row / 2-row cases in that test then found no dialog.
Clause-②: yes, replacing the claim'sno. Every change is a widening and nothing is refused:ActionRunnerHandlerandServerActionHandlergain an optionalrefuseBeforeInputmember.ServerActionRecordIdResolutiongains an optionalerrorKey.The seat owes a contract review at
TIER_DEFAULTbefore ACCEPT.Serial constraints: objectui#13379 (claim 6368659272) owns
useConsoleActionRuntime.tsx, and this card does not touch it. The consoleflowHandlerthere callsresolveServerActionRecordIddirectly. A flow action with params launched from a list toolbar therefore still opens its dialog first; that is noted for a follow-up, not done here.Generated by Claude Code
objectstack-fleet commentedon Oct 23, 2026
LANDED
objectui#13384 由 PR objectui#13395 合入 main,合并提交
7f60e9d05440809be43c66ec94d617bb7e9bbb48(2026-10-23T20:50Z,经合并队列)。记录于 2026-10-23T20:50Z。Seat: domain:ui#1
落地内容:单记录动作从列表工具栏启动时,若选中 0 行或多行,在弹出任何确认框或参数框之前就被拒绝,提示已翻译(
actions.selectRowFirst、actions.selectExactlyOneRow),且不发请求;选中 1 行时参数框照旧。@object-ui/core的处理器类型新增可选成员refuseBeforeInput(合同复核 PASS)。流程动作的同类问题由 objectui#13397 承接。合并时Closes已关本卡。撤下
pm:dispatched。席位核对见 PR comment 6372234866。fix(core): refuse a single-record action's row count before its dialo…