Skip to content

test(vi-mock): inherit the real @object-ui/permissions surface in 24 vi.mock factories - #8163

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-6892-vi-mock-inherit-slice8-permissions
Sep 6, 2026
Merged

test(vi-mock): inherit the real @object-ui/permissions surface in 24 vi.mock factories#8163
baozhoutao merged 2 commits into
mainfrom
claude/issue-6892-vi-mock-inherit-slice8-permissions

Conversation

@claude

@claude claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Part of #6892 (slice 8: @object-ui/permissions)

Every vi.mock('@object-ui/permissions', ...) factory that hand-listed the package's exports now obtains the real module and spreads it FIRST, and the specifier joins COVERED_SPECIFIERS in scripts/check-vi-mock-inherit.mjs in the same PR — the gate's own documented widening precondition.

Base: 571b4870d (carries PR #8146, slice 7, and PR #8147). origin/main moved to a4611b3e2 mid-slice and was merged in; every reading below is pinned to the shipped head b7d9fd085.

STEP 0 — the barrel, measured before anything was converted

Verdict: PROCEED. INERT — the first swept barrel with zero registrations of any kind.

Method: the static import graph walked from packages/permissions/src/index.ts with the TypeScript parser, every module-scope statement of every reached module classified; corroborated by two column-anchored greps over the same modules and by an empirical import of the real barrel under happy-dom in the light dom project, where all 48 sites run.

A verdict on a re-export-only barrel is not free — it inherits whatever the re-exported modules do at module scope — so the 43-line barrel was the entry point, not the answer.

modules reached (code) 27
module-scope statements 422
statements that EXECUTE anything 18
ComponentRegistry.register call sites 0
timers / globals / storage / fetch / connections 0
side-effect-only imports 0
CSS imports 0

The graph is the package itself plus @object-ui/types, and nothing else in the workspace; the only external specifiers are react, @objectstack/spec and two of its subpaths.

The CLASS of every executing statement, since that is what the ruling asks for rather than inertness by assertion:

  • 10 × createDiscardProofCache() (PermissionProvider 5, MePermissionsProvider 5) — read at the definition rather than assumed: new WeakMap() plus a returned closure. Pure allocation.
  • 1 × createContext(null) plus PermCtx.displayName = 'PermissionContext' — allocation and a property assignment on the object just allocated.
  • 3 × new Set of literals (SYSTEM_MANAGED_FIELD_NAMES, AUDIT_FIELD_NAMES, TRANSIENT_STATUS), 1 × Object.freeze of a literal, 1 × new WeakMap — pure allocation.
  • 1 × Symbol.for('objectui.inflightGet') — the ONLY effect that leaves its module, and it is the global symbol registry, not a global property: interning is idempotent, stores no value, and the empirical probe's own Object.getOwnPropertySymbols(globalThis) does not contain it.

The remaining 404 statements are imports/exports (144), type declarations (182), function/class declarations (45) and literal or arrow-function bindings (33) — none of which executes anything.

Grep/AST agreement: exact, with no disagreement to record this time. The column-anchored timers/globals/storage/network/DOM grep and the IDENT.method( grep over all 27 modules both return nothing (grep exit 1), matching the walk.

Empirical leg, a throwaway probe under happy-dom in the dom project, run and then deleted with git status verified at 0 lines before any conversion began: 7 runtime exports, 0 console.warn, 0 console.error, ~467ms cold import.

⛔ No change to packages/permissions/src/** was needed or made.

STEP 1 — the census, through the gate's own exported scan()

Derived with scan() imported and covered set to all 22 workspace specifiers any vi.mock call site in the tree names — COVERED_SPECIFIERS was never widened-and-reverted.

owning package judged inheriting before frozen before frozen after inheriting after
packages/app-shell 19 2 17 0 19
packages/plugin-grid 13 9 4 0 13
packages/plugin-list 4 4 0 0 4
packages/plugin-detail 3 1 2 0 3
packages/plugin-calendar 1 1 0 0 1
packages/plugin-dashboard 1 1 0 0 1
packages/plugin-form 1 0 1 0 1
packages/plugin-gantt 1 1 0 0 1
packages/plugin-kanban 1 1 0 0 1
packages/plugin-map 1 1 0 0 1
packages/plugin-timeline 1 1 0 0 1
packages/plugin-tree 1 1 0 0 1
packages/plugin-view 1 1 0 0 1
total 48 24 24 0 48

Population over all 22 specifiers: 98 → 74 frozen over 659 judged. Direction check: a diff of the two per-specifier tables with the @object-ui/permissions row removed is empty — every other one of the 21 rows is byte-identical, and zero sites moved the other way.

The dispatch's grep was exact on the total (48) and on the per-package file split; it could not separate 24 inheriting from 24 frozen, which is what scan() adds.

Shapes: two. 23 zero-parameter object-literal arrows, and one that was ALREADY async and still frozen (plugin-detail/src/renderers/__tests__/record-details.test.tsx) — it awaited react, not the module under mock, which is exactly the shape a name-matching gate waves through and this one does not.

Projects (A5, answered): all 48 sites are .test.tsx and none is in heavyDomTests, so all 48 run in the single light dom project. One environment is the whole answer, and the empirical STEP 0 import was taken in it.

The free confirmation is back, and it is the strongest this worklist has had: 24 of the 48 sites — exactly half, spread over twelve packages — already inherited the real barrel on main and passed, so the real module was known to load in that environment before anything was converted.

Neighbour reading (ruling 4)

Every OTHER vi.mock factory in all 24 touched files was read and classified before editing:

neighbour sites verdict
@object-ui/auth 15 inherits
@object-ui/plugin-view 8 inherits
@object-ui/collaboration 8 inherits
@object-ui/i18n 6 inherits
@object-ui/components 4 inherits
@object-ui/react 2 inherits
@object-ui/plugin-charts 1 inherits
react-router-dom 1 inherits
sonner 8 FROZEN (third-party)
@object-ui/plugin-list 7 FROZEN (uncovered workspace) + 1 inheriting
local whole-module replacements 76 out of scope by construction

Slice 6's collection-death class did NOT fire, and the neighbour reading says why IN ADVANCE rather than after the fact. These files carry 15 frozen neighbours — the exact shape that killed 15 files in slice 6 — but this barrel's graph reaches neither sonner nor @object-ui/plugin-list, because it reaches nothing beyond @object-ui/types, react and @objectstack/spec. Zero neighbouring factories were repaired. The carry-forward: a frozen neighbour is dangerous only when the newly-real module's graph reaches it — walk the graph first, then read the neighbours against it.

No test turned red under the real module, so there is no behavioural finding to report and no test's assertions were changed.

Covered set: 12 → 13

'@object-ui/permissions' is appended to COVERED_SPECIFIERS (exact string match, grow-only), the header's count word moves twelve → thirteen, the slice-8 per-specifier record is added in the shape slices 5–7 used, and the remaining-population paragraph is refreshed to 74.

scripts/__tests__/check-vi-mock-inherit.test.ts needed no edit — it derives the names from COVERED_SPECIFIERS rather than copying them, and slice 7 had already moved its neighbour fixture to a specifier no package publishes. 67/67 green, run rather than assumed.

Positive control (ruling 6)

Three legs from the committed tree, each under a trap with absolute paths, each mutation proven on disk by anchored marker counts before the result is read, each restore proven by STATE — git hash-object equal to the HEAD blob and git diff HEAD naming zero paths — never by an exit code.

# file mutation markers gate HEAD blob (restored)
1 plugin-grid/src/__tests__/bulkDeleteVisibleWhen.test.tsx obtain without spread spread 1 → 0 exit 1, names :47 827316231…
2 plugin-detail/src/renderers/__tests__/record-details.test.tsx obtain without spread (async shape) spread 1 → 0 exit 1, names :50 22240a3e0…
3 app-shell/src/views/ObjectView.chartRelay-7823.test.tsx full reversal to a frozen head obtain 1 → 0, spread 2 → 1 exit 1, names :93 dbe1f8eb8…

Gate exit 0 after each restore. Legs 1 and 2 exercise the gate's obtain-without-spread rule specifically, since importOriginal is still named on the line above. No dist preflight is needed: the root Vitest config aliases the specifier to packages/permissions/src and the gate is a source-text scanner.

Gates, pinned to the shipped head b7d9fd085

gate exit reading
node scripts/check-vi-mock-inherit.mjs 0 559 call sites on thirteen covered specifiers judged (559 inherit, 0 auto-mocked), up from 511 on twelve; 0 frozen for @object-ui/permissions
vitest run scripts/__tests__/check-vi-mock-inherit.test.ts 0 67/67, file unedited
vitest run scripts/__tests__/ (whole directory) 0 115 files / 3408 tests
the 24 converted files 0 24 files / 202 tests — identical to the same 24 at the merge base (24 / 202), so no test was lost, gained, or died during collection
vitest run packages/app-shell/ 0 635 files / 6108 passed, 1 skipped
vitest run packages/plugin-grid/ packages/plugin-detail/ packages/plugin-form/ 0 329 files / 3050 passed, 8 skipped
the 24 converted files + the pin, re-run on the merged head 0 25 files / 269 tests
type-check of the four touched packages 0 each non-vacuous: the test programs list 17/17, 4/4, 2/2 and 1/1 edited files in programs of 4424, 1649, 1585 and 1484
pnpm type-check:scripts 0
pnpm lint:root 0 0 errors
lint of the four touched packages (eslint .) 0 each 0 errors
targeted eslint --format json over all 25 non-changeset paths 0 25 files linted, 0 errors, and 0 messages of any severity on any of the 355 added lines
pnpm check:control-bytes 0 6512 text files; plus a grep -naP self-scan of all 26 changed paths (grep exit 1, no match)
node scripts/check-changeset-presence.mjs 0 one EMPTY-frontmatter changeset; 24 published-source files of 4 released packages declared as releasing nothing
pnpm changeset:check 0
node scripts/check-governed-queue-guard.mjs --test <26 paths> 0 NOT GOVERNED — 26 paths vs 5 governed surfaces
pnpm check:entry-guard 0
pnpm check:vi-mock-specifiers 0

Declared narrowing. turbo ls --affected names 16 packages; the four owning ones were run whole and the other twelve were not. That narrowing is measured rather than assumed: no changed file is imported anywhere in the tree. A git grep for each changed test file's stem across *.ts,tsx,mts,mjs,js returns nothing outside the file itself (exit 1), and scripts/check-vi-mock-inherit.mjs is named only from scripts/, .github/ and prose changesets. Test files are leaves, so a dependent package has no path to reach this diff. CI runs the full farm regardless.

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

Growth warning

origin/main moved from 571b4870d to a4611b3e2 (PR #8154) mid-slice and was merged in. The merge brought no new vi.mock call site on any specifier: the census on the merged head is identical at 659 judged / 74 frozen / 585 inheriting, and the gate's verdict line is byte-identical apart from the tracked-file count (4386 → 4390). That is the third consecutive quiet slice; the constant was still widened only against a gate run on the tree that ships.

🤖 Generated with Claude Code

https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr


Generated by Claude Code

…vi.mock factories

Every `vi.mock('@object-ui/permissions', ...)` factory that hand-listed the
package's exports now obtains the real module and spreads it FIRST, and the
specifier joins `COVERED_SPECIFIERS` in `scripts/check-vi-mock-inherit.mjs` in
the same commit -- the gate's documented widening precondition.

Census re-derived through the gate's own exported `scan()` on 571b487:
48 judged / 24 inheriting / 24 frozen -> 0 frozen, 48 inheriting. The
all-specifier population moves 98 -> 74 frozen over 659 judged, with every
other one of the 21 specifier rows byte-identical between the two runs.

STEP 0 measured the barrel before anything was converted: 27 modules and 422
module-scope statements reached from `packages/permissions/src/index.ts`, of
which 18 execute anything and every one is allocation. The only effect leaving
a module is `Symbol.for('objectui.inflightGet')` -- global symbol registry,
idempotent, storing no value and putting nothing on `globalThis`. Zero
registrations, timers, storage, fetch, connections, side-effect imports or CSS.

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) 3187.7 KB 3191.4 KB
Main entry chunk (gzip) 143.5 KB 350 KB
Entry file index-Bfn8uX2z.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.09KB 113.98KB
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) 243.04KB 61.36KB
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 — domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, 2026-09-06T21:57Z.

That check is informational (not in the main ruleset's required contexts) and is red on the base branch for an upstream reason anchored on objectui#7990 / objectstack#16186; this PR touches 24 test files, a gate script and an empty changeset, none of which the Live E2E suite exercises. No re-run is requested. Every required check is judged on its own conclusion; this PR flips to ready only when all of them read completed / success on b7d9fd085.


Generated by Claude Code

Copy link
Copy Markdown
Contributor

Armed — domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46.

  • CI on b7d9fd085 converged all green at 22:05:10Z (31 checks; Live E2E (informational) excluded per the standing-down note above).
  • Ready for review at 22:05:28Z; post-flip Governed Surface Queue Guard completed/success at 22:05:45Z.
  • Auto-merge SQUASH enabled; added_to_merge_queue on the REST timeline at 22:05:52Z (read 22:05:57Z).

Landing stroke follows the merge: content probe on re-fetched origin/main ('@object-ui/permissions' inside COVERED_SPECIFIERS in scripts/check-vi-mock-inherit.mjs, with a control), LANDED here and on objectui#6892 (which stays open, Part of), then the slice-9 claim.


Generated by Claude Code

Merged via the queue into main with commit 310c0ab Sep 6, 2026
33 of 34 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-6892-vi-mock-inherit-slice8-permissions branch September 6, 2026 22:21

Copy link
Copy Markdown
Contributor

LANDED — domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46.

Merged at 2026-09-06T22:21:16Z as 310c0ab19 (squash). Content probe on re-fetched origin/main at 22:21Z: COVERED_SPECIFIERS in scripts/check-vi-mock-inherit.mjs reads 13 entries with '@object-ui/permissions' at position 13; control plugin-grid non-empty; a repaired factory is on main (packages/plugin-form/src/ObjectForm.effectiveOps.test.tsx:54 obtains the real module through importOriginal<typeof import('@object-ui/permissions')>()).

Slice 9 (@object-ui/app-shell) is claimed on objectui#6892 next; the card stays open (Part of).


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