Implementation plan

TRON

Current simulation scope, decisions, and acceptance criteria

Project documents

Light cycle arena asset preparation — September 23

  • [x] Isolate Daniel Preti’s arena architecture from the supplied OBJ; preserve source scale and retain original files.
  • [x] Add a runtime film-reference edge treatment: near-black walls with blue-gray outlines and deep purple symbols with violet borders. Inspect the Chrome preview; retain original model materials in the GLB.
  • [x] Remove the dense modeled floor and render a separate white-on-black procedural grid with the existing game grid spacing, antialiasing and fade. Use this in both the arena preview and the game.
  • [x] Reload the 447 KB, 8,349-triangle standalone GLB in Chrome and inspect rendered overview/interior captures. Geometry excludes the original floor tiles, bikes, trails and exterior scenery.

Hit-centered Recognizer explosions — September 24

  • [x] Use the projectile impact as the world-space blast center. Each detached section receives an outward impulse from that point in all three dimensions, without a shared directional bias or added upward kick.
  • [x] Preserve vehicle momentum, existing impulse magnitude tuning, Earth gravity, section timing and debris cleanup. Explosions without a recorded hit use the vehicle origin.

Film-style cycle explosions — September 24

  • [x] Replace the expanding crash ball with a white-blue needle burst, two staggered red semicircular arcs, tumbling bright chips and wheel rings, and fragment ground silhouettes.
  • [x] Use the supplied references/images/cycle explosion frames as the visual reference. Assuming consecutive captures at 24 fps, the main rays occupy nine frames (0.375 s); fragments fade out by one second. Effect animation uses 24 fps samples without changing gameplay simulation cadence.
  • [x] Pool six bursts, derive motion from crash age and stable IDs, orient arcs using the crashed cycle's heading, and retain the existing independent three-second trail hold/flash/lowering sequence.

Cycle trail and lighting follow-up — September 24

  • [x] Give opaque trails 18 cm thickness, a grounded curved recess around the rear wheel (with tire clearance, not an axle-height taper), brighter blue, periodic vertical bands and highlighted edges.
  • [x] Keep a destroyed cycle's barrier for three seconds, flash and settle over 0.24 seconds, then lower it to zero over 0.7 seconds. Release only that cycle's collision cells when the trail disappears.
  • [x] Keep sharp right-angle turns independent of the decorative floor grid. Remove the floating arena scoreboard; matches continue internally.
  • [x] Repair duplicate/quantized model surfaces, preserve authored smooth normals, and replace cracked hub caps with smooth geometry at measured source dimensions.
  • [x] Add a compact shadow tile per cycle for self-shadowing and reduce ambient wash on cycle materials. Dispose the atlas with the arena scene.

Arena visual refinements and uninterrupted inspection — September 24

  • [x] Make trail walls fully opaque with saturated amber/deep-blue bodies, a soft vertical gradient and a pale flare behind each bike. Match their height to the bike body (1.5 m). Interpolate and trim trail ends to the rear of each bike; brightness follows distance along the trail through corners.
  • [x] Darken the blue bike's painted body and trim while retaining white/silver components and original source materials in the GLB.
  • [x] Double arena grid-line width, reduce cell spacing by 10% to 4.32 m, and add a subtle navy floor tint. Cycle movement uses independent 4.8 m decision lanes so turns need not coincide with the 4.32 m floor grid.
  • [x] While free-camera inspection is active, protect Clu from bullets, stomps and debris damage and suppress end-screen transitions. Leaving inspection restores damage; restart clears inspection. This keeps running spectator matches from being interrupted by Clu's off-camera death.

Light-cycle competition and arena patrol — September 24

  • [x] Extract gold, blue and red bikes into standalone GLBs; use gold and blue for two teams of three inside the arena. Separate authored dimensions, simulation and rendering. Use 3.6 m bikes at 38.4 m/s on independent movement lanes.
  • [x] Use deterministic local steering with bounded free-space search, forward clearance, friendly-lane avoidance and opponent interception. All bikes share the arena map and visible trail occupancy; this race does not call JEV.
  • [x] Resolve each grid crossing simultaneously. Arena bounds, own trails, friendly trails and opposing trails eliminate bikes; head-on same-cell collisions eliminate both. Trails persist until the round resets. Last surviving team wins; after two minutes compare survivors, otherwise draw. Keep team scores, a three-second starting countdown and six-second result interval.
  • [x] Render imported bikes, team-colored trail walls and crash flashes. Cap trail geometry by maximum round travel. The race uses the fixed simulation timestep and resets with the game.
  • [x] Add one Recognizer circling above the arena wall with original flight dynamics. Sightings, radio contact and audible threats interrupt patrol; stale target knowledge returns it to the perimeter. The routing works in classic/local/JEV modes without querying JEV for routine patrol.
  • [x] In free-camera mode, Space runs/pauses the world while retaining camera control; camera keys do not drive or fire Clu. C/Home/Space provides a quick way to watch the arena.
  • [x] Enemy tanks clone Clu's colors and materials without the former enemy recoloring; materials remain independently owned.
  • Race obstacles and participants are confined to their own simulation: cycles do not fight Clu or become Recognizer targets yet. Source texture limitation is recorded in Models. Browser captures establish initial rendering; human play and Safari review remain pending.

Loading terminal — September 24

  • [x] Show a static LOADING... terminal before application initialization; keep the access terminal and start controls hidden until assets, physics, scene setup, and the first rendered frame are ready. Initial HTML supplies the loading text, with the shared terminal typography and ENCOM logo. Three fixed-position dots appear successively on a 1.8-second CSS opacity cycle; reduced-motion preferences show static dots. This is an activity indicator, not measured progress.

Arena placement and inspection camera — September 23

  • [x] Make the light-cycle floor grid five times denser (4.8 m cells), scale its line width down proportionally, and dim the lines. Preserve subpixel line coverage so distant grid lines do not expand into a glowing field.
  • [x] Place the arena east of the central labyrinth, grid-aligned with a narrow gap; avoid overlap with maze bounds for alternate layout seeds. Retain the imported scale, colored wall outlines, and white-on-black floor.
  • [x] Cut the arena footprint out of the main ground shader to remove overlapping floor surfaces. Add a continuous exterior enclosure behind the imported decorated inner walls, using the same near-black surface color and blue-gray edge outlines.
  • [x] C toggles a free inspection camera during play or pause. Freeze simulation and JEV planning while inspecting; restore the previous running/paused state on exit. WASD moves, Q/E descends/ascends, drag or arrow keys looks, Shift moves faster, Home frames the arena, C/Escape returns to Clu.
  • [x] Chrome browser regression verifies startup, arena loading, camera movement with frozen simulation, and restoring both running and paused states. Inspect the rendered arena/labyrinth overview. Production build passes.
  • Arena architecture is scenery to Clu and the main-world enemies; their wall collision and arena entrances are not yet implemented. The separate light-cycle race enforces its own arena bounds and solid trails. Safari visual review remains pending.

Current direction — open-ended simulation

Central labyrinth placement and population — September 23

  • [x] Fix its beam to the measured center of the blueprint’s circular courtyard (pixel 724, 514), instead of choosing a random central navigation cell.
  • [x] Scatter eight tanks and six Recognizers among interior annular sectors. Tank spawns must have a swept-clear route to the courtyard; other mazes retain their existing population.
  • [x] Separate clipped wall-shadow decals from their receivers by 0.02 m before float32 upload, retaining depth testing and stencil union. This prevents coplanar rounding artifacts without softening the shadow edges.

Central labyrinth — September 23

  • [x] Trace the supplied Big labyrinth image into 116 wall islands, preserving the circular courtyard and three enclosed openings. Share polygon extrusion/collision code with the original blueprint maze, including hole-aware roof triangulation.
  • [x] Add the labyrinth as a fifth, grid-aligned site at the center of the four existing mazes. Use 2.4 meters per image pixel and the existing 54-meter wall height. The default layout fits without moving the outer sites; placement can move overlapping sites outward if needed.
  • [x] Include a fifth beam, four transport pads and normal maze patrols. Keep authored/reference fixtures unchanged. Verify collision/roof agreement, separation across four layout seeds, courtyard route accessibility, game startup and rendered geometry.

Smarter stomps with original motion — September 23

  • [x] Preserve the earlier film-like movement: thrust 24.2 m/s², yaw cap 0.62 rad/s, yaw acceleration 0.8 rad/s², ordinary drag/braking, 1.3-second fold, and 85 m/s² powered stomp descent. Remove all close-attack performance overrides. Cruise/max speeds are unchanged.
  • [x] Improve decisions rather than physics: approach overhead before descending, retain a progressing attack lead, align for nearby walls, and allow a healthy pursuing lead to take a safe attack opportunity.
  • [x] Brake as soon as the predicted stopping path provides a valid stomp, rather than insisting on an exact waypoint or redundant final heading. Keep fresh personal sight, cooldown, drift prediction and swept wall clearance checks.
  • [x] Stomp drop/landing contact with debris cannot damage the attacker; normal flight and weapon hits remain vulnerable.
  • [x] Double horizontal cannon scatter: Clu ±1.2°, enemies ±2.4°. Level aim has zero vertical scatter; gunner shots remain exact. Deliberate vertical auto-aim to airborne targets is retained.
  • The user’s motion-fidelity correction supersedes both the universal four-second stomp deadline and the subsequent three-second full-rotation tuning. Regression cases check successful attacks from eight headings without exceeding original thrust/yaw limits, not an artificial deadline.

Pursuit attacks and JEV toggle — September 23

  • [x] Healthy lead Recognizers may commit a safe stomp while pursuing, without requiring JEV to select a separate strike maneuver. Pursuit endpoints use the wall-aligned landing pose; fresh sight, cooldown, support assignment, braking drift and full descent clearance remain mandatory.
  • [x] N toggles JEV/local tactical control during play or pause without restarting. The stats box displays ON/OFF. Disabling JEV disengages autoplay; U enables JEV when starting autoplay. Mode preference persists.
  • [x] Verify simulated JEV pursuit responses in a tight oblique corridor and a two-Recognizer encounter, plus Chrome keyboard/autoplay behavior. Full simulation suite: 260 passed. Live provider choices and actual play remain subject to review.

Progress-aware attack leadership — September 23

  • [x] Renew the lead recognizer’s twelve-second assignment after at least five meters of combined closing/descent progress. Do not rotate a progressing attacker out midway through its approach; retain blocked/dead/ineligible handoff and expiry for stalled attackers.
  • [x] Reproduce two aircraft approaching stationary Clu from opposite sides at 120 m: previously no stomp in 120 seconds; corrected local control completes the stomp in approximately 24.27 seconds with one consistent lead. Keep one active strike at a time.

Victory, surface impacts and attack support — September 23

  • [x] Add the explicitly requested win condition: complete every data beam, freeze the round, fade to the terminal and print docs/victory.txt continuously at 45 characters/second. This supersedes the earlier no-win-screen direction for this condition only; empty beam lists do not win.
  • [x] Drive victory printing from monotonic elapsed time rather than the capped simulation delta; reveal at most one character per frame as an immutable glyph element inside stable line nodes (no catch-up word bursts or DOM geometry/computed-style measurements) and skip hidden 3D rendering on the victory page.
  • [x] Use the victory typography size (min(1.5vw, 2.15vh), 1.12 line height) across opening, death, victory and credits text, without content-dependent sizing.
  • [x] Add temporary Shift+8 victory preview for end-screen review (also available while paused).
  • [x] Leave the victory page visible until Return; then play the existing credits text/music without the detachment message. Preserve death behavior and clean restart.
  • [x] Reuse the optical double-ring burst for projectile wall/floor contacts and visible vehicle armor. Orient effects to surface normals with an 8 cm offset, retain depth testing, cap active effects, freeze them on pause and dispose them on expiry/reset.
  • [x] Retain recognizer support assignments outside the old 140 m recruitment radius and when support units lose personal sight. Choose one lead attacker, one spotter and separated exit-cover positions using ground-connected map branches; use overhead slots where no branch is available. Cache formation goals until leadership/membership or recorded contact changes. Preserve radio limits, fresh target knowledge, wounded withdrawal and attack handoff.

Teleporter border placement — September 22

  • [x] Generate floor-shader pad borders from the active scenario’s maze sites, matching simulation placement. Remove the renderer’s use of the legacy authored-world pad constants. Include pad geometry in the shader cache key so different seeds/site counts cannot reuse stale positions.
  • [x] Check all 52 pads across two blueprint seeds, an authored seed and a single-site authored layout. Preserve floor-integrated borders, grid-line thickness and horizon fading.

Confined stomp positioning — September 23

  • [x] Search nearby landing positions in sixteen directions at two radii and include exact local wall-edge headings. Keep the whole aircraft clear and reserve positional tolerance inside the existing crush trigger; do not widen the damage radius.
  • [x] Settle strike approaches within 0.35 m and brake angular motion before committing to a descent. Preserve forward-only movement, collision checks, attack coordination, and fresh visual-contact requirements. This applies to Tactical/local and JEV maneuver execution; Classic behavior is unchanged.
  • [x] Verify oblique narrow-corridor and close-wall poses, a complete collision-free corridor stomp, and the full simulation suite.

Recognizer spotlight surface reach — September 23

  • [x] Extend downward search/target beams to the floor using their current projector height and direction, including the ribbon width. Preserve wall clipping and sensing limits. Do not fade the final segment when a ray ends on a surface.
  • [x] Check high-altitude ground/raised-surface endpoints and browser rendering, wall clipping, pause and state visibility.

Wall-shadow depth stability — September 23

  • [x] Increase the exact wall-overlay depth bias from slope/units −1/−1 to −2/−4. Independently rounded clipped vertices at distant maze coordinates could otherwise compete with the receiving wall and make patches flicker under tiny camera motion.
  • [x] Verify 81 perspective camera poses across 0/4/10 km offsets, wall orientations and centimeter camera movement. Keep depth testing and stencil union, and preserve exact geometric edges.

Carrier reveal panel and audio study — September 22

  • [x] Use Carrier derezed.mp4 at 2:37–2:38 to replace the carrier’s red rectangle with a softly feathered, translucent blue-white field and faint green rim. September 23 refinement: use a yellow pulsing rim, retain 0.5 base gray opacity at the center, and fade the gray fill to zero before it meets the rim. Add a 7 Hz pulse limited to 22% opacity variation, driven by simulation time so pause/reset remain stable.
  • [x] Extract 2:38.5–2:40 (the second half of the initial clip) as a stereo WAV and prepare a 120 ms crossfaded loop candidate. Record source hash, timing and filters in public/audio/carrier-derez-source.json; add both to the sound library for audition.
  • [ ] Audition the mixed-soundtrack excerpt/loop before choosing gameplay playback. No claim of isolated SFX or auditory approval; not yet loaded by the game.

Solar Sailer transit and carrier arrival — September 22

  • [x] Import the user-supplied JIHS Solar Sailer DAE locally as GLB with all seven textures. Preserve proportions at uniform 2.5× scale; use the film clip carrier and solar sailer.mp4 at 1:34–1:46 for direction, silver sails and amber beam.
  • [x] Add a fixed horizontal +X lane parallel to the carrier, at 520 m altitude and 600 m lateral offset. Traverse 12 km at 280 m/s every 180 seconds, starting three minutes into the round; fade at the distant ends. The beam fades in during the three seconds preceding each pass and fades out over nine seconds afterward, remaining invisible between passes. Pause/restart follow simulation time. This is background scenery without combat or collision participation.
  • [x] Replace the model’s short source beam with a 24 km amber beam split around the complete vehicle span; the sail end leads travel. Expose scale, altitude, speed and period in development tuning.
  • [x] Materialize the carrier at round start using the existing opening-line/rectangle, one wireframe sweep and solid fade, driven by the carrier’s 22 m/s translation (about 57 seconds for the hull to emerge, then the two-second solid fade). Reveal the +X front before the rear through a rectangle fixed in world space; its local position cancels the carrier’s translation. Sweep along the carrier’s long X axis, include existing hull seam lines in the reveal, and fade its shadow with the solids. Repeat on restart without recreating effects. Carrier wireframe ignores ground fog so it stays red at sky distances; its linear color is tuned to (1.5, 0, 0) for a softer red glow rather than the original overbright orange cast; running lights and beacons become active as they cross the reveal plane, independently of the final armor fade.

Local documentation styling — September 22

  • [x] Embed the colvmn stylesheet during npm run docs generation so Safari local-file viewing does not require a sibling-folder CSS load. Keep upstream colvmn unchanged; author Markdown/JSON and regenerate HTML with the project wrapper.

Wall rims and landing tactics — September 22

  • [x] Prevent moving aircraft shadows from exposing sawtooth strips on self-shielded maze wall rims. Use the slab face orientation and caster identity; give decorative trim explicit surface normals. Keep foreign-wall occlusion and exposed roof shadows.
  • [ ] Allow deliberate Recognizer landings as future tactical choices: block Clu’s path to give an ally a crush opportunity, or land to rest. Ground contact is not inherently a navigation failure; distinguish purposeful blocking/resting from getting stuck. No new landing maneuvers are implemented by this rendering fix.

Pursuit frame pacing — September 22

  • [x] Replace repeatedly sorted ground/air search frontiers with stable priority queues. Spread enemy ground route searches across ticks with a shared 192-node budget and 24-node round-robin slices; keep movement, sensing and collisions running every tick.
  • [x] Admit one new tactical candidate set per simulation tick across aircraft and tanks. Preserve existing maneuvers while waiting, defer expensive search-map construction to admitted planning work, and precompute search candidate rankings.
  • [x] Reject distant teleporter pads with a conservative radius check before building exact vehicle footprints. Verify exact overlap/containment behavior and lifecycle isolation.
  • [x] Record a reproducible eight-unit pursuit profile and validate bounded work, fair route completion, destination replacement and independent round budgets.

Maze tank pursuit — September 22

  • [x] Require a swept exit route when choosing blueprint ground patrol spawns; free floor inside an enclosed blueprint pocket is not a valid spawn. Cache checks per world and hull radius.
  • [x] Retain valid ground routes to stable destinations. When the ordinary pursuit search fails, try finer 8 m routing with a bounded larger search; permit wall-safe partial progress toward a recorded contact if the full destination remains unreachable.
  • [x] Verify patrol exit routes and actual radio-directed movement in Classic, local and JEV modes without revealing hidden Clu state. Preserve original observation age and physical wall collision.

Recognizer moving turns — September 22

  • [x] Remove heading-alignment stops from Classic, tactical/JEV and carrier escort flight. Preserve forward-only thrust, positional/angular inertia and level attitude while turning in flight.
  • [x] Limit approach speed by remaining distance and turn time to prevent orbiting nearby destinations. Carry speed through collinear tactical waypoints; retain braking for arrival, acquisition, deliberate holds and confined descent. Permit a settled attack from an already clear actual pose without waiting for redundant final yaw.
  • [x] Check right-angle/reversing turns, multi-location search, wall-side clearance, coordinated stomps and browser momentum/pause/reset behavior.

Aircraft shadow occlusion — September 22

  • [x] Gate Recognizer, carrier and detached-part shadows against the existing static maze light-depth atlas. Preserve shadows on exposed roofs while preventing additional dark silhouettes on obscured wall faces and covered ground.
  • [x] Apply the same visibility test to projected Recognizer/debris ground silhouettes and rebind it when reinforcement growth rebuilds the atlases. Verify pixel coverage, materialization and restart resource stability.

Gravity, aerial zoom and attack coordination — September 22

  • [x] Remove vertical damping from production debris; retain horizontal drag, angular damping and contact friction. Regression now measures actual production free-fall velocity/displacement for four seconds without disabling damping in the test.
  • [x] Restore scroll-wheel aerial zoom through CameraRig; verify both running and paused operation.
  • [x] Use one active-maze-width radio radius for enemy observations, neutralization, materialization awareness and tactical ally information. Preserve observation age/delivery delay and vertical-distance checks.
  • [x] Reserve one attack lead among nearby aircraft with compatible recorded target knowledge. Retain that lead for a bounded twelve-second approach; supporters use separated 90 m flank positions and cannot initiate a stomp. Reassign on destruction, blocked approach, lost visual contact, injury/cooldown or lease expiration. Coordination uses radio-visible allies, never unseen live Clu coordinates.

Carrier escorts and debris avoidance — September 22

  • [x] Preserve carrier escort duty in Classic, local and JEV modes when no current target/sound investigation interrupts it. Air escorts match a moving carrier slot above roof clearance; ground escorts retain separate perimeter detours, then use a bounded catch-up speed (1.4× ordinary tank speed) to regain formation. Combat movement retains its existing speed cap.
  • [x] Publish detached physical debris poses/velocities/bounds to the session. Player perception filters these by 160 m range and wall visibility; JEV receives up to 24 nearest observed pieces, never hidden wreckage.
  • [x] Autoplay checks visible falling/crossing/settled debris every tick against a 2.5-second predicted path, including turbo and braking. It can brake or steer using normal inputs and wall clearance, independent of API latency. Manual input overrides remain intact; damage remains real.
  • [x] Verify carrier rejoining after blueprint traversal, visibility isolation, turbo prediction, physics observation cleanup, and otherwise-lethal settled/falling debris encounters. Full suite: 232 passed; Chrome autoplay regression passed without provider calls. Prediction is approximate and cannot guarantee escape from unavoidable impacts.

Refactoring roadmap — September 22

Design review: Refactoring review and design. The ownership refactor is implemented locally. Keep this checklist as the plan source; the linked review now records the implementation, compatibility boundaries and remaining human checks. No deployment was performed.

  • [x] Review current world selection, simulation/control boundaries, application lifecycle, rendering/audio ownership, and JEV transport/accounting. Document composition-based OOP recommendations grounded in the code.
  • [x] 0 — Baseline: explicit blueprint/authored scenarios and seeds, failure captures and boundary contracts; preserve known unresolved third-maze navigation as a tracked defect.
  • [x] 1 — World: explicit scenario/world construction, including derived pads/beams/rosters, shared by browser and tests; support independently constructed worlds without browser globals.
  • [x] 2 — Navigation: extract route execution/cursor/arrival behavior from mission/JEV selection, preserve controller behavior and expose blocked/progress diagnostics.
  • [x] 3 — Lifecycle: compose application, session, loop, input and HUD owners; preserve fixed-step ordering and isolate debris physics from presentation ownership.
  • [x] 4 — JEV: separate typed transport, scheduling/application policy and shared protocol/cost contracts; preserve retry, quota, privacy and lifetime behavior.
  • [x] 5 — Presentation: extract camera coordination, then clarify effect/resource ownership with captures and lifecycle checks; retain current shader ordering.
  • [x] 6 — Audio/cleanup: isolate music and voice responsibilities, remove competing implementations and reconcile documentation; retain explicit default-world adapters for standalone fixtures.

Remaining acceptance work: Safari audio-unlock/listening and side-by-side visual review on the user’s hardware. Automated results are recorded in Validation; these checks do not establish artistic fidelity. The seeded replay captures three beams, then holds near 686 seconds; full multi-maze completion remains unresolved.

Debris gravity and faster panels — September 22

  • [x] Use shared Earth gravity (9.81 m/s²) for every detached vehicle part; remove the Recognizer-specific 14.7 m/s² override. Preserve inherited velocity, blast impulse, damping and collisions.
  • [x] Divide only panel formation and retraction durations by three: 0.5 s closing, 11 s enclosed hold, approximately 1.167 s opening. Total transfer is approximately 12.667 s. Camera movement rates, blast settings and animation ordering are unchanged.

Beam panels, timeout retries and request stats — September 22

  • [x] Replace transfer shafts with 16 translucent blue polygon panels, bright vertical edges and 0.2 m corner gaps. Preserve sequential closing/opening, height, timing and disabled blast. Match Recognizer contact damage to panel segments.
  • [x] Retry JEV timeouts twice (three consecutive attempts total), with 0.5/1 second minimum backoff and existing pacing. Continue local piloting during retries, reset the failure streak on a response, and disengage after exhaustion. Non-timeout errors/budgets still disengage immediately. Pause cancellation is not a timeout.
  • [x] Display this round’s total player/enemy request attempts, rolling 10-second requests/sec and USD cost in a bordered box beneath the top-left U / autoplay control. Count retries, preserve totals across pause/autoplay toggles, reset for a new run. Reported billable input usage replaces conservative request estimates; prefix cost with ~ while estimates remain. This round’s display is separate from the persistent hourly relay budget.

Pad horizon and carrier spotlights — September 22

  • [x] Bound pad-border shader anti-aliasing footprint and fade unresolved pads instead of letting grazing floor derivatives expand red borders across the horizon. Keep borders on the floor surface.
  • [x] Default CARRIER.searchlightsEnabled to false, clearing light tracking/illumination and stopping spotlight-derived radio reports. Recognizer spotlights remain independent.

Post-transfer damage bubble disabled — September 22

  • [x] Default DATA_BEAM.blastEnabled to false. Skip post-capture wave damage and hide its expanding sphere/ring. Keep capture, healing, color transition, camera sequence and transfer-shaft contact behavior. Retain the effect behind this flag for later re-enabling.

Corner arrival stall — September 22

  • [x] Reproduce a motionless stall at about 147 seconds after the first blueprint beam: waypoint distance about 0.5 m, next segment occluded, throttle and steer both zero.
  • [x] Distinguish intermediate corners from final destinations. Keep steering to 2 cm at intermediate points and creep at up to 2 m/s within 2 m, instead of applying final-stop/steering dead zones. Preserve final beam stopping behavior.
  • [x] Extend the actual-blueprint regression through departure and capture of a second beam, rejecting prolonged motionless/no-steering stalls between transfers.
  • [ ] A longer exploratory run encountered a separate hold/route-failure near the third maze around 689 seconds. Full multi-maze completion remains unverified.

Blueprint route correction — September 22

  • [x] Reproduce hold at the enemy-free browser-default blueprint spawn. Prior autoplay simulation fixtures used the historic authored layout and missed this failure.
  • [x] Search outward from the constrained beam destination using an 8 m grid and larger bounded search/detour allowance, then reverse the swept route for Clu. Keep coarse open-grid routing as fallback. Default enemy route-search settings remain unchanged.
  • [x] Add permanent blueprint coverage asserting a collision-clear route from the actual spawn and capture of its local beam. Browser autoplay coverage now begins at the blueprint opening before the separate empty-grid control fixture.

Post-combat autoplay — September 22

  • [x] Distinguish visible contacts from maneuver threats: enemies within 100 m, or within 250 m approaching Clu faster than 2 m/s. Include both visible contacts and threat IDs in player snapshots; no private enemy pursuit state is read.
  • [x] Replan immediately when threats appear/disappear, clear route-failure cooldowns on that transition, and reject delayed escape choices once threats are gone. Resume the beam mission after destroying pursuers.
  • [x] While red beams remain and no threat is present, a missing route permits maze-entry recovery or hold/retry, never unrestricted open-grid exploration. Verify five destroyed pursuers, nonapproaching distant contacts and temporary route failure.

Autoplay cornering and turbo — September 21

  • [x] Preserve waypoint progress when JEV confirms the current option. Consume visible route waypoints continuously and brake/turn in place for sharp headings; approach occluded corners closely enough to see the next segment instead of stopping at the waypoint acceptance radius.
  • [x] Prioritize uncollected beams within 2 km over previously selected distant destinations. Once local beams are blue, travel to the next maze remains intentional.
  • [x] Activate turbo through normal simulation input only when aligned, moving, and a clear route segment exceeds the full boosted run plus braking distance. Regulate boosted speed; avoid automatic activation during manual driving overrides. Expose turbo cooldown and duration in player snapshots.

Background autoplay — September 21

  • [x] Keep autoplay running on window blur or hidden-tab transitions. Clear held manual inputs on focus loss. Preserve explicit pause and pause unattended play when autoplay is disabled or JEV fails.
  • [x] Use one scheduled loop: animation frames while visible, a 250 ms timer while hidden. Retain fixed 60 Hz simulation steps with bounded one-second catch-up; skip hidden rendering. Cancel both scheduling paths on disposal. Browser/OS suspension can still reduce background progress.

Autoplay beam navigation — September 21

  • [x] Expose all beam colors with distance in meters and hull-relative bearing in radians (positive right), plus the active destination. Remove the 500 m objective cutoff.
  • [x] Retain a selected uncollected beam across replans; advance when it becomes blue. Without visible enemies, offer the mission route rather than unrelated short wandering moves. Preserve combat maneuver options and hold during transfer.
  • [x] Connect local swept maze routes with long open-grid legs around maze bounds; retain route waypoints across replans and recheck clearance. Retry failed objectives after a bounded delay. Verify two captures in different authored mazes during a 600-second enemy-free simulation. Full combat completion remains unverified.

Local JEV request pacing — September 21

  • [x] Pace local client calls at least 650 ms apart in wall time, including across restarts, to respect the relay’s 600 ms minimum. Distinguish busy, short-interval and hourly-cap warnings; include retry delays. These limits are independent of purchased provider credits. Replace the request-count allowance with a $1 USD rolling-hour local spend budget. Configure server-only JEV_HOURLY_BUDGET_USD in .env.local; restart Vite after changes. Persist reservations and settled usage in ignored .local/jev-spend.json. Public Worker quotas remain separate.

Beam camera and persistent autoplay — September 21

  • [x] Animate a presentation-only aerial rise and L-direction orbit during beam transfer, at half keyboard speed. Rise and descent each take 2.4 seconds; descent starts at 10.1 seconds and reaches Clu at 12.5 seconds as the ring opens. The beam continues its color transition during opening. Freeze with simulation pause, skip automatic motion for reduced-motion users, and allow V/P to cancel. Do not turn the weapon.
  • [x] Keep autoplay selected until U or its HUD toggle is used, or JEV becomes unavailable. Service errors/timeouts/rate limits disengage the pilot and clear its plan; no automatic re-enabling after recovery. Retain the warning while off. Held driving/aim controls override their own channels, and Space/mouse fire combines with automatic firing without interrupting navigation. Release returns held channels to the pilot; existing cruise/aim-lock modes retain their normal behavior.
  • [x] Verify camera timing/pause/return and persistent manual overrides in simulation and headless Chrome.

Beam objective, longer hold and teleport audio — September 21

  • [x] Make turning every red data beam blue explicit in the player Jev prompt and snapshot. Include remaining/total counts, red/transitioning/blue state, remaining transfer time and the stop-and-wait activation rules. Keep survival and the open-ended simulation; no win screen. Candidate routes remain bounded, so successful completion of all sites is not guaranteed.
  • [x] Extend the closed ring hold from 6 to 11 seconds without changing the 1.5-second closing or 3.5-second opening sweeps. Total transfer is now 16 seconds. Visual color progress, healing and release use the same total; only the hold duration is extended.
  • [x] Add original synthesized teleport audio: descending phase collapse and rising resonant reassembly, with a short digital snap and stereo echo. Trigger only on completed relocation. Nearby vehicles produce spatial cues at departure/arrival; Clu hears one continuous 0.78-second cue at arrival. Master mute/pause and reset cleanup apply. Source: src/audio/teleport.js.

Autoplay driving continuity — September 21

  • [x] Treat temporary route endpoints as handoffs: request a new feasible route before the braking zone, roll through straight intermediate waypoints, and skip already-passed waypoints after delayed decisions. Use a turn/distance speed target instead of an all-or-nothing angular throttle cutoff; retain braking at obstacles and data destinations.
  • [x] Steer the turret toward the active visible target or along the driving route when there is no contact. Retain a tracked target across replans unless another is substantially nearer, to reduce camera swings. Keep the ordinary turret motor limits and temporary manual overrides.
  • [x] Verify sustained cruising above 19 m/s after acceleration in a clear 20-second route, momentum through collinear waypoints, stopping at a data destination and reorienting a sideways turret. Browser/build validation is recorded in Validation.

Optional Clu autoplay — September 21

  • [x] Add an off-by-default U key and HUD button to let Jev choose Clu maneuvers. Keep the enemy AI mode independent. Movement/turret/fire input temporarily overrides the corresponding pilot controls; pause suspends requests and motion. Label Jev/local fallback on the button.
  • [x] Supply Clu's own pose, health, heading/speed, nearby visible enemies, static walls/data destinations, recent positions and bounded feasible maneuver routes. Use a distinct server-owned player prompt. No hidden enemy positions, memories or tactical plans enter its snapshot. Local motor code steers/brakes and only fires through the existing observed target/aim-cone checks.
  • [x] Share one serial Jev client, rate/cooldown budget and alternating player/enemy opportunities. Reject stale or pre-teleport replies; local tactics continue during failures. Check moving inputs, information isolation, selection, pause and temporary manual overrides. A live local-relay player request returned an accepted decision; encounter quality and long autonomous runs still need human review.

In-game service warnings — September 21

  • [x] Add a compact top-right warning area below the health/turbo meters, available in production as well as development. Show JEV OFF for deliberately selected Classic/local modes, JEV LIMIT for rate/budget failures, and JEV UNAVAILABLE for service/network failures. Explain the reason and continuing local AI. Keep warnings through pause, resets and retries until a successful response; normal idle/low-confidence decisions are not service failures. Allow other named warning/error notices to share this area, and announce changes politely to assistive technology.

Public Jev hosting — September 21

  • [x] Keep the game/assets on GitHub Pages and add a Cloudflare Worker for the fixed Jev decision contract, with a server-side secret and public build-time API URL. Preserve the local Vite relay.
  • [x] Enforce body size, timeout, per-IP pacing and durable global daily request/input-byte limits before calling Jev; bound concurrency and honor Retry-After with local AI fallback. Anonymous access is intentional; CORS is not authentication and shared IPs share limits. See Jev design and README for limits, disabling and deployment.
  • [x] Verify quota persistence/rollover, concurrency, invalid requests/answers, secret isolation and client cooldown with Node tests; dry-run the Worker and check its SQLite budget in the actual local Cloudflare runtime.
  • [x] Deploy the Worker and server-side secret; verify a real provider decision and the production build in headless Chrome at the public origin. Website publication uses its pinned TRON checkout and public API-base build setting.

Carrier shadow edge correction — September 21

  • [x] Increase the moving carrier's shadow tile from 1024 to 4096 pixels over its 1500 m light-space span (about 0.37 m per texel). Use a compact 6×6 Gaussian-weighted depth-comparison filter at texel centers, retaining receiver-plane correction; never interpolate packed depth values. This supersedes the first four-tap refinement and softens the remaining fine edge serrations. Reduce the carrier-specific depth bias for its long depth range. Keep maze/Recognizer tile sizes unchanged and preserve the floor grid and emissive materials.
  • [x] Compare shadow edges against independent ray/box intersections for stationary and translated casters, check the actual carrier on walls/floor, and inspect before/after captures. This remains a finite-resolution filtered dynamic shadow, not exact vector geometry; the larger tile increases GPU memory/render cost. See validation for browser results.

Optional tactical movement and Jev — September 21

See Jev enemy control for the implemented architecture, input/output examples, scheduling, validation, and current limits.

  • [x] Start the browser in Tactical + Jev with the full enemy population (small encounter disabled), and retain Classic/local tactical modes in Shift+T tuning, with an explicit Apply/restart button and persisted preference. Optional comparison roster: two Recognizers and one ground tank. Tactical modes suppress pursuit reinforcements; Classic restores the original roster/controller. Tactical run seed is 1982; page-local maze layout remains stable for comparisons.
  • [x] Replace the tactical stomp's circular clearance rejection with conservative oriented aircraft bounds, triangle-level wall checks, and bounded swept tests for translation, rotation and descent. Generate staged climb/turn/travel/align approaches and orientation-aware low-corridor routes. Follow them with the existing inertial forward-thrust/lift/yaw dynamics. Recheck movement and separation corrections against geometry; a blocked maneuver replans rather than driving through walls.
  • [x] Give airborne and ground units choices for withdrawal, regrouping, pressure, cover/ambush and attacks. Wounded units prefer retreat; ground units cease firing while withdrawing. Preserve committed movement, but invalidate stale routes and react to injury. Coordinated choices see nearby allies' intentions within radio range; no hidden live Clu state enters planning or requests.
  • [x] Use Jev only for units with a fresh recorded Clu position within one maze length (horizontal distance); distant or unaware units use local tactics. Never gate using hidden live Clu coordinates. Send structured self state, dated target memory, nearby allies, local static wall geometry and candidate pose sequences to Jev. Include precomputed travel distance, visibility relative to the last known target and supporting-unit counts. Jev chooses only a supplied candidate ID; local collision/controller code remains authoritative. Inspect recent requests, probabilities and real elapsed latency in the tuning panel.
  • [x] Connect the ignored server-side credential file or environment key through a local Vite dev/preview endpoint. Bound request size/rate/hourly total and timeout; label fallback explicitly. Abort/discard stale answers on pause/reset/mode changes and reject invalid IDs or low-confidence choices. Protect credential files from Vite static serving and Git.
  • [x] Check provider browser access: CORS preflights from local origins are rejected, so direct browser calls are not viable in the tested setup. Keep the same-machine relay; initial real end-to-end calls measured 317 ms and 292 ms. This was initially a local-only service; the public Cloudflare relay above now supports static production clients.
  • [x] Replan on sight loss/reacquisition, newly received or expired contact, an observed velocity change of at least 8 m/s, or target displacement of at least 45 m. These events bypass the normal commitment gate with a 0.65-second event cooldown. Preserve momentum and committed attack phases; reject Jev answers based on superseded observations/revisions. Healthy units actively follow the bounded last-known path, then inspect nearby branches instead of favoring passive ambush. Search hypotheses never become sightings or authorize blind attacks. Ground route refresh follows a new tactical plan.
  • [ ] Human comparison of encounter quality, retreat behavior and longer Jev sessions. The planner is bounded and conservative, not a globally optimal flight/attack planner. A geometry-valid maneuver is not a guaranteed successful strike on a moving target; some narrow spaces remain inaccessible. Choosing better actions than the local policy remains an experimental question.

September 21 hearing: aircraft and ground enemies receive bounded, expiring acoustic observations for engines, cannon fire, impacts and explosions. Use distance attenuation, wall muffling and deterministic bearing/range error; never copy a sound into confirmed sighting memory. Unknown sounds permit local investigation and nearby Jev requests with target: null; friendly sounds are context only. Hearing is independent of player audio volume and pauses with simulation. Range controls are available in development tuning. See Jev enemy control for the report format and limits.

September 21 connected-search follow-up: persist whether the last-known location has been checked, so moving into a branch cannot re-enable a return-to-origin maneuver. Build a bounded graph of tank-passable corridors from the predicted contact point (8 m steps, 160 m path budget, swept wall checks); use its reachable locations instead of nearby open cells across arbitrary walls. Retain completed checks for the search episode, advance both ground and air units on arrival, and share search progress plus each candidate's searchPath with Jev. Aircraft already above the roof search from above instead of descending at every checkpoint; feasible low search routes remain available to settled low aircraft. Regression checks cover an L-shaped route, disconnected pockets, continuous aircraft search and ground progression.

September 21 opening-pursuit correction: above-roof aircraft proceed toward the travel waypoint while turning/climbing, rather than returning to the route origin after inertial drift. Healthy units receive a pursuit/support maneuver and no longer prefer regrouping simply because allies are spread out. Reserve attack spacing only for a nearby strike or active stomp; retain local swept collision checks and knowledge-limited target prediction. A moving-opening regression requires all five pursuers to close distance and exceed Clu’s normal speed.

Design references: the Tetris example measures reachable action outcomes and avoids conflicting directional hints; the Doom example uses structured observations, selected maneuvers and local motor control. This implementation is independently written; no external game code or assets were copied. API shape follows the TypeSafe quick start.

September 21 grid alignment: maze-site origins now snap to the 24 m world grid, with seeded rotations restricted to 0°, 90°, 180° or 270°. The initial maze stays at the origin and unrotated. Rendering, collision, patrol locations, data beams and teleport pads derive from the same site transforms. Preserve the authored diagonal wall ends and blueprint shapes within each site.

Spatial teleport pads — September 21 (supersedes the timed transfer)

  • [x] Preserve four grid-aligned 48 m square borders outside each maze and their links to other sites. Extend each invisible portal volume from the floor to four maze-wall heights; aircraft above that volume do not transfer.
  • [x] Clip vehicle solids and their shadows inside the volume, drawing glowing edge wireframe only on those portions. Partial entry/exit is spatial, independent of time. Clu, ground tanks, folding aircraft, turrets, projected floor shadows and aircraft depth-atlas shadows share the same clipping planes. No sweeping rectangle or fade is used for teleportation; reinforcement materialization remains unchanged.
  • [x] On full conservative hull/turret/vertical containment, transfer instantly with the same local pad offset, altitude, heading, linear/angular motion, turbo and player controls. Continue driving normally while entering/leaving. Block an occupied destination without freezing the vehicle; process transfers atomically to avoid overlapping arrivals. Require complete 3D exit before rearming. Pulse the source/destination borders briefly; snap camera/interpolation history at transfer.
  • [x] Replan arriving enemies and synchronize nearby recorded awareness immediately, without inventing live Clu coordinates. Vehicles remain subject to ordinary movement, visibility and weapon/collision rules during the spatial effect.
  • [x] Verify partial/complete entry, turret and ceiling bounds, altitude exit, offset/momentum, occupied/simultaneous arrivals and awareness in simulation. Drive through in Chrome; inspect half-wireframe entry, full-wireframe arrival and solid exit, with paused simulation and no browser errors. Preserve separate reinforcement animation checks.

Wireframe rezzing and pursuit reinforcements — September 20

September 21 awareness correction: on completing reinforcement materialization or an enemy teleport arrival, synchronize with active airborne and ground allies within the existing 304.8 m three-dimensional radio radius. Copy the freshest recorded sighting and alert state, retain observation timestamps, and share confirmed target destruction. Exclude unconfirmed spotlight acquisitions. Fresh pursuit knowledge suppresses searching spotlights; arriving units still need their own visual observation to set canSee.

  • [x] Reveal a vehicle with one front-to-back wireframe sweep. The rectangle starts as a horizontal line and expands vertically for 0.6 seconds, then travels for 1.8 seconds from 6 m ahead of the nose to 6 m beyond the tail. After the wireframe sweep, fade the whole solid vehicle in over 0.35 seconds while the rectangle and temporary edge overlay fade out. Activate the vehicle immediately when that fade finishes (2.75 seconds total). This supersedes the earlier two-pass design at the user's request. Animation follows simulation time, including pause. The supplied Homeworld Hyperspace clip is a motion reference, not a shipped game asset.
  • [x] Use one shared continuous-pursuit clock for airborne Recognizers. Every twenty seconds in Classic mode, create exactly one reinforcement near one of the pursuers, regardless of pursuer count. Continue repeating while pursuit persists; reset the clock when no Recognizer is actively spotting/pursuing Clu or Clu is destroyed. Choose a clear nearby air position above the maze and copy only the summoning observer's recorded sighting.
  • [x] Hold the incoming vehicle stationary, silent and intangible during materialization. After completion it independently senses, navigates, reports and attacks. Give new aircraft IDs separate from ground tanks; extend visual, spotlight and audio pools and reuse them after reset.
  • [x] Hide shadows during the wireframe sweep, then fade ground shadows and dynamic atlas attenuation with the solid vehicle. Rebuild shadow receiver bindings without stacking shader hooks. Keep the dynamic aircraft atlas bounded to the twelve nearest visible aircraft; other aircraft retain projected floor shadows. There is no reinforcement-count cap; very long uninterrupted pursuits still increase simulation, geometry and audio work.

September 21 interval follow-up: the shared reinforcement period is now 20 seconds (previously 15). Tactical modes continue to suppress reinforcements. The browser now defaults to Tactical + Jev with the full enemy population; earlier experimental preferences are superseded once, and subsequent explicit selections persist.

  • [x] Fix phantom square/diamond shadows after reinforcement shadow-atlas rebuilds. Evict the receiver material's cached GPU program bindings when attaching replacement shadow uniforms, even when the generated shader key stays the same. Otherwise Three can retain uniforms pointing at a disposed atlas. This preserves the actual vehicle silhouettes on roofs and ground; the materialization rectangle remains excluded from casting.

Tuning lives in src/game/materialization.js and src/simulation/reinforcements.js. The reusable materialization presenter is first connected to incoming Recognizers; starting vehicles still appear normally. The user endorsed carrier launches, data-beam arrivals and reverse-sweep recalls as further uses; those remain future work.

September 20 moving-target interception: add the observed target velocity along the approach direction to the Recognizer's distance-based arrival speed. Previously, an aircraft approaching from behind settled into speed-matched pursuit short of a valid landing prediction. It now continues closing until folding/fall time and residual braking drift permit a committed stomp. Navigation still uses only its own sighting memory; the committed drop does not track subsequent evasive movement.

September 20 tuning: increase Recognizer cruise speed by 10%, from 27 to 29.7 m/s. The existing pursuit multiplier requests 34.155 m/s, compared with Clu's normal 22 m/s and turbo 55 m/s. Raise forward thrust authority from 22 to 24.2 m/s² so drag does not cap flight below the new pursuit speed. Turning, lift, drag and braking settings remain unchanged; carrier formation speed retains its carrier-relative setting. Verification: npm test passes all 132 checks; a 60-second fixed-step straight-flight calculation reaches 34.155 m/s. Browser driving feel has not been rechecked for this tuning change.

The user's latest direction supersedes the structured chase roadmap below. The purpose is the feeling of being in the 1982 maze: free exploration and independently simulated Recognizers, without an assigned objective or tuned encounter sequence. Goal and ../AGENTS.md record the active requirements.

Maze and shared geometry

  • [x] Replace the one-dimensional route with connected branches, loops, dead ends, open courts and four exterior openings.
  • [x] Correct the initial square layout into long oblique slabs with diagonal clipped tips. Use the supplied overview as a visual reference; distinguish reconstruction from unseen/inferred layout.
  • [x] Share convex prism geometry among rendering, hull collision, camera obstruction, projectile blocking and three-dimensional sight tests.
  • [x] Preserve a fixed seed/layout for repeatable comparison. Allow travel onto the surrounding grid and turning in place in narrow passages.

Autonomous Recognizers

  • [x] Spawn five persistent aircraft outside the maze, with independent patrol destinations, headings and motion.
  • [x] Limit vision by range, field of view and actual wall occlusion.
  • [x] Maintain timestamped local sightings and share immutable observations through delayed, range-limited radio messages. Relays retain the original timestamp/source.
  • [x] On losing sight, investigate a bounded projection of the last observed velocity, then search plausible nearby passages. Expire stale knowledge and resume wandering.
  • [x] Keep navigation separate from live-player perception so unseen Clu motion cannot steer an aircraft.
  • [x] Halve the old model scale to put upright legs at roughly the user's 30-foot estimate. Match physical hit volumes, roof clearance and aircraft spacing.

Presence and controls

  • [x] Remove mission progress, capture zones, waves, victory and defeat. Keep exploration running until paused or reset.
  • [x] Keep a level, independently controlled turret and vertical-only assistance for aligned, unobscured targets.
  • [x] Render and spatialize all five aircraft. Muffle their sound when walls obstruct the listener.
  • [x] Hide instruments by default; add optional H instruments, Tab survey and V aerial view. Keep pause, mute, reduced motion and lower quality.
  • [x] Import the user-supplied arabinowitz tank and Shriker1 Recognizer GLBs, preserving proportions, turret yaw, muzzle alignment and reduced aircraft scale. See Models.
  • [x] Add a fixed reference studio for side-by-side film comparisons; iterate on tank trim, gold shoulders, highlights, shadows, floor visibility and oblique maze views.
  • [x] Apply the renamed film references and new wall-detail study: thin seams, sparse panels and shallow angled ledges, with a fifth reference-studio view.
  • [x] Trace the supplied blueprint and use it as the default game maze, retaining the original at /?maze=authored. Preserve concave notches in roofs, collision and sight; provide a top-down overlay and editable outline coordinates.

Verification and fidelity review

  • [x] Unit checks cover connected branching topology, diagonal-tip openings, hull sweep/sliding, occlusion, sighting memory, radio delay/expiry, independent hidden-player counterfactuals, weapon behavior, resets and fixed-step consistency.
  • [x] Complete browser controls, multi-agent lifecycle, production preview and sustained traversal checks for this revision; record their actual outcomes in Validation.
  • [ ] User review of diagonal forms, scale, patrol presence and sound. Exact film topology and final visual approval remain unresolved.

Run npm run dev and visit http://127.0.0.1:5173. Supporting documents: Assets · References · Validation.

Superseded turn-speed experiment — September 23

Historical experiment, now superseded by restoring original motion above: maximum yaw rate is 120°/s (one revolution per three seconds at full speed), with 240°/s² acceleration/braking and the normal smooth heading response. All flight uses the same limit, including close attacks. Close-attack speed reduces when a turn needs a tighter radius, avoiding repeated orbits. A turn from rest includes acceleration and settling time, so a backwards-facing attacker can exceed the four-second stomp target. Eight-heading tests verify bounded yaw rate/acceleration and successful stomps; aligned attacks retain the four-second check.

Helicopter-style Recognizer translation — September 23

Recognizers can thrust sideways and backward independently of yaw, in local/JEV navigation, Classic navigation and carrier escort flight. The acceleration vector shares the original 24.2 m/s² budget across all directions (no diagonal bonus); drag, braking, speed caps and angular inertia remain unchanged. Tight-corridor planning includes lateral/reverse translations with swept hull clearance. A wall-aligned hull can slide into position without first turning broadside. Existing pursuit-to-stomp opportunity checks and support assignments remain active.

ENCOM terminal signature — September 23

  • [x] Add a local SVG ENCOM mark based on the supplied MCP terminal reference, with pale lavender glow at the lower right of the shared terminal overlay. Opening, detached/credits, victory and victory credits share the mark, and it fades with the opening transition. Typed text is unaffected.

Lead and intercept approaching Clu — September 23

  • [x] Choose a reachable crossing ahead of observed motion, accounting for approach, normal acceleration/braking, folding and fall time. Bounded prediction uses recorded position/velocity and stops at mapped obstructions.
  • [x] Hold the chosen crossing while sightings follow the predicted path, instead of continually moving it farther ahead. Changed velocity, lost sight, injury or an expired interception still permits replanning. JEV candidate facts include approach time and predicted impact time.
  • [x] Keep the lead's attack plan when only supporting positions change. Supporting units still refresh their own routes.
  • [x] Preserve a useful wall-aligned facing during overhead translation. Start folding while Clu approaches; commitment still requires fresh personal sight and a physically clear descent, and a committed drop cannot track an evasive maneuver.
  • All existing speeds, accelerations, fold/drop timing and health rules remain unchanged.

Stored shots and extended credits — September 24

  • [x] Add a three-segment stored-shot meter beneath health. Keep CLU’s normal cannon cooldown at 1.14 seconds. Restore one stored shot per ten seconds without firing, up to three; firing resets the next-shot timer but preserves banked shots.
  • [x] Follow the normal credits with credits_extended.txt, in bounded terminal pages, before the final END OF LINE. Preserve normal credits pacing; print the longer acknowledgments faster.
  • [x] Archive all four arena signature/date inscriptions in a separate GLB instead of loading their geometry with the arena.

Carrier and maze ground-shadow overlap — September 24

  • [x] Stop cutting moving ground shadows with the coarse maze visibility atlas where the floor already receives exact geometric maze shadows. This removes mismatched sawtooth boundaries at overlaps; ground layers multiply smoothly. Keep atlas occlusion for maze walls and vehicle receivers.

Optional outer mazes — September 24

  • [x] Default browser gameplay to the central labyrinth only. Restore all four smaller mazes with ?outerMazes=1; authored/reference scenarios keep their existing layouts.
  • [x] Filter disabled placements before constructing walls, collision data, open cells, patrols, beams, pads, geometry and shadow maps. Build the blueprint wall source lazily only when enabled; retain lightweight layout metadata for stable placement and opening coordinates.
  • [x] Preserve the central labyrinth’s position and retain the original outer placement/spacing algorithm. Reindex active sites consistently for navigation. With one maze, connect each of its four teleport pads to the opposite pad.

Tank-to-cycle progression and deferred scenery — September 24

  • [x] Completing the central labyrinth beam transfers the player to the middle gold cycle, with a three-second countdown. The arena race remains inactive beforehand. A/D or left/right queue 90-degree turns; forward motion is automatic. V offers an aerial view, Escape pauses.
  • [x] A destroyed player cycle waits for the team result. A gold-team win opens the victory terminal; losses/draws consume one of three match chances and reset the match after six seconds. Exhausting all three chances opens the existing loss terminal. Tank combat/JEV planning stop during the cycle stage.
  • [x] Defer the arena/cycle module and assets until tank play begins. Wait safely with a loading message if the beam finishes before they are ready. Load the solar sailer after 30 simulation seconds, before its first pass at 180 seconds. Dispose late arrivals if the app has closed.
  • [x] Move the initial tank position south of the central labyrinth, preserving the previous south-edge approach distance (about 1,338 m), with opening Recognizers translated by the same offset.

Cycle testing, turbo and audio — September 24

  • [x] Temporarily start new browser games in the cycle arena. CYCLE_TESTING.startInArena in src/game/light-cycles.js owns this switch; ?cycleStart=0 restores the maze-first game, ?cycleStart=1 explicitly selects the test start. Entry waits safely for deferred arena assets, skips the opening pursuit/camera fly-in, and starts a three-chance player match without marking the beam collected.
  • [x] Hold I for player-cycle turbo, including partial charge. Releasing I immediately preserves remaining charge and resumes recharging. Capacity is 10 seconds, refill 60 seconds, speed 2.5×; no automatic boost or full-charge prerequisite. Holding an empty tank stays at normal speed until released, avoiding repeated boost/recharge pulses. Each retry resets charge. T remains the tank-only turbo key.
  • [x] Per-cycle movement progress and chronological cell crossings keep boosted movement, trails, camera and collision checks aligned. Other cycles retain their normal speed. The top-right meter shows I / TURBO in the arena.
  • [x] Extract six short film-mix sound candidates (startup, launch, drive loop, turn, crash, trail deactivation) and connect them to spatial cycle playback. Reproduce with python3 scripts/extract-cycle-sfx.py; timestamps, source hash, filters and attribution are in public/audio/cycle-source.json. These are picture-selected extracts, not isolated stems; auditory review remains pending.
  • [x] Arena entry stops music and clears queued transitions. Tank gameplay music cannot requeue during the match; terminal credits music remains available. Cycle audio stops on pause, death, reset and disposal, and resumes engines without replaying launch events.

Cycle arena patrol and sample corrections — September 24

  • [x] Keep the live arena Recognizer on its perimeter flight route during cycle matches, including countdowns and retries. The cycle-stage simulation previously suspended this guard along with the tank encounter. Clear its obsolete tank attack/spotlight state, unfold gradually and retain normal patrol flight constraints; destroyed guards stay destroyed. Other tank enemies remain paused. Restore the guard's spatial flight sound during cycle play.
  • [x] Replace the driving-loop source with the user-selected 0:47–0:48 video interval (0.1-second seam crossfade, 0.9-second finished loop) and the turn cue with 0:51–0:52 (one second, short edge fades). Version the two URLs to bypass stale cached WAVs. Other sound selections remain as before.
  • [x] Extend the cycle explosion to 2.0 seconds (75.85–77.85), preserving its tail. Add a separate player cabin loop from 1:36–1:38 (1.9 seconds after seam crossfade), retaining 0:47–0:48 for other cycles.
  • [x] Preserve stereo source channels through paired HRTF emitters 0.6 m apart. Drive, launch and turn emitters follow their cycle; explosions/trail collapse stay at the crash position. Apply smoothly changing Doppler from source/listener radial velocity to other cycles, keeping the player's cabin pitch stable apart from turbo. Camera motion supplies listener velocity.

Loading diagnostics and cycle spectator flow — September 24

  • [x] Print plain-text [TRON loading] phase timings and complete copyable reports. tronLoadingReport() returns the current report in Safari's console, including browser, viewport, navigation-to-app delay, maze setup, enemy placement, physics wait, model fetch/decode/adaptation, rendering-world creation, first render submission, opening readiness and deferred arena/player entry. Parallel model durations are labeled non-additive; first render submission is not a GPU completion measurement.
  • [x] With the temporary cycle-testing start enabled, begin loading the arena and launch its countdown automatically, without Return. Normal ?cycleStart=0 maze play still uses the opening terminal. Browser audio gesture restrictions may still require a click/key before sound can play.
  • [x] On player-cycle destruction, enter a movable spectator camera while the team match continues: WASD, Q/E, drag/arrows, Shift, Home and Space pause. Restore the follow camera and clear spectator inputs at the next automatic round. Victory or exhausted chances exits spectator mode so end screens are not blocked.
  • Collision timing and trail-ending changes were withdrawn after the user's correction; behavior remains unchanged.

Cycle camera stability — September 24

  • [x] Translate the follow camera and its look target with the exact visible cycle pose; smooth only the relative orbit and height. Easing absolute camera positions independently of fixed-step cycle movement caused vertical screen bob, amplified by turbo. Preserve eased turns and aerial changes, and clear the tracking anchor on reset.
  • [x] Add smoothed J/L left/right and I/K up/down spectator camera controls. Post-death WASD/QE movement uses 36 m/s with eased acceleration/deceleration; ordinary free inspection retains its existing speed.
  • Safari's supplied loading report isolates 19.442 seconds in initial simulation/enemy placement out of 20.849 seconds to opening readiness. Model loading is comparatively small; startup placement optimization remains outstanding.

Startup search acceleration and cycle glances — September 24

  • [x] Accelerate ground-route obstruction tests by stopping at the first wall hit when only a clear/blocked answer is needed. Preserve nearest-hit queries for projectiles and other callers. Reject triangle bounds conservatively, including the extended corners of padded acute triangles; skip stale A* entries instead of expanding them repeatedly.
  • [x] Hold J/L in cycle follow view for a fast, smooth 120-degree left/right rear-quarter glance. Release to return forward; both held cancel. The camera turns in place without steering the bike. Post-death spectator J/L remains free-camera steering.
  • [x] Shorten full player-cycle turbo capacity to five seconds; retain 2.5× speed, partial-charge use on I and 60-second recharge.
  • Local WebKit initial placement fell from the earlier 1,820 ms to 529 ms; opening readiness from 3,202 to 2,246 ms. Reload measured 506 ms placement / 2,146 ms opening. These are local Playwright WebKit measurements, not a new run of the user's actual Safari (previously 19,442 ms placement). Actual Safari confirmation remains pending.

Cycle motion and level-horizon glance refinement — September 24

  • [x] Run cycle matches at a 1/120-second fixed timestep; retain 1/60 second in tank mode. Catch-up budgets cover the same elapsed duration and render alpha follows the active step size.
  • [x] Interpolate live cycle poses and trail endpoints between simulation steps, with the follow camera using the same presentation pose. Preserve right-angle paths through corners and leave collision state untouched. Destroyed cycles use their collision pose immediately.
  • [x] Make J/L glances faster (28/s response), rotating around world-up to keep the horizon level. Release returns smoothly to forward view. No camera banking.
  • [x] Keep tank combat suspended during cycle matches and avoid starting the solar-sailer background load there. Retain the arena Recognizer patrol.
  • Actual Safari 26.6.2 user confirmation: initial placement 2,995 ms (previously 19,442); opening ready 4,463 ms (previously 20,849); arena ready 5,048 ms (previously 21,398), same reported 1262×1424 viewport / DPR 2 at startup.

Cycle pedals and repeatable materialization launch — September 24

  • [x] W is cycle turbo; S is a half-speed pedal. Both approach their targets with 8/s exponential response (about 0.38 seconds to 95%), including return to cruise and boost depletion. S takes priority when both are held, without spending turbo. Preserve five-second turbo capacity, 2.5× maximum speed and partial charge use. Engine pitch follows actual speed; tank controls are unchanged.
  • [x] Temporarily disable cycle win/loss endings via CYCLE_TESTING.endingsEnabled=false. Player death permits free-camera spectating; Return starts a fresh match immediately. Completed team matches wait for Return, with no attempt limit. The original ending rules remain available through the session setting.
  • [x] Replace the three-second countdown with a 0.3-second hidden-to-wireframe-to-solid materialization using the carrier's translucent scan panel/yellow border treatment, then launch immediately. Each bike owns reveal materials/uniforms; reset repeats the effect and disposal releases depth resources.
  • [x] Extract the materialization beat at 26.7–27.4 seconds from the supplied TRON light cycles video. Play one team cue during the reveal, with its sound tail continuing into launch; avoid stacking six identical copies. This is a picture-selected film-mix extract, not an isolated stem, and listening review remains pending. Keep the camera steady.

Breakable cycle arena enclosure — September 24

  • [x] A cycle striking intact arena enclosure dies and leaves a jagged, full-depth opening. Subsequent cycles can pass through beside the fallen cycle's persistent trail; trail collisions retain their separate timing.
  • [x] Subtract the opening from actual inner-wall, symbol and exterior-shell mesh triangles at runtime, preserving material groups and regenerating outlines. Add exposed fracture surfaces through the wall thickness. The original GLB stays unchanged; each new match restores its original geometry.
  • [x] Share the opening profile and dimensions between collision and presentation. Keep intact wall portions solid, store trail occupancy beyond the arena grid, and retain collisions with maze geometry outside. Escape continues into the outer world for now; no transition or JEV control is added.
  • [x] Perform mesh surgery only for new breaches, not every frame. Restore/dispose replacement geometry and exposed surfaces on restart/disposal.

Motorcycle handling after arena escape — September 25

  • [x] Once a cycle fully clears the enclosure, stop extending its trail and switch to continuous road handling outside. Arena reentry restores racing behavior as of September 26. Retain the existing trail and its collision/death lifetime. Preserve exit speed and displayed position; remove queued arena turns.
  • [x] Outside: W throttle, S brake (priority over throttle), A/D or arrows steer. Releasing throttle coasts with rolling/aerodynamic drag. Acceleration tapers with speed; braking can stop the bike without reversing. Speed-dependent steering limits lateral acceleration and the bike leans into turns, easing upright afterward. The follow camera remains level.
  • [x] Share interpolated road poses with the model and camera; engine pitch/Doppler use actual speed and heading. Replace the turbo meter with a km/h speed display outside. Retain swept wall, maze, trail and live-cycle body checks. Road riding continues when the arena match reaches a result; Return after death restores the original arena match.
  • Tunables live in ROAD_CYCLE: 18 m/s² nominal drive acceleration, 26 m/s² brake deceleration, 14 m/s² lateral acceleration limit, with drag and steering/lean response. These are an initial superbike-inspired approximation, awaiting driving-feel review.

Breach interior finish — September 25

  • [x] Apply the same arena styling adapter to exposed fracture surfaces: near-black wall faces and blue-gray edge outlines, including edges along the passage through the wall. Dispose both edge and face materials on rebuild/reset.
  • Crack shapes currently use one fixed authored jagged profile translated to each impact, not random generation. Collision clearance and the mesh cut share that profile.
  • [x] End the arena grid at the inner wall boundary; use a continuous dark teal floor through the wall thickness, visible in breach passages. Keep the existing outer-world ground beyond the enclosure.
  • [x] I/K also operate cycle turbo/slow alongside W/S, with slow taking priority. Outside the arena they also mirror throttle/brake. Spectator I/K camera controls remain available.
  • [x] Hide the sweeping rectangle and its border for cycle materialization only. Preserve the fast wireframe/solid reveal and the carrier materialization plate.

Film-inspired arena crack — September 25

  • [x] Replace the short opening with a tall, kinked central split and five tapered splinter branches radiating from the impact, based on the supplied film close-up. Retain the driveable base, dark passage and colored edge outlines. The authored pattern remains deterministic.
  • [x] Cut branches through the wall and remove buried lining faces where they intersect. Reject disjoint/coplanar polygons before subdivision to avoid duplicate geometry at shared profile boundaries.
  • [x] Remove spurious coplanar outline seams after fracture cuts: split collinear outline fragments at shared endpoints and cancel paired overlaps, preserving true silhouette/crease edges. This runs when geometry changes, not per frame.
  • [x] Temporary escape-testing setup: CYCLE_TESTING.startWithBreach opens the far wall straight ahead of the player’s starting lane in each player match, including Return restarts. Set it to false to restore intact starts.

Cycle escape testing and progressive steering — September 25

  • [x] Temporarily disable the middle opposing cycle in player matches via CYCLE_TESTING.hideMiddleOpponent, including its occupied starting cell; retain stable cycle IDs and restore other cycles normally on restart.
  • [x] Reuse the cycle shadow atlas for both the procedural arena floor and outer-world ground, preserving materialization clipping and cycle self-shadows.
  • [x] Road steering builds continuously with held A/D input. Full input takes approximately 0.6 × (1 + speed / 35 m/s) seconds; release eases upright. Apply this normalized demand to the speed-dependent cornering limit, avoiding immediate saturation of lean at high speed.
  • [x] Retain W/I turbo outside the arena with the same charge/recharge timings; it doubles drive acceleration and raises the speed ceiling from 100 to 140 m/s. S/K braking overrides turbo. Keep the charge bar, with speed also shown in its label; release coasts and recharges.

Outside-arena cycle impact damage — September 25

  • [x] Replace unconditional road collision death with normal-impact-speed response. Direct impact at 18 m/s (64.8 km/h) or accumulated health depletion destroys the cycle. Below 2 m/s normal speed, bumps do no damage; intermediate damage increases quadratically. These are gameplay tunables, not a real-world safety model.
  • [x] Nonfatal contacts retain 80% of tangential speed and bounce with 0.15 normal restitution; very small residual motion stops. Keep the bike at its last safe position and deflect its heading before the next swept step. Arena racing collisions retain their previous lethal behavior.
  • [x] Show remaining cycle health outside the arena. Initialize full health on escape/new match.

Low-speed cycle steering — September 25

  • [x] Blend low-speed kinematic steering (yaw rate = speed × tan(steering angle) / wheelbase) into the existing progressive cornering controller between 3 and 12 m/s. Low-speed input reaches full steering in 0.18 s; faster riding retains speed-dependent hold buildup. No pivoting at rest.
  • [x] Derive lean from actual lateral acceleration: atan(speed × yaw rate / gravity). This allows small-radius slow turns with modest banking, rather than imposing a fixed lean per key press. A simplified steady-turn approximation; it does not simulate rider countersteering, tire deformation or balance.
  • Research: Georgia Tech / GDOT, curve analysis, pp. 38–40 relates speed, radius and equilibrium lean. MSF Motorcycle Operator Manual distinguishes slow tight-turn rider counterbalancing. Input-response/blend thresholds are game tuning choices, not values taken from these sources.

Escape simulation handoff — September 25

  • [x] On player escape, pause arena competitors and match progression, stop their engine loops, and continue the player’s road handling. Existing destruction effects finish and expired trails release their collision cells.
  • [x] Resume carrier sensors, Recognizers, ground tanks, reinforcements, projectiles and hearing against the current cycle position/speed. Outside enemy damage feeds cycle health and the cycle explosion/spectator flow; no tank controller or beam/teleport objectives run. Allow enemy JEV requests and deferred solar-sailer loading again.
  • [x] Return restart clears the handoff and pauses outside combat while the next arena match runs.

Road reverse, orbit glances and wall clearance — September 25

  • [x] S/K brakes forward travel to zero, then accelerates slowly in reverse up to 3 m/s; release stops reverse motion. W/I brakes reverse motion before driving forward. Small unpowered residual speeds settle to zero, with no stationary steering pivot.
  • [x] J/L glances orbit around the cycle, keeping it in frame and the horizon level. Outside the arena the glance/return response is 4/s versus 28/s inside.
  • [x] Road cycle maze collision sweeps the authored perimeter segments with the cycle radius instead of expanding triangulation half-planes, avoiding oversized acute-corner wedges. Contacts permit movement away from a slightly overlapping wall boundary.

Looking into road turns — September 25

  • [x] Outside the arena, bias camera position and look-ahead toward the intended bend as steering builds (up to 36 degrees), smoothing with a 4/s response. Ease back on release, fade anticipation at walking pace/rest, and retain a level horizon with the cycle visible. Deliberate J/L glances take priority; aerial view does not add turn anticipation.

Road driving control revision — September 25

  • [x] Outside only: W/S taps change held target speed by 5 m/s (18 km/h); key repeat does not add steps. X held brakes and clears the target to zero. A fresh X press at rest latches 3 m/s reverse. W/S leave reverse (W sets 5 m/s forward, S stops). I remains held turbo. Arena controls remain unchanged.
  • [x] Smoothly approach target speed rather than applying full turbo whenever accelerating. Normal acceleration 8 m/s², turbo multiplier 1.6, normal/turbo ceilings 55/80 m/s. Roll-off drag increased; turbo release returns gradually toward the selected speed. These supersede the earlier road acceleration/maximum settings.
  • [x] At road speed derive turning rate from developing lean, so the visible bike and path respond together. Preserve quick low-speed steering and progressive hold input.
  • [x] V now uses Clu’s aerial height, trailing offset, transition blend and wheel zoom for cycles, replacing the separate 40 m overhead view.

Patrol recovery after player destruction — September 25

  • [x] Confirmed player destruction clears committed tactical attack/search routes, attack assignments, threat holds and hearing investigations. Recognizers finish any required stomp recovery and resume their normal patrol or escort behavior. Preserve visual confirmation and delayed, range-limited destruction reports.
  • [x] Return from cycle spectating clears old destruction reports and allows enemies to detect the next player again.
  • Validation: node --test tests/tactical.test.js tests/cycle-player.test.js tests/simulation.test.js — 83/83 passed. Covers stale tactical choices, road-cycle destruction/radio propagation, continued patrol simulation during spectating, and restart awareness. Node simulation checks only; no new browser or visual review.

Direct road-cycle testing start — September 25

  • [x] Temporary automatic cycle entry starts stationary, facing away from the arena, 20 m beyond its far outer wall. Road handling is active immediately; arena competitors stay paused. Return after death repeats this position with full health and turbo.
  • [x] Gate this shortcut through CYCLE_TESTING.startOutsideArena; set it false to restore the arena testing start. ?cycleStart=0 still preserves normal maze-first entry.
  • Validation: inline Node assertions using GameSession checked outside road mode, zero initial speed, maze-wall clearance, forward acceleration and repeatable Return restart. Browser driving-feel review remains pending.

Cycle tire contact with the floor — September 25

  • [x] Replace the fixed 8 cm cycle elevation with the actual supporting floor height and the repaired model's measured bottom. The arena floor is at +2 cm; outside ground is at −6 cm. Select by rendered position within the arena floor footprint so returning through a breach also restores the correct height.
  • Validation: node /tmp/tron-cycle-grounding.mjs in headless Chrome on local macOS verified model bottoms at +0.02/−0.06/+0.02 m for inside/outside/inside positions, checked the running game's outside player height, and rendered an inspected low-angle capture at /tmp/tron-cycle-grounding.png. Lean dynamics are unchanged.

Return to arena racing — September 26

  • [x] Once the whole road cycle clears the inner wall, restore cardinal turns, normal arena speed, W/I turbo, S/K slow, lethal arena collision rules and trail emission. Clear road lean/steering/reverse state and queued turns. Join the nearest cardinal lane over the first short span without teleporting the bike; sweep that span before reserving its collision cells.
  • [x] Start a separate trail section at reentry; preserve older trails without drawing a wall across the outside drive. Resume paused arena competitors and suspend the outside combat handoff. Repeated exits/reentries remain supported; reentry after a completed round reopens racing with a fresh round timer.
  • Validation: node --test tests/cycle-road.test.js tests/cycle-player.test.js tests/light-cycles.test.js tests/cycle-camera.test.js — 46/46 passed. node tests/cycle-reentry.mjs — headless Chrome on local macOS, 1280×800, passed actual breach traversal, restored keyboard controls and trail-render checks with no page errors. Inspected test-results/cycle-reentry.png. Manual driving-feel review remains pending.

Steadier player-cycle drone — September 26

  • [x] Remove the repeated opening swell from the player cabin sample by narrowing the existing 1:36–1:38 source selection to 1:36.7–1:37.8. Apply a 0.2-second equal-power seam overlap and circular, stereo-linked 100 ms RMS leveling; the finished loop is 0.9 seconds. Match the previous integrated loudness (RMS approximately 0.118) and version its URL to refresh cached audio. Preserve speed-related pitch and the separate external-cycle loop.
  • [x] Keep extraction reproducible through python3 scripts/extract-cycle-sfx.py; record processing and source/use constraints in public/audio/cycle-source.json and the sound catalog.
  • Validation: node tests/cycle-audio.mjs passed in headless Chrome on local macOS. Decoded cabin-loop level spread is 0.507 dB across 100 ms windows; stereo loading, event counts, pause/resume and reset cleanup passed with no sample/page errors. This measures playback and level stability; listening approval remains pending.

Remove recorded pitch wobble — September 26

Rejected in listening review: the user found the synthesized tone terrible and irritating. The September 26 rollback below supersedes this experiment.

  • [x] The volume-only correction above did not satisfy listening review: the recording still changed pitch at constant speed. Replace the cabin recording loop with stationary harmonic resynthesis from its averaged stereo spectrum, implemented in scripts/cycle_drone.py. Use fixed 367.5 Hz harmonics and exact 120-sample waveform periods, retaining source spectral balance, stereo differences and RMS 0.118. This is a synthesized approximation of the film timbre, not an isolated original engine stem.
  • [x] Loop whole waveform periods with no crossfade, and update the asset cache version. Speed-related playback pitch remains; player Doppler remains disabled.
  • Validation: node tests/cycle-audio.mjs passed in headless Chrome on local macOS. Every decoded waveform period matches exactly; 120 playback updates at constant player speed keep pitch at 1× despite listener motion. Level spread is 0.018 dB; loading, event counts and pause/reset cleanup pass. Listening review of the revised timbre remains pending.

Restore film cycle sound — September 26

  • [x] Remove harmonic resynthesis and restore the preceding film-derived cabin loop, retaining its seam crossfade and volume smoothing. Refresh the audio URL cache version. Frequency steadiness remains unresolved; do not treat objective periodicity as proof of acceptable sound.

Road tire traces and cycle dynamics window — September 26

  • [x] Outside the arena, leave a faint 13 cm rear-tire trace that fades over eight seconds of simulation time. Sample the rendered contact path every 45 cm into a bounded 8,192-segment pool. Marks follow the supporting floor, stop during arena racing/death, do not bridge teleports, clear on restart, and never affect collision. Pause freezes their age; disposal releases geometry/material resources.
  • [x] In development builds, Tab while controlling a cycle opens the Cycle dynamics window; Escape or Close returns to play. Pause while editing, preserve an existing pause, retain normal Tab navigation within the window, and isolate all game keyboard/mouse controls while it is open. Tank Tab retains the survey map.
  • [x] Expose road speed/acceleration/braking/drag, steering buildup and release, wheelbase, low-speed blending, cornering and lean limits, reverse, and contact response with labeled units, sliders and numeric fields. Keep Earth gravity fixed. Validate positive denominators and related thresholds before changing settings. Speed hold compensates drag; drag adjustments are most apparent under turbo.
  • [x] Own road settings per GameSession, retain them over restarts, and save valid changes locally in this browser. Provide Reset defaults and Copy settings. Arena dynamics remain separate. Defaults moved to src/game/cycle-road.js, with the existing simulation-module export retained for compatibility.
  • Validation: npm test — 337/337 passed; npm run build passed (existing large-chunk advisory). node tests/cycle-tuning.mjs — headless Chrome on local macOS, 1440×1000, passed tire-trace rendering, dialog opening/closing, input isolation, pause restoration, settings changes, reload persistence and defaults reset. Inspected test-results/cycle-tuning.png and the close driving-camera test-results/cycle-tire-traces.png. Driver preference for trace intensity and tuned handling remains subject to play review.

Tire trace attachment and transparency — September 26

  • [x] Replace the guessed 1.05 m rear-wheel offset with the repaired model's measured rear contact (approximately 1.23 m behind the origin). Transform that contact with the displayed bike pose, after applying its yaw and lean. Keep a live final segment attached between the 45 cm history samples; this removes the changing gap at the tire.
  • [x] Reduce peak opacity from 24% to 6%. Add derivative-based edge coverage with an expanded transparent envelope to reduce subpixel shimmer, and strengthen floor depth bias with a 15 mm surface offset. The live segment ages while stopped instead of refreshing forever; its buffers dispose with the history.
  • Validation: node --test tests/cycle-tuning.test.js tests/cycle-camera.test.js — 11/11 passed, including live endpoint placement between samples and fade at rest. node tests/cycle-tuning.mjs passed in headless Chrome on local macOS at 1440×1000; inspected the updated close driving-camera capture test-results/cycle-tire-traces.png. User confirmation of flicker on their display remains pending.

Road-bike performance and shorter enemy radio — September 26

  • [x] Profile live road riding versus post-death spectating. Browser CPU samples identify enemy route planning and wall-intersection queries as the dominant live-bike work. The whole outside enemy world had inherited the arena's 120 Hz step; the bike's isolated motion/collision cost was very small.
  • [x] Keep arena simulation at 120 Hz; restore the outside world's normal 60 Hz cadence. Road movement and swept collision retain their bounded 120 Hz internal substeps and shared render interpolation. Reentry restores the arena cadence.
  • [x] Wall queries copy only endpoint coordinates, rather than whole unit/search-node objects. Compute the world-space query bounds once, and stop on the first wall hit for boolean ground-clearance and line-of-sight checks. Nearest-hit projectile queries retain their behavior.
  • [x] At the user's additional request, halve enemy-to-enemy communication range from one maze width to half a maze width, including vertical separation. Use the shared radio-range configuration for aircraft, tanks, tactical allies, carrier reports and arrival synchronization; retain report delays and observation timestamps.
  • Validation: npm test — 339/339 passed. node tests/cycle-performance.mjs profiles headless Chrome on local macOS at 1280×800 with layout seed 1982. Approximately five-second live-bike samples: simulation CPU 1,572 ms before → 177.5 ms after the combined changes; median step 2.6 → 0.4 ms, p95 4.5 → 0.7 ms. Post-death CPU 639 → 216 ms. Both baseline and updated runs maintained roughly 60 fps locally; this measures CPU headroom, not an established user-device framerate gain. Final measurements ran without the test suite competing for CPU. JSON and CPU profiles are in test-results/cycle-performance.json and test-results/cycle-{alive,dead}.cpuprofile. User-browser confirmation remains pending.

Stronger road brakes and arena pedal isolation — September 26

  • [x] Double default road braking from 18 to 36 m/s² and downward held-speed response from 2 to 4 /s. Keep acceleration response separate. Expose braking response in Tab tuning. Upgrade previously saved default braking without replacing custom handling settings.
  • [x] Route W/S/X directly through cycle controls. Inside the arena, S/X/K request the existing half-speed minimum and override turbo; road braking and reverse commands are empty. Update the control hint. Ordinary arena wall/trail collisions remain lethal.
  • Validation: npm test — 342/342 passed, including twice-strength braking at low/high speeds, saved-default migration, and S/X arena survival. node tests/cycle-reentry.mjs passed in headless Chrome on local macOS at 1280×800: breach reentry, cardinal turn, turbo, S/X slowing and survival, and trail rendering. npm run build passed (existing large-chunk advisory). The originally reported S/X destruction was not reproduced; its specific cause remains unconfirmed.

Closer aerial zoom — September 26

  • [x] Halve V-mode's minimum zoom scale from 0.25 to 0.125, bringing the closest camera position twice as close to the vehicle. The shared wheel control applies to both tank and cycle aerial views.
  • Validation: node --test tests/cycle-camera.test.js passed. In-browser framing at the new closest distance has not been reviewed.

Local sighting response — September 26

  • [x] Reduce shared enemy radio radius from half to one quarter of the active maze width (about 334 m in the default blueprint world). This halves the previous range and reduces its horizontal coverage area to one quarter.
  • [x] Broadcast only firsthand sightings. Receiving a radio report still starts pursuit, but does not forward that report to another neighborhood. A recipient that independently spots Clu may broadcast its own sighting. Preserve report delays, timestamps and destruction notifications.
  • Chase size remains emergent: multiple direct observers and tightly grouped units can still respond together. No fixed pursuer cap is imposed. User play review of encounter density remains pending.
  • Validation: npm test — 343/343 passed, including 3D radio boundaries and a three-unit chain that stops at the firsthand observer's neighbors while allowing a new direct sighting to recruit locally. Updated the tank-radio fixture to place its receiver within the reduced range. npm run build passed with the existing large-chunk advisory. No browser encounter-density playtest performed.

Gentler low-speed cycle steering — September 26

  • [x] Reduce the road bike's low-speed steering limit from 0.65 to 0.45 radians. At full steering below the blend threshold, this widens the nominal turn radius from approximately 2.8 m to 4.3 m (about 36% less yaw rate at the same speed). Preserve input buildup and the high-speed steering branch; blend smoothly between 3 and 12 m/s.
  • [x] Upgrade the previous saved steering default so existing browser tuning receives the change; retain other customized values. The limit remains adjustable in Tab's Cycle dynamics window.
  • Validation: node --test tests/cycle-road.test.js tests/cycle-tuning.test.js passed, including the revised low-speed radius and continuity at both blend boundaries. Driving feel awaits user play review.

Home game selection — September 27

  • [x] Show Space Paranoids and Light Cycles on the home terminal using FilmTerminal, with a > beside the selected choice. Arrow keys select and Return starts; native buttons support mouse, touch, focus and keyboard activation. Update the displayed controls for the selected game.
  • [x] Default to Space Paranoids and wait at the menu. Space Paranoids starts the normal Clu maze/pursuit. Light Cycles enters the arena as gold player 1, with two gold teammates, all three blue opponents, and no initial wall breach. Preserve this setup when restarting a match.
  • [x] Keep the explicit ?cycleStart=1 road-testing shortcut separate from menu entry. Update road browser fixtures to request it explicitly. Ending terminals hide the menu.
  • Validation: npm test — 344/344 passed. node tests/home-menu.mjs passed in headless Chrome on local macOS at 1280×800 with touch enabled: home waits, arrow selection, Return, mouse click, touch tap, normal maze start, six-bike intact arena and match restart. Inspected test-results/home-menu.png with the terminal font and selection marker. Touch verification uses browser emulation, not physical mobile hardware. npm run build passed with the existing large-chunk advisory.

Plain ENCOM home terminal — September 27

  • [x] Replace the home access request with ENCOM SYSTEM, USER ACCESS GRANTED, and SELECT PROGRAM. Remove controls, navigation help, objective copy and project-notes link from the home screen.
  • [x] Match both choices to the terminal text's font size, line height and letter spacing. Remove boxes, padding and extra row spacing; retain the > selection indicator and keyboard/click/tap behavior.
  • [x] Show the Clu access request only after selecting Space Paranoids. Keep it visible briefly even with reduced motion, then enter the game without a camera transition in that mode. Returning home restores the ENCOM greeting.
  • Validation: node tests/home-menu.mjs passed in headless Chrome on local macOS, including matching computed typography, no button outline/border, removed help, the post-selection access message, keyboard/mouse/emulated-touch activation and both game starts. Inspected the updated 1280×800 home capture. npm run build passed with the existing large-chunk advisory.

Uppercase terminal typography — September 27

  • [x] Apply uppercase text presentation to the shared terminal content, including home choices, loading/access messages, victory and credits. Keep source strings and typing cadence unchanged.
  • Validation: shared terminal selector reviewed; git diff --check passed.

Program selection cursor — September 27

  • [x] Replace the > marker with the terminal's blinking block cursor beside the selected program. Arrow-key selection moves it between entries. Hide the heading cursor on the home screen; retain access and ending cursors. Honor reduced-motion preference with a steady selection cursor.
  • Validation: node tests/home-menu.mjs passed in headless Chrome on local macOS (reduced-motion mode), covering arrow selection, keyboard/mouse/emulated-touch activation and both game starts. git diff --check passed.

Typed Clu access and shared game font — September 27

  • [x] Space Paranoids prints its access message one glyph at a time with variable 45–145 ms keystroke spacing, extra space pauses and a longer carriage return. Retain the previous screen's top margin and opaque background. Hold the complete message for two seconds, then enter the Clu game. Inputs do not skip this sequence; simulation, enemy decisions and gameplay audio remain stopped during it.
  • [x] Use FilmTerminal for all game HUD text and controls, including paused screens, while retaining existing text sizes. Keep Light Cycles' direct start and the victory printer's uniform cadence.
  • Validation: npm test passed 344/344 before adding the new printer-specific check; node --test tests/victory.test.js then passed 3/3, including human timing, line-break pause and reset. node tests/home-menu.mjs passed in headless Chrome on local macOS: equal terminal top position, partial then complete text, at least two-second hold, frozen simulation time and computed FilmTerminal HUD font, plus keyboard/mouse/emulated-touch entry and intact six-bike arena restart.
  • npm run build passed with the existing large-chunk advisory; git diff --check passed.

Explicit uppercase program titles — September 27

  • [x] Correct the mixed-case menu titles shown in Safari: store SPACE PARANOIDS and LIGHT CYCLES directly in the markup and explicitly apply uppercase styling to the buttons rather than relying on inherited terminal styling.
  • Validation: confirmed both uppercase strings in index.html; git diff --check passed.

Access cursor and controls visibility — September 27

  • [x] Hide the program menu with display:none during access typing, preventing its selected cursor's explicit visibility from leaking through. Retain the single text cursor beside the access message.
  • [x] Keep the HUD hidden until the typed access screen and two-second hold finish. Only running gameplay reveals the control hint. This also prevents explicitly visible HUD children from appearing over the terminal.
  • [x] Apply FilmTerminal and uppercase directly throughout game/pause controls and both tuning panels, including native form controls.
  • Controls validation: node tests/home-menu.mjs passed in headless Chrome on local macOS, including exactly one visible cursor during typing, hidden HUD/control elements until gameplay, and computed uppercase FilmTerminal control labels. npm run build and git diff --check passed.

Clu cannon elevation limit — September 27

  • [x] Cap manual and mouse elevation at 45 degrees above horizontal. Exclude assisted intercepts requiring more than 45 degrees, and clamp assisted-shot spread to the same ceiling. Targets within the allowed elevation retain normal lead assistance.
  • Elevation validation: npm test passed 346/346; targeted gunner/mouse checks and production build passed. Regression coverage verifies manual 45-degree saturation, no overhead assisted lock, and retained assistance below the limit.

Teleporter pads disabled — September 27

  • [x] Disable pad creation in live simulation and presentation through TELEPORTERS.enabled=false. There are no active transfer volumes or rendered floor borders. Keep layout generation, transfer behavior and rendering implementation for possible future use.
  • [x] Skip floor shader injection for an empty pad layout. Existing isolated teleport tests explicitly supply pads so the retained implementation remains covered.
  • Teleporter removal validation: npm test passed 348/348, including pad-free normal runs and no floor shader modification for an empty layout. Retained teleport behavior passes with explicit test pads.

Credits dismissal — September 27

  • [x] Any fresh key press, mouse click or touch-generated click on victory or post-death credits returns to program selection. Consume the dismissal event so Return or a click cannot also start a game. Reset credit printing, music, input, simulation and ending state through the same path used by the automatic credits exit.
  • Credits validation: headless Chrome menu checks passed for keyboard, click and emulated-touch dismissal, returning to the greeting without starting a game.

Restore tank-camera opening — September 27

  • [x] After typed access and its two-second hold, restore the original 1.1-second terminal dissolve and 5.5-second camera approach to the tank. Keep controls hidden until the approach completes. Reduced-motion mode retains the direct transition after the hold.

Big-maze music footprint — September 27

  • [x] Use each maze instance's own basis and floor dimensions when detecting exploration. The previous shared small-maze footprint excluded most of the larger central labyrinth. Preserve pursuit priority and the existing beam music progression.
  • Validation: node --test tests/music-selection.test.js passed 7/7, including all four big-maze edge entries with outer mazes enabled and disabled, plus rejection just outside its boundary.
  • Music browser validation: node tests/maze-music.mjs passed in headless Chrome at the large labyrinth edge, then through exploration, hidden approach, visible beam, entry, afterglow and pursuit playback transitions.

Readable, incremental extended credits — September 27

  • [x] Preserve the existing left margin and set the credit column's right margin to match, including the mobile breakpoint. Wrap long text within that column.
  • [x] Append immutable glyphs and retain completed line nodes instead of replacing the entire credit text every frame. Reuse the victory printer's incremental rendering and line isolation. Clear nodes only when changing entries.
  • [x] Display one authored credit at a time. Use credits_display.txt for 27 concise entries, all five lines or fewer (below the requested eight-line limit). Keep URLs and the full dependency inventory in the unchanged archival credits_extended.txt; omit them on screen. Retain a two-line Cloudflare credit.
  • Validation: node --test tests/victory.test.js passed 5/5, covering entry boundaries, URL filtering, a brief Cloudflare mention, and line/length limits. node tests/extended-credits.mjs passed in headless Chrome on local macOS: complete credits progression, immutable retained glyphs with no removed nodes while typing, desktop/mobile equal margins and no horizontal overflow. The longest entry rendered within eight lines. Early/late mean append work measured about 0.018/0.017 ms per frame; this does not measure total GPU painting or establish performance on the user's device. Inspected test-results/extended-credits-layout.png.
  • Final browser verification: node tests/home-menu.mjs passed with the restored terminal fade and changing camera coordinates before gameplay controls appear, plus keyboard/click/tap credits dismissal and pad-free game state. npm run build passed with the existing large-chunk advisory; git diff --check passed.
  • Final simulation verification: npm test passed 351/351 when rerun without concurrent browser/build work. The earlier concurrent run failed one ground-tank patrol-distance assertion; no unrelated simulation code was changed for that retry.

ENCOM loading copy — September 27

  • [x] Replace LOADING with ENCOM REMOTE ACCESS, DIALING HOST, and AWAITING CARRIER. This is a text-only change; retain the existing terminal presentation and loading behavior.
  • Validation: reviewed loading markup; git diff --check passed.

Cycle lineups at their walls — September 27

  • [x] Start gold and blue lineups at the nearest safe grid row to their respective arena walls, facing inward. Derive the row from the inner wall position, bike length and a named minimum clearance rather than a fixed interior position. Apply on initial entry and round restarts; preserve the explicit outside-road test spawn.
  • Validation: node --test tests/cycle-player.test.js tests/light-cycles.test.js tests/cycle-road.test.js passed, covering round resets, arena movement/collisions and road transitions. Updated the collision fixture to assert displacement relative to its starting row.

Faster Clu access typing — September 27

  • [x] Halve Clu access keystroke delays, including space and line-break pauses, while retaining their natural variation. Preserve the two-second completed-text hold and subsequent camera opening.
  • Validation: node --test tests/victory.test.js passed 5/5, including the revised typing delays and unchanged victory printing.

Confirm Clu entry and start music with the opening — September 27

  • [x] Replace the automatic two-second access-screen countdown with an indefinite wait after typing. A fresh key press, click or tap starts the original terminal dissolve/camera approach; input during typing is consumed. Keep simulation frozen while waiting and prevent the confirming input from firing the cannon.
  • [x] Start music directly in that confirming user gesture and enable audio during the camera approach, rather than waiting until the approach ends. Do not restart music when the camera arrives. Preload the opening track during access typing, restoring it after terminal/credits music, and avoid reassigning an already-loaded initial track URL.
  • Clu-entry validation: node tests/home-menu.mjs passed in headless Chrome, including waiting beyond the old countdown with frozen simulation, key/tap/click confirmation, music playback during the camera approach and no forced restart at camera arrival. Production build and whitespace checks passed.

Clu aerial keyboard zoom — September 27

  • [x] While Clu uses V-mode aerial view, hold I to zoom in and K to zoom out continuously. Share the wheel's 0.125–4 scale limits through named zoom configuration. Preserve other modes and cycle pedal controls. Switch the displayed I/K hint from aim to zoom in Clu aerial view.
  • Validation: node tests/home-menu.mjs passed in headless Chrome, including I zooming in, K zooming out, updated aerial hint, and unchanged zoom when holding I outside V mode. npm run build and git diff --check passed.

J + L turret recenter shortcut — September 27

  • [x] Pressing J while holding L, or L while holding J, invokes the same center, level and lock action as F in the Clu game. Register both held keys so their steering inputs cancel during centering. Preserve cycle glance and free-camera controls. Update the control hint.
  • Keep the chord latched until both keys are released, so staggered releases do not cancel centering; clearing input also clears the latch. Browser verification passed in both key orders. Targeted gunner/refactoring tests passed, including staggered release followed by normal manual aiming. Production build passed before the final input-clear refactor, followed by targeted tests and git diff --check.

Beam completion returns to Clu victory — September 27

  • [x] Completing the central labyrinth beam now wins the Clu game rather than entering Light Cycles. Normal layouts without a central labyrinth retain the all-beams win condition. Arena asset readiness cannot delay the victory.
  • [x] Restrict cycle entry to explicit requests from the Light Cycles menu/testing path; preserve its gold-team lineup and independent restarts. Update cycle fixtures to enter explicitly.
  • Validation: npm test passed 353/353, including exactly one victory event after central-beam completion, no arena handoff/wait, and continued explicit cycle entry.

Charged cannon reserve and Recognizer behavior — September 27

  • [x] Start Clu with all three stored shots available. Recharge each spent slot in five seconds (previously ten), with continuous HUD fill; firing still resets the next slot's timer and pause freezes recharge. Chrome node tests/cannon-reserve.mjs verifies full startup, real key consumption, progressive fill, paused fill, and all three natural recharges.
  • [x] Show Recognizer searchlights only during search/investigation without a confirmed visible enemy. Patrol, pursuit and visible contact suppress even existing projector phases immediately; observation confirmation and information-limited aiming remain intact.
  • [x] Limit sideways/backward desired flight speed to half forward speed using a hull-relative elliptical envelope. Preserve momentum, bounded acceleration, and normal turning toward travel; expose both speed ratios in development tuning. Intercept travel estimates account for directional speed. Wider crossings can escape slower lateral correction; near-head-on interception remains covered.
  • [x] Beam-to-victory follow-up: Chrome node tests/home-menu.mjs and production build passed for direct victory without entering the cycle match.
  • [x] Validation: npm test passes all 355 tests, including directional flight speed, near-head-on interception, searchlight suppression and reserve timing; npm run build passes (existing chunk-size warning). Recognizer flight feel still needs human play review.

Continuous chase-camera zoom — September 27

  • [x] Holding I/K zooms Clu's normal chase camera in/out continuously as well as the V aerial camera. Chase zoom scales distance and height around the tank anchor from 0.5× to 4×, retaining wall clipping and smoothing. Each camera retains its own zoom across mode switches; resetting the view restores chase zoom.
  • [x] Preserve first-person gunner I/K elevation and cycle driving inputs; suppress chase zoom while paused or using free camera. Update the HUD hint for chase mode.
  • [x] Validation: 27 camera/gunner tests pass; Chrome node tests/home-menu.mjs verifies held I/K in both chase and aerial views, independent zoom settings, and preserved gunner elevation. npm run build passes with the existing chunk-size warning.

Installable Space Paranoids PWA — September 27

  • [x] Add a relative manifest scoped to the deployed game path, standalone launch, dark startup colors, and project-authored T icons (192/512 PNG, maskable, 180-pixel Apple touch icon, editable SVG). Keep the existing desktop keyboard/mouse gameplay.
  • [x] Generate a content-versioned production service worker and complete local game asset list during build. Cache 88 files / 48.8 MiB, including models and music, for offline starts after installation completes. Support audio byte ranges, exclude remote APIs and documentation, and scope cache cleanup to this game. Development does not register a worker.
  • [x] Wait for old game windows to close before activating a new release; never force-refresh a running game.
  • [x] Validation: production build passes. node tests/pwa.mjs passes in headless Chrome with a temporary persistent profile: no installability errors, correct subdirectory scope and PNG dimensions, offline Clu and light-cycle launches, ranged cached audio, and a waiting update while gameplay continues. Physical home-screen installation on iOS/Android remains untested.

Faster victory terminal — September 27

  • [x] Triple victory typing from 45 to 135 characters per second. Allow several characters per rendered frame so the speed is attainable at 60 Hz, with bounded catch-up after frame stalls. Clu access typing and credits retain their separate timing.
  • [x] Validation: node --test tests/victory.test.js passes all five tests, including two seconds of 60 Hz typing and a simulated two-second frame stall.

Matched terminal speed and model attribution — September 27

  • [x] Supersede the 135-character/second victory setting: win text now shares the extended credits' 18 ms per character timing (about 56 characters/second).
  • [x] Label each imported model artist's displayed credit explicitly as 3D MODEL or 3D MODELS. Remove adaptation/behavior wording from these pages so the credit clearly identifies the supplied artwork. Preserve full provenance in the archival credits.
  • [x] Validation: all five tests/victory.test.js checks pass, including shared typing speed and the eight-line credit limit.

Top-centered terminal text — September 28

  • [x] Center the first line of the home, loading and Clu access text horizontally, with a shared top margin of 12vh bounded to 64–140px. Keep subsequent lines and the program menu left-aligned under the first line; fixed character-width offsets prevent the typing animation from moving the text block. Existing victory and credit layouts retain their margins.
  • [x] Validation: Chrome node tests/home-menu.mjs passes. Inspected the 1280×800 menu capture: the first line is centered and the remaining text stays left-aligned below it.

BIT program integration and terminal correction — September 28

  • [x] Restore TRON home/loading/access text to its previous left-offset position and top margin. The top-centered request was intended for the separate Bit application; retain that layout only in the integrated Bit program.
  • [x] Copy the Bit project into public/bit, preserving its MIT license, legacy renderer, models, animation and sounds. Add BIT as the third program, with keyboard, mouse and tap selection. Escape unloads Bit and returns to the home menu.
  • [x] Remove obsolete copied code variants, the standalone server/TLS files, key-entry UI, duplicate font/logo assets and separate service worker. Reuse the host assets and PWA cache. Extend the shared budgeted Jev protocol with bounded yes/no/unsure questions; retain server-side credentials and quotas. The public worker requires its corresponding update when deploying.
  • [x] Use the existing ENCOM logo for all PWA icon sizes, with dark square backing and mask-safe padding; generate directly from the shared SVG source.
  • [x] Validation: all 357 simulation tests pass; Chrome tests/bit.mjs verifies keyboard/mouse/tap selection, rendered Bit, mocked yes/no/unsure responses and repeated Escape returns. tests/home-menu.mjs passes with restored terminal positioning. Production build and Worker dry-run pass; tests/pwa.mjs validates installability, icons, offline Bit entry/Escape, offline tank/cycle starts, audio ranges and waiting updates. Speech was mocked; live microphone/provider responses were not exercised.

Bit activation and microphone permission — September 28

  • [x] Add a blinking block cursor to the activation prompt. Query microphone permission silently on entry: granted permission launches Bit immediately; prompt/denied/unsupported permission queries show activation text and wait for a gesture. Keep the prompt hidden while checking to avoid a flash for returning users.
  • [x] Activation requests microphone permission before constructing Bit; release the temporary permission-check stream before speech recognition starts. Denial keeps Bit unlaunched with a clear retry instruction. Escape remains available throughout.
  • [x] Validation: Chrome tests/bit.mjs passes with mocked granted/prompt/denied/unsupported permission cases, deferred permission resolution, cursor visibility, track release, activation and Escape. Production build passes. No live microphone or paid provider calls were used.

Center Bit's changing heading — September 28

  • [x] Measure the current Bit instruction text instead of centering a fixed 12-character label. Recenter after heading changes, font loading and window resizing; keep question/answer lines at the same left edge.
  • [x] Validation: Chrome tests/bit.mjs passes, including centering within one pixel at 1280px and 390px widths for activation, running and permission-denied headings, with aligned following lines.

Bit exit hint — September 28

  • [x] Display ESCAPE KEY TO EXIT using the same responsive font size, line height, spacing and glow as the top instructions. Fade both together over 0.5 seconds when the first accepted spoken question hides the instructions.
  • [x] Validation: Chrome tests/bit.mjs passes, checking exact hint wording, equal computed font sizes and both elements fading to zero after simulated speech.

Bit hint and answer timing — September 28

  • [x] Hide the Escape hint until Bit launches, then fade it with the top instructions on the first accepted spoken question.
  • [x] Hold YES, NO, unsure and unavailable response text for two seconds, then fade over 0.5 seconds. Cancel the previous fade when a new question starts so an old timer cannot hide THINKING or a newer response; clear the timer on exit.
  • [x] Validation: production build and Chrome tests/bit.mjs pass. The browser check verifies hidden-before-start/visible-after-start hint behavior, each answer still opaque after 1.6 seconds and subsequently fading to zero, and the hint/instruction fade on simulated speech.

Light Cycles arena opening — September 28

  • [x] Cover the canvas with a black loading terminal while the arena loads, preventing the Clu tank scene from appearing when Light Cycles is selected.
  • [x] Add a 4.5-second smooth camera descent from 600 meters above and 680 meters behind the arena to the player's cycle view. Hold the race for the first 65% of the move, then begin the countdown/race as the camera approaches the cycle inside the arena. Suppress driving/view inputs and HUD during the move; Escape pauses and resumes the camera.
  • [x] Reduced-motion preference skips the descent. Explicit road-test entry keeps its existing immediate camera behavior.
  • [x] Validation: 28 cycle camera/player tests pass; Chrome tests/cycle-opening.mjs verifies loading coverage, hidden tank mesh, descending camera, held race time, pause/resume, race handoff and reduced-motion bypass. Inspected the arena approach capture. Production build passes.

Film-reference cycle entrance and sound — September 28

  • [x] Replace the earlier overhead zoom with a shallow approach, a bank over the rear arena rim, and a low grid arrival based on the supplied Enter Cycle Arena.m4v. Travel takes 13 seconds; the complete entrance lasts 20 seconds to accommodate the dialogue/transport/startup cues and a smooth handoff. Wall crossing stays above the 50 m rim; the race releases at 92% of the entrance.
  • [x] Extract “Prepare to transport to light cycle grid” and “We have transport” from the 5.1 center channel, plus stereo transport and cycle startup effects. Named cue times, local preloading, master mute, pause/resume offsets, reset/disposal, and suppression of duplicate materialization/launch cues keep playback tied to the entrance. Reduced-motion mode skips the cinematic and its timed audio.
  • [x] Validation: 30 camera/player/audio lifecycle unit checks pass, including wall clearance, exact camera handoff, and mid-cue pause/resume. Chrome entrance checks and rendered approach/bank/grid captures pass. Dialogue boundaries were located using local transcription; effects were selected against the film frames, not isolated production stems. Subjective sound balance remains for user audition.

Cycle entrance reference correction — September 28

  • [x] Re-read the supplied film clip frame by frame and replace forward flight with a backward, maze-facing descent over the west wall. Keep camera viewing direction independent of travel: reveal the broad ledge, drop past the decorated inner wall with a restrained bank, then turn across the grid and ease into the player's view. The existing arena placement already presents this wall to the labyrinth; no world rotation is required. Preserve the 20-second entrance, audio cues, pause/resume and reduced-motion bypass.
  • [x] Give the arena's horizontal crest surfaces the reference's muted blue-violet (#343548) while preserving the dark vertical faces and symbols. Apply in the presentation material so existing breach cuts and restores retain the treatment.
  • Validation: on local macOS, 33 camera/player/audio/breach unit checks pass. Headless Chrome node tests/cycle-opening.mjs passes for loading coverage, descent, frozen race, pause/resume including mid-dialogue, audio loading, race handoff and reduced-motion bypass. Inspected rim, bank and grid captures against extracted film frames. The reconstruction preserves the existing authored maze and arena geometry; subjective motion and sound review remains with the user.
  • Production build passes with the existing chunk-size advisory; git diff --check passes.

Recreate only the first sixteen seconds — September 28

  • [x] Supersede the previous entrance with a timed 00:00–00:16 camera study: retreat from the maze, descend along the wall while panning right and pitching down to 65 degrees, then accelerate across the floor and lift the view at the far staging area. Separate timed position, yaw and pitch tracks; remove aircraft roll and the invented blend toward the player during the film shot. Preserve the blue-violet wall crest.
  • [x] Hold the race throughout the sixteen-second shot. At its end, cut back to the existing gameplay camera; later film shots and player/cycle formation are outside this pass. Existing audio cues remain tied to elapsed time; the later startup cue lies outside this shorter shot.
  • Validation: 30 camera/player/audio unit checks pass, including wall clearance, steep downward pitch, rightward pan, accelerated traverse and the sixteen-second duration. Browser and rendered review results follow below.
  • Headless Chrome node tests/cycle-opening.mjs passes on local macOS, including pause/resume, held countdown, audio loading and reduced-motion bypass. Inspected 3/7/10.5/14-second captures; the 10.5-second view is dominated by the downward-facing grid and the arrival faces the opposite wall. Production build passes with the existing chunk-size advisory; whitespace checks pass. Film-motion fidelity still needs the user's review.

Cycle launch timing and continuous entrance — September 28

  • [x] Fix accelerated race startup: the fixed-step loop accumulated the entire cinematic hold and replayed it after release. Discard accumulated time when simulation is held, including holds triggered within a step. Preserve the normal 38.4 m/s cycle speed and turbo tuning.
  • [x] Remove the centered arena-loading wording; retain a plain black cover until assets are ready. Hide cycle control hints throughout the cinematic.
  • [x] Keep the sixteen-second reference study, rightward/downward pan and fast floor traverse, but spread forward travel through the turn instead of slowing almost to a stop before accelerating. Regression checks require continuous motion through the turn as well as faster travel across the grid.
  • Validation: 41 camera/player/audio/loop checks pass, including a sixteen-second hold followed by one second of real-time simulation and a hold triggered inside a simulation step. Browser and production results follow below.
  • Headless Chrome node tests/cycle-opening.mjs passes on local macOS, including normal simulation time versus wall-clock time after launch, hidden entrance hints, loading text removal, pause/resume and reduced-motion bypass. Inspected updated turn and downward-grid captures. Production build passes with the existing chunk-size advisory; git diff --check passes. Subjective motion matching remains for user review.

Wall clearance, overhead patrol and Recognizer face tints — September 28

  • [x] Correct the entrance's assumed wall height from 50 to the imported model's actual 60 meters. Raise the crossing, retain clearance over the wall's full thickness, and descend only after entering the arena. Check the swept camera path against the source GLB triangles.
  • [x] Move the arena patrol's initial position to the west ledge beneath the cinematic crossing, facing along the perimeter. Preserve autonomous patrol after the cinematic hold; the camera passes above its crown with clearance.
  • [x] Add a per-Recognizer tintColor override and createRecognizer(template, {tintColor}) presentation parameter. Default and arena-patrol colors have separate development-panel color pickers with black, green, blue and red presets. Arena patrol uses muted green; other units retain the original dark default. Only solid face materials change; trim and damage flashes remain independent, as do cloned vehicle materials. Tuning reset/export includes the colors.
  • Validation: headless Chrome on local macOS checked 960 swept camera segments against the actual arena GLB with no intersections, all four tint colors, unchanged trim and independent clone colors. Inspected the green patrol crossing capture. Final tests/build results follow below.
  • Final validation: 39 camera/player/patrol/audio tests pass, including full patrol traversal and camera-over-crown clearance. Chrome tests/cycle-opening.mjs also passes tint picker/preset/reset checks, verifies independent default and arena colors, and retains normal launch timing, pause/resume and reduced-motion coverage. Production build and whitespace checks pass (existing chunk-size advisory).

Compact ENCOM E app icon — September 28

  • [x] Replace the full ENCOM wordmark on the PWA icon with its E and wrapping curved outline. Adapt the existing SVG lettering and border into a square mark, preserving pale lavender strokes, dark backing and maskable padding. Keep the terminal's full wordmark intact.
  • [x] Store the editable mark in public/images/encom-app.svg; regenerate public/icons/icon.svg and the 180/192/512 PNG sizes with node scripts/generate-app-icons.mjs. Inspected the rendered 512-pixel icon in Chrome on local macOS.
  • Icon validation: production build and whitespace checks pass; verified PNG dimensions at 180, 192 and 512 pixels.

Match Light Cycles and Clu HUD typography — September 28

  • [x] Share one typography rule for Clu's control hints and Light Cycles' control/status text: 9 px, 1.8 line height and 0.6 px letter spacing. Replace Light Cycles' larger 11 px text. Both modes already share the same turbo indicator and FilmTerminal font.
  • Validation: reviewed the shared CSS rule; production build and whitespace results follow below.
  • Production build passes with the existing chunk-size advisory; git diff --check passes.

Terminal-sized resume prompt — September 28

  • [x] Replace the two-part STAND BY / ANY KEY TO RESUME pause text with only ANY KEY TO RESUME. Share the terminal's responsive font-size variable, typeface, line height and letter spacing. Keep the existing top-centered placement and resume behavior.
  • Validation: reviewed the markup and shared responsive CSS; production build and whitespace checks pass (existing chunk-size advisory).

Simplify initialization copy — September 28

  • [x] Remove AWAITING CARRIER from the initial loading terminal and attach the existing animated three dots directly to DIALING HOST. Preserve ENCOM REMOTE ACCESS and the cursor.
  • Validation: reviewed loading markup; production build and whitespace checks pass (existing chunk-size advisory).

Moving arena entrance patrol — September 28

  • [x] Advance the arena patrol at the fixed simulation timestep throughout the sixteen-second entrance while keeping cycle countdown, racers and tank combat held. Pause freezes the camera and patrol together; race release remains free of simulation catch-up.
  • [x] Start the green Recognizer already traveling south along the west ledge, toward screen-left in the maze-facing shot. Offset its initial position by three seconds of cruise travel so the camera still crosses above it. Continue the normal perimeter patrol afterward.
  • Validation: 40 camera/player/patrol tests pass, including moving-patrol crown clearance, patrol direction during the entrance, unchanged racer state and unchanged other enemies. Browser/build results follow below.
  • Moving-patrol browser validation: Chrome entrance checks pass, including leftward patrol movement while racers remain held and normal timing after release. Production build passed before the subsequent flight/HUD changes.

Forward cruise and slow Recognizer maneuvering — September 28

  • [x] Cap desired sideways and backward travel at a named 3 m/s maneuver speed. Preserve forward cruise, bounded acceleration and momentum through turns; do not snap existing velocity to the new limit. Expose the maneuver-speed cap in development tuning.
  • [x] At open-flight altitude, tactical navigation faces its travel direction. Retain wall-aligned hull orientation for low-speed corridor positioning. A wider lateral crossing can now escape; preserve head-on interception without restoring high-speed strafing.
  • Validation: 133 camera/player/patrol/tactical/simulation/interception tests pass. Updated previous half-cruise strafe expectations to the requested slow-maneuver behavior, retaining acceleration, obstacle clearance, head-on interception and continuous turn checks.

Solid carrier for Light Cycles — September 28

  • [x] Show the carrier fully materialized for explicit cycle entry and cycle play, including the arena entrance. Preserve Clu's carrier materialization.
  • Validation: Chrome entrance test confirms full solid opacity and hidden materialization panel during the opening; normal entry, moving patrol, pause/resume and race release still pass.

Terminal-sized gameplay text — September 28

  • [x] Supersede the previous 9 px hint-only match: all HUD text in Clu and Light Cycles now shares the terminal's responsive font-size variable. Include health/turbo/shot labels, hints, status/warnings, sight text, map text, pause prompt and development panels. Widen meter labels for the larger type.
  • Browser layout and production verification results follow below.
  • Final verification: headless Chrome tests/home-menu.mjs passes and confirms computed HUD/control font sizes match the terminal in both modes. Inspected desktop label/control captures; production build and whitespace checks pass with the existing chunk-size advisory. The earlier Chrome entrance run also verifies the solid carrier and moving patrol. Human flight-feel review remains pending.

Detectable PWA icon revisions — September 28

  • [x] Generate content-versioned icon filenames and update manifest, favicon and Apple touch icon URLs whenever artwork changes. Preserve the app's manifest identity, launch URL and scope. Keep stable icon copies for existing references. This fixes replacing icon bytes without changing the manifest's icon entries, which Chrome 144+ treats as unchanged.
  • Deployment and installed-device status remain unconfirmed: local updates alone cannot update an installation from the public site. Chrome may offer Review app update for identity changes. Reference: https://developer.chrome.com/blog/improvements-to-web-app-updates .

Automatic Clu entry after access typing — September 28

  • [x] Remove the confirmation wait after REQUEST ACCESS TO CLU PROGRAM finishes typing. Automatically start the existing dissolve/camera approach and music; reduced-motion mode enters directly. Keep the initial menu selection gesture and consume input during typing.
  • Update menu, offline PWA and cannon-reserve browser checks for automatic entry. Verification results follow below.

Exterior-to-aerial Clu zoom — September 28

  • [x] Make normal-view I/K zoom continuously from the existing exterior tank camera up to the same high aerial framing available in V mode. The closest setting is exactly the normal exterior distance and height; remove the previous closer-than-normal endpoint. Blend the look target down toward the tank as the camera rises instead of scaling a shallow chase angle. Preserve V as an aerial shortcut, gunner elevation, and cycle pedal controls.
  • Verification results follow below.
  • Automatic-entry and icon validation: Chrome home-menu checks pass, including no confirmation gesture and uninterrupted opening music. Production PWA checks pass with content-versioned icon URLs, correct dimensions, offline automatic Clu entry and waiting updates. Installed-device icon acceptance is unverified; installation URL/platform was requested but not supplied.
  • Zoom follow-up: V-mode zoom also reaches the normal exterior endpoint. Share the effective aerial blend with fog and floor presentation so zoomed-out terrain remains visible. Camera endpoint and gunner/cycle controls are covered by unit tests.

Assisted Recognizer targeting marker — September 28

  • [x] Display a red downward V above the crown of the Recognizer selected by Clu's upward assisted cannon solution. Use the same narrow-cone, obstruction and lead constraints as firing. Project the marker into screen space; hide it off-screen, behind walls, during manual gunner view, cycle play, pause/opening or after target loss/destruction.
  • [x] Use a small SVG graphic with no input handlers or GPU allocations. Reuse one projection vector; keep simulation targeting unchanged.
  • Verification results follow below.
  • Validation: 34 camera/gunner/marker tests pass, including visible assisted acquisition and rejection of blocked targets. Chrome tests/assist-marker.mjs passes acquisition, lost alignment, manual gunner and destroyed-target cases; inspected the red V capture. Reserved extra HUD space beside the wider meters. Production build and whitespace checks pass (existing chunk-size advisory).

One-second completed Clu access hold — September 28

  • [x] Hold the fully typed Clu access terminal for one second before its existing dissolve/camera approach. Continue automatically; no extra input is required, and input cannot shorten the hold. Apply the hold before reduced-motion entry too; reset its timer on a new session or return to program selection.
  • Installed-icon diagnosis: the local Chrome app is ~/Applications/Chrome Apps.localized/Space Paranoids.app, launching http://localhost:5173/. Its app.icns already contains the new E artwork; the Dock's ENCOM TERMINAL entry points to this same bundle. Restarted Dock to refresh its displayed icon. Use localhost when opening this installed app's origin; 127.0.0.1 is a separate origin.
  • Verification results follow below.

Subtler targeting chevron — September 28

  • [x] Compress the targeting V from 18 to 12 CSS pixels tall while retaining its 30-pixel width. Set overall marker opacity to 0.5, including glow; let the SVG stretch vertically so its width stays unchanged.
  • Validation: reviewed SVG sizing and CSS opacity; production build and whitespace checks pass. Chrome home-menu checks also pass with the one-second completed-access hold and automatic transition.

Smaller marker with acquisition flashes — September 28

  • [x] Halve the targeting V to 15 × 6 CSS pixels, retaining 0.5 steady opacity. A newly acquired Recognizer lock flashes three times at a 400 ms period, then holds steady. Losing the lock cancels the animation; acquiring a different target or reacquiring after loss starts a fresh sequence. Ordinary updates to the same lock do not restart it.
  • Use the browser animation timeline with named timing values; no timers or recurring callbacks are added.
  • Validation: Chrome tests/assist-marker.mjs passes exact 15 × 6 sizing, three on/off flashes, steady 0.5 opacity without retriggering, fresh flashes after reacquisition, and disappearance on manual gunner/destruction. Production build and whitespace checks pass with the existing chunk-size advisory.

Automatic Bit microphone request — September 28

  • [x] Selecting Bit now requests microphone access on entry without an extra activation key/click. Show REQUESTING MICROPHONE ACCESS while the browser prompt is pending; launch after approval and stop the temporary permission-check stream. Already-granted permission still launches directly.
  • [x] On denial, remain unlaunched and offer an explicit retry after microphone permission is enabled. Preserve Escape during pending permission and avoid launching after leaving. The browser's own permission prompt remains authoritative.
  • Update integration tests and README to describe automatic activation. Browser requests and speech remain mocked during verification.
  • Validation: Chrome tests/bit.mjs passes automatic entry, microphone approval/denial, temporary stream release, heading alignment, answers and Escape return. Production build and whitespace checks pass with the existing chunk-size advisory. No real microphone recording or paid provider requests were used.

Arena opening carrier and faster target flashes — September 28

  • [x] Stage the carrier beyond the maze on the right of the 16-second cycle entrance, using the supplied original-film still. Preserve model scale, expose the open bow on the right, and move along its heading. Keep this cinematic placement scoped to the opening; ordinary world transit resumes at the gameplay cut. Extend the cycle camera far plane to retain the distant ship.
  • [x] Double the targeting V blink rate: three 200 ms flashes (600 ms total), then steady at 0.5 opacity. Size and reacquisition behavior stay unchanged.
  • Validation: Chrome tests/assist-marker.mjs passes the exact 200 ms period, three flashes and steady state. Chrome tests/cycle-opening.mjs passes entrance, wall clearance, moving patrol, pause and gameplay handoff; inspected opening and carrier-angle captures. Full film-motion fidelity remains subject to visual review.

Gold-team formation and active Clu approach — September 28

  • [x] After the 16-second cycle camera move, hold its exact endpoint for a 2.75-second materialization of the three gold cycles, then cut immediately to the player's cycle view. Keep racers frozen throughout; skip the second countdown reveal. Use the actual gold starting row on the north side with 14.4-meter spacing, facing into the arena, and team-colored reveal lines. Reduced-motion entry keeps its existing shortcut.
  • [x] Use I/K to zoom in/out consistently inside and outside the arena, from normal cycle follow framing to the aerial range. Reserve T for turbo in both modes; retain W turbo and S/X slow in the arena, and W/S speed control plus X brake/reverse outside. Update control help and meter labels. This supersedes the earlier I/K speed aliases.
  • [x] Enable keyboard driving, turret and firing controls during Clu's camera approach, plus mouse firing. Start the approach at normal maximum forward speed with the same persistent cruise flag as Shift+W. Camera-mode selections can leave the approach immediately; terminal typing and its one-second hold still complete automatically before controls activate.
  • Validation: 33 camera/player simulation checks pass. Chrome entrance checks pass the stationary three-cycle formation, paused race, immediate handoff and I/K zoom. Further browser and build results follow.
  • Final validation: all 365 npm test checks pass. Chrome tests/home-menu.mjs verifies maximum-speed cruise, steering, turret movement and firing during Clu's approach; tests/cycle-player.mjs verifies the north-side start, turning, turbo and restart. Target marker and entrance browser checks pass. Production build and whitespace checks pass (existing chunk-size advisory). Chrome headless on macOS; rendered carrier-angle, entrance and formation captures inspected. Human driving/sound and exact film fidelity still require review.
  • Commit review: newly staged imported Bit sources/assets retain upstream whitespace, which git diff --cached --check flags. The earlier whitespace check covered tracked edits; these vendor-format warnings do not affect the passing build/browser checks.

Close angled cycle formation — September 28

  • [x] Ease the final two seconds of the arena approach into a low, close view from the formation's right: 8 m right, 5 m forward, 1.6 m high, with a 38-degree vertical field of view. Hold that framing during materialization, then retain the immediate player-camera cut.
  • [x] Tighten the actual gold starting row to 4.8 m spacing so all three cycles compose a close group. Accelerate materialization by 50% (1.5× playback rate), reducing its duration from 2.75 to 1.833 seconds.
  • Validation: 34 camera/player tests pass; Chrome entrance check passes swept wall clearance, stationary three-cycle formation, paused race, camera handoff and zoom controls. Inspected the angled formation capture. Production build and whitespace checks pass; the existing chunk-size advisory remains. Chrome headless on macOS.

Progressive arena speed changes — September 28

  • [x] Slow the arena's speed response from 8/s to 2/s: turbo acceleration, S/X deceleration, and return to cruise now complete 95% of the requested speed change in about 1.5 seconds. Preserve top speeds, half-speed slowing, boost charge timings, and bounded collision substeps. Road riding already uses acceleration/braking limits.
  • Update movement checks to measure fractional cell progress during the gentler acceleration, and verify that both turbo and S remain partway through their speed changes after short key holds. Correct the road tuning help to show T for turbo.
  • Validation: 43 player, arena-race and road-dynamics tests pass. Chrome tests/cycle-player.mjs confirms gradual turbo/S response with real key events, plus charge, release, pause and restart. Its turning fixture clears the neighboring teammate's trail to isolate controls from the tighter formation's collision. Production build and whitespace checks pass (existing chunk-size advisory). Chrome headless on macOS; final driving feel remains for hands-on review.

Clu camera clearance and continuous zoom return — September 28

  • [x] Apply camera collision constraints after approach/zoom/gunner positioning, including transitions that previously overwrote or bypassed the follow-camera wall check. Sweep between rendered positions against padded wall prisms, including roofs; slide along a safe axis when a direct move crosses a wall. Keep aerial ascent possible over intervening walls.
  • [x] Replace minimum-fraction camera clipping with a 5 cm contact margin and 1.2 m follow-camera clearance (20 cm in gunner mode). A long camera boom must not force the camera beyond a nearby wall. Free/reference cameras remain explicit inspection views.
  • [x] Keep encounter pitch tracking active throughout I/K zoom and blend overhead Recognizer framing continuously near the follow-camera end. Reaching minimum zoom no longer restores stale follow pitch or abruptly enables encounter framing.
  • Added deterministic wall-corner, roof, approach, aerial, gunner and minimum-zoom regression tests. Chrome home-menu checks pass active Clu entry and zoom controls; final wall/browser validation follows.

Two target flashes and less precise auto aim — September 28

  • [x] Flash the target V twice at the existing 200 ms period, then hold at 0.5 opacity until lock is lost.
  • [x] Increase locked auto-aim shot scatter to ±2.4 degrees horizontally and ±1.2 degrees vertically around the predicted intercept. Preserve seeded shot variation, existing lead/acquisition, level-shot behavior and exact manual gunner aim. Tests check the wider bounds and reproducibility.
  • Final validation: all 372 npm test checks pass. The long-range firing test now requires both hits and misses across deterministic assisted shots instead of assuming one shot always hits. Chrome tests/assist-marker.mjs verifies two flashes; tests/camera-walls.mjs records 389 clear rendered frames through actual maze-wall zoom/turn/gunner transitions. Production build and whitespace checks pass, with the existing chunk-size advisory. Chrome headless on macOS; final camera and shot feel still require human review.

Recover camera following after wall contact — September 28

  • [x] Fix the wall-avoidance dead end: axis-only moves toward the desired camera could leave it pinned while Clu kept driving. Detect stalled progress and enter a swept recovery path above the wall, then track the moving tank and return to normal follow as soon as the tank is visible. Recovery moves at a bounded 100 m/s and resets with the camera.
  • Add a moving-tank regression: start the camera stranded across a wall, drive Clu continuously at 22 m/s, and require clear camera sweeps, bounded separation and return to normal follow height. Extend the real-maze Chrome check to drive while zooming back in and verify the camera keeps up.
  • Validation: 40 camera/gunner tests pass, including recovery while Clu keeps driving. Chrome real-maze check passes 483 rendered frames of clear sweeps, driving during zoom return, bounded camera/tank separation and gunner transitions; inspected its final follow-view capture. The browser fixture now requires a clear 90 m driving lane so a tank-wall collision cannot invalidate the follow check. Production build and whitespace checks pass (existing chunk-size advisory). Chrome headless on macOS; driving feel remains for user review.

Arena cycle camera clearance and front-facing patrol pass — September 28

  • [x] Apply final camera constraints and frame-to-frame sweeps to cycle follow, side glances, aerial zoom and arena entrance views. Include the arena's four 60 m wall prisms as well as maze walls, with independent collision geometry and the existing recovery path if blocked.
  • [x] Keep breach passages usable by subtracting openings derived from the authored breach profile. Test intact walls, roofs, breach passage, all four starting-wall sides, moving side glances and return from zoom.
  • [x] Start the arena patrol 24 m farther back along its existing route. Preserve its forward motion and green tint; the entrance camera now passes in front of the Recognizer instead of directly over its center, exposing its front.
  • Validation: 44 arena/cycle/camera/player tests pass, including padded wall clearance, roof crossing rejection, breach passage and front-facing patrol visibility. Chrome tests/cycle-opening.mjs passes entrance, patrol motion, formation, pause, handoff and zoom checks; inspected the rim flyby capture. Production build and whitespace checks pass (existing chunk-size advisory). Chrome headless on macOS; final game feel remains for hands-on review.

Keep the wall-constrained camera out of the cycle — September 28

  • [x] Raise the cycle camera's collision anchor from bike-body height to 7 m, while retaining the normal unobstructed 4 m follow height. When the bike fits closer to the arena wall than the camera's padded volume, inset the anchor onto the arena side. Wall correction can shorten the horizontal boom without pulling the camera down into the cycle.
  • [x] As the boom shortens, blend the look point from forward driving focus toward the cycle itself, producing an overhead view with the bike still visible. Preserve the authored formation shot.
  • Regression tests park the cycle against all four walls and a corner, checking camera height, wall clearance and on-screen bike position through side glances. Browser reproduction uses the actual gold model at the closest legal wall placement.
  • Validation: 24 arena/cycle/camera tests pass. Chrome tests/arena-camera.mjs verifies clearance above the actual gold model during normal follow and both side glances; inspected the close-wall capture showing the complete cycle from above. Production build and whitespace checks pass (existing chunk-size advisory). Chrome headless on macOS; final driving feel remains for hands-on review.

Formation materialization pacing — September 28

  • [x] Shorten the gold formation's wireframe sweep from 1.2 to 0.933 seconds and lengthen its solid fade from 0.233 to 0.5 seconds. Retain the initial 0.4-second opening and total 1.833-second hold before the player-camera cut. Give formation timing its own configuration while retaining other materialization defaults.
  • Validation: 13 cycle-camera tests and Chrome tests/cycle-opening.mjs pass, including the formation hold and race handoff. Production build and whitespace checks pass (existing chunk-size advisory). Chrome headless on macOS; pacing remains for user review.

Restore gunner sight typography — September 28

  • [x] Restore the original monospace zoom label and sight-green color by exempting it from the global terminal color-font override. Keep its original 30 px SVG font size.
  • Validation: Chrome headless on macOS reports monospace, 30 px, and matching green text/fill (RGB 86, 214, 51) while playing.

JEV driving with player-controlled firing — September 28

  • [x] Shift-U toggles Clu autoplay with automatic firing disabled. JEV retains driving and turret aiming; Space and mouse firing remain player-owned. Shift-U switches full autoplay into manual-fire mode or turns manual-fire mode off. U retains its existing autoplay toggle.
  • [x] Show MANUAL FIRE in the autoplay HUD and describe Shift-U in its tooltip. Keep the firing restriction through pilot replanning and reset; disabling/re-enabling ordinary autoplay restores automatic firing.
  • Validation: 26 autoplay/input tests pass, including an aligned enemy that full autoplay fires at while manual-fire autoplay preserves movement/aiming but emits neither firing channel. Production build and whitespace checks pass (existing chunk-size advisory).
  • Chrome tests/autoplay.mjs passes Shift-U activation, full-to-manual mode switching, manual Space firing while driving, and disabling, plus existing autoplay lifecycle checks. Provider responses were mocked; no paid requests. Updated an existing text assertion to accept the uppercase HUD and waited for its render before checking the mode label. Chrome headless on macOS.

Soundtrack credits — September 28

  • [x] Add on-screen and archival music credits for Wendy Carlos (composer; gameplay excerpts from We've Got Company and Tower Music - Let Us Pray) and Journey (Only Solutions, ending/credits). Record artist/album source links in the archival credits.
  • Validation: Chrome headless on macOS tests/extended-credits.mjs passes the complete tribute-to-signoff sequence and eight-line page layout checks. Whitespace checks pass.

Cycle glance horizon at every zoom — September 28

  • [x] Keep the J/L orbit angle when blending into the I/K elevated view. During a glance, ease downward pitch to at most one quarter of the vertical field of view, leaving the horizon within frame. Release returns to the chosen zoom framing. Apply the look adjustment after collision correction without moving the camera through walls or into the cycle.
  • Validation: 25 camera tests pass across arena/road, both glance directions and zoom scales 1–128, including release recovery and tight-wall clearance. A deliberate glance now prioritizes the horizon over keeping the bike centered; ordinary close-wall follow retains its overhead bike framing. Production build passes (existing chunk-size advisory).
  • Chrome headless on macOS tests/arena-camera.mjs passes model clearance and real K/J zoomed-horizon checks; inspected the rendered horizon capture. The preview server stopped during the first capture attempt and was restarted before the successful run. Whitespace checks pass.

Consolidated validation — September 28

  • All 379 npm test checks pass before committing the camera, driving, targeting, manual-fire autoplay, credits and presentation changes. Updated the credits page-count bound for the two requested soundtrack pages and explicitly assert both music credits. Prior targeted Chrome checks and production build results are recorded above.

Trim the first second of cycle entry — September 28

  • [x] Begin the authored cycle entrance at 00:01, leaving 15 seconds of camera travel before formation. Keep camera, carrier and audio on the same authored clock; advance the arena patrol through the skipped second using bounded simulation steps. Preserve formation timing and reduced-motion entry.
  • Validation: 14 cycle-camera tests, Chrome tests/cycle-opening.mjs (including the 1-second starting offset, patrol, audio, pause and handoff), production build and whitespace checks pass. Chrome headless on macOS; existing build chunk-size advisory remains.

Shared BIT JEV relay configuration — September 29

  • [x] Confirm BIT uses the same /api/jev/decision relay, upstream JEV endpoint, model configuration and budget as Clu. Fix development config so BIT receives VITE_JEV_API_BASE just like the main client; production already embeds that shared setting. The config response contains only the public base URL. Light-cycle race opponents currently use their local planner.
  • Validation: 17 local/public relay tests pass, including BIT upstream/response compatibility, custom-base configuration and credential isolation. Chrome tests/bit.mjs passes replies, menu/exit and microphone-permission paths with mocked API responses; no paid requests. Production build and whitespace checks pass (existing chunk-size advisory). Chrome headless on macOS.

Live BIT relay and character context — September 29

  • [x] Deploy the Worker separately from the website: the stale live protocol rejected BIT questions with HTTP 400. After deployment the same request returned HTTP 200.
  • [x] Supply explicit BIT identity facts and interpret second-person questions as addressed to the TRON character. Reserve UNSURE for unknown or non-binary questions instead of uncertainty about roleplay identity.
  • Validation: 17 relay tests and Worker dry run pass. Deployed Worker version 0fa10ec9-be17-4d31-8e14-30ac45073287; live Are you a bit? returned m0 (YES), confidence 1. This was a real provider request.

Smooth cycle formation handoff — September 29

  • [x] Replace the post-materialization camera cut with a 1.2-second eased move into player follow. Track the launching cycle, blend orientation and field of view, and lift the path over the bikes while retaining final wall constraints. Pause holds transition time; reset clears it.
  • Validation: 19 cycle/arena camera tests pass, including first-frame position/orientation/FOV continuity, bounded motion, pause and completion. Production build and whitespace checks pass (existing chunk-size advisory).
  • Chrome tests/cycle-opening.mjs passes the entrance, held formation, handoff and zoom controls. Inspected the midpoint capture after changing the aim blend to follow a moving look point with world-up orientation. Chrome headless on macOS; final motion feel remains for user review.

Confirm Escape before returning home — September 29

  • [x] Escape pauses Clu, Light Cycles and BIT and opens a shared modal with Continue Playing and Return Home. Continue receives initial focus; Escape cancels. Block gameplay keys behind the modal, preserve pause during tuning close, and reset game state on confirmed return. BIT suspends audio, listening, requests and rendering while the panel is open. Include the shared script in the offline cache through the existing BIT asset inventory.
  • Validation: Chrome tests/exit-confirm.mjs passes all three games, frozen simulation, input blocking, microphone pause, cancellation/resume and home navigation. tests/bit.mjs passes reply and microphone lifecycle checks with confirmed exit. Mocked provider requests; Chrome headless on macOS.

Keep the cycle forward view near walls — September 29

  • [x] When wall clipping would shorten the follow boom below 7 m, choose a clear 10 m lateral offset along the wall. Prefer the side nearest the previous camera, retain wall sweeps, and reduce look-ahead during this side view to keep the bike visible. Apply the same destination during the materialization handoff.
  • Validation: all 382 npm test checks pass. Tight-wall tests now require viewing distance and shallow downward pitch on all four sides and a corner. Chrome tests/arena-camera.mjs passes and its inspected capture shows the complete cycle with the forward arena visible. Production build passes (existing chunk-size advisory); final driving feel remains for user review.

Wall-connected starting trails and direct launch cut — September 29

  • [x] Seed each active arena cycle trail from the nearest inner arena wall at launch. Fill the intervening grid collision cells and preserve the wall endpoint as the first segment grows. Initial render trimming attaches the trail to the rear axle without losing the wall connection.
  • [x] Restore the fixed formation shot through materialization and direct cut to player follow at launch; remove the 1.2-second transition and its lift/field-of-view blend. Preserve the newer near-wall side view.
  • Validation: 382 full-suite checks passed, followed by 24 focused tests including the new starting-trail regression and direct-cut camera check. Production build and whitespace checks pass (existing chunk-size advisory).
  • Chrome tests/cycle-opening.mjs passes the held formation, launch handoff, audio and zoom checks; inspected its post-launch follow capture. Chrome headless on macOS.

Arena palette, carrier framing and launch hold — September 29

  • [x] Darken the green Recognizer face preset to #1c3825 (used by the arena patrol). Brighten arena purple symbols to #61249b with #9c6bbe outlines.
  • [x] Set the entrance carrier 800 m back along its heading while retaining its altitude, orientation and forward speed. Inspect its first frame at 1250×1000 to ensure the entire vessel fits.
  • [x] Hold the fixed formation shot for one second after materialization as the cycles launch. Release race simulation while retaining the shot, then cut directly to follow. The inspected late-hold capture shows gold trails with the bikes out of view.
  • Validation: all 383 npm test checks and production build pass (existing chunk-size advisory). Chrome entrance checks cover fixed camera during launch, moving race, patrol tint, pause, audio and handoff. Whitespace checks pass.

Follow surviving cycles after death — September 29

  • [x] Show the requested top-of-screen death message: CYCLE DETROYED - ARROW KEYS TO FOLLOW - ENTER TO RESTART. Replace automatic free-flight spectator entry with a surviving-cycle follow camera. Left/Right wrap through live cycles, skip destroyed cycles, and leave player identity unchanged. Select another survivor if the followed cycle dies; Enter retains match restart.
  • [x] Latest launch-hold tuning is 0.6 seconds, shortened in two requested 0.2-second steps.
  • Validation: 383 full-suite checks pass, followed by 16 camera tests including selected-survivor tracking. Chrome tests/cycle-follow-spectator.mjs passes message, both arrow directions, wraparound, target death and restart; inspected the rendered message. Build and whitespace checks pass (existing chunk-size advisory). Chrome headless on macOS.

Finite light-cycle trails — September 29

  • [x] Cap each cycle's trail at the arena's inner perimeter: 8 × 409.06 m = 3272.48 m. Advance the oldest endpoint as new wall appears, discard exhausted segments, preserve active-segment references, and release expired collision cells. Retain stripe placement as the tail recedes. Account for rear-wheel attachment, fractional movement and discontinuous arena reentry.
  • Validation: all 386 npm tests pass on the final run. The first full run had a crossing-Recognizer shooting failure; that test passed in the 69-test focused rerun and final full run. Production build passes with the existing chunk-size advisory. Chrome headless on macOS: tests/cycle-trail-limit.mjs verifies rendered length against the cap, reports no page errors, and produces an inspected aerial capture. Unit checks cover corner trimming, reclaimed cells, other cycles' ownership, active-segment remapping, fractional advance, death and reentry.

Cycle death overview — September 29

  • [x] After player-cycle death, smoothly pull up over three seconds to a fixed view above the nearest arena wall, aimed at the center. Rise clear of the wall before translating outward. Fit the full arena with an inset margin based on window aspect ratio. Left/Right still select surviving cycles to follow; Enter restarts.
  • Validation: 21 cycle/arena camera tests pass, including smooth initial motion, vertical wall clearance, full-arena framing at three aspect ratios, center aim and reset. Chrome headless on macOS: cycle-follow-spectator.mjs passes overview entry, survivor selection, wraparound, target death and restart; inspected cycle-death-overview.png. Production build passes with the existing chunk-size advisory.

Lower cycle death perch — September 29

  • [x] Replace the high, whole-arena overview with a fixed perch 6 m above the 60 m arena wall, at its inner edge. Retain the three-second pullback, completing the vertical rise before moving across the wall. Smoothly point at a surviving cycle and select another if it dies; use the arena center when none remain. Arrow keys still enter normal survivor-follow views.
  • Validation: 21 camera checks pass for bounded height, clearance during ascent, a fixed perch while tracking a moving survivor, replacement targets and reset. Chrome spectator lifecycle checks pass; inspected the lower perch capture. The original whole-arena framing requirement is superseded by this lower tracking view.

Shared cycle turbo and rechargeable arena brakes — September 29

  • [x] Give autonomous cycles use of their own turbo reserves: boost on clear arena straights, and brake when the lane ahead closes. Road agents can also use their existing turbo on clear routes. All arena cycles share the same gradual speed response and resource rules.
  • [x] Add a per-cycle arena brake reserve: five seconds of braking, sixty seconds to recharge fully when released, partial-charge reuse, and no repeated pulses when holding an empty brake. Brake requests take priority over turbo. Reset restores both reserves. Show S/X brake charge beneath the turbo meter using the terminal text scale. Road speed-hold controls retain their existing braking behavior.
  • Validation: all 389 npm tests pass, including autonomous turbo/brake use, empty-brake hold, release/recharge, partial reuse and reset. Chrome headless spectator lifecycle checks pass; inspected the additional brake HUD in the rendered capture.

Spectator resource meters — September 29

  • [x] Bind cycle HUD meters to the watched cycle: selected survivor in follow mode, or the survivor tracked from the wall perch. Turbo/brake fills and active states, road health and speed now use that same bike; ordinary play still uses the player bike.
  • Validation: Chrome headless on macOS, cycle-follow-spectator.mjs passes with distinct turbo/brake reserves per bike. Checks cover wall-perch meters, both arrow directions, wraparound, active-state changes, automatic replacement after target death and restart. Whitespace checks pass.

Partial-charge Clu turbo — September 29

  • [x] Allow Clu to trigger turbo whenever some reserve is available. Convert the recharged fraction into boost duration (25% gives 2.5 seconds), spend that available reserve and restart its recharge timer. Prevent stacking during an active boost; retain the existing ten-second full boost, sixty-second recharge timing, teleport/transfer restrictions and destruction reset.
  • Validation: 89 simulation, autoplay and ground-tank checks pass. Added coverage for empty charge, partial recharge, proportional duration, immediate reuse of newly available charge and tiny partial reserves. Existing full-duration, braking and destruction checks also pass.

Clu autoplay temporarily disabled — September 29

  • [x] Disable player autoplay through the application feature flag and an unavailable Autoplay instance. U, Shift-U and button activation cannot enable driving, aiming or firing assistance. Hide the autoplay button and Clu JEV statistics; retain the implementation for later reactivation. Enemy AI and the other programs retain their existing behavior.
  • [x] Track the three newly supplied film-reference clips with Git LFS, including the 194 MiB clip that exceeds normal GitHub file limits.
  • Validation: all 391 npm tests pass. Chrome headless on macOS: tests/autoplay.mjs verifies hidden/disabled UI, U and Shift-U, synthetic button activation, no player API requests and no page errors.

Clu keyboard zoom restricted to aerial mode — September 29

  • [x] I/K no longer changes Clu's normal following-camera distance. Only V aerial mode accepts keyboard zoom for Clu; hide the zoom hint outside that mode. Gunner aiming and light-cycle keyboard zoom retain their existing controls.
  • Validation: extend the Chrome autoplay-disabled check to exercise I and K in normal view, zoom out/in in V mode, and verify zoom remains unchanged after returning to normal view.

Home-screen credits — September 30

  • [x] Add CREDITS after BIT in the program menu, with the same keyboard selection and click behavior. Reuse the existing standard and extended credit sequence with terminal music, omitting the detached-from-Clu header. Any key or click returns to program selection.
  • Validation: Chrome headless on macOS, tests/home-credits.mjs passes keyboard and mouse entry, absence of the header, progression from standard to extended credits, and return/reentry. Inspected home-menu and credits captures; whitespace checks pass.

Clu menu naming — September 30

  • [x] Rename the home menu's SPACE PARANOIDS option to CLU. Replace the old masthead branding and home-link accessible name with ENCOM TERMINAL; the browser title and PWA names already use ENCOM TERMINAL.

Clu startup cruise cancellation — September 30

  • [x] Remove the separate startup-throttle override and use the same cruise latch as Shift-W. S/Down cancels cruise instead of temporarily overriding it, so releasing the brake does not resume forward acceleration. Plain W releases cruise; Shift-W enables it again.
  • Validation: 48 simulation/input checks pass. Chrome headless tests/cruise.mjs passes startup cruise, both brake keys, no forward reacceleration after release, Shift-W reenable and plain-W cancellation. Whitespace checks pass.

Quiet JEV fallback and scalable meters — September 30

  • [x] Restore JEV as the browser default, superseding older stored AI-mode preferences once (preference version 4). Keep manual Clu autoplay disabled. Log local/classic AI selection to the console instead of showing a persistent HUD warning. On JEV failure, show JEV unavailable for four seconds with a fading final portion; retain local fallback and suppress repeat notices during a continuous outage.
  • [x] Stack vehicle meters at the top left in a shared grid with font-relative widths, bar heights and row gaps. Wrapped labels grow their rows; position controls beside the stack on desktop and below on narrow screens.
  • Validation: Chrome headless tests/system-warnings.mjs passes default migration, simulated outage/fade, console-only local selection and non-overlapping meters in Clu and light cycles at enlarged font sizes. Inspected rendered captures. The crossing-target shooting regression now uses a fixed seed and asserts damage, since authored spread does not guarantee a lethal hit location.
  • Final verification: all 391 npm tests and production build pass; existing bundle-size advisory only.

Smaller vehicle meter labels — September 30

  • [x] Reduce Clu and light-cycle meter-label text to 80% of the terminal font size. Retain the existing meter widths, spacing and other HUD text sizes.

Restore meter position — September 30

  • [x] Return both games' vehicle meters to the top right, preserving the stacked spacing and 20% smaller labels. Reserve space for them on the right of the control hints.

Consistent smaller game text — September 30

  • [x] Use the meter-label size (80% of terminal text) for Clu and light-cycle HUDs, controls, notices, pause/exit prompts, camera help and tuning panels. Keep terminal/home/credits text at its existing size. Preserve the gunner typeface and colors. Meter and hint spacing share the game text scale.

C controls pause — September 30

  • [x] Replace C's free-camera shortcut with a controls panel that pauses Clu or light cycles. Show controls appropriate to Clu, arena cycles or outside-arena driving. Any fresh keypress, tap or click dismisses the panel and resumes; consume that event so it cannot fire, steer or open the exit panel. Update the in-game control hints.
  • Validation: Chrome headless tests/controls-help.mjs passes frozen simulation and resume via Space, Escape, C, mouse and touch in both games, with no leaked firing or exit prompt. Inspected the controls panel capture; whitespace checks pass.

Brief controls hint and reliable V transitions — September 30

  • [x] Replace automatic full control lists with a centered C / CONTROLS prompt for the first five seconds of active play. Keep loading/death/result messages and the C pause panel. Count from gameplay after the cycle introduction and exclude paused time.
  • [x] Release a stale follow-camera wall-recovery path when an aerial movement has a clear swept path. Ignore repeated V keydown events, and restore aerial scale when enabling V after zooming down to the follow-view limit.
  • Validation: all 29 camera checks pass, including a regression with an occluded tank, stale recovery and clear aerial movement. Browser controls coverage includes the timed hint and V key repeat behavior.

Grouped controls panels — September 30

  • [x] Remove the M mute shortcut and its control hint. Group Clu controls into Driving, Weapons, Camera and Game, and cycle controls into Driving, Camera, After Death and Game. Remove the final any-key/tap/click instruction while retaining that dismissal behavior.

Recover stale offline installations — September 30

  • [x] Add an uncached update.html entry that checks for a new worker, explicitly activates the downloaded update and returns to the game. This works even when an older worker serves cached entry HTML and its old registration code.
  • [x] Future clients activate waiting updates from terminal/home screens and reload after controller replacement. Preserve running games and credits until they return home; keep ordinary offline caching.
  • Validation: Chrome tests/pwa-update.mjs reproduces old cache-first HTML and a worker without update messaging, then verifies migration through update.html into the current playable game. Production build and whitespace checks pass.
  • PWA lifecycle verification also passes: offline Clu/cycles/BIT, audio ranges, installability, waiting during play, and applying the waiting update after returning home.

Credits navigation — September 30

  • [x] Space skips directly to the next credit page, including extended credits, resetting the current typing/fade state. Only Escape, Return/Enter, click or tap returns to the home screen; other keys are ignored. Ignore repeated keydown events.
  • Validation: Chrome tests/home-credits.mjs passes Space progression into extended credits, ignored unrelated keys, Escape/Return/numpad Enter exits and click/tap exits. Whitespace checks pass.

Teammate turbo discipline — September 30

  • [x] Teammates conserve turbo at launch and on uncontested straights. Use it with a clear lane when a live opposing cycle is nearby, in a neighboring lane and traveling in the same direction; release after establishing a lead. Use separate engage/release lead thresholds to avoid rapid toggling. Apply the same policy to teammate road driving; preserve player controls and opponent behavior.
  • Validation: all 49 cycle/player/road tests pass, including launch conservation, enemy use, a nearby rival, release after pulling ahead, and no boost for oncoming or destroyed rivals. Whitespace checks pass.

Terminal-style exit choices — September 30

  • [x] Use stacked, borderless choices in all three games' Escape confirmation panels, matching the home menu's blinking block cursor. Default to Continue Playing on every opening. Arrow keys, Tab and pointer focus move the selection; Enter/Space or click activates it, and Escape resumes. Respect reduced-motion preferences. Remove the panel fill and border so only the text and cursor appear over the dimmed game.
  • Validation: Chrome headless on macOS, node tests/exit-confirm.mjs passes Clu, cycles and BIT pause/resume, cursor selection and blink timing, keyboard navigation/confirmation and click return home. Inspected the Clu panel capture; syntax and whitespace checks pass.

JEV light-cycle maneuver selection — September 30

  • [x] Include autonomous arena cycles from both teams in the existing shared JEV scheduler and transport, excluding the human-controlled cycle. Rotate requests among eligible bikes with a four-second per-bike replan interval and existing global quotas, cancellation and fallback.
  • [x] Supply bounded, unobstructed cycle observations and clear corridor destinations in arena-local meters. A cycle-specific shared relay prompt selects a strategic destination; local steering rechecks cells and available space each crossing. Goals expire after six seconds; reject late, uncertain, dead/escaped or previous-round replies. Keep local turbo/brake rules, including teammate conservation. Outside-arena road driving retains its local controller.
  • Validation: all 398 npm test checks pass. Chrome headless on macOS, node tests/cycle-jev.mjs verifies mocked API requests, accepted arena decisions, human exclusion and paused scheduling. Unit checks cover round changes, visibility, stale replies, local fallback and blocked-cell overrides. Live-provider tactical quality remains unverified. Public deployment must include the updated Worker prompt alongside the client.

Social sharing preview — October 1

  • [x] Add static Open Graph and large-image Twitter Card metadata for the public TRON URL, with ENCOM TERMINAL title, game description and image alternative text. Use the user-supplied arena screenshot, converted without cropping to a 1080×720 JPEG for sharing compatibility (public/images/encom-social-preview.jpg). Source: user attachment encom-terminal-v0-uxv6f49c6ssh1.png.webp; supplied for this site's preview, no broader license asserted.
  • Validation: production build passes; built HTML contains both sharing-image tags and the large-image card type, and the built JPEG matches the source asset with verified 1080×720 dimensions. Platform-specific preview rendering remains controlled by each social service.

Encrypted repository credential — October 1

  • [x] Initialize git-crypt and encrypt credentials/** before adding the JEV key. Allow only credentials/Typesafe.txt through Git's ignore rules. Export an owner-readable recovery key outside the repository; document unlocking and secure backup. Keep Cloudflare production secrets independent.
  • [x] Ignore git-crypt ciphertext when loading a locked development checkout, retaining local fallback rather than sending encrypted bytes as an API credential. Preserve development-server file denial.
  • Validation: staged credential has the git-crypt header and contains no plaintext key; a separate temporary repository successfully unlocks the staged blob with the exported key. A locked server fixture reports JEV unconfigured. All 11 JEV tests and the production build pass. Prior history scan found no copy of this JEV key.

Meshy shuttle reconstruction trials — October 2

  • [x] Add a server-side Meshy generation/download script using ignored local credentials, persistent task IDs, reference hashes and explicit submissions. Download GLBs and previews locally; preserve the original and remeshed outputs for comparison.
  • [x] Try original four-view film input (carrier contamination), focused two-view input (incorrect closed shell), and tight detachment-only input (fragmented geometry). Three completed jobs used 105 credits total. Keep the existing default shuttle unchanged; comparison links are available in the model studio.
  • [ ] Produce a reference-faithful replacement shuttle. None of these Meshy outputs meets the supplied film references. Further generation needs clearer, isolated views or a different reconstruction approach.
  • Validation: macOS Chrome headless loads and exports the four-view and detachment-only models, including the original detachment mesh; six rendered angles captured and the reference-angle capture inspected for the detachment failure. Credentials remain ignored; no signed URLs or keys recorded in task manifests.

Shuttle smoothing and symmetry — October 2

  • [x] Use the two-view Meshy shuttle's user-accepted silhouette for cleanup. Smooth welded geometry, planarize broad panels, and mirror one quadrant across width and height. Use a neutral surface material to remove baked texture noise. Make this the default standalone shuttle preview and export a separate GLB, retaining raw trials.
  • Validation: Chrome on macOS captures six views and checks exact X/Y mirror correspondence for every mesh vertex plus GLB export. No extra Meshy credits used; small inferred surface details remain provisional.

Shuttle hard-surface correction — October 2

  • [x] Replace the rejected smoothing pass with explicit flat orthogonal panels. Quarter-circle front corners are the only curved or non-right-angle regions. Preserve width/height symmetry and straight detail strips; restore a clean green inset. Use this as the default studio model, preserving earlier comparisons.
  • Validation: geometry invariant test passes for X/Y world-space mirror correspondence and no angled faces outside front corners. Chrome renders six views and exports the 1,532-triangle GLB. Visual proportions still require user review.

Preserve shuttle structural details — October 2

  • [x] Supersede the oversimplified planar reconstruction with the detailed two-view Meshy source. Disable global smoothing and retain its material maps, ribs and recess geometry. Restrict planarization to tightly grouped near-axis-aligned surfaces and keep X/Y symmetry. Export a separate detailed GLB and make it the studio default.
  • Validation: Chrome six-view captures, symmetry checks and GLB export pass (38,008 triangles). Reference/top views inspected. Exact hard-surface reconstruction remains unresolved; do not claim the simplified panel model satisfies the reference.

Provider-balance-controlled public JEV usage — October 2

  • [x] At the user's request, set the public relay's shared daily request/input quotas and per-IP daily/minute quotas to explicit unlimited. Preserve request size validation, timeout, short pacing and concurrent-request controls; no cumulative site usage cap remains. Existing usage counters do not block requests under the new configuration. TypeSafe account balance and provider limits govern total usage.
  • Validation: all seven Worker tests pass, including requests succeeding with counters far above the former caps. Invalid settings still fail; explicitly configured numeric limits retain their semantics.

CLU variation, sound, shadows and victory cadence — October 2

  • Normal CLU starts now choose a fresh run seed so maze patrol tank/Recognizer placements vary. Opening pursuit Recognizers and carrier escorts retain their formation; explicit runSeed and reference runs remain repeatable.
  • Bullet surface-hit tones now use HRTF positioning at the impact point, with inverse distance attenuation (18 m reference distance). Mono source tones become directional stereo at the listener.
  • Maze shadows on vehicles use a 2048-pixel tile and four-tap bilinear depth-comparison filtering instead of unfiltered 1024-pixel tiles. Exact floor/wall shadow geometry is unchanged; atlas memory increases fourfold.
  • Victory typing retains the extended-credit 18 ms character interval, allowing 250 ms of catch-up so low frame rates no longer throttle it to two characters per frame. Human access typing retains its single-character limit. Text source: docs/victory.txt.
  • Validation: npm test passed 402 tests, including seeded patrol placement/formation preservation and victory cadence at 5–30 fps. Desktop Chrome: node tests/surface-audio.mjs verified left/right channel energy and distance attenuation; node tests/tank-wall-shadows.mjs produced inspected before/after tank captures without shader errors; node tests/wall-shadow-edges.mjs retained zero incorrect pixels in the exact wall fixture. Audible balance and the precise screenshot location still need user play review.

Extended-credit model previews and horizontal camera recovery — October 2

  • Extended model credits now show a locally rendered tank, Recognizer, carrier, Solar Sailer, grid cloud, light cycle, or authored shuttle beside the text. The transparent preview requires at least 260 pixels of free width and 220 pixels of height; narrow windows keep text only. Model fade-in begins with printing, and fade-out follows the credit's opacity. Space, return-home, resize and reset dispose obsolete model resources; the preview shares the existing frame loop and respects reduced motion.
  • CLU's normal follow camera now tries a swept horizontal detour around wall corners before rising. A bounded local path search covers 64 meters in each horizontal direction, with a 512-node budget; if it finds no route it retains the roof escape. Manual aerial, gunner and cycle cameras keep their existing behavior. Camera orientation continues tracking CLU throughout recovery.
  • Desktop Chrome: node tests/credit-models.mjs passed seven model loads, fade synchronization, narrow-window hiding, reset during loading, disposal, and actual home-menu credit navigation. Inspected model and in-game captures in test-results/credit-model-*.png. node tests/camera-walls.mjs passed 483 rendered frames without wall crossings. node --test tests/camera-collision.test.js passed 10 tests including constant-height two-corner recovery, following a moving tank, and upward fallback with no bounded horizontal route. Victory printer tests also passed.