Merge remote-tracking branch 'origin/copy'

# Conflicts:
#	decisions/questions.md
This commit is contained in:
2026-03-07 19:51:31 +01:00
7 changed files with 378 additions and 247 deletions
+5
View File
@@ -6,6 +6,11 @@ Format based on [Keep a Changelog](https://keepachangelog.com/).
## [Unreleased]
### Added
- Zone identity specs renamed to location-specific: krenn-rural-zone.ron and krenn-industrial-zone.ron — acknowledges these are culture×zone content, not reusable templates (#630, Q-057)
- ~108 new NPC behavior pool entries across all roles in both zone files — trader stage directions, foreman humanity behaviors, dock_worker/technician off-shift/break room behaviors (#630)
- Q-057 open question: composable behavior generation — decompose hand-authored pools into role actions + culture modifiers + context tags (#633, #634)
## [v0.1.24] — 2026-03-06
### Changed
-124
View File
@@ -1,124 +0,0 @@
// 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.
//
// 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",
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",
"slumps into a break room chair and stares at nothing for a full minute before reaching for a drink",
],
),
(
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",
"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",
],
),
(
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",
"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",
],
),
(
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",
"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",
],
),
],
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,
),
],
)
+186
View File
@@ -0,0 +1,186 @@
// Krenn Industrial Zone — location-specific zone content
//
// Schema: server/src/npc/blueprint.rs :: ZoneSpec
// Ticket: #609, #630 (copy team)
// Validate: tooling/validate-ron content/global/krenn-industrial-zone.ron zone
//
// This is content for a specific location: a Krenn industrial district.
// Behaviors, roles, and social sites are culture×zone specific — not reusable
// templates. See Q-057 for the composable behavior generation design that
// will replace hand-authored pools with assembled primitives.
//
// Character: freight handling, manufacturing, maintenance. High throughput.
// Shift rhythms. Functional over comfortable. Nobody lingers — unless they're on break.
(
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",
"slumps into a break room chair and stares at nothing for a full minute before reaching for a drink",
// on-shift
"drags a heavy case along the deck plating one-handed, leaning hard into the weight",
"re-checks a seal on a container door after a colleague already checked it",
"flags a damaged pallet to the foreman without stopping the line",
"shoulders a cargo rig harness and clips in without looking down",
"sweeps debris off the loading apron with a long push broom",
"braces a container with a boot while reaching for the locking pin",
"reads the load ticket twice, then flips the handheld over to check the back",
"waves off a crane operator when the angle is wrong, holds up a fist",
"steps over a bundled cable run without breaking stride",
"peels off a work glove with his teeth to check a handheld display",
"trades a quick look with a colleague when the foreman walks by",
// off-shift / break room
"unwraps a meal packet in the break room and eats standing at the counter",
"passes a drink to the person next to her without being asked",
"leans back in a break room chair with eyes closed, boots crossed at the ankle",
"laughs at something across the break room table, loud enough to carry",
"shows something on a handheld to a colleague and both of them look at it for a moment",
"sits with elbows on knees, turning an empty cup in both hands",
"splashes water on his face at the sink and stands there a moment before turning off the tap",
"talks over the break room noise at volume, gesturing with a fork",
"falls asleep in a break room chair, chin on chest, arms folded",
],
),
(
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",
"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",
// on-shift
"taps a wrench against a junction box lid to test for rattle",
"pulls a burnt relay from a panel and holds it up to the light",
"clips a sensor lead to two terminals and watches the readout settle",
"photographs a fault site with a handheld before touching anything",
"threads a cable through a conduit run without looking, hands working by feel",
"checks a pressure gauge by putting a thumb on the dial housing and reading the needle",
"labels a repaired junction with tape and a marker, block letters",
"reads a service manual on a battered datapad, scrolling with one finger",
"kneels under a raised floor panel with a light between her teeth",
"closes a maintenance hatch and shoulder-checks it twice",
"stands on the second rung of a ladder and reaches without climbing higher",
// off-shift / break room
"sits sideways in a break room chair, back against the wall, feet on the seat beside her",
"pulls up a schematic on a personal handheld and looks at it between bites",
"refills someone else's cup from the urn without commenting on it",
"puts her boots on the break room table and doesn't move them when the foreman walks in",
"describes a problem to a dock worker who doesn't follow it but nods anyway",
"argues a point at the break room table, tapping the surface for emphasis",
"reads something on a personal device with his head tipped back and the screen held at arm's length",
"laughs until he has to set down his drink",
],
),
(
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",
"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",
// the person beneath the role
"covers a worker's absence from the shift log by redistributing the bay assignments",
"eats lunch standing at a wall terminal so she can watch the floor at the same time",
"takes the call herself instead of forwarding it, one hand pressed to her other ear against the noise",
"corrects a dock worker's form on the cargo rig harness without making it a lesson",
"walks a new hire through the handover checklist once, point by point, no shortcuts",
"keeps a junior worker between herself and the inspection team as the inspectors pass through",
"finds a reason to be nearby when a new worker makes her first solo lift",
"absorbs a production shortfall report without passing the frustration down the line",
"hands a dock worker an extra meal packet and walks away without explaining it",
"sits next to a technician in the break room and doesn't talk, just sits",
"makes a note in the shift log that takes longer to write than it takes to read",
"tells a bad joke to nobody in particular while marking off the production board",
"signs off on a repair she didn't inspect, because she knows who did it",
"stands at the edge of the loading floor for a long moment before walking back",
],
),
(
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",
"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",
"stops at a junction, looks both ways, and picks the longer route",
"runs an ID check on someone whose face she recognizes, procedure is procedure",
"stands with her back to a structural column where both exits are visible",
"glances at a badge without stopping the person wearing it",
"checks the restricted bay door seal before settling in to watch the corridor",
],
),
],
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,
),
],
)
+170
View File
@@ -0,0 +1,170 @@
// Krenn Rural Zone — location-specific zone content
//
// Schema: server/src/npc/blueprint.rs :: ZoneSpec
// Ticket: #609, #630 (copy team)
// Validate: tooling/validate-ron content/global/krenn-rural-zone.ron zone
//
// This is content for a specific location: a Krenn rural settlement.
// Behaviors, roles, and social sites are culture×zone specific — not reusable
// templates. See Q-057 for the composable behavior generation design that
// will replace hand-authored pools with assembled primitives.
//
// Character: scattered homesteads and small workshops. Unhurried. Community-bound.
// Low throughput, high familiarity. Everyone knows who belongs here.
(
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",
"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 morning exchange opens",
"checks seedling trays in a low prefab greenhouse",
"runs a thumb along the edge of a cracked irrigation seal, then sets it aside",
"stacks empty crates at the end of a row and knocks dirt off her boots",
"drags a length of hose to a dry section and clamps the fitting by hand",
"kneels at the base of a struggling plant and parts the soil with two fingers",
"leans on a fence post and watches the sky before going back to the row",
"refills a handheld sprayer from a standing drum without spilling",
"ties a row marker to a stake with a short length of wire",
"wipes sweat from her forehead with the back of a gloved hand",
"loads a wheelbarrow and tips it into a compost bin at the field edge",
"pulls a dead plant by the roots and carries it to the burn pile",
"tests soil moisture by pressing a thumb into the ground beside a seedling",
"walks the perimeter of a field and checks the wire for breaks",
"sets two crates down on the market floor and counts the lids twice",
// tavern / off-duty
"nurses a drink at the end of the bar with both hands wrapped around the glass",
"trades short words with the mechanic at the next seat without turning fully around",
"sits with boots off under the table, socked feet flat on the floor",
"refills a neighbor's cup from her own jug without being asked",
"plays a slow tile game with two others at the corner table",
"slides a credit chit across the bar and waits for change without counting it",
"leans back in the chair and stares at the ceiling for a long moment",
],
),
(
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",
"taps a seized bolt with a mallet twice before reaching for a longer bar",
"threads a wire through a conduit clip and bites the insulation back with her teeth",
"sets a part down, picks up the spec card beside it, and reads it once",
"uses a straight edge to check the flatness of a repaired flange",
"drains a coolant line into a catch tray and marks the container",
"torques a fastener by feel and then confirms it with a wrench click",
"stacks finished repairs in a corner and photographs them with a handheld",
"jots a note on a strip of tape and sticks it to a part's casing",
"squeezes into a narrow access panel and works by touch",
"straightens up and rolls her neck once before kneeling back down",
// tavern / off-duty
"rinses her hands twice at the basin before sitting down at the bar",
"drops her toolkit bag under the stool and orders without looking at the board",
"listens to a farmer's complaint about a tiller and nods once or twice",
"draws a rough diagram on a napkin to explain something, then folds it away",
"buys a round for the table and returns to her seat before anyone can thank her",
],
),
(
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",
"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",
"unrolls a cloth display on the counter and weights the corners with small stones",
"lifts a sample item and sets it in the light where a browser can see it clearly",
"rewraps an unsold item and tucks it back in the case with a specific order",
"counts coins into a small tray and slides it across the counter",
"pulls a ledger from the bag, checks one line, and closes it",
"marks a price down on the board with a grease stylus and steps back",
"holds a cracked tool up to show the seller where it failed before handing it back",
"folds the portable display flat and straps it to the pack in two moves",
"lays two items side by side on the counter for a customer to compare",
"wipes down the counter surface with a cloth before setting out the next goods",
],
),
(
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",
"checks the charge on a handheld scanner and clips it back to the belt",
"props a boot on the lower fence rail and scans the far end of the road",
"nods to a passing trader and tracks the cart until it clears the gate",
"marks a log entry on a handheld at the end of a perimeter pass",
"steps out of the gatehouse at the sound of an approaching engine",
],
),
],
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,
),
],
)
-119
View File
@@ -1,119 +0,0 @@
// 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.
//
// 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",
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",
"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 morning exchange opens",
"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",
"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",
],
),
(
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,
),
],
)
+14 -1
View File
@@ -191,4 +191,17 @@ Narrative, NPCs, dialogue, templates, setting, worldbuilding, and storyteller me
---
*20 questions (5 resolved, 2 partially resolved, 13 open). Last updated: 2026-03-07 (Q-056 added — Sprint 25 review)*
### Q-057: Composable behavior generation — decompose culture × role × context into assembled behaviors
- **Status:** Open
- **Raised:** Sprint 25, ticket #630 review discussion
- **Priority:** High (blocks scaling beyond hand-authored content)
- **Context:** Current behavior pools are hand-authored per culture×zone×role combination (`typical_behaviors` arrays in zone spec RON files). At ~50 behaviors per role × 4 roles × N zone types × M cultures, this is O(roles × zones × cultures) custom content. Each cell is effectively a unique location — "rural zone spec" is really "Krenn rural settlement content" with the name filed off. This doesn't scale to multiple cultures or zone types.
- **Question:** Should the generator compose observable behaviors from smaller primitives instead of drawing from pre-written complete sentences? Proposed decomposition: (1) **role action templates** — generic observable stage directions per role, culture-neutral, (2) **culture modifier sets** — culture-specific flavoring (Krenn mannerisms, speech patterns, social norms) that overlay role actions, (3) **context tags** — on-shift, off-duty, break-room, social-site-type that filter/weight which behaviors are available. The generator assembles these at runtime.
- **Implications:** Changes the content authoring model from "write 50 sentences per role per zone per culture" to "write role actions once, write culture modifiers once, compose at runtime." Server needs a composition engine (#633); copy needs to author the decomposed format (#634). Part of the Sprint 25 PoC spike.
- **Cross-reference:** #630 (behavior pool expansion), #633 (server: composition engine), #634 (copy: decomposed content format), D-121 (voice is culture-driven), D-122 (all NPCs generated)
- **Assigned to:** Tyre, Mellanie, Miri
---
*21 questions (5 resolved, 2 partially resolved, 14 open). Last updated: 2026-03-07 (Q-057 added — composable behaviors)*
+3 -3
View File
@@ -8,7 +8,7 @@ Tracked questions awaiting discussion or resolution. Split by domain, mirroring
|------|--------|-----------|
| [questions-architecture.md](questions-architecture.md) | Technical foundation | Q-001, Q-006, Q-009, Q-018, Q-019, Q-020, Q-021, Q-022, Q-023, Q-029, Q-030, Q-046 |
| [questions-perception.md](questions-perception.md) | Player observation | Q-003, Q-014, Q-016, Q-024, Q-025, Q-026, Q-051, Q-053, Q-054 |
| [questions-content.md](questions-content.md) | Narrative, NPCs, setting | Q-010, Q-012, Q-013, Q-015, Q-017, Q-028, Q-031, Q-033, Q-040, Q-041, Q-042, Q-043, Q-044, Q-045, Q-047, Q-048, Q-049, Q-050, Q-052, Q-056 |
| [questions-content.md](questions-content.md) | Narrative, NPCs, setting | Q-010, Q-012, Q-013, Q-015, Q-017, Q-028, Q-031, Q-033, Q-040, Q-041, Q-042, Q-043, Q-044, Q-045, Q-047, Q-048, Q-049, Q-050, Q-052, Q-056, Q-057 |
| [questions-scope.md](questions-scope.md) | Game concept, prototype | Q-002, Q-004, Q-005, Q-007, Q-008, Q-011, Q-027, Q-032, Q-034, Q-035, Q-036, Q-037, Q-038, Q-039, Q-058 |
## Status Summary
@@ -17,9 +17,9 @@ Tracked questions awaiting discussion or resolution. Split by domain, mirroring
|--------|-------|----------|---------|------|
| Architecture | 12 | 6 | 1 | 5 |
| Perception | 9 | 5 | 1 | 3 |
| Content | 19 | 5 | 2 | 12 |
| Content | 21 | 5 | 2 | 14 |
| Scope | 14 | 1 | 3 | 10 |
| **Total** | **54** | **17** | **7** | **30** |
| **Total** | **56** | **17** | **7** | **32** |
*Updated 2026-03-05: Q-011 resolved (D-117/D-115/D-122), Q-034 partially resolved (D-117), Q-037 partially resolved (D-119), Q-033 partially resolved/reframed (D-122) — Where's the Fun? Workshop*