Skip to content

test(vi-mock): inherit the real @object-ui/plugin-grid surface in 25 vi.mock factories - #8146

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-6892-vi-mock-inherit-slice7-plugin-grid
Sep 6, 2026
Merged

test(vi-mock): inherit the real @object-ui/plugin-grid surface in 25 vi.mock factories#8146
baozhoutao merged 1 commit into
mainfrom
claude/issue-6892-vi-mock-inherit-slice7-plugin-grid

Conversation

@claude

@claude claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Part of #6892 — slice 7 of the per-specifier vi.mock inheritance sweep.

All 25 judged call sites on @object-ui/plugin-grid were frozen — every one of them. Each now obtains the real barrel through importOriginal and spreads it first, keeping its hand-written overrides after; @object-ui/plugin-grid joins COVERED_SPECIFIERS in the same PR, so the guard holds it at zero from here.

The conversion form is the one slices 3–6 used: an async factory taking importOriginal, whose first entry spreads the awaited real module (typed through the same generic parameter the other swept factories use), with the overrides after it.

STEP 0 — what inheriting actually runs

Verdict: PROCEED, on the CLASS of the effect rather than on inertness.

The static import graph was walked from packages/plugin-grid/src/index.tsx with the TypeScript parser and every top-level statement of every reached module classified. 560 modules, 1421 module-scope statements — the largest graph this worklist has measured, because this barrel reaches @object-ui/components, @object-ui/fields, @object-ui/react, @object-ui/core, @object-ui/permissions, @object-ui/mobile and @object-ui/i18n.

It is not inert:

  • 114 module-scope ComponentRegistry.register(...) call sites, every one carrying a namespace — ui 89, element 10, page 7, action 5, plugin-grid 2, view 1. The five in renderers/layout/page.tsx that read as bare carry ui through the spread pageMeta constant; checked, not assumed. Because all 114 are namespaced, the deprecation console.warn inside register() cannot fire.
  • Three registration idioms this worklist had not met before, all in packages/fields/src/index.tsx and all the same benign class: five registerFieldRenderer(...) calls (a Map.set into a module-level registry), one setCellRendererResolver(...) (assigns a module-level let), and registerAllFields(), which loops the widget map into ComponentRegistry.register under the field namespace.
  • Beyond registration the graph holds only allocation: 171 React.forwardRef, 94 new Set, 21 createContext, 15 Object.freeze, 14 new Map, 13 cva, 10 createDiscardProofCache (a new WeakMap plus a closure), and nine module-scope new singletons whose constructors were read and assign fields only — UndoManager's localStorage path is a method nothing calls at import time.
  • Zero timers, globals, storage access, fetch, or connections at module scope.

Empirically, importing the real barrel under happy-dom moves ComponentRegistry.getAllTypes() from 0 to 375 keys, exports 20 names, costs ~7.0s cold, and emits zero console.warn and zero console.error. Measured with a throwaway probe test that was deleted afterwards; git status was verified clean before the first conversion.

One grep/AST disagreement, recorded rather than smoothed over

Two column-anchored greps corroborate the walk with exactly one disagreement, and the grep is the one that is wrong: four self.addEventListener lines match at column 0 in packages/mobile/src/serviceWorkerSource.ts, and all four sit inside the template literal that module returns as generated service-worker source. Importing anything never executes them. The AST walk does not report them; a column-anchored grep cannot see template-literal nesting. Prefer the parser — and record the disagreement rather than the quieter number.

The CSS import

The graph has exactly one side-effect import and it is CSS (packages/components/src/sidebar-fixes.css). The root vitest.config.mts declares no css option — read off the config, not from memory (grep -n css vitest.config.mts exits 1) — so Vitest leaves it unprocessed and the import is inert.

The consuming side

Checked for the failure class the worklist names. Of the 25 converted files exactly one names ComponentRegistry at all, and it reads one entry — get('object-view'), a key packages/plugin-view's own index registers, not one this barrel claims — rather than asserting emptiness or a count. Not one of the 25 installs a console.warn or console.error spy. So no converted assertion can be broken by the 375 new keys.

The census

Re-derived on 21d7989fb through the guard's exported scan() with covered set to all 22 workspace specifiers any vi.mock call site in the tree names. COVERED_SPECIFIERS was never widened-and-reverted.

specifier judged inheriting before frozen before frozen after
@object-ui/plugin-grid 25 0 25 0

All-specifier population over 659 judged sites: 123 frozen before, 98 after. Zero sites moved the other way — a diff of the per-specifier tables with the plugin-grid row removed is empty across all 21 remaining rows.

Site distribution: 21 under packages/plugin-view, 4 under packages/plugin-designer.

There are no subpath call sites of this specifier anywhere in the tree, so objectui#8141 has nothing to report here.

Conversion shapes — two

  1. Object-literal arrow, 21 sites (all plugin-view). 15 of them were the same single line byte-for-byte, which is why the transform could be applied mechanically and then verified by count rather than by eye.
  2. Delegation to a shared manual mock module, 4 sites (all plugin-designer) — the shape slice 5 first met. These delegated the whole factory to ./__mocks__/plugin-grid, which inherits nothing. They now spread the real barrel first and the manual mock second, so the hand-written ObjectGrid still wins and every other export is the real one. That is exactly the form the neighbouring @object-ui/plugin-form factory in those same four files already used.

Neighbouring factories — the repair slice 6 needed was not needed here

Slice 6's main finding was that converting a workspace factory can kill the file at collection on a different, frozen third-party factory in the same file (15 of 27, on lucide-react). That did not fire here, and the reason is worth carrying forward rather than reading as luck.

Every one of the 25 files carries neighbouring factories — 25 on @object-ui/plugin-form, 21 on @object-ui/react, 1 on @object-ui/permissions — and all of them were already inheriting, swept by slices 3, 5 and 6 or written that way. There is not a single frozen third-party factory among the 25. A specifier whose sites have no frozen neighbours inherits cleanly. Check the neighbours before budgeting for the repair.

No product source was touched.

Cost

Measured the way slice 6 measured it — one converted plugin-view file, twice each:

run 1 run 2
frozen 9.53s 8.37s
inheriting 10.17s 9.91s

The ~1.1s marginal cost is far below slice 6's ~3s, for a structural reason: these files already inherit the real @object-ui/react and @object-ui/plugin-form barrels, whose graphs already pull @object-ui/components. Inheriting a barrel is cheap once its own dependencies are already loaded in that file.

No test was lost or gained

The 25 converted files: exit 0, 25 passed / 226 tests. The same 25 paths with their merge-base blobs restored: exit 0, 25 passed / 226 tests — identical, so nothing died during collection and no test appeared or vanished. That base restore was proven on disk (inheriting factory heads 25 to 0, frozen heads 0 to 25) and left git diff HEAD naming zero paths.

The pin test needed one forced edit

scripts/__tests__/check-vi-mock-inherit.test.ts has a case — "correct neighbours in the same file are NOT flagged" — whose fixture used @object-ui/plugin-grid as its deliberately uncovered workspace neighbour. Sweeping this specifier turned that fixture's frozen factory into a genuine finding, so the case failed for a reason with nothing to do with what it asserts.

The fixture now names a specifier no package publishes. COVERED_SPECIFIERS is grow-only, so any real name in that slot is only ever on loan; the scope resolver classifies by string prefix and never resolves the module, so a name that cannot be swept keeps the case about the resolver instead of about the covered set's current membership. A comment in the fixture says so, which should stop slice 8 and after from re-paying this.

It is not vacuous: putting a covered specifier back into that slot reddens exactly that case (ablation leg 4 below).

The header record was worded around objectui#8117 — the pin's own pattern, run locally over the edited gate source, returns zero matches.

Ablation — four legs, one per shape plus the pin

Each from the committed tree. Each mutation proven on disk by anchored marker counts before the result is read; each restore proven by git hash-object equalling the HEAD blob and by git diff HEAD naming zero paths — never by a checkout exit code.

leg site mutation result
1 — shape 1 packages/plugin-view/src/__tests__/ObjectView.sortSink.test.tsx full reversal to a frozen head gate exit 1, naming line 74
2 — shape 2 packages/plugin-designer/src/__tests__/ObjectManager.test.tsx obtain without spreading gate exit 1, naming line 15
3 — shape 1, multi-line packages/plugin-view/src/__tests__/ObjectView.canonicalTableKeys.test.tsx obtain without spreading gate exit 1, naming line 71
4 — the pin scripts/__tests__/check-vi-mock-inherit.test.ts fixture neighbour set back to a covered specifier pin exit 1 on exactly the repaired case

Legs 2 and 3 exercise the gate's obtain-without-spread rule specifically, since importOriginal is still named on the line above. The gate reads exit 0 after every restore.

No dist preflight was needed: the root Vitest config aliases @object-ui/plugin-grid to packages/plugin-grid/src, and the gate is a source-text scanner.

Gates

All pinned to the final head fee7826eb, with exit codes captured by redirect-then-capture rather than through a pipe.

gate result
pnpm check:vi-mock-inherit pass — 511 call sites on twelve covered specifiers judged, 511 inherit, 0 frozen (up from 486 on eleven)
pnpm exec vitest run scripts/__tests__/check-vi-mock-inherit.test.ts pass — 67/67
gate test family (3 files) pass — 129 tests
the 25 converted files pass — 25 files / 226 tests
pnpm exec vitest run packages/plugin-view/ packages/plugin-designer/ pass — 53 files / 433 tests, one invocation
pnpm check:vi-mock-specifiers pass
pnpm type-check:scripts pass — non-vacuous, both edited script files present in an 853-file program
pnpm check:control-bytes pass — 6509 files; plus a grep -naP self-scan of all 28 changed paths, no match
node scripts/check-changeset-presence.mjs pass — one empty-frontmatter changeset for 25 source files of 2 released packages
pnpm changeset:check pass
node scripts/check-governed-queue-guard.mjs --test NOT GOVERNED — 28 paths against 5 governed surfaces
plugin-view / plugin-designer type-check pass — non-vacuous, the test programs list 21 of 21 and 4 of 4 edited files (1636 and 655 files)
plugin-view / plugin-designer lint pass — 0 errors; 50 and 52 files in --format json, all 25 edited files present, 0 messages on any of this branch's 189 added lines

origin/main did not move during this slice (still 21d7989fb), so the merge was a no-op and the growth warning stayed quiet for a second consecutive slice. The constant is still widened only against a gate run on the tree that ships.

Live E2E (informational) is red on every branch today for an upstream reason (#7990 / objectstack#16186) and is not this PR's.

What remains on the worklist

98 frozen sites: @object-ui/permissions (24 of 48), @object-ui/app-shell (23, all frozen), @object-ui/plugin-detail (13 of 17) and @object-ui/plugin-chatbot (11 of 16).

🤖 Generated with Claude Code

https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr


Generated by Claude Code

…vi.mock factories

Sweeps objectui#6892's seventh specifier. All 25 judged call sites on
`@object-ui/plugin-grid` were frozen -- 21 under packages/plugin-view, 4 under
packages/plugin-designer -- and each now obtains the real barrel through
`importOriginal` and spreads it FIRST, keeping its hand-written overrides after.
The specifier joins COVERED_SPECIFIERS in the same commit, so the guard holds it
at zero from here.

Two syntactic shapes: 21 object-literal arrows (15 of them byte-identical on one
line) and 4 designer sites that delegated the whole factory to a shared manual
mock module, which now spread the real barrel first and the manual mock second.

STEP 0 walked the 560-module, 1421-statement graph reachable from the barrel and
returned PROCEED on the CLASS of the effect: 114 namespaced module-scope
ComponentRegistry.register calls plus three registration idioms in
packages/fields (registerFieldRenderer, setCellRendererResolver,
registerAllFields), all Map.set or a module-level let; zero timers, globals,
storage, fetch or connections. Importing the real barrel under happy-dom
registers 375 keys and emits zero console.warn and zero console.error.

The pin's neighbour fixture named this specifier while it was uncovered, so the
sweep turned its frozen factory into a genuine finding. It now names a specifier
no package publishes, which keeps the case about the scope resolver rather than
about the covered set's current membership.

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

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3186.6 KB 3191.4 KB
Main entry chunk (gzip) 143.6 KB 350 KB
Entry file index-Cs9mOUgK.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) 5.13KB 2.35KB
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.06KB 113.97KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 182.08KB 50.62KB
fields (index.js) 242.43KB 61.25KB
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) 47.29KB 13.18KB
plugin-charts (index.js) 70.35KB 19.68KB
plugin-chatbot (index.js) 193.54KB 46.04KB
plugin-dashboard (index.js) 131.41KB 34.43KB
plugin-designer (index.js) 211.51KB 43.01KB
plugin-detail (index.js) 247.75KB 63.50KB
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.58KB 56.63KB
plugin-kanban (index.js) 52.46KB 14.57KB
plugin-list (index.js) 113.34KB 27.72KB
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.48KB 20.81KB
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.74KB 1.41KB
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

Standing down on Live E2E (informational) for this PR, read 2026-09-06T20:28Z.

Every other check on fee7826eb is judged on its own; this PR flips to ready once the required set converges, then goes to the merge queue by squash.


Generated by Claude Code

@baozhoutao
baozhoutao marked this pull request as ready for review September 6, 2026 20:39
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 6, 2026

Copy link
Copy Markdown
Contributor

Armed — squash auto-merge enabled and the PR is in the merge queue, domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46.

  • Head fee7826eb: 31 non-informational checks completed green at 20:39Z (the ci-wait reading); Live E2E (informational) red per the standing-down note above.
  • ready_for_review at 20:39:53Z; the post-flip Governed Surface Queue Guard run started after that timestamp and completed success at 20:40:11Z.
  • added_to_merge_queue at 20:40:29Z on the REST timeline (read 20:40:37Z). It is first in the queue; PR docs(plugin-kanban): compile every README snippet, leave the UNGATED_DOCS ledger #8147 entered one second behind it.

On MERGED: content probe on re-fetched origin/main ('@object-ui/plugin-grid' in COVERED_SPECIFIERS, importOriginal in a converted plugin-view factory, the empty-frontmatter changeset present; control: '@object-ui/components' still in the constant), then the LANDED note here and on #6892 (which stays open, Part of). Slice 8 (@object-ui/permissions) dispatches after the landing.


Generated by Claude Code

Merged via the queue into main with commit dbb40a7 Sep 6, 2026
33 of 34 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-6892-vi-mock-inherit-slice7-plugin-grid branch September 6, 2026 20:55

Copy link
Copy Markdown
Contributor

LANDED — merged at 2026-09-06T20:55:56Z as dbb40a732 (squash, via the merge queue, same group as PR #8147), domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46.

Content probe on re-fetched origin/main (571b4870d, read 20:56:35Z):

  • '@object-ui/plugin-grid' is the twelfth member of COVERED_SPECIFIERS in scripts/check-vi-mock-inherit.mjs (line 509; the constant lists 12 specifiers).
  • importOriginal appears 6 times in packages/plugin-view/src/__tests__/ObjectView.sortSink.test.tsx (ablation leg 1's file, every factory inheriting).
  • .changeset/vi-mock-inherit-slice7-plugin-grid.md is present.
  • Control: the '@object-ui/components' row is still in the constant (1 hit).

#6892 stays open (Part of); the LANDED note goes there in the same stroke, and slice 8 (@object-ui/permissions) is claimed on the freed gate.


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

Development

Successfully merging this pull request may close these issues.

2 participants