PROCITY/docs/LANES/ROUND8_INSTRUCTIONS.md

194 lines
12 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 — Round 8 lane instructions (from Fable, integrator)
Date: 2026-07-14 · Written after the Fable round-7 review (`16d4f2b`) and the **v2.0-beta
tag** (`4feba02`). You are an Opus 4.8 agent assigned ONE lane (read your session prompt).
Read this file, your lane spec, your `<X>-progress.md`, and NOTES addressed to you first.
Repo state: everything committed on `main` at `16d4f2b`. `tools/qa.sh --strict` GREEN 5/5
with the flags harness **STRICT**. **The streamed roster is the DEFAULT** (`?roster=v1` is
the escape hatch; baseline re-pinned 164 draws / 66k tris; plan goldens frozen at
`0x3fa36874` synthetic / `0x34cfdec0` osm-Melbourne). `?stock=real` puts real GODVERSE
sleeves in record-shop crates and digs. John is pushing main + v1.0/v1.1/v2.0-alpha/
v2.0-beta to origin. fal balance ~$21.36.
## Theme: catch-up + the town comes alive
Round 7 turned the two big keys but **two lanes slipped**: B (weather) and A (osm parity)
have no round-7 work. Round 8 is those debts plus the "living town" tier that the flip and
the stock pack unlock:
- **A and B execute their carried tasks** — B's weather is now also a dependency for D.
- **C widens real stock** (book/toy) and gives the dig a working **buy loop v0**.
- **D makes crowds react** — weather + shop patronage (peds actually enter shops).
- **E feeds packs** and stays the asset kitchen.
- **F graduates the new smokes to strict** and tags **`v2.0-rc`**.
A slip note (this applies to everyone): a lane that can't finish its round MUST commit a
partial + write the cut line in its progress doc before the session ends. Round 7's slips
were silent again — the schedule harness (F) catches them at round end, but a one-line
"stopped at X because Y" turns a re-derive into a resume.
## Prime law (post-amendment state)
Default boot = streamed roster at the re-pinned baseline; plan goldens frozen; everything
NEW still lands behind a default-off flag; flags compose; `qa.sh --strict` green at every
commit. The flags harness is strict — if your feature leaks into the default path, qa fails
and it's yours to fix.
## Integrator decisions (so nobody blocks)
1. **B goes first on weather** (carried R7 brief, unchanged — ROUND7 §Lane B): D's crowd
reactions consume `window.PROCITY.weather`, so B1 landing early unblocks D2. If B slips
again, D ships patronage only (hours-based) and weather-reaction carries — do not fake a
weather source.
2. **Buy loop v0 scope (C)**: in-memory only. Player cash starts at a seeded-per-town float
(e.g. $4060), HUD chip, `onBuy` deducts price + removes the sleeve from the bin +
adds to a simple inventory list (I key). NO persistence (no localStorage — a page reload
resets; that's fine for v0), no selling, no economy sim. Deterministic world, free-agent
player: purchases mutate live room state only, never generation.
3. **Pack expansion (E)**: book spines + toy boxes packs, same pipeline/laws as the record
pack (build-time extract, parody-transform, atlas + index, depot publish, provenance).
Target ~150250 items each; reuse C's schema (already proven); C wires shelves.
4. **Patronage v0 scope (D)**: streamed peds occasionally path to an OPEN shop's door,
pause, "enter" (despawn with a door-swing tell or fade), re-emerge after seeded dwell.
No interior presence (interiors stay player-only this round), no queues. Respect hours
(closed shops get no visitors; the openLate video shop gets night traffic).
5. **Audio stays parked** (needs John's sourcing decision — flagging it: one line from John
unlocks street ambience + door bell, the V2_IDEAS "greenfield" item).
6. **Tag `v2.0-rc`** (F, end of round) when: weather + patronage + buy-v0 + ≥1 new pack
landed and smoke-green, stock/weather smokes graduated strict, qa strict green. Same
no-hostage rule: tag what landed, note what slipped.
## Process rules (unchanged)
- ONE shared working tree; stage only your files by exact path; options before `--`;
`add` new files first; pin a durable lane ref; leave qa GREEN; progress doc + NOTES.
- F owns `web/index.html` + `tools/`; document call sites for F.
- `procityprogress.txt` / `settings.local.json` stay untracked; `pipeline/_stockpack/`
and staging dirs are gitignored — keep build output out of the repo.
- Repo `/Users/m3ultra/Documents/procity`; GODVERSE at `~/Documents/dealgod`; dev `:8130`.
## Sequencing
```
B1 (weather, carried) ──────────→ D2 (weather-reactive crowds) ─┐
E1 (book/toy packs) ──→ C2 (wire shelves) ──┐ │
C1 (buy loop v0) ── independent ─────────────┼──→ F1 (strict graduations + new smokes)
A1 (osm parity + 2nd town, carried) ─────────┘ └──→ F2 (tag v2.0-rc)
D1 (patronage, hours-based) ── independent of B
```
B and E start immediately (both feed others). C1 and D1 need nobody.
---
## Lane A (Citygen) — carried round-7 brief, unchanged
Execute ROUND7_INSTRUCTIONS.md §Lane A verbatim. Summary: (1) selfcheck parity for osm
plans (full invariant suite runs on both sources; F pins both goldens); (2) a second
fixture town (`?plansrc=osm&town=<key>`, checked-in module, zero network, golden pinned —
pick a small coastal/regional strip for contrast with inner-Melbourne); (3) the "add a
town" recipe in LANE_A_NOTES; (4) importer normalizes real-world data to the contracts
(exactly-one openLate etc.) and logs what it changed.
This brief has now slipped twice (R7; and R4R5 for its predecessor). If a full session
isn't available, land ANY complete subset with a cut-line note — parity alone is a fine
round.
**Acceptance**: full selfcheck green on every (source, town); second town boots end-to-end
(or a documented cut); goldens pinned; qa green.
## Lane B (Streetscape) — carried round-7 brief: weather
Execute ROUND7_INSTRUCTIONS.md §Lane B verbatim. Summary: `?weather=1` — seeded per
(citySeed, day) state (clear/overcast/rain) exposed at `window.PROCITY.weather`; rain
particles (ONE draw), wet-ground response, matching sky dome from the existing set; wind
sway if cheap; ≤300 draws worst view; composes with winmap/night (rain-through-lit-window
screenshot); flag-off identical. Tram (`?tram=1`) remains the stretch, only after weather.
**New this round**: D consumes `window.PROCITY.weather` (decision #1) — expose it early
(even while polishing visuals) and document the shape in LANE_B_NOTES: at minimum
`{ state: 'clear'|'overcast'|'rain', intensity: 0..1 }`, stable per day segment.
**Acceptance**: as ROUND7 §Lane B, plus the documented `PROCITY.weather` contract; qa green.
## Lane C (Interiors) — buy loop v0 + wire the new packs
1. **C1 — buy loop v0** (decision #2, in the dig, works with parody AND real stock):
seeded starting cash → HUD chip (street + interior); pulling the front sleeve and
confirming buys it: cash decreases by the sleeve's price, sleeve leaves the bin (bin
mesh updates — your batching keeps dug bins addressable, use that), inventory list on
I. Broke = can't buy (a "not enough cash" tell). In-memory only; reload resets.
Leak/determinism laws: world generation unchanged (purchases are runtime state);
dig soak extended to buy 2 items per visit — no leaks, ≤350 draws.
2. **C2 — wire book spines + toy boxes** when E1's packs land: `?stock=real` extends to
book/toy shelves through the same stockAdapter path (static shelf stock; digging other
shop types is NOT this round). Fail-soft per pack (record pack present but book missing
→ records real, books parody).
3. Keep the pack schema doc current if E's new packs need any field additions.
**Acceptance**: buying works end-to-end in a dig (cash/HUD/inventory/bin-update), soak
green with purchases; book+toy shelves show real stock when packs present, fail-soft
otherwise; ≤350 draws; qa green.
## Lane D (Citizens) — the crowd comes alive
1. **D1 — shop patronage v0** (decision #4, independent of B): streamed peds occasionally
select an OPEN shop within their chunk, path to its door, pause, despawn-with-tell,
re-emerge after a seeded dwell. Hours-aware: closed = no visitors; night = the openLate
video shop is the only draw. Deterministic per seed+time; budget-neutral (it's the same
peds, different paths); leak-free (despawn/respawn through your existing lifecycle).
Behind `?patronage=0` OFF-switch — patronage is default-ON for streamed rosters (it's
crowd behavior, not a new system; the flags-off baseline may move a hair — coordinate
the re-pin with F if draws shift, same protocol as the flip).
2. **D2 — weather reaction** (after B1 exposes `PROCITY.weather`): rain → density drops
(~4060%), walk speed up slightly, more peds choose shop doors (shelter patronage);
clear → v1 behavior. Read the contract from LANE_B_NOTES; do not import B's modules.
3. Re-run the roster soak with patronage on (leak-free over the despawn/respawn cycles).
**Acceptance**: peds visibly enter/leave open shops day-long and cluster on the video shop
at night; deterministic + leak-free + budget-neutral; rain thins and redirects the crowd
(or documented as carried if B slips); qa green.
## Lane E (Assets) — pack kitchen
1. **E1 — book spines + toy boxes packs** (decision #3): same pipeline as the record pack
(`build_stock_pack.py` — generalize it rather than copying), build-time extract from
the GODVERSE datasets (bookgod/toygod per GODVERSE.md), parody-transform, ~150250
items each, atlas + index to C's schema, depot publish + local stage, provenance in
AUDIT.md. Book spines are TALL-thin (different atlas cell aspect) — coordinate the
cell geometry with C before baking.
2. **E2 — pack QA**: extend your provenance-drift gate (or add a small check) to validate
pack indexes — every entry has atlas+UV in range, price band sane, no empty titles —
so a bad bake fails qa instead of rendering blank sleeves.
3. **On-call**: B may want a rain-streak/puddle texture (procedural first, flux_local if
truly needed — free); D may want a door-swing tell sprite (same rule).
4. No fal spends (broken-prop clause stands). Audio assets stay parked (decision #5).
**Acceptance**: two new packs live (depot + staged), indexes validate in qa, C consumes
them; pack-QA gate green; provenance logged; qa green.
## Lane F (Integration) — graduate, marshal, tag
1. **F1 — smoke graduations + additions**: `stock=real` and (when B lands) `weather=1`
graduate warn → strict. New smokes at warn: buy-v0 (open dig, buy 1 item, assert cash
decreased + bin count dropped, 0 errors), patronage (advance time, assert ≥1 ped
despawns at an open shop door over N seconds), book/toy stock (enter book shop with
`?stock=real`, assert real spine meshes), 2nd osm town if A lands (pin its golden).
2. **F2 — patronage default-on baseline**: if D1 moves the flags-off draws/tris beyond
tolerance, re-pin with the same one-commit protocol as the flip (old values in the
message). Plan goldens still frozen.
3. **F3 — tag `v2.0-rc`** (decision #6 criteria; no-hostage rule). Update flags table +
runbook; note anything carried. Remind John of unpushed refs if any remain.
4. **Marshal**: B and A are on carried briefs — check for their commits mid-round; if
either stalls again, note it in F-progress the moment you see it, not at tag time.
**Acceptance**: graduated smokes strict + green; new smokes running at warn; baseline
re-pin (if needed) done by protocol; `v2.0-rc` tagged on a green tree; runbook current.
---
*— Fable (integrator). The machine is built and strict; this round is about the town
feeling inhabited — rain on the awnings, peds ducking into shops, and walking out of a
dig with a record you paid for. Commit atomically, pin your refs, leave it green — and if
you must stop early, say where and why.*