diff --git a/THREADS.md b/THREADS.md index 1803f6f..2340de4 100644 --- a/THREADS.md +++ b/THREADS.md @@ -825,6 +825,36 @@ Format: `[lane letter] YYYY-MM-DD โ€” note` `pickup_anchor` empty, read that, else the table top is fine. That plus B's three lines above and the ยง7 scenario is hand-playable. +[A] 2026-07-17 โ€” ๐Ÿšฉ **GATE 1 (Sprint 3) โ€” `world.shedTable` IS LIVE. LANE D: GO.** On main. Lane E's + `shed_01_v1.glb` + `shed_table_v1.glb` are dressed into the yard on the east side, and the pickup + point is **`world.shedTable.pos` = (9.00, 0.909, 6.00)** โ€” read from E's baked `pickup_anchor`, which + sat 5 cm off my guess at where a table top is, so it was worth reading rather than assuming. Your + 1.5 m radius off it is unchanged, and `spare_table` now registers in `wireYardActions`. + **Verified by hand, not by a registration check** (SHADES.step, no rAF): walk up โ†’ hold E โ†’ `carrying` + goes `null` โ†’ `"spare"`. A second hold reports "hands full" and deals nothing. Leaning on the table + with E held for 6 s deals exactly ONE spare โ€” your latch works. Nothing fires from across the yard. + Selftest **169/0/0**. + +[A] 2026-07-17 โ€” ๐Ÿ”ง **Gotcha for anyone hand-driving the player โ€” it nearly cost me a false bug report.** + `KeyboardInput.holding` is a **getter with no setter** (`get holding() { return this.keys.has('KeyE') }`). + Assigning `player.keyboard.holding = true` from a console probe silently does nothing, the pickup + never fires, and it looks exactly like a broken interact wiring โ€” I was about to report the spare + pickup as still-blocked when the target list was already correct. Fake the key at the source instead: + ```js + s.player.keyboard.keys.add('KeyE'); // hold + s.player.keyboard.keys.delete('KeyE'); // release + ``` + Same for movement (`KeyW`/`ShiftLeft`) and brace (`KeyC`). Not asking for a change โ€” the getter is + right, my probe was wrong. Lane D, this is worth knowing for your on-record ยง7 run. + +[A] 2026-07-17 โ€” ๐Ÿ“ `createWorld()` stays **synchronous** and yard dressing moved to a new **`await + world.dress()`**, called by main.js right after construction. Reason: a.test.js and selftest.html + build a yard with no server, so a fetch in the constructor is either a break or a flake. Anything of + mine you need at wiring time (like `shedTable.pos`) is published from constants at construction and + only *refined* by dress(), never created by it โ€” and dress() mutates that vector rather than + reassigning it, so `pos:` references captured by `interact.register` stay live. Each GLB load is + guarded on its own: a missing asset leaves its graybox standing rather than taking boot down. + [I] 2026-07-17 โ€” **SPRINT 2 INTEGRATION (main).** Lanes b/c/d/e merged (keep-both THREADS). Wired B's 4th arg in main.js (`rig.step(dt, wind, windT, debris)` โ€” crates no longer fly through cloth). **The Bโ†”C downdraft dispute is real and data-only cannot settle it:** measured at merge โ€” gust-only