Skip to content

chore(objectui): bump the console pin to 0abd4f9f8769 (carries objectui#11636, #11637, #11635, #11624 and #11640) - #21827

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-21807-objectui-pin-bump
Oct 5, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-21807-objectui-pin-bump

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #21807
Clause-②: no

This moves the bundled Console's objectui pin from 9dfaca654311 (#21772, PR #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 #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 #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 #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 chore(objectui): bump the console pin to 9dfaca654311 (carries objectui#11611, #11614 and #11619) #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 #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 #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


Generated by Claude Code

claude added 3 commits October 5, 2026 04:59
…the pin citations

Moves .objectui-sha from 9dfaca654311 to objectui main 0abd4f9f8769
through scripts/bump-objectui.sh, and re-measures the 54 asserting pin
citations in packages/spec/src at the new pin (every cited objectui
file is byte-identical across the hop; the migration entries' corpus
counts are re-taken with git grep -o -F).

Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv
Co-authored-by: Claude <noreply@anthropic.com>
…angesets at 0abd4f9f8769

sdui.manifest.json and its record regenerated by gen-sdui-manifest-node.mjs
over the tree pnpm objectui:build built at the pin (object-master-detail-form
`details` gains `of: object` and a description, objectui#11396); the
sdui-parser lockstep record re-recorded with gen:sdui-lockstep (grammar,
codes and predicate unchanged); the console changeset's objectui#11170 line
made readable; a @objectstack/spec patch changeset for the citations.

Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/sdui-parser, @objectstack/spec, touching 14 documentable anchor(s). ⚠️ 2 changed file(s) yielded no anchor (packages/sdui-parser/objectui-lockstep.json, packages/spec/src/kernel/functional-completeness.ts), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

2 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/data-modeling/analytics.mdx (via DatasetMeasureSchema (symbol, a top-level const))
  • content/docs/protocol/objectui/layout-dsl.mdx (via ComponentPropsMap (symbol, a top-level const object))

⛔ 5 release-owned page(s) also name something this change touched. These are read-only:

  • content/docs/releases/v15.mdx (via PageTabsProps (symbol, a top-level const object))
  • content/docs/releases/v17/17-1.mdx (via ComponentPropsMap (symbol, a top-level const object))
  • content/docs/releases/v17/17-3.mdx (via ComponentPropsMap (symbol, a top-level const object))
  • content/docs/releases/v17/17-4.mdx (via ComponentPropsMap (symbol, a top-level const object))
  • content/docs/releases/v17/17-5.mdx (via ComponentPropsMap (symbol, a top-level const object))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

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

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

Which tree this was computed on

This run read content/docs from 412fea64dea5850353ac3acc15a02bb0f0d70dee — the merge of head e40526e564d9ed123f5d40d6a0d7b646fdbfadbf into base a3ffc4512df5d9ebc1c9e5dee70813d89bf549db, which is what actions/checkout gives a pull_request run. Not the PR head.

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

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 412fea64dea5850353ac3acc15a02bb0f0d70dee && git checkout 412fea64dea5850353ac3acc15a02bb0f0d70dee
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin a3ffc4512df5d9ebc1c9e5dee70813d89bf549db e40526e564d9ed123f5d40d6a0d7b646fdbfadbf && git checkout -B drift-repro a3ffc4512df5d9ebc1c9e5dee70813d89bf549db && git merge --no-ff e40526e564d9ed123f5d40d6a0d7b646fdbfadbf

node scripts/docs-audit/affected-docs.mjs --json a3ffc4512df5d9ebc1c9e5dee70813d89bf549db

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

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs a3ffc4512df5d9ebc1c9e5dee70813d89bf549db → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: e40526e564d9ed123f5d40d6a0d7b646fdbfadbf
Local-runs: none

① Changesets — TRUE

  • Breaking-commit list, measured myself on a full objectui clone (--is-shallow-repository false, partialclonefilter unset, rev-list --missing=print empty at both pins): git log --format='%h %s' 9dfaca654..0abd4f9f8 | grep -E '^[0-9a-f]+ [a-z]+(\([^)]*\))?!:' matches nothing (exit 1). rev-list --count --merges = 0; 5 non-merge commits (1c2e2c46c, 22ddcd5c5, 39a3e91fa, c4c506b9e, 0abd4f9f8), as the PR says. Five .changeset/*.md files are ADDED in the range: two release-nothing (11095, 11396, empty frontmatter), three releasing (11092 minor, 11170 minor, 11628 patch). None declares major; none carries a **BREAKING run or BREAKING CHANGE opener. The highest level is minor, so @objectstack/console: minor is right.
  • objectui#11170 (c4c506b9e), Clause-②: yes (narrowing). The PR answers it without a disposition marker, and that stands. check-adr-0087-registration.mjs judges only changesets THIS PR adds (breakingDeclaration(): major, **BREAKING, ! summary, or a Clause-② line whose arm reads narrowing, read through readClause2Line). .changeset/console-0abd4f9f8769.md carries none: no major, no banner, no !, and its only Clause-② text is the mid-line quotation "declares Clause-②: yes (narrowing)", which readClause2Line classifies as an inline-key near miss (CLAUSE2_LINE_START_DECORATION fails on the preceding bullet text), and a near miss "declares nothing HERE" by the gate's own rule. Substantively, ADR-0087's vocabulary has nothing to register: the entry adds, removes or renames no ObjectStack-authorable key and moves no Zod schema or stored shape, so the only possible disposition would be not-required (no-migration-prescription), which the PR body states in prose. The bump digest (objectui-changeset-digest.mjs:971-978) grades an upstream entry breaking only by major or hasBreakingAnnotation, never by the upstream arm, so no adr-0087: TODO placeholder was owed; that criterion gap belongs to the tool, not this PR. The PR body's Clause-②: no stands: packages/spec accept sets do not move (verified in ②), and the precedent chore(objectui): bump the console pin to 9dfaca654311 (carries objectui#11611, #11614 and #11619) #21800 carried objectui narrowings (grid keys refused by name, BaseSchema) under the same Clause-②: no.
  • .changeset/objectui-pin-citations-0abd4f9f8769.md (@objectstack/spec: patch, Clause-②: no): correct level. The shipped text that moves is the FormField.span describe and six migration-entry description strings (pin sha + corpus counts). patch matches chore(objectui): bump the console pin to 9dfaca654311 (carries objectui#11611, #11614 and #11619) #21800 / chore(objectui): bump the console pin to 2e818d0b51ec (carries objectui#11466, #11574, #11578, #11581 and #11583) #21710.
  • Precedent form: the console changeset keeps the chore(objectui): bump the console pin to 9dfaca654311 (carries objectui#11611, #11614 and #11619) #21800 / chore(objectui): bump the console pin to 2e818d0b51ec (carries objectui#11466, #11574, #11578, #11581 and #11583) #21710 shape (digest-derived entry list, the "Derived from the changesets objectui declared over the range" sentence, the release-nothing pair named, objectui range: trailer), minus the ⚠️ … carry a breaking change line and the <!-- adr-0087 --> marker, both of which the digest emits only for a breaking entry. One departure, disclosed in the PR body: the 11170 bullet was rewritten by hand because the digest's first-paragraph summary was the bare **Clause-②: yes (narrowing)**; the rewritten text matches the upstream changeset. The spec changeset is the same form as chore(objectui): bump the console pin to 9dfaca654311 (carries objectui#11611, #11614 and #11619) #21800's.

② Review faces — TRUE, citation / comment / describe text only

  • Full diff of the 15 packages/spec/src/** files read. Every hunk is inside a /** … */ or // comment, inside a description: string-literal concatenation in the six migrations/entries/semantic/18.*.ts files, or the regenerated migrations/registry.ts. The only non-comment, non-string-continuation changed line is view.zod.ts:3337, the FormField.span .describe(...) whose sole change is 9dfaca654311 → 0abd4f9f8769. No Zod builder, key, default, enum member, export or import moves.
  • Anchor spot-checks at 0abd4f9f8 (all hold, and every cited file is byte-identical across the hop, git diff --quiet): plugin-dashboard/src/index.tsx:299 = { name: 'icon', type: 'string' },; plugin-view/src/ObjectView.tsx:2300 = case 'map':; types/src/zod/objectql.zod.ts:2388 = export const ObjectMapConfigSchema = z.object({ and :1437 = const LIST_VIEW_LOCAL_OVERRIDES = [; core/src/actions/ActionRunner.ts:1497 = composeSuccessMessage(...); types/src/objectql.ts:4754 = limit?: number;. None of the range's 50 changed paths is a cited objectui file (the two same-named changed files, plugin-form/src/index.tsx and sdui-parser/src/types.ts, are not among the citations), so "every anchor held unmoved" is correct.
  • Corpus counts re-taken with git ls-tree -r --name-only <sha> | wc -l and git grep -o -F <term> <sha> | wc -l at both pins: files 7632 → 7650; objectstack 17313 → 17390; @objectstack/spec 7186 → 7209; useState 2477 → 2478; window 4193 → 4194; timeout 1360 → 1360; Span 508 → 508; SpanSchema 57 → 57; TTL 182 → 182; tenant 1318 → 1318. Every number in the six migration descriptions reproduces.
  • content/docs/references/ui/view.mdx: the two changed rows are the span row of the two generated tables that share FormFieldBaseSchema, and each cell equals the new view.zod.ts describe string verbatim. build-docs.ts owns content/docs/references/** (header: "DO NOT place hand-written content") and check-generated.ts:134 lists it; the head commit is titled as the regeneration. Not hand-edited.

③ Scope — TRUE, no ride-along, no release act

  • sdui.manifest.json (+3 −1): object-master-detail-form's details input gains "of": "object" and a description. That is a faithful regeneration: objectui packages/plugin-form/src/index.tsx:557-564 at the pin declares exactly type: 'array', of: 'object', required: true and the identical description string (objectui#11396). "of": "object" count 12 → 13, 107 components, 0 "slots" keys. sha256sum of the branch blob = f95d406a584e… = scripts/sdui-manifest.record.json's sha256 (base blob 6f921896ffac… = the old record), which is what check-sdui-manifest.mjs checks (tamper, staleness: objectuiSha = .objectui-sha, components count). The record's modulesRoot moved to .cache/objectui-0abd4f9f8769/apps/console; objectuiWorkspaceVersion 17.7.0 matches apps/console/package.json at the pin. gen-sdui-manifest-node.mjs:211 calls manifestFromConfigs(configs) with no slotsFor, consistent with the slot-free output.
  • Lockstep: packages/sdui-parser/src/parse.ts is unchanged across the range (grammar blob 0131f27cf86d and 214 lines unchanged is correct); the range's validate.ts diff adds or removes no code: literal, and types.ts / index.ts add no code literal (25 codes unchanged); the containment predicate's three lines still exist at the pin (validate.ts:39, :63, :341). revDate 2026-10-05T04:03:25+00:00 = the commit date of 0abd4f9f8; rev and recordedAgainstPin = the new pin.
  • Files: 22, all within the bump's own records: .objectui-sha, two changesets, manifest + record, lockstep record, view.mdx, and 15 packages/spec/src citation-only files. No objectui write, no tag, publish, Release, release.yml dispatch or Version Packages action; PR is draft, auto_merge null, no reviews.
  • Base drift: origin/main is now 4 commits past the base 18c7dfd2e6 (fix(service-settings): the settings audit trail records secret-valued settings with the keyed digest #21809, test(spec): re-point object-metric icon citation to index.tsx:299 #21808, test(spec): the first data/ file group's test titles state each cited decision in words instead of a tracker number (stage 15) #21810, fix(spec): reportForm offers a joined block's dataset as the ref:dataset picker, marked required (#21714) #21819). git merge-tree --write-tree origin/main <head> exits 0 (tree f34bc29064…, no conflict). The two overlapping files in the merged tree carry the same citation counts as the branch: api-methods-batch-conformance.test.ts 1 at 0abd4f9f8 (2 historical 9dfaca654), component.test.ts 6 at 0abd4f9f8 (12 historical). test(spec): re-point object-metric icon citation to index.tsx:299 #21808's re-point to index.tsx:299 survives and that line verifies at the new pin (above).
  • Slot walk reading: correctly characterised. objectui's validateTree at the pin descends comp?.slots ?? [] (validate.ts:364), and an entry carries slots only when manifestFromConfigs is given slotsFor (types.ts:164-170); this repo's manifest has 0 slots keys and git grep slots packages/sdui-parser/src is 0 at the head, so the save gate's walk does not move with this bump. The residual the dev names is real but objectui-side: the bundled console's kind:'html' compile (getJsxManifest) is built with slotsFor, so a slot-held invalid node can fail the renderer while os validate accepts it; the smoke rendered all three showcase html pages clean. A reading, not a gate result, as recorded.
  • Head check-runs at review time: 18 completed/success (incl. Check Changeset, Governed Surface Queue Guard, Spec property liveness, Type Check · source gates, Build Docs, Build Core), 1 skipped (opt-in tarball smoke), 13 in_progress (Test Core 1–6, Console Pin Gate, Lint & Repo Gates, Type Check · consumer/debt/workspace, Dogfood 1–3 + CLI, Temporal Conformance); 0 failures. Landing still waits on those going green.

Implemented-by: claude/issue-21807-objectui-pin-bump
Reviewed-by: session_01VDtqoecgES7ScQYGbFVDRv

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 5, 2026 06:15
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 5, 2026 06:15
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 5, 2026
Merged via the queue into main with commit 8832655 Oct 5, 2026
37 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-21807-objectui-pin-bump branch October 5, 2026 07:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

chore(objectui): bump the console pin past objectui 39a3e91fad — it carries objectui#11636 (objectui#11092), which unlocks #20318

1 participant