Skip to content

docs(spec): a promoted bulk lookup param carries its field's picker settings, and the spec now says so - #27255

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-4yt16g
Oct 28, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-4yt16g

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Yibo Wang · project thread
Fixes #27050

Ruling-ref: none (triage 6460237597)
Claim: 6468678025
Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么: 只改文字:bulk-action.zod.ts 中 BULK_PARAM_WIDGET_CONFIG_KEYS 上方的 JSDoc 与拒收处方、liveness/view.json 的 list.bulkActionDefs 行、v18 迁移条目 ui-bulk-action-param-unknown-keys-refused 的升级说明,改为:批量操作的字段型查找参数会把字段的 lookupFilters / lookupColumns / lookupPageSize / descriptionField 带到选择栏的选择器,与单条记录对话框一致;idField / titleFormat 仍不带。
  • 为什么改: fix(plugin-grid): keep a field-backed bulk lookup param's lookupFilters and picker settings #27049 已让批量路径转发这四项,规格文字仍说「被丢弃」,会让作者去绕一个已不存在的问题。
  • 风险与回滚: 不改任何 schema,接受集合不变;只改发布包里的说明文字。回滚 = revert 本 PR。
  • 先看: packages/spec/src/ui/bulk-action.zod.ts(拒收处方字符串那一段)。
  • 两分钟验证: git grep -n -E "dropped (by|on) the bulk|drops the lookup settings" -- packages ':!**/CHANGELOG.md' 预期零命中。
  • 需要你做的: 无,席位落地。

What changes

Prose only. The accept set of BulkActionParamSchema does not change, and no key is added to or removed from BULK_PARAM_WIDGET_CONFIG_KEYS.

  • packages/spec/src/ui/bulk-action.zod.ts, JSDoc above BULK_PARAM_WIDGET_CONFIG_KEYS. The promoted route now carries the field's lookup settings lookupFilters / lookupColumns / lookupPageSize / descriptionField to the selection bar's picker, as the single-record dialog does. "From THIS list only accept and maxSize make the trip" becomes "only those four and accept / maxSize", "all but two of these keys" becomes "all but six", and "declare it on the field and let the dialog inherit" is right for those six. The idField sentence stays: idField has no FieldSchema spelling, and the resolver's snake id_field read is still not carried onto the bulk param.
  • Same file, the BULK_PARAM_WIDGET_CONFIG_KEYS refusal prescription. It now lists the four picker settings among what the promoted route carries, says only accept / maxSize and those four arrive that way, and its remedy says "for one of those six move the param onto a promoted action".
  • packages/spec/liveness/view.json, row list.bulkActionDefs. "…and drops the lookup settings." becomes "…and that field's lookup settings lookupFilters, lookupColumns, lookupPageSize and descriptionField, which reach the selection bar's picker as they reach the single-record dialog's (objectstack#26951); idField / titleFormat are still not carried."
  • Another copy the merge made false: packages/spec/src/migrations/entries/semantic/18.ui-bulk-action-param-unknown-keys-refused.ts. Its replacement and reason said only accept / maxSize reach the dialog and the four picker settings are "resolved and then dropped on the bulk path". Both now name the six keys. This is the upgrade guidance os migrate meta prints, so it ships in the package.
  • packages/spec/src/ui/bulk-action.test.ts. One comment said "only accept / maxSize make that trip"; it now names the four picker settings too. The assertions are unchanged and still hold: the prescription still contains the text accept / maxSize.
  • Changeset. @objectstack/spec patch (the prescription and the migration entry text ship in the package).

Not touched: the packages/spec/CHANGELOG.md / packages/rest/CHANGELOG.md lines that quote the old text (release history). skills/**, content/docs/** and ui/** hold no copy of the claim (grep below), so this PR is not governed. Nothing generated reads these strings: the grep finds no generated copy of the prescription, the JSDoc or the liveness note, so there is nothing to regenerate.

Measure first

ui/packages/plugin-grid/src/resolveBulkActions.ts toBulkParam on origin/main d745bb5e (PR #27049 merged as c4ad55ca, an ancestor: git merge-base --is-ancestor c4ad55ca HEAD → exit 0):

    ...(resolved.descriptionField !== undefined && { descriptionField: resolved.descriptionField }),
    ...(resolved.lookupColumns !== undefined && { lookupColumns: resolved.lookupColumns }),
    ...(resolved.lookupFilters !== undefined && { lookupFilters: resolved.lookupFilters }),
    ...(resolved.lookupPageSize !== undefined && { lookupPageSize: resolved.lookupPageSize }),

and its JSDoc: "idField / titleFormat are still not carried: the resolver reads them off undeclared snake keys only, and no bulk reader has asked for them." toBulkParam has no idField or titleFormat line. The resolver (ui/packages/fields/src/resolveActionParams.ts) fills them from field.id_field and field.title_format, and the other four from field.descriptionField, field.lookupColumns, field.lookupFilters and field.lookupPageSize, which FieldSchema declares (packages/spec/src/data/field.zod.ts L1823–1835).

Copy sweep: git grep -n -E "dropped (by|on) the bulk|resolved and then dropped|drops the lookup settings|dropped with the lookup settings|make the trip|only .?accept.? (and|/) .?maxSize" over packages/**, ui/**, skills/** and content/docs/**, CHANGELOGs excluded. On base it found the three sentences on the card, the migration entry (two places) and the test comment. On head, every hit of the last two patterns names the six keys, and the first four patterns have zero hits (git grep exit 1).

Verification

Base origin/main d745bb5e; head 0b20e1f14. Every reading below is from that head.

Spec tests and typecheck
  • pnpm --filter @objectstack/spec build under os-verify-lock → exit 0.
  • pnpm --filter @objectstack/spec test && pnpm --filter @objectstack/spec typecheck under os-verify-lock → VERDICT command-exit 0; Test Files 743 passed (743), Tests 22263 passed, 1 todo; check:test-typecheck: OK.
  • test:repo not run locally: the diff edits no repo-project test and the derived list does not name it. CI's Test Core runs it.
Gates
  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack → 83 commands, each run serially and recorded as CMD :: exit N.
  • 81 exit 0, among them check-adr-0087-registration --base origin/main, check:liveness, check-changeset-no-major. Two first exited 3 on a prerequisite and were re-run after it was met: check-plugin-teardown-shape --self-test (pinned fixture commit fetched) → exit 0; check:doc-formula-expressions (formula and lint built) → exit 0.
  • NOT MEASURED, reason: check:dual-build-cjs-loads and check:lean-entry-closure exit 3, PREREQUISITE NOT MET (they load every package's built entry points, which needs a full build). CI's Build Core runs them.
  • dispatch-gates --ran → ✓ 83 derived famil(ies) accounted for — 81 run, 2 NOT-MEASURED.
  • check-changeset-no-major with this body as a pull_request event → exit 0 (Metadata-protocol: none, patch).
  • Control-byte scan of the three edited prose files → no hits.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WGufzh5MQsqK7dBe3KZ9Aa


Generated by Claude Code

…r settings

The bulk adapter's toBulkParam forwards lookupFilters, lookupColumns,
lookupPageSize and descriptionField since the plugin-grid fix landed, so the
BULK_PARAM_WIDGET_CONFIG_KEYS JSDoc, its refusal prescription, the
list.bulkActionDefs liveness row and the v18 migration entry stop saying they
are dropped. idField / titleFormat still do not travel. Prose only; the
accept set does not change.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WGufzh5MQsqK7dBe3KZ9Aa
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them. ⚠️ 1 changed file(s) yielded no anchor (packages/spec/liveness/view.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/spec/liveness/view.json) — pages documenting those are invisible to this run
  • 2 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 56 of 208 client-bound route-ledger rows — the other 152 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 152: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 97 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 148 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 9ff8154cf694c616de5d467b35af21e037de1509 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from dbe66a251a851f07014285798a8d7f6992911795 — the merge of head 0b20e1f14256008e02bbb74712e5adaba7b94632 into base 9ff8154cf694c616de5d467b35af21e037de1509, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin dbe66a251a851f07014285798a8d7f6992911795 && git checkout dbe66a251a851f07014285798a8d7f6992911795
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 9ff8154cf694c616de5d467b35af21e037de1509 0b20e1f14256008e02bbb74712e5adaba7b94632 && git checkout -B drift-repro 9ff8154cf694c616de5d467b35af21e037de1509 && git merge --no-ff 0b20e1f14256008e02bbb74712e5adaba7b94632

node scripts/docs-audit/affected-docs.mjs --json 9ff8154cf694c616de5d467b35af21e037de1509

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 0b20e1f14256008e02bbb74712e5adaba7b94632
Local-runs: none
Scope: packages/spec/src/ui/bulk-action.zod.ts, packages/spec/src/migrations/entries/semantic/18.ui-bulk-action-param-unknown-keys-refused.ts, packages/spec/liveness/view.json + ui/packages/plugin-grid/src/resolveBulkActions.ts (toBulkParam, main 4d3a077f), ui/packages/plugin-grid/src/components/bulkParamToField.ts, ui/packages/plugin-grid/src/components/BulkActionDialog.tsx, ui/packages/types/src/objectql.ts (BulkActionParam), ui/packages/fields/src/widgets/LookupField.tsx, ui/packages/fields/src/resolveActionParams.ts, ui/packages/app-shell/src/utils/paramToField.ts, packages/spec/src/data/field.zod.ts, packages/cli/src/commands/migrate/meta.ts, packages/cli/test/migrate-meta-engine-guidance.test.ts, packages/spec/scripts/build-upgrade-guide.ts, scripts/check-adr-0087-registration.mjs. Remainder at TIER_DEFAULT, the lane seat's ACCEPT: .changeset/27050-bulk-lookup-param-prose.md, the comment edit in packages/spec/src/ui/bulk-action.test.ts.

Inputs read: card #27050 (body, triage 6460237597, claim 6468678025, os-dev-report 6469779552), PR #27049 as merged (c4ad55ca, its hunk to resolveBulkActions.ts), PR #27255 body and file list, the net diff of 0b20e1f1 against its merge-base with main (d745bb5e; 5 files, +39/−24), and the check-runs on 0b20e1f1. Nothing was checked out, built, run or re-run; every code reading below is git show / git grep against origin/main at 4d3a077f or against the head.

① Derived judgments

Every sentence the diff rewrites, judged against the cited reader on main:

  1. "toBulkParam carries the field's lookupFilters / lookupColumns / lookupPageSize / descriptionField" — RIGHT. ui/packages/plugin-grid/src/resolveBulkActions.ts L178–181 on main spreads descriptionField, lookupColumns, lookupFilters, lookupPageSize onto the returned BulkActionParam under their own names (added by PR fix(plugin-grid): keep a field-backed bulk lookup param's lookupFilters and picker settings #27049, merge c4ad55ca, an ancestor of the merge-base d745bb5e). The premise the card and the claim state holds on main.
  2. "…which reach the selection bar's picker as they reach the single-record dialog's" — RIGHT, the whole chain read. BulkActionParam (ui/packages/types/src/objectql.ts L544) carries an index-signature catch-all, so the four survive the type; bulkParamToField (bulkParamToField.ts L148–175) destructures only name, label, type, required, help, default, multiple, options, object, labelField, placeholder and spreads ...extra — the four included — onto the widget field; BulkActionDialog.tsx L749–752 renders that field through getLazyFieldWidget; LookupField.tsx L377 reads fieldMeta.descriptionField and L405–407 read fieldMeta.lookupColumns / lookupPageSize / lookupFilters. The single-record side (app-shell/src/utils/paramToField.ts L161–170) hands the same four keys to the same widget. The bulk picker is the BulkActionDialog opened from ObjectGrid's BulkActionBar (ObjectGrid.tsx L1978 → resolvePromotedBulkParams, L3888, L3931), so "selection bar's picker" names the right surface.
  3. "idField / titleFormat are still not carried" — RIGHT. toBulkParam has no idField or titleFormat line; the resolver (resolveActionParams.ts L815, L817) fills them from the snake-only field.id_field / field.title_format and its L399–402 comment says the camel twins are deliberately absent. LookupField would read a carried idField (L367, L378), so the sentence is a fact about the adapter, not about the widget — the right thing for the prose to say.
  4. "idField has no FieldSchema spelling to declare" — RIGHT. The only idField in packages/spec/src/data/field.zod.ts is L1007 inside InlineGridColumnSchema (L970); FieldSchema starts at L1104 and declares descriptionField / lookupColumns / lookupPageSize / lookupFilters at L1823–1835 and no idField.
  5. Counts. "all but six of these keys" / "those six keys" / "for one of those six": accept, maxSize + the four = six members of BULK_PARAM_WIDGET_CONFIG_KEYS (20 members on the head, list unchanged). Right.
  6. Accept set — byte-unchanged. The diff to bulk-action.zod.ts touches only the JSDoc block (L147–169) and the prescription string of the BULK_PARAM_WIDGET_CONFIG_KEYS guidance set (L257–267). BULK_PARAM_WIDGET_CONFIG_KEYS itself, the strictObject key list, the per-key renames and the history string are not in the diff. Metadata-protocol: none is right; no authorable key, value or default moves, so no check:authorable-surface / check:api-surface artifact is owed and none is in the diff.
  7. The migration entry's text change is safe. 18.ui-bulk-action-param-unknown-keys-refused.ts changes only its replacement and reason strings; id, surface, acceptanceCriteria and the file's position are unchanged. Readers of that text on main: os migrate meta prints surface → replacement, why: reason, verify: acceptanceCriteria at runtime (packages/cli/src/commands/migrate/meta.ts L790, L800–802); build-upgrade-guide.ts L135–137 projects it into packages/spec/protocol-upgrade-guide.md and content/docs/protocol-upgrade/, both gitignored (.gitignore L114, L150), and check:upgrade-guide / check:spec-changes run --check in memory against no committed copy (packages/spec/spec-changes.json gitignored, L149). Nothing pins the prose: packages/cli/test/migrate-meta-engine-guidance.test.ts pins the id roster (L300) and builds its expected print from the entry's own fields (L344–345); scripts/check-adr-0087-registration.mjs reads no reason / replacement. git grep ui-bulk-action-param-unknown-keys-refused on main hits only the entry, that test and packages/spec/CHANGELOG.md. So the change is runtime-visible upgrade guidance and nothing else — which is why the patch changeset is owed (judged in ②).
  8. Copy sweep — complete. On main the old claim lives in exactly the six places the diff rewrites (bulk-action.zod.ts L160–165 and L262, the entry L37 and L67–69, view.json L198, the test comment L80). On the head, git grep of the "dropped" forms across packages/**, ui/**, skills/**, content/docs/** (CHANGELOGs excluded) returns nothing; the four remaining hits of "only accept / maxSize" are all the corrected six-key sentences. skills/** and content/docs/** carry no copy on either tree, so the dev's "not governed" reading is right and the Governed Surface Queue Guard agrees. The three ui/packages/*/CHANGELOG.md and packages/{spec,rest}/CHANGELOG.md lines quoting the old text are release-owned history and correctly left alone.
  9. view.json row — right and mergeable. The list.bulkActionDefs note's new clause is true per item 2; main moved view.json since the merge-base (form-view rows for spec(view): narrow FormView.type to layout only (simple | tabbed | wizard) — retire split, drawer, modal with tombstones (ADR-0050 Accepted, #27032 letter A′) #27155, +24/−10) without touching this row, and git merge-tree origin/main 0b20e1f1 produces a tree with no conflict. The row keeps its pre-existing sha-less objectui citations; this PR adds none.

Non-blocking observation (pre-existing wording, not introduced here): both the prescription and the entry end "…and the rest are never read off the field", while the resolver does read id_field / title_format off the field and then the bulk adapter drops them. The JSDoc states that precisely; the two runtime strings inherit the older shorthand. Not a FAIL item — the sentence is unchanged in meaning from main and the accurate statement ships in the same file — but a one-clause tightening next time this string moves would be welcome.

② Semver level

.changeset/27050-bulk-lookup-param-prose.md: '@objectstack/spec': patch, carrying Clause-②: no and Metadata-protocol: none, matching the PR body. Right: the diff publishes a changed refusal string and a changed migration-entry text inside @objectstack/spec's dist — behaviour-neutral prose a consumer can observe (the parse error text, os migrate meta output) — so "none" takes patch, never skip-changeset. No export, key, value or default moves, so no minor; no BREAKING banner or ADR-0087 marker is owed. Check Changeset on the head: success.

Clause-②: no

③ Boundary flags

Dev flags (os-dev-report 6469779552 and the PR body), each answered:

  • check:dual-build-cjs-loads and check:lean-entry-closure NOT MEASURED locally. Both are hosted by ci.yml job build-core, display name Build Core (.github/workflows/ci.yml L2805–2806; steps at L3069 and L3093), a required context. Conclusion on 0b20e1f1: see the gate table below.
  • test:repo not run locally. Test Core (ci.yml test-gate) carries it; conclusion below.
  • "Nothing generated reads these strings." Confirmed (item 7 and item 8): no committed generated artifact carries the JSDoc, the prescription or the entry text, and Spec property liveness on the head is green for the view.json edit.
  • "skills/** / content/docs/** / ui/** hold no copy." Confirmed on main and on the head (item 8).
  • Branch name claude/project-thread-4yt16g instead of claude/issue-27050-*. Declared in the claim (6468678025) as the platform-assigned thread branch; the PR-body guards and Duplicate Fix Guard passed. Recorded, not a finding.
  • open_questions: [], out_of_scope_findings: []. Nothing to answer or escalate.

Required contexts on 0b20e1f1 (REQUIRED_CONTEXTS in scripts/check-required-contexts.mjs on main 4d3a077f lists ten: Lint & Repo Gates, TypeScript Type Check, Test Core, Build Core, Governed Surface Queue Guard, Lint UI, Build & E2E UI, Type Check UI, Test UI, Live E2E UI):

All 49 check-runs on the head completed (polled to completion, last read 13:30Z):

Context Conclusion Note
Lint & Repo Gates success every check:* gate, check:liveness included
TypeScript Type Check success the packages/spec artifact gates ran on the prose edit and found nothing stale
Test Core success 8/8 shards success; carries test:repo
Build Core success the job hosting check:dual-build-cjs-loads and check:lean-entry-closure, both unconditional steps — the two NOT-MEASURED gates are measured green here
Governed Surface Queue Guard success no governed path in the file list
Lint UI skipped by its own paths gate (needs.filter.outputs.ui): the diff touches no ui/**; the shape check-required-contexts.mjs records branch protection counting as passing
Build & E2E UI success
Type Check UI success the Console compiles against this spec
Test UI success
Live E2E UI success

Advisory and informational runs: Check Changeset, Check PR Size, Spec property liveness, PR-body guards, Flag docs affected by code changes, Dogfood Regression Gate all success; the opt-in and schedule-only lanes skipped as designed. No failure, no cancellation, no in_progress left.

Landing: the file list touches no governed surface, so this record is the schema-face review the Clause-② queue gate's packages/spec/src/** limb owes; the PR is a draft — ready first, arm second, and only on all required contexts green.

Implemented-by: claude/project-thread-4yt16g
Reviewed-by: session_01WGufzgbJhFoXYsLSe5WSPP

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读 (席位终稿)

  • 改了什么:只改说明文字。批量操作参数说明、拒收处方、v18 迁移条目和 view.json 存活行原来都说批量路径会丢掉查找字段的四个设置。现在改为:lookupFilters、lookupColumns、lookupPageSize、descriptionField 会带到选择栏的选择器,和单条记录的对话框一样;idField / titleFormat 仍然不带。
  • 为什么改:PR fix(plugin-grid): keep a field-backed bulk lookup param's lookupFilters and picker settings #27049 已经让批量路径带上这四个设置,原文字变成了错误的指导。
  • 风险与回滚:接受集逐字不变,只动文案(@objectstack/spec patch)。回滚 = revert 本 PR。
  • 先看:packages/spec/src/ui/bulk-action.zod.ts 中 BULK_PARAM_WIDGET_CONFIG_KEYS 上方的说明和拒收处方。
  • 两分钟验证:在仓库里 grep「dropped by the bulk adapter」,应为 0 处。
  • 需要你做的:无,席位落地。

席位意见:接受。契约复核 PASS(6470336310):每句新文字在 main 上都有对应的读取方,旧说法在全仓库已清零,迁移条目的文字改动不影响任何门禁。

席位核对 · ACCEPT · domain:spec seat 3 · os-support-ai · session session_01WGufzgbJhFoXYsLSe5WSPP · 2026-10-28T13:32Z

Head: 0b20e1f14256008e02bbb74712e5adaba7b94632 · card #27050 · claim 6468678025

  1. 形态: a draft PR to main carrying Fixes #27050: 5 paths (+39 / −24), inside the claim's surface. It edits the JSDoc and the refusal prescription in bulk-action.zod.ts, the replacement / reason of the semantic entry 18.ui-bulk-action-param-unknown-keys-refused, the list.bulkActionDefs liveness row and one test comment, and adds an @objectstack/spec patch changeset. check-governed-merges --pr 27255 reports NOT governed, so the ordinary queue landing applies. The assignee is os-support-ai.
  2. 前提实测: the premise holds. PR fix(plugin-grid): keep a field-backed bulk lookup param's lookupFilters and picker settings #27049 (merged) makes toBulkParam forward the four picker settings, and the review traced each one to its reader: BulkActionParam's catch-all, bulkParamToField, BulkActionDialog, LookupField.tsx. It also confirmed that idField / titleFormat are not carried. BULK_PARAM_WIDGET_CONFIG_KEYS (20 keys) and the strict key list are outside the diff, so the accept set is byte-unchanged and Clause-②: no / Metadata-protocol: none hold. The old "dropped" claim lived in exactly the six places the diff rewrites, and the head has 0 hits across packages/**, ui/**, skills/** and content/docs/**.
  3. 门禁 check-runs (on this head): 49 runs read at 2026-10-28T13:32Z: 39 success, 10 skipped, none red or pending. Every required context is success, except Lint UI, which its own paths filter skips, as check-required-contexts.mjs records. The two gates the dev left NOT MEASURED locally, check:dual-build-cjs-loads and check:lean-entry-closure, are unconditional steps of Build Core, which passed. Dev-side: spec tests 743 files and 22,263 tests, exit 0.
  4. 接受的偏差:
    • (a) The dev also fixed the v18 migration entry's replacement / reason and one test comment, beyond the three named sentences. os migrate meta prints those strings, the CLI test builds its expectation from the entry's own fields, and no gate reads them.
    • (b) Kept as noted, not owed here: the refusal prescription and the migration entry still end "the rest are never read off the field". The resolver does read id_field / title_format before the bulk adapter drops them, so the end result for an author is the same. The JSDoc states it precisely. This is the older shorthand, and it gets tightened the next time those strings move.
  5. 范围外去向: none owed.
  6. 落地条款: the seat checked the prose faces against the diff on this head: the PR body, the changeset and the rewritten strings. The seat readies the PR and arms auto-merge in this act, follows it to MERGED, and lands spec(ui): the bulk-action JSDoc, refusal prescription and view.json liveness row still say the bulk path drops a lookup param's lookupFilters / lookupColumns / lookupPageSize / descriptionField #27050.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 28, 2026 13:34
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 28, 2026 13:34
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 28, 2026
Merged via the queue into main with commit c082af6 Oct 28, 2026
50 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-4yt16g branch October 28, 2026 14:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:ui size/s tests tooling

Projects

None yet

2 participants