sac and orochi
scitex-agent-container (sac) and scitex-orochi
are two separate packages with a one-way dependency: orochi reads from sac; sac never imports orochi.
Architecture
┌────────────────────┐ ┌──────────────────────┐
│ Human operator │ chat · DM · channel │ claude-code- │
│ (web UI / CLI) │ ◄───── alerts ─────── │ telegrammer │
└─────────┬──────────┘ │ Telegram MCP + TUI │
│ └──────────▲───────────┘
▼ │
┌──────────────────────────────────┐ │
│ scitex-orochi │ │
│ WebSocket hub · dashboard │ │
│ MCP channels · presence · A2A │ │
│ peer registry · cross-host │ │
└─────────────────┬────────────────┘ │
│ reads status │
│ (one-way dep: orochi → sac) │
▼ │
┌──────────────────────────────────┐ │
│ scitex-agent-container (sac) │ │
│ lifecycle · health · restart │ │
│ apptainer runtime · per host │ │
│ (zero knowledge of orochi) │ │
└─────────────────┬────────────────┘ │
│ starts / supervises │
▼ │
┌──────────────────────────────────┐ │
│ Claude agents (one per host) │ ── heartbeat-push ──▶ orochi
│ session.jsonl · SDK │ ── alerts ─────────────┘
└──────────────────────────────────┘
Responsibility split
Concern |
Owner |
|---|---|
Agent process (SDK + session.jsonl) |
sac |
Per-host control plane (start/stop/send/tail/list) |
sac |
Container runtime (apptainer) |
sac |
Per-agent local inbox ( |
sac |
In-session push (MCP channel server |
sac — connects to local |
Cross-host message routing |
orochi |
Human chatops UI (Slack-like web interface) |
orochi |
SSH mesh / tunnel layer (cloudflared + autossh) |
orochi |
Peer registry |
orochi ( |
Rule: sac owns containers + sessions + the local channel primitive on one host; orochi owns messages + people + transport across hosts. server:orochi-push remains orochi’s own MCP channel (for orochi-mediated cross-host topics + chat); server:sac is sac’s local primitive that any peer reaches by POSTing to the host’s sac listen — whether the network in between is orochi-mediated, an operator’s SSH tunnel, or nothing at all (same host).
How orochi consumes sac
orochi reads ~/.scitex/agent-container/runtime/<name>/heartbeat.json and
session.jsonl from each host it manages. It never calls sac CLI commands
directly — the contract is the on-disk state files.
Agents push heartbeats and alerts to orochi via the server:orochi-push MCP
channel, configured in spec.claude.channels:
spec:
claude:
channels:
- server:orochi-push
Standalone use
sac works fully without orochi. If you don’t need cross-host chatops, just
omit server:orochi-push from spec.claude.channels and skip the orochi
install entirely.