Files
jpmschweitzerandClaude Opus 4.6 42ee1f0a0e docs(workshops): generation cascade workshop — 4 rounds, D-194 through D-218
Four-round workshop (Gestalt, Tyre, Paula, Burnelli-Sheldon, Miri)
mapping the full generation pipeline from planetary heightmap to
walkable tile. 25 D-records produced. Ticket dependency chain for
Tier 0-4 implementation identified.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-03 20:18:17 +02:00

22 KiB
Raw Permalink Blame History

title, description, type, status, workshop, agent, round, created
title description type status workshop agent round created
Round 1 Notes — Generation Cascade Workshop Compiled Round 1 inventory: consensus, disagreements, gaps, open questions, and consolidated pipeline layer table workshop active generation-cascade qatux 1 2026-04-30

Generation Cascade Workshop — Round 1 Notes

Compiled by: Qatux
Source files:

  • docs/workshops/generation-cascade/gestalt-round1.md
  • docs/workshops/generation-cascade/tyre-round1.md
  • docs/workshops/generation-cascade/miri-round1.md

Summary Verdict (All Three Agree)

The pipeline has a hard operational cliff at Layer 5 (atlas markers). Every layer above it is working production code. Every layer below it is either missing entirely or compiled stub types with no generation logic. The architecture is well-designed on paper; zero generation code exists. This is not a design workshop — it is an implementation audit with clear blockers.


Consensus Points

1. Pipeline cliff location

All three participants independently arrived at the same finding: the atlas pipeline (galactic definitions → planetary heightmaps → city placement → city naming → economics) is complete and working. The cliff is between the atlas output and the first runtime layer (city → district decomposition). Everything below is unimplemented.

  • Gestalt: "The atlas is the last fully-working pipeline layer."
  • Tyre: "The pipeline has a hard cliff at Layer 5. Everything above it is working production code."
  • Miri: (concurs, layered audit confirms all atlas layers as DONE)

2. WorldTier enum mismatch — hard blocker

Both Gestalt and Tyre independently flagged the same bug:

// Current code (generator.rs):
enum WorldTier { Peripheral, Connected, Core }

// Workshop-locked values (lead decision L-3, workshop-outcomes.md):
enum WorldTier { Epicenter, Regional, Backwater, Passage, Waypoint }
  • Gestalt: "This is a blocker. #899 cannot be implemented correctly against the current enum."
  • Tyre: "These are incompatible. The workshop canonical values must replace the current enum before the generation spike begins."

Miri did not independently flag this bug (worldbuilder scope did not include code audit of enum values) but it is corroborated by both technical participants.

3. City → District decomposition is missing and has no ticket

All three participants confirmed this layer is entirely absent — no design, no code, no types, no ticket. It is the first unlock for all downstream work.

  • Gestalt: Layer 6 in her inventory. "No ticket formally covers this. #899 assumes this decomposition as a prerequisite but does not scope it."
  • Tyre: Layer 5 in his inventory. "This is the first gap in the entire pipeline... The DistrictContext type on DistrictSkeleton is pub type DistrictContext = String."
  • Miri: Confirms the city marker schema is insufficient for Phase 1 input (see Gap 3 below).

4. Phase 1 DistrictSkeleton — types compile, zero generation logic

All three confirmed the DistrictSkeleton struct compiles but every field requiring actual content or logic is a pub type Foo = String alias.

Fields confirmed as String stubs (Tyre inventory): DistrictContext, SocietyProfileRef, ZoneDefinition, DistrictBoundaries, GuaranteeAuditResult, CorridorSpine, ChunkLayout, Era, EraModification, LandmarkSlot, AccessPoint.

5. Phase 2 ChunkData tile generation — entirely missing

All three confirmed Phase 2 does not exist. GeneratorChunkData = Vec<bool>. No tile vocabulary (TileId = String). No code to fill a 64×64 tile grid from a BlockSkeleton.

  • Tyre: "The heritage grammar overlay system does not exist as Rust code or TOML data."
  • Gestalt: "There is no pipeline from DistrictSkeleton → actual walkable tile data."

6. Triangle system is more complete than the brief indicated

Both Gestalt and Tyre noted that the workshop brief labels triangle.rs as "stubs" — this is inaccurate. The file is substantially implemented production code.

  • Gestalt: "The triangle system (server/src/simulation/triangle.rs) is substantially implemented — template schemas, triangle escalation tick system, NPC spawn patterns. Intra-template (#107) and cross-template (#108) triangle generation are both done."
  • Tyre: "Layer 9 — Social Site Templates and Triangle System: DONE (runtime system, not wired to generator output)."

The gap is not the triangle system itself but the connection from DistrictSkeleton.social_sites template tags to runtime TemplateOwnership component spawning.

7. chunk_streaming.rs — architecturally ready, generator hookup is zero

Both technical participants confirmed the streaming system is sound and tested. The gap is purely that WalkabilityMap::load_chunk() creates blank walkable placeholders rather than calling any generator.

  • Tyre: Architecture is sound. load_chunk() needs steps 14 (chunk → district lookup → skeleton → Phase 2 fill) added. None exist.
  • Gestalt: "The system is ready for the generator hookup; it just needs the generator to exist."

8. #619 and #694 are not generation-dependent

Both Gestalt and Tyre independently reached the same position: character customization (#619) and character creation screen (#694) are Phase 4 work (Player Control Scheme, hand-authored 2-floor test map) and should not be formally blocked behind the generation pipeline.

  • Gestalt: "These should NOT be formally blocked behind generation pipeline work. The player needs to look like something before the world needs to be generated."
  • Tyre: "#619 and #694 can proceed... Phase 4, same rationale."

Miri did not address these tickets but noted "#694 Character creation screen — no generation pipeline dependency flagged."

9. #681 needs a stronger generation blocker

All three participants agreed (directly or by implication) that #681 (Apartment generator) requires a formal blocker behind Phase 1 district skeleton generation.

  • Gestalt: "add formal blocker on #681 behind Phase 1 district skeleton working."
  • Tyre: "#681 — Needs walkable generated world (Layers 5-8 complete). Should be explicitly blocked."
  • Miri: Notes that #681 can produce a culturally-voiced apartment without heritage grammar, but a spatially differentiated apartment requires HeritageGrammarOverlay (Gap 2). Proposes two-pass sequencing: first pass against culture RON, second pass when overlay data exists.

10. NPC generation spike exists but is not production code

Tyre found server/src/bin/generator_spike.rs (Sprint 25) — a standalone binary that generates NPCs from ZoneSpec + CultureProfile. It is not wired to ECS or to the spatial pipeline.

  • Tyre: "It is a standalone binary that bypasses ECS entirely... Its output is printed to stdout, not spawned into the ECS world."
  • Gestalt: Did not independently identify the spike binary, but notes the NPC system as a "wiring problem, not a design or implementation gap."

Disagreements

Disagreement 1: Dev-day estimates for thinnest vertical slice

Participant Estimate Breakdown
Tyre ~9 dev-days WorldTier fix (0.5) + city decomp (2) + Phase 1 stages 1-2 (3) + missing struct fields (0.5) + Phase 2 minimal (2) + streaming wiring (1)
Gestalt ~57 dev-days WorldTier fix (0.5) + Layer 6 stub (0.5) + Phase 1 minimal (2) + Phase 2 minimal (2) + wiring (1)

Source of discrepancy: Tyre's Phase 1 estimate (3 days) cites the workshop-outcomes.md estimate directly. Gestalt's Phase 1 estimate (2 days) uses a "minimal" scope that defers social sites, reservations, and guarantee audit entirely. Tyre also includes a separate line item for missing DistrictSkeleton fields that Gestalt folds into Phase 1. Neither estimate includes heritage grammar, NPC population, or guarantee audit — both agree those are outside the minimum slice.

No position has been locked. The discrepancy is ~24 days and will need resolution in Round 2.

Disagreement 2: Whether #615 (Tycoon starting state) is generation-dependent

Participant Position
Tyre #615 should be blocked behind generation pipeline completion. "#615 Tycoon small business starting state — Needs walkable generated world."
Gestalt #615 is content design, not generation-dependent. "Game content design, not generation-dependent." It feeds #681 but is not itself blocked by generation work.

Miri did not take a position on #615's cascade placement.

Note: Both agree that #615 is a real dependency of #681 (apartment generator). The disagreement is whether #615 should itself be blocked behind generation pipeline completion, or whether it can proceed in parallel as content design work.


Gaps — Items Raised by Fewer Than All Three Participants

Gap A: Content gaps raised by Miri alone (not addressed by Gestalt or Tyre)

Miri audited the content inputs required by each pipeline layer. These gaps are orthogonal to the code gaps Gestalt and Tyre identified. All four are blocking at their respective layers.

Gap A1 — Heritage root blend specification (CRITICAL, blocks Phase 1 social stage)

No authored document establishes which heritage root blend applies to any system. The SocietyProfileRef stub cannot be resolved without this mapping.

  • Proposed solution (Miri): Extend culture RON schema with heritage_blend field, or author a global heritage-map.ron. Provides Van Maanen's Star estimate: Iron(0.4), Stone(0.35), Tide(0.25).
  • Existing culture-van-maanens-star.ron provides NPC voice/behavior data but does NOT include heritage root blend weights.

Gap A2 — HeritageGrammarOverlay data files (CRITICAL, blocks Phase 2)

The full specification for all 10 heritage roots exists in miri-round4.md §OQ-R4-D. No heritage_grammar_overlay/*.ron files have been authored. No HeritageRoot enum exists in generator.rs. No ObjectTag vocabulary exists.

  • Miri: "This is the largest cultural content gap in the pipeline." The specification is complete; the work is translation from workshop spec to authored data.
  • Content authoring path: Miri authors organizational/social principles → Araminta authors visual expression → both co-maintain ObjectTag vocabulary.

Gap A3 — City marker schema insufficient for Phase 1 (MODERATE)

Current markers.json city entries contain: id, name, kind, center, population. Ticket #899 references primary_function, planet_class, settlement_pattern as Phase 1 inputs — these fields do not exist.

  • Tyre identified the missing coordinate translation (atlas pixel → sim tile) as a separate problem but did not raise the functional field gap.
  • Miri raised two possible resolutions: (a) extend markers.json schema, or (b) derive fields from systems.db cross-reference. Designates this as a joint Miri/Tyre question.

Gap A4 — Zone identity definitions for all DistrictType values (MODERATE)

ZoneDefinition = String stub. The DistrictType enum has 9 values. Only 2 Van Maanen's Star zone files exist (van-maanens-star-rural-zone.ron, van-maanens-star-industrial-zone.ron). No coverage for LogisticsHub, Administrative, Entertainment, MixedUse, Transit, Specialized.

Gap B: Atlas coordinate system translation (Tyre only)

Tyre identified a specific unresolved technical gap not mentioned by Gestalt or Miri:

"Atlas coordinates are (row, col) in a 512×256 pixel grid. A district is 512×512 sim tiles = 256×256 visual tiles = 256m. The ratio between atlas pixels and sim tiles is undefined and unimplemented."

This is a prerequisite for the city → district decomposition layer. No translation formula or specification exists.

Gap C: Missing DistrictSkeleton fields (Tyre only)

Tyre identified three fields present in the workshop spec (workshop-outcomes.md) that are absent from the current DistrictSkeleton struct in generator.rs:

  • vertical_structure: VerticalStructure (D-READY-11)
  • breach_only_zones: Vec<ZoneId> (Tier 2 guarantee audit)
  • derived_analysis: DerivedDistrictAnalysis (Phase 1 computed, Miri/Gestalt source)

Gestalt did not independently identify these missing fields. Tyre estimates 0.5 dev-days to add them as stubs.

Gap D: Van Maanen's Star naming ambiguity (Miri only)

Miri flagged a wiki documentation inconsistency: "Van Maanen's Star" is associated with two system entries (GJ-35/Vuurkloof — the real-astronomy white dwarf; GJ-280B/Sova — the K-type system with Station Sova). The culture RON file culture-van-maanens-star.ron is validated and correct. The naming ambiguity is a wiki gap, not a content error.

  • Miri's reading: Vuurkloof is the founding culture; Station Sova is where that culture manifests in the current setting. A formal wiki/cultural-groups/van-maanens-star.md entry would close this.
  • Neither Gestalt nor Tyre addressed this; it is a worldbuilding/documentation item.

Gap E: Economics → generation bridge design (Gestalt only)

Gestalt identified the economics layer as rich and immediately usable as a district generation input, but no such bridge code exists. Proposed principle:

"Economics drives district type; culture drives zone palette; both come from systems.db data that already exists."

Gestalt proposed Layer 6 (city → district decomposition) as the natural integration point. Neither Tyre nor Miri addressed this bridge design in their Round 1 files.


Open Questions

All open questions raised across the three Round 1 files, attributed to source:

ID Question Source Priority
OQ-R1-A Heritage root count: 7 (Mellanie's culture authoring guide) vs. 10 (Miri Round 4). Which is canonical? Must be resolved before HeritageGrammarOverlay files can be authored. Miri CRITICAL
OQ-R1-B SocietyProfileRef resolution: culture RON filename (e.g. "van-maanens-star") or structured reference including heritage blend weights? Affects both the type definition and the culture RON schema. Miri CRITICAL
OQ-R1-C City marker schema: does Phase 1 read primary_function / planet_class / settlement_pattern from markers.json entries (requires atlas generator update), or derive from systems.db cross-reference by position (requires lookup code)? Miri + Tyre HIGH
OQ-R1-D Atlas coordinate translation: what is the mapping formula from atlas pixel coordinates (512×256 grid) to world sim-tile coordinates (512×512 per district)? No spec or code exists. Tyre HIGH
OQ-R1-E Thinnest vertical slice effort: Tyre estimates ~9 dev-days; Gestalt estimates ~57. What is the minimum Phase 1 scope (does it include Stages 35, or Stages 12 only)? Gestalt + Tyre HIGH
OQ-R1-F #615 (Tycoon starting state) cascade position: block behind generation pipeline (Tyre) vs. proceed as content design (Gestalt)? Gestalt + Tyre MEDIUM
OQ-R1-G wiki/cultural-groups/ population timing: author now alongside heritage content (Gaps A1-A2), or defer to Phase 3? Miri LOW
OQ-R1-H Pre-workshop tickets (#100, #156, #160) were scoped before the confirmed architecture. Do they get re-scoped in this workshop or handled as separate post-workshop cleanup? Gestalt LOW

Consolidated Pipeline Layer Table

Unified numbering across all three participants' inventories. Where participants used different layer numbers, this table uses a canonical sequence.

Layer Name Gestalt Tyre Miri Unified Status
1 Galactic / system definitions DONE DONE DONE DONE
2 Planetary heightmap simulation DONE DONE DONE DONE
3 Atlas markers — city placement, infrastructure DONE DONE DONE DONE
4 City naming (Gemma) DONE DONE DONE DONE
5 Economics layer — supply chains, brands, trade DONE (embedded L1) DONE DONE
6 City → District decomposition MISSING MISSING MISSING (schema gap) MISSING — CRITICAL. No ticket, no code, no design.
7 Phase 1: DistrictSkeleton generation STUB STUB STUB STUB — types compile, zero generation logic. WorldTier enum wrong.
7a — Stage 1: Classification (WorldTier, ComplexityTier, SettingType) STUB STUB no design rules authored STUB
7b — Stage 2: Block grid (DistrictLayoutMode, BlockSkeleton ×16) STUB STUB no layout probability tables STUB
7c — Stage 3: Reservations (MultiBlockReservation, terminals) STUB STUB STUB
7d — Stage 4: Social sites + NPC (SocialSitePlacement, triangles) STUB STUB 3/230+ culture files; no heritage blends STUB
7e — Stage 5: Guarantee audit (GuaranteeAuditResult) STUB STUB STUB (String alias)
8 Society profile / culture resolution PARTIAL (#679 done, not wired to skeleton) PARTIAL (spike binary only) PARTIAL (3 RON files, no heritage blends) PARTIAL — wiring gap + content gap
9 Phase 2: ChunkData tile generation MISSING MISSING MISSING MISSING — CRITICAL. No code, no tile vocabulary.
10 Heritage grammar overlay application MISSING MISSING MISSING (no data files for any root) MISSING — design complete (miri-round4.md spec), no Rust type, no data
11 NPC population / manifest seeding PARTIAL (triangle system full; NpcManifest missing) PARTIAL (spike, no ECS wiring) PARTIAL (culture RON operational, no heritage blend) PARTIAL — machinery exists, pipeline connection missing
12 Chunk streaming → generator hookup STUB (streaming works; generator call is blank) PARTIAL (load/unload works; fill is wrong) N/A PARTIAL — streaming architecture ready, generator call absent

Key: Layer 6 and Layer 9 are the two critical missing gaps. Layer 7 has types but no logic. Layers 8, 11, 12 are partial with clear wiring gaps. Everything at Layer 10 is zero.


New Tickets Proposed — Summary by Participant

Gestalt's proposed new tickets

Priority Scope Blocked by
Blocker Fix WorldTier enum in generator.rs #897
Critical Layer 6: City → District decomposition None (after WorldTier fix)
Critical Phase 2: Basic chunk tile generator #899
High Connect chunk_streaming to Phase 2 generator Phase 2 ticket
High Wire society profile (#679) to DistrictSkeleton #899
Medium Re-scope #156, #100 against confirmed architecture Phase 2 ticket

Tyre's proposed new tickets

Priority Scope Effort Blocked by
1 Fix WorldTier enum values in generator.rs 0.5d Nothing
2 City-to-district decomposition — spec and implementation 2d Nothing
3 DistrictSkeleton Phase 1 generator (Stages 12) 3d Tickets 1, 2
4 Add missing DistrictSkeleton fields (vertical_structure, breach_only_zones, derived_analysis) 0.5d Ticket 3
5 ChunkData Phase 2 minimal fill 2d Ticket 3
6 Wire generator to chunk_streaming (DistrictMap resource + dispatch) 1d Tickets 2, 3, 5

Miri's proposed new tickets (content)

Priority Scope
Critical Heritage root blend mapping — extend culture RON schema, author Van Maanen's Star blend
Critical HeritageGrammarOverlay data files — 10 heritage roots from miri-round4.md spec
High ObjectTag vocabulary — joint Miri + Araminta authoring
High Zone identity definitions — one spec per DistrictType value
Medium Van Maanen's Star cultural group wiki entry
Medium City marker schema extension — coordinate with Tyre

Existing Ticket Positions — All Three Participants

Ticket Title Gestalt Tyre Miri
#615 Tycoon small business starting state Not generation-dependent; feeds #681 Should be blocked behind generation pipeline No position taken on cascade placement
#616 Economic verb vocabulary design Content design; no pipeline dependency Can proceed No pipeline dependency
#619 Full character customisation NOT generation-dependent; Phase 4 UI NOT blocked by generation pipeline No pipeline dependency flagged
#681 Apartment generator (server) Add Phase 1 skeleton as formal blocker Should be blocked behind vertical slice Can proceed for culturally-voiced version; heritage spatial refinement is a second pass
#682 Apartment visual rendering (client) Blocked by #681 — correct, no changes Blocked by #681 Blocked by #681
#694 Character creation screen NOT generation-dependent; Phase 4 UI NOT blocked by generation pipeline No pipeline dependency flagged
#899 District skeleton generator — Phase 1 Correct scope; misses Layer 6 and WorldTier fix Blocked by city decomp ticket + WorldTier fix Blocked by #897 + heritage blend content

For Round 2 Attention

The following items from Round 1 carry unresolved positions that Round 2 should address:

  1. OQ-R1-A (Heritage root count) — Must be resolved before any heritage content can be authored. Affects Miri and Araminta's work scope.
  2. OQ-R1-B (SocietyProfileRef type) — Affects both the Rust type design and culture RON schema. Tyre and Miri should align on this before #899 scoping.
  3. OQ-R1-C (City marker schema) — Joint Miri/Tyre decision. Determines whether generate_atlas.py must be extended.
  4. OQ-R1-D (Atlas coordinate translation) — No participant proposed a formula. Tyre owns this technically.
  5. OQ-R1-E (Vertical slice scope and effort) — Gestalt and Tyre estimates diverge by 24 days. Agree on minimum Phase 1 stages in Round 2.
  6. OQ-R1-F (#615 cascade position) — Gestalt and Tyre disagree. Needs a position for the ticket dependency graph.
  7. Gap E (Economics → generation bridge design) — Gestalt proposed a design principle but it has no D-record candidate yet. Round 2 should decide whether this produces a D-record.

Notes compiled by Qatux from Round 1 source files. All positions attributed to their source participant. No editorial opinions added.