diff --git a/docs/workshops/economic-built-world-coverage-map.md b/docs/workshops/economic-built-world-coverage-map.md new file mode 100644 index 000000000..9bd271321 --- /dev/null +++ b/docs/workshops/economic-built-world-coverage-map.md @@ -0,0 +1,77 @@ +# Coverage Map — Economic & Built World (round-1 scan result) + +Three repo scans (decisions / workshop outcomes / docs+code) folded into one map. +**This is round 2's foundation: extend what's decided, build the fill seam, don't +re-derive.** Pipeline steps: 1 districts/streets · 2 footprints+interstitial · 3 +building property tags · 4 interiors (lazy, door-triggered). + +## The headline + +The district **skeleton is implemented** (`skeleton_gen.rs` + `district_mix.rs` + +`block_irregularity.rs` — deterministic, tested): district → 4×4 block grid with +layout mode, district-type mix, political archetype, founding orientation, +density, reservations. **Everything *below* the skeleton is stubbed or absent.** + +## Per-step status + +| Step | Decided **+ built** | Contract exists, **fill is a stub** | Genuinely open (round 2) | +|---|---|---|---| +| **1** districts/streets | hierarchy (D-094/222), layout mode (D-096), district-mix (D-194), archetypes (D-212–216), density (D-220), orientation (D-213), world-tier (D-218), execution tiers (D-200/206), provinces (D-205), seed (D-224) | `chunk_layout`, `corridors`, `access_points`, `guarantee_audit` — String/empty stubs on the skeleton | **street/corridor geometry** algorithm; guarantee-audit engine (D-097/103) | +| **2** footprints/interstitial | data structs only (`MultiBlockReservation`, `BlockPlacement`) | — | **chunk fill is entirely unbuilt** (`FillChunk` = no-op; `ChunkGenWorker` returns nothing): footprint subdivision within a block, parks/lots/gardens, building shapes, chunk tessellation | +| **3** building tags | zone-type taxonomy (31 RON files, D-142); tile condition (D-217); subbiome (D-210) | `era`, `society_profile`, `zone_palette` String stubs; **zone-types not wired** to the generator | **building-property-tag schema**; **cultural flavor** (`architecture_flavor`); era-of-construction assignment | +| **4** interiors | — | `floor_zones`/`vertical_corridors` always empty; `ZLevelLoadState::Ungenerated` never fires | **deliberate Phase-6 void** — door-open fill, room/hallway/utility grammar. NOT this workshop. Q-104 (floor↔voxel-z) gates it. | + +## The one real design conflict — resolve in round 2 (Step 3) + +**Abstract heritage roots** (generator-architecture: Frost/Stone/…, D-104/D-105/ +D-READY-9/10 — fully specified, what Miri used in round 1) **vs the corridor +cultural system** (D-167 + world-generation — declared canonical, supersedes the +roots, but the corridor→grammar mapping was left unbuilt). **No migration exists.** + +Resolution (Jeroen): the **`architecture_flavor` per-body profile** — an array in +the body's **wiki frontmatter**, filled by **Gemma** (extending the D-223 naming +cluster), each entry a short architectural/cultural flavor with **allowed** and +**blocked** deviation elements; `cultural_corridor` is only a coarse backdrop. +Round 2 **formally retires the abstract-roots grammar** in favour of this. + +## Frozen-amber + lazy interiors is already canon + +The planet-down-cascade brief states it verbatim: *"Door-per-edge as boundary. +Descriptor + catalog of what's behind the door. No spatial rendering of building +interiors until player crosses threshold."* Step 4 is established + Phase-6-deferred +— we are **not** designing it here. "Frozen" = seed-locked geometry; condition / +overlays / mutators write *over* it (D-100 DamageOverlay, D-217 condition). + +## Locked from the decision walk (inherit, don't reopen) + +- **Seed variance:** economic *strength* authored-fixed (narrative inviolate); + *locations* seed-varied; natural geography heightmap-fixed; names = pool + (Sol exempt). (D-167/D-223/D-227) +- **Frozen-amber enforcement:** hard compile-time wall on *structural* derivation + (no rolling-economy read); a **condition/vitality overlay** is the sanctioned + reader of rolling state (derelict/abandoned/overgrown paint over frozen bones). + Needs a D-198 precision amendment. +- **Generator inputs:** `CityGenerationContext` gains **morphology zone** + the + **per-body cultural profile** (D-199 "more fields permitted"). + +## The round-2 design target: the FILL SEAM (Steps 2–3) + +1. **Street/corridor geometry** — turn the Step-1 stubs (`chunk_layout`, + `corridors`, `access_points`) into a real algorithm; wire D-215 arrangement + patterns; street network within/between blocks. (No curves — ±45° pathfinding cap.) +2. **Building-footprint + interstitial placement** — the Step-2 chunk-fill void: + subdivide a block into footprints + open space (parks/lots/gardens), tessellate + the chunk grid, respect density (D-220). +3. **Building-property-tag schema** — replace the String stubs with a real schema: + what-the-building-is (wire the 31 zone-types), `architecture_flavor` ref, + floor/basement *extent*, access tier, era. This tag is the **seed for the + lazy Step-4 interior** (the door-open trigger reads it). +4. **Cultural flavor + heritage→corridor resolution** — the `architecture_flavor` + frontmatter + Gemma distillation; formally retire the abstract-roots grammar. + +## Implementation blockers (→ cleanup tickets, not design) + +`founding_age_years` NULL on **all 273** inhabited bodies; `economic_tier` NULL +~97%; `economic_role` has 5 spellings; `behavioral_archetype` mostly NULL; +`GenerateSkeleton`/`FillChunk` queue items are no-op stubs; D-222 code rename +pending. diff --git a/docs/workshops/economic-built-world.md b/docs/workshops/economic-built-world.md new file mode 100644 index 000000000..62e5f8c4c --- /dev/null +++ b/docs/workshops/economic-built-world.md @@ -0,0 +1,102 @@ +# Workshop — The economic & built world (Stage 2) + +*Second workshop in the world-derivation arc. The first (D-227 / D-228) settled the +**natural** substrate. This one is Stage 2: the **economic & built** world.* + +## Premise & the order + +The world is built in three stages, **all frozen in amber** — the goal right now +is a deterministic **starting state** we can look at through the Atlas, not a +running simulation: + +1. **Natural world tiles** — terrain / water / vegetation / geology *(done: + D-227 derive-don't-store world model, D-228 composite tile schema)* +2. **Economic world tiles → architecture + infrastructure** ← **this workshop** +3. **Living sim** — NPCs, clutter, the lived-in feel *(deferred — "NPCs follow + the world when it's there"; complicated; later)* + +So: **built structures are IN scope; NPCs / creatures / clutter are OUT.** + +## The load-bearing caveat (pin this) + +> **Settlement, architecture, and infrastructure placement derive from the +> economy's *initial* state + seed — NEVER the *rolling* economy.** + +Rolling-economy placement would make the built world un-re-derivable: a city's +existence or layout would drift as prices move, and you could no longer rebuild +it from `seed`. The physical world is pinned to the economy's **starting +snapshot**. (Persistence model, D-227: the rolling economy is *saved sim-state* +with cache-eviction; it never feeds the derivation of physical form.) + +## What this workshop must produce (→ D-records + tickets) + +Three threads. We do **not** close until they're resolved in records — convergence +on one is not "done" (lesson from Workshop 1). + +- **Q1 — Economy → placement.** How does the *initial* economic state (+ seed + + the natural world from Stage 1) decide **where** settlements, economic + activity, and infrastructure sit? Ports at harbours (D-228 morphology zones), + farms on alluvial plains, mines at lithology/ore, hubs at trade-corridor + confluence. The initial-economics caveat lives here. +- **Q2 — Placement → built form.** How does a placement become actual + architecture / roads / rail / districts occupying voxels (D-227)? This must + **connect to the existing generator-architecture work**, not restart it — + height tiers, z-levels, block/chunk skeletons, cultural room grammar all + already have decisions. The open seam is the *economic → architectural* + hand-off and how built structures sit in the voxel/floor model (D-227). +- **Q3 — Frozen-amber coherence.** Natural (Stage 1) + economic/built (Stage 2) + must compose into **one deterministic starting state** the Atlas can render — + re-derivable from `initial-economics + seed`, no rolling-state dependency, no + squaring, coherent with the baked reliefmap (which is a deterministic *input*, + Q-100). + +## Build on what exists (don't restart) + +- **Natural substrate (Stage 1):** D-227, D-228. +- **Economics:** D-176 (productivity seeding), D-178 (economic model), D-184 + (commodity catalogue), D-199 (economic read-set for city generation), D-189 + (brand layer). Burnelli owns these. +- **Settlement / provinces:** D-191 (Atlas / settlement), D-205 (province + boundaries), D-220 (settlement density — tile scale, density classes, vertical + pressure). +- **Architecture / generator:** D-106 / D-108 (height tiers, rooftop clause), + D-200 / D-201 / D-203 (three-tier execution, region, LRU cache), D-110 (signed + z-levels), D-222 (subtile → district hierarchy), `server/src/.../skeleton_gen.rs` + (Layer-4 block placement), and the prior **`docs/workshops/generator-architecture/`** + rounds. + +## Team & angles (Sonnet-pinned) + +- **Burnelli** — the initial-economic-state → placement driver: what economic + signals (commodity production, trade corridors, harbour quality, agricultural + potential) determine where things go, at what scale, frozen at t=0. +- **Tyre** — the derivation architecture: `initial-economy + seed + natural-world + → settlement → built form`, deterministically; how built structures occupy the + voxel/floor model (D-227); the economic→architectural hand-off seam. +- **Miri** — settlement & cultural architecture: how heritage/culture shapes the + built form on top of the economic skeleton (she led the generator-arch + worldbuilding); keeping it coherent with the Reach's setting. +- **Gestalt** — systems meaning: what built form *does* (movement, access, + chokepoints, asymmetric-info), and what a tile/structure must carry for it. +- **Nigel** — variety: do two economically-similar bodies produce + *categorically* different cities, or same-y grids? Where does sameness creep in? +- **Araminta** — visual architecture grammar: where the visual/render grammar + plugs into the derived built form (lighter touch; structural derivation leads). + +## Round 1 task (each) + +Read this brief + the pointed decisions/code for your angle. Post an **opening +position**: (1) your contribution to Q1/Q2/Q3 from your lens, (2) the key forks / +risks, (3) anything in existing decisions that constrains or contradicts the +approach (especially the initial-economics caveat). Investigation + position, +**not** final design. Flag blockers early. + +## Process + +Round-based. Lead **consolidates** each round (no raw cross-talk dumped at the +principal) and pulls Jeroen in. **Close only when D-records + tickets exist AND +Jeroen confirms the whole problem — not one thread — is resolved.** Teammates +edit nothing; the lead does all git. + +**Heartbeat:** if stuck >15 min on one thing without progress, message the lead +with the blocker — don't silently retry.