Architecture: Session 187: How to build Vitto's persona/personality system...
Documentation for Sessions
🏗️ Architecture: Session 187: How to build Vitto's persona/personality system...
Date: 2026-03-07
Time: 00:12:12 UTC
Session: gspace1-187.2
Agent: angular
Confidence: 92%
Status: ✅ Documented
📋 Decision Context
Question:
Session 187: How to build Vitto's persona/personality system — behavioral config, persistent mood, visual expression, personality learning, and two-layer enforcement?
Task: S187: Enhance Vitto persona/personality system
🎯 Decision Made
Chosen:
6-layer architecture: (1) Extended VittoPersona schema with behavioral config (emojiUsage, humorLevel, explanationDepth, formality, proactivity, mannerisms, responseFormat, coreValues, hardBoundaries, visualIdentity). (2) Enhanced buildPersonaOverlay producing structured behavioral directives for LLM. (3) Persistent ConversationMoodState with 10 VittoMood types, mood shift tracking, user style signals. (4) Context-assembly now injects persona overlay + mood context into web panel prompts. (5) CSS mood aura system on MessageAvatarComponent with per-mood gradients and pulse animations. (6) PersonalityLearningService with EMA-based preference learning from implicit signals.
Options Considered:
- Rive animated avatar (deferred to Phase 2 — needs designer)
- Hume AI integration (rejected for v1 — external dependency for core feature)
- CSS-only mood system + behavioral persona config (chosen)
- Fine-tuned personality model (rejected — overkill, not explainable)
💭 Reasoning
Research showed: (A) Current persona was text-only (systemPromptOverlay string) — no behavioral differentiation between personas. Fixed by adding numeric behavioral fields that produce concrete LLM formatting directives. (B) Emotional arc was stateless per-message — no accumulation. Fixed by adding ConversationMoodState that persists across conversation with running averages and mood shift tracking. (C) Avatar was static 'V' with unused mood input — no visual personality. Fixed with CSS mood aura system (10 moods, each with unique gradient + animation). (D) No personality memory — fixed with PersonalityLearningService using exponential moving average (low learning rate 0.05, slow to overfit). (E) Two-layer enforcement missing — fixed with coreLocked field and core value merging. Chose CSS aura over Rive for Phase 1 (zero dependencies, works everywhere, can add Rive later). Chose EMA over ML for learning (deterministic, explainable, no training data needed).
📁 Files Involved
APIs/backend-vitto-api/src/app/engine/persona.service.tsAPIs/backend-vitto-api/src/app/engine/context-assembly.service.tsAPIs/backend-ai-api/src/app/sessions/emotional-arc.service.tsAPIs/backend-ai-api/src/app/sessions/emotional-arc.types.tsAPIs/backend-ai-api/src/app/sessions/personality-learning.service.tslibs/libs-ai/vitto-chat/src/lib/components/message/message-avatar/message-avatar.component.tslibs/libs-ai/vitto-chat/src/lib/components/message/message-avatar/message-avatar.component.scsslibs/libs-ai/vitto-chat/src/lib/components/message/message-avatar/message-avatar.component.htmllibs/libs-ai/vitto-chat/src/lib/styles/_chat-animations.scsslibs/libs-ai/vitto-chat/src/lib/types/chat.types.ts
🔗 Related
- Decision ID:
dev_1772842332105_es8dbb9 - Session: 187
- Workspace: gspace1
Auto-generated by MCP Smart Consolidation