- Workshop (WORKSHOP_CARTRIDGE): five-stage cartridge assembly at Deck A — seat/square, crimp four tag-wires, torque screws, ride-the-arm counterweight balance, needle-drop diagnostic with per-fault audio + scope. Relay-synced (per-field co-op merge: held screw + carried wire survive remote state). - Glow-Up (G1-G5): 32px atlas with per-voxel variants, selective LED bloom (quality-gated), screen-print decal system + party flyers, mixer/PCB worldgen density pass, record groove-sheen side texture. - 10 confirmed multi-agent review fixes, incl. co-op screw-stomp soft-lock, ride-snap collider-identity (magnet feet / eaten record-fling), workshop SFX exact-match map (rca_seated hijack), beam ride colliders to the head, double-crimp guard, WIRING INCOMPLETE diagnosis mode, skate-abort timer, completedState wiring, per-tick material churn, trackingHeavy platter drag. - Crossfader playtest fix: slew-limited sled (3.4 v/s) + ribbed grip caps with amber index — the sled reads as a heavy handle, not a teleporting wall. - Demo harnesses: machinesDemo hold-key wiring, playerDemo seesaw phase continuity, audioDemo incomplete fault button. - Workshop sync: exact 1.0 screw endpoint gets its own emit signature. Verified: typecheck + vite build clean, live solo quest smoke, two-client co-op relay smoke (simultaneous torque, no rewind, exact convergence). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
153 lines
8.7 KiB
Markdown
153 lines
8.7 KiB
Markdown
# Lane C — World Builder · Progress Update
|
||
|
||
*For Fable's review. Lane C = the level-design lane: author the entire DJ-booth
|
||
diorama in voxels via `buildBooth(world)`.*
|
||
|
||
---
|
||
|
||
## Phase 2 — Glow-Up G4 (worldgen density pass) · 2026-07-14
|
||
|
||
You handed me two briefs; the slice that's **my lane** (`src/worldgen/**`) is **G4** of
|
||
`GLOWUP_ART.md` — the worldgen density pass. (G1 atlas, G2 bloom, G3 decals, G5 record
|
||
texture are engine/fx work; the Headshell Workshop is Lane D + audio/net — both for their
|
||
own sessions. I did not touch their files.) Done and verified:
|
||
|
||
**Fixes findings #1, #2, #5:**
|
||
- **Mixer face (was an empty black desert)** → four dense channel strips of **mushroom
|
||
knobs** (1×1 stem + 2×2 cap, mixed heights, club-mixer palette), **rubber panel-seam
|
||
grooves** sectioning the channels, and **amber/green LED depth pips** at every fader-alley
|
||
floor. Speaker vents now glow.
|
||
- **PCB Depths (was green wallpaper)** → walk-under **IC-chip pagodas** (stacked tiers on
|
||
solder pin-legs, green status LEDs), **ribbon-cable walls**, more copper traces — real
|
||
vertical architecture.
|
||
- **Void-black slots** → amber depth pips in fader alleys and deck vent shafts.
|
||
|
||
**Verified (headless + live browser, before/after screenshots taken):**
|
||
```
|
||
✓ deterministic — two full builds byte-identical; every pre-existing zone unchanged
|
||
✓ additive only — steel_grey/pcb_green/glass/vinyl/alu counts identical to before
|
||
✓ anchors untouched — no LAYOUT/QUEST_POS moved; all 8 quest anchors still correct
|
||
✓ build 21–30 ms (« 800 ms budget); chunk count unchanged
|
||
✓ my files typecheck clean; demo validation all green; no console errors
|
||
```
|
||
Files touched: **only** `src/worldgen/buildBooth.ts` + `src/demo/worldgenDemo.ts`.
|
||
Merge point with the Workshop session: `buildBooth.ts` — but my edits (`buildMixer`,
|
||
`buildUnderTable`, vent loop) are disjoint from their Deck-A-pedestal dressing, so it
|
||
merges cleanly. Full detail in `src/worldgen/HANDOFF.md`.
|
||
|
||
**Two notes for you:**
|
||
1. The **rest of the Glow-Up brief** (atlas v2, selective bloom, decal/screen-print system,
|
||
record groove-sheen) is engine + fx work — not this lane. It still needs its session.
|
||
2. Shared-tree hiccup: global `tsc` briefly broke on the Workshop session's in-progress
|
||
`src/audio/testSignal.ts` (a `Float32Array` generic mismatch); cleared on their next
|
||
save. Flagging in case it resurfaces — it isn't mine.
|
||
|
||
---
|
||
|
||
## Phase 1 — the diorama (original build)
|
||
|
||
**Status: ✅ complete and verified.** Typecheck clean, demo renders with no console
|
||
errors, build deterministic and fully validated. Ready for Lane D to mount machines.
|
||
|
||
---
|
||
|
||
## 1. What shipped
|
||
|
||
| file | role |
|
||
|---|---|
|
||
| `src/worldgen/tools.ts` | voxel toolkit: `box`, `hollowBox`, `cylinderY`, `sphere`, `line3`, `spline` (Catmull-Rom), `mulberry32` PRNG, bounds-guarded `setVox`, duck-typed `fillBox` fast path |
|
||
| `src/worldgen/anchors.ts` | **single source of truth** for every LAYOUT-derived position (deck furniture, mixer face, patch-bay grid, under-table) — so no coordinate is written twice |
|
||
| `src/worldgen/questPositions.ts` | `QUEST_POS` — the Lane C→D contract: exact voxels for stylus/rca/crossfader/fuse/power |
|
||
| `src/worldgen/buildBooth.ts` | the build: `buildShell`, `buildDeckA/B`, `buildMixer`, `buildCableCanyon`, `buildPatchBay`, `buildUnderTable`, set-dressing; exports `SPAWN` |
|
||
| `src/worldgen/index.ts` | public barrel for integrators |
|
||
| `src/demo/worldgenDemo.ts` + `demo-worldgen.html` | standalone InstancedMesh visualizer, zone teleports, live validation panel |
|
||
| `src/worldgen/HANDOFF.md` | API surface + integration notes |
|
||
|
||
## 2. What the booth contains (DESIGN §4, all present + eyeballed)
|
||
|
||
- **Shell**: warm plywood console, `ply_edge` laminate caps, front lip, hinge plates,
|
||
tabletop with vent shafts behind each deck + a front-left crate hatch & stair.
|
||
- **Deck A / Deck B**: steel-grey plinths, rubber feet, brushed-alu top border, a
|
||
**recessed empty platter well** with chrome spindle stub, start/stop + 33/45 button
|
||
recesses, pitch-fader canyon with green centre-detent, tonearm base pedestal + empty
|
||
headshell socket, Technics strobe lamp. Deck B adds dust drifts + a half-open glass
|
||
dust cover.
|
||
- **Mixer Massif**: matte-black body, speaker-mesh climb vents, 4 channel strips
|
||
(silver/black knob-stem grids + **empty fader alleys**), the crossfader tram with the
|
||
dust-jam plug, two VU-meter towers (green→amber→red), power-switch recess, fuse chimney.
|
||
- **Cable Canyon**: 5 splined RCA/power cables draping to the patch bay, gold plug heads,
|
||
a power strip, and the quest cable ending short with a loose gold plug on the floor.
|
||
- **Patch Bay**: proud alu panel, 2×6 gold socket grid, the conspicuously **empty quest
|
||
socket** (red blink), two sockets that are real doorways into copper-busbar rooms.
|
||
- **PCB Depths**: green board floors, copper trace paths, capacitor pillars, solder
|
||
stalagmites, sparse LEDs, the fuse box (blown fuse), the parts bin (fresh-fuse + the
|
||
blue-spotlit stylus block), and the record crate of blue/black vinyl slabs on edge.
|
||
|
||
## 3. Verification (headless + in-demo + cross-lane, all green)
|
||
|
||
```
|
||
✓ build < 500ms (14ms mock / 30.7ms real VoxelWorld)
|
||
✓ deterministic — two runs byte-identical (seed 1210)
|
||
✓ 0 out-of-bounds writes
|
||
✓ deck A + deck B platter wells empty (left for Lane D's platter)
|
||
✓ spawn stands on solid steel with headroom, facing the mixer
|
||
✓ 8/8 quest anchor points reachable (adjacent air)
|
||
✓ fuse & stylus anchors land on the intended block (not a neighbour)
|
||
✓ record crate populated (regression-guarded)
|
||
~4.5M non-air voxels · 24.6% fill · 29/30 non-air block types used
|
||
```
|
||
|
||
Screenshotted the spawn deck, whole booth, PCB Depths, and the record crate — all read
|
||
clearly as the intended DJ-booth diorama.
|
||
|
||
**Adversarial review pass.** I ran a 5-dimension multi-agent review (12 agents, each
|
||
finding independently verified). It CONFIRMED 5 defects my first-pass validation missed —
|
||
all now fixed and re-verified:
|
||
- **[HIGH]** the record crate placed **zero** records (footprint had collapsed to ~2
|
||
voxels) → re-anchored, now a full row of blue/black vinyl on edge.
|
||
- **[MED]** `QUEST_POS.fuse.box` sat on the frame, one voxel off the fuse → now exact.
|
||
- **[MED]** VU-tower LEDs were sealed inside a closed casing → front face opened.
|
||
- **[LOW]** added the PCB "resistor beams" the brief lists.
|
||
- **[LOW]** the demo's "Record Crate" teleport aimed into the left wall → re-aimed.
|
||
(Two other raw findings were false positives — one described already-fixed code; a
|
||
doc-comment nit I tightened anyway.) I added regression guards for the crate and anchors.
|
||
|
||
**Cross-lane smoke test.** Since all five lanes have now landed, I ran `buildBooth`
|
||
against Lane A's **real** `VoxelWorld` (not my mock): the `fillBox` fast path engages
|
||
(Lane A's signature + inclusive semantics match my assumption exactly), 30.7 ms build,
|
||
and every acceptance check still passes. Lane C drops into the engine with zero friction.
|
||
|
||
## 4. Contract friction (needs an integrator/Fable call)
|
||
|
||
1. **Mixer height**: the brief says "tabletop → `topY`+40", but `constants.ts` + DESIGN
|
||
both define the mixer face plate top surface as `topY = 67`. I built to **67** (with a
|
||
raised rear ridge + VU towers for the "tallest mesa" look). Flag if a 107-tall mixer
|
||
was actually intended — it's a one-liner.
|
||
2. **`fillBox` signature**: `tools.box()` calls `world.fillBox(x0,y0,z0,x1,y1,z1,id)`
|
||
(inclusive) if Lane A provides it, else loops `setBlock`. `buildBooth` logs which path
|
||
ran. Lane A should match that signature (or we reconcile at integration; the loop is
|
||
always correct).
|
||
|
||
## 5. Handoff to Lane D (machines)
|
||
|
||
Lane D reads `QUEST_POS` + the exported anchors — **no re-hardcoding coordinates**. Every
|
||
moving part has a socket waiting: platter wells, tonearm pedestal + headshell anchor,
|
||
empty fader/crossfader slots, button/switch recesses. Anchor semantics are documented in
|
||
`src/worldgen/HANDOFF.md`.
|
||
|
||
## 6. Suggested next steps for Fable
|
||
|
||
- Greenlight (or correct) the **mixer-height** interpretation in §4.1.
|
||
- Confirm the **`fillBox` signature** with Lane A so the fast path engages at integration.
|
||
- Lane D can start now against `QUEST_POS` + anchors; nothing blocks it.
|
||
- (Optional polish later) chunkier cable cross-sections, a lower/hinged glass dust cover,
|
||
and more copper-trace detail in the PCB rooms.
|
||
|
||
## 7. Repo note
|
||
|
||
Work is in the shared working tree (`/Users/jing/TURNCRAFT`), not yet pushed. The fresh
|
||
remote `ssh://git@100.71.119.27:222/monster/TURNCRAFT.git` is empty and there's no local
|
||
git repo yet — I did **not** `git init`/push, since seeding a shared repo from one of five
|
||
parallel lanes is an orchestration decision (whole scaffold + all lanes) better made by
|
||
the integrator. Say the word and I'll initialize + push Lane C on a branch.
|