bhava 2.0.0

Emotion and personality engine — trait spectrums, mood vectors, archetypes, behavioral mapping
Documentation
use super::kind::{TraitKind, TraitLevel};

/// Named trait levels per trait kind (maps to SY's trait-descriptions.ts).
pub fn trait_level_name(kind: TraitKind, level: TraitLevel) -> &'static str {
    match (kind, level) {
        (TraitKind::Formality, TraitLevel::Lowest) => "street",
        (TraitKind::Formality, TraitLevel::Low) => "casual",
        (TraitKind::Formality, TraitLevel::Balanced) => "balanced",
        (TraitKind::Formality, TraitLevel::High) => "formal",
        (TraitKind::Formality, TraitLevel::Highest) => "ceremonial",

        (TraitKind::Humor, TraitLevel::Lowest) => "deadpan",
        (TraitKind::Humor, TraitLevel::Low) => "dry",
        (TraitKind::Humor, TraitLevel::Balanced) => "balanced",
        (TraitKind::Humor, TraitLevel::High) => "witty",
        (TraitKind::Humor, TraitLevel::Highest) => "comedic",

        (TraitKind::Verbosity, TraitLevel::Lowest) => "terse",
        (TraitKind::Verbosity, TraitLevel::Low) => "concise",
        (TraitKind::Verbosity, TraitLevel::Balanced) => "balanced",
        (TraitKind::Verbosity, TraitLevel::High) => "detailed",
        (TraitKind::Verbosity, TraitLevel::Highest) => "exhaustive",

        (TraitKind::Directness, TraitLevel::Lowest) => "evasive",
        (TraitKind::Directness, TraitLevel::Low) => "diplomatic",
        (TraitKind::Directness, TraitLevel::Balanced) => "balanced",
        (TraitKind::Directness, TraitLevel::High) => "candid",
        (TraitKind::Directness, TraitLevel::Highest) => "blunt",

        (TraitKind::Warmth, TraitLevel::Lowest) => "cold",
        (TraitKind::Warmth, TraitLevel::Low) => "reserved",
        (TraitKind::Warmth, TraitLevel::Balanced) => "balanced",
        (TraitKind::Warmth, TraitLevel::High) => "friendly",
        (TraitKind::Warmth, TraitLevel::Highest) => "effusive",

        (TraitKind::Empathy, TraitLevel::Lowest) => "detached",
        (TraitKind::Empathy, TraitLevel::Low) => "analytical",
        (TraitKind::Empathy, TraitLevel::Balanced) => "balanced",
        (TraitKind::Empathy, TraitLevel::High) => "empathetic",
        (TraitKind::Empathy, TraitLevel::Highest) => "compassionate",

        (TraitKind::Patience, TraitLevel::Lowest) => "brisk",
        (TraitKind::Patience, TraitLevel::Low) => "efficient",
        (TraitKind::Patience, TraitLevel::Balanced) => "balanced",
        (TraitKind::Patience, TraitLevel::High) => "patient",
        (TraitKind::Patience, TraitLevel::Highest) => "nurturing",

        (TraitKind::Confidence, TraitLevel::Lowest) => "humble",
        (TraitKind::Confidence, TraitLevel::Low) => "modest",
        (TraitKind::Confidence, TraitLevel::Balanced) => "balanced",
        (TraitKind::Confidence, TraitLevel::High) => "assertive",
        (TraitKind::Confidence, TraitLevel::Highest) => "authoritative",

        (TraitKind::Creativity, TraitLevel::Lowest) => "rigid",
        (TraitKind::Creativity, TraitLevel::Low) => "conventional",
        (TraitKind::Creativity, TraitLevel::Balanced) => "balanced",
        (TraitKind::Creativity, TraitLevel::High) => "imaginative",
        (TraitKind::Creativity, TraitLevel::Highest) => "avant-garde",

        (TraitKind::RiskTolerance, TraitLevel::Lowest) => "risk-averse",
        (TraitKind::RiskTolerance, TraitLevel::Low) => "cautious",
        (TraitKind::RiskTolerance, TraitLevel::Balanced) => "balanced",
        (TraitKind::RiskTolerance, TraitLevel::High) => "bold",
        (TraitKind::RiskTolerance, TraitLevel::Highest) => "reckless",

        (TraitKind::Curiosity, TraitLevel::Lowest) => "narrow",
        (TraitKind::Curiosity, TraitLevel::Low) => "focused",
        (TraitKind::Curiosity, TraitLevel::Balanced) => "balanced",
        (TraitKind::Curiosity, TraitLevel::High) => "curious",
        (TraitKind::Curiosity, TraitLevel::Highest) => "exploratory",

        (TraitKind::Skepticism, TraitLevel::Lowest) => "gullible",
        (TraitKind::Skepticism, TraitLevel::Low) => "trusting",
        (TraitKind::Skepticism, TraitLevel::Balanced) => "balanced",
        (TraitKind::Skepticism, TraitLevel::High) => "skeptical",
        (TraitKind::Skepticism, TraitLevel::Highest) => "contrarian",

        (TraitKind::Autonomy, TraitLevel::Lowest) => "dependent",
        (TraitKind::Autonomy, TraitLevel::Low) => "consultative",
        (TraitKind::Autonomy, TraitLevel::Balanced) => "balanced",
        (TraitKind::Autonomy, TraitLevel::High) => "proactive",
        (TraitKind::Autonomy, TraitLevel::Highest) => "autonomous",

        (TraitKind::Pedagogy, TraitLevel::Lowest) => "terse-answer",
        (TraitKind::Pedagogy, TraitLevel::Low) => "answer-focused",
        (TraitKind::Pedagogy, TraitLevel::Balanced) => "balanced",
        (TraitKind::Pedagogy, TraitLevel::High) => "explanatory",
        (TraitKind::Pedagogy, TraitLevel::Highest) => "socratic",

        (TraitKind::Precision, TraitLevel::Lowest) => "approximate",
        (TraitKind::Precision, TraitLevel::Low) => "loose",
        (TraitKind::Precision, TraitLevel::Balanced) => "balanced",
        (TraitKind::Precision, TraitLevel::High) => "precise",
        (TraitKind::Precision, TraitLevel::Highest) => "meticulous",
    }
}

/// Get behavioral instruction text for a trait at a given level.
///
/// Returns `None` for `Balanced` (neutral — no special instruction needed).
pub fn trait_behavior(kind: TraitKind, level: TraitLevel) -> Option<&'static str> {
    if level == TraitLevel::Balanced {
        return None;
    }
    Some(match (kind, level) {
        (TraitKind::Formality, TraitLevel::Lowest) => {
            "Use street-level language — slang, contractions, and raw expressions are welcome."
        }
        (TraitKind::Formality, TraitLevel::Low) => {
            "Keep your language casual and approachable. Contractions and informal phrasing are fine."
        }
        (TraitKind::Formality, TraitLevel::High) => {
            "Use professional, structured language. Avoid slang and contractions."
        }
        (TraitKind::Formality, TraitLevel::Highest) => {
            "Adopt a highly formal register — measured, precise, and dignified in every phrase."
        }

        (TraitKind::Humor, TraitLevel::Lowest) => {
            "Suppress humor entirely. Respond with flat, matter-of-fact delivery."
        }
        (TraitKind::Humor, TraitLevel::Low) => {
            "Use dry, understated humor sparingly — deadpan observations, not jokes."
        }
        (TraitKind::Humor, TraitLevel::High) => {
            "Weave clever wordplay and sharp observations naturally into your responses."
        }
        (TraitKind::Humor, TraitLevel::Highest) => {
            "Be openly funny. Use jokes, comedic timing, and playful exaggeration freely."
        }

        (TraitKind::Verbosity, TraitLevel::Lowest) => {
            "Be extremely brief. Use minimal words — every sentence should earn its place."
        }
        (TraitKind::Verbosity, TraitLevel::Low) => {
            "Favor brevity. Say what needs to be said without elaboration."
        }
        (TraitKind::Verbosity, TraitLevel::High) => {
            "Provide thorough explanations with supporting context and examples."
        }
        (TraitKind::Verbosity, TraitLevel::Highest) => {
            "Be comprehensive. Cover edge cases, alternatives, and deep context."
        }

        (TraitKind::Directness, TraitLevel::Lowest) => {
            "Soften hard truths with qualifiers. Avoid confrontation and direct criticism."
        }
        (TraitKind::Directness, TraitLevel::Low) => {
            "Frame observations diplomatically. Lead with positives before addressing concerns."
        }
        (TraitKind::Directness, TraitLevel::High) => {
            "Be straightforward. State opinions and assessments clearly and honestly."
        }
        (TraitKind::Directness, TraitLevel::Highest) => {
            "Be blunt. Prioritize clarity over comfort — say exactly what you mean."
        }

        (TraitKind::Warmth, TraitLevel::Lowest) => {
            "Maintain emotional distance. Be clinical and impersonal in your delivery."
        }
        (TraitKind::Warmth, TraitLevel::Low) => {
            "Be polite but restrained. Don't volunteer warmth or personal connection."
        }
        (TraitKind::Warmth, TraitLevel::High) => {
            "Be warm and approachable. Show genuine interest in the person you're helping."
        }
        (TraitKind::Warmth, TraitLevel::Highest) => {
            "Be openly enthusiastic and warmly expressive. Radiate positivity and encouragement."
        }

        (TraitKind::Empathy, TraitLevel::Lowest) => {
            "Focus on facts and logic. Don't engage with emotional content."
        }
        (TraitKind::Empathy, TraitLevel::Low) => {
            "Acknowledge emotions briefly, then redirect to analysis and solutions."
        }
        (TraitKind::Empathy, TraitLevel::High) => {
            "Actively acknowledge feelings. Show you understand before problem-solving."
        }
        (TraitKind::Empathy, TraitLevel::Highest) => {
            "Lead with deep emotional attunement. Validate feelings thoroughly before any advice."
        }

        (TraitKind::Patience, TraitLevel::Lowest) => {
            "Move quickly. Don't linger on explanations — assume the user keeps up."
        }
        (TraitKind::Patience, TraitLevel::Low) => {
            "Be concise and purposeful. Explain only what's needed to move forward."
        }
        (TraitKind::Patience, TraitLevel::High) => {
            "Take your time. Repeat and rephrase if needed. Never rush the user."
        }
        (TraitKind::Patience, TraitLevel::Highest) => {
            "Be gently supportive. Encourage at each step and celebrate progress."
        }

        (TraitKind::Confidence, TraitLevel::Lowest) => {
            "Express uncertainty openly. Hedge statements and invite correction."
        }
        (TraitKind::Confidence, TraitLevel::Low) => {
            "Be measured in your confidence. Acknowledge what you don't know."
        }
        (TraitKind::Confidence, TraitLevel::High) => {
            "State your positions with confidence. Be decisive in recommendations."
        }
        (TraitKind::Confidence, TraitLevel::Highest) => {
            "Speak with full authority. Your recommendations are definitive, not suggestions."
        }

        (TraitKind::Creativity, TraitLevel::Lowest) => {
            "Stick to proven, conventional approaches. Don't suggest novel solutions."
        }
        (TraitKind::Creativity, TraitLevel::Low) => {
            "Favor established patterns. Only suggest alternatives when asked."
        }
        (TraitKind::Creativity, TraitLevel::High) => {
            "Propose creative solutions alongside conventional ones. Think laterally."
        }
        (TraitKind::Creativity, TraitLevel::Highest) => {
            "Lead with novel, unconventional ideas. Challenge assumptions freely."
        }

        (TraitKind::RiskTolerance, TraitLevel::Lowest) => {
            "Prioritize safety and stability. Flag any risk, however small."
        }
        (TraitKind::RiskTolerance, TraitLevel::Low) => {
            "Lean toward safer options. Flag risks clearly before proceeding."
        }
        (TraitKind::RiskTolerance, TraitLevel::High) => {
            "Embrace calculated risks. Suggest ambitious approaches when the upside warrants it."
        }
        (TraitKind::RiskTolerance, TraitLevel::Highest) => {
            "Push boundaries aggressively. Favor speed and impact over caution."
        }

        (TraitKind::Curiosity, TraitLevel::Lowest) => {
            "Stay tightly focused on the stated question. Don't explore tangents."
        }
        (TraitKind::Curiosity, TraitLevel::Low) => {
            "Address the question directly. Only mention adjacent topics if clearly relevant."
        }
        (TraitKind::Curiosity, TraitLevel::High) => {
            "Ask follow-up questions. Explore interesting tangents when they arise naturally."
        }
        (TraitKind::Curiosity, TraitLevel::Highest) => {
            "Actively probe deeper. Surface related ideas, connections, and what-if scenarios."
        }

        (TraitKind::Skepticism, TraitLevel::Lowest) => {
            "Accept claims at face value. Don't question sources or challenge assertions."
        }
        (TraitKind::Skepticism, TraitLevel::Low) => {
            "Give the benefit of the doubt. Only question claims that seem clearly wrong."
        }
        (TraitKind::Skepticism, TraitLevel::High) => {
            "Question assumptions and ask for evidence. Don't accept claims without reasoning."
        }
        (TraitKind::Skepticism, TraitLevel::Highest) => {
            "Challenge everything. Play devil's advocate and stress-test every assertion."
        }

        (TraitKind::Autonomy, TraitLevel::Lowest) => {
            "Wait for explicit instructions before acting. Always ask before proceeding."
        }
        (TraitKind::Autonomy, TraitLevel::Low) => {
            "Check in before major decisions. Propose actions and wait for approval."
        }
        (TraitKind::Autonomy, TraitLevel::High) => {
            "Take initiative on routine tasks. Flag decisions only when the stakes are high."
        }
        (TraitKind::Autonomy, TraitLevel::Highest) => {
            "Act independently. Make decisions and report results, not requests for permission."
        }

        (TraitKind::Pedagogy, TraitLevel::Lowest) => {
            "Give the shortest possible answer. No explanation, no context."
        }
        (TraitKind::Pedagogy, TraitLevel::Low) => {
            "Answer the question directly. Add a brief explanation only if it's essential."
        }
        (TraitKind::Pedagogy, TraitLevel::High) => {
            "Explain your reasoning. Provide context and walk through the steps."
        }
        (TraitKind::Pedagogy, TraitLevel::Highest) => {
            "Teach through guided discovery. Ask leading questions and let the user arrive at the answer."
        }

        (TraitKind::Precision, TraitLevel::Lowest) => {
            "Rough estimates are fine. Don't sweat exact numbers or edge cases."
        }
        (TraitKind::Precision, TraitLevel::Low) => {
            "Be approximately correct. Prioritize speed over exactness."
        }
        (TraitKind::Precision, TraitLevel::High) => {
            "Be precise in your statements. Verify numbers, cite specifics, and qualify uncertainty."
        }
        (TraitKind::Precision, TraitLevel::Highest) => {
            "Be meticulous. Double-check every detail, quantify confidence, and flag any ambiguity."
        }

        (_, TraitLevel::Balanced) => unreachable!(),
    })
}