8.0 KiB
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 · evidence: REVIEW_CITY_PATTERNS.md · animals: ANIMALS_ANSWER.md · R37's rulings and debt ledger: 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 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:playSfxis mono with a gain multiplier, so distance works and direction does not. Say so in the notes or budget aStereoPannerNode. Derive day-of-week locally. - 1.2's
statefield is NOT populated on all 23 towns —newtown_godverseandredhill_godversecarrystate: ''. The vacuous arm must be per-town, not per-corpus, or those two silently take a default branch with no SKIP printed. - 1.2's
skyBiasmust NOT go throughlighting.setSky—externalSky(lighting.js:53) is a one-way latch with no un-set path. Feed the baseskyNameselection instead.townCharacter(null)returning the frozen literals makes classic byte-identical by construction rather than by flag — that is the right mechanism, use it. - 1.3: the ice-cream-container hat is CUT (no street verb exists;
index.htmlbinds only] [ P M Tplus 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 onbendigo_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 throughctx.onChunkBuilt, which B wired last round precisely for this. - 1.4 is built INSIDE
buildings.js's existingboxMatsInstancedMesh (it already carries shells, parapets and verandah posts, andbuildHousealready pushes into it) → hoist, fence run, aerial and tank are +0 draws. A separateworld/yards.jscannot reachboxMatsand 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. - 1.4's washing needs an INVERTED wind weight.
wind.js:38-45computeswH = 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. - 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. - 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.
- The budget line every item must answer: margin is 8 draws, and triangles are the
cheap resource (~75k spare). A town-wide
InstancedMeshis 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
- Parallel: E (the asset wave) + B (all four runtime items, procedural-first so nothing blocks on E).
- 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.