1Original prompt: Run a roughly 90-minute bug hunt with up to eight concurrent subagents using CUA, covering bugs, visual issues, weak UI text/layout areas, fixes, and retesting.23# Work ahead45This file is exclusively the backlog. Completed work lives in `git log`6(each round carries a detailed commit message) and in the agent memory7(measured kit facts, physics laws, debugging methods, pin tables).8Current state in one line: M1–M25 are live — endless mode is an9N-marble physics race (1–9999 racers at 4× realtime via physics LOD,10fuel boost economy, drafting wakes, seeded rivalries + temper, glass11marbles with real cores, rubber-banded pilots, ghost respawns), the12world reorients gravity 90°/180° between islands, the line BRAIDS with13LANE CHARACTER (icy vs boost lanes, wanderers, per-peer prng lanes) and14OPEN FORKS chaining up to 3 segments (2 braids/segment), the CLIMATE is15a generation input (snowdrift zones ice over, goldhour zones soar) and16every seed draws a TEMPERAMENT, islands come in ten biomes with real17MASS FAMILIES (snow/grass voxel bodies, not just tints), drafting wakes18REFILL fuel (trains form and detonate), seeded rivalries + temper run19on REAL shim contact events, the world keeps SCARS/scuffs/tipped20furniture until segments sink, floating island shards / ships / ghosts21/ meteors drift in the void, gust walls pulse in phase-locked banks,22and loop mode grew twin diamonds, stub gardens and rotundas. Diagnostic rig: ?gallery=1 piece bench (variants,23collision overlay, autopilot sim, copy-info, CUA benchGo/benchJump).24Collision is MEASURED against the kit (audit round 2026-08-09:25docs/collision-mesh-audit.md — shared proxy builder, open bores,26authored drop cups, additive wide shift, rim-height profile, 4-way27cross composite, quantitative metrics CI).28217 tests green, `deno task check` clean.2930## Active 2026-08-26 bug hunt3132- Verified/fixed: responsive title-menu width/height, native Advanced33 keyboard handling, accessible menu buttons/labels, disabled loop-only34 controls, exact whitespace-preserving seed URLs, long-seed HUD ellipsis,35 and menu-only HUD hiding.36- Verified/fixed: endless orbit now carries its pivot with the streamed37 subject instead of watching disposed segments until only stars remain.38- Verified/fixed: same-page seed changes now destroy the Box3D world, hero,39 statics, mesh handles, and WASM readback buffers; the native shim source40 and export were rebuilt locally and repeated disposal has a regression test.41- Verified/fixed: injected marble-core geometries and shared scar resources now42 dispose with their session. Alternating the same two seeds repeatedly plateaus43 at 261/276 endless geometries and 269 finite geometries instead of climbing.44- Verified/fixed: the motion ribbon no longer twists or keeps a false streak45 across teleports/leader changes. Boost is now a separate short orange-red46 additive trail (in loop and endless modes) instead of a marble color filter;47 it fades after flameout and remains constant-cost at pack scale.48- Verified/fixed: slow rail/kinematic movement now accumulates distance from a49 committed sampling anchor instead of its moving visual head. This prevents the50 trail from freezing at one point and stretching until physics motion resumes.51- Added `?debug=1` rail-flow provenance: distance-LOD handoffs are informational,52 while fall/stall recoveries warn as `tileCandidate: true` with seed, racer,53 segment, station, window, concrete piece id, family, zone, lane/part, repeat54 count, and the reseat destination. Events are rate-limited at 1/2/4/8… and the55 latest 12 are mirrored into `render_game_to_text().stream.railDebug` for CUA.56- Rail recovery sample: 18 Chrome runs × 401 racers × 300 simulated seconds57 produced 644 genuine fall/stall candidates. Two generated layouts account for58 87.73%: `rail-sample-008` segment 11's `ramp-long-b` →59 `helix-large-quarter-right` transition, and `rail-sample-015` segment 14's60 icy-alt/braid straight cluster. Full table and sensitivity analysis live in61 `docs/rail-recovery-sample-2026-08-26.md`.62- Fixed debug provenance after the sample exposed stale `placementIndex` values:63 dropped jump/reorient meshes now remap surviving path windows to the final64 placement array, so supports/decor can no longer be mislabeled as track tiles.65- Verified/fixed: the asset gallery and title menu fit 320–480px phone widths,66 short-height Advanced options remain scrollable, focus rings are visible,67 and keyboard input no longer starts the game or loses a text caret.68- Browser retests passed: exact whitespace/Unicode seeds, 15 finite regenerations,69 12 endless regenerations at 301 racers, finite/endless boost encounters, orbit70 streaming, responsive menu/gallery, and clean console scans.71- Residual S2: some generated slabs can still obscure 50–80% of the follow/orbit72 view at isolated `camera-soak-a` checkpoints. Orbit no longer loses the world,73 and tunnel shells fade around the lens, but generic occlusion needs a broader74 camera/composition treatment. A 9999-racer cold start also remains ~21s.7576## Presentation polish7778- **Twist bench** (`?demo=twist`, keys 1/2/3/4 = 0/±90/180°): the chute79 now extrudes the kit straight's own sliced section with shared kit80 materials — keep the bench for any future chute iteration (banners at81 the twist entry remain an option if the set-piece should announce82 itself more).83- **Rider lanes at pack scale**: demoted far racers glide fixed lane84 offsets — reads as an orderly stream from distance; per-rider wander85 (pilotOffset reuse) would loosen it if it ever reads mechanical.86- **Camera banking under reorient**: the follow-cam's banking lean87 samples the path in the world y-plane; inside a 90° frame the lean is88 computed against the wrong plane (tiny effect — the up-vector roll89 dominates). Fold banking into the local frame if it ever reads off.9091## Physics / feel9293- **Torque-servo authority**: only if feel ever demands spin-on-bounce /94 ice burnouts. Force-at-COM + Box3D contact friction is the standing95 decision; revisit needs new shim surface (apply torque).9697## Rendering9899- **Glass-through-glass**: transmission shells cannot refract other100 transparent shells (only opaques land in the transmission buffer).101 Escalation if close-ups demand it: port a MeshTransmissionMaterial-102 style shared-buffer material (drei-vanilla reference).103- **Nothing emits on the glass shell.** A transmission material ADDS104 emissive on top of the refracted core instead of blending with it, so105 any glow written to the shell floods the whole sphere with one flat106 colour and hides the marble inside. Boost glow lives on the CORE, in107 the racer's own hue pushed toward white — the old fixed blue at 0.9108 repainted every boosting marble identical (user: "the outer shell109 gets a blue tint at some locations or angles").110- **One reflection layer, half strength.** The RoomEnvironment PMREM is111 brighter than this world, and `clearcoat: 1` stacked a second full112 Fresnel over the glass's own — together they sprayed ~8% of a hot env113 over every marble pixel, which the zone mood then tinted. Measured on114 a red-cored marble: the wash lifted G/B from ~4 to ~47.115116## Generation117118- **Cross-frame world overlap (residual)**: occupancy prevents overlap119 in PLAN space; after a reorient, co-live chunks in different frames120 could in principle overlap in world space. Never observed (the121 survivability corpus + goldens are clean, twists claim a swept drum122 and the stream departs along the twist axis) — if a fuzz ever finds123 interpenetration, add a world-space AABB check across frames at124 generation time.125- **Slope cubic-spillover residual**: island terraces got the spillover126 low-base fix; PLAIN slope windows' neighbor cells still claim flat127 bands while the realized cubic dips slightly below its base near part128 boundaries — no observed failure (fuzz clean), but the claim is not129 airtight. Tighten commitSlope's neighbor bands if a fuzz ever finds130 it.131- **World memory (M25) residual**: scars/scuffs/furniture tip-overs132 shipped (contact-event driven, per-segment lifetime). Open: a browser133 soak to tune SCAR_SPEED (4.5) and mark sizes; island-top destructibles134 stay dormant (still off the channel — trackside furniture was the135 honest first target).136- **Bumper density tuning**: after watching feedback (pins currently137 only on wide island decks).138- **Braid residual (V2/V3/M23)**: lane mods, wanderers, open forks,139 TWO braids per segment and 3-SEGMENT CHAINS (stay-open middles riding140 whole segments, OPEN_BRAID_CAP 60) all shipped. Still deferred ON THE141 RECORD: vertical lane divergence (re-litigates the junction-dip law),142 braids over islands, chains past 3 segments (needs a per-chain143 segment budget beyond the cell cap). Super-bounce zone assessed and144 parked (fights shock's reason to exist).145- **Theme biomes (M18a residual)**: winter/spooky/tropical/autumn rows146 shipped on Holiday/Graveyard/Pirate/Survival kits. Open: biome-weight147 and scale-range tuning after watching real streams, and the SPACE148 biome — Space Kit's terrain_* family is a candidate ALTERNATIVE ISLAND149 MASS (real measuring round: grid fit, slope/corner coverage, origins)150 and deliberately deferred; meteors/craft arrive cheaper as void decor.151- **Fan vocabulary (M19a residual)**: gust walls (pulsed blockades,152 phase-locked banks + anti-phase pairs), vortex eddies and the loop153 wind backport shipped. Left open: gust strength/duty tuning after154 watching the pack time real banks, and downdrafts (RULED OUT over155 dips — that is where wishdir pilots park; revisit only with a156 different host).157158## Audio (PARKED — user rule)159160- IGNORE audio for now. The user HATED the procedural ambient sound.161 TODO when picked back up: source real samples from the game assets162 library (`/Users/dami/Documents/Game Dev Asset Packs/audio/` and163 `.../kennygames/Audio/` — Interface Sounds, Impact Sounds, Music164 Loops, RPG Audio). Shim CONTACT EVENTS exist now (ph_hits — the165 contact-cue blocker is gone), but audio stays parked by user rule.166167## Housekeeping168169- Scenario pins move whenever a planner clause changes the weighted170 draw — re-scan with a scratch script (current pins: grav-scan-25171 jump, helix-scan-6 propeller, grav-scan-9 diamond, wide-scan-7 wide,172 grav-scan-6 helix, wide-scan-17 icy, wide-scan-21 gravity,173 spurs grav-scan-3@0 + grav-scan-22@1, reorients grav-scan-20 (+90@0)174 + grav-scan-33 (180@0), jump grav-scan-2, propeller grav-scan-0,175 helix jump-scan-14@0, braids grav-scan-17/38 + marbles, gust bank176 wind-scan-9@4, tagged open braid grav-scan-17@1, 3-segment chain177 grav-scan-32@0-2 — M24 re-scan; climate + temperament biases moved178 the pins twice this round);179 regenerate endless goldens with `deno run --allow-read --allow-write180 tools/pin_endless.ts`. Canon note: golden placements hash wind181 pulse/swirl since M19a.182- Loop named scenarios (M19c): loop-scan-981 twin diamonds,183 loop-scan-20 stub garden, loop-scan-33 rotunda (track_test.ts).184 genVersion shifted once for the M19c batch (computed, not hand-bumped).185- `deno task check` is fully clean now — keep it that way; `deno task186 test` remains the gate.187188## September 30, 2026 continuation — UX and recorded track stalls189190Current request: update and improve the site's UX and address tracks that stall;191the user confirmed the previous agent's work had not been wrapped up. Preserved192all pre-existing uncommitted trail, physics-provenance and generation changes.193194- Replaced the title menu with an opaque illustrated game launch screen: clear195 Endless/Classic choices, racer presets/custom count, optional seed and a large196 start button. Native form controls, focus states, mobile/short-height scrolling197 and reduced-motion styling; the menu no longer loads game assets or a renderer.198- Added a visible playback dock: orbit/follow, hero/leader, pause/resume, full199 screen, share with feedback and controls help. Kept diagnostic stats behind200 Backquote and audio hidden. Both run modes share playback state and CUA reports201 it. New runs resume; keyboard shortcuts respect text editing and native Space202 activation. Loading failures now offer a visible route back to Settings.203- Replaced the pixel-frame toast/place chrome with the dock's quiet styling and204 kept overlays clear of the phone controls. Loop overview now frames the circuit205 rather than distant scenery and reframes when the viewport changes.206- Fixed discontinuous braid collision ribbons, which silently connected separate207 lanes with invisible walls. Packed independent strips without joining triangles208 to stay within the native mesh-handle budget.209- Reproduced the ramp/helix obstruction as segment 9 geometry overlapping segment210 11 after reorientation. Added native per-checkpoint static contact masks for211 each racer (own + adjacent checkpoints), preserving marble contacts and ghost212 behavior. Rebuilt the native module and added a build:physics task.213- Verification: 222 tests passed; type check, build and changed-file lint passed.214 Recorded ramp/helix and both braid lanes clear in native tests without recovery.215 Two browser soaks × 401 racers × 300 simulated seconds: rail-sample-008 had zero216 fall/stall recoveries; rail-sample-015 had two end-hole-rounded recoveries and217 zero braid-cluster recoveries. Neither hero died; no browser errors.218- Details and limitations: docs/stall-fixes-2026-09-30.md. Browser screenshots,219 interaction checks and soak telemetry are in ignored output/.220221Remaining physics target: the two drop-cup stalls in the stress run. The recorded222ramp/helix and icy-braid failures are resolved. World-space visual overlap and223broader camera occlusion are still separate follow-up concerns. A distribution224must include the rebuilt box3d.mjs/wasm, not just the browser JS bundle.225226Final UX verification: 32 browser interaction checks passed with no console or227page errors, covering laptop CTA visibility, phone/short-height layout, exact228Unicode/whitespace seeds, presets/custom counts, both modes, paused camera229switching, sharing, fullscreen, native Space activation, focused-button letter230shortcuts, Settings prefill and new-run playback reset. Inspected final menu,231loop, endless, phone and controls screenshots. Built-in browser preview queued232at http://localhost:8000/?menu=1; the local server remains running.233234## September 30 follow-up — persistent zoom and less menu copy235236- User preference: camera zoom must stay at the chosen distance. Removed the237 follow camera's idle zoom decay and teleport zoom reset. Drag angles still238 ease back toward the path; obstruction handling still restores the chosen239 distance when clear. Zoom survives streaming, retargeting and mode switches.240- Verification: 11 browser checks passed with no console/page errors, including241 idle zoom in/out, teleport, retarget, stream bounds, mode round trip, resize242 and zoom limits. Seven camera tests, full type check, build and lint passed.243- User UI preference: omit subtitles unless they explain context that is not244 already clear. Removed the title eyebrow/subtitle, top-right tagline, hero245 graphic caption, footer copy, mode descriptions and racer/seed helper copy.246 The menu top bar now contains only the logo, with the title in main content.247 Preserved the seed's optional label. Cleaned up unused subtitle CSS.248- Final menu browser check passed on desktop and phone: requested text absent,249 logo-only top bar, visible start button, no horizontal overflow, mode/racer250 selection and seed editing intact. Inspected both screenshots; no page errors.251252- Steering clarification: the former Automatic steering checkbox enabled the253 newer autopilot when checked and the older track-assist law when unchecked.254 Both automate steering. Replaced it with an explicit Steering choice:255 Modern autopilot / Legacy track assist, preserving defaults, stored settings256 and URL flags. Twelve menu browser checks passed for selection, mode gating,257 submitted URLs, stored preferences and phone fit; no page errors. Build,258 type check and lint passed; inspected desktop/phone option layouts.259260- Classic loop is a simulation/debug option, per user direction. Removed the261 primary run-mode cards; Endless is the normal launch flow. Classic loop is262 now a checkbox within Simulation options beside diagnostics and Piece gallery.263 Active Classic settings reveal that section on return and disable the264 endless-only controls; stored selections and shared URLs remain compatible.265 Sixteen browser checks passed, including actual Classic and Endless launches,266 field-size restoration, newer steering selection and phone layout. No browser267 errors. Build, type check and lint passed; inspected final menu screenshots.268269- Solo runs now omit the hero/leader button and Space help, and reject leader270 toggles. Decorative peers in legacy mode also omit the control. Real packs271 retain both button and shortcut; regeneration keeps visibility correct.272- Follow camera clearance now pairs entry/exit on the same mesh/instance, and273 wide views tolerate foreground scenery while still avoiding a lens endpoint274 inside geometry. Open shells no longer count as containing a distant lens.275 Wide views ease more slowly through turns. Teleport detection compares actual276 consecutive subject positions, so smoothing lag cannot trigger a false cut.277- Verification: 230 tests passed, including eight new real-geometry camera278 cases; full type check, build, format and changed-file lint passed. Fourteen279 camera/control browser checks passed, including solo/new-run/pack/legacy280 visibility and continuous fast motion at 30/60/120 fps. All eleven persistent281 zoom checks still pass. No browser errors. On e0b75o4y7s at maximum wheel zoom,282 an 80-second, 4800-frame comparison reduced moves over 2 units/frame from 21283 to zero, largest move from 22.95 to 1.36, and frames below half the intended284 boom from 630 to four. Inspected default and wide-view screenshots.285- Added a repeatable complete-site build for the existing Cloudflare Pages286 project: builds JS and native physics, then packages static files plus assets287 into ignored output/site. The complete build passed, including the native288 rebuild and packaging. The checkout has no Git remote; the user requested289 local commits and clarified that deployment should still proceed.290- Deployment follow-up: removed account_id from wrangler.jsonc because Pages291 rejects that configuration field. The existing authenticated Pages project292 supplies the deployment account.