James Backbone (Redis + Watcher)
This folder implements the James event backbone and initial agents.
Implementation docs
docs/AI_ACTION_PLAN.mddocs/ARCHITECTURE.mddocs/EVENTS.mddocs/JAMES_REVIEW.mddocs/MAIL_AGENT.mddocs/NODES.mddocs/POLICY.mddocs/VOICE.md
Quick Start (Redis)
Redis runs as a native systemd service (redis-server.service). Auth and persistence are configured:
redis-cli -a "$REDIS_PASSWORD" ping
Credentials are in james/.env (gitignored).
Logging
All components use structured JSON logging to stderr (captured by systemd journal).
Output format (one JSON object per line):
{
"ts": "2026-02-04T20:32:36+0100",
"level": "info",
"component": "james.watcher",
"msg": "started",
"channel": "james.events.system"
}
Set JAMES_LOG_LEVEL to DEBUG, INFO, WARNING, or ERROR (default: INFO).
View logs via journalctl:
journalctl --user -u james-watcher -f
journalctl --user -u james-analyst --since "1 hour ago"
journalctl --user -u james-audit --priority=err
Watcher (single node)
- Install deps:
pip install -r requirements.txt
- Run watcher:
PYTHONPATH=~/clawd/workspace \
JAMES_NODE=main-host JAMES_ROLE=storage \
REDIS_URL=redis://:yourpass@127.0.0.1:6379/0 \
python3 james/agents/watcher/watcher.py
Pub/Sub test
Terminal A:
PYTHONPATH=~/clawd/workspace REDIS_URL=redis://:yourpass@127.0.0.1:6379/0 \
python3 james/tools/subscribe_events.py
Terminal B:
PYTHONPATH=~/clawd/workspace REDIS_URL=redis://:yourpass@127.0.0.1:6379/0 \
python3 james/tools/publish_event.py --type system.metrics --severity low --payload '{"test":true}'
Audit logger
Subscribes to all channels and writes JSON lines to james/audit/audit.log.
PYTHONPATH=~/clawd/workspace REDIS_URL=redis://:yourpass@127.0.0.1:6379/0 \
python3 james/tools/audit_logger.py
Analyst (local LLM)
Consumes james.events.* and publishes decisions to james.decisions.
PYTHONPATH=~/clawd/workspace \
JAMES_NODE=main-host \
REDIS_URL=redis://:yourpass@127.0.0.1:6379/0 \
OLLAMA_MODEL=qwen2.5-coder \
python3 james/agents/analyst/analyst.py
Policy engine
Consumes james.decisions and emits james.actions with approval/deny/allow outcomes.
PYTHONPATH=~/clawd/workspace \
JAMES_NODE=main-host \
REDIS_URL=redis://:yourpass@127.0.0.1:6379/0 \
python3 james/agents/policy/policy_engine.py
Mail Agent (dry-run)
Reads mail fixtures and emits mail.* events to james.events.mail.
PYTHONPATH=~/clawd/workspace \
JAMES_MAIL_DRY_RUN=1 JAMES_MAIL_STDOUT=1 \
python3 james/agents/mail/mail_agent.py --dry-run
Voice Stub
Consumes actions/decisions and emits voice.* events to james.events.voice.
PYTHONPATH=~/clawd/workspace \
python3 james/agents/voice/voice_stub.py --stdout
Systemd (optional)
systemd/james-redis.serviceruns the docker compose stack (not needed if using native redis).agents/watcher/systemd/james-watcher.serviceruns the watcher.agents/analyst/systemd/james-analyst.serviceruns the analyst.agents/policy/systemd/james-policy.serviceruns the policy engine.agents/mail/systemd/james-mail.serviceruns the mail agent.agents/voice/systemd/james-voice.serviceruns the voice stub.tools/systemd/james-audit.serviceruns the audit logger.
Install a unit:
cp agents/watcher/systemd/james-watcher.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now james-watcher
All services log structured JSON to the systemd journal.