Planet-down cascade workshop (3 rounds, 5 agents): layer-by-layer generation from empty world through population overlay, city planning, and street rendering. Includes consultant review by Troblum. Also commits: pre-Sprint-35 DB backup, Claude Code team-mode tmux test log (team-test.md). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
37 KiB
title, description, type, status, workshop, agent, round, created
| title | description | type | status | workshop | agent | round | created |
|---|---|---|---|---|---|---|---|
| Round 1 Notes — Planet-Down Cascade Workshop | Compiled record of Round 1 outputs: per-agent positions, agreements, disagreements, prerequisite dependency map, and open items carried into Round 2. | workshop | active | planet-down-cascade | qatux | 1 | 2026-05-01 |
Planet-Down Cascade — Round 1 Notes
Compiled by: Qatux
Round: 1 — Inventory and Framing
Participants: Gestalt, Tyre, Paula, Burnelli-Sheldon, Ozzie
Sources: gestalt-round1.md, tyre-round1.md, paula-round1.md, burnelli-sheldon-round1.md, ozzie-round1.md
1. Amendment Absorption — How Each Agent Addressed the Consultant Review
All five agents acknowledged the consultant review amendments before their layer-by-layer inventories. Coverage was consistent.
Amendment 1 (Three-Tier Execution Model)
Gestalt tabulated all six amendments and noted that Layer 1-2 algorithms must now be Rust-implementable on background threads; generate_regional.py becomes reference and validation only.
Tyre dedicated a "Priority 0: The Architectural Pivot" section to documenting exactly what changes from his Round 3 design. He listed: Layer 1-2 now runs as Rust runtime on background threads; settlement positions, road graph, and territorial status are derived at runtime per body and cached in session memory; generate_atlas.py + planet_simulation.py Python infrastructure stays for heightmap generation and build-time data, but spatial understanding moves to Rust.
Paula noted Amendment 1 is architecturally consistent with her Round 4 argument. The runtime background model means the attractor-matching algorithm runs at Layer 1-2 background time, not build time, with systems.db available for corp cross-reference resolution.
Burnelli-Sheldon stated Amendment 1 is a "clean win for economics" — the economic simulation runs on system-level aggregates already in systems.db. Layer 1-2 spatial data is consumed by Layer 3-4 but does not feed back into the sim.
Ozzie acknowledged the execution model change in the context of Amendment 2's priority queue; did not detail the technical split.
No agent incorrectly used the old two-tier Phase 3/Phase 5 framing in any design proposal. Tyre was the only agent who had designed against the old model and documented the correction explicitly.
Amendment 3 (Fully Generative Placement)
All five agents acknowledged that L1-Q1, L2-Q1, and CL-Q4 are eliminated. All five noted the two new questions: attractor-matching algorithm and name reservation fulfillment.
Paula described Amendment 3 as "narrative-positive" — fully generative placement architecturally guarantees the causal chain she argued for in Round 4.
Ozzie flagged that fully generative placement makes the drainage algorithm the only source of truth for rivers; if it produces anomalies, trust breaks.
Amendment 5 (Determinism Rationale Corrected)
Paula explicitly revised her Round 4 framing: the two-field model is a "rendering legibility requirement," not a "ghost city architecture." Ghost city effects are emergent consequences of the prosperity system working correctly on failed settlements.
Gestalt listed Amendment 5 and noted that CL-Q3 (ruin lifecycle) is reduced to an emergent rendering consequence; prosperity_delta is always derived, never stored.
Ozzie accepted the reframe but added a player experience requirement: the visual difference between an active and ghost settlement must be "immediately readable" — the player should not need a prosperity readout.
Amendment 6 (Weight Table Unlocked)
Addressed in full in Section 4 of these notes.
2. Questions Eliminated Before Round 1
The following questions were eliminated by the amendments. No agent revisited them as open questions:
| Question | Eliminated by | Resolution |
|---|---|---|
| L1-Q1 (authored rivers vs. drainage network) | Amendment 3 | Rivers fully generated from drainage simulation |
| L2-Q1 (city positions anchored vs. re-derived) | Amendment 3 | All city positions are generator-derived |
| CL-Q4 (authored rivers, elevated) | Amendment 3 | Same resolution as L1-Q1 |
3. New Questions Added by Amendment 3
| Question | Who introduced | Priority |
|---|---|---|
| Attractor-matching algorithm: How does the generator match N named cities with known economic roles to M geographic attractors? | All five agents acknowledged it; Gestalt, Tyre, Burnelli-Sheldon, Paula each offered algorithm sketches | PREREQUISITE — blocks all Layer 2 settlement placement |
| Name reservation fulfillment: What data structure represents name reservations from systems.db, and when does the generator fulfill them? | Gestalt, Tyre, Paula | PREREQUISITE — corporate cross-references must resolve |
| NEW-Q2 (OrganicGrowth disambiguation): How does the data model distinguish OrganicGrowth settlements from "no settlement placed"? Both conditions produce zero geographic attractors. | Paula | PREREQUISITE — blocks FoundingOrientation derivation |
4. Amendment 6 — Weight Table Challenge
Consensus finding
All five agents supported the population-plus-age baseline approach over retaining the existing 10×9 table. No agent defended the existing table.
Gestalt, Tyre, and Burnelli-Sheldon each stated the core theorem independently: concentrated labor produces service demand regardless of what that labor produces. Miners drink.
Ozzie stated this as the "player experience imperative" for the entire workshop.
Three independent proposals
The three agents who proposed concrete alternative frameworks each approached the structure differently. These are not reconciled proposals — they are distinct inventories for Round 2:
Gestalt — Two-Layer Model:
- Layer 1: Population-tier district guarantees (minimum viable district set by settlement size: outpost / town / small city / full city tiers)
- Layer 2: Economic role as character modifier (the character of each guaranteed district type varies by economic role, expressed through
density_pct,prosperity_baseline,perimeter_treatment) - Recommends: replace the 10×9 table entirely; repurpose it as a character modifier table rather than a presence/absence table
Tyre — Population+Age Baseline with Formula: Specific baseline fraction formulas:
baseline_residential_frac = 0.35baseline_commercial_frac = clamp(0.10 + log10(population/1000) × 0.05, 0.10, 0.25)baseline_entertainment_frac: 0.0 below 10,000; 0.05 at 10k-100k; 0.10 above 100kbaseline_administrative_frac: 0.0 (Waypoint), 0.05 (Passage), 0.10 (Backwater+)- Remaining fraction distributed by economic role weight table (retained as "secondary allocation modifier," values renormalized)
- Notes: weight table renormalization is "arithmetic work, not design work"
Burnelli-Sheldon — Three-Component Model:
- Component 1: Population tier guarantees (explicit table by settlement tier: Outpost guarantees Residential+Mixed; Town adds Commercial; City adds Entertainment; Large City adds Administrative)
- Component 2: Economic role as multiplier (not on/off). Replaces the 10×9 table with a multiplier table where no value is ever zero (minimum 0.2, maximum 3.0). Proposes a full 10×9 replacement table with explicit values for all cells
- Component 3: Settlement age as character modifier (
founding_age_yearsmodifies district character and quality, not district count or type; capped by WorldTier ceiling) - Mining row: Ent = 0.5 in the new table. Energy row: Ent = 0.2.
Points of agreement across all three proposals
- No settlement type should have zero of any essential district type
- Economic role modifies the proportion and character of districts, not their presence or absence
- Population drives the guaranteed baseline
- Settlement age affects character, not structure
Open sub-questions raised
Burnelli-Sheldon raised three sub-questions for Round 2:
- BS-Q1: Is the 9,999-person Town without a dedicated Entertainment district plausible? (Flagged for Gestalt's "does this feel inhabited" check)
- BS-Q2: How does
founding_age_yearsinteract with WorldTier ceiling? Proposed: age modifier only applies at Town tier and above - BS-Q3: Energy row Entertainment weight of 0.2 may produce zero dedicated Entertainment districts at some district counts; guarantee floor is doing the work, not the weight
Paula added: topographic modifier to prosperity_baseline (+0.05 for hilltop districts, -0.05 for flood-adjacent districts). This is distinct from — and additive to — Burnelli-Sheldon's gradient direction formula.
5. Attractor-Matching Algorithm — Four Positions
Four agents proposed algorithm frameworks. These are not identical; Round 2 must resolve them.
Gestalt — Scored Greedy Assignment
1. Score all (city, attractor) pairs: base score = attractor quality score,
weighted by population / attractor capacity; role bonus by (economic_role, attractor_type) match
2. Hard constraint pass: lock corp-required assignments first (score → 0.0 if incompatible)
3. Greedy assignment: highest-scored pairs assigned first, consuming attractor capacity
4. Overflow: less-ideal placements for cities that couldn't get preferred attractor type
Framing: "constraint satisfaction" — hard constraints first, soft constraints as scoring.
Tyre — Greedy Bipartite, Hungarian Available
1. Sort named_cities by population descending
2. Score each (city, attractor) pair: base_score = attractor.quality_score + role_bonus + hq_constraint
(hq_constraint: score → 0.0 if attractor_type incompatible with corp's primary_operation)
3. Greedy assignment: for each city in sorted order, assign to highest-scored available attractor
4. Overflow: place near existing settlements (proximity placement within [15-40%] of body scale)
5. Derive FoundingOrientation from assigned attractor_type
Notes: O(N×M) where N ≤ 30, M = 50-100. "Negligible compute." Tyre recommends Hungarian algorithm for correctness (O(N³), trivially fast at N ≤ 30) with greedy as first implementation.
New schema required: atlas_city_names table (name + economic_role + population + hq_for_corp). Replaces authored position storage in atlas_cities.
Burnelli-Sheldon — Comparative Advantage Matching
1. Score matrix S[city_i, attractor_j] = compatibility(city.economic_role, attractor.feature_type)
(provides full compatibility matrix: agricultural/very-high at ArablePlain, extraction/very-high at ResourceConcentration, etc.)
2. Hard constraints: HQ-locked cities must use compatible attractor type
3. Solve: maximize sum of compatibility scores, one-city-per-attractor
(Hungarian algorithm or greedy by largest gap if N << M)
4. Overflow: generate synthetic attractors as secondary sites (river bends, coastal plains) by seed
Framing: "comparative advantage" — each city has an economic role implying preferred attractor; matching maximizes aggregate plausibility.
Raised: what does it mean for a body to have more cities than geographic attractors? Proposed: high-tier economic worlds override geography (manufacturing, service, commercial roles on high-economic_tier bodies). Synthetic attractor placement at seed-derived offsets along existing road corridors.
Paula — Priority-Ordered Assignment with Named Cities
1. Fulfill name reservations for HQ cities in economic role order:
extraction corps first (most geographically constrained), service/commercial corps last
2. Assign remaining named cities by population (largest first)
3. Place unnamed cities at remaining attractors by best-fit economic profile
4. OrganicGrowth settlements (remaining population quota after attractors consumed):
placed at politically significant points (Province centroids, midpoints between large cities)
Adds: mismatch flagging (corp HQ placed at geographically inappropriate attractor → flag for lead review, not silent placement). Distinguishes geographically_triggered: bool flag on settlement records. OrganicGrowth disambiguation: geographically_triggered = false, FoundingOrientation = AdminFacing.
Ozzie — Player Experience Constraint
Ozzie did not propose an algorithm but stated a player experience requirement: no placement should violate geographic common sense. "A fishing port in the mountains cracks the world." Framing: each city placement should feel "inevitable, not arbitrary."
Summary of differences
| Point | Gestalt | Tyre | Burnelli-Sheldon | Paula |
|---|---|---|---|---|
| Assignment method | Greedy by score | Greedy by population-sorted order; recommends Hungarian | Hungarian (maximize compatibility sum) | Priority-ordered by corp constraint → population → unnamed → OrganicGrowth |
| Overflow handling | Less-ideal placements | Proximity near existing settlements | Synthetic attractors from seed | OrganicGrowth at Province centroids or political midpoints |
| HQ hard constraint | Score → 0.0 if incompatible | Score → 0.0 if incompatible | Must use compatible attractor | Fill first, by economic role constraint order; flag mismatches |
| FoundingOrientation | Implicit (derived from attractor type) | Explicit derivation step after assignment | Not addressed | Flagged as trivial lookup; OrganicGrowth → AdminFacing |
6. Spatial Hierarchy — Tyre's Dimension Proposal
Tyre is the only agent who proposed concrete dimensions for the full eight-tier hierarchy. No other agent disputed these numbers in Round 1; the workshop must confirm or amend in Round 2.
Proposed dimension table
| Tier | Name | Base unit | Physical scale (reference body) | Notes |
|---|---|---|---|---|
| 0 | Chunk | 64×64 sim tiles | ~32m × 32m | Immutable — prior architecture depends on this |
| 1 | Block | 128×128 sim tiles | ~64m × 64m | 2×2 chunks |
| 2 | District | 512×512 sim tiles | ~256m × 256m | 4×4 blocks, 8×8 chunks |
| 3 | Region | city district grid bounding box | varies per city size | Semantic tier, not a storage tier |
| 4 | Province | 1 drainage basin on regional grid | ~60-200km | Variable — defined by watershed analysis |
| 5 | Area | 1 contiguous terrain feature zone | ~400-1500km | Defined by terrain class connectivity |
| 6 | Body | full surface | varies | Body size absorbed here |
| 7 | System | star system | — | Gate graph |
Reference body calibration: temperate terrestrial, radius ~5,000km. Atlas heightmap pixel scale at equator: ~61km/pixel. Regional cell (8×8 pixels): ~500km × 250km.
Body-size-to-area-count formula (Tyre)
area_count = round(sqrt(body_surface_area_km2 / 6_000_000))
- Reference body (radius 5,000km, surface ~314M km²): area_count = 7
- Small moon (radius 500km, surface ~3.14M km²): area_count = 1
- Super-terrestrial (radius 10,000km, surface ~1.256B km²): area_count = 14
Schema dependency: body_surface_area_km2 (or radius) must be in the bodies table. Tyre flagged this as possibly missing.
Paula's vocabulary mapping
Paula mapped her Round 4 "regional cell" language to the new hierarchy:
- "Regional cell (64×32 grid)" = Province (tier 4)
- "City footprint" = Region (tier 3)
- Sub-settlements at or below Region depending on population tier
Paula noted that Province dimensions must be confirmed before TerritorialStatus quantitative thresholds can be finalized.
7. Technical Blockers — Tyre's Four Prerequisites
Tyre identified four items that must be resolved before Layer 1-2 Rust code can be written:
| ID | Question | Stakes |
|---|---|---|
| ARCH-1 | Heightmap storage format: float32 LE BLOB in new atlas_body_heightmaps table? Compression? |
Blocks all Layer 1-2 Rust. Heightmap currently not in systems.db. Size: 512KB/body, ~200MB for 400 bodies. |
| ARCH-2 | Session state representation: BodyWorldState as Bevy Resource, LRU eviction policy? |
Blocks Layer 2 → 3 handoff. Tyre proposes LRU at 50 bodies (~100MB cache target). |
| ARCH-3 | atlas_city_names schema: replaces or extends atlas_cities? |
Blocks attractor-matching algorithm. atlas_cities currently stores authored positions; those are now runtime-generated. |
| ARCH-4 | Body physical size field in bodies table: present or must be added? |
Blocks area-count formula. |
Tyre's BodyWorldState definition:
pub struct BodyWorldState {
pub body_id: String,
pub river_network: RiverNetwork,
pub settlements: Vec<GeneratedSettlement>,
pub road_graph: RoadGraph,
pub territorial_grid: Vec<TerritorialCell>,
}
Nothing in BodyWorldState is serialized. Session resume reruns generation from systems.db + world seed.
8. Layer-by-Layer Inventory Summary
Layer 1 — Empty World
What exists or can be reused (all agents):
planet_simulation.py: drainage/river algorithm (Python reference; must port to Rust — Tyre)- 64×32 regional biome grid (
atlas_regional_biomes): already in systems.db from build-time — Tyre is_coastal,water_fraction,terrain_roughnesscolumns: already onatlas_regional_biomes— Gestalt
What is genuinely novel:
- D8 drainage routing in Rust (Tyre: ~50ms on 512×256 heightmap; Priority-Flood D8 algorithm)
- Geographic feature tag extraction: the seven tags (RiverConfluence, CoastalHarbor, MountainPass, ArablePlain, ResourceConcentration, Defensible, NaturalBarrier) do not exist; derivation rules per tag are novel (Paula provides per-tag derivation criteria)
- Sub-biome variant classification: seed-derived per cell, 3-4 variants per biome class (Gestalt, Tyre)
- Mountain pass identification: high-roughness cell adjacent to lower cells on opposite sides; threshold not yet set (Gestalt)
Paula's distinction for ResourceConcentration: This tag is not purely terrain-derived. It requires economic_role from systems.db to set its placement threshold. This connects Layer 1 feature extraction to L1-Q4 (biome prior).
Tyre's schema proposal for Layer 1:
- New table:
atlas_body_heightmaps(body_id, width, height, elevation_f32_le BLOB, sea_level, seed) - Extended columns on
atlas_regional_biomes:sub_biome_variant,terrain_modification_cost,geographic_feature_tags(JSON array) - Tyre proposes:
sub_biome_variantandterrain_modification_costcomputed at build time ingenerate_atlas.py(terrain dict is already in memory at that point), saving runtime derivation
L1-Q4 (biome prior): Three agents addressed this:
- Tyre: include it; technical cost = trivial; self-contradiction risk is real
- Paula: include it; narrative justification:
frontiereconomic_role with tropical paradise biome is dissonant without a prior - Burnelli-Sheldon: include it; listed as economics primary question with "pure quality improvement" classification
No agent opposed inclusion. Gestalt classified it as "independent" (low-risk, can be deferred).
Layer 1 performance (Tyre estimate):
- Load heightmap BLOB: ~5ms
- D8 drainage routing: ~50ms
- Extract river centerlines: ~20ms
- Geographic attractor extraction: ~5ms
- Sub-biome variant sampling: ~2ms
- Subtotal Layer 1: ~82ms
Layer 2 — Population Overlay
What exists or can be reused:
- Sub-settlement placement triggers: designed in Round 3 (all agents)
- Road graph algorithm (Phase 3 Layer C): carries forward; Amendment 3 means all roads are now generated (no authored road reconciliation needed)
- TerritorialStatus derivation algorithm: qualitative logic established (Paula Round 4); thresholds not yet quantified
What is genuinely novel:
- Attractor-matching algorithm (see Section 5)
- Name reservation fulfillment data structure (see Section 5 / Tyre's
atlas_city_namesproposal) - OrganicGrowth disambiguation (Paula NEW-Q2)
- TerritorialStatus quantitative thresholds (three proposals; see below)
- Hinterland shape algorithm
L2-Q3 (road algorithm under Amendment 3): Amendment 3 eliminates authored road paths. Tyre's road algorithm generates all topology. Named highway routes receive identity via post-generation assignment. Paula notes road segment table in session DB needs an optional named_route_id foreign key to systems.db (schema question). No disagreement on this resolution.
L2-Q4 (hinterland shapes):
- Paula: no Voronoi; weighted probability assignment per Province cell, clustered along river corridors and coastal lowlands, weighted by
terrain_modification_cost - Burnelli-Sheldon: per-
economic_rolehinterland fill (agricultural: farmland + irrigation; extraction: access corridors; transit: dense road/rail). Did not address Voronoi question directly. - Gestalt: cluster around agricultural cities + river corridors at density ∝ 1/terrain_modification_cost (consistent with Paula)
L2-Q5 (TerritorialStatus thresholds) — three proposals:
| Status | Paula (settlement + road coverage) | Tyre (density formula) | Burnelli-Sheldon (economic proxies) |
|---|---|---|---|
| CoreTerritory | ≥2 per Province; road coverage ≥0.6 | settlement_density >1 per 4 cells OR road within 2 cells of City/Town | settlement_density ≥1 per province + road maintenance on all connecting edges |
| FrontierTerritory | ≥1 per Province; road 0.3-0.6 or quality <0.5 at edge | settlement + road within 5 cells, or within 3 cells of City/Town without road | settlement + road density <0.5 of CoreTerritory avg for this economic_tier |
| ExtractiveZone | ≥1 at ResourceConcentration; extraction corridor ≥0.7, off-corridor <0.3; corp_presence >0 | ResourceConcentration attractor + Corporate corp + road marked Corporate | ResourceConcentration feature + corp_presence w/ matching commodity + road to resource |
| ContestZone | ≥2 from competing road authority types; overlapping claim | two CoreTerritory zones from different political archetypes overlapping within 2 cells | two settlement clusters, distance <2×footprint_radius, different political_archetype or dominant_faction |
| WildernessBuffer | 0 settlements, 0 roads | no settlement within 8 cells + no road within 3 cells | no settlement placed |
| AbandonedZone | ≥1 at generation (runtime: 0 active), roads exist but maintained=false | settlement placed + no active corp_presence + economic basis ≤0 | settlement placed + corp_financial_state.health_metric <0.2 for all operating corps at founding time |
These are three different threshold specifications. Round 2 must reconcile them.
Paula added: AbandonedZone requires a placed_at_generation: bool marker on the Province to distinguish "never settled" from "was settled, now gone." This marker is set at Layer 2 generation time and is immutable.
L2-Q6 (latent settlement flag storage): All agents agreed: session DB (Bevy Resource / BodyWorldState), not systems.db. No agent supported a systems.db write path for runtime-variable settlement state.
Layer 2 performance (Tyre):
- Attractor matching: ~1ms
- A* road routing (MST): ~30ms
- Sub-settlement placement: ~5ms
- Territorial status propagation: ~15ms
- Subtotal Layer 2: ~51ms
- Total Layer 1-2: ~133ms (5× safety margin: ~650ms; still under 1 second)
Layer 3 — City-Level Planning
What carries forward without change (all agents):
- DistrictSkeleton Stages 1-2 (D-C3)
- City decomposition formula (D-C4)
- City-local coordinate system (D-C5)
- SeedChain / FNV-1a (D-C6)
- GeneratorChunkData upgrade (D-C7)
prosperity_baselineandperimeter_treatmenton DistrictSkeleton
CityGenerationContext struct update (Tyre):
Fields added: body_id (consultant open item), city_name, founding_orientation (Layer 2 output), district_grid_width, district_count. WorldTier corrected enum remains a blocker.
WorldTier enum (Tyre): Current code has Peripheral | Connected | Core (wrong). Required: Epicenter | Regional | Backwater | Passage | Waypoint. Tyre flagged this as still an unaddressed blocker; "first ticket, 0.5 dev-days."
L3-Q1 (FoundingOrientation spatial effect):
| Agent | Position |
|---|---|
| Gestalt | Spatial grid rotation. Directional legibility is a gameplay mechanic. |
| Tyre | Spatial orientation change; orientation_rotation: CardinalDirection field added to district placement. |
| Paula | Spatial rotation. "The geographic rationale is physically visible in the city's layout." |
| Burnelli-Sheldon | Owns gradient formula; topo sets gradient direction, distribution_index sets magnitude. Did not explicitly address spatial rotation vs. gradient question. |
| Ozzie | Backs explicit spatial arrangement; "PortFacing city should be legible from approach." |
Consensus: spatial rotation, not gradient direction only. Gestalt, Tyre, Paula, and Ozzie align. Burnelli-Sheldon's formula addresses gradient direction as an input to the formula; this is consistent with spatial rotation.
L3-Q2 (political archetype as spatial arrangement):
| Agent | Position |
|---|---|
| Gestalt | Explicit for primary three archetypes (CompanyTown, AdminCapital, FreePort). Emergent for secondary. |
| Tyre | Explicit for three archetypes; 30-40 lines of Rust code. Same three archetypes as Gestalt. |
| Paula | Explicit arrangement for all five archetypes: CompanyTown (spine), AdminCapital (radial), FreePort (multi-node), Contested (overlay), OrganicGrowth (irregular local density) |
| Ozzie | Backs explicit; player should feel CompanyTown's spine "before you know it's a CompanyTown" |
Difference: Gestalt and Tyre limit explicit patterns to three primary archetypes; Paula proposes explicit patterns for all five. No agent backed emergent-only.
L3-Q5 (prosperity_baseline formula):
- Burnelli-Sheldon's formula from Round 4 carries forward as base
- Paula advocates for a topographic modifier: +0.05 for hilltop districts (top 30% elevation for city), -0.05 for flood-adjacent (bottom 20% relative to sea level)
- Burnelli-Sheldon's position: topography sets gradient direction;
distribution_indexsets magnitude. The formula in the brief already specifies this. - Gestalt: listed L3-Q5 as independent (not prerequisite); position deferred
- No blocking disagreement; Paula's topographic modifier is additive to Burnelli-Sheldon's formula
L3-Q6 (sub-settlement codepath): Paula and Gestalt both: unified codepath; town with district_count = 1. Tyre: no explicit position but did not propose a separate path. Burnelli-Sheldon: listed as "no economics objection" to unified path.
L3-Q7 (port/station direction):
- Paula: defers from minimum viable; designs the mechanism (one-query, one-lookup, one-edge-assignment); worth designing even if deferred
- Ozzie: wants this badly ("if I'm standing in the Transit district, I want to see the beanstalk")
- All others: classified as deferred
Layer 4 — Street-Level Rendering
What carries forward without change:
- Chunk streaming architecture (
chunk_streaming.rs) - TileEntry struct upgrade (D-C7)
- Phase 2 tile algorithm (street skeleton first, building fill by density)
- SeedChain for chunks
L4-Q1 (economics-variable rendering mechanism):
All five agents converged on option (c): threshold-crossing cache invalidation.
- Compute-live-per-frame (option b): rejected by Tyre and Paula; too expensive; no fidelity gain
- Bake-at-generation+event (option a): Tyre notes this is "similar to option c" but requires an event system; threshold crossings are strictly cleaner
- Consensus: cache per chunk, invalidate on threshold crossing
Specific implementations differ:
- Tyre: invalidation when
|prosperity_current - prosperity_snapshot| > 0.05;ChunkConditionStatestruct withprosperity_snapshot: f32andtile_conditions: Vec<TileCondition> - Paula: threshold crossings at 0.63 / 0.43 / 0.23 (offset from round numbers to avoid oscillation at boundaries); sim emits "prosperity crossed threshold X" event; renderer invalidates on receipt
- Gestalt: threshold levels at 0.6 / 0.4 / 0.2 (round numbers)
Slight difference: Paula proposes offset thresholds (0.63/0.43/0.23) to avoid oscillation; Gestalt proposes round numbers (0.6/0.4/0.2). Not a disagreement in principle.
L4-Q4 (interior generation trigger):
- Gestalt: pre-fetch (option a) for target; on-entry (option b) for minimum viable
- Tyre: pre-fetch (option a); N = 32 tiles (one chunk width)
- Paula: pre-fetch; emphasizes this is a mechanism question, not a generation question
- Ozzie: pre-fetch (option a); "generation stall at the door breaks immersion"
Consensus: pre-fetch is target; on-entry acceptable for minimum viable. All four agents who addressed this agree.
L4-Q5 ("scatter civilization" scope) — flagged tension:
- Brief deferred prop/decal scatter and entity spawn points
- Ozzie: "scatter is not optional." Street-level decals and prop spawn points are "the minimum viable lived-in feeling." An empty street grid with only floor/wall tiles "has no soul."
- No other agent directly addressed this question in Round 1
This is the only point where Ozzie's position (flag deferred scope as insufficient for player experience) runs against the minimum viable slice as stated in the brief. The brief's deferral is architectural scope; Ozzie's concern is player experience quality. Round 2 should address.
L4-Q6 (prosperity_delta): All four agents who addressed it agree: two-field model (prosperity_baseline + prosperity_current); prosperity_delta always derived, never stored. Paula frames this as "rendering legibility requirement." Burnelli-Sheldon listed CL-Q1 as requiring only a naming lock.
9. Gestalt's Prerequisite Dependency Map
Gestalt produced the full dependency map for the workshop. Reproduced here for reference:
BEFORE ANY LAYER:
[A] Spatial hierarchy dimensions locked (Amendment 4)
└─ body-size to area-count formula
└─ Province / Region tier dimensions confirmed
BEFORE LAYER 1:
[B] Spatial hierarchy confirmed against 64×32 grid
└─ Does 64×32 correspond to Province grid? Or Area grid?
LAYER 1 (independent of Layer 2 except via geographic feature output):
[C] L1-Q2: River resolution decision
[D] L1-Q3: Session DB confirmation (Amendment 1 replaces systems.db)
[E] Drainage algorithm performance evaluation
BEFORE LAYER 2:
[F] Layer 1 geographic feature tags computed
[G] Attractor-matching algorithm designed
[H] Name reservation fulfillment data structure
LAYER 2:
[I] L2-Q5: TerritorialStatus thresholds
[J] L2-Q3: Road algorithm scope under Amendment 3
BEFORE LAYER 3:
[K] Layer 2 political_archetype + FoundingOrientation per city
[L] Weight table challenge resolved (Amendment 6)
[M] L3-Q1: FoundingOrientation spatial grid orientation
[N] L3-Q2: Political archetype spatial arrangement
LAYER 3:
[O] L3-Q5: prosperity_baseline topography contribution
[P] L3-Q6: Sub-settlement unified vs. simplified codepath
[Q] CityGenerationContext body_id field added
BEFORE LAYER 4:
[R] Layer 3 DistrictSkeleton Stages 1-2
[S] L4-Q1: Economics rendering mechanism
LAYER 4:
[T] L4-Q2: Condition update trigger (follows from S)
[U] L4-Q4: Interior generation trigger
Critical path: A → B → [C, D, E] → F+G+H → [I, J] → K+L+M+N → [O, P, Q] → R+S → [T, U]
Parallelizable:
- Layer 1 and Layer 3 development can proceed in parallel once [A, B, L, M, N] resolved
- Layer 2 and Layer 4 in parallel once their prerequisites are met
- Economic simulation proceeds independently of Layers 1-2 spatial data
10. Ozzie's Player Experience Signals
Ozzie contributed a player experience inventory for each layer. Key flags that have no equivalent in other agents' outputs:
Layer 1:
- "Survey data unavailable" when a world hasn't generated yet: make it diegetic, not a loading spinner. Suggested: partial scan, static, outdated data, cursor blinking in empty grid.
- Terrain roughness (
terrain_modification_cost) should be visible in street layout: irregular blocks, terraced buildings, streets curving around outcrops. - Mountain pass tags must feed road routing or they're vestigial.
Layer 2:
- TerritorialStatus transitions should be physically felt: road quality drops, lighting thins, settlements shrink. Not just an invisible boundary change.
MaintenanceAuthorityvariations on road segments should be readable in road condition: corp roads paved, farm roads cracked.- "No placement should violate geographic common sense." Attractor-matching failure condition: fishing port in mountains.
Layer 3:
- Player should feel CompanyTown spine before knowing the archetype name. Explicit spatial arrangement is required for this.
FoundingOrientationshould be felt from the approach: a PortFacing city should show its harbor face to the sea approach, its warehouse face to the land approach.- First impression of every city when spawning should be designed, not random.
Layer 4:
- Tile condition state at "Broken" should look like ruins: structural collapses, road barely passable. Not subtle degradation.
- Prop/decal scatter is not optional for a "felt inhabited" space (see tension with brief's deferral in Section 8).
- Door approach: player should have an intuition about what's behind a door before crossing the threshold.
11. Cross-Layer Questions — Status After Round 1
| Question | Status after Round 1 |
|---|---|
CL-Q1 (naming: prosperity_baseline vs prosperity_current) |
Confirmed by all agents. Two distinct fields. prosperity_delta = derived, never stored. |
| CL-Q2 (regional land-use evolution resolution boundary) | Burnelli-Sheldon (Round 4 position held): coarse biome-cell resolution updates at runtime; city-internal layout never changes; NOT ChunkMutations. No agent disputed. |
| CL-Q3 (ruin lifecycle) | Demoted per Amendment 5. Paula: emergent rendering outcome only. Gestalt: Amendment 5 settled this. No agent proposed a designed decay path. |
12. Items Carried Into Round 2
Must be resolved in Round 2
| Item | Blocking dependency |
|---|---|
| Attractor-matching algorithm: reconcile four proposals (Gestalt / Tyre / Burnelli-Sheldon / Paula) | Blocks all Layer 2 settlement placement |
NEW-Q2 (OrganicGrowth disambiguation): confirm Paula's geographically_triggered: bool flag |
Blocks FoundingOrientation derivation for non-attractor settlements |
| Amendment 6 weight table: reconcile three proposals (Gestalt / Tyre / Burnelli-Sheldon) | Blocks Layer 3 zoning algorithm |
| Tyre's four technical blockers (ARCH-1 through ARCH-4) | Block all Layer 1-2 Rust implementation |
| Spatial hierarchy dimensions: workshop confirmation or amendment of Tyre's table | Blocks Province dimension used in L2-Q5 thresholds |
Should be resolved in Round 2
| Item | Owner | Notes |
|---|---|---|
| TerritorialStatus thresholds (L2-Q5): reconcile Paula / Tyre / Burnelli-Sheldon proposals | Paula + Burnelli-Sheldon | Needs Province dimensions confirmed first |
Tyre's atlas_city_names schema: does it replace or extend atlas_cities? |
Tyre + lead | Schema change before attractor-matching can be specified fully |
Paula's topographic modifier to prosperity_baseline |
Paula + Burnelli-Sheldon | Additive to Burnelli-Sheldon's formula; compatibility to confirm |
| L4-Q5 (scatter scope): Ozzie's "not optional" position vs. brief's deferral | Gestalt + Ozzie | Player experience minimum vs. technical minimum |
| BS-Q1: 9,999-person Town without dedicated Entertainment — plausible? | Gestalt + Burnelli-Sheldon | Feel check |
| BS-Q2: Age modifier + WorldTier ceiling | Burnelli-Sheldon | Proposed self-resolution: age modifier only at Town tier and above |
| L3-Q7 (port/station direction): mechanism design vs. deferral | Paula + Ozzie | Paula designed the mechanism; Ozzie wants it badly; all others deferred |
| Threshold values for L4-Q2: 0.6/0.4/0.2 (Gestalt) vs. 0.63/0.43/0.23 (Paula) | All | Minor; principle agreed |
Questions with confirmed positions (no Round 2 design work needed)
| Question | Position | Who confirmed |
|---|---|---|
| L1-Q4 (biome prior) | Include it | Tyre, Paula, Burnelli-Sheldon (Gestalt: independent, can be deferred) |
| L1-Q3 / L2-Q6 (session DB for storage) | Session DB, not systems.db | All five agents |
| L3-Q1 (FoundingOrientation spatial effect) | Spatial grid rotation | Gestalt, Tyre, Paula, Ozzie |
| L3-Q2 (political archetype arrangement) | Explicit patterns (scope differs) | All five agents back explicit |
| L4-Q1 (rendering mechanism) | Threshold-crossing cache invalidation | All five agents |
| L4-Q4 (interior trigger) | Pre-fetch; on-entry for minimum viable | Gestalt, Tyre, Paula, Ozzie |
| L4-Q6 / CL-Q1 (two-field model) | prosperity_baseline + prosperity_current; prosperity_delta derived |
All agents |
| L3-Q6 (sub-settlement codepath) | Unified (district_count = 1) | Paula, Gestalt; others no objection |
| CL-Q3 (ruin lifecycle) | Emergent rendering outcome; no designed decay path | All agents per Amendment 5 |
| L2-Q3 (road algorithm) | Fully generated; named route identity via post-generation assignment | All agents |
Compiled by Qatux. Sources: five Round 1 documents dated 2026-05-01. No positions added, modified, or attributed to agents who did not state them.