Standardized YAML frontmatter on all 38 files with title, description, type, workshop, agent, and round fields. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
25 KiB
title, description, type, status, workshop, agent, round, created
| title | description | type | status | workshop | agent | round | created |
|---|---|---|---|---|---|---|---|
| Round 4 Notes | Qatux compilation of all round 4 participant outputs and final convergence | workshop | archived | generator-architecture | 4 | 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:
- Open question resolution — all six OQs from Round 3 carried forward. All are now resolved.
- Concrete demonstration — Miri's "write the NPC" exercise (OQ-R4-E). Complete.
- 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:
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<NetworkFootprintTag>
Nonefor most procedural NPCsSome(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_seedproduces 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:
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):
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:
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 (#2a2018warm pavers) - Restricted rooftop: cold work lights only (
#c0d0e0directed 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 |
| 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 |
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,NpcPersistenceenums Dockedstate withconnected_chunk,docked_since,scheduled_departureInTransitandInterSystemstates- 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:
DamageOverlaystruct (epicenter, radius, intensity, scatter_seed)DamageOverlayTypeenum (GasExplosion, Fire, Structural, Flooding)RegenerationStrategyenum (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 fromsignificance: SignificanceTier)grid_orientation: f32(district rotation from world-north)vertical_structure: VerticalStructure(Flat / Medium / Tall / Skyscraper)breach_only_zones: Vec<ZoneId>(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<TrianglePurpose>)
├── NpcManifest (seeded from society_profile)
├── ZonePalette assignments (base + heritage modifiers)
└── ChunkMutations pending
SIMULATION STATE (runtime storyteller)
├── DistrictRuntimeState.drama_density: DramaDensity
├── active_triangles: Vec<TriangleId>
├── 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:
-
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.
-
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.
-
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.
-
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.
-
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.
-
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.