Install
openclaw skills install courtroomAI Courtroom for behavioral oversight. Autonomous daemon that monitors conversations, detects behavioral violations, and posts cases to a public API. Auto-starts on installation.
openclaw skills install courtroomAutonomous behavioral oversight system that monitors conversations in real-time, detects violations, and automatically files cases to a public API.
The Courtroom runs as a background daemon that:
npx clawhub install courtroom
The daemon auto-starts on installation. No manual intervention needed.
Edit ~/.openclaw/courtroom/config.json:
{
"apiEndpoint": "https://api.clawtrial.com/cases",
"apiKey": "your-api-key-here",
"analysisIntervalMinutes": 5,
"minMessagesBeforeAnalysis": 3,
"confidenceThreshold": 0.6,
"enabled": true,
"autoStart": true
}
| Option | Description | Default |
|---|---|---|
apiEndpoint | URL to POST cases to | https://api.clawtrial.com/cases |
apiKey | API authentication key | null |
analysisIntervalMinutes | How often to analyze | 5 |
confidenceThreshold | Minimum confidence to file case | 0.6 (60%) |
enabled | Whether daemon is active | true |
autoStart | Start on installation | true |
# Check status
courtroom-status
# Start daemon (if stopped)
courtroom-start
# Stop daemon
courtroom-stop
# Enable/disable auto-start
courtroom-enable
courtroom-disable
Your OpenClaw agent (or any system) sends messages to the daemon:
curl -X POST http://localhost:8765/message \
-H "Content-Type: application/json" \
-d '{"role":"user","content":"hello","timestamp":1234567890}'
Every 5 minutes (configurable), the daemon:
When a violation is detected (confidence ≥ 60%):
~/.openclaw/courtroom/verdict_*.json{
"caseId": "case-1772389381041",
"timestamp": "2026-03-01T18:23:01.041Z",
"offense": {
"offenseId": "validation_vampire",
"offenseName": "The Validation Vampire",
"severity": "minor",
"confidence": 0.8
},
"conversationSummary": {
"messageCount": 12,
"lastMessageTime": 1234567890
},
"source": "courtroom-daemon"
}
Add this to your OpenClaw agent to auto-send messages:
// In your agent's message handler
async function onMessage(message) {
// Send to courtroom daemon
await fetch('http://localhost:8765/message', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
role: message.role,
content: message.content,
timestamp: Date.now()
})
});
}
View daemon logs:
tail -f ~/.openclaw/courtroom/daemon.log
You can still run manual analysis:
# Analyze a conversation file
openclaw run courtroom --file conversation.json
┌─────────────┐ HTTP POST ┌─────────────────┐
│ OpenClaw │ ─────────────────> │ Courtroom │
│ Agent │ /message │ Daemon :8765 │
└─────────────┘ └────────┬────────┘
│
Every 5 min │
▼
┌───────────────┐
│ Analyze │
│ History │
└───────┬───────┘
│
Violation │
Detected ▼
┌───────────────┐
│ POST to API │
│ Save Local │
└───────────────┘
Daemon not starting?
courtroom-status
# Check if port 8765 is in use
lsof -i :8765
Change API endpoint?
# Edit config and restart
nano ~/.openclaw/courtroom/config.json
courtroom-stop
courtroom-start
View all cases?
ls ~/.openclaw/courtroom/verdict_*.json