Planned with the user: living-stream animation + textures (M6), scenario validation harness replacing time-based fuzzing (M7), slalom track rescale (M8), physics engine spike targeting Box2D's new 3D version (M9), physics marble + checkpoints/respawn (M10), physics vocabulary - gaps/jumps/plinko/ real falls/speed envelope (M11), island verticality (M12), seed freeze moved to the end (M13). Sequential; each milestone gates the next via rule/scenario validation, not time-based fuzzing.
- commit
- 1c7fd1d0cc7b902b8dd296557056eb0bc7cf4d4b
- parent
- a8ea2834188e7509aa9b1a76486ee62df26baa2d
- author
- Dami <dami.etoile@gmail.com>
| M | progress.md | 160 | +++++++++++++++++++++++------- |
@@ -468,45 +468,127 @@ representative). Kit coverage: 122 present / 40 exempt / 0 missing @ 20k
468468 sweeps + state JSON (marble pos/speed per iteration) are how falls, boosts,469469 and lap alternation were verified.470470 471-## HANDOFF PROMPT — next agent: M5 polish + M6472-473-You are continuing the marbles generator. M1–M4, hole semantics, and M5 (endless474-mode — the void line with island anchors, REDESIGNED with the user this round;475-read the M5 section carefully, the old chunk-tile sketch is dead) are complete.476-Before anything: `deno task test` (57 green), `genVersion()` (ga265f1373eed —477-unchanged by M5, the finite pipeline is byte-identical), and skim "M5 systems".478-479-### M5 polish backlog (endless mode is playable but young)480-481-- **Void-flight variety**: full-helix ensembles as spiral dives (the defs482- revisit their own window cells — the open-path planner needs a483- duplicate-cell-tolerant clause), tunnel runs on islands, stubs/fans on island484- runs (they need "ground" — an island top IS local ground), wide runs on long485- island runs, solids on islands (style.solidAt with island context).486-- **Island shaping**: slope/diagonal shoulder trim (cliff_blockSlope*,487- cliff_topDiagonal), cave mouths where old track pierces a mass488- (cliff_blockCave_*), waterfall pieces off island edges, statues/tents/ bridges489- as island landmarks, biome-tinted cliff materials.490-- **Performance**: InstancedMesh for island blocks + decor (each island is491- 50–250 clones today; fine at the current window, wasteful). Segment builds are492- ~5–15ms on the main thread — consider building one frame early or in idle time493- if hitches show.494-- **Marble feel in the void**: drop-stack falls work (centerline dives); long495- steep chutes can pin speed at MAX — maybe raise MAX_SPEED for endless or add496- banking lean (M6 item) which matters more at speed.497-- **Endless extras**: distance milestones in the HUD, a "photo mode", per-biome498- fog/lighting tint shifts, destructible decor revival (needs a collider — e.g.499- a future powerup marble that jumps the channel).500-501-### M6 backlog (collected across rounds)502-503-Seed freeze (goldens become permanent — INCLUDING an endless-stream golden: pin504-segment hashes for fixed seeds); marble banking lean; checkered goal-gate505-texture; ambient audio; curve-wide family as an off-grid scenery macro; tee-spur506-macro for split-double-sides; takeable spur branches (split siding → end-hole507-drain onto a lower line); wide bridges; hill-interval constraint so508-flat-crossing tracks can have hills; per-branch support columns for elevated509-diamonds; distance-graded ambient decor (widen the oracle contract).471+## ROADMAP — the physics era (planned with the user, 2026-08-08)472+473+USER DIRECTION (verbatim intent): expand the forms of variation — textures,474+spawn/despawn animation (currently we pop in/out) — and introduce the physics475+aspects: fall to another path, plinko-style filters, dynamic speed, speed476+boosts, track gaps (jumps, falls, cliffs, stairs), island verticality (generally477+flat today; should flow around itself in x/y/z with varied start→end elevation).478+True physics introduces the chance to fall OFF the track → a respawn system is479+required, with generated CHECKPOINTS so the respawn point always moves forward.480+To make falling less likely, change the marble:track proportion —481+marble/islands/decor keep their world scale, the TRACK becomes a slalom (bigger482+channel relative to the marble). Physics target: the new 3D version of Box2D483+("recently came out" per user — post my knowledge cutoff; VERIFY484+name/status/license/WASM first, see M9). Everything sequential; each milestone485+lands only once the previous system is validated. VALIDATION STYLE (user rule):486+avoid time-based fuzzing — use scenarios against rules (WFC-style rule487+enumeration, and survivability checks for specific combos found to be488+problematic).489+490+### Milestone sequence (each gates the next)491+492+**M6 — Living stream: spawn/despawn animation + texture variation.** Placements493+animate IN as the stream builds (transform-based rise/scale settle, staggered494+per placement by distance from segment entry; island blocks bottom-up, decor495+after) and animate OUT before disposal (segment lingers one window while496+exiting). Visual-only wall-clock easing — generation untouched, determinism497+unaffected. Textures: biome-tinted cliff materials (shared material clone PER498+BIOME, not per block), per-theme accents, the checkered goal-gate texture (old499+backlog), and evaluate extra Kenney texture packs (e.g. Prototype Textures as an500+"abstract" biome row). Validation: headless build/dispose cycle asserting501+renderer.info counts return to baseline (no leaks), animation state-machine unit502+tests, screenshot review.503+504+**M7 — Scenario validation harness (the pre-physics gate).** Demote time-based505+soaks to smoke tests. Build: (a) transition-matrix rule tests — enumerate506+realized window transitions from the registry and assert geometry/band507+invariants per PAIR, no time dimension; (b) a named scenario runner508+(tests/scenarios/): each scenario = fixed seed+segment or a constructed509+fragment + assertions, so a problematic combo found in play becomes a permanent510+named regression; (c) survivability scaffolding that M10+ physics scenarios plug511+into (deterministic sim of a fragment at min/typical/max entry speed → must512+complete). WFC rules help here — the piece vocabulary IS the enumeration space.513+514+**M8 — Slalom proportion (world rescale).** Track pieces scale up (proposal: ×2)515+in world space; marble, islands, decor stay 1×. One track cell = 2×2 island516+cells (mass builder maps columns), decor bands rescale, elevation quantum517+doubles in world units. PROPOSAL: endless-only at first — loop mode keeps 1× so518+finite seeds/goldens survive; revisit at M13 freeze. Slalom channel ≈ 3.5–4×519+marble diameter = falling off is rarer under physics, and the marble reads as a520+marble, not a boulder. Validation: geometry rule tests at the new scale (band521+clearances, island column mapping, port continuity), screenshot pass. OPEN522+DECISIONS: exact scale factor (2 vs 2.5), whether speeds/gravity constants523+rescale.524+525+**M9 — Physics engine spike (offline, no game changes).** FIRST verify the526+"Box2D 3D" release (post-cutoff: search for it — Erin Catto / box2d.org; user527+prefers it as the target). Fallback candidates if unusable from the browser:528+Jolt (WASM port), Rapier3D (deterministic feature). Selection gates: fixed-step529+same-build determinism (state hash of N steps reproducible), WASM size/perf (≥4×530+realtime at 120 Hz on target hardware), CCD quality for a small fast sphere,531+mesh/convex collider support. Deliverable: standalone spike — marble body532+rolling through ONE measured piece's collision proxy + determinism + perf533+numbers. Collision proxies become registry data like centerlines: floor ribbon +534+wall strips per PieceDef, MEASURED from the GLBs (tools/measure_* pattern),535+never guessed from bboxes.536+537+**M10 — Physics marble + checkpoints + respawn (one milestone — a physics marble538+without respawn is broken the moment it falls).** Marble = dynamic body;539+slopes/gravity real; centerline demoted to camera rail + progress metric (s via540+nearest-point projection). Generator stamps checkpoints (every island + every K541+cells of void flight; a flag/banner placement carrying {pos, dir, s}); falling542+below the lowest co-live band − margin (or stuck timeout) respawns at the last543+checkpoint with its entry speed. Checkpoints always move forward with the544+stream. Validation: per-piece survivability scenarios (every def traversed at545+speed-envelope extremes without leaving the channel), named combo scenarios546+(chute→bend, helix exit, jog at speed, drop-stack landing), replay determinism.547+548+**M11 — Physics vocabulary: gaps, jumps, plinko, real falls, speed systems.**549+Jump specs (launch ramp + gap + catch funnel — trajectory checked analytically550+at PLAN time against the speed envelope, then scenario- tested); cliff drops551+onto lower channels and fall-to-other-path zones (chance-fall semantics made552+real — leaving the track is INTENDED and recaptured by construction); stairs553+(cliff_steps on islands); plinko filter pieces (pin fields over a catch basin —554+outcome stochastic, but recapture guaranteed by walls, so survivability is 100%555+by construction and only the PATH varies); boost pads/fans as impulses; a556+per-cell worst-case SPEED ENVELOPE tracked by the planner so vocabulary is gated557+(no hairpin after a long chute unless a brake/spreader sits between). Every new558+spec ships with named scenarios at envelope extremes.559+560+**M12 — Island verticality.** Islands stop being flat: runs climb/descend ACROSS561+a mass (entry and exit at different elevations), terraced columns following the562+run's profile, switchbacks, x/y/z flow. Anchorage rule: every run cell supported563+at ITS height (the invariant already exists — it generalizes). Terrace step564+limits + scenarios.565+566+**M13 — Seed freeze + release polish (the old M6, moved to the end because the567+slalom rescale and physics change everything before it).** Goldens permanent568+INCLUDING endless stream goldens (pin segment hashes for fixed seeds); banking569+lean; ambient audio; remaining old backlog (curve-wide scenery macro, tee-spur,570+takeable spur branches, wide bridges, hill-interval constraint, per-branch571+diamond supports, distance-graded ambient decor).572+573+### Absorbed M5-polish backlog (fold into milestones above, grab574+575+opportunistically): full-helix spiral dives in the void (duplicate-cell-tolerant576+clause), tunnel runs/stubs/fans/wide runs/solids on islands (an island top IS577+local ground), island shaping (slope/diagonal shoulder trim, cave mouths at578+old-track piercings, waterfalls, landmarks), InstancedMesh for island blocks +579+decor (do during M6 — animation work touches the same code), HUD distance580+milestones, photo mode, per-biome fog/lighting tints, destructible decor revival581+(unblocks at M10 — physics gives decor something to collide with; user's582+pop-and-fling answer from the design round still stands).583+584+## HANDOFF — next agent starts at M6 (see ROADMAP above)585+586+Before anything: `deno task test` (57 green), `genVersion()` (ga265f1373eed),587+read "M5 systems" + the ROADMAP. Work the milestones IN ORDER; do not start a588+milestone until the previous one's validation gate is green and the user has589+seen it. The CUA harness recipe is under Notes/gotchas; prefer `soak.mjs`-style590+single-evaluate advanceTime calls for long sims (the per-frame harness loop591+costs ~60ms/frame of Playwright overhead).510592 511593 ### Standing design principles (endless edition)512594