110 fittings placed across 12 shop types via new kit41.js (96-row catalogue, 67 ids in pools) and ONE generic kitProp builder; recipes name pools, never asset ids. glb.js now honours seeded per-fitting variants, multi-GLB booths, and a MEASURED autoYaw instead of a 110-row facing table. THE INSTRUMENT WAS WRONG. drawSweep cleared every interior EXCEPT current, so every historical interior number carried a phantom second room — 'toy', untouched this round, 'gained' 4 draws. R39/R40's celebrated 'worst 188, margin 162' was inflated. Corrected, and with 110 new fittings placed: worst room in the game is 122 @ dept/auto, MARGIN 228. Per type: record 61->78, pub 45->59, band_room 39->50, stall 71->82, book 51->61, pawn 60->70, video 54->63, rsl 52->60, dept 116->122, opshop 102->105, milkbar 68->69, toy 86->86 (+0, the control). The pub finally has a bar (plywood_bar), banquettes, pokies, a stage flank. Milk bars get a bain-marie and pie warmer. The pawn shop gets an 808 and an SP-1200 on the bench. Record shops get a rigged DJ booth. Market stalls get 2-4 diggable bins each, closing R39's measured 44%-no-crate hole to 0/40. WARDROBE, route R5: 257.5 KB total (246 KB atlas + 17 KB index), ONE fetch, one material, one draw per fitting — 52 layers picked BY NAME, alpha-cropped, shelf-packed, 3.7% of source bytes, lazy behind ?stock=real. LICENCE CALL MADE EXPLICITLY: AUDIT.md says no real brands ship and the source library is prompted FROM real labels — the adidas jacket renders a legible trefoil. Screened on a contact sheet, then relabelled in parody voice (Paddy's Bootleg, Kaymart, Coogee Knits, Mombo, Stoosh). FIVE DEFECTS FOUND AND FIXED, one long-standing: buyMesh has been INVISIBLE on every GLB fitting since R9 (hiding every buyable item under ?stock=real) · DJ booths were nondeterministic (parts attached in network order) · booth gear floated at 0.92 m · batch.js dropped userData sub-tags on merge, so any post-batch flag read was already a no-op · the path guarantee could empty a room (pub/wide/4242 returned a bar, a stage and nothing else) — new restore pass, 129 pulled -> 101 restored over 480 rooms, path re-proved on every restore. Gates: 288-room sweep x 4 arms all pass; soak 60 rooms avg 3.83 ms worst 10.3 ms, leaks 0; 960-room corpus 0 path-fails 0 carves; determinism byte-equal across fresh contexts (sha256 c26b4848); ?noassets=1 60 rooms with 0 GLB / 0 manifest / 0 wardrobe / 0 stock fetches. DJ control nodes recorded on fitting.controlNodes for a future driver (glTF drops the limit constraints — a driver must clamp travel itself). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| before | ||
| laneA | ||
| laneB | ||
| laneB_r4 | ||
| laneB_r37_kerb | ||
| laneB_r38 | ||
| laneB_r39 | ||
| laneB_r40 | ||
| laneB_r41 | ||
| laneC | ||
| laneD | ||
| laneE | ||
| laneF | ||
| laneF_r39 | ||
| laneF_r40 | ||
| references | ||
| release_v3 | ||
| release_v3_1 | ||
| release_v4 | ||
| release_v5 | ||
| v1_tour | ||
| v2_tour | ||
| v4_alpha | ||
| v4_beta | ||
| v7_alpha | ||
| v7_beta | ||
| v7_tour | ||
| contact.html | ||
| README.md | ||
| v2_contact.html | ||
docs/shots — visual regression + devlog reference tree
Owned by Lane F (each lane also drops its own acceptance screenshots here).
docs/shots/
laneA/ … laneE/ … per-lane acceptance screenshots (each lane owns its dir)
v1_tour/ … F: the v1 beauty shots (tools/shots.py) — frozen devlog set
v2_tour/ … F: the v2 tour (tools/v2_tour.py) — the CURRENT canonical set (see below)
before/ … F: last known-good capture, for side-by-side regression
references/ … real-world reference photos named per shot
v2_contact.html … generated contact sheet for the v2 tour
v2 tour — stable filenames (do not rename; the v3 site links these)
cd web && python3 -m http.server 8130 then tools/.venv/bin/python tools/v2_tour.py
→ 1280×720 PNGs in v2_tour/ + docs/shots/v2_contact.html.
| file | what it documents |
|---|---|
street_noon.png |
main strip at midday |
crossroads_busy.png |
busiest intersection, peds about |
shopfront_detail.png |
verandah + sign + window up close |
patronage_door.png |
streamed peds at an open shop's door (Lane D patronage) |
rain_verandah.png |
rain outside a lit ?winmap video-shop window |
rain_street.png |
wet strip, rain down the street |
tram_stop.png |
the v2 tram paused at a shelter (?tram=1) |
night_crowd.png |
VIDEO REGAL glowing amid CLOSED neighbours at night — the §3.5 hours story (clean-night boot). NB: no visible street crowd — see the note below. |
browsers.png |
an occupied shop's interior life — a browser at the rack + the keeper at the counter, both human-sized (R10 giant-rig fix). figures human-sized vs door/fittings: yes. |
dig_real.png |
riffling a real-cover record bin (?dig=1&stock=real) |
katoomba_main.png |
plan-agnostic main strip (?plansrc=osm&town=katoomba) |
Note on night_crowd (Lane F, R10)
Re-framed to the tighter, readable "one lit shop in a closed town" composition. It does not show a
standing street crowd, and that is not a framing bug: Lane D's night patronage parks ducked-in patrons
hidden inside the shop (they become the interior browsers seen in browsers.png), and seed 20261990's
video shop sits on a low-traffic corner, so none gather visibly outside (tested: 0 patronage / 0 visible
at night). The town's night life is the interior presence + the neon-vs-CLOSED mood. A visible outdoor
night queue would need a new Lane-D mechanic (loiter-outside-the-openLate-shop) — parked for v3. The
~20 fps in night captures is a headless-chromium software-GL artifact (the scene is light, ~128
draws / 65k tris); on real hardware the night scene is not a perf concern.
Regression workflow
Before a risky change, snapshot the good state into before/, then re-run v2_tour.py and eyeball
v2_contact.html. Process rule (R10): any shot containing a humanoid gets an explicit
"figures human-sized relative to doors/fittings: yes" line in the progress note — actually look.