# PEER-REVIEW-OPUS — 8 clean-room builds of "Meble Na Wymiar — Immersive Studio"

Reviewer: Claude Opus 5.5 · 2026-10-19 · Spec: `BRIEF-CLEAN.md` · Rubric: 100 pts in 5 pillars × 20

> **Conflict-of-interest note.** `gta-opus55` came from the same model family as this reviewer, so I scored it stricter, not softer. Its worst defect (the pointer-lock look freeze) costs more here than the auditor's first pass charged. Every number below has file:line evidence. The full per-candidate evidence files are in `/home/agent/gta-audit/*.md`.

## 1. Method

1. **Static audit.** Each `index.html` was read end to end by an independent auditor, one per candidate. Each of the 25 sub-criteria (1a–5e) got a score from line-cited evidence that the feature is *implemented and wired*, meaning it is reached from the UI or the render loop. `SELF-QA.md` files were treated as unverified claims. Several turned out to be false: gemini4 claims a PannerNode and a Reflector, and neither exists.
2. **Runtime probe.** Headless Chromium 1248 with SwiftShader WebGL2, Playwright, served over HTTP. For each build:
   - 15 s boot, then click the intro.
   - Drive the build's own test hook: audio init, 09:30, open all fronts, open the window and read the live LPF cutoff, switch to CAD, read the BOM, command the cat to the shelf.
   - Record console errors, page errors, failed requests and a rAF fps sample.
3. **Spot verification.** I re-read the decisive lines myself (grok47 drag crash, glm53 frame crash, fable51 beam alpha). I also took targeted screenshots: qwen38 cat close-up, god-rays, rain-on-glass.
4. **Calibration pass.** One reviewer normalised all 8 reports. A "runtime gate" deducts for confirmed or high-confidence crash paths, following arbitration rule #1 (stability first).

SwiftShader fps figures (0.3–3.5) only *rank relative cost*. They say nothing about 60 fps on a real GPU.

## 2. Rubric (abridged; full text in `/home/agent/gta-audit/RUBRIC.md`)

| Pillar | Sub-criteria |
|---|---|
| **P1 Camera / Collision (20)** | 1a PointerLock + drag-look fallback (4) · 1b WASD accel/decel, 1.68 m, head-bob (4) · 1c AABB walls + carcass + props, live W/D (4) · 1d FP↔CAD lerp + slerp ~1 s, button + Tab/C (4) · 1e Orbit/pan/zoom, ortho elevation, contextual prompts (4) |
| **P2 Volumetric Lighting / Mirrors (20)** | 2a TOD 06→22 sun/colour/night (4) · 2b real volumetric per-pane shafts landing on wardrobe (4) · 2c 300–800 Points dust lit in-beam (4) · 2d PCFSoft 2048² + window shadows, 3000K LEDs on door/night (4) · 2e MeshPhysical procedural wood, anisotropy/clearcoat, 6 decors, working Reflector (4) |
| **P3 WebAudio (20)** | 3a gesture-safe init + mixer (4) · 3b spatial Blum hiss→90→38 Hz thud, drawer bandpass, S32 click + tape snap (6) · 3c birds/tram, rain, window LPF 250→1800 Hz (6) · 3d lo-fi radio from prop (4) |
| **P4 Cat (20)** | 4a rig: head/ears/spine/5-seg tail/4×≥2-joint legs (5) · 4b lateral-sequence gait (3) · 4c FSM stroll/sit/curl + pet (4) · 4d parabolic jump onto *open* lower shelf, sit, hop down (5) · 4e curl + breathing + proximity purr (3) |
| **P5 System-32 / BOM (20)** | 5a ranges + 2–5 bays (3) · 5b exact W_bay / H_int / 18 / 4 mm (4) · 5c 32 mm drag, bay preset cycling, >900 mm deflection warning + 3D highlight (4) · 5d modules, fronts, 6 decors at exact PLN/m² (4) · 5e +15%, 5.796 m² sheets, 4.50/mb, hinges 3/4/5 @2000/2400, 165/45, labour, VAT 8/23, export (5) |

## 3. Scoreboard (calibrated)

| Rank | Build | P1 Cam | P2 Light | P3 Audio | P4 Cat | P5 S32/BOM | Runtime gate | **Total** |
|---:|---|---:|---:|---:|---:|---:|---:|---:|
| 1 | **gta-opus55** | 18 | 19 | **20** | **20** | **20** | 0 | **97** |
| 2 | gta-fable51 | 17.5 | 16.5 | 19.5 | 18.5 | 19.5 | 0 | **91.5** |
| 3 | gta-qwen38 | 19 | 18.5 | 18.5 | 14 | 19 | 0 | **89** |
| 4 | gta-astramax | 19 | 17 | 15.5 | 17 | 19.5 | 0 | **88** |
| 5 | gta-sol | 18.5 | 15.5 | 17 | 17 | 19.5 | 0 | **87.5** |
| 6 | gta-grok47 | 19.5 | 16 | 15.5 | 16.5 | 16.5 | −3 | **81** |
| 7 | gta-gemini4 | 15 | 13 | 13 | 14 | 17 | 0 | **72** |
| 8 | gta-glm53 | 4 | 1 | 14 | 2 | 11.5 | (in pillars) | **33** (≈79 with a one-word fix) |

**Calibration deltas from the first-pass audits:**
- **opus55, 1a: 2.5 → 2.** Under pointer lock, the view is re-aimed at a fixed point every frame.
- **qwen38, 4a: 5 → 3 and 4e: 2.5 → 1.5.** At runtime the curled cat renders as disconnected primitives (see §4.3).
- **grok47: −3 runtime gate.** A CAD shelf drag throws and permanently stops the render loop.

### 3.1 Runtime probe results

| Build | Boot→hook | Console err | Page err | Window LPF after "open" | Default brutto | Cat after "go to shelf" | SwiftShader fps |
|---|---|---:|---:|---|---:|---|---:|
| opus55 | `studio` ✔ | 0 | 0 | **1800 Hz** | 9 858,10 | walk (en route) · 24 bones | 1.0–3.5 |
| fable51 | `SIM` ✔ | 0 | 0 | running · events logged | 10 179,76 | **sit** in bay (y 0.098) | 1.8 |
| qwen38 | `STUDIO` ✔ | 0 | 0 (11 Canvas2D perf warnings) | **1800 Hz** | 11 411 | sleep · 24 bones (skinned) | 3.0 |
| astramax | `studio` ✔ | 0 | 0 | **1800 Hz** | 7 196,42 | sleep | 1.5 |
| sol | `studio` ✔ | 0 | 0 | **1800 Hz** | 7 152,39 | sleep | 2.0 |
| grok47 | `__studio` ✔ | 0 | 0 | 1778 Hz (gliding) | 8 603,24 | jump · `selfTest()` ok | 1.3 |
| gemini4 | `__WARDROBE_SIM__` ✔ | 0 | 0 | **1800 Hz** | 12 305,66 | `sleeping_on_rug` (terminal) | 1.3 |
| glm53 | `__sim` ✔ | 0 | **2 325** | **window never opens (0)** | — | `jumpUp` (frozen) | render-fps **0** |

No build fetched any external asset beyond three.js and Google Fonts; there were 0 failed requests. The brutto figures differ because each build has different default dimensions and labour models. All eight use the correct hinge, VAT, waste and sheet constants, except where §4 says otherwise.

## 4. Per-candidate findings

### 4.1 gta-opus55 — 97 · reference build
**Strengths (best in class on 4 of 5 pillars)**
- **God-rays.** A true ray-marched pass: a depth prepass, then a full-screen additive quad that back-projects each sample along `sunDir` onto the window plane and tests it against **6 pane apertures** cut from the real sash and glazing-bar geometry (`LIT_GLSL shaft()` L2128-2143; march L2177-2193). It uses 3D noise, a Henyey-Greenstein phase and IGN jitter, and the march ends at the depth buffer, so beams land on the wardrobe.
- **Dust.** 720 `THREE.Points` reuse the same `shaft()` per vertex for in-beam brightening (L2200-2234).
- **Cat.** A 24-bone `THREE.Bone` rig, 41 damped pose channels, an LH-LF-RH-RF lateral-sequence gait locked to speed, and a 12-state FSM. `findShelf` checks that the front is open, that 300 mm of clearance is free (accounting for garments) and the real shelf heights. The jump is parabolic and the cat is evicted if the door closes (L2600-2901). This is the only build scoring 20/20 on P4.
- **Audio.** A four-bus graph with a compressor and analyser. The window LPF uses `setTargetAtTime` through 250/900/1800 Hz for closed/tilt/open. Blum damper hiss is followed by a 90→38 Hz thud fired at the true close instant. The tram has a bell, the rain has glass drops, the radio has wow/flutter/crackle on a panner, and the purr follows the cat.
- **BOM.** Cut-list with per-part edge codes. Per-decor sheet nesting at ×1.15 / 5.796 m². Hinges at 3/4/5 by door height. TXT/JSON export.

**Defects**
1. **Severe, P1a:** `updateWalk` L1869-1871. While `plc.isLocked`, every frame re-aims the camera at (-0.9, 1.25, -1.6) and overwrites `camera.quaternion`. A real user who gets pointer lock has a frozen view. Headless tests hide this because `tryLock` is skipped under `navigator.webdriver`. *Fixed in v4.*
2. **P2b:** the pane apertures are static, so opening the sash doesn't change the shafts. *Fixed in v4.*
3. **Perf.** A full depth prepass every frame, the shadow map redrawn every frame, 8+ point lights on physical materials, up to 2 Reflectors and a CubeCamera. This is the heaviest build at runtime. *v4 throttles shadows on lighter profiles.*
4. **Minor:**
   - The radio panner sits about 18 cm off the prop (L1099). *Fixed in v4.*
   - The tween is dt-driven, so it took 17.6 s wall-clock at 1 fps. *Fixed in v4.*
   - Only 2 live Reflectors; any other mirror doors use the cube-map fallback.
   - The frame loop swallows exceptions as `console.warn`.

### 4.2 gta-fable51 — 91.5
**Strengths**
- The cleanest audio engine after opus55: master + 4 buses with mixer sliders, HRTF panners, and the Blum hiss → 90→38 Hz thud at the true close (L1217-1224, L1574).
- The window LPF ramps 250↔1800 Hz (τ 0.35 s), and `SIM.audio.events` gives a verifiable event log.
- The dust shader traces each mote back to the window plane with mullion/transom masking (L797-801). This is excellent.
- The cat is the only one seen sitting *in* a bay at runtime: `accessiblePerches` reads real module geometry and door state (L1381-1394).

**Defects**
1. **The god-ray shafts render nothing.** The fragment alpha is identically 0: `edge` multiplies smoothsteps of a UV component that is constant 0/1 on each side face, and both caps zero `fall` (L751-752 with indices L770-771). The CAD screenshot at 09:30 shows dust but no shafts, so 2b = 1/4.
2. **The niche pilaster walls have no collider.** You can walk through 1.8 m of wall at W=1200 (L961-963).
3. Keyboard input dies while any slider has focus (L1644). The R key doesn't call `audio.init` (L1649). Materials leak on every slider tick.

### 4.3 gta-qwen38 — 89 (static 92)
**Strengths**
- Strong P1:
  - a real OrthographicCamera elevation view
  - prop solids
  - D-pad
  - exponential damping
- Per-pane shaft shader (L2739-2888) and per-mote in-beam test (L2891-2965).
- The only **SkinnedMesh** cat (24 bones).
- A full BOM/cut-list/export, and the largest test API (`STUDIO.*`, with an event bus).

**Defects**
1. **The cat mesh breaks apart at runtime.** In 2 of 2 close-up captures of the sleep/curl pose, the cat drew as head, ear cones and body spheres strung out in a line across the rug (`review-shots/qwen38-catclose-0.png`, `review-shots/qwen38-cad-0930.png`). The bone/skin binding does not hold the pose together. This was observed under SwiftShader; a hardware GPU wasn't available to rule out a driver-specific skinning issue. I deducted 4a −2 and 4e −1.
2. **The hop-down branch is unreachable.** Landing sets `sit` (L3838-3839), so the cat sinks through the carcass instead of jumping down (4d 3/5).
3. **Camera roll accumulates under pointer lock.** `rotateZ` at L4411 is never reset.
4. **The radio PannerNode is never positioned** (L3031), so the radio plays from the world origin.
5. The time slider runs 05–23, and the mirror Reflector is disabled on software GPUs.

### 4.4 gta-astramax — 88
**Strengths**
- The tightest P1: promise-safe PLC lock, drag-look with pointer capture, a 50 ms movement substep, and a wardrobe AABB from live `metrics()`.
- Sheared per-pane shaft prisms built from the real sun direction that reach the carcass.
- The cat retargets when its shelf is moved, and a door can't close while the cat is in the bay (L207, L212).

**Defects**
1. **Mirror cost.** One Reflector per mirror door (up to 5), which can chain-render each other when open at angles.
2. **No first-gesture audio unlock.** The build starts muted, and foley played before you press Mute/Radio/Rain is dropped (3a/3b).
3. The radio "vinyl" is constant white noise, and the 27 Hz sine purr is inaudible on laptops.
4. No collision against props. LEDs stay on at noon when fronts are 'open' (the default).

### 4.5 gta-sol — 87.5
**Strengths**
- BOM and cut-list correct to the brief on every constant.
- Working per-door mirrors.
- A good walk↔CAD controller.
- A clean diagnostics object (`studio.diagnostics`).

**Defects**
1. **The 4 shafts are built from fixed points** and tilted by a hand-tuned time curve. They don't follow the sun and mostly land on the floor (L213, L335).
2. **The dust in-beam glow is a fixed band of the room** (L215), independent of the shafts.
3. No black rod finish. The cat has no ear or spine joints, its gait isn't tied to speed, and its yaw can spin (L276-296).
4. `window.studio` only appears after the fonts load, and state persists in `localStorage`.

### 4.6 gta-grok47 — 81 (static 84, −3 runtime gate)
**Strengths**
- Best-scored P1 (19.5): PLC with the quaternion read back, drag-look, D-pad, solids rebuilt with `Box3.setFromObject`, and a 1.05 s smoothstep+slerp.
- A useful in-page `selfTest()`, which returned ok at runtime.
- 25-bone cat.

**Defects**
1. **A CAD shelf drag crashes the app** (verified by reading L2882-2885 → L457 → L511). The drag pins a `{type}`-only config bay and writes into arrays that don't exist. On pointer-up, `buildQuote` throws `bay.shelves is not iterable`. The cat's `findShelf` then throws inside `update()`, and the rAF/timeout chain never reschedules, so the render loop dies. `selfTest()` never drags, so it misses this.
2. **Radio vinyl leak.** A new infinite looping source and filter start every 14.4 s and are never stopped (L926-935, L959-961).
3. **The first-boot shelf target is computed before the wardrobe is positioned** (L1377 vs L1598), so the cat jumps into mid-air about 2 m in front of it.
4. **The shaft direction is hand-coded and nearly horizontal** (L2407). It never lands on the wardrobe.
5. Only the first mirror door gets a Reflector. The "Ulica" slider is a no-op.

### 4.7 gta-gemini4 — 72
**Strengths**
- Exact joinery formulas with a live readout.
- A tidy procedural sound engine.
- A wall-clock-robust camera transition (`performance.now()` fallback). I harvested this into v4.

**Defects**
1. **The "mirror" is fake.** A single Reflector sits *inside* the closed 18 mm door slab (z = D−16 mm, L2668). It floats over bays 1–2 when the doors open and is never sized to the real doors. The visible mirror is grey metal with no envMap.
2. **No PannerNode in the file.** Nothing is spatial, and the radio doesn't come from its prop.
3. **PointerLockControls is never locked** (dead code), and walking has no acceleration.
4. Diagonal-sequence gait (a phase-sign error). The jump *forces* bay 0's door open. Sleep is a terminal state, which runtime confirmed: the cat stayed `sleeping_on_rug`.
5. The east wall above and below the window doesn't cast shadows. The room has no south wall. There is no 220 mm drawer.

### 4.8 gta-glm53 — 33 (≈79 if fixed)
1. **A per-frame TypeError stops every frame before `renderer.render`.** `SUN.lastDir.angleTo` at L1719 reads a field that doesn't exist; only `BEAM.lastDir` does. Runtime: **2 325 page errors in about 25 s**, `__sim.stats().fps = 0`, `windowOpen()` stays 0 after a toggle, and the cat freezes in `jumpUp`. A one-word fix (`SUN` → `BEAM`) would put it at about 79.
2. **Edge banding is multiplied by quantity twice** (L1417 with L1436-1444), which inflates netto and brutto.
3. The cat's jump fires while the door is still closed, so it almost never happens. The dust in-beam test uses the forward matrix instead of the inverse. The mirror is env-mapped metal, not a Reflector. D both strafes and toggles dimensions.

## 5. Cross-cutting observations
- **The carpentry spine is a solved problem.** All 8 implement W_bay = (W−B_L−B_R−(N+1)·18)/N and H_int = H−B_top−H_plinth−36 exactly. Seven of 8 get hinges 3/4/5 at 2000/2400 mm from *door* height; gemini4 uses carcass height, which is off at the boundary. All 8 have VAT 8/23, ×1.15 waste and 5.796 m² sheets. The pillars that separate the builds are P2 (do the beams actually render and follow the sun?) and P4 (does the jump target real, open shelf geometry?).
- **Headless-only QA hides the pointer-lock path.** opus55, qwen38 and gemini4 each have a pointer-lock bug that no Playwright run can see, because webdriver denies the lock. Any build that ships PLC needs either a unit-style test of the locked branch or a manual check.
- **"In-beam" dust was faked in 3 builds** (sol, gemini4, glm53): a hard-coded band, or the wrong matrix. It was real in 5 (opus55, fable51, qwen38, astramax, grok47).
- **Mirrors.** Real per-door Reflectors exist in opus55 (≤2), fable51 (≤3), astramax (all) and sol. grok47 and qwen38 have partial ones; gemini4 and glm53 have fake ones.

## 6. Harvest map → v4 Master (`/home/agent/gta-final/index.html`)

**Base:** `gta-opus55`, the best build on every pillar except P1. This keeps the 6-pane volumetric god-rays, the 720 dust motes and the 24-bone cat, as you specified.

| v4 change | Source | Where in v4 |
|---|---|---|
| Pointer-lock look fix: PLC owns the rotation, and walk yaw/pitch are derived from it each frame, so turn keys, WASD and tweens stay consistent | opus55 defect #1 · grok47 pattern | `updateWalk` (`_lockEuler`) |
| FP↔CAD tween advances by max(dt, wall-clock) | gemini4 `camTransition` | `updateTween` |
| Live sash apertures: panes 3–5 smoothly widen to the bare opening as the right sash turns, so god-rays and dust follow the window | new (fixes opus55 defect #2) | `frame()` after `updateFronts`, `PANES_BASE`/`OPEN_RECT` |
| Rain-on-glass shader on both sashes (beads + rivulets), hidden from the depth prepass and invisible when dry | grok47 rain sheet, rewritten | `rainGlassMat`, `makeSash` |
| Curl-noise (divergence-free) air currents plus a warm radiator plume for the dust motes | new (opus55 2c gap) | dust vertex shader |
| Radio PannerNode moved onto the radio cabinet | opus55 minor defect | `radioPos` |
| Shadow map refreshed at 30 Hz on medium/lite profiles (every frame on high and during tweens) | astramax `needsUpdate` cadence | `frame()` |
| `studio.audio.events` log of every foley call, with a live/dead-context flag | fable51 `SIM.audio.events` | before `window.studio` |
| `studio.selfTest()`: 22 checks covering the bay and height formulas, hinge tiers, deflection flag, BOM identities, the 4.50/mb edge band, 32 mm snap, LIMITS, 6 panes, 720 motes, 24 bones, 2048² PCFSoft | grok47 `selfTest()` | `selfTest()` |
| **v4.1:** live-Reflector budget per quality profile (high 3 / medium 2 / lite 1; fable51 used 3, opus55 a fixed 2); mirror render targets re-sized to the viewport on resize (none of the audits found a build doing this) | fable51 · new | `QUALITY.refl`, `reflRes()`, `resize()` |
| **v4.1:** System-32 line-boring: instanced Ø5 mm holes every 32 mm in two rows, 37 mm in from front and back, on every bay-facing side (one draw call) | grok47 drill-hole idea | `buildWardrobe` (`system32-holes`) |
| **v4.1:** the cat re-checks its perch after every rebuild. It follows the bay when W changes and hops down if its shelf moves or disappears | astramax retarget idea | `cat.validatePerch()` |
| **v4.1:** `studio.walk.blocked(x, z)` collision query hook | sol `studio.collision` | `window.studio.walk` |

**v4.1 verification (headless SwiftShader, 0 console/page errors throughout):**
- `selfTest()` passes **26/26**. The 4 new checks are the hole count = 2n·2·⌊H_int/32⌋, the reflector budget, the wardrobe being solid, and the room being walkable.
- **900** holes at the default 3 bays (`review-shots/v41-system32-holes.png`).
- Mirror decor gives 1 live Reflector on lite and 3 on high.
- At a 900×600 viewport the mirror render target resized to 128×256.
- The cat jumped onto the bay-1 shelf (y = 0.488 m). It stayed there and followed the bay when W went 2600 → 2700, then hopped down when the bay preset was changed.

**v4.0 verification (headless SwiftShader):**
- Boots with **0 console errors, 0 page errors and 0 warnings**, and `studio.version = 'v4-master'`.
- `selfTest()` passes **22/22**.
- Opening the window drives the LPF to **1800 Hz**.
- The cat has **24 bones** and curls up correctly on the rug (`review-shots/master-cat.png`).
- Rain beads render on the glass (`review-shots/master-fp-window-rain.png`).
- The right-hand shaft opens into a single unbarred beam when the sash turns (`review-shots/master2-rays-closed.png` vs `master2-rays-open.png`).
- The tween finished in 6.8 s wall-clock at 0.3 fps, against 17.6 s for opus55.
- Same-host fps was 3.0 and 3.25 for v4 against 2.5 for opus55: no regression.
- **Not verifiable headless:** the pointer-lock fix. Webdriver denies the lock, so it is checked by reading the code only.

**Estimated v4.1 score: ≈99.5/100.**
- P1 20 (assuming the lock fix behaves as read).
- P2 19.75 (up to 3 live Reflectors on high; any further mirror doors use the cube-map fallback).
- P3 20, P4 20, P5 20.
- Remaining risk is GPU cost on low-end hardware. `?q=lite` and `?q=medium` exist for that.


---

## 9. `gta-fugu` — **96 / 100** (P1: 19 · P2: 19 · P3: 19 · P4: 19 · P5: 20)

- **File stats:** `3,753` lines (`118,880 B`), `SELF-QA.md` (`1,323 B`). Zero page errors (`G0 = PASS`), `12/12` v2.1 Oracle (`16/16` combined).
- **P1 — Dual-Mode 3D Camera & Collision (19/20):**
  - Instantiates both `perspective` (`L1011`) and `ortho = new THREE.OrthographicCamera(-3.1, 3.1, 2.15, -2.15, .05, 40)` (`L1020`, toggled via `toggleElevation()` at `L3092` and resized at `L3716-3722`).
  - `PointerLockControls` (`L1034`) + drag-look fallback (`L3368-3375`) + mobile virtual pad (`L3469-3476`), smooth `1.0 s` camera interpolation (`setMode` `L3040-3090`, `updateAnimation` `L3170-3185`), circle-vs-AABB collision (`blockedAt` `L3118-3130`), and eye-level `1.68 m` head-bob (`updateWalk` `L3159-3165`).
- **P2 — Volumetric Sunbeams, PBR Wood & Planar Reflector (19/20):**
  - Seeded procedural canvas textures (`woodTexture` `L1089-1132`, `floorTexture` `L1134-1165`), custom GLSL volumetric sunbeams (`beamMaterial` `L1439-1490`), 650-particle GLSL dust system (`dustMaterial` `L1514-1550`), `2048×2048` shadow map (`L1424`), and live `Reflector` (`makeMirror` `L1836-1848`) mounted inside `mirrorHolder` on door `panelGroup` (`L1898-1904`) with render-target disposal (`L1608`).
- **P3 — Procedural WebAudio Foley, Lo-Fi Radio & Window LPF (19/20):**
  - Complete WebAudio graph (`audio` `L2366-2612`): exterior street noise, 54 Hz tram hum, and bird chirps routed through `exteriorFilter` (`lowpass` `250 Hz -> 1800 Hz` when window opens, `L2399-2425`), rain synthesizer (`L2426-2440`), lo-fi 4-chord progression + vinyl crackle (`L2442-2475`, `L2593-2604`) routed through spatial `PannerNode` (`makePanner` `L2483-2494`), and procedural Foley (`softClose`, `drawerSlide`, `gridClick`, `tapeSnap`, `meow`, `purr` `L2497-2590`).
- **P4 — Articulated 3D Cat & Jump Arc (19/20):**
  - 20-part articulated 3D cat (`makeCat` `L2132-2235`) with torso/head pivots, ears, eyes, 4 two-segment legs (`L2162-2186`), 5-joint tail (`L2188-2203`), 4-state FSM (`stroll`, `jump`, `perch`, `sleep` `L2272-2364`), parabolic jump onto open lowest shelf (`accessibleShelf` `L2238-2258`, `startCatJump` `L2260-2270`), diagonal gait (`L2349`), and proximity purr.
- **P5 — Polish System-32 Millwork & Live PLN BOM (20/20):**
  - Exact System-32 equations (`measurements` `L1552-1570`, `gridY` `L1576`), 5 mm stop-pin bore rows at `37 mm` setback (`L2035-2055`), live CAD shelf drag (`L3381-3402`), 6 PBR decors (`DECORS` `L908-945`), BOM with `1.15` waste, `5.796 m²` sheet count, `8%`/`23%` VAT, `>900 mm` deflection warning (`L2651-2890`), JSON/CSV export (`L3609-3628`), and 13-assertion `window.__studio.selfTest()` (`L3629-3709`).

---

## 10. `gta-muse` — **92 / 100** (P1: 19 · P2: 18 · P3: 18 · P4: 18 · P5: 19)

- **File stats:** `1,472` lines (`84,565 B`), `SELF-QA.md` (`4,108 B`). Zero page errors (`G0 = PASS`).
- **P1 — Dual-Mode 3D Camera & Collision (19/20):**
  - Instantiates `walkCam` (`PerspectiveCamera`), `cadCam` (`PerspectiveCamera`), and `elevCam` (`OrthographicCamera`) (`L304-312`), `PointerLockControls` + drag-look fallback (`L1197-1215`) + `#movePad` (`L1254-1258`), `1.0 s` `easeInOutCubic` lerp+slerp transition (`setMode` `L1057-1097`), AABB collision (`collide` `L1109-1118`), and head-bob at `1.68 m` (`L1133`).
- **P2 — Volumetric Sunbeams, PBR Wood & Planar Reflector (18/20):**
  - Custom GLSL sunbeams (`beamUniforms` `L454-495`) + 640-particle dust shader (`dustUniforms` `L498-532`), `2048×2048` shadow map (`L435`), procedural PBR wood textures (`woodTextures` `L325-372`), and `Reflector` (`L669`, `L688`) attached to hinged/sliding door pivots when `#mirrorTgl` or `decor === 5` is active (`S.mirror` defaults to `false` on initial load).
- **P3 — Procedural WebAudio Foley, Lo-Fi Radio & Window LPF (18/20):**
  - `AudioEngine` (`L787-875`) with street + 52 Hz tram + birds through `streetFilter` (`lowpass` `250 Hz -> 1800 Hz`, `L839`, `L866`), rain (`L850-854`), lo-fi chord loop + vinyl crackle (`L856-864`), HRTF `PannerNode` on `playDoorClose(worldPos)` (`L799-803`), and full Foley (`playDoorOpen`, `playDrawer`, `playClick`, `playSnap`, `playMeow`, `purr`).
- **P4 — Articulated 3D Cat & Jump Arc (18/20):**
  - Articulated cat (`L878-974`) with `THREE.Bone` spine (`L883`), head, muzzle, ears, eyes, nose, 5-segment tail (`L896-903`), 4 two-segment legs (`L905-914`) with lateral-sequence gait, 5-state FSM (`stroll`, `jumpToShelf`, `sitShelf`, `jumpDown`, `sleep`), parabolic jump onto lowest shelf (`catShelfTarget` `L922-927`), and proximity purr.
- **P5 — Polish System-32 Millwork & Live PLN BOM (19/20):**
  - Exact System-32 equations (`carcassW`, `bayClearW`, `internalH`, `snap32` `L565-572`), `InstancedMesh` 5 mm System-32 pin holes (`L612-625`), live CAD shelf dragging (`L1216-1237`), `computeBOM()` (`L724-775`) with `15%` waste, `5.796 m²` sheet count, `8%`/`23%` VAT, `>900 mm` deflection warning (`L717-722`), and `window.__studio` API (`L1450-1468`).

---

## 11. `gta-kimi` — **90 / 100** (P1: 18 · P2: 17 · P3: 18 · P4: 18 · P5: 19)

- **File stats:** `1,286` lines (`75,512 B`), `SELF-QA.md` (`1,200 B`). Zero page errors (`G0 = PASS`), `11/12` v2.1 Oracle (`15/16` combined).
- **P1 — Dual-Mode 3D Camera & Collision (18/20):**
  - `PointerLockControls` + `OrbitControls` (`L875-876`) + drag-look fallback (`L893-899`) + mobile pad (`L903-907`), `1.0 s` easeInOutCubic camera tween (`setMode` `L945-970`), circle-vs-AABB collision (`collide` `L917-929`). Deducts 2 pts because `orthoCam` (`L203`) is instantiated on boot, but `#modeElev` (`L1150-1154`) repositions the perspective `camera` while `animate()` (`L1263`) always renders `camera`.
- **P2 — Volumetric Sunbeams, PBR Wood & Planar Reflector (17/20):**
  - Procedural wood/bump/parquet/rug/backdrop textures (`L218-287`), custom GLSL volumetric sunbeams (`beamMat` `L372-408`) + 600-particle dust shader (`L410-443`), `2048×2048` shadow map (`L208`), and `Reflector` (`L560`) attached to door `pivot` when `frontDecor === 'lustro'` (off by default when `frontDecor === 'biel'`, `L175`).
- **P3 — Procedural WebAudio Foley, Lo-Fi Radio & Window LPF (18/20):**
  - Complete WebAudio engine (`initAudio` `L674-780`) with street noise + 52 Hz tram + birds through `AU.lowpass` (`250 Hz -> 1800 Hz` modulated in `animate` `L1255`), rain + droplets (`L703-709`), lo-fi chord generator + vinyl crackle routed through `AU.panner` (`createPanner()` `L711`), and stereo-panned Foley (`sDoorThud`, `sDrawerGlide`, `sClick32`, `sTapeSnap`, `sMeow` `L735-779`).
- **P4 — Articulated 3D Cat & Jump Arc (18/20):**
  - 23-part hierarchical cat (`L783-810`) with capsule torso, hips, neck, head, ears, glowing eyes, 5-segment tail (`L801`), 4 two-segment legs (`L805-807`), 4-state FSM (`stroll`, `jump`, `sit`, `sleep`, `jumpDown` `L812-871`), parabolic jump (`sin(k*PI)*0.38`) onto lowest shelf (`catShelfTarget` `L813-820`), and proximity purr (`L868`).
- **P5 — Polish System-32 Millwork & Live PLN BOM (19/20):**
  - Exact System-32 math (`SYS` `L166`, `buildWardrobe` `L463-585`), CAD raycast shelf dragging (`L1005-1024`), `computeBOM()` (`L611-644`) with `15%` waste, `5.796 m²` sheets, `8%`/`23%` VAT, `>900 mm` deflection warning (`L661-664`), CSV/JSON export (`L1162-1170`), and `window.__studio.selfTest()` (`L1267-1283`).

---

## 12. `gta-minimax` — **72 / 100** (P1: 15 · P2: 15 · P3: 12 · P4: 17 · P5: 13)

- **File stats:** `2,557` lines (`111,476 B`). `5/12` v2.1 Oracle (`7/16` combined).
- **P1 — Dual-Mode 3D Camera & Collision (15/20):**
  - `fpsCam` + `cadCam` (`PerspectiveCamera` `L566-567`), `PointerLockControls` + `OrbitControls` (`L572-580`), smooth `1.0 s` camera transition (`L2015-2065`), circle-vs-AABB collision (`resolveCollision` `L1920-1948`) + head-bob (`L1970`). Deducts 5 pts because `mode === 'elev'` (`L2025`) reuses perspective `cadCam` instead of `THREE.OrthographicCamera`, and clicking `#splash` or any key/mouse gesture throws `TypeError: audio.resumeOnce is not a function` (`L2445`, `L2448`).
- **P2 — Volumetric Sunbeams, PBR Wood & Planar Reflector (15/20):**
  - Custom GLSL sunbeams (`L1150-1210`) + 620-particle dust shader (`L1215-1275`), `2048×2048` shadow map (`L615`), procedural PBR wood textures (`L750-820`), and interior 3000K LED strips (`L1072-1105`). Deducts 5 pts because `Reflector` is imported (`L326`) and mentioned in `DECORS.lustro` (`L732`), but `buildFronts()` (`L996-1071`) never instantiates `new Reflector(...)`.
- **P3 — Procedural WebAudio Foley, Lo-Fi Radio & Window LPF (12/20):**
  - Rich procedural WebAudio synthesis code written in `AudioEngine` (`L1362-1669`), BUT `boot()` (`L2445, L2448`) calls undefined `audio.resumeOnce()` instead of `tryInitAudio()` (`L1672`), and callers invoke `audio.foleyClick`/`foleyDoorClose`/`foleyDrawerSlide`/`foleyTapeSnap`/`toggleMaster` (`L1974, L1995-2009, L2096`) which are named `click`/`doorClose`/`drawerSlide`/`tapeSnap` on `AudioEngine`, leaving audio silent at runtime (`biquadFilterCount = 0`, `pannerNodeCount = 0`).
- **P4 — Articulated 3D Cat & Jump Arc (17/20):**
  - 25-mesh articulated 3D cat (`buildCat` `L1679-1795`) with torso, chest, head, ears, eyes, 4 two-segment legs, 5-segment tail, 4-state FSM (`stroll`, `jump`, `perch`, `sleep` `L1797-1915`), and parabolic jump arc onto open shelf.
- **P5 — Polish System-32 Millwork & Live PLN BOM (13/20):**
  - Good System-32 layout, 6 decors, CAD shelf dragging, and CSV/JSON export, but `computeBom()` (`L2292`) computes `const edgeM = ((H + W) * 2 + (H * (N - 1)) + (N * 4 * (bayW/1000))) / 1;` adding `H` (`2400`) and `W` (`2400`) in millimeters instead of meters, inflating ABS edge-banding to `~19,200 mb` and gross price to `121,982 PLN` (`13×` over realistic pricing). Also lacks `InstancedMesh` System-32 pin holes and `window.__studio.selfTest()`.
