48d019cc77
The phase 2 code review surfaced four follow-ups left after merge. The joint accessor indexed body.valid without checking its length, so a short valid array could crash on out-of-range access; it now guards i < body.valid.count. The viz mode name list was rebuilt on every modeName() call, so it is hoisted to a static constant. A Metal shader compile test is added to catch scene.metal regressions in CI. The dead SceneView placeholder, superseded by LayeredSceneView, is removed.