TURNCRAFT/docs/LANE_D_update.md
jing 74482e5693 Glow-up review fix: concentric groove caps on record tiers
Fresh-eyes review of the glow-up found the G5 side-ring texture applied to
whole tier cylinders - linear UVs on the caps rendered as diagonal stripes
across the disc. CylinderGeometry takes [side, top, bottom] materials: sides
keep Lane E's ring texture, caps get a new radial recordCapGrooveTexture()
(machines/util.ts) with ring count scaled per tier radius so groove pitch
stays constant. Also lands the three handoff-doc updates from the phase.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 22:48:32 +10:00

81 lines
4.3 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 D — Update for Fable
## This phase: The Headshell Workshop ✅
Of the two briefs, **WORKSHOP_CARTRIDGE is Lane D's** (stylus node, tonearm,
interaction, quest). GLOWUP_ART is Lane A/C (atlas, bloom, decals, mixer density,
PCB pagodas) — untouched by me, and I deliberately kept out of
`worldgen/buildBooth.ts` so that lane keeps the file conflict-free.
**Status: complete, implemented exactly as briefed, verified live (incl. two-tab
sync and a relay fuzz). `npm run typecheck` clean, zero console errors.**
Full wiring + contract additions: [INTEGRATION_NOTES.md](./INTEGRATION_NOTES.md)
§ "Headshell Workshop".
### What landed
New `src/machines/workshop/**` — one `Workshop` machine (on `machines.workshop`)
owning the visible/collidable assembly arm. The real `Tonearm` sits in **service
mode** until `stylus` is repaired, then takes back over (cue/track/return).
| Stage | Mechanic |
|---|---|
| 1 Seat | Parts-bin chrome pickup = the cartridge. Seats **rotated wrong** (13); E cycles it square — the needle tip glints when correct. |
| 2 Wires | Pick a tag-wire off the loom → it trails as a **catenary** from your hand; **hold E 1.2 s** to crimp onto a stubborn pin. Any wire fits any pin; a 4-LED **continuity lamp** tells the truth. Carrying halves your jump; Q or walking >30 voxels returns it. |
| 3 Screws | **Hold E** to torque (2.5 s, radial HUD meter), **Shift+hold E** backs off. Uneven → the cart visibly tilts → azimuth error. |
| 4 Balance | Cue lever lifts the arm into a **live seesaw you stand on**; shove the counterweight (fader-style walk-push, 11 notches). Bubble level centres at 7; 8 = 2 g. |
| 5 Drop | Cue again → test signal. Every mistake you left in is **heard** and drawn as a glyph on the scope block. All clean → `quest.repair('stylus')` and the arm becomes the normal tonearm. |
Nothing hard-fails: a bad test drops you back to `clip` with every stage
revisitable. All state syncs, so **two players can split the job**.
### Verified live (not just typecheck)
- **Happy path** through the real press/hold/cue API → repairs `stylus`, tonearm
restored, quest 1/5.
- **All fault modes** classify + announce: skate, swapLR, phaseCancel,
azimuthTilt, trackingLight, trackingHeavy, plus `incomplete` for a wire left
off. Combined faults surface together. A failed test never repairs.
- **Seesaw (the risky one)**: standing on the beam while sweeping the notch —
player motion ≤ **0.075 voxels/tick**, zero drift, finite, at **33 and
stopped**. No slingshot. (Lane B's min-penetration resolution handles it.)
- **Two tabs**: A crimped wires while B torqued screws → converged both ways; a
third late joiner got the **completed pose**.
- **Relay fuzz**: 17 malformed shapes dropped, state uncorrupted, no crash; valid
messages still accepted.
### Two things worth your call
1. **`trackingHeavy` platter sag** — the brief wants the platter to visibly drag
15%. I shipped the audio lowpass only: a visible sag needs a method on
`Platter`, and `platter.ts` isn't in this brief's sanctioned edit list. Say the
word and it's a 5-line additive method.
2. **Relay last-write-wins has no re-sync.** A dropped message (e.g. the 40 msg/s
cap during a burst) leaves clients diverged until the next change. Real pacing
is ~8/s so it doesn't bite, and it's inherent to the existing edit/platter
design too — but a periodic state heartbeat would close it if you want it
airtight.
### Notes on the other briefs / backlog
- The **Glow-Up** brief is not mine, but it and this one are disjoint by design —
I render all workshop meshes myself, so no `buildBooth.ts` contention.
- Of your backlog, **emotes** and the **booth-reset ritual** are Lane D-shaped
(machines/interaction/quest). The reset ritual is a nice inverse of this work:
mining the fuse back out would need `Quest` to support un-repair + a
`signal:break` event — happy to brief/build it.
---
### Repo state
The workshop code is already committed on `main` (`9c668d3`). My only uncommitted
changes are docs: this file and the INTEGRATION_NOTES verification section — I
haven't pushed to `ssh://git@100.71.119.27:222/monster/TURNCRAFT.git`, since the
booth is shared and live and anything I push syncs to everyone. Say go and I'll
push.
Local test artifacts cleaned up (relay + dev server stopped,
`server/booth-state.json` removed).