Repository navigation
chore(objectui): bump the console pin to 2e818d0b51ec (carries objectui#11466, #11574, #11578, #11581 and #11583) - #21710
Conversation
Written by scripts/bump-objectui.sh 2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6 --no-commit. Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude <noreply@anthropic.com>
…tations at 2e818d0b5 Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude <noreply@anthropic.com>
Every asserting citation moves to the new pin with its anchors re-mapped through the ab1879721..2e818d0b5 diff; the object-metric icon input and registration move by 12 in plugin-dashboard/src/index.tsx, every other cited file is byte-identical or changed away from the cited lines. Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude <noreply@anthropic.com>
…step at 2e818d0b51ec; spec citation changeset Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude <noreply@anthropic.com>
…console changeset Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude <noreply@anthropic.com>
📓 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:
⛔ 5 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 139 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 e9af031ca5f1edcc7f4e1a9c04b3f105731824a9 && git checkout e9af031ca5f1edcc7f4e1a9c04b3f105731824a9
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 7e0066af7a8e05709dc60096c69bc85e299d0331 a0a35cb30f9451294889f99df9d931b9d4d66d3b && git checkout -B drift-repro 7e0066af7a8e05709dc60096c69bc85e299d0331 && git merge --no-ff a0a35cb30f9451294889f99df9d931b9d4d66d3b
node scripts/docs-audit/affected-docs.mjs --json 7e0066af7a8e05709dc60096c69bc85e299d0331
|
Contract reviewServed-tier: ① Changesets — TRUE
② Review faces — TRUE, all citation/comment/describe-text only
③ Scope — TRUE, no ride-along, no release act
Implemented-by: VERDICT: PASS Generated by Claude Code |
|
Console Pin Gate is red on this head (
Generated by Claude Code |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 37192871034 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
…ui#11611, objectstack-ai#11614 and objectstack-ai#11619) (objectstack-ai#21800) Fixes objectstack-ai#21772 Clause-②: no This moves the bundled Console's objectui pin from `2e818d0b51ec` (objectstack-ai#21710) to objectui `main` as of the write time, `9dfaca654311cddd81714153c4f82c241d7cdc54`, which is past `c096f03`. The Console now carries objectui#11611 (the `ref:dataset` spec-form widget), objectui#11614 (the grid widget's camelCase keys) and objectui#11619 (the record chrome's picture). Those are the three merges objectstack-ai#21714, objectstack-ai#21768 and objectstack-ai#21765 wait on. ⛔ This is not a release act. Version PR objectstack-ai#21352 is untouched, and no tag, publish or Release was made. The card's "release first" hold is lifted by the maintainer's order recorded in the claim: 「浏览器测试已经在运行,还有很多问题在处理,服务端开发不应该被阻塞」. ## Range - objectui `git ls-remote origin refs/heads/main` read `9dfaca654311cddd81714153c4f82c241d7cdc54` at 2026-10-05T00:51:29Z, just before the bump, and the same sha again before this PR was opened. - `git merge-base --is-ancestor` exits 0 against `9dfaca654311` for all three carried merges: `b508ac50d9` (objectui#11611), `2abec3a96c` (objectui#11614) and `c096f03279` (objectui#11619). The objectui clone is shallow, but exit 0 proves itself there. - `2e818d0b51ec..9dfaca654311` has 17 commits and 0 merges. - objectui declared 24 changesets over the range, and all 24 release. There are 0 release-nothing changesets and 0 commits without a changeset. None declares `major`. Four carry the author's breaking annotation, and the highest declared level is `minor`, so the console changeset is `minor`. These counts come from `scripts/objectui-range.mjs --from 2e818d0b51ec --to 9dfaca654311 --json` and from the bump's own digest. They were measured, not copied from the card. - Four commit subjects carry `!`. `git log --format='%h %s' 2e818d0b5..9dfaca654 | grep -E '^[0-9a-f]+ [a-z]+(\([^)]*\))?!:'` gives `9db9ff3f9`, `8b14aecbd`, `2abec3a96` and `b403bb36f`. | objectui commit | landing | changesets | declared disposition | |---|---|---|---| | `9dfaca654` | objectui#11615: the default `simple` form draws a self-describing inline section entry; `ObjectFormSection.fields` gains the form view's `{ field }` arm | 1, minor, **BREAKING** (for TypeScript readers) | releasing; declared breaking, answered below | | `15f67025b` | objectui#11345: the inline grid's default columns derive through the spec rule `deriveInlineGridColumns` | 1, patch | releasing | | `4c127cdef` | objectui#11613: `record:related_list` stops requiring `columns` | 1, minor | releasing; moves the manifest | | `c096f0327` | objectui#11383 (PR objectui#11619): the record chrome draws the record's picture from the object's `imageField` | 1, minor | releasing; smoke below; unlocks objectstack-ai#21765 | | `6e9090c26` | objectui#11336: an object document's served listViews count as served views | 1, patch | releasing | | `9db9ff3f9` `!` | objectui#11266: a form view's `subforms[].columns` entry is the spec's `InlineGridColumnSchema`, by reference | 1, minor, **BREAKING** | releasing; declared breaking, answered below | | `7c9a6b194` | objectui#11340: the docs portal renders the book resolver's answer | 1, patch | releasing | | `8b14aecbd` `!` | objectui#11608: `PartialSchema` is retired from `@object-ui/types` | 1, minor, **BREAKING** | releasing; declared breaking, answered below | | `2abec3a96` `!` | objectui#11610 (PR objectui#11614): the grid widget's eight field-level keys are camelCase; the snake_case spellings are refused by name | 1, minor, **BREAKING** | releasing; declared breaking, answered below; unlocks objectstack-ai#21768 | | `b403bb36f` `!` | objectui#8347: `BaseSchema` loses its index signature | 1, minor (`Clause-②: yes (narrowing)`, no BREAKING word) | releasing; declared breaking by its `!`, answered below | | `fd060f076` | objectui#11605: bound registrations stop requiring `objectName`, and a node with neither shows a no-object hint | 8, minor | releasing; moves the manifest | | `b508ac50d` | objectui#11601 (PR objectui#11611): the `ref:dataset` spec-form widget, fed by the report inspector's dataset catalog | 1, minor | releasing; unlocks objectstack-ai#21714 | | `d2e859936` | objectui#11002: the console asks `GET /usage/storage` only when the runtime serves `features.storageUsage` | 1, minor | releasing; smoke below | | `b92329c89` | objectui#11591: the Organization flows page copy | 1, patch | releasing | | `902ebab63` | objectui#11569: `record:line_items` stops requiring `childObject` | 1, minor | releasing; moves the manifest | | `278d2444e` | objectui#11546: a node click on a read-only flow canvas opens the inspector read-only | 1, patch | releasing | | `b61c116b2` | objectui#11577: `record:details` read mode keeps a textarea's line breaks | 1, patch | releasing | ## Declared-breaking changes, and how this repo answers each The ADR-0087 disposition is `not-required (no-migration-prescription)`. It replaces the bump's `adr-0087: TODO` placeholder in `.changeset/console-9dfaca654311.md`, and it covers all five entries below. `check-adr-0087-registration --base origin/main` gives "1 declared-breaking changeset(s), each carrying an ADR-0087 disposition". `check-changeset-no-major --base origin/main` gives "This diff introduces no `major` bump". 1. **objectui#11610 / PR objectui#11614 (`2abec3a96`): the grid widget's eight keys.** `min_rows`, `max_rows`, `allow_add`, `allow_delete`, `allow_reorder`, `total_field`, `add_label` and `sort_field` become `minRows` … `sortField`. objectui has no dual read: its zod faces refuse a snake_case key by name, and its `GridField` draws an inline alert instead of the grid. - **This repo, today.** `@objectstack/spec`'s runtime form field (`buildObjectFormRuntimeField`, `packages/spec/src/ui/component.zod.ts`) already refuses the eight snake_case keys by name, with guidance that names objectui#11610. The camelCase keys are not declared there yet. - **The interim, stated plainly.** Between this PR and objectstack-ai#21768, an ObjectStack-authored `grid` form field can spell the keys neither way. Measured on this head's built spec: `object-form` with `customFields: [{ name: 'items', type: 'grid', min_rows: 1 }]` is refused with `unrecognized_keys` at `customFields.0` and the grid-key guidance. The same field with `minRows: 1` is refused with `unrecognized_keys` at `customFields.0`, as an undeclared key. So a `grid` field takes its `columns` and the widget's own defaults. The refusal's prescription says these keys "come in once the widget reads a camelCase spelling". At this pin the widget does, and objectstack-ai#21768 declares the keys and retargets that prescription. - **Nothing here carries the retired spelling.** `git grep` over `examples/` and `packages/` finds no authored snake_case grid key. The only hits are the spec's own refusal list and its pin test, migration prose, and one historical note about objectui's internal master-detail adapter. 2. **objectui#11615 (`9dfaca654`): the `simple` form's inline section entries.** For TypeScript readers of `ObjectFormSection.fields`, the type gains the spec's `FormFieldInput` arm. No code in this repo imports `@object-ui/types`; the only `@object-ui/*` import is `scripts/gen-sdui-manifest-node.mjs` reading `@object-ui/core` from the built tree. The behaviour change is that the default `simple` form now draws an inline `{ name, … }` entry, as the other five form types already did. The showcase's `object-form` nodes are `wizard`, `drawer` and `modal` forms whose sections list field names, so none of them draws differently. 3. **objectui#11266 (`9db9ff3f9`): `subforms[].columns`.** objectui's validator now judges a column by `@objectstack/spec`'s own `InlineGridColumnSchema`. This repo has enforced that closed shape since objectstack-ai#20927. objectui's verdict now matches `os validate`, and the ObjectStack accept set does not move. 4. **objectui#11608 (`8b14aecbd`): `PartialSchema`.** It leaves `@object-ui/types`. Nothing in this repo names it (`git grep PartialSchema`: 0). 5. **objectui#8347 (`b403bb36f`): `BaseSchema` loses its index signature.** This narrows the TypeScript face of objectui's node types, and nothing here compiles against them. objectui's zod faces keep their accept sets for every key except `visibleWhen`. That key widens to the `{ dialect, source }` envelope this repo's own parse writes. ## The three cards this unblocks - **objectstack-ai#21714**: objectui#11601's `ref:dataset` widget (PR objectui#11611, `b508ac50d`) is now in the pinned build, so `report.form.ts`'s joined-block `dataset` row can declare `widget: 'ref:dataset'`. - **objectstack-ai#21768**: objectui#11610's camelCase keys (PR objectui#11614, `2abec3a96`) are now what the pinned widget reads, so the spec's runtime form field can declare them. - **objectstack-ai#21765**: objectui#11383's record picture (PR objectui#11619, `c096f0327`) is now in the pinned build, so `object.imageField`'s liveness row can move to `live`. The smoke below observes that read in the browser. The reader is `packages/components/src/renderers/layout/containers.tsx`, in the `page:header` record chrome. ## What changed here - **`.objectui-sha` and `.changeset/console-9dfaca654311.md`.** `scripts/bump-objectui.sh 9dfaca654311cddd81714153c4f82c241d7cdc54 --no-commit` wrote both, with `OBJECTUI_ROOT` set to the container's objectui clone after `git fetch origin main`. The range walked completely without a deepen, and the level was auto-set to `minor`. - **`sdui.manifest.json` and `scripts/sdui-manifest.record.json`.** `node scripts/gen-sdui-manifest-node.mjs` regenerated them over the tree that `pnpm objectui:build` built at the pin. There are 107 components at both pins, and the sha256 moves from `0ead67c1111d…` to `6f921896ffac…`. **This time the manifest moves**: - Eleven inputs lose `required: true` and gain a description. Nine are `objectName`, on `object-grid`, `list-view`, `object-form`, `embeddable-form`, `object-master-detail-form`, `object-kanban`, `object-metric`, `object-chart` and `object-pivot` (objectui#11605). The other two are `record:related_list` `columns` (objectui#11613) and `record:line_items` `childObject` (objectui#11569). - `object-master-detail-form`'s `fields` description is rewritten for objectui#11615's inline entries. - Where the spec has a `ComponentPropsMap` row, these inputs are already optional there. Measured on the built spec: `object-grid`, `object-form`, `object-kanban`, `object-metric` and `object-master-detail-form` `objectName`, `record:related_list` `columns` and `record:line_items` `childObject`. So the manifest now agrees with the spec rows. The JSX page compile reads the manifest, and it stops refusing a node whose `dataSource` binding names the object. - The record moves its pin and `modulesRoot`. objectui's workspace version stays 17.7.0. - **`packages/sdui-parser/objectui-lockstep.json`.** `pnpm gen:sdui-lockstep` re-recorded it against `OBJECTUI_ROOT=.cache/objectui-9dfaca654311`. It records 214 grammar lines (blob `0131f27cf86d`), 25 codes and containment predicate `76c18fb95d1f`. All are unchanged, and objectui's `packages/sdui-parser` has no diff over the range, so no port is owed. - **The 54 asserting pin citations in `packages/spec/src`.** They were re-measured at the new pin, not restamped: - Each asserting record's anchors were resolved in objectui at `2e818d0b5`, mapped through `git diff -U0 2e818d0b5 9dfaca654`, and re-read at the new pin. Each record gains a dated 2026-10-05 hop sentence and keeps its earlier history. - In every cited file that changed, the cited lines moved with their text byte-identical: - objectui#8347 re-worded docblocks in `ObjectGrid.tsx`, `ObjectTree.tsx`, `ObjectGantt.tsx`, `ObjectCalendar.tsx`, `SchemaRenderer.tsx`, `plugin-view/src/ObjectView.tsx`, `plugin-map/src/index.tsx` and `plugin-gantt/src/index.tsx`. - In `ObjectKanban.tsx`, objectui#8347 added a private `GateBoundKanbanSchema` read type, so its fetch, navigation reads and spread moved +30. - objectui#11605 touched `plugin-kanban/src/index.tsx`, `plugin-dashboard/src/index.tsx` and `ElementDataSourceGate.tsx`. The `object-metric` icon input moved `281` → `299` and is still `{ name: 'icon', type: 'string' }`. - objectui#11619 moved the `page:tabs` and `page:accordion` icon anchors in `containers.tsx` by +3. - objectui#11615, objectui#11266 and objectui#8347 moved `ObjectKanbanSchema.limit`, `ObjectMapConfigSchema` and `LIST_VIEW_LOCAL_OVERRIDES` in `objectql.ts` and `objectql.zod.ts`. - objectui#11605 added `view.noObject` to the `en`, `zh` and `de` locale packs. Their cited `calendar.configRequired` strings did not change or move. - One cited line changed content. `ObjectKanban.tsx:10`, the type import, gained `SortConfig` beside the `ObjectKanbanSchema` the record cites. - Two counts were re-taken by their records' own methods, and both read the same: the `keyboardNavigation` hit lines (15, against the `schema.editable` control's 3) and the `ElementDataSourceGate` occurrences in five `src/index.tsx` shells (0, 3, 3, 3 and 4). - The three quoted anchors in `ui/view.zod.ts`'s map record redded at this pin, and each was re-read and re-pointed: `case 'map':` moved `2299` → `2300`, `ObjectMapConfigSchema` `2370` → `2388`, and `LIST_VIEW_LOCAL_OVERRIDES` `1419` → `1437`. - **The six migration entries' corpus counts** were re-taken with `git grep -o -F`. That method first reproduced every `2e818d0b5` number: 7579 files, `objectstack` 17227, `@objectstack/spec` 7134, `timeout` 1351, `useState` 2477, `TTL` 182, `tenant` 1317 and `Span` 505. - The new numbers are 7632 files, 17313, 7186, 1360, 2477, 182, 1318 and 508. The other controls read `RuntimeConfig` 276 → 293, `resourceLimits` 2 → 2, `window` 4175 → 4193, `period` 238, `interval` 195 and `metrics` 374 → 401. - Every zero is still zero: 98 tokens were checked, the export lists of the three cited spec files plus every named key. The only non-zero tokens are the expected `Span` (508) and `SpanSchema` (57). The three new `Span` hits are `colSpan` in objectui's `object-form-section-field-entry-11615.test.ts`. Both `resourceLimits` hits are still prose in `packages/app-shell`. - `packages/spec/src/migrations/registry.ts` was regenerated with `gen:migration-registry`. - **`.changeset/objectui-pin-citations-9dfaca654311.md`** is a `@objectstack/spec` patch, because the `FormField.span` describe and six migration descriptions name the pin. `content/docs/references/ui/view.mdx` was regenerated by `check:generated --fix`. No example, test or gate needed adapting, and no code changed outside generated records, citations and changesets. ## Console build and canaries `build-console.sh` ran locally under the verify lock, after `turbo run build --filter=@objectstack/client...`, the same two steps the `Console Pin Gate` job runs. Exit 0, 9m02s on a shared four-core box. The build log reports: - "Bundle canary 'import/jobs' present". - "Single-zod canary: exactly one zod version literal {major:4,minor:6,patch:5}". - "Console bundle carries THIS tree's @objectstack/spec, and only it". - "@objectstack/console dist ready (64192 KB) from objectui@9dfaca654311". `check:console-sha` and `check:console-injection` exit 0 against that dist. ## Browser smoke: `examples/app-showcase` with the Console built at `9dfaca654311` The server ran `pnpm dev -- --fresh --ui --no-watch --compile -p 41877` with `OS_PORT=41877`, on its own ephemeral DB with the seeded admin. Headless Chromium (`/opt/pw-browsers/chromium`) drove it, signing in through the console's own login form, with console messages, page errors and every 4xx/5xx response captured. Only the PIDs this run started were stopped. **No showcase object declares `imageField`, so the record picture needs one to exist.** `git grep imageField examples` gives 0 hits. To exercise objectui#11619's read, the smoke made a temporary local edit: - It added `imageField: 'f_image'` to `showcase_field_zoo`, through `node scripts/ablation-replace.mjs --hold`. - It compiled and booted the server. - It restored the file at once with `--restore`. The tool reports the blob back to HEAD's `4130858b8f8b` and `git diff HEAD` empty, and `git status --porcelain` is empty. - After the run, the showcase `dist/` was restored from turbo's cache for the clean source: sha256 `cc1034dd9d23…`, as before the smoke. The stray runtime bundle of the edited compile was deleted. Nothing of the edit is in this diff. A real `sys_file` was uploaded through `/api/v1/storage/upload/presigned` → `PUT` → `/upload/complete` (a 64×64 red PNG) and written to "Specimen — Full"'s `f_image`. | record page | `[data-record-picture]` | image | |---|---|---| | Field Zoo "Specimen — Full" (`f_image` set) | 1, beside the title in the record header, `rounded-md` (an `image` field, not `avatar`) | `src="/api/v1/storage/files/b1f4e384-…"`, `alt=""`, loaded, `naturalWidth` 64 | | Field Zoo "Specimen — Minimal" (`f_image` empty) | 0 | none, as objectui#11619 specifies for an empty value | **Verdict:** at this pin the record header draws the record's picture from the object's `imageField`, drawing the stored file through `/api/v1/storage/files/:id`, and draws nothing when the value is empty. `showcase_task`'s record page is the custom `task-detail` page, which has no `page:header`, so it draws no record chrome to put a picture in. That page was smoked too: it renders its path bar, highlights and sections with 0 page errors. **Console messages across the run:** 0 page errors. The only failed loads are a 401 on `GET /api/v1/auth/get-session` (the pre-login probe) and a 404 for `/favicon.ico`. There is no `/api/v1/usage/storage` 404. objectstack-ai#21625's and objectstack-ai#21710's smokes both recorded one, and objectui#11002 (`d2e859936`) stopped the request on a runtime that does not serve it. ## Gates and tests (head `4b9519ea23`) - `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` derived 127 commands from the 22-path diff, and all were run at `4b9519ea23`. `--ran` reports "127 derived, 127 run, 0 NOT-MEASURED, 0 UNRUN", with every exit code recorded. - Two exited 3 (`PREREQUISITE NOT MET`) on the first pass: `check:skill-examples` (no `client-react` dist) and `check:dual-build-cjs-loads` (no dist for 34 packages). - Both exited 0 after `turbo run build --filter=!@objectstack/docs` (71 of 72 tasks were cache hits), and those are the codes recorded. - Also exit 0: - `check:objectui-pin-citations --verify-anchors` with objectui at the pin: 54 asserting citations match `9dfaca654`, and 7 anchor content assertions are verified. - `check:objectui-bump` (20 assertions across 5 cases), `check:sdui-lockstep`, `check-sdui-manifest`, `check:console-sha`, `check:console-injection`, `check:migration-registry`. - `@objectstack/spec check:generated`: all 15 artifacts current after the `--fix`. - `pnpm --filter @objectstack/spec exec vitest run` (both projects, `local` and `repo`): 668 files, 19259 passed, 1 todo. `pnpm --filter @objectstack/spec typecheck`: exit 0. - `@objectstack/sdui-parser` test (14 files, 225 passed) and typecheck: exit 0. - These suites read the regenerated manifest: - `@objectstack/lint` test: 119 files, 5627 passed. It declares `sdui.manifest.json` as a test input. - `@objectstack/metadata-protocol` `src/protocol.runtime-authoring-gate.test.ts`: 70 passed. - `@objectstack/cli` unit tier `src/utils/sdui-manifest.test.ts` and `test/validate-build-gate-parity.test.ts`: 2 files, 79 passed. - `test/jsx-gate-manifest-notice.e2e.test.ts` belongs to neither CLI tier; it runs nightly, so it is NOT MEASURED here and is left to CI. - `eslint --no-inline-config --format json` on the 15 changed TS files: 15 files, 0 errors and 0 warnings. The lint population is `**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}` (`eslint.config.mjs:971`). The config enables no type-aware linting (`:327-328`), so this diff cannot move a verdict on an untouched file. Repo-wide `pnpm lint` is left to CI. ## Acceptance notes - `main` moved two commits past this branch's base (objectstack-ai#21783, objectstack-ai#21780). Neither touches a path this diff touches, so no merge was made. The merge queue rebuilds on the current `main`. - Anchors in records that cite no asserting sha are outside the pin-citation gate's population and were not re-measured. Several point into files that changed here: `containers.tsx` anchors in `ui/component.zod.ts` docblocks with no sha, and `component.test.ts`'s `plugin-dashboard/src/index.tsx:204` (the `ObjectMetricPropsSchema icon liveness` test, already reading an unrelated line at `ab1879721595`, as objectstack-ai#21710 noted). - After this pin, the spec's snake_case grid-key prescription ("these come in once the widget reads a camelCase spelling") describes a condition that now holds. objectstack-ai#21768 retargets it when it declares the camelCase keys. It is left as is here, because the pin bump changes no accept set. - Writes: one draft PR through the relay and the report comment. No label, no PR assignee, no ready flag and no auto-merge were written, because this dispatch's write budget names none of them. --- _Generated by [Claude Code](https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
…ui#11636, objectstack-ai#11637, objectstack-ai#11635, objectstack-ai#11624 and objectstack-ai#11640) (objectstack-ai#21827) Fixes objectstack-ai#21807 Clause-②: no This moves the bundled Console's objectui pin from `9dfaca654311` (objectstack-ai#21772, PR objectstack-ai#21800) to `0abd4f9f8769fc4c19ad2f96707684876f74c09f`, which was objectui `main` at write time and is past `39a3e91fad`. The Console now carries objectui#11636, the fix for objectui#11092: the screen-flow runner names the flow by its served label, translated. That merge is what objectstack-ai#20318 waits on. The range also carries objectui#11637 (objectui#11170), objectui#11635 (objectui#11095), objectui#11624 (objectui#11396) and objectui#11640 (objectui#11628). ⛔ This is not a release act. Version PR objectstack-ai#21352 is untouched, and no tag, publish or Release was made. ## Range - objectui `git ls-remote origin refs/heads/main` read `0abd4f9f8769fc4c19ad2f96707684876f74c09f` at 2026-10-05T04:53:29Z, just before the bump. - Re-read at 05:37:53Z, it reads `59917c4b2` (objectui#11639, a served view's toolbar change written inside `config`), one commit past the pin. This PR does not carry it. - The objectui clone is full (`--is-shallow-repository`: false). `git merge-base --is-ancestor` exits 0 against `0abd4f9f8` for `39a3e91fa`, `c4c506b9e`, `22ddcd5c5` and `1c2e2c46c`. - `9dfaca654311..0abd4f9f8769` has 5 commits and 0 merges. - objectui declared 5 changesets over the range: 3 release and 2 release nothing. Every commit carries a changeset. None declares `major`, and none carries the breaking annotation. The highest declared level is `minor`, so the console changeset is `minor`. These counts come from the bump's own digest and were re-read from the changeset blobs. - **No commit subject in the range carries `!`.** `git log --format='%h %s' 9dfaca654..0abd4f9f8 | grep -E '^[0-9a-f]+ [a-z]+(\([^)]*\))?!:'` matches nothing (exit 1). | objectui commit | landing | changeset | note | |---|---|---|---| | `1c2e2c46c` | objectui#11624 (objectui#11396): `MasterDetailDetailConfig` is derived from the spec's `details` entry by reference, member for member the same | release-nothing | moves the manifest (below) | | `22ddcd5c5` | objectui#11635 (objectui#11095): a dataset-bound KPI tile's re-read on the data-invalidation bus gets a pin; tests and a doc comment only | release-nothing | | | `39a3e91fa` | objectui#11636 (objectui#11092): the flow runner names the flow by `flows.FLOW.label`, then the served `flowLabel`, then the API name | minor (`Clause-②: yes (widening)`) | smoke below; unlocks objectstack-ai#20318 | | `c4c506b9e` | objectui#11637 (objectui#11170): one declaration of per-type NODE SLOTS; `objectui check`, core `validateSchema`, the SDUI parser's `validateTree` and the `kind:'html'` compile walk them | minor (`Clause-②: yes (narrowing)`) | answered below | | `0abd4f9f8` | objectui#11640 (objectui#11628): the External Datasource panel unwraps the `{ success, data }` envelope | patch | smoke below | ## Declared-breaking entries and the ADR-0087 disposition **There are none to dispose of.** No commit subject carries `!`, no changeset declares `major` or the breaking annotation, and the bump wrote no `adr-0087: TODO` placeholder. `check-adr-0087-registration --base origin/main` reports "this PR adds no declared-breaking changeset". `check-changeset-no-major --base origin/main` reports "This diff introduces no `major` bump". One entry narrows by its own declaration, so here is how this repo answers it. **objectui#11170 (`c4c506b9e`, `Clause-②: yes (narrowing)`)** widens the reach of four objectui validators: each now judges nodes held in a renderer's declared slots, not only in `children`. It adds, removes or renames no ObjectStack-authorable key, and no Zod schema or stored `sys_metadata` shape moves. Its sdui-parser half only takes effect when a manifest is built with `slotsFor`. This repo's `scripts/gen-sdui-manifest-node.mjs` calls `manifestFromConfigs(configs)` without that option, and the regenerated `sdui.manifest.json` carries 0 `slots` keys. So the save gate's walk does not move with this bump. The lockstep reading is in Acceptance notes. ## What changed here (22 files, +255 / -93) - **`.objectui-sha` and `.changeset/console-0abd4f9f8769.md`.** `scripts/bump-objectui.sh 0abd4f9f8769fc4c19ad2f96707684876f74c09f --no-commit` wrote both, with `OBJECTUI_ROOT` set to a read-only objectui clone in the scratchpad. The range walked completely and the level was auto-set to `minor`. - The digest rendered objectui#11170's bullet as its first line, the bare `**Clause-②: yes (narrowing)**`. That bullet is rewritten to say what landed. - A closing paragraph states the range has no declared-breaking entry and names the release-nothing pair. - **`sdui.manifest.json` and `scripts/sdui-manifest.record.json`.** `node scripts/gen-sdui-manifest-node.mjs` regenerated them over the tree that `pnpm objectui:build` built at the pin. It still has 107 components, and the sha256 moves from `6f921896ffac…` to `f95d406a584e…`. - One input moved: `object-master-detail-form`'s `details` gains `of: "object"` and a description of the spec's closed entry (objectui#11396). `"of": "object"` occurrences go from 12 to 13. - The record moves its pin and `modulesRoot`. objectui's workspace version stays 17.7.0, confirmed against the pin by `check-sdui-manifest --require-objectui`. - **`packages/sdui-parser/objectui-lockstep.json`.** `gen:sdui-lockstep` re-recorded it from the clone at the pin. It records 214 grammar lines (blob `0131f27cf86d`), 25 diagnostic codes and containment predicate `76c18fb95d1f`, all unchanged, so no port is owed by that gate. - **The 54 asserting pin citations in `packages/spec/src`, re-measured, not restamped.** - **Method.** The range changes 50 paths. Each asserting record's cited objectui paths were resolved against the tree at `9dfaca654`. Ambiguous bare names were disambiguated by the record's own directory. Each `index.tsx` and `types.ts` cited is a `plugin-kanban`, `plugin-dashboard`, `plugin-map`, `plugin-gantt`, `plugin-grid`, `plugin-tree` or `plugin-timeline` file. None is `plugin-form/src/index.tsx` or `sdui-parser/src/types.ts`, the two same-named files the range touches. - **Result.** No asserting record cites a changed path. So every cited file is byte-identical across the hop, and every anchor held unmoved. - **Records.** Each of the 41 hand-written records gains a dated 2026-10-05 hop sentence and keeps its earlier history. - **Counts.** Three records carry a count, and each was re-taken by its own method; all three read the same at `2e818d0b5`, `9dfaca654` and `0abd4f9f8`: - the `keyboardNavigation` hit lines: 15, against 3 for the `schema.editable` control; - `ObjectKanban.tsx`'s `quickAdd` / `onQuickAdd`: 2 each, against 11 for `onCardClick`; - the `ElementDataSourceGate` occurrences in the five `src/index.tsx` shells: 0, 3, 3, 3 and 4. - **Corpus counts.** The six migration entries' counts were re-taken with `git grep -o -F`. That method first reproduced every `9dfaca654` number: 7632 files, `objectstack` 17313, `@objectstack/spec` 7186, `timeout` 1360, `useState` 2477, `TTL` 182, `tenant` 1318, `RuntimeConfig` 293, `resourceLimits` 2, `window` 4193, `period` 238, `interval` 195, `metrics` 401 and `Span` 508. - The new readings are 7650 files, `objectstack` 17390, `@objectstack/spec` 7209 and `useState` 2478. `window` reads 4194. Every other control is unchanged. - All 98 checked tokens (the export lists of `plugin-lifecycle-advanced.zod.ts`, `tracing.zod.ts` and `metrics.zod.ts`, plus every named key) read the same at both pins: every zero is still zero, and `Span` / `SpanSchema` read 508 / 57. - `packages/spec/src/migrations/registry.ts` was regenerated with `gen:migration-registry`. - **`.changeset/objectui-pin-citations-0abd4f9f8769.md`** is a `@objectstack/spec` patch, because the `FormField.span` describe and six migration descriptions name the pin. `content/docs/references/ui/view.mdx` was regenerated by `check:generated --fix`. No example, test or gate needed adapting, and no code changed outside generated records, citations and changesets. ## Console build (the local Console Pin Gate equivalent) `turbo run build --filter=@objectstack/client... --filter=@objectstack/spec...` and then `pnpm objectui:build` ran as one command under the verify lock. That is a clean build: mode 3 shallow-cloned objectui at the pin into `.cache/objectui-0abd4f9f8769`. Exit 0, 10m51s on the shared box. The build log reports: - "Bundle canary 'import/jobs' present". - "Single-zod canary: exactly one zod version literal {major:4,minor:6,patch:5}". - **"Console bundle carries THIS tree's @objectstack/spec, and only it"**: the spec-injection check passes. - "@objectstack/console dist ready (64232 KB) from objectui@0abd4f9f8769". `check:console-sha` and `check:console-injection` (self-test 67 assertions, then the dist check) exit 0 against that dist. ## Browser smoke: `examples/app-showcase` with the Console built at `0abd4f9f8769` The server ran `pnpm dev -- --fresh --ui --no-watch -p 41907` with `OS_PORT=41907`, on its own ephemeral DB with the seeded admin. Headless Chromium (`/opt/pw-browsers/chromium`) drove it, signing in through the console's login form. Page errors, console errors and every 4xx/5xx response were captured. Only the PIDs this run started were stopped. **Flow label (objectui#11636 / objectui#11092).** The launch was Tasks list, select a row, then the toolbar's "Reassign…" (`showcase_bulk_reassign`, which targets the screen flow `showcase_reassign_wizard`, label "Reassign Task"). | leg | trigger answer | runner header line | dialog title (accessible name) | API name shown | completion toast | |---|---|---|---|---|---| | `en` | 200, `status: paused`, `flowLabel: "Reassign Task"` | `Reassign Task` | `New Assignee` (the screen's own title) | no | `Flow "Reassign Task" completed` | | `zh-CN`, with a bundle entry `flows.showcase_reassign_wizard.label` | 200, `flowLabel: "Reassign Task"` | `重新分配任务` | `New Assignee` | no | `流程「重新分配任务」已完成` | - The resume answered 200 with `flowLabel` on both legs. - **The showcase bundle declares no `flows` translations** (`git grep` finds none), so the `zh-CN` leg needed one to exist. It was made by a temporary local edit, as objectstack-ai#21800's smoke did for `imageField`: - `node scripts/ablation-replace.mjs --hold` added `flows: { showcase_reassign_wizard: { label: '重新分配任务' } }` to the `zh-CN` block of `examples/app-showcase/src/system/translations/index.ts`. - The server booted with `--compile`. - The file was restored at once with `--restore`. The tool reports the blob back to HEAD's `f0517049b565` and `git diff HEAD` empty, and `git status --porcelain` is empty. - `GET /api/v1/i18n/translations/zh-CN` served the entry, and the session's `html[lang]` read `zh-CN`. - The showcase `dist/` was rebuilt afterwards (`turbo run build --filter=@objectstack/example-showcase --force`), and the held string has 0 hits in `dist/objectstack.json`. Nothing of the edit is in this diff. - **Verdict:** at this pin the runner header and the completion toast name the flow by the active language's `flows.FLOW.label`, then the served label, and never by the API name. The launcher button still reads the ACTION's label ("Reassign…"), which is the action's own string and not the flow's. **The range's other landings.** | landing | surface | observed | |---|---|---| | objectui#11640 (objectui#11628) | Setup → `metadata/datasource/showcase_external` | The External Datasource panel lists the remote tables `customers` (7 columns) and `orders` (7), each with Import. "Refresh catalog" (`POST …/external/refresh-catalog` 200) shows `snapshot 10/5/2026, 5:25:23 AM`. "Run validation" (`POST …/external/validate` 200) renders "All 2 objects match the remote schema." with `showcase_ext_customer` and `showcase_ext_order`, and no render error. | | objectui#11624 (objectui#11396) | `page/showcase_project_workspace` (`object-master-detail-form`, `details: [{ title: 'Tasks', childObject: 'showcase_task', addLabel: 'Add task' }]`) | The master form draws its 6 fields. The Tasks section draws, and "Add task" opens the child's inline form with 14 more fields (Title*, Assignee, Priority, …). 0 page errors. | | objectui#11637 (objectui#11170) | the three `kind:'html'` pages: `showcase_start_here`, `showcase_capability_map`, `showcase_command_center_jsx` | All three render (1563 / 2426 / 882 characters of text), with no compile or validation text and 0 page errors. | | objectui#11635 (objectui#11095) | `dashboard/showcase_ops_dashboard`, `showcase_revenue_pulse`, `showcase_chart_gallery` | The ops tiles read Active Projects 2, At-Risk (Red) 1, Awaiting Review 2 and Total Budget 1,090,000, matching objectstack-ai#21710's REST cross-check. All three dashboards have 0 page errors. This landing changes no executable code (its changeset: tests and one doc comment). An out-of-band REST `PATCH` of a task to `in_review` did not re-read the open tile: it stayed 2 with 0 dataset queries in 6s, and read 3 after a reload. That mutation never travels the console's own invalidation bus, so this is no reading of objectui#11095's pin. **NOT MEASURED** there. | **Console messages across the run:** 0 page errors. The failed loads are the pre-login `401 GET /api/v1/auth/get-session`, one `404` per page load that the response listener did not attribute (`/favicon.ico` answers 404 on this server, as objectstack-ai#21800 recorded), and `404 GET /api/v1/meta/datasource/showcase_external?state=draft`, the panel's draft probe for a datasource that has no draft. ## Gates and tests (head `e40526e564`) - `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` derived 127 commands from the 22-path diff, and all 127 were run at `e40526e564` and exited 0. `--ran` reports "127 derived, 127 run, 0 NOT-MEASURED, 0 UNRUN", with every exit code recorded. The full workspace build (`turbo run build --filter=!@objectstack/docs`) ran first, so no dist-reading gate met a missing prerequisite. - Also exit 0: - `check:objectui-pin-citations --verify-anchors` with `OBJECTUI_ROOT` at the pin: "54 asserting objectui pin citation(s) match .objectui-sha (0abd4f9f8)", and "7 anchor content assertion(s) verified against objectui at 0abd4f9f8". - `check:objectui-bump` (20 assertions across 5 cases), `check:sdui-lockstep`, `check-sdui-manifest --require-objectui`, `check:console-sha`, `check:console-injection`. - `check-adr-0087-registration --base origin/main` and `check-changeset-no-major --base origin/main`. - `@objectstack/spec check:generated`: all 15 artifacts current after the `--fix`. - `pnpm --filter @objectstack/spec exec vitest run`: 668 files, 19261 passed, 1 todo. `pnpm --filter @objectstack/spec typecheck`: exit 0. - `@objectstack/sdui-parser` test (14 files, 225 passed) and typecheck: exit 0. - These suites read the regenerated manifest: - `@objectstack/lint` (119 files, 5627 passed); - `@objectstack/metadata-protocol` `src/protocol.runtime-authoring-gate.test.ts` (70 passed); - `@objectstack/cli` unit tier `src/utils/sdui-manifest.test.ts` and `test/validate-build-gate-parity.test.ts` (2 files, 79 passed). - The CLI integration tier is declared to CI. - `eslint --no-inline-config --format json` on the 15 changed TS files: 15 files, 0 errors and 0 warnings. - The lint population is `**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}` (`eslint.config.mjs:971`). - The config enables no type-aware linting (`:328`), so this diff cannot move a verdict on an untouched file. - Repo-wide `pnpm lint` is left to CI. ## Acceptance notes - **Lockstep, a reading and not a gate result.** objectui#11170 gives objectui's `validateTree` a slot walk: `slotElements` plus the `comp?.slots` loop in `packages/sdui-parser/src/validate.ts`. This repo's port has none (`git grep -n slots packages/sdui-parser/src`: 0). - The walk only fires for a manifest built with `slotsFor`, and this repo's committed manifest carries no `slots`. So the save gate and objectui's runtime parser still agree on that manifest. - objectui's `kind:'html'` compile (`getJsxManifest`) is now built with `slotsFor`. A slot-held node that fails validation could fail the renderer's compile while this repo's save gate accepts it. - `check:sdui-lockstep` compares the grammar region, the codes and the containment predicate, so it cannot see a walk-depth change. That class is outside its reach by its own header ("CANNOT see … WHEN a code fires" beyond the predicate). - Not measured through a public door here, so it is noted rather than filed. Carrier: none. - `main` moved three commits past this branch's base (objectstack-ai#21810, objectstack-ai#21808, objectstack-ai#21809). `git merge-tree --write-tree HEAD origin/main` is clean. Two of them touch files this diff touches: `api-methods-batch-conformance.test.ts` (test titles) and `component.test.ts` (objectstack-ai#21808 re-points a non-asserting anchor). The merged tree still carries 1 and 6 citations at the new pin and 0 at the old one. No merge was made; the merge queue rebuilds on the current `main`. - objectui `main` reached `59917c4b2` (objectui#11639) after the pin was read. It is not in this range. - Writes: one draft PR through the relay and the report comment on objectstack-ai#21807. No label, PR assignee, ready flag or auto-merge was written; this dispatch's write budget names none of them. --- _Generated by [Claude Code](https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
…objectstack-ai#21994) Fixes objectstack-ai#21989 Clause-②: no ## What this is This PR adds the curated release page for 17.7.0, `content/docs/releases/v17/17-7.mdx` (1,402 lines). It was written after the publish: npm `latest` moved on 2026-10-06, and `@objectstack/spec@17.7.0` went out at 12:22:14Z. It also wires the page in: - `content/docs/releases/v17/meta.json`: `17-7` comes ahead of `17-6`. - `content/docs/releases/v17/index.mdx`: the status blockquote, the minors warning, the per-release list and the checklist links now name 17.7.0 as current. This is the same shape objectstack-ai#21362 used for 17.6.0. - `scripts/docs-audit/handwritten-docs.json`: the page joins the docs-accuracy audit scope. - `content/docs/releases/v17/17-6.mdx`: one dated correction (2026-10-06) on the anonymous-endpoints known issue. objectstack-ai#21158 was closed as not planned on 2026-10-04. The page follows the 17.6 page's structure: 1. Highlights. 2. What's new: the counts, and the runtime changes that happen silently. 3. Breaking changes and migration, triaged by door and subject. It includes a coverage table that names the section carrying the migration for every ADR-0087 entry added since 17.6.0 (8 conversions, 41 D3 entries). 4. New capabilities. 5. Notable fixes. Security fixes are described only as classes and doors. 6. New in Console: each objectui declared-breaking change, with this repo's answer. 7. The code that shipped but is not listed. 8. The upgrade checklist. Every line is marked *Not exercised.* ## Sources and counts - The version commit `4e4e881427` (objectstack-ai#21352) consumed 323 changesets. 322 are new. One, `748b240` (objectstack-ai#21270), shipped in 17.6.0 and is listed again; the page explains this in its own section. - 69 CHANGELOGs carry a 17.7.0 section, and 48 of them have entries. Their 444 entries (194 minor, 250 patch) de-duplicate to the 323 changesets. - Two commits landed on `main` after the Version Packages PR's last refresh and before it merged: - `8a399b2b15` (objectstack-ai#21977, for objectstack-ai#21923) - `04e776b39a` (objectstack-ai#21976, for objectstack-ai#21968) Both are ancestors of the version commit (exit 0 for each), so the 17.7.0 packages carry their code. But the version commit did not consume their changesets, so no 17.7.0 CHANGELOG line names them. The release-integrity audit named both in a warning. - objectui: the pin moved five times and ends at `0abd4f9f8769`: - `89cad75d5570` (objectstack-ai#21380) - `ab1879721595` (objectstack-ai#21625) - `2e818d0b51ec` (objectstack-ai#21710) - `9dfaca654311` (objectstack-ai#21800) - `0abd4f9f8769` (objectstack-ai#21827) Across 173 commits, 254 changesets were added and 229 of them release something. 65 are declared breaking, plus one commit marked `!`. The Console table answers each. - `PROTOCOL_VERSION` is still 17.0.0. ## Premise corrections - The dispatch named two pin moves ending at `9dfaca654311`. The tree has five, ending at `0abd4f9f8769` (`8832655`, objectstack-ai#21827). The page covers all five. - One new D3 id contains a word that `check:role-word` refuses on docs pages, and release pages are not in its baseline. The coverage table therefore names that entry by its subject and points at `os migrate meta --from 17`. ## Fact-check A second pass checked every cited SHA, PR number, key name and behavioural claim against the commits, changesets and registry entries. It corrected **31 claims** (commit `e4a6280b46`). Two more corrections came earlier, while drafting: - objectstack-ai#21361 is closed; it is not tracking the issue. - There are seventeen `ui-object-*` members, not eighteen. Mechanical checks on the final page: - All 276 cited SHAs resolve, in objectstack or in an objectui clone carrying the final pin's history. - Each of the 216 distinct sha–PR pairs matches its commit subject. - Every printable new D3 id (40) and all 8 conversions appear on the page. - The MDX for 17-7, 17-6 and index compiles with @mdx-js/mdx 3.1.1 and remark-gfm 4.0.1. After the fact-check, `main` gained `1abfc58` (objectstack-ai#21985), which lands the read half of objectstack-ai#21922. It is not an ancestor of the version commit: the test returned exit 1, and the control commit `753e7a1` returned exit 0. So in 17.7.0, the metadata door's reads still serve a stored row under a code-defined datasource name. Commit `8347e0d172` says so in the datasource migration bullet. ## Independent fact-check and fix round An independent, read-only fact-check of head `8347e0d172` returned **FAIL** with 13 findings (record: objectstack-ai#21989 comment 6018402030): 2 wrong facts (a flow's `get_record` node still reads the stored-metadata tables, in projected form), 1 security line that named the filter shapes and depth threshold evading 17.6.0's refusal, 1 breaking change missing from the Breaking section (`0fc8087`, objectstack-ai#21626), 1 link whose label did not match its target, 4 overstatements, 1 missing security fix (`49524f6`, objectstack-ai#21420), 1 missing rollback caveat on `os secret rewrap --apply`, and 2 minor wording issues. All 13 were re-verified against their sources and applied in `a53c972fa7`; none was refuted. A scan for any other line naming a bypass shape of a fixed issue reduced two more lines to their class (`0728cbf`, `fb69825`). ## Measured on `a53c972fa7` - Derived gates: `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` derives 57 commands; all 57 exited 0 (`--ran`: "57 run, 0 NOT-MEASURED (a DERIVED zero)"). The verdicts include: - check-doc-anchors: 458 links resolve. - check-issue-citations: 305 resolve as a PR, 9 resolve, 15 are cross-repo; every citation this change adds resolves. - `check:role-word`, `check:release-notes` and `check:release-page-status`: OK. - check-release-section-coverage: OK, both plain and with `--strict` (10 minors). - The docs-audit scope check and `check:nul-bytes`: OK. - Docs production build: `TURBO_FORCE=true pnpm turbo run build --filter=@objectstack/docs`, run under the verify lock, reports `Tasks: 2 successful, 2 total` and `Cached: 0 cached`. The built `releases/v17/17-7.html` carries the corrected text and none of the removed text. - Mechanical checks: 231 distinct sha–PR pairs, 0 unresolved, 0 subject mismatches; the MDX of 17-7, 17-6 and index compiles. - Not measured locally: the repo-wide lint and the CI-only families. CI owns them. ## Not in this PR - No changeset. The PR touches only docs and a docs-audit list, nothing a package ships (`skip-changeset`). - Nobody has walked the 17.6.0 → 17.7.0 upgrade. The checklist says so on each line. --- _Generated by [Claude Code](https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
Fixes #21696
Clause-②: no
This moves the bundled Console's objectui pin from
ab1879721595(#21625) to objectuimainas of the write time,2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6, which is past973fc20f3. The Console now carries objectui#11574 (the phantom "(empty)" groups fix), objectui#11578, objectui#11581, objectui#11576, objectui#11583 and objectui#11466 (V1 declared node slot). It also carries objectui's own 17.7.0 package release.⛔ This is not a release act. Version PR #21352 is untouched, and no tag, publish or Release was made. Whether 17.7.0 ships with this pin is the maintainer's call.
Range
ab1879721595..2e818d0b51echas 22 non-merge commits.git merge-base --is-ancestorexits 0 against objectuiorigin/mainfor973fc20f3, and2e818d0b51ecwas objectuimainwhen it was read (git ls-remotejust before this PR).From the changesets objectui declared over the range:
b493919c7. Each was read from the commit that added it.The range was listed by measurement, not copied from the card. Exactly one commit subject in the range carries
!:git log --format='%h %s' ab187972..2e818d0b5 | grep -E '^[0-9a-f]+ [a-z]+(\([^)]*\))?!:'gives83e3f8377 feat(types,react,core,plugin-dashboard)!: … (objectui#11466).SchemaRenderer'sschematakeDeclaredNode; the dashboard producers name declared nodes; an envelope's object-metric retires83e3f83772f54dca53b65aa5e65,f1c937966,d0097af2ee8c0b9614973fc20f3BaseSchema's index signature2e818d0b5(the pin itself)09036173c,068564691d768c3178object-kanbandeclaresgroupingas the spec'sGroupingConfiga7557a7d4AnyComponentSchema/ flex child typingbdc9049ed,b10c68e58b493919c7.changeset/*.mdfilesADR-0087 disposition of the declared-breaking entries
Both entries are
not-required (no-migration-prescription). The disposition is in.changeset/console-2e818d0b51ec.md, which replaces the script'sadr-0087: TODOplaceholder.83e3f8377SchemaRenderer'sschemaprop takeDeclaredNode@object-ui/types/@object-ui/react). No ObjectStack schema declares or references it.83e3f8377object-metricnode in a dashboard widget's legacycomponentenvelope draws the retired-format promptui/dashboard.zod.tsrefuses a widget'scomponentkey by name as objectui-internal, and no example authors one. The showcase'sobject-metricpage tiles still draw their numbers (smoke below).check-adr-0087-registration --base origin/maingives "1 declared-breaking changeset(s), each carrying an ADR-0087 disposition".check-changeset-no-major --base origin/maingives "This diff introduces nomajorbump".What changed here
.objectui-shaand.changeset/console-2e818d0b51ec.mdwere written byscripts/bump-objectui.sh 2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6 --no-commitwithOBJECTUI_ROOTset to a read-only clone of objectui. The level was auto-set tominor. No../objectuisibling exists in this container.scripts/sdui-manifest.record.jsonwas re-recorded bynode scripts/gen-sdui-manifest-node.mjsover the tree thatpnpm objectui:buildbuilt at the pin.sdui.manifest.jsonis byte-identical: 107 components, sha2560ead67c1111d…at both pins, so no component input moved. The record moves its pin, itsmodulesRootand objectui's workspace version (17.6.0 to 17.7.0).packages/sdui-parser/objectui-lockstep.jsonwas re-recorded withpnpm gen:sdui-lockstepagainstOBJECTUI_ROOT=.cache/objectui-2e818d0b51ec. It records 214 grammar lines (blob0131f27cf86d), 25 codes and containment predicate76c18fb95d1f. All are unchanged, so no port is owed. objectui'spackages/sdui-parser/srcis byte-identical across the range; only its CHANGELOG and package.json moved.packages/spec/srcwere re-measured at the new pin, not restamped:git diff -U0 ab187972 2e818d0b5.plugin-dashboard/src/index.tsx(+13/-1, objectui#11466). Lines were added above theobject-metricregistration, so its start moves244to256and the icon input moves269to281. Both lines are byte-identical, still{ name: 'icon', type: 'string' }.packages/types/src/objectql.ts. objectui#11216'sgroupingmember landed below the citedlimitmember, so:4720did not move.content/docs/plugins/plugin-kanban.mdx. Agroupingrow landed below thelimitrow, and the page still teacheslimit: 250.packages/react/src/SchemaRenderer.tsx(+21/-20, objectui#11466). Only the type import, theSchemaRendererPropsdocblock and theschematype changed. Theproperties.*hoist, its strip list and thecreateElementspread did not, soobject-timeline's prop channel still carriesdata.ab1879721history.git grep -o -F. That method first reproduced everyab1879721number: 10267 files,objectstack16377,@objectstack/spec6665,timeout1348,useState2476,TTL180,tenant1238,Span491.Span/SpanSchema. The 14 newSpanhits areSpanishprose.packages/spec/src/migrations/registry.tswas regenerated withgen:migration-registry..changeset/objectui-pin-citations-2e818d0b51ec.mdis a@objectstack/specpatch, because theFormField.spandescribe and six migration descriptions name the pin.content/docs/references/ui/view.mdxwas regenerated bycheck:generated --fix.mainwas merged (7e0066af7a) withscripts/pm/os-regen-merge.shin merge commita0a35cb30f, with no conflict hunk. Afterwards:check:generatedreports all 15 artifacts current.ui-object-form-fields-names-typed,ui-object-gantt-markers-typed,ui-object-timeline-mapping-typed) are present in the regenerated registry.No example, test or gate needed adapting, and no code changed outside generated records, citations and changesets.
Browser smoke:
examples/app-showcasewith the Console built at2e818d0b51ecThe Console was built by
pnpm objectui:build. The build log reports: "Console dist matches the objectui pin (objectui@2e818d0b51ec)", "Single-zod canary: exactly one zod version literal {major:4,minor:6,patch:5}" and "Console bundle carries THIS tree's @objectstack/spec, and only it".The server ran
pnpm dev -- --fresh --ui --no-watch -p 41853(withOS_PORT=41853) on its own ephemeral DB with the seeded admin. Headless Chromium (/opt/pw-browsers/chromium) drove it, with console messages, page errors and every non-2xx response captured. Only the PIDs this run started were stopped.Dashboards. objectui#11466 touches the dashboard producers. There are no page errors and no "retired" prompt on any of the four dashboards.
showcase_ops_dashboard/api/v1/usage/storage, 404/favicon.icoshowcase_revenue_pulse/api/v1/usage/storageshowcase_chart_gallery/api/v1/usage/storagesystem_overview(setup)/api/v1/usage/storageThe Delivery Operations tiles match the REST data on the same server:
showcase_project?status=activereturns 2 rows,?health=redreturns 1, and the budget sum is 1,090,000.showcase_task?status=in_reviewreturns 2 rows.showcase_taskhas 10 rows, matching the Chart Gallery's Total Tasks.showcase_accounthas 14 rows, matching Revenue Pulse's all-time count.The
object-metricpage tiles that this repo authors also draw:Neither page has a page error.
Grouping-field switch (objectui#11574). The drive was Tasks list, then Group, then Add group field (it selects Title). The select then switched to Priority, Status and Priority. The painted groups are counted from the DOM, and the server answers are each
POST /api/v1/data/showcase_task/querywithgroupBy, all 200:The same sequence painted 13, 8 and 8 groups (9, 3 and 4 phantom) at
ab1879721595, as #21625's acceptance notes recorded. No phantom "(empty)" groups appear at this pin.Console errors across the run. The only ones are the browser's "Failed to load resource: 404" lines for
/api/v1/usage/storageand/favicon.ico, and the run has 0 page errors. Theusage/storage404 was already recorded in #21625's smoke.#21671 lockstep reading
packages/sdui-parser/src/validate.tsat2e818d0b5is byte-identical toab1879721595.checkType(:450-466) still gradestype-mismatchwithseverity: arms.includes('enum') ? 'error' : 'warning'.checkMemberTypes(:407-419) gradesmember-type-mismatchthe same way.errorsince PR fix(sdui-parser): an html page literal of the wrong type is a compile error, not a warning #21678 (packages/sdui-parser/src/validate.ts:446,:506). The gap still stands at this pin.packages/sdui-parser/src/validate.ts:336-340) names objectui's copy "at the.objectui-shapin" without a sha, so it is still true and needs no update. The bump route regenerates nothing there, andvalidate.tsis not edited.check:sdui-lockstepdoes not compare severity, so this is a reading, not a gate result.Gates and tests (head
a0a35cb30f)node scripts/pm/dispatch-gates.mjs --commandsderived 127 commands from the 21-path diff. That is the same set before and after the merge.378d424915(pre-merge) and again ata0a35cb30f, all 127 exited 0.--ranreports "127 derived, 127 run, 0 NOT-MEASURED, 0 UNRUN", with every exit code recorded.check:objectui-pin-citations --verify-anchorswith objectui at the pin: 54 asserting citations match2e818d0b5, and 7 content assertions are verified.check:objectui-bump(20 assertions across 5 cases),check:sdui-lockstep,check-sdui-manifest,check:console-sha,check:console-injection,check:migration-registry.@objectstack/spec check:generated: all 15 artifacts current after the merge.pnpm --filter @objectstack/spec test: 612 files, 18185 passed, 1 todo.pnpm --filter @objectstack/spec typecheck: exit 0.pnpm --filter @objectstack/sdui-parser test: 225 passed.eslint --no-inline-configon the 15 changed TS files: 0 errors and 0 warnings. The lint population is**/*.{ts,…}(eslint.config.mjs:971). The config enables no type-aware linting (:328), so this diff cannot move a judgment on an untouched file. Repo-widepnpm lintis left to CI.Acceptance notes
ui/component.zod.ts'sobject-gridcolumnsrecord (theplugin-grid/src/useColumnSummary.ts:558-568) says, aboutab1879721595, that the footer summary readscurrency/defaultCurrency/precision/scaleoff an authored column. objectui#11588 (d768c3178, inside this pin) retires that read. The record is in the historical spelling and stays true of the pin it names, so it is left as is.ObjectView.tsx:882, inui/view.zod.ts's [ViewItemSchema同时是授权形状和 Studio 往返的 wire 成员 —— 拆成两个 schema 还是保持宽松?(挡住 #4001 批 18 最后 2 站点) #5074] block and two view tests.plugin-dashboard/src/index.tsx:204, in theObjectMetricPropsSchema icon livenesstest.ab1879721595, and they shift to:936and:214here.Generated by Claude Code