data(content): add pools, templates, and triangles for v0.1 (#389, #390, #391)

5 seed-time pools (single-candidate for deterministic v0.1 testing),
3 social site templates (logistics-hub, bar, smuggling-ring) with
role slot definitions per D-025, and 5 triangles (3 active fork,
2 passive) per D-024 workshop synthesis.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-13 01:19:10 +01:00
co-authored by Claude Opus 4.6
parent b0fec9af09
commit 3d1bf54fcc
9 changed files with 678 additions and 5 deletions
@@ -0,0 +1,78 @@
# Pool definitions for Sova Transit District
# Seed-time selection system. Architecture supports N candidates; v0.1 has 1 each.
# Format per seed-configuration-schema.md section 5.2
# Referenced by: seed config generation (Sprint 5+), content loader (#408)
pools:
- pool_id: "transit:friend_smuggler"
category: npc_role
description: >
Smuggler's FRIEND (D-034) — closest colleague, emotional anchor.
Production-level complex NPC exercising every content pipeline.
v0.1: Kael Davan (dock worker, ring member). v0.2+: expand to
multiple dock worker candidates with different contradiction arcs.
constraints:
- must_be_in_template: "logistics-hub"
- must_have_pattern: "FRIEND"
- bonded_character: "smuggler"
candidates:
- npc_id: "npc:kael-davan"
weight: 1
- pool_id: "transit:friend_detective"
category: npc_role
description: >
Detective's FRIEND (D-034) — social anchor, information holder.
Production-level complex NPC. Contradiction: sitting on unreported
evidence about Kael's manifest discrepancies, protecting Naia.
v0.1: Sera Venn (Commission field tech, bar regular).
constraints:
- must_have_pattern: "FRIEND"
- bonded_character: "detective"
candidates:
- npc_id: "npc:sera-venn"
weight: 1
- pool_id: "transit:bar_regulars"
category: npc_group
description: >
NPCs who frequent The Last Shift as regulars. Fills bar-regular
template slots. v0.1: fixed set (all selected). v0.2+: seeder
draws a subset from a larger candidate pool for variety.
Note: regulars include cross-template visitors (reference links)
who frequent the bar location but are owned by other templates.
constraints:
- frequents_location: "the-last-shift"
candidates:
- npc_id: "npc:sera-venn"
weight: 1
- npc_id: "npc:resha"
weight: 1
- npc_id: "npc:kael-davan"
weight: 1
- npc_id: "npc:torek-lintar"
weight: 1
- npc_id: "npc:drin"
weight: 1
- pool_id: "transit:compromised_inspector"
category: npc_role
description: >
The Commission inspector compromised by the ring. Access to authority
systems, gambling debt makes them vulnerable. v0.1: Torek Lintar.
constraints:
- must_have_access: "authority"
- must_have_faction: "Commission"
candidates:
- npc_id: "npc:torek-lintar"
weight: 1
- pool_id: "transit:primary_contraband"
category: contraband
description: >
What the ring is smuggling (D-037). v0.1: unlicensed lattice
components — aftermarket neural lattice modifications. Moral
ambiguity: the ring is smuggling access, not weapons.
candidates:
- id: "contraband:lattice-components"
weight: 1
@@ -0,0 +1,101 @@
# Social site template: The Last Shift (bar)
# D-025: functional cluster as atomic template unit
# 4 role slots, 4+ NPCs in v0.1 (regulars are reference links). 4-8 NPC capacity.
template_id: bar
display_name: "The Last Shift"
description: >
Mid-grade bar in Sova Transit District. Converted maintenance staging area.
Irregular layout, long bar, corner booth. Where working people go after shift.
Informally known as "Lera's." The social nexus where investigation and
mundane life overlap.
location: the-last-shift
capacity:
min: 4
max: 8
role_slots:
- role: bar-owner
display_name: "Bar Owner"
count: 1
required: true
description: >
Owns and operates the bar. Observant, careful, knows everyone's business.
ANCHOR pattern — the stabilizing social presence. Hears everything,
says little. Access tier: insider for regulars.
pool_ref: null
flags:
- social_anchor
- information_hub
- bar_permanent
- role: bartender
display_name: "Bartender"
count: 1
required: true
description: >
Serves drinks, manages the floor. Different from the owner — the
bartender is staff, not the proprietor. Younger, less established.
pool_ref: null
flags:
- bar_permanent
- role: bar-regular
display_name: "Bar Regular"
count:
min: 2
max: 5
required: true
description: >
Off-duty workers and social visitors. Regulars are typically owned by
other templates (logistics hub, Commission) with reference links here.
Their presence during bar_evening creates the social observation space.
pool_ref: "transit:bar_regulars"
flags:
- evening_presence
- cross_template
# v0.1 NPC assignments
v01_assignments:
bar-owner: "npc:lera-sessik"
bartender: "npc:pell"
bar-regular-1: "npc:sera-venn" # Reference: Commission field tech, evening regular
bar-regular-2: "npc:resha" # Owned by bar template
# Additional regulars via reference links:
# npc:kael-davan (from logistics-hub, evening presence)
# npc:torek-lintar (from Commission, evening presence)
# npc:drin (from logistics-hub, occasional)
# Reference links — NPCs owned by other templates who visit the bar
reference_links:
- npc: "npc:sera-venn"
owning_template: null # Sera is Commission, not bar staff
relationship: "social anchor — evening regular"
presence_phases: [evening]
- npc: "npc:kael-davan"
owning_template: logistics-hub
relationship: "after-shift regular"
presence_phases: [evening]
- npc: "npc:torek-lintar"
owning_template: null # Commission inspector
relationship: "off-duty regular, gambling participant"
presence_phases: [evening]
- npc: "npc:drin"
owning_template: logistics-hub
relationship: "occasional visitor"
presence_phases: [evening]
triangle_constraints:
- triangle: bar-tensions
required_roles:
- bar-owner # Lera: owner mediating
- bar-regular # Resha: regular with grievance
- bartender # Pell: caught in the middle
- triangle: worried-knowledge
required_roles:
- bar-regular # Sera: avoiding Torek at the bar
dialogue_pools:
- location: the-last-shift
roles: [bar-owner, bartender, bar-regular]
@@ -0,0 +1,106 @@
# Social site template: The Terminal (logistics hub)
# D-025: functional cluster as atomic template unit
# 5 role slots, 6 NPCs in v0.1. 4-8 NPC capacity.
template_id: logistics-hub
display_name: "The Terminal"
description: >
Freight logistics hub — the beating heart of Sova Transit District. Cargo
processing, manifest management, shift rotations. The smuggler's workplace
and the ring's operational cover.
location: the-terminal
# Capacity range per D-025: 4-8 NPCs in connected space with internal sightlines
capacity:
min: 4
max: 8
role_slots:
- role: shift-supervisor
display_name: "Shift Supervisor"
count: 1
required: true
description: >
Authority figure. Oversees dock operations, manages shift schedules,
enforces procedures. Access tier: authority within the hub.
pool_ref: null # Fixed assignment in v0.1
flags:
- authority_figure
- hub_permanent
- role: dock-worker
display_name: "Dock Worker"
count:
min: 2
max: 4
required: true
description: >
Core workforce. Processes cargo, handles manifests, operates equipment.
One dock-worker slot is reserved for the smuggler's FRIEND (pool draw).
pool_ref: "transit:friend_smuggler" # One slot drawn from FRIEND pool
flags:
- hub_permanent
- ring_candidate
- role: new-hire
display_name: "New Hire"
count: 1
required: false
description: >
Recent arrival to the logistics hub. Asks questions, doesn't know the
social norms yet, provides a fresh perspective. CATALYST pattern.
pool_ref: null
flags:
- catalyst
- newcomer
- role: scheduler
display_name: "Freight Scheduler"
count: 1
required: true
description: >
Manages freight scheduling and manifest coordination. Has access to
cargo records — a key information source for both smuggler and detective.
pool_ref: null
flags:
- hub_permanent
- information_access
- role: courier
display_name: "Courier"
count: 1
required: false
description: >
Moves between locations. Off-duty security or delivery runner.
Bridge NPC who connects the hub to other social sites.
pool_ref: null
flags:
- bridge_npc
# v0.1 NPC assignments (matches seed config design doc section 4.4)
v01_assignments:
shift-supervisor: "npc:voss"
dock-worker-1: "npc:kael-davan"
dock-worker-2: "npc:drin"
new-hire: "npc:renn"
scheduler: "npc:maret-korr"
courier: "npc:harek"
# Triangles that involve members of this template
triangle_constraints:
- triangle: hub-power
required_roles:
- shift-supervisor # Voss: authority
- dock-worker # Kael: subordinate
- scheduler # Maret: caught-between
- triangle: worried-partner
required_roles:
- dock-worker # Kael: partner under ring pressure
- triangle: informant-question
required_roles:
- dock-worker # Drin: notices Torek's inspection irregularities
# Dialogue pool locations (maps to dialogue/ subdirectory)
dialogue_pools:
- location: the-terminal
roles: [shift-supervisor, dock-worker, new-hire, scheduler, courier]
@@ -0,0 +1,88 @@
# Social site template: Smuggling Ring (maintenance corridors)
# D-025: functional cluster as atomic template unit
# Smallest template: 2-4 NPCs. Operates in infrastructure gaps.
template_id: smuggling-ring
display_name: "The Ring"
description: >
Smuggling operation using repurposed maintenance infrastructure. Not a
dedicated room — a corridor between hub sections where old and new
construction don't quite meet. Access through service hatches. The ring
didn't build this space; they found it. Operates during night shift and
shift transitions when oversight is thinnest.
location: maintenance-corridors
capacity:
min: 2
max: 4
role_slots:
- role: ring-operative
display_name: "Ring Coordinator"
count: 1
required: true
description: >
Coordinates ring operations. HANDLER motivation — manages logistics,
maintains contacts, makes decisions. Capable, not theatrical.
pool_ref: null
flags:
- ring_leader
- night_presence
- restricted_access
- role: ring-contact
display_name: "Ring Contact"
count:
min: 1
max: 2
required: true
description: >
Active ring member with dual role — legitimate job at the logistics hub
by day, ring operations by night. Reference link from logistics-hub
template. Their presence here is the core secret the smuggler protects
and the detective investigates.
pool_ref: "transit:friend_smuggler" # The FRIEND is the primary ring contact
flags:
- dual_role
- night_presence
- ring_member
- role: external-contact
display_name: "External Contact"
count: 1
required: false
description: >
Off-station connection. Arrives with shipments, departs quickly.
Not a permanent presence — appears during ring operation windows.
pool_ref: null
flags:
- transient
- external
# v0.1 NPC assignments
v01_assignments:
ring-operative: "npc:devra"
ring-contact: "npc:kael-davan" # Reference from logistics-hub (dual role)
external-contact: "npc:sabel" # Off-system contact
reference_links:
- npc: "npc:kael-davan"
owning_template: logistics-hub
relationship: "ring member — dual role, night operations"
presence_phases: [night]
- npc: "npc:sabel"
owning_template: null # External, transient
relationship: "off-station buyer/receiver"
presence_phases: [night] # Irregular, tied to shipments
triangle_constraints:
- triangle: worried-partner
required_roles:
- ring-contact # Kael: under pressure from ring work
- triangle: hub-power
required_roles:
- ring-contact # Kael: subordinate to Voss by day, ring by night
dialogue_pools:
- location: maintenance-corridors
roles: [ring-operative]
@@ -1 +1,49 @@
# Triangle: bar-tensions
# Triangle 3: Bar Tensions — mundane social friction at The Last Shift
# Passive — runs on background simulation, no storyteller intervention
canonical_id: bar-tensions
display_name: "Bar Tensions"
description: >
Mundane social friction at The Last Shift. Lera Sessik (bar owner) runs
a tight establishment. Resha (regular) has a grievance — could be about
the bar, another regular, or community politics. Pell (bartender) is
caught in the middle, trying to keep both the boss and the customers
happy. This is the 50% of life that has nothing to do with conspiracy —
the noise floor that makes investigation signal meaningful.
members:
- npc: "npc:lera-sessik"
role: "owner — mediates disputes, protects her establishment"
- npc: "npc:resha"
role: "regular — has a grievance, vocal about it"
- npc: "npc:pell"
role: "bartender — caught between boss and customers"
forks:
- id: grievance-escalation
condition: >
Resha's grievance reaches a tipping point. Lera must decide whether
to take sides or maintain neutrality. Pell gets drawn in.
outcomes:
- id: lera-sides-with-resha
description: >
Lera validates Resha's complaint. Pell adjusts service accordingly.
Social dynamics shift — Resha becomes more central, the bar's
atmosphere changes slightly.
effects:
- "resha.behavior_flags += vindicated"
- "pell.behavior_flags += accommodating"
- "bar atmosphere = tense but resolving"
- id: lera-shuts-it-down
description: >
Lera tells Resha to drop it. Her bar, her rules. Resha sulks.
Pell is relieved. The grievance goes underground.
effects:
- "resha.behavior_flags += resentful,quiet"
- "pell.behavior_flags += relieved"
- "bar atmosphere = business as usual"
resolution_states:
- id: grievance-resolved
description: The dispute is settled one way or another. Normal bar dynamics resume.
- id: grievance-simmering
description: The issue goes underground. Occasional flare-ups provide social texture.
@@ -1 +1,70 @@
# Triangle: hub-power
# Triangle 1: Hub Power — workplace hierarchy under ring pressure
# Active fork — smuggler decision (3 paths, self-contained per D-053/A-17)
canonical_id: hub-power
display_name: "Hub Power"
description: >
Workplace hierarchy tension at The Terminal. Voss (shift supervisor) has
positional authority but takes operational orders from the ring. Kael
(dock worker, THE FRIEND) is caught between his boss and the ring's demands.
Maret (freight scheduler) sees manifest discrepancies and doesn't know
whom to tell. The triangle's resting tension: Voss needs quiet, Kael
needs everything to hold together, Maret is too smart not to notice.
members:
- npc: "npc:voss"
role: "authority — shift supervisor with ring complicity"
- npc: "npc:kael-davan"
role: "subordinate — dock worker, ring member, caught between boss and ring"
- npc: "npc:maret-korr"
role: "caught-between — freight scheduler who sees the discrepancies"
forks:
- id: volume-escalation
condition: >
Ring demands double-volume shipment via intermediary. Smuggler
must decide how to handle the pressure on Voss and Kael.
outcomes:
- id: escalate
description: >
Side with ring (escalate). Convince Voss to widen the shift gap.
Investigation accelerates — manifest discrepancies spike, Voss
becomes visibly anxious. Detective reads organizational stress.
effects:
- "voss.behavior_flags += nervous,schedule_changes,evasive"
- "voss.position_integrity = thin"
- "ring.exposure_risk increases"
- "detective.investigation_pace = accelerated"
- id: stabilize
description: >
Side with Voss (stabilize). Reject or delay the double shipment.
Hub runs quiet but Kael absorbs redirected pressure from ring
coordinator. Detective reads personal stress on Kael instead.
effects:
- "kael.behavior_flags += lattice_checking,distracted,evasive"
- "kael.trust_level (from ring) drops"
- "friend_arc timing = accelerated"
- "detective.investigation_pace = slowed"
- id: mediate
description: >
Compromise — half volume, phased across two shipments. Nobody's
happy, nobody's exposed. Detective reads inconsistent operational
tempo. Creates a deferred second decision point.
effects:
- "ring.exposure_risk = moderate"
- "smuggler.operational_trust (from ring) drops"
- "kael.behavior_flags += uncertain,distracted"
- "detective reads organizational confusion"
resolution_states:
- id: ring-exposed-via-voss
description: >
Voss's anxiety becomes the detective's thread to pull. Investigation
arrives at the ring through institutional signals.
- id: ring-exposed-via-kael
description: >
Kael's personal strain becomes the detective's signal. Investigation
arrives through behavioral tells on THE FRIEND.
- id: ring-exposed-via-inconsistency
description: >
Irregular operational tempo reveals internal disagreement. Detective
infers organizational structure from pattern disruption.
@@ -1 +1,56 @@
# Triangle: informant-question
# Triangle 5: Informant Question — mundane workplace gossip and suspicion
# Passive — runs on background simulation, provides investigation noise
canonical_id: informant-question
display_name: "The Informant Question"
description: >
Torek Lintar (dock inspector, compromised by gambling debt) is observed
by Drin (dock worker) and Olin (bystander/new arrival). Drin has noticed
Torek's inspection patterns are irregular. Olin overhears workplace gossip
and doesn't know what's significant. This triangle generates the kind
of low-level workplace suspicion that exists in any tight community —
people notice things, talk about them, and form theories. For the
detective, it's signal mixed with noise.
members:
- npc: "npc:torek-lintar"
role: "inspector — compromised, inspection patterns irregular"
- npc: "npc:drin"
role: "worker — notices Torek's odd behavior, gossips about it"
- npc: "npc:olin"
role: "bystander — overhears gossip, forms theories, asks questions"
forks:
- id: gossip-spreads
condition: >
Drin's observations about Torek's inspection patterns reach
enough people that the gossip becomes ambient social knowledge.
outcomes:
- id: dismissed-as-gossip
description: >
The community dismisses Drin's observations as workplace gossip.
Torek's reputation survives. The information exists but isn't
treated as significant — noise floor functioning as intended.
effects:
- "torek.position_integrity unchanged"
- "community treats observations as routine gossip"
- "detective must distinguish signal from noise"
- id: torek-noticed
description: >
Enough people notice Torek's patterns that his behavior becomes
a topic of casual conversation. Not accusatory — just curious.
The detective can pick up on ambient awareness.
effects:
- "torek.behavior_flags += noticed,defensive"
- "ambient dialogue includes references to inspection patterns"
- "detective gains investigation.inspection_anomaly (suspects level)"
resolution_states:
- id: gossip-fades
description: >
The topic loses interest. Workplace gossip moves on. Torek's
irregularities are forgotten by everyone except potentially
the detective.
- id: ambient-suspicion
description: >
A low-level awareness persists in the community. Nothing actionable,
but Torek is slightly more careful and slightly more defensive.
@@ -1 +1,63 @@
# Triangle: worried-knowledge
# Triangle 2: Worried Knowledge — unreported evidence and protective silence
# Active fork — Sera's choice about what to do with what she knows
canonical_id: worried-knowledge
display_name: "Worried Knowledge"
description: >
Sera Venn (Commission field tech, detective's FRIEND) is sitting on
unreported evidence about Kael's manifest discrepancies. She's protecting
Naia Tamm (Kael's partner, who confided in her about Kael's late nights).
Torek Lintar (compromised inspector) is the subject — his gambling debt
makes him the institutional weak point, and Sera's evidence implicates
his inspection lapses. Sera's avoidance of Torek at the bar is the
observable tell.
members:
- npc: "npc:sera-venn"
role: "holder — Commission tech sitting on unreported evidence"
- npc: "npc:torek-lintar"
role: "subject — compromised inspector whose lapses Sera has documented"
- npc: "npc:naia-tamm"
role: "protected — Kael's partner, confided worries to Sera"
forks:
- id: evidence-disclosure
condition: >
Detective builds enough trust with Sera to trigger the disclosure
decision. Sera must choose between institutional duty, friendship
with Naia, and protecting the detective from a compromised colleague.
outcomes:
- id: sera-reports
description: >
Sera reports her evidence through official channels. Torek's
inspection lapses are flagged. The investigation gains institutional
data but Naia loses her protective buffer.
effects:
- "torek.position_integrity = cracking"
- "sera.trust_level (from naia) drops"
- "detective gains investigation.inspection_lapses fact"
- id: sera-protects
description: >
Sera stays silent to protect Naia. The evidence remains buried.
Detective must find the institutional thread through other means.
Sera's avoidance pattern intensifies as she manages the secret.
effects:
- "sera.behavior_flags += avoidance_pattern,evasive"
- "sera.position_integrity = thin"
- "naia remains protected"
- id: sera-confides
description: >
Sera tells the detective privately, off the record. The detective
gains the information but must decide what to do with it. Tests
the detective's institutional loyalty.
effects:
- "detective gains investigation.inspection_lapses fact (informal)"
- "sera.trust_level (toward detective) = trusted"
- "sera.risk_assessment = moderate (off-book disclosure)"
resolution_states:
- id: torek-exposed
description: Torek's compromised status becomes known to the investigation.
- id: knowledge-buried
description: Sera's evidence stays unreported. Avoidance pattern is the only tell.
- id: informal-disclosure
description: Detective knows but has no official evidence. Must find formal proof.
@@ -1 +1,67 @@
# Triangle: worried-partner
# Triangle 4: Worried Partner — ring pressure on personal relationships
# Active fork — the emotional heart of the smuggler's FRIEND arc
canonical_id: worried-partner
display_name: "Worried Partner"
description: >
Kael Davan (dock worker, ring member, smuggler's FRIEND) is under
increasing ring pressure from Devra (ring coordinator). Naia Tamm
(Kael's partner) is worried about his late nights and evasive answers.
The smuggler knows why Kael is busy and can't say. This is the most
emotionally loaded triangle — it connects THE FRIEND's contradiction
arc to personal relationships. If Naia asks the smuggler directly,
there's no good answer.
members:
- npc: "npc:kael-davan"
role: "partner under pressure — ring work destroying home life"
- npc: "npc:naia-tamm"
role: "worried — sees the changes, doesn't understand the cause"
- npc: "npc:devra"
role: "cause — ring coordinator whose demands increase Kael's burden"
forks:
- id: naia-confronts
condition: >
Naia's worry reaches a threshold. She confronts Kael directly, or
asks the smuggler what's going on. The smuggler faces a loyalty test.
outcomes:
- id: smuggler-deflects
description: >
Smuggler deflects Naia's questions. Protects Kael's cover but
damages trust with Naia. Kael is grateful but the lie costs.
effects:
- "naia.trust_level (toward smuggler) drops"
- "kael.behavior_flags += relieved,guilty"
- "smuggler.moral_weight (toward naia) = complicit"
- id: smuggler-hints
description: >
Smuggler gives Naia a partial truth — Kael's under work pressure,
it'll pass. Not a lie, but not the truth. Naia is temporarily
reassured but the pattern continues.
effects:
- "naia.behavior_flags += cautiously_reassured"
- "kael.behavior_flags += unaware"
- "smuggler.moral_weight (toward naia) = peripheral"
- id: kael-snaps
description: >
Before the smuggler can intervene, Kael snaps at Naia under
pressure. The argument is public enough to be observed. Devra's
pressure has become visible through personal fallout.
effects:
- "kael.behavior_flags += agitated,public_argument"
- "naia.behavior_flags += hurt,withdrawn"
- "detective observes domestic stress (behavioral signal)"
resolution_states:
- id: relationship-strained
description: >
Kael and Naia's relationship is visibly strained. The domestic
tension becomes an observable signal for the detective.
- id: temporary-calm
description: >
The immediate crisis passes but the underlying cause remains.
Another confrontation is inevitable.
- id: naia-investigates
description: >
Naia starts looking into Kael's activities independently. She
becomes a potential variable the ring didn't account for.