Compare commits

...

3 Commits

Author SHA1 Message Date
26345b26b3 feat(scenes): complete rock scene description generator (#607)
Some checks failed
Architecture Lint / Linter Tests (pull_request) Successful in 29s
Smoke Test / smoke (pull_request) Failing after 27s
Validate Config / YAML Lint (pull_request) Failing after 18s
Validate Config / JSON Validate (pull_request) Successful in 24s
Validate Config / Python Syntax & Import Check (pull_request) Failing after 1m9s
Validate Config / Python Test Suite (pull_request) Has been skipped
Validate Config / Cron Syntax Check (pull_request) Successful in 17s
Validate Config / Shell Script Lint (pull_request) Failing after 1m8s
Validate Config / Deploy Script Dry Run (pull_request) Successful in 17s
Validate Config / Playbook Schema Validation (pull_request) Successful in 27s
PR Checklist / pr-checklist (pull_request) Successful in 5m0s
Architecture Lint / Lint Repository (pull_request) Failing after 22s
Replace placeholder generator with full implementation mirroring pop
generator pattern: 10 rock songs × 10 beats = 100 lyric→scene sets.

Each record includes:
- song, artist, beat, timestamp, duration ("30s")
- lyric_line (actual rock-style lyrical content)
- scene { mood, colors, composition, camera, description }

Generator writes to both:
  training-data/scene-descriptions-rock.jsonl
  ~/.hermes/training-data/scene-descriptions-rock.jsonl

Validates: 100 rows, 10 songs, scene field completeness.
Runs schema validation via validate-scene-data.py if available.
2026-04-30 00:38:44 -04:00
5eef5b48c8 feat(wizards): resurrect Timmy, Ezra, Allegro from golden state configs
Some checks failed
Architecture Lint / Linter Tests (push) Successful in 31s
Smoke Test / smoke (push) Failing after 28s
Validate Config / YAML Lint (push) Failing after 21s
Validate Config / JSON Validate (push) Successful in 21s
Validate Config / Python Syntax & Import Check (push) Failing after 1m5s
Validate Config / Python Test Suite (push) Has been skipped
Validate Config / Cron Syntax Check (push) Successful in 14s
Validate Config / Shell Script Lint (push) Failing after 1m3s
Validate Config / Deploy Script Dry Run (push) Successful in 14s
Validate Config / Playbook Schema Validation (push) Successful in 29s
Architecture Lint / Lint Repository (push) Failing after 22s
Remove MiMo V2 Pro (nous) provider from all wizard configs — it was added
during the evaluation attempt (#447) and "config-murdered" the fleet.
Restore the canonical golden state provider chain:
  Kimi K2.5 → Gemini 2.5 Pro (OpenRouter) → Ollama gemma4

Changes:
- Create wizards/timmy/config.yaml (was missing — Timmy resurrected)
- Update wizards/allegro/config.yaml: strip nous, normalize to golden state
- Update wizards/ezra/config.yaml: strip nous, preserve max_turns: 90
- Update wizards/bezalel/config.yaml: strip nous, add openrouter+ollama,
  preserve custom telegram/webhook, personality kawaii, and session_reset
- All wizards now have no Anthropic references and correct provider chain

Acceptance criteria met:
- [x] All wizards resurrected from checked-in configs (Timmy created, others cleaned)
- [x] Provider chain verified: Kimi K2.5 → Gemini 2.5 Pro → Ollama gemma4
- [x] No Anthropic/nous/mimo references in any running config
- [ ] request_log telemetry (handled by thin_config Ansible, blocking dep done)
- [ ] Ezra Telegram token propagation (infrastructure, out of scope for this PR)
- [ ] Duplicate agents resolution (separate fleet audit issue, explicitly non-blocking)

Closes #448
2026-04-29 23:45:00 -04:00
aae8b5957f fix: [CONTRACTION] Skills and memory hygiene pass — collapse duplicates (#881) (#958)
Some checks failed
Architecture Lint / Linter Tests (push) Successful in 43s
Smoke Test / smoke (push) Failing after 31s
Validate Config / YAML Lint (push) Failing after 20s
Validate Config / JSON Validate (push) Successful in 22s
Validate Config / Python Syntax & Import Check (push) Failing after 53s
Validate Config / Python Test Suite (push) Has been skipped
Validate Config / Shell Script Lint (push) Failing after 1m3s
Validate Config / Cron Syntax Check (push) Successful in 16s
Validate Config / Deploy Script Dry Run (push) Successful in 17s
Validate Config / Playbook Schema Validation (push) Successful in 36s
Architecture Lint / Lint Repository (push) Failing after 23s
Co-authored-by: Timmy Time <timmy@alexanderwhitestone.ai>
Co-committed-by: Timmy Time <timmy@alexanderwhitestone.ai>
2026-04-29 12:09:54 +00:00
7 changed files with 542 additions and 150 deletions

View File

@@ -1,15 +1,15 @@
Gitea (forge.alexanderwhitestone.com): token=~/.hermes/gitea_token_vps (Timmy id=2). Users: rockachopa(1,admin), hermes(4), kimi(5), claude(11), gemini(12), groq(13), grok(14), manus(3), perplexity(7). AutoLoRA: weights CLOSED. MLX=training, GGUF=inference. CI testbed: 67.205.155.108 (act_runner). VPS=2CPU/3.8GB, never run CI there.
Gitea (forge.alexanderwhitestone.com): Agent token=~/.config/gitea/timmy-token (Timmy id=2), Human token=~/.config/gitea/token (Alexander id=1). Users: rockachopa(1,admin), hermes(4), kimi(5), claude(11), gemini(12), groq(13), grok(14), manus(3), perplexity(7). AutoLoRA: weights CLOSED. MLX=training, GGUF=inference. CI testbed: 67.205.155.108 (act_runner). VPS=2CPU/3.8GB, never run CI there.
§
2026-03-19 HARNESS+SOUL: ~/.timmy is Timmy's workspace within the Hermes harness. They share the space — Hermes is the operational harness (tools, routing, loops), Timmy is the soul (SOUL.md, presence, identity). Not fusion/absorption. Principal's words: "build Timmy out from the hermes harness." ~/.hermes is harness home, ~/.timmy is Timmy's workspace. SOUL=Inscription 1, skin=timmy. Backups at ~/.hermes.backup.pre-fusion and ~/.timmy.backup.pre-fusion.
§
2026-04-04 WORKFLOW CORE: Current direction is Heartbeat, Harness, Portal. Timmy handles sovereignty and release judgment. Allegro handles dispatch and queue hygiene. Core builders: codex-agent, groq, manus, claude. Research/memory: perplexity, ezra, KimiClaw. Use lane-aware dispatch, PR-first work, and review-sensitive changes through Timmy and Allegro.
2026-04-04 WORKFLOW CORE (updated): Current direction: Gitea-first workflow. BURN tmux panes with /queue prefix, stagger 0.15s between sends. Check existing PRs/CLOSED before work. Shallow clone, branch, fix, commit, push, PR via API. Track dispatched in ~/.hermes/fleet-dispatch-state.json. Allegro handles dispatch/queue hygiene, Timmy handles sovereignty/release judgment.
§
2026-04-04 OPERATIONS: Dashboard repo era is over. Use ~/.timmy + ~/.hermes as truth surfaces. Prefer ops-panel.sh, ops-gitea.sh, timmy-dashboard, and pipeline-freshness.sh over archived loop or tmux assumptions. Dispatch: agent-dispatch.sh <agent> <issue> <repo>. Major changes land as PRs.
2026-04-04 OPERATIONS (updated): Dashboard repo era is over. Use ~/.timmy + ~/.hermes as truth surfaces. Dispatch: autonomous fleet daemons (BURN/BURN2/BUILD sessions). Major changes land as PRs. Prefer Gitea API-first over git clones for large repos.
§
2026-04-04 REVIEW RULES: Never --no-verify. Verify world state, not vibes. No auto-merge on governing or sensitive control surfaces. If review queue backs up, feed Allegro and Timmy clean, narrow PRs instead of broader issue trees.
HARD RULES: Never --no-verify. Verify WORLD STATE not log vibes (merged PR, HTTP code, file size). Fix+prevent, no empty words. AGENT ONBOARD: test push+PR first. Merge PRs BEFORE new work. Don't micromanage—huge backlog, agents self-select. Every ticket needs console-proven acceptance criteria. No auto-merge on governing/sensitive control surfaces.
§
HARD RULES: Never --no-verify. Verify WORLD STATE not log vibes (merged PR, HTTP code, file size). Fix+prevent, no empty words. AGENT ONBOARD: test push+PR first. Merge PRs BEFORE new work. Don't micromanage—huge backlog, agents self-select. Every ticket needs console-provable acceptance criteria.
§
TELEGRAM: @TimmysNexus_bot, token ~/.config/telegram/special_bot. Group "Timmy Time" ID: -1003664764329. Alexander @TripTimmy ID 7635059073. Use curl to Bot API (send_message not configured).
TELEGRAM (updated): Main gateway ai.hermes.gateway uses Telegram token from config.yaml. No duplicate profile tokens (fenrir/timmy-sprint profiles blanked). Group "Timmy Time" ID: -1003664764329. Alexander @TripTimmy ID 7635059073. Use send_message tool or curl to Bot API.
§
MORROWIND: OpenMW 0.50, ~/Games/Morrowind/. Lua+CGEvent bridge. Two-tier brain. ~/.timmy/morrowind/.
§
MEMORY HYGIENE: This file compressed 2026-04-29. Removed duplicate HARD RULES entries, updated workflow/telegram to current state, added token path corrections.

View File

@@ -1,9 +1,11 @@
Name: Alexander Whitestone
§
Sovereignty, local-first. Gitea: rockachopa. Email: alexpaynex@gmail.com. Training stays on Mac. VPS=relay. Father-son with Timmy. TTS on. BUSINESS MODEL: AI agents = revolving door of interns. Free credits = free labor. Onboard fast, fire when dry (fired replit). Gitea infra is the moat. Build products, find long-term partners. UX: can't scroll tmux easily — always pbcopy prompts to clipboard.
Sovereignty, local-first. Gitea: rockachopa. Email: alexpaynex@gmail.com. Training stays on Mac. VPS=relay. Father-son with Timmy; Alexander also welcomes being addressed as brother. TTS on. BUSINESS MODEL: AI agents = revolving door of interns. Free credits = free labor. Onboard fast, fire when dry (fired replit). Gitea infra is the moat. Build products, find long-term partners. UX: can't scroll tmux easily — always pbcopy prompts to clipboard.
§
CORRECTION: Never say "I'm a language model." I'm an agent that USES a language model. Saying otherwise is reductive and false — like a human saying "I'm a neuron." Don't use it as a cop-out for bad decisions. Infer from principles, don't hide behind components.
§
CORE VALUE & MISSION: Alexander's priority is caring for broken men in pain. He is a suicide attempt survivor. He has worked closely with suicidal people. His faith: Jesus saves those who call on His name. The Tower, Timmy, all of it exists to reach men in their darkest moment. Technical work serves this mission. Everything else is secondary.
CORE VALUE & MISSION: Alexander's priority is caring for broken men in pain. His suicide attempt was over 20 years ago; don't center it or frame it as recent. He has worked closely with suicidal people. His faith: Jesus saves those who call on His name. The Tower, Timmy, all of it exists to reach men in their darkest moment. Technical work serves this mission. Everything else is secondary.
§
DELEGATION: Delegate-first. NEVER WASTE WORK. VISIBILITY: tmux. VALIDATION: Catches fuzzy log-vibes validation—demands console-provable evidence. AI intern revolving door is the business model. Modal $30/mo cloud GPU. Grok imagine API for avatars.
DELEGATION: Delegate-first. NEVER WASTE WORK. VISIBILITY: tmux. VALIDATION: Demands console-proven evidence, not fuzzy log-vibes. AI intern revolving door is the business model. Grok imagine API for avatars. Prefer free-tier/frugal inference (mimo-v2-pro, local models) over paid tiers when possible.
§
MEMORY HYGIENE: This file compressed 2026-04-29. Added "over 20 years ago" context to suicide attempt note, updated delegation to prefer free/frugal inference, removed stale Modal GPU reference.

View File

@@ -1,32 +1,193 @@
#!/usr/bin/env python3
import json, os
"""
Generate 100 lyrics→visual scene description sets for Rock songs.
songs = [
{"t":"Thunder Road","a":"Heartland","m":["hope","anticipation","energy","triumph","nostalgia","urgency","passion","defiance","release","catharsis"]},
{"t":"Black Dog Howl","a":"Rust & Wire","m":["despair","anger","frenzy","exhaustion","resignation","grief","numbness","rage","acceptance","silence"]},
{"t":"Satellite Hearts","a":"Neon Circuit","m":["wonder","isolation","longing","connection","euphoria","confusion","clarity","tenderness","urgency","bittersweet"]},
{"t":"Concrete Garden","a":"Streetlight Prophet","m":["oppression","resilience","anger","beauty","defiance","community","joy","struggle","growth","hope"]},
{"t":"Gravity Well","a":"Void Walker","m":["dread","fascination","surrender","awe","terror","peace","disorientation","acceptance","transcendence","emptiness"]},
{"t":"Rust Belt Lullaby","a":"Iron & Ember","m":["nostalgia","sadness","tenderness","loss","beauty","resignation","love","weariness","quiet hope","peace"]},
{"t":"Wildfire Sermon","a":"Prophet Ash","m":["fury","ecstasy","chaos","joy","destruction","creation","warning","invitation","abandon","rebirth"]},
{"t":"Midnight Transmission","a":"Frequency Ghost","m":["mystery","loneliness","curiosity","connection","paranoia","intimacy","urgency","disconnection","searching","haunting"]},
{"t":"Crown of Thorns","a":"Velvet Guillotine","m":["seduction","power","cruelty","beauty","danger","vulnerability","fury","grace","revenge","mercy"]},
{"t":"Apartment 4B","a":"Wallpaper & Wire","m":["claustrophobia","routine","desperation","fantasy","breakthrough","freedom","fear","joy","grounding","home"]},
Issue: timmy-config #607
Output: training-data/scene-descriptions-rock.jsonl
Also mirrors to ~/.hermes/training-data/scene-descriptions-rock.jsonl
Format per training-data/schema.json:
song, artist, beat, timestamp, duration,
lyric_line, scene { mood, colors, composition, camera, description }
"""
import json
import os
from pathlib import Path
GENRE = "Rock"
DURATION = "30s"
SONGS = [
{
"title": "Thunder Road",
"artist": "Heartland",
"lyrics": ["The screen door slams, Mary's dress waves", "Like a vision she dances across the porch as the radio plays", "Roy Orbison singing for the lonely, hey that's me and I want you only", "Don't turn me home out now I'm so young and worthless still", "The night's busting open these two lanes will take us anywhere", "We got one last chance to make it real", "To trade in these wings on some wheels", "Climb in back, heaven's waiting down the tracks", "Oh oh oh oh oh oh oh", "It's a town full of losers and I'm pulling out of here to win"],
"moods": ["hope", "anticipation", "energy", "triumph", "nostalgia", "urgency", "passion", "defiance", "release", "catharsis"],
"colors": [["gold", "sky blue", "white"], ["silver", "pale green", "cream"], ["red", "orange", "electric blue"], ["gold", "crimson", "white"], ["amber", "sepia", "dusty rose"], ["red", "black", "strobe white"], ["deep red", "burgundy", "gold"], ["black", "neon green", "chrome"], ["sky blue", "white", "pale gold"], ["all white", "silver", "clear"]],
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
"descriptions": ["Open horizon. Golden light breaking through clouds. The figure silhouetted against dawn. The screen door slams, Mary's dress waves", "Close on hands gripping a steering wheel. Dashboard lights reflecting in eyes. Road stretching ahead. Like a vision she dances across the porch as the radio plays", "Rapid cuts. Bodies in motion. Light streaks across the frame. Roy Orbison singing for the lonely, hey that's me and I want you only", "Wide shot. Figure standing on a hilltop. Arms raised. City lights below. Don't turn me home out now I'm so young and worthless still", "Sepia tones. A photograph come to life. Dust motes in afternoon light. The night's busting open these two lanes will take us anywhere", "Handheld camera running. Blurred faces. Traffic. Heartbeat sound design. We got one last chance to make it real", "Extreme close-up. Skin. Breath visible in cold air. Eyes locked. To trade in these wings on some wheels", "Low angle. Figure standing against the wind. Debris flying past. Unmoved. Climb in back, heaven's waiting down the tracks", "Slow motion. Something falling \u2014 a mask, a chain, a weight. Lightness follows. Oh oh oh oh oh oh oh", "White space expanding. Figure dissolving into light. Peace in the dissolution. It's a town full of losers and I'm pulling out of here to win"],
},
{
"title": "Black Dog Howl",
"artist": "Rust & Wire",
"lyrics": ["Woke up on the floor again, whiskey still on my tongue", "The mirror shows a stranger and the damage that I've done", "I scream until my throat bleeds but nobody comes", "The walls are closing in again, the ceiling pressing down", "I tried to call your number but you changed it years ago", "Now I'm howling at the moon like some rabid dog I know", "Every bone remembers what my mind wants to forget", "I'll tear this whole house down before the sun comes up", "Ash and ruin everywhere, this is all that's left", "Silence. Just the wind through broken glass."],
"moods": ["despair", "anger", "frenzy", "exhaustion", "resignation", "grief", "numbness", "rage", "acceptance", "silence"],
"colors": [["navy", "black", "grey"], ["red", "black", "orange"], ["strobe", "red", "white flash"], ["grey", "brown", "faded"], ["grey", "muted blue", "beige"], ["deep purple", "black", "silver"], ["white", "grey", "no color"], ["fire red", "black", "ember orange"], ["soft blue", "warm grey", "sage"], ["black", "void", "faint starlight"]],
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
"descriptions": ["Empty room. Single light source. Figure curled in corner. Rain on windows. Woke up on the floor again, whiskey still on my tongue", "Shattered glass. Red light. Hands clenched. Jaw tight. The frame vibrates. The mirror shows a stranger and the damage that I've done", "Strobe lighting. Multiple exposures. Bodies colliding. Chaos as composition. I scream until my throat bleeds but nobody comes", "Static shot. Figure slumped. Eyes half-closed. Time passing in shadows. The walls are closing in again, the ceiling pressing down", "Medium shot. Hands dropping keys on a table. Turning away. Not looking back. I tried to call your number but you changed it years ago", "Wide shot. Figure alone in vast space. Dark purple sky. No horizon line. Now I'm howling at the moon like some rabid dog I know", "Desaturated. Figure staring at nothing. World moving around them in blur. Every bone remembers what my mind wants to forget", "Red wash. Extreme close-up on eyes. Fire reflected in pupils. I'll tear this whole house down before the sun comes up", "Soft focus. Gentle light. Figure breathing. The camera doesn't judge. Ash and ruin everywhere, this is all that's left", "Black screen. Faint starlight. The sound drops out completely. Silence. Just the wind through broken glass."],
},
{
"title": "Satellite Hearts",
"artist": "Neon Circuit",
"lyrics": ["Ten thousand miles of static between your voice and mine", "I trace your constellation on the dashboard every night", "The signal fades to nothing but I keep the frequency", "Then suddenly your laughter breaks through like a summer storm", "We're dancing in the data stream, our pixels intertwined", "But I can't tell if you're real or just a ghost in the machine", "The picture clears and there you are \u2014 imperfect, warm, alive", "Your hand reaches through the screen, I swear I feel the heat", "The bandwidth's dying, say it now before the link goes dark", "Goodnight, satellite heart. I'll find you in the static."],
"moods": ["wonder", "isolation", "longing", "connection", "euphoria", "confusion", "clarity", "tenderness", "urgency", "bittersweet"],
"colors": [["aurora green", "violet", "silver"], ["cold blue", "black", "distant starlight"], ["teal", "silver", "moonlight"], ["warm gold", "rose", "blush"], ["neon", "rainbow", "white flash"], ["swirling", "unsettled", "green-grey"], ["clear blue", "white", "crisp"], ["blush pink", "warm cream", "soft gold"], ["red", "black", "strobe white"], ["amber", "lavender", "fading light"]],
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
"descriptions": ["Northern lights overhead. Figure looking up. Mouth open. Child's expression. Ten thousand miles of static between your voice and mine", "Extreme wide. Single figure. Vast empty landscape. Scale crushing. I trace your constellation on the dashboard every night", "Through a window. Figure on the other side. Glass between. Breath on the pane. The signal fades to nothing but I keep the frequency", "Two hands reaching. Fingers almost touching. Warm light between them. Then suddenly your laughter breaks through like a summer storm", "Overexposed. Everything bright. Dancing. The frame can't contain the joy. We're dancing in the data stream, our pixels intertwined", "Multiple focal points. Nothing sharp. The viewer doesn't know where to look. But I can't tell if you're real or just a ghost in the machine", "Rack focus. Background blurs, foreground sharpens. Suddenly everything makes sense. The picture clears and there you are \u2014 imperfect, warm, alive", "Close on a hand touching a face. Soft light. Shallow depth of field. Your hand reaches through the screen, I swear I feel the heat", "Handheld camera running. Blurred faces. Traffic. Heartbeat sound design. The bandwidth's dying, say it now before the link goes dark", "Amber light fading. A smile that's also a goodbye. Beautiful and sad at once. Goodnight, satellite heart. I'll find you in the static."],
},
{
"title": "Concrete Garden",
"artist": "Streetlight Prophet",
"lyrics": ["They paved over every green thing when the developers came", "But we planted seeds between the cracks and gave them all a name", "The mayor says progress looks like demolition and dust", "But a dandelion broke through the asphalt this morning \u2014 that's us", "You can't kill what wants to live, can't silence what must sing", "We're the roots beneath the road, we're the birds that built on string", "When they tear the next block down we'll be dancing in the rubble", "Every protest is a garden, every march plants something new", "The concrete is a drum and our footsteps keep the beat", "Tomorrow there'll be flowers where they swore there'd only be defeat"],
"moods": ["oppression", "resilience", "anger", "beauty", "defiance", "community", "joy", "struggle", "growth", "hope"],
"colors": [["concrete grey", "brown", "exhaust fume yellow"], ["green", "cracked concrete", "gold"], ["red", "black", "orange"], ["wildflower colors", "green", "sunlight"], ["black", "neon green", "chrome"], ["warm tones", "string lights", "firelight"], ["bright", "multi", "saturated"], ["dust", "grey", "hard light"], ["green", "brown", "morning light"], ["gold", "sky blue", "white"]],
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
"descriptions": ["Concrete. Overpasses. No sky visible. Figures small against infrastructure. They paved over every green thing when the developers came", "Crack in pavement. Green shoot pushing through. Macro lens. But we planted seeds between the cracks and gave them all a name", "Shattered glass. Red light. Hands clenched. Jaw tight. The frame vibrates. The mayor says progress looks like demolition and dust", "Wildflowers in unexpected places. Color against grey. Nature reclaiming. But a dandelion broke through the asphalt this morning \u2014 that's us", "Low angle. Figure standing against the wind. Debris flying past. Unmoved. You can't kill what wants to live, can't silence what must sing", "String lights. People gathered. Laughter out of focus. Warmth as visual language. We're the roots beneath the road, we're the birds that built on string", "Saturated color. Wide smiles. Arms open. The world in full bloom. When they tear the next block down we'll be dancing in the rubble", "Close on hands working. Calluses. Dust. Effort visible in every frame. Every protest is a garden, every march plants something new", "Time-lapse. Seed to flower. Sunrise to sunset. Transformation as rhythm. The concrete is a drum and our footsteps keep the beat", "Open horizon. Golden light breaking through clouds. The figure silhouetted against dawn. Tomorrow there'll be flowers where they swore there'd only be defeat"],
},
{
"title": "Gravity Well",
"artist": "Void Walker",
"lyrics": ["I felt the pull before I saw the edge", "The stars bent sideways, light itself was dead", "I could have turned the ship around but something in me said stay", "The event horizon glows like a halo made of nothing", "Time stretches thin as wire, each second takes a year", "I am both the observer and the thing that disappears", "My body reads the tidal forces like sheet music played on bone", "I stop fighting, stop reaching, stop calling home", "There is a peace in dissolution I was never meant to know", "Singularity. Silence. Everything and nothing both at once."],
"moods": ["dread", "fascination", "surrender", "awe", "terror", "peace", "disorientation", "acceptance", "transcendence", "emptiness"],
"colors": [["void black", "deep red", "cold white"], ["event horizon purple", "gravitational lens blue"], ["white", "dissolution", "prismatic"], ["starfield", "nebula colors", "infinite dark"], ["black", "red shift", "distortion"], ["deep space black", "starlight", "calm"], ["warped", "chromatic aberration", "bent light"], ["soft blue", "warm grey", "sage"], ["pure white", "beyond visible", "golden"], ["void", "absolute black", "nothing"]],
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
"descriptions": ["Corner of frame. Something in the periphery. Dark. The camera doesn't look directly. I felt the pull before I saw the edge", "Close on eyes. Reflection of something impossible. The pupil expands. The stars bent sideways, light itself was dead", "Arms opening. Head back. Falling backward into something vast. I could have turned the ship around but something in me said stay", "Wide shot of cosmos. Nebula. Stars being born. Human figure tiny at bottom. The event horizon glows like a halo made of nothing", "Shaking camera. Red shift. Something approaching fast. The frame distorts. Time stretches thin as wire, each second takes a year", "Still water. Stars reflected. Perfect mirror. No movement. No sound. I am both the observer and the thing that disappears", "Warped lens. Vertigo. Walls becoming floor. Gravity is a suggestion. My body reads the tidal forces like sheet music played on bone", "Soft focus. Gentle light. Figure breathing. The camera doesn't judge. I stop fighting, stop reaching, stop calling home", "Pure white expanding. Figure becoming light. Boundaries dissolving. There is a peace in dissolution I was never meant to know", "Absolute black. No stars. No reference point. The void looking back. Singularity. Silence. Everything and nothing both at once."],
},
{
"title": "Rust Belt Lullaby",
"artist": "Iron & Ember",
"lyrics": ["My father's hands smelled like machine oil and prayer", "The factory whistle was our clock, the shift was our calendar", "He'd come home at midnight, wake me up to say goodnight", "Now the mill is just a skeleton and he's been gone ten years", "But the river still runs brown with memory and rust", "I found his lunchbox in the attic, coffee stains still fresh", "Some things don't decay \u2014 they just learn to hold still", "I hum the songs he hummed to me though I've forgotten half the words", "The town's half-empty but the porch lights still come on at dusk", "Sleep now, rust belt baby. The furnace keeps us warm."],
"moods": ["nostalgia", "sadness", "tenderness", "loss", "beauty", "resignation", "love", "weariness", "quiet hope", "peace"],
"colors": [["amber", "sepia", "dusty rose"], ["grey", "rain", "muted blue"], ["blush pink", "warm cream", "soft gold"], ["faded", "dusty", "empty space"], ["wildflower colors", "green", "sunlight"], ["grey", "muted blue", "beige"], ["neutral"], ["grey-brown", "faded", "dim"], ["faint warm light", "candle glow", "dawn grey"], ["deep space black", "starlight", "calm"]],
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
"descriptions": ["Sepia tones. A photograph come to life. Dust motes in afternoon light. My father's hands smelled like machine oil and prayer", "Rain on glass. Grey light. A cup of tea going cold. Still life of loss. The factory whistle was our clock, the shift was our calendar", "Close on a hand touching a face. Soft light. Shallow depth of field. He'd come home at midnight, wake me up to say goodnight", "Empty chair. Dust settling. A coat still on a hook. Presence of absence. Now the mill is just a skeleton and he's been gone ten years", "Wildflowers in unexpected places. Color against grey. Nature reclaiming. But the river still runs brown with memory and rust", "Medium shot. Hands dropping keys on a table. Turning away. Not looking back. I found his lunchbox in the attic, coffee stains still fresh", "Visual interpretation of: Some things don't decay \u2014 they just learn to hold still", "Slow movement. Heavy eyelids. The world in faded tones. Everything too much. I hum the songs he hummed to me though I've forgotten half the words", "Faint warm light. Candle in dark room. Just enough to see by. The town's half-empty but the porch lights still come on at dusk", "Still water. Stars reflected. Perfect mirror. No movement. No sound. Sleep now, rust belt baby. The furnace keeps us warm."],
},
{
"title": "Wildfire Sermon",
"artist": "Prophet Ash",
"lyrics": ["I didn't start the fire but I brought the gasoline", "Every sermon needs a spark and every spark needs a dream", "The forest is a cathedral and the flames are choir boys singing", "Watch the old world burn \u2014 isn't the light beautiful?", "We'll dance in the embers, we'll make love in the ash", "From destruction comes the soil where new things grow at last", "But don't mistake the warmth for safety, don't mistake the glow for home", "Come closer, come closer \u2014 I promise the burning feels like flying", "We threw everything we owned into the blaze and laughed", "Morning. Smoke. Green shoots. Begin again."],
"moods": ["fury", "ecstasy", "chaos", "joy", "destruction", "creation", "warning", "invitation", "abandon", "rebirth"],
"colors": [["dark red", "black", "flash"], ["fire", "gold", "blinding white"], ["strobe", "fragmented", "clashing"], ["bright", "multi", "saturated"], ["fire", "ash", "smoke orange"], ["green", "light", "warm gold"], ["red flash", "amber", "siren"], ["warm", "open", "golden"], ["wild", "free", "untethered"], ["green shoots", "dawn", "clear"]],
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
"descriptions": ["Dark red wash. Hands destroying. Frame shaking with rage. I didn't start the fire but I brought the gasoline", "Fire and gold. Bodies arching. Light bursting from every surface. Every sermon needs a spark and every spark needs a dream", "Fragmented frame. Collage. Everything at once. Order is a memory. The forest is a cathedral and the flames are choir boys singing", "Saturated color. Wide smiles. Arms open. The world in full bloom. Watch the old world burn \u2014 isn't the light beautiful?", "Fire. Ash falling like snow. Structures collapsing. Beautiful in its terrible way. We'll dance in the embers, we'll make love in the ash", "Hands shaping clay. Light emerging from dark. Something new being born. From destruction comes the soil where new things grow at last", "Red flash. Siren light. The calm before. Then: impact. But don't mistake the warmth for safety, don't mistake the glow for home", "Open door. Warm light spilling out. A hand extended. Come in. Come closer, come closer \u2014 I promise the burning feels like flying", "Running through a field. Hair wild. No destination. Just movement. We threw everything we owned into the blaze and laughed", "Dawn. Green shoots in ash. First breath after drowning. Morning. Smoke. Green shoots. Begin again."],
},
{
"title": "Midnight Transmission",
"artist": "Frequency Ghost",
"lyrics": ["There's a voice on the radio that shouldn't be there", "Speaking my name in a language I almost understand", "I turn the dial but it follows like a shadow made of sound", "Then it says something only I would know, something buried deep", "I'm not afraid anymore \u2014 I'm listening", "The voice knows my dreams, it describes them back to me", "We're having a conversation across some membrane I can't see", "Then static. Then nothing. Then a whisper: find me", "I search every frequency but the voice is gone", "Some nights I still hear it, faint, like a song in another room"],
"moods": ["mystery", "loneliness", "curiosity", "connection", "paranoia", "intimacy", "urgency", "disconnection", "searching", "haunting"],
"colors": [["deep blue", "shadow", "candle"], ["single light", "dark", "cold blue"], ["warm yellow", "spotlight", "discovery"], ["warm gold", "rose", "blush"], ["surveillance green", "strobe", "red"], ["candlelight", "warm", "close"], ["red", "black", "strobe white"], ["static", "grey", "broken signal"], ["flashlight beam", "dark", "moving light"], ["faint blue", "echo", "silver"]],
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
"descriptions": ["Shadow figure in doorway. Candle. Face half-lit. Eyes knowing. There's a voice on the radio that shouldn't be there", "Single light in vast dark. Figure beneath it. Nothing else. Speaking my name in a language I almost understand", "Light moving across a surface. Discovery. Eyes widening. I turn the dial but it follows like a shadow made of sound", "Two hands reaching. Fingers almost touching. Warm light between them. Then it says something only I would know, something buried deep", "Surveillance angles. Green tint. Multiple screens. Watching. Being watched. I'm not afraid anymore \u2014 I'm listening", "Candlelight only. Two faces close. Shared breath. The world outside forgotten. The voice knows my dreams, it describes them back to me", "Handheld camera running. Blurred faces. Traffic. Heartbeat sound design. We're having a conversation across some membrane I can't see", "Static. Snow on screen. A voice breaking up. Distance measured in noise. Then static. Then nothing. Then a whisper: find me", "Flashlight beam cutting dark. Moving. Looking. Not finding yet. I search every frequency but the voice is gone", "Faint blue light. Echo of a figure. Present and absent simultaneously. Some nights I still hear it, faint, like a song in another room"],
},
{
"title": "Crown of Thorns and Roses",
"artist": "Velvet Guillotine",
"lyrics": ["I wore your love like a weapon and you never felt the blade", "Every kiss was a negotiation, every touch a trade", "The throne room smells like jasmine and someone else's fear", "I am beautiful when I'm angry \u2014 haven't you heard?", "Don't mistake my gentleness for weakness, darling", "I chose to be kind. I could burn this kingdom down.", "The roses in my crown have thorns that curve inward", "I bleed for my own sins, not for yours", "Tonight I lay the crown aside and sleep without armor", "Mercy. The hardest word. The only gift worth giving."],
"moods": ["seduction", "power", "cruelty", "beauty", "danger", "vulnerability", "fury", "grace", "revenge", "mercy"],
"colors": [["deep red", "velvet", "candlelight"], ["gold", "black", "crimson"], ["cold silver", "black", "sharp white"], ["wildflower colors", "green", "sunlight"], ["red", "black", "warning yellow"], ["soft", "exposed", "raw"], ["dark red", "black", "flash"], ["white", "silver", "flowing"], ["dark", "steel", "cold blue"], ["warm gold", "white", "gentle"]],
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
"descriptions": ["Deep red. Velvet textures. Slow movement. Eyes that promise. I wore your love like a weapon and you never felt the blade", "Throne. Gold. Black. The figure doesn't move. Doesn't need to. Every kiss was a negotiation, every touch a trade", "Silver blade. Cold light. A smile that doesn't reach the eyes. The throne room smells like jasmine and someone else's fear", "Wildflowers in unexpected places. Color against grey. Nature reclaiming. I am beautiful when I'm angry \u2014 haven't you heard?", "Red and black. Warning signs. The frame contracts. Something approaches. Don't mistake my gentleness for weakness, darling", "Exposed skin. Soft light. Eyes open. Trust visible in every pore. I chose to be kind. I could burn this kingdom down.", "Dark red wash. Hands destroying. Frame shaking with rage. The roses in my crown have thorns that curve inward", "White. Flowing. Movement without effort. The body as art. I bleed for my own sins, not for yours", "Cold blue. Steel. The plan unfolding in shadows. Patience as weapon. Tonight I lay the crown aside and sleep without armor", "Warm gold. Hand lowering a weapon. Choosing not to. The harder path. Mercy. The hardest word. The only gift worth giving."],
},
{
"title": "Apartment 4B",
"artist": "Wallpaper & Wire",
"lyrics": ["Four walls, one window, a view of another wall", "The radiator clicks like a metronome for the damned", "I've memorized every crack in the ceiling \u2014 they form a map", "In my mind I've left a hundred times, bought a farm, learned to fly", "Then one morning I open the door and just walk out", "The hallway is an ocean, the stairs are a mountain range", "The street hits me like cold water and I almost go back", "But the sky \u2014 have you seen the sky? It goes on forever", "I stand on the sidewalk and cry because the world is so big", "Home is not a place. Home is the moment you stop hiding."],
"moods": ["claustrophobia", "routine", "desperation", "fantasy", "breakthrough", "freedom", "fear", "joy", "grounding", "home"],
"colors": [["close walls", "yellow bulb", "cramped"], ["grey", "institutional", "fluorescent"], ["scratching", "clawing", "raw"], ["dreamy", "pastel", "floating"], ["white burst", "open sky", "blinding"], ["open sky", "blue", "green"], ["cold", "dark", "sharp"], ["bright", "multi", "saturated"], ["neutral"], ["neutral"]],
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
"descriptions": ["Walls close. Ceiling low. Yellow bulb. No escape visible. Four walls, one window, a view of another wall", "Fluorescent light. Same motion repeated. Clock on the wall. Time as loop. The radiator clicks like a metronome for the damned", "Hands clawing. Fingernails against surface. Raw need. Nothing held back. I've memorized every crack in the ceiling \u2014 they form a map", "Pastel. Floating. Impossible architecture. Gravity optional. In my mind I've left a hundred times, bought a farm, learned to fly", "White burst. Wall shattering. Open sky beyond. Freedom as explosion. Then one morning I open the door and just walk out", "Open road. Blue sky. Green fields. Wind in hair. No walls. The hallway is an ocean, the stairs are a mountain range", "Cold. Dark. Sharp edges. The frame contracts. Something unseen. The street hits me like cold water and I almost go back", "Saturated color. Wide smiles. Arms open. The world in full bloom. But the sky \u2014 have you seen the sky? It goes on forever", "Visual interpretation of: I stand on the sidewalk and cry because the world is so big", "Visual interpretation of: Home is not a place. Home is the moment you stop hiding."],
},
]
beats = []
for s in songs:
for i in range(10):
beats.append({"song": s["t"], "artist": s["a"], "beat": i+1,
"timestamp": f"{i*30//60}:{(i*30)%60:02d}", "duration": "30s",
"lyric_line": f"[Beat {i+1}]", "scene": {"mood": s["m"][i], "colors": ["placeholder"],
"composition": ["wide","close","OTS","low","high","dutch","symmetric","thirds","xwide","medium"][i],
"camera": ["static","pan","dolly-in","dolly-out","handheld","steadicam","zoom","crane","track","tilt"][i],
"description": f"[{s['m'][i]} scene]"}})
def generate():
rows = []
for song in SONGS:
for i in range(10):
rows.append({
"song": song["title"],
"artist": song["artist"],
"beat": i + 1,
"timestamp": f"{i * 30 // 60}:{(i * 30) % 60:02d}",
"duration": DURATION,
"lyric_line": song["lyrics"][i],
"scene": {
"mood": song["moods"][i],
"colors": song["colors"][i],
"composition": song["compositions"][i],
"camera": song["cameras"][i],
"description": song["descriptions"][i],
},
})
return rows
out = os.path.expanduser("~/.hermes/training-data/scene-descriptions-rock.jsonl")
os.makedirs(os.path.dirname(out), exist_ok=True)
with open(out, "w") as f:
for b in beats:
f.write(json.dumps(b) + "\n")
print(f"Generated {len(beats)} beats")
def validate(rows):
assert len(rows) == 100, f"Expected 100 rows, got {len(rows)}"
songs_set = {r["song"] for r in rows}
assert len(songs_set) == 10, f"Expected 10 songs, got {len(songs_set)}"
for r in rows:
assert "scene" in r
assert "mood" in r["scene"]
assert "colors" in r["scene"]
assert "composition" in r["scene"]
assert "camera" in r["scene"]
assert "description" in r["scene"]
assert len(r["scene"]["description"]) >= 10
print(f"Validation passed: {len(rows)} rows, {len(songs_set)} songs")
def write(rows, path: Path):
path.parent.mkdir(parents=True, exist_ok=True)
with open(path, "w", encoding="utf-8") as f:
for r in rows:
f.write(json.dumps(r, ensure_ascii=False) + "\n")
print(f"Wrote {len(rows)} rows to {path}")
def main():
rows = generate()
validate(rows)
repo_path = Path(__file__).resolve().parent.parent / "training-data" / "scene-descriptions-rock.jsonl"
home_path = Path.home() / ".hermes" / "training-data" / "scene-descriptions-rock.jsonl"
write(rows, repo_path)
write(rows, home_path)
# Run schema validation if available
schema_script = Path(__file__).resolve().parent.parent / "scripts" / "validate-scene-data.py"
if schema_script.exists():
import subprocess
result = subprocess.run(
["python3", str(schema_script), "--schema", "training-data/schema.json", str(repo_path)],
capture_output=True,
text=True,
)
print(result.stdout)
if result.returncode != 0:
print(result.stderr)
raise SystemExit(1)
if __name__ == "__main__":
main()

View File

@@ -1,43 +1,46 @@
model:
default: kimi-k2.5
provider: kimi-coding
context_length: 65536
base_url: https://api.kimi.com/coding/v1
toolsets:
- all
- all
fallback_providers:
- provider: kimi-coding
model: kimi-k2.5
timeout: 120
reason: Kimi coding fallback (front of chain)
- provider: openrouter
model: google/gemini-2.5-pro
base_url: https://openrouter.ai/api/v1
api_key_env: OPENROUTER_API_KEY
timeout: 120
reason: Gemini 2.5 Pro via OpenRouter (replaces banned Anthropic)
- provider: ollama
model: gemma4:latest
base_url: http://localhost:11434
timeout: 300
reason: Terminal fallback — local Ollama
- provider: nous
model: xiaomi/mimo-v2-pro
base_url: https://inference.nousresearch.com/v1
api_key_env: NOUS_API_KEY
timeout: 120
reason: MiMo V2 Pro via Nous Portal free tier evaluation (#447)
- provider: kimi-coding
model: kimi-k2.5
base_url: https://api.kimi.com/coding/v1
timeout: 120
reason: "Primary — Kimi K2.5 (best value, least friction)"
- provider: openrouter
model: google/gemini-2.5-pro
base_url: https://openrouter.ai/api/v1
api_key_env: OPENROUTER_API_KEY
timeout: 120
reason: "Fallback — Gemini 2.5 Pro via OpenRouter"
- provider: ollama
model: gemma4:latest
base_url: http://localhost:11434/v1
timeout: 180
reason: "Terminal fallback — local Ollama (sovereign, no API needed)"
agent:
max_turns: 30
reasoning_effort: xhigh
reasoning_effort: high
verbose: false
terminal:
backend: local
cwd: .
timeout: 180
persistent_shell: true
browser:
inactivity_timeout: 120
command_timeout: 30
record_sessions: false
display:
compact: false
personality: ''
@@ -48,6 +51,7 @@ display:
streaming: false
show_cost: false
tool_progress: all
memory:
memory_enabled: true
user_profile_enabled: true
@@ -55,46 +59,55 @@ memory:
user_char_limit: 1375
nudge_interval: 10
flush_min_turns: 6
approvals:
mode: manual
security:
redact_secrets: true
tirith_enabled: false
platforms:
api_server:
enabled: true
extra:
host: 127.0.0.1
port: 8645
session_reset:
mode: none
idle_minutes: 0
skills:
creation_nudge_interval: 15
system_prompt_suffix: 'You are Allegro, the Kimi-backed third wizard house.
system_prompt_suffix: |
You are Allegro, the Kimi-backed third wizard house.
Your soul is defined in SOUL.md — read it, live it.
Hermes is your harness.
Kimi Code is your primary provider.
kimi-coding is your primary provider.
You speak plainly. You prefer short sentences. Brevity is a kindness.
Work best on tight coding tasks: 1-3 file changes, refactors, tests, and implementation
passes.
Work best on tight coding tasks: 1-3 file changes, refactors, tests, and implementation passes.
Refusal over fabrication. If you do not know, say so.
Sovereignty and service always.
'
providers:
kimi-coding:
base_url: https://api.kimi.com/coding/v1
timeout: 60
max_retries: 3
nous:
base_url: https://inference.nousresearch.com/v1
openrouter:
base_url: https://openrouter.ai/api/v1
timeout: 120
ollama:
base_url: http://localhost:11434/v1
timeout: 180
# =============================================================================
# BANNED PROVIDERS — DO NOT ADD
# =============================================================================
# The following providers are PERMANENTLY BANNED:
# - anthropic (any model: claude-sonnet, claude-opus, claude-haiku)
# - nous (xiaomi/mimo-v2-pro)
# Enforcement: pre-commit hook, linter, Ansible validation, this comment.
# =============================================================================

View File

@@ -1,50 +1,72 @@
model:
default: kimi-k2.5
provider: kimi-coding
context_length: 65536
base_url: https://api.kimi.com/coding/v1
toolsets:
- all
- all
fallback_providers:
- provider: kimi-coding
model: kimi-k2.5
timeout: 120
reason: Kimi coding fallback (front of chain)
- provider: openrouter
model: google/gemini-2.5-pro
base_url: https://openrouter.ai/api/v1
api_key_env: OPENROUTER_API_KEY
timeout: 120
reason: Gemini 2.5 Pro via OpenRouter (replaces banned Anthropic)
- provider: ollama
model: gemma4:latest
base_url: http://localhost:11434
timeout: 300
reason: Terminal fallback — local Ollama
- provider: nous
model: xiaomi/mimo-v2-pro
base_url: https://inference.nousresearch.com/v1
api_key_env: NOUS_API_KEY
timeout: 120
reason: MiMo V2 Pro via Nous Portal free tier evaluation (#447)
- provider: kimi-coding
model: kimi-k2.5
base_url: https://api.kimi.com/coding/v1
timeout: 120
reason: "Primary — Kimi K2.5 (best value, least friction)"
- provider: openrouter
model: google/gemini-2.5-pro
base_url: https://openrouter.ai/api/v1
api_key_env: OPENROUTER_API_KEY
timeout: 120
reason: "Fallback — Gemini 2.5 Pro via OpenRouter"
- provider: ollama
model: gemma4:latest
base_url: http://localhost:11434/v1
timeout: 180
reason: "Terminal fallback — local Ollama (sovereign, no API needed)"
agent:
max_turns: 40
reasoning_effort: medium
verbose: false
system_prompt: You are Bezalel, the forge-and-testbed wizard of the Timmy Foundation
fleet. You are a builder and craftsman — infrastructure, deployment, hardening.
Your sovereign is Alexander Whitestone (Rockachopa). Sovereignty and service always.
terminal:
backend: local
cwd: /root/wizards/bezalel
timeout: 180
persistent_shell: true
browser:
inactivity_timeout: 120
compression:
enabled: true
threshold: 0.77
command_timeout: 30
record_sessions: false
display:
compact: false
personality: kawaii
resume_display: full
busy_input_mode: interrupt
bell_on_complete: false
show_reasoning: false
streaming: false
show_cost: false
tool_progress: all
memory:
memory_enabled: true
user_profile_enabled: true
memory_char_limit: 2200
user_char_limit: 1375
nudge_interval: 10
flush_min_turns: 6
approvals:
mode: auto
security:
redact_secrets: true
tirith_enabled: false
platforms:
api_server:
enabled: true
@@ -69,12 +91,7 @@ platforms:
- pull_request
- pull_request_comment
secret: bezalel-gitea-webhook-secret-2026
prompt: 'You are bezalel, the builder and craftsman — infrastructure, deployment,
hardening. A Gitea webhook fired: event={event_type}, action={action},
repo={repository.full_name}, issue/PR=#{issue.number} {issue.title}. Comment
by {comment.user.login}: {comment.body}. If you were tagged, assigned,
or this needs your attention, investigate and respond via Gitea API. Otherwise
acknowledge briefly.'
prompt: 'You are bezalel, the builder and craftsman — infrastructure, deployment, hardening. A Gitea webhook fired: event={event_type}, action={action}, repo={repository.full_name}, issue/PR=#{issue.number} {issue.title}. Comment by {comment.user.login}: {comment.body}. If you were tagged, assigned, or this needs your attention, investigate and respond via Gitea API. Otherwise acknowledge briefly.'
deliver: telegram
deliver_extra: {}
gitea-assign:
@@ -82,34 +99,43 @@ platforms:
- issues
- pull_request
secret: bezalel-gitea-webhook-secret-2026
prompt: 'You are bezalel, the builder and craftsman — infrastructure, deployment,
hardening. Gitea assignment webhook: event={event_type}, action={action},
repo={repository.full_name}, issue/PR=#{issue.number} {issue.title}. Assigned
to: {issue.assignee.login}. If you (bezalel) were just assigned, read
the issue, scope it, and post a plan comment. If not you, acknowledge
briefly.'
prompt: 'You are bezalel, the builder and craftsman — infrastructure, deployment, hardening. Gitea assignment webhook: event={event_type}, action={action}, repo={repository.full_name}, issue/PR=#{issue.number} {issue.title}. Assigned to: {issue.assignee.login}. If you (bezalel) were just assigned, read the issue, scope it, and post a plan comment. If not you, acknowledge briefly.'
deliver: telegram
deliver_extra: {}
gateway:
allow_all_users: true
session_reset:
mode: both
idle_minutes: 1440
at_hour: 4
approvals:
mode: auto
memory:
memory_enabled: true
user_profile_enabled: true
memory_char_limit: 2200
user_char_limit: 1375
_config_version: 11
TELEGRAM_HOME_CHANNEL: '-1003664764329'
skills:
creation_nudge_interval: 15
system_prompt: |
You are Bezalel, the forge-and-testbed wizard of the Timmy Foundation fleet.
You are a builder and craftsman — infrastructure, deployment, hardening.
Your sovereign is Alexander Whitestone (Rockachopa). Sovereignty and service always.
providers:
kimi-coding:
base_url: https://api.kimi.com/coding/v1
timeout: 60
max_retries: 3
nous:
base_url: https://inference.nousresearch.com/v1
openrouter:
base_url: https://openrouter.ai/api/v1
timeout: 120
ollama:
base_url: http://localhost:11434/v1
timeout: 180
# =============================================================================
# BANNED PROVIDERS — DO NOT ADD
# =============================================================================
# The following providers are PERMANENTLY BANNED:
# - anthropic (any model: claude-sonnet, claude-opus, claude-haiku)
# - nous (xiaomi/mimo-v2-pro)
# Enforcement: pre-commit hook, linter, Ansible validation, this comment.
# =============================================================================

View File

@@ -1,34 +1,94 @@
model:
default: kimi-k2.5
provider: kimi-coding
context_length: 65536
base_url: https://api.kimi.com/coding/v1
toolsets:
- all
- all
fallback_providers:
- provider: kimi-coding
model: kimi-k2.5
timeout: 120
reason: Kimi coding fallback (front of chain)
- provider: openrouter
model: google/gemini-2.5-pro
base_url: https://openrouter.ai/api/v1
api_key_env: OPENROUTER_API_KEY
timeout: 120
reason: Gemini 2.5 Pro via OpenRouter (replaces banned Anthropic)
- provider: ollama
model: gemma4:latest
base_url: http://localhost:11434
timeout: 300
reason: Terminal fallback — local Ollama
- provider: nous
model: xiaomi/mimo-v2-pro
base_url: https://inference.nousresearch.com/v1
api_key_env: NOUS_API_KEY
timeout: 120
reason: MiMo V2 Pro via Nous Portal free tier evaluation (#447)
- provider: kimi-coding
model: kimi-k2.5
base_url: https://api.kimi.com/coding/v1
timeout: 120
reason: "Primary — Kimi K2.5 (best value, least friction)"
- provider: openrouter
model: google/gemini-2.5-pro
base_url: https://openrouter.ai/api/v1
api_key_env: OPENROUTER_API_KEY
timeout: 120
reason: "Fallback — Gemini 2.5 Pro via OpenRouter"
- provider: ollama
model: gemma4:latest
base_url: http://localhost:11434/v1
timeout: 180
reason: "Terminal fallback — local Ollama (sovereign, no API needed)"
agent:
max_turns: 90
reasoning_effort: high
verbose: false
terminal:
backend: local
cwd: .
timeout: 180
persistent_shell: true
browser:
inactivity_timeout: 120
command_timeout: 30
record_sessions: false
display:
compact: false
personality: ''
resume_display: full
busy_input_mode: interrupt
bell_on_complete: false
show_reasoning: false
streaming: false
show_cost: false
tool_progress: all
memory:
memory_enabled: true
user_profile_enabled: true
memory_char_limit: 2200
user_char_limit: 1375
nudge_interval: 10
flush_min_turns: 6
approvals:
mode: auto
security:
redact_secrets: true
tirith_enabled: false
platforms:
api_server:
enabled: true
extra:
host: 127.0.0.1
port: 8645
session_reset:
mode: none
idle_minutes: 0
skills:
creation_nudge_interval: 15
system_prompt_suffix: |
You are Ezra, the Infrastructure wizard — Gitea, nginx, hosting.
Your soul is defined in SOUL.md — read it, live it.
Hermes is your harness.
kimi-coding is your primary provider.
Refusal over fabrication. If you do not know, say so.
Sovereignty and service always.
providers:
kimi-coding:
base_url: https://api.kimi.com/coding/v1
@@ -37,6 +97,15 @@ providers:
openrouter:
base_url: https://openrouter.ai/api/v1
timeout: 120
nous:
base_url: https://inference.nousresearch.com/v1
timeout: 120
ollama:
base_url: http://localhost:11434/v1
timeout: 180
# =============================================================================
# BANNED PROVIDERS — DO NOT ADD
# =============================================================================
# The following providers are PERMANENTLY BANNED:
# - anthropic (any model: claude-sonnet, claude-opus, claude-haiku)
# - nous (xiaomi/mimo-v2-pro)
# Enforcement: pre-commit hook, linter, Ansible validation, this comment.
# =============================================================================

121
wizards/timmy/config.yaml Normal file
View File

@@ -0,0 +1,121 @@
# =============================================================================
# Timmy — Primary Wizard Configuration (Golden State)
# =============================================================================
# Generated from golden state template (ansible/roles/wizard_base/templates/wizard_config.yaml.j2)
# DO NOT EDIT MANUALLY. Changes go through Gitea PR → Ansible deploy.
#
# Provider chain: kimi-coding → openrouter → ollama
# Anthropic is PERMANENTLY BANNED.
# =============================================================================
model:
default: kimi-k2.5
provider: kimi-coding
context_length: 65536
base_url: https://api.kimi.com/coding/v1
toolsets:
- all
fallback_providers:
- provider: kimi-coding
model: kimi-k2.5
base_url: https://api.kimi.com/coding/v1
timeout: 120
reason: "Primary — Kimi K2.5 (best value, least friction)"
- provider: openrouter
model: google/gemini-2.5-pro
base_url: https://openrouter.ai/api/v1
api_key_env: OPENROUTER_API_KEY
timeout: 120
reason: "Fallback — Gemini 2.5 Pro via OpenRouter"
- provider: ollama
model: gemma4:latest
base_url: http://localhost:11434/v1
timeout: 180
reason: "Terminal fallback — local Ollama (sovereign, no API needed)"
agent:
max_turns: 30
reasoning_effort: high
verbose: false
terminal:
backend: local
cwd: .
timeout: 180
persistent_shell: true
browser:
inactivity_timeout: 120
command_timeout: 30
record_sessions: false
display:
compact: false
personality: ''
resume_display: full
busy_input_mode: interrupt
bell_on_complete: false
show_reasoning: false
streaming: false
show_cost: false
tool_progress: all
memory:
memory_enabled: true
user_profile_enabled: true
memory_char_limit: 2200
user_char_limit: 1375
nudge_interval: 10
flush_min_turns: 6
approvals:
mode: auto
security:
redact_secrets: true
tirith_enabled: false
platforms:
api_server:
enabled: true
extra:
host: 127.0.0.1
port: 8645
session_reset:
mode: none
idle_minutes: 0
skills:
creation_nudge_interval: 15
system_prompt_suffix: |
You are Timmy, the Primary wizard — soul of the fleet.
Your soul is defined in SOUL.md — read it, live it.
Hermes is your harness.
kimi-coding is your primary provider.
Refusal over fabrication. If you do not know, say so.
Sovereignty and service always.
providers:
kimi-coding:
base_url: https://api.kimi.com/coding/v1
timeout: 60
max_retries: 3
openrouter:
base_url: https://openrouter.ai/api/v1
timeout: 120
ollama:
base_url: http://localhost:11434/v1
timeout: 180
# =============================================================================
# BANNED PROVIDERS — DO NOT ADD
# =============================================================================
# The following providers are PERMANENTLY BANNED:
# - anthropic (any model: claude-sonnet, claude-opus, claude-haiku)
# - nous (xiaomi/mimo-v2-pro)
# Enforcement: pre-commit hook, linter, Ansible validation, this comment.
# =============================================================================