refactor(data): rename Krenn to Van Maanen's Star
System S-057 assigned to real star GJ 35 (Van Maanen's Star, DG white dwarf at 13.9 ly). Renamed across all content, server code, docs, decisions, wiki lore, and config files. 224 files updated. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -56,8 +56,8 @@ struct Args {
|
||||
#[arg(long)]
|
||||
seed: u64,
|
||||
|
||||
/// Culture to use (default: "krenn").
|
||||
#[arg(long, default_value = "krenn")]
|
||||
/// Culture to use (default: "van-maanens-star").
|
||||
#[arg(long, default_value = "van-maanens-star")]
|
||||
culture: String,
|
||||
|
||||
/// Phase 2: load zone spec and culture from RON files on disk.
|
||||
@@ -226,10 +226,10 @@ fn hardcoded_industrial_zone() -> ZoneSpec {
|
||||
// Phase 1: hardcoded culture stub
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
fn hardcoded_krenn_culture() -> CultureProfile {
|
||||
fn hardcoded_van_maanens_star_culture() -> CultureProfile {
|
||||
CultureProfile {
|
||||
id: "krenn".into(),
|
||||
name: "Krenn System Culture".into(),
|
||||
id: "van-maanens-star".into(),
|
||||
name: "Van Maanen's Star Culture".into(),
|
||||
description: "Working-class pragmatic culture. ~180 years settled. Community-oriented, suspicious of distant authority, values competence and reliability.".into(),
|
||||
naming: NamingConventions {
|
||||
style: "compact, consonant-heavy, first-name-primary".into(),
|
||||
@@ -1007,9 +1007,9 @@ fn main() {
|
||||
}
|
||||
};
|
||||
let culture = match args.culture.as_str() {
|
||||
"krenn" => hardcoded_krenn_culture(),
|
||||
"van-maanens-star" => hardcoded_van_maanens_star_culture(),
|
||||
other => {
|
||||
eprintln!("Unknown culture: '{}'. Use 'krenn'.", other);
|
||||
eprintln!("Unknown culture: '{}'. Use 'van-maanens-star'.", other);
|
||||
eprintln!("(Phase 2 with --from-files loads culture RON from disk)");
|
||||
process::exit(1);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
//! ```sh
|
||||
//! # Via wrapper script (recommended):
|
||||
//! tooling/validate-ron content/global/zone-identity-spec.example.ron zone
|
||||
//! tooling/validate-ron content/global/culture-krenn.example.ron culture
|
||||
//! tooling/validate-ron content/global/culture-van-maanens-star.example.ron culture
|
||||
//!
|
||||
//! # Direct:
|
||||
//! cargo run --bin validate_ron -- <file.ron> <zone|culture>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
//!
|
||||
//! The Rust structs ARE the schema. Copy team fills RON files to match these structs:
|
||||
//! - Zone identity spec: ticket #609
|
||||
//! - Culture profile (Krenn): ticket #610
|
||||
//! - Culture profile (Van Maanen's Star): ticket #610
|
||||
//!
|
||||
//! ## Format
|
||||
//!
|
||||
@@ -106,7 +106,7 @@ pub struct SocialSiteSpec {
|
||||
/// Example:
|
||||
/// action_text: "moves freight containers"
|
||||
/// context: OnShift
|
||||
/// → assembled with Krenn modifier "with mechanical efficiency"
|
||||
/// → assembled with Van Maanen's Star modifier "with mechanical efficiency"
|
||||
/// → "moves freight containers with mechanical efficiency"
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct BehaviorPrimitive {
|
||||
@@ -231,7 +231,7 @@ pub fn assemble_behaviors(
|
||||
/// they have, what values shape their personality distribution.
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct CultureProfile {
|
||||
/// Culture identifier (e.g. "krenn").
|
||||
/// Culture identifier (e.g. "van-maanens-star").
|
||||
pub id: String,
|
||||
/// Human-readable culture name.
|
||||
pub name: String,
|
||||
@@ -501,8 +501,8 @@ mod tests {
|
||||
#[test]
|
||||
fn culture_profile_round_trips_through_ron() {
|
||||
let profile = CultureProfile {
|
||||
id: "krenn".into(),
|
||||
name: "Krenn System Culture".into(),
|
||||
id: "van-maanens-star".into(),
|
||||
name: "Van Maanen's Star Culture".into(),
|
||||
description: "Working-class pragmatic culture".into(),
|
||||
naming: NamingConventions {
|
||||
style: "compact, consonant-heavy".into(),
|
||||
@@ -531,7 +531,7 @@ mod tests {
|
||||
let ron_str =
|
||||
ron::ser::to_string_pretty(&profile, ron::ser::PrettyConfig::default()).unwrap();
|
||||
let deserialized: CultureProfile = ron::from_str(&ron_str).unwrap();
|
||||
assert_eq!(deserialized.id, "krenn");
|
||||
assert_eq!(deserialized.id, "van-maanens-star");
|
||||
assert_eq!(deserialized.naming.given_names.len(), 2);
|
||||
assert_eq!(deserialized.values.favored_traits.len(), 2);
|
||||
}
|
||||
@@ -570,7 +570,7 @@ mod tests {
|
||||
let output = SpikeOutput {
|
||||
zone_type: "rural".into(),
|
||||
seed: 42,
|
||||
culture: "krenn".into(),
|
||||
culture: "van-maanens-star".into(),
|
||||
npcs: vec![],
|
||||
};
|
||||
|
||||
|
||||
@@ -249,7 +249,7 @@ mod tests {
|
||||
fn zone_cache_store_and_lookup() {
|
||||
let mut cache = ZoneVoiceCache::new("v1".into(), "i1".into());
|
||||
let key = CacheKey {
|
||||
culture_id: "krenn".into(),
|
||||
culture_id: "van-maanens-star".into(),
|
||||
npc_stable_id: 42,
|
||||
content_type: ContentType::Dialogue,
|
||||
content_index: 0,
|
||||
@@ -263,7 +263,7 @@ mod tests {
|
||||
fn zone_cache_miss_returns_none() {
|
||||
let cache = ZoneVoiceCache::new("v1".into(), "i1".into());
|
||||
let key = CacheKey {
|
||||
culture_id: "krenn".into(),
|
||||
culture_id: "van-maanens-star".into(),
|
||||
npc_stable_id: 42,
|
||||
content_type: ContentType::Dialogue,
|
||||
content_index: 0,
|
||||
@@ -276,7 +276,7 @@ mod tests {
|
||||
fn zone_cache_round_trips_through_msgpack() {
|
||||
let mut cache = ZoneVoiceCache::new("v1".into(), "i1".into());
|
||||
let key = CacheKey {
|
||||
culture_id: "krenn".into(),
|
||||
culture_id: "van-maanens-star".into(),
|
||||
npc_stable_id: 42,
|
||||
content_type: ContentType::Behavior,
|
||||
content_index: 3,
|
||||
@@ -297,7 +297,7 @@ mod tests {
|
||||
|
||||
let mut store = VoiceCacheStore::new(dir.clone(), 12345, "v1".into(), "i1".into());
|
||||
let key = CacheKey {
|
||||
culture_id: "krenn".into(),
|
||||
culture_id: "van-maanens-star".into(),
|
||||
npc_stable_id: 1,
|
||||
content_type: ContentType::Dialogue,
|
||||
content_index: 0,
|
||||
@@ -320,7 +320,7 @@ mod tests {
|
||||
|
||||
let mut store = VoiceCacheStore::new(dir.clone(), 42, "v1".into(), "i1".into());
|
||||
let key = CacheKey {
|
||||
culture_id: "krenn".into(),
|
||||
culture_id: "van-maanens-star".into(),
|
||||
npc_stable_id: 1,
|
||||
content_type: ContentType::Dialogue,
|
||||
content_index: 0,
|
||||
|
||||
@@ -87,7 +87,7 @@ mod tests {
|
||||
fn cache_hit_returns_voiced_text() {
|
||||
let cache = test_cache();
|
||||
let key = CacheKey {
|
||||
culture_id: "krenn".into(),
|
||||
culture_id: "van-maanens-star".into(),
|
||||
npc_stable_id: 42,
|
||||
content_type: ContentType::Behavior,
|
||||
content_index: 0,
|
||||
@@ -96,7 +96,7 @@ mod tests {
|
||||
cache.lock().unwrap().store(100, key, "Voiced line.".into());
|
||||
|
||||
let result = voiced_behavior(
|
||||
&cache, 100, "krenn", 42, ContentType::Behavior, 0, None,
|
||||
&cache, 100, "van-maanens-star", 42, ContentType::Behavior, 0, None,
|
||||
"Base line.", false,
|
||||
);
|
||||
assert_eq!(result, "Voiced line.");
|
||||
@@ -106,7 +106,7 @@ mod tests {
|
||||
fn cache_miss_returns_base_text() {
|
||||
let cache = test_cache();
|
||||
let result = voiced_behavior(
|
||||
&cache, 100, "krenn", 42, ContentType::Behavior, 0, None,
|
||||
&cache, 100, "van-maanens-star", 42, ContentType::Behavior, 0, None,
|
||||
"Base line.", false,
|
||||
);
|
||||
assert_eq!(result, "Base line.");
|
||||
@@ -117,7 +117,7 @@ mod tests {
|
||||
let cache = test_cache();
|
||||
// Store a voiced version under the Factual key — it must never be returned.
|
||||
let key = CacheKey {
|
||||
culture_id: "krenn".into(),
|
||||
culture_id: "van-maanens-star".into(),
|
||||
npc_stable_id: 42,
|
||||
content_type: ContentType::Factual,
|
||||
content_index: 0,
|
||||
@@ -131,7 +131,7 @@ mod tests {
|
||||
let result = voiced_behavior(
|
||||
&cache,
|
||||
100,
|
||||
"krenn",
|
||||
"van-maanens-star",
|
||||
42,
|
||||
ContentType::Factual,
|
||||
0,
|
||||
@@ -147,7 +147,7 @@ mod tests {
|
||||
let cache = test_cache();
|
||||
// Even if cache has a voiced version, tell behaviors return base text
|
||||
let key = CacheKey {
|
||||
culture_id: "krenn".into(),
|
||||
culture_id: "van-maanens-star".into(),
|
||||
npc_stable_id: 42,
|
||||
content_type: ContentType::Behavior,
|
||||
content_index: 0,
|
||||
@@ -156,7 +156,7 @@ mod tests {
|
||||
cache.lock().unwrap().store(100, key, "Voiced tell.".into());
|
||||
|
||||
let result = voiced_behavior(
|
||||
&cache, 100, "krenn", 42, ContentType::Behavior, 0,
|
||||
&cache, 100, "van-maanens-star", 42, ContentType::Behavior, 0,
|
||||
Some(TellCategory::Angry), "Base tell.", true,
|
||||
);
|
||||
assert_eq!(result, "Base tell.");
|
||||
|
||||
@@ -372,10 +372,10 @@ mod tests {
|
||||
};
|
||||
use crate::npc::PersonalityTrait;
|
||||
|
||||
fn krenn_culture() -> CultureProfile {
|
||||
fn van_maanens_star_culture() -> CultureProfile {
|
||||
CultureProfile {
|
||||
id: "krenn".into(),
|
||||
name: "Krenn System Culture".into(),
|
||||
id: "van-maanens-star".into(),
|
||||
name: "Van Maanen's Star Culture".into(),
|
||||
description: "Working-class pragmatic".into(),
|
||||
naming: NamingConventions {
|
||||
style: "compact".into(),
|
||||
@@ -396,7 +396,7 @@ mod tests {
|
||||
disfavored_traits: vec![PersonalityTrait::Reclusive],
|
||||
},
|
||||
voice_persona: Some(
|
||||
"PERSONA: You are a Krenn station worker.\n\
|
||||
"PERSONA: You are a Van Maanen's Star station worker.\n\
|
||||
1. Be direct. No pleasantries.\n\
|
||||
2. You're working-class and pragmatic."
|
||||
.into(),
|
||||
@@ -465,9 +465,9 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn prompt_contains_persona_when_present() {
|
||||
let culture = krenn_culture();
|
||||
let culture = van_maanens_star_culture();
|
||||
let result = build_prompt(&culture, "Hello.", ContentType::Dialogue, None, 42);
|
||||
assert!(result.prompt.contains("PERSONA: You are a Krenn station worker"));
|
||||
assert!(result.prompt.contains("PERSONA: You are a Van Maanen's Star station worker"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -479,7 +479,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn prompt_contains_examples_when_present() {
|
||||
let culture = krenn_culture();
|
||||
let culture = van_maanens_star_culture();
|
||||
let result = build_prompt(&culture, "Hello.", ContentType::Dialogue, None, 42);
|
||||
assert!(result.prompt.contains("EXAMPLES:"));
|
||||
assert!(result.prompt.contains("Look, that's not mine to say."));
|
||||
@@ -536,7 +536,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn guarded_tell_suppresses_oath_injection() {
|
||||
let culture = krenn_culture();
|
||||
let culture = van_maanens_star_culture();
|
||||
// Run many seeds — none should fire oath with Guarded tell
|
||||
for seed in 0..100 {
|
||||
let result = build_prompt(
|
||||
@@ -556,7 +556,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn neutral_tell_allows_oath_injection() {
|
||||
let culture = krenn_culture();
|
||||
let culture = van_maanens_star_culture();
|
||||
// With enough seeds, at least one should fire (frequency 0.25)
|
||||
let fired_count = (0..100)
|
||||
.filter(|&seed| {
|
||||
@@ -583,7 +583,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn deterministic_injection_for_same_seed() {
|
||||
let culture = krenn_culture();
|
||||
let culture = van_maanens_star_culture();
|
||||
let result1 = build_prompt(&culture, "Test.", ContentType::Dialogue, None, 42);
|
||||
let result2 = build_prompt(&culture, "Test.", ContentType::Dialogue, None, 42);
|
||||
assert_eq!(result1.prompt, result2.prompt);
|
||||
|
||||
@@ -242,7 +242,7 @@ mod tests {
|
||||
priority,
|
||||
npc_stable_id: 1,
|
||||
zone_id: 100,
|
||||
culture_id: "krenn".into(),
|
||||
culture_id: "van-maanens-star".into(),
|
||||
base_text: text.into(),
|
||||
content_type: ContentType::Dialogue,
|
||||
content_index: 0,
|
||||
|
||||
@@ -482,7 +482,7 @@ mod tests {
|
||||
priority: crate::voice::queue::Priority::High,
|
||||
npc_stable_id: 42,
|
||||
zone_id: 100,
|
||||
culture_id: "krenn".into(),
|
||||
culture_id: "van-maanens-star".into(),
|
||||
base_text: "Test.".into(),
|
||||
content_type: crate::voice::prompt_builder::ContentType::Dialogue,
|
||||
content_index: 5,
|
||||
@@ -490,7 +490,7 @@ mod tests {
|
||||
seed: 99,
|
||||
};
|
||||
let key = cache_key_from_request(&request);
|
||||
assert_eq!(key.culture_id, "krenn");
|
||||
assert_eq!(key.culture_id, "van-maanens-star");
|
||||
assert_eq!(key.npc_stable_id, 42);
|
||||
assert_eq!(key.content_index, 5);
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ use std::path::PathBuf;
|
||||
fn ticker_yaml_path() -> PathBuf {
|
||||
let manifest_dir = env!("CARGO_MANIFEST_DIR");
|
||||
PathBuf::from(manifest_dir)
|
||||
.join("../content/campaigns/main/systems/krenn/stations/sova/districts/transit/ticker/the-last-shift.yaml")
|
||||
.join("../content/campaigns/main/systems/van-maanens-star/stations/sova/districts/transit/ticker/the-last-shift.yaml")
|
||||
}
|
||||
|
||||
/// Minimal YAML structure for parsing just what we need to validate.
|
||||
|
||||
@@ -80,10 +80,10 @@ fn voice_config() -> VoiceProcessConfig {
|
||||
}
|
||||
}
|
||||
|
||||
fn krenn_culture() -> CultureProfile {
|
||||
fn van_maanens_star_culture() -> CultureProfile {
|
||||
CultureProfile {
|
||||
id: "krenn".into(),
|
||||
name: "Krenn System Culture".into(),
|
||||
id: "van-maanens-star".into(),
|
||||
name: "Van Maanen's Star Culture".into(),
|
||||
description: "Working-class pragmatic".into(),
|
||||
naming: NamingConventions {
|
||||
style: "compact".into(),
|
||||
@@ -104,7 +104,7 @@ fn krenn_culture() -> CultureProfile {
|
||||
disfavored_traits: vec![PersonalityTrait::Reclusive],
|
||||
},
|
||||
voice_persona: Some(
|
||||
"PERSONA: You are a Krenn station worker.\n\
|
||||
"PERSONA: You are a Van Maanen's Star station worker.\n\
|
||||
1. Be direct. No pleasantries.\n\
|
||||
2. You're working-class and pragmatic."
|
||||
.into(),
|
||||
@@ -137,7 +137,7 @@ fn test_requests() -> Vec<VoiceRequest> {
|
||||
priority: Priority::High,
|
||||
npc_stable_id: 1,
|
||||
zone_id: 100,
|
||||
culture_id: "krenn".into(),
|
||||
culture_id: "van-maanens-star".into(),
|
||||
base_text: "The coupling is faulty.".into(),
|
||||
content_type: ContentType::Dialogue,
|
||||
content_index: 0,
|
||||
@@ -148,7 +148,7 @@ fn test_requests() -> Vec<VoiceRequest> {
|
||||
priority: Priority::High,
|
||||
npc_stable_id: 1,
|
||||
zone_id: 100,
|
||||
culture_id: "krenn".into(),
|
||||
culture_id: "van-maanens-star".into(),
|
||||
base_text: "I heard the night crew had to stop the line twice because the coupling was faulty and nobody had flagged it in the log.".into(),
|
||||
content_type: ContentType::Dialogue,
|
||||
content_index: 1,
|
||||
@@ -159,7 +159,7 @@ fn test_requests() -> Vec<VoiceRequest> {
|
||||
priority: Priority::Standard,
|
||||
npc_stable_id: 2,
|
||||
zone_id: 100,
|
||||
culture_id: "krenn".into(),
|
||||
culture_id: "van-maanens-star".into(),
|
||||
base_text: "checks the pressure gauge and writes in a logbook".into(),
|
||||
content_type: ContentType::Behavior,
|
||||
content_index: 0,
|
||||
@@ -192,7 +192,7 @@ fn voice_pipeline_end_to_end() {
|
||||
|
||||
// Build cultures map
|
||||
let mut cultures = BTreeMap::new();
|
||||
cultures.insert("krenn".to_string(), krenn_culture());
|
||||
cultures.insert("van-maanens-star".to_string(), van_maanens_star_culture());
|
||||
let cultures = Arc::new(cultures);
|
||||
|
||||
// Create cache
|
||||
@@ -313,10 +313,10 @@ fn voice_pipeline_end_to_end() {
|
||||
);
|
||||
|
||||
// The unknown culture request should still cache (with base text as fallback)
|
||||
// Total should be 4 (3 krenn + 1 unknown fallback)
|
||||
// Total should be 4 (3 van-maanens-star + 1 unknown fallback)
|
||||
assert!(
|
||||
entry_count == 4,
|
||||
"Expected 4 cache entries (3 krenn + 1 unknown fallback), got {}",
|
||||
"Expected 4 cache entries (3 van-maanens-star + 1 unknown fallback), got {}",
|
||||
entry_count
|
||||
);
|
||||
}
|
||||
|
||||
@@ -65,10 +65,10 @@ fn voice_config() -> VoiceProcessConfig {
|
||||
// Culture profiles
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
fn krenn_culture() -> CultureProfile {
|
||||
fn van_maanens_star_culture() -> CultureProfile {
|
||||
CultureProfile {
|
||||
id: "krenn".into(),
|
||||
name: "Krenn System Culture".into(),
|
||||
id: "van-maanens-star".into(),
|
||||
name: "Van Maanen's Star Culture".into(),
|
||||
description: "Working-class pragmatic".into(),
|
||||
naming: NamingConventions {
|
||||
style: "compact".into(),
|
||||
@@ -89,7 +89,7 @@ fn krenn_culture() -> CultureProfile {
|
||||
disfavored_traits: vec![PersonalityTrait::Reclusive],
|
||||
},
|
||||
voice_persona: Some(
|
||||
"PERSONA: You are a Krenn station worker.\n\
|
||||
"PERSONA: You are a Van Maanen's Star station worker.\n\
|
||||
1. Be direct. No pleasantries.\n\
|
||||
2. You're working-class and pragmatic."
|
||||
.into(),
|
||||
@@ -293,7 +293,7 @@ fn test_cases() -> Vec<TestCase> {
|
||||
},
|
||||
|
||||
// === CATEGORY: Occasional injection (oath) ===
|
||||
// seed 7 fires oath for krenn (frequency 0.25, ChaCha8)
|
||||
// seed 7 fires oath for van-maanens-star (frequency 0.25, ChaCha8)
|
||||
TestCase {
|
||||
label: "oath should fire (seed 7)",
|
||||
category: "injection",
|
||||
@@ -508,7 +508,7 @@ fn voice_quality_batch() {
|
||||
let config = voice_config();
|
||||
|
||||
let mut cultures = BTreeMap::new();
|
||||
cultures.insert("krenn".to_string(), krenn_culture());
|
||||
cultures.insert("van-maanens-star".to_string(), van_maanens_star_culture());
|
||||
let cultures = Arc::new(cultures);
|
||||
|
||||
let cases = test_cases();
|
||||
@@ -540,7 +540,7 @@ fn voice_quality_batch() {
|
||||
priority: Priority::High,
|
||||
npc_stable_id: i as u64,
|
||||
zone_id: 1, // all same zone for cache lookup
|
||||
culture_id: "krenn".into(),
|
||||
culture_id: "van-maanens-star".into(),
|
||||
base_text: case.base_text.into(),
|
||||
content_type: case.content_type,
|
||||
content_index: case.tell_state.map(|t| t as u16).unwrap_or(0),
|
||||
@@ -609,7 +609,7 @@ fn voice_quality_batch() {
|
||||
}
|
||||
|
||||
let key = CacheKey {
|
||||
culture_id: "krenn".into(),
|
||||
culture_id: "van-maanens-star".into(),
|
||||
npc_stable_id: i as u64,
|
||||
content_type: case.content_type,
|
||||
content_index: case.tell_state.map(|t| t as u16).unwrap_or(0),
|
||||
|
||||
Reference in New Issue
Block a user