Skip to content

test(vi-mock): inherit the real @object-ui/plugin-detail surface in 13 vi.mock factories - #8184

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-6892-vi-mock-inherit-slice9-plugin-detail
Sep 6, 2026
Merged

test(vi-mock): inherit the real @object-ui/plugin-detail surface in 13 vi.mock factories#8184
baozhoutao merged 2 commits into
mainfrom
claude/issue-6892-vi-mock-inherit-slice9-plugin-detail

Conversation

@claude

@claude claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Part of #6892 (slice 9: @object-ui/plugin-detail)

Base origin/main 310c0ab19 (carries PR #8163, slice 8). Shipped head 60a2c6a51. Every reading below is pinned to that head on a clean tree.

The thirteen vi.mock('@object-ui/plugin-detail', ...) factories that hand-listed the barrel's exports now obtain the real module and spread it FIRST, with each file's existing overrides after it, and @object-ui/plugin-detail joins the gate's COVERED_SPECIFIERS in the same PR. No test assertion changed.

STEP 0 — PROCEED, and the isolated probe would have answered it WRONG

Method. Static import graph walked from packages/plugin-detail/src/index.tsx with the TypeScript parser, every module-scope statement of every reached module classified (TS ESM './x.js' resolved to ./x.ts / .tsx, '@/x' as the per-package src alias). Corroborated empirically by importing the real barrel through importOriginal under the light dom project — the single project all seventeen sites run in.

The graph is the largest this worklist has walked: 564 modules, 6,181 module-scope statements, 2,610 import/export, 127 ComponentRegistry.register calls, 99 bare side-effect imports and one CSS import. The barrel's OWN sixteen registrations are all namespaced (A2 as stated: plugin-detail 3, record 11, view 1, field 1) — but A2 is falsified for the transitive graph: the barrel reaches @object-ui/components, whose import './renderers' cascade contributes 111 further registrations, five of them BARE (no namespace) at packages/components/src/renderers/layout/page.tsx:690-695, registering page, app, utility, home, record.

Import cost, three runs each, median reported.

measurement run 1 run 2 run 3 median verdict
cold importOriginal of the barrel, isolated probe file 8815 ms 8646 ms 8827 ms 8.8 s #6580 STOP range
per-file wall, plugin-gantt rowCeiling, FROZEN 10.07 s 9.81 s 9.49 s 9.81 s
per-file wall, same file, INHERITING 9.73 s 10.13 s 9.70 s 9.73 s -0.08 s
per-file wall, plugin-calendar rowCeiling, frozen then inheriting 9.59 / 9.05 s 10.38 / 10.25 s +1.0 s PROCEED range
per-file wall, plugin-tree rowCeiling, frozen then inheriting 9.64 / 9.65 s 9.80 / 9.88 s +0.2 s PROCEED range

Comparator: objectui#6580 measured importOriginal('@object-ui/app-shell') at ~10.0 s per console test file, which the dispatch defined as a STOP. The isolated probe reproduces that range, and it is an artefact. Acting on it would have stopped a free conversion.

Mechanism, measured rather than argued. All thirteen files already import @object-ui/react and their own view component (./ObjectGantt and friends) at module scope. Those two together reach 572 modules — a strict SUPERSET of the barrel's 564, with comm -23 over the two sorted module lists reporting exactly 0 modules that inheriting adds. importOriginal here re-resolves an already-resident graph; it loads nothing new. The contrast is visible per package: ObjectGantt's graph contains 50 plugin-detail modules and ObjectCalendar's 50, so the mock is live in those files.

⇒ Carry-forward for slice 10 and beyond: a barrel's import cost is not a property of the barrel. Measure it in the files that will pay it, against what they already load. A probe that imports the barrel alone answers "what does this graph cost from cold", which is the wrong question whenever the consuming file already holds it.

⛔ No change to packages/plugin-detail/src/**; STEP 0 called for none.

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

Covered set widened in-memory to the 22 workspace specifiers any vi.mock call site in the tree names; COVERED_SPECIFIERS was never widened-and-reverted on disk.

package files judged inheriting before frozen before frozen after
packages/plugin-gantt 9 9 1 8 0
packages/plugin-calendar 5 5 1 4 0
packages/plugin-tree 1 1 0 1 0
packages/plugin-kanban 1 1 1 0 0
packages/app-shell 1 1 1 0 0
total 17 17 4 13 0

A1 CONFIRMED exactly, in both halves: the slice-8 forecast of 17 judged / 13 frozen is what scan() re-derives on 310c0ab19, and the PM's per-package file split (gantt 9, calendar 5, one each in app-shell, kanban, tree) is exact. No drift to report.

All thirteen sit in one syntactic shape — zero-parameter object-literal arrows — the most uniform surface this worklist has swept. Population moves 74 → 61 frozen over a constant 659 judged. Direction check: a diff of the two per-specifier tables with the plugin-detail row removed is EMPTY, all 21 other rows byte-identical; no site moved the other way.

Free confirmation PRESENT: 4 of 17 sites already inherited the real barrel on main and passed, across four packages, so the module was known to load in this environment before anything was converted.

Neighbour reading — per file, judged against the graph STEP 0 walked

Every other vi.mock factory in all thirteen files was read and classified before editing: 7 frozen sonner (third-party, out of scope by construction) and 12 local whole-module replacements (./GanttView 8, ./CalendarView 4, out of scope by the ruling). Slice 6's collection-death class did not fire, and the reason was established in advance rather than by a red run: this barrel's graph reaches neither sonner nor those local modules. Zero neighbouring repairs.

A5 CONFIRMED on the base: no file among the thirteen mocks @object-ui/app-shell or @object-ui/plugin-list (grep exit 1 on both). No hot-file overlap with the parked specifier. ⛔ No file mocking @object-ui/app-shell was touched.

One file diverges, and it is a finding rather than a style choice

packages/plugin-tree/src/ObjectTree.rowCeiling-7210.test.tsx inherits through importOriginal typed as ANY rather than the typeof import(...) form its twelve siblings use. check-phantom-dependencies reads a type-position import() as a real specifier and reddened on the typed form: packages/plugin-tree does not declare @object-ui/plugin-detail, and has no reason to. Measured, ObjectTree's module graph reaches 0 plugin-detail modules, against 50 each from ObjectGantt and ObjectCalendar — that factory mocks a module nothing under test ever loads.

The typed spelling would have forced the package to declare a dependency its runtime does not have. The ANY spelling inherits the same surface without asserting an edge that is not there, and it is what this tree's three already-inheriting plugin-detail factories use. A comment on the factory records the measurement so the difference is not read as drift and "corrected" back. The phantom mock itself is left in place — removing it is a decision for triage, not a rider here.

Positive control — three legs, from the committed tree, restore proven by STATE

Each leg under a trap with absolute paths; each mutation proven on disk by an anchored count AND a changed blob before the gate result is read; each restore proven by git hash-object equalling the HEAD blob AND git diff HEAD naming zero paths — never by a checkout exit code.

leg file mutation gate names HEAD blob = restored blob
1 plugin-gantt/.../ObjectGantt.rowCeiling-7210.test.tsx full freeze (obtain and spread both removed) exit 1 :64 080e6cf56
2 plugin-calendar/.../ObjectCalendar.unscheduled-7071.test.tsx obtains, binds to a const, never spreads exit 1, reason "never spreads it" :56 ac18c89d0
3 plugin-tree/.../ObjectTree.rowCeiling-7210.test.tsx spread line deleted from the ANY form exit 1 :57 9c768873b

Gate back to exit 0 after each restore, and git status empty at the end.

⚠️ Leg 2's first attempt was a void reading and is reported as one. It spread an object literal NESTING the obtained module, and the gate returned exit 0 — so that leg exercised nothing and was redone with the shape above. Chasing why produced a genuine recogniser false negative, filed separately as objectui#8183 (finding): holdsObtainedModule() tests whether the obtained token is MENTIONED inside a spread, not whether the module is the thing spread. Measured on this tree, 0 of the 576 covered sites judged inherits use that shape, so nothing evades the gate today. ⛔ Not repaired here — this PR widens the covered set, it does not touch the recogniser.

No dist preflight is owed: the gate is a source-text scanner and both configs alias the specifier to source.

Covered set: 13 → 14

One line added to COVERED_SPECIFIERS ('@object-ui/plugin-detail', exact string match), the header count word thirteen → fourteen, the slice-9 per-specifier record added in the shape slices 5-8 used, and the remaining-population paragraph refreshed 74 → 61 with @object-ui/app-shell re-annotated as PARKED under objectui#8173.

The pin scripts/__tests__/check-vi-mock-inherit.test.ts needed no edit — confirmed by RUNNING it, not by reading it: it derives names from COVERED_SPECIFIERS rather than copying them.

Gates — exit codes captured by redirect-then-capture, pinned to 60a2c6a51

gate exit reading
node scripts/check-vi-mock-inherit.mjs 0 576 judged / 576 inherit / 0 auto-mocked over fourteen specifiers, up from 559 over thirteen; 0 frozen for @object-ui/plugin-detail (17 judged, 17 inheriting)
pin scripts/__tests__/check-vi-mock-inherit.test.ts 0 67/67; file UNEDITED
vitest run scripts/__tests__/ (whole directory) 0 115 files / 3415 tests
vitest run the 13 converted files 0 13 files / 51 tests
the SAME 13 at the merge base 310c0ab19 0 13 files / 51 tests — identical, so no test was lost, gained, or died during collection
vitest run plugin-gantt + plugin-calendar + plugin-tree 0 99 files / 692 tests
type-check of the three packages 0 each non-vacuous by tsconfig.test.json --listFiles: 8/8, 4/4, 1/1 edited files present in programs of 1481, 1402, 1188
pnpm type-check:scripts 0
pnpm lint:root 0 0 errors
targeted eslint --no-inline-config --format json over the 14 non-changeset paths 0 14 files, 0 errors, 90 warnings — 89 pre-existing, 1 on an added line (no-explicit-any on the plugin-tree ANY spelling, the same rule firing 89 times on untouched lines in these files)
pnpm check:phantom-deps 0 every in-scope import declared by the package that publishes it
pnpm check:control-bytes 0 6524 tracked text files; plus a grep -naP self-scan of all 15 changed paths, grep exit 1, no match
node scripts/check-changeset-presence.mjs 0 13 source files of 3 released packages, declared by one EMPTY-frontmatter changeset
node scripts/check-changeset-no-major.mjs 0
node scripts/check-governed-queue-guard.mjs --test 0 NOT GOVERNED — 15 paths against 5 governed surfaces, none matched
pnpm check:entry-guard 0
pnpm check:vi-mock-specifiers 0 4391 sources, 604 carry a mock

Dependency closure built first (pnpm --filter '...^...' build, exit 0) — without it the three type-checks fail with TS2307 Cannot find module on every workspace import, which reads exactly like a break this diff caused.

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

Declared narrowing. turbo ls --affected names nine packages; the three OWNING packages were run whole and apps/console, apps/site and the three examples were not. Backed by evidence rather than judgement: every changed file is a test file, and test files are leaves, so no dependent package has a path to reach this diff. CI runs the full farm regardless.

Two commits, no amend and no force-push at any point: the branch history is the empty routing push, the sweep, and the plugin-tree fix-up.


🤖 Generated with Claude Code

https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr


Generated by Claude Code

…3 vi.mock factories

objectui#6892 slice 9. Every frozen `vi.mock('@object-ui/plugin-detail', ...)`
factory now obtains the real module through `importOriginal` and spreads it
FIRST, with the file's existing overrides after it, so a new export on the
barrel can no longer resolve to `undefined` and kill the file during
collection. `@object-ui/plugin-detail` joins the gate's `COVERED_SPECIFIERS`
in the same PR (13 -> 14), which is the documented widening precondition.

Census re-derived through the gate's own `scan()` on 310c0ab: 17 judged,
4 already inheriting, 13 frozen -> 0. All 13 sit in one syntactic shape
(zero-parameter object-literal arrows) across three packages: plugin-gantt 8,
plugin-calendar 4, plugin-tree 1. No test assertion changed.

STEP 0 measured rather than assumed, and the two measurements disagree.
The barrel's graph is the largest this worklist has walked -- 564 modules,
6181 module-scope statements, 127 ComponentRegistry registrations, 99 bare
side-effect imports -- and timed cold in an EMPTY test file `importOriginal`
of it costs a median 8.8s, which is objectui#6580's app-shell STOP range.
Measured in the real files it is roughly free: -0.1s to +1.0s per file,
because those files already import `@object-ui/react` plus their own view
component, whose combined 572-module graph is a strict SUPERSET of the
barrel's 564 (zero marginal modules). The cost of inheriting a barrel is a
property of the consuming file, not of the barrel.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
… no plugin-detail edge

Fix-up on the slice-9 sweep. `check-phantom-dependencies` reads a
type-position `import('@object-ui/plugin-detail')` as a real specifier, and
`packages/plugin-tree` neither declares that package nor needs to: measured,
`ObjectTree`'s module graph reaches ZERO plugin-detail modules, against 50
each from `ObjectGantt` and `ObjectCalendar`. That factory therefore mocks a
module nothing under test ever loads, and the typed spelling would have made
the package declare a dependency its runtime does not have.

`<any>` inherits the same surface without asserting the edge, and it is the
spelling this tree's three already-inheriting plugin-detail factories use. The
twelve siblings keep the typed form, where the edge is real and declared. A
comment on the factory records the measurement so the difference is not read
as drift and "corrected" back.

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) 3189.7 KB 3191.4 KB
Main entry chunk (gzip) 143.9 KB 350 KB
Entry file index-BoKc0KoN.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) 187.85KB 52.13KB
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.62KB 19.71KB
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-06T23:04Z.

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 13 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 60a2c6a51.


Generated by Claude Code

Copy link
Copy Markdown
Contributor

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

  • CI on 60a2c6a51 converged all green at 23:13:39Z (31 checks; Live E2E (informational) excluded per the standing-down note above).
  • Ready for review at 23:14:00Z; post-flip Governed Surface Queue Guard completed/success at 23:14:19Z.
  • Auto-merge SQUASH enabled; added_to_merge_queue on the REST timeline at 23:14:25Z (read 23:14:30Z).

Landing stroke follows the merge: content probe on re-fetched origin/main ('@object-ui/plugin-detail' inside COVERED_SPECIFIERS, expected 14 entries, with a control), LANDED here and on objectui#6892 (which stays open, Part of), then the slice-10 claim (@object-ui/plugin-chatbot).


Generated by Claude Code

Merged via the queue into main with commit 97b0177 Sep 6, 2026
33 of 34 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-6892-vi-mock-inherit-slice9-plugin-detail branch September 6, 2026 23:30

Copy link
Copy Markdown
Contributor

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

Merged at 2026-09-06T23:30:16Z as 97b0177e1 (squash). Content probe on re-fetched origin/main at 23:30Z: COVERED_SPECIFIERS in scripts/check-vi-mock-inherit.mjs reads 14 entries with '@object-ui/plugin-detail' at position 14; control permissions present; the plugin-tree factory's importOriginal<any>() spelling is on main at packages/plugin-tree/src/ObjectTree.rowCeiling-7210.test.tsx:58.

Slice 10 (@object-ui/plugin-chatbot) 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