Skip to content

feat(types)!: retire sections[].collapsed from RecordDetailsComponentProps (objectui#8583) - #8636

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-8583-retire-sections-collapsed
Sep 8, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/issue-8583-retire-sections-collapsed

Conversation

@os-warren

@os-warren os-warren commented Sep 8, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #8583

Item 2 of the card, executed on the director seat's ruling 5588930745 (decision batch #101, option A), which applies standing ruling batch #87 (this repo does not declare a key @objectstack/spec refuses by name) and the 2026-08-27 retirement-pacing ruling 「项目在创业阶段,用户也很少,短期不考虑渐进。」. Item 1 — the six keys this type used to omit — landed in #8601.

What changed

RecordDetailsComponentProps.sections[] no longer declares collapsed. defaultCollapsed is the surviving spelling: it is what @objectstack/spec RecordDetailsProps.sections[] declares, and what DetailSection has always read (DetailSection.tsx:142). Retired outright, no transition window and no "refused upstream" annotation (option B, refused by the ruling).

file change
packages/types/src/record-components.ts -1 line: the collapsed?: boolean; declaration
packages/types/src/__tests__/record-details-section-members-8583.test.ts the item-2 type-level pin, four assertions plus one runtime probe
packages/types/src/__tests__/p1-spec-alignment.test.ts collapsed: true renamed to defaultCollapsed: true on its RecordDetailsComponentProps fixture
.changeset/retire-record-details-section-collapsed.md @object-ui/types minor, BREAKING banner, FROM/TO

⚠️ One correction to the brief, reported rather than smoothed over. The ruling asked for "the declaration and its docblock (:120 and :100)". Re-located on this head, and cross-read against the census SHA 9f5de79d and against 154fe2a (the merge base of #8601): line :120 is right, but collapsed has never had a docblock at any of those three points — line :100 is defaultCollapsed's docblock, added by item 1, which this ruling explicitly keeps. Deleting it would have hit the one thing the ruling forbids ("no other member touched"), so it was not deleted. The deletion is one line.

The pin is reached by the leg that TYPE-CHECKS

The card's own lesson: vitest strips types, and this package's build project excludes tests, so a pin that runs only under vitest measures nothing. The instrument is tsc -p packages/types/tsconfig.test.json — the third leg of @object-ui/types's type-check script. Proven, not assumed: tsc --listFiles on that project emits 614 files and the pin file is one of them (packages/types/src/__tests__/record-details-section-members-8583.test.ts, and p1-spec-alignment.test.ts alongside it).

Four legs, run from the committed implementation, each with on-disk mutation proof (anchor grep counts plus a git hash-object blob comparison against the HEAD blob) and restored with git checkout HEAD -- path verified by an empty git diff HEAD:

leg mutation tsc exit what the compiler said
0 none (committed state) 0 clean
1 — the pin FIRES strip the @ts-expect-error above collapsed: true 2 error TS2353: Object literal may only specify known properties, and 'collapsed' does not exist in type '{ name?: …; showBorder?: …; defaultCollapsed?: …; headerColor?: … }' — the error names the key, and the member set it prints carries defaultCollapsed and not collapsed
2 — ABLATION re-add collapsed?: boolean; to the interface, directive still stripped 2 TS2353 is gone (grep -c TS2353 = 0). The only error left is TS2578: Unused '@ts-expect-error' directive on the type-level pin at :162
3 — ABLATION on the committed pin re-add the member, directives intact 2 TS2578 twice, at :162 and :184 — both item-2 directives go unused, i.e. re-declaring the member makes this file red rather than quietly passing

Leg 1 vs leg 2 is the direction proof the ruling asked for: with the member deleted the collapsed literal produces a real tsc error naming the key, and re-adding the member makes exactly that error disappear. Legs 3 shows the committed pin's own failure mode.

The runtime half is a two-control read on the INSTALLED spec, not a restatement: defaultCollapsed is in the section object's key list and collapsed is not (the control that makes the zero a reading), and the canonical section plus collapsed draws unrecognized_keys naming exactly collapsed — while the same canonical section parses clean in control A above, so the refusal is attributable to the name.

The census, re-run on this head with controls — and one item of it FALSIFIED

⚠️ This section was rewritten after the contract review (defect 1). Its first version printed a pathspec that matches nothing: on git 2.43 git ls-files -- 'packages/*/src' returns 0 files ('packages/*/src/*' returns 3954; -- packages apps examples returns 5110), because a git pathspec has to match a FILE path and * already spans /. In that form the control could not have fired, so "exit 1, zero lines" was not a reading. ⛔ The evidence is not deleted and the conclusion is not restated without a measurement under it — the commands below are the ones actually run on this head, with their real output. The finding is unchanged: no reader or writer of this member survives in this repository.

1. The decisive reading — nobody who knows the type reads the key.

$ git grep -ln 'RecordDetailsComponentProps' -- packages apps examples
packages/plugin-detail/src/renderers/record-details.tsx
packages/types/src/__tests__/p1-spec-alignment.test.ts
packages/types/src/__tests__/record-details-section-members-8583.test.ts
packages/types/src/index.ts
packages/types/src/record-components.ts

$ git grep -nE '\.collapsed\b' -- $(git grep -ln 'RecordDetailsComponentProps' -- packages apps examples)
$ echo $?          # no output, no match
1

Five files know the type at all; not one of them reads .collapsed. record-details.tsx is the only non-test importer — it declares its schema as the props type intersected with an open string-keyed record, so an undeclared key would still reach it at runtime, and it never mentions the key.

2. .collapsed property reads tree-wide — 39 hits, every one on a different type.

$ git grep -nE '\.collapsed\b' -- packages apps examples | wc -l
39
$ git grep -nE '\.defaultCollapsed\b' -- packages apps examples | wc -l   # control
11
declaring type sites
chats-list hook state app-shell/src/console/ai/__tests__/useCollapsibleChatsList.test.tsx (12)
kanban column / lane plugin-kanban/src/KanbanEnhanced.tsx (6)
grouping field / group row plugin-list/src/ObjectGallery.tsx (3), plugin-grid/src/useGroupedData.ts (2), plugin-grid/src/ObjectGrid.tsx, plugin-grid/src/__tests__/groupingNullEntry-7217.test.tsx, components/src/custom/grouping-editor.tsx
object-form section plugin-form/src/ObjectForm.tsx (3), plugin-form/src/DrawerForm.tsx (3), components/src/renderers/form/form.tsx, app-shell/src/views/metadata-admin/SchemaForm.tsx, plugin-designer/src/__tests__/__mocks__/plugin-form.tsx, apps/console/src/components/FormPage.tsx
field GROUP (studio designer) app-shell/src/views/studio-design/ObjectGroupInspector.tsx
accordion item components/src/renderers/layout/containers.tsx
sidebar UI-state doc prose data-objectstack/README.md

⭐ The load-bearing row is the one that is empty: packages/plugin-detail/**, the only renderer of record:details, contributes zero of the 39 (grep -c plugin-detail over that output = 0, exit 1). Its collapse state is read as defaultCollapsed — DetailSection.tsx:142, SectionGroup.tsx:50, both inside the control's 11.

3. JSON writers — a true zero, with a live control on the same pathspec.

$ git grep -n '"collapsed"' -- '*.json'; echo $?
1
$ git grep -n '"collapsible"' -- '*.json' | wc -l   # control
4

The control's four hits are content/docs/components/disclosure/meta.json, two examples/schema-catalog schemas and packages/components/shadcn-components.json — so the zero above is a reading, not a broken search.

4. Literal collapsed: KEY writes tree-wide — 90 sites, all accounted for.

$ git grep -nE '(^|[^.A-Za-z0-9_])collapsed[[:space:]]*:' -- packages apps examples content e2e scripts | wc -l
90
$ git grep -nE '(^|[^.A-Za-z0-9_])defaultCollapsed[[:space:]]*:' -- packages apps examples content e2e scripts | wc -l   # control
21

Only three of the 90 sit anywhere near record:details, and each was opened: packages/types/src/__tests__/p1-spec-alignment.test.ts:293 is an ObjectFormSection; packages/plugin-detail/src/synth/__tests__/buildDefaultPageSchema.test.ts:973 is a fieldGroups INPUT entry, whose converter emits defaultCollapsed on the way out (buildDefaultPageSchema.ts:722); content/docs/plugins/plugin-detail.mdx:156 is English prose ("collapsible and default-collapsed:"), not a key — that doc's record:details schema block writes defaultCollapsed. Two more are this PR's own pin literals. The remaining 85 are grouping fields, kanban lanes and columns, form sections, wizard steps, accordion items, sidebar state, the chats-list hook, and gate scripts' own fixtures.

⛔ And the one census line of the ruling that is FALSE. The ruling reported "zero collapsed: in any record-details test". packages/types/src/__tests__/p1-spec-alignment.test.ts:501 wrote { label: 'Address', fields: [...], collapsed: true } inside const props: RecordDetailsComponentProps = { at :496, and tsconfig.test.json compiles that file. Left alone, the deletion turns the package's type-check red on the first push. Renamed to defaultCollapsed — fixture triage of the "it used the retired spelling" kind, not a fixture the pin replaced: the test's own assertions are columns, sections.length and layout, none of which reads the key.

⚠️ The limit the ruling declared, carried into the changeset: this census covers this repository only. An external TypeScript consumer of @object-ui/types that wrote collapsed is not observable from here — it gets TS2353 naming the key, which is why the changeset spells out the FROM/TO.

Gates run locally, exit code captured before any pipe

command exit
pnpm --filter @object-ui/types type-check (baseline, before any edit) 0
pnpm --filter @object-ui/types type-check (after) 0
pnpm --filter @object-ui/types build (tsc + check-dist-completeness) 0
pnpm --filter '@object-ui/plugin-detail^...' build (consumer closure) 0
pnpm --filter @object-ui/plugin-detail type-check (the one non-test consumer) 0
pnpm exec vitest run on the two changed test files (repo root, no --) 0 — 2 files, 45 tests
node scripts/check-changeset-presence.mjs 0
node scripts/check-changeset-no-major.mjs 0
node scripts/check-changeset-fixed.mjs 0
node scripts/check-control-bytes.mjs 0
node scripts/check-type-check-coverage.mjs 0
node scripts/check-governed-queue-guard.mjs --test on the four paths 0 — NOT GOVERNED
pnpm exec eslint on the three changed sources 0 (2 pre-existing no-explicit-any warnings, neither on a changed line)

plugin-detail type-check read 2 on its first run — Cannot find module '@object-ui/core', an unbuilt dependency closure, i.e. NOT MEASURED rather than red. It reads 0 after the closure build; that row is the second run.

Not measured locally, left to CI: the repo-wide pnpm test and pnpm lint, pnpm check, the docs-snippet and doc-type gates, and every other check:* in lint.yml.

Correction round after the ceiling-tier contract review (verdict: PASS)

The review at 5590429735 passed all five axes, reproduced the four ablation legs with matching results, and confirmed both refusals this PR made against the ruling. Two of its three defects are fixed here; the third was declined by the seat.

  • Defect 2 — a false sentence in a published artifact. FIXED, one line. The changeset used to close "the six keys this type used to omit landed in the previous release." That is false, and re-measured here rather than taken on report: git show c4326fe:.changeset/8583-record-details-section-members.md exits 0 — item 1's changeset is still pending on this PR's own base — and the 17.6.0 section of packages/types/CHANGELOG.md contains zero occurrences of 8583 (control: 17 occurrences of objectui# in the same section, so the zero is a reading). Both items ship in the same release. A changeset is this repository's input to release notes, so a wrong sentence there is wrong in the release notes. ⛔ Nothing else in that file moved: the **BREAKING** banner and the FROM/TO are byte-identical.
  • Defect 1 — the census evidence was not reproducible as written. FIXED in the body above, by re-running the census in a form that reproduces rather than by deleting the evidence or restating the conclusion bare.
  • Defect 3 — the changeset filename is not issue-prefixed. NOT changed, per the seat: 440 precedents of the same form on base, no collision, check-changeset-overwrite green.

验收备注

  • hideEmpty stays out, per the objectui#7129 ruling — not touched here.
  • collapsible stays; only the initial-state key moved.
  • No other member of the entry is touched: the diff on record-components.ts is a single deleted line.
  • Nothing under packages/types/src/zod/** or packages/types/package.json was touched (RecordDetailsComponentProps has no zod mirror; git grep collapsed packages/types/src/zod/ hits only navigation, complex and views, none of them this member), and zod-mirror-parity.test.ts is untouched — the hot-file fence held.
  • Out of scope, noted and not filed: collapsible?: boolean is now the only member of this entry with no docblock, while its six siblings each carry one. Cosmetic, inside the file this PR edits; the seat that next documents this entry is the carrier. Filing it would be a documentation nit, which is not one of the three fileable classes.

Clause-②: yes — the accept set of a published type face narrows. needs:contract-review is hung on this PR as well as on the card (双载体); ⛔ only the PM clears it, on a transcript-verified CONTRACT_REVIEW_TIER PASS.

Drafted by the domain:spec @ objectui dev seat in session session_01Jmxdo7bmeqCQHLSfmLVX9w; the branch is claude/issue-8583-retire-sections-collapsed.


Generated by Claude Code


Generated by Claude Code

…ntProps (objectui#8583)

`@objectstack/spec` `RecordDetailsProps.sections[]` refuses `collapsed` by name
(`unrecognized_keys`) and declares `defaultCollapsed` for that state — the
spelling `DetailSection` has always read. So this type declared the one collapse
key an author could write in TypeScript and the contract rejects, while the key
the contract accepts did not compile until item 1 landed it.

Retired outright, no transition window: director seat decision batch #101 applies
standing ruling batch #87 (this repo does not declare a key the spec refuses by
name) and the 2026-08-27 retirement-pacing ruling. Zero readers and zero writers
of this member in the repository, re-measured on this head with controls, so the
removal is rename-free rather than a migration.

The pin is reached by the leg that TYPE-CHECKS. `vitest` strips types and this
package's build project excludes tests, so `tsc -p tsconfig.test.json` — the
third leg of `type-check` — is the only invocation that reads the pin file. Its
`@ts-expect-error` directives are the assertion: re-declare the member and they
go unused (TS2578).

The one in-repo writer the ruling's census reported as zero was real —
`p1-spec-alignment.test.ts` wrote `collapsed: true` on a
`RecordDetailsComponentProps` literal — and is renamed to the surviving spelling.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jmxdo7bmeqCQHLSfmLVX9w
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3477.2 KB 3512.7 KB
Main entry chunk (gzip) 143.9 KB 350 KB
Entry file index-DYhQBYp_.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) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
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) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 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) 498.93KB 114.12KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 10.12KB 3.28KB
data-objectstack (index.js) 198.39KB 55.29KB
fields (index.js) 243.73KB 61.53KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
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) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
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) 15.16KB 3.68KB
plugin-calendar (index.js) 49.00KB 13.91KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 194.53KB 46.34KB
plugin-dashboard (index.js) 131.43KB 34.44KB
plugin-designer (index.js) 213.21KB 43.63KB
plugin-detail (index.js) 251.10KB 64.96KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 131.01KB 32.32KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 208.30KB 56.63KB
plugin-kanban (index.js) 55.44KB 15.73KB
plugin-list (index.js) 112.73KB 27.69KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.33KB 3.25KB
plugin-view (index.js) 84.54KB 20.84KB
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.66KB 3.50KB
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) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
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) 0.20KB 0.18KB
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) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
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) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
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

…ngeset

The changeset closed with "the six keys this type used to omit landed in the
previous release." Item 1's changeset,
`.changeset/8583-record-details-section-members.md`, is still PENDING on this
PR's own base `c4326fe` (`git show` on it exits 0), and the `17.6.0` section of
`packages/types/CHANGELOG.md` carries zero occurrences of `8583` — control: 17
occurrences of `objectui#` in that same section, so the zero is a reading. Both
items ship in the SAME release.

A changeset is this repository's input to release notes, so a wrong sentence
there is wrong in the release notes, read by people who were never in the
thread. Prose only: the `**BREAKING**` banner and the FROM/TO stay
byte-identical, and no other file moves.

Found by the ceiling-tier contract review of PR #8636 (defect 2), verified here
rather than taken on report.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jmxdo7bmeqCQHLSfmLVX9w

Copy link
Copy Markdown
Contributor

Contract review (claude-fable-5-1, isolated seat) — PR #8636 @ 4983cb9

Verdict: CHANGES REQUIRED — one line of changeset prose. The type face, the pin, the bump grade, the census and the carriers all check out; what does not is a factual sentence in a file that becomes release notes.

Reviewed head 4983cb98971292c82d3d3f864544b84f4feba747 (1 commit, linear on merge-base c4326fe; origin/main at read time 00ce6bf). Read-only: refs/review/8636 fetched, git show/git diff/git grep only, ref deleted afterwards; nothing checked out, nothing run against the tree. Where a leg needs execution (tsc), I read the mechanism and cite CI on this head rather than a local run.

Ruling implemented: decision batch #101, card #8583 comment 5588930745 — the director seat applying two maintainer rulings (batch #87, objectui#8367 5582071618 confirmed 5582246697 「批 #87 同意」; and the 2026-08-27 retirement-pacing ruling 「项目在创业阶段,用户也很少,短期不考虑渐进。」), not a new ruling of its own. Quoted once, the execution paragraph:

Delete collapsed?: boolean and its docblock from the sections[] entry; defaultCollapsed (landed by item 1, PR #8601) is the spelling. […] remove the member and docblock; a type-level pin (reached by the leg that type-checks, not vitest alone — the card's own lesson) that a sections[] literal with collapsed is refused by tsc and one with defaultCollapsed is accepted; changeset @object-ui/types minor with a BREAKING banner and the FROM/TO (collapsed → defaultCollapsed), no migration prescription; Clause-②: yes […]; no other member touched, hideEmpty stays out.

Implemented: yes, with two documented deviations from the ruling's letter that I re-measured and confirm are correct (findings 2 and 3 below) — the ruling's census had two wrong lines, and the PR followed the ruling's intent ("no other member touched") over its letter in both cases.

Governed paths touched: NO — diff vs merge-base is exactly four files: .changeset/retire-record-details-section-collapsed.md (+31), packages/types/src/__tests__/p1-spec-alignment.test.ts (1/1), packages/types/src/__tests__/record-details-section-members-8583.test.ts (+82/−5), packages/types/src/record-components.ts (−1). Nothing under AGENTS.md, CLAUDE.md, .claude/**, docs/adr/**, content/docs/releases/**; CI Governed Surface Queue Guard success.

Clause-②: yes (feat!) — accept set narrows on a published type face. Carriers present: needs:contract-review on the PR (labels: package: types, tests, needs:contract-review) and on card #8583. PR body opens Fixes #8583 (one PR, Fixes, as the ruling asked). RULE 2: the single commit carries no card-relation trailer — subject references (objectui#8583), body has no Fixes/Closes, trailers are Co-Authored-By and Claude-Session only.

The hunk

record-components.ts @@ −117,7 +117,6: the only change is - collapsed?: boolean; between collapsible?: boolean; and }>;. Section entry on the head declares exactly name, label, fields, group, columns, icon, description, showBorder, defaultCollapsed, headerColor, collapsible — the six from PR #8601 (columns, icon, description, showBorder, defaultCollapsed, headerColor) all present with their docblocks; hideEmpty absent (git grep -w hideEmpty on the file: no hit). complex.ts:146, navigation.ts:154, objectql.ts:1073, packages/types/src/zod/**, packages/types/package.json: zero diff vs merge-base.

The pin (type-checked, not vitest-only)

packages/types/tsconfig.test.json include: ["src/**/*.test.ts", "src/**/*.test.tsx"] — both test files are program inputs of the third leg of type-check (tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json); the build project tsconfig.json excludes **/__tests__/**, so this leg is the only one that reads the pin. CI Type Check on 4983cb9: success (19:02:03Z).
Mechanism, read off the head file: type Expect<T extends true> = T and type IsSectionMember<K> = K extends keyof Section ? true : false. // @ts-expect-error sits on type _CollapsedIsRetired = Expect<IsSectionMember<'collapsed'>> (TS2344 today) and on the collapsed: true key of a RecordDetailsComponentProps section literal (TS2353 today); type _DefaultCollapsedSurvives = Expect<IsSectionMember<'defaultCollapsed'>> and a defaultCollapsed: true literal carry no directive and must compile. Re-adding the member turns both directives unused → TS2578, so the file reddens rather than silently passing — yes, the unused-@ts-expect-error mechanism is what makes it a pin. Instrument controls are present (_ExpectRefusesFalse, _EqualRefusesNever/Any, _UndeclaredKeyIsRefused). Runtime half: two-control read on the installed spec (defaultCollapsed in the section key list, collapsed not; canonical section + collapsed → unrecognized_keys naming exactly ['collapsed']).

Census (re-run on the head)

git grep -n -w collapsed refs/review/8636 -- 'packages/plugin-detail/src/**' 'packages/types/src/record-components.ts' 'examples/**' 'content/docs/**': 41 hits, every one classified — prose/comments, RecordChatterPanel/RelatedList local state, buildDefaultPageSchema collapse: 'collapsed' (a different key, mapped to defaultCollapsed at :722), mockDataSource.ts:46 (a fieldGroups comment), schema-reference.md:826 (the ObjectFormSection legacy alias), breadcrumb collapsed-trail, kanban lane. Zero readers or writers of RecordDetailsComponentProps.sections[].collapsed; packages/plugin-detail reads defaultCollapsed only (DetailSection.tsx:142 control hit). Writers-in-TS: \bcollapsed\s*: over packages/types/src/**, packages/plugin-detail/src/**, packages/react/src/**, apps/** — all remaining hits are ObjectFormSection, RenderableSection (console FormPage.tsx:449/556), kanban/navigation zod, or the pin's own directive-guarded literals. zod-mirror-parity.test.ts: no RecordDetails/record-components reference (the type has no zod mirror), untouched — no drift row can move.

Changeset

@object-ui/types: minor ✔ · **BREAKING** — … banner ✔ · **FROM** collapsed **TO** defaultCollapsed + before/after snippet ✔ · no migration prescription ✔ (only "rename the key at the authoring site", i.e. the FROM/TO restated) · census limit carried ✔. Convention: AGENTS.md:240 — objectui's own breaking changes are minor with the break spelled out in the body; check-changeset-no-major.mjs enforces it; siblings (3917-retire-action-condition-branch.md, 13626-formview-section-style-keys-retired.md) follow the same shape. ADR-0087 has no objectui counterpart (docs/adr/ has no 0087) and does not apply — this retires a TS type-face member, not a packages/spec property. Gates on the head: Changeset Declaration, Changeset Bump Policy, Changeset Fixed Group Check, Changeset Overwrite Report all success. One false sentence — finding 1.

CI reading (head 4983cb9, read once)

33 check runs, all completed: 30 success, 3 skipped (Test (coverage), the Test (coverage shard …) matrix template, dependabot). Named: Type Check ✔ · Build Docs ✔ · Test (shard 1/4) ✔ · Test (shard 2/4) ✔ · Test (shard 3/4) ✔ · Test (shard 4/4) ✔ · Lint ✔ · Build & E2E ✔ · Doc Snippet Type Check ✔ · Doc Component Type Check ✔ · Governed Surface Queue Guard ✔. mergeable_state: unknown at read time (not computed by GitHub yet). Draft: yes.

Findings

  1. Medium — false fact in published release-notes input. The changeset ends: "Retires the last member of the divergence objectui#8583 measured; the six keys this type used to omit landed in the previous release." Item 1's changeset .changeset/8583-record-details-section-members.md is still pending on this PR's own base c4326fe (and on the head), and packages/types/CHANGELOG.md's top entry ## 17.6.0 has zero 8583 mentions — both items ship in the same release. A changeset is this repo's input to content/docs/releases/, so the sentence would be wrong where people outside this thread read it. Expectation: reword (e.g. "…the six keys this type used to omit land in the same release, item 1") or drop the clause; nothing else in the file moves; the corrective push moves the head, so the re-review of the increment should confirm the diff vs 4983cb9 touches only that file.
  2. Low / accepted — scope beyond "one member removal + pin + changeset". p1-spec-alignment.test.ts:501 renamed collapsed: true → defaultCollapsed: true on a RecordDetailsComponentProps fixture. Re-measured: that line exists identically at the ruling's census SHA 9f5de79d and at c4326fe, so the ruling's "zero collapsed: in any record-details test" was false, and since tsconfig.test.json compiles that file the deletion alone would have reddened Type Check. Fixture triage of the retired spelling, not a fixture the pin replaced; the ruling's defaultCollapsed-is-the-spelling clause covers it. Expectation: none — correct as done; recorded because the brief counts anything beyond the three items.
  3. Info — the ruling's ":100 docblock" does not exist for this member. At 9f5de79d and c4326fe alike, :100 is the second line of the /** … */ block at :99–104 whose member is :105 defaultCollapsed?: boolean;, and :119 collapsible?: boolean; sits directly above :120 collapsed?: boolean;. collapsed never had a docblock; deleting :100 would have been the "other member touched" the ruling forbids. The PR's one-line deletion is the correct reading. Expectation: none; the director seat may want to note the correction on the card for the record.
  4. Low — PR-body measurement not reproducible as written (body only, not published). git grep -nE '\.collapsed\b' … packages/*/src … "exit 1, zero lines": under git pathspec rules 'packages/*/src' matches 0 files (packages/*/src/** matches 3954), so neither the zero nor the \.defaultCollapsed\b control could have fired in that form; with the glob, \.collapsed\b hits 14 files — all other types (kanban lane, grouping fields, ObjectFormSection/DrawerForm, navigation, useCollapsibleChatsList, RenderableSection). The conclusion (zero readers of this member) holds on my per-hit classification; the stated command/result pair does not. Expectation: correct the body's command or its stated result so the evidence can be re-run.
  5. Nit — changeset filename. .changeset/README.md:51 prescribes <issue>-<slug>.md; this one is retire-record-details-section-collapsed.md while its sibling item-1 file is 8583-…. No gate enforces it (Changeset Overwrite Report success, no collision). Expectation: optional rename to 8583-retire-record-details-section-collapsed.md if the head moves anyway for finding 1; not blocking.

Maintainer-only merge: no — a feat! type-face narrowing under a director-seat ruling that applies two confirmed maintainer rulings, non-governed paths, changeset grade per AGENTS.md:240; the required change (finding 1) is one line of prose the dev seat fixes and the director seat lands after a targeted re-review of the increment. Nothing here needs the maintainer.


Generated by Claude Code

@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3477.4 KB 3512.7 KB
Main entry chunk (gzip) 143.9 KB 350 KB
Entry file index-CUuu9hOC.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) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
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) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 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) 498.93KB 114.12KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 10.12KB 3.28KB
data-objectstack (index.js) 198.39KB 55.29KB
fields (index.js) 243.73KB 61.53KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
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) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 5.12KB 1.74KB
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) 15.16KB 3.68KB
plugin-calendar (index.js) 49.00KB 13.91KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 194.53KB 46.34KB
plugin-dashboard (index.js) 131.43KB 34.44KB
plugin-designer (index.js) 213.21KB 43.63KB
plugin-detail (index.js) 251.10KB 64.96KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 131.01KB 32.32KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 208.30KB 56.63KB
plugin-kanban (index.js) 55.44KB 15.73KB
plugin-list (index.js) 112.73KB 27.69KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.33KB 3.25KB
plugin-view (index.js) 84.54KB 20.84KB
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.66KB 3.50KB
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) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
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) 0.20KB 0.18KB
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) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
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) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
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

Copy link
Copy Markdown
Contributor

Contract review (claude-fable-5-1, isolated seat) — PR #8636 @ 55c135d

Verdict: PASS — targeted re-review of the moved head. The one required change from the prior review is made, is true on the base it describes, and nothing else moved.

Reviewed head 55c135d573a9be8dc8d47b8af4cf7571517638f2 (2 commits, linear on merge-base c4326fe; origin/main at read time 3619792). Read-only: refs/review/8636 fetched, git diff/git show/git grep only, ref deleted afterwards; nothing checked out, nothing run against the tree.

Increment reviewed: 4983cb98..55c135d — exactly one file, .changeset/retire-record-details-section-collapsed.md, +3/−2, confined to the closing paragraph. No other path in git diff --stat.

Prior findings (comment 5590491910 @ 4983cb9): 1 closed · 2–5 unchanged (2 accepted, 3 info, 4 body-only, 5 nit — none blocking).

Finding 1 — closed, and the replacement sentence re-measured

Old: "…the six keys this type used to omit landed in the previous release." New: "The six keys this type used to omit are item 1 of the same card; its changeset is still pending, so both halves ship in this release." Re-measured rather than taken on report: git cat-file -e c4326fe:.changeset/8583-record-details-section-members.md exits 0 (item 1's changeset is pending on this PR's base) and the same on origin/main 3619792 exits 0 (still pending at read time); the ## 17.6.0 section of packages/types/CHANGELOG.md on the base carries 0 occurrences of 8583 (control: 17 objectui# in the same section). The new sentence is true.

Everything else in the changeset is byte-identical to 4983cb9: frontmatter '@object-ui/types': minor, the **BREAKING** — … banner, **FROM** collapsed **TO** defaultCollapsed, the before/after snippet, the collapsible clause and the census-limit paragraph — full-file diff shows only the @@ -27,5 +27,6 hunk.

The three code files did not move

Blob ids equal between 4983cb98 and head: record-components.ts a3c22d5e, record-details-section-members-8583.test.ts 243342fc, p1-spec-alignment.test.ts f2e3c7b7. The prior review's type-face, pin, census and hot-file-fence readings transfer unchanged. Section entry on the head still declares exactly name, label, fields, group, columns, icon, description, showBorder, defaultCollapsed, headerColor, collapsible; hideEmpty absent.

PR body

Fixes #8583 present as the first line. The "Correction round" section describes what the head has: defect 2 (= prior finding 1) fixed in the changeset; defect 1 (= prior finding 4) fixed in the body — I re-ran the rewritten census on the ref and every number reproduces (5 files know the type, \.collapsed\b over them exits 1; 39 / 11 / plugin-detail 0; "collapsed" in *.json exits 1 with control 4; collapsed: 90 / defaultCollapsed: 21; packages/*/src as a pathspec matches 0 paths vs 3954 with /); defect 3 (= prior finding 5) declined, stated. Info, not a defect: the body attributes the round to the card-side CONTRACT_REVIEW_TIER review 5590429735 (PASS, three defects) rather than to this seat's 5590491910 (CHANGES REQUIRED, five findings) — the two reviews are independent and flagged the same sentence; both are satisfied by this head. RULE 2: neither commit carries a card-relation trailer — trailers are Co-Authored-By and Claude-Session only; the subject's (objectui#8583) is a reference, not a trailer.

Governed paths touched: NO — whole diff vs merge-base is the same four files as before; node scripts/check-governed-queue-guard.mjs --test on them: NOT GOVERNED — 4 path(s) checked against 5 governed surface(s); none matched, exit 0. CI Governed Surface Queue Guard success on the head.

Carriers: needs:contract-review present on the PR (labels package: types, tests, needs:contract-review) and on card #8583. Left for the director seat to clear.

CI reading (head 55c135d, read once at ~19:17Z, runs started 19:15:21Z)

33 check runs: 19 success, 11 in progress, 3 skipped, 0 failures. Completed success: Build Docs, Build & E2E, Changeset Declaration, Changeset Bump Policy, Changeset Fixed Group Check, Changeset Overwrite Report, Governed Surface Queue Guard, Doc Component Type Check, Control Byte Scan, Doc Fence Language Check, Internal Docs Link Check, Docs Route Eager Closure Check, Pre-Install Import Graph Check, Inert vi.mock Specifier Check, Skill Guide Path Check, Action Ref Convention, Shell Escape Residue Scan, Skill Eval Token Check, label. In progress: Type Check, Test (shard 1/4), Test (shard 2/4), Test (shard 3/4), Test (shard 4/4), Lint, Doc Snippet Type Check, Bundle Analysis, Live E2E (informational), README Export Check, Skill Example Check. Skipped: Test (coverage), the coverage-shard matrix template, dependabot. The in-progress legs run on code blobs byte-identical to 4983cb9, where each of them was success; the only changed file is prose in a changeset, and all four changeset gates are already green on this head. The merge queue owns the final read.

mergeable_state: behind — 4 commits (1ebaf721, 00ce6bf1, 1267508e, 3619792b); none of them touches any of this PR's four files, so no textual conflict. The merge queue's to resolve, not a finding. Draft: yes.

Maintainer-only merge: no — the increment is one true sentence of changeset prose; the prior review's grounds (director-seat ruling applying two confirmed maintainer rulings, non-governed paths, minor grade per AGENTS.md) are unchanged.


Generated by Claude Code

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

Projects

None yet

3 participants