Date: 2026-06-17
Scope: bot/ - every Telegram/agent surface in the ZAOOS monorepo
Trigger: "bots terminal" session - full audit before resuming ZOE social builds
Tier: INFRA / AGENTS
Companion to doc 601 (agent-stack cleanup decision) and the bot/REGISTRY.md
inventory. This is a point-in-time health check of the running fleet.
| Bot | Handle | Dir | Files | Status | Tests | Top risk |
|---|---|---|---|---|---|---|
| ZOE | @zaoclaw_bot |
bot/src/zoe/ |
~87 | ACTIVE | 19 files | memory-block sync; 50-call/day cap not enforced |
| Hermes | @zoe_hermes_bot |
bot/src/hermes/ |
11 | ACTIVE | 0 | no tests on coder/critic loop + cost cap |
| ZAO Devz | @zaodevz_bot |
bot/src/devz/ |
1 | ACTIVE | 0 | dual-bot coupling; loopback HTTP :3007 |
| ZAOstock | @ZAOstockTeamBot |
bot/src/ (root) |
~23 | ACTIVE / graduating | 0 | snapshot deploy drift; weak 4-char auth |
| Team bots (Magnetiq/AttaBotty) | @zao_magnetiq_bot, @z_attabotty_bot |
bot/src/teams/ |
5 | DORMANT (decommissioned) | 0 | lingering decommissioned code |
| Fleet agent | (none) | bot/src/fleet-agent/ |
1 | STAGED / disabled | 0 | enable deliberately only |
| Bonfire | @zabal_bonfire |
external (bonfires.ai) | - | ACTIVE | - | recall is manual relay, no SDK |
| DeepMeeting | @zdeepmeeting_bot |
external | - | DEGRADED | - | group routing broken |
All on-VPS bots share the Hermes pattern: LLM calls go through
bot/src/hermes/claude-cli.ts -> Claude Code CLI on Max-plan OAuth (no API key
in process env). Three systemd --user units on zaal@31.97.148.88:
zoe-bot, zao-devz-stack (Devz + Hermes in one process), zaostock-bot.
- CRITICAL - Untracked snapshot deploy drift. Hermes + Devz + ZAOstock run
from
~/zaostock-bot, which is not a git checkout - it's a hand-patched snapshot that can silently diverge frommain. Not reproducible, no audit trail. Fix: convert to a real checkout or a tagged release + deploy script. - HIGH - ZOE VPS on a stale feature branch.
~/zao-ostracks an oldclaude/*branch; merged PRs onmainaren't deployed. Fix: point at the canonical ZOE branch and fast-forward (usescripts/zoe-deploy.sh, which exists precisely to prevent the per-file drift that crashed the bot 2026-06-15). - HIGH - Decommissioned code lingering.
bot/src/teams/(Magnetiq/AttaBotty) is dormant + decommissioned per doc 601 but still in-tree. Same for FISHBOWLZ references outsidebot/. Fix: delete or formally un-decommission with a doc. - MEDIUM - Zero tests on Hermes core. The coder->critic retry loop, cost cap
(
fleetDailyGuardis an in-memory counter that resets on restart), and the risk-pattern/secret detector are all untested. Fix: addrunner+typestests. - MEDIUM - ZOE 50-call/day cap is documented but not enforced. No counter in the concierge path; the "alert if exceeded" never fires. Fix: per-day counter in the turn path with a warn + soft-block.
- MEDIUM - Secret-hygiene guards are partial.
.envis gitignored and Hermes detects some risk patterns, but there is no pre-commit hook (guard 2) and the detector misses PEM blocks and thesk-ant-Anthropic key shape. Fix: add a.husky/pre-commitrunning the doc-473 step-2 scan; widen the regex set. - MEDIUM - Bonfire recall is manual relay, not SDK.
recall.tshardcodes the relay path; a Bonfire API change blinds ZOE. Off-VPS bots have no heartbeat to the cowork board. Fix: migrate once the SDK lands; add a VPS relay heartbeat. - LOW - Unstructured logging. ~167
console.log/warn/erroracross the fleet - fine for the systemd journal, but no severity/context. Fix: thin structured logger.
Mature, the most-developed surface. Per-turn model is a single synchronous
runConciergeTurn (one Claude CLI call) with a typing refresh + one 6s "Got it,
working" ack. Multi-step work goes through dispatch.ts/decompose.ts with a
onSubtaskStart progress hook and a y/n ambiguity gate. Memory is a Letta-style
4-block builder (persona.md, human.md, recent/<chat>.json, tasks.json).
Good test coverage on the hard logic (decompose, dispatch, reflexion, extractors,
pii); gaps on memory.ts, concierge.ts, scheduler.ts. The posts/ social
drafter is its own subsystem (see Decision below).
Lean, integration-focused, no standalone entry - invoked via /fix in the Devz
chat or a loopback HTTP dispatch. Coder (Opus) + Critic (Sonnet), retry to 3, PR
on score >=70. Solid risk-pattern guard in types.ts. Zero tests; cost accounting
is "notional" (public API pricing, but Max plan is flat-fee) and the daily guard
is non-persistent.
Two grammY bots in one process narrating the Hermes loop as Coder/Critic. Clean,
well-guarded loopback HTTP listener on 127.0.0.1:3007 (x-hermes-secret, strict
path validation). Tight coupling: if either token dies, narration breaks. Phase 3
plan is to fold into Hermes.
Festival coordination; graduating to its own repo. Monolithic command dispatch, Supabase-backed. Weak 4-char login codes, fragile freeform-text action parser, still references Minimax/Ollama for classification (should move to the Claude CLI path the rest of the fleet uses).
teams/ is dormant + decommissioned - delete or re-doc. fleet-agent/ is a
deliberately-disabled host supervisor with a hard-coded systemctl allowlist and no
shell interpolation; safe, enable only on purpose.
This audit accompanied two ZOE social-drafter builds:
- Build 1 (shipped this session): ZOE now surfaces the single best post
draft instead of a backlog of up to 30. New
posts/select-best.tsjudges the day's drafts (LLM judge + heuristic fallback, fresh-window filter) and both the daily notice and/draftssurface one winner, archiving the rest. See the PR. - Build 2 (doc 872 - effectiveness): non-blocking clarify, live steering, progress narration. Scoped against the actual turn model above; tracked separately because doc 872 itself lives off-repo (local only) and live-steering is a concurrency change to the turn loop.
- Sub-agent fleet sweep, 2026-06-17 (this session).
- Cross-ref: doc 601 (agent-stack cleanup),
bot/REGISTRY.md,.claude/rules/secret-hygiene.md(doc 473).