shell-redesign V1 attempt-3 Phase 3 BOUNCE-FIX process-gap fix: ritual #8 regression test + walk-packet seat-fix record

guard-3 PROCESS-BLOCKER on Phase 3 bounce-fix at 400477b. Two surgical
adds satisfy the gate:

ISSUE 1 — Negative-assertion regression test wasn't committed.
ACK §4 said the non-topology overlay-leak negative assertion (ritual
#8) would land in topology-view-mode.test.tsx; the agent-browser walk
proof was evidence-of-the-moment but not a CI-runnable test. guard-3
needs the test in CI to consider ritual #8 satisfied.

Fix: new describe block in test/topology-view-mode.test.tsx —
"Class B negative assertion: non-topology routes never get vellum
overlay (ritual #8)":
- 5 routes via it.each (`/`, `/project`, `/specs`, `/for-you`,
  `/settings`) assert container.querySelectorAll(
  '[data-explorer-mode="overlay"]').length === 0.
- 1 positive companion: `/topology` graph mode DOES carry
  data-explorer-mode='overlay' on the Explorer aside.

All 6 tests pass in vitest. topology-view-mode.test.tsx: 18/19 PASS
(1 skipped seat-scope brittle from Phase 3, unrelated). Full suite:
640/642 PASS (added 6 tests; pre-existing library-review failure
preserved).

ISSUE 2 — Durable founder-walk record missing for 400477b seat-fix.
The phase-3-bounce-walk.md packet still pinned 7aa1aac; the seat-fix
verification only lived in /tmp transient handoff. Need a permanent
record co-located with the rest of the walk doctrine.

Fix: appended "FOLLOW-ON COMMITS" section to
founder-walks/phase-3-bounce-walk.md with:
- 400477b — seat-detail double-padding fix: full root cause (CSS-var
  inheritance through legacy WorkspacePage), fix description, founder
  verification at /topology/seat/$rigId/discovery.intake-router 1440x900,
  classification of inner-panel HTTP 404 as data-availability not layout.
- Briefer one-paragraph entries for the other follow-ons that landed
  during the same walk session: 6f86a5c (tabs-only shell), 84557e5
  (tab breathing), 210c322 (rig graph zero-height), ed08ff2 (lighter
  vellum + collapsed toggle), bbe6250 (floating toggle + vellum rail
  + lighter icons), and this process-gap fix itself.

Walk packet now reflects the actual branch tip composition; future
readers can trace each refinement back to its commit.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
This commit is contained in:
mvschwarzandClaude Opus 4.7 committed 2026-05-06 15:45:34 -07:00
1 parent bbe6250b97
commit b549426d73
1 file changed
+47
@@ -100,6 +100,53 @@ describe("Seat scope tabs (direct render — bypasses route fetching)", () => {
});
});
// V1 attempt-3 Phase 3 bounce-fix Class B — selective vellum overlay
// negative assertion (ritual #8): non-topology destinations MUST NEVER
// receive the vellum-translucent overlay treatment. Only the topology
// destination (and only its graph view-mode) gets data-explorer-mode='overlay';
// all other routes — including /, /project, /specs, /for-you, /settings —
// must show data-explorer-mode='opaque' (or no Explorer at all for
// destinations with surface='none').
//
// Codifies the runtime assertion that previously only ran in agent-browser
// during driver self-walk. guard-3 process gate: this test must be in CI.
describe("Class B negative assertion: non-topology routes never get vellum overlay (ritual #8)", () => {
async function renderAndWait(initialPath: string) {
Object.defineProperty(window, "innerWidth", { configurable: true, value: 1440, writable: true });
const { router } = await import("../src/routes.js");
const history = createMemoryHistory({ initialEntries: [initialPath] });
const r = createRouter({ routeTree: router.routeTree, history });
const result = render(<RouterProvider router={r} />);
await waitFor(() => {
expect(result.container.querySelector("[data-testid='app-rail']")).toBeTruthy();
}, { timeout: 5000 });
return result;
}
it.each([
["/", "Dashboard"],
["/project", "Project workspace"],
["/specs", "Specs library"],
["/for-you", "For You feed"],
["/settings", "Settings"],
])("route %s (%s) does NOT carry data-explorer-mode='overlay' anywhere in DOM", async (route) => {
const { container } = await renderAndWait(route);
const overlayElements = container.querySelectorAll("[data-explorer-mode='overlay']");
expect(overlayElements.length).toBe(0);
});
it("topology graph (/topology) DOES carry data-explorer-mode='overlay' (positive companion)", async () => {
const { container } = await renderAndWait("/topology");
// The active tab defaults to 'graph' on first mount per HostScopePage;
// useOverlayForActiveTab effect sets the topology overlay context to
// 'overlay'. AppShell propagates that to the Explorer's overlayMode prop.
await waitFor(() => {
const explorer = container.querySelector("[data-testid='explorer']");
expect(explorer?.getAttribute("data-explorer-mode")).toBe("overlay");
}, { timeout: 5000 });
});
});
// CSS-source-assertion regression test (per pseudo-element-paint contract):
// guard that routes.tsx never grows view-mode-as-URL paths
// (e.g., `/topology/host/table`, `/topology/rig/$rigId/graph`).