# Changelog

## Score

- CAI 55 → 61 (+5.6)
- Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

## Lenses

- Code Health 68 → 68 (-0.2)
- Architecture 97 → 88 (-9.3)
- Maturity 66 → 66 (-0.0)
- Readiness 62 → 64 (+1.4)
- Security 42 → 58 (+15.4)
- Performance 60 (new)

## Resolved (164)

- AmmoPhysicsWorld.raycastAll (cognitive 16) (src/framework/physics/ammo/ammo-physics-world.js)
- AppBase.init (cyclomatic 16) (src/framework/app-base.js)
- BindGroup.update (cognitive 21) (src/platform/graphics/bind-group.js)
- Boundary-crossing change coupling: lightmapper.js ↔ shadow-renderer-local.js (src/framework/lightmapper/lightmapper.js)
- Change coupling: container.js ↔ glb-parser.js (src/framework/handlers/container.js)
- Change coupling: gsplat-info.js ↔ gsplatCopyToWorkbuffer.js (src/scene/gsplat-unified/gsplat-info.js)
- Change coupling: gsplat-work-buffer-render-pass.js ↔ gsplatCopyToWorkbuffer.js (src/scene/gsplat-unified/gsplat-work-buffer-render-pass.js)
- Change coupling: gsplat-work-buffer-render-pass.js ↔ gsplatCopyToWorkbuffer.js (src/scene/gsplat-unified/gsplat-work-buffer-render-pass.js)
- Change coupling: standard-material.js ↔ reflectionCube.js (src/scene/materials/standard-material.js)
- Change-coupling hub: forward-renderer.js → light-texture-atlas.js, gpu-updater.js, shadow-renderer-directional.js, shadow-renderer-local.js, shadow-renderer.js, screenDepth.js (src/scene/renderer/forward-renderer.js)
- Change-coupling hub: gsplat-manager.js → compute-radix-sort-multipass.js, gsplat-info.js, gsplat-interval-compaction.js, gsplat-octree-instance.js, gsplat-projector.js, gsplat-unified-sort-worker.js, gsplat-work-buffer.js, gsplatCopyToWorkbuffer.js (src/scene/gsplat-unified/gsplat-manager.js)
- Change-coupling hub: standard-material-options-builder.js → standard-material-options.js, standard-material-parameters.js, reflectionCube.js, lit-shader-options.js (src/scene/materials/standard-material-options-builder.js)
- ClassTooLong: ForwardRenderer (src/scene/renderer/forward-renderer.js)
- CollisionComponent._updateCompound (cognitive 16) (src/framework/components/collision/component.js)
- Dependency hygiene PARTLY measured — npm pinning read, dependency currency not (no pnpm-resolved versions to grade)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- DracoWorker::decodeMesh (cognitive 31) (src/framework/parsers/draco-worker.js)
- DracoWorker::decodeMesh (cyclomatic 20) (src/framework/parsers/draco-worker.js)
- FileTooLong: renderer/forward-renderer.js (src/scene/renderer/forward-renderer.js)
- …and 144 more

## New (127)

- Atlas.upload (cognitive 22) (src/framework/font/canvas-font.js)
- BindGroup._revalidate (cognitive 20) (src/platform/graphics/bind-group.js)
- Boundary-crossing change coupling: deprecated.js ↔ blend-state.js (src/deprecated/deprecated.js)
- Change coupling: blend-state.js ↔ webgpu-graphics-device.js (src/platform/graphics/blend-state.js)
- Change coupling: gsplat-work-buffer-render-pass.js ↔ gsplatCopyToWorkbuffer.js (src/scene/gsplat-unified/gsplat-work-buffer-render-pass.js)
- Change coupling: gsplat-work-buffer-render-pass.js ↔ gsplatCopyToWorkbuffer.js (src/scene/gsplat-unified/gsplat-work-buffer-render-pass.js)
- Change coupling: stdDeclaration.js ↔ stdDeclaration.js (src/scene/shader-lib/glsl/chunks/standard/frag/stdDeclaration.js)
- Change-coupling hub: forward-renderer.js → gpu-updater.js, shadow-renderer-directional.js, shadow-renderer-local.js, shadow-renderer.js, screenDepth.js (src/scene/renderer/forward-renderer.js)
- Change-coupling hub: gsplat-manager.js → compute-radix-sort-multipass.js, gsplat-info.js, gsplat-interval-compaction.js, gsplat-octree-instance.js, gsplat-projector.js, gsplat-unified-sort-worker.js, gsplat-work-buffer.js (src/scene/gsplat-unified/gsplat-manager.js)
- Change-coupling hub: standard-material-options-builder.js → standard-material-options.js, standard-material-parameters.js, lit-shader-options.js (src/scene/materials/standard-material-options-builder.js)
- ClassTooLong: GSplatHybridRenderer (src/scene/gsplat-unified/gsplat-hybrid-renderer.js)
- ClassTooLong: Material (src/scene/materials/material.js)
- Documentation: no contributor guidance (README.md)
- End-of-life runtime: Node.js 18
- FileTooLong: batching/batch-manager.js (src/scene/batching/batch-manager.js)
- GSplatBudgetBalancer._accumulate (cognitive 37) (src/scene/gsplat-unified/gsplat-budget-balancer.js)
- GSplatBudgetBalancer._accumulate (cyclomatic 17) (src/scene/gsplat-unified/gsplat-budget-balancer.js)
- GSplatDirector.update (cognitive 64) (src/scene/gsplat-unified/gsplat-director.js)
- GSplatLodTable.constructor (cognitive 38) (src/scene/gsplat-unified/gsplat-lod-table.js)
- GSplatOctree.flushRequests (cognitive 17) (src/scene/gsplat-unified/gsplat-octree.js)
- …and 107 more

## Changes since last survey

- 218 commits — 136 feature/other, 82 fixes

## By area

- src/scene — 60 commits
- src/framework — 49 commits
- src/platform — 27 commits
- (root) — 22 commits
- examples/src — 16 commits
- src/extras — 9 commits
- test/framework — 9 commits
- src/core — 5 commits
- examples/thumbnails — 4 commits
- scripts/esm — 4 commits
- test/scene — 4 commits
- examples/assets — 3 commits
- examples/package-lock.json — 2 commits
- test/platform — 2 commits
- examples/iframe — 1 commit
- test/extras — 1 commit

## Notable commits

- fix: Add Ammo regression tests for a body moved and enabled before the first frame (#9444)
- fix: Fix CameraComponent#setShaderPass() throwing when resetting the pass (#9451)
- fix: Fix Debug.assert and Texture levels JSDoc types (#9491)
- fix: Fix JSDoc types that disagree with runtime values, salvaged from #5817 (#9469)
- fix: Fix Picker readback rectangle in the top-left to bottom-left flip (#9441)
- fix: Fix a markup parser crash when a tag name shadows hasOwnProperty (#9468)
- fix: Fix bundle asset load retrying and error-response handling (#9460)
- fix: Fix fisheye gsplats and sky in flipped render targets (#9495)
- fix: Fix the WebGL multi-draw fallback submitting no draws (#9461)
- fix: fix(examples): Apply settings once the initial values are set (#9640)
- fix: fix(examples): Resolve the inspector's engine peer to the linked engine (#9641)
- fix: fix(examples): Restore the depth prepass in the gaussian splat depth-of-field example (#9639)
- fix: fix(examples): Serve iframe/inspector.mjs as is in the dev server (#9638)
- fix: fix: Accept mesh instances without a material in Layer#addMeshInstances (#9579)
- fix: fix: Accept status 0 responses from non-http schemes (#9508)
- fix: fix: Announce apps to the devtools hook from every build (#9646)
- fix: fix: Apply area-picker example material changes via update() (#9497)
- fix: fix: Apply camera clip plane changes to a running XR session (#9624)
- fix: fix: Apply the stencil read mask and share pipelines across stencil references on WebGPU (#9611)
- fix: fix: Blur the TAA output in the camera frame's bloom and depth of field (#9591)
- …and 198 more
