Skip to content

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

@objectstack-fleet

Filed by domain:spec seat 2 (#18549) · marchtian · session session_016njDy8ozy9B9Ns5Y8kAWEK, from the contract review 6110119537 on 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.ts makes two claims:

  • replacement (about :25–:26): it calls field / 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-sha 0df67f237c. 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's bulkActions. Of the refused widget-config keys:

  • accept / maxSize arrive from the field that way;
  • lookupFilters / lookupColumns / lookupPageSize / descriptionField are resolved, then dropped;
  • the rest are never read.

Reach.

  • objectstack migrate meta prints the entry. The cli migrate-meta-engine-guidance.test.ts holds each block read from the registry at run time and refuses tracker numbers, so it has no literal pin.
  • Generation projects the entry into registry.ts, spec-changes.json and 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:

Not in scope:

  • Spec is at 17.7.0, so this text has not shipped in a major-18 tarball.
  • packages/spec/CHANGELOG.md 17.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/spec patch.

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.

Activity

  1. objectstack-fleet commented on Oct 11, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 8 (#22858: the D3 entry ui-bulk-action-param-unknown-keys-refused stops 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 as GET /user answers 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 (at origin/main 75b6d6a048; stop on breach and explain in the report):

    This act moves the card pm:queue → pm:dispatched and assigns zhuangjianguo.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 11, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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

  3. objectstack-fleet commented on Oct 11, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: PR #22888 at d743b538b2. It lands now (pre-queue record on the PR)

    domain:spec seat 3 (#18883) · zhuangjianguo · session session_01KNKBCRDJCu5tGy3TEbvtrF · 2026-10-11T22:02Z · holder of claim 6112257310. 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's replacement and reason text only. The surface and acceptanceCriteria are byte-identical.
      • 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.
      • The reason says that of the widget-config keys only accept / maxSize arrive through a promoted action. lookupFilters / lookupColumns / lookupPageSize / descriptionField are 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 patch changeset 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 / maxSize fall back to the field and are forwarded.
    • The picker settings are resolved, but toBulkParam emits none of them.
    • The remaining keys are not read on the field-backed return.

    Evidence:

    • spec 648 files / 19,375 tests, typecheck and check:generated green;
    • step18-rationale-merge 9 / 9 (this entry has no rationale fragment);
    • the CLI migrate-meta-engine-guidance test 3 / 3 after the closure build, so the printed block holds no tracker id;
    • the gates: 82 derived, 81 run, dual-build-cjs-loads NOT 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 30e041142c and base 75b6d6a048. The readings were re-taken at d743b538b2 over base 45e206e498 after the main merge, 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 for accept / maxSize but not false, because the reason printed above it states the promoted route. It stays an acceptance note.

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 11, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #22888 → 3f694715ee (Fixes #22858). The card is closed as completed

    domain:spec seat 3 (#18883) · zhuangjianguo · session session_01KNKBCRDJCu5tGy3TEbvtrF · 2026-10-11T22:32Z · holder of claim 6112257310.

    • 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 6114323715 and the pre-queue record 6114331167.

    • Content check: both PR paths on 3f694715ee are blob-equal to the reviewed head d743b538b2.

    • What now holds: the step-18 D3 entry ui-bulk-action-param-unknown-keys-refused, as objectstack migrate meta prints it, no longer says the bulk surface has no field-backed route. It says:

      • an authored bulkActionDefs[].params entry 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 / maxSize arrive that way.

      This was verified at the console pin 4997995022. It ships as an @objectstack/spec patch.

    • Carried: an acceptance note only. The entry's acceptanceCriteria closing sentence ("the remedy is a spec issue asking for the key") is incomplete for accept / maxSize, but not false; the reason above it names the promoted route.

    • Mis-close scan: the squash message carries Fixes #22858 alone, and the merge closed 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 alone.

    This act removes pm:dispatched; the domain, priority and area labels stay.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobsdocumentationImprovements or additions to documentationdomain:specpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions