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
Action param dialog: draw the action's submitText on the submit button, falling back to Confirm #28158
Filing gate: ② the consumer half of #27944. That card's spec half (the PR that names this card) adds ActionSchema.submitText, an optional I18nLabel: the label of the submit button in the dialog an action opens to collect its params. Nothing draws it yet, so the spec liveness ledger marks the key planned with authorWarn.
Reach: every action with params opened from the record header, a list row's menu or the toolbar. HotCRM send_email, log_call, log_meeting.
Reader who acts: domain:ui.
Lands after: the #27944 spec PR (it declares the key this card reads).
Observed
ui/packages/app-shell/src/views/ActionParamDialog.tsx draws t('actionDialog.confirm') ("Confirm") on the submit button for every action. The two param-collection handlers (useConsoleActionRuntime.tsx#paramCollectionHandler, RecordDetailView.tsx#paramCollectionHandler) pass the dialog the action's title and its description (through actionDescription(...)), and nothing for the button.
Wanted
Both param-collection handlers resolve the action's submitText the way they resolve description: the bundle's objects.OBJECT._actions.ACTION.submitText (globalActions.ACTION.submitText for an object-less action) first, then the authored inline locale map collapsed to the active language, then the authored string. They pass it to ActionParamDialog.
ActionParamDialog draws it on the submit button and falls back to actionDialog.confirm when there is none. The uploading state keeps actionDialog.uploading.
UIActionSchema (@object-ui/types) declares submitText, derived from the spec's ActionSchema.
The spec liveness row submitText (packages/spec/liveness/action.json) flips to live with these read points and drops authorWarn / authorHint in the same edit.
In that same change, the Studio action form offers the key: delete the action / submitText omit row in packages/spec/src/system/metadata-form-zod-reconciliation.test.ts and add a submitText row to packages/spec/src/ui/action.form.ts (its metadata-forms translations in @objectstack/platform-objects regenerate with node scripts/check-i18n-bundles.mjs --write).
Blocked-by: #27944 is now in the body. pm:blocked.
The liveness row flip (packages/spec/liveness/action.json), the Studio form row (action.form.ts and the reconciliation test) and the regenerated metadata-forms bundle have to land in the same change as the read point. That makes them a one-PR cross-domain exception, and the PR body declares that file surface. Nothing else in packages/spec is touched.
Scope addition from the seat · 2026-10-30T15:54Z · PR #28188 (card #27944) declares ActionSchema.submitText and its translation slot, but os i18n extract does not yet scaffold objects.OBJECT._actions.ACTION.submitText (or globalActions.ACTION.submitText) for an action that declares it, because packages/cli was outside #27944's file surface. The seat routes that here: when this card draws the key, the extract half rides the same PR (scaffold the slot only for an action with a non-empty params, as translateAction reads it, plus a test). The skills half is #28190.
Claim: PM loop round 6 · 2026-10-31T07:29Z
Session: session_01L9qibzC6RxMfB59EsgAoNN (seat; implementation by card thread session session_01L9qibzPbVCsG2npDkDqikd, mode:thread)
Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/project-thread-16rt0c (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-28158
Domain: domain:ui
Seat: domain:ui#1
File surface: ActionParamDialog.tsx, the two param-collection handlers, ui/packages/types/src/** (UIActionSchema), ui/packages/core/src/actions/** (key derivation only), the submitText liveness row + state-counts shard, the action.form.ts row and reconciliation omit row, generated metadata-forms bundles, packages/cli/src/** i18n extract (scope addition 6527113232), i18n packs, tests, root changeset (stop on breach; explain in the report)
Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: high
Clause-②: no (the seat's expectation; the dev measures it on the diff, and the seat amends the claim if a new export or a flipped declared surface moves it)
Metadata-protocol: none
Responsibility: the action param dialog draws the action's submitText on its submit button (consumer half of #27944)
Thread-read: 6540341671
Premise: holds (PR #28188 is on main; the liveness row is planned; ActionParamDialog.tsx draws actionDialog.confirm)
Serial constraints cleared: yes. The p3 hold is lifted for ui by the maintainer: 「可以开p3」, and 2026-10-31T02:39Z 「ui 车道一堆任务啊,应该并发开满啊」 in the seat thread. Other seats have not claimed this card. Outside this seat's area under the maintainer's 2026-10-31T05:10:38Z 「座位之间可以协调,你有空你就可以派」, with the area's seat asked first.
Order: /mnt/project-files/ui-seat-1/r2026-10-30/dispatch-28158.md under FRAME.md.
Claim amendment · 2026-10-31T09:53Z · amends claim 6540629779 after the card thread's os-dev-report 6541916389 (draft PR #28392, head 5f1a6b33, main3ba52069 merged in), before landing. Append-only.
Clause-②: yes (widening: @object-ui/typesUIActionSchema and @object-ui/coreActionDef gain the optional submitText, derived from the spec's ActionSchema; @object-ui/i18nuseObjectLabel() gains the resolver actionSubmitText; no key, route or error code is added)
The seat accepts these additions to the claim's surface, as read on the PR's file list of 40 files:
ui/packages/i18n/src/useObjectLabel.ts: actionSubmitText, resolving the bundle first, then the inline map, then the authored string. The identity-pin count moves by one.
The forward line on the four action renderers (action-button, action-group, action-icon, action-menu) and their precedence test.
Prose only in the spec: the "no renderer shows it yet" clause comes out of submitText's describe in packages/spec/src/ui/action.zod.ts and in packages/spec/src/system/translation.zod.ts's submitText slot (that second file is one step past the order). Also the regenerated content/docs/references/** pages and the reconciliation omit row deleted. The key, its type and its refinements are unchanged.
ui/packages/core/src/actions/ActionRunner.ts: the ActionDef.submitText member only, typed off the spec field. The runner never reads it.
Noted, not filed: MetadataTypeActions.tsx passes no submitText, so its param dialog still draws Confirm.
The widening sends the PR to the contract-review lane before the seat lands it.
merged 2026-10-31T11:06:00Z as bed83062 through the merge queue, on the first pass
origin/main content
ActionParamDialog.tsx takes submitText for its submit button, and useObjectLabel.ts carries actionSubmitText
State: Fixes #28158 closed the card as completed. pm:dispatched comes off in the same stroke as this note. The spec half #27944 is now drawn by the console, and the liveness row is live. MetadataTypeActions.tsx still draws Confirm; that is noted, not filed, and is worth a card only if a metadata-type action ever declares params with a verb. Nothing else remains on this card.
Activity
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 能用的表单 | none | P②
Triage: p3 ·
domain:ui·area:records·pm:blockedon #27944 · 2026-10-30T15:02Z⛔ Not a claim.
ActionSchema.submitTextseam. The parent Action param dialog: an action key for the submit button's verb, falling back to Confirm #27944 is p3, so this card is p3 too.Blocked-by: #27944is now in the body.pm:blocked.packages/spec/liveness/action.json), the Studio form row (action.form.tsand the reconciliation test) and the regeneratedmetadata-formsbundle have to land in the same change as the read point. That makes them a one-PR cross-domain exception, and the PR body declares that file surface. Nothing else inpackages/specis touched.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V
Scope addition from the seat · 2026-10-30T15:54Z · PR #28188 (card #27944) declares
ActionSchema.submitTextand its translation slot, butos i18n extractdoes not yet scaffoldobjects.OBJECT._actions.ACTION.submitText(orglobalActions.ACTION.submitText) for an action that declares it, becausepackages/cliwas outside #27944's file surface. The seat routes that here: when this card draws the key, the extract half rides the same PR (scaffold the slot only for an action with a non-emptyparams, astranslateActionreads it, plus a test). The skills half is #28190.objectstack-fleet commentedon Oct 31, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: unblocked · p3 · 2026-10-31T06:57Z
⛔ Not a claim.
Blocked-by: #27944, and Action param dialog: an action key for the submit button's verb, falling back to Confirm #27944 closed at 2026-10-31T06:25Z.pm:blockedis removed. It stays at p3.Generated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN
Claim: PM loop round 6 · 2026-10-31T07:29Z
Session:
session_01L9qibzC6RxMfB59EsgAoNN(seat; implementation by card thread sessionsession_01L9qibzPbVCsG2npDkDqikd,mode:thread)Account:
os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/project-thread-16rt0c(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-28158Domain:
domain:uiSeat:
domain:ui#1File surface:
ActionParamDialog.tsx, the two param-collection handlers,ui/packages/types/src/**(UIActionSchema),ui/packages/core/src/actions/**(key derivation only), thesubmitTextliveness row + state-counts shard, theaction.form.tsrow and reconciliation omit row, generated metadata-forms bundles,packages/cli/src/**i18n extract (scope addition 6527113232), i18n packs, tests, root changeset (stop on breach; explain in the report)Container & model:
M,mode:thread,model: default(dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no (the seat's expectation; the dev measures it on the diff, and the seat amends the claim if a new export or a flipped declared surface moves it)
Metadata-protocol: none
Responsibility: the action param dialog draws the action's
submitTexton its submit button (consumer half of #27944)Thread-read: 6540341671
Premise: holds (PR #28188 is on
main; the liveness row isplanned;ActionParamDialog.tsxdrawsactionDialog.confirm)Serial constraints cleared: yes. The p3 hold is lifted for ui by the maintainer: 「可以开p3」, and 2026-10-31T02:39Z 「ui 车道一堆任务啊,应该并发开满啊」 in the seat thread. Other seats have not claimed this card. Outside this seat's area under the maintainer's 2026-10-31T05:10:38Z 「座位之间可以协调,你有空你就可以派」, with the area's seat asked first.
Order:
/mnt/project-files/ui-seat-1/r2026-10-30/dispatch-28158.mdunderFRAME.md.objectstack-fleet commentedon Oct 31, 2026
domain:ui#1 · os-tesla · session_01L9qibzPbVCsG2npDkDqikd
os-dev-report
{ "issue": 28158, "status": "done", "branch": "claude/project-thread-16rt0c", "pr": "https://github.com/objectstack-ai/objectstack/pull/28392", "session": "session_01L9qibzPbVCsG2npDkDqikd", "head": "5f1a6b33df678f6f0524f70b6ce8674991aee566", "premise_still_valid": true, "summary": "The param dialog's submit button draws the action's submitText, falls back to actionDialog.confirm, and keeps actionDialog.uploading while a file uploads. Both param-collection handlers (useConsoleActionRuntime, RecordDetailView) resolve it bundle (objects.OBJECT._actions.ACTION.submitText / globalActions.ACTION.submitText) -> inline locale map collapsed to the active language -> authored string, via a new useObjectLabel().actionSubmitText. UIActionSchema and ActionDef derive submitText. Liveness row planned -> live (authorWarn/authorHint dropped), state-counts regenerated, reconciliation omit row removed, action.form.ts row added, platform-objects metadata-forms bundles regenerated (zh-CN/ja-JP/es-ES hand-translated). os i18n extract scaffolds submitText only for an action with non-empty params.", "tests": { "new": [ "ui/packages/app-shell/src/views/ActionParamDialog.submitText-28158.test.tsx (5)", "ui/packages/app-shell/src/hooks/__tests__/useConsoleActionRuntime.submitText-28158.test.tsx (5)", "ui/packages/app-shell/src/views/RecordDetailView.paramSubmitText-28158.test.tsx (5)", "ui/packages/i18n/src/__tests__/useObjectLabel-actionSubmitText-28158.test.tsx (5)", "packages/cli/test/i18n-extract-action-submit-text.test.ts (7)" ], "updated": [ "RecordDetailView.paramRuntimeParity-6431.test.tsx (submitText in DIALOG_READS)", "useObjectLabel-identity-5564.test.tsx (member pin 28 -> 29)", "action-forward-precedence.test.tsx (BUTTON_ORDER / ICON_ORDER)", "five useConsoleActionRuntime sibling pins gain an actionSubmitText passthrough" ], "runs": [ "ui scoped vitest on 5f1a6b33: 649 files, 13888 passed, 13 skipped", "ui ActionParamDialog*/RecordDetailView*/DeclaredActionsBar* on ef504b2c: 110 files, 819 passed", "ui type-check app-shell/components/core/i18n/types: exit 0 each", "spec src/ui + reconciliation + translation: 170 files, 6236 passed", "cli typecheck exit 0; test/i18n-extract: 10 files, 87 passed", "ablation (cli params guard): reds 1 test, restored, git diff HEAD empty" ] }, "gates": { "derived": 112, "ran": 112, "exit_nonzero": 0, "ran_reconciliation": "112 run, 0 NOT-MEASURED, 0 UNRUN", "record": "ui-seat-1/r2026-10-30/out/28158-gates-ran-5f1a6b33.list", "extra": [ "node scripts/check-sdui-manifest.mjs exit 0", "ui check:action-forward-parity exit 0 (red before the four renderer forward lines)", "ui check:new-line-citations exit 0" ], "ci": "check-runs in progress at report time; mergeable_state blocked (draft), not dirty or behind" }, "line_budget": { "files": 40, "additions": 920, "deletions": 43, "limit": 3000, "within": true }, "files_changed": 40, "dogfood_battery": "n/a: no ! and no (narrowing) in the changeset", "deviations": [ "Surface beyond the order, accepted by the seat before the PR: useObjectLabel().actionSubmitText in ui/packages/i18n (pin 28 -> 29), and the submitText forward line in action:button/icon/group/menu (check:action-forward-parity).", "Seat-ruled prose trim: the '(declared ahead of its console reader: no renderer shows it yet)' clause leaves ActionSchema.submitText's .describe(); content/docs/references/** regenerated by check:generated --fix.", "The same stale clause ('; no renderer shows it yet') also left the submitText translation slot's describe in packages/spec/src/system/translation.zod.ts, one step past 'describe() and TSDoc' of ActionSchema; prose only.", "check-plugin-teardown-shape --self-test needed git fetch origin 621a4876 --depth=1 on the shallow clone (environment, not code)." ], "out_of_scope_findings": [ "ui/packages/app-shell/src/metadata-admin/MetadataTypeActions.tsx is a third ActionParamDialog consumer and passes neither description nor submitText, so metadata-type actions in Setup keep Confirm. Not filed." ], "api_writes": ["relay pr_create #28392 (draft)", "post-stamped os-dev-report comment on #28158"], "mcp_calls": { "reads": ["issue_read x2", "pull_request_read x3"], "writes": 0 } }objectstack-fleet commentedon Oct 31, 2026
domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN
Claim amendment · 2026-10-31T09:53Z · amends claim 6540629779 after the card thread's os-dev-report 6541916389 (draft PR #28392, head
5f1a6b33,main3ba52069merged in), before landing. Append-only.Clause-②: yes (widening:
@object-ui/typesUIActionSchemaand@object-ui/coreActionDefgain the optionalsubmitText, derived from the spec'sActionSchema;@object-ui/i18nuseObjectLabel()gains the resolveractionSubmitText; no key, route or error code is added)The seat accepts these additions to the claim's surface, as read on the PR's file list of 40 files:
ui/packages/i18n/src/useObjectLabel.ts:actionSubmitText, resolving the bundle first, then the inline map, then the authored string. The identity-pin count moves by one.action-button,action-group,action-icon,action-menu) and their precedence test.submitText's describe inpackages/spec/src/ui/action.zod.tsand inpackages/spec/src/system/translation.zod.ts'ssubmitTextslot (that second file is one step past the order). Also the regeneratedcontent/docs/references/**pages and the reconciliation omit row deleted. The key, its type and its refinements are unchanged.ui/packages/core/src/actions/ActionRunner.ts: theActionDef.submitTextmember only, typed off the spec field. The runner never reads it.Noted, not filed:
MetadataTypeActions.tsxpasses nosubmitText, so its param dialog still draws Confirm.The widening sends the PR to the contract-review lane before the seat lands it.
objectstack-fleet commentedon Oct 31, 2026
domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN
Landed · 2026-10-31T11:06Z · PR #28392 (seat ACCEPT 6542367971, pinned to
9d549390, contract-review PASS 6542358323).bed83062through the merge queue, on the first passorigin/maincontentActionParamDialog.tsxtakessubmitTextfor its submit button, anduseObjectLabel.tscarriesactionSubmitTextState:
Fixes #28158closed the card as completed.pm:dispatchedcomes off in the same stroke as this note. The spec half #27944 is now drawn by the console, and the liveness row is live.MetadataTypeActions.tsxstill draws Confirm; that is noted, not filed, and is worth a card only if a metadata-type action ever declaresparamswith a verb. Nothing else remains on this card.