[claude] Vassal Protocol — Timmy as autonomous orchestrator (#1070) #1142
Reference in New Issue
Block a user
Delete Branch "claude/issue-1070"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Fixes #1070
What this implements
The Vassal Protocol core infrastructure — Timmy as lead decision-maker for development direction, agent management, and house health.
New module:
src/timmy/vassal/backlog.pydispatch.pyclaude-ready/kimi-readylabels + routing comments; in-memory dispatch registryagent_health.pyhouse_health.pyorchestration_loop.pyVassalOrchestrator: observe → triage → dispatch → monitor → house-check cycle; WebSocket broadcastConfig
Five new
vassal_*settings added toSettings— allFalse/off by default (safe to merge, enable when Qwen3-14B is loaded per #1064):vassal_enabled��� master switchvassal_cycle_interval— seconds between cycles (default 300)vassal_max_dispatch_per_cycle— cap on new dispatches per cyclevassal_stuck_threshold_minutes— silence threshold for stuck detectionvassal_idle_threshold_minutes— idle detection thresholdTests
40 new unit tests across 5 test files. All pass. All modules gracefully degrade when Gitea / Ollama are unavailable.
Implements the core Vassal Protocol infrastructure: Timmy as the lead decision-maker for development direction, agent management, and house health on Hermes (M3 Max). New module: src/timmy/vassal/ - backlog.py — Gitea backlog fetch, triage (priority scoring + agent routing: Claude / Kimi / Timmy-self) - dispatch.py — Apply claude-ready / kimi-ready labels and post routing comments; in-memory dispatch registry - agent_health.py — Detect idle/stuck agents (last-comment heuristic), nudge stuck issues via Gitea comment - house_health.py — System resource snapshot (disk, memory via psutil, Ollama reachability), stale-file cleanup - orchestration_loop.py — VassalOrchestrator: ties all four into a single observe→triage→dispatch→monitor→house-check cycle; runs as background asyncio task; broadcasts via WebSocket Config: five new vassal_* settings in Settings (all off by default: vassal_enabled, vassal_cycle_interval, vassal_max_dispatch_per_cycle, vassal_stuck_threshold_minutes, vassal_idle_threshold_minutes) Tests: 40 new unit tests across five test files — all pass. All gracefully degrade when Gitea / Ollama are unavailable. Refs #1070 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>