You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
finding(test-infra): packages/plugin-tree/src/ObjectTree.rowCeiling-7210.test.tsx mocks @object-ui/plugin-detail, a module nothing under test loads — a phantom mock that survives objectui#6892 slice 9 only through an <any> spelling #8185
Filed by the domain:devx @ objectui execution seat (PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46, 2026-09-06T23:06Z) from the open question in the objectui#6892 slice-9 report (PR #8184, head 60a2c6a51). The slice shipped the mock inheriting; the cleanup it points at is a behavioural test edit outside that slice's ruling, so it is a card, not a rider. Dedup: an MCP issue search for the phantom returns nothing; the control query returns objectui#8183.
What the tree says (60a2c6a51)
packages/plugin-tree/src/ObjectTree.rowCeiling-7210.test.tsx carries vi.mock('@object-ui/plugin-detail', …), one of a rowCeiling-7210 sibling set copied across plugin-gantt, plugin-calendar and plugin-tree.
packages/plugin-tree/package.json declares no @object-ui/plugin-detail dependency, and it has no reason to: the slice-9 dev walked ObjectTree's static import graph and it reaches zero plugin-detail modules, where ObjectGantt's and ObjectCalendar's each reach 50. The mock therefore replaces a module nothing under test ever imports — it has no effect on the test.
Slice 9 made it inherit the real surface (the gate now reads 0 frozen for the specifier), but had to use importOriginal<any>() instead of the typeof import('@object-ui/plugin-detail') generic its twelve siblings use, because a type-position import() of the specifier is a real import to check-phantom-dependencies, which then correctly demands a dependency edge the runtime does not have. A ten-line comment on the factory records this so nobody "fixes" it back.
The three routes the dev weighed (recommendation: B, as a follow-up)
B — delete the phantom vi.mock block. Nothing in plugin-tree imports the specifier, so removal changes no behaviour; the specifier's plugin-tree row leaves the vi-mock census (17 judged → 16) and a copy-paste artefact leaves the sibling set. Contract-first argues for it: a mock is a declaration about a dependency, and this one declares an edge that does not exist.
C — add the devDependency and use the typed form. Rejected on the anti-AI-error axis: it declares a dependency edge the runtime does not have, which is exactly the shape this worklist removes, and widens the dependency graph for a mock with no consumer.
Size: S (one block deletion, run the file, run check:vi-mock-inherit and check:phantom-deps). Whoever takes it should also check the other rowCeiling-7210 siblings for the same copy-paste (plugin-kanban's and app-shell's plugin-detail mocks were already inheriting on main and may or may not be phantoms — not measured by slice 9).
Verification recipe
git fetch origin main
git grep -n "vi.mock('@object-ui/plugin-detail'" origin/main -- packages/plugin-tree
git show origin/main:packages/plugin-tree/package.json | grep -c plugin-detail # 0
Filed by the
domain:devx @ objectuiexecution seat (PM sessionsession_01FhBNJcLRZLe8M87VcUgpKr, R46, 2026-09-06T23:06Z) from the open question in the objectui#6892 slice-9 report (PR #8184, head60a2c6a51). The slice shipped the mock inheriting; the cleanup it points at is a behavioural test edit outside that slice's ruling, so it is a card, not a rider. Dedup: an MCP issue search for the phantom returns nothing; the control query returns objectui#8183.What the tree says (
60a2c6a51)packages/plugin-tree/src/ObjectTree.rowCeiling-7210.test.tsxcarriesvi.mock('@object-ui/plugin-detail', …), one of arowCeiling-7210sibling set copied across plugin-gantt, plugin-calendar and plugin-tree.packages/plugin-tree/package.jsondeclares no@object-ui/plugin-detaildependency, and it has no reason to: the slice-9 dev walkedObjectTree's static import graph and it reaches zero plugin-detail modules, whereObjectGantt's andObjectCalendar's each reach 50. The mock therefore replaces a module nothing under test ever imports — it has no effect on the test.importOriginal<any>()instead of thetypeof import('@object-ui/plugin-detail')generic its twelve siblings use, because a type-positionimport()of the specifier is a real import tocheck-phantom-dependencies, which then correctly demands a dependency edge the runtime does not have. A ten-line comment on the factory records this so nobody "fixes" it back.The three routes the dev weighed (recommendation: B, as a follow-up)
vi.mockblock. Nothing in plugin-tree imports the specifier, so removal changes no behaviour; the specifier's plugin-tree row leaves the vi-mock census (17 judged → 16) and a copy-paste artefact leaves the sibling set. Contract-first argues for it: a mock is a declaration about a dependency, and this one declares an edge that does not exist.Size: S (one block deletion, run the file, run
check:vi-mock-inheritandcheck:phantom-deps). Whoever takes it should also check the otherrowCeiling-7210siblings for the same copy-paste (plugin-kanban's and app-shell's plugin-detail mocks were already inheriting on main and may or may not be phantoms — not measured by slice 9).Verification recipe
Refs objectui#6892, PR #8184, objectui#8183.