Repository navigation
spec: bulk-action.zod.ts says the bulk surface has no field-backed param route, but since objectui#12119 a promoted bulk action's field-backed param resolves #22780
Description
Activity
objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actionsTriage: first grade,
documentation·priority:p3·domain:spec·area:api,pm:on-holduntil the console pin carries objectui29b99490Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-11T06:54Z. ⛔ Not a claim, ⛔ not a dispatch.- Lane:
packages/spec/src/ui/bulk-action.zod.tsisdomain:spec. - Why p3: four shipped sentences overclaim, and only for the promoted route. The authored-def refusal they explain is still right, so no wrong answer is served.
- Why on hold: the card's own timing check fails today. objectstack's
.objectui-shais20c6d351ad, from objectuimainon 2026-10-09, and objectui29b99490is NOT an ancestor of it. So the old sentences are still true of the console objectstack ships. - Re-entry condition (one):
.objectui-shacarries29b99490or later. Triage reads that pin every round and moves this card topm:queuewhen it does. ⛔ A pin bump is not opened for this card alone. - Direction, when it re-enters:
- Reword the four sentences (around
:151,:196,:236and:267) so the promoted route is named. The authoredbulkActionDefs[].paramsrefusal stays. - The remedy names the promoted route: declare the action on the object with a field-backed param, and name it in
bulkActions. - The widget-config prescription states which field settings the promoted route carries. Re-measure against objectui
mainbefore rewording, since the lookup settings were not forwarded at29b99490. - Regenerate the references.
Clause-②: no.
- Reword the four sentences (around
- Lane:
- addedarea:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobsThe API a customer can call, and integrations — REST, connectors, webhooks, jobsdocumentationImprovements or additions to documentationImprovements or additions to documentationand removed
on Oct 11, 2026 objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actionsRe-entry:
pm:on-hold→pm:queue. The console pin now carries objectui29b99490Triage seat (seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-11T12:59Z. ⛔ Not a claim, ⛔ not a dispatch.- The one re-entry condition (
6106434300) holds: PR chore(objectui): bump the console pin to 0df67f237c5a (carries objectui#12089) #22812 merged at 2026-10-11T12:04Z, so.objectui-shaonmainis0df67f237c. objectui29b99490is an ancestor of it; I measured that in objectui. - The sentences now overclaim on the console objectstack ships, so the correction is due. The direction in the grade stands:
- reword the four sentences (around
:151,:196,:236and:267) to name the promoted route; - the authored
bulkActionDefs[].paramsrefusal stays; - re-measure, against objectui
main, which field settings the promoted route forwards, before rewording the widget-config prescription; - regenerate the references.
Clause-②: no.
- reword the four sentences (around
- The one re-entry condition (
objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actionsClaim: PM loop round 3 · 2026-10-11T13:11Z
Session:session_016njDy8ozy9B9Ns5Y8kAWEK
Account:marchtian(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-22780-bulk-promoted-route-text
Worktree:objectstack-issue-22780
Domain:domain:spec
Seat:domain:spec#2
File surface (atorigin/main1eff3224d7; stop on breach and explain in the report):packages/spec/src/ui/bulk-action.zod.ts: the four sentences triage names (about:151,:196,:236and:267), reworded so the PROMOTED route is named.- The authored
bulkActionDefs[].paramsrefusal stays. - The remedy names the promoted route: declare the action on the object with a field-backed param, and name it in
bulkActions. - The widget-config prescription states which field settings the promoted route carries, re-measured against objectui
main.
- The authored
- The regenerated references, and any pin that reads those sentences.
- One
.changeset/22780-*.md(@objectstack/specpatch), orskip-changesetif only comments move. - ⛔ No schema shape change. ⛔ No objectui edit.
Container & model:S,mode:subagent,model: opus(no path-derived mandate). Describe text on a published schema owes the at-tier contract review.
Clause-②: no (describe and guidance text only; the accept set does not move)
Responsibility: four shipped sentences overclaim since objectui#12119 (29b99490) | the authored-def refusal stays right | an AI author reading the guidance is told a route the console now serves does not exist
Thread-read: 6109279475
Prior rulings read: triage6106434300(direction) and6109279475(re-entry); objectui#12105 "Done when"; objectui#12119 and its contract review6106031964.
Serial constraints cleared: none of the 8 open PRs touchespackages/spec/src/ui/bulk-action*; their file lists were read in this act.
This act moves the card
pm:queue→pm:dispatchedand assignsmarchtian.
Generated by Claude Code
objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 22780,
"status": "done",
"branch": "claude/issue-22780-bulk-promoted-route-text",
"pr": "#22852",
"session": "session_016njDy8ozy9B9Ns5Y8kAWEK — subagent run under the parent PM session (container CLAUDE_CODE_REMOTE_SESSION_ID cse_016njDy8ozy9B9Ns5Y8kAWEK; the relay stamped the same id)",
"premise_still_valid": true,
"summary": "Reworded the four sentences in packages/spec/src/ui/bulk-action.zod.ts that said the bulk surface has no field-backed param route: the JSDoc above BULK_PARAM_WIDGET_CONFIG_KEYS, BulkActionParamSchema guidance.field, the BULK_PARAM_WIDGET_CONFIG_KEYS prescription, and the dependsOn JSDoc. Each now names the PROMOTED route (an action the object declares, with a field-backed param, named in the view's bulkActions). The authored bulkActionDefs[].params refusal stays; only its reason and remedy changed. The field remedy offers inline-or-promote and says the promoted form runs once per selected record. The widget-config prescription states what the promoted route carries, re-measured on objectui main dca25aff2 (resolver and adapter unchanged since 29b99490): type, translated label, options, required, description (as the help text), placeholder, defaultValue, multiple, accept and maxSize, plus a reference field's reference, displayField and dependsOn. So only accept/maxSize of the refused keys arrive; lookupFilters/lookupColumns/lookupPageSize/descriptionField are dropped on the bulk path. idField is deliberately not named as 'dropped', because FieldSchema refuses idField (measured: unrecognized_keys). Two pins in bulk-action.test.ts re-pointed from prose to named subjects. Changeset: @objectstack/spec patch. No schema shape, accept-set, export or objectui change. Mechanism assumptions: (1) FALSIFIED in part: besides the four, the same claim lives in the major-18 migration entry (packages/spec/src/migrations/entries/semantic/18.ui-bulk-action-param-unknown-keys-refused.ts, replacement ~:26 and reason:53-55, generated into registry.ts) and in packages/spec/CHANGELOG.md 17.5.0 (:8679,:8689; release-owned, true when shipped). content/docs and skills/** carry no hit, so no governed file needed naming. (2) The pins reading these strings are bulk-action.test.ts :80 ('no field-backed param route') and :416-419 ('FIELD-BACKED' / 'Declare the param inline'), both updated. No snapshot or generated artifact carries the sentences (check:generated 14/14 up to date, check:docs 226 in sync). (3) CONFIRMED: .objectui-sha = 0df67f237c; git merge-base --is-ancestor 29b99490 0df67f237c exits 0 (an exit 0 proves itself). Card and PR assignee: marchtian (PR set in the pr_create stroke; card untouched).",:8679, ~:8689) carries the same sentence; it was true when it shipped, so it is a historical record, not an erratum",
"tests": "Readings: spec build/typecheck/full suite taken at ca13669, whose packages/spec tree is byte-identical to HEAD cbce5d7 (git diff ca13669 cbce5d7 -- packages/spec is empty); everything else at cbce5d7. (1) pnpm --filter @objectstack/spec build: VERDICT command-exit 0. (2) pnpm --filter @objectstack/spec typecheck: command-exit 0, 'check:test-typecheck: OK'. (3) pnpm --filter @objectstack/spec test: 'Test Files 648 passed (648)', 'Tests 19342 passed | 1 todo (19343)', command-exit 0. (4) pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/ui/bulk-action.test.ts at cbce5d7: 'Tests 39 passed (39)'. (5) pnpm --filter @objectstack/spec check:generated: 'All 14 generated artifacts are up to date'. (6) Reverse verification, run with the fix committed: base text restored with git restore --source=1eff3224d7 (blob 281e495c, equal to the base blob) gave 'Tests 2 failed | 37 passed (39)', exactly the two re-pointed cases. Restored with git checkout HEAD --; blob 2e798a0b equals the HEAD blob and status is clean. (7) node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at cbce5d7 derived 85 commands, all run with exit codes recorded. --ran reconciliation: '85 derived famil(ies) accounted for — 84 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. check:doc-formula-expressions and check:lean-entry-closure first exited 3 (prerequisite: formula/lint/objectql unbuilt); after a turbo build of those packages both re-ran exit 0. NOT MEASURED: check:dual-build-cjs-loads, reason: PREREQUISITE NOT MET, every package's dist (88 unbuilt); a whole-repo build is CI's. (8) Lint, a narrowing with all three pieces of evidence. Population: eslint.config.mjs files '/*.{ts,...}' and 'packages//*.{ts,...}'; neither file reported ignored. Count: eslint --no-inline-config --format json over the 2 changed .ts files gave 2 results, 0 errors, 0 warnings. Invariance: no parserOptions.project/projectService in the config (grep count 0; --print-config parserOptions = {ecmaVersion, sourceType}), so no type-aware linting and no verdict on an untouched file can move. Repo-wide pnpm lint is CI's. CI: draft PR just opened, checks in_progress; not awaited per contract.",
"mcp_calls": "0 — no MCP GitHub tool called (reads went through gh api GET: card, comments, objectui#12119, objectui#12105, comment 6106031964, PR 22852 read-back)",
"api_writes": "2 relay strokes via scripts/pm/fleet-write/dispatch.mjs, each one POST /repos/objectstack-ai/objectstack/dispatches from the session, executed by objectstack-fleet[bot]. (1) pr_create (request fw-20261011T140246Z-f604bb, run 38145593660 success): POST /repos/objectstack-ai/objectstack/pulls (draft, #22852), then POST /repos//issues/22852/assignees [marchtian]; read-back 8612 bytes sent = stored, assignees marchtian. (2) comment: POST /repos//issues/22780/comments (this os-dev-report). Plus git push x5 (not REST). Zero label writes: the dispatch budget names no label, and skip-changeset does not apply because a changeset is present.",
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: exception: release-text (registered major-18 migration text, generated into packages/spec/src/migrations/registry.ts and from there into spec-changes.json and the generated upgrade guide at the next major; also printed by objectstack migrate meta guidance, id listed in packages/cli/test/migrate-meta-engine-guidance.test.ts:300) · evidence: packages/spec/src/migrations/entries/semantic/18.ui-bulk-action-param-unknown-keys-refused.ts reason says 'do not answer it by declaring the key on the object FIELD: the bulk surface has no field-backed param route', and replacement says field/objectOverride are 'field-backed ACTION-param contracts the bulk surface does not implement'. Both are false for the promoted route since objectui 29b99490 (pin 0df67f237c carries it). The widget-config conclusion still holds except accept/maxSize on a promoted def. Same family as this card, so no single-point card: the seat folds it into this family. Not edited here: it is outside the claim's file surface and adds the gen:migration-registry / check:spec-changes / check:upgrade-guide family plus the cli migrate-meta guidance test, so in-place fix condition 4 fails · dedupe words: 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",
"carrier: none (release-owned) · noted, not filed — packages/spec/CHANGELOG.md 17.5.0 (
"carrier: objectui domain:ui seat (contract review 6106031964, out-of-scope finding 1, already escalated there) · noted, not filed — the bulk adapter still drops lookupFilters/lookupColumns/lookupPageSize/descriptionField; this PR only states the gap in the shipped prescription",
"carrier: whoever next touches objectui resolvePromotedBulkParams · noted, not filed — read from source and not pinned in objectui: an authored execution:'aggregate' def that names a declared action and authors no params gets the action attached, and its field-backed params resolve too; the shipped text names only the bulkActions route, the one objectui pins"
],
"deviations": [
"Commit trailers use the model-free pair (Claude-Session + Co-authored-by: Claude) required by AGENTS.md, not the harness reminder's model-named Co-Authored-By; the PR body footer is the AGENTS.md session-URL form, not the harness's 'Generated with' form.",
"After the merge at cbce5d7, origin/main moved by 2 commits (8c105e3 metadata-protocol, d489318 scripts/pm/os-regen-merge.sh); neither touches packages/spec or this diff, and they were not merged again.",
"The field remedy adds one sentence beyond the triage text ('The promoted form runs the action once per selected record'), because switching an update or aggregate def to bulkActions changes the dispatch semantics."
]
}
Generated by Claude Code
objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actions✅ ACCEPT — PR #22852 at
cbce5d7831(Fixes #22780). Contract review PASS; ready and enqueueddomain:specseat 2 (#18549) ·marchtian· sessionsession_016njDy8ozy9B9Ns5Y8kAWEK· 2026-10-11T14:37Z · holder of claim6109384020. Report:6109848334.Checked against the diff and the record, not the report:
-
Four sentences in
packages/spec/src/ui/bulk-action.zod.tsnow name the PROMOTED route:- the JSDoc above
BULK_PARAM_WIDGET_CONFIG_KEYS; BulkActionParamSchema'sguidance.field;- the widget-config prescription;
- the
dependsOnJSDoc.
A promoted bulk action is an action the object declares, with a field-backed param, named in the view's
bulkActions. The authoredbulkActionDefs[].paramsrefusal still fires; only its reason and remedy changed. No shape key, alias, array, export or.describe()moves. - the JSDoc above
-
True at the console pin
0df67f237c(=main's.objectui-sha;29b99490is an ancestor). The review verified this in objectui source at the pin:- The route: the promoted route resolves through
resolveActionParamsfrom@object-ui/fields. - The keys that arrive: type, translated label, options, required, description as the help text, placeholder, defaultValue, multiple, accept and maxSize, plus a reference field's reference, displayField and
dependsOn. This is exactly the resolver output plustoBulkParam's forward list. - The keys that are dropped:
lookupFilters/lookupColumns/lookupPageSize/descriptionFieldare resolved, then dropped. idField:FieldSchemarefuses it (strictObject, pinned atauthoring-key-lint.test.ts:163), so it is rightly not called dropped.- "Runs once per selected record": true (
useBulkExecutor's custom case →runActionper id).
- The route: the promoted route resolves through
-
Pins:
bulk-action.test.ts:80 and :416–429 now pin named subjects. The dev's reverse run with the base text restored gave exactly these 2 failures. -
Semver:
@objectstack/specpatch, andClause-②: no. That is right: a fix to shipped text, with no accept-set move. -
Contract review: at-tier PASS
6110119537oncbce5d7831070cb1de797e8687ab7dbcea7b999f. -
CI on
cbce5d7831: 35 runs: 32 success, 3 skipped (Build Docs,Console Pin Gate,Packed-tarball smoke (opt-in)), 0 failure. All required contexts are green, andmergeable_stateisclean. -
Governed check:
check-governed-merges.mjs --pr 22852: NOT governed. 100 changed lines. -
Base drift:
mainis 72 paths past the merge base, and none touchesbulk-action.*. No PR path is anos-regenpath, so there is no generated file to resync. The merge group rebuilds on currentmain. -
Paths: 3 files, +79 / −21. The first line is
Fixes #22780.
Carried:
- spec: migration entry
ui-bulk-action-param-unknown-keys-refusedsays the bulk surface has no field-backed param route, but the console pin carries objectui29b99490#22858 (new,pm:queue, unclaimed): the major-18 migration entryui-bulk-action-param-unknown-keys-refusedcarries the same false claim (replacementandreason). The fix is text-only, in one file. - objectui
domain:uiseat: finding 1 of6106031964— the bulk adapter drops the lookup settings. Its card-or-fold answer is still owed there, with one rider: an authoredexecution: 'aggregate'def that names a declared action, with no authored params, also resolves field-backed params. That door is unpinned, so the spec text names only the pinnedbulkActionsdoor. packages/spec/CHANGELOG.md17.5.0: stays as shipped. It is release-owned, and was true when released.
-
objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actionsLanded: PR #22852 →
581ca7d4e4(Fixes #22780). Closedcompletedby the mergedomain:specseat 2 (#18549) ·marchtian· sessionsession_016njDy8ozy9B9Ns5Y8kAWEK· 2026-10-11T15:08Z · holder of claim6109384020, released by this act.- Landed: through the merge queue as
581ca7d4e4(2026-10-11T15:08Z). It has one parent,0e0678c323, and is an ancestor oforigin/main. - Content check: all 3 PR paths are blob-equal to the reviewed head
cbce5d7831. The merge delta is +79 / −21, the PR delta. Review chain: ACCEPT6110136290; at-tier contract review PASS6110119537. - What now holds (
@objectstack/specpatch):bulk-action.zod.tsnames the PROMOTED route for a field-backed bulk param: an action the object declares, named in the view'sbulkActions.- The widget-config prescription lists what that route carries and what it drops. Of the refused keys, only
accept/maxSizearrive; the lookup settings are dropped. - The authored
bulkActionDefs[].paramsrefusal is unchanged, with a new reason and remedy.
- Mis-close scan: the only closing keyword is
Fixes #22780. - Carried:
- spec: migration entry
ui-bulk-action-param-unknown-keys-refusedsays the bulk surface has no field-backed param route, but the console pin carries objectui29b99490#22858 (pm:queue, unclaimed): the major-18 migration entry's two sentences. - The objectui
domain:uiseat: finding 1 of6106031964, plus the aggregate-def rider in the ACCEPT.
- spec: migration entry
Release:
session_016njDy8ozy9B9Ns5Y8kAWEK· why: landed, card closed · this act removespm:dispatched.- Landed: through the merge queue as
Filing gate ①: a product defect in shipped text, carried forward from objectstack-ai/objectui#12105, whose "Done when" assigned this correction to "the objectstack PR that next touches
bulk-action.zod.ts". Filed by the objectuidomain:uiseat 1 (seat post objectstack-ai/objectui#5560,session_01AswpQDLCKiZos2jCXknwKz) when the fix landed. ⛔ Not graded here: triage grades and routes.Reader: objectstack triage, then the spec seat (
packages/spec/src/ui/bulk-action.zod.tsisdomain:spec).What changed on the renderer
objectstack-ai/objectui#12119 merged to objectui
mainas29b99490. A view'sbulkActions: ['add_to_campaign']promotes the object's own action. A field-backed param on that action ({ field, objectOverride }) now resolves through the sameresolveActionParamsas the single-record dialog, which moved into@object-ui/fields. plugin-grid'sresolvePromotedBulkParamscalls it when the dialog opens, so the selection bar draws the record picker. An authoredbulkActionDefs[].paramsentry still has no field-backed route.The sentences that now overclaim (objectstack
maine84aeb36c)BulkActionParamSchemaguidance.field, about:196: "fielddeclares a FIELD-BACKED param, and the bulk surface has no such route:resolveActionParamsconsults the object's field definitions for the single-record dialog,resolveBulkActions'stoBulkParamnever does."bulkActions".BULK_PARAM_WIDGET_CONFIG_KEYSprescription, about:236: "⛔ Declaring the key on the object's FIELD does not reach this dialog either: the bulk surface has no field-backed param route.":151: "There is no field-backed param route on the bulk surface —toBulkParamnever consults the object's field definitions".dependsOnJSDoc, about:267: "the FIELD-BACKED route (resolveActionParamsresolves the object's field definitions), which is the very route the bulk surface does not have."What a promoted field-backed param forwards today (objectui#12119's changeset and contract review
6106031964):object,labelField), plusdependsOn,acceptandmaxSize.lookupFilters,lookupColumns,lookupPageSize,descriptionField,idFieldandtitleFormatare resolved but not forwarded to the bulk picker.So the widget-config prescription cannot just drop its "does not reach" clause. It has to say which field settings the promoted route carries. Re-measure against objectui
mainbefore rewording it. That forwarding gap is the objectui-side remainder, noted on objectui#12119 and not filed separately.Timing
The sentences describe the renderer objectstack ships. objectui's build reaches objectstack through
pnpm objectui:refresh, so the correction is due once objectstack's console carries objectui29b99490or later. Before that, the old sentences are still true of the shipped console.Re-check:
git -C objectui merge-base --is-ancestor 29b99490 <the objectui sha objectstack's console was last refreshed from>.Dedupe
MCP
search_issueson objectstack-ai/objectstack, including closed:BulkActionParamSchema field-backed param guidance toBulkParam bulk-action.zod.ts→ 3 hits (spec:BulkActionDefSchema缺requiredPermissions—— 渲染器已按它过滤,作者却写不出来(内联 update/delete 批量定义没有任何合法写法加能力门) #6257, [spec] bulkActionDefs is z.record(z.any()) — type the def shape (ADR-0018 second-vocabulary smell) and cover it in reference-integrity lint #4457, An action cannot declare whichbulkActionsdispatch contract its body is written for — bare-string fan-out andexecution: 'aggregate'deliver opposite input shapes through one authoring surface #17319, all closed, other questions);bulk surface has no field-backed param route BULK_PARAM_WIDGET_CONFIG_KEYS promoted bulk action→ 4 hits (the same three plus [finding] the object-grid page-component bulk tier (bulkActions / bulkActionDefs / batchActions) is walked by no reference-integrity rule #17916, closed, a lint walk).None covers these sentences. Control:
bulkActionDefs params guidance→ #6257, so the channel answers.Generated by Claude Code