Step-by-step procedures for operating and troubleshooting the OpenClaw Predicate-Claw Plugin in production environments.
Keep this runbook handy for incident response and routine operations.
| Incident Type | Severity | First Response |
|---|---|---|
| Circuit breaker open | P1 | Check sidecar health |
| Elevated deny rate | P2 | Compare to policy changes |
| High latency | P3 | Check sidecar resources |
| Audit export failures | P4 | Check control plane connectivity |
Before using this runbook, ensure you have:
predicate-authorityd)Symptoms:
CircuitOpenError in provider logspredicate_circuit_state = openDiagnosis Steps:
Check sidecar health
curl -s http://localhost:8787/health | jq .Expected: {"status": "healthy"}
Check sidecar logs for errors
journalctl -u predicate-authorityd -n 100 --no-pager
# or
docker logs predicate-authorityd --tail 100Verify network connectivity
curl -w "@curl-format.txt" -s -o /dev/null http://localhost:8787/healthCheck control plane sync status
curl -s http://localhost:8787/v1/sync/status | jq .Resolution Steps:
If sidecar is unhealthy:
# Restart sidecar
systemctl restart predicate-authorityd
# or
docker restart predicate-authoritydIf sidecar is healthy but circuit is still open:
resetTimeoutMs (default: 30s)If control plane sync is failing:
Escalation:
Symptoms:
denied_by_policy reason code spikeDiagnosis Steps:
Check deny rate trend
# Query recent deny events
curl -s "http://localhost:8787/v1/audit/decisions?outcome=deny&limit=50" | jq .Compare to recent policy changes
Identify affected actions/resources
# Group denials by action
curl -s "http://localhost:8787/v1/audit/decisions?outcome=deny" | \
jq -r '.items | group_by(.action) | map({action: .[0].action, count: length})'Check for attack patterns
Resolution Steps:
If caused by policy change:
If attack attempt:
If false positives:
Escalation:
Symptoms:
Diagnosis Steps:
Check current latency percentiles
curl -s http://localhost:8787/metrics | grep predicate_auth_latencyCheck sidecar resource usage
# CPU and memory
top -p $(pgrep predicate-authorityd)
# or
docker stats predicate-authorityd --no-streamCheck control plane sync load
curl -s http://localhost:8787/v1/sync/status | jq '.last_sync_duration_ms'Check concurrent request volume
curl -s http://localhost:8787/metrics | grep predicate_auth_concurrentResolution Steps:
If sidecar CPU is high:
If sync is slow:
If high concurrent load:
Escalation:
Symptoms:
audit_export_failure in logspredicate_audit_failures counterDiagnosis Steps:
Check export error logs
grep "audit.*error" /var/log/provider.log | tail -20Verify control plane connectivity
curl -s https://control-plane.example.com/healthCheck export queue depth
curl -s http://localhost:8787/metrics | grep predicate_audit_queueResolution Steps:
If control plane unreachable:
If queue is backed up:
If credentials expired:
Escalation:
# Graceful restart (allows in-flight requests to complete)
systemctl reload openclaw-provider
# Full restart
systemctl restart openclaw-providerFor high-load environments:
baseUrl to load balancer# Local provider health
curl -s http://localhost:3000/health
# Expected response
{
"status": "healthy",
"sidecar": "connected",
"circuit": "closed"
}# Sidecar health
curl -s http://localhost:8787/health
# Expected response
{
"status": "healthy",
"policy_version": "v1.2.3",
"last_sync": "2026-02-20T12:00:00Z"
}# Test authorization flow
curl -X POST http://localhost:8787/v1/authorize \
-H "Content-Type: application/json" \
-d '{
"principal": "test:health-check",
"action": "health.check",
"resource": "system"
}'
# Expected: allow decision for health check action| Role | Contact |
|---|---|
| On-call engineer | PagerDuty: predicate-oncall |
| Platform team | Slack: #predicate-platform |
| Security team | Slack: #security-incidents |
| Control plane status | https://status.predicatesystems.ai |
# View real-time logs
journalctl -u predicate-authorityd -f
# Check process status
systemctl status predicate-authorityd
# View metrics
curl -s http://localhost:8787/metrics
# Force policy sync
curl -X POST http://localhost:8787/v1/sync/trigger
# Get current policy version
curl -s http://localhost:8787/v1/policy/version| Component | Log Path |
|---|---|
| Provider | /var/log/openclaw-provider/provider.log |
| Sidecar | /var/log/predicate-authorityd/sidecar.log |
| Audit events | /var/log/predicate-authorityd/audit.jsonl |
| Component | Config Path |
|---|---|
| Provider | /etc/openclaw-provider/config.yaml |
| Sidecar | /etc/predicate-authorityd/config.yaml |
| Policy | Managed via control plane |