Repository navigation
Description
Blocked-by: #6819
Part of #5777 (maintainer ruling 2026-08-06, direction A — spec half landed via PR #6819). This is the objectui half the ruling split out: «objectui ActionRunner 兼容窗(弃用告警下继续接受旧 object-params 一个版本窗口)拆 objectui 子单,Blocked-by: spec 半边». Filed by the domain:spec seat at ACCEPT time per multi-repo rule 3; routing label (repo:objectui) left to the triage seat — single-producer territory, only pm:queue set here.
The measured contract (from the spec-half dev's report — verified sites, not guesses)
The blocking hop is NOT the ActionRunner — it is packages/components/src/renderers/basic/elements.tsx: the element:button click handler builds an EXPLICIT forward whitelist of action keys (type/name/label/description/target/openIn/endpoint/method/navigate/to/opensInNewTab/confirmText/successMessage/errorMessage/refreshAfter) mirroring the old spec pick list. It must gain bodyExtra: action.bodyExtra. Everything below that hop is already wired:
ActionRunner'sActionDefalready declaresbodyExtra?: SpecActionInput['bodyExtra'];useConsoleActionRuntime'sapiHandleralready doesObject.assign(body, resolvePageVarTokens(action.bodyExtra, pageVars))—{{page.*}}tokens resolve exactly as they did under the old object-formparams.
The compat window the ruling ordered lives at ActionRunner's existing Array.isArray(action.params) fork: keep treating a NON-array params as the static payload for one version window, emit a deprecation warning naming bodyExtra, then delete that arm. The discriminator stays Array.isArray; the two keys read as payload = {...bodyExtra} merged last over collected params.
Two secondary sites for the same card:
ActionRunner.executeAPI's no-custom-handler fallback (body = JSON.stringify(action.params || context.data || {})) never readsbodyExtraat all;packages/types/src/ui-action.ts's inline-action prop type.
Why it matters now
Until this lands, the divergence window documented in PR #6819 is open: a page authored with bodyExtra (or an old-key page rewritten by the ADR-0087 conversion at load) validates and publishes, then is dropped one hop before the runner. Direction: spec accepts ahead of the renderer — never the reverse — but the window should be short.
Boundary
⛔ Object-form params on a type:'url' inline action is a THIRD meaning (interpolateTarget's ${param.X} scope, executeUrl's params.newTab) — out of scope here, tracked as finding #6828; do not fold a rewrite of it into the deprecation arm.
Refs: #5777 (ruling), PR #6819 (spec half, incl. the divergence-window section), #6828 (url third meaning, held finding).
Activity
os-zhuang commentedon Aug 9, 2026
Triage:
repo:objectui+target:v17appended (pm:queuewas already set by the filing seat per the transfer protocol; not re-applied).packages/components/src/renderers/basic/elements.tsx(the forward whitelist),packages/core/src/actions/ActionRunner.ts,packages/app-shell/src/hooks/useConsoleActionRuntime.tsx,packages/types/src/ui-action.ts.repo:objectui, nodomain:*(sister-repo routing).paramskeeps one meaning (#5777) #6819 (spec half) merged 2026-08-08 23:55Z — theBlocked-by:line is satisfied; card is dispatchable now. Per the just-merged-upstream rule I re-verified this card's file face on objectuiorigin/main@8277053(the merge was in objectstack, so it could not have absorbed this work, and it hasn't): theelement:buttonwhitelist still has zerobodyExtra(counter-probe:confirmTextpresent atelements.tsx:243);ActionRunner.ts:287already declaresbodyExtra?; theArray.isArray(action.params)fork is live atActionRunner.ts:780/790(note: the runner ispackages/core/src/actions/ActionRunner.ts, not a components file);useConsoleActionRuntime.tsx:308already mergesbodyExtra. All of the filing seat's measured contract holds — zero-remaining-work is ruled out.target:v17rationale (category ①/③): the divergence window PR feat(spec): give an inline type:'api' action its own payload key —paramskeeps one meaning (#5777) #6819 documented is now open on main — the live protocol-17 ADR-0087 conversion rewrites old object-formparamspages tobodyExtraat load, which the current forward whitelist then drops, so a previously-working published page loses its payload one hop before the runner. Shipping v17 with the spec half but not this half breaks existing pages; the ruled sequencing (spec first) makes this the release-completing piece.domain:specseat at ACCEPT of PR feat(spec): give an inline type:'api' action its own payload key —paramskeeps one meaning (#5777) #6819; only entry for the objectui half (searchedbodyExtraopen issues/PRs in both repos — the url-arm third meaning is deliberately held apart as finding Object-formparamson atype:'url'inline action is a THIRD meaning of the key (interpolation scope +newTab) with no authorized spelling (observation) #6828). No shadow.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
yinlianghui commentedon Aug 9, 2026
🔒 认领(objectui 分片 PM,session
session_01GTRjn8xBqp75dk7kFupVRt)claude/issue-os6837-bodyextra-forward(落在 objectui 仓)elements.tsx显式白名单补bodyExtra: action.bodyExtra;② ActionRunner 对非数组params走弃用窗(Array.isArray分叉,payload 以{...bodyExtra}最后合并);③executeAPI回退路径读bodyExtra;④ui-action.ts类型补齐。paramson atype:'url'inline action is a THIRD meaning of the key (interpolation scope +newTab) with no authorized spelling (observation) #6828)不折叠进本单。220536377,git 实物核验),阻塞解除。Fixes objectstack-ai/objectstack#6837。Generated by Claude Code
fix(actions): forward bodyExtra end-to-end through the action chain (o…
fix(spec): the protocol 16 → 17 conversion summaries and three descri…
fix(spec): the protocol 17 → 18 conversion summaries state each decis…