120 lines
8.0 KiB
Markdown
120 lines
8.0 KiB
Markdown
# PROCITY — Round 38 instructions (from Fable, integrator)
|
||
|
||
Date: 2026-07-26 · **R37 closed green: the floor is level.** The kerb is footpath at +0 draws,
|
||
14 posters are out of the road, two vacuous gates are dead, the budget is pinned at
|
||
**292 draws / 124,793 tris (8 draws of margin)**, the shared instance cap is **256**, and
|
||
`ctx.onChunkBuilt` is finally subscribable. Round 38 is **WAVE 1 — INHABITATION**: four items
|
||
that make the town feel lived in. **Three of the four are +0 or +1 draws.** None needs a rig, a
|
||
clip, or John's mocap footage.
|
||
|
||
Charter: [V8_SOMEONE_LIVES_HERE.md](../V8_SOMEONE_LIVES_HERE.md) · evidence:
|
||
[REVIEW_CITY_PATTERNS.md](../REVIEW_CITY_PATTERNS.md) · animals:
|
||
[ANIMALS_ANSWER.md](../ANIMALS_ANSWER.md) · R37's rulings and debt ledger:
|
||
[ROUND37_INSTRUCTIONS.md](ROUND37_INSTRUCTIONS.md).
|
||
|
||
## THE CORRECTIONS THAT ARE BINDING (adversarial review already killed the naive version)
|
||
|
||
Do not re-derive these. They cost a review pass each.
|
||
|
||
1. **1.1 is SIX NEW MIXER LAYERS, not "generalise `audio.js:300-311`"** — audio.js has
|
||
hardcoded bed layers per source class, not a generic point-source system. **There is no
|
||
panning**: `playSfx` is mono with a gain multiplier, so *distance* works and *direction* does
|
||
not. Say so in the notes or budget a `StereoPannerNode`. Derive day-of-week **locally**.
|
||
2. **1.2's `state` field is NOT populated on all 23 towns** — `newtown_godverse` and
|
||
`redhill_godverse` carry `state: ''`. The vacuous arm must be **per-town**, not per-corpus,
|
||
or those two silently take a default branch with no SKIP printed.
|
||
3. **1.2's `skyBias` must NOT go through `lighting.setSky`** — `externalSky` (`lighting.js:53`)
|
||
is a **one-way latch with no un-set path**. Feed the base `skyName` selection instead.
|
||
`townCharacter(null)` returning the frozen literals makes classic byte-identical **by
|
||
construction rather than by flag** — that is the right mechanism, use it.
|
||
4. **1.3: the ice-cream-container hat is CUT** (no street verb exists; `index.html` binds only
|
||
`] [ P M T` plus a click that enters a shop). And **the magpie's 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. R37's own anchor-supply measurement says the same: synthetic
|
||
**246 poles / 6.8 km** vs bendigo **7,325 / 188 km**. **Spend the cap proximity-first**
|
||
through `ctx.onChunkBuilt`, which B wired last round precisely for this.
|
||
5. **1.4 is built INSIDE `buildings.js`'s existing `boxMats` InstancedMesh** (it already carries
|
||
shells, parapets and verandah posts, and `buildHouse` already pushes into it) → hoist, fence
|
||
run, aerial and tank are **+0 draws**. A separate `world/yards.js` cannot reach `boxMats` and
|
||
would pay a draw the proposal then presented as its honest cost. **Only the alpha washing
|
||
quads need a new mesh → +1 draw/chunk total, not +2.**
|
||
6. **1.4's washing needs an INVERTED wind weight.** `wind.js:38-45` computes
|
||
`wH = clamp(y/4.4,0,1); wH *= wH` — top-weighted, base planted. Correct for a gum, exactly
|
||
wrong for a sheet pegged at the top. At 1.6 m the amplitude is **0.7–4.5 cm, i.e. visually
|
||
inert**. Either write an inverted-weight sway mode or **drop the washing this round** and say
|
||
which.
|
||
7. **1.4 is synthetic-only until the civic fetch lands** (all 21 real towns are 100%
|
||
`use:'shop'`, one district). It ships on the default boot — which is still the boot every
|
||
player gets — and extends to real towns in a later round. Scope it honestly; do not fake it.
|
||
8. **REJECT the hardyards GLBs on provenance** (39 GLBs, provenance documented for one file).
|
||
Generate ours. This was the best licence judgement in the review packet.
|
||
9. **The budget line every item must answer:** margin is **8 draws**, and triangles are the
|
||
cheap resource (~75k spare). A town-wide `InstancedMesh` is **1 draw at any N**; a per-chunk
|
||
type is **+1 × up to 31 live chunks**. Prefer town-wide. Cap 256, ≤24 tris/instance.
|
||
|
||
## The ledger
|
||
|
||
### 1.1 — SOMEONE ELSE'S LIFE: the audio inhabitation layer *(E + B, F gates)*
|
||
**The review's only unqualified SHIP.** The manifest ships 7 ambience / 9 sfx / 7 music and not
|
||
one animal, domestic or seasonal sound. A dog going off behind a paling fence, a mower two
|
||
streets over, a radio through a window, sprinklers, a roller door, a distant magpie carol —
|
||
the sound of a life happening off-screen, at a **seeded anchor** so it is the same dog on the
|
||
same street every time you walk it.
|
||
**E:** ~30-line numpy generators in `gen_audio.py`'s PACK registry, deterministic via
|
||
`crc32(name)`, 🟢 original by construction. **B:** the six mixer layers + seeded anchor
|
||
placement + distance falloff. **Budget: zero draws, zero tris — the only item in the epoch that
|
||
cannot touch the budget under any circumstance.** Audio pack ~10 MB → ~11 MB against a 25 MB cap.
|
||
**Gate (F):** keep the falsifiability control verbatim — point one table entry at a
|
||
non-existent key and assert the leg **FAILS**. Every other gate this round copies its shape.
|
||
|
||
### 1.2 — TWENTY-THREE TOWNS: the per-town character vector *(B + E, F gates)*
|
||
Twenty-three real towns currently differ only in street layout and shop names. Give each a
|
||
ground palette, an ambience mix and a sky bias. `ground.js`'s `add()` merges each surface class
|
||
into ONE mesh for the whole town regardless of size (verified: exactly 5 meshes) — **a palette
|
||
swap is +0 draws / +0 tris**, the strongest cost claim in the packet. `gravel` (verge) and
|
||
`reddust` (outback) already ship in the manifest and are selected by **nothing**.
|
||
**E:** 3–4 new `gen_skins.py --local` grounds (dry summer grass, cool-temperate grass,
|
||
red-dusted bitumen, coastal sand) so "Darwin is red dust, Hobart is cold light" is real.
|
||
|
||
### 1.3 — THE MAGPIE *(B + E, F gates)*
|
||
Swooping season: for ~six weeks of the game's year, one bird on one street will not let you
|
||
walk past it. Real behaviour — a 6-week window Aug–Oct, and ~90% of males never swoop, so
|
||
**one bird, not a plague**. A static mesh on a scripted parabola (the tram's verified
|
||
position-is-a-function-of-(seed,time) contract), wing wave through `wind.js`'s amplitude
|
||
uniform, byte-identical at amp 0. **+1 draw / ≤900 tris.**
|
||
**Gate (F):** keep "the day-roll clears the latch and localStorage gained no new key" verbatim
|
||
— the best single arm in the packet and a genuine delta-law falsifier.
|
||
|
||
### 1.4 — BACKYARD AUSTRALIA *(B + E, F gates)*
|
||
Hills Hoists, paling fences, TV aerials, water tanks. **181 house and yard lots on the default
|
||
boot with nothing in them.** Per correction 5, inside `boxMats`: **+0 draws** for the box props,
|
||
+1 draw/chunk only if the washing ships.
|
||
*Measured headroom:* the residential district walks at **157 draws / 31,651 tris** worst
|
||
(edge 16, 20 live chunks) against a main-spine control of 263/123,602 on the same build —
|
||
~143 spare draws where these props land.
|
||
|
||
## Laws
|
||
|
||
Everything standing, plus: **every item states its draw cost against the pinned 292/300 and its
|
||
tri cost against ~75k spare** · every new gate ships its falsifiability control demonstrated ·
|
||
classic stays byte-identical **by construction where possible** (1.2's `townCharacter(null)` is
|
||
the model) · `?noassets` fallback for every asset · pathspec-atomic commits · **no tag** — wave 1
|
||
is content, the epoch tags when it is whole.
|
||
|
||
⚠️ **Tree hazard:** a separate background session is editing **`web/js/world/venue.js`** (capping
|
||
town-wide pool instances on real towns). **No lane touches `venue.js` this round.** Expect it
|
||
dirty; commit around it by pathspec.
|
||
|
||
## Order
|
||
|
||
1. **Parallel: E (the asset wave) + B (all four runtime items, procedural-first so nothing
|
||
blocks on E).**
|
||
2. **Then F:** the four gates, full `qa.sh --strict --matrix`, round close. No tag.
|
||
|
||
## Standing
|
||
|
||
Nothing needs John. Carried debt (R37's ledger, unchanged): A's D1–D4 · the matrix's budget
|
||
column is bookmark numbers · `?r=3` breaches at 307 · should `?classic=1` show the town
|
||
selector at all.
|