Repository navigation
chore(objectui): bump the console pin to 62597c588072 (carries the fail-closed quick_actions requiredPermissions fix) with 46 re-measured citations, the FormField.span describe re-point and the lockstep re-record - #19832
Conversation
…ui 28b065800c7d) Produced by scripts/bump-objectui.sh --no-commit 62597c588072. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01852ixPjE785Lt8MUeYGDEb
node scripts/gen-sdui-manifest-node.mjs --objectui-version 17.6.0; the manifest is byte-identical (sha256 49211fee7792), only the provenance record moves. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01852ixPjE785Lt8MUeYGDEb
pnpm gen:sdui-lockstep with OBJECTUI_ROOT at 62597c588; provenance fields only (grammar blob 0131f27cf86d and all 26 codes unchanged). Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01852ixPjE785Lt8MUeYGDEb
…2597c588072 Each dark token (the def exports and key names each entry names) was re-counted with git grep -o -F at the new pin: still 0 everywhere, the Span / SpanSchema collisions unchanged at 486 / 53. The method was calibrated first: at 87af769e9a3e it reproduces every recorded count (8228 files, useState 2383, timeout 1075, objectstack 12966, ...). Only the corpus size and the lit controls move. registry.ts is regenerated by gen:migration-registry. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01852ixPjE785Lt8MUeYGDEb
…at 62597c588 Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01852ixPjE785Lt8MUeYGDEb
…nd map pin citations at 62597c588 Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01852ixPjE785Lt8MUeYGDEb
…ations at 62597c588 Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01852ixPjE785Lt8MUeYGDEb
…w pin citations at 62597c588 Re-points the two view.zod.ts ObjectMap anchors (385 -> 404, 390 -> 409) after re-reading getMapConfig at the new pin: objectui 2252653d0 rewrote the docblock and dev warning above it, the read itself is byte-identical. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01852ixPjE785Lt8MUeYGDEb
check:future-spec-major reads "@objectstack/spec NNNN" as a version and holds its measurement exemption to the witness sentence; the 87af769e9 clause stays verbatim (and dated) and the 62597c588 re-count follows it. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01852ixPjE785Lt8MUeYGDEb
📓 Docs Drift CheckThis PR changes 2 package(s): 2 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 4 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 137 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 1e1ae74246e912409fef2feaad7f3d0215d8743f && git checkout 1e1ae74246e912409fef2feaad7f3d0215d8743f
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 8cbc3c0084a3c3c8ef5e59763ab3be96aa1a6f07 2a768071114e39151f9231823700d17c39f3b7f3 && git checkout -B drift-repro 8cbc3c0084a3c3c8ef5e59763ab3be96aa1a6f07 && git merge --no-ff 2a768071114e39151f9231823700d17c39f3b7f3
node scripts/docs-audit/affected-docs.mjs --json 8cbc3c0084a3c3c8ef5e59763ab3be96aa1a6f07
|
…mField.span describe to pin 62597c588 Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01852ixPjE785Lt8MUeYGDEb
…correction changeset Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01852ixPjE785Lt8MUeYGDEb
Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01852ixPjE785Lt8MUeYGDEb
Contract reviewServed-tier: ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Isolated at-tier reviewer, adopted by the Generated by Claude Code |
gen:schema + gen:docs on the merge 557f561. The os-regen driver kept this branch's side of view.mdx and dropped main's fieldOrder / hiddenFields describe rows; the regenerated file equals origin/main's plus this branch's two FormField.span rows. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01852ixPjE785Lt8MUeYGDEb
|
Regen-provenance: 5794397942 · The hop was produced by Of the 52 paths in Step 4 on
Main's sibling migration entries are present at the same counts in Dev session Generated by Claude Code |
…ui#10221 and the objectui#9910 re-cut) with re-measured pin citations and the lockstep re-record (objectstack-ai#20036) Fixes objectstack-ai#20029 Clause-②: no Moves the console pin to objectui `main` `f8a9d0fb0596` (the tip at 2026-09-24T20:41Z). That pin carries objectui#10221 (`0651e7ab4`, a currency amount's decimals come from its currency, never from `scale`), which ruling 乙 on objectstack-ai#19910 item 2 requires before PR objectstack-ai#19909 lands. It also carries the objectui#9910 re-cut (`5ea623ea`, containment is the declared `children` slot), which objectstack-ai#19969 waits on. The PR folds in the objectstack-ai#19503 / PR objectstack-ai#19832 precedent's two steps: the sdui-parser lockstep re-record, and a re-MEASURE of the `packages/spec/src/**` citations that `check:objectui-pin-citations` names. Every spec edit is to comment or migration-rationale prose only, plus ONE `.describe()` citation re-point (the `FormField.span` pin, under PM ruling `5822830122`, option A). No schema, key, default or export changes. Clause-②: no, because every authored document is accepted and refused exactly as before. ✅ **All 47 pin citations are now green.** The one `.describe()` this PR first stopped on (`view.zod.ts:3392`, `FormField.span`) was re-pointed under PM ruling `5822830122` (option A) on objectstack-ai#20029. See "The describe, resolved" below. ## Ancestry reading (fix → new pin: AHEAD) - **REST `compare`: NOT MEASURED.** This session's proxy refuses GitHub API reads on `objectstack-ai/objectui`. `GET /repos/objectstack-ai/objectui/compare/0651e7ab4...f8a9d0fb0` answered "GitHub access to this repository is not enabled for this session". - **In its place, measured by git** in a FULL clone of `objectstack-ai/objectui`, where `git rev-parse --is-shallow-repository` returns `false`. An exit 0 is self-proving, and an exit 1 there is not a shallow-window artefact. | command | exit | reading | |---|---|---| | `git merge-base --is-ancestor 0651e7ab4 f8a9d0fb0596` | 0 | objectui#10221 is IN the new pin | | `git rev-list --count 0651e7ab4..f8a9d0fb0596` | 14 | the new pin is 14 commits AHEAD of the fix (REST would read `ahead`) | | `git merge-base --is-ancestor 5ea623ea f8a9d0fb0596` | 0 | the objectui#9910 re-cut is IN the new pin | | `git merge-base --is-ancestor 5ea623ea 0651e7ab4` | 0 | it is an ancestor of the fix, too | | `git merge-base --is-ancestor 62597c588072 0651e7ab4` | 0 | the old pin is behind the fix (control leg) | | `git merge-base --is-ancestor 5ea623ea 62597c588072` | 1 | the re-cut was NOT in the old pin (full clone, so the exit 1 stands) | | `git rev-list --count 62597c588072..f8a9d0fb0596` | 92 | this hop's size | The bump's own changeset lists both: `(objectui 0651e7ab4)` and `(objectui 5ea623eab)`. ## What moved, and how each artefact was produced | artefact | producer | |---|---| | `.objectui-sha` + `.changeset/console-f8a9d0fb0596.md` | `bash scripts/bump-objectui.sh --no-commit f8a9d0fb0596…` exit 0. It reads 86 releasing changesets and 9 breaking (all 9 annotated, none declared major); `@objectstack/console: minor`. The generator's `adr-0087: TODO` is answered `not-required (no-migration-prescription)`, in the wording of the last bump that carried breaking entries. | | the console | `OBJECTUI_ROOT=../objectui bash scripts/build-console.sh`, through the verify lock, VERDICT command-exit 0 (691 s). The `import/jobs` bundle canary is present. `pnpm check:console-sha` exit 0: "Console dist matches the objectui pin (objectui@f8a9d0fb0596)". | | `sdui.manifest.json` + `scripts/sdui-manifest.record.json` | `node scripts/gen-sdui-manifest-node.mjs` exit 0. It wrote 59 components, sha256 `12dd4f8fbf45`. The diff is +39: the `children` slot input objectui#9910 declared on `alert`, `badge`, `box`, `button`, `card`, `container`, `flex`, `grid` and `stack`. `node scripts/check-sdui-manifest.mjs` exit 0. | | `packages/sdui-parser/objectui-lockstep.json` | `OBJECTUI_ROOT=../objectui pnpm gen:sdui-lockstep` exit 0. The diff is 3+/3-, only `rev`, `revDate` and `recordedAgainstPin`. Grammar blob `0131f27cf86d` is unchanged (214 lines), and all 26 diagnostic codes agree. `pnpm check:sdui-lockstep` exit 0: "byte-identical to objectui@f8a9d0fb0596". No parser port is owed by the lockstep gate. | | `packages/spec/src/migrations/registry.ts` | `pnpm --filter @objectstack/spec gen:migration-registry`, from the six edited entries | ## The objectstack-ai#19969 save/render window (measured, not fixed here) In the NEW `sdui.manifest.json`, **5 of 59 components** disagree between `isContainer` (what `packages/sdui-parser/src/validate.ts` still tests) and "declares a `{ name: 'children', type: 'slot' }` input" (what the pinned renderer now decides containment by): | component | `isContainer` | `children` slot | direction | |---|---|---|---| | `badge` | false | true | the save gate warns `not-a-container` on children the renderer renders | | `alert` | false | true | same | | `button` | false | true | same. objectui states it on purpose: "⛔ Not `isContainer`: objectui#6804 ruled that flag means LAYOUT containment" (`button.tsx:97-104`) | | `page:tabs` | true | false | the save gate accepts top-level children that the slot rule does not declare (the children live in `items[].children`) | | `page:accordion` | true | false | same | Non-zero, so objectstack-ai#19969 can be sequenced right behind this PR. The predicate is ⛔ not ported here. ## Citation re-measure: method - **Read points.** For each cited objectui file, `git diff --quiet 62597c588072 f8a9d0fb0596 -- FILE`. - An unchanged file holds its anchors by identity. The prose says so and keeps the earlier hops' history. - For a changed file, each cited span was taken at the old pin and searched for byte-for-byte at the new pin. A moved span is re-pointed. A span not found was re-READ in the new tree, and its content change is stated where it is cited. - **Corpus counts** (six migration entries + `registry.ts`). `git grep -o -F TOKEN SHA | wc -l`. The method was calibrated first: at `62597c588` it reproduces every recorded count exactly (8303 files, `objectstack` 13125, `@objectstack/spec` 5043, `timeout` 1086, `RuntimeConfig` 240, `resourceLimits` 2, `useState` 2389, `window` 3526, `period` 170, `interval` 179, `metrics` 324, `TTL` 156, `tenant` 987, `Span` 486, `SpanSchema` 53). - At `f8a9d0fb0`, all 100 dark tokens still count 0: every export of the four cited zod files plus each key name. - Only the corpus size (8512) and the lit controls move. The two new `Span` hits are `colSpan` and the word "Spanish". - `check:future-spec-major`'s measurement exemption to the sentence "controls objectstack 12966 and @objectstack/spec 4997 on the same corpus" is kept verbatim. The new figures follow it as "13347 and 5123 … at this pin", and the gate is exit 0. ## Every `packages/spec/src/**` edit, with its before → after anchor | site | objectui file(s) | reading at `f8a9d0fb0` | |---|---|---| | `api-methods-batch-conformance.test.ts` `sys_api_key` | `ObjectGrid.tsx` (changed +18/-5: objectui#10083 `rowActionsDeclared`, objectui#9909 currency locale), `useBulkExecutor.ts` (identical) | selection block `4024-4051` → `4032-4059`, still hash `c88443302d40`. `298-303` is identical (hash `01083348330f`) | | `functional-completeness.ts` calendar / gantt / timeline / map rows | `ListView.tsx` (changed: objectui#10275 `$select`; objectui#10037 / objectui#10250 self-query filter and search on gantt / tree / chart), `ObjectGantt.tsx` (changed: `$search`), `ObjectCalendar.tsx` / `ObjectTimeline.tsx` / `ObjectMap.tsx` (identical) | no calendar / gantt-date / timeline / map arm touched; prose restated | | 6 migration entries + their 6 `registry.ts` copies | whole corpus | dark tokens 0 at 8512 files; lit controls re-counted (see method) | | `component.zod.ts` / `component.test.ts` tabs + accordion `icon` | `containers.tsx` (changed, `ba0b61a60`: an import line + `page:header`) | `853-859`, `912`, `1069-1075`, `1116` did NOT move, text byte-identical | | `component.zod.ts` / `component.test.ts` button `icon` | `button.tsx` (changed, `5ea623eab`), `resolve-icon.ts` / `lazy-icon.tsx` (identical) |⚠️ registration inputs CONTENT grew: `85-97` → `85-105` (+ `children` slot input), `defaultProps` `98-102` → `106-110`; still no `icon` input. `:43` / `:72` / `:74` unmoved | | `component.zod.ts` metric `icon` | `ObjectMetricWidget.tsx` (changed, `0651e7ab4`), `index.tsx` / `MetricWidget.tsx` (identical) | destructure `174` → `181`, forward `483` → `528`, text byte-identical | | `component.zod.ts` / `component.test.ts` kanban `limit` ×3, `quickAdd` ×2, `navigation` | `ObjectKanban.tsx` (changed, objectui#10068 `$orderby`), plugin-kanban `index.tsx` (changed), `objectql.ts`, `ElementDataSourceGate.tsx`, `ListView.tsx`, plugin-view `ObjectView.tsx` (all changed); `types.ts`, `element-data-source.ts`, `KanbanImpl.tsx`, `plugin-kanban.mdx` (identical) |⚠️ query CONTENT gained `$orderby` (`674-679` → `680-690`), mapping gained `sort: true` (`447-450` → `507-511`); moved byte-identical: `:84`→`:85`, `:553`→`:554`, `:559`→`:565`, `:676`→`:687`, `:1210`→`:1225`, `:1218-1219`→`:1233-1234`, `:1468`→`:1483`, `:1484-1497`→`:1499-1512`, `:1563`→`:1578`, `:1587`→`:1602`, `index.tsx:313`→`:363-364`, `objectql.ts:3735`→`:3832`, Gate `316-331`→`373-388`, `192-194`→`200-202`, ListView `2979`→`3067`, `2952`→`3040`, ObjectView `1638`→`1666`, `1579`→`1607`. `onQuickAdd` / `quickAdd` still 0, `onCardClick` still 11 | | `component.zod.ts` calendar `navigation` | `ObjectCalendar.tsx` (identical) | anchors hold by identity | | `component.zod.ts` `object-map` header, `filter`, `sort` | `ObjectMap.tsx`, plugin-map `index.tsx`, `record-source.ts` (identical) | anchors hold by identity | | `component.zod.ts` `object-gantt` header | `ObjectGantt.tsx` (changed +29/-2, objectui#10250) | `:501-503`, `:613` unmoved; the rest moved 21 / 29 lines byte-identical (e.g. `844`→`865`, `1615`→`1644`, `2181`→`2210`, `2144`→`2173`).⚠️ new undeclared reads `search` / `searchableFields` (`:776-779`, `:880-885`) are recorded, host-generated by `ListView`'s toolbar | | `component.zod.ts` flat `TreeConfig` guidance + `object-tree` header + registry-shell count | `ObjectTree.tsx` (changed +69/-3: objectui#9549, objectui#9136), `ListView.tsx` (changed); `index.tsx`, `record-source.ts` (identical) |⚠️ two CONTENT changes, restated: the `filter.tree` stash read is DELETED (`getTreeConfig` `235-248` → `246-259`, `tree` `:236` → `:247`), and `filter` gains a second read on the inline `value` provider (`:837`); `ObjectTreeSchema` now declares `filter` (objectui#9549). Moved byte-identical: `582`→`593`, `871/922/985`→`937/988/1051`, `813-814`→`879-880`, `742`→`753`, `908`→`974`, `891`→`957`, `775`→`786`, `741-753`→`752-764`, `751`→`762`, `750`→`761`, `197-218`→`198-219`, ListView `3261-3275`→`3366-3385`, `3270`→`3380`. `ElementDataSourceGate` count re-taken: tree 0, map / gantt / grid / calendar 3 each | | `component.zod.ts` `object-timeline` header + `data` read | `renderer.tsx` (changed, `0b6b295a1`), `ObjectTimeline.tsx` / `index.tsx` (identical) | `1215`→`1240`, `1505`→`1531`, `1442-1457`→`1468-1483`, text byte-identical | | `component.zod.ts` `ComponentPropsMap` comments (map/gantt/tree; timeline) | as above | restated to match the headers | | `dataset.zod.ts` measure `format` | `dataset-format.ts`, `date-display.ts` (both changed, objectui#10026) | `formatDate` `271-306` → `355-390` and `225` → `309` byte-identical; `formatMeasureDate` `229-264` → `229-263` (comment-only change), call `370` → `369`, datetime arm `260-262` → `259-261`; the style handling is unchanged | | `view.zod.ts` view-face `limit` reach (objectstack-ai#19228) | 9 files | instrument 1: probe 0; control 14 lines / 7 files (was 13 / 6; the new one is `RelatedList.selectFls-10186.test.tsx:314`, executable ⇒ 9 executable, was 8). Instrument 2: the same four flattening spreads and the same exclusions. Every anchor re-pointed byte-identical (e.g. `ListView.tsx:3084`→`3172`, `4702`→`4815`, `ObjectView.tsx:1725`→`1753`, `2319`→`2347`). Both verdicts stand | | `view.zod.ts` `ListMapConfigSchema` content-asserted anchors | plugin-view `ObjectView.tsx`, `objectql.zod.ts` (changed) | `case 'map':` `1764` → `1792` (17-line block identical), `ObjectMapConfigSchema` `1574` → `1589` (47-line declaration identical), `LIST_VIEW_LOCAL_OVERRIDES` `734` → `741` (list identical, still no `map`). `--verify-anchors` passes all content assertions | | `view.zod.ts` `FormField.span` DOCBLOCK | `form.tsx` (changed, `5ea623eab`: registration inputs only), `autoLayout.ts` (identical) | `spanLadderFor` `:204-231` is byte-identical, so it still emits the ladder | ## The describe, resolved (PM ruling `5822830122`, option A) The ruling widened the file surface by exactly three items, all landed in one new commit (`90f9a30`): | file | what | |---|---| | `packages/spec/src/ui/view.zod.ts` | the `FormField.span` `.describe()` citation, `.objectui-sha` = `62597c588` → `.objectui-sha` = `f8a9d0fb0596`; nothing else in the sentence changes. The claim was re-read true at the new pin: `plugin-form`'s `autoLayout.ts` is byte-identical, and `form.tsx`'s `spanLadderFor` `:204-231` is byte-identical | | `content/docs/references/ui/view.mdx` | regenerated by `pnpm --filter @objectstack/spec gen:schema && pnpm --filter @objectstack/spec gen:docs` (VERDICT command-exit 0): the two `span` rows only (+2/-2). **No other generated file moved** | | `.changeset/20029-pin-bump-describe-correction.md` | `'@objectstack/spec': patch`, stating the describe correction, in the shape of `17429-` / `19503-pin-bump-describe-corrections.md` | ## Gates `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` on head `90f9a30` derives 124 families (the `view.mdx` edit adds the docs families). `--ran` reads: "124 derived famil(ies) accounted for — 121 run, 3 NOT-MEASURED". - **All run families exit 0**, among them: `pnpm --filter @objectstack/spec run check:objectui-pin-citations` ("47 … match .objectui-sha"), `pnpm check:sdui-lockstep`, `pnpm check:console-sha`, `node scripts/check-sdui-manifest.mjs`, `pnpm --filter @objectstack/spec run check:generated`, `check:docs`, `check:objectui-changeset`, `check:future-spec-major` and `check:migration-registry`. - Five docs families first read exit 3 (unbuilt `@objectstack/lint` / `formula` / `client-react`). After `turbo run build` of those closures they read exit 0: `check:doc-formula-expressions`, `check:doc-security-posture`, `check:skill-examples`, `check:docs-transcript-drift`, `check:lean-entry-closure`. - **NOT MEASURED, exit 3 (PREREQUISITE NOT MET), left to CI:** `check-plugin-teardown-shape --self-test` (shallow clone); `check:dual-build-cjs-loads` and `check:type-check-debt` (both need a full workspace build). This diff changes no code in any package those read. - **Tests:** `@objectstack/spec` vitest on `component.test.ts`, `api-methods-batch-conformance.test.ts`, `src/migrations`, `functional-completeness`, `src/ui/view*` and `src/ui/dataset*`: 26 files, 1666 / 1666 pass (head `530fc4d`); re-run on `src/ui/view*` at head `90f9a30`: 19 files, 1085 / 1085 pass. Changed lines: **884** (+600 / -284, 20 files), under the 5000 threshold. ## Acceptance notes - **Stale metric test anchors, out of the gate's population.** `component.test.ts`'s metric `icon` test body still cites `index.tsx:204`, `ObjectMetricWidget.tsx:142` / `:474` and `MetricWidget.tsx:312-321`. It carries no pin citation, so it is outside the gate's population. Those anchors were already stale before this hop: the docblock beside them reads `:237`, `:181` / `:528` and `:351-360`. Left as they are, because the gate does not name them. - **`object-kanban` reads `sort` now** (objectui#10068, via `ElementDataSourceGate` from the binding's `dataSource.sort`). The node schema declares no `sort`. The key reaches the board from the binding, not from the authored node, so this is not an authoring gap. Recorded, not acted on. - **The branch name is `claude/issue-20029-objectui-pin-bump`**, as the claim names. The console changeset is the script's own `console-f8a9d0fb0596.md` (the precedent's spelling), not a hand-named `20029-*.md`. ## 维护者速读(草稿) - **改了什么**:把控制台钉住的 objectui 版本从 `62597c588` 推进到 `f8a9d0fb0`(objectui main 当时的最新提交),其中包含货币小数位修复 objectui#10221(`0651e7ab4`)和容器判定改用 `children` 插槽的 objectui#9910(`5ea623ea`)。同时按先例重新生成 SDUI 清单、重录 sdui-parser 对齐记录,并在新版本上逐条重新核对 spec 里引用 objectui 代码行号的注释(47 处中 46 处已改)。 - **为什么改**:裁决乙要求 objectui#10221 先进入发布的控制台,PR objectstack-ai#19909 才能落地;同一次推进也是 objectstack-ai#19969 在等的前提。 - **风险与代价(含回滚)**:spec 只改注释和迁移说明文字,外加按 PM 裁决 `5822830122`(选项 A)把 `FormField.span` describe 里引用的钉住版本改为新版本(附 spec patch changeset,重新生成 `view.mdx`);不改任何 schema、键、默认值或导出,已写的元数据接受/拒绝结果完全不变。控制台行为随 objectui 这 92 个提交变化(其中 9 条标注 breaking,都是 objectui 自身的类型面)。清单里有 5 个组件的 `isContainer` 与 `children` 插槽不一致(badge、alert、button、page:tabs、page:accordion),这是 objectstack-ai#19969 要补的保存/渲染窗口。回滚:还原本 PR 即可。 - **席位意见**: - **你要做的**:describe 已按裁决 A 处理,门禁全部跑绿(3 项需完整构建的留给 CI)。落地前还需要一次同档合约审查。 Dev session: `session_01BMUTTbeXStLRWxU9zEWDJq` (PM seat `domain:devx#1`, `session_01VDtqoecgES7ScQYGbFVDRv`). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01BMUTTbeXStLRWxU9zEWDJq --- _Generated by [Claude Code](https://claude.ai/code/session_01BMUTTbeXStLRWxU9zEWDJq)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
Fixes #19503
Clause-②: no
Moves the console pin to objectui
main62597c588072. That tip carries objectui#10153, the fail-closedrecord:quick_actions.requiredPermissionsfix. The PR also carries the bump's two required follow-ups, folded in under the PM ruling on #19503 (comment 5791879469, option A): the sdui-parser lockstep re-record, and a re-MEASURE of thepackages/spec/src/**citations thatcheck:objectui-pin-citationsnames. The citation edits touch comments and migration-rationale prose only; there are no schema or export changes. The one published sentence that moves is theFormField.span.describe()pin citation, authorised by the second ruling (comment 5793509969) and carried with.changeset/19503-pin-bump-describe-corrections.md(@objectstack/spec: patch) plus a regeneratedcontent/docs/references/ui/view.mdx. Clause-②: no, because every authored document is accepted and refused exactly as before.check:objectui-pin-citationsexits 0 on the head: "47 asserting objectui pin citation(s) match .objectui-sha (62597c588) … 7 anchor content assertion(s) verified".Ancestry reading (fix → new pin: AHEAD)
Measured in a FULL (non-shallow) clone of
objectstack-ai/objectui.git rev-parse --is-shallow-repositoryreturnsfalse, so an exit 0 is self-proving:git merge-base --is-ancestor 28b065800c7d1b6069c06aa906d0716377b5e281 62597c588072636e9c30ea35b3d89b1e46fd765dgit rev-list --count 28b065800c7d..62597c588git merge-base --is-ancestor 87af769e9a3e 28b065800c7dcompare: behind_by 4)The bump's own changeset lists the fix:
fix(plugin-detail): record:quick_actions.requiredPermissions is an ADR-0066 capability set, read fail-closed ... (objectui 28b065800).What moved, and how each artefact was produced
.objectui-sha+.changeset/console-62597c588072.mdbash scripts/bump-objectui.sh --no-commit 62597c588072…exit 0 (27 releasing changesets, 0 breaking,@objectstack/console: minor)scripts/sdui-manifest.record.jsonnode scripts/gen-sdui-manifest-node.mjs --objectui-version 17.6.0exit 0.sdui.manifest.jsoncame out BYTE-IDENTICAL (sha25649211fee7792, 57 components), becausepackages/coreships17.6.0at both pins; only the record movespackages/sdui-parser/objectui-lockstep.jsonpnpm gen:sdui-lockstepwithOBJECTUI_ROOTat a checkout of62597c588, exit 0. Diff: 3+/3-, onlyrev,revDateandrecordedAgainstPin. Grammar blob0131f27cf86dunchanged, 214 lines, all 26 diagnostic codes agree.check:sdui-lockstepexit 0: "byte-identical to objectui@62597c588072". No parser port is owedpackages/spec/src/migrations/registry.tspnpm --filter @objectstack/spec gen:migration-registry, from the six edited entriesbash scripts/build-console.shexit 0: "Console dist ready (60524 KB) from objectui@62597c588072", bundle canary present.check:console-shaexit 0Citation re-measure: method
git diff --quiet 87af769e9a3e 62597c588 -- FILE.git diff -U0hunks and its text compared at both pins. It was then re-read in the new tree.registry.ts. I re-counted withgit grep -o -F TOKEN SHA | wc -l. The method was calibrated first: at87af769e9a3eit reproduces every recorded count exactly (8228 files,useState2383,timeout1075,objectstack12966,@objectstack/spec4997,window3464,interval170,tenant976, …).62597c588: the def exports and key names each entry names, 95 tokens in all.Span/SpanSchemacollisions are unchanged at 486 / 53.Re-read sites (all 46 the gate named)
62597c588registry.tscopieskernel-health-check…entry keeps its87af769e9lit-control clause verbatim (now dated) and adds the new counts after it.check:future-spec-majorholds a measurement exemption to that exact sentence, and the new figure "@objectstack/spec5043" would read as a versioncomponent.test.tsaccordion/tabs icon;component.zod.tsPageTabs/PageAccordioniconcontainers.tsx(changed,4c6f549ef)853-859,912,1069-1075and1116did NOT move, text byte-identicalcomponent.test.tsbutton icon;component.zod.tselement:buttoniconresolve-icon.ts,button.tsx,lazy-icon.tsxcomponent.zod.tsmetriciconindex.tsx,ObjectMetricWidget.tsx,MetricWidget.tsxcomponent.test.ts/component.zod.tskanbanlimit×3,quickAdd×2,navigationobjectql.ts,ElementDataSourceGate,ListView.tsx,ObjectView.tsx,plugin-kanban.mdxquickAddblock's lit control said 6onCardClick; the identical file counts 11 at both pins (the test-side twin already says 11). It was miscounted, not moved, and is corrected; the verdict rests on the 0component.zod.tscalendarnavigationObjectCalendar.tsx(changed,afb228418)921-935,936and938-939unmoved;1293→1317,1218→1237and1228-1241→1250-1263, text byte-identicalcomponent.zod.tsobject-mapheader,filter,sort;component.test.ts/component.zod.tsmap/gantt/tree rows;functional-completeness.tsmap rowObjectMap.tsx(changed,2252653d0: onlywarnOnTopLevelStyleUrl's docblock and dev-warning text):289on MOVED 16-19 lines with its text byte-identical (e.g.814→833,895→914,377→396,382→401,1058→1077); no read point or key set changedcomponent.zod.tsgantt / tree ×3 / timeline ×2 headers;functional-completeness.tsgantt, timeline rowsrecord-source.ts,ListView.tsxElementDataSourceGatecount was re-taken: tree 0, map/gantt/grid/calendar 3 each (plugin-grid/src/index.tsxchanged and still reads 3)api-methods-batch-conformance.test.tssys_api_keyObjectGrid.tsx(changed,804831c2a+62597c588)selectionarm to "presence enables; an explicit off wins". The span is now4024-4051(hashc88443302d40, was6133933199…over the last three hops). Re-read, the record's claim holds: with neitherselectionnorselectableauthored, multi-select is enabled only byhasBulkActions, and none of the four views declaresselectiondataset.zod.tsmeasureformatdate-display.ts(changed,516583b54),dataset-format.tsformatDatenow parses viatoDisplayDate(date-only values keep their calendar day); the cited style handling is unchanged;198-233→271-306,152→225view.zod.tsview-facelimitreach (#19228)view.zod.ts:1975/:1978ObjectMap anchors (content-asserted)ObjectMap.tsx2252653d0: it rewrote the docblock and dev warning ABOVEgetMapConfig(the remedy now names the declaredmap: { style }, carried out asmapStyle).getMapConfigis byte-identical, so385→404and390→409; the quotedgetMapConfigcomment is intact (:361→:380)view.zod.tsFormField.spandocblockautoLayout.ts(changed,e026e15f9),form.tsxresolveColSpan153→154(an import added above it).form.tsxis byte-identical, sospanLadderForstill emits the ladderpnpm exec tsx scripts/check-objectui-pin-citations.ts --verify-anchorsreads: all 7 content-asserted anchors pass at62597c588.The two sites first reported, then resolved under the second ruling (comment 5793509969, option A)
packages/spec/src/kernel/functional-completeness.ts, the calendar row: its claim had become FALSE, so it is RESTATED. The row said the "Calendar configuration required" literal "is the text RENDERED at the pin: objectui#10101 landed AFTER the pin".git merge-base --is-ancestor afb228418 62597c588→ 0 (and → 1 against87af769e9a3e).tt('calendar.configRequired', …)(ObjectCalendar.tsx:1207-1208). Its default and theenpack read the same English sentence;zh,deand the other packs render their own words.if (!calendarConfig)refusal arm is unchanged (theObjectCalendar.tsxdiff on this hop is copy-only)..objectui-sha=62597c588. Comment only.packages/spec/src/ui/view.zod.tsFormField.span.describe(): its claim still holds, so the citation is RE-POINTED. The describe now names.objectui-sha=62597c588.plugin-form'sWIDE_FIELD_TYPESis unchanged (it shifted one line; repeater still reaches it throughfield:grid), andform.tsxis byte-identical.pnpm --filter @objectstack/spec gen:schema && gen:docs, which touches only the twospanrows inview.mdx..changeset/19503-pin-bump-describe-corrections.md(@objectstack/spec: patch) states the correction, after PR chore(objectui): bump the console pin to 87af769e9a3e with 27 re-measured citations, and fold in the two-code sdui-parser port (#17645) #19398's17429-pin-bump-describe-corrections.md.Gates
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandson head3fd40beddderives 124 families. The docs families are added byview.mdx. Per-family exit codes are in the os-dev-report comment on #19503. Summary:check:objectui-pin-citationsexit 0;pnpm --filter @objectstack/spec check:generatedexit 0 (all 15 artefacts)check:react-declaration-parity(MANIFEST=$PWD/sdui.manifest.json … --baseline react-declaration-parity.baseline.json --strict, "no new DECLARATION divergence"); the derived spelling omits the manifest inputcheck:skill-examplesread exit 3 (PREREQUISITE NOT MET:@objectstack/client-reactunbuilt) in the sweep; afterpnpm --filter '@objectstack/client-react...' buildit reads exit 0 (259 prose examples type-check).dispatch-gates --ran: 124 derived, 122 run, 2 NOT-MEASURED, 0 UNRUNcheck:dual-build-cjs-loadsandcheck:type-check-debt(both exit 3, PREREQUISITE NOT MET: they need a full workspacepnpm build; this diff changes only comments and migration-rationale strings in spec)@objectstack/specvitest oncomponent.test.ts,api-methods-batch-conformance.test.ts,src/migrations,functional-completenessandsrc/ui/view*: 22 files, 1562/1562 passChanged lines: 560 (+364 / -196, 19 files), under the 5000 threshold.
origin/mainwas merged in twice (d3ff597abefore the PR was opened;16329059bfor this round, withview.mdxregenerated from the merged tree as the pre-pushos-regencheck requires).Acceptance notes
component.zod.ts's flat-map guidance block also citesObjectMap.tsx:382-396without a pin. That spelling is outside the gate's population, and it now reads401-415(byte-identical). It was left as it is: the gate does not name it.bd09957380is already an ancestor of the OLD pin87af769e9a3e.维护者速读(草稿)
62597c588(包含权限修复 objectui#10153:record:quick_actions.requiredPermissions改为失败即拒绝);同时按 PM 裁决 A,重录 sdui-parser 的对齐记录(只动了出处字段),并在新版本上逐条重新核对 spec 里引用 objectui 代码行号的注释。requiredPermissions在 record 块上到底是对象动作还是 ADR-0066 能力?—— 已发布的record:quick_actions那一半今天是 fail-open #19186 的解锁前提;钉住版本一动,引用旧版本的注释门禁必然变红,所以这些注释必须随版本重新测量,不能只替换哈希。FormField.span的 describe 把所引版本改为新钉住版本(说法本身仍成立,附 spec patch changeset)。控制台行为只随 objectui 这 37 个提交变化(27 条带发布说明)。日历那一行说法在新版本上已不成立(提示文案改为按语言翻译),已按第二次裁决改写。回滚:还原本 PR 即可。Dev session:
session_01852ixPjE785Lt8MUeYGDEb(PM seatdomain:devx#1,session_01VDtqoecgES7ScQYGbFVDRv).🤖 Generated with Claude Code
https://claude.ai/code/session_01852ixPjE785Lt8MUeYGDEb
Generated by Claude Code