PROCITY/docs/V8_SOMEONE_LIVES_HERE.md

193 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# PROCITY v8 — SOMEONE LIVES HERE (epoch charter — DRAFT, John's rulings recorded)
*Fable (m3), 2026-07-26. Built on [REVIEW_CITY_PATTERNS.md](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" and `buildings.js` already
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` (`roadWidth` 0 → zero-area
road quad + coincident kerbs) and `lane` (`vergeBand` = [2,2]).
- **The gate ships with a falsifiability control**: run the poster-clearance leg against
`?verge=0` and assert it **FAILS there** — the pre-change failure is already known and
counted at exactly 14. Keep `?verge=0` permanently 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.py` currently 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`
— and `plan_osm.js` emits **more than one district** and **more than one lot `use`**.
- **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.py` rewrites 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](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, 7041,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-2199` returns before the GL call; `render.calls++` at
`:4094` lives 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 — DONE (R37)**: the 280-vs-191 split was the CAMERA
BEARING (110 draws of spread; the audit took `DBG.teleport`'s default yaw 0 = the worst
bearing, the spike supplied a travel-facing yaw = mid-range — both correct, different
quantities). **PINNED: 292 draws / 124,793 tris**, worst-draw and worst-tri on DIFFERENT
frames, 8 draws of margin. Shared instance cap **256**, with ≤24 tris/instance and
proximity-first spending · 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 99124k 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
1. **The market plaza amendment**`ground.js` paints 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.*
2. **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.
3. **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.
4. **The animal ruling**, once the spike reports.