Files
jpmschweitzerandClaude Opus 4.6 9a5c9c4408 docs(docs): add frontmatter to generator-architecture workshop
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>
2026-03-13 23:40:37 +01:00

25 KiB
Raw Permalink Blame History

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:

  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. 14 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>
  • 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:

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 (#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 13 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-1A-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, 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.54 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<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 ~14 KB
Reservations + corridors (incl. z-bands) ~0.53 KB
Boundaries ~4 KB
Society profile ref ~32 bytes
Zone palette ~0.51 KB
Guarantee audit (3-tier expanded) ~512 bytes
Layout mode (Organic) 01 KB
VerticalStructure + breach zones + derived_analysis ~128 bytes
Total per district ~916 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.