Skip to content

chore(objectui): bump the console pin to ab1879721595 (carries objectui f624f278, b0bf413c and ab187972) - #21625

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

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

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #21616
Clause-②: no

Moves the bundled Console's objectui pin from 89cad75d5570 (#21380) to objectui main at claim time, ab187972159583b595facdcae3c73b50f6f312e9, so the Console carries objectui#11553, objectui#11544 and objectui#11562, and objectui's own move onto @objectstack/* 17.6.0. Unblocked by this, once it lands: #12438 (B1's re-run), #21464 (the held object-grid columns member). #21596's run reads whatever console this pin builds.

Range

89cad75d5570..ab1879721595: 65 non-merge commits, 119 changesets added (one no longer present at the tip, read from the commit that added it), 111 releasing (43 declared breaking, all by the author's annotation), 8 release-nothing, 1 commit without a changeset (6903eafbc, a docs example). git merge-base --is-ancestor exits 0 against objectui origin/main for the old pin and for every commit named below; ab1879721595 is origin/main at the claim-time read.

The landings this bump carries

objectui landing merge commit who waits here
objectui#11553 — Studio reaches the organization's package-less flows at /studio/~org/automations (PR objectui#11565) f624f278d77e #12438 B1's re-run
objectui#11544 — a grouped grid's group headers read the object field's options only, never a column's (PR objectui#11563) b0bf413cac21 #21464's held object-grid columns member
objectui#11562 — record:details edit mode edits a textarea field in a multi-line textarea, so a save keeps its line breaks (PR objectui#11567) ab1879721595 (the pin itself) the console this repo ships
objectui#11438 — objectui resolves @objectstack/* 17.6.0 and follows its mechanical contract moves (PR objectui#11531) 6158e4c93f0b none; carried by the range

What changed here, and why

  • .objectui-sha and .changeset/console-ab1879721595.md, written by scripts/bump-objectui.sh ab187972159583b595facdcae3c73b50f6f312e9 --no-commit (auto level minor). The explicit sha is passed because the shared ../objectui checkout sits on another branch. The script's adr-0087: TODO placeholder is answered not-required (no-migration-prescription), in the wording the previous bumps used, naming all 43 declared-breaking entries (26 commits). Each is objectui's own surface: its validators, layout nodes, node-type keys, CLI, designer and drill-report types. Where an entry narrows toward an ObjectStack shape, ObjectStack already declares that shape: the { condition, style } rule, a dataset-bound dashboard widget, deleteBehavior, percentScaleOf. Measured: none of the 22 retired or narrowed node keys probed is a ComponentPropsMap row (56 rows) or a PageComponentType member (31).
  • packages/sdui-parser/objectui-lockstep.json, re-recorded with pnpm gen:sdui-lockstep against the build worktree at the pin (OBJECTUI_ROOT=.cache/objectui-ab1879721595; the generator correctly refused the off-pin shared checkout). It reads 214 grammar lines (blob 0131f27cf86d), 25 codes and containment predicate 76c18fb95d1f, all unchanged, so no port is owed.
  • sdui.manifest.json + scripts/sdui-manifest.record.json, from node scripts/gen-sdui-manifest-node.mjs over the tree pnpm objectui:build built at the pin. It has 107 components, none added or removed. Fourteen changed their published inputs:
    • grid drops smColumns / mdColumns / lgColumns / xlColumns, and its columns and gap become value sets. stack / flex gap and container padding become value sets too.
    • page:header drops the inert breadcrumb.
    • object-grid gains description, emptyState and keyboardNavigation. object-pivot gains drillDown, and record:line_items gains ten inputs.
    • Descriptions changed on object-grid / object-kanban conditionalFormatting, action:button / action:icon successMessage, and the fields input of the three form blocks (object-form, embeddable-form, object-master-detail-form).
  • The 49 asserting pin citations in packages/spec/src (check:objectui-pin-citations reds on any pin move) were re-measured at the new pin, not restamped. Each anchor was mapped through its cited file's diff and re-read. Block hashes and corpus counts were re-taken with a method that first reproduced every 89cad75d5 number: the selection block still hashes to c88443302d40…, and the corpus is 10071 files with objectstack 16044 and @objectstack/spec 6461 at the old pin, against 10267, 16377 and 6665 here. This regenerates packages/spec/src/migrations/registry.ts and content/docs/references/ui/view.mdx. It adds .changeset/objectui-pin-citations-ab1879721595.md (@objectstack/spec patch), because the FormField.span describe and six migration descriptions name the pin.
  • Records whose claim moved, not only their numbers:
    • The four action:* rows. objectui#11344 now forwards outcomeMessages to the runner. The action:button / action:icon rows record it as a key the renderer forwards and the row does not declare: it arrives on the action:bar member path, and objectui leaves the input unpublished until the row declares it. The action:group / action:menu rows record it riding each member's forward.
    • The object-tree paragraph now cites the regenerated manifest record.
    • Patch round, after the contract review: object-grid keyboardNavigation. The grid reads the key at this pin (objectui#11068, 154075ab1: ObjectGrid.tsx:5458 hands schema.keyboardNavigation ?? inlineEditable to data-table.tsx, which makes the cells one roving Tab stop). So the describe drops [EXPERIMENTAL — not enforced] and its "no renderer reads it" sentence, and states the measured behaviour. The member docblock and the block docblock's [finding(spec): ComponentPropsMap['object-grid'] (ObjectGridPropsSchema) declares neither description nor emptyState, which objectui's ObjectGrid reads once objectui#11130 lands #20694] paragraph record the read and keep the db11afd4967c measurement as history. content/docs/references/ui/component.mdx is regenerated.
    • The same sweep found two more records of the same class:
      • object-grid emptyState's record called the unresolved locale map "a renderer gap". objectui#11227 (6158e4c93) ends that gap: ObjectGrid.tsx:6468-6469 resolves title / message against the display locale.
      • ActionSchema.outcomeMessages was planned, with an author warning that the console does not show outcome copy yet. The console reader is objectui#11344 (c476be0e0, ActionRunner.composeSuccessMessage), so the row is live, as it prescribed for this commit. This adds packages/spec/liveness/action.json and its count shard liveness/state-counts/action.md to the diff, and the successMessage row's note records the interpolation.
  • Every other anchor held on a byte-identical file or moved with its cited text byte-identical. That includes the three quoted-first-line anchors in ui/view.zod.ts that redded: ObjectView.tsx 2293 -> 2299, objectql.zod.ts 2145 -> 2370 (still .strict()) and 1160 -> 1419 (still without map). No key, default, enum member or export moves.
  • No example, test or gate needed adapting for the breaking entries or for objectui#11438's behaviour changes. Measured on this branch:
    • The showcase JSX pages use flex gaps 1, 2, 3, 4, 6 and 8 and grid gap 5 with columns 3 and 4, all inside the new sets.
    • No example names a retired grid *Columns key or any retired node key (0 git grep hits).
    • No example dashboard widget uses the dataset-less inline-object form, which the spec refuses without dataset anyway.
    • All three example percent fields declare max: 100, so objectui#11475's storage-driven scaling reads them as whole percents.
    • No example uses is_empty / $empty on a value provider.

Browser verification (examples/app-showcase, this branch)

pnpm dev -- --fresh --ui --no-watch -p 41737 ran at 87d7c51424, before the merge, with its own ephemeral DB and the seeded admin. The four main commits merged afterwards touch no console asset. check:console-sha reports objectui@ab1879721595. The run was driven in headless Chromium (/opt/pw-browsers/chromium) with every API response captured.

carried fix drive result at ab1879721595
objectui#11553 POST /api/v1/automation/showcase_task_completed/clone { name: 'pinprobe_flow_clone', label: 'Pinprobe flow clone' }, then open /_console/studio/~org/automations clone 200. GET /api/v1/meta/flow/pinprobe_flow_clone 200, _packageId null. The page header reads "Organization flows · Automations". The rail lists "Pinprobe flow clone" and the canvas opens it (?surface=flow:pinprobe_flow_clone, status draft). Studio's home lists "NOT IN A PACKAGE · Organization flows" beside "No writable packages yet"
objectui#11544 Tasks list → Group → Add group field → Status five headers, keyed backlog / done / in_progress / in_review / todo, labelled from the object field's options: Backlog, Done, In Progress, In Review, To Do. Each counts 2, matching POST /api/v1/data/showcase_task/query (groupBy: ['status'], 5 records). The retired column-options read cannot be authored (the strict ListColumnSchema refuses options), so there is no pre-fix leg to contrast
objectui#11562 PATCH a task's notes to "Call back Monday.\n\nBudget approved, needs legal review.\n", open its record page, double-click Notes, append "Signed off.", Save the editor is a TEXTAREA whose value carries both line breaks. The stored value after the save is "Call back Monday.\n\nBudget approved, needs legal review.\nSigned off."

Smoke: the /_console/home launcher, Capability Map, Command Center (大屏), the JSX Command Center (grid columns={4} gap={5}), the Delivery Operations dashboard (KPI tiles and charts drawn), Chart Gallery, Component Gallery and Task Board. 0 page errors. Non-2xx responses were only 401 /auth/get-session before sign-in, 404 /usage/storage and one 404 ?state=draft no-draft probe. Only the PIDs this run started were stopped.

Gates and tests run locally, at 4fc15b7e67 (sync round), 5eadf35375 (patch round) and b93b5fec00

4fc15b7e67 is the head after merging origin/main 5b5e83f446 with scripts/pm/os-regen-merge.sh. The merge commit 501902fb09 had no conflict hunk. component.zod.ts and migrations/registry.ts auto-merged, and both sides' added and removed lines are intact, compared line for line against each side's own diff. The os-regen driver kept this branch's side of content/docs/references/ui/component.mdx, dropping main's object-metric aggregate and trend rows (3f1bc816a2). check:generated --fix regenerated it in 4fc15b7e67, and it now differs from main only by this PR's keyboardNavigation row. The PR's own contribution, its diff against origin/main, is the same 25 paths with the same added and removed lines as at 5eadf35375.

At 4fc15b7e67, dispatch-gates --commands derived the same 128 commands from the same 25-path diff, and all 128 exited 0. --ran reports 128 derived, 128 run, 0 NOT-MEASURED. These also exited 0:

  • check:objectui-pin-citations --verify-anchors (54 asserting citations match ab1879721; 7 content assertions verified)
  • check:authorable-surface, check:migration-registry (registry.ts current: 360 semantic entries, with main's ui-object-metric-aggregate-trend-typed), check:generated (all 15 artifacts current), check:docs and check:liveness
  • @objectstack/spec test (609 files, 18057 passed, 1 todo) and typecheck
  • eslint on the 15 changed TS files (0 errors, 0 warnings)

At 5eadf35375, dispatch-gates --commands derived 128 commands from the 25-path diff (the 127 below plus check:platform-checklist), and all 128 exited 0. --ran reports 128 derived, 128 run, 0 NOT-MEASURED. These also exited 0:

  • check:objectui-pin-citations --verify-anchors (54 asserting citations match ab1879721; 7 content assertions verified)
  • check:generated and check:docs (component.mdx regenerated by check:generated --fix)
  • check:liveness (after gen:liveness-counts)
  • @objectstack/spec test (608 files, 18017 passed, 1 todo) and typecheck
  • @objectstack/lint lint-liveness-properties.test.ts (95 passed)
  • eslint on the 15 changed TS files (0 errors, 0 warnings)

b93b5fec00 is the head after merging origin/main f97660cdd6 with scripts/pm/os-regen-merge.sh. The regenerated registry.ts is byte-identical to the merge's and keeps main's new element-text-variant-heading-subheading-retired entry.

  • node scripts/pm/dispatch-gates.mjs --commands derived 127 commands, the same set before and after the merge. All 127 exited 0 at this head, and the --ran reconciliation reports 127 derived, 127 run, 0 NOT-MEASURED, every exit recorded. On the pre-merge pass at 87d7c51424, check:skill-examples and check:dual-build-cjs-loads first exited 3 (PREREQUISITE NOT MET: no dist/) and exited 0 after pnpm build.
  • Named by the dispatch, all exit 0:
    • check-adr-0087-registration --base origin/main, check-changeset-no-major --base origin/main
    • check:console-sha, check:console-injection, check:sdui-lockstep, check-sdui-manifest
    • check:objectui-pin-citations --verify-anchors (49 asserting citations match ab1879721; 7 content assertions verified)
    • check:migration-registry, check:objectui-bump
    • @objectstack/spec check:generated (after check:generated --fix regenerated content/docs/references/ui/view.mdx)
  • The console build passed its single-zod canary (one {major:4,minor:6,patch:5} literal) and its spec-injection check.
  • pnpm build exited 0. pnpm --filter @objectstack/spec test: 608 files, 18017 passed, 1 todo. pnpm --filter @objectstack/sdui-parser test: 218 passed. pnpm --filter @objectstack/spec typecheck: exit 0.
  • eslint --no-inline-config was run on the 13 changed TS files: 0 errors, 0 warnings. The population is **/*.{ts,…} (eslint.config.mjs:971), and the config enables no type-aware linting (:327-328), so the diff cannot move a judgment on an untouched file. Repo-wide pnpm lint is left to CI.

Environment: Node 22.22.0 sufficed. At this pin objectui locks jsdom 29.1.1 (engines ^22.13.0), so no newer Node was needed.

Acceptance notes

  • objectui, measured in the browser run above, not touched here: switching the list's Group field leaves stale "(empty)" groups stuck on "Loading grid…". The server answers only the real groups. Title (10 groups), then Priority, showed 13 groups (9 phantom + 4); then Status 8 (3 + 5); then Priority 8 (4 + 4). useServerGrouping.ts and useGroupedData.ts are byte-identical at 89cad75d5570 and ab1879721595, so this hop does not reach them. Not measured in a browser at the old pin.
  • object-kanban's conditionalFormatting is still z.unknown() in this spec, while objectui#11522 now declares only the { condition, style } rule on that block. This is the same typing-by-reference move spec(ui): the ComponentPropsMap rows still type renderer-read members as z.unknown() — navigation on object-map / object-gantt / object-tree and conditionalFormatting on object-kanban accept 42 — the family close-out after #21445 #21464 makes for its object-block members.
  • The action:button / action:icon rows in ui/component.zod.ts still do not declare outcomeMessages, which objectui now forwards. Declaring it is a contract decision, recorded on the rows and not made here.
  • conversions/registry.ts' PAGE_HEADER_COMPONENT_TYPES docblock still calls page-header objectui's legacy alias. objectui retired that node key in this range (ad1785c1d). The conversion itself is unaffected.

Generated by Claude Code

claude added 8 commits October 3, 2026 18:04
…bjectui.sh --no-commit output)

Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w
Co-authored-by: Claude <noreply@anthropic.com>
…kstep at ab1879721595; re-measure more pin citations (wip)

Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w
Co-authored-by: Claude <noreply@anthropic.com>
…d.span describe (wip)

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

github-actions Bot commented Oct 3, 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). ⚠️ 4 changed file(s) yielded no anchor (packages/sdui-parser/objectui-lockstep.json, packages/spec/liveness/action.json, packages/spec/liveness/state-counts/action.md, …), 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
  • 4 changed file(s) yielded no anchor (packages/sdui-parser/objectui-lockstep.json, packages/spec/liveness/action.json, packages/spec/liveness/state-counts/action.md, …) — 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 5b5e83f446bde0bf6e13db304b9f07f115635704 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from a46cc222b2bb8a65baf6756259de4d63bdb3df2d — the merge of head 4fc15b7e67f4d4f25e3886058e3eb507b2947bbc into base 5b5e83f446bde0bf6e13db304b9f07f115635704, 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 a46cc222b2bb8a65baf6756259de4d63bdb3df2d && git checkout a46cc222b2bb8a65baf6756259de4d63bdb3df2d
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 5b5e83f446bde0bf6e13db304b9f07f115635704 4fc15b7e67f4d4f25e3886058e3eb507b2947bbc && git checkout -B drift-repro 5b5e83f446bde0bf6e13db304b9f07f115635704 && git merge --no-ff 4fc15b7e67f4d4f25e3886058e3eb507b2947bbc

node scripts/docs-audit/affected-docs.mjs --json 5b5e83f446bde0bf6e13db304b9f07f115635704

⚠️ 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 5b5e83f446bde0bf6e13db304b9f07f115635704 → 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: b93b5fec0089f9a5b5ac0123fd359cb13dc7c1a4
Local-runs: none

① Derived judgments

Inputs: card #21616 (body, claim 5971910197, os-dev-report 5972904218), PR #21625 (body, the 20-file list, net diff f97660cdd6...b93b5fec00), and the 35 check-runs on the head: 34 success, 1 skipped (Packed-tarball smoke (opt-in)), none failing or pending. Those conclusions are the gate verdicts; nothing was re-run.

  • Spec accept set: right. Across the eleven non-test packages/spec/src/** files, the only changed line outside a docblock, a // comment or a migration-entry text string is the FormField.span .describe() in ui/view.zod.ts. In that describe the pin moves from 89cad75d5570 to ab1879721595. The six migration entries and their registry.ts mirror change only text: the pin sha and the re-taken corpus counts. No key, default, enum member, export or refusal moves, so the spec changeset's claim holds. registry.ts's net diff is exactly those six hunks, so main's entries survived the os-regen-merge.sh merge. content/docs/references/ui/view.mdx is the generated twin of the span describe. Both test files change in comments only.
  • Console surface through .objectui-sha: right. The regenerated sdui.manifest.json has 107 components, none added or removed, and 14 with changed inputs. That matches the PR body.
    • Widened inputs: object-grid gains description, emptyState and keyboardNavigation; record:line_items gains ten keys, parentObject through limit; object-pivot gains drillDown.
      • Every one of these that sits on a ComponentPropsMap row is already declared on the spec row.
      • object-pivot has no row.
      • So the CLI JSX gate's console-fallback accept set rises to meet the accept set the spec already publishes. It does not open a new one.
    • Narrowed inputs:
      • grid drops smColumns, mdColumns, lgColumns and xlColumns.
      • Value sets replace free numbers on grid columns, on grid/flex/stack gap and on container padding.
      • page:header drops breadcrumb, which the spec already tombstones (retiredKey).
      • The layout nodes are objectui's own and have no row.
      • The showcase values the body measured are inside the new sets: flex gap 1/2/3/4/6/8, grid gap 5, columns 3 and 4.
    • Description-only changes:
      • object-grid/object-kanban conditionalFormatting.
      • action:button/action:icon successMessage.
      • fields on the three form blocks.
    • Prose slip, non-blocking: the body says "the four form blocks". The manifest has three (object-form, embeddable-form, object-master-detail-form); view:form is not a manifest component. The total of 14 is correct.
  • ADR-0087 disposition on .changeset/console-ab1879721595.md: right. It answers not-required (no-migration-prescription) over the 43 declared-breaking upstream entries in 26 commits. Its ObjectStack-facing claims hold at this head:
    • DashboardWidgetSchema.dataset is required (ui/dashboard.zod.ts:1270).
    • percentScaleOf is the spec's own export (data/percent-scale.ts:61).
    • Check Changeset is green.
  • Lockstep and manifest records: right.
    • objectui-lockstep.json moves only rev, revDate and recordedAgainstPin. The grammar is unchanged, so no port is owed.
    • sdui-manifest.record.json moves only objectuiSha, modulesRoot, generatedAt and sha256.
    • Console Pin Gate and Lint & Repo Gates are green.
  • WRONG, blocking: ObjectGridPropsSchema.keyboardNavigation still ships as inert at a pin where the grid reads it.
    • What the spec says now:
      • The head's ui/component.zod.ts:4389 describe reads "[EXPERIMENTAL — not enforced] … No renderer reads it yet … so authoring it changes nothing today".
      • The member docblock (:4376-4387) says an authored value "changes nothing yet".
      • The generated content/docs/references/ui/component.mdx:738 repeats the describe.
    • What objectui does at this pin: the range carries objectui#11068's build, 154075ab1.
      • The console changeset says "An object-grid honours keyboardNavigation".
      • The regenerated manifest publishes the input with its behaviour ("Defaults to on when the grid renders editable …").
      • This PR's own re-measures record it as new ObjectGrid.tsx code at this pin: the api-methods-batch-conformance.test.ts comment and component.zod.ts:6616.
    • On main (pin 89cad75d5570) the describe was true. At this head it is false, in text @objectstack/spec publishes beside a console that honours the key.
    • The record prescribes its own exit at :4386: "When the BUILD lands and the grid reads it, drop the marker in the same change". This bump is the objectstack change that lands that build.
    • This is a re-measure, not a ride-along. The record cites objectui read state that this bump moves. That is the same class as the four action:* records this PR already corrected ("Records whose claim moved, not only their numbers"). The os-dev-report does not name it.
    • Cure, inside the claimed surface:

② Semver level

  • @objectstack/spec patch: matches. It publishes describe and description text only, and the cure above stays patch.
  • @objectstack/console minor: matches. That is the bump script's auto level over a range that both widens and narrows. The launch-window no-major rule holds it at minor (check-changeset-no-major green), and each of the 43 entries carries its own BREAKING annotation beside the ADR-0087 marker.
  • objectui-lockstep.json, sdui.manifest.json and scripts/sdui-manifest.record.json ship in no package's files, so no changeset is owed for them.

Clause-②: no — right. No ObjectStack published accept set widens and no public surface is added. The spec moves text only. @objectstack/console lists only ./package.json in its exports, so its bundled manifest counts as shipped bytes under the exports-map rule. The console's widenings meet keys the spec rows already declare; its narrowings are objectui's own nodes, each marked BREAKING in a minor changeset. The absent arm declares no direction, and both gates that read it are green. The PR body and the spec changeset carry the same line. The claim pre-declared the path limb (packages/spec/src/** non-test). It hits, and this record is the at-tier review it owes.

③ Boundary flags

open_questions: none. The five out_of_scope_findings:

  1. Grouping-field switch leaves phantom "(empty)" groups on "Loading grid…" (class a, public door).
    • Not introduced by this hop: useServerGrouping.ts and useGroupedData.ts are byte-identical at both pins.
    • Non-blocking. The fix is objectui's.
    • ESCALATED to the seat: no filed carrier is cited. File it in objectui with the report's dedupe words.
  2. object-kanban conditionalFormatting still z.unknown().
  3. action:button/action:icon do not declare outcomeMessages.
    • Correctly left undeclared: declaring it widens a published row (Clause-②: yes, at least minor), which is outside a pin bump.
    • The rows record the forward truthfully.
    • ESCALATED: the carrier is "none", so the contract decision needs a card filed by the seat.
  4. conversions/registry.ts PAGE_HEADER_COMPONENT_TYPES docblock still calls page-header a legacy alias.
    • It is an internal constant, and the conversion is unaffected.
    • Non-blocking. It may ride the cure push as a one-line comment fix, or go to a carrier.
  5. record:details read mode draws a multi-line textarea on one line.
    • This is objectui display, outside objectui#11562's edit-mode scope.
    • Non-blocking.
    • ESCALATED to the seat for an objectui filing: the carrier is "none".

Deviations:

  • The browser run at pre-merge 87d7c51424 stands: the merged main commits touch no console asset.
  • The merge is sound: registry.ts's net diff is the six text hunks.
  • The A4 falsification (Node 22 sufficed) has no contract reach.
  • The shared-checkout detached-HEAD note is the seat's housekeeping.

Not flagged by the dev, raised here: the keyboardNavigation item in ①. It is the sole blocking item.

Implemented-by: claude/issue-21616-objectui-pin-bump
Reviewed-by: session_01HRYqpqGcWpJuJkDmbRF75w

VERDICT: FAIL


Generated by Claude Code

claude added 2 commits October 3, 2026 20:42
…te records and the outcomeMessages liveness row at objectui ab1879721

The console reader for each landed inside 89cad75d5570..ab1879721595
(objectui#11068, objectui#11227, objectui#11344), so the records that said
no renderer reads them are rewritten to the measured read at the pin, and
the keyboardNavigation describe drops its not-enforced marker.

Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w
Co-authored-by: Claude <noreply@anthropic.com>
…boardNavigation describe

Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 5eadf35375dc406b7c7e027d9310ac8e9e491794
Local-runs: none

① Derived judgments

Inputs.

  • Card chore(objectui): bump the console pin past objectui f624f278 (objectui#11553), carrying objectui#11544 and objectui#11562 too — #12438 B1 and #21464's columns hold wait on it #21616: its body, the claim (5971910197), both os-dev-reports (5972904218 and 5973614379) and the claim amendment (5973630403).

  • PR chore(objectui): bump the console pin to ab1879721595 (carries objectui f624f278, b0bf413c and ab187972) #21625: its body, the 25-file list and the net diff f97660cdd6...5eadf35375.

  • The 42 check-runs on the head: 39 success and 3 skipped. The skipped ones are Packed-tarball smoke (opt-in) and one duplicate run each of Check PR Size and Auto Label, whose other run is success. None failed.

    • Lint & Repo Gates was still running at the first read and concluded success on the re-read.
    • These conclusions are the gate verdicts. Nothing was built, run or re-run.
  • The FAIL record on b93b5fec00 (5973239645) was read as the finding this round answers. Each item below was judged again, not carried over.

  • Spec accept set: right. In the net diff, only these packages/spec/src/** lines change outside a docblock or a // comment:

    • two .describe() strings: ObjectGridPropsSchema.keyboardNavigation in ui/component.zod.ts and FormField.span in ui/view.zod.ts;
    • the text strings of six migration entries and their registry.ts mirror, which carry the pin sha and the re-taken corpus counts.

    No key, default, enum member, refusal or export moves. The three test files change in comments only. content/docs/references/ui/component.mdx and ui/view.mdx are the generated twins of the two describes.

  • The earlier blocking item, keyboardNavigation: cured, right. Each claim was checked against objectui at ab1879721595:

    • ObjectGrid.tsx:5458 passes schema.keyboardNavigation ?? inlineEditable to the data table.
    • At :1812, inlineEditable is (schema.editable ?? false) && objectInlineEditable.
    • In data-table.tsx, the default is false (:787) and role="grid" is set at :2235. At :2700 the table keeps one cell at tabIndex 0 and the rest at -1, and every cell gets 0 when the key is off. navigationTarget (:1964) and handleCellKeyDown (:1990) move the focus.
    • 154075ab1 (objectui#11068) is an ancestor of the new pin and not of 89cad75d5570.

    The cure is complete:

  • object-grid emptyState record: right.

    • ObjectGrid.tsx:6468-6469 resolves title and message through resolveInlineI18nLabel(…, displayLocale), and they are drawn at :6485-6486.
    • The commit that does this is 6158e4c93. Its message carries Fixes #11227, and it is in the range.
    • Only the docblock changes. No accept set moves.
  • ActionSchema.outcomeMessages liveness row, planned to live: right.

    • The reader exists at the pin. ActionRunner.ts:1497 composeSuccessMessage takes outcomeMessages[outcome], then successMessage, then the runner default, and fills ${result.*}. handlePostExecution calls it at :1535.
    • The renderers forward the key: action-button.tsx:261, action-icon.tsx:189, action-group.tsx:363 and action-menu.tsx:307. The reader commit c476be0e0 (objectui#11344) is in the range.
    • The row prescribed this exact exit: flip to live on the commit that cites the console reader at the pin, and drop authorWarn / authorHint in the same edit. Both are dropped.
    • The count shard moves from 45 live / 1 planned to 46 / 0, which is consistent. Spec property liveness is green.
    • Reach: liveness/ ships in @objectstack/spec's files, and no exports subpath reaches it. @objectstack/lint reads it from disk at run time (resolveLivenessDir), and that rule never fails a build. So the only effect is that one advisory liveness-planned-property warning stops. No accept set moves.
    • Scope: the file was outside the original claim surface. The same session's amendment (5973630403) added it before this review. I judge it in scope: it is a record whose claim this pin moves, the same class as keyboardNavigation. The cross-lane declaration the amendment cites (seat post [PM seat] domain:spec — 🟢 os-project-manager · session_01T9u38rswFp5Rw8DswRUReJ #6017) is outside this review's inputs and was not read.
  • Console surface through .objectui-sha: right. I re-diffed sdui.manifest.json against main. It has 107 components, none added or removed, and 14 with changed inputs, which matches the body.

    • Widenings.
      • object-grid gains description, emptyState and keyboardNavigation.
      • record:line_items gains ten keys. RecordLineItemsProps already declares each of them.
      • object-pivot gains drillDown. It has no ComponentPropsMap row: it is objectui's own registration, listed as minor in the console changeset.
    • Narrowings.
      • On objectui's grid, flex, stack and container nodes: grid drops smColumns / mdColumns / lgColumns / xlColumns, and value sets replace free numbers on grid columns, on grid / flex / stack gap and on container padding. None of these four nodes is a ComponentPropsMap row or a PageComponentType member.
      • page:header drops breadcrumb, which PageHeaderProps already tombstones with retiredKey.
    • Effect on the JSX gate. It falls back to the console copy that sdui-manifest.ts reads beside the console's package.json. That copy now accepts the keys the spec rows already declare. It narrows only on objectui's own nodes, and each narrowing is marked BREAKING in the console changeset.
    • Description-only changes: object-grid / object-kanban conditionalFormatting, action:button / action:icon successMessage, and fields on the three form blocks.
    • None of the four action:* input lists publishes outcomeMessages. That matches what the rows record.
  • ADR-0087 disposition on .changeset/console-ab1879721595.md: right. It carries one marker, not-required (no-migration-prescription). The first item shows that the diff adds, removes and renames no ObjectStack-authorable key. Check Changeset is green.

  • Lockstep and manifest records: right.

    • objectui-lockstep.json moves only rev, revDate and recordedAgainstPin. The grammar is unchanged, so no port is owed.
    • scripts/sdui-manifest.record.json moves only objectuiSha, modulesRoot, generatedAt and sha256.
    • Console Pin Gate and Lint & Repo Gates are green.
  • Not flagged by the dev; non-blocking. The header of ui/component-object-grid-declared-keys.pin.test.ts:4-6 still says the grid "is being built to read" keyboardNavigation. It is a test file, outside the spec's files, and carries no pin citation. The fix can ride a later push.

  • For landing, not a contract item. origin/main is now 5b5e83f446, 8 commits past the merge base. Three of those commits touch this PR's paths: ui/component.zod.ts, component.mdx and registry.ts. GitHub reports the PR mergeable: true, and the queue's gates judge the merged tree.

② Semver level

  • @objectstack/spec patch: matches. The package publishes describe text, docblocks, migration-entry text and ledger data. The ledger change only withdraws one advisory lint warning.
  • @objectstack/console minor: matches. minor is the bump script's automatic level for a range that both widens and narrows. The launch-window no-major rule holds it there, and Check Changeset is green. All 43 upstream breaking entries carry a BREAKING annotation.
  • No further changeset is owed.
    • packages/sdui-parser/objectui-lockstep.json is outside that package's files (dist, README.md, CHANGELOG.md).
    • sdui.manifest.json and its record are in no package's files.
    • The spec changeset covers the liveness change.

Clause-②: no — right.

  • Spec. It moves text only. The ledger flip changes what lint warns about, not what is accepted.
  • Console. Its exports publishes ./package.json alone, so its bundled manifest is shipped bytes, read by path. The manifest's widenings meet keys that spec rows already declare, which pulls back to the declared contract. object-pivot drillDown is objectui's own registration, in a minor changeset.
  • Where the line appears. The claim, the PR body and the spec changeset carry the same line.
  • The path limb. It hits on packages/spec/src/** non-test files, as the claim declared in advance. This record is the at-tier review that limb owes.

③ Boundary flags

open_questions: none in either report.

Deviations in the patch-round report:

  1. packages/spec/liveness/action.json and its count shard are outside the claim surface. Answered: the amendment (5973630403) adds them, and the first section judges the flip right and in scope. The revert route the report offers is not needed.
  2. origin/main was not merged. Answered: GitHub reports the PR mergeable. If the seat merges main before queueing, the head moves past 5eadf35375. This record then still governs only under the pure-regen exception, with a Regen-provenance: line on the PR. Otherwise a fresh record is owed.
  3. The worktree was re-created and removed. It has no contract reach.

out_of_scope_findings:

  1. The [spec(ui): the ComponentPropsMap rows still type renderer-read members as z.unknown() — navigation on object-map / object-gantt / object-tree and conditionalFormatting on object-kanban accept 42 — the family close-out after #21445 #21464] columns hold. At the pin, groupValueFormatter (ObjectGrid.tsx:2979) reads objectDefField?.options only (:3010): b0bf413 retired the column read.

  2. Four round-0 findings, carried unchanged. The card cites no carrier for any of them.

    • The grouping-field switch leaves phantom "(empty)" groups (class a, objectui).
    • action:button / action:icon do not declare outcomeMessages.
    • The PAGE_HEADER_COMPONENT_TYPES docblock is stale.
    • record:details read mode draws a multi-line textarea on one line.

    ESCALATED again, for the seat to file. The outcomeMessages row question is sharper now that the ActionSchema row is live. A registered action's outcome copy shows through action:bar, but the same key written on an action:button node is refused at save. Deciding that is a contract decision and needs its own card.

No blocking item remains.

Implemented-by: claude/issue-21616-objectui-pin-bump
Reviewed-by: session_01HRYqpqGcWpJuJkDmbRF75w

VERDICT: PASS


Generated by Claude Code

claude added 2 commits October 3, 2026 21:34
The os-regen driver kept this branch's side of the generated page in the
merge with origin/main 5b5e83f, which dropped main's object-metric
aggregate and trend rows (3f1bc81). gen:docs on the merged tree puts
them back. The page now differs from origin/main only by this branch's
keyboardNavigation row.

Claude-Session: https://claude.ai/code/session_01HRYqpqGcWpJuJkDmbRF75w
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 4fc15b7e67f4d4f25e3886058e3eb507b2947bbc
Local-runs: none

① Derived judgments

Inputs.

This round is a sync, not new work: right.

  • The head is 5eadf35375, then the merge 501902fb09 of origin/main 5b5e83f446, then 4fc15b7e67, which regenerates content/docs/references/ui/component.mdx.
  • The net diff's added and removed lines are identical, line for line, to those of f97660cdd6...5eadf35375, the diff the PASS judged. The PR's own contribution did not move.
  • Against the merge base the diff is these 25 paths and nothing else, so main's side survived the merge. registry.ts changes only in the six migration-text hunks, and main's entries are intact. component.mdx differs from main only by the keyboardNavigation row. 4fc15b7e67 restores main's object-metric aggregate / trend rows (3f1bc816a2), which the os-regen driver had dropped by keeping the branch side.
  • origin/main has since moved to 36e4647520, four commits later. None of them touches a path of this PR, and GitHub reports mergeable_state: clean.

Spec accept set: right. It does not move.

  • Twelve non-test packages/spec/src/** files change. Outside a docblock, a // comment or a migration-entry string, only two lines change, both .describe() text: ObjectGridPropsSchema.keyboardNavigation in ui/component.zod.ts and FormField.span in ui/view.zod.ts. No key, default, enum member, refusal or export moves.
  • The three test files change in comments only. component.mdx and view.mdx are the generated twins of the two describes.

Re-measured records, each checked against objectui at ab1879721595: right.

  • keyboardNavigation.
    • ObjectGrid.tsx:5458 hands schema.keyboardNavigation ?? inlineEditable to the table, and :1812 defines inlineEditable as (schema.editable ?? false) && objectInlineEditable.
    • data-table.tsx defaults the key to false (:787) and sets role="grid" (:2235). It keeps one roving tabIndex over the data cells (:2700), and navigationTarget (:1964) moves it with the arrow keys, Home / End and Ctrl+Home / Ctrl+End.
    • 154075ab1 is in 89cad75d5570..ab1879721595.
    • The new describe states exactly this.
  • emptyState. ObjectGrid.tsx:6468-6469 resolves title and message with resolveInlineI18nLabel against the display locale, and draws them at :6485-6486. 6158e4c93 is in the range.
  • The outcomeMessages liveness row, planned to live.
    • ActionRunner.ts composeSuccessMessage (:1497) picks the own-property outcomeMessages[outcome], then successMessage, then the runner default, and fills ${result.*}. handlePostExecution calls it.
    • All four renderers forward the key: action-button.tsx:261, action-icon.tsx:189, action-group.tsx:363 and action-menu.tsx:307. c476be0e0 is in the range.
    • authorWarn and authorHint are dropped in the same edit, as the row prescribed. The count shard reads 46 live and 0 planned, and Spec property liveness is green.
  • Anchors spot-read, every one as cited:
    • action-button.tsx: :215, :318, :346, :382 and :394, the comment at :422-426 that keeps the input unpublished, and inputs at :427-572.
    • ObjectView.tsx:2299 case 'map':, objectql.zod.ts:2370 and :1419, and ListView.tsx:85 and :146.
    • WIDE_FIELD_TYPES is unchanged. json now maps to field:object, which is not a wide type.
    • The ObjectGrid.tsx:4810-4837 selection block still hashes to c88443302d40….
    • The corpus is 10267 files, with 16377 objectstack hits and 6665 @objectstack/spec hits, as the six migration texts state.

Console surface through .objectui-sha: right.

  • I re-diffed sdui.manifest.json against main. It has 107 components, none added or removed, and 14 with changed inputs, as the body says.
  • Widenings.
    • object-grid gains description, emptyState and keyboardNavigation, and record:line_items gains ten keys. The spec rows already declare each of them, and RecordLineItemsProps declares all ten.
    • object-pivot gains drillDown. It is objectui's own registration and has no ComponentPropsMap row.
  • Narrowings.
    • grid, flex, stack and container narrow. None of these four is a PageComponentType member or a ComponentPropsMap row.
    • page:header drops breadcrumb, which PageHeaderProps already tombstones with retiredKey.
    • Every example value sits inside the new sets:
      • the metadata grid nodes use columns 3 and 4 with gap 4;
      • the JSX grid uses columns 3 and 4 with gap 5;
      • every JSX gap is 1 to 6 or 8, inside all three gap sets;
      • no example sets a node padding;
      • the numeric gap and padding values above 8 sit in CSS style objects, not on node inputs.
  • Description-only changes: conditionalFormatting on the grid and kanban, successMessage on the button and icon, and fields on the three form blocks.
  • Behaviour carried, not a contract item. objectui#11344 drops the server's message from the success toast. The spec never declared that rung, and its successMessage and outcomeMessages describes already state the new order (ruling A on cloud#2315). No example action handler returns a message. Non-blocking.
  • Docs drift advisory. Both hand-written pages it lists name symbols that change here only in docblock or describe text. No hand-written page outside releases and references names a retired objectui key or a layout value outside the new sets.

ADR-0087 disposition on .changeset/console-ab1879721595.md: right.

  • It carries one marker, not-required (no-migration-prescription). The diff adds, removes and renames no ObjectStack-authorable key.
  • Its ObjectStack-facing claims hold:
    • none of the retired node keys is a PageComponentType member or a ComponentPropsMap key;
    • DashboardWidgetSchema.dataset is required (ui/dashboard.zod.ts:1270);
    • percentScaleOf is the spec's own export (data/percent-scale.ts:61);
    • deleteBehavior is the lookup field's key.
  • Check Changeset is green.

Lockstep and manifest records: right.

  • objectui-lockstep.json moves only rev, revDate and recordedAgainstPin. The grammar is unchanged, so no port is owed.
  • sdui-manifest.record.json moves only objectuiSha, modulesRoot, generatedAt and sha256.
  • Console Pin Gate, Lint & Repo Gates and Type Check · source gates (which runs check:objectui-pin-citations) are green.

Not flagged by the dev; non-blocking.

  • New with this round's merge. Main's 3f1bc816a2 (spec(ui): the ComponentPropsMap rows still type renderer-read members as z.unknown() — navigation on object-map / object-gantt / object-tree and conditionalFormatting on object-kanban accept 42 — the family close-out after #21445 #21464 stage 4) brings in object-metric records dated "at the .objectui-sha pin 89cad75d55". At this head's pin their line numbers have moved.
    • aggregate, trend and compareTo: the reads hold in substance.
      • In ObjectMetricWidget.tsx, :199 types groupBy as the chart aggregate's, :354 is answersInFieldUnit, :481 is the '_all' floor and :689 is derivedTrend ?? trend.
      • MetricWidget.tsx:262-265 is the trend type, and compare-to.ts is byte-identical.
    • The HELD drillDown docblock says report "is drawn as a report body when it carries columns or objectName".
      • objectui#11506 retired that object-bound form at ab1879721595: DrillDownDrawer.tsx:115 draws a report only when it is dataset-bound (isDatasetBoundReport).
      • The hold's conclusion, the fork with ChartDrillDownSchema, still stands: the tile still draws a report and still never reads drillDown.filter. Its describe stays true.
    • This is the columns hold's class. The record is dated and not an asserting citation (the citation gate is green), and its exit is a ruling into a narrowing, which a pin bump must not make. See ③.
  • ui/component-object-grid-declared-keys.pin.test.ts:4-6 still says the grid "is being built to read" keyboardNavigation. It is a test file and does not ship. The fix can ride any later push.

② Semver level

  • @objectstack/spec patch: matches. The package publishes describe text, docblocks in its shipped src/**/*.zod.ts, migration-entry text and one row in its shipped liveness/. The ledger flip withdraws one advisory lint warning. Nothing is accepted or refused differently.
  • @objectstack/console minor: matches. minor is the bump script's automatic level for a range that both widens and narrows, and the launch-window no-major rule holds it there. Each of the 43 upstream breaking entries is marked BREAKING.
  • No further changeset is owed.
    • packages/sdui-parser/objectui-lockstep.json is outside that package's files (dist, README.md, CHANGELOG.md).
    • The root sdui.manifest.json and its record are in no package's files. The console's dist copy rides the console changeset.
    • The sync round publishes nothing that the two changesets do not already state.

Clause-②: no — right.

  • Spec. It moves text only. The ledger flip changes what lint warns about, not what is accepted.
  • Console. Its exports publishes ./package.json alone, and its dist manifest is shipped bytes the CLI's JSX gate falls back to.
    • The manifest's widenings meet keys the spec rows already declare.
    • object-pivot drillDown is objectui's own registration. The spec reaches that type only through the open string arm of PageComponentSchema.type.
    • Read even as a widening, it would change nothing here: the console changeset is already minor, and this record is the at-tier review.
  • Where the line appears. The claim, the PR body and the spec changeset carry the same line.
  • The path limb. It hits on packages/spec/src/** non-test files, as the claim declared in advance. This record is the review that limb owes on this head.

③ Boundary flags

open_questions: none in either report.

Deviations:

  1. Patch round: packages/spec/liveness/action.json and its count shard are outside the original claim surface. Answered: the amendment (5973630403) adds them, and ① judges the flip right. The revert route the report offers is not needed.
  2. Sync round: the os-regen driver kept the branch side of component.mdx and dropped main's rows. This is stated in the PR body; there is no os-dev-report on the card for this round. 4fc15b7e67 regenerated the page.
    • Answered: the net diff shows main's rows intact, with only the keyboardNavigation row added.
    • The head moved past the PASS head by a commit that is not a merge, so a fresh record was owed. This is it.
  3. The browser run was taken at pre-merge 87d7c51424. It stands: the merges since carry no console asset.
  4. The A4 falsification and the housekeeping. The A4 falsification (Node 22 sufficed), the shared-checkout note and the worktree notes have no contract reach.

The domain:spec pointer (5973713695). #20471 is not carried: check-objectui-pin-citations.ts is not among the 25 paths. #20471 would quote the first lines of the anchors in the six ComponentPropsMap rows and raise ASSERTED_ANCHOR_FLOOR. Answered: right for this card, whose scope bars ride-alongs beyond the bump's own gates. #20471 re-holds on its own Restart-when: for the next bump. Non-blocking.

out_of_scope_findings:

  1. The [spec(ui): the ComponentPropsMap rows still type renderer-read members as z.unknown() — navigation on object-map / object-gantt / object-tree and conditionalFormatting on object-kanban accept 42 — the family close-out after #21445 #21464] columns hold. At this pin groupValueFormatter reads the object field's options only (b0bf413). The card routes the hold to spec(ui): the ComponentPropsMap rows still type renderer-read members as z.unknown() — navigation on object-map / object-gantt / object-tree and conditionalFormatting on object-kanban accept 42 — the family close-out after #21445 #21464's seat, and its exit narrows an accept set. Non-blocking.

  2. New, the same class: the object-metric drillDown hold merged from 3f1bc816a2 (① above). Non-blocking.

  3. Carried from round 0. The card cites no carrier for any of these.

    • The grouping-field switch leaves phantom "(empty)" groups (class a, objectui).
    • action:button / action:icon do not declare outcomeMessages. Deciding that is a contract decision for its own card, and the question is sharper now that the ActionSchema row is live.
    • record:details read mode draws a multi-line textarea on one line (objectui).

    ESCALATED again, for the seat to file. A fourth round-0 finding, the stale PAGE_HEADER_COMPONENT_TYPES docblock, is non-blocking: it is an internal, unexported constant in conversions/registry.ts.

  4. object-kanban conditionalFormatting is still z.unknown(). It is correctly routed to spec(ui): the ComponentPropsMap rows still type renderer-read members as z.unknown() — navigation on object-map / object-gantt / object-tree and conditionalFormatting on object-kanban accept 42 — the family close-out after #21445 #21464, and objectui's resolver still paints stored native rules. Non-blocking.

No blocking item remains.

Implemented-by: claude/issue-21616-objectui-pin-bump
Reviewed-by: session_01HRYqpqGcWpJuJkDmbRF75w

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

✅ ACCEPT — PR #21625 (#21616), head 4fc15b7e67f4d4f25e3886058e3eb507b2947bbc · domain:devx seat 2 (session_01HRYqpqGcWpJuJkDmbRF75w) · 2026-10-03T22:26Z

Reviewed against GitHub and the diff, not the reports (os-dev-reports 5972904218, 5973614379, 5974033523).

  • CI on this head: 42 check runs, 39 success and 3 skipped; Lint & Repo Gates and TypeScript Type Check are success. mergeable_state is clean. origin/main moved 4 commits after the sync, and none touches a path of this PR.
  • Contract record: 5974121906, PASS at this exact head, with Served-tier: CONTRACT_REVIEW_TIER and Local-runs: none.
    • It owes because the clause-② path limb hits packages/spec/src/** non-test. Clause-②: no is judged right.
    • History: FAIL 5973239645 on b93b5fec00, fixed in the patch round; PASS 5973690821 on 5eadf35375. The pre-enqueue sync moved the head, and the carry test refused because component.zod.ts and registry.ts moved under main. So a fresh record was taken.
  • Own contribution across the sync: I compared it myself. For all 25 paths, the -U0 added/removed lines of f97660cdd6..5eadf35375 and 5b5e83f446..4fc15b7e67 are identical, and the file lists are equal.
  • Route: check-governed-merges.mjs --pr 21625 on the final 25 paths: NOT GOVERNED. 1,306 changed lines.
  • Scope: no content/docs/releases/** path. The changesets are @objectstack/console minor and @objectstack/spec patch; there is no major.
  • Closing line: Fixes #21616 only. I scanned the whole body; no closing keyword sits next to any other card number.
  • Docs drift bot: it names analytics.mdx (DatasetMeasureSchema) and layout-dsl.mdx (ComponentPropsMap). Both symbols change in comments only, with no accept-set move, so neither page is falsified.

Out-of-scope findings, one line each:

Landing now: pr_ready and automerge_enable through the relay.


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 3, 2026 22:27
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 3, 2026 22:27
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 3, 2026
Merged via the queue into main with commit 1cbe165 Oct 3, 2026
44 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-21616-objectui-pin-bump branch October 3, 2026 23:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants