Skip to content

chore(objectui): bump the console pin to 20c6d351ad74 (carries objectui#12056) - #22592

Merged
objectstack-fleet[bot] merged 9 commits into
mainfrom
claude/issue-22476-console-pin-latest
Oct 10, 2026
Merged

objectstack-fleet[bot] merged 9 commits into
mainfrom
claude/issue-22476-console-pin-latest

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #22476
Clause-②: no

This moves the bundled Console's objectui pin from 47b1f0bb7174 (PR #22496) to 20c6d351ad74d2b14a93becdc134d51b91b2d2e6, which was objectui main when this bump was cut (2026-10-10T00:23:41Z). The maintainer ordered it, in the domain:devx seat 1's session: 「22476 插队, objectui 更新到最新版。」 and 「22476 objectui 更新到当前的最新版」. The new pin contains objectui 2a48bd408dab, the merge of objectstack-ai/objectui#12064, which carries objectstack-ai/objectui#12056's change: Studio's page designer writes element:repeater's object and limit into the node-level dataSource. Ruling 6051498447 on #11509 orders the work this way ("objectui first (…, the designer writes the node-level dataSource, …), and the spec retirement ships with the pin bump that carries it"). The retirement itself is PR #22421 (#11509), not this PR: no key retires here, no schema shape changes, and no conversion or lint rule changes.

The bump follows the repo's own procedure, as PR #22412 did: scripts/bump-objectui.sh, then pnpm objectui:build and node scripts/gen-sdui-manifest-node.mjs, then the gates they derive. It adds no step to that procedure.

This is not a release act. The Version Packages PR is untouched, and this diff edits neither packages/console/CHANGELOG.md nor packages/console/package.json. The console's release input is the new .changeset/console-20c6d351ad74.md.

Range and acceptance

The range's notable commits (the two breaking plugin-list changes first)

  1. 3fd862510 (objectui#6152 round 14), breaking. The list renderers stop reading the list-view keys every door already refuses: the pre-objectui#2231 aliases (kanban.groupField / cardFields, gallery.imageField, timeline.dateField, calendar.dateField as a timeline axis), calendar.defaultView, tree.titleField, options.grid, and any undeclared key of a per-kind block. ListView's projection collectors stop asking the server for the fields those keys named.
  2. 025341692 (objectui#6152 round 15), breaking. A chart list view binds only an ADR-0021 dataset. The legacy inline axes and their name / value floors are retired on every route. A chart view that names no dataset now shows ObjectChart's "Chart category axis required" refusal. (On main, feat(spec)!: a type: 'chart' list view whose effective binding names no dataset is refused at every list-view door #22528 refuses such a view at every list-view door.)
  3. 3c3115e38 (objectui#5144), annotated breaking: list views read userActions.editInline with the spec's own default, false, folding a boolean inlineEdit into it. A grid that declares neither key no longer offers the inline-edit toggle, and the console toggle no longer writes to the view.
  4. c7b30bd66 (objectui#12063): UnifiedViewConfig.chart retires in @object-ui/types (types only).
  5. 8a55f0ccd (objectui#12059): the runtime sidebar menu is not user-reorderable; the pinned section keeps the user's order.
  6. 2a48bd408 (objectui#12056): the page designer writes the repeater's query into dataSource, and the repeater arm takes the spec gate's object waiver.
  7. Further annotated breaking entries, each objectui's own surface: 7282c6a51 (objectui#12055, the upload adapter no longer sends path as the storage scope), e4c0b5432 (objectui#5250, objectui validate / check judge through the strict face), 1f1c4b526 and d32869883 (objectui#6349 batches 4 and 6, type renames).
  8. Console behaviour: e97a0e2d1 (a declared type: 'flow' action starts its flow through POST /api/v1/actions/:object/:action, a route this repo serves), 9b6c19ef6 (the Attachments panel offers Upload and delete only with the sys_attachment grant), 2571a3eb9 (a caller without Studio access is told so), 5275d1f37 (search on the Studio landing), d99b731f0 / a368ccb1a / 20c6d351a (approval requests through the standard provider: 'api' door, a record card and the decision panel), e391f8768 (an activity row names its actor from actor_id), acc432806 (plugin-view's gallery reads its nested block), d03b0227c (ObjectChart refuses before it fetches).
  9. Types and docs only: b4e0787d5, c0c0a0d56 (objectui#6349 batches 5 and 7), 55e90fd38, 972e56659.

The bump's digest: 33 releasing changesets across 24 non-merge commits, 0 release-nothing, 1 commit with no changeset (972e56659, docs). None declares major; six carry the author's breaking annotation. The highest declared level is minor, so the console changeset is minor. Its adr-0087: TODO placeholder is answered not-required (no-migration-prescription), each of the six annotated entries and the three ! subjects named in it.

objectstack-side metadata the breaking commits could hit

Measured on this tree (git grep over examples/**, packages/** without tests, fixtures and packages/spec, content/docs/** without references/ and releases/, and skills/**):

  • Retired list-view keys: no list view in this repo authors one. Every non-grid list view writes only declared block keys: the showcase task views (board, cards, calendar, timeline, gantt, map, chart), the showcase project views (by_status, budget_chart), the showcase and platform org_chart tree views (labelField, never titleField), and the CRM activity calendar and lead / opportunity kanban views.
  • The keyword hits that are NOT list views, named so they are not re-chased: content/docs/protocol/objectui/layout-dsl.mdx:815-816 (cardTitle / cardFields on an object-kanban component node), content/docs/ui/pages.mdx:157-158 (categoryField / valueField on a page chart component), content/docs/protocol/objectui/concept.mdx:198 (a dashboard widget), and object-level imageField / flow dateField keys.
  • Chart list views: the two in this repo, the showcase task view chart and project view budget_chart, both bind a dataset. Both render at the new pin (below).
  • Inline edit: the showcase task view grid declares inlineEdit: true and keeps its toggle. Grids that declare neither key lose the toggle. That is the spec's declared default (editInline: z.boolean().default(false)), not a break.

So the rendered lists do not change for any metadata this repo ships.

Console build and browser smoke

  • Builds (under the verify lock): the dependency closure turbo run build --concurrency=2 --filter=@objectstack/client --filter=@objectstack/spec --filter=@objectstack/sdui-parser (34 tasks, exit 0). Then pnpm objectui:build (exit 0, lock held 7m13s), with OBJECTUI_ROOT at a full scratch clone of objectui, so no worktree was registered in the sibling checkout. Its log reports the bundle canary import/jobs present, exactly one zod version literal, "Console bundle carries THIS tree's @objectstack/spec, and only it", and "@objectstack/console dist ready (64164 KB) from objectui@20c6d351ad74".
  • Smoke: Chromium (/opt/pw-browsers/chromium, headless, 1440x900) against pnpm dev -- --fresh -p 38917 on this branch, serving that dist (check:console-sha green at boot).
    • Signed out: /_console/ lands on the sign-in page. A deep link to a showcase list redirects to /_console/login?redirect=…. The only API reads are runtime/config, auth/me/localization, auth/get-session (the expected 401), auth/config and auth/bootstrap-status. The sign-in page reads no /api/v1/i18n.
    • Signed in (seeded admin): the home page lists Showcase and Setup.
    • Sidebar: the Showcase sidebar draws the authored menu (Capability Map, Page Authoring, then the Workspace, Data Model, Data Slices, Analytics and Authoring groups). Every entry offers a Pin button, and none is draggable. Pinning "Capability Map" puts it in a new pinned section ("Favorites") at the top.
    • Tasks list views: All Tasks (grid, 10 rows), Task List, Grid, Board (Kanban, lanes with their summarizeField totals), Cards (Gallery), Calendar (October 2026), Activity Timeline, Schedule (Gantt) and Hours by Status (Chart) all render. The chart draws its bars from the showcase_task_metrics dataset, with no refusal.
    • Work Locations (Map) lists its markers. Its base map fails to load because this sandbox blocks demotiles.maplibre.org: an environment limit, not this bump.
    • Projects and Business Units: Budget by Account (the dataset chart) and the Organization Chart tree render.
    • Inline edit: the task view grid offers "Edit records inline (click a cell to edit)"; All Tasks does not.
    • Record and form: the "Warehouse schema" record page renders. "New" opens the Create Task form with its fields.
    • Studio's landing renders for the admin.
    • The only console errors seen were favicon.ico 404 and the signed-out session 401.

What changed here

file written by gate that required it
.objectui-sha OBJECTUI_ROOT=… scripts/bump-objectui.sh 20c6d351ad74… --no-commit Console Pin Gate builds what it names
.changeset/console-20c6d351ad74.md the same run (the digest); the only later edit is the ADR-0087 answer check-adr-0087-registration, check:objectui-changeset
scripts/sdui-manifest.record.json node scripts/gen-sdui-manifest-node.mjs over .cache/objectui-20c6d351ad74 check-sdui-manifest.mjs
packages/sdui-parser/objectui-lockstep.json node scripts/check-sdui-lockstep.mjs --update, OBJECTUI_ROOT at the same built tree check:sdui-lockstep
55 asserting citations in 15 files under packages/spec/src (the generated migrations/registry.ts among them), plus three quoted anchors of the dated view.zod.ts map record re-measured by hand (below); registry.ts by gen:migration-registry check:objectui-pin-citations (and --verify-anchors)
.changeset/objectui-pin-citations-20c6d351ad74.md hand-written, @objectstack/spec patch Check Changeset (the shipped describes name the pin)
content/docs/references/ui/view.mdx gen:docs check:docs
  • sdui.manifest.json is byte-identical across the range: the generator rewrote it to the same bytes (sha256 097ae3cbcf95…, 107 components), so only its record moves. objectui's workspace version stays 17.7.0.
  • The lockstep records 214 grammar lines (blob 0131f27cf86d), 25 diagnostic codes and containment predicate 76c18fb95d1f, all unchanged. objectui's packages/sdui-parser is untouched by the range, so no port is owed.
  • Diff size: 21 files, +476 / -111 against main, generated files included.

How the citations were re-measured

  • Method. Each asserting record's cited objectui files were resolved at 47b1f0bb7174 and intersected with the range's 320 changed paths. Every anchor in a changed file was mapped through git diff -U0 47b1f0bb7174 20c6d351ad74 and its text compared at both pins. A record whose cited files are all byte-identical (git diff --quiet) gains that sentence and no re-pointing.
  • Changed cited files: ListView.tsx, ObjectTimeline.tsx, plugin-view's ObjectView.tsx, objectql.ts, objectql.zod.ts, KanbanImpl.tsx, plugin-grid/src/index.tsx, ActionRunner.ts, data-objectstack/src/index.ts, previews/block-config.ts, and the en / zh / de packs (whose calendar.configRequired strings did not change).
  • Re-pointed, each byte-identical:
    • KanbanImpl.tsx :668 / :681 -> :671 / :684;
    • ActionRunner.composeSuccessMessage 1504 -> 1498;
    • the object-timeline read points, :306-:565 each by +1 (:30 and :591 on held);
    • data-objectstack's translateFilterArray arm 5042-5053 -> 5048-5059;
    • resolveListMapConfig 147 -> 200, case 'map': in plugin-view's ObjectView.tsx 2340 -> 2461, ObjectMapConfigSchema 2513 -> 2523 (still .strict());
    • the case 'timeline' / case 'map' arms moved by 50 / 52.
  • Read around the same read and said so in the hop sentence:
    • the case 'calendar' and case 'gantt' arms: their raw spreads and the calendar's defaultView lift retired; the date bindings stay conditional, with no floor;
    • ObjectTimeline.tsx's start-date chain :589-591: lost the nested timeline.dateField rung, still ends without a literal rung;
    • resolveTimelineDateBinding 634 -> 686: its alias rung retired;
    • previews/block-config.ts: the two inspectors re-read, 311-345 -> 311-351, with the repeater's rows now writing dataSource.
  • A read point that died, reported and not rewritten: the OBJECT_TREE_FLAT_CONFIG_GUIDANCE docblock in ui/component.zod.ts keeps titleField in the flat tree key set because ListView.tsx:3927 resolved treeCfg.titleField into labelField. objectui 3fd862510 removed that rung; the arm now emits labelField: treeCfg.labelField || 'name' (:3986). The record's hop sentence says so, and its paragraph and the key set are left as they are: changing the key set is a schema decision this re-read does not make. The guidance still prescribes the right key (tree.labelField) for a flat titleField, so nothing an author sees is wrong.
  • Corpus counts. The six migration entries' counts were re-taken with git grep -o -F. That method first reproduced every 47b1f0bb7174 number: 8281 files, objectstack 17980, @objectstack/spec 7523, useState 2630, timeout 1674, RuntimeConfig 337, resourceLimits 2, window 4449, period 249, interval 213, metrics 455, Span 517, SpanSchema 57, TTL 184 and tenant 1338.
    • At the new pin they read 8351 files, objectstack 18047, @objectstack/spec 7545, useState 2630, timeout 1694, RuntimeConfig 337, resourceLimits 2 (the same two packages/app-shell prose hits), window 4470, period 249, interval 213, metrics 456, Span 517, SpanSchema 57, TTL 184 and tenant 1340.
    • All 97 zero-tokens (the exports of plugin-lifecycle-advanced.zod.ts, tracing.zod.ts and metrics.zod.ts, plus every named key) still read zero.

For the contract review: changed lines in packages/spec/src/** that are neither a comment nor a string fragment

There are none. Measured mechanically: each changed file was parsed with the TypeScript compiler at main and at the head, JSDoc dropped, comments skipped, and every string, template and regular-expression literal replaced by one placeholder token. The remaining token sequences are identical in 12 of the 15 files. The other three:

  • 18.system-metrics-jsdoc-durations-unit-in-key.ts and 18.system-tracing-otel-exporter-durations-unit-in-key.ts each gain one + joining one new string fragment into their reason string.
  • migrations/registry.ts mirrors both.

No identifier, key, value or export moves. The one shipped describe that changes is FormField.span's, and only its sha moves.

Gates and tests

Everything below ran at head 0b3e83ce5, the merge of origin/main 96e4be482, after a full workspace build at that head (turbo run build --concurrency=2, 72 tasks, exit 0). Exit codes were captured before any pipe.

  • Derived gates. node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 127 commands from 21 changed paths against merge base 96e4be482. All 127 ran and exited 0. The --ran reconciliation reads "127 derived famil(ies) accounted for — 127 run, 0 NOT-MEASURED (a DERIVED zero — all 127 recorded an exit code and none of them is 3)".
  • Verdict lines of the gates this bump exists for:
    • check:objectui-pin-citations: "55 asserting objectui pin citation(s) match .objectui-sha (20c6d351a), 145 historical citation(s) recorded and not checked, across 1946 spec source(s)." With --verify-anchors (OBJECTUI_ROOT at a full objectui clone): "13 anchor content assertion(s) verified against objectui at 20c6d351a".
    • check:sdui-lockstep: "OK — this copy is byte-identical to objectui@20c6d351ad74 … over 214 grammar line(s) [blob 0131f27cf86d], agrees on all 25 diagnostic code(s) and on the not-a-container predicate".
    • check-sdui-manifest.mjs: "present, intact (sha256 097ae3cbcf95…, 107 components) and recorded at the live objectui pin 20c6d351ad74…".
    • check:console-sha: "Console dist matches the objectui pin (objectui@20c6d351ad74)". check:console-injection: "the dist carries this tree's copy, and not the published one".
    • check-adr-0087-registration --base origin/main: "1 declared-breaking changeset(s), each carrying an ADR-0087 disposition". check-changeset-no-major --base origin/main: "This diff introduces no major bump".
    • check:generated: "All 15 generated artifacts are up to date". check:migration-registry: "src/migrations/registry.ts is current (412 semantic, 247 retired-key, 222 retired-def)". check:api-surface: "public API surface + factory signatures unchanged". check:nul-bytes: OK, no raw control bytes.
  • Tests.
    • @objectstack/spec vitest (its test script, --project local): 638 files, 19014 passed, 1 todo. @objectstack/spec typecheck, the scripts and test-layer checks included: exit 0.
    • @objectstack/sdui-parser: 14 files, 225 passed; typecheck exit 0.
    • @objectstack/lint validate-jsx-pages.production-witness.test.ts: 5 passed. @objectstack/metadata-protocol protocol.runtime-authoring-gate.test.ts: 133 passed.
    • @objectstack/cli, unit tier (sdui-manifest, console.sha-drift, validate-build-gate-parity, console-resolve): 4 files, 108 passed. The integration tier is declared to CI: this diff touches no integration-tier file and no spawn entry.
  • Lint, narrowed and proven. ESLint (--no-inline-config) over the 15 changed TS files under packages/spec/src: 0 errors, 0 warnings, 15 files by the --format json count. The population is the eslint.config.mjs block that lints every ts file (line 971). The config never enables type-aware linting (line 328), so this diff cannot move the verdict on any file it does not touch. The repo-wide pnpm lint is CI's run.
  • main after the last merge. origin/main gained 25be87612 (fix(plugin-security): explain composes a lifecycle verb's row-level security as the door does #22570, plugin-security only) after 0b3e83ce5. It touches no file of this diff, so there is no further merge here; CI and the merge queue judge the merge.

Acceptance notes

  • functional-completeness.ts, the kanban and tree rows. They carry no asserting citation, and they still describe groupByField || groupField || detectStatusField(objectDef) and labelField || titleField || 'name', with a sentence saying both were re-read at the pin. At this pin ListView reads neither alias (3fd862510). The view/layout-without-binding message those rows feed is still true: with no block, the board detects a status field and the tree labels by name. Only the docblock's rung list is stale. Noted here only, carrier: none.
  • The OBJECT_TREE_FLAT_CONFIG_GUIDANCE rationale (above): stale rationale, correct prescription. Carrier: none.
  • objectui main moved to d758f2f20dd1 after the cut. The next bump picks it up.
  • The shallow checkout: check-plugin-teardown-shape.mjs --self-test first exited 3 because this checkout could not read its pinned fixture commit 621a48760788. That commit was fetched (git fetch --depth=1 origin 621a487…, objects only) and the self-test re-ran to exit 0. A prerequisite, not a red.
  • Writes. This PR was opened through scripts/pm/fleet-write/dispatch.mjs (pr_create, draft), and its assignee set through scripts/pm/label-write.mjs. No label was written, skip-changeset included: the path and size labels come from pr-automation.yml. No MCP write was used.

Generated by Claude Code

…ip: scripts/bump-objectui.sh output)

Claude-Session: https://claude.ai/code/session_01LYXc6ckoWuZyVZpWYizdMh
Co-authored-by: Claude <noreply@anthropic.com>
…0c6d351ad74; re-measure the first pin citations (wip)

Claude-Session: https://claude.ai/code/session_01LYXc6ckoWuZyVZpWYizdMh
Co-authored-by: Claude <noreply@anthropic.com>
…the spec pin-citation changeset

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

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))

⛔ 6 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/v17/17-7.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 — 140 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 5495331fccb4dc1ff884c485ea66e682eae61402 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 9ae75989da7b0f8c8ad4b6d5ceeb7f483a4f4748 — the merge of head 0b3e83ce57bfe9617addf02930965fbf86d14997 into base 5495331fccb4dc1ff884c485ea66e682eae61402, 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 9ae75989da7b0f8c8ad4b6d5ceeb7f483a4f4748 && git checkout 9ae75989da7b0f8c8ad4b6d5ceeb7f483a4f4748
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 5495331fccb4dc1ff884c485ea66e682eae61402 0b3e83ce57bfe9617addf02930965fbf86d14997 && git checkout -B drift-repro 5495331fccb4dc1ff884c485ea66e682eae61402 && git merge --no-ff 0b3e83ce57bfe9617addf02930965fbf86d14997

node scripts/docs-audit/affected-docs.mjs --json 5495331fccb4dc1ff884c485ea66e682eae61402

⚠️ 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 5495331fccb4dc1ff884c485ea66e682eae61402 → 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: 0b3e83ce57bfe9617addf02930965fbf86d14997
Local-runs: none

PR #22592 for card #22476, judged on the head's net diff against its merge base with main (96e4be482): 21 files, +476/−111. Inputs: the card body and its eleven comments (the triage grade 6080566395, the claims 6084200234 / 6091513811, both releases, the unblock 6091587399, the os-dev report 6092996725, the seat's ACCEPT 6093019515), the PR body and file list, the diff, and the check-runs on the head. Readings taken in this act, each a read and none a build, test or gate run: the diff over packages/spec/src/** non-test files was stripped mechanically of comment lines and string-fragment lines; the objectui files the records cite were read at 20c6d351ad74 through REST; the objectui tree at that commit was fetched as a tarball and the six migration entries' corpus tokens re-counted over it; the three objectui compares were re-read.

① Derived judgments

Every accept-set and public-surface change the diff implies, each judged:

  1. .objectui-sha 47b1f0bb7174 → 20c6d351ad74d2b14a93becdc134d51b91b2d2e6 — the bundled console (@objectstack/console dist) moves by 24 objectui commits. Right. Forward only: the compares re-read in this act are 47b1f0bb7174...20c6d351ad74 ahead 24 / behind 0, 2a48bd408dab...20c6d351ad74 ahead 7 / behind 0 (the card's acceptance: objectui#12056's fix is inside the pin), 8a55f0ccda...20c6d351ad74 ahead 5 / behind 0 (the platform-checklist: retire the drag-reorder step and acceptance clause of platform-core.shell-nav-personalization — end users do not reorder the runtime sidebar (maintainer ruling 2026-10-09) #22487 edge, cleared in 6086630440 before this bump was cut). Console Pin Gate on this head reads success, so the pin builds against this tree. The spec write door already refuses every list-view key the two breaking plugin-list commits (3fd862510, 025341692) stop reading, and 3c3115e38 follows the spec's declared editInline default — the console catches up to accept-set decisions the spec published earlier; this diff publishes no new narrowing.
  2. ui/view.zod.ts FormField.span .describe(...) — the one non-comment, non-string-fragment token change in any packages/spec/src/** non-test file (the mechanical strip leaves exactly this line). Right. Only the pin sha inside the text moves (47b1f0bb7174 → 20c6d351ad74); the claim it makes (which widget types resolve to the full column count, one clamped col-span class per tier) is unchanged, and the docblock above it records the three objectui files it rests on as byte-identical across the hop. It reaches the published JSON-schema description and the generated content/docs/references/ui/view.mdx, which the diff regenerates in step. The enum, its default and the key are untouched: no accept-set change.
  3. Six migrations/entries/semantic/18.*-unit-in-key.ts reason strings, mirrored by the generated migrations/registry.ts — exported values that ship in @objectstack/spec. Right, meaning unchanged: each entry still asserts the same thing (the pinned objectui checkout spells the retired key or def zero times) at the new pin, with the prior pin's reading appended to its chain, as every earlier bump did. The two entries that gain a + (metrics, tracing) gain a string fragment and nothing else. Re-counted in this act over the tree at 20c6d351ad74: 8351 files; resourceLimits 2, both prose in packages/app-shell (runtime-config.ts:272, __tests__/spec-symbol-parity.test.ts:188) as the runtime-config entry says; RuntimeConfig 337, Span 517, SpanSchema 57, tenant 1340, period 249, interval 213, metrics 456, window 4470, useState 2630, timeout 1694, objectstack 18047, @objectstack/spec 7545; the zero tokens sampled (debounceDelay, flushInterval, initialDelay, HttpDestinationConfig, LoggingConfig, schemaCacheTtl) read 0; TTL reads 170 text matches plus the 14 binary-file lines git grep prints to stdout, which is the entries' 184 — the entries' own method reproduces every reading.
  4. kernel/functional-completeness.ts — docblock only (+41/−4). Right. The calendar, gantt, timeline and map rows' asserting citations are re-pointed with hop sentences; VIEW_BINDING_BLOCKS, VIEW_BINDING_FIX, VIEW_BINDING_MESSAGE and unboundBlockMessage — the exported and runtime carriers — are untouched. The hop sentences hold against ListView.tsx at the pin: case 'calendar' at :3665, case 'gantt' at :3804, case 'timeline' at :3747, case 'map' at :3924, resolveTimelineDateBinding at :686; the timeline title floor dateBinding.titleField || 'name' (:3797) and the gallery floor (:3743) still stand. The kanban and tree rows are the first ③ item below.
  5. ui/component.zod.ts (+184/−42), ui/action.zod.ts, ui/dataset.zod.ts — docblocks and comments only. Right: the strip leaves no line in them, so no schema, key, default, enum member, guidance string or export moves. The re-pointed anchors were spot-read at the pin and hold: ListView.tsx:86 FLAT_MAP_CONFIG_SPELLING, :200 resolveListMapConfig, the tree arm 3965-3989 emitting labelField: treeCfg.labelField || 'name' at :3986 with no titleField; KanbanImpl.tsx:671 / :684 quickAdd && onQuickAdd; ActionRunner.ts:1498 composeSuccessMessage; ObjectView.tsx:2461 case 'map':; objectql.zod.ts:2523 ObjectMapConfigSchema, closed .strict() at :2532, LIST_VIEW_LOCAL_OVERRIDES at :1506 still without map; previews/block-config.ts inspectors 311-351 (columns at :335, the repeater at 344-351 with its object and limit rows at: 'dataSource'); data-objectstack/src/index.ts translateFilterArray arm ending :5059, serializeOrderBy 868-894; ObjectTimeline.tsx:30 default 100, :589-591 a start-date chain ending in the flat schema.dateField with no literal rung, :952 the refusal arm. The three quoted view.zod.ts anchors (:200, :2461, :2523) are among them.
  6. scripts/sdui-manifest.record.json, packages/sdui-parser/objectui-lockstep.json — records re-pointed. Right. The manifest's sha256 and component count (107) do not move; the lockstep's grammar region, codes and predicate do not move; neither file ships (@objectstack/sdui-parser publishes dist, README.md, CHANGELOG.md). Nothing else publishes.
  7. Three test files — comment-only re-citations; no public surface.

Clause-②: no is right for this diff. The @objectstack/spec accept set does not move (item 2 is the whole token-level change, and it is a description sha); the console's behaviour moves only toward decisions the spec already published (item 1). The PR body's line 2 and the spec changeset agree, and the two precedent bump PRs (#22496, #22412) carried the same line. No (narrowing) arm is owed.

② Semver level

  • .changeset/console-20c6d351ad74.md — @objectstack/console minor. Matches what publishes: the console dist at the new pin. The digest's highest declared level is minor (33 of 33 changesets releasing; six carry the author's BREAKING annotation under objectui's no-major window policy, each marked in the list). Same shape as the two precedent console changesets with BREAKING entries on main (console-f0268ad78485.md, console-a58626c88dc8.md: minor, same marker). The ADR-0087 disposition not-required (no-migration-prescription) is right: the diff adds, removes or renames no ObjectStack-authorable key, no stored shape and no FROM → TO prescription; the comment answers each of the six annotated entries and the three ! subjects by name. check-adr-0087-registration reads the BREAKING banner as the breaking signal and the marker as the disposition; the console changeset owes no Clause-② line of its own (the precedents carry none either, and the gate's arm reading only adds a signal on narrowing).
  • .changeset/objectui-pin-citations-20c6d351ad74.md — @objectstack/spec patch, Clause-②: no. Matches: description text (one describe's sha, six migration readings) and comments, nothing else; same shape as objectui-pin-citations-47b1f0bb7174.md on main. Its body's claims (four changed readings named, one dead read reported and not rewritten, every zero token still zero) agree with the diff and with the readings above.
  • Nothing publishes from any other package. Check Changeset reads success on the head.

③ Boundary flags

Dev report 6092996725: open_questions empty; eight deviations; two out-of-scope findings (carrier: none). Each:

Check-runs on 0b3e83ce5, read at 2026-10-10T03:07Z: 38 runs — 28 success, 4 skipped (the opt-in tarball smoke and the re-run's Auto Label / PR Size), 6 in_progress: Lint & Repo Gates and Test Core 1/6–5/6. success already: Console Pin Gate, Build Core, Dogfood Regression Gate (aggregate and all three shards), Temporal Conformance (live PG + MySQL), Governed Surface Queue Guard, Type Check · workspace / source gates / consumer gates / debt ledger, Test Core (6/6), Check Changeset, Spec property liveness, the single-writer-path and claim guards. Landing waits for every required context green; this record does not stand in for a check.

Implemented-by: claude/issue-22476-console-pin-latest
Reviewed-by: session_01LYXc6ckoWuZyVZpWYizdMh (contract-review subagent, isolated seat)

VERDICT: PASS


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

2 participants