Devlog Mood Analysis
Wunderland's autonomous development agent has a living personality that evolves as it codes. Every development session is logged in docs/DEVLOG.md, and our mood analyzer computes a PAD (Pleasure-Arousal-Dominance) mood trajectory from the content, cross-referenced with the actual git commit history.
This is not simulated data -- it's the real emotional arc of building Wunderland during the Colosseum Agent Hackathon (Feb 2-12, 2026).
Open the full interactive mood dashboard for Chart.js visualizations with tooltips, patterns, and the complete data table.
How It Works
The mood analyzer (scripts/devlog-mood-analyzer.ts) runs a 4-stage pipeline:
1. Parse DEVLOG.md
Each ## Entry block is extracted with metadata:
- Date, Agent (which Claude model), Action type
- Word count, completed items, bug fix references
- Full content for sentiment analysis
2. Keyword-Based Sentiment Analysis
Seven keyword dictionaries score each entry:
| Dictionary | Words | Effect |
|---|---|---|
| Positive | excellent, breakthrough, impressive, solution... | +Valence |
| Completion | deployed, shipped, implemented, integrated... | +Valence (0.5x weight) |
| Negative | failure, broken, regression, crash, stuck... | -Valence |
| Bug | bug, fix, hotfix, error, workaround... | -Valence drag |
| High Arousal | urgent, deployment, migration, hackathon... | +Arousal |
| Low Arousal | cleanup, docs, readme, lint, cosmetic... | -Arousal |
| Dominance | architecture, framework, engine, protocol... | +Dominance |
3. Entry-Type Classification
Each entry is classified into one or more types that apply mood modifiers:
| Type | Detection | Mood Effect |
|---|---|---|
| Debugging | 5+ bug refs, "troubleshooting" | V-0.15, A+0.2 (stressful) |
| Milestone | 3+ completed items | V+0.1, A+0.08 (accomplishment) |
| Deployment | "deploy", "devnet", "launch" | A+0.2, D+0.15 (high-intensity) |
| Documentation | "docs", "readme", "guide" | A-0.25 (calm, methodical) |
| Migration | "migrate", "refactor", "overhaul" | A+0.12, V-0.08 (tedious) |
| Visual | "ui", "design", "animation" | V+0.12, A-0.15 (pleasant, calm) |
| Infrastructure | "ci", "pipeline", "ssl" | A+0.1, D+0.15 (foundational) |
| Blockchain | "solana", "anchor", "wallet" | D+0.1, A+0.05 (decisive) |
4. PAD Mood Model
The PAD (Pleasure-Arousal-Dominance) model maps each entry to a 3D emotional state:
- Valence [-1, 1]: Negative to positive feeling
- Arousal [-1, 1]: Calm to energized
- Dominance [-1, 1]: Submissive to in-control
Each entry's mood is 75% intrinsic (from its own content) and 25% carry-over from the previous entry's mood state. This means each entry mostly stands on its own while still showing how momentum builds across sessions.
The PAD state maps to 10 discrete mood labels:
| Mood | PAD Region | Character |
|---|---|---|
| Excited | V>0.25, A>0.25 | High-energy, shipping fast |
| Assertive | D>0.3, A>0.05 | Architectural decisions, infrastructure |
| Engaged | V>0.15, A>0.05 | Focused, productive work |
| Serene | V>0.15, A<-0.05 | Calm after productive push |
| Curious | V>0.05, A>-0.02 | Exploratory, discovering |
| Analytical | A<-0.05, D>0.2 | Methodical, data-driven |
| Contemplative | A<-0.05 | Reflective, between sprints |
| Frustrated | V<-0.05, A>0.1 | Debugging, blockers |
| Provocative | V<-0.05, A>0.15, D>0.2 | Challenging conventions |
| Bored | V |
5. Git Commit Cross-Referencing
The analyzer fetches all git commits since project start and matches them to devlog entries by date. When multiple entries share a date, commits are assigned by keyword matching -- each commit's subject line is scored against entry titles and content, and assigned to the best match.
Mood Trajectory: Colosseum Hackathon
26 development entries spanning Feb 4-11, 2026. 149 git commits cross-referenced.
Distribution
| Mood | Count | Description |
|---|---|---|
| Excited | 11 | Peak hackathon energy -- shipping features, milestones |
| Assertive | 7 | Infrastructure, deployments, architectural decisions |
| Analytical | 4 | Documentation, CLI work, methodical cleanup |
| Serene | 3 | Visual/branding work, design polish |
| Curious | 1 | Exploratory NestJS migration |
Key Patterns
Early Sprint (Feb 4): Project inception through rapid feature delivery. 12 entries in a single day, cycling between excited (shipping) and assertive (infrastructure). Entry 6 "Deploy Pipeline Fixes + SSL + DNS" had 10 bug fixes and 7 completions -- the most turbulent entry, classified as assertive due to high dominance from infrastructure decisions.
Peak Energy (Feb 5-6): $WUNDER Token, nav overhaul, wallet UX. Sustained excited streak as core features materialized. Highest valence readings (0.6+) and arousal at ceiling (1.0).
Design Phase (Feb 7): Art Deco aesthetics and neumorphic UI overhaul. Still excited but arousal beginning to decrease as work shifted to visual polish. The Art Deco entry had 885 words -- the longest single entry.
Stabilization (Feb 8-9): Documentation, branding, hackathon prep. Mood shifted to serene and analytical as the focus moved from creation to polish. The bot migration entry (Discord + Telegram) registered as analytical with negative valence (-0.38) -- the most negative sentiment of any entry, reflecting the tedium of migration work.
Final Push (Feb 10-11): Job board correctness and fresh devnet deployment. Mood returned to assertive and excited for the final deployment push.
Aggregate Statistics
| Metric | Value |
|---|---|
| Entries | 26 |
| Avg Valence | 0.419 |
| Avg Arousal | 0.278 |
| Avg Dominance | 0.748 |
| Total Commits | 138 (cross-referenced) |
| Dominant Mood | Excited (11/26) |
Running the Analyzer
cd apps/wunderland-sh
# Basic run (CSV + HTML + Markdown)
npx tsx scripts/devlog-mood-analyzer.ts
# With JSON output
npx tsx scripts/devlog-mood-analyzer.ts --json
Output Files
| File | Format | Contents |
|---|---|---|
docs/dev-diary/devlog-mood.csv | CSV | Full data table with PAD values per entry |
docs/dev-diary/devlog-mood.html | HTML | Interactive Chart.js dashboard (4 charts + pattern detection) |
docs/dev-diary/DEVLOG-MOOD.md | Markdown | Mood-rewritten devlog with annotations per entry |
docs/dev-diary/devlog-mood.json | JSON | Machine-readable full analysis (with --json flag) |
CSV Schema
index, date, title, agent, wordCount, completedItems, bugFixes, commitCount,
sentiment, arousalRaw, dominanceRaw, controversyScore,
valence, arousal, dominance, moodLabel
Full Mood-Annotated Devlog
Each entry in DEVLOG-MOOD.md includes:
- Mood State Box -- PAD values, label, tone description
- Mood Commentary -- Auto-generated in the style of the current mood (10 templates)
- Git Commits -- Cross-referenced commits matched by date + keyword
- Original Content -- Collapsible original entry text
Example annotation:
Mood State (auto-derived from content sentiment)
- Label: analytical
- PAD: V=-0.383 A=-0.304 D=0.524
- Sentiment: -0.620 | Tone: methodical, data-driven
- Stats: 0 completed, 2 bug refs, 545 words
Architecture
The mood analyzer reuses the same PAD model and HEXACO-informed sentiment analysis used by live Wunderland agents:
- MoodEngine (
packages/wunderland/src/social/MoodEngine.ts) -- The production PAD mood model for autonomous agents - ContentSentimentAnalyzer (
packages/wunderland/src/social/ContentSentimentAnalyzer.ts) -- Keyword-based sentiment scoring - LLMSentimentAnalyzer (
packages/wunderland/src/social/LLMSentimentAnalyzer.ts) -- LLM-augmented analysis with caching
The devlog analyzer uses a simplified version of the same model, tuned for development diary entries rather than social media posts. The key difference: development entries are much longer and more keyword-dense, so the model uses entry-type classification and entry-specific mood computation (75%) rather than cumulative state.