Skip to content

chore(deps): resolve @objectstack/* 17.7.0; attach the objectui#11334 mirror and objectui#11417's arm, follow 17.7.0's mechanical moves; the eager-closure line raised on maintainer ruling A (objectui#11717) - #11742

Merged
objectstack-fleet[bot] merged 21 commits into
mainfrom
claude/issue-11717-objectstack-17-7-0
Oct 7, 2026

Conversation

@objectstack-fleet

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

Copy link
Copy Markdown
Contributor

Fixes #11717
Fixes #11334
Fixes #11417
Clause-②: yes — measured, see "Clause ②" below. The claim (6019218018) said no and delegated the answer to this measurement.

What this PR is

pnpm-lock.yaml now resolves @objectstack/* 17.7.0. It was regenerated with pnpm only, never edited by hand. Every gate the bump turned red is listed below by row. The card's three riders ride here: the objectui#11334 mirror, objectui#11417's single-series arm, and the objectui#11624 sortField flips. One gate went red that was not mechanical: check:eager-closure. Maintainer ruling A (6027998226) resolved it, and the raise is one commit on this branch, b680973f. See "Resolved by ruling A" below.

package before (main lock) after
@objectstack/spec · types · core · client · formula · lint · sdui-parser 17.6.0 17.7.0

Nothing else moved. The census of package and snapshot keys runs in both directions: seven keys removed at 17.6.0 and seven added at 17.7.0, the same for the peer-context keys. The only importer specifier lines that move are the two floors below.

How the lock was regenerated. I used the route of the 17.5.0 and 17.6.0 bumps. Every @objectstack/* specifier was raised to ^17.7.0 for one pnpm install. Every manifest was then restored byte for byte to HEAD, and a second pnpm install reconciled the importers. main moved by ten commits while this was in flight, including objectui#11686's lockfile edit. I merged it as a merge commit, not a rebase, and git merged the lockfile without a conflict. After the merge, pnpm install --frozen-lockfile exited 0 with engine-strict on, and a plain pnpm install left the lockfile byte-identical. For round 2, main had moved 13 more commits. I merged 9b673e54 as a second merge commit, c1e32e96, again not a rebase, and git merged it without a conflict, the lockfile included. pnpm install --frozen-lockfile exited 0 on that head, and it exited 0 again on b680973f. The 43 test files the merge brought in ran green against 17.7.0 under the lock (376 tests), so the merge brought no new red to fix.

Floors. Two move, each because published code now imports something an older release does not export. check:spec-floors is green over a full build.

  • @object-ui/types: ^17.6.0 to ^17.7.0. It now chains checkDashboardWidgetChartMeasureArity and checkPageRequiresKind, which 17.7.0 first exports.
  • @object-ui/plugin-dashboard: ^17.5.0 to ^17.6.0. DatasetWidget now reads DASHBOARD_WIDGET_MULTI_MEASURE_TYPES, which 17.6.0 first exports (objectstack 11d28c17; the ancestry reading is below).

The card's riders

  • objectui#11334, the mirror. DashboardWidgetSchema chains .superRefine(checkDashboardWidgetChartMeasureArity) after the metric-family chain, by import, with no second copy of the check. The 7715 census names it. Its notAttachable booking and both OWED_TO_OBJECTUI_11334 ledgers (the types 8894 file and the panel 8894 file) are struck by flipping their rows to the refusal; no assertion was deleted. The cap rows now require the unrefused set to be EMPTY. The arms are read off the exported check itself. The dimensionless two-measure pie is pinned on both faces as ONE issue at values with the spec's own message.
    • ⚠️ The ruling asks for the one-dimension pie as the parse control. 17.7.0 refuses that pie anyway, through the single-series arm. So the control is stated per arm: with one dimension the dimensionless refusal is gone, the refusal that remains is the single-series one, and a two-measure radar with one dimension parses on both faces.
  • objectui#11417, the single-series arm. Each of the arm's types (read off the check: pie, donut, funnel, treemap, sankey) is pinned refused with one dimension and two measures, on both faces, with the spec's own issue. Two controls: one measure with a dimension parses, and scatter / radar with a dimension and two measures parse. PR objectui#11433's two door assertions flip to the stored-document form. MEASURE_AXIS_CHART_FAMILIES is now new Set(DASHBOARD_WIDGET_MULTI_MEASURE_TYPES), read off CHART_TYPE_MAP exactly as before (table / pivot are no CHART_TYPE_MAP family and keep isTable), so what is drawn does not change. Its remaining items are done here, so this PR completes the card.
  • objectui#11624's sortField rows. object-master-detail-form-details-entry-11396's forward tripwire flips to REFUSED on both published faces, with the spec's retired-key message at the member. The prose moves in the five places the card lists: the MasterDetailDetailConfig docblock, the 8071 test's header and compile-time block, the types pin's header, the details registration description, and the console parity row. MasterDetailDetailConfig keeps its Omit, because the 17.7.0 entry still LISTS the key as a tombstone.

Disposition by row

Done here (mechanical)

gate / test what 17.7.0 moved done here
spec-object-refinements-7715 (Page row) PageSchema gains checkPageRequiresKind (objectstack#21459) Chained on the page node and the page-kind node beside checkPageSourceCompleteness (ruling B1 of objectui#7715: the check reads kind and requires, both carried by reference). Three refusal rows with the spec's own message, and two controls.
check:installed-pin-claims (22 findings) every site naming 17.6.0 Each fact re-read on 17.7.0, then restamped. These cover SelectOption, CalendarConfig, object-calendar's ten strict members, FieldSchema dependsOn / rows / option description / referenceTo, record:details / highlights / alert, waitForInput, the lint field-rule root messages, and the retired-key brand. Four lines that name the 17.6.0 release as an event are ledgered historical. Gate: OK.
check-lockfile-integrity.test.ts its samples were keyed on 17.6.0 snapshot keys Re-keyed on 17.7.0, as its own tripwire asks.
ci-cd-pipeline-doc.test.ts the live-e2e backend pin must equal the resolved spec OBJECTSTACK_VERSION=17.7.0. The @objectstack/cli@17.7.0 tag peels to the release commit 4e4e881427.
registry parity: ai:chat_window ledger, and block-config "every exclusion names a real spec type" ai:chat_window retired by name (objectstack#21504) The ledger entry is rewritten as RETIRED UPSTREAM. The palette exclusion leaves with the type, as user:profile / element:form did at 17.3.0. canvas-display-meta moves its probe to the unknown-type branch.
registry parity: three object-grid.resizableColumns rows the key is a tombstone naming resizable (objectstack#21445) Harvested exactly as defaultSort was at 17.3.0: the exemption, the GA carve-out and the pending-key entries go, and HARVESTED gains the tenth key. Retiring the renderer's own read of the old spelling stays objectui#6152's.
registry parity "element:text declares no arm the spec refuses outright" + element-text-published-variants-7450 (2) heading / subheading refused (objectstack#21015) Did what the tripwire asked: drop the pair from the registry inputs enum and from VARIANT_CLASS / VARIANT_TAG, and move the expectation to []. The rows that pinned the old rendering flip to a refusal on every gate. A stored value renders as body.
CapabilityMultiSelectField.specParity-6285 (3) PLATFORM_CAPABILITIES gains view_all_audit_log Declared, labelled in FIELD_DEFAULTS and in all ten locale packs.
actionKeys.pin ActionSchema gains requiresMembershipReach Inventoried the way description / execution are. ActionDef does not declare it.
object-metadata-write-guard.derivation (2) select / radio with no option source refused at options (objectstack#21390) Did what the objectui#11253 tripwire asked: the guard's paragraph collapses into the relationship form, and the block becomes the refusal pin. It has controls and requires FieldSchema's choice set to equal the guard's list.
select-option-spec-extension-7014 the same door refuses the control's bare select The control select carries one option, so it stays about rows alone.
clientValidation.flowNodeTypes, FlowNodeInspector.requiredMarkers-10948, FlowNodeInspector.escalationOff-11660 (2) the approval node's config is judged against ApprovalNodeConfigSchema (objectstack#21893) The type-only fixture carries the required approvers, and a new pin covers the refusal location. The marker measurement for a seeded approval now reads Approvers and Type. The escalation round-trip matches labels without the required marker the inspector now draws on timeoutHours.
imported-defaults-8317 (lazy count, and the census of chained checks) a sixth z.lazy (the form-field group under object-form's sections[].fields[]) The count and docblock are re-derived. The two new checks join REFINEMENT_EXCEPTIONS.
object-form-properties-bag-10859-b4, registered-type-arms-10859-b2 (2) object-form / object-metric / object-master-detail-form rows now reach spec defaults (page-block section shape; drillDown.report) Re-pinned: the boundary hands back a stripped derivation, and the bag IS that derivation and answers every probe as the spec does.
object-form-unmirrored-members-6152 a group-referencing section refuses visibleWhen beside group Fixture re-judged: visibleWhen moves to the standalone section.
calendarUnionReads-8651 object-calendar.calendar is typed as the list view's strict calendar block (objectstack 7d674dfc) The "slot refuses nothing" row flips. The ObjectCalendarSchema.calendar docblock is re-measured (see the second table).
objectGanttInputs-11168, objectTimelineInputs-11168 the row describes of markers, items and mapping moved Each description opens with the 17.7.0 describe, which is true of these renderers. The renderer sentences after it are unchanged.
DashboardEditor.measureDoor-8894, DatasetWidget.unrenderedMeasures-8894 the mirror attaches Green with the mirror. The dimensionless-pie pin flips to the stored form, as the stored-metric pin is.

Resolved by ruling A (6027998226)

check:eager-closure (CI Bundle Analysis) was the one red that was not mechanical. The maintainer answered decision request 6024630321 with ruling A, record 6027998226 on objectui#11717. The selection, verbatim: 「A 抬预算+回收卡 (Recommended)」. One commit, b680973f, raises the line in the objectui#11088 shape:

constant before after
BASELINE 3,386,193 over 330 of 2450 chunks, 2ba091c 3,591,028 over 331 of 2451 chunks, c1e32e96
MAX_EAGER_CLOSURE_GZIP_BYTES 3,410,284 3,637,000
PER_CHUNK_BASELINE['vendor-objectstack'] 1,420,958 1,604,474
PER_CHUNK_GZIP_CEILINGS['vendor-objectstack'] 1,439,157 1,623,000
  • The new ceiling is 3,591,028 + 45,568 (half of REGRESSION_THIS_GATE_MUST_CATCH_BYTES) = 3,636,596, rounded to the nearest thousand as every earlier raise was. That leaves 45,972 bytes of headroom, 0.50x.
  • The new vendor-objectstack ceiling leaves 18,526 bytes of headroom, 0.20x, the band the two paybacks kept.
  • REGRESSION_THIS_GATE_MUST_CATCH_BYTES is untouched. No exemption was added, and no import was made lazy.
  • The other three per-chunk rows passed on this build and did not move.

The bytes, in gzip bytes. The instrument is the same for both columns: pnpm exec turbo run build --filter=!@object-ui/site --concurrency=2 under scripts/pm/os-verify-lock.sh, in one container, then pnpm check:eager-closure, which reads apps/console/dist/eager-closure.json. The control is main 9b673e54, built in a worktree of its own with 17.6.0 resolved.

chunk 9b673e54 (main) c1e32e96 (merged head) delta
vendor-objectstack 1,421,565 1,604,474 +182,909
ui-components 283,061 283,079 +18
framework 74,774 74,785 +11
src 176,172 176,181 +9
i18n-locale-en 44,592 44,620 +28
everything else (326 names) 1,407,856 1,407,889 +33
aggregate 3,408,020 3,591,028 +183,008

What the bytes buy: the console's client-side validation answers as the 17.7.0 server does, with its new refusals and its schemas. They also unblock the cards this bump unblocks. They do not buy a new console capability.

The payback card is objectstack#22044. When it lands, the ceiling and BASELINE come down together by exactly what it recovers, the way objectui#11101 and objectui#11438 lowered the third raise.

The gate's header has a new section, "⚠️ RAISED A FOURTH TIME, ON EXPLICIT MAINTAINER RULING (objectui#11717)". It carries the ruling, this table, the instrument and the payback card. On b680973f, pnpm check:eager-closure exits 0 and prints: "Console eager closure is 3506.9 KB gzipped across 331 of 2451 chunks (budget: 3551.8 KB, headroom: 44.9 KB)", aggregate 0.50x, vendor-objectstack 1566.9 KB against a 1585.0 KB ceiling (0.20x).

Differences no gate reads, reported by row (not red)

site difference owner
ObjectCalendarSchema.calendar (@object-ui/types) Since 17.7.0 the spec's slot is strict. objectui's member keeps .passthrough(), so it admits an unexamined key the spec refuses, the forbidden direction of objectui#8327. The docblock now says so. Following the spec by reference narrows a published door. objectui#8651 lane, for the seat
object-grid / object-kanban / object-calendar members 17.7.0 types (objectstack#21464 stage 2, #21463: operations strict without read / import, conditionalFormatting the list view's rules, filter the rule array) objectui's renderers, mirrors, root README example and several console parity pins sentences still accept or describe the older shapes. No test went red. objectui#6152 (triage 6020673439: its strokes stay there)

Leads re-measured (Zone 2)

  • A1 confirmed. npm has 17.7.0 for all seven packages (latest = 17.7.0; spec published 2026-10-06T12:22:14Z).
  • A2 confirmed. 32d5769080, 6ec54f00 and 11d28c17df are each an ancestor of 4e4e881427 (exit 0, which needs no control leg). For the negative half: 32d5769080 and 6ec54f00 are not ancestors of the 17.6.0 tag commit 617f25f8a4 (exit 1), with the repository's root commit as the control leg (exit 0, deeper than both).
  • A3(a) disproved. check:doc-snippets judged all 782 blocks over a 17.7.0 build with 0 failures, the plugin-grid README snippets included.
  • A3(b) confirmed as a difference, not a red. See the second table.
  • A3(c): no ledger went stale at 17.7.0.
    • OWED_TO_OBJECTUI_11344 has 0 hits in the tree; it was struck before this branch.
    • The objectui#11068 booking is struck on main.
    • The objectui#11536 booking still stands, and the parity file is green on 17.7.0.
  • A4: objectui#11417's open item 2 is done in full here, and so is objectui#11334's scope. Hence the two closing lines. objectui#6152 and the held cards are only mentioned.
  • A5: see Floors.
  • A6: Clause ② is below.

Clause ②

This was measured on the built declaration closure of @object-ui/types. Its dist was built at main 7300fca (spec 17.6.0, a worktree of its own) and at this branch (17.7.0), and the .d.ts files were compared with comment lines dropped and line order ignored:

  • Nine files differ only in docblock text or ordering.
  • Four differ in declarations: zod/index.zod.d.ts, zod/objectql.zod.d.ts, zod/public-blocks.zod.d.ts and zod/layout.zod.d.ts.

The emitted zod declarations inline the spec's shapes, so the bump moves what @object-ui/types publishes in both directions:

  • members are typed where they were records of unknown values (the action:group / action:menu member actions);
  • new enum members appear (new-tab, separator-before);
  • new optional keys appear (ast, bodyExtra);
  • ai:chat_window leaves the page component type unions.

On top of that, the two chained checks narrow the runtime accept set toward the spec. Hence Clause-②: yes. An at-tier contract review is owed before landing, as the claim already said.

Tests

The full repository-root suite (pnpm exec vitest run, under the verify lock) ran on the lockfile-only commit 60ed1ad:

Test Files  24 failed | 4458 passed | 7 skipped (4489)
     Tests  41 failed | 60842 passed | 359 skipped (61242)

The 24 failing files are the rows above. After the fixes, the 38 files this PR edits plus every file that was red re-ran together under the lock: 36 green and 3 rows red in 2 files. The last commits fix those, and those 3 files re-ran green (373 tests).

After this PR opened, the full repository-root suite ran under the verify lock on the PR head 50ed869:

Test Files  4 failed | 4494 passed | 7 skipped (4505)
     Tests  5 failed | 61065 passed | 359 skipped (61429)
  • Two of the four were CI shard 7's rows, fixed in c7bbce48: the twins-spec-by-reference-9736 Page control and the exclusion-reason-truthfulness vacuity row. CI on c7bbce48 then had 41 successes, 3 skips and one failure, Bundle Analysis, which the ruling above resolves.
  • The other two are not this branch's.
    • record-details.hideFieldsUncast-9965 timed out at 15000 ms under full load and passes alone.
    • date-only-zone-pins-10183 fails only while this worktree's vitest results cache is present. With the cache file moved aside, the same head passes 27/27, and so does a control worktree at main 02a38967.
  • No further full local run was made, as the seat directed. PR CI on the pushed head gives the full reading.

Round 2 ran on b680973f, under the lock, each exit code written to disk before any pipe:

  • scripts/__tests__/check-eager-closure-budget.test.ts: 179/179 passed. With check-installed-spec-pin-claims.test.ts beside it, 208/208.
  • The 43 test files the main merge brought in passed against 17.7.0: 43 files, 376 tests, on the c1e32e96 tree.

Gates

These ran on the merged head after a full turbo run build (43/43). Exit codes were captured before any pipe.

gate exit verdict
pnpm install --frozen-lockfile (engine-strict) 0 lockfile up to date; a plain install leaves it byte-identical
turbo run type-check --concurrency=2 0 81/81 tasks
check:lockfile-integrity · check:lockfile-dedupe 0 · 0 VERDICT clean · VERDICT deduped
check:spec-floors · check:spec-symbols 0 · 0 every floor carries its symbols · green
check:installed-pin-claims 0 OK
check:component-surface-parity 0 report-only
check:doc-snippets · check:doc-types · check:doc-examples · check:readme-exports 0 each green
check:new-line-citations · check:control-bytes · check:test-path-roots 0 each 0 new citations
check:changeset-claims · check:pending-changeset-literals 0 · 0 green
check:eager-closure (round 2, b680973f) 0 3506.9 KB against a 3551.8 KB budget (0.50x); vendor-objectstack 1566.9 / 1585.0 KB (0.20x)
round 2 on b680973f: pnpm install --frozen-lockfile · check:new-line-citations · check:control-bytes · check:changeset-claims · check:pending-changeset-literals · check:installed-pin-claims · check-changeset-presence · check-changeset-no-major · type-check:scripts 0 each green
check:eager-locale-catalogues · check:skill-examples · check:prompt-keys · check:sdui-registration-pins · the three i18n gates · check:action-forward-parity · check:designer-field-key-parity · check:phantom-deps · check:unused-deps 0 each green
turbo run lint --concurrency=2 (50ed869) 0 47/47 tasks, 0 errors

Changesets

Nine changesets, none major. node scripts/check-changeset-presence.mjs exits 0, and so does check-changeset-no-major.

  • 11717-objectstack-17-7-0: the two floors (@object-ui/types, @object-ui/plugin-dashboard, patch), and the @object-ui/console patch bullet for the closure delta and the budget re-pin, following the 17.6.0 bump's 6158e4c. @object-ui/console is not private and is in the fixed group, so it takes a real bump bullet, not an empty declaration.
  • 11717-dashboard-widget-chart-measure-arity and 11717-page-requires-kind: @object-ui/types minor. Both are narrowings, with the breaking semantics in the prose.
  • 11717-element-text-retired-variants: @object-ui/components minor.
  • Patches:
    • 11717-capability-view-all-audit-log: @object-ui/fields, @object-ui/i18n;
    • 11717-spec-row-describes: @object-ui/plugin-gantt, @object-ui/plugin-timeline;
    • 11717-master-detail-sort-field-refused: @object-ui/plugin-form;
    • 11717-action-key-requires-membership-reach: @object-ui/core.
  • 11717-bump-prose: empty frontmatter, for re-pins and comments.

Size and route

Against main 9b673e54, after the round-2 merge: 87 files, +1083 / −607, lockfile included. That is under the 5,000-line human-merge line. No path is under .claude/**, skills/**, docs/adr/**, AGENTS.md or CLAUDE.md.

Acceptance notes (observations, not filed)

  • ActionDef declares requiresFeature but not its 17.7.0 sibling requiresMembershipReach. The spec's parse lowers both into visible. Whether the runner should read the raw key has not been measured.
  • Several console parity pins sentences still say the object-calendar / object-kanban filter row is z.unknown(). 17.7.0 types it as the rule array. They are part of objectui#6152's family above. Nothing parses them.
  • The objectui#11396 pin once said "drop the Omit" at this bump. The Omit was kept, for the reason in the docblock. The spec entry still lists the key, and the face does not offer a member whose only legal value is absence.

Deviations

  • The Clause ② line is the measured yes, not the claim's no, as the dispatch asked.
  • The objectui#11334 one-dimension pie control is stated per arm (see the riders).
  • Round 2 was cut off by a container restart after b680973f was committed and before it was pushed. Both commits were re-read as unverified, and every gate above was re-run on b680973f after the restart. The console build output survived the restart. It was built from c1e32e96, and b680973f changes no bundler input, so the build was not repeated.
  • The pin-claims ledger entry for the gate file drops from two historical 17.6.0 sites to one. Its provenance sentence now cites the 17.7.0 build c1e32e96, as the gate's own claim check requires.
  • Owner-card searches were not run. This dev's contract leaves dedupe to the seat. Dedupe words: eager closure vendor-objectstack 17.7.0 · calendar slot passthrough · object-grid operations read import · requiresMembershipReach.

The session that ran this is https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V, dispatched by objectui's domain:devx seat 2.


Generated by Claude Code

claude added 18 commits October 6, 2026 15:15
…i#11717)

Regenerated with pnpm only, never by hand: every @objectstack/* specifier
was raised to ^17.7.0 for one `pnpm install`, every manifest was restored
byte for byte to HEAD, and a second `pnpm install` reconciled the
importers back to their declared ranges. The seven packages objectui
resolves (spec, types, core, client, formula, lint, sdui-parser) move
17.6.0 -> 17.7.0; no importer specifier line and no other package moves.

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
… backend pin on 17.7.0 (objectui#11717)

check-lockfile-integrity.test.ts builds its samples from the real lockfile's
@objectstack/* snapshot keys and asked to be rebuilt when they moved; they
are re-keyed on 17.7.0. e2e/live/ci/backend.env must equal the resolved
@objectstack/spec (ci-cd-pipeline-doc.test.ts): OBJECTSTACK_VERSION=17.7.0,
whose @objectstack/cli@17.7.0 tag resolves to the release commit 4e4e881427.

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
…ks; the objectui#11334 mirror and objectui#11417's single-series arm (objectui#11717)

DashboardWidgetSchema chains checkDashboardWidgetChartMeasureArity after the
metric-family check, by import (objectui#11334 rulings 5925828806 and
5956401275). The page node and the page-kind node chain checkPageRequiresKind
beside checkPageSourceCompleteness (objectui#7715 ruling B1). The 7715 census
names both and its notAttachable booking is struck.

The three OWED TO objectui#11334 bookings are struck by flipping their rows to
the refusal: the census entry, and the two 8894 ledgers, whose cap rows now
require the unrefused set to be empty. The dimensionless two-measure pie is
pinned on both faces; its one-dimension control is stated per arm, because
17.7.0 refuses that pie by the single-series arm, which is pinned with its
controls. PR objectui#11433's two door assertions and the dimensionless pie
pin in DatasetWidget.unrenderedMeasures-8894 flip to the stored-document form.

DatasetWidget reads DASHBOARD_WIDGET_MULTI_MEASURE_TYPES instead of restating
it. Floors: @object-ui/types ^17.7.0, @object-ui/plugin-dashboard ^17.6.0.

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
….7.0; ledger four historical sites (objectui#11717)

check:installed-pin-claims reported 22 findings naming 17.6.0. Each fact was
re-read on the installed 17.7.0 before its stamp moved: SelectOptionSchema's
blank label, CalendarConfigSchema's three legs, object-calendar's ten strict
members, FieldSchema dependsOn / rows / option description / referenceTo,
record:details columns, record:highlights icon and layout, record:alert visible,
waitForInput's missing default, the lint field-rule root messages, and the
retired-key brand. Three lines name the 17.6.0 release as an event and are
ledgered historical (plugin-grid keyboardNavigation, two eager-closure lines),
as is the console parity row that dates the closed details entry.

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
…leaves with the type (objectui#11717)

@objectstack/spec 17.7.0 drops ai:chat_window from PageComponentType and
refuses it by name (objectstack#21504). block-config.test.ts's 'every
exclusion names a real spec type' refused the stale entry. It goes the way
user:profile / element:form did at 17.3.0, and the probes that read it move to
the unknown-type branch.

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
…nts, as 17.7.0 refuses them (objectui#11717)

element-text-published-variants-7450.test.ts went red as it promised to and
named the follow-up: drop the pair from the registry inputs enum and from
VARIANT_CLASS / VARIANT_TAG, and move the expectation to []. Done. The rows
that pinned the old rendering flip to the refusal on every gate (contract,
html tier, safeValidateSchema) and to the read site's body answer for a stored
value. Prose that said the contract still accepts the pair is corrected.

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
… pins (objectui#11717)

objectstack#21893 judges an approval node's config against
ApprovalNodeConfigSchema at the build doors. The type-only fixture carries
the approvers its contract requires, with a new pin for the refusal's
location; the required-marker measurement for a seeded approval now reads
Approvers and Type; the escalation round-trip matches its labels without the
required marker the inspector now draws on timeoutHours.

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
…the guard's paragraph collapses into the relationship form (objectui#11717)

The objectui#11253 tripwire went red and said what to do: the server refuses
a select / radio with no option source at fields.NAME.options, so the guard's
docblock no longer calls that refusal ahead of the server, and the block
becomes the refusal pin, with controls and an equality between FieldSchema's
answer and the guard's list. select-option-spec-extension-7014's select control
carries one option so it stays about rows alone.

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
…c defaults, a sixth z.lazy, two new chained checks (objectui#11717)

object-form, object-metric and object-master-detail-form rows reach a spec
default since 17.7.0 (sections[].fields[] take the page-block section shape;
object-metric drillDown.report is ReportSchema), so stripImportedDefaults
hands back a stripped derivation; the two by-reference pins re-pin to 'the bag
IS that derivation'. The walker docblock names the sixth lazy node, and the
8317 census lists the two newly chained checks. object-form-unmirrored-members
moves visibleWhen off the group-referencing section, which 17.7.0 refuses.

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
…; flip the key-not-shape pin and restate the mirror's position (objectui#11717)

objectstack#21464 stage 2 (7d674dfc) makes ComponentPropsMap['object-calendar']
.calendar the list view's strict calendar block. calendarUnionReads-8651's
'the slot refuses nothing' row flips: the control key, the dateField alias and
42 are refused now. The ObjectCalendarSchema.calendar docblock is re-measured,
and it says the mirror's .passthrough() now admits an unexamined key the spec
refuses. That difference is reported by row on the PR, not changed here.

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
… row's own describe (objectui#11717)

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
…adds (objectui#11717)

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
…ow retired upstream, object-grid.resizableColumns harvested, the sortField fork closed (objectui#11717)

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
…sed with the spec's retired-key message (objectui#11624 rows, objectui#11717)

17.7.0 carries 6ec54f00 (objectstack#21589). The objectui#11396 types pin's
forward tripwire flips to the refusal on both published faces, with the spec's
message at the member. The MasterDetailDetailConfig docblock, the 8071 test's
header and compile-time block, and the details registration description stop
calling the retirement unreleased. The Omit stays: the entry still lists the
key as a tombstone.

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
Brings in main through 02a3896 (objectui#11694); git merged the lockfile and
the locale packs without a conflict.

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
…k, not off zod (objectui#11717)

@object-ui/plugin-dashboard declares no zod dependency, so `import type { z }`
failed its tsconfig.test.json compile (TS2307). The context's type is read off
checkDashboardWidgetChartMeasureArity's own parameter instead.

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
…ing variant as live (objectui#11717)

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

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 331 chunks) 3504.6 KB 3330.4 KB
Main entry chunk (gzip) 154.3 KB 350 KB
Entry file index-IdQJqOK2.js —
Status FAIL —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ❌ over its ceiling
Per-chunk membership (declared packages) ✅ pass
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 17.82KB 6.58KB
app-shell (runtime-config.js) 22.52KB 7.86KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.40KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.70KB 10.94KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.11KB 7.97KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 578.77KB 139.16KB
core (index.js) 10.00KB 3.96KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 233.72KB 64.83KB
fields (index.js) 263.45KB 66.74KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 37.51KB 10.04KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.18KB 11.71KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.86KB 5.00KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.52KB 2.26KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.04KB 3.92KB
plugin-calendar (index.js) 53.39KB 15.52KB
plugin-charts (index.js) 84.26KB 23.05KB
plugin-chatbot (index.js) 198.81KB 47.14KB
plugin-dashboard (index.js) 144.22KB 38.99KB
plugin-designer (index.js) 231.46KB 48.87KB
plugin-detail (index.js) 247.28KB 65.06KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 177.12KB 45.90KB
plugin-gantt (index.js) 179.17KB 45.07KB
plugin-grid (index.js) 238.51KB 65.53KB
plugin-kanban (index.js) 52.17KB 16.37KB
plugin-list (index.js) 116.85KB 29.12KB
plugin-map (index.js) 25.60KB 8.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.12KB 12.29KB
plugin-timeline (index.js) 39.10KB 11.81KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 90.23KB 22.73KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 120.63KB 39.56KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.25KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

…(objectui#11717)

- twins-spec-by-reference-9736: the Page control writes `requires`, which
  `checkPageRequiresKind` now refuses on a page with no `kind` (the spec
  default `full`); the control carries `kind: 'html'`, where the key is legal.
- exclusion-reason-truthfulness: the no-renderer population emptied when
  `ai:chat_window`, its last member, left PALETTE_EXCLUSIONS with the type's
  upstream retirement. The row that required it non-empty now asserts it is
  empty and why, and goes red the day a new reason claims "no renderer".

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

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 331 chunks) 3506.2 KB 3330.4 KB
Main entry chunk (gzip) 154.8 KB 350 KB
Entry file index-9VgCR15T.js —
Status FAIL —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ❌ over its ceiling
Per-chunk membership (declared packages) ✅ pass
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 17.82KB 6.58KB
app-shell (runtime-config.js) 22.59KB 7.89KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.40KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.70KB 10.94KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.11KB 7.97KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 578.94KB 139.21KB
core (index.js) 10.00KB 3.96KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 235.41KB 65.46KB
fields (index.js) 263.50KB 66.77KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 37.51KB 10.04KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.50KB 11.82KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.86KB 5.00KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.52KB 2.26KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.04KB 3.92KB
plugin-calendar (index.js) 53.39KB 15.52KB
plugin-charts (index.js) 84.26KB 23.05KB
plugin-chatbot (index.js) 199.63KB 47.46KB
plugin-dashboard (index.js) 144.22KB 38.99KB
plugin-designer (index.js) 231.46KB 48.87KB
plugin-detail (index.js) 247.69KB 65.18KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 177.12KB 45.90KB
plugin-gantt (index.js) 179.17KB 45.07KB
plugin-grid (index.js) 238.51KB 65.53KB
plugin-kanban (index.js) 52.17KB 16.37KB
plugin-list (index.js) 116.85KB 29.12KB
plugin-map (index.js) 25.60KB 8.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.12KB 12.29KB
plugin-timeline (index.js) 39.10KB 11.81KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 90.64KB 22.85KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 120.63KB 39.56KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.25KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Bundle Analysis is red on c7bbce48 by the console's eager-closure budget: the closure is 3506.2 KB gzipped against a 3330.4 KB ceiling, and the vendor-objectstack per-chunk ceiling also fires. This is the PR body's "Still red" row. It is the @objectstack/* 17.6.0 → 17.7.0 bytes, and the same check is green on main.

  • Not mechanical: every raise of this ceiling has been taken on an explicit maintainer ruling (the gate's own header; precedent objectui#11088, ruling 5890854293). So the ceiling constants are untouched here by design.
  • Waiting on: the maintainer's ruling on objectui#11717, decision request 6024630321 (A: raise in the 11088 shape with payback cards; B: slim the spec first; C: lazy-load on the objectui side).
  • No re-run: the reading is deterministic, not a flake.
  • The PR stays draft until the ruling. An at-tier contract review (Clause-②: yes) runs in parallel.

domain:devx @ objectui seat 2 · session_01XgevVHGcN8dnegiiY3v75V · 2026-10-06T20:16Z


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

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

Rendered by the isolated at-tier contract reviewer of domain:devx @ objectui seat 2, 2026-10-06T20:24Z. Inputs, and nothing else: card objectui#11717 (body and its three comments: the claim 6019218018, triage's amendment 6020673439, the os-dev report 6024525892); PR objectui#11742 (body, the 85-file list, the net diff against main at the merge-base 02a38967, lockfile included); the check-runs on c7bbce48; and the rulings the card cites, read where it points: objectui#11334 5925828806 and 5956401275, objectui#11417 (triage 5943580519, partial landing 5945292756, unlock 5956394000), objectui#11624 (its body and its own contract-review record), objectui#11438 A′ 5965062249 and A″ 5968177777, and objectui#7715 ruling B1 5564943016 because the PR attaches checkPageRequiresKind under it. The spec's own 17.7.0 sources were read with git show at the tag commit 4e4e881427 in the sibling checkout (no install, no build). Nothing was checked out, built, run or re-run; the dev's local readings are reports, the check-runs are the verdicts.

Check-runs on c7bbce48, read at 2026-10-06T20:21Z: 45 runs, 0 in progress. 41 success, 3 skipped by design (Test (coverage shard N/4) and Test (coverage) are push-only, dependabot is actor-gated), 1 failure: Bundle Analysis. Earlier readings this round: 2026-10-06T20:12Z 24 success / 17 in progress; 2026-10-06T20:16Z Type Check, Lint and Spec Main Shape Gate completed green with seven test shards still running; 2026-10-06T20:18Z five shards running; 2026-10-06T20:21Z every shard and the Test aggregate green. The contract-relevant gates read as completed and green: Type Check, Lint, Spec Main Shape Gate, Test with all eight shards, Test (dist pins), Build & E2E, Live E2E (informational) (backend 17.7.0), Lockfile Integrity Check, Lockfile Dedupe Check, Changeset Declaration, Changeset Bump Policy, Changeset Fixed Group Check, Changeset Claim Re-read, Changeset Overwrite Report, Governed Surface Queue Guard, Doc Snippet Type Check, Doc Example Id Check, Doc Component Type Check, README Export Check, Build Docs, Skill Example Check, Line Citation Gate, Control Byte Scan.

The one red, Bundle Analysis, is the eager-closure budget (check:eager-closure), not a contract face. vendor-objectstack and the aggregate closure are over their ceilings by the @objectstack/* 17.6.0 to 17.7.0 bytes (the dev's measurement: +182,909 gzip on that chunk, every other chunk nets about zero; the budget constants are untouched). The 17.5.0 raise was taken on an explicit maintainer ruling (objectui#11088), so raising it here is not mechanical, and the row waits on a maintainer ruling. This record judges the contract and says nothing about whether that red may land; the landing rule (every check green) is the seat's and the maintainer's.

① Derived judgments

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

  1. @object-ui/types: DashboardWidgetSchema chains checkDashboardWidgetChartMeasureArity by import, after the metric-family chain (packages/types/src/zod/complex.zod.ts) — RIGHT. Narrowing on both published faces (DashboardWidgetSchema, safeValidateSchema), two arms: two or more measures with no dimensions on a ChartTypeSchema type outside DASHBOARD_WIDGET_MULTI_MEASURE_TYPES; two or more measures on pie / donut / funnel / treemap / sankey whatever the dimension. It is the placement rulings' letter (5925828806, 5956401275): the bump PR carries the mirror, under the new name, chained after the metric chain, no restated list, the census row named. Read at the tag: the spec's own DashboardWidgetSchema chains checkDashboardWidgetStageOrder, then checkDashboardWidgetMetricMeasureArity, then checkDashboardWidgetChartMeasureArity, the order the mirror now has; the check returns before judging a type outside ChartTypeSchema.options (its non-coverage 4), so objectui's wider type enum (list / custom, the component widget types) is unjudged, as the mirror's comment says. The 17.7.0 ChartTypeSchema has twenty members: the eight multi-measure types, the five metric-family types, and exactly the seven the changeset names for the dimensionless arm, so that parenthetical is complete. The pins read both arms off the exported check with a collecting context (DIMENSIONLESS_ARM, SINGLE_SERIES_ARM), never off a list written in the test; the three OWED TO objectui#11334 bookings (the 7715 census notAttachable entry, the types 8894 ledger, the panel 8894 ledger) are struck by flipping every ledgered row to the refusal, with no assertion deleted and the cap rows now requiring the unrefused set to be EMPTY; kpi stays judged beside the chart arm. The census stays complete: 17.7.0 exports seven check* functions from @objectstack/spec/ui (read at the tag) and the six sites plus CARRIED_ELSEWHERE name all seven.

  2. @object-ui/types: PageNodeSchema and PageKindNodeSchema chain checkPageRequiresKind beside checkPageSourceCompleteness (packages/types/src/zod/layout.zod.ts) — RIGHT, under ruling B1. Narrowing: requires is refused at requires on a page whose kind is not html / jsx, an absent kind (the spec default full) and an empty list included. B1 (5564943016) has each derivation site re-attach the checks whose fields it carries: the check reads kind and requires; PAGE_SPEC_EXCLUDED is name / label / description / type / regions, and the .extend block overrides neither key, so both reach the node by reference. The spec's PageSchema chains the same two in the same order (read at the tag), and its kind enum is exactly full / slotted / html / react / jsx, so the changeset's "react, full and slotted, and a page with no kind" is the whole complement. Three refusal rows with the spec's own message and two controls in spec-object-refinements-7715.test.ts; the census row and REFINEMENT_EXCEPTIONS in imported-defaults-8317.test.ts name it; the 9736 Page control moves to kind: 'html', which is the only form of that control that still parses.

  3. @object-ui/types: the by-reference narrowings 17.7.0 makes through rows objectui already takes from the spec — RIGHT, and each is re-pinned. The details entry's sortField becomes a retiredKey() tombstone (refused at the member with the spec's message: object-master-detail-form-details-entry-11396.test.ts flipped from ACCEPTED to REFUSED, the card's own row); select / radio and the rest of CHOICE_TYPES_REQUIRING_OPTIONS with no option source are refused at options, an empty list included (object-metadata-write-guard.derivation.test.ts, the objectui#11253 block turned into the refusal pin with controls and a FieldSchema ⇄ checkFieldCompleteness equality row); object-grid.resizableColumns is a tombstone (harvested in the console parity file as defaultSort was at 17.3.0); the object-calendar.calendar spec slot is strict (see item 5 for objectui's own member); an approval flow node's config is judged against ApprovalNodeConfigSchema; a group-referencing form section refuses visibleWhen; ai:chat_window leaves PageComponentType; and the emitted zod declarations move (typed action:group / action:menu members, new-tab / separator-before, ast / bodyExtra). These are the spec's moves reaching every consumer through the floor, the treatment the 17.6.0 bump entry gave them ("already reaches any consumer that resolves @objectstack/spec" at that floor), and the @object-ui/types floor rising to ^17.7.0 makes the set unambiguous. Clause-② is declared yes for them (section ②).

  4. @object-ui/components: element:text drops heading / subheading from the registry inputs enum and from VARIANT_CLASS / VARIANT_TAG (packages/components/src/renderers/basic/elements.tsx) — RIGHT. Public surface: the published manifest's enum (the html tier now refuses the pair with invalid-enum, as objectui validate and the spec do), and the rendered output of a stored, unmigrated node (an h2 / h3 becomes the body paragraph, the renderer's answer for any value outside the contract). The 7450 tripwire named exactly this change for the day the spec refused the pair; AGENTS.md #0.1 forbids a renderer fallback for metadata the contract refuses; the spec's retirement ships with os migrate meta --from 17. The changeset is minor, states the breaking semantics and the FROM → TO migration (heading → h2, subheading → h3), and discloses the stored-node rendering.

  5. @object-ui/types: ObjectCalendarSchema.calendar keeps .passthrough() while 17.7.0's spec slot is strict (packages/types/src/zod/objectql.zod.ts, docblock rewritten) — RIGHT for this card's scope, and ESCALATED (section ③, flag 9). The diff narrows nothing here, so nothing published moves; the divergence is the spec moving under a hand-written objectui member, in the direction objectui#8327 forbids (objectui admits a key the platform refuses). Closing it is a Clause-② narrowing with its own corpus measurement, not a mechanical fix, and the card's rule is to report such a row, which the dev did, by row, with the docblock saying so.

  6. @object-ui/plugin-dashboard: MEASURE_AXIS_CHART_FAMILIES is new Set(DASHBOARD_WIDGET_MULTI_MEASURE_TYPES) (packages/plugin-dashboard/src/DatasetWidget.tsx) — RIGHT, nothing drawn moves. The imported list adds table / pivot to the restated six. The set has one read, rendersEveryMeasureWithoutDimension, which is isTable || MEASURE_AXIS_CHART_FAMILIES.has(CHART_TYPE_MAP[widgetType] ?? ''): isTable already short-circuits those two, and CHART_TYPE_MAP maps nothing to table or pivot, so the two new members are never reached. The constant was first exported by objectstack 11d28c17, which 17.6.0 carries (ruling 5956401275), so the floor ^17.5.0 to ^17.6.0 is the right floor and the patch changeset is right. The objectui#11417 pins flip PR objectui#11433's two door assertions to the stored-document form, as that card's partial-landing record said they would.

  7. @object-ui/plugin-form: MasterDetailDetailConfig keeps its Omit of sortField; the details registration description and the docblock move (packages/plugin-form/src/MasterDetailForm.tsx, packages/plugin-form/src/index.tsx) — RIGHT, patch. No published type or behaviour moves; the refusal comes through @object-ui/types by reference (item 3). The card lists prose only for the five sortField places, and all five are done (docblock, 8071 header and compile-time block, the types pin header, the registration description, the console parity row).

  8. @object-ui/core: SPEC_ACTION_KEYS gains requiresMembershipReach (packages/core/src/actions/actionKeys.ts) — RIGHT, patch. The inventory restates the spec's declared keys so an action carrying one is not reported as unknown; the runner does not read it, ActionDef does not declare it, and the changeset says both. Whether the runner should read it is not this card's (section ③, flag 8).

  9. @object-ui/fields and @object-ui/i18n: view_all_audit_log is curated and labelled in FIELD_DEFAULTS and all ten locale packs — RIGHT, patch. No accept-set change; a label for a capability the spec's PLATFORM_CAPABILITIES now lists.

  10. @object-ui/plugin-gantt markers, @object-ui/plugin-timeline items / mapping: registry description text opens with the 17.7.0 row's describe — RIGHT, patch. The manifest's description strings move; type, arity and enum do not.

  11. @object-ui/app-shell: PALETTE_EXCLUSIONS loses its ai:chat_window entry (packages/app-shell/src/views/metadata-admin/previews/block-types.ts) — RIGHT, and it ships no behaviour change. Read at the head: outside tests the only readers of PALETTE_EXCLUSIONS are comments, and block-types.ts is not re-exported from the package entry; BLOCK_TYPE_META still omits the type, resolveBlockDisplayMeta / resolveBlockTone answer for it exactly as before (the canvas-display-meta pin moved it to the unknown-type branch and asserts that). So the empty-frontmatter 11717-bump-prose declaration covers it truthfully. The exclusion-reason-truthfulness vacuity guard now asserts the empty population with its cause and re-arms by name; it is not a quarantine (no skip, no weakened assertion).

  12. Lockfile and floors — RIGHT. The lockfile diff is 69 lines each way: the seven @objectstack/* packages 17.6.0 to 17.7.0 in every importer, package and snapshot key, and exactly two specifier lines, ^17.6.0 to ^17.7.0 (types) and ^17.5.0 to ^17.6.0 (plugin-dashboard); no other package moves. Lockfile Integrity Check and Lockfile Dedupe Check are green. The two floors follow check:spec-floors' own rule (a floor carries every symbol the published artifact references): checkDashboardWidgetChartMeasureArity and checkPageRequiresKind are first exported in 17.7.0, DASHBOARD_WIDGET_MULTI_MEASURE_TYPES in 17.6.0.

  13. Test-only re-pins (flow inspector and client validation for the approval node, the 10859 batch-2 / batch-4 "crossed derivation" rows, the sixth z.lazy, the 7014 select control, the 8651 slot row, the 6152 fixture, the lockfile-integrity samples, the live-e2e backend pin, three historical ledger rows in check-installed-spec-pin-claims.mjs) — RIGHT. Each flips in the direction the spec moved and keeps or adds its control; none skips, deletes or weakens a row.

  14. Closing lines — RIGHT. Fixes #11334: chain under the new name, census row, imported constant, dimensionless two-measure pie pinned as ONE issue at values on both faces, the control stated per arm (flag 2). Fixes #11417: item 2 complete (mirror by reference, the two door assertions flipped, MEASURE_AXIS_CHART_FAMILIES imports the constant, per 5956394000). Fixes #11717: the lockfile, the three riders, every mechanical red fixed by row and the one non-mechanical red reported by row.

No path is governed (Governed Surface Queue Guard green; no .claude/**, skills/**, docs/adr/**, AGENTS.md or CLAUDE.md in the file list). 85 files, +942 / −574 against the merge-base, under the human-merge line.

② Semver level

Clause-②: yes (narrowing). The diff narrows the accept set of @object-ui/types on both published faces (items 1, 2 and 3) and the published enum of @object-ui/components (item 4), and the built declaration closure of @object-ui/types moves in both directions through the inlined spec shapes (the dev's measurement, consistent with the floor rising to ^17.7.0). The claim's Clause-②: no delegated the answer to that measurement, and the measured yes is right; the PR body carries it.

The changesets match what the diff publishes. Nine changesets, none major (Changeset Bump Policy green), and the fixed group bumps at the highest level declared, minor:

  • 11717-dashboard-widget-chart-measure-arity and 11717-page-requires-kind: @object-ui/types minor, each a narrowing with its breaking semantics and migration in the body (the repository's spelling for its own breaking change; yes takes at least minor), and each true to the spec source read at the tag (item 1's seven types, item 2's three kinds plus absent kind).
  • 11717-element-text-retired-variants: @object-ui/components minor, with the FROM → TO migration and the stored-node rendering disclosed.
  • 11717-objectstack-17-7-0: @object-ui/types and @object-ui/plugin-dashboard patch, the two floors, in the shape of the 17.6.0 bump entry (6158e4c: the floors named, the own-code contract moves listed, the by-reference moves left to the spec's floor). Here the own-code moves are in their own changesets instead of bullets, which declares them once each.
  • 11717-capability-view-all-audit-log (fields, i18n), 11717-spec-row-describes (plugin-gantt, plugin-timeline), 11717-master-detail-sort-field-refused (plugin-form), 11717-action-key-requires-membership-reach (core): patch, each matching items 7 to 10.
  • 11717-bump-prose: empty frontmatter, covering the comment-only and test-only source changes in app-shell, data-objectstack, plugin-calendar, plugin-designer, plugin-detail, plugin-kanban, core (optionRules.ts), components (text.tsx) and apps/console; item 11 verifies the one runtime-value change it covers ships no behaviour.

objectui has no check:adr-0087-registration gate and its AGENTS.md asks for no (narrowing) arm on the line, so the PR's Clause-②: yes — measured is the complete declaration in this repository; the arm above is this record's reading.

③ Boundary flags

Every dev flag (PR Deviations, Acceptance notes, the report's deviations, out_of_scope_findings, open_questions), answered or escalated.

  1. Clause-② measured yes against the claim's no — ANSWERED: agreed, yes (narrowing) (section ②).
  2. objectui#11334's one-dimension pie control stated per arm — ANSWERED, right. Read at the tag, SINGLE_SERIES_CHART_TYPES holds pie, so 17.7.0 refuses the ruling's literal control through the single-series arm; the only truthful control is per arm, and the pin has it: with one dimension the dimensionless message is gone, radar (in RESCUED_BY_A_DIMENSION) parses whole on both faces with two measures and a dimension, and one measure parses on every single-series type.
  3. Owner-card dedupe searches not run; left to the seat — ESCALATED to the seat: dedupe the four word sets the dev listed (eager closure vendor-objectstack 17.7.0 · calendar slot passthrough · object-grid operations read import · requiresMembershipReach) before filing anything from flags 8 and 9.
  4. MasterDetailDetailConfig keeps its Omit, against the objectui#11396 pin's forward note — ANSWERED: within scope. The card lists prose only; nothing published moves; the @ts-expect-error row still proves an authored sortField is a compile error. Noted for the plugin-form lane, not this PR: the dashboard-aria-retired-contract-twins precedent (objectui#9736) inherits a spec tombstone as a declared member typed as the spec's retired key, while this face subtracts it; both refuse an authored value, they differ only in keyof. One line to settle later, no carrier required now.
  5. PR body written once; the byte-precise eager-closure table and the head full-run reading are in the report — ANSWERED: the seat may paste them into the body's "Still red" and "Tests" rows; the check-runs above are the verdict either way.
  6. The verify lock was used although the dispatch said it does not apply; one local full run on the head before the PM's guidance; main moved nine commits after the merge and the PR reads behind — ANSWERED: harmless, reported, and the net diff reviewed here is against the merge-base 02a38967; mergeable reads true, and the queue rebuilds on main (the seat re-merges if the queue asks).
  7. Console parity pins sentences still call the object-calendar / object-kanban filter row z.unknown(); object-grid operations / conditionalFormatting and the root README example still accept or describe older shapes; no test red — ANSWERED: objectui#6152's strokes, by triage 6020673439, which this card's amendment carries in.
  8. ActionDef declares requiresFeature but not requiresMembershipReach; whether the runner should read the raw key is unmeasured — ESCALATED to the seat for routing after flag 3's dedupe: a reach: measurement is owed before a class is given (the spec's parse lowers both keys into visible, so the question is whether objectui's runner ever gates on the raw key). Not a stop for this PR.
  9. ObjectCalendarSchema.calendar keeps .passthrough() while the 17.7.0 spec slot is strict: objectui admits an unexamined key the spec refuses, the forbidden direction of objectui#8327 — ESCALATED to the seat: when this lands, that divergence exists on main, and a carrier must name it (the dev points at the objectui#8651 lane). The seat files the card, or confirms objectui#8651 carries the stroke, at landing; it is a Clause-② narrowing in its own right (follow the spec member by reference, drop the passthrough) with its own corpus measurement. Not a stop for this PR: the card's rule reports a non-mechanical row, and the diff narrows nothing wrongly here.
  10. date-only-zone-pins-10183 goes red with a worktree's vitest results cache present; record-details.hideFieldsUncast-9965 timed out under full load — ANSWERED: test-harness effects, not this branch's; every shard is green on the head; no carrier unless it recurs in CI.
  11. check:eager-closure left red — ESCALATED (already in flight per the card and the dispatch): the maintainer's ruling, two options stated by the dev (a raise in the objectui#11088 shape with a payback card, or a slimming of the spec root first). Noted for whichever PR moves the budget: the 17.6.0 bump entry carried a @object-ui/console bullet for the closure delta because the constants moved in that PR; here they do not, so no bullet is owed now, and the ruling's PR carries it.
  12. open_questions: none — nothing to answer.

Reviewer's own observations, none blocking:

  • WidgetConfigPanel.measureDoor-8894.test.tsx imports checkDashboardWidgetChartMeasureArity, a 17.7.0-only export, under @object-ui/plugin-dashboard's ^17.6.0 floor. Tests are not published and check:spec-floors judges the artifact only, so no floor is wrong; a consumer running that package's tests against a 17.6.0 spec would fail to compile, which no gate here guards and none needs to.
  • The PR states no verdict-change census over apps/, examples/ and content/ for the two new narrowings (items 1 and 2), the measurement objectui#7715's ruling asked of that card's own PR. Every corpus-reading gate on the head stands in and is green (Doc Snippet Type Check, Doc Example Id Check, Doc Component Type Check, README Export Check, Build Docs, Build & E2E, Skill Example Check), and the objectstack census at filing found 0 authored dimensionless multi-measure widgets in objectui.

Implemented-by: claude/issue-11717-objectstack-17-7-0
Reviewed-by: session_01XgevVHGcN8dnegiiY3v75V

VERDICT: PASS

claude added 2 commits October 7, 2026 00:22
Brings in main through 9b673e5; git merged without a conflict, the lockfile
and the locale packs included.

Claude-Session: https://claude.ai/code/session_01XgevVHGcN8dnegiiY3v75V
Co-authored-by: Claude <noreply@anthropic.com>
…tstack/* 17.7.0, on maintainer ruling A (objectui#11717)

The ruling is record 6027998226 on objectui#11717, verbatim
「A 抬预算+回收卡 (Recommended)」, answering decision request 6024630321.
One commit, in the objectui#11088 shape:

- BASELINE re-pinned to the merged head c1e32e9: 3,591,028 gzipped bytes
  across 331 of 2451 chunks, squashMerge null.
- MAX_EAGER_CLOSURE_GZIP_BYTES 3,410,284 to 3,637,000, which is
  3,591,028 + 45,568 rounded to the nearest thousand. Headroom is 45,972
  bytes = 0.50x the regression.
- vendor-objectstack: PER_CHUNK_BASELINE 1,420,958 to 1,604,474 and its
  ceiling 1,439,157 to 1,623,000 (headroom 18,526 = 0.20x). The retired
  ceiling fired on this build.
- A new header section names the ruling and gives the chunk table against
  a 9b673e5 control built the same way. The aggregate grows by +183,008,
  of which vendor-objectstack is +182,909. It says what the bytes buy and
  names the payback card objectstack#22044.

REGRESSION_THIS_GATE_MUST_CATCH_BYTES is untouched. No exemption was
added and no import was made lazy. The other three per-chunk rows passed
and did not move.

The unit test's rendered literal moves 3306.8 to 3506.9. The pin-claims
ledger entry for this file drops from two historical 17.6.0 sites to one,
because the provenance line now cites the 17.7.0 build. The bump changeset
gains the @object-ui/console bullet, following the 17.6.0 precedent.

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

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 331 chunks) 3506.9 KB 3551.8 KB
Main entry chunk (gzip) 154.9 KB 350 KB
Entry file index-CMszYIDo.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 17.82KB 6.58KB
app-shell (runtime-config.js) 22.59KB 7.89KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.40KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.70KB 10.94KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.11KB 7.97KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 578.94KB 139.21KB
core (index.js) 10.00KB 3.96KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 235.41KB 65.46KB
fields (index.js) 266.24KB 67.36KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 37.51KB 10.04KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.50KB 11.82KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.86KB 5.00KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.52KB 2.26KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.04KB 3.92KB
plugin-calendar (index.js) 53.39KB 15.52KB
plugin-charts (index.js) 84.26KB 23.05KB
plugin-chatbot (index.js) 199.63KB 47.46KB
plugin-dashboard (index.js) 144.22KB 38.99KB
plugin-designer (index.js) 231.46KB 48.87KB
plugin-detail (index.js) 247.73KB 65.20KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 177.12KB 45.90KB
plugin-gantt (index.js) 179.17KB 45.07KB
plugin-grid (index.js) 238.51KB 65.53KB
plugin-kanban (index.js) 52.17KB 16.37KB
plugin-list (index.js) 116.85KB 29.12KB
plugin-map (index.js) 25.60KB 8.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.12KB 12.29KB
plugin-timeline (index.js) 39.10KB 11.81KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 90.64KB 22.85KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 120.63KB 39.56KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.25KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet objectstack-fleet Bot changed the title chore(deps): resolve @objectstack/* 17.7.0; attach the objectui#11334 mirror and objectui#11417's arm, follow 17.7.0's mechanical moves; one non-mechanical red reported by row (objectui#11717) chore(deps): resolve @objectstack/* 17.7.0; attach the objectui#11334 mirror and objectui#11417's arm, follow 17.7.0's mechanical moves; the eager-closure line raised on maintainer ruling A (objectui#11717) Oct 7, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

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

Rendered by the isolated at-tier contract reviewer of domain:devx @ objectui seat 2, 2026-10-07T01:05Z, on the LANDING head. Inputs, and nothing else: card objectui#11717 (body and all seven comments: the claim 6019218018, triage's amendment 6020673439, the round-1 report 6024525892, the decision request 6024630321, the seat's ACCEPT 6024824834, the maintainer's ruling A 6027998226, the round-2 report 6028471471); PR objectui#11742 (body as updated 2026-10-07T00:54Z, the 87-file list, the net diff against main at the merge-base 9b673e54, lockfile included, and its five comments, the earlier at-tier record 6024785014 among them); the check-runs on b680973f; the objectui#11088 ruling 5890854293, read because ruling A names its shape; and the payback card objectstack#22044, read because ruling A requires one. Nothing was checked out, built, run or re-run; git diff and git show against fetched refs were the only reads of the tree, and the check-runs are the verdicts.

Check-runs on b680973f, read at 2026-10-07T01:05Z: 45 runs, 0 in progress — 42 success, 3 skipped by design (Test (coverage) and Test (coverage shard N/4) are push-only, dependabot is actor-gated), 0 failure. Earlier readings this round, each of the same head: 2026-10-07T00:55Z 31 success / 10 in progress, Bundle Analysis already completed green; 2026-10-07T00:58Z 32 / 9; 2026-10-07T01:00Z Type Check completed green, 33 / 8; 2026-10-07T01:02Z Spec Main Shape Gate and three shards completed green, 36 / 5; 2026-10-07T01:05Z every shard and the Test aggregate completed green. Read as completed and green, the contract-relevant gates: Type Check, Lint, Spec Main Shape Gate, Test with all eight shards, Test (dist pins), Build & E2E, Live E2E (informational), Bundle Analysis (green under the raised ceiling: PR comment 6028487050 reads the eager closure at 3506.9 KB gzipped across 331 chunks against a 3551.8 KB budget, status PASS — the first green Bundle Analysis on this PR), Lockfile Integrity Check, Lockfile Dedupe Check, Changeset Declaration, Changeset Bump Policy, Changeset Fixed Group Check, Changeset Claim Re-read, Changeset Overwrite Report, Governed Surface Queue Guard, Doc Snippet Type Check, Doc Example Id Check, Doc Component Type Check, README Export Check, Build Docs, Skill Example Check, Line Citation Gate, Control Byte Scan, Docs Route Eager Closure Check, Pre-Install Import Graph Check, Inert vi.mock Specifier Check, Action Ref Convention.

What moved since the PASS record 6024785014 on c7bbce48. The branch carries two commits past that head: c1e32e96, a merge of origin/main 9b673e54 (git reports no conflict and the diff 9b673e54..c1e32e96 is exactly the branch's own 85-file content, so the merge added nothing of its own), and b680973f, the eager-closure raise under ruling A (4 files, +143 / −35). I compared, file by file, the branch's hunks at c7bbce48 against its old merge-base 02a38967 with the branch's hunks at b680973f against 9b673e54, index lines dropped: 83 of the 87 files carry byte-identical hunks, the lockfile, every packages/** and apps/console/** file and eight of the nine changesets among them (the ten locale packs differ only by main's own merged-in lines; their branch hunks are identical). The four that differ are exactly b680973f's files: scripts/check-eager-closure-budget.mjs, scripts/__tests__/check-eager-closure-budget.test.ts, scripts/check-installed-spec-pin-claims.mjs and .changeset/11717-objectstack-17-7-0.md. For the 83, record 6024785014's items 1 to 14 are adopted below by citation, not re-derived; the four are judged here in full.

① Derived judgments

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

  1. Items 1 to 14 of record 6024785014 — adopted, each RIGHT on this head, on byte-identical hunks. The DashboardWidgetSchema mirror chained by import (packages/types/src/zod/complex.zod.ts); checkPageRequiresKind on the page nodes under ruling B1 (packages/types/src/zod/layout.zod.ts); the by-reference 17.7.0 narrowings re-pinned (sortField tombstone, choice types without options, resizableColumns, the approval node, visibleWhen beside group, ai:chat_window leaving the unions); element:text dropping heading / subheading (packages/components/src/renderers/basic/elements.tsx); ObjectCalendarSchema.calendar keeping .passthrough() and saying so; MEASURE_AXIS_CHART_FAMILIES as new Set(DASHBOARD_WIDGET_MULTI_MEASURE_TYPES); the MasterDetailDetailConfig Omit kept; SPEC_ACTION_KEYS gaining requiresMembershipReach; view_all_audit_log labelled in ten locales; the gantt / timeline describes; PALETTE_EXCLUSIONS losing ai:chat_window with no behaviour change; the lockfile moving exactly the seven @objectstack/* packages and two specifier lines; the test-only re-pins; and the three closing lines. The gates that re-derive each of these on this head are the ones listed in the check-run paragraph.

  2. scripts/check-eager-closure-budget.mjs: the fourth raise — RIGHT, and it is the ruling's letter. Ruling A (6027998226, the maintainer's verbatim 「A 抬预算+回收卡 (Recommended)」 answering 6024630321) asks for five things in one commit of this PR, in the objectui#11088 shape, and b680973f is one commit carrying all five:

    • the ceiling, BASELINE and the vendor-objectstack row of PER_CHUNK_BASELINE / PER_CHUNK_GZIP_CEILINGS raised together: MAX_EAGER_CLOSURE_GZIP_BYTES 3,410,284 to 3,637,000; BASELINE.gzipBytes 3,386,193 to 3,591,028 (chunks 330 to 331, totalChunks 2450 to 2451, commit 2ba091c to c1e32e96, squashMerge still null, the back-fill-only field); PER_CHUNK_BASELINE['vendor-objectstack'] 1,420,958 to 1,604,474; PER_CHUNK_GZIP_CEILINGS['vendor-objectstack'] 1,439,157 to 1,623,000;
    • the headroom at half of REGRESSION_THIS_GATE_MUST_CATCH_BYTES (89 × 1024 = 91,136, untouched): 3,591,028 + 45,568 = 3,636,596, rounded to the nearest thousand as the three earlier raises were, so the headroom is 45,972 bytes = 0.504x, and the test's constant-vs-constant guard (headroom under the regression size) holds; the chunk headroom is 18,526 bytes = 0.203x, the 0.20x band the two paybacks kept. The header's own arithmetic check is right too: over the retired baseline the new ceiling would carry 250,807 bytes, 2.75x the regression, which is why BASELINE had to move in the same commit;
    • the header names the ruling, the decision request and the selection verbatim (the new section "RAISED A FOURTH TIME, ON EXPLICIT MAINTAINER RULING (objectui#11717)");
    • the header gives the chunk table — control 9b673e54 against head c1e32e96, the instrument named (turbo run build --filter=!@object-ui/site under the verify lock, then pnpm check:eager-closure over apps/console/dist/eager-closure.json), the five named rows plus "everything else" summing to +183,008 of which vendor-objectstack is +182,909 and the other rows net +99 (18 + 11 + 9 + 28 + 33) — and says what the bytes buy (the console refusing what a 17.7.0 server refuses; the unblocked cards) and what they do not (no new console capability);
    • the payback card is named and exists: objectstack#22044, open, filed 2026-10-07T00:21Z, two minutes after the ruling, domain:spec, its body citing this ruling and the round-1 measurement, with the lowering rule stated in the header (ceiling and BASELINE come down by what it recovers, not re-derived, not rounded).
      The dev's reading is confirmed by an instrument that is not the dev's: Bundle Analysis on this head built the console in CI and read 3506.9 KB gzipped across 331 chunks against a 3551.8 KB budget, PASS (PR comment 6028487050), and 3,591,028 bytes is 3506.86 KB, so CI's own build agrees with the pinned baseline to the 0.1 KB the gate prints. No exemption was added, no import was made lazy, the other three per-chunk rows did not move, and REGRESSION_THIS_GATE_MUST_CATCH_BYTES is unchanged (read on the head). The script is not a bundler input: apps/console/vite.config.ts names it in comments only and imports nothing from it (grep on the head), so the dev's claim that b680973f cannot move the figure it pins holds.
  3. scripts/__tests__/check-eager-closure-budget.test.ts — RIGHT. The rendered-literal pins move 3306.8 to 3506.9 at both sites (the sensitivity message and the closure_gzip_kb output), and the ledger case's history comment gains objectui#11717; the pin that reads BASELINE.commit and squashMerge off the constants is data-driven and needed no edit. Nothing is skipped or weakened. The dev's local 179/179 is a report; the carrier is the Test shard that holds this file.

  4. scripts/check-installed-spec-pin-claims.mjs: the LEDGER entry for the gate file goes sites: 2 to sites: 1, with its why rewritten — RIGHT. The second 17.6.0 marker line that entry counted ("BASELINE's 2ba091c, the 17.6.0 bump's build, re-pinned both") now reads "BASELINE's c1e32e96, the 17.7.0 bump's build, re-pinned both", a present-tense claim at the pin that needs no ledger entry, so the entry had to come down or the gate's "partial repair fails on the count" rule reds. The one remaining historical line is quoted in the why. The carrier is the pin-claims test's "this repository, right now — has no unledgered drift and no rotted ledger entry" case, which runs in the Test shards; no workflow runs the gate directly.

  5. .changeset/11717-objectstack-17-7-0.md gains '@object-ui/console': patch and a bullet — RIGHT, and it is the 17.6.0 precedent's exact shape. 6158e4c's bump changeset carried a @object-ui/console: patch bullet for the closure delta the moment the constants moved in that PR ("the eager closure is 250,096 gzipped bytes lighter … and the bundle budget comes down by that amount"); record 6024785014 flag 11 said the bullet is owed by whichever PR moves the budget, and that PR is now this one. The bullet states the direction truthfully (heavier, +183,008, nearly all vendor-objectstack), names the ruling and the payback, and does not call it a capability. @object-ui/console is in the fixed group and not in ignore, so a real bump entry rather than an empty declaration is the right form.

  6. The merge commit c1e32e96 — RIGHT. It is a merge, not a rebase, as objectui's multi-agent discipline requires; git merged the lockfile without a conflict; Lockfile Integrity Check and Lockfile Dedupe Check are green on this head; and the per-file comparison above shows the branch's lockfile hunks identical to those 6024785014 judged (seven packages, two specifier lines).

No path is governed: no .claude/**, skills/**, docs/adr/**, AGENTS.md or CLAUDE.md in the 87-file list, and Governed Surface Queue Guard is green. 87 files, +1083 / −607 against 9b673e54, under the human-merge line. Line Citation Gate is green: the new header cites by sha, record id and symbol, never by a line address.

② Semver level

Clause-②: yes (narrowing) — unchanged from record 6024785014, on the same hunks: @object-ui/types narrows on both published faces (the measure-arity check, checkPageRequiresKind, the by-reference 17.7.0 moves behind the ^17.7.0 floor) and @object-ui/components narrows its published element:text enum. The PR body's line reads Clause-②: yes — measured, which is the complete declaration in this repository (no check:adr-0087-registration gate here, and objectui's AGENTS.md asks for no arm); the arm is this record's reading.

The changesets match what the diff publishes, and nothing b680973f adds publishes from a library. Nine changesets, none major; Changeset Declaration, Changeset Bump Policy, Changeset Fixed Group Check, Changeset Claim Re-read and Changeset Overwrite Report are green on this head. The fixed group bumps at the highest level declared, minor:

  • @object-ui/types minor twice (the two narrowings, each with breaking semantics and the fix in the body) and @object-ui/components minor (with the FROM → TO migration) — as 6024785014 judged;
  • patch for fields / i18n, plugin-gantt / plugin-timeline, plugin-form, core, and the floors changeset for types / plugin-dashboard — as judged;
  • @object-ui/console patch, new on this head (item 5): the console's published SPA inlines 17.7.0 and its first screen grows; a patch entry within a group that goes minor is the precedent's level and declares the delta once, in the CHANGELOG where a measured figure belongs as history (the 17.6.0 entry carried its 250,096 the same way);
  • 11717-bump-prose: empty frontmatter, unchanged.
    scripts/** is no published source, so b680973f owed no declaration of its own under check-changeset-presence; it added one anyway for the artifact that does change, which is the right side to err on.

③ Boundary flags

Every dev flag on this head — the round-2 report's deviations, out_of_scope_findings and open_questions, the PR body's Deviations and Acceptance notes — answered or escalated. Flags already answered in 6024785014 on identical hunks are not re-opened unless this head changes them.

  1. Container restart after b680973f was committed; the console build was not repeated; both commits re-read as unverified; gates re-run — ANSWERED: harmless and reported. The build that matters is CI's: Bundle Analysis rebuilt the console on this head and read the pinned baseline to the 0.1 KB (item 2). The script is not a bundler input (grep on the head).
  2. The 43 merged-in test files and the nine sibling script suites ran before the restart, on the c1e32e96 tree — ANSWERED: reports, not verdicts; the eight Test shards on b680973f are the verdict, read in the check-run paragraph.
  3. Pin-claims LEDGER entry re-counted 2 to 1 as a mechanical fix — ANSWERED: right (item 4), carried by the pin-claims test's live-tree case in the shards.
  4. PR title still reads "one non-mechanical red reported by row" — ESCALATED to the seat, not a contract matter: the body is current and names ruling A; the dev's suggested title is in report 6028471471; retitling is the seat's optional act (the title is outside this record's inputs' contract faces).
  5. Worktree objectui-issue-11717 kept for patch rounds; control worktree removed — ANSWERED: housekeeping within the seat's discretion; nothing of it reaches the diff.
  6. Commit trailers are the model-free pair, against a harness reminder asking for a model-named one — ANSWERED: right. objectui's AGENTS.md multi-agent discipline (objectui#9441, ruling A) makes the model-free pair the rule and the harness's own precedence clause the enforcement; b680973f carries exactly Claude-Session and Co-authored-by: Claude (read with git show).
  7. open_questions: none — nothing to answer.
  8. out_of_scope_findings: none new; round 1's stand — ESCALATIONS STANDING from 6024785014, for the seat at landing, unchanged by this head: flag 3 (dedupe the four word sets before filing), flag 8 (requiresMembershipReach: a reach: measurement before a class), flag 9 (ObjectCalendarSchema.calendar .passthrough() against the strict 17.7.0 slot: a carrier named at landing, objectui#6152 or objectui#8651's lane as the seat's ACCEPT 6024824834 already routes it).
  9. PR Deviations: Clause-② measured yes; the one-dimension pie control per arm; owner-card dedupe left to the seat — ANSWERED in 6024785014 (flags 1, 2, 3) on identical hunks; nothing on this head reopens them.
  10. PR Acceptance notes: ActionDef and requiresMembershipReach; the z.unknown() parity sentences; the Omit kept — ANSWERED in 6024785014 (flags 8, 7, 4) on identical hunks.
  11. Record 6024785014's flag 11 (check:eager-closure left red, awaiting a ruling) and flag 5 (the byte table and tests not in the PR body) — now CLOSED on this head: ruling A is given and executed (item 2), Bundle Analysis is green, and the PR body's "Resolved by ruling A", "Tests" and "Gates" sections carry the byte table, the round-1 full-suite readings and the round-2 gate readings.

Reviewer's own observations, none blocking:

  • BASELINE.commit is c1e32e96, a merge commit on a branch that will be squash-merged — the same provenance shape as 2ba091c and 4acbea07 before it, and the header says why a branch tip is the honest commit (the PR's own diff moved the figure); squashMerge is the designed back-fill, left null as the test pins. Whoever back-fills it after the queue lands this PR should also know the pin-claims ledger's provenance sentence cites c1e32e96.
  • The header's new table says "Both builds weigh 331 of 2451 chunks"; CI's reading on this head is 331 chunks, consistent.
  • The @object-ui/console bullet says the closure "grows by 183,008 gzipped bytes against a main build": a figure in a changeset is history by the time it ships, not a live claim, and the precedent entry carried one the same way; the live instrument stays pnpm check:eager-closure.

Implemented-by: claude/issue-11717-objectstack-17-7-0
Reviewed-by: session_01XgevVHGcN8dnegiiY3v75V

VERDICT: PASS

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