Repository navigation
chore(objectui): bump the console pin to e420df310f5b (carries objectui#11163 and objectui#11199) - #20990
Conversation
fix(plugin-detail): a related-list toolbar action authored `visible: false` is hidden (objectui#11244) (#11275) objectui@e420df310f5ba9526fd19d5fe65c2a52d6ac6d8c Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
…: migration entries, dataset, batch conformance) Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
…: view, functional-completeness) Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
…: component.test.ts) Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
node scripts/gen-sdui-manifest-node.mjs over .cache/objectui-e420df310f5b/apps/console (107 components, @object-ui/core 17.6.0). Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
pnpm gen:sdui-lockstep against the pin's own checkout: 214 grammar-region lines, 25 diagnostic codes on objectui's side. check:sdui-lockstep reports one code-drift finding (inert-quick-add, deleted on objectui's side by objectui#8285); the port it asks for is outside this card's file surface and is reported, not made. Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
…: component.zod.ts part 1) Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
…: component.zod.ts done) Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
…n citations Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
…i pin citations Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
…ublished Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
… re-measured at e420df310f5b Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 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 — 138 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 17bcde1e3f44e1826b7850ccf674947b8a4f5359 && git checkout 17bcde1e3f44e1826b7850ccf674947b8a4f5359
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 9b0de7de73699771b69649bf7b507fbd2a842260 62ec639b04ce6d882bc19dd58e0f2a0751fdc3c7 && git checkout -B drift-repro 9b0de7de73699771b69649bf7b507fbd2a842260 && git merge --no-ff 62ec639b04ce6d882bc19dd58e0f2a0751fdc3c7
node scripts/docs-audit/affected-docs.mjs --json 9b0de7de73699771b69649bf7b507fbd2a842260
|
…roring objectui 6f864cf62 objectui 6f864cf62 (objectui#8285) deleted kanban-quick-add.ts, its wiring in validate.ts and its four barrel exports from @object-ui/sdui-parser once @objectstack/spec tombstoned object-kanban.quickAdd. This copy deletes the same module, wiring and exports (checkKanbanQuickAdd, INERT_QUICK_ADD, QUICK_ADD_HOST_TYPES, QUICK_ADD_KEY), so an authored quickAdd draws the walk's own unknown-prop warning again and check:sdui-lockstep agrees on all 25 codes. The pin is rewritten for the new state, as objectui's was. Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
…the sdui-parser port The console changeset's placeholder becomes the maintainer's ruling, not-required (no-migration-prescription), worded after the #20638 precedent and fitted to this diff. The @objectstack/sdui-parser changeset declares the export removal as a narrowing, shipped as minor under the launch-window convention. Claude-Session: https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6 Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Inputs read: card #20949 (body and all 8 comments: rider note Gate verdicts on the head: all 42 check-runs completed, 39 ① Derived judgmentsPin target: right. Moved pin-citation claims: eight records re-read at
Published text: right, and true at the pin. The only No key, default, enum member or export moves in The The regenerated Governed surface and size. ② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
…ory, so a TMPDIR behind a symlink (the macOS default) no longer fails regeneration (objectstack-ai#21077) Fixes objectstack-ai#20588 Clause-②: no ## What `scripts/gen-sdui-manifest-node.mjs`, the one producer of the tracked `sdui.manifest.json`, now `realpathSync`s its `mkdtemp` runner directory before it builds the runner URL. The resolve hook compares against that URL. The pin is a new row in `scripts/check-sdui-manifest.mjs --self-test`. It copies the real generator into a fixture tree, runs it under a `TMPDIR` that is a symlink, and requires the output to pass `checkTree` with check 4 required. ## Why: the mechanism, measured on Linux The hook re-anchors a bare specifier to the modules root only when `c.parentURL === RUNNER`. Node reports a module's URL by its **realpath**, but `RUNNER` was built from the unresolved `os.tmpdir()` path. Under a `TMPDIR` reached through a symlink, the two never match. macOS's default `/var/folders/...` is such a path (`/var` is a symlink to `/private/var`). So no runner import is re-anchored, and every registry import fails. The card's macOS failure reproduces on Linux by pointing `TMPDIR` at a symlink. It was measured on the **real** objectui tree built at the pin (`db11afd4967c`, the registry closure built with `turbo run build`). The base is `6073bb96b8`, and the "unfixed" legs restore the base line through `scripts/ablation-replace.mjs`: | leg | generator | `TMPDIR` | exit | output | |---|---|---|---|---| | 1 | fixed | default (`/tmp`) | 0 | 107 components, sha256 `7c7b6b6ebcb1…`, `cmp`-identical to `sdui.manifest.json` at base | | 2 | fixed | symlink to a real dir | 0 | same bytes, `cmp`-identical | | 3 | unfixed | symlink to a real dir | **1** | 16 × `Cannot find package '@object-ui/…'`, then `the registry enumeration failed (exit 1)` (the card's signature) | | 4 | unfixed | default (`/tmp`) | 0 | same bytes (control: the defect needs the symlink) | After each leg, `sdui.manifest.json` and `scripts/sdui-manifest.record.json` were restored to HEAD. The record differed only in `generatedAt`. ⛔ Neither file is in this diff, because open PR objectstack-ai#20990 owns the artefact. ## Premise checks - **Site unchanged.** At base, `:180` is `const runnerDir = mkdtempSync(join(tmpdir(), 'sdui-manifest-runner-'));` and `:190` is the `c.parentURL === RUNNER` test. - **Only `RUNNER` is compared.** `ANCHOR` is only handed on as `parentURL`. In a minimal copy of the hook, a modules root reached through a symlink resolves with or without the fix. Repo-wide, `git grep "parentURL ==="` has exactly one hit: this hook. `ROOT` comes from the generator's own `import.meta.url`, which Node already reports as a realpath. - **The command.** The card names `pnpm sdui:manifest`, but no such script exists in `package.json`. The documented regenerate command is `node scripts/gen-sdui-manifest-node.mjs` (AGENTS.md, `docs/releases-maintenance.md`), and that is what was run. ## The pin, and why it lives where it does The generator has no test of its own: no `--self-test`, and no suite names it. `scripts/check-sdui-manifest.mjs --self-test` is the self-test of its artefact's gate, and `lint.yml` already runs it ("SDUI manifest is present, intact and fresh at the objectui pin"). Putting the row there adds no CI step and no new harness. - **The row.** `the producer, run under a TMPDIR behind a symlink, writes a tree this gate passes`. It is declared in `SELF_TEST_BATTERIES`, and `SELF_TEST_BATTERY_FLOOR` goes from 12 to 13. - **The fixture.** A throwaway objectui commit sits at a fixture pin under `.cache/objectui-SHA12/`. It holds one stub package per `@object-ui/*` name the generator spells (read off the generator's source, so a module it gains does not red the row) and a stub adapter at the parser dist path. The fixture refuses to count as a fixture if its `TMPDIR` resolves to itself. - **The assertion.** The row expects GREEN with `requireObjectui: true` against the fixture's own objectui, so the version leg cannot pass by not running. - **dispatch-gates.** A module-scope `PRODUCER = 'scripts/gen-sdui-manifest-node.mjs'` literal makes an edit to the generator alone derive this gate. Extracted hints at base were `packages/core/package.json`, `sdui.manifest.json/**`, `scripts/sdui-manifest.record.json` and `.objectui-sha/**`. Now they also include `scripts/gen-sdui-manifest-node.mjs`. `dispatch-gates scripts/gen-sdui-manifest-node.mjs` now lists both `check-sdui-manifest` invocations as matched via that hint. **Ablation (one-time proof).** The fix was committed first (`6cb74c13c4`). Then `scripts/ablation-replace.mjs` restored the base line: anchor 1 to 0, blob `2df8285f06ae` to `7c351d47dc70`. The self-test exited **1**: the producer printed 16 × `Cannot find package '@object-ui/…'` imported from `…/tmp-real/sdui-manifest-runner-…`, and the row read RED with `sdui.manifest.json is MISSING`. The file was restored with blob == HEAD (`2df8285f06ae`) and `git diff HEAD` empty. The self-test then exited 0 with 13 cases. ## Local verification (at HEAD `6cb74c13c4`) Every command `dispatch-gates --commands` derives, with its exit code captured before any pipe: ```text node scripts/check-ci-filter-parity.mjs :: exit 0 node scripts/check-closing-keyword-parity.mjs :: exit 0 node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0 node scripts/check-comment-mask-corpus.mjs :: exit 0 node scripts/check-declaration-mirrors.mjs :: exit 0 node scripts/check-declaration-mirrors.mjs --self-test :: exit 0 node scripts/check-scripts-symbol-anchors.mjs :: exit 0 node scripts/check-scripts-symbol-anchors.mjs --self-test :: exit 0 node scripts/check-sdui-manifest.mjs :: exit 0 node scripts/check-sdui-manifest.mjs --self-test :: exit 0 node scripts/check-self-test-wired.mjs :: exit 0 node scripts/check-self-test-wired.mjs --self-test :: exit 0 node scripts/check-self-test-workflow-commands.mjs :: exit 0 node scripts/check-self-test-workflow-commands.mjs --self-test :: exit 0 node scripts/check-whole-set-label-write.mjs :: exit 0 node scripts/check-whole-set-label-write.mjs --self-test :: exit 0 node scripts/pm/bare-root-worklist.mjs --self-test :: exit 0 pnpm check:agent-test-spelling :: exit 0 pnpm check:bash32-floor :: exit 0 pnpm check:cli-command-ids :: exit 0 pnpm check:cross-package-test-inputs :: exit 0 pnpm check:driver-memory-census :: exit 0 pnpm check:entry-guard :: exit 0 pnpm check:gitlink-declared :: exit 0 pnpm check:nul-bytes :: exit 0 pnpm check:parse-guard :: exit 0 pnpm check:pm-dispatch-gates :: exit 0 pnpm check:pnpm-filter-targets :: exit 0 pnpm check:ratchet-remedy-authority :: exit 0 pnpm check:refd-timer-probe :: exit 0 pnpm check:watch-hint-literal :: exit 0 ``` Verdict lines: `✓ check-sdui-manifest self-test: 13 cases behave (…; the producer, run under a symlinked TMPDIR, writes a tree that passes).` · `check-nul-bytes: OK (scanned 9639 text file(s) …; no raw ASCII control bytes).` - **Union reconciliation:** `dispatch-gates --repo objectstack-ai/objectstack --commands` (no paths) was run after the last commit. Its verdict: `✓ dispatch-gates --ran: 31 derived famil(ies) accounted for — 31 run, 0 NOT-MEASURED (a DERIVED zero — all 31 recorded an exit code and none of them is 3).` - **eslint, a proven narrowing.** ① Population: `--print-config` resolves a config for both files. ② Count: `--format json` reports 2 files, 0 errors and 0 warnings, with `--no-inline-config`. ③ Invariance: this repo's `eslint.config.mjs` never enables type-aware linting (no `parserOptions.project`), and its local plugins are per-file. So this diff cannot move the verdict for any file it does not touch. - **Not run locally:** the `Test Core` steps that `scripts/**` schedules in `ci.yml`. They are CI's own shell (`NOT MEASURED`, declared to CI). The two value-bearing families (`check-shard-attestation`, `check-test-completeness`) take `$RUNNER_TEMP` and matrix values and have no local invocation. ## Acceptance notes - **The objectui install for the measurement needed a flag.** The objectui pin's `.npmrc` sets `engine-strict=true`, and `jsdom@30.0.1` requires node `^22.22.2`. This container runs `22.22.0`, so the install used `--config.engine-strict=false`. jsdom is a test dependency and is outside the generator's import closure. This is a local environment fact only; nothing was filed. - **The changeset label.** Root `scripts/**` publishes nothing, so this PR takes the `skip-changeset` label. --- _Generated by [Claude Code](https://claude.ai/code/session_01JAhu8u8QfBvRjVZDox7CP9)_ Co-authored-by: Claude <noreply@anthropic.com>
…he key", not the unregistered kanban-ui block (objectstack-ai#21141) Fixes objectstack-ai#21017 Clause-②: no The `object-kanban` `quickAdd` retirement told authors the control "is unchanged on the `kanban-ui` block". objectui retired that block (objectui#8257) and this spec never declared it as a component type, so a node written there saves clean and resolves no renderer. Every author-facing copy of the remedy now says one sentence: **Delete the key; `object-kanban` offers no quick-add control.** The refusal itself is unchanged: same key, same `invalid_type` code at path `quickAdd`, same accept set. Prose only. ## The copies | Copy | File | Change | |:--|:--|:--| | tombstone message (shown at the save door and in the generated reference) | `packages/spec/src/ui/component.zod.ts` | the sentence | | D2 conversion `object-kanban-quick-add-removed` `summary` | `packages/spec/src/conversions/registry.ts` | the sentence | | D3 entry `object-kanban-quick-add-retired`: `replacement`, `reason`, `acceptanceCriteria` (what `os migrate meta` prints) | `migrations/entries/semantic/18.object-kanban-quick-add-retired.ts`, generated copy in `migrations/registry.ts` | the sentence; the second way out "move the board to a host that renders the `kanban-ui` block" is dropped | | step 18 `rationale` fragment (the paragraph the upgrade guide prints) | `migrations/registry.ts`, the hand-written region outside the generated markers | the sentence. A sixth copy the card did not list, found by the `git grep` of the order's H2 | | docblocks: two in `component.zod.ts`, two in `conversions/registry.ts`, the retired-key entry's header, the pin test's header | same files | the ruling is still quoted, now with what objectui did to the block it named | | generated | `migrations/registry.ts` (`gen:migration-registry`), `content/docs/references/ui/component.mdx` (`gen:docs`) | regenerated, never hand-typed | ## Measured before writing - **H1, is there a rendering route.** objectui at the pin `e420df310f5b` and at main `770cc5ba4d15`: 0 code lines naming `kanban-ui` under `packages` and `apps` outside tests and CHANGELOGs; 22 comment lines in 6 files, all recording the retirement. No `register` call carries the key. `ObjectKanban` passes neither half of the pair to `KanbanBoardCore`; objectui's own docblock there says "An `object-kanban` board draws no Quick Add control, whatever its document carries". The pair is read only by the exported `KanbanRenderer` React component, which a host mounts directly, so no metadata node reaches it. No route to name, so triage's sentence stands. - **H2, every copy.** Base `git grep` of `kanban-ui` under `packages/spec/src` lists the files in the order plus the step 18 rationale fragment above. After this PR no author-facing text names the block; the remaining mentions are docblocks and comments that explain why it is not named. - **H3, what PR objectstack-ai#20990 already did.** It added the "Re-read at `e420df310`" qualification to the second docblock. That qualification is kept, re-wrapped, with the same facts and citations. The sentence just above it still said the control "stays on `kanban-ui`", contradicting it; that sentence is the one rewritten. - **The dead-node claim.** Probe on this branch: `PageComponentSchema.safeParse` of a node with type `kanban-ui` succeeds (true), and `ComponentPropsMap['object-kanban'].safeParse({ objectName: 'task', quickAdd: true })` fails with one issue, code `invalid_type`, path `quickAdd`. ## Pin `ui/component.test.ts` (`ObjectKanbanPropsSchema quickAdd is retired`): the existing refusal test now pins "Delete the key" in place of the block name, and one new test asserts that the refusal still carries `invalid_type` at `quickAdd`, that the tombstone carries the sentence, and that none of the tombstone, the D2 summary, the D3 entry's three texts and the step 18 rationale contains `kanban-ui`. The generated copies are held to their sources by `check:migration-registry`. Ablation, each leg through `scripts/ablation-replace.mjs` in wrap mode against the committed fix: the tool printed anchor 1 to 0 and the blob hash changing before the run, and `blob == HEAD` with an empty `git diff HEAD` after it. Direction in every leg was red, exactly one failing test: leg 1 the tombstone sentence reverted (assertion on the sentence), leg 2 the D2 summary reverted, leg 3 the generated semantic copy reverted, leg 4 the step 18 rationale reverted (each of the last three on `not.toContain('kanban-ui')`). The test imports the sources by relative path, so no `dist/` is in the resolution path and no rebuild is owed between legs. ## Verified at head `83d99268a` - `pnpm --filter @objectstack/spec build` exit 0; `check:generated` all 15 artifacts up to date, with `check:migration-registry`, `check:spec-changes`, `check:upgrade-guide`, `check:docs`, `check:authorable-surface` and `check:api-surface` green. `check:docs` was stale after the tombstone edit and was regenerated: the diff of `content/docs/references/ui/component.mdx` is the one sentence. - `dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` over the actual diff: 112 commands. `--ran` verdict: "112 derived famil(ies) accounted for — 112 run, 0 NOT-MEASURED", every recorded exit 0. The four artifact-roster gates whose roster sits under the touched paths (`check:meta-url-spelling`, `check:authz-resolver`, `check:error-code-casing`, `check:filter-alias-parity`) also exit 0. The seven gates that first answered exit 3 (workspace not built) were re-run after `turbo run build` of the closure and exit 0. - `pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/ui src/conversions src/migrations scripts/step18-rationale-merge.test.ts scripts/conversions-major18-merge.test.ts`: 114 files, 4190 tests passed. `pnpm --filter @objectstack/spec typecheck` exit 0. - `origin/main` was merged with `scripts/pm/os-regen-merge.sh` (main at `8368f1c00`); regenerating the migration registry afterwards changed nothing. The repo-wide lint union and the rest of the farm are CI's. ## Acceptance notes - `packages/spec/CHANGELOG.md`, the 17.5.0 entry for the retirement (about lines 1580-1629), carries the same prescription ("It stays on the `kanban-ui` block ...", and "live `kanban-ui` spelling"). It is release-owned and published, so it is not touched here; it needs an amendment in a dedicated docs-only PR. Carrier: none. - `.changeset/objectui-pin-citations-e420df310f5b.md` already says the block was retired in objectui and is correct; untouched. - No governed surface is touched (no `.claude/**`, `skills/**`, ADR or AGENTS.md). The claim records that the at-tier contract review of the `packages/spec/src/**` face is owed before enqueue. - Changeset: `patch` for `@objectstack/spec`, `Clause-②: no`. The diff widens no accept set and no public surface. --- _Generated by [Claude Code](https://claude.ai/code/session_017VaLJnYwhPsanVCe9dMCJU)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
Fixes #20949
Clause-②: no (narrowing)
Bumps the console pin:
.objectui-shadb11afd4967c->e420df310f5b, objectuiorigin/mainHEAD at bump time (2026-09-30T22:03Z). The pin'sapps/console/package.jsonis@object-ui/console17.6.0, the same version the old pin carried (npm view @object-ui/console dist-tagsanswerslatest: 17.6.0).Containment (objectui
merge-base --is-ancestor C e420df310f5b, private full clone,rev-parse --is-shallow-repository= false)f4ed2387e9actions(objectui#11163, PR objectui#11263)f8334f8777db11afd4967c(old pin)e420df310f5bas ancestor ofdb11afd4967cOn
main:git branch -r --contains e420df310f5blistsorigin/main, andmerge-base --is-ancestor e420df310f5b origin/mainexits 0.Riders: objectui#11270 and objectui#11253 are not in the range (0 hits in the
db11afd4967c..e420df310f5blog). So the three rider texts on #20949 (comment5920572123) are not due at this pin.What changed
.objectui-shaand.changeset/console-e420df310f5b.md, written byscripts/bump-objectui.sh(@objectstack/consoleminor). The range has 87 releasing changesets. 5 of them are declared breaking, and all 5 are on objectui's own packages (see "Resolved since the first report").sdui.manifest.jsonandscripts/sdui-manifest.record.json, fromnode scripts/gen-sdui-manifest-node.mjs(no arguments): 107 components,@object-ui/core17.6.0.packages/sdui-parser/objectui-lockstep.json, frompnpm gen:sdui-lockstepagainst the pin's own checkout: 214 grammar-region lines, 25 diagnostic codes on objectui's side.@objectstack/sdui-parserport the lockstep demands. This is the seat's ruling A on Bump .objectui-sha past objectui f4ed2387e9 (objectui#11163, related-list actions), which also carries objectui#11199: unblocks #20936 and #20299 #20949 (5923109668), which widened the claim's surface. It mechanically mirrors objectui6f864cf62(objectui#8285).packages/sdui-parser/src/kanban-quick-add.tsis deleted.validate.tsand its four barrel exports inindex.ts(checkKanbanQuickAdd,INERT_QUICK_ADD,QUICK_ADD_HOST_TYPES,QUICK_ADD_KEY) are removed.__tests__/inert-quick-add.test.tsis rewritten for the new state, as objectui rewrote its own pin: an authoredquickAddonobject-kanbandraws the prop walk's ownunknown-propwarning, and the barrel no longer publishes the four names.git grep, 0 hits outsidepackages/sdui-parser).@objectstack/lintand@objectstack/metadata-protocolimport onlycompile,parseJsxand types..changeset/sdui-parser-retire-inert-quick-add.mddeclares the export removal:minor,**BREAKING**under the launch-window convention, a!summary andClause-②: no (narrowing).pnpm check:sdui-lockstepnow exits 0: the copy agrees with objectui ate420df310f5bon all 25 codes.packages/spec/src, re-measured at the new pin (next section). Also the regeneratedpackages/spec/src/migrations/registry.tsandcontent/docs/references/ui/view.mdx, and.changeset/objectui-pin-citations-e420df310f5b.md(@objectstack/specpatch). TheFormField.spandescribe and six migration-entry descriptions ship the pin sha, so the text change publishes.pnpm objectui:buildat the new pin built objectui against this tree's client and spec. It found no API break against framework code: 34 of 34 objectui dependency builds succeeded, with 0 TypeScript errors.origin/mainwas merged three times throughscripts/pm/os-regen-merge.sh, ate32638aeac,b1da822c0fand62ec639b04.registry.ts, andgen:migration-registryreproduced the merged file byte for byte.component.zod.tsandcomponent.test.ts(feat(spec,lint): one derived list of page-component slot positions, read by all three page walks (#20940) #20961's slot positions). It text-merged cleanly, andcheck:objectui-pin-citationsstill reads 49 asserting citations matching.check:generatedread every artifact current, so no regeneration commit was owed.Pin-citation re-measure
Each record was handled in the same way. Its anchors were mapped through the
db11afd4967c..e420df310f5bdiff of the file each one cites, and each anchor was re-read at the new pin. Line hashes and corpus counts were taken again with the method the record names:git hash-objectof the cited block, andgit grep -o -Fover the tracked tree. Only after that were the pin and the moved numbers updated. Each record keeps its earlier hops as history.check:objectui-pin-citationsnow reports 49 asserting citations matchinge420df310and 7 anchor content assertions verified against objectui at the pin.Records whose CLAIMS moved, not only their numbers. These want a human read:
action:*rows (component.zod.ts): objectui#11168 slice 1 rewrote all four registrations'inputs.action:buttonnow publishes 27 of its 29 keys, all butendpointandundoable. It used to publish 7.action:menunow publishessizeandvisible.action:groupno longer publishes its group-levelname, and publishes the primitive's four sizes.action:icon'slabelis now read five times, where the record said four: objectui#11212 added a fault label.action:groupandaction:menuconsume the host's evaluateddisabledverdict. So aproperties.disabledon either block now greys it out at render, while their strict rows refuse the key at save. The docblocks say so. Declaring the key is a contract decision, not a pin re-measure.object-kanbanlimit: objectui#9853 renamed the defaultDEFAULT_KANBAN_LIMITtoDEFAULT_KANBAN_FETCH_BATCH_SIZE. It is still 100. The query line changed on the anchor itself.object-kanbanquickAddrecords: objectui#8285 and objectui#11234 landed objectui's half of the retirement. The board now renders an internalKanbanBoardCore, which reads neither key. SoObjectKanban.tsxnamesquickAddandonQuickAdd2 times each, all four in the comments that record the cut, where the records said 0. The records also now say that the schema-onlykanban-uiblock they point to was retired in objectui (objectui#8257), long before this pin.object-tree: objectui#8348 moved the tree's rung-1 call from theundeclaredarm toview-data. It also dropped the?? schema.datafallback from the host-data read. So the renderer and the row now agree on a bare array. The "WIDER than this row" sentences are dated to the pin where they held.object-map: one sentence said an authoreddataarray still reaches the renderer through the React props channel. That has been false since objectui#9571, which predatesdb11afd4967c. objectui's own docblock was only corrected on this hop, so the record is corrected now. Thesortrecord said the registration declares nosortinput. objectui#8220 now declares one, in the same array form, and also onobject-ganttandobject-timeline.Files:
component.zod.ts,component.test.ts,view.zod.ts,dataset.zod.ts,functional-completeness.ts,api-methods-batch-conformance.test.ts, the sixmigrations/entries/semantic/18.*entries, and the regeneratedregistry.tsandview.mdx. No key, default, enum member or export moves.Boot at the new pin
scripts/build-console.shran ate420df310f5bwith this tree's client and spec injected, and its VERDICT was command-exit 0.import/jobsis present.assert-console-spec-injectionpasses: 22 of 22 injected-only descriptions are present, and all 6 published-only ones are absent.chunk-membership.jsonreadsclientinvendor-objectstack.examples/app-showcasebooted withobjectstack dev --ui --fresh --no-seed-admin --no-watch -p 41949on the whole-workspace build of the merged tree.bootstrap-statusansweredhasOwner: false./opt/pw-browsers/chromium) opened/_console/setupand submitted the owner form.bootstrap-statusflipped tohasOwner: true.get-sessionreturned the new owner with positionsplatform_admin,org_ownerandeveryone, andisPlatformAdmin: true./_console/home, which lists Showcase and Setup./_console/login./_console/apps/com.example.showcase/page/showcase_capability_map./_console/apps/com.objectstack.setup/dashboard/system_overview.TypeErrorand 0 5xx across both passes.401 GET /api/v1/auth/get-sessionbefore each sign-in.404 GET /api/v1/usage/storage, which Bump .objectui-sha past objectui a5841be351 (objectui#11028), which also carries objectui#11008 and objectui#10964 — the one pin move #20287, #20578 and #20293 wait on #20638's boot recorded at the old pin too.404 /favicon.ico. The console'sindex.htmldeclares an empty-href icon link, and that file is byte-identical at both pins.127.0.0.1was refused at sign-up with 403 (Better Auth:Invalid origin). The server publisheslocalhost, and the drive fromlocalhostis the record above. That attempt wrote nothing;hasOwnerstayed false.--freshtempdir went with the process.build-console.shinjects only this tree's@objectstack/clientand@objectstack/specinto the bundle.@objectstack/sdui-parserruns server-side, in the JSX-page save gate (@objectstack/lint,@objectstack/metadata-protocol). The change there is one diagnostic code for an authoredquickAddonobject-kanban(inert-quick-addbecomesunknown-prop, still a warning), which the registration and sign-in path never reaches.Spec compatibility
objectui at
e420df310f5bresolves every@objectstack/*package to 17.5.0 in its lockfile, the publishedlatest. Its declared ranges top out at^17.5.0. Its own CI on that commit concluded success for bothType CheckandSpec Main Shape Gate. The first compiles against the installed 17.5.0 faces, and the second against objectstackmain.Here, objectui's dependency build ran against
node_modules/@objectstack/spec17.5.0 with 0 TypeScript errors. No objectui change in the range needs an unreleased spec.Governed surface
None of the 25 changed paths is a row of
GOVERNED_SURFACESinscripts/pm/check-governed-merges.mjs(governedPathsInreturns none). No release act was performed. The diff is 1950 changed lines, under the 5000-line human-merge threshold.Resolved since the first report
Both answers are on #20949 in
5923109668..changeset/console-e420df310f5b.mdnow carriesadr-0087: not-required (no-migration-prescription)in place of the bump script's placeholder. It is worded after Bump .objectui-sha past objectui a5841be351 (objectui#11028), which also carries objectui#11008 and objectui#10964 — the one pin move #20287, #20578 and #20293 wait on #20638's and fitted to this diff:52aad5cef,615346d61,6f864cf62,3c13675e5and846cec0ef.object-kanban.quickAddis already registered on this side aspage.component.object-kanban.quickAdd(spec(ui):ObjectKanbanProps.quickAddis accepted-and-dropped onobject-kanban— objectui ruled it retired; the tombstone is this repo's half #17260).6f864cf62.check-adr-0087-registration --base origin/mainexits 0: 2 declared-breaking changesets, each with a disposition.check:sdui-lockstepcode-driftinert-quick-add, the seat's ruling A: the port is above, and the gate exits 0.Gates at head
62ec639b04: 125 derived, 125 run, 0 NOT-MEASURED, 0 unrun, and all 125 exit 0. The 11 artifact-roster gates whose roster sits in a touched directory also all exit 0.@objectstack/spec: tests 17211 passed and 1 todo, across 584 files; typecheck exit 0.@objectstack/sdui-parser: 217 tests passed across 13 files; typecheck exit 0.@objectstack/lint(its three JSX-page and lazy-deps suites): 20 tests passed.@objectstack/metadata-protocol: 2896 tests passed and 19 skipped.inert-quick-addpin was reverse-checked once. With the three pre-port sources restored fromb1da822c0f, 4 of its 6 rows go red. Thefalseand braced-marker rows stay green, because the interim never fired for them. Restored,git diff HEADis empty and both edited files' blobs equalHEAD's.Generated by Claude Code