--- title: "Round 4 Notes" description: "Qatux compilation of all round 4 participant outputs and final convergence" type: workshop status: archived workshop: generator-architecture agent: "" round: 4 created: 2026-02-27 --- # Generator Architecture Workshop — Round 4 Notes **Workshop:** Generator Architecture (#562) **Round:** 4 — Final Convergence **Date:** 2026-02-27 **Participants:** Gestalt, Tyre, Miri, Araminta, Nigel, Ozzie **Documented by:** Qatux --- ## 1. Round 4 Assignment Summary Round 4 had three categories of work: 1. **Open question resolution** — all six OQs from Round 3 carried forward. All are now resolved. 2. **Concrete demonstration** — Miri's "write the NPC" exercise (OQ-R4-E). Complete. 3. **D-record sign-off** — all 12 items from the D-ready list reviewed and approved by all six participants. Two additional items (D-READY-13 and D-READY-14) identified and added. Pre-confirmed lead decisions (Round 4 input): - **WorldTier** wins over SignificanceTier - **Entity-carried MobileChunk** is core architecture - **DramaDensity** is runtime storyteller state, NOT on DistrictSkeleton - **Heritage grammar overlay** is base game, not DLC --- ## 2. Open Question Resolutions ### OQ-R4-A: Vessel Architecture — Resolved (Lead Directive) **Decision: Entity-carried MobileChunk. Tyre's architecture. Lead-confirmed.** All participants accepted. Tyre provided the final canonical `MobileChunk` struct. Nigel formally withdrew his instanced-district model and stated why the entity-carried model is superior for accumulating vessel history across voyages. Ozzie provided the player-experience verdict: the docked ship must physically exist and be present at the dock — this is load-bearing for the game's fundamental promise of a persistent world. Key rationale (Ozzie): "The ship at the dock is a trust signal. It tells me: this happened. That voyage was a real event in a real world." Additional vessel requirement raised by Ozzie: **departure schedules** must be a generator output. Vessels docked without scheduled departures produce port graveyards. The departure window is both world-time structure and a player urgency driver. ### OQ-R4-B: WorldTier Naming — Resolved (Lead Directive) **Decision: `world_tier: WorldTier` on DistrictSkeleton.** `SignificanceTier` is retired. `WorldTier` correctly describes what the field measures: simulation fidelity budget allocated to this location, not narrative importance. A narratively critical backwater can be `WorldTier::Local + ComplexityTier::Full`. **Canonical WorldTier enum (Tyre, final):** ``` Core — Hub system. Full simulation, high faction pressure. Regional — Regional importance. 1–4 districts, partial full-budget. Local — Small community. 1 district, limited budget. Transit — Transit stop. Pass-through only, minimal simulation. Dormant — Not simulated until player approaches. ``` WorldTier → ComplexityTier ceiling constraint table: | WorldTier | ComplexityTier max | |-----------|-------------------| | Core | Full | | Regional | Full | | Local | Moderate | | Transit | Minimal | | Dormant | Empty | ### OQ-R4-C: Assassination Difficulty Descriptor — Minor Tension Noted **Two valid positions emerged. The tension is recorded here for the D-record.** **Gestalt:** `assassination_difficulty` is computed on demand — a function of `(SocietyProfile, SpatialGuarantees, StorytellerState) → DifficultyDescriptor`. Never stored. Called at contract acceptance and during pre-op planning. Rationale: the inputs include dynamic runtime state (active guard levels, current NPC distribution), so any stored value is stale. **Miri:** `DerivedDistrictAnalysis` struct on `DistrictSkeleton`, computed at Phase 1 from society profile parameters (observation_density × information_liquidity × aftermath_engagement). Stored, not runtime-mutable. Rationale: Phase 1 Tactical triangle instantiation logic needs it before the gameplay system runs; the cultural difficulty of assassination is stable regardless of storyteller state. **The actual tension:** Gestalt's position captures dynamic inputs that Miri's doesn't. Miri's position captures a Phase 1 dependency that Gestalt's doesn't address. These are not mutually exclusive: the `DerivedDistrictAnalysis` on the skeleton could provide the **cultural baseline** (static, Phase 1), while the on-demand computation combines that baseline with runtime state for the player-facing assessment. This synthesis is recommended for the D-record. **Miri's proposed `DerivedDistrictAnalysis` struct:** ```rust struct DerivedDistrictAnalysis { assassination_difficulty: AssassinationDifficulty, assassination_target_density: u8, primary_playstyles: [AffinityLevel; 5], } enum AssassinationDifficulty { Low, Medium, High, Extreme } ``` **Qatux flag:** The D-record should specify both the stored baseline (`DerivedDistrictAnalysis`) and the on-demand runtime computation. They serve different purposes. ### OQ-R4-D: Heritage Grammar Overlay Representation — Resolved **Decision: Data-driven `HeritageGrammarOverlay` structs in TOML/YAML content files (Miri) or equivalent (Araminta). Not lookup tables in palette assets. Not hardcoded.** Miri proposed per-heritage `HeritageGrammarOverlay` Rust structs loaded from authored data, injected into ZonePalette at chunk fill time. Araminta proposed per-heritage TOML modifier files with the same separation: Araminta authors visual/arrangement grammar, Miri authors cultural/organizational grammar. Both converge on the same authoring model with aligned field sets. **Key rule:** Heritage grammar modifier is applied at Phase 2 chunk fill time (not Phase 1), with one exception: `gathering_probability` influences Phase 1 block quarter pre-assignment. **Authoring domain separation:** - Miri: organizational principles, boundary character, spacing, social grammar fields - Araminta: visual expression — object sets, arrangement algorithms, lighting temperature, overhead character **Shared requirement:** The `ObjectTag` vocabulary must be co-maintained across both domains. ### OQ-R4-E: "One NPC, Five Lenses" — Resolved (Miri NPC exercise) **Decision: One NPC can provide all five hooks. Minimum 3 NPCs required for intra-seed replayability.** Miri produced **Ysabel Vorn**, a full 10-axis NPC profile for Harrow Drift (Backwater/Moderate farming settlement, Stone/Tide heritage). All five playstyle lenses demonstrated in detail. The 10-axis model covers **4.5 of 5** hooks. **The gap: Axis 11 (Network Footprint).** The 10-axis model cannot distinguish between an NPC who is genuinely locally insignificant and one who is locally insignificant in appearance but carries network-significant information (e.g., a hiding Commission data analyst). The assassination hook for Ysabel is only available to a player with network-level intelligence access — locally, she registers as a trusted Anchor with no enemies. **Proposed Axis 11:** ``` network_footprint: Option ``` - `None` for most procedural NPCs - `Some(tag)` for authored scenario NPCs; records external actors, reason for significance, and access tier required to see the footprint - Does not change local NPC behavior; enables Tactical triangle instantiation for the "false backwater" scenario type **Nigel's finding on emergence:** One NPC provides zero intra-seed emergent behavior (no relationships = no triangles). Minimum for meaningful replayability within a seed: **3 NPCs — one functional triangle**. Miri's five minimum content types should be distributed across a minimum triangle, not collapsed into a single NPC. ### OQ-R4-F: Soft Re-Generation — Resolved. XOR Unanimously Rejected. **Decision: `DamageOverlay` (structured damage parameters) for all in-playthrough events. XOR reseeding explicitly rejected.** All four participants who addressed this (Gestalt, Tyre, Nigel, Ozzie) reached the same verdict by independent paths. **Why XOR fails (Gestalt + Tyre tile-level demonstration):** - `original_seed XOR event_seed` produces a different block, not a damaged version of the original - Tile positions shift, zone assignments change, the pressure regulator moves — nothing is spatially coherent with the event source - Fails Ozzie's test: "destruction must be caused, not random" - The result looks *replaced*, not *damaged* **The correct approach — `DamageOverlay`:** ```rust struct DamageOverlay { overlay_type: DamageOverlayType, epicenter: ChunkLocalPos, radius: f32, intensity: f32, scatter_seed: u64, // variation WITHIN damage zone only } enum DamageOverlayType { GasExplosion, Fire, Structural { collapse_direction }, Flooding } ``` Per-tile damage is computed from distance to epicenter + scatter. The original chunk is unchanged. The cause is legible from the output: epicenter identifiable, damage gradient visible. **`RegenerationStrategy` enum (Gestalt):** ```rust enum RegenerationStrategy { LocalOverlay(DamageParameters), // in-playthrough — generator unchanged SoftReseed { seed_modifier: u64 }, // scenario-boundary temporal changes only FullReseed, // era-level discontinuities only } ``` **Hard rule:** In-playthrough events are ALWAYS `LocalOverlay`. `SoftReseed` and `FullReseed` are scenario-setup tools, not event responses. The generator never re-runs for player-witnessed events. XOR-seeding remains acceptable ONLY for district-level regeneration under a different historical assumption (Phase 1 re-run for a different era branch — not in-playthrough damage). --- ## 3. Rooftop Bar Clause — Amended **Old guarantee:** Every tall structure (z_band_count ≥ 3) must have a roof zone classified `Insider` or `BreachOnly`, accessible by non-obvious route. **Problem:** This prohibited valid public social destinations (rooftop bars, observation galleries, religious sky gardens). **Amended guarantee — Vertical Discovery:** ```rust enum RooftopConfig { Restricted { zone_class: AccessTier, // must be Insider or BreachOnly access_route: RouteObviousness, // must be NonObvious }, PublicWithHiddenLayer { primary_zone: ZoneType, // Social Hub, Economic Node, etc. secondary_restricted: ZoneSpec, // always present; Insider or BreachOnly }, } ``` **The inviolable rule:** Every tall structure must have *something* at the top that is not fully accessible from below. The discovery layer is mandatory. The public/private split of the primary space is not. Heritage-root-driven default: - Iron trade towers: `Restricted` (roof belongs to guild leadership) - Commission institutional: `PublicWithHiddenLayer` (public observation gallery + restricted records floor) - Frost isolated structures: `Restricted` (roof is heating systems, not a social space) Visual grammar (Araminta): - Public rooftop: warm amber lighting cluster (`#f0b840`) + social furniture (tables/chairs clusters) + designed railing (`#2a2018` warm pavers) - Restricted rooftop: cold work lights only (`#c0d0e0` directed down) + mechanical equipment (HVAC, antennae) + service hatch Ozzie's verdict: "Most rooftops: maintenance access and a view. Some rooftops: IT'S A BAR. The rarity is what creates the moment." --- ## 4. Ysabel Vorn — The NPC Litmus Test **Summary of the 10-axis exercise result:** 4.5 of 5 playstyle hooks covered. | Axis | Miri's field | Playstyle hook | |------|-------------|----------------| | 1 | Behavioral Pattern (ANCHOR + REMNANT secondary) | All lenses: community position | | 2 | Surface Motivation (water equity) | Political: the stated tiebreaker role | | 3 | Actual Motivation (stay hidden) | Investigation + Dating Sim: the closed core | | 4 | Vulnerability/Secret (Commission warrant, Callen file chain) | Investigation + Assassination | | 5 | Information Access (complete settlement knowledge + aging Commission expertise) | Tycoon + Investigation | | 6 | Trust Architecture (Stone/Tide blend, slow building) | Dating Sim: the arc | | 7 | Routine Pattern (dawn inspection, 6-weekly boundary check) | Assassination: the window | | 8 | Economic Position (water control lever, undisclosed evidence) | Tycoon: the entry point | | 9 | Relationship Network (3 triangles, 1 active/2 latent) | Political + Investigation + Tactical | | 10 | Tolerance Threshold (near-zero for exposure, declining for Kael Voss) | Dating Sim + Assassination | **The gap (Axis 11):** Locally, Ysabel registers as `assassination_difficulty: Extreme` (150-person tight community, Stone observation, Tide aftermath). But the Tactical triangle (Ysabel ↔ Callen's agents ↔ player) only becomes visible with network-level access. The 10-axis model as currently specified cannot flag this from local data alone. **New Q-record to raise:** `Q-NNN: Axis 11 (Network Footprint) — authored field for network-significant NPCs in locally-insignificant positions.` --- ## 5. D-Record Sign-Off — All 12 Items + 2 New All 12 D-ready items from Round 3 were reviewed by all six participants. Status: **all signed off**, with amendments documented below. | # | Item | Status | Key amendments | |---|------|--------|----------------| | D-READY-1 | DistrictLayoutMode: Grid / Organic | ✅ SIGNED OFF | Araminta: 45° rotation cap is a hard technical constraint (pathfinding), not a design preference. Must be stated as non-negotiable in D-record. Nigel: Grid/Organic distribution proportion must vary per seed. | | D-READY-2 | Guarantee Tier System | ✅ SIGNED OFF | Gestalt: added Power Gradient Visibility + Economic Asymmetry Signal as conditional Tier 3 checks. Araminta: rooftop destination clause added as Tier 2 guarantee. Nigel: archetype placement must vary in angular position across seeds, not just distance from center — this is verifiable and testable. | | D-READY-3 | TrianglePurpose Enum | ✅ SIGNED OFF | No structural amendments. Nigel: TrianglePurpose is a multi-playstyle accessibility feature, not a replayability feature. | | D-READY-4 | WallBackside / TileBehindState | ✅ SIGNED OFF | Gestalt: both enums are canonical and complementary — WallBackside (structural/LOS) and TileBehindState (gameplay). D-record must document both and their mapping. Araminta: Era-tagged infrastructure cavity contents (Era 1–3 bundle density) with standardized color codes. Nigel: backside assignments within a template must have seed-driven variation (not fixed-template values). | | D-READY-5 | Dynamic Modification via Overlay | ✅ SIGNED OFF | Add `DamageOverlay` struct and `RegenerationStrategy` enum from OQ-R4-F resolution. XOR is explicitly prohibited for in-playthrough events. Araminta: trauma event → visual destruction stage mapping added (PhysicalDestruction → Stage 2; economic/political/migration → quarter fill modifier, not destruction stages). | | D-READY-6 | ZonePalette Modifier System | ✅ SIGNED OFF | Araminta: explicitly name T1 (warm organic, natural lighting) and T2 (cool grey-green, artificial lighting) as rustic vs. industrial farmland. Nigel: palette modifiers should influence NPC appearance as well as environment. | | D-READY-7 | Horizon View Corridor | ✅ SIGNED OFF | Araminta: clarify as negative space (instruction to not place blockers), not a placed object. Low z=2 element marks waterfront point as designed viewing location. Nigel: corridor position should vary per seed — the Wow Moment needs to be discovered, not expected. | | D-READY-8 | Assassin Lens Spatial Guarantees (A-1 through A-4) | ✅ SIGNED OFF | Gestalt: A-1–A-3 are Tier 3 Conditional; A-4 is mandatory Full-complexity. Framing: derived properties of existing spatial configuration, not assassin-tagged features. Araminta: A-1 Elevated Vantage requires overhead-clear LOS corridor (no z=4 elements in LOS cone). Nigel: angular variation requirement is hard — guarantee audit should fail if archetype placement clusters in predictable angular positions across N seeds. | | D-READY-9 | Heritage Grammar Overlay for Non-Urban Palettes | ✅ SIGNED OFF | Now lockable with OQ-R4-D resolved. Miri: `HeritageGrammarOverlay` struct with organizational principles. Araminta: TOML modifier files with visual expression parameters. Both specify the `ObjectTag` shared vocabulary requirement. Phase 1 exception: `gathering_probability` evaluated at block planning for quarter pre-assignment. | | D-READY-10 | Non-Urban Informal Zone Typology | ✅ SIGNED OFF | Araminta: visual grammar per type (social_permission = gathering infrastructure present; physical_distance = sparse, unmaintained path; utilitarian_cover = functional work space with no obvious unofficial purpose). Nigel: each type demands different player strategies — the variation is in how to USE cover, not merely what it is. | | D-READY-11 | Vertical Scale Architecture | ✅ SIGNED OFF | Add Rooftop Bar Clause (RooftopConfig enum from Section 3). Araminta: roof zone must be assigned `PublicDestination | RestrictedDiscovery` during block planning. Nigel: z-band floor boundaries must have seed-variation within cultural ordering constraints (executive always in upper zone, but which exact floor varies per seed). | | D-READY-12 | Trauma Events as EraModification Subtypes | ✅ SIGNED OFF | Gestalt + Tyre: TraumaEvent uses LocalOverlay, not XOR reseeding. Physical destruction and cultural aftermath are separate tracks. Araminta: `trauma_visual_decay_rate: slow | medium | fast` per heritage root, with seed-variation within root baseline (Nigel). | ### D-READY-13: MobileChunk Specification (New) **Status: D-READY.** The final canonical `MobileChunk` struct from Tyre (Round 4, §1/§5a) is complete and signed off. Contains: - Full struct with `VesselClass`, `MobileInterior`, `MobileMovementState`, `TransitSocialModifier`, `NpcPersistence` enums - `Docked` state with `connected_chunk`, `docked_since`, `scheduled_departure` - `InTransit` and `InterSystem` states - Vessel template size reference (TrainCar → LargeMerchant) - Boarding sequence implementation notes - Memory budget: ~0.5–4 KB metadata + up to 64 KB ChunkData per vessel **Replayability requirements from Nigel (R-V-1 through R-V-6):** - R-V-1: At least 50% of variable passenger slots must turn over between adjacent voyages - R-V-2: Crew persistent, passengers variable - R-V-3: In-transit events are voyage-seeded, not vessel-seeded - R-V-4: Arrival time is storyteller-modifiable - R-V-5: Interior does NOT re-generate per voyage - R-V-6: Vessel carries ChunkMutations for accumulated damage history **Miri's cultural grammar:** `TransitSocialModifier` with `TransitVariant` (BoundedLinear / BoundedMobile / InterSystem) is the canonical vessel cultural layer. Heritage-root behavior tables by vehicle type and jurisdictional state. ### D-READY-14: DamageOverlay / RegenerationStrategy (New) **Status: D-READY.** Produced by OQ-R4-F resolution with unanimous participant agreement. Covers: - `DamageOverlay` struct (epicenter, radius, intensity, scatter_seed) - `DamageOverlayType` enum (GasExplosion, Fire, Structural, Flooding) - `RegenerationStrategy` enum (LocalOverlay / SoftReseed / FullReseed) - Hard constraint: in-playthrough events are ALWAYS LocalOverlay - Hard prohibition: XOR-seeding for in-playthrough events is explicitly rejected - Per-tile damage computation (distance from epicenter × scatter → tile modification) --- ## 6. New Open Questions for Sprint Work | Q-ID | Question | Owner | Priority | |------|----------|-------|----------| | Q-NNN-a | Axis 11 (Network Footprint) — authored field for network-significant NPCs in locally-insignificant positions | Miri | High — affects assassination scenario instantiation | | Q-NNN-b | Departure schedule model — departure windows as generator output for docked vessels | Tyre + Miri | High — vessel persistence requires it (Ozzie requirement) | | Q-NNN-c | Mobile environment social arc — structural representation of the journey timeline (who talks to whom at which journey stage) | Miri + Gestalt | Medium — Ozzie: "the journey is content; if the social arc isn't structured, the content is random" | | Q-NNN-d | DramaDensity enum naming — Tyre's Round 4 struct uses Quiescent/Active/Intense (3 values) vs. Round 3's Zero/Low/Medium/High/Flashpoint (5 values). Which is canonical? | Tyre + Gestalt | Low — naming only, but should be settled before D-record | | Q-NNN-e | ObjectTag vocabulary co-maintenance — shared between Miri's HeritageGrammarOverlay and Araminta's asset categorization system | Miri + Araminta | Medium — needed for heritage grammar implementation | --- ## 7. Final Canonical Structures (Summary) ### DistrictSkeleton — Final (Tyre §5) New fields since Round 3: - `world_tier: WorldTier` (renamed from `significance: SignificanceTier`) - `grid_orientation: f32` (district rotation from world-north) - `vertical_structure: VerticalStructure` (Flat / Medium / Tall / Skyscraper) - `breach_only_zones: Vec` (AccessTier::BreachOnly zones explicitly tracked) - `derived_analysis: DerivedDistrictAnalysis` (assassination_difficulty, target_density, playstyle affinities) — Miri's addition DramaDensity remains absent from DistrictSkeleton. Confirmed by all participants. Lives in `DistrictRuntimeState` in the simulation module. ### Three-Layer Model — Locked (Gestalt §5) ``` GENERATOR STATE (immutable after Phase 1) ├── Phase 1: DistrictSkeleton │ ├── world_tier: WorldTier │ ├── complexity_tier: ComplexityTier │ ├── layout_mode: DistrictLayoutMode (Grid | Organic) │ ├── guarantee_audit: GuaranteeAuditResult (3-tier) │ ├── rooftop: RooftopConfig (per MultiBlockReservation) │ ├── derived_analysis: DerivedDistrictAnalysis │ └── society_profile: SocietyProfileRef └── Phase 2: PreparedDistrict ├── SocialSitePlacement (triangles with Vec) ├── NpcManifest (seeded from society_profile) ├── ZonePalette assignments (base + heritage modifiers) └── ChunkMutations pending SIMULATION STATE (runtime storyteller) ├── DistrictRuntimeState.drama_density: DramaDensity ├── active_triangles: Vec ├── npc_pattern_weights: NpcPatternWeightSet └── assassination_difficulty on-demand computation (SocietyProfile + spatial_audit + StorytellerState → DifficultyDescriptor) DELTA LAYER (post-generation) ├── DamageOverlay / ChunkMutations::LocalOverlay ├── NpcRemoved / NpcStateChanged ├── AccessTierChanged └── WorldStateDelta (composed from all active mutations) ``` --- ## 8. Memory Budget — Final | Component | Size per district | |-----------|------------------| | Identity + WorldTier + ComplexityTier | ~96 bytes | | Blocks (4×4 × BlockSkeleton) | ~2 KB | | Social sites + triangles | ~1–4 KB | | Reservations + corridors (incl. z-bands) | ~0.5–3 KB | | Boundaries | ~4 KB | | Society profile ref | ~32 bytes | | Zone palette | ~0.5–1 KB | | Guarantee audit (3-tier expanded) | ~512 bytes | | Layout mode (Organic) | 0–1 KB | | VerticalStructure + breach zones + derived_analysis | ~128 bytes | | **Total per district** | **~9–16 KB** | Fleet: 300 worlds × ~6 districts × ~13 KB = **~23 MB** Mobile chunks: ~3 MB at 50 active entities (paged by streaming model) Grand total: ~26 MB — within accepted RAM budget --- ## 9. Qatux Observations **For the record:** 1. The XOR rejection is the single most unanimously confirmed decision of this workshop. All four participants who addressed it reached the same verdict by independent reasoning. The D-record should state the prohibition unambiguously. 2. The assassination_difficulty tension (Gestalt: computed-on-demand vs. Miri: DerivedDistrictAnalysis at Phase 1) is resolvable by synthesis: stored cultural baseline + on-demand runtime computation for player-facing assessment. This should be explicit in the D-record rather than left as a gap. 3. Ozzie's two additions to D-READY (departure schedules + mobile environment social arc) are requirements, not preferences. Both are downstream of the vessel persistence decision (D-READY-13). They should be raised as Q-records with high priority. 4. The Ysabel Vorn exercise is the single most complete demonstration of the NPC generation model produced in this workshop. It should be referenced in the NPC system D-record as the canonical litmus test case for validating the 10-axis model. 5. Tyre's DramaDensity enum in Round 4 (Quiescent/Active/Intense, 3 values) differs from Round 3's (Zero/Low/Medium/High/Flashpoint, 5 values). This naming gap should be resolved before the D-record is written. 6. WorldTier enum values are now canonical from Tyre's Round 4 output: Core / Regional / Local / Transit / Dormant. The Round 3 naming (CenterStage/Regional/Backwater/Waypoint/Insignificant) is superseded. --- **Round 4 closes with all OQs resolved, all 12 D-records signed off (with amendments), 2 new D-records added, and 5 new Q-records raised for sprint work. The pipeline is locked. D-record production proceeds.**