Skip to content

Commit 41646a5

Browse files
chore(console): move the objectui pin 12dc7b4 → 616df65, past the filterableFields reader's removal (objectui#13169) (#24829)
Fixes #24749 Clause-②: no This PR moves the console pin from `12dc7b47c340` to `616df6598b42`: objectui `main` at `616df6598b429d2b3687301a2041198928e68971`. That commit carries `cbac9d7dde` (objectstack-ai/objectui#13169, the removal of objectui's last `filterableFields` reader, objectui#13118). It is the newest objectui `main` commit at or after `cbac9d7dde` that was green at the move. With it, the Console Pin Gate builds the console at `main` again, after #24721 retired `ListViewSchema.filterableFields` (AGENTS.md, Post-Task Checklist step 4). This PR is not a release act. The Version Packages PR is not touched, and no release workflow is dispatched. No objectui source changed, and no `.github/workflows/**` or `scripts/build-console.sh` change is in it. The F1 re-test at the new pin is not in this PR; that is the epic seat's call (#15194). **Tier:** not governed. `node scripts/pm/check-governed-merges.mjs --branch claude/issue-24749-console-pin-cbac9d7` at `5b8a7dbee5`: "0 of 5 path(s) hit the register (7 surfaces govern objectstack) ... NOT governed", exit 0. Size: 5 files, +91 / -8. ## The red, reproduced on the base and gone at the new pin - **Base.** This branch was cut from `origin/main` `9d13b5fc83`, with `.objectui-sha` = `12dc7b47c340`. The console build there, run the way the job runs it (below), fails: lock VERDICT `command-exit 1`; the client closure build exits 0, then `bash scripts/build-console.sh` exits 1 after 222 s. objectui's dependency build stops at `Failed: @object-ui/plugin-list#build` (24 of 30 tasks done). Its declaration build reports exactly two type errors, the two the diagnosis names: - `src/ListView.tsx(4656,58): error TS2339: Property 'length' does not exist on type '{ '[REMOVED] Key retired: run `os validate` for its migration.': never; }'.` - `src/ListView.tsx(4657,27): error TS2769: No overload matches this call.` `grep -c 'error TS'` over the log: 2. That is the same package and step as CI's annotation on run 39384364728 (Console Pin Gate): "command (.cache/objectui-12dc7b47c340/packages/plugin-list) pnpm run build exited (1)". - **New pin.** At this PR's head, the same build exits 0. objectui's dependency build runs 34 of 34 tasks, 0 cached. `@object-ui/plugin-list` builds its declarations ("Declaration files built in 11295ms") and finishes ("built in 11.70s"). The console's own `tsc && vite build` passes ("8961 modules transformed"). `grep -c 'error TS'` over the log: 0. ## Choosing the pin - **Green, read at the move.** REST `repos/objectstack-ai/objectui/commits/SHA/check-runs`, every page, read by this session at 2026-10-20T07:41:25Z. The bump ran at about 07:48Z, with objectui `origin/main` at `186b78d8f347` (fetched just before the bump). | objectui `main` commit | check-runs at the move | verdict | |:--|:--|:--| | `186b78d8f347` (tip) | 95: 58 success, 3 skipped, **34 in progress** | still running, so passed over. Re-read at 08:01Z: 99 runs: 88 success, 3 skipped, **2 failure** (`Test (coverage)`, `Test (coverage shard 6/8)`), 6 in progress, so it is now red as well | | **`616df6598b42`** | **29 completed: 27 success, 2 skipped, 0 failure** | **green: the target** (re-read at 08:01Z: unchanged) | `616df6598b42` was never a push tip. The queue landed it with `186b78d8` 18 s later, so all its runs are `merge_group` runs on `gh-readonly-queue/main/pr-13177-157694c7b…`: `CI` (Build & E2E, Type Check, Test 16 shards, dist pins, Build Docs), `Lint`, `Repo Gates`, `Governed Surface Guard`, `Changeset Presence`. All 5 workflow runs concluded `success`. Five app check suites (vercel, fly-io, claude, cloudflare-workers-and-pages, objectstack-fleet) are queued with 0 check runs. For the record, the older commits in the window at the same read: `157694c7b186` 1 cancelled (`Repo Gates`) and 6 in progress; `4c36eab58b1a` 1 in progress; `91b658a75d64` 2 failure (`Test (coverage)`, `Test (coverage shard 6/8)`); `5dbc6a579287` 3 cancelled (`Lint`, `Repo Gates`, `Bundle Analysis`); `cbac9d7ddedb` 99 runs: 96 success, 3 skipped. objectui `main` moved on to `961b69f97` (`f48a4d554`, `961b69f97`) after the move. This PR does not re-choose. - **The bump.** `OBJECTUI_ROOT=SCRATCH_CLONE bash scripts/bump-objectui.sh --no-commit 616df65`, exit 0. It printed "12dc7b47c340..616df65 walks completely" and "objectui pin: 12dc7b4 → 616df65 (on origin/main)". SCRATCH_CLONE is a full (non-shallow) clone of objectui from GitHub in the session scratchpad. ⛔ No shared `../objectui` checkout was written. Every objectui read for the bump, the manifest and the lockstep record came from that scratch clone or from the build trees made from it. The shared checkout is shallow, so it could not walk the range. - **Ancestry,** in that clone (`--is-shallow-repository` false), each against `616df6598b42`: - `cbac9d7dde` is an ancestor: exit 0; - `0b36ffa8cc5c` (objectui#13132, the eleven stale live specs): exit 0; - `fe11eb12e578` (objectui#13042, the `referenceVia` type half in `$select`): exit 0; - the old pin `12dc7b47c340`: exit 0; - control, the reverse (`616df6598b42` an ancestor of `12dc7b47c340`): exit 1. Range: 32 non-merge commits. - **objectui's own objectstack pin** did not move in this range: `.objectstack-sha` = `f4755a68a797` at both ends. - **What the range brings in.** These are the 32 objectui PRs #13079 through #13177. Among them are the ones triage named: - objectstack-ai/objectui#13169 (`cbac9d7dd`, objectui#13118); - objectstack-ai/objectui#13170 (`d05f33b2e`, the CSV-declared saved mapping, objectui#13156); - objectstack-ai/objectui#13167 (`427e59c9e`, the unnamed RLS policy, objectui#13113); - objectstack-ai/objectui#13158 (`a57d80afe`, an ungrouped list asks for `nameField`, objectui#13116); - objectstack-ai/objectui#13168 (`96036bdd9`, the backfill checkbox wait, objectui#13120). ## The console build path, end to end Each step is run as `ci.yml`'s `console-pin` job runs it, read off the job and not edited. The heavy steps ran under `scripts/pm/os-verify-lock.sh`, and each exit code was captured before any pipe. This is a shared box, so wall-clock figures are shared-box readings. Deviations from the CI job: - `--concurrency=2` for the client closure and for objectui's dependency build (`OBJECTUI_DEPS_BUILD_CMD`), for the container's memory budget; - `NODE_OPTIONS=--max-old-space-size=4096`; - `OBJECTUI_ROOT` names the full scratch clone, where CI shallow-clones; - the cache restore/save steps do not exist locally, so `CACHE_HIT` is empty. **Final run, at this PR's head `5b8a7dbee5`.** That is the branch merged with `origin/main` `6b222464ce`, which brought spec changes into the packed packages. The build tree `.cache/objectui-616df6598b42` and `packages/console/dist` were deleted first. | step | command | exit | | --- | --- | --- | | install | `pnpm install --frozen-lockfile` | 0 | | closure + build | `pnpm exec turbo run build --filter=@objectstack/client... --concurrency=2` (36/36), then `bash scripts/build-console.sh` (485 s). Lock VERDICT `command-exit 0`, held 790 s | 0 | | assert | the job's "Assert a real Console dist is in place" checks, `CACHE_HIT` empty: "Console dist present (65580 KB, via scripts/build-console.sh) from objectui@616df6598b42" | 0 | | stamp | `pnpm check:console-sha`: "Console dist matches the objectui pin (objectui@616df6598b42)." | 0 | | injection | `pnpm check:console-injection --require-stamp`: self-test 100 assertions, then "@objectstack/spec: the dist carries this tree's copy, and not the published one." | 0 | | manifest | `node scripts/gen-sdui-manifest-node.mjs`: 107 components, sha256 `d1fde278ffd6…`. The committed pair is byte-identical (`git status --porcelain`: 0 lines) | 0 | | manifest check | `OBJECTUI_ROOT=.cache/objectui-616df6598b42 node scripts/check-sdui-manifest.mjs`: present, intact, recorded at the live pin `616df6598b42`, `@object-ui 17.7.0` | 0 | | lockstep | `pnpm check:sdui-lockstep`: byte-identical to objectui@616df6598b42 over 214 grammar lines, 25 diagnostic codes, the `not-a-container` predicate | 0 | **`build-console.sh`'s `.objectstack-sha` branch ran, in this order** (build log): 1. "objectui@616df65 installs @objectstack/client @objectstack/core @objectstack/formula @objectstack/lint @objectstack/sdui-parser @objectstack/spec @objectstack/types by commit — building them here..." (turbo 36/36, cached); 2. "Building objectui's own @objectstack/* at its .objectstack-sha f4755a6, the reference the spec assertion judges this bundle against..." (from the machine's pin store); 3. "OBJECTSTACK_ROOT is set: packing @objectstack/* from /home/user/objectstack-issue-24749, standing in for the pin f4755a6.", "pack 7 package(s): 15.4s", then "node_modules/.cache/objectstack now holds ... from /home/user/objectstack-issue-24749 (5b8a7db)"; 4. the frozen install: "Lockfile is up to date, resolution step is skipped", "Done in 6.8s"; 5. objectui's dependency build, 34/34 tasks, 0 cached, then the console's `tsc && vite build`: "8961 modules transformed."; 6. the closing checks: - "Bundle canary 'import/jobs' present"; - "Single-zod canary: exactly one zod version literal {major:4,minor:6,patch:7}" (2262 `assets/*.js` read); - "Console bundle carries THIS tree's @objectstack/spec, and only it (vendored: @objectstack/spec of objectui's own build of objectstack f4755a6)"; - "Shipped the tracked sdui.manifest.json (recorded at objectui@616df6598b42, this pin)."; - "@objectstack/console dist ready (65580 KB) from objectui@616df6598b42". **All seven `@objectstack/*` packages objectui installs are this tree's,** read off the build tree after the install at `5b8a7dbee5`: - `node_modules/.cache/objectstack/.stamp.json`: `source: external`, `root` this worktree, `sha` = `5b8a7dbee5c8…`, `dirty: false`, all seven at `18.0.0-next.5`. - `node_modules/.pnpm`: 7 `@objectstack` entries, all of the `@objectstack+NAME@file+.objectstack-pin+NAME…` form. - Each installed package's `dist/` against `packages/NAME/dist/`: `diff -rq` exit 0 for all seven (spec, core, types, client, formula, sdui-parser, lint). Control: the installed spec's `dist` against `packages/core/dist` exits 1. - The build tree's `pnpm-lock.yaml` is byte-identical to the one committed at `616df6598b42` (`cmp` exit 0). It has 0 registry-resolved `@objectstack/*` keys and 14 `file:` keys. Control for the pattern: objectui's lockfile at `0707b4ae3712` counts 14 registry-resolved keys. **The in-build injection assertion is NOT vacuous at this pin.** At `616df6598b42` it found a witness on each side: - "16 of 22 injected-only descriptions are in the bundle"; - "all 10 pin-only descriptions are absent". So no independent measurement is owed. A cross-check anyway, `grep -rlF` over the bundle's `assets/*.js`, with counts of files in this tree's `packages/spec/dist` and in the `f4755a68a797` reference spec's `dist` in brackets: - "NOT EXECUTED by this runtime, and publish REJECTS the key" [18 / 0]: 1 bundle file; - the stale "NOT EXECUTED in 17.x, and publish REJECTS the key" [0 / 18]: 0 bundle files. **Earlier runs:** - At `1ad970cafe` (the bump commit, before the manifest regeneration and the merge): `build-console.sh` exit 0 after 465 s, lock VERDICT 0, the same branch order, "dist ready (65580 KB)", "16 of 17 injected-only descriptions are in the bundle". It warned "Shipped the tracked sdui.manifest.json, but its record names objectui@12dc7b47c340", as expected before the regeneration. That run's build tree produced the committed manifest pair and lockstep record. - After the merge, `origin/main` moved to `c56115bf96` (#24797, #24554, #24805). None of those three touches the seven packed packages, `.objectui-sha`, the SDUI files or the console build scripts (`git diff --name-only` filter: 0 paths). So the console readings above hold for the inputs at current `main`. ## The second half: manifest and lockstep record - `node scripts/gen-sdui-manifest-node.mjs`, exit 0: 107 components, sha256 `d1fde278ffd6…`. It re-recorded `scripts/sdui-manifest.record.json` at the pin (`built-tree`, `.cache/objectui-616df6598b42/apps/console`, `@object-ui/core` 17.7.0). Re-run at `5b8a7dbee5`: exit 0, byte-identical. - `sdui.manifest.json` keeps 107 components, none added or removed. One component changes its inputs: `list-view` gains `requiredPermissions` (objectui `b0176214a`, objectstack-ai/objectui#13087) and `addRecord` (objectui `d11174ad1`, objectstack-ai/objectui#13098). No input is removed. The old manifest names `filterableFields` nowhere (0 hits), so the retirement moves nothing here. - `packages/sdui-parser/objectui-lockstep.json`: - before: `node scripts/check-sdui-lockstep.mjs` exit 1 (`[pin-moved]`); - re-record: `OBJECTUI_ROOT=.cache/objectui-616df6598b42 pnpm gen:sdui-lockstep` exit 0; - after: `pnpm check:sdui-lockstep` exit 0. objectui's `packages/sdui-parser/src` is unchanged over the range (`git diff --stat`: empty). Both blobs are unchanged (`0131f27cf86d`, `76c18fb95d1f`), so no parser port is owed. ## The console changeset `.changeset/console-616df6598b42.md` was written by `scripts/bump-objectui.sh --no-commit`, under the generator's own name. Its list is the generator's, untouched. - `@objectstack/console` **minor**: the HIGHEST level objectui declared over the range. Counts: 30 releasing changesets across 32 non-merge commits, 2 annotated breaking, 1 release-nothing, and 1 commit without a changeset (`0b36ffa8c`, listed by subject in the changeset). - The range declares two breaking entries, so the generator wrote its unanswered ADR-0087 placeholder and said a human must answer it. It is answered `not-required (no-migration-prescription)` against this tree, with `Clause-②: no` beside it, as in PR #24660. That is the one hand-written part of the five files: - objectui `cbac9d7dd` (objectui#13118) removes the `filterableFields` reader, and `@object-ui/types` gains a `?: never` tombstone on `NamedListView`. The spec half is this tree's own and already landed: conversion `view-list-filterable-fields-removed` in `packages/spec/src/conversions/registry.ts` (#24721). - objectui `df7156808` (objectui#13075) types `NavigationItemSchema.visible` by reference to this tree's `EvaluatedExpressionInputSchema`, which this tree's spec already uses for a navigation entry's `visible` (`packages/spec/src/ui/app.zod.ts`). - No package in this tree imports or depends on an `@object-ui/*` package: `git grep` for imports finds 0, and for `package.json` dependencies 0. - `node scripts/check-adr-0087-registration.mjs --base origin/main`, exit 0: "1 declared-breaking changeset(s), each carrying an ADR-0087 disposition". ## Gates Every gate below ran at this PR's head `5b8a7dbee5`, after a workspace build there. That build was `turbo run build --filter=!@objectstack/docs --concurrency=2`: 76/76, lock VERDICT `command-exit 0`. `packages/runtime/.objectstack` was removed before the gates ran. Each exit code was captured before any pipe. - `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands`, with no paths, derived **73** commands. It took 5 paths against merge base `6b222464c`, three-dot. **All 73 exited 0.** - `--ran` reconciliation over `COMMAND :: exit N` lines: "Run reconciliation — 73 derived, 73 run, 0 NOT-MEASURED, 0 UNRUN", then "73 derived famil(ies) accounted for — 73 run, 0 NOT-MEASURED (a DERIVED zero — all 73 recorded an exit code and none of them is 3)". Exit 0. - Some of those 73 are worth reading out. Each exited 0: - `check-adr-0087-registration --base origin/main` (the exemption notice names this changeset); - `check-empty-changeset --base origin/main`; - `check-changeset-no-major --base origin/main`; - `check-sdui-manifest.mjs` and its `--self-test`; - `pnpm check:sdui-lockstep`, `pnpm check:console-sha` and `pnpm check:console-injection`; - `pnpm check:objectui-changeset`, `pnpm check:page-declaration-shape` and `pnpm check:nul-bytes`; - `pnpm check:pm-changeset-deadline-census`. - Added outside the derivation: `pnpm check:objectui-bump`, exit 0 ("20 assertions across 5 cases"). - No package source changed, so no package `test` / `typecheck` is owed. `test:repo` is CI's (`Test Core`). ## CI - **The Console Pin Gate does not run on this PR or in the merge queue.** `ci.yml`'s two speeds apply: the `console-pin` job's `if:` excludes `pull_request` and `merge_group`. So the **pre-merge full battery is NOT MEASURED**, and the local run above is the pre-merge reading. - **The CI proof is `main`'s first full-battery run after the merge.** This PR changes `.objectui-sha`, so the console-dist cache key misses, and that run builds the console fresh at `616df6598b42`. The dispatching seat reads it. If it is red, it is a `main` red this card owns. - The fast set (Lint & Repo Gates, TypeScript Type Check, Test Core, Build Core, Governed Surface Queue Guard and the rest) runs on this PR as usual. ## Acceptance notes Observations, not filed: - The changeset keeps the generator's file name (`console-616df6598b42.md`), where PR #24660 renamed its changeset to the card's prefix. No gate reads the name. - `0b36ffa8c` (objectui#13132) is in this pin. The `domain:ui` pointer `6284006658` on #24579 says the checklist's `automated.stale` markers can drop once the pin passes it. `docs/qa/**` is not touched here. - objectui `main`'s tip at the move, `186b78d8f347`, went red after the move (`Test (coverage)`, `Test (coverage shard 6/8)`), and so did `91b658a75d64` earlier, with the same two runs. That is objectui's to read; nothing here depends on it. --- _Generated by [Claude Code](https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 7c2eab9 commit 41646a5

5 files changed

Lines changed: 91 additions & 8 deletions

File tree

‎.changeset/console-616df6598b42.md‎

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
---
2+
"@objectstack/console": minor
3+
---
4+
5+
Console (objectui) refreshed to `616df6598b42`. Frontend changes in this range:
6+
7+
Derived from the changesets objectui declared over the range — 30 releasing of 31 changesets added across 32 non-merge commits; omitted: 1 release-nothing changeset, 1 commit carrying no changeset (they ship no package code).
8+
9+
- **minor** — An action's param dialog keeps what the user typed when the server refuses the run (objectui#13161). (objectui `616df6598`)
10+
- **minor** — **BREAKING** — The list view's Filter panel no longer narrows its field list to a per-view `filterableFields` whitelist (objectui#13118). `@objectstack/spec` 18 retires the list view's `filterab… (objectui `cbac9d7dd`)
11+
- **minor** — Studio marks the settings the AI copilot drafted: a Draft chip and a Source line ("Added as a draft by the AI copilot 2 min ago") on a field or a list-view setting the copilot cha… (objectui `3bcf314e7`)
12+
- **minor** — A list's `addRecord` Add button opens the create form on a console page and on the console's object list (objectui#13089). (objectui `d11174ad1`)
13+
- **minor** — A navigation entry's API `dataSource` is read, and its `visible` sees the selected value as `data` (objectui#13029). (objectui `1b94d50aa`)
14+
- **minor** — Studio's Changes drawer can now fill a new field's default into the records an object already holds, when you publish (objectui#12929). (objectui `6058bf8b7`)
15+
- **minor** — A page `list-view` node now honours `requiredPermissions`, a key of the spec's list view row, and the registration publishes it (objectui#13074): the capabilities a viewer must al… (objectui `b0176214a`)
16+
- **minor** — **BREAKING** — A navigation item's `visible` now takes `@objectstack/spec`'s `EvaluatedExpressionInputSchema` by reference, beside the boolean it already took (objectui#13075). (objectui `df7156808`)
17+
- **minor** — A page predicate can ask the capability question: `current_user.hasCapability('NAME')` now answers in the console, from the same `/auth/me/permissions` answer the action gate read… (objectui `2493e85a3`)
18+
- **patch** — Studio's create dialogs now bind each field label to its input (objectui#13128). The display-name and identifier labels in the shared create dialog had no `htmlFor`, and the input… (objectui `157694c7b`)
19+
- **patch** — A refused package publish on the package sheet shows the reasons the server returned, under the count sentence (objectui#13160). (objectui `4c36eab58`)
20+
- **patch** — A chart saved view keeps the view tabs on the console list page (objectui#13114). (objectui `91b658a75`)
21+
- **patch** — The console's "This app can't be opened" screen, and its "Couldn't reach the server" and "App not available" siblings, now offer "Back to home" beside Retry — the same way out the… (objectui `5dbc6a579`)
22+
- **patch** — The Import Wizard sends a saved mapping the format the mapping declares (objectui#13156). A mapping that declares `sourceFormat: 'csv'` is now imported with `format: 'csv'`, the r… (objectui `d05f33b2e`)
23+
- **patch** — Studio's row-level security editor holds a policy until it has a name (objectui#13113). (objectui `427e59c9e`)
24+
- **patch** — An ungrouped list view now asks for the object's declared `nameField` in its `$select`, so the bulk confirm step lists each record's name rather than `Record #ID` when no column s… (objectui `a57d80afe`)
25+
- **patch** — The create form uses the object's `create` form view when it declares one (objectui#13099, ruling B′ on objectstack-ai/objectstack#24692). (objectui `ed2805768`)
26+
- **patch** — The bulk-action confirm step names each affected record by the object's declared `nameField`, even when no column of the view shows it, and never by another text field (objectui#1… (objectui `4b6774649`)
27+
- **patch** — The record page heading labels a select `nameField` (objectui#13103). When an object's declared `nameField` (or `displayNameField`) is a select field, the record page H1 now shows… (objectui `2d8a8b7dc`)
28+
- **patch** — `record:details` no longer draws a record pointer's type half as its own row (objectui#13102). (objectui `4c6885580`)
29+
- **patch** — Studio's copilot draft marks, the remainder (objectui#12725): (objectui `df943a2a1`)
30+
- **patch** — An app's landing waits for the API reads of its navigation entries (objectui#13097). (objectui `d87e4f2ec`)
31+
- **patch** — On a phone, the AI chat's pending-drafts bar shows its whole sentence (objectui#13088). (objectui `a26068b9e`)
32+
- **patch** — Setup's metadata lists keep a row's controls in reach on a narrow screen, and say in words when the activation state cannot be read (objectui#13091). (objectui `633ef99a3`)
33+
- **patch** — An object field whose `visibleWhen` names `current_user.hasCapability(NAME)` is now answered on the record form page and in the console's record-form modal (objectui#13083). (objectui `90518cdb8`)
34+
- **patch** — Studio's RLS policy editor now asks `@objectstack/lint`'s RLS rule about every `USING` or `CHECK` clause that parses, not only about one the runtime cannot lower (objectui#13082).… (objectui `a487cedd6`)
35+
- **patch** — One object-page open reads the published view list (`GET /meta/view`) once (objectui#13057). The adapter now stores the list its client read and answers `listViews` and `listViewO… (objectui `cd4623d06`)
36+
- **patch** — On a phone, the AI chat's "Preview app" pill no longer covers the composer's input (objectui#13068). (objectui `282b138c0`)
37+
- **patch** — The console no longer reads the whole object registry before the first paint on two more routes (objectui#13046). (objectui `b3007fd96`)
38+
- **patch** — Studio names two more things by label where the served metadata carries one. In Explain access, each pipeline layer's "Contributed by" chips now show the position or permission se… (objectui `cc4ae3e14`)
39+
40+
⚠️ 2 of these carry a breaking change: 2 by the author's own breaking annotation in the changeset body — objectui declares no `major` inside a launch window (`scripts/check-changeset-no-major.mjs`). Each is marked **BREAKING** in the list above — read them before compiling the release record.
41+
42+
**In this console build, declared nowhere** — objectui merged 1 commit in this range with no `.changeset/*.md`. The code is inside the pin above and ships here, but nothing upstream declared it, so it appears in no objectui CHANGELOG and in no entry above. Listed by subject rather than counted, because a count cannot tell a dependency bump from a form-behaviour change (objectstack#6174); the upstream gate that would prevent this is objectui#3387.
43+
44+
- _(no changeset)_ test(e2e/live): the eleven stale live specs, each brought back to the shipped showcase or retired (objectui#13104) (#13132) (objectui `0b36ffa8c`)
45+
46+
Clause-②: no
47+
48+
<!-- adr-0087: not-required (no-migration-prescription)
49+
This diff moves `.objectui-sha` and the artefacts that travel with it: this console
50+
changeset, the re-recorded `scripts/sdui-manifest.record.json` and the regenerated
51+
`sdui.manifest.json`, and the re-recorded `packages/sdui-parser/objectui-lockstep.json`.
52+
It adds, removes or renames no ObjectStack-authorable key: no Zod shape, no spec
53+
declaration and no stored `sys_metadata` shape moves in it, so `objectstack migrate meta`
54+
has nothing here to rewrite, and this body carries no prescription of its own.
55+
The range carries two objectui changes their authors annotated breaking, and the digest
56+
marked both. Each is answered against this tree:
57+
- objectui `cbac9d7dd` (objectui#13118) removes objectui's last reader of the list
58+
view's `filterableFields`, and `@object-ui/types` declares `NamedListView.filterableFields`
59+
a `?: never` tombstone. The spec half is this tree's own, already landed: the key left
60+
`ListViewSchema` in 18.0 with its conversion `view-list-filterable-fields-removed`
61+
registered in `packages/spec/src/conversions/registry.ts`. This pin move is what lets
62+
the console build at `main` again; it adds no second retirement.
63+
- objectui `df7156808` (objectui#13075) types `NavigationItemSchema.visible` in
64+
`@object-ui/types` by reference to this tree's `EvaluatedExpressionInputSchema` and
65+
refuses a blank string there, and widens `@object-ui/layout`'s `VisibilityEvaluator`.
66+
This tree's spec already types a navigation entry's `visible` as
67+
`EvaluatedExpressionInputSchema` (`packages/spec/src/ui/app.zod.ts`), so the objectui
68+
side now agrees with it; nothing in this tree's contract moves.
69+
No package in this tree imports or depends on any `@object-ui/*` package, and
70+
`@objectstack/console` publishes objectui's built SPA and exports no objectui type. -->
71+
72+
objectui range: `12dc7b47c340...616df6598b42`

‎.objectui-sha‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
12dc7b47c340d9bd80b35406d890c2d27c8017dc
1+
616df6598b429d2b3687301a2041198928e68971

‎packages/sdui-parser/objectui-lockstep.json‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
],
77
"objectui": {
88
"repo": "https://github.com/objectstack-ai/objectui.git",
9-
"rev": "12dc7b47c340d9bd80b35406d890c2d27c8017dc",
10-
"revDate": "2026-10-19T20:08:18+00:00",
9+
"rev": "616df6598b429d2b3687301a2041198928e68971",
10+
"revDate": "2026-10-20T07:14:48+00:00",
1111
"source": "packages/sdui-parser/src",
1212
"files": [
1313
"packages/sdui-parser/src/body-dialect.ts",
@@ -21,7 +21,7 @@
2121
"packages/sdui-parser/src/validate.ts"
2222
]
2323
},
24-
"recordedAgainstPin": "12dc7b47c340d9bd80b35406d890c2d27c8017dc",
24+
"recordedAgainstPin": "616df6598b429d2b3687301a2041198928e68971",
2525
"grammarRegion": {
2626
"file": "packages/sdui-parser/src/parse.ts",
2727
"delimiter": "/* ---------------------- the JS literal subset (#6614) ---------------------- */",

‎scripts/sdui-manifest.record.json‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@
1111
"a pin bump without regeneration goes RED there — that is the anti-rot half of the freshness gate.",
1212
"Regenerate + re-record: pnpm objectui:build && node scripts/gen-sdui-manifest-node.mjs"
1313
],
14-
"objectuiSha": "12dc7b47c340d9bd80b35406d890c2d27c8017dc",
14+
"objectuiSha": "616df6598b429d2b3687301a2041198928e68971",
1515
"source": "built-tree",
16-
"modulesRoot": ".cache/objectui-12dc7b47c340/apps/console",
16+
"modulesRoot": ".cache/objectui-616df6598b42/apps/console",
1717
"objectuiWorkspaceVersion": "17.7.0",
1818
"generator": "scripts/gen-sdui-manifest-node.mjs",
19-
"generatedAt": "2026-10-19",
20-
"sha256": "b7a53e34856fc4b34c5e615aaf62e149361b92ba6936290d9e1e6cbcbd068bf5",
19+
"generatedAt": "2026-10-20",
20+
"sha256": "d1fde278ffd643900aba9e8fcf834d35a9c345246709f1667ae71618eaad109c",
2121
"components": 107
2222
}

‎sdui.manifest.json‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,12 @@
270270
],
271271
"description": "One line about the list, drawn as the toolbar's info control (its tooltip and accessible name). A plain string, or an inline per-locale map resolved against the display locale. `appearance.showDescription: false` hides it."
272272
},
273+
{
274+
"name": "requiredPermissions",
275+
"type": "array",
276+
"of": "string",
277+
"description": "Capabilities the viewer must ALL hold to see this list, the names permission sets grant through `systemPermissions`. A viewer missing one sees an insufficient-permissions notice in place of the list, and no records are queried. Absent or empty: no gate."
278+
},
273279
{
274280
"name": "userFilters",
275281
"type": "object",
@@ -280,6 +286,11 @@
280286
"type": "object",
281287
"description": "Which toolbar controls the user gets, the spec's `UserActionsConfig` of per-control toggles: a control set to `false` (for example `sort: false`) is taken off the toolbar, and the controls it does not name stay."
282288
},
289+
{
290+
"name": "addRecord",
291+
"type": "object",
292+
"description": "The Add button, the spec's `AddRecordConfig`. The spec row declares `enabled` default `true` and `position` default `\"bottom\"`; the renderer does not apply those defaults: it draws the button only for an explicit `enabled: true`, and places an absent `position` at the top (objectui#13099 owns that gap). `position` places it: `\"top\"` (the toolbar), `\"bottom\"` (under the list) or `\"both\"`. A click opens the create form for the listed object, the one the object list's New opens: the record-form overlay, or the full-page create for an object whose `editMode` is `page`. The button is withheld for a viewer who may not create, or whose create the object greys, and on a host that serves no create. `mode` and `formView` are not read. `userActions.addRecordForm: false` also takes the button off."
293+
},
283294
{
284295
"name": "compactToolbar",
285296
"type": "boolean",

0 commit comments

Comments
 (0)