137 lines
8.9 KiB
Markdown
137 lines
8.9 KiB
Markdown
# 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: **open, spike running.**
|
||
*"idk about rigged animal models... they have different rigging too right? diff skeleton?"*
|
||
|
||
Correct — there is no `mixamorig` for quadrupeds; every animal asset ships a bespoke skeleton.
|
||
A dedicated spike (foreign-skeleton loader proof + CC0 source vetting + species tiering +
|
||
adversarial review) is running; its answer lands as an appendix to this charter. The working
|
||
assumption until it reports: **tier 0/1 (static + scripted, generated locally for $0) ships
|
||
regardless**, and tier 2 (genuinely skinned, downloaded) is admitted only if the spike proves
|
||
both the mechanism and an affordable draw cost.
|
||
|
||
## 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 re-pin the budget of record to the **walked**
|
||
worst frame (280/300, not the 131 bookmark figure) and settle ONE shared instance cap ·
|
||
0.4 wire `ctx.onChunkBuilt`/`onChunkDisposed` (producer and consumer both shipped since R3,
|
||
never connected).
|
||
|
||
**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
|
||
|
||
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.
|