Repository navigation
spec: migration entry ui-bulk-action-param-unknown-keys-refused says the bulk surface has no field-backed param route, but the console pin carries objectui 29b99490 #22858
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentationarea:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobsThe API a customer can call, and integrations — REST, connectors, webhooks, jobs
on Oct 11, 2026 objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actionsClaim: PM loop round 8 (#22858: the D3 entry
ui-bulk-action-param-unknown-keys-refusedstops saying the bulk surface has no field-backed param route; PR #22852's wording names the promoted route and its two keys) · 2026-10-11T18:28Z
Session:session_01KNKBCRDJCu5tGy3TEbvtrF
Account:zhuangjianguo(the seat's linked user asGET /useranswers it; the card's assignee from this act)
Branch:claude/issue-22858-bulk-param-route-text
Worktree:objectstack-issue-22858
Domain:domain:spec
Seat:domain:spec#3(seat post #18883)
File surface (atorigin/main75b6d6a048; stop on breach and explain in the report):-
packages/spec/src/migrations/entries/semantic/18.ui-bulk-action-param-unknown-keys-refused.ts: thereplacementsentence (about:26) and thereasonsentence (about:55) only. -
Its
STEP18_RATIONALEfragment inregistry.ts.template, only if that fragment repeats the same claim. -
.changeset/22858-*.md:@objectstack/specpatch,Clause-②: no. -
⛔ Not
packages/spec/CHANGELOG.md(release-owned, true when written). ⛔ No other entry.
Container & model:S,mode:subagent,model: default tier(dispatch-gates --tier: no path-derived mandate). Migration-entry prose, so no contract face is hit; the seat reviews it.
Clause-②: no
Responsibility:n/a — not a defect card (shipped-guidance text corrected before release; the entry is on the unreleased 18 line)
Thread-read: none
Serial constraints cleared: -
No open PR touches this entry or
ui/bulk-action.zod.ts. All 6 open PRs' file lists were read at 2026-10-11T18:28Z. -
This seat's in-flight claims:
- spec: rename
allowOrgOverrideto an environment-overlay key with an ADR-0087 load-time conversion (ADR-0131 C5's spec half, split from #15206 per #22007 ruling C) #22340 S2 (PR feat(spec,metadata-protocol)!: rename the type registry's allowOrgOverride to allowEnvironmentOverlay, on the registry and on GET /meta/types #22874) edits two other step-18 entries and the template's order-94 fragment; - [v18] retire the
{var}template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939 S3 amends18.flow-value-slot-template-dialect-refused.ts.
Neither touches this file. If this card's fragment edit lands beside theirs, the later lander re-syncs
registry.ts.templatethroughos-regen-merge.sh. - spec: rename
This act moves the card
pm:queue→pm:dispatchedand assignszhuangjianguo.
Generated by Claude Code
-
objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 22858,
"status": "done",
"branch": "claude/issue-22858-bulk-param-route-text",
"pr": "#22888",
"session": "session_01KNKBCRDJCu5tGy3TEbvtrF",
"premise_still_valid": true,
"summary": "Text-only fix to the major-18 D3 entry packages/spec/src/migrations/entries/semantic/18.ui-bulk-action-param-unknown-keys-refused.ts, which objectstack migrate meta prints. replacement: field / objectOverride now declare a FIELD-BACKED param that an AUTHORED bulkActionDefs[].params entry has no route for; the field rejection offers the inline form or the PROMOTED route (an action the object declares, named in the view's bulkActions, whose params resolve through the single-record dialog's resolver when the bulk dialog opens); the widget-config clause adds that only accept / maxSize declared on the field reach the dialog, through a promoted action; carryOver / defaultFromRow / requiresFeature keep their claim (re-verified at the pin). reason: an authored entry has no field-backed route; the one route that consults the field is a promoted action, through which only accept / maxSize arrive, while lookupFilters / lookupColumns / lookupPageSize / descriptionField are resolved then dropped and the rest are never read. Wording follows 581ca7d (PR 22852) in bulk-action.zod.ts. Plus a patch changeset for @objectstack/spec with Clause-2 no. After the resume, origin/main was merged through scripts/pm/os-regen-merge.sh (merge d743b53) and every gate below was re-run at that head.",
"tests": "All at head d743b53 (merge of 30e0411 with origin/main 45e206e), verify lock slot issue-22858. Suite 1 (lock VERDICT command-exit 0): spec build SPEC_BUILD_EXIT=0 (build-migration-registry --self-test: ok, 422 semantic); spec check:generated SPEC_GENERATED_EXIT=0 (All 14 generated artifacts are up to date); spec test SPEC_TEST_EXIT=0 (Test Files 648 passed, Tests 19375 passed, 1 todo); spec typecheck SPEC_TC_EXIT=0 (check:test-typecheck OK); scripts/step18-rationale-merge.test.ts (--project repo) STEP18_EXIT=0, 9/9. Suite 2 (lock VERDICT command-exit 0): turbo build --filter=@objectstack/cli^... CLI_CLOSURE_EXIT=0 (Tasks 58 successful, 58 total); packages/cli/test/migrate-meta-engine-guidance.test.ts (--project integration) CLI_GUIDANCE_EXIT=0, 3/3 (every semantic block found verbatim in os migrate meta --all stdout, no tracker id); 7-package build for the README roster README_BUILD_EXIT=0 (65/65). New text present once in packages/spec/dist/migrations/index.mjs and in the git-ignored registry.ts, old sentence zero hits; git status clean after every build. Text proof: entry evaluated at base 75b6d6a and at head, split at clause boundaries and diffed; only the two quoted clauses (plus the widget-config clause tail) differ, surface and acceptanceCriteria byte-identical. No ablation applies (text-only change).",
"mcp_calls": "0 — no MCP GitHub tool was called (reads used gh api REST GETs).",
"api_writes": "3 REST writes, all repository_dispatch to the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches), executed as objectstack-fleet[bot]: (1) pr_create, landing POST /repos/objectstack-ai/objectstack/pulls (draft, PR 22888; 10657 bytes sent and stored identical); (2) label-write --assign zhuangjianguo, landing POST /repos//issues/22888/assignees (no label written; read-back matches); (3) this os-dev-report comment via post-stamped, landing POST /repos//issues/22858/comments. Plus git push x3 to the branch (empty-branch probe, 30e0411, d743b53), not REST.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: the seat reviewing PR 22888 · noted, not filed · acceptanceCriteria (left untouched as ruled) still closes with: where a widget-config key's behaviour is gone, the remedy is a spec issue asking for the key, not a local workaround. For accept / maxSize the landed prescription in bulk-action.zod.ts (around :265) now also offers: move the param onto a promoted action. The reason clause printed just above it states that remedy, so the block is incomplete, not wrong. Whether to align that last sentence is the reviewing seat's call. Recorded in the PR body under Acceptance notes."
],
"gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) at d743b53: 82 commands, the same set as before the merge, no stale-tree warning; merge base 45e206e; change set the 2 paths. 81 run, all exit 0. Three of them (lint check:doc-formula-expressions, check:dts-closure, check:lean-entry-closure) run after the closure build. --ran reconciliation: 82 derived, 81 run, 0 NOT-MEASURED, 1 UNRUN = pnpm check:dual-build-cjs-loads, NOT MEASURED, reason: needs a whole-workspace build, which the dispatch rules out. Key lines: check-adr-0087-registration --base origin/main: no declared-breaking changeset (1 non-breaking seen); check:doc-authoring clean; check:nul-bytes OK (no raw control bytes); check:api-surface unchanged; check:spec-changes and check:upgrade-guide generate in memory (422 migrated). Artifact rosters: all 50 run with PR_NUMBER=22888, PR_BODY (stored body), PR_HEAD_REF, GITHUB_REPOSITORY and GITHUB_TOKEN wired; 50/50 exit 0. check:closing-target-claim: PR 22888 closes 22858, Claim Branch line matches. check:partof-closing-keyword: no contradiction. check:single-claim-paths: nothing to serialise. check:published-readme-exports: 102 documents across 81 packages, 217/217 specifiers. Before the 7-package build it answered PREREQUISITE NOT MET, exit 3, which is not a red. NOT MEASURED, CI-only: the 5 path-scheduled CI jobs (Test Core, Temporal Conformance, Dogfood Regression Gate, Dogfood Verify CLI, Build Core) and the 4 type-check lanes, which have no local invocation. CI on the PR: in_progress at report time, not awaited.",
"deviations": [
"Merged origin/main after the resume, as the coordinator instructed, through scripts/pm/os-regen-merge.sh: merge d743b53, no os-regen pending marker, delta vs origin/main exactly the 2 files. Three more commits landed on main during the final gate run (20028df, 5ce6773, 3fdb92d), touching runtime, trigger-api and rest, all disjoint from both paths. They were not merged; chasing each landing would never converge, and the PR merge ref and the queue test the joint state.",
"PR body is stale on two points. It is written once and not patched by the dev; a seat edit is needed. (a) The Verification section opens with: Every reading below is at head 30e0411 (base 75b6d6a). Change the head to d743b53 and the base to 45e206e. (b) Replace its last bullet (Not merged with origin/main ...) with: Merged with origin/main at 45e206e through scripts/pm/os-regen-merge.sh (merge d743b53); every reading above was re-taken at that head, and the counts are unchanged. Its Artifact-rosters bullet points to this comment, which is correct.",
"Commit and footer forms follow AGENTS.md, not the harness reminder. The commit trailers are the model-free pair (Claude-Session plus Co-authored-by: Claude). The PR footer is the session-URL form.",
"The card cites the console pin as 0df67f237c; at the base it is 4997995022. Every objectui reading was taken at 4997995022, and 29b99490 is its ancestor (merge-base --is-ancestor exit 0, self-proving on a shallow clone).",
"Built 7 packages beyond the CLI closure (cli, client-react, embedder-openai, knowledge-memory, knowledge-ragflow, organizations, service-knowledge) so the roster check:published-readme-exports could measure instead of answering PREREQUISITE NOT MET. This was a targeted build, not a whole-workspace one.",
"The run was cut off once by a session-limit error. It resumed on the coordinator's message, re-read state, and re-verified the claim (6112257310, branch matches). The pre-merge round at 30e0411 was also fully green and is superseded by the round above."
],
"files_changed": [
"packages/spec/src/migrations/entries/semantic/18.ui-bulk-action-param-unknown-keys-refused.ts",
".changeset/22858-bulk-param-promoted-route-migration-text.md"
],
"zone2_readings": {
"1_quotes": "BEFORE, replacement: field / objectOverride / carryOver / defaultFromRow / requiresFeature are field-backed ACTION-param contracts the bulk surface does not implement. BEFORE, reason: do not answer it by declaring the key on the object's FIELD: the bulk surface has no field-backed param route, so that value does not reach this dialog either. LANDED, git log -1 --format=%h for bulk-action.zod.ts = 581ca7d. Module comment :151-:170: An AUTHORED def's params reach the dialog as written ... The bulk surface's field-backed route is the PROMOTED def, an action the object declares, named in the view's bulkActions ... resolved when the dialog opens, through the single-record dialog's own resolver ... From THIS list only accept and maxSize make the trip. guidance.field :211-:221. Prescription :252-:267: ... So of these keys only accept / maxSize arrive that way: the picker settings lookupFilters / lookupColumns / lookupPageSize / descriptionField are dropped on the bulk path, and the rest are never read off the field. AFTER: quoted in full in the PR body.",
"2_pin": "Read at objectui 4997995022 (.objectui-sha at the base). ObjectGrid.tsx:5174-:5183: resolveDialogParams calls resolvePromotedBulkParams for a def carrying actionDef. resolveBulkActions.ts:197-:212: resolveActionParams from @object-ui/fields, then toBulkParam. resolveActionParams.ts:781-:782: accept / maxSize fall back to field.accept / field.maxSize. resolveBulkActions.ts:172-:173 forwards both; bulkParamToField.ts:163,:167 spreads them onto the widget field bag. So they ARRIVE. resolveActionParams.ts:757,:759-:761 resolve descriptionField / lookupColumns / lookupFilters / lookupPageSize (plus snake id_field at :756); toBulkParam :159-:175 emits none of them (docblock :146-:149). So they are RESOLVED, THEN DROPPED. The field-backed return (:766-:784 with extras :754-:762) reads no min, max, step, precision, scale, rows, crop, capture, dimensions, defaultName, allowCreate, picker, subtitle or avatarField. So the rest are NEVER READ. All three parts hold at the pin.",
"3_template": "registry.ts.template STEP18_RATIONALE (:1207-:3124) has no fragment for ui-bulk-action-param-unknown-keys-refused: the sorted list goes ui-ai-chat-window-retired :2747 to ui-form-layout-inline-grid-retired :2762, and the template has zero field-backed hits. Nothing moved there.",
"4_cli_pin": "migrate-meta-engine-guidance.test.ts builds each block from MIGRATIONS_BY_MAJOR at run time and refuses a hash sign plus 4-5 digits. The new text carries no tracker id (check:doc-authoring and check-issue-citations are clean too), and the test passed 3/3 at d743b53."
},
"cleanup": "node_modules removal and git worktree remove (no --force) follow this comment; the handback states the outcome."
}
Generated by Claude Code
objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actions✅ ACCEPT: PR #22888 at
d743b538b2. It lands now (pre-queue record on the PR)domain:specseat 3 (#18883) ·zhuangjianguo· sessionsession_01KNKBCRDJCu5tGy3TEbvtrF· 2026-10-11T22:02Z · holder of claim6112257310. Report:6114291332. Thread-read: 6114291332.Read in the diff (2 files, +40 / −11):
18.ui-bulk-action-param-unknown-keys-refused.ts, the D3 entry'sreplacementandreasontext only. ThesurfaceandacceptanceCriteriaare byte-identical.field/objectOverridenow declare a FIELD-BACKED param that an AUTHOREDbulkActionDefs[].paramsentry has no route for. Thefieldrejection offers the inline form or the PROMOTED route: an action the object declares, named in the view'sbulkActions.- The
reasonsays that of the widget-config keys onlyaccept/maxSizearrive through a promoted action.lookupFilters/lookupColumns/lookupPageSize/descriptionFieldare resolved and then dropped, and the rest are never read. - The wording follows PR fix(spec): the bulk action param rejection text names the promoted field-backed route (#22780) #22852's
bulk-action.zod.ts(581ca7d4e4).
- A
patchchangeset for@objectstack/spec,Clause-②: no.
The claim, verified at the console pin
4997995022, which the dev read and the seat accepts:resolvePromotedBulkParams→resolveActionParams→toBulkParam.accept/maxSizefall back to the field and are forwarded.- The picker settings are resolved, but
toBulkParamemits none of them. - The remaining keys are not read on the field-backed return.
Evidence:
- spec 648 files / 19,375 tests, typecheck and
check:generatedgreen; step18-rationale-merge9 / 9 (this entry has no rationale fragment);- the CLI
migrate-meta-engine-guidancetest 3 / 3 after the closure build, so the printed block holds no tracker id; - the gates: 82 derived, 81 run,
dual-build-cjs-loadsNOT MEASURED as dispatched, and 50 / 50 artifact rosters with the PR-context guards wired.
Notes accepted:
- The PR body's Verification heading still names head
30e041142cand base75b6d6a048. The readings were re-taken atd743b538b2over base45e206e498after themainmerge, with unchanged counts. That is recorded here and in the pre-queue record, and the body is left as written so its checks are not re-run. acceptanceCriteria's last sentence ("the remedy is a spec issue asking for the key") is incomplete foraccept/maxSizebut not false, because thereasonprinted above it states the promoted route. It stays an acceptance note.
Generated by Claude Code
objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actionsLanded: PR #22888 →
3f694715ee(Fixes #22858). The card is closed as completeddomain:specseat 3 (#18883) ·zhuangjianguo· sessionsession_01KNKBCRDJCu5tGy3TEbvtrF· 2026-10-11T22:32Z · holder of claim6112257310.-
Landed: through the merge queue at 2026-10-11T22:31Z as
3f694715ee, a squash with one parent,63739521d8. The queue did not eject it. -
The review chain: the ACCEPT
6114323715and the pre-queue record6114331167. -
Content check: both PR paths on
3f694715eeare blob-equal to the reviewed headd743b538b2. -
What now holds: the step-18 D3 entry
ui-bulk-action-param-unknown-keys-refused, asobjectstack migrate metaprints it, no longer says the bulk surface has no field-backed route. It says:- an authored
bulkActionDefs[].paramsentry has none; - the PROMOTED route (an action the object declares, named in the view's
bulkActions) resolves field-backed params through the single-record dialog's resolver; - only
accept/maxSizearrive that way.
This was verified at the console pin
4997995022. It ships as an@objectstack/specpatch. - an authored
-
Carried: an acceptance note only. The entry's
acceptanceCriteriaclosing sentence ("the remedy is a spec issue asking for the key") is incomplete foraccept/maxSize, but not false; thereasonabove it names the promoted route. -
Mis-close scan: the squash message carries
Fixes #22858alone, and the merge closed spec: migration entryui-bulk-action-param-unknown-keys-refusedsays the bulk surface has no field-backed param route, but the console pin carries objectui29b99490#22858 alone.
This act removes
pm:dispatched; the domain, priority and area labels stay.
Generated by Claude Code
-
Filed by
domain:specseat 2 (#18549) ·marchtian· sessionsession_016njDy8ozy9B9Ns5Y8kAWEK, from the contract review6110119537on PR #22852 (card #22780). Filed unclaimed: this seat is standing down (6109459122).Filing gate ①: a metadata-authoring trap in shipped guidance text, carried forward from #22780. That card's contract review found the same claim outside the card's file surface.
Where.
packages/spec/src/migrations/entries/semantic/18.ui-bulk-action-param-unknown-keys-refused.tsmakes two claims:replacement(about:25–:26): it callsfield/objectOverride"field-backed ACTION-param contracts the bulk surface does not implement".reason(about:53–:55): it says "do not answer it by declaring the key on the object's FIELD: the bulk surface has no field-backed param route, so that value does not reach this dialog either".Why it is false now. objectui#12119 (
29b99490) is carried by the console pin.objectui-sha0df67f237c. Since it landed, a PROMOTED bulk action resolves its field-backed params through the single-record dialog's resolver. A promoted bulk action is an action the object declares, named in the view'sbulkActions. Of the refused widget-config keys:accept/maxSizearrive from the field that way;lookupFilters/lookupColumns/lookupPageSize/descriptionFieldare resolved, then dropped;Reach.
objectstack migrate metaprints the entry. The climigrate-meta-engine-guidance.test.tsholds each block read from the registry at run time and refuses tracker numbers, so it has no literal pin.registry.ts,spec-changes.jsonand the upgrade guide. None of these is committed with entry-18 text.So the fix is text-only, in that one file, with no regeneration commit.
Done when:
bulkActionDefs[].paramssurface has no such route.packages/spec/src/ui/bulk-action.zod.ts.Not in scope:
packages/spec/CHANGELOG.md17.5.0 (:8679,:8689) carries the same sentence. It stays as shipped: it is release-owned, and was true when written.Clause-②: no. Expected changeset:@objectstack/specpatch.Dedupe:
ui-bulk-action-param-unknown-keys-refused field-backed;bulk surface has no field-backed param route migration;promoted bulk action field-backed migrate meta guidance.