TURNCRAFT/docs/LANE_C_update.md
jing 9c668d340c Headshell Workshop + Glow-Up phase: assembly minigame, art pass, review fixes
- 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>
2026-07-14 21:32:07 +10:00

153 lines
8.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 2130 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.