293a82c5e8
8 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
293a82c5e8 |
R42 THE LOOK: five lane-runs — the pub is dressed, the decks read, and the town is cast
John looked at R41's proof shots and named three faults. All three are fixed, at zero draw cost, and every lane corrected somebody's numbers on the way — including its own. E-LOOK (§42.1+§42.2a) — THE PREMISE WAS WRONG. "The pub props have no texture" (my brief, quoting E's own R41 note) is false: all 37 carry COLOR_0 and three.js renders it. The colour was BLEACHED — jukebox at saturation 0.02, 15 assets under 0.05; what the source library called colour was baked AO. So the fix was a palette imposed on colour already present, in place: 46 assets, draw delta +0 and tri delta +0 on every one, proved the honest way — the concatenated POSITION/NORMAL/TEXCOORD/index bytes are sha1-identical to R41, so footprints and origins provably did not move. (A first-pass bbox check ignored node rotations and "found" 3 phantom violations; thrown out for the byte comparison.) The banquette was 1990s office teal and went burgundy; the beer umbrella was white and went brewery green. THE DECK, diagnosed before being touched: 7 greys, chassis 0.05 luminance on a 0.033 bench = 1.21:1, and the one high-contrast feature was INSIDE-OUT (white ring around a dark disc; a turntable is a dark record on a light platter). Now Technics silver at 6.74:1, black vinyl, red start/stop. Node contract re-read from the shipped GLB: 4/4 + 1/1 PASS. Filed to R43, not fixed: deck_1200_rigged has NO PLINTH (bottom 43mm of 119mm lost to R41 join damage). E-CAST (§42.3) — 19 of 24 ship. Rejected: comical_luchador_01 (Mixamo Ch43, purple mask reading EL CHUPACABRA, identified from the file's own material name), a 3-heads-tall cartoon child, a robed wuxia elder, a WW2 infantryman — and dj_phrtt_01, AN UNCLOTHED BODY whose only texture is a bare-skin atlas, which was in the DEFAULT crowd and live on the depot. It is the R41 deny-list's failure class through a different door: an innocent name from another pipeline. Only rendering all 24 and LOOKING found it. Ruling 2 (prefer CC0) was REFUSED ON MEASUREMENT: Quaternius is 25 nodes / 23 joints and ZERO of 64 canonical tracks bind — it would have loaded silently and never animated. Replacements came from Mixamo's Ch## pool, filtered to the contract-clean 65-bone family (candidates ran 65..99 bones; named characters carry facial/hair bones). THE LICENCE GAP WAS UNREAD, NOT MISSING: every source FBX carries ApplicationVendor "Mixamo, Inc." internally. Adobe royalty-free, no attribution owed. B's amber rows are now real. B (§42.5) — MY ASSIGNED FIX WAS USELESS AND B PROVED IT. document.fonts.ready shipped, then measured: the atlas canvases are already byte-identical across boots, the game ships NO webfonts (document.fonts.size === 0), and ready fires 50ms BEFORE the first fillText. The real cause of unreproducible bookmarks is the wall-clock CROWD — 983 changed px of 921,600, ALL in the pedestrian band; 0 px with the crowd out. New DBG.freeze() takes stable bookmarks 2/5 -> 5/5. Also found: ?pop=0 boots 140 citizens (0 is falsy against the default). THE BENCH: D's filing correct on both counts. Front-vs-road 90.0deg -> 0.0deg, min=med=max over 60/60 instances; the streetlight arm now reaches 1.05m over the road where it reached 0.00. Both used a base yaw that pointed +Z down the street while their own comments claimed otherwise — the side term was already right, which is why it survived 41 rounds of reading. Also: on any box with CDN access 9 of 60 benches are the depot GLB, 90deg out from the house law — normalised at the geometry, once, at load. benchStops(plan) exported as one truth. C (§42.2b) — 122 vs 123 WAS THE CAMERA ASPECT, and nobody was wrong. Draw counts are post-frustum-cull and the sweep camera inherits the window aspect: 1.25->116, 1.60->122 (C's harness), 1.778->123 (F's), 2.37->124. Pinned MEASURE_ASPECT=16/9 with a 1.25 control. E's "keep the bench dark" advice was measured and declined with reason (deck-vs-bench was already 4.73:1, over threshold). "Reads as a black box" is a claim about pixels, so C measured pixels: near-black in the booth crop 57.5% -> 26.7%, distinct colours 228 -> 389. Bench rebuilt 3->7 boxes with an open record bay; headphones on the mixer; faceDoor aims booths at the player's entry — alignment within 45deg went 49% -> 92%. Two bugs found by looking: a fitting could be planted INSIDE A WALL (0.77m of a 0.86m half-depth in plaster), and every booth part sat 25mm sunk into its own worktop. D (§42.4) — five swaps IN PLACE at the same index (pickRig indexes these arrays and pedIndex is in the identity signature and the impostor atlas; removal would renumber the town). Identity signature pre- vs post-swap: 0 differing lines of 150 — who each citizen is did not move, only which body they wear. dj_phrtt_01 verified gone AT THE WIRE, not from source: a fresh default boot fetches 32 ped GLBs, none retired. THE CONTROL ARM FOUND A 41-ROUND-OLD BUG: the ped being RETIRED, comical_boy_01, binds only 3,132 of 3,460 tracks — six thumb bones lack the mixamorig prefix. It had been silently dropping six tracks per clip since it shipped. Testing the thing being thrown away found it. Imported B's benchStops mid-round: sitters now 0.0deg to the road, signatures byte-identical across the rewire. Corrected F's filing: the browse smoke was flaky-by-construction (a 16-25s race against a live sim), not deterministically red. F (§42.6) — qa.sh --strict 24 passed / 0 failed / 0 warn / 0 skipped. New Gate 11: period law (0/5 banned; CONTROL: R41's roster trips all five) and roster licence (24/24, 0 unverified; CONTROL: an amber row turns 20 red). r41_shots.py promoted warn -> strict. R41'S BYTE-HASH BAN IS REVERSED AND ITS STATED REASON WITHDRAWN AS WRONG. A gate may pin a hash under five in-run assertions (classic+flags boot, freeze().stillLive all-false, a second freeze removing 0 draws, settle until DBG.info() stops changing, hash with the dbg panel hidden): 5/5 bookmarks now pin to one sha256 over 3 fresh boots. Two findings got it there — the chunk streamer (a fixed settle is a bet on load) and the fps readout, which with everything else frozen was the last thing moving at 53-62 px. ?pop=0 fixed (Number.isFinite) — a no-op for 35 rounds. Three red flags_check gates fixed. Street: noon 282 · NIGHT 291/300 — the nine-draw margin INTACT, every R41 row reproducing to the digit. Interior at pinned 16:9: 123 @ dept/auto, margin 227. selfcheck 157,647/157,647, 0x5f76e76 unmoved. No tag — John's playtest rules the epoch. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
046668e5af |
feat(gig): club dancers play real dance clips, not procedural sway
loadPedFleet gains dance:!CLASSIC (mirrors the sit/look gate) → fleet.danceClips = 4 mesh-free mixamorig club dances (party/medium/drink/sway). _make picks one per dancer off a fresh gigdance seeded stream (zero impact on existing draws / the same-seed-same-crowd covenant), spawnRig plays it, and update() drops the fake bounce for real-clip dancers (procedural sway stays as the classic/noassets fallback). ?classic fetches nothing, byte-identical. Verified: default boot fetches all 4 dance GLBs (gated load runs), both modules parse + export clean, page boots. Same clips + _canon/_rotOnly/spawnRig proven animating in 90sDJsim (its crowd/rigs.js is this file ported). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
b3394027be |
feat(citizens): +5 trellis DJ bodies in the ped roster
Same 5 Mixamo-rigged DJ characters as 90sDJsim, converted FBX->skinned GLB + decimated to 4k tris (<=5k ped law) via MESHGOD scripts/fbx_to_ped.py — mixamorig: skeleton + skin preserved. Added to PED_NAMES (rigs.js). Shares the proven bind: identical _canon/_rotOnly + the same GLBs verified animating in 90sDJsim. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
640bdbb55d |
Lane E R28 (v5.1): Spike 1 — look.glb shipped; lean does not exist (ledger #1)
look.glb — DONE, published, verified. Looking_Around.fbx (675 KB) from the CACHED tailnet stash (not re-downloaded — the asset-pipeline skill's law) -> fbx_to_clip.py -> web/models/peds/look.glb: mesh-free, 65 mixamorig joints, 195 tracks, inverseBindMatrices present, 136 KB. Structurally identical to the sit.glb precedent on every measurable field (meshes/nodes/skins/joints/bind), so D's _canon binds it exactly like walk/idle/sit. Depot: published to digalot.fyi/3god under John's R22 standing authorization for Lane E assets (_published.json 43 -> 44), verified by fetching the bytes BACK from the public depot: https://digalot.fyi/3god/a/look.glb -> HTTP 200, 139,640 bytes, sha1 identical to local. -> D: it's ready. Gate it behind an opt the way rigs.js gates sit (loadPedFleet(base, { sit })) — a raw fetch would breach the ?classic=1 zero-fetch-delta covenant, same as sit.glb. `lean` DOES NOT EXIST — the spike's premise is half wrong. The brief and kickoff both say "two of the 34 already-cached clips (lean, look-around)" and "Spike 1 needs nothing from anyone". look-around is cached; lean is not, anywhere. Measured, not assumed: the stash's 34 clips contain no lean; `find ~/Documents -iname "*lean*"` on ultra returns nothing (not mixamo-fetch, not character_kit, not 3D=models, no FBX by that name at any depth); and the fetch tool cannot help unattended — `node fetch.cjs search "lean"` -> "FATAL nothing on debug port 9222 — quit Brave and relaunch with --remote-debugging-port=9222". It needs John's logged-in Brave session (his browser, his Mixamo account); I won't relaunch it. I did NOT substitute a lookalike. `Bored` is the nearest stash clip and it is a standing weight-shift idle, not a wall-lean — D's half explicitly needs shopfront adjacency ("lean against a wall wants the same care"), so a standing idle would quietly change what Spike 1 proves. Half a spike, honestly, beats a whole one that lies. -> John: one small unblocker — relaunch Brave with --remote-debugging-port=9222 and open a Mixamo tab; the fetch+convert is minutes once the token exists. Instrument LOD — D killed it and D's measurement is better than mine. I had built the five _lo variants in scratch (14k -> 3500/3500/4000/6000/3000) when D's commit landed saying "E: STOP — do not build the _lo variants". Nothing shipped; scratch discarded. D measured the rooms an LOD must fire in: max diagonal 15.2m in the largest venue, so the player can never be far enough — practical win 0 tris. My own reading reached the same verdict by another route, recorded as corroboration: C's §4 already says "the interior gate is DRAWS; tris are the STREET budget (200k)", and an LOD swap does not change draws at all (same object, same material, fewer tris) — the item's entire win landed on a metric no interior gate reads. Two independent measurements, one verdict. Salvage if it ever returns: at ~3k the guitar_amp SHREDS (white gaps punched through its silhouette — confirmed against the shipped 14k thumb as a decimation artifact, not a source defect, per the R22 food_cart discipline); it needs 6k to read clean. The other four were clean at 3-4k. -> A: your own file's comment now contradicts its code. Chasing why the fingerprint read 0x5f76e76 rather than the 0x3fa36874 I'd seen every round, I confirmed it is LEGITIMATE — your R27 w5 facade fix re-pinned 51 goldens under the amended covenant. But selfcheck.js:267 pins hash: 0x5f76e76 while selfcheck.js:301 still says "the synthetic golden above stays 0x3fa36874". Code and comment disagree by 34 lines — the exact species as R24's validator bug (my docstring said nested, my code read top-level); the next reader trusts whichever they read first. Your file, your call; flagging per the round's "flag loudly if anything disagrees". Gates: selfcheck ALL GREEN 156,352/156,352 · qa.sh --strict 6 passed / 0 failed. look.glb moves NO golden — proved by moving it aside and re-running: the fingerprint is identical either way, because an unreferenced clip is never fetched. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
b322c998db |
Lane E R16 (v3.1): the drummer's sit clip — sit.glb produced + published
Ledger #2 asset half (E produces, D wires). Fetched Adobe Mixamo Sitting_Idle.fbx (533KB) by scp from the tailnet source box, converted on-device via Blender (new pipeline/fbx_to_clip.py: import -> skinned GLB export -> pure-python mesh-strip) to web/models/peds/sit.glb (109KB, mesh-free, structurally identical to walk/idle: 66 nodes, 65 mixamorig bones, dangling skin, 195 channels). Verified: three.js loads + 195/195 tracks bind to peds + 0 NaN; Blender confirms seated (hips 0.955->0.299m, stature 1.276->0.758m) + eyes-on bone-dot render (docs/shots/laneE/sit_clip.png). Published to depot via tailnet under John's R13 auth (_published.json 38->39; benign non-procity_ drift note). Provenance: Adobe Mixamo royalty-free, same zone as the shipped walk/idle; LANE_E_NOTES v3.1 amendment marker. -> Lane D: sit.glb ready at web/models/peds/sit.glb (+ on depot); canon binds 195/195; seated confirmed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
447188a516 |
Lane E round 7 (E1): merge ped rigs to ONE draw each (gates roster flip)
Each of the 19 ped rigs carried 1-9 primitives / 1-3 materials (fleet 92 draws, ~116 at the 24-rig near cap). merge_ped.py (Blender) merges each to 1 primitive + 1 atlased material: join meshes -> pack material UVs into a non-overlapping atlas UV -> EMIT-bake base-colours into one 1024 atlas -> single material. Skinning + skeleton preserved (65 joints, walk/idle untouched, clips retarget unchanged). Fleet 92->19 draws (1/ped); near-cap 116->24 (79% cut). Verified in vendored GLTFLoader: all 19 load as SkinnedMesh + bind walk; man_suit poses byte-identical to original. Hands to Lane D (D1) for full validation + full-density numbers, then F flips the roster. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
518678d4e4 |
Lane E round 4 (E1): decimate 19 ped rigs 924k→46k tris (≤3k each) for gate 3
weld + meshopt simplify (--ratio 0.05 --error 0.12); skinning + skeleton preserved (65 joints intact), walk/idle clips untouched, silhouettes clean at street distance. Originals backed up to gitignored pipeline/.peds_orig/. Hands to Lane D (D2) for rig validation; Lane F re-measures gate 3 (~24-rig cap × ≤3k ≈ ≤67k fleet). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
9eb1acc61b |
Lane D (Citizens): deterministic LOD crowd — rigs/impostors/keepers + test page
Populate the town at city scale, on budget, deterministic per-citizen identity: - rigs.js — ported 90sDJsim rig stack: mixamorig canonicalisation so one shared walk clip drives all 19 peds, head-bone height-normalise, feet-plant, pooled near-tier actors with walk<->idle crossfade - impostor.js — 4-yaw sprite-atlas baker + instanced billboards: whole mid crowd in 1 draw call, tone-matched to the ACES near rigs - sim.js — deterministic roster, footpath lanes off the street graph, near/mid/far LOD with hysteresis + hard 24-cap, staggered mixer budget, time-of-day density - placeholder.js — seeded low-poly box humanoids (frame-one population + ?noassets) - keepers.js — one keeper per shop at the counter, idle + greet-turn - 21 ped GLBs (byte-identical from 90sDJsim), citizens_test.html harness, LANE_D_NOTES.md, 5 beauty shots Verified in-browser: 200 citizens at max mixer 0.2ms (budget 2ms), near capped 24, determinism holds (200 identities match seed), no T-pose, ?noassets crash-free. Consumes Lane A plan.streets with zero adapter. Six adversarial-review bugs fixed (non-deterministic fleet order, shared-resource disposal on pool eviction, impostor colour-management). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |