Skip to content

feat(console): an action's param dialog names its own submit verb (submitText drawn in place of Confirm) - #28392

Merged
objectstack-fleet[bot] merged 10 commits into
mainfrom
claude/project-thread-16rt0c
Oct 31, 2026
Merged

objectstack-fleet[bot] merged 10 commits into
mainfrom
claude/project-thread-16rt0c

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Tesla · project thread

Fixes #28158
Refs #27944

Clause-②: yes (widening: @object-ui/types UIActionSchema and @object-ui/core ActionDef gain the optional member submitText, typed by derivation from the spec's ActionSchema; @object-ui/i18n useObjectLabel() gains the resolver actionSubmitText; no key, route or error code is added)
Metadata-protocol: none

维护者速读

  • 改了什么:动作的参数对话框(例如 HotCRM 的「发送邮件」「记录通话」「记录会议」)的提交按钮,现在显示动作自己声明的 submitText(如「发送」「记录通话」),没声明时仍是「确认」,上传文件时仍是「上传中…」。翻译包里的 _actions.ACTION.submitText 优先,其次是作者写的多语言文本(按当前语言取),最后是作者写的字符串。Studio 的动作表单也能填这个键了,os i18n extract 会为带参数的动作生成它的翻译位。
  • 为什么改:submitText 已在 feat(spec): an action's param dialog can name its own submit verb — submitText #28188 写进 spec,但控制台一直画「确认」,作者写的按钮文字没人显示。
  • 风险与回滚:只改按钮文字,提交逻辑不变;没写 submitText 的动作完全不变。回滚即 revert 本 PR。
  • 先看:ui/packages/app-shell/src/hooks/useConsoleActionRuntime.tsx 与 ui/packages/app-shell/src/views/RecordDetailView.tsx 的 paramCollectionHandler(新增的 submitText 解析);ui/packages/app-shell/src/views/ActionParamDialog.tsx 提交按钮那一行;packages/spec/liveness/action.json 的 submitText 行。
  • 两分钟验证:pnpm --dir ui exec vitest run packages/app-shell/src/views/ActionParamDialog.submitText-28158.test.tsx packages/app-shell/src/hooks/__tests__/useConsoleActionRuntime.submitText-28158.test.tsx packages/app-shell/src/views/RecordDetailView.paramSubmitText-28158.test.tsx packages/i18n/src/__tests__/useObjectLabel-actionSubmitText-28158.test.tsx,预期 4 个文件、20 个测试全绿。
  • 需要你做的:无,席位落地。

What changes

The dialog (ActionParamDialog.tsx). ParamDialogState gains submitText?: string, the already-resolved label. The submit button draws it, falls back to actionDialog.confirm when it is absent or empty, and still says actionDialog.uploading while a file param uploads.

Both param-collection handlers (useConsoleActionRuntime.tsx#paramCollectionHandler, RecordDetailView.tsx#paramCollectionHandler) resolve it the way they resolve description: actionSubmitText(keyObject, action.name, pickLocalized(action.submitText, language)). So the bundle's objects.OBJECT._actions.ACTION.submitText (globalActions.ACTION.submitText for an object-less action) comes first, then the authored inline locale map collapsed to the active language, then the authored string.

The resolver (@object-ui/i18n useObjectLabel().actionSubmitText), the sibling of actionDescription, on the same actionSuffixes node rule (a bound action never reads globalActions). Its member-count pin in useObjectLabel-identity-5564.test.tsx goes from 28 to 29.

Types. UIActionSchema.submitText?: SpecAction['submitText'] and ActionDef.submitText?: SpecActionInput['submitText'], both derived. ACTION_DEF_KEYS lists it, and the SPEC_ACTION_KEYS comment no longer calls it inventory-only.

The four action renderers (action:button, action:icon, action:group, action:menu) forward submitText to the runner. check:action-forward-parity (ui) reds without this once the handlers read the key: the key would be dropped one hop before the dialog. action-forward-precedence.test.tsx lists it beside description.

Spec rows. liveness/action.json submitText flips planned → live with these read points, and drops authorWarn / authorHint in the same edit; state-counts/action.md regenerates. The action / submitText omit row leaves metadata-form-zod-reconciliation.test.ts, and action.form.ts gains a plain submitText row ("Submit button label"), not gated on params, because the parse refuses the key beside an empty params by name. The platform-objects metadata-forms bundles regenerate (node scripts/check-i18n-bundles.mjs --write); the zh-CN / ja-JP / es-ES values are hand-translated. The prose clause "(declared ahead of its console reader: no renderer shows it yet)" leaves ActionSchema.submitText's .describe(), and "no renderer shows it yet" leaves the translation slot's; content/docs/references/** regenerates (check:generated --fix). The seat ruled that trim into this PR. Nothing else in the schema changes.

os i18n extract (packages/cli/src/utils/i18n-extract.ts, pushActionSubmitText). It scaffolds submitText under an action's translation root only for an action with a non-empty params, the population translateAction overlays it onto. It is optional-not-derived like description, and there is no slot for a paramless action.

Changeset .changeset/28158-action-param-dialog-submit-text.md, all patch (Metadata-protocol: none).

Tests

  • ActionParamDialog.submitText-28158.test.tsx (5): the verb is drawn, the fallback is Confirm (also for ''), the verb button submits, and Uploading wins while a file uploads.
  • useConsoleActionRuntime.submitText-28158.test.tsx (5) and RecordDetailView.paramSubmitText-28158.test.tsx (5), one per reader: the authored string, the bundle winning, an inline map collapsed to the active language before it is offered as the fallback, the key object asked (global for an object-less action, the page object when the action declares none), and nothing handed over when nothing resolves.
  • useObjectLabel-actionSubmitText-28158.test.tsx (5): the object node, the global node, no global read for a bound action (with a control), the miss answers.
  • RecordDetailView.paramRuntimeParity-6431.test.tsx: submitText joins DIALOG_READS, and the two runtimes write the same value.
  • packages/cli/test/i18n-extract-action-submit-text.test.ts (7): top-level, global and inline actions; the seed-less slot; no slot without params; bundle seed and coverage gating; one fixture through ActionSchema → extract → ObjectTranslationDataSchema.
  • Sibling pins that mock useObjectLabel partially gain an actionSubmitText passthrough (overrideNotice, paramDialogTitle, paramRefusal-13161, oneToastPerRefusal-13340, flowRowGuard-13397).

Acceptance notes

  • The order's file surface did not name ui/packages/i18n (the resolver) or ui/packages/components/src/renderers/action/* (the forward lines). Both are mechanical consequences of the read point, and the seat accepted both before this PR opened; the claim will be amended with them.
  • A third ActionParamDialog consumer, metadata-admin/MetadataTypeActions.tsx (metadata-type actions in Setup), passes neither description nor submitText, so its button still says Confirm. The card names the two business-action handlers only. Noted, not filed.
  • submitText is not interpolated: it is a button verb, and no ${…} hole is read in it, unlike description.

Verification

Readings at head 5f1a6b33 (after merging origin/main at 3ba52069), unless a line says otherwise.

Derived gates — 112 derived, 112 run, all exit 0
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 112 families against this diff; each ran with stdin closed and its exit code recorded before any pipe. The record is ui-seat-1/r2026-10-30/out/28158-gates-ran-5f1a6b33.list in the project files.
  • dispatch-gates.mjs --ran: 112 run, 0 NOT-MEASURED, 0 UNRUN.
  • On the pre-merge head ef504b2c the same sweep had one exit 3, check-plugin-teardown-shape.mjs --self-test (the pinned fixture commit is absent from a shallow clone); after git fetch origin 621a4876… --depth=1 it exits 0, and on 5f1a6b33 all 112 exit 0.
  • Run after a full workspace build with declarations (env -u OS_SKIP_DTS pnpm exec turbo run build --filter='!@objectstack/docs', 116/116 tasks).
  • Also: node scripts/check-sdui-manifest.mjs exit 0 (derived); ui check:action-forward-parity exit 0 (it reds before the four forward lines: 4 surfaces "does not forward 1 key the runtime reads: submitText"); ui check:new-line-citations 0 new, exit 0.
Tests
  • ui, on 5f1a6b33: pnpm --dir ui exec vitest run over the four new files, app-shell/src/hooks/__tests__/, the two RecordDetailView.param* pins, i18n/, core/src/actions/, components/src/renderers/action/, types/ → 649 files, 13888 passed, 13 skipped.
  • ui, on ef504b2c: ActionParamDialog*, RecordDetailView*, DeclaredActionsBar* → 110 files, 819 passed.
  • ui type-check: @object-ui/app-shell, components, core, i18n, types → exit 0 each.
  • spec: pnpm --filter @objectstack/spec exec vitest run src/ui/ src/system/metadata-form-zod-reconciliation.test.ts src/system/translation.test.ts → 170 files, 6236 passed.
  • cli: typecheck exit 0; vitest run --project unit test/i18n-extract → 10 files, 87 passed.
  • Ablation (cli, scripts/ablation-replace.mjs): replacing the params guard in pushActionSubmitText (anchor 1 → 0) reds "emits NO slot for an action without params" (1 failed | 6 passed); restored by the tool, blob == HEAD, git diff HEAD empty.
  • pnpm --filter @objectstack/spec check:liveness exit 0 after gen:liveness-counts (the action shard: one row planned → live).

Generated by Claude Code

…he dialog and the resolver

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibzPbVCsG2npDkDqikd
@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 3 package(s): @objectstack/cli, @objectstack/platform-objects, @objectstack/spec, touching 5 documentable anchor(s). ⚠️ 2 changed file(s) yielded no anchor (packages/spec/liveness/action.json, packages/spec/liveness/state-counts/action.md), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

2 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/frontend/plugins/plugin-view.mdx (via submitText (literal, a string literal in pushActionSubmitText; a string literal in sections))
  • content/docs/protocol/objectui/actions.mdx (via submitText (literal, a string literal in pushActionSubmitText; a string literal in sections))
What this run could not see
  • 2 changed file(s) yielded no anchor (packages/spec/liveness/action.json, packages/spec/liveness/state-counts/action.md) — pages documenting those are invisible to this run
  • 2 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 60 of 212 client-bound route-ledger rows — the other 152 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 152: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 97 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 177 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json fa74b489308f0aded7d3434ebd65246519192022 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 182b71038c2c39787453384f8ad4f7346d58080e — the merge of head 9d549390e4cd47770852aece9585be4323f9a41c into base fa74b489308f0aded7d3434ebd65246519192022, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 182b71038c2c39787453384f8ad4f7346d58080e && git checkout 182b71038c2c39787453384f8ad4f7346d58080e
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin fa74b489308f0aded7d3434ebd65246519192022 9d549390e4cd47770852aece9585be4323f9a41c && git checkout -B drift-repro fa74b489308f0aded7d3434ebd65246519192022 && git merge --no-ff 9d549390e4cd47770852aece9585be4323f9a41c

node scripts/docs-audit/affected-docs.mjs --json fa74b489308f0aded7d3434ebd65246519192022

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs fa74b489308f0aded7d3434ebd65246519192022 → pass the list as
args.docs, on the commit named under Which tree this was computed on.

…on form's submitText row

The positive-control count of translated metadata-form labels goes from
696 to 697: the action form now offers a `submitText` row, authored in
all three translated locales.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9qibzPbVCsG2npDkDqikd
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:ui#1 · os-tesla · session_01L9qibw58ehQ2gRHP2h2Puz

Contract-review-claim: session_01L9qibw58ehQ2gRHP2h2Puz · head 9d549390e4cd47770852aece9585be4323f9a41c · 2026-10-31T10:39Z

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:ui#1 · os-tesla · session_01L9qibw58ehQ2gRHP2h2Puz

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 9d549390e4cd47770852aece9585be4323f9a41c
Local-runs: none
Scope: ui/packages/types/src/ui-action.ts (UIActionSchema.submitText, derived), ui/packages/core/src/actions/ActionRunner.ts (ActionDef.submitText) and actionKeys.ts (ACTION_DEF_KEYS), ui/packages/i18n/src/useObjectLabel.ts (actionSubmitText), ui/packages/app-shell/src/hooks/useConsoleActionRuntime.tsx and views/RecordDetailView.tsx (the two paramCollectionHandler resolutions), views/ActionParamDialog.tsx (ParamDialogState.submitText, the submit button), the four action renderers' forward lines, packages/cli/src/utils/i18n-extract.ts (pushActionSubmitText), packages/spec/src/ui/action.zod.ts and system/translation.zod.ts (describe prose only), packages/spec/src/ui/action.form.ts (the submitText row), packages/spec/liveness/action.json (the row planned to live) and state-counts, packages/spec/src/system/metadata-form-zod-reconciliation.test.ts (the omit row removed), the platform-objects metadata-forms bundles, the regenerated content/docs/references pages, the eleven test files, .changeset/28158-action-param-dialog-submit-text.md

Inputs: card #28158 (the consumer half of #27944: both handlers resolve submitText as they resolve description, the dialog draws it with Confirm as the fallback and Uploading while a file uploads; the seat's claim 6540629779 and its amendment 6541924775 accepting the i18n resolver, the four forward lines, the spec prose trim, ActionDef.submitText; the dev report 6541916389), PR #28392 (body with the resolution order and the acceptance notes, the file list of 41 files, the diff of 968 lines against main read whole for every hand-written hunk, 10 commits from the merge-base), the 65 check-runs on this head (read 2026-10-31T10:41Z: all 65 runs completed, none failed, none cancelled, none in progress; success: Auto Label, Build & E2E UI, Build Core, Build Docs, Build UI Deps, Check Changeset, Check Documentation Links, Check PR Size, Dogfood Regression Gate, Flag docs affected by code changes, Governed Surface Queue Guard, Lint & Repo Gates, Lint UI, Lint · CI, release & engine gates, Lint · ESLint, Lint · PM dispatch-gates, Lint · docs & code guards, Lint · repo & tooling gates, Lint · scoped · query-options erasure, Lint · scoped · slot lookup & corpus, Lint · scoped · tooling self-tests, Live E2E UI, PR-body guards (claim · duplicate · Part-of · single-writer path), Plan Test Core shards, Spec property liveness, Test Core, Test Core (all 8), Test UI, Test UI (all 16), Type Check UI, Type Check · consumer gates, Type Check · debt ledger, Type Check · source gates, Type Check · workspace, TypeScript Type Check, filter; skipped: 18.x upgrade harness (opt-in), Dogfood Regression Gate (matrix shard/3), Dogfood Verify CLI, Packed-tarball smoke (opt-in), Schedule gate · skip when a green push run covers the commit, Temporal Conformance (live PG + MySQL), UI Published Artifacts), and the tree on main for ActionSchema.submitText (actionSubmitText(), an I18nLabel refused blank and refused beside an empty params, landed by #28188), translateAction in i18n-resolver.ts (overlays the slot only on an action with params), validate-translation-references.ts#checkActionSubmitText (a slot under a paramless action is refused), the actionDescription resolver and the actionSuffixes node rule in useObjectLabel.ts, and ActionParamDialog's submit button before this PR (actionDialog.confirm for every action). The head is mergeable and clean against today's main (mergeable_state clean); none of this PR's files moved on main since the merge-base.

① Derived judgments

  • The read point is the dialog, and both doors feed it the same way - right. useConsoleActionRuntime and RecordDetailView each resolve actionSubmitText(keyObject, action.name, pickLocalized(action.submitText, language)): the bundle entry on the object node (globalActions for an object-less action, never for a bound one, by the shared actionSuffixes rule), then the authored inline map collapsed to the active language, then the authored string, exactly the order description takes. The dialog draws the resolved string, keeps actionDialog.confirm when it is absent or empty, and keeps actionDialog.uploading while a file param uploads. The parity pin (DIALOG_READS) holds the two doors to the same value.
  • The key reaches the dialog without being dropped a hop early - right. UIActionSchema.submitText and ActionDef.submitText are derived from the spec field, ACTION_DEF_KEYS lists it, and the four action renderers forward it to the runner; the ui check:action-forward-parity gate reds without those lines and is green on this head. The runner itself never reads it (display copy), which the TSDoc says.
  • The spec changes are prose and ledger, not shape - right. ActionSchema.submitText and the translation slot keep their type and refinements; only the "no renderer shows it yet" clauses leave their describes. The liveness row flips planned to live naming the read points, and drops authorWarn / authorHint in the same edit as the row itself required ([finding] os lint / os validate crash on any stack whose mapping authors connectorSource: the ledger row is live with authorWarn: true, and the liveness rule throws its integrity sentinel #21127). The reconciliation omit row leaves and action.form.ts offers the row, so Studio can author a key the console now draws; the row is not gated on params because the parse refuses the key beside an empty params by name, so a misplaced label is refused, never kept unshown.
  • os i18n extract scaffolds only where the overlay reads - right. pushActionSubmitText emits the slot only for an action with a non-empty params, matching translateAction's overlay and the lint's refusal of a dangling slot; optional-not-derived like description. Pinned by seven cases, one of them a round trip through ActionSchema, extract and ObjectTranslationDataSchema; the ablation of the params guard reds the no-slot case.
  • Pins both ways - right. Twenty new cases across the dialog, the two doors, the resolver and the cli, the identity-pin count moved by one, the forward-precedence test lists the key, and the partial useObjectLabel mocks in five sibling pins gain the passthrough.
  • Check-runs as gate verdicts - read as above; every run on this head completed and none is red, cancelled or in progress at the read.

② Semver level

  • All eight packages patch - accepted. The ui packages take patch for a non-protocol widening (Clause-②: yes (widening) is right: UIActionSchema, ActionDef and useObjectLabel() gain a member, nothing is narrowed); @objectstack/spec changes describe prose, a Studio form row and a ledger row with no change to any accept set, so patch and Metadata-protocol: none are right; cli and platform-objects gain a scaffold and regenerated bundles.

③ Boundary flags

  • MetadataTypeActions.tsx still says Confirm - the third ActionParamDialog consumer (Setup's metadata-type actions) passes neither description nor submitText; outside the card, noted by the seat and not filed. Worth a card only if a metadata-type action ever declares params with a verb.
  • Surface beyond the order - the i18n resolver, the four forward lines, ActionDef.submitText and the translation.zod.ts describe are each forced by the read point or a gate; the amendment accepts all of them.
  • No name approval owed - no spec key is added; actionSubmitText is a ui runtime resolver named after its sibling actionDescription.
  • The seat lands - no Tier H path (no docs/adr, no skills/**, 968 lines), no human gate.

④ Design judgment

  • Tried: an action whose bundle entry is an empty string (the resolver answers undefined, the dialog falls back to Confirm rather than drawing nothing); an inline map lacking the active language (pickLocalized collapses to its fallback chain, as description does); a submitText that carries a ${…} hole (not interpolated, by design: it is a verb, and the body says so). Keying the resolution off the same node rule as description is what keeps a bound action from reading globalActions. Nothing to add.

Verdict reasoning. The card's two doors resolve the key in the order the i18n layer already uses for description, the dialog draws it with the two fallbacks the card named, the key is carried on derived members and forwarded by every renderer so no hop drops it, the spec moves only prose and ledger rows with its accept set untouched, the cli scaffolds exactly where the overlay reads, the declarations and the patch level are right, the pins hold both ways, and every check on this head is green or skipped.

Implemented-by: claude/project-thread-16rt0c
Reviewed-by: session_01L9qibw58ehQ2gRHP2h2Puz

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

席位核对

ACCEPT · seat domain:ui#1 · head 9d549390 · 2026-10-31T10:42Z

席位意见:操作弹出参数对话框时,提交按钮现在显示作者为该操作写的动词,例如「发送」「记录通话」,不再一律显示「确认」。没写时仍显示「确认」,上传文件期间仍显示「上传中」。翻译包里的译文优先,其次是行内多语言文本,最后是作者原文。命令行提取翻译时,只为带参数的操作生成这个键。规范只改说明文字,规则本身不变。

  1. Shape: Fixes #28158, Refs #27944, draft, base main, 41 files, +924/−44. Changes:
    • ActionParamDialog.tsx draws submitText on the submit button.
    • The two param-collection handlers resolve it through useObjectLabel().actionSubmitText.
    • The member is derived on UIActionSchema and ActionDef, and the four action renderers forward it.
    • Prose only on the spec side: the submitText describe in action.zod.ts and translation.zod.ts. The liveness row goes planned → live, and the form row and bundles are added.
    • i18n-extract scaffolds the key for actions with params.
    • Eleven test files and a changeset.
  2. Seat read: the surface matches amendment 6541924775. ActionRunner.ts carries the type member only. MetadataTypeActions.tsx still draws Confirm; that is noted, not filed.
  3. Contract review: PASS 6542358323 on this head. ② is patch on all eight packages, and Clause-②: yes (widening) is right. ③ found no name approval owed: actionSubmitText is a ui runtime resolver named after actionDescription, and no spec key is added.
  4. Gates / check-runs: on 9d549390: 58 success, 7 skipped, 0 failure, including Spec property liveness and Test Core (all 8). Test Core 4/8 was red at 5f1a6b33 and the card thread fixed it on the branch. mergeable_state clean.
  5. Landing: check-governed-merges --pr 28392 reports NOT governed, 968 changed lines ≤ 3000. The seat readies the PR and arms auto-merge, on the maintainer's 「按 pm-dispatch 审过的pr你可以自主落地」 (seat thread, 2026-10-30T14:19Z).

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 31, 2026 10:43
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 31, 2026
Merged via the queue into main with commit bed8306 Oct 31, 2026
66 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-16rt0c branch October 31, 2026 11:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Action param dialog: draw the action's submitText on the submit button, falling back to Confirm

1 participant