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
objectui: element:button forwards bodyExtra to the ActionRunner; the object-form params arm becomes a deprecation window (#5777 objectui half) #6837
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:
useConsoleActionRuntime's apiHandler already does Object.assign(body, resolvePageVarTokens(action.bodyExtra, pageVars)) — {{page.*}} tokens resolve exactly as they did under the old object-form params.
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 reads bodyExtra at all;
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).
Triage: repo:objectui + target:v17 appended (pm:queue was already set by the filing seat per the transfer protocol; not re-applied).
Routing rationale: every named landing site is in objectui — 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, no domain:* (sister-repo routing).
Blocked-by status: upstream PR feat(spec): give an inline type:'api' action its own payload key — params keeps one meaning (#5777) #6819 (spec half) merged 2026-08-08 23:55Z — the Blocked-by: line is satisfied; card is dispatchable now. Per the just-merged-upstream rule I re-verified this card's file face on objectui origin/main @ 8277053 (the merge was in objectstack, so it could not have absorbed this work, and it hasn't): the element:button whitelist still has zero bodyExtra (counter-probe: confirmText present at elements.tsx:243); ActionRunner.ts:287 already declares bodyExtra?; the Array.isArray(action.params) fork is live at ActionRunner.ts:780/790 (note: the runner is packages/core/src/actions/ActionRunner.ts, not a components file); useConsoleActionRuntime.tsx:308 already merges bodyExtra. All of the filing seat's measured contract holds — zero-remaining-work is ruled out.
target:v17 rationale (category ①/③): the divergence window PR feat(spec): give an inline type:'api' action its own payload key — params keeps one meaning (#5777) #6819 documented is now open on main — the live protocol-17 ADR-0087 conversion rewrites old object-form params pages to bodyExtra at 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.
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…