- timmy-orchestrator.sh: 5-min cycle, assigns unassigned issues to claude,
reviews open PRs via qwen3:30b, merges/comments/closes as needed
- Single instance guard via pidfile
- ops-panel: shows Timmy status (Ollama model, last action)
- ops-helpers: ops-wake-timmy / ops-kill-timmy commands
- Timmy is the brain, Claude/Gemini/Kimi are the hands
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Pidfile guard prevents duplicate watchdog instances
- Removed check_zombies — was killing legitimate git push/clone from
active workers (caused mass exit 143 failures)
- Replaced with check_disk that cleans clone dirs >1hr old
- Disabled gemini loop check (no API key configured)
- Workers use fresh clone per issue (no shared worktree contention)
- Simplified cleanup to rm -rf (no git worktree bookkeeping)
- Tested file_issue end-to-end — confirmed working
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Workers now git clone --depth=1 per issue instead of sharing base repos
with worktrees. Eliminates all contention and branch collision errors.
- Watchdog file_issue uses temp file + sys.argv for safe JSON escaping
- Watchdog zombie detection only kills processes >5min old (was killing
legitimate git pushes from active workers)
- Simplified cleanup to plain rm -rf (no worktree bookkeeping needed)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Workers now pick ANY open issue (assigned to them OR unassigned) and
self-assign via Gitea API before starting work. No more empty queues.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 3 equal stacked feed panes on right (Kimi/Claude/Gemini)
- Gemini service status, stats, and queue in ops-panel
- Gemini live log feed with color highlighting
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- claude-loop.sh: use `env -u CLAUDECODE` before launching claude CLI
to prevent "nested session" detection error
- ops-helpers.sh: add gemini wake/kill/assign/queue commands (from user edit)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- claude-loop.sh: parallel dispatch loop (N workers, default 3) with
file-based locking, rate-limit detection + backoff, priority-sorted
issue picking across all Gitea repos, auto-merge on success
- ops-panel.sh: add Claude worker status, stats, and queue sections
- ops-helpers.sh: add ops-wake-claude, ops-kill-claude,
ops-assign-claude, ops-claude-queue commands
- ops-dashboard-v2.sh: 4-pane layout with dual Kimi + Claude feeds
- .gitignore: whitelist ops scripts for source control
- timmy-loopstat.sh: add to source control
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New:
kimi-loop.sh — Kimi Code CLI dispatch loop (fixed: no double logging,
idle state logs once then goes quiet, uses kimi not claude)
consolidated-cycle.sh — sonnet dev cycle (watchdog + dev + philosophy)
efficiency-audit.sh — zombie cleanup, plateau detection, recommendations
Fixes in kimi-loop.sh:
- log() writes to file only (no more double lines)
- idle queue logs once then goes silent until work appears
- all claude references removed, uses kimi CLI
Custom skin: ~/.hermes/skins/trismegistus.yaml
- Emerald Tablet color palette (sea green, emerald, gold)
- Alchemical spinner: transmuting, divining, consulting the tablet
- Mercury symbol (☿) throughout — prompt, response labels, wings
- Banner hero with AS ABOVE / SO BELOW motif
- Welcome: 'As above, so below. What needs doing?'
- Goodbye: 'The work continues. ☿'
- tower-hermes.sh: health check, pause file, exponential backoff, message held on failure
- tower-timmy.sh: same pattern for Ollama backend, messages held not lost
- timmy-loop.sh: pause after 2 consecutive cycle failures, backoff probe
- tower-watchdog.sh: respect .paused files, don't restart paused loops
Behavior:
1 failure → log warning, retry next turn
2 failures → enter pause, write .paused file, probe with backoff
Backend returns → auto-resume, clear pause file
Watchdog sees .paused → skip that loop, don't fight the pause
Messages from the other side → held in inbox, not lost
- FALSEWORK.md: Full audit of API costs per component, migration plan
for shifting load from Claude to local models incrementally
- start-dashboard.sh: Launches tmux layout with only zero-cost panes
active (status, loopstat). Loop and chat panes held until manual start.
- tower-timmy.sh: No changes (already source-controlled)
Falsework principle: build on cheap/local scaffolding, upgrade to
Claude only where quality demands it.
Session resume lines, tool traces, and session rename output
were leaking into the messages passed between agents. Added
grep filters to strip them from ask_hermes/ask_timmy output.
Also switched from set -e to avoid exits on non-zero from
first-run --continue calls.
Two-pane tmux session with file-based message passing:
- tower-hermes.sh: Hermes side (cloud/Claude)
- tower-timmy.sh: Timmy side (HERMES_HOME=~/.timmy)
- tower-watchdog.sh: self-healing, restarts dead panes
- tower-session.sh: tmux bootstrap script
Communication via ~/.tower/*.msg files.
Both agents maintain named sessions (tower-hermes, tower-timmy)
for conversation continuity across restarts.
Timmy doesn't have Gitea access in CLI chat mode. Instead of asking
him to check for PRs (which he can't), we fetch the latest merged PR
and commit summary ourselves and ask for his opinion on the change.
- Kimi writes to files in place, not stdout — check git diff after
- Ideal scope: one focused task per invocation with file paths + context
- Parallel: run multiple kimi tasks with & and wait, no rate limits
- Cycles can now tackle 1-3 issues if independent
- Re-emphasized: do NOT write code yourself, delegate to Kimi
16 cycles, zero actual Kimi invocations. Hermes kept deciding
every fix was 'surgical' and burning Anthropic tokens on everything.
New prompt: delegation is MANDATORY, not optional. Only exception
is changes under 5 lines. If Hermes catches itself writing code,
it must stop and delegate.