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>
81 lines
4.3 KiB
Markdown
81 lines
4.3 KiB
Markdown
# 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** (1–3); 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).
|