From 375914a07c10c17733e0adcac96b2589b8b00a46 Mon Sep 17 00:00:00 2001 From: Wassim SAMAD Date: Fri, 15 May 2026 09:18:36 -0400 Subject: [PATCH] Wall: paired verification logs for registry vs legacy dispatch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three one-shot console.info calls so the Phase 3 milestone-B parity check is unambiguous from the browser console alone: - [wall:registry] system bundle mounted — fires when RegisteredSystems lazy-loads nodes/src/wall/system.tsx (exactly once per viewer mount when the flag is on). - [wall:registry] first WallRenderer mounted — fires once when the first registry-driven WallRenderer mounts. - [wall:legacy] first legacy WallRenderer mounted — fires once if the legacy path is active (flag off, or kind not registered). Module-level booleans gate the renderer logs so they don't spam in scenes with many walls. Drop all three alongside the feature flag at Phase 3 sign-off. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/nodes/src/wall/renderer.tsx | 14 ++++++++++++++ packages/nodes/src/wall/system.tsx | 12 ++++++++++++ .../components/renderers/wall/wall-renderer.tsx | 14 ++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/packages/nodes/src/wall/renderer.tsx b/packages/nodes/src/wall/renderer.tsx index c1afab09..5a17e41a 100644 --- a/packages/nodes/src/wall/renderer.tsx +++ b/packages/nodes/src/wall/renderer.tsx @@ -25,6 +25,12 @@ import { BufferGeometry, Float32BufferAttribute, type Mesh } from 'three' * That decision lands in a later milestone; for now the system retains * ownership of the rebuild loop. */ +// Phase 3 verification — set once when the first registry-driven wall +// renderer mounts. Stops the log firing per wall (a scene with 200 walls +// would spam the console). Drop alongside the feature flag at Phase 3 +// sign-off. +let didLogFirstRegistryWallMount = false + function createEmptyWallGeometry(): BufferGeometry { const geometry = new BufferGeometry() geometry.setAttribute('position', new Float32BufferAttribute([], 3)) @@ -49,6 +55,14 @@ const WallRenderer = ({ node }: { node: WallNode }) => { useScene.getState().markDirty(node.id) }, [node.id]) + useEffect(() => { + if (didLogFirstRegistryWallMount) return + didLogFirstRegistryWallMount = true + console.info( + '[wall:registry] first registry-driven WallRenderer mounted — legacy WallRenderer is NOT in use', + ) + }, []) + useEffect(() => { return () => { placeholderGeometry.dispose() diff --git a/packages/nodes/src/wall/system.tsx b/packages/nodes/src/wall/system.tsx index c9161303..c2351693 100644 --- a/packages/nodes/src/wall/system.tsx +++ b/packages/nodes/src/wall/system.tsx @@ -1,6 +1,7 @@ 'use client' import { WallCutout, WallSystem } from '@pascal-app/viewer' +import { useEffect } from 'react' /** * Registry-driven wall system bundle. @@ -27,6 +28,17 @@ import { WallCutout, WallSystem } from '@pascal-app/viewer' * then this file is the single mount surface for wall's per-frame work. */ const WallSystems = () => { + // Phase 3 verification log — confirms the registry took over the wall + // dispatch. Fires once when RegisteredSystems lazy-loads this bundle (so + // exactly once per viewer mount when NEXT_PUBLIC_USE_REGISTRY_FOR_WALL=true). + // Drop alongside the feature flag at Phase 3 sign-off. + useEffect(() => { + console.info('[wall:registry] system bundle mounted — registry path active') + return () => { + console.info('[wall:registry] system bundle unmounted') + } + }, []) + return ( <> diff --git a/packages/viewer/src/components/renderers/wall/wall-renderer.tsx b/packages/viewer/src/components/renderers/wall/wall-renderer.tsx index 09c0a17c..4fc8c172 100644 --- a/packages/viewer/src/components/renderers/wall/wall-renderer.tsx +++ b/packages/viewer/src/components/renderers/wall/wall-renderer.tsx @@ -5,6 +5,12 @@ import { useNodeEvents } from '../../../hooks/use-node-events' import { getVisibleWallMaterials } from '../../../systems/wall/wall-materials' import { NodeRenderer } from '../node-renderer' +// Phase 3 verification — see the matching `[wall:registry]` log in +// nodes/src/wall/renderer.tsx. When this fires, wall is on the legacy +// path; the registry-driven WallRenderer is not in use. Drop alongside +// the legacy file at Phase 6. +let didLogFirstLegacyWallMount = false + function createEmptyWallGeometry() { const geometry = new BufferGeometry() geometry.setAttribute('position', new Float32BufferAttribute([], 3)) @@ -29,6 +35,14 @@ export const WallRenderer = ({ node }: { node: WallNode }) => { useScene.getState().markDirty(node.id) }, [node.id]) + useEffect(() => { + if (didLogFirstLegacyWallMount) return + didLogFirstLegacyWallMount = true + console.info( + '[wall:legacy] first legacy WallRenderer mounted — registry-driven WallRenderer is NOT in use', + ) + }, []) + useEffect(() => { return () => { placeholderGeometry.dispose()