Commit Graph

253 Commits

Author SHA1 Message Date
m3ultra
422f17263e Lane C R41 §41.4: the shops get their stock — and the measuring instrument was wrong
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>
2026-08-07 18:11:07 +10:00
m3ultra
48033f48b1 Lane B R41 §41.5: the credits surface — and the game had never shown the OSM attribution it owes
THE CREDITS SURFACE. New web/assets/credits.json (schema procity-credits/1, the data file
every lane appends to — documented in LANE_B_NOTES §41 with a paste-ready row) + credits.js
(the panel, DOM only) + a HUD link. F2 or the link. Zero draws, zero boot fetches (0 before
open, exactly 1 after), zero fetches under ?noassets=1.

Seeding it found a LIVE OBLIGATION the game has never displayed: the 23 real-town caches are
OpenStreetMap data under ODbL 1.0, whose own source note says keep the credit visible. It now
rides the link and is context-aware — on an OSM boot the HUD reads '(c) OpenStreetMap
contributors · credits (F2)'; on the synthetic town, where no OSM data is on screen, it does
not claim it. three.js r175 MIT credited too. 14 entries seeded, all read off the repo.

Field law: licence 'unverified' is legal and a guess is not. Two gaps filed to E as amber
rather than invented: the 19-GLB base ped roster has NO per-asset licence record anywhere in
this repo (and CITY_SPEC's declared zone includes CC-BY and CGTrader RF — a credit may be
owed today), and the 18 house-library fittings still carry AUDIT.md's 38-round-old blanket
caveat despite shipping since R3.

A's D3 CLOSED. Re-measured over the shipped corpus at the golden seed: 27 towns, 1,838 shops,
81 venue lots, 81 of 81 taking the op-shop signage fallback — exactly 3 per town, in every
town. A's number reproduces to the digit. Bite drifted :344 -> :465 -> :483, hence a named
resolver: signStyleFor() tries B's nine palettes, then A's registry (gilt/stencil/club,
carried since R13), then op-shop as genuine last resort. Venue treatment is venue-gated by
construction. Deliberately NOT done: repainting the other nine types onto A's palettes
(record would go muted-teal -> hot-pink neon) — an art call for John, filed.

RULING 4 RESPECTED, NOTHING SPENT: frozen town, 136 station-yaw samples per arm, 544/544
identical on BOTH counters (draws and tris), 0 console errors. Pin method reproduces R40
exactly — default 282 noon / 291 NIGHT, classic 269 byte-exact. The nine-draw night margin
is intact. Classic purity: HUD DOM 2354:8 both arms, fetch surface identical, no
#pc-creditlink / overlay / F2 listener / PROCITY.credits.

Filed to F: three classic bookmarks are not byte-reproducible across boots even at HEAD
(2/5 HEAD-vs-HEAD) — a font race in the sign atlas. A screenshot golden on those cannot be
a byte-hash.

selfcheck ALL GREEN 157,647/157,647, fingerprint 0x5f76e76 unmoved.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 18:10:39 +10:00
m3ultra
8ad446a48a Lane E R41 (§41.1+§41.2): 46 clips and 110 fittings — and every handover number was the wrong unit
MOTION (§41.1). The clip library goes 8 -> 46: ten idles, eight browse, eight sit/lean,
eight social, six locomotion, six venue, in SIX grouped GLBs (one fetch each), 3.35 MB —
LESS than the 4.29 MB the old eight cost, via lossless dedup + int16 rotations (worst
error 0.0034 deg). All six verified skeleton-only (tris 0, meshes 0, nodes 66): ZERO DRAW,
which is what makes this round affordable. No retarget was run and none was wanted — the
bank and the peds are the same mixamorig skeleton, so retargeting would add error AND bake
the ped mesh into the clip, ending zero-draw. MIRPAMO 'make smoke' green to prove the tool,
then deliberately unused. Three seeds in the brief were duds and got substituted: the whole
*_Degree_Turn set is RIFLE-AIMING, and two 'examine' clips are 262 KB static poses, not
motion. R16 flat-body trap re-checked on all 46 (spine tilt 24 samples/clip, 0 frames >75
deg); turn_in_place auto-demoted from loopable on a 36.7 deg seam.

RULING 1 — the Bandai hazard, closed non-destructively and better than specified. 3,077 CC
BY-NC clips sat unzoned in a neutrally-named path. Renamed PER FILE (3,077/3,077) not just
the directory, because mirpamo names output <rig>@<clip>.glb — the _NC-research marker now
PROPAGATES into any retargeted GLB automatically. Nothing deleted; ultra's red/bandai
re-verified as canonical. Ledger corrected: the manifest claimed CC-BY-NC-ND, the bundled
licence text says CC BY-NC, no ND.

PROPS (§41.2). 110 assets from three libraries, published, sha1-verified, 0 validator errors
both modes. THE FINDING: every handover number was a TRIANGLE count, and triangles were
never the binding constraint — DRAW CALLS were. As handed over this cargo cost 14,140 draws
against a 162-draw margin; it ships at 117. '3dstore passes as-is' was true on tris/metres/
Draco/textures and FALSE on draws — 30 of 46 files carried up to 16 materials on one mesh
(one per record sleeve), so a 1,020-tri tub cost 16 draws; baked to COLOR_0, 288 -> 40, zero
tri drift, A/B identical. dj-gear's own manifest claimed median 6,288 tris / 18 under budget;
measured 51,528 and 12, with draws to 2,145. Pub props were NOT metre-correct (every source
unit-normalised to max dim 1.00 m) and 40x decimation was impossible as specified (loungeChair
is 94% non-manifold).

Ruling 5 vs the draw budget was a real conflict (one mixer = 4.6x a whole room); resolved by
joining SCENERY selectively while every control node keeps its object/name/pivot — verified
by parsing the SHIPPED GLB, not the tool that wrote it: PASS 4 / STATIC 10 / N/A 17 / FAIL 0.
deck_1200_rigged = 5 draws with Platter_SPIN, Arm_YAW, Fader_PITCH, Btn_STARTSTOP intact.

The R40 four-surface transmission gate FIRED ON LIVE CARGO: 5 genuinely transmissive
materials (cartridge dust-covers, a mixer meter window) that would each have doubled every
opaque draw in the room. 9 assets rejected on eyeball after decimation rather than shipping
mush. Two existing-tooling bugs fixed: normalize.py's yaw/up were silent no-ops (the jukebox
exported 0.40 m instead of 0.97 m), and footprints now measure the shipped GLB.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 18:10:12 +10:00
m3ultra
f2ffe00ad3 Fable (integrator): ROUND 41 OPEN — THE LIBRARY LANDS
Surveyed the fleet's asset libraries at John's ask. The finding that defines the round:
PROCITY ships EIGHT animation clips; ultra's MOTIONLIB green zone holds 6,866 licence-clean
ones, MIRPAMO is a working local retargeter, and the skeletons match 1:1 (66 mixamorig nodes
both sides). The Mixamo bank alone: 237 idle variants, 270 walks, 140 sits, 163 greets,
113 dances, 112 push/pull/pick/reach. Every non-walking citizen in the game plays the same idle.
Plus 45 record-shop fittings that pass the house law untouched, 60 DJ-gear GLBs (45 control-
rigged), 48 pub props needing 40x decimation, and 441 hand-prompted 1990-99 Australian
garment PNGs from wardrobegod.

Six binding rulings. The first is a safety one: 3,077 CC BY-NC (never-shippable) Bandai clips
sit on m3ultra in a neutrally-named path outside the red/ zone system - one mirpamo batch away
from a shipped build. E-motion zones them BEFORE any retarget. R41 clips are Mixamo-only (no
attribution debt); a deny-list (nsfw bodies, IP rips, unread vendor packs) enters repo law;
the street budget is spent at 291/300 so every asset lands interior or zero-draw; never run
gltf-transform optimize on the DJ gear (it deletes the Fader_CROSS node contract); clips ship
grouped in <=6 GLBs, not 40 files.

Ledger: E-motion 40-48 retargeted clips + motion_manifest; E-props 3dstore/dj-gear/pub props
normalized + published; D per-citizen deterministic idles + a real BROWSE state + sit/lean;
C the fittings into 12 shop types + wardrobe PNGs as op-shop rack art; B the credits surface
(unlocks 4,472 CC-BY clips for R42) + A's filed D3 venue signage; F gates, proof shots, close.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 12:41:56 +10:00
m3ultra
c3384b92c9 Lane F R40 §40.6: the notepad — F8, the tour, and the gate that caught the harness
THE PLAYTEST HARNESS, for John's bug-hunt session. F8 anywhere drops a structured note:
pos, mode, shop id+name when inside, street/locality via A's address layer, seed, town,
clock segment, live flags, fps, draws — plus a screenshot and a typed one-liner (Esc
cancels, Enter saves). Notes persist under the delta law (bounded, survive reload,
export/import, corrupt store REJECTED WHOLE and loudly) and export as one JSON of
tickets, schema documented in LANE_F_NOTES §40. Zero cost when unused; classic-gated by
construction.

?bugtour=1 walks the whole game in 11 stops (N advances, each with a caption of what to
look at): spawn → street_day → shop_buy → dig → opshop_bin (caption says the contents
are deliberately unarmed) → gig_night → tram → rain → night → fog_map → second_town.
DBG loads without ?dbg=1 so the tour is one flag.

THE GATE CAUGHT THE HARNESS. The first full strict run went RED on exactly one arm —
R30c classic purity, because the playtest constructor read localStorage eagerly on
?game=0. Fixed (lazy store), re-verified on the targeted smoke, and the new gate now
carries its own instrumented zero-calls arm so it cannot recur.

Wave-1 asks, all taken: D's door_footpath_check and B's r40_lane_b wired into qa.sh ·
D's index.html:433-437 door nudge now derives from buildShopfront's doorRect · A's
filed D2 closed (index.html:541 uses the canonical isOpen; remaining divergent call
sites listed for their owners) · README's stale ?r=N 307 row and the flags_check label
that still called the town selector a debt question, both corrected.

qa.sh --strict: 12 passed · 0 failed · 0 warn · 0 skipped. selfcheck 157,647/157,647,
0x5f76e76 unmoved.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 12:29:02 +10:00
m3ultra
cf6ac64d75 Lane E R40 §40.1+§40.4: the gate now watches every door the glass could walk through
§40.1 — the R39 blind spot, closed with both arms fired. Before: check_transmission()
parsed pipeline/_normalized/<file> only and returned SILENTLY when absent — so a
depot-only transmissive GLB (the longbench/streetlight shape) or a stale glass copy in
web/assets/models/ (what ?localdepot=1 actually serves) shipped unseen. After: all four
surfaces scanned — _normalized/ always, web/assets/models/ always, the DEPOT copy via
ranged GET of the GLB JSON chunk whenever no local file exists (206-aware, slices the
tailnet's 200-full), plus a sweep of every non-manifest .glb in both dirs (ped rigs and
dance clips load by literal path). A depot fetch failure is a LOUD warn, never a skip.

Controls demonstrated, not asserted:
  arm 1 (served path): glass box_crate planted in web/assets/models/ only →
    R39 gate rc 0 (the blind spot, live) · R40 gate rc 1 · fixture removed → rc 0
  arm 2 (depot path): both local copies held aside, local mock depot serving glass →
    rc 1 (depot copy) · clean bytes → rc 0 · REAL tailnet depot, local absent →
    rc 0 / 0 warnings (production fetch path proven)
Nothing was ever published to the real depot namespace; sha1 6c327d86 restored both
copies; final validator on the real tree rc 0, 0 errors, 0 warnings, 39 manifest GLBs
+ 40 swept.

§40.4 — the arcade is a PLACEMENT rule, not an asset. Measured: one 42.00 × 5m arcade
edge, posts at d/2+2.2-0.2 = ±0.50m from the centreline — two rows 1.00m apart, 34
colliderless posts, 0.60m open slot. The kit designed as one thing: the roof spans
(depth 2.5 = half-lane, slabs meet flush) and a spanned roof has no posts. Proved
without touching B's tree — rule applied in-flight by a rewriting no-store server,
shot from inside the lane: draws 124→124 (+0), tris unchanged. Rule handed to B with
file:line; B applied it this round.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 12:28:43 +10:00
m3ultra
3e1ff312a5 Lane D R40 §40.5: the peds come in the front door — 100% on every real town
Verification first, and B's R39 heading fix did NOT clear the gate alone. Measured today
(tools/qa/door_footpath_check.mjs, new): synthetic 447/493 foot (90.7%) · katoomba 71/72 ·
fitzroy 138/139 · bowral 28/30 (93.3%) — from R39's 0/493, 0/72, 0/139, 0/30.

Two residue species, handled differently ON PURPOSE:
1. A 0.85m kerb miss on real towns — plan_osm's setback puts the facade past the corridor
   edge, so the shell's d/2+0.6 door point lands just off the verge. Fixed by new D-owned
   door_snap.js, applied in sim.setShops: clamps each door into the registry vergeBand of
   its nearest footpath-bearing edge, 6m cap. Corpus: fixes 4, breaks 0. Live-shell verified
   (493 points, 2 moved, max 5.41m — matches node exactly). Real towns now 72/72, 139/139, 30/30.
2. The synthetic's 36 strict misses are market stalls and arcade shops WHOSE FRONT IS THE
   MARKET SQUARE. An uncapped snap would 'pass' them by teleporting a door 59.85m to a street
   they do not front — passing the gate by breaking the truth it measures. The gate instead
   scores walkable front ground (footpath ∪ market/arcade block ground) = 473/493 (95.9%) and
   reports the strict number alongside.

The check ships its own falsifiability CONTROL (the R8-R39 back point must score under the
floor: reads 0.4-13.3%) and a fix-only arm (clamp breaks 0, asserted forever). Deterministic.
Remaining 20 synthetic misses are artefacts of the fixed nudge at index.html:433-437 — not
D's file; measured, exact fix documented for F. Goldens untouched.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 12:28:25 +10:00
m3ultra
066cc1775b Lane B R40 §40.3 (+E's §40.4 rule): the 307 was fiction, the town speaks its street names
THE ?r=3 BREACH — the carried number was stale by 84 draws. Re-measured with the pin
method of record (stepwalk 2m, 802 stations, fresh headless contexts, no-store server):
default 282/291 (≤300, 9 margin at night) · classic 269 byte-exact to the R38 pin incl.
90,580 tris · ?r=3 382/391, NOT 307. Decision: GATE, not shave — the 91-draw excess is
the R+1 live-chunk window (48 vs 31 chunks) on a per-chunk cost already collapsed to
~1 draw/kind/chunk, so shaving it means cutting default-boot content to legalise a
diagnostic. ?r= above auto now declares PROCITY.budget {draws:420, diagnostic:true} and
console-warns its own law; HUD threshold + DBG.info().budget read it; new
tools/qa/r40_lane_b.py enforces it (386 ≤ 420, and >300 so the exemption is provably
load-bearing).

?classic=1 TOWN SELECTOR (Fable ruled): true by construction, now deliberate and
qa-asserted — 27 options, one fetch (the named POST_V2_EXCEPTION), picks stay classic,
zero draws, 0 errors.

FOG SIGNAGE: three silent surfaces consume A's address layer via new
createStreetLocator(plan) — HUD street row, door tooltip ('Little Paris Cafe ·
Katoomba Street'), fog-map caption. Never branches on town type; classic-gated by
construction (#pc-street absent, tooltip pre-R40-byte).

E's arcade rule applied verbatim (§40.4): roof spans, a spanned roof has no posts;
district.kind keying, explicit ARCADEKIT classic gate + ?arcadekit=0 control.
-34 post instances exactly, lane draws 120→120 (+0). Shot pair vs E's reference.

Goldens 157,647/157,647, 0x5f76e76 unmoved after every wave.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 12:28:08 +10:00
m3ultra
dab5ecd273 Lane A R40 §40.2: D1-D4 settled — the poster that stood in the road, and no silent carry
D4 CLOSED with a fix: 8/108 gig plans placed a spine poster inside a NON-nearest edge's
carriageway (worst 1.78m inside a main, northbridge seed 42, behind a kerbless arcade at
1.45m) — the exact filing, reproduced before touching anything. gigs.js onCarriageway now
tests inside-ANY-edge; selfcheck's poster arm asserts minimum clearance over ALL edges.
After: 0/108. Poster counts 0 diffs across all 108 plans; synthetic byte-identical.
The 7 REAL_TOWN_GIG_GOLDENS re-pinned (D4 explicitly required it; old hashes in comments).

D1 A-side CLOSED: chunkIndexByCoverage is canonical (chunkIndex kept as verified alias);
the naive swap would multi-build 258/681 lots — measured, documented in CITY_SPEC.
D2 RE-FILED to F (isOpen still 0 importers; divergent predicate at index.html:541).
D3 RE-FILED to B (SHOP_REGISTRY missing pub/band_room/rsl; 81 venue lots wear op-shop
signage; bite drifted to buildings.js:465). Both re-filings carry numbers and a reason.

selfcheck ALL GREEN 157,647/157,647; fingerprint 0x5f76e76 and GIG_GOLDEN frozen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 12:27:51 +10:00
m3ultra
97b98b15af Fable (integrator): ROUND 40 OPEN — the no-rulings round, and the harness for John's playthrough
John: 'just keep building — big bugtest playthru feedback sesh later.' R40 spends the
filed R39 debts that need no decision: E closes the transmission gate's demonstrated
blind spot (scan every loadable path, both control arms), A closes or re-files D1-D4
with numbers, B settles the ?r=3 307 breach and gives ?classic=1 the town selector
(ruled), E re-designs the arcade posts WITH the roof, D verification-first on the
0-door-points-on-footpaths finding. Keystone 40.6: F builds the playtest harness -
F8 drops a note (pos/shop/street/seed/clock/flags/fps/draws + screenshot + one-liner),
delta-law persistence, one-JSON export, and ?bugtour=1 strings the bookmarks into a
guided walk covering every system. The parked three (bin contents, fog default, v9
third layer) plus the audio listen pass become tickets the moment John plays. No tag
this round.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 23:41:23 +10:00
m3ultra
9054c77b2d Fable (integrator): ROUND 39 CLOSED — v9 is open. The town knows its streets, the map is a map, and the interior margin is 162
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 22:49:04 +10:00
m3ultra
076b972f71 Lane F R39 (v9 WAVE 1, CLOSE): QA GREEN 10/0/0/0 — and the interior margin is 162, not 21 and never 6
FIVE GATES, FIVE CONTROLS, each demonstrated in the same run. New F-owned tools wired into qa.sh as
Gate 8: r39_address.mjs · r39_transmission.py · r39_runtime.py · r39_shots.py (--no-r39 skips the
browser half). Lane A's selfcheck reproduces exactly: 157,647/157,647 ALL GREEN, fingerprint
0x5f76e76 — ZERO GOLDENS MOVED, in a round that added an address layer, a fog ledger, a spawn move
and a new interior fitting.

THE ROUND'S BIGGEST NUMBER IS NOT THE ONE THE LEDGER ASKED FOR. Two port-isolated no-store roots,
the same inode for every byte except one file — the shipped bookshelf GLB vs a copy with
transmissionFactor:1 re-inserted (BIN sha1 IDENTICAL, only the JSON chunk moved) — both through
interior_test.html's own drawSweep:

  GLB-on worst   329 (opshop/hall)  ->  188 (dept/auto)     -141
  GLB-off worst  162 (opshop/hall)  ->  162 (opshop/hall)   0 — the control's own control
  margin vs <=350            21     ->  162                 +141

opshop 329->174 (-47%) · book 247->125 (-49%) · every other type 0, exactly the shape Lane C
predicted from an isolated room, at sweep scale, by a harness C did not write. The worst interior
room in the game is now dept/auto — a room with no bookshelf in it. The default boot fetches these
GLBs from the public depot, so all four R39 GLBs were fetched off digalot.fyi and scanned: sha1
identical to the local tree, 0 transmissive materials, 4/4. Binding fact #3's third and final value.

39.1 ADDRESS — GREEN. 1,192/1,219 shops (97.8%), 23/23 'ways', 857/857 membership agree / 0 wrong
(and the control is asserted to have CHECKED 857 edges). No cache -> supplier 'district', 0 names,
still labels 72/72 from district+block. RED ARM: a 3 m shift error RAISES adelaide 89 -> 98 resolved
shops (Lane A's number to the digit) while INVENTING 9 names; stats().shiftCheck reads DISAGREE on
all 72 perturbations. And the honest limit: at 3 m the membership control reads 0 disagreements,
because those shops front ways OSM leaves unnamed — only the shift cross-derivation catches it.

39.2 FOG — GREEN, both arms on one boot. HIDES 4/72 at spawn, 0 of 61 distant shops known. REVEALS
2,125 m -> 58 shops. FRONT TEST: probe from 5 m BEHIND each of 59 unknown shopfronts, 0 learned.
+0 DRAWS AND +0 TRIS, four freshly launched browsers, both orders, drained, 3 reads each, with the
arms asserted distinguishable first. 8/8 corrupt saves rejected, state untouched. Null store on
classic/game=0/fog=0; game=0 and fog=0 pixel-identical, default differs.

39.3 THE SIGN — GREEN. Shops in front of the player at spawn: 4/4 · 4/4 · 4/4 · 1/1, and ZERO on all
four with the pre-R39 sign re-derived on the same tree. The live spawn is asserted equal to the +sin
derivation, so the shell is what is scored. Re-baselined WITHOUT falsifying a release record: the
v7 tour and v7-beta frames are kept as history; docs/shots/laneF_r39/ ships the new pair with its
own BEFORE. The R35 gate itself is pose-independent and was green either side.

39.4 RUMMAGE BIN — GREEN. 120 rooms: tub 60/60 both arms, kind:'bin' 0/60 default vs 60/60 armed,
0 carves, 60/60 deterministic, reachable 0.80-1.03 m by a flood fill written here. THE CONTENTS DID
NOT SHIP: on the default street boot the tub is kind:'prop', 0 dig targets, E opens nothing.

39.5 TRANSMISSION VALIDATOR — GREEN and it FIRES: hard-fails rc 1 on the fabricated glass asset AND
passes on the shipped tree.

THREE CORRECTIONS, ALL MEASURED. A's "a 30 m shift returns 0 street names" — it returns 40/12/47
wrong ones; a big shift lands you on the next street, it does not degrade to null. B's "a fresh
export has no `known` key" — true of ?fog=0, no longer of a default boot, because B's own +sin fix
means you spawn in front of four shopfronts. And my own: I first aimed the transmission control at
web/assets/models/ when validate_manifest.py reads pipeline/_normalized/, and nearly filed a defect
against Lane E on the strength of it. Aim the control at the code path, not the plausible path.

HELD -> LANE E: check_transmission() skips any GLB with no local _normalized copy and never scans
web/assets/models/. Demonstrated with a live control — remove the local copy and the same glass
asset passes rc 0. A depot-only transmissive GLB (the exact shape of longbench and streetlight)
would ship unseen.

No tag.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 22:47:03 +10:00
m3ultra
43c7f4281e Lane B R39: §39 note — the classic fetch-delta arm on the magpie GLB, as a table
The network-log assertion behind the previous commit, written into the lane notes so F's gate can
read the numbers rather than re-derive them: default boot 1 magpie GLB request (asset 'glb', 894
tris) · ?classic=1 0 · ?magpie=0 0 · ?noassets=1 0 (asset 'primitive', 182 tris).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 21:40:42 +10:00
m3ultra
f0b9a1d30f Lane B R39 (Fable's ruling): the magpie takes E's GLB use-if-ready, and the fallback's white moves
+1 draw / +894 tris with the bird on screen, +0 with it off — measured same page, same frame, by
toggling the InstancedMesh count. ?noassets keeps the 182-tri procedural bird (+1 / +182), so this is
furniture.js's use-if-ready SECOND path, not a substitution. state.asset reports which bird is bound.

THREE THINGS MEASURED BEFORE THIS WAS SAFE, AND ALL THREE WOULD HAVE SHIPPED WRONG:
 · E's bird faces +Z and this file flies -Z (Matrix4.lookAt's -Z column is the travel direction).
   Sliced the GLB's 894 tris along Z in ten bins: +Z end mean y 0.31, half-width 0.009 (head + bill);
   -Z end mean y 0.028 (tail). Without rotateY(PI) the magpie swoops TAIL-FIRST. This is the FIFTH
   -Z/+Z instance and the first caught BEFORE it shipped — because R39's lineage table said to point
   a measurement at it. Verified in pictures: perched head-leading, and a swoop frame taken head-on.
 · Its origin is at the FEET (GLB law minY=0) while PERCH_Y is a body-centre height: dropped 0.20 m
   so it stands on the lamp arm (4.12) instead of hovering. `folded` is 1 for the GLB — it IS the perch.
 · THE FETCH IS ARMED BY createMagpie(), NOT BY THE IMPORT. index.html imports this module
   unconditionally and gates only the CONSTRUCTION, so a module-scope loadGLB (furniture.js's shape)
   would have put a brand-new GLB request on the ?classic=1 boot — a fetch delta on the one boot that
   is not allowed one. Asserted on the network log, not on the code: default 1 request (asset 'glb',
   894 tris) · ?classic=1 0 · ?magpie=0 0 · ?noassets=1 0 (asset 'primitive', 182).

AND ONE MY EDIT INTRODUCED INTO ANOTHER LANE'S TOOL: a module-scope loadGLB also fires GLTFLoader's
fetch path under node, so Lane E's pipeline/dump_bird.mjs (which imports this module unmodified) died
with "ProgressEvent is not defined". Gated on IN_BROWSER as well as ?noassets; E's tool then ran
against my edit and reported 182 triangles / 216 verts — the placement fixes are exactly +0 tris.

THE FALLBACK, FIXED AND THEN MEASURED — a half-win, stated as one. E is right that the white bars sat
3 mm ABOVE horizontal wing planes, so from below (the player is always below: perch 4.32 m, EYE 1.62)
the black wing occluded its own flash: bar y 0.048 -> 0.042. Same class of fix, my own arithmetic, for
the other two marks: the nape was BURIED IN THE HEAD (head-sphere surface at z=-0.10 is y 0.0728, the
box topped out at 0.067) so it moved behind the head to z -0.07; nape and rump thickened 0.014->0.030
and 0.02->0.034, because from the flank a 14 mm slab on a 166 mm bird is 1.3 px at 64 px. All +0 tris.
Measured in the same crop of the same pose: pale area 180 -> 399 px, dark 3,017 -> 2,755 — but TRUE
white 33 -> 28, because a downward-facing surface gets no sun. E's GLB reads 755. The fallback cannot
be made pied with primitives at zero cost; the problem is photometric as well as geometric.

Stale comments corrected: magpie.js:9 and :123 said 154 triangles; it is 182 (E's ask 1).

FILED, NOT FIXED: the arcade's awning posts land +/-0.50 m from the centreline — two rows 1.00 m
apart, 34 posts down a 5.00 m lane (my own measurement from the plan, confirming E's). AWNING_DEPTH
2.2 is tuned for a 9 m footpath. One clamp fixes it, but it changes default-boot geometry for a
district whose whole treatment is a scheduled item, and the post line should be designed with the roof.

Lane E's transmission recall checked, not assumed: longbench, streetlight and magpie as staged in
web/assets/models/ carry no KHR_materials_transmission. My lane wires neither of the first two today.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 21:37:24 +10:00
m3ultra
a982f3ce67 Lane B R39 (Fable's ruling): THE SIGN — +sin lands; the fourth instance of the -Z/+Z confusion
index.html:428 (Lane D's patronage door points, since R8) and :500 (doorOf, the R32 cluster-pose
spawn) computed the shop front as (-sin ry, -cos ry) — the BACK of the building. buildings.js:410,
:583-597 put the facade, the door and the doorRect at local +Z; dbg.js:53 says so in words;
minimap.js has always drawn its front tick there. Two characters, both sites.

THE PATRONAGE DOOR POINT, on the footpath (registry.js's own roadWidth/vergeBand split, outside the
carriageway, outside every lot):
  synthetic     0/493 -> 427/493     median 26.22 m -> 9.40 m from the centreline
  katoomba_real  0/72  ->  67/72     19.10 -> 3.90
  fitzroy_real  0/139 -> 139/139     19.10 -> 3.90
  bowral_real    0/30  ->  28/30     21.10 -> 5.90
Not one door point in the corpus was on a footpath. Lane D's peds ducked into the back fence.

THE SPAWN, booted code both sides (:8702 the fog commit, :8701 the fix, nothing monkey-patched):
  synthetic  (25.5,-17.9) 3 shops within 25 m, 0 in front, 0 discovered
          -> (6.1,-19.8)  4 within 25 m, 4 in front, 4 discovered
  katoomba   (-219.0,-471.3) 3/0/0  ->  (-200.0,-474.4) 4/4/4
And in the picture (docs/shots/laneB_r39/sign-*): katoomba's shipped boot opens STANDING IN A
PADDOCK FACING THE BLANK BACK WALL OF A BUILDING — the R31 playtest's own complaint, the one R32 was
written to fix and, because of the sign, never did.

NO GOLDEN MOVES: SPAWN and the patronage points are runtime pose, computed in the shell from a plan
it never writes. Lane A selfcheck either side: fingerprint 0x5f76e76 -> 0x5f76e76, 157,647/157,647.
?classic=1 never enters the branch and keeps the frozen (-96, 9) pose.

-> LANE F: the R32 cluster-pose spawn gate and the R35 first-five-minutes smoke both photograph this
pose and need re-baselining. The falsifiable arm that needs no picture: at spawn, the count of shops
within 25 m that are IN FRONT of the player must be > 0 (0 on 4/4 towns before, 4 on 4/4 after).

THE LINEAGE, written down as Fable asked — this is the FOURTH instance of the same confusion:
R13 RY_FLIP (the band 180 deg off) · R15 the venue poster on the back wall (15.9 m from the facade,
0.07 m from the back) · R27 every real-town shopfront facing the paddock (dot = -1.000 on 35/35 and
72/72 lots; CITY_SPEC:71 says -Z, :335 says +Z) · R39 these two. Every time the rig/pose convention
is local -Z and the visible front is local +Z, and every time it was caught by a PICTURE or by a
consumer with a different convention — never by a metric. A heading has no falsifiable arm inside
the file that computes it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 21:17:48 +10:00
m3ultra
12eb571357 Lane E R39 (6/n): THREE GLBs shipped as GLASS, not one — transmissionFactor 1 stripped, published, sha1-verified, and now GATED. Plus the arcade's three meshes.
Lane C measured the bookshelf's transmission halving interior draws (opshop/hall 191->104, book/hall
101->51, dept/hall 116->116 control). The cause, with vendored line numbers: three.module.js:16209
enters renderTransmissionPass(opaqueObjects, ...) whenever currentRenderList.transmissive is
non-empty, and :16433 re-renders the WHOLE OPAQUE LIST into a render target — every opaque draw
issued twice. Trigger is material.transmission > 0 (:6890), set from the glTF at GLTFLoader:1202.
And at 1.0 it is not 'a bit glassy': :494 does totalDiffuse = mix(totalDiffuse, transmitted.rgb,
material.transmission) — the diffuse term is REPLACED by the backdrop.

I SCANNED ALL 103 GLBs. Three carried it:
  procity_fit_bookshelf_01      mtl_10218_Bookshelves_v1     shipped and hurting (C's)
  procity_street_longbench_01   lambert3SG                   NOT WIRED — the 5.86 m arcade bench
                                                             the v9 charter names, on my R38
                                                             recommend list for Lane B
  procity_street_streetlight_01 Streetlight_HighResSG3       NOT WIRED — one per ~18 m of street
The two unwired ones are the worse finding: the street budget is 292/300 with EIGHT draws of margin,
and a pre-pass there costs another ~292, not eight. Armed, not fired.

FIXED SURGICALLY. pipeline/strip_transmission.py rewrites only the JSON chunk and copies BIN through,
printing sha1(BIN) before and after: BIN IDENTICAL on all three, tris/dims/mtl/img/tex unchanged.
KHR_materials_ior deliberately left (ior does not trigger the pre-pass).

PUBLISHED + VERIFIED under John's R22 standing authorization via the passwordless tailnet ingress:
6/6 HTTP 200 off the PUBLIC depot, byte counts exact, sha1 identical, depot copies re-scanned clean.
_published.json 56 -> 59.

GATED, which matters more than the fix: validate_manifest.py now HARD FAILS on transmissionFactor>0
with the three.js line numbers and the fix command in the message; glb_stat.py grew a transmission
column and a loud footer. Nobody looked for three epochs because a bookshelf is obviously not glass.

ALSO: the arcade's three meshes, published and catalogued the same round they were generated —
aframe_board 366 tris (<=16 inst), blade_sign 299 (17 inst), keycutter_sign 498 (1 inst). manifest
furniture 13->16, GLBs 36->39, validate 0 errors 0 warnings. blade_sign ships FLAGGED: its back face
carries TRELLIS-hallucinated art where the concept had no data, which is one more reason the
+0-draw perpendicular-quad answer is the recommendation and this GLB is the fallback.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 21:11:34 +10:00
m3ultra
0ee7a84710 Lane B R39 39.2: THE FOG — the map shows what you walked past, and is finally readable
minimap.js drew every lot in the plan from the first frame (493 shops on the synthetic, one M
press, against 5,330 m / 4.8 game-days of walking to earn it). It now draws what has been walked
past AND FRAMES ITSELF TO IT — a shop lot goes 0.83x1.11 px -> 29.4x39.2 px on bowral_real, 35.3x.

ZERO DRAWS, measured as an A/B: two port-isolated no-store servers, HEAD vs treatment, the same 15
stations x 4 yaws compared as JSON before either sweep runs. Draw calls IDENTICAL on 60/60 samples
at noon and at night; with the gig layer off both sides (the venue queue's async rigs were the only
noise) NIGHT is identical in draws AND triangles. Map mode cannot cost a draw structurally: the
frame loop never calls composer.render() in the map branch.

- discovery.js (new): a 25 m PROXIMITY PROBE, not onChunkBuilt (R=2 => the outermost live chunk
  corner is 181 m out), on a plan-derived spatial hash — 1.09-1.37 us a probe, every 6th street
  frame = every 0.46 m at WALK. Plus a side test: you must be in FRONT of the shopfront. Control
  with a red arm: walking the synthetic's two service laneways, radius-only reveals 93 shops, the
  shipped probe 59 — 34 refused through the back wall; on the arcade it refuses 0 of 17.
- save.js: optional `known` block under the delta law, keyed by TOWN (re-derived: 23 caches x 3
  seeds, shop/edge ids and lot geometry all identical; the synthetic alone keys @<seed>). Bounded
  by the plan (max 493 shops / 2,593 edges) at 8,192, 64 towns FIFO, ints only. Whole corpus fully
  learned = 137,547 B (2.6% of quota); 482 B after a 500 m outing. Eight reject arms demonstrated.
- classic BY CONSTRUCTION: createMinimap(plan, null) is the pre-R39 map and the file has no flag
  test at all. ?classic=1 / ?fog=0 / ?game=0 map canvases are hash-identical to HEAD's.
- Lane A's address layer consumed (getTownCache + createAddresses): street names along walked
  streets, deduped; the synthetic gets district labels from the same line. No town-type branch.

FILED, NOT FIXED: index.html:384 (Lane D patronage door points) and :450 (the R32 spawn) use
(-sin ry, -cos ry) — the BACK of the building. buildings.js:410/583-597, dbg.js:53 and minimap.js
all use local +Z. Measured against each lot's own frontEdge the +sin point is 0.00 m from the kerb
and the shipped one 15.25 m the wrong side, 493/493 and 72/72 shops. At the shipped spawn 0 of the
shops within 25 m are in front of you on all four towns tested; at the corrected one, all of them.
Two characters, but it moves the default boot's opening pose mid-round — Fable's call.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 21:04:34 +10:00
m3ultra
41d9878574 Fable: own the stale-344 error (I verified a doc, not the tree — margin is 21 not 6) + amend RED TICKET DAY with C's stall findings
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 21:01:42 +10:00
m3ultra
eeba920d68 Lane C R39 §39.3: the op shop gets a bin — the verb table, and the margin was never six
THE TABLE (LANE_C_PUB §10, the deliverable): what a player can actually do in each of
the 12 shop types, counted in 48 rooms per type. `record` digs (4.6 bins/room) and is the
only room where anything can be sold. `stall` digs — in 27 of 48 rooms; the other 21 (44%)
have NO crate, a measured correction to the round's binding fact #5. The other ten types
offer looking. `?stock=real` is opt-in, so the default boot has zero `buyMesh` anywhere;
garments/snacks/magazines/treasures are unbuyable in any mode; `interactable:true` on
cases/fridges/returns/arcade is read by nothing.

THE MECHANISM: `rummageBin` — a castored galvanised dump tub, rim 0.76 m, heaped with
stickered bric-a-brac and a hand-lettered "EVERYTHING $2" card. 72 rooms: placed 72/72,
reachable 72/72 (0.77–1.15 m), 0 carves, pathOK 72/72, deterministic 72/72, and the rest
of the room byte-identical to pre-R39 72/72 (the spec is appended last). Armed end-to-end:
aim → dig → 16 offers → BUY → bin depletes. Default: 0 bins, dig never opens.

THE CONTENTS ARE NOT SHIPPED. `o.dig` defaults false, so the tub is furniture and the
economy is untouched; `opts.fittingOpts.rummageBin.dig` (or `?opshopdig=1`) arms it. Held
for John with the numbers: 44 record + 36 stall vs 147 op shops across 23 towns.

THE BUDGET: `C-progress.md:841`'s GLB-on 344 is R9-era and stale — today's tree measured
319 before I touched it, so the margin was 31, not six. The bin costs +5 GLB-off / +10
GLB-on at opshop/hall; every other type byte-identical. Margin now 21. Also: `slot.pool`
stops the scatter fill minting a material per item, so 12 goods cost less than 9 did.

FILED, NOT FIXED: Lane E's bookshelf GLB ships transmission:1, which triggers three.js's
transmission pre-pass and issues every draw in the room twice — opshop/hall 191→104,
book/hall 101→51. Roughly half the interior budget. E's asset, so E/F rule.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 20:59:42 +10:00
m3ultra
c2e44821c7 Lane E R39 (5/n): two corrections to my own R39 arithmetic, both measured
- The magpie's white, restated exactly. The wing-bar occlusion claim is the strong one and it now
  carries its footprint proof: the bar's (x 0.174-0.316, z 0.005-0.055) lies ENTIRELY inside the
  wing's (x 0-0.34, z -0.085-0.065) with the bar 3 mm above it, so from below the wing hides it.
  The nape box tops out at 0.067 against a head surface at 0.0728 (I had written 0.065, and had
  the sliver on the wrong side). And the flank argument is now the honest one: nape and rump are
  14 mm and 20 mm slabs on a 166 mm bird = 1.3 px and 2 px of white at 64 px.
- THE CLASSIC ARGUMENT FOR THE ARCADE IS INVERTED relative to R38 and I nearly carried the wrong
  one over. R38's ground palette is classic-safe BY ABSENCE (character.js returns frozen literals
  for a null town key; classic has none). The arcade district exists ONLY on the synthetic, and the
  synthetic IS the classic boot — so the kit lands squarely on the covenanted town and needs an
  EXPLICIT flag test, ground.js's VERGE shape, not the by-absence one.
- arcade_measure.mjs now also counts chunks: arcade lots span exactly 2 (0,0 and 0,1) on all five
  seeds, so a per-chunk arcade class is +1 draw in 2 chunks and +0 in the other 23.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 20:58:26 +10:00
m3ultra
7fe6a4a40e Lane E R39 (3/n): the notes + the audit — the magpie recommendation with its arithmetic, the arcade's measured kit, and the sizing law promoted to a standing instruction
- LANE_E_NOTES §39: RECOMMENDATION TAKE THE GLB, on three findings in the order they decide it
  (80.5% of drawn frames are PERCHED and the perch is the pose E's asset already is; E reads pied
  at 64/48/32 px and under a 25% smear while B reads as a dark aeroplane; and B's white is
  geometrically buried — the wing bar sits 3 mm ABOVE a horizontal wing plane, so from underneath,
  which is where the player always is, the black wing occludes its own white flash).
- Three asks filed for Lane B, none of them edits: magpie.js's two stale 154-tri comments (:9, :123
  against a measured 182); the wing bar's side (y 0.048 -> ~0.042 is +0 tris and fixes ?classic and
  ?noassets whatever Fable rules); and two GROUND_FALLBACK entries so the arcade is not grey
  without assets.
- The arcade measured, with the awning-post finding: two post rows 1.00 m apart down a 5.00 m lane.
- AUDIT §Round 39 §0 makes the sizing law a STANDING INSTRUCTION with two new clauses: draws are
  counted per CLASS (town-wide InstancedMesh +1 vs per-chunk +1 x 25 live chunks), and for a SKIN
  the budget is the SLOT, not bytes (36 facade-atlas slots, 22 used, 14 free — past 36 skins.js
  silently REUSES one).
- pipeline/skin_sheet.py: wrap-preview + measured seam error, the check R38's stretched grounds
  needed before the harvest instead of after.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 20:53:55 +10:00
m3ultra
f628bf581a Lane A R39 39.1: THE ADDRESS LAYER — 17,835 street names stop being dropped on the floor
The contract, published for B and C in LANE_A_NOTES §39 (first commit, per the half-day rule).

  createAddresses(plan, cache|null) → streetOf(edgeId) · localityOf(shopId) · cohort(pred)
                                     · streets() · stats()

New pure module web/js/citygen/address.js: ZERO imports, no THREE, no fetch, no DOM, no module
state, no plan mutation. Two suppliers, ONE consumer contract — a real town fills `label` from the
cache's named ways, the synthetic fills it from district.kind + block. Consumers must never branch
on town type; that constraint is the design.

MEASURED (Fable's binding facts re-derived independently, all three land exactly):
· 19,132 road ways, 17,835 named (93.2%)
· median plan-edge-sample → nearest named way 0.03–0.90 m (worst katoomba)
· 1,192 / 1,219 corpus shops resolve to a street name (97.8%); 29,865/30,986 edges named (96.4%)
· all 27 unresolved shops front a way OSM genuinely leaves unnamed (adelaide 21 arcade) — null is
  the honest answer and the module returns it rather than borrowing a neighbour's name

TWO DEPARTURES FROM THE SYNTHESIS, both with numbers:
· the shift is recovered EXACTLY (node↔waypoint lattice intersection), not voted for. The proposed
  centroid-align + nearest-waypoint vote returns the WRONG shift on 5 of 23 towns (braddon,
  fremantle, hobart, northbridge, westend) — island culling drags the plan centroid off the
  cache's. A wrong shift renames every street in the town. Exact on 23/23, nothing to tune.
· the resolver samples FIVE points along an edge, not the midpoint — a midpoint cannot tell a
  street from the street that crosses it.

THE ONE-LINE UPGRADE: TAKEN. plan_osm.js writes norm.shift = {shx,shz} into the normalization log,
reaching the caller only via the existing opts.report sink — never onto the plan. It is a
cross-check, not a dependency: selfcheck compares plan_osm's published shift against address.js's
independently recovered one and fires on a 0.01 m disagreement.

GATES (+240 checks), each proven to fire on a broken world:
· 0 wrong street names on 884 shop-bearing edges, against an INDEPENDENT way-membership resolver
  (857 agree, 0 disagree). Corpus-wide 4/30,986 disagree — all 2D-stacked ways, none carrying a
  shop — PINNED at 4, not asserted > 0.
· CONTROL: with roads[].name stripped (exactly the pre-change state) the layer resolves 0 streets.
· CONTROL: no cache ⇒ supplier 'district', visible in stats(), never a silent wrong name.
· createAddresses does not mutate the plan — asserted byte-for-byte, per town.
· tolerance 8 m, and the finding that sets it: correctness SATURATES AT 6 m (857 agreeing frontage
  names at 6, 8, 12, 16 and 24 m). Every metre past 6 buys only a name borrowed from an unnamed
  way; it can never buy a correction.

Additive: getTownCache(key) — index.html registers the cache and drops its reference, so roads[]
was unreachable downstream. Read-only, no new state, no shell change.

GOLDENS: NOTHING MOVED, ZERO RE-PINS. selfcheck 157,407 → 157,647 ALL GREEN, fingerprint 0x5f76e76.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 20:32:43 +10:00
m3ultra
07328b7e9f Fable (integrator): round-39 instructions — v9 opens: THE ADDRESS LAYER + THE FOG (John's ruling), plus the op-shop dig gap and the magpie settle
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 20:13:43 +10:00
m3ultra
f873b460e8 Fable (integrator): ROUND 38 CLOSED — v8 wave 1, the town is inhabited; 292/300 stands (the worst frame is night, both new layers are zero at night)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 19:50:16 +10:00
m3ultra
763eabde5e Lane F R38 (v8 WAVE 1, CLOSE): the budget did NOT move — 292/300 stands, and four gates ship with four controls
THE RECONCILIATION. The brief's naive sum (292 + washing 1 + magpie 1 = 294) is wrong, in our
favour. The pinned worst-DRAW frame is a NIGHT frame and both of wave 1's draw-spending layers are
structurally zero at night: the washing comes in (count 0), the magpie roosts (count 0). Wave 1's
one draw is spent in daylight, where the walked peak sits ten draws lower.

Two pinned trees, assets symlinked to the live tree on BOTH sides, 802 stations at 2 m down the
main spine at yaw 0 (the worst bearing), citizen sim and tram LIVE, 1280x720:

  NIGHT worst draws   292 -> 292   (+0)     tris 120,145 -> 122,879
  NOON  worst draws   282 -> 283   (+1)     tris  99,872 -> 103,118
  ?classic=1          269 / 90,580 unmoved
  fitzroy_real        172 / 130,727 unmoved      bendigo_real 204 / 131,492 unmoved
                                                 (even with ?magpie=1 forced)

The control reproduced R37's pin TO THE BYTE, twice, on a fresh checkout. Every revert is exact:
?yards=0 at night returns all three control numbers; ?yards=0 at NOON returns 282/99,872, which
isolates the noon +1 to the washing and nothing else. MARGIN IS STILL EIGHT DRAWS.

LANE B's "control 346", answered rather than dismissed. As a delta it is the wall-clock ped-spawn
artifact R37 named, and B was right to hide the sim. But 346 > 300 is a claim about the world, and
neither stepwalk (walks the chunks in, photographs a half-dressed street) nor dwell (fills the
street, arrives clean at 27 chunks) can adjudicate it. budget_walk.py gains --method stepsettle:
the audit's fixed-yaw stations, each DRAINED then held N real rAF frames — R+1 dispose residue AND
a fully-acquired crowd in the same frame. Like for like on the same 101 stations, the settle is
worth +3 draws at noon and -9 at night, and the SIGN FLIP is the finding: at night the settled
street retires near rigs to impostors (tris 120,145 -> 100,939) — the crowd goes home, and a
sampler that never waits does not see it happen. The highest number anywhere in the reconciliation
(4 methods x 2 trees x 2 segments x 5 towns) is 292, the pin. NOTHING READ OVER 300.

A CORRECTION TO MY OWN R37 PIN: the corpus TRI worst is 130,727 on fitzroy_real, not 124,793 — and
it reads 130,727 on the CONTROL tree, so it is my R37 station spacing (12-bearing 8 m sweep) versus
this round's 2 m stations, not a wave-1 cost. Station spacing, not settle policy, is the biggest
lever on a walked worst frame. A pin is only as good as its spacing, and mine had not said so.

FOUR GATES, FOUR CONTROLS DEMONSTRATED (smoke_ambient / smoke_character / smoke_magpie /
smoke_yards, wired into flags_check.main()). A gate that cannot fail is not a gate — this round
earned the sentence twice, R37 killing two vacuous gates and B catching its own season mechanism
producing a constant that would have gated green under ?magpie=1.

  1.1 audio  — 6 sources anchored 63/8/81/32/39/57 (B's numbers exactly); dog AUDIBLE at 5.9 m with
    1 play scheduled (for a one-shot, `audible` is only published once plays>0, so one word covers
    fetch/decode/gain/schedule/counter); HOURS enforced (sprinkler audible 06:30 -> idle 12:30, same
    pose); DAY-OF-WEEK enforced (mower idle Mon -> audible Sat, same pose); PAN is a bearing (yaw
    0/90/180/270 -> +0.00 +0.85 -0.00 -0.85); ZERO DRAWS byte-identical to ?ambient=0. THE CONTROL:
    a second server whose root is web/ symlink-for-symlink except one patched manifest with
    sfx['dog-bark-fence'] renamed -> no-entry, 0 plays, never audible, other five unchanged, 0
    console errors. Printed on every run: audible OUTPUT is unverifiable headlessly. Nobody in this
    loop has ears.
  1.2 character — classic is the frozen v1 literals, all tints null, 5 ground meshes; all 23 shipped
    keys matched PER TOWN including the two carrying state:''; the control fires (unknown key ->
    matched:false); 21 distinct palettes across 23 towns (one shared palette FAILS by name); and the
    two orphans are ON THE GPU — ground-gravel.jpg bound on Castlemaine, ground-reddust.jpg on
    Darwin, read off the live material.
  1.3 magpie — the latch arm verbatim with its positive control FIRST; day-roll clears it;
    localStorage gained NO new key (baseline taken after a game.save() — the first cut blamed the
    magpie for v7's own write); the season is 23 distinct positions across 24 towns run UNFORCED,
    against the first cut's 24-of-24-at-214, newtown_real in season on day 1, 129/1000 seeds against
    a 11.5% design ratio; territory 6 -> 157 synthetic -> bendigo; +1 draw / +182 tris at ONE pose
    reused across both boots.
  1.4 yards — 181 lots, 181 hoists -> 394 items, 256 active, 0 at night; cost decomposition at one
    pose with the sim quiet: box props +0 draws (in fact -2, the 36 `yard` lots used to fall through
    to buildShopfront) with +1,936 tris, washing exactly +1 draw / +512 tris; and on real towns it
    SKIPS LOUDLY — a ⊘ SCOPE line printing 0 house/yard lots / 0 hoists / mesh never created, beside
    the synthetic 181 that makes the zero attributable.

Caught in my own work: the pan arm's first draft used two bearings and read +0.00/-0.00 because
that anchor sat on the forward axis — it would have called a working panner inconclusive. Four
bearings now. The gate's first draft failed the standard the gate exists to enforce.

SUITE: tools/qa.sh --strict --matrix GREEN on the true final tree (74d6257) — 7 passed, 0 failed,
0 warn, 0 skipped; flags_check GREEN 0/0 with all four new gates inside it; MATRIX GREEN 10 towns
x 7 gates, 0 fetches under ?noassets on all ten.

Held: nothing. Recorded not fixed: magpie.js says 154 triangles at :9/:123 and 182 at :42 (measured
182); E's three published GLBs are manifest-and-depot but not under web/assets/models (staged in
pipeline/_normalized, nothing loads them, the validator's contract covers it — not a defect).

NO TAG — wave 1 is content; the epoch tags when it is whole.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 19:48:45 +10:00
m3ultra
74d6257940 Lane E R38 s2: the three GLBs PUBLISHED + sha1-verified off the public depot; the magpie is a magpie
A. DEPOT — closed, under John's R22 standing Lane-E authorization (the authority that
   shipped sit.glb in R28 and the nine R36 sweep assets). Pushed via the passwordless
   tailnet ingress: _published.json 53 -> 56, drift check clean. Then verified the way
   this lane verifies — FETCHED BACK OFF THE PUBLIC DEPOT and hashed, not "the upload
   said 200": magpie/paling_fence/water_tank all HTTP 200, byte counts exact, sha1
   identical to local, 3/3. _r38_results.PENDING_PUBLISH.json renamed, build_manifest
   re-run (GLBs 33 -> 36), validate_manifest 0 errors / 0 warnings.

B. THE MAGPIE TINT — done, not offered. The bird shipped as an all-black crow (R38 4d
   traced the loss to trellis2_mlx's PBR bake). "Hand-tint the atlas" is not a paint job:
   the bake is a smart-UV unwrap of ~100 islands and none of them announces itself as a
   nape. So pipeline/tint_atlas.py defines the tint in the MESH's frame and projects it
   through the UVs — rasterize every UV triangle to texel->(position,normal), evaluate
   soft anatomical windows on the positions (white nape behind a black crown, shoulder
   bar on the flanks only so the dorsal midline stays black, rump + tail base stopping
   short of the black terminal band), paint keeping the bake's own luminance as shading,
   then dilate 5 texels into the UV padding so no black fringe survives bilinear/mip.
   3-D masks give one consistent soft edge across every island at once; a 2-D blur could
   not (it would bleed island-to-island through the black background).
   GEOMETRY UNTOUCHED byte for byte: still 894 tris / 1 mtl / 1 img / 512^2 WebP / no
   Draco / 0.155x0.358x0.404 m. Painted luma median 0.84 (p90 0.95) vs the bake's 0.13.
   VERIFIED IN THE GAME'S OWN RENDERER: the PUBLISHED file loaded off digalot.fyi through
   the vendored GLTFLoader + three.js — 1 mesh, 894 tris, 512x512 texture decoded (which
   also proves the PIL-written WebP decodes in a browser).
   VERDICT: it reads. Pied and unmistakable at 64 and 48 px, still black-and-white at 32.
   Honest caveat: from directly below-and-in-front it stays dark — correct, a real
   magpie's bib and belly ARE black. Render: docs/shots/laneE/r38_magpie_tint.png.
   Standing after B's 4514cb9: an UPGRADE PATH, not a dependency — B's 182-tri procedural
   bird is 4.9x lighter and the right call. Nothing probes for the GLB and nothing should.

C. CORRECTIONS FOLDED INTO THE RECORD so the next asset round does not re-learn them:
   skins are 9.7 s not 5.7 s (1024^2, 1.78x the pixels, per-pixel identical) - the reuse
   list's "one line each" holds for 5 of 9 (extractGLB keeps only the FIRST material) -
   normalize.py's collapse decimator floors at the shell count on TRELLIS output while
   bake_lowpoly.py clears it every time - the 489 s outlier at 3.8x median means
   throughput plans on a tail, not a mean - furniture.js:30's stale comment is fixed by B.
   NEW, and the one worth keeping: an asset's tri budget is tris x THE INSTANCE COUNT THE
   PLACEMENT RULE IMPLIES. paling_fence is a good 1,121-tri panel and a rejected asset —
   905 instances = 1.01M tris, ~47x over. Ask the consuming lane for the instance count
   BEFORE generating anything that tiles, edges or repeats per-lot.

New tools, all on-device and $0: tint_atlas.py, render_views.py (view sheet + --eevee +
roster-consistent --thumb), view_sheet.py (the distance strip no 256px thumbnail can make).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 19:02:06 +10:00
m3ultra
4514cb94b5 Lane B R38 (v8 WAVE 1, INHABITATION): all four runtime items — the whole round costs +1 walked draw
The town is inhabited: 23 towns finally differ, 181 back yards have a Hills Hoist with washing on it,
a magpie owns one street for six weeks of the year, and six point sources put a life off-screen.

MEASURED, walked, not bookmarked — two port-isolated no-store servers (:8472 = `git archive HEAD`,
:8471 = treatment, assets symlinked so E's mid-round wave is identical on both sides), 102 8-metre
spine steps at yaw 0, each frame fully streamed, through the shell's own composer:

  worst draws  224 -> 225   (+1)
  worst tris   89,502 -> 93,298   (+3,796 of ~75k spare)
  sum draws over 102 frames  16,676 -> 16,663   (-13)

The citizen sim and the tram are hidden identically on both sides, and that IS the measurement: with
them live the same step read control 346 vs treatment 232, because peds spawn on wall-clock time.
`?yards=0` reproduces HEAD exactly (224 / 89,502 / 16,676). Isolated at a fixed pose: washing +1 draw
/ +512 tris, magpie +1 draw / +182 tris, every yard box prop +0 draws.

§1.2 THE CHARACTER VECTOR — +0 draws, +0 tris, classic byte-identical BY CONSTRUCTION.
`townCharacter(null)` returns the frozen v1 literals and a null tint keeps the SAME material cache key,
so classic gets the same object, not a copy of it: default-boot ground hashes identical to HEAD
mesh-for-mesh, `?classic=1` hashes unmoved from R37. There is no `if (classic)` in the ground path.
The sky feeds the BASE skyName, never `setSky` (a one-way latch that would have killed R32's dawn dome
on all 23 towns). The vacuous arm is per-town: `newtown_godverse` / `redhill_godverse` carry `state: ''`,
so a per-corpus arm would have dropped exactly those two silently. 21 distinct palettes across 23 towns.
`gravel` and `reddust` were not unwired but UNWIREABLE — their `use` values named no slot ground.js had;
making the slot addressable fixed it at the root, and both are selected now. E's three new grounds
landed mid-round and the upgrade was a name change in one table, which is what procedural-first is for.

§1.4 BACKYARD AUSTRALIA — inside boxMats, +0 draws. Houses inset off their boundaries so there is a
yard; 36 `yard` lots that had rendered as blank shopfront sheds since v1 are now fenced blocks with a
hoist, a shed and often a tank. Collision byte-identical (the lot rect is where the fence stands).

THE WASHING SHIPS, and I wrote the inverted weight rather than dropping it. The shipped top-weighted
mode moves a hem 0.10 cm calm / 0.67 cm gusty; `pegged` gives 4.5 cm / 31 cm — ~52x, and at the hem
instead of the pegs. The `canopy` string is byte-for-byte unchanged, so the gum-tree covenant argument
is untouched. It is ONE TOWN-WIDE InstancedMesh (1 draw at any N, cap 256, proximity-first off the R37
chunk seam) rather than per-chunk, which would have been +1 x 31 live chunks = 4x the whole margin.
Zero on every real town (no hoists ⇒ no mesh) and zero at night.

§1.3 THE MAGPIE — +1 draw on screen, exactly 0 otherwise; 182 tris of 900. Territory scales with the
road graph: 6 on the 6.78 km synthetic town, 157 on bendigo's 188.6 km / 2,593 edges, nearest 120 m
from spawn. The latch sets, the day roll clears it, localStorage gains no key and the save never
mentions it. `swoopPos()` is exported and pure. The hat stays cut.

MY OWN SEASON MECHANISM WAS VACUOUS AND THE SWEEP CAUGHT IT: keyed on citySeed alone it produced a
CONSTANT, because the town key is deliberately off the plan — 24 of 24 towns were 214 days from
swooping season, and it would have gated green because `?magpie=1` forces it. Re-keyed on
(citySeed, townKey): `newtown_real` is in season on arrival on the default seed, marrickville is 8 days
out, and 12.9% of 1,000 seeds put the synthetic default in season against a design ratio of 11.5%.

§1.1 THE AUDIO LAYER — six new mixer layers, zero draws, zero tris, seeded anchors, distance falloff,
AND A StereoPannerNode PER LAYER, so direction is real (measured spread -0.71..+0.85) instead of a
limitation written into the notes. Day-of-week derived locally. All six anchored on the default boot;
3 of 6 report `no-anchor` on real towns rather than being faked onto shopfronts. The falsifiability
control — one manifest key renamed away, served from a third port — makes that source report
`no-entry`, 0 plays, never `audible`, with the other five unchanged and zero console errors.

TWO DEFECTS MY OWN GREEN NUMBERS COULD NOT SEE, both caught by a screenshot: the washing shipped at 256
instances / +1 draw / cap respected and was INVISIBLE behind its own back fence (per-instance peg height,
and a fence taller than the hoist), and the magpie perched on THIN AIR over the road. R37's lesson
relearned at full price. Fence 1.60 / hoist 2.15 measured against the object; territories now snap to
furniture.js's own streetlight rule.

LANE E'S PROPS, ADJUDICATED: hoist + aerial permanently primitive (E's spike killed them, and primitive
is also the +0-draw mechanism). `paling_fence` at 1,121 tris x 905 runs = 1.01M triangles — no. The
`magpie` GLB is HELD FOR THE TINT: it reads as a crow, and a magpie seen for 1.2 s in peripheral vision
IS its white bar. My 182-tri bird already carries it, at a fifth of the triangles and no fetch.
furniture.js's "novelty_record is 26.5k tris" was stale by six epochs — corrected to 8,000.

Zero fetch delta: `?noassets=1` fetches the same 23 assets, same list, on HEAD and on R38.
0 console errors on 10 boots (default, classic, yards=0, washing=0&magpie=0&ambient=0, noassets,
magpie=1, darwin, hobart, bendigo, the patched-manifest control) beyond the known PointerLock ones.

Shots: docs/shots/laneB_r38/. Detail + every number: LANE_B_NOTES §38.
2026-08-03 18:53:26 +10:00
m3ultra
1568c9b62b Lane E R38 (v8 wave 1): the asset wave — trellis2_mlx swap verified 1.92x, six sounds, four grounds, and the thin-structure answer
A. PIPELINE FIX: gen_props.py trellis_mac -> trellis2_mlx, contract read from its
   manifest.json. The two operators are NOT drop-in on output — trellis2_mlx writes
   BOTH candidate.glb (raw) and candidate_pbr.glb (baked), so the old
   sorted(rglob('*.glb'))[0] would have silently shipped untextured meshes. Added
   _pick_glb() (result.json first) + the bg_remove_local cutout stage, fail-soft.
   MEASURED: median 128.0s vs trellis_mac's 245.4s p50 = 1.92x. 5/5 first attempt,
   0 retries against the 4-5% budget. One 489s tail outlier, no error — named.

B. AUDIO (1.1) — six PACK entries, +0.86MB, ZERO draws/tris, all originalby
   construction: dog-bark-fence, mower-distant, radio-through-window, sprinkler,
   roller-door, magpie-carol. Seeded via crc32(name); beds fold seamlessly
   (wrap-jump <=0.18x internal step). Verified by spectrogram + band-energy, and
   one defect found by LOOKING: the sprinkler's spray masked its own ticks and read
   as a hose — rebalanced and re-rendered. Distance is spent in the SPECTRUM, not
   the level, because encode()'s loudnorm undoes a quiet render.

C. GROUNDS (1.2) — gen_skins.py had NO ground template; added one with its own
   outdoor style prefix (the house STYLE says "warm fluorescent", an interior cue).
   4 new 512^2 square tiles. Review's 5.7s is 9.7s here — same per-pixel, mine are
   1.78x the pixels. Found: gravel/reddust are selected by nothing partly because
   their `use` values name no slot ground.js:177 has.

D. MESHES — 3 shipped (magpie 894 tris, paling_fence 1121, water_tank 500), all
   GLB-law clean. 2 FAILED and were DELETED: hills_hoist + tv_aerial. Thin wire
   returns as thousands of disconnected fragments, so collapse floors at 250k/89k
   AND a remesh coarse enough for 600 tris erases the pole. Lane B's boxMats
   primitives cost +0 draws and are strictly better. The magpie's geometry passes
   but TRELLIS crushed its white nape/wing to black — traced to the operator's bake
   (the cutout and our decimation are both exonerated); flagged, not hidden.

E. REUSE — all 9 idle assets re-measured; the review's "one line each" holds for
   only 5. furniture.js's extractGLB keeps only the FIRST material, so park_bench/
   coffee_table/box_crate render in material #1 and bench_wood (0 materials) falls
   to grey. Nothing was regenerated that already existed.

The 3 GLBs are staged, NOT published: a depot push is outward-facing and had no
in-session authorization. Held at _r38_results.PENDING_PUBLISH.json; publish +
rename + rebuild lands them. Gate green: validate_manifest 0 errors / 0 warnings.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 18:30:33 +10:00
m3ultra
6bc7926637 Fable (integrator): round-38 instructions — v8 WAVE 1, INHABITATION (audio layer, 23-town character, the magpie, backyard Australia)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 17:49:28 +10:00
m3ultra
e8d4b51c4f Fable (integrator): ROUND 37 CLOSED — v8 wave 0, the floor is level; 14 posters out of the road at +0 draws, two vacuous gates dead, the budget pinned
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 17:43:45 +10:00
m3ultra
b6df11dfd6 Lane F R37 (v8 wave 0, CLOSE): the round gate — QA GREEN 7/0/0/0, flags harness 0 fails / 0 warns, MATRIX GREEN 10 towns x 7 gates
qa.sh --strict --matrix on the true final tree (Lane A e4d7762 + Lane B 47db478/79177bc + Fable
7bd96e5/4a7c0f1 + F 2396885/6afd1ed/f522021), port-isolated on :8975.

  SUMMARY  7 passed · 0 failed · 0 warn · 0 skipped — QA GREEN

  selfcheck   ALL GREEN 157,407/157,407 (was 156,352 — Lane A's +1,055 poster-clearance
              assertions, three arms, all green on the ruled street)
  manifest    0 errors / 0 warnings; atlas-QA 15 atlases, 15 licence lines shown; depot live
  flags       0 fails / 0 WARNS
                classic  fp 0x5f76e76 · dig INERT at the bin · gig layer wholly absent ·
                         162 draws / 16,642 tris · fetch surface CLEAN against v2.1 (125 requests:
                         68 code, 52 same-origin v2.1 assets, 4 depot, 1 NAMED EXCEPTION printed) ·
                         allow-list control fired (2 injected -> 2 named violations)
                default  four flags on · 14 gigs / 14 posters / venue geo / tram · gig golden
                         0xec7a2d39 · 131 draws / 23,382 tris @ venue block · dig REACHABLE naked
                kerb     all six arms green, control at EXACTLY 14 under ?verge=0
                tram     all arms + BOTH controls green
                R11-R36  audio, gigs, continuity, glance, the R30-35 game gates, djdance, real
                         crate, tier-2 kill-the-server: all re-green on the ruled street
  fig-scale   29 figs across 6 shops in [1.4,2.0] m incl. the R36 DJ-body leg
  matrix      GREEN, 10 towns x 7 gates; every town byte-equal on re-boot; 0 fetches under
              ?noassets across all ten; tram verdicts unchanged (fenced on bendigo, fremantle,
              katoomba_real — the same three the rebuilt smoke_tram uses for its absence arm)

One caveat kept in the notes rather than buried, so this round's central finding is not undone by
its own suite: the matrix's budget column (69-161 draws) is DBG.shot('venue_night') CLEAN-LOAD
BOOKMARK numbers, and 37.1 is the proof that a bookmark under-reports a walked-and-turned frame by
~120 draws. That column is a regression signal, not the budget of record. Making the matrix
walk-and-turn every town is a real improvement and a real cost — FILED TO THE v8 DEBT LEDGER, not
smuggled into a floor round.

NO TAG. Wave 0 levels the floor; it does not ship a version.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 17:42:08 +10:00
m3ultra
4a7c0f1295 Fable (integrator): budget PINNED 292/124,793 (the 280-vs-191 split was camera bearing) + ruling on classic's post-v2 fetch delta; stale numbers corrected in Fable-owned docs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 17:22:59 +10:00
m3ultra
6afd1ed7a3 Lane F R37 (v8 wave 0, 0.3): THE BUDGET OF RECORD SETTLED — 292 draws / 124,793 tris, and the 280-vs-191 fight was about the CAMERA BEARING
Two sessions disagreed by 90 draws and neither was wrong. Worst draw per BEARING, 12 bearings x
102 stations down the same spine, one tree, one box: 0deg 284 · 30deg 248 · 60deg 208 · 90deg 177 ·
120deg 196 · 150deg 214 · 180deg 211 · 210deg 207 · 240deg 178 · 270deg 182 · 300deg 223 ·
330deg 267. 110 draws of spread from the camera direction alone, on identical positions -- and the
peak sits at yaw 0, the DEFAULT ARGUMENT of DBG.teleport(x, z, ry = 0). The city-patterns audit
took the default and landed on the worst bearing (280, reproduced at 282-292); the animal spike
supplied a yaw and landed mid-range (191, reproduced at 205-215). Correct numbers, different
quantities. Lane B's independent R37 walk (276 draws / 99,880 tris) and mine (282 / 99,878) agree
on TRIANGLES TO 2 -- the same frame through two harnesses.

THE PIN, default boot, synthetic golden seed, tree 7bd96e5, walked the spine:
  292 draws of 300 (NIGHT, 31 live chunks -- the R+1 dispose window at maximum)
  120,145 tris on synthetic; 124,793 on fitzroy_real, the corpus worst
  ?classic=1: 269 draws / 90,580 tris
  margin: EIGHT draws (the audit said "about twenty") and ~75k tris
The worst-draw frame and the worst-tri frame are NOT the same frame. Real towns are draw-cheap and
tri-dear; the synthetic town is the opposite. The audit's "99k-124k" tri range is confirmed and
pinned at its top.

Also measured: viewport is IRRELEVANT (1280x720 and 2560x1440 identical to the byte -- culling is
frustum-shaped, not pixel-shaped) · the R+1 dispose residue is worth +19 draws, not the 60-80
folklore (the rest is place and bearing) · CitizenSim's per-frame rig-acquisition budget means any
one-render-per-station sampler photographs a half-dressed street · ?r=3 measures 307 draws and
BREACHES the 300 gate through an ungated override (filed, not fixed) · ?shadows=1 costs +38 draws
and +38% tris · Lane B's kerb change independently confirmed at +0 draws / -8 tris at the worst
frame, by a harness B did not write.

THE SHARED INSTANCE CAP: 256, one InstancedMesh, town-wide. Measured +1 draw at every N from 32 to
2048, and N x tris/instance ALWAYS submitted (the instance bounding sphere spans the town). Draws
are not the constraint; triangles are. 256 x a 2-4 tri cell = 512-1,024 tris = 0.5% of budget;
0.01 ms/frame to rewrite every matrix. Binding companions: <=24 tris/instance at the cap, and spend
it PROXIMITY-FIRST -- anchor supply runs from synthetic's 246 poles over 6.8 km to bendigo_real's
7,325 over 188 km, so 256 sprayed town-wide there is one instance per 730 m.

Honest limit stated where the number is quoted: headless SwiftShader cannot change a draw or
triangle count (both are counted in JS, and the viewport control proves it), but frame TIME remains
unmeasured on any real GPU and no v8 proposal may claim a millisecond figure.

Re-pinned in LANE_F_NOTES 37; the four other docs that assert the number are flagged with what each
line should now say rather than edited in another author's file. README flags table gains ?verge=0
(Lane B's control, F's file) and a row naming the ?r=3 breach.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 17:19:24 +10:00
m3ultra
7bd96e57fc Fable (integrator): mid-round ruling — CLASSIC KEEPS ITS PAINT (R27 doesn't apply: no gig layer under classic means no posters means no defect to preserve)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 16:45:40 +10:00
m3ultra
79177bc77c Lane B R37 notes: LANE_B_NOTES §37 + B-progress — the kerb ruling measured, the junction defect recorded, the chunk seam diagnosed
The measurement tables (+0 draws at every walked step on two towns, tris DOWN not up, the
raycast surface table, the ?verge=0 and classic hash pairs, the §0.4 hook proofs), plus
three things worth keeping:
 - the defect my own numbers could not see (every intersection painted shut; all metrics
   green, only the picture wrong) and why ?verge=0 + a screenshot caught it;
 - a full-frame pixel A/B is not an A/B while a live sim is in the frame — hiding
   everything but `ground` is what made the classic covenant measurable;
 - the market plaza reads worse under the wider footpath, and that is the STANDING item
   awaiting John's amendment, not new damage from §0.1.
2026-08-03 16:42:48 +10:00
m3ultra
e4d77629c5 Lane A R37 (v8 wave 0 §0.1, ruling-side): the poster gate was VACUOUS — corrected to three arms with a permanent control
The audit's claim against my lane, re-measured and CONFIRMED exactly: on the default
boot (synthetic 20261990, gigs default-ON) there are 14 posters, all 14 stand inside
e.width/2 — the bitumen ground.js paints — and 0 stand inside the ruled kerb
roadWidth/2. One refinement it did not make: 12 are spine posters at poleOffset=6m,
8m inside the paint (genuinely mid-road); 2 are frontage posters clipping the corridor
edge by 0.06m (FACADE_PROUD past their venue's facade plane).

WHY the gate was green: my placer seats posters via poleOffset, which is DERIVED FROM
roadWidth, and my selfcheck asserted clearance against roadWidth/2. Gate and subject
were the same function agreeing with itself — the R27 cross-convention trap recurring
inside the very file whose header explains it. It never read a number that came from
Lane B, so no change to where the road is painted could make it fail.

The correction (selfcheck.js, districtInvariants), three arms:
  1. no poster on a carriageway — measured through vergeBand(e)[0], the published law
     itself, the same call B's ground now consumes, so gate and renderer move together
  2. every SPINE poster stands INSIDE some edge's vergeBand — the outer bound the old
     check never had ("not on the road" also passed for a poster in a paddock).
     Frontage exempt BY MEASUREMENT: 18/108 gig plans have a frontage poster past every
     corridor edge (worst 3.98m, launceston_real) via plan_osm's lot setback.
     Spine violations over the same corpus: 0/108.
  3. THE CONTROL — count posters standing on bitumen under the PRE-RULING ground
     (?verge=0, road quad = full e.width) and assert it is NOT ZERO on every gig plan
     (min 3 / max 212 / never 0 across 510 plans), pinned at EXACTLY 14 on the default
     boot. A control allowed to drift toward zero is how a gate goes vacuous.
     The replica is pinned to B's FLAG, not to a line number that will drift.

FALSIFIABILITY PROVEN. Simulated ?verge=0 honestly — vergeBand switched to the
pre-ruling reading, poleOffset pinned to the true band so the PLACER stays
byte-identical (it is a render flag: paint changes, plan does not; fingerprint and
every gig golden green in both runs, so the gate's reading is the only variable):
  corrected (R37) gate  →  FAIL, 1020 failures (2 arms x 510 plans)
  pre-R37 (HEAD) gate   →  ALL GREEN 156,352/156,352  — structurally blind

GOLDENS: NOTHING MOVED, ZERO RE-PINS. 0x5f76e76, GIG_GOLDEN 0xec7a2d39, 25 base town
goldens and 24 real-town gig goldens all untouched — correct and predicted, since the
only generator-adjacent file changed is the selfcheck, which validates output and never
produces it. 156,352 -> 157,407 checks (+1,055), 10.3s.

Corridor law CONFIRMED for Lane B, semantics unchanged, contract published in full
(LANE_A_NOTES §37) with four hazards flagged loudly while B consumes it in parallel:
roadWidth and edge.width are both FULL widths but one is carriageway and one corridor
(that naming IS why this bug existed); lane's band is NOT the literal [2,2] the round
instructions state (2 synthetic edges are, 56 real lane edges are [4,4] — branch on
outer<=inner); arcade is all footpath with coincident kerbs to skip; the inward
extension never inverts (0 of 31,039 edges). Two charter numbers corrected: the "9m
band / 18m of every main" figures are synthetic-only — on every real town a main is
24m => 7m band, and the corpus's dominant edge is side@12 at 22,415/31,039 (72%) with
a 3m footpath.

FILED, NOT FIXED — v8 debt ledger, four entries (LANE_A_NOTES §37): D1 chunkIndex
(two impls, THREE divergences, header comment promises a swap that would break three
ways — owner B) · D2 isOpen (three impls + an ad-hoc fourth site; A's canonical one has
ZERO importers; the live shell copy treats no-hours as CLOSED where A's law says OPEN —
latent until v8 adds an hours-less lot — owner F) · D3 two shop registries (B's missing
all three venue kinds => buildings.js:344 renders op-shop signage on every gig venue
since R13 — owner B) · D4 NEW, mine: the poster gate's inner bound is NEAREST-EDGE and
an arcade (kerb 0) camouflages a real carriageway — 8 real-town plans hide a spine
poster up to 1.78m inside a main, 0 on synthetic. Cost measured decision-grade:
synthetic 0/4 plans move, 11/26 town gig goldens re-pin, poster counts unchanged.
Deferred to R38 on purpose — it moves plan output for a reason that is NOT the kerb
ruling, and the "did the kerb ruling move a golden?" answer must stay a clean no.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 16:25:04 +10:00
m3ultra
62c0a2185d Fable (integrator): round-37 instructions — v8 WAVE 0, THE FLOOR (budget re-pin first, the kerb, two gate repairs, the chunk hooks)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 16:03:31 +10:00
m3ultra
c842547e61 Fable (integrator): ROUND 36 CLOSED — v7.0 tagged on 4709cfe; the hold's arc complete; the fork-famine record kept
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-26 00:33:02 +10:00
m3ultra
4709cfece6 Lane F R36 w2.5 (v7.0 close, final): the hold RESOLVED — re-gate 0 fails / 0 warns on the true final tree
§36.4 held -> ruled -> RESOLVED: Fable ruled 'classic keeps its people', D fixed
it in rigs.js alone (2fd4c1c: base-17 restored, the five DJ bodies append behind
djs=dance riding the shell's existing !CLASSIC signal; classic's 129-citizen
census byte-identical to a b339402^ shadow tree). F's full-suite re-gate on the
true final tree (run 3): SUMMARY 7 passed / 0 failed / 0 warn / 0 skipped, QA
GREEN, MATRIX GREEN 10 towns x 7 gates, flags harness 0 fails / 0 WARNS — the
smoke_djdance warn flipped to '?classic=1: zero DJ-body fetches'; default keeps
all 22 bodies, the organic gig-crowd proof, and the DJ figure-scale statures
exactly. Honest record: re-gate runs 1-2 died to a box-level fork famine
(~10,600 leaked m3panel pmset|tail orphans, fixed at source) — starvation
artifacts, not gates; noted in §36.5.

The five-holds law end-to-end in one round: held by F, ruled by Fable, fixed by
the owning lane, re-proven by the gate that held it. Nothing improvised.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-26 00:31:22 +10:00
m3ultra
2fd4c1cf79 Lane D R36 w2.5 (Fable ruling): CLASSIC KEEPS ITS PEOPLE — the 5 DJ bodies gate out of ?classic's pool
b339402 appended the 5 trellis'd DJ bodies to PED_NAMES.normal unconditionally, so
?classic=1 fetched them and its seeded crowd pool widened 17->22 (F's held §36.4 warn).
Ruled option (b): the five gate OUT of classic, mirroring the sit/look/dance !CLASSIC
clip gates. classic is the v2 town INCLUDING ITS PEOPLE; the DJs walk every other boot.

MECHANISM (rigs.js only — zero shell edits): PED_NAMES.normal restored to the covenanted
base 17 (exact pre-July-20 list); the five move to PED_NAMES.djs; loadPedFleet gains
djs = dance (default tracks the existing dance flag, which the shell already passes as
!CLASSIC). Roster = djs ? [...normal, ...djs] : normal — the five APPEND, so no base
slot renumbers: default boot's 22-list is byte-identical to the pre-ruling list and
classic's 17-list is byte-identical to pre-b339402. pickRig maps through pool.length,
so 17 restores the exact pre-July-20 crowd mapping, not merely the width.

MEASURED (fresh contexts, port-isolated no-store servers, seed 20261990):
- ?classic=1: ZERO of the 5 DJ GLBs fetched (21 ped-GLB fetches = 17+2 bodies +
  walk+idle) · pool 17 normal / 19 all · 129-citizen census all base-17 u comical,
  zero DJ · 0 console errors.
- default: all 5 fetched · pool 22/24 · 37 DJ-bodied street peds · F's organic gig
  proof preserved (pinned seed's venue crowd includes dj_phrtt_01 + woman_dj_02) ·
  0 console errors.
- IDENTITY vs pre-July-20: classic booted on a shadow tree with b339402^ rigs.js —
  full 129-citizen (id, pedRoll, pedIndex, pedName) census BYTE-IDENTICAL to the
  gated tree's classic boot. Same crowd, ped for ped, as before July 20.

Known side effect (noted §36): citizens_test.html passes no opts -> its dev harness
shows 17+2; not a covenanted surface, {djs:true} restores it if wanted.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 23:20:52 +10:00
m3ultra
d9d8cbfd3e Lane F R36 w2 (v7.0 close): THE FREEZE — README v7 section, charter risk verdicts, notes §36
README: the v7.0 section (the loop dig->guide->want->travel->list->paper, the
delta-law machinery, the classic covenant) + the morning-paper manual row.

V7_THE_GAME.md: the five charter risks get their retired-or-carried verdicts,
v4-style, written by F under the single-lane-close ruling: economy RETIRED-
structural (the named bot verifier carried to the live tier) · schema drift
RETIRED (three optional widenings, zero migrations) · re-emit identity CARRIED
(never fired; owned-item stability check unbuilt — the next re-emit round owns
it) · scope gravity RETIRED (the stage gates held) · v6 collision RETIRED (the
2 a.m. commits were the one contact, swept R36w1 + gated R36w2).

LANE_F_NOTES §36 + F-progress: the close record — both playtests, E's three
flags closed by measurement, the DJ-roster hold, the full gate numbers
(7 passed / 0 failed / 0 warn / 0 skipped · flags 0 fails / 1 warn (deliberate)
· selfcheck 156,352/156,352 · figure-scale 29 figs incl. the 5 DJ bodies ·
MATRIX GREEN 10 towns x 7 gates · R32-35 smokes re-green on the final tree).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 23:10:34 +10:00
m3ultra
83bce93f82 Lane E R36 w1: the 2 a.m. commits regularized — 9 assets (not 7) swept, Rokoko zone correction, depot 44→53
046668e + b339402 provenance'd: 4 dance clips are ROKOKO free mocap (263 pack,
Mixamo-skeleton export — the brief's Mixamo guess corrected by measurement; new
licence-table zone) and there are FIVE trellis DJ bodies, not three. All 9
sha1-identical to their 90sDJsim originals; chain recorded to source FBXs.

Structural: clips mesh-free 68n/198t/52-joint skin+IBM, 0 NaN, bind 65/66 (only
mixamorigReference unbound); bodies 3998-4000 tris, 1024 webp, no Draco, ped law
PASS. FLAG -> F w2: bodies' bind-pose ~0.99 units vs roster ~175 (cm) — the
figure-scale gate's expected number; rigs.js:163 absorbs it at spawn. No file
touched, nothing fixed in place.

Depot: published per R22 standing authorization via tailnet ingress,
_published.json 44->53, all 9 fetched back from the public depot byte-identical.
validate_manifest 0/0, publish --verify 53/53 live.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 22:43:17 +10:00
m3ultra
24183b1eb3 Fable (integrator): round-36 instructions — the v7.0 close (Fable plays the full loop, E regularizes the 2am assets, F gates and tags)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 22:23:13 +10:00
type-two
25cef5983e Fable (integrator): ROUND 35 CLOSED — the first five minutes land; every v7.0 SYSTEM is built
qa.sh --strict --matrix: 7 passed · 0 failed · 0 warn · 0 skipped, MATRIX 10 towns green. New
STRICT smoke_first_five: the fresh game hunts a roster artist and the splash names hunt + cash
· the beats walked the REAL paths (② at the crate, ③ on the buy, the send-off on the ⚖) · a
returning save gets no tutorial · a second fresh browser hunts the SAME artist (seeded, not
random) · ?game=0 shows nothing · 0 console errors. THE CROSS-ROUND CATCH: the seeded want
moved a fresh-boot invariant (wants 1, not 0) and the R33 gate went red on the FULL run while
green solo — amended to a baseline snapshot, lesson filed in §35 (a feature that moves a boot
invariant must sweep every gate that assumed it; full runs exist for exactly this). Money shot:
docs/shots/v7_beta/first_five_splash.png. Remaining for v7.0: the tour + docs freeze + THE TAG
— which waits for John's hands (the alpha precedent).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 20:13:02 +10:00
type-two
c9e233a7e5 Fable (integrator): ROUND 34 CLOSED — GODBAY hammers, all green; v7.0 needs only the first five minutes
qa.sh --strict --matrix: 7 passed · 0 failed · 0 warn · 0 skipped, MATRIX 10 towns green. New
STRICT smoke_godbay: consigned through the real crate DOM · ONE-HAMMER determinism (a frozen
pre-sleep export slept twice lands byte-identical — the seeded gavel, measured not trusted) ·
honest bounded resolution (net $19 ≤ 2×$24×0.88) · the wake toast carried the morning paper ·
the ride to melbourne hammered a listing on arrival · ?game=0 has no crate to list from · 0
console errors. Money shots in docs/shots/v7_beta/ (the dawn paper + the ⚖ crate). The full
v7 loop now closes end to end: dig the gem → keeper cash now or the gavel tomorrow → the
wantlist points at another town → the ride costs a day and hammers your listings on arrival.
Remaining for the v7.0 tag: THE FIRST FIVE MINUTES (onboarding), the tour, docs freeze — and
John's hands on the whole thing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 19:32:06 +10:00
type-two
776b10b599 Fable (integrator): ROUND 33 CLOSED — THE HUNT lands, all green; the beta's last system is in
qa.sh --strict --matrix on the final tree: 7 passed · 0 failed · 0 warn · 0 skipped, MATRIX 10
towns green. New STRICT smoke_wantlist_travel: ☆→★ through the real card (the save carried
{THE VERANDAHS — 'Servo at Midnight'}) · a keeper muttered the hunted artist within 2 shops
('saw one in Castlemaine just last week') · buying the wanted sleeve cleared the hunt · the
synthetic→melbourne ride cost EXACTLY one day with $179 and the find riding along · the
same-town reboot was free (the control discriminates) · the ride home charged again (day 3) ·
?game=0 built zero want DOM and muttered nothing · 0 console errors. Matrix note: town_matrix
shares one browser across towns so travel drifts the day as it walks — safe because
determinism double-boots the SAME town (free by the same-town rule); reasoned before landing.
Money shots: docs/shots/v7_beta/rumor_and_wantlist.png (the keeper's mutter over the toy
shop's 70s wallpaper + THE WANTLIST open in the crate) + want_card.png. README manual row.
v7.0-beta systems are now ALL BUILT — what remains of v7: Esc-in-person (John's hands), then
the v7.0 close (GodBay offline auctions, THE FIRST FIVE MINUTES, the tour, the tag).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 19:01:40 +10:00
type-two
9aae167d64 Fable (integrator): ROUND 32 CLOSED — v7.0-beta wave 1 all green; smoke_bible + the routing amendment
qa.sh --strict --matrix on the final tree: 7 passed · 0 failed · 0 warn · 0 skipped, MATRIX 10
towns green. New STRICT gate smoke_bible: band law over EVERY bin off the digOffers surface
(80 offers/5 bins), the buy-everything ledger runs on THE GEM'S BIN so the finder-margin leg is
non-vacuous (bin1: 2 gems, grail asking $19 vs keeper $30; ledger closes to the cent — Σask
$333 → Σoffer $135, gems alone +$21, every non-gem strictly negative), scarcity measured
(emptied bin 0/16 on re-open AND across a full reload; 16 pulls in the save) with the ?game=0
negative control re-opening 16/16 (the detector discriminates). sell_routing amended from the
alpha inequality (credited < paid) to the exact formula (credited == min(basis−1, basis//2),
basis = bandLow-or-pricePaid) — the fence moved from the receipt to the band, which is what
charter law #2 always said; it passed on a banded standard item (+$4 on basis $8). _at_bin
grows an idx param (back-compatible). Money shots in docs/shots/v7_beta/ (the guide card + the
crate at the counter). LANE_F_NOTES §32 (incl. the JING5 fresh-checkout trap: gitignored
web/assets/models synced from m3ultra — also un-warned the validator's 15 cross-pack checks).
README manual: the guide/gem/scarcity rows. Remaining beta charter queued in the round doc:
wantlist + rumors · travel costs a day · Esc-in-person · then GodBay.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 18:27:19 +10:00
m3ultra
bb5f36f1e0 Fable (integrator): ROUND 31 CLOSED — v7.0-alpha tagged and pushed; the playtest found what the gates couldn't
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 16:42:36 +10:00
m3ultra
2491f1c8ec Lane F R31 wave 2 (v7.0-alpha close): THE SHOT + the ledger. docs/shots/v7_alpha/crate_panel.png — the alpha's face: Monster Robot Party's real frontage, THE CRATE open with 3 real finds (real cover thumbs, paid/where/day honest), game bar day 1 · $116 · CRATE 3 · SLEEP, driven through the REAL loop with the dig param ABSENT (the R31 flip carries the shot), 0 console errors. LANE_F_NOTES §31 (the flip both ways, the two new gate legs + their negative control, harness lesson #4 — the explicit-flag blindfold, THE BETA QUEUE filed) + F-progress R31. Tag v7.0-alpha rides this commit, LOCAL ONLY — Fable reviews and pushes.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 16:38:07 +10:00
m3ultra
d96cbde004 Fable (integrator): round-31 instructions — the alpha close (wave 0: Fable plays it; then micro-fixes; then the tag)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 15:58:32 +10:00