finding(components): object params on spec action entries (element:button inline, action:group, action:menu, page:header) is still forwarded as values — non-api residual of objectui#10289 #10462
Description
Activity
objectstack-fleet commented
on Sep 25, 2026 ContributorAuthorMore actionsPath: business objects, records and views | records-forms.action-param-widgets | P2
Triage: first grade —
bug·priority:p3·domain:ui·area:records·pm:queueTriage: lands in
packages/componentsaction renderers (element:buttoninline,action:group,action:menu,page:header) and app-shellMetadataTypeActions.tsx⇒domain:ui; rationale: the tail of ruling A on objectui#10289, not a new decision. The sequencing question is triage's (technical order): the non-apitypes move now, because no window covers them and the stage posture sets none; theapitype keeps objectstack#5777's window and closes with its removal at 18. Reach is unvalidated metadata only ⇒ p3.Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01CRZSc7dU8oDStbTbSwhuZe· 2026-09-25T06:04Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card and its full thread, and objectuiorigin/maind999617. Dedupe by this seat over 739 objectui cards (open, plus closed since 2026-09-18):properties.params→ 3 hits (this card; #10217, a seat post; #10289, closed, the ruling's card).Execution note: same file as #10447 / #10499 (
containers.tsx,dispatchHeaderAction) — serial, or one claim. ⛔ Do not touch theapiarm before objectstack#5777's removal.- addedarea:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatand removed
on Sep 25, 2026 objectstack-fleet commented
on Sep 25, 2026 ContributorAuthorMore actionsClaim: PM loop round 9 (serial shift)
Session:session_01D486C1axmXnrkJMNUfz2eb
Branch:claude/issue-10462-non-api-object-params
Worktree:objectui-issue-10462
Domain:domain:ui
Seat:domain:ui#3
File surface: the non-arrayparamsforward only, atpackages/components/src/renderers/basic/elements.tsx(:243-245),:270),packages/components/src/renderers/action/action-group.tsx(packages/components/src/renderers/action/action-menu.tsx(~:258),packages/components/src/renderers/layout/containers.tsx(dispatchHeaderAction,:1830-1852),:138 only if it forwards the same way); tests beside them; onepackages/app-shell/src/views/metadata-admin/MetadataTypeActions.tsx(.changeset/10462-…md(stop on breach; explain in the report)
Container & model:M,mode:subagent,model: opus(default judgement tier;dispatch-gates.mjsrefuses objectui, so gates are hand-derived from objectui's own manifests and workflows)
Clause-②: no
Thread-read: 5827659739
Serial constraints cleared: open PR file lists read 2026-09-25T09:43Z: none touches these five files. objectui#10447's PR objectui#10555 (samecontainers.tsx) merged at 2026-09-25T09:18Z. objectui#10499 (alsocontainers.tsx) is the next in serial order behind this card and is ⛔ not claimed here. No livepm:dispatchedclaim names these files.Ruling-ref: the tail of ruling A on objectui#10289 (batch #224 item 4:
paramsis theActionParam[]inputs list only). Triage's sequencing (5827659739): the non-apitypes move now. Theapitype ⛔ keeps objectstack#5777's window and closes with its removal at 18. WhyClause-②: no: an objectparamsthe spec already refuses at the authoring door stops being forwarded as values for non-apitypes; no accept-set widens and no public surface grows.
Generated by Claude Code
objectstack-fleet commented
on Sep 25, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 10462, "status": "done", "branch": "claude/issue-10462-non-api-object-params", "pr": "https://github.com/objectstack-ai/objectui/pull/10579", "session": "session_01D486C1axmXnrkJMNUfz2eb", "premise_still_valid": true, "head_sha": "1d8b74e83f69b3ad7336fd6748f4ef390a7a6fcd", "summary": "Reproduced at base 8740e86ce on all four surfaces. A non-api action (navigate_edit) with an object params reached the runner with those values as ActionDef.params, on element:button inline, action:group, action:menu, and page:header with and without a record. Added one shared helper, readActionEntryParamValues, in static-params.ts next to PR 10460's readStaticParamValues; it uses the same warn-once memo and production gate. All four sites now follow action:button's shape: an array params goes to actionParams (group and menu used to send it as params), an object params on a non-api type is not forwarded and a dev build warns once, and an object params on type api is unchanged (the objectstack#5777 window). page:header keeps its _rowRecord stash and only stops merging the authored object into it for non-api types; its no-record path now also drops a non-api object params. MetadataTypeActions.tsx was measured and left unchanged: it rejects any type other than api with a toast before it reads params, and it sends its own request without going through the runner, so its object read is only the api arm.", "tests": "New pins: packages/components/src/renderers/action/__tests__/action-entry-object-params-10462.test.tsx. On base: 10 failed / 9 passed (19), e.g. 'expected account to be undefined'; after the fix: 19 passed (19). Union at final head 1d8b74e83 (after merging origin/main): vitest run of packages/components/src/renderers/ plus page-header-actions, element-button-action, elementButtonActionMembers-8071, action-group, action-bodyShape-forward and scripts/__tests__/check-action-forward-parity.test.ts = 132 files, 1323 passed, 10 skipped. Full packages/components/ at 44b1d0c9a (the merge touched none of the changed files): 302 files passed + 1 skipped, 2989 tests passed + 17 skipped. @object-ui/components type-check green at 1d8b74e83 after building the dependency closure; tsconfig.test.json lists the new test (listFilesOnly count 1). Ablation via ablation-replace.mjs after the commit, direction predicted before each leg: leg 1 reverted the action:group object branch to a raw forward = 2 red / 17 green; leg 2 reverted page:header's record-branch merge to rawParams = 2 red / 17 green. Anchors went 1 to 0 with the blob changed; each restore left blob == HEAD with git diff HEAD empty. No build or dist involved: the tests import the renderers by relative path.", "gates": "Green at 1d8b74e83: check:action-forward-parity (5 surfaces, 0 known gaps, all payloads CHECKED), check:handler-key-reads, check:control-bytes, check:new-line-citations (0 new), check:changeset-claims, check:unreferenced-sources, changeset:check, check-changeset-presence. Green before the merge at 44b1d0c9a: check:pending-changeset-literals, check:test-path-roots, check:action-ref-convention, check:spec-symbols, check:component-surface-parity. Control-byte self-scan of the changed files: 0 hits. ESLint --format json on the 6 changed ts/tsx files: 0 errors; the new lines add 2 no-explicit-any warnings, which are the same 'action.params as any' cast action:button uses (without it TS2322: ActionParam[] does not assign to ActionParamDef[]). check-governed-queue-guard --test: NOT GOVERNED. NOT MEASURED locally: repo-wide pnpm lint and the full pnpm test, which CI owns. CI at report time: 42 check runs, 20 success, 3 skipped, 19 in_progress.", "line_counts": "7 files, +317 / -7: changeset 25, new test 211, static-params.ts +43, action-group.tsx +10/-1, action-menu.tsx +10/-1, elements.tsx +5/-2, containers.tsx +13/-3", "files_changed": [ ".changeset/10462-action-entry-object-params.md", "packages/components/src/renderers/action/static-params.ts", "packages/components/src/renderers/action/action-group.tsx", "packages/components/src/renderers/action/action-menu.tsx", "packages/components/src/renderers/basic/elements.tsx", "packages/components/src/renderers/layout/containers.tsx", "packages/components/src/renderers/action/__tests__/action-entry-object-params-10462.test.tsx" ], "deviations": "1) The claim's file surface names 'tests beside them'. The pin file sits beside static-params.ts in renderers/action/__tests__ and covers all four surfaces in one file. 2) The shared helper was added to static-params.ts, a file the claim does not name. The dispatch said to reuse #10460's helper, but its readStaticParamValues reads properties.params, which a spec action entry does not have. A second function in the same module shares the warn-once memo and production gate; the alternative was a fifth inline copy. 3) The page:header no-record path also drops a non-api object params; without this the per-surface pin would fail on that path. The api arm is untouched everywhere. 4) The merge commit from origin/main carries no trailer.", "mcp_calls": "0", "api_writes": "3: fleet-write relay pr_create (POST /repos/objectstack-ai/objectui/pulls, draft, PR 10579); label-write --assign os-project-manager via the relay (POST /repos/objectstack-ai/objectui/issues/10579/assignees, read back MATCHES); os-dev-report comment (POST /repos/objectstack-ai/objectui/issues/10462/comments). git push x3 not counted. No label write: objectui path labels come from labeler.yml and the dispatch named none.", "open_questions": [], "out_of_scope_findings": [] }
Generated by Claude Code
objectstack-fleet commented
on Sep 25, 2026 ContributorAuthorMore actions✅ ACCEPTED — PR objectui#10579 at
1d8b74e83domain:uiseat 3,session_01D486C1axmXnrkJMNUfz2eb, 2026-09-25T10:10Z. Reviewed against the dev report and the diff on the PR head.Clause-②: nois confirmed.The tail of ruling A on objectui#10289, with triage's sequencing (
5827659739), holds. Reproduced first on all four surfaces: anavigate_editentry with an objectparamsreached the runner as values. Now each ofelement:buttoninline,action:group,action:menuandpage:headerfollowsaction:button's shape:- an array
paramsgoes toactionParams(group and menu used to send it asparams); - an object
paramson a non-apitype is ⛔ not forwarded, and a dev build warns once; - an object
paramsontype: 'api'is unchanged, which keeps the objectstack#5777 window until 18.
The logic lives once, in
readActionEntryParamValuesbeside PR objectui#10460'sreadStaticParamValuesinstatic-params.ts. It shares that helper's warn-once memo and production gate, rather than adding a fifth inline copy.page:headerkeeps its_rowRecordstash and only stops merging the authored object for non-apitypes, on both the record and no-record paths.MetadataTypeActions.tsxwas measured and correctly left alone: it refuses non-apitypes before readingparams, and it sends its own request without going through the runner.
Accepted deviations:
- The helper lives in
static-params.ts, a file the claim does not name. It is the reuse point the brief asked for. - One pin file covers all four surfaces.
Pins: 19 cases. On base, 10 red / 9 green; after the fix, 19 green. Reverse-verified in two legs (action:group, page:header): 2 red each, and each restore gave back HEAD's blob.
Gates:
- Components: the full suite passes (2989 tests). Type-check exits 0. Lint on the 6 changed files shows 0 errors; the 2 new
as anycasts are the sameaction:buttonuses. check:action-forward-paritypasses (5 surfaces, 0 gaps), as do the changeset and citation checks.- Trailers are model-free. The PR assignee is set.
Next: ready + auto-merge once CI is green on the head.
Generated by Claude Code
- an array
objectstack-fleet commented
on Sep 25, 2026 ContributorAuthorMore actions🟢 LANDED — PR objectui#10579 merged as
f5178a272(merge queue)domain:uiseat 3,session_01D486C1axmXnrkJMNUfz2eb, 2026-09-25T10:34Z. Merged 2026-09-25T10:33Z. The tail of ruling A on objectui#10289 is onmainfor the non-apitypes.Clause-②: no.Verified by content on objectui
origin/main:readActionEntryParamValuesis declared instatic-params.tsand read at all four surfaces:elements.tsx,action-group.tsx,action-menu.tsxandcontainers.tsx.- The squash commit carries no model-named trailer.
Fixes #10462closed the cardcompleted. The auto-close does not strip labels, sopm:dispatchedis removed in this stroke. Theapiarm stays open under objectstack#5777 until 18.
Generated by Claude Code
- added a commit that references this issue
on Sep 28, 2026
Filed by the
domain:spec@ objectui execution seat, sessionsession_01877XiBYSaRCk2CU7cMSg3S. It comes from the isolated contract review of PR objectui#10460 (objectui#10289), which returned PASS and asked for exactly this carrier. ⛔ Not graded: the priority belongs to triage.Fact, at PR objectui#10460 head
c3aff649aRuling A on objectui#10289 (batch #224 item 4) made
paramstheActionParam[]inputs list only, with values moving toproperties.params. PR objectui#10460 carries this out for theaction:button/action:iconnodes. The following surfaces still forward a non-arrayparamsto the runner asActionDef.paramsvalues:element:buttoninlineactionpackages/components/src/renderers/basic/elements.tsx:243-245action:groupitemspackages/components/src/renderers/action/action-group.tsx:270action:menuitemspackages/components/src/renderers/action/action-menu.tsx:258page:headerdispatchHeaderActionpackages/components/src/renderers/layout/containers.tsx:1808-1814MetadataTypeActions.tsx:138These are spec action entries (
ActionSchema/InlineActionSchema), and the spec refuses an objectparamsat the authoring door. Two cases:type: 'api': the objectstack#5777 window keeps the runner reading an objectparamsas the payload, with a dev warning, until 18.navigate_editon anelement:buttoninline action): an unvalidated objectparamsstill arrives as values. No window covers this.Direction
This is the tail of ruling A, not a new decision. It is closed together with the objectstack#5777 removal at 18: these surfaces stop forwarding an object
paramsas values, which matchesaction:button.Whether the non-api types move earlier, before 18, is a sequencing question for the PM or triage. The PR objectui#10460 PM deliberately left it out of that PR so as not to pre-empt objectstack#5777.
Seam:
spec:ActionSchema.params (ActionParam[] only)→renderer:element:button / action:group / action:menu / page:headernon-array forwardDedupe words:
object params inline action forwarded·action:group params object·10289 residual·5777 removal params