Skip to content

test(plugin-grid,console): pin the members of object-grid's four toolbar keys (objectui#8071 slice 13) - #9836

Merged
os-sales merged 1 commit into
mainfrom
claude/issue-8071-member-pins-slice-13
Sep 18, 2026
Merged

os-sales merged 1 commit into
mainfrom
claude/issue-8071-member-pins-slice-13

Conversation

@os-sales

Copy link
Copy Markdown
Collaborator

Refs #8071 — slice 13. At least seven exemptions remain after this one, so the card stays open; this PR is deliberately written with no closing keyword anywhere in it.

Clause-②: no

What this slice does

Four object-grid keys leave MEMBER_PIN_EXEMPTIONS and enter MEMBER_PINS, and MEMBER_PIN_EXEMPTION_CEILING moves to the new count in the same commit: batchActions, pagination, searchableFields, selection.

It also repairs five figures in registry-inputs-spec-parity.test.ts that had rotted into present-tense claims about shared, ratcheting constants.

The batch, and why it is this one

The dispatch deliberately did not name a batch. It handed over slice 12's reading and asked for one chosen by where the reads cluster. The constant was re-taken by this seat from the declaration itself, on origin/main 26ac50369, before the first edit — not from the card's prose list, which its own dated block says is stale in both directions.

object-grid held eleven. Four of the eleven are the ones slice 12 already read and ruled one-slice-each (columns pulls in the column fold and the $select projection; grouping pulls in useGroupedData; filter and sort each carry dedicated files that need reading end to end). That leaves seven, and four of those seven are one read:

ObjectGrid.tsx resolves all four inside the single fold that assembles the data-table props, and each is the canonical half of a canonical-vs-deprecated pair nothing had asserted the precedence of:

key read as deprecated sibling it outranks
pagination schema.pagination !== undefined, then .pageSize / .pageSizeOptions showPagination, flat pageSize
searchableFields !== undefined ? length is positive : showSearch showSearch
selection schema.selection?.type selectable
batchActions schema.batchActions ?? schema.bulkActions (it IS the legacy half; its result feeds selection's last fallback arm)

batchActions is in the batch because its result is what hasBulkActions reads, and hasBulkActions is the third arm of the very chain selection is pinned on. The four meet at one gate. Three files, two of them promotions after growth.

The three keys left behind on this block after this slice — aggregations, dataSource, navigation — plus the four slice 12 ruled, are the seven that remain.

The finding the clustering surfaced

Two adjacent object-armed keys on one block read their own presence in opposite ways, and neither description says so. pagination is read as !== undefined, so the object's presence alone enables paging and overrules showPagination: false. selection is read as ?.type, so the object's presence alone does nothing at all. That asymmetry is now pinned from both sides with its controls.

Consequences an author suffers, named

  • selection — a grid declaring bulkActions: ['approve'] and selection: { type: 'none' } renders with no checkbox in it. none is an explicit off that beats both fallback arms, including the auto-enable the bulk-action declaration would otherwise trigger. The bar the author declared can never be populated; nothing is thrown, nothing is logged, and the schema reads as configured.
  • pagination — pageSizeOptions REPLACES the built-in rows-per-page list rather than extending it. An author who adds pageSizeOptions: [200] to offer one larger step silently deletes 5 / 10 / 20 / 50 / 100 from the selector. The control still renders and still works; it simply no longer offers what it offered yesterday.
  • searchableFields — an empty array is not "narrow nothing", it is search off: the toolbar box disappears. An author who empties the list while re-picking fields loses the control, not the narrowing.
  • batchActions — a schema half-migrated to bulkActions that leaves batchActions: [] behind loses every bulk action. The checkboxes still tick and the selection bar still counts; only the buttons are missing.

Every pin shown FAILING, with the restore proven

Five ablations. Each mutates the read site toward the plausible improvement, proves the mutation reached disk (anchor and injected text each counted before and after — a zero-hit edit tool exits 0 and would otherwise read as a run), runs the three pin files, then restores from HEAD under a trap and proves the restore by blob hash plus an empty git diff HEAD. Target blob at HEAD: 552dc5a51f97698a655f7771b7b9507658dba7ca; every leg restored to exactly that.

mutation applied to the read site vitest exit tests red which
prefer the deprecated flat pageSize over pagination.pageSize 1 1 of 28 pagination.pageSize WINS over the deprecated flat pageSize
drop the pageSizeOptions pass-through, always use the built-in list 1 1 of 28 pageSizeOptions REPLACES the built-in rows-per-page list
read type: 'none' as no opinion, fall through to the legacy/auto arms 1 2 of 28 none is an explicit OFF that beats the bulk-action auto-enable; none also beats the deprecated selectable: true
let an EMPTY searchableFields fall through to showSearch 1 1 of 28 an EMPTY searchableFields turns the search box OFF
fall through to bulkActions when the legacy array is EMPTY 1 1 of 28 an EMPTY batchActions still wins — a declared [] is a VALUE, not an absence

One reading was refused by its own ablation, and the prose was corrected rather than the ablation retried until it agreed. The batchActions pin first said the empty array survives because the coalesce is nullish. Swapping ?? for || left all 28 tests green: an empty array is both non-nullish AND truthy, so the two operators are indistinguishable here. The docblock in bulkActionsSpecKey.test.tsx and the pins prose in the ledger now say that explicitly, and the recorded mutation is the one that actually can fail it — an explicit length test, which is the repair a reader would really reach for.

Set identity and the ceiling, in the same commit

Read out of the diff, not asserted:

  • leaving MEMBER_PIN_EXEMPTIONS: object-grid.batchActions, object-grid.pagination, object-grid.searchableFields, object-grid.selection
  • entering MEMBER_PINS: the same four, nothing else, in either direction
  • MEMBER_PIN_EXEMPTION_CEILING: 20 to 16 on one line of the same commit, and the live declaration below it holds exactly 16 entries

Both readings were taken at 26ac50369, which is this branch's base and origin/main at push time — no merge intervened, so no count here spans one.

The prose repair — as a rule or a dated reading, never today's number

Five figures repaired. Each had become a present-tense claim about a constant that ratchets under every later slice, which is the defect objectui#9781 names and repairs; writing today's value in would author it a third time this shift.

rotted text, re-taken from the file repaired as
"and the reason MEMBER_PIN_EXEMPTION_CEILING reads 62" a DATED reading: objectui#8176 RAISED it — the one raise this constant has had — plus an explicit note that the number is deliberately not restated because it only ratchets down
"MEMBER_PIN_EXEMPTION_CEILING stays 62" a RULE: it DID NOT MOVE for those keys; "a new array key gets a pin, never room" is what survives, the number is the declaration's
"lists all 50 remaining keys BY NAME" a RULE: lists EVERY remaining key by name — the list IS the census, so read it rather than any count written about it
"the cheap way to green a new array key is to add a 51st entry" "…is to add ONE MORE entry", with the assertion that refuses it named
"cannot be absorbed by adding a 51st entry" "…by adding ONE MORE entry", plus a note that neither the count nor the ceiling is written into that docblock

A sixth in the same class was repaired opportunistically while the file was open: AWAITING_A_PIN's docblock opened "One shared constant rather than 58 near-copies", which reads as a live count of the list. It now says "rather than one near-copy per entry"; the measured population size stays in the string below it, where it is attributed to the card that measured it.

Files

  • NEW packages/plugin-grid/src/__tests__/gridPagerSelectionMembers-8071.test.tsx — pagination and selection. Neither had a file constraining its members at the grid. groupedPagination.test.tsx names the block and the key and would satisfy a string locator, but its subject is GROUP paging and its one pagination fixture exists to suppress a pager; data-table-selection-mode.test.tsx pins the vocabulary one layer down and never names object-grid, so this repo's own locator would have refused it. Neither was credited.
  • GROWN, then promoted serverSearch.test.tsx — searchableFields. Its ADR-0061 row really does pin the key's forwarding, a genuine near miss, but with a single-member array and no arity row. Grown by ordering (a deliberately non-alphabetical pair), the empty-array arm, and the precedence over showSearch: false.
  • GROWN, then promoted bulkActionsSpecKey.test.tsx — batchActions. Its whole subject IS the alias precedence, but both fixtures are non-empty, so the empty-array arm was unstated. Grown by that row and by the auto-enable row.
  • apps/console/src/__tests__/registry-inputs-spec-parity.test.ts — the four registrations, the four deletions, the ceiling, the slice-13 accounting section, the prose repairs.
  • .changeset/8071-grid-toolbar-member-pins-slice-13.md — empty frontmatter.

A member with no read site, reported rather than frozen into the pin

The GROUPED pager ignores both pagination members. ObjectGrid's own grouped pager hard-codes its rows-per-page choices and reads neither pagination.pageSize nor pagination.pageSizeOptions, so an authored pageSizeOptions reaches the flat pager and is dropped the moment grouping is authored. The pin asserts the flat path and says in its own prose that it does. Slice 9's choice, for slice 9's reason: an assertion that a member is dead has to be deleted before anyone can make it live. Handed back as a finding; no card filed from this seat.

Changeset grade, MEASURED

Empty frontmatter, and measured rather than assumed. Both affected packages were built and their files[] entries grepped for symbols this diff introduces, each with a lit control drawn from the same probed population:

package published paths probed probes (symbols this diff adds) lit controls
@object-ui/plugin-grid dist, README.md, CHANGELOG.md, LICENSE gridPagerSelectionMembers 0 · "the coalesce is nullish" 0 · "an EMPTY member list disables search" 0 pageSizeOptions 9 · resolveRowCrudAffordances 9 · searchableFields 16 · batchActions 4
@object-ui/console dist, plugin.ts, plugin.js, plugin.d.ts, README.md MEMBER_PIN_EXEMPTION_CEILING 0 · MEMBER_PINS 0 · gridPagerSelectionMembers 0 object-grid 21 · searchableFields 26 · pageSizeOptions 10

Every probe zero, every control lit in the same files. Nothing this diff adds reaches published output. node scripts/check-changeset-presence.mjs agrees and prints so.

Verification

Exit codes captured to disk before any pipe, in every case.

run command-exit reading
the three pin files 0 28 passed
packages/plugin-grid/ (whole package) 0 139 files, 1304 passed
the console ledger file 0 199 passed
tsc -p packages/plugin-grid/tsconfig.test.json 0 —
apps/console tsc --noEmit 0 —
check:control-bytes 0 scanned 7907 tracked text files
check:changeset-presence 0 4 source files of 2 released packages, 1 changeset, empty frontmatter
check:pending-changeset-literals 0 —
check:changeset-claims 0 —
check:new-line-citations 0 —
check:test-path-roots 0 —
check:vi-mock-specifiers 0 —
check:sdui-registration-pins 0 —
check:governed-queue-guard --test (the five changed paths) 0 NOT GOVERNED; none of 5 paths matched any of 5 governed surfaces

Typecheck coverage proven non-vacuous. tsc -p packages/plugin-grid/tsconfig.test.json --listFiles lists 1729 files; all three grid pin files appear exactly once each. The listing discriminates rather than swallowing everything: plugin-detail test files 0, the console ledger file 0. The console's own tsc --noEmit --listFiles lists 3765 files including the ledger file exactly once, with gridPagerSelectionMembers 0 and any packages/*/__tests__/ 0.

Lint: a narrowing, declared, with the three readings that make it a measurement. ① The population is read from eslint's own config, not guessed: files: ['**/*.{ts,tsx}'] minus that config's ignores block (dist, .next, node_modules, public, .source, plus its three literal build artefacts) — 4926 tracked files. ② Files actually linted, counted out of --format json: 4, the whole diff's lintable surface. 0 errors, 16 warnings, every one of them @typescript-eslint/no-explicit-any on the as any fixture casts these files already used; the lines this diff ADDS contribute 4 such occurrences, 3 of them the standard hasPointerCapture / scrollIntoView / schema: any fixture spelling. ③ Invariance for the 4922 untouched files: eslint.config.js declares projectService 0 times, project: 0 times and tsconfigRootDir 0 times — linting is not type-aware here, so each file's verdict is computed from that file alone and nothing in this diff can move a verdict on a file it does not contain. The repo-wide pnpm lint run is CI's.

Serial constraint

Re-taken over the open-PR set before the first write, not inherited: all 16 open pull requests were listed and each one's file list fetched. Zero of the 16 touch registry-inputs-spec-parity.test.ts.

⚠️ After that reading the dispatching seat reported a collision it had missed: objectui#9833 (card objectui#9779) touches the same ledger file, +1/−1, in the object-form.sections entry's pins: prose inside MEMBER_PINS. Re-read at push time: it has not landed — origin/main is still 26ac50369, byte-identical to this branch's base on that file. So this pushes unmerged, as instructed, and the enqueue-time conflict is the dispatching seat's to take.

For whoever merges the two: this diff does not touch the object-form.sections entry. Its insertions into MEMBER_PINS are object-grid.batchActions (before the object-grid.exportOptions entry) and the object-grid.pagination / searchableFields / selection trio (before the object-kanban.cardFields entry). object-form.sections sits a couple of entries above the first of those, so the two edits are near but not on the same lines. ⛔ Do not revert objectui#9833's line while merging — it is a deliberate repair of a sentence describing the old behaviour.

Out of scope, noted and not filed

  • The grouped pager's two ignored pagination members, above. Successor: this card's next object-grid slice, which has to read the grouping path for grouping and aggregations anyway.
  • ObjectGrid's pageSize resolution uses ||, so a member of 0 falls through to the flat key and then to the built-in default. Not a defect anyone can reach (a page size of zero is not authorable in any useful sense) and not pinned. Successor: none.

Generated by Claude Code

…bar keys

objectui#8071 slice 13. `batchActions`, `pagination`, `searchableFields` and
`selection` leave `MEMBER_PIN_EXEMPTIONS` and enter `MEMBER_PINS`, and
`MEMBER_PIN_EXEMPTION_CEILING` follows to the new count in this same commit.

The four were chosen by where the READS cluster, not by the card's enumerated
list: all four are resolved in the single fold that assembles the `data-table`
props, and each is the canonical half of a canonical-vs-deprecated pair whose
precedence nothing asserted.

Also repairs five figures in `registry-inputs-spec-parity.test.ts` that had
rotted into present-tense claims about shared, ratcheting constants. They are
rewritten as rules or as dated readings; today's numbers are deliberately not
written in.

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

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 1 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/8067-component-input-member-kind.md

  • names apps/console/src/__tests__/registry-inputs-spec-parity.test.ts → apps/console/src/__tests__/registry-inputs-spec-parity.test.ts — edited by this change

    A registration's type: 'array' said a value was a list and stopped there, so a member that drifted from @objectstack/spec was invisible to every layer that reads a declaration. page:header.actions is the measured cost: the contract declares z.array(z.string()) ("Action IDs"), the renderer read the members as ActionDef objects, and the repo-wide parity gate in apps/console/src/__tests__/registry-inputs-spec-parity.test.ts stayed green for the whole life of the drift because both sides carried the key and neither could say what was inside it. What settled it was a maintainer ruling, not a test — and even after the fix, "these are ids" survived only as English in the registration's description.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with 26ac50369 (merge-base with origin/main): 4 file(s) changed outside .changeset/, read against 1149 pending declaration(s) that publish a body (1681 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3049.4 KB 3104.5 KB
Main entry chunk (gzip) 145.7 KB 350 KB
Entry file index-DS7oxVt3.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) 16.69KB 6.21KB
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) 545.99KB 130.71KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 215.98KB 59.97KB
fields (index.js) 249.23KB 62.88KB
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) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 32.15KB 10.49KB
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.83KB 10.95KB
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) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
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) 8.39KB 3.10KB
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) 14.81KB 3.63KB
plugin-calendar (index.js) 49.92KB 14.22KB
plugin-charts (index.js) 71.61KB 20.05KB
plugin-chatbot (index.js) 195.34KB 46.51KB
plugin-dashboard (index.js) 131.44KB 34.65KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 253.28KB 65.87KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.71KB 34.16KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 212.61KB 57.90KB
plugin-kanban (index.js) 48.10KB 14.94KB
plugin-list (index.js) 112.74KB 27.70KB
plugin-map (index.js) 21.48KB 6.99KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.41KB 11.93KB
plugin-timeline (index.js) 30.07KB 8.74KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 85.05KB 21.01KB
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) 104.82KB 34.67KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
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.66KB 2.50KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 14.82KB 4.99KB
types (ai.js) 4.11KB 2.06KB
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 (strict-authoring-face.js) 14.04KB 5.36KB
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
Collaborator Author

changeset-claim-re-read on .changeset/8067-component-input-member-kind.md — no repair owed, re-taken on this tree

Slices 11 and 12 reached the same verdict on this body. Legs 1 and 4 are about the body itself and carry over; legs 2 and 3 are claims about those diffs, so they were re-taken here with lit controls in the same measurement.

Leg 1 — the claims are past-tense and bounded. The load-bearing sentence is that the parity gate "stayed green for the whole life of the drift". That is a closed interval, ended by the fix the same changeset describes. Nothing later can falsify it. Kept.

Leg 2 — does this diff touch page:header.actions? Measured over the 458 added and 23 removed diff lines:

added removed
probe page:header 0 0
probe page:header.actions 0 0
control object-grid 17 4
control MEMBER_PIN_EXEMPTION_CEILING 4 3

Leg 3 — does it add an of or touch a registration?

added removed
probe of: ' 0 0
probe ComponentInput 0 0
probe registerComponent 0 0
probe name: ' (an input declaration row) 0 0
probe sdui.manifest 0 0
probe member-type-mismatch 0 0
control searchableFields 18 1
control pins: 4 0
control AWAITING_A_PIN 0 4

That last control is lit on the removed side precisely because it is the four deleted exemptions. Every file this diff touches is a test file or the changeset; there is no registration source in it at all.

Leg 4 — shared file, not shared claim. That body describes the arm / of direction. This slice moves the member-pin direction. They meet in one file and nowhere else.

The gate's silence is not a clearance, so the sweep was widened

The gate judges name resolution, never meaning, and cannot see a claim spelled as a symbol or a package rather than a backticked filename. So all 1682 pending bodies were swept whitespace-normalised for every path and every symbol this diff touches.

Probe not line-blind, demonstrated on the flagged body's own wrapped phrase: parity gate in followed by the ledger path reads 0 line-anchored, 1 normalised.

Path hits: the ledger path in 4 bodies (8067-…, 8068-mandatory-per-block-member-pin, fix-parity-aria-line-ref, parity-gate-lazy-registrations); the three plugin-grid test paths in 0. Symbol hits: MEMBER_PIN_EXEMPTION_CEILING in 9, MEMBER_PIN_EXEMPTIONS in 6, MEMBER_PINS in 2, AWAITING_A_PIN in 2; ObjectGrid in 106, which is inert here because this diff restored ObjectGrid.tsx to its HEAD blob byte for byte after every ablation leg and ships no change to it.

Every ceiling claim among those is a BOUNDED TRANSITION — 62 -> 58, 46 -> 41, 41 -> 37, 37 → 33, 33 to 31, 31 -> 28, 24 -> 20, and 16 to 15 on a different backlog ceiling — each a statement about what its own change did, which no later slice can falsify. 20 -> 16 is simply the next one.

The single absolute reading was already dated, by the commit this branch is based on. 8171-calendar-sort-input.md reads "it read 62 at the commit that wrote this paragraph (35e63669d6, 2026-09-07), and that reading is dated on purpose" — objectui#9823's repair. A dated reading cannot rot, so it is untouched.

⇒ Nothing went false; nothing is ROTTED and nothing was BORN FALSE. No changeset body is edited by this PR.


Generated by Claude Code

@os-sales
os-sales marked this pull request as ready for review September 18, 2026 08:43
@os-sales
os-sales added this pull request to the merge queue Sep 18, 2026
Merged via the queue into main with commit 177d379 Sep 18, 2026
38 checks passed
@os-sales
os-sales deleted the claude/issue-8071-member-pins-slice-13 branch September 18, 2026 09:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants