From 95c0da9cf5c4482e9a9d7ba128b7d8f39acf0aec Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Sat, 7 Mar 2026 09:27:16 +0100 Subject: [PATCH 1/3] feat(copy): add zone identity specs and Krenn culture profile (#609, #610) Zone identity specs for the generator spike proof-of-life: - rural-zone-spec.ron: 4 roles, 3 social sites, density 2, economic 3 - industrial-zone-spec.ron: 4 roles, 3 social sites, density 6, economic 7 Krenn culture profile: - culture-krenn.ron: 40 given names, 16 family names, speech patterns, cultural values (Bold/Honest/Curious/Social favored) All three files validate against the Rust structs from #611 and produce visibly differentiated output from the generator spike. Co-Authored-By: Claude Opus 4.6 --- content/global/culture-krenn.ron | 103 +++++++++++++++++++++ content/global/industrial-zone-spec.ron | 116 ++++++++++++++++++++++++ content/global/rural-zone-spec.ron | 116 ++++++++++++++++++++++++ 3 files changed, 335 insertions(+) create mode 100644 content/global/culture-krenn.ron create mode 100644 content/global/industrial-zone-spec.ron create mode 100644 content/global/rural-zone-spec.ron diff --git a/content/global/culture-krenn.ron b/content/global/culture-krenn.ron new file mode 100644 index 000000000..11d8eb627 --- /dev/null +++ b/content/global/culture-krenn.ron @@ -0,0 +1,103 @@ +// Krenn Culture Profile +// +// Schema: server/src/npc/blueprint.rs :: CultureProfile +// Ticket: #610 (copy team) +// Validate: tooling/validate-ron content/global/culture-krenn.ron culture +// +// Sources: D-036 (Sova Transit District / Krenn System setting, amended post-workshop), +// D-121 (voice is culture-driven, job as modifier), +// D-128 (culture implicit in starting location). +// +// Krenn: ~180 years settled. Mid-Reach G3V system. Working-class pragmatic. +// Community-oriented, suspicious of distant authority. Competence earns respect. +// Showing up and doing the work matters more than rank or credentials. +// First-name-primary in social contexts — family names are institutional. + +( + id: "krenn", + name: "Krenn System Culture", + description: "Working-class pragmatic culture. ~180 years settled, mid-Reach G3V system. Community-oriented, suspicious of distant authority, values competence and reliability over credentials. Atmosphere: quotidian-with-undertow — comfortable enough to be complacent, tight enough that extra income is tempting.", + + naming: ( + style: "compact, consonant-heavy, first-name-primary in social contexts", + // Pool the generator draws from. More names = more variety across runs. + // Source: D-036 canonical examples + extended set following same phoneme rules. + // Rule: compact (1-2 syllables), consonant clusters welcome, no soft endings. + given_names: [ + // D-036 canonical set + "Kael", "Voss", "Lera", "Torek", "Drin", + "Maret", "Naia", "Sera", "Nils", "Pael", + "Tev", "Ren", "Sess", "Renn", "Olin", + "Tav", "Resha", "Harek", "Sabel", "Pell", + // Extended — same phoneme pattern + "Dav", "Korr", "Ness", "Pren", "Vel", + "Orin", "Mael", "Torra", "Narek", "Sev", + "Bren", "Linn", "Vael", "Darek", "Pess", + "Nell", "Kren", "Sorel", "Tavek", "Rael", + ], + family_names: [ + // D-036 canonical + extended + "Davan", "Sessik", "Korr", "Tamm", "Venn", + "Lintar", "Darvo", "Kosse", + // Extended + "Pellan", "Sorren", "Tessik", "Narek", "Brav", + "Ossel", "Rennick", "Harven", + ], + // Krenn culture is first-name-primary. + // Family names exist but belong to institutional contexts: contracts, registrations, arrest records. + family_name_used_socially: false, + ), + + speech: ( + // Direct. Minimal pleasantries. Gets to the point — not because they're rude, + // but because time is real and everyone's short of it. + register: "direct, minimal pleasantries, gets to the point", + filler_words: [ + "look", + "right", + "yeah", + "so", + "listen", + "well", + ], + greetings: [ + "hey", + "morning", + "shift treating you alright?", + "all good?", + "what's the word?", + "you okay?", + ], + farewells: [ + "shift's calling", + "gotta move", + "catch you later", + "take it easy", + "see you around", + "stay out of trouble", + ], + // Krenn oaths are void-adjacent — space is real here, and hostile. + // They don't swear by gods or governments. They swear by what kills you. + exclamations: [ + "void take it", + "stars", + "blood and void", + "unbelievable", + "damn all", + "not again", + ], + ), + + values: ( + description: "Pragmatic, community-oriented, suspicious of authority. Competence earns respect. Showing up and doing the work matters more than rank or credentials. Outsiders are tolerated but watched. Loyalty runs narrow and deep — to your crew, your shift, your street.", + // Traits more common in Krenn culture — generator biases toward these. + // Bold: Krenn people speak their mind. Honest: community trust is load-bearing. + // Curious: 180 years of problem-solving breeds intellectual appetite. + // Social: community-oriented culture; isolation is a warning sign. + favored_traits: [Bold, Honest, Curious, Social], + // Traits less common — generator biases away from these. + // Reclusive: red flag in a community that depends on showing up. + // Deceptive: betrayal of trust is the worst thing you can do here. + disfavored_traits: [Reclusive, Deceptive], + ), +) diff --git a/content/global/industrial-zone-spec.ron b/content/global/industrial-zone-spec.ron new file mode 100644 index 000000000..5db06b09d --- /dev/null +++ b/content/global/industrial-zone-spec.ron @@ -0,0 +1,116 @@ +// Zone Identity Spec — Industrial +// +// Schema: server/src/npc/blueprint.rs :: ZoneSpec +// Ticket: #609 (copy team) +// Validate: tooling/validate-ron content/global/industrial-zone-spec.ron zone +// +// Character: freight handling, manufacturing, maintenance. High throughput. +// Shift rhythms. Functional over comfortable. Nobody lingers — unless they're on break. +// +// Generator contrast target: industrial vs rural (Sprint 25 proof). +// If these produce NPCs that look the same, something is wrong. + +( + zone_type: "industrial", + label: "Industrial Zone", + description: "Freight handling, manufacturing, and maintenance. High throughput, shift-based work rhythms, functional over comfortable. Faces are known by role and bay number more than name. The work doesn't stop between shifts — people do.", + + // 1-10. Industrial Krenn: steady credit flow, but it all goes somewhere. + economic_level: 7, + // 1-10. Dense. Multiple shifts overlap. Crowds at handover. + population_density: 6, + + roles: [ + ( + id: "dock_worker", + label: "Dock Worker", + // Most common. The zone runs on their backs. + weight: 5, + skill_focus: ["technical"], + combat_eligible: false, + typical_behaviors: [ + "guides a freight container into position with hand signals", + "checks a manifest against a handheld scanner, lips moving", + "waits at the loading bay apron with arms crossed, watching the clock", + "calls bay numbers to a colleague across the noise of the floor", + "hooks a cargo sling and steps clear before signaling the lift", + "stacks empty pallets against a wall with mechanical efficiency", + "wipes sweat from her face with a forearm and keeps moving", + ], + ), + ( + id: "technician", + label: "Systems Technician", + // Keeps the infrastructure running. Never enough of them. + weight: 4, + skill_focus: ["technical"], + combat_eligible: false, + typical_behaviors: [ + "runs a diagnostic routine on a floor console, eyes on the readout", + "traces a conduit run along the ceiling with a handheld light", + "swaps a panel module with practiced speed and no wasted motion", + "logs a fault code into a datapad before moving on", + "presses an ear to a vibrating duct and listens", + "argues quietly with a display that isn't giving the right numbers", + ], + ), + ( + id: "foreman", + label: "Shift Foreman", + // Fewer of them. High visibility. Everyone knows where they are. + weight: 2, + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + typical_behaviors: [ + "walks the floor with a datapad under one arm and says nothing", + "pulls a worker aside for a quiet word near the far wall", + "marks a line off a production board and moves to the next one", + "stands at the mezzanine rail watching throughput without expression", + "reviews shift handover notes and circles something with a stylus", + "speaks to a dock crew in a low voice — they listen without nodding", + ], + ), + ( + id: "security", + label: "Facility Security", + // Present, watchful. Not looking for trouble — cataloguing it. + weight: 2, + skill_focus: ["combat", "observation"], + combat_eligible: true, + typical_behaviors: [ + "sweeps the access corridor on a timed circuit, same path each time", + "checks IDs at the freight elevator with a scanner and no eye contact", + "stands post near the restricted equipment bay, back to the wall", + "notes something in a shift log without reacting to it outwardly", + "watches a handover between crews from across the loading floor", + ], + ), + ], + + social_sites: [ + ( + site_type: "break_room", + label: "Worker Break Room", + // Between shifts. Decompression. People stop performing for a moment. + roles: ["dock_worker", "technician", "foreman"], + min_npcs: 2, + max_npcs: 5, + ), + ( + site_type: "maintenance_bay", + label: "Maintenance Bay", + // Active work site. Technicians and dock workers cross paths here. + roles: ["technician", "dock_worker"], + min_npcs: 2, + max_npcs: 4, + ), + ( + site_type: "loading_platform", + label: "Loading Platform", + // The operational center. Busy, loud, coordinated. + roles: ["dock_worker", "foreman", "security"], + min_npcs: 3, + max_npcs: 8, + ), + ], +) diff --git a/content/global/rural-zone-spec.ron b/content/global/rural-zone-spec.ron new file mode 100644 index 000000000..1abe97060 --- /dev/null +++ b/content/global/rural-zone-spec.ron @@ -0,0 +1,116 @@ +// Zone Identity Spec — Rural +// +// Schema: server/src/npc/blueprint.rs :: ZoneSpec +// Ticket: #609 (copy team) +// Validate: tooling/validate-ron content/global/rural-zone-spec.ron zone +// +// Character: scattered homesteads and small workshops. Unhurried. Community-bound. +// Low throughput, high familiarity. Everyone knows who belongs here. +// +// Generator contrast target: rural vs industrial (Sprint 25 proof). +// If these produce NPCs that look the same, something is wrong. + +( + zone_type: "rural", + label: "Rural Settlement", + description: "Scattered homesteads, small workshops, and communal gathering points. Low population density, strong community bonds, subsistence-plus economy. Work is seasonal and visible — everyone knows what everyone else is doing.", + + // 1-10. Rural Krenn: self-sufficient, low cash flow, barter supplements credits. + economic_level: 3, + // 1-10. Sparse. Faces are familiar. Strangers stand out. + population_density: 2, + + roles: [ + ( + id: "farmer", + label: "Farmer", + // Most common. The settlement runs on food production. + weight: 5, + skill_focus: ["technical"], + combat_eligible: false, + typical_behaviors: [ + "tends rows of low-growing crops with a long-handled hoe", + "lifts a crate of produce onto a flatbed with practiced ease", + "squints at the sky before deciding whether to water", + "patches a cracked irrigation pipe with strips of bonding tape", + "calls across a field to a neighbor without looking up from work", + "hauls produce to the market stall before the heat of the day", + "checks seedling trays in a low prefab greenhouse", + ], + ), + ( + id: "mechanic", + label: "Settlement Mechanic", + // One or two per settlement. Everyone knows who to call. + weight: 3, + skill_focus: ["technical"], + combat_eligible: false, + typical_behaviors: [ + "pulls a drive unit from a tiller and examines the worn housing", + "wipes grease on the thigh of her coveralls between jobs", + "explains a repair in clipped shorthand without looking up", + "lines up salvaged parts on a workbench and assesses them", + "welds a seam on a cracked water tank with slow, careful strokes", + "borrows a tool from a neighbor and returns it without being asked", + ], + ), + ( + id: "trader", + label: "Itinerant Trader", + // Passes through. Outsider-familiar — not local, not stranger. + weight: 2, + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + typical_behaviors: [ + "squares goods on a fold-out portable display with deliberate care", + "leans back on a stool and watches the foot traffic", + "counts credit chits with one thumb while talking to a customer", + "haggles with quiet patience — lets silence do the work", + "notes which locals are buying what, and remembers", + "packs unsold goods with no visible frustration", + ], + ), + ( + id: "militia", + label: "Settlement Militia", + // Rare. Part-time. Knows everyone, trusted because of it. + weight: 1, + skill_focus: ["combat", "observation"], + combat_eligible: true, + typical_behaviors: [ + "walks the fence line at a measured, unhurried pace", + "leans on the gate post with rifle slung, watching the road", + "waves a familiar face through without checking credentials", + "sits in the shade of the gatehouse with a local newsline", + "stops to talk with a passing farmer, eyes still scanning the perimeter", + ], + ), + ], + + social_sites: [ + ( + site_type: "tavern", + label: "Local Tavern", + // The Last Shift equivalent for rural Krenn: functional, familiar, slow. + roles: ["farmer", "mechanic", "trader", "militia"], + min_npcs: 3, + max_npcs: 6, + ), + ( + site_type: "workshop", + label: "Community Workshop", + // Shared space. People fix things together. + roles: ["mechanic", "farmer"], + min_npcs: 2, + max_npcs: 4, + ), + ( + site_type: "market_stall", + label: "Settlement Market", + // Weekly or daily trading post. Commerce and gossip combined. + roles: ["trader", "farmer"], + min_npcs: 1, + max_npcs: 3, + ), + ], +) From 4b75ec349512679cc13e74cb8f91f444787f0b56 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Sat, 7 Mar 2026 09:45:25 +0100 Subject: [PATCH 2/3] fix(copy): address PR #88 review comments - Remove "Narek" from family_names (duplicate with given_names), replace with "Morek" - Rewrite rural farmer behaviors to be location-agnostic (no sky/weather assumptions) - Add heritage root overlay comments (D-104/D-105) to both zone specs - Add insert/lattice tech behavior to industrial technician role - Rewrite 2 security behaviors with Krenn cultural texture (D-121) - Replace generic exclamations with Krenn-specific oaths ("void's sake", "same drill") - Replace soft greeting "you okay?" with "all in one piece?" Co-Authored-By: Claude Opus 4.6 --- content/global/culture-krenn.ron | 8 ++++---- content/global/industrial-zone-spec.ron | 8 ++++++-- content/global/rural-zone-spec.ron | 7 +++++-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/content/global/culture-krenn.ron b/content/global/culture-krenn.ron index 11d8eb627..0dfe8b188 100644 --- a/content/global/culture-krenn.ron +++ b/content/global/culture-krenn.ron @@ -40,7 +40,7 @@ "Davan", "Sessik", "Korr", "Tamm", "Venn", "Lintar", "Darvo", "Kosse", // Extended - "Pellan", "Sorren", "Tessik", "Narek", "Brav", + "Pellan", "Sorren", "Tessik", "Morek", "Brav", "Ossel", "Rennick", "Harven", ], // Krenn culture is first-name-primary. @@ -66,7 +66,7 @@ "shift treating you alright?", "all good?", "what's the word?", - "you okay?", + "all in one piece?", ], farewells: [ "shift's calling", @@ -82,9 +82,9 @@ "void take it", "stars", "blood and void", - "unbelievable", + "void's sake", "damn all", - "not again", + "same drill", ], ), diff --git a/content/global/industrial-zone-spec.ron b/content/global/industrial-zone-spec.ron index 5db06b09d..6c5ba5e11 100644 --- a/content/global/industrial-zone-spec.ron +++ b/content/global/industrial-zone-spec.ron @@ -9,6 +9,9 @@ // // Generator contrast target: industrial vs rural (Sprint 25 proof). // If these produce NPCs that look the same, something is wrong. +// +// Heritage roots (D-104/D-105) overlay these base specs at generation time, +// modifying role weights, social site composition, and behavioral flavoring. ( zone_type: "industrial", @@ -52,6 +55,7 @@ "logs a fault code into a datapad before moving on", "presses an ear to a vibrating duct and listens", "argues quietly with a display that isn't giving the right numbers", + "queries a fault log through her insert without touching the terminal, eyes briefly unfocused", ], ), ( @@ -79,8 +83,8 @@ combat_eligible: true, typical_behaviors: [ "sweeps the access corridor on a timed circuit, same path each time", - "checks IDs at the freight elevator with a scanner and no eye contact", - "stands post near the restricted equipment bay, back to the wall", + "waves a regular through the checkpoint on sight — scans the one behind them out of procedure", + "leans at the restricted bay entrance, arms folded — been watching this corridor since the shift started", "notes something in a shift log without reacting to it outwardly", "watches a handover between crews from across the loading floor", ], diff --git a/content/global/rural-zone-spec.ron b/content/global/rural-zone-spec.ron index 1abe97060..009d84d3f 100644 --- a/content/global/rural-zone-spec.ron +++ b/content/global/rural-zone-spec.ron @@ -9,6 +9,9 @@ // // Generator contrast target: rural vs industrial (Sprint 25 proof). // If these produce NPCs that look the same, something is wrong. +// +// Heritage roots (D-104/D-105) overlay these base specs at generation time, +// modifying role weights, social site composition, and behavioral flavoring. ( zone_type: "rural", @@ -31,10 +34,10 @@ typical_behaviors: [ "tends rows of low-growing crops with a long-handled hoe", "lifts a crate of produce onto a flatbed with practiced ease", - "squints at the sky before deciding whether to water", + "checks the section's light cycle timer before deciding whether to water", "patches a cracked irrigation pipe with strips of bonding tape", "calls across a field to a neighbor without looking up from work", - "hauls produce to the market stall before the heat of the day", + "hauls produce to the market stall before the morning exchange opens", "checks seedling trays in a low prefab greenhouse", ], ), From 10b1a4252e149bdb55f4679cefd744b6bfe880c7 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Sat, 7 Mar 2026 09:58:24 +0100 Subject: [PATCH 3/3] fix(copy): address PR #88 re-review comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Name pool fixes: - Remove "Korr" from given_names (duplicate with family_names), replace with "Tork" - Replace "Narek" with "Sorek" (real-world Armenian name, IP concern) - Replace soft "-ael" endings (Vael→Vrek, Rael→Rask) to match naming rules - Update comment: "no soft endings" → "hard endings preferred" - Add 2 family names (Tollek, Dass) to balance pool ratio (now 40/18) Voice fixes: - Replace "same drill" (not an exclamation) with "cold vacuum" - Rewrite 3 trader behaviors as observable stage directions - Add 2 foreman off-duty behaviors (person beneath the role) - Add break room behaviors to dock_worker, technician, foreman Co-Authored-By: Claude Opus 4.6 --- content/global/culture-krenn.ron | 14 +++++++------- content/global/industrial-zone-spec.ron | 4 ++++ content/global/rural-zone-spec.ron | 6 +++--- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/content/global/culture-krenn.ron b/content/global/culture-krenn.ron index 0dfe8b188..b6ba87c42 100644 --- a/content/global/culture-krenn.ron +++ b/content/global/culture-krenn.ron @@ -22,7 +22,7 @@ style: "compact, consonant-heavy, first-name-primary in social contexts", // Pool the generator draws from. More names = more variety across runs. // Source: D-036 canonical examples + extended set following same phoneme rules. - // Rule: compact (1-2 syllables), consonant clusters welcome, no soft endings. + // Rule: compact (1-2 syllables), consonant clusters welcome, hard endings preferred. given_names: [ // D-036 canonical set "Kael", "Voss", "Lera", "Torek", "Drin", @@ -30,10 +30,10 @@ "Tev", "Ren", "Sess", "Renn", "Olin", "Tav", "Resha", "Harek", "Sabel", "Pell", // Extended — same phoneme pattern - "Dav", "Korr", "Ness", "Pren", "Vel", - "Orin", "Mael", "Torra", "Narek", "Sev", - "Bren", "Linn", "Vael", "Darek", "Pess", - "Nell", "Kren", "Sorel", "Tavek", "Rael", + "Dav", "Tork", "Ness", "Pren", "Vel", + "Orin", "Mael", "Torra", "Sorek", "Sev", + "Bren", "Linn", "Vrek", "Darek", "Pess", + "Nell", "Kren", "Sorel", "Tavek", "Rask", ], family_names: [ // D-036 canonical + extended @@ -41,7 +41,7 @@ "Lintar", "Darvo", "Kosse", // Extended "Pellan", "Sorren", "Tessik", "Morek", "Brav", - "Ossel", "Rennick", "Harven", + "Ossel", "Rennick", "Harven", "Tollek", "Dass", ], // Krenn culture is first-name-primary. // Family names exist but belong to institutional contexts: contracts, registrations, arrest records. @@ -84,7 +84,7 @@ "blood and void", "void's sake", "damn all", - "same drill", + "cold vacuum", ], ), diff --git a/content/global/industrial-zone-spec.ron b/content/global/industrial-zone-spec.ron index 6c5ba5e11..16a682d6a 100644 --- a/content/global/industrial-zone-spec.ron +++ b/content/global/industrial-zone-spec.ron @@ -39,6 +39,7 @@ "hooks a cargo sling and steps clear before signaling the lift", "stacks empty pallets against a wall with mechanical efficiency", "wipes sweat from her face with a forearm and keeps moving", + "slumps into a break room chair and stares at nothing for a full minute before reaching for a drink", ], ), ( @@ -56,6 +57,7 @@ "presses an ear to a vibrating duct and listens", "argues quietly with a display that isn't giving the right numbers", "queries a fault log through her insert without touching the terminal, eyes briefly unfocused", + "stretches both arms overhead in the break room doorway, blocking it without noticing", ], ), ( @@ -72,6 +74,8 @@ "stands at the mezzanine rail watching throughput without expression", "reviews shift handover notes and circles something with a stylus", "speaks to a dock crew in a low voice — they listen without nodding", + "sits alone in the break room rubbing the back of her neck, datapad face-down on the table", + "laughs at something a technician says, then catches herself and goes quiet", ], ), ( diff --git a/content/global/rural-zone-spec.ron b/content/global/rural-zone-spec.ron index 009d84d3f..d9c9c0471 100644 --- a/content/global/rural-zone-spec.ron +++ b/content/global/rural-zone-spec.ron @@ -67,9 +67,9 @@ typical_behaviors: [ "squares goods on a fold-out portable display with deliberate care", "leans back on a stool and watches the foot traffic", - "counts credit chits with one thumb while talking to a customer", - "haggles with quiet patience — lets silence do the work", - "notes which locals are buying what, and remembers", + "flicks credit chits across the counter with one thumb, barely glancing down", + "holds eye contact through a long pause, waiting for the price to land", + "watches a regular browse the same shelf as last time and says nothing", "packs unsold goods with no visible frustration", ], ),