13 KiB
PROCITY v8 — SOMEONE LIVES HERE (epoch charter — DRAFT, John's rulings recorded)
Fable (m3), 2026-07-26. Built on REVIEW_CITY_PATTERNS.md — a 16-agent top-down audit (5 lane cartographers · asset-capability probe · design research · 4 design themes × adversarial verify · synthesis). That review is the evidence; this is the plan. Read it first — it corrects three numbers this project had been repeating for epochs.
The vision
v7 made the town a game. v8 makes it a place someone lives. Not more systems — more inhabitation: the sound of a life happening off-screen, twenty-three towns that finally look like different towns, a magpie that won't let you walk past it in September, a back yard with washing on the Hills Hoist, and a bloke actually standing at the pie cart that has been sitting unmanned on the street for five epochs.
JOHN'S RULINGS (2026-07-26, recorded verbatim in effect)
RULING 1 — THE KERB: FOOTPATH. ✅
"footpath for sure."
The 9 m band between kerb and shopfront is footpath, not road. Lane A's published corridor
law (roadWidth / vergeBand / poleOffset, registry.js) is hereby the single source of
truth, and Lane B's ground adopts it: extend the existing merged footGeos class inward
from e.width/2 to roadWidth(e)/2. +0 draws (same merged mesh), ~2k tris, fill-rate
improves because 18 m of every main street stops being painted as road.
Consequences, binding:
- The 14 gig posters currently standing in the road land where A already thinks they are.
registry.js's own comment calls that band "verandah'd footpath" andbuildings.jsalready builds an awning over it on every shop lot — so this ruling makes the geometry agree with the code's own documentation. Grass verges survive on residential edges only, where they are period-correct.- Special cases that must be handled or the ruling breaks:
arcade(roadWidth0 → zero-area road quad + coincident kerbs) andlane(vergeBand= [2,2]). - The gate ships with a falsifiability control: run the poster-clearance leg against
?verge=0and assert it FAILS there — the pre-change failure is already known and counted at exactly 14. Keep?verge=0permanently as a gate flag; it costs nothing and it is the best gate design in the review packet.
RULING 2 — REAL TOWNS GET THE CONTENT: FUND THE CIVIC FETCH. ✅
"real towns where possible spread it out."
The review's biggest strategic finding: all 21 real towns are 100% use:'shop' lots with a
single district (mainstreet) — no houses, no yards, no stalls, no market block. Every
residential/market/vendor idea was therefore synthetic-town-only. John has ruled that the
content goes to the real towns wherever possible, which means the fix is funded and moves
into v8 rather than waiting for v9:
- Lane A + Lane E: the third fetch class.
build_towns.pycurrently asks Overpass for shops and roads. It gains a bounded third class —landuse=residential,building=house,leisure=park/pitch,amenity=marketplace/memorial/fuel/school/bus_stop/telephone/post_box— andplan_osm.jsemits more than one district and more than one lotuse. - The data is already half here: the caches in-repo already contain, unused, 30,959 footway ways · 12,351 service ways · 6,421 crossings · 2,714 sidewalk tags · 13,199 oneway tags. Some of the districting can be derived without any new fetch at all — A measures which before E re-fetches.
- Hazard, named now:
build_towns.pyrewrites the whole cache and its own docstring records the Newcastle incident (shops refetched, old roads silently reused). 46 pinned goldens ride on byte-identity nobody has proven. The re-fetch is therefore its own carefully-gated round with per-town before/after diffs — not a step folded into a content round. - Standing Overpass authorisation applies (one bounded query per town, 4 s courtesy, ODbL
attribution into every cache and
SOURCES.md).
RULING 3 — ANIMALS: answered by spike. Generate, don't download. ✅
"idk about rigged animal models... they have different rigging too right? diff skeleton?"
Full answer + intake checklist + vetted sources: ANIMALS_ANSWER.md (5-agent spike: foreign-skeleton loader proof · CC0 source vetting · tiering · adversarial review · Fable's adjudication header, which corrects one over-claimed verdict).
John's instinct was right and it stops mattering. There is no mixamorig for quadrupeds;
every animal ships a bespoke skeleton. But retargeting only exists because our 24 human bodies
share 8 clips — an animal carrying its own baked clips needs none of it. Proven, not
argued: a 10-bone quadruped GLB (leg_fl, tail_01, Blender-style clip names) was authored
byte-by-byte, loaded through our own vendored three.js and our own loaders.js, and played
its own clips through a bare AnimationMixer — 27 assertions green, including pixels changing
on a real WebGLRenderer (1,804 lit px, 704–1,015 changed between frames) and
SkeletonUtils.clone sharing geometry+material across N animals. Also proven in the mirror:
fed to the human stack, buildFigure would measure that dog's "feet-to-crown" at 0.36 m and
scale it 4.9× — silently. Hence the law: animals get a sibling module
web/js/citizens/animal_rig.js importing nothing from rigs.js. ~40 lines. The
classic-covenanted human fleet is never touched.
The ruling is economic, not technical. Measured on a real renderer: 1.00 draw per skinned animal, 1:1, to N=80 — three.js cannot instance animated skinned meshes and our impostor bake crops long low animals. Against that, sixty birds on a wire cost ONE draw between them (one InstancedMesh, one 4-tri billboard, one 1024 WebP species atlas — every future bird species then free). That asymmetry is the whole design:
- Tier 0− — the heard animal. +0 draws, +0 tris. SHIPS. A dog behind a paling fence, a
cockatoo at dusk, at a seeded anchor so it is the same dog on the same street every time.
~30 lines of numpy each in
gen_audio.py. Highest charm-per-minute in the epoch; a town with zero visible animals reads as a town with animals in it. - Tier 0a — the flock. +1 draw town-wide. SHIPS (wave 1). Cockatoo, galah, corella,
lorikeet, perched magpie, ibis as cells in one atlas. Verified free when empty to the
vendored line (
three.module.js:2193-2199returns before the GL call;render.calls++at:4094lives downstream) — a bird-free town costs exactly zero, not "almost zero". - Tier 0b — near props. +1 draw per species. Wave 1.5, ONE species: the ibis head-down in a council bin.
- Tier 1 — the magpie. As already approved. Binding correction carried: territory must
scale with the road graph — 370 pole anchors on synthetic vs 10,014 poles / 13,730 tree
anchors across 2,593 edges on
bendigo_real; a capacity-4 magpie there is a swooping town where you never meet the magpie. - Tier 2 — genuinely skinned: CUT this epoch, and killed by our own spec rather than by
cost: the dog was anchored at
shopFront— tied outside the shops — and a tied dog never trots, so the walk clip that is the tier's entire justification would never play. It returns only with a path, footpath alignment, a collision story and a sim hook the design explicitly disclaims.
So: generate ours, don't go shopping. Nothing on the animal list needs a download. The one
thing genuinely worth grabbing online is not an animal — Quaternius's Universal Animation
Library (CC0, 130+ clips, Mixamo-compatible) is fuel for the human fleet's thin 8-clip
bank; it touches classic-covenanted rigs.js, so it is its own round with its own gates and
must not be folded into animal work.
Two corrections binding on v8 from this spike (both adjudicated in the answer's header):
classic_regression has no network assertion at all and grows an allow-list (never a
deny-list); and furniture.js's module-scope loader is a trap for new assets — fauna.js
is dynamically imported behind its construction guard or carries a CLASSIC-derived module
guard stated in its header. (The spike called the existing four furniture fetches a live
breach; they are not — git-verified as v2-era, 24cef5a, tagged v2.0-alpha→v2.0, i.e. part of
the baseline the covenant preserves. The hazard is real; the breach is not.)
The shape
WAVE 0 — THE FLOOR (one round, three lanes, all micro, must precede content)
0.1 the kerb ruling landed as code + the ?verge=0 control · 0.2 repair smoke_tram (it
asserts one thing, prints a SKIP when absent, and passes on the fenced path — a live
vacuous-gate violation inside our own suite) · 0.3 SETTLE THE BUDGET OF RECORD — now the
round's FIRST job: two independent measurements disagree (280/300 walked vs 191 default /
167 classic by teleport-walk), so nothing spends against a number nobody can reproduce; walk
it on a real GPU, re-pin, and settle ONE shared instance cap while you are there · 0.4 wire
ctx.onChunkBuilt/onChunkDisposed (producer and consumer both shipped since R3, never
connected) · 0.5 give classic_regression a network allow-list (the four v2-era depot
GLBs + same-origin) — it currently makes no network assertion at all, which is why the R36
fetch-surface widening needed a brand-new smoke to catch it.
WAVE 1 — INHABITATION (four parallel one-round items; no clips, no rigs, no mocap
footage — this epoch deliberately does not wait on John's camera)
1.1 the audio inhabitation layer — the review's only unqualified SHIP: a dog going off
behind a paling fence, a mower two streets over, a radio through a window, sprinklers, a roller
door. Zero draws, zero tris, ~30 lines of numpy each. · 1.2 the per-town character vector —
23 towns get a ground palette, ambience mix and sky bias; ground.js merges each surface class
into ONE town-wide mesh, so a palette swap is +0 draws / +0 tris. · 1.3 the magpie —
one bird, six weeks, +1 draw. · 1.4 backyard Australia — Hills Hoists, paling fences,
aerials, tanks, built inside buildings.js's existing boxMats instanced mesh (+0 draws for
the box props). Per ruling 2, 1.4's reach now depends on the civic fetch — it ships on
synthetic immediately and extends to real towns as districts land.
WAVE 2 — THE STREET GETS A VERB (sequential, behind 2.0)
2.0 the street interaction surface (a KeyE verb, an interactRects registry, hit priority,
a click fence) · 2.1 the manned cart — consumes the flagship dead seam (44 cart sites on
the golden seed, 511 across real towns; furniture.js:252 already holds the shop record and
throws it away). Blocker, not cosmetic: the cheap doorRect ride would make every milk bar
and stall un-enterable from the front — the cart must raycast its own InstancedMesh. · 2.2 the
fauna substrate + field guide · 2.3 dogs, tier B first.
Laws (inherited, plus this epoch's)
Everything standing. New for v8: spend triangles, not draws (the walked worst frame is
280/300; tris sit at 99–124k of 200k — every proposal states its draw cost against 280, and a
town-wide InstancedMesh costing 1 draw beats a per-chunk type costing +1 × up to 31 live
chunks) · one instance cap per shared layer, settled once, before three implementations
invent three · the depot is a read-only archive (971 live assets, 53 recorded, known
trademarked items inside) — generate fresh, never pool from it · every new gate copies the
shape of 1.1's control: point one table entry at a non-existent key and assert the leg FAILS.
The cut list stands
Recorded in the review, killed with measurements, not re-opened without new evidence: the town-loop bus (its own gate refuted it — what survives is one file: let the tram run on main+side edges, retiring the same dead seam for +0 draws) · the ute that sells · the charity bin (its filter accepts nothing) · the dusk flush (the day is 240 seconds long) · the magpie hat (no street verb exists) · the OSM level crossing (the rescoped synthetic version survives) · the mail run · parked cars this epoch (deferred, not rejected — and when they land, 45° angle parking is a charter requirement).
Standing — what still needs John
- The market plaza amendment —
ground.jspaints a 46×46 m plaza at the origin, on top of the spine road, touching none of the 40 stall lots. Fixing it changes the covenanted town's visual output. Recommend: fix under the amendment law (the R27 precedent — the covenant is anti-drift machinery, not a defect preservative), as its own small ruling. - hardyards provenance — 39 GLBs that are exactly the vernacular kit's shopping list, with provenance documented for one file. Only John knows where they came from. 🟠 until cleared.
- Where is MOCAPGOD? The fleet docs say lanes 0/A/B are done; on m3ultra the directory is 0 bytes and not a git repo (it lives on gitea and, presumably, ultra). Not blocking — v8 needs no clips — but the fleet docs are wrong somewhere.
- The animal ruling, once the spike reports.