Operations Runbook

June 4, 2026 · View on GitHub

Day-to-day operational procedures and incident response for Hermes Ops Kit.

Health Checks

# Full diagnostic
hermes-key-rotate --doctor-secrets

# Secret backend health
hermes-key-rotate --secret-backend vaultwarden --healthcheck

# Key rotation status (fingerprints + age)
hermes-key-rotate --status

# Usage overview
hermes-usage --verbose

# Image routes health
hermes-ops-kit image doctor

What to Check Daily

CheckCommandHealthy Signal
Bitwarden/Vaultwarden reachablehermes-key-rotate --healthcheckbackend: ok
All provider keys presenthermes-key-rotate --statusAll refs show fingerprints
No expired sessionshermes-key-rotate --statusBW_SESSION valid
Image routes readyhermes-ops-kit image routesAll routes READY
No quota exhaustionhermes-usage --limitsAll providers within limits

Incident Response

Incident: Key Compromised

# 1. Immediate rotation with emergency flag
echo "sk-new-key" | hermes-key-rotate rotate --provider <provider> --manual-new-key-stdin --emergency

# 2. Verify new key works
hermes-key-rotate --status --provider <provider>

# 3. Regenerate env
hermes-key-rotate --render-env

# 4. Check all providers still functional
hermes-usage --json | python3 -c "import json,sys; d=json.load(sys.stdin); [print(f'{p}: {v[\"status\"]}') for p,v in d.get('providers',{}).items()]"

Incident: Bitwarden/Vaultwarden Unreachable

# 1. Check connectivity
curl -I $VAULTWARDEN_SERVER_URL

# 2. Try re-authentication
hermes-key-rotate --secret-backend vaultwarden --unlock

# 3. If server is down, use cached .env.generated
# Hermes reads .env.generated directly — keys remain usable
cat ~/.hermes/.env.generated  # verify it exists and is recent

Incident: Provider Rate Limited

# 1. Check which provider
hermes-usage --limits

# 2. Switch to fallback route
hermes-route-manager apply-profile cheap

# 3. Monitor recovery
hermes-usage --compact  # re-run until limits clear

Incident: Image Generation Failing

# 1. Diagnose all backends
hermes-ops-kit image doctor

# 2. If local ComfyUI is down
hermes-ops-kit image set-default fast  # switch to Gemini cloud

# 3. Test
hermes-ops-kit image test "test prompt" --route fast

Recovery Procedures

Restore from Rotation Failure

# Check rotation state
hermes-key-rotate --status --provider <provider>

# Resume interrupted rotation
hermes-key-rotate resume --provider <provider>

# Force rollback if stuck
hermes-key-rotate rollback --provider <provider>

Regenerate .env.generated

# If .env.generated is missing or corrupted
hermes-key-rotate --unlock         # ensure session is valid
hermes-key-rotate --render-env     # regenerate

Restore Config from Backup

# Config patches create .bak automatically
cp ~/.hermes/config.yaml.bak ~/.hermes/config.yaml
cp ~/.hermes/ops-kit/image_routes.yaml.bak ~/.hermes/ops-kit/image_routes.yaml

Log Locations

LogPathRotation
Key rotation audit~/.hermes/key-rotation-audit.jsonlAppend-only
Assistant delegation~/.hermes/assistants/audit.jsonlAppend-only
Task lifecycle~/.hermes/assistants/tasks.sqliteSQLite
Audit events~/.hermes/ops-kit/audit/events.jsonlAppend-only
Rotation checkpoints~/.hermes/rotation_checkpoints/<provider>.jsonOverwritten per rotation

Lock Files

Per-provider advisory locks prevent concurrent rotations:

# Check for stale locks
ls -la ~/.hermes/locks/

# Locks auto-clean on process exit — manual removal only if process crashed
rm ~/.hermes/locks/<provider>.lock
  • [[Architecture]] — module architecture and data flows
  • [[Hermes Compatibility]] — Hermes integration and security model
  • [[Threat Model]] — threat analysis and mitigations
  • [[Key Management Lifecycle]] — full secret lifecycle, rotation modes, revocation matrix
  • [[Quickstart]] — getting started guide