Found while auditing W103.1 (the GameOfLife S6/S7 concept mirror) against shipped simulation-kind code.
design/20-contract.md declares NPCState/LocationState as part of WorldState (§3.3-ish, listed around line 3444-3446), mirroring GameOfLife's 5.3.3 lifecycle: npcs seeded one-per-NPCDefinition and locations seeded from the LocationDefinition graph reachable from startingLocationId, both at game creation.
But buildWorld in src/engine/src/kinds/simulation/initial.ts:318-330 initializes npcs: [] and locations: [] unconditionally — never seeded from campaign content. No other code path writes to state.world.npcs or state.world.locations (checked endOfWeek.ts, startOfWeek.ts, advance.ts, resolvers.ts): the travel/location resolvers (resolvers.ts:287,411,1431-1441) and the socialize/NPC resolvers (resolvers.ts:1505,1514) read campaign.locations/campaign.npcs (the content definitions) directly, bypassing kind state entirely. view.ts:209-210,293,306 projects state.world.locations into PublicLocationState[], which is therefore always [] regardless of what a campaign declares.
Unlike the acknowledged-open EconomyState/DifficultyDefinition gaps (commented as deliberate/deferred at initial.ts:73-90,228-229), there's no comment near npcs: []/locations: [] marking this as intentional.
Done when
Found while auditing W103.1 (the GameOfLife S6/S7 concept mirror) against shipped simulation-kind code.
design/20-contract.mddeclaresNPCState/LocationStateas part ofWorldState(§3.3-ish, listed around line 3444-3446), mirroring GameOfLife's5.3.3lifecycle:npcsseeded one-per-NPCDefinitionandlocationsseeded from theLocationDefinitiongraph reachable fromstartingLocationId, both at game creation.But
buildWorldinsrc/engine/src/kinds/simulation/initial.ts:318-330initializesnpcs: []andlocations: []unconditionally — never seeded from campaign content. No other code path writes tostate.world.npcsorstate.world.locations(checkedendOfWeek.ts,startOfWeek.ts,advance.ts,resolvers.ts): the travel/location resolvers (resolvers.ts:287,411,1431-1441) and the socialize/NPC resolvers (resolvers.ts:1505,1514) readcampaign.locations/campaign.npcs(the content definitions) directly, bypassing kind state entirely.view.ts:209-210,293,306projectsstate.world.locationsintoPublicLocationState[], which is therefore always[]regardless of what a campaign declares.Unlike the acknowledged-open
EconomyState/DifficultyDefinitiongaps (commented as deliberate/deferred atinitial.ts:73-90,228-229), there's no comment nearnpcs: []/locations: []marking this as intentional.Done when
WorldState.npcs/locationsshould actually be seeded from content (matching the contract and GameOfLife's lifecycle) or the contract/types should be narrowed to match what's shipped, and record which.