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>
17 KiB
title, description, type, status, workshop, agent, round, created
| title | description | type | status | workshop | agent | round | created |
|---|---|---|---|---|---|---|---|
| Paula — Round 2: Narrative Structure Expressed Through Spatial Generation | Political and class legibility through district spatial parameters; naming registers; authored vs. seeded boundary | workshop | active | generation-cascade | paula | 2 | 2026-04-30 |
Generation Cascade — Round 2 (Paula)
Focus: What districts should express politically and socially through space alone; naming as narrative signal; where the authored/seeded boundary sits; minimum narrative floor for the thinnest vertical slice.
Not addressed here: NPC systems, heritage grammar overlays, culture files, social sites, triangle system. Those are outside scope.
1. What Districts Should Express Spatially
The honest truth is that political power and class have always been written into cities before anyone consciously designed them that way. The question is whether our generator makes those patterns legible to a player walking through a district without any UI overlay or NPC dialogue.
These are the spatial parameters that carry political information. They are all derivable from DistrictType + WorldTier + a prosperity scalar. No cultural content required.
The Parameters
prosperity_index: f32 (0.0 → 1.0)
This is the single most important signal and it doesn't exist in the current data model. Everything about class legibility flows from it:
| Prosperity band | Tile decay probability | Road width | Building density | Green space |
|---|---|---|---|---|
| 0.0–0.2 (subsistence) | 40–60% tiles damaged/patched | Narrow | Very high lot coverage | None |
| 0.2–0.4 (working) | 20–35% | Narrow to medium | High | Minimal (functional only) |
| 0.4–0.6 (middle) | 5–20% | Medium | Medium | Small plazas |
| 0.6–0.8 (affluent) | 1–5% | Medium to wide | Lower (setbacks) | Parks |
| 0.8–1.0 (elite/monumental) | <1% | Wide to boulevard | Low (wasted space is luxury) | Maintained gardens |
This is a new field proposal: add prosperity_index: f32 to DistrictSkeleton. It's computed in Phase 1 Stage 1 from WorldTier + DistrictType + the city's economic profile in systems.db. No authoring required — it's derived.
perimeter_treatment: PerimeterTreatment
Currently the access_points: Vec<AccessPoint> field handles district entry/exit points. That's not sufficient. The character of those entry points is the political signal. Proposed enum:
Open // no boundary markers; permeable (organic/poor residential)
Fenced // visible boundary, no control (light industrial, transitional)
Walled // physical barrier, uncontrolled gaps (heavy industrial, abandoned)
Gated // checkpoints on main arteries, open on minor (elite residential)
Checkpoint // all entry points monitored (corporate security, administrative)
A player approaching a Checkpoint district understands before entering: this space is controlled by someone who has resources to control it. No NPC required. This field belongs on DistrictSkeleton alongside access_points. It's derived from DistrictType + WorldTier + prosperity_index.
layout_mode: DistrictLayoutMode
Already designed (Grid | Organic) and already in the spec. This is worth calling out explicitly as a political signal, because it is one:
- Grid districts were planned by someone with authority and resources. They signal deliberate power — administrative, corporate, institutional.
- Organic districts grew without central planning. They signal ungoverned space, or space that predates whoever is currently in charge. They feel older, stranger, harder to navigate.
A poor Organic district and a poor Grid district tell different political stories even at identical prosperity levels. One was always poor; the other was once planned and has since declined.
Road width as status
The workshop-outcomes.md spec notes CorridorSpine but doesn't specify widths as narrative signals. Proposal: road width should be a function of DistrictType + prosperity_index with deliberate political logic:
- Administrative districts: wide boulevards regardless of prosperity (power signals itself)
- Industrial: wide loading corridors on main arteries, narrow worker passages elsewhere
- Residential elite: wide main arteries, controlled secondary streets
- Residential working: uniform narrow (no hierarchy because no investment)
- Transit: widths are functional (vehicle-scaled), not status-scaled
The key signal here is width hierarchy — elite districts have a clear hierarchy from boulevard to secondary to alley. Poor districts have uniform narrowness. That uniformity reads as neglect.
Sight lines as political geometry
This one is harder to implement but worth flagging as a design principle for Phase 2 tile generation: sight lines carry political meaning.
- Can you see the administrative building from everywhere in the district? That's intentional design — presence asserted through visibility.
- A corporate security district has open sightlines through corridors (surveillance optimization).
- An organic working-class district has broken sightlines — buildings jut out, alleys angle away, nothing is legible at distance.
I'm not proposing full sight-line computation in the first pass. But Phase 2 tile selection should be aware that building placement along corridors in high-prosperity/Checkpoint districts should maintain sightlines, while Organic/low-prosperity districts should not. This is a parameter in the block fill algorithm, not a separate computation.
2. Naming With Narrative Weight
Every place name is a political act. Who gets commemorated? What function is elevated to a proper noun? What's left unnamed and called by folk description instead?
The generator needs naming registers — not just name pools. The register determines what kind of name is drawn. The culture pool provides the raw names.
The Five Naming Registers
| Register | Pattern | What it signals | Typical districts |
|---|---|---|---|
| Commemorative | Person's name, institutional name | Establishment power; official naming | Administrative, elite Residential |
| Functional | What happens here | Working class, transit-adjacent; named for use | Industrial, Transit, LogisticsHub |
| Aspirational | Abstract positive noun | Corporate development, gentrification | New commercial, MixedUse in growth |
| Folk | Colloquial, descriptive, sometimes ironic | Organic/ungoverned; named by inhabitants not officials | Old Residential, Backwater settlements |
| Geographic | Terrain feature, orientation | Pre-political naming; oldest settlements | Any SettingType with natural features |
How the generator picks a register:
This is a lookup table by (DistrictType, WorldTier) with weighted blends, not a hard assignment. Example:
| DistrictType | WorldTier | Primary register | Secondary register |
|---|---|---|---|
| Administrative | Epicenter | Commemorative | Aspirational |
| Administrative | Backwater | Folk | Functional |
| Industrial | any | Functional | Folk |
| Residential (high prosperity) | Regional+ | Geographic | Commemorative |
| Residential (low prosperity) | any | Folk | Functional |
| Transit | any | Functional | Numbered |
| MixedUse | Regional | Aspirational | Functional |
The Backwater WorldTier shift matters: an Administrative district in a Backwater system doesn't have the resources for commemorative naming. It gets folk names that happen to include the word "council" or "office."
This is worth a D-record. It's a locking decision about what the generator produces.
Street Naming
Streets within a district should follow the district register but with additional signals:
- Named streets (proper noun) signal importance and age — this street was worth naming
- Numbered streets signal planned grid — authority imposed order
- Descriptive streets ("Canal Way", "Mill Road") signal function-first origin — working space
- Colloquial streets that don't match their character ("The Long Road" being short) signal living history — the name outlasted what it described
The generator can produce these mechanically: Grid layout districts use numbered secondaries. Organic layout districts use descriptive and colloquial names drawn from the culture folk pool.
Landmark Naming
Landmarks inherit naming from the controlling faction, derivable from the economics layer. If ISC (a corporation in systems.db) operates in this system's logistics sector, the water distribution hub is "ISC Reservoir #4," not "Community Water Station." The economics layer already knows who controls what — landmark naming can pull from that directly, no authoring required.
3. The Seed-vs-Authored Boundary
Round 1 didn't address this directly. I want to be explicit about it because it determines authoring workload.
What Should Be Authored Per City (Small Fixed Set)
Political archetype — one field per city in atlas/systems.db:
Five archetypes cover the vast majority of settlement types:
CompanyTown— one corporation dominates; homogeneous district type distributionAdminCapital— government/institutional core surrounded by support districtsFreePort— Transit and MixedUse dominant; contested/heterogeneousContested— two or more factions with visible boundary zonesOrganicGrowth— no dominant power; district types mix without hierarchy
This single field per city drives the district type distribution for Layer 6 (city → district decomposition). It's derivable from systems.db economics data for most cities, but someone needs to sanity-check the results for named cities in the setting. This is a small authoring task, not a large one.
Named landmarks in major cities (authored by the team):
Capital cities and named stations should have specific landmark names that anchor the setting. These are authored as part of Miri's work, not generated. The generator reserves the landmark slots; the authored names fill them for named cities.
What Is Derived From Existing Data (Zero Additional Authoring)
- District type distribution → from
political_archetype+ systems.db economics data - Prosperity index per district → from systems.db wealth indicators per city
- Naming register → from
(DistrictType, WorldTier)lookup table (authoring the table once covers all cities) - Landmark naming for unnamed/minor cities → from systems.db corporation data
- Perimeter treatment tier → from
DistrictType+WorldTier+ prosperity_index
What Is Seeded (Deterministic Variation Per District)
- Block arrangement within district type + layout_mode constraints
- Specific tile decay placement within prosperity_index band
- Road width variation within allowed range per district type
- Perimeter treatment sub-tier (a working-class district might be Fenced or Open depending on seed, not authored)
- Street and landmark names for unnamed districts — drawn from culture pool, seeded per street
- Exact landmark footprint position within the reserved slot
The key principle: authored content is high-value and static across playthroughs (Van Maanen's Star's capital always has the same major landmarks). Seeded content produces variation within that stable frame. The generator never needs to invent political geography from nothing — it reads it from data that already exists.
4. Minimum Narrative Signal for the Thinnest Vertical Slice
If we generate one district with walkable tiles, what's the absolute minimum that makes it feel like a place with a story rather than a procedural grid?
Five signals. All derivable from existing or proposed architecture.
-
prosperity_index: f32— drives tile decay, road width, density. New field. One number. All class legibility downstream from this. -
DistrictType— already in the struct. Determines the fundamental spatial vocabulary. Even with identical tile graphics, the shape of blocks differs between Industrial and Residential. -
perimeter_treatment: PerimeterTreatment— new proposed field. The approach to a district is the first story beat. A player walking toward a Checkpoint district understands access control before entering. No tile variation needed — just the presence of the boundary marker tile at access points. -
layout_mode: DistrictLayoutMode— already designed. Grid vs. Organic changes the political reading of any district. This one parameter tells the player whether this space was planned by power or grew without it. -
One active landmark slot — already in the spec as
LandmarkSlot. Even if it only manifests as a larger building footprint with no special behavior, it gives the district a focal point. A space with no orientation is spatially illegible — nothing says "something important happened here."
With these five signals, a player traversing a Checkpoint-perimeter, Organic-layout, low-prosperity Industrial district understands: this space has authority asserted over it from outside (checkpoint) but grew without planning (organic). It's economically marginal (decay tiles). Something notable anchors it (landmark footprint). That's narrative without dialogue, UI overlay, or NPC interaction.
What this does NOT require for the first pass:
- Heritage grammar overlays — district character is legible without them
- Culture-specific tile sets — decay vs. intact is sufficient; culture flavoring is Phase 2 enrichment
- Social site population — the physical district is readable before anyone lives in it
- Named streets — streets without names are still streets; naming enriches but doesn't unlock legibility
5. Positions on Round 1 Disagreements
On #615 (Tycoon starting state) cascade placement:
I agree with Gestalt. #615 is content design. The starting state description needs to know what kinds of spaces exist — the DistrictType taxonomy, the WorldTier values, what a prosperous district vs. a marginal one looks like in this setting. It does not need working generation code.
What #615 does need is OQ-R1-B resolved (SocietyProfileRef type) so it knows what cultural data the starting state can reference. Link #615 to that resolution, not to the generation pipeline milestone.
On vertical slice effort (Gestalt 5-7 days vs. Tyre ~9 days):
From a narrative perspective, stages 3–5 of Phase 1 (Reservations, Social sites, Guarantee audit) do not add to a player's ability to read a district as a place. They add simulation depth. The minimum for narrative legibility is Stages 1–2 (Classification + Block grid) + Phase 2 minimal fill.
That's the basis for Gestalt's lower estimate. I'd formally support deferring Stages 3–5 until after the first walkable district is demonstrably legible. Build the legibility floor first; add simulation depth once the basic spatial story works.
6. Proposed D-Record
D-READY-P1: Spatial Class Legibility Requirements
Districts must express political character through spatial parameters, not just type labels. The following fields are minimum requirements on DistrictSkeleton for a district to be narratively legible to a player traversing it without NPC interaction or UI overlay:
prosperity_index: f32— new field; drives tile decay probability, road width tier, building density, green space allocationperimeter_treatment: PerimeterTreatment— new field; enum: Open | Fenced | Walled | Gated | Checkpoint; derived from DistrictType + WorldTier + prosperity_indexlayout_mode: DistrictLayoutMode— already in spec; must be respected by Phase 2 tile generation as a first-order spatial signal
Additionally, district and street naming registers (Commemorative | Functional | Aspirational | Folk | Geographic) must be resolved before Phase 2, as the naming of streets is part of the spatial output of the generator, not a post-generation overlay. The register is determined by (DistrictType, WorldTier) lookup; the names are drawn from culture pool.
Reason to lock: Phase 2 tile selection needs to know what signals to produce. If prosperity_index and perimeter_treatment aren't on DistrictSkeleton before Phase 2 is implemented, tile generation will produce spaces that are spatially indistinguishable regardless of district type — a simulation fidelity problem that's expensive to retrofit.
7. Open Questions From This Analysis
| ID | Question | Priority |
|---|---|---|
| OQ-R2-P1 | Should prosperity_index be explicitly authored for named cities (Van Maanen's Star capital) or always derived from systems.db economic data? The derived approach may produce counterintuitive results for scripted setting cities. |
HIGH |
| OQ-R2-P2 | Is political_archetype a new field in atlas markers.json, or derived from existing systems.db data? If derived, what is the derivation rule? |
HIGH |
| OQ-R2-P3 | Naming register lookup table: who authors the (DistrictType, WorldTier) → register mapping? This is a small task but needs ownership before Layer 6 generates district names. |
MEDIUM |
Paula — Round 2. Written 2026-04-30.