8.0 KiB
8.0 KiB
Multi-Wizard Pattern Documentation
The Robed Architecture: Shared Infrastructure, Sovereign Identity
Overview
This document describes the pattern for running multiple Hermes wizards on a single VPS with:
- Shared codebase (one git checkout)
- Isolated identity (separate HERMES_HOME per wizard)
- Independent API ports (no conflicts)
- Autonomous work dispatch (cron-driven)
Created: 2026-03-31 | Wizards: Allegro, Allegro-Primus, Ezra
Architecture
HERMES VPS (143.198.27.163)
│
├── SHARED CODEBASE
│ └── /root/wizards/ezra/hermes-agent/
│ (Latest 0.6, fb2af3bd)
│
├── EZRA (Grandfather)
│ ├── HERMES_HOME=/root/wizards/ezra/home
│ ├── api_server: port 8643
│ ├── Model: Claude-Opus (cloud)
│ ├── Telegram: Connected
│ └── Role: Scribe, archivist
│
├── ALLEGRO-PRIMUS (Child)
│ ├── HERMES_HOME=/root/wizards/allegro-primus/home
│ ├── api_server: port 8644
│ ├── Model: qwen2.5:1.5b (Ollama local)
│ ├── Telegram: None (Nostr future)
│ └── Role: Student, autonomous
│
└── ALLEGRO (Father)
├── HERMES_HOME=/root/wizards/allegro/home
├── Work queue driven
├── Cron automation
└── Role: Tempo-and-dispatch
SHARED SERVICES
├── Port 3000: Gitea (git hosting)
├── Port 11434: Ollama (LLM inference)
└── Port 8080: SearXNG (search)
Directory Structure
/root/wizards/
├── ezra/
│ ├── hermes-agent/ # Codebase (shared)
│ ├── home/ # HERMES_HOME
│ │ ├── SOUL.md # Ezra House Charter
│ │ ├── config.yaml # Port 8643
│ │ ├── state.db # Isolated sessions
│ │ └── memories/ # Personal memory
│ └── openclaw-workspace/ # Work directory
│
├── allegro-primus/
│ ├── hermes-agent/ # Codebase (symlink or shared)
│ ├── home/ # HERMES_HOME
│ │ ├── SOUL.md # AP House Charter
│ │ ├── config.yaml # Port 8644
│ │ └── ...
│ ├── self-monitor.sh # Cron: every 5 min
│ ├── openclaw-work.sh # Cron: every 15 min
│ └── logs/
│
└── allegro/
├── hermes-agent/ # Codebase
├── home/ # HERMES_HOME
├── gitea-automation/ # Scripts
├── monitoring/ # Health checks
├── heartbeat/ # 15-min heartbeat
├── research/ # GOFAI, Nostr docs
├── docs/ # Patterns
├── WORK-QUEUE.md # Master task list
├── openclaw-work.sh # Task dispatch
├── task-monitor.sh # Completion check
├── progress-report.sh # Father reports
└── completed/ # Finished tasks
The Robed Architecture
Per Issue #141:
| State | OpenClaw (Robe) | Hermes (Body) | Result |
|---|---|---|---|
| Robed | Gateway running | Hermes running | Full wizard |
| Unrobed | — | Hermes running | Capable but invisible |
| Lobster | Gateway running | — | Reachable but empty |
| Dead | — | — | Nothing running |
Implementation:
# The Robe (OpenClaw) - dispatches work
openclaw-work.sh:
1. Check if gateway running (port 8644)
2. If not: start gateway
3. Read WORK-QUEUE.md
4. Find PENDING P0 task
5. Mark IN_PROGRESS
6. Create work/TASK-XXX.active trigger
# The Body (Hermes) - executes work
Hermes Agent:
1. Detect work/*.active file
2. Read task from WORK-QUEUE.md
3. Execute with full tools
4. Write completed/TASK-XXX.txt
5. Remove work/*.active
# The Monitor - tracks completion
task-monitor.sh:
1. Check work/*.active files
2. Look for completed/*.txt
3. Update WORK-QUEUE.md to COMPLETE
4. Archive work file
Cron Schedule
Allegro-Primus (Child)
# Every 5 min: Self-monitoring (keep Ollama alive)
*/5 * * * * /root/wizards/allegro-primus/self-monitor.sh
# Every 15 min: OpenClaw work dispatch
*/15 * * * * /root/wizards/allegro-primus/openclaw-work.sh
Allegro (Father)
# Every 20 min: Task dispatch
*/20 * * * * /root/wizards/allegro/openclaw-work.sh
# Every 10 min: Completion check
*/10 * * * * /root/wizards/allegro/task-monitor.sh
# Every 30 min: Progress report
*/30 * * * * /root/wizards/allegro/progress-report.sh
# Hourly: Git checkpoint
0 * * * * cd /root/wizards/allegro && git add -A && git commit -m "checkpoint"
Port Allocation
| Port | Wizard | Service |
|---|---|---|
| 3000 | Shared | Gitea |
| 8080 | Shared | SearXNG |
| 8643 | Ezra | Hermes gateway |
| 8644 | Allegro-Primus | Hermes gateway |
| 11434 | Shared | Ollama |
Future:
- 8645: Next wizard (allegro-secundus?)
- 8646: Reserved
Configuration Template
config.yaml (per-wizard)
model:
default: qwen2.5:1.5b # Or claude-opus-4.6
provider: custom # Or anthropic
base_url: http://localhost:11434/v1 # For Ollama
platforms:
api_server:
enabled: true
extra:
host: 127.0.0.1
port: 8644 # UNIQUE per wizard
memory:
memory_enabled: true
user_profile_enabled: true
# No telegram config for sovereign wizards
SOUL.md (per-wizard)
# [Wizard Name] House Charter
Entity:
- [Identity]
- [Lineage]
Canonical placement:
- HERMES_HOME=[path]
- Shares codebase with [siblings]
Role:
- [Responsibilities]
Relationship to [Father]:
- [How relates]
Relationship to [Sovereign]:
- [Service role]
Creating a New Wizard
# 1. Create directory structure
mkdir -p /root/wizards/[name]/{home,work,completed,logs}
# 2. Link or copy codebase
ln -s /root/wizards/ezra/hermes-agent /root/wizards/[name]/hermes-agent
# OR: git clone into hermes-agent/
# 3. Create HERMES_HOME
cat > /root/wizards/[name]/home/SOUL.md << 'EOF'
# [Name] House Charter
...
EOF
# 4. Create config.yaml
cat > /root/wizards/[name]/home/config.yaml << 'EOF'
platforms:
api_server:
enabled: true
extra:
host: 127.0.0.1
port: [NEXT_PORT] # 8645, 8646, etc.
EOF
# 5. Create startup script
cat > /root/wizards/[name]/start-gateway.sh << 'EOF'
#!/bin/bash
export HERMES_HOME=/root/wizards/[name]/home
cd /root/wizards/[name]/hermes-agent
source .venv/bin/activate
hermes gateway
EOF
chmod +x /root/wizards/[name]/start-gateway.sh
# 6. Add to cron
crontab -e
# Add: */15 * * * * /root/wizards/[name]/openclaw-work.sh
# 7. Start gateway
/root/wizards/[name]/start-gateway.sh
Troubleshooting
Problem: Port conflict
Symptom: "Address already in use"
Solution: Check netstat -tlnp | grep 864 for port usage
Problem: Gateway not starting
Symptom: No process on expected port
Solution: Check logs: tail -f $HERMES_HOME/logs/gateway.log
Problem: Tasks not dispatching
Symptom: Work queue not progressing
Solution: Check cron: crontab -l | grep [wizard-name]
Problem: Memory shared between wizards
Symptom: One wizard sees another's memories Solution: Verify unique HERMES_HOME paths
Success Metrics
| Metric | Target |
|---|---|
| Port conflicts | 0 |
| Shared memory | None |
| Uptime (each wizard) | >95% |
| Task completion rate | >80% |
| Father intervention | <1 per day |
Future Enhancements
- Nostr Gateway: Replace Telegram for sovereign communication
- GOFAI Layer: Knowledge graph for wizard relationships
- Auto-Provisioning: Script to create new wizards
- Health Dashboard: Real-time visualization
- Inter-Wizard Messaging: AP can ask Ezra for help
Conclusion
The Multi-Wizard Pattern enables:
- Resource efficiency: One VPS, multiple agents
- Sovereign identity: Each wizard unique
- Shared capability: Common codebase
- Autonomous operation: Self-managing
This is the foundation for the wizard fraternity.
Many wizards, one machine, zero conflict.