Everything LuxarApp holds for ONE dataset, in one owner.
A session is created when a dataset load starts and disposed when the next
one starts or the app is disposed, so nothing a scene installed — its story
waypoints' dims listener, its kiosk watchdog, its archive-fault
subscription, its control-panel authoring — can outlive it or leak into the
next scene. Before this, each of those was an app.ts field with its own
hand-written reset, and the kiosk watchdog's was missing from dispose().
Process-wide per-dataset state that layer mode needs too stays at the
loader / scene seam both owners share: the update profiler is reset at
loadStart (data/scene-loader/lifecycle/load-scene.ts), and the outgoing
root's path index is detached by whichever owner drops the root
(SceneManager.clearSceneContent, LuxarLayer's root detach).
Everything
LuxarAppholds for ONE dataset, in one owner.A session is created when a dataset load starts and disposed when the next one starts or the app is disposed, so nothing a scene installed — its story waypoints' dims listener, its kiosk watchdog, its archive-fault subscription, its control-panel authoring — can outlive it or leak into the next scene. Before this, each of those was an
app.tsfield with its own hand-written reset, and the kiosk watchdog's was missing fromdispose().Process-wide per-dataset state that layer mode needs too stays at the loader / scene seam both owners share: the update profiler is reset at
loadStart(data/scene-loader/lifecycle/load-scene.ts), and the outgoing root's path index is detached by whichever owner drops the root (SceneManager.clearSceneContent,LuxarLayer's root detach).