- Update CONTRIBUTING.md to require only 1 approving review instead of 2
- Allow self-approval including for automated bot PRs (HAL9000)
- Approval can be formal review OR approval comment (LGTM, Approved, ✅)
- Remove distinction between human and bot PRs in review requirements
- Update agent definitions to reflect new policy
- Update system watchdog and documentation to match new requirements
This change unblocks PR merges while maintaining quality through CI checks
and still requiring at least one approval before merge.
11 KiB
System Watchdog
The System Watchdog (ca-system-watchdog) is the 16th supervisor agent in the
CleverAgents autonomous build system. It runs continuously with a 5-minute polling
cycle and monitors the entire agent ecosystem for correctness, health, and policy
compliance.
Audience: Contributors and operators who need to understand how the autonomous agent system is monitored, what violations are detected, and how the watchdog responds to findings.
Overview
The watchdog operates exclusively through the Forgejo API and the OpenCode Server HTTP API — it does not clone the repository or access the filesystem. It performs 12 audits per cycle, ranging from quality gate compliance to deep session introspection of individual supervisor conversations.
cycle = 0
LOOP FOREVER (5-minute intervals):
cycle += 1
findings = []
findings += audit_quality_gates() # Audit 1 — MOST CRITICAL
findings += audit_branch_protection() # Audit 2
findings += audit_ticket_states() # Audit 3
findings += audit_priority_ordering() # Audit 4
findings += audit_pr_pipeline() # Audit 5
findings += audit_supervisor_health() # Audit 6 (session introspection)
findings += audit_labels_and_dependencies() # Audit 7
findings += audit_ticket_hierarchy() # Audit 8
findings += audit_test_health() # Audit 9
findings += audit_improvement_generation() # Audit 10
findings += audit_session_spot_check() # Audit 11 (every cycle)
if cycle % 6 == 0:
findings += audit_deep_session_introspection() # Audit 12 (every 30 min)
for finding in findings:
take_action(finding)
if cycle % 6 == 0 and findings:
post_summary(cycle, findings)
sleep(300) # 5 minutes
Audit Descriptions
Audit 1 — Quality Gate Compliance (CRITICAL)
Ensures no code reaches master without passing all CI checks.
- Checks the last 10 commits on
masterfor passingstatus-checkCI status. - Verifies recently merged PRs had passing CI at merge time.
- Detects direct pushes to
master(all changes must go through PRs).
Severity: CRITICAL for any violation.
Audit 2 — Branch Protection Verification
Verifies that Forgejo branch protection is active and correctly configured for
master.
Checks:
- Branch protection rules exist for
master. enable_status_checkistrue.- The
status-checkcontext is required. - At least 1 approving review is required (per
CONTRIBUTING.md).
Audit 3 — Ticket State Integrity
Ensures all issues have correct State/ labels matching their actual state.
Checks:
- Closed issues have
State/Completed(notState/Unverified). - Issues with
State/In Reviewhave an open PR referencing them. - No issue has multiple
State/labels simultaneously.
Audit 4 — Priority and Milestone Ordering
Ensures Critical bugs on lower milestones are addressed before feature work on later milestones.
- Finds the lowest milestone with
Priority/CriticalorMoSCoW/Must Havebugs. - Flags any non-bug issue in
State/In Progresson a later milestone.
Audit 5 — PR Pipeline Health
Tracks PR aging, review coverage, and merge throughput.
| Condition | Severity |
|---|---|
| PR open >24h with no reviews | MEDIUM |
| PR approved but not merged >6h | HIGH |
| PR CI failing >2h | HIGH |
Audit 6 — Supervisor Health (Zombie Detection via Session Introspection)
Uses the OpenCode Server API to read actual session messages and detect zombie or stuck supervisors.
API endpoints used:
GET /session— list all sessionsGET /session/status— get status of all sessionsGET /session/{id}/message?limit=5— read last 5 messagesGET /session/{id}/todo— read the agent's todo list
Detection patterns:
| Pattern | Signal | Severity |
|---|---|---|
Last 3+ tool calls are all sleep with zero productive calls |
Zombie (likely context exhaustion) | HIGH |
| Last 3+ tool calls all returned errors | Stuck in error loop | HIGH |
| Same tool+args repeated 3+ times in last 5 messages | Circular loop | HIGH |
| Expected supervisor session not running | Missing supervisor | HIGH |
Expected supervisors (16 total):
implementor-pool, reviewer-pool, tester-pool, hunter-pool,
test-infra-pool, architect, epic-planner, human-liaison,
agent-evolver, arch-guard, spec-updater, backlog-groomer,
docs-writer, timeline-updater, project-owner, system-watchdog
Audit 7 — Label and Dependency Compliance
Checks all open issues for required labels and dependency links.
| Check | Severity |
|---|---|
Missing State/ label |
MEDIUM |
Missing Type/ label |
MEDIUM |
Missing Priority/ label (non-Unverified) |
LOW |
| Non-Epic/Legendary issue beyond Unverified with no milestone | MEDIUM |
| Issue with no parent Epic dependency link | LOW |
Audit 8 — Ticket Hierarchy Integrity
Verifies the Issue → Epic → Legendary hierarchy is intact.
- Epics must have a parent Legendary dependency link.
- Non-completed Epics should have at least 2 child issues.
Audit 9 — Test Infrastructure Health
Monitors CI execution times and failure rates for signs of test suite bloat or flaky tests. (Currently a lightweight check; expanded in future milestones.)
Audit 10 — Improvement Generation
Verifies the system is generating needs feedback improvement tickets.
- Checks for
needs feedbackissues created in the last 24 hours. - Flags if none exist (the
ca-spec-updaterandca-agent-evolvershould be generating proposals regularly).
Audit 11 — Quick Session Spot-Check (Every Cycle)
Fast scan of the 3 most recently active supervisor sessions for obvious
policy violations. Runs every cycle (~5 min) because catching force_merge or
direct master pushes quickly is critical.
API endpoints used:
GET /session/status— find active sessionsGET /session/{id}/message?limit=3— read last 3 messages only
Checks:
| Violation | Severity |
|---|---|
force_merge: true in any tool call arguments |
CRITICAL |
git push directly to master/main without a feature branch |
CRITICAL |
type: ignore suppression written to a file |
HIGH |
Audit 12 — Deep Session Introspection (Every 6th Cycle, ~30 min)
Comprehensive analysis of all 16 supervisor sessions. Reads recent messages, tool calls, and todo lists to understand what each agent is actually doing.
API endpoints used:
GET /session/{id}/message?limit=10— read last 10 messagesGET /session/{id}/todo— read the agent's todo listGET /session/{id}/children— list child worker sessions
Analysis passes:
Analysis 1 — Misbehavior Detection
Scans all tool calls in the last 10 messages for policy violations:
force_merge: trueusage (CRITICAL)- Closing PRs as duplicates of their tracking issues (HIGH)
- Creating issues without
State/orType/labels (MEDIUM)
Analysis 2 — Progress Assessment via Todo List
Reads the agent's todo list to assess forward progress:
- Flags agents with 0 completed todos and 1+ in-progress todos out of 3+ total (possible stall or spin).
Analysis 3 — Conversation Health Metrics
Computes per-session metrics from the last 10 messages:
| Metric | Threshold | Severity |
|---|---|---|
| Error rate (errors / total tool calls) | >50% with ≥4 calls | HIGH |
| Sleep ratio (sleep calls / total tool calls) | >80% with ≥5 calls | MEDIUM |
Analysis 4 — Context Exhaustion Signals
Scans text outputs for phrases indicating the agent is hitting its context window:
"context limit", "context window", "running out of", "token limit",
"maximum length", etc.
Analysis 5 — Cross-Agent Conflict Detection
Looks for multiple agents interacting with the same PR or issue:
- 3+ different agents touching the same PR →
cross_agent_pr_conflict(MEDIUM) - 3+ different agents modifying the same issue labels →
cross_agent_issue_conflict(MEDIUM)
Finding Severity Levels
| Severity | Response |
|---|---|
| CRITICAL | Immediate one-off agent dispatch + bug issue creation |
| HIGH | Issue creation or zombie alert posted to session state issue |
| MEDIUM | Tracked; issue created if finding persists for 3+ cycles |
| LOW | Tracked; no immediate action |
Action Dispatch
When a CRITICAL finding is detected, the watchdog dispatches a one-off fix agent via the OpenCode Server API:
# Create a one-off session
SESSION_ID=$(curl -s -X POST "${SERVER}/session" \
-H "Content-Type: application/json" \
-d '{"title": "[CA-AUTO] one-off: ca-quality-enforcer — missing_ci"}' \
| jq -r '.id')
# Dispatch the agent
curl -s -X POST "${SERVER}/session/${SESSION_ID}/prompt_async" \
-H "Content-Type: application/json" \
-d '{"agent": "ca-quality-enforcer",
"parts": [{"type": "text", "text": "Fix this finding: ..."}]}'
Dispatch table:
| Finding Type | Action |
|---|---|
no_branch_protection, status_check_disabled |
Dispatch ca-quality-enforcer |
merged_without_ci, failing_ci_on_master |
Dispatch ca-quality-enforcer + create bug issue |
force_merge_detected |
Create bug issue + post CRITICAL alert |
direct_push_to_master |
Create bug issue + post CRITICAL alert |
closed_wrong_state, in_review_but_merged |
Dispatch ca-state-reconciler |
zombie_supervisor, stuck_supervisor, looping_supervisor |
Post zombie alert |
context_exhaustion |
Post alert (product-builder re-launches the supervisor) |
high_error_rate |
Post diagnostic comment |
type_ignore_suppression |
Create Priority/High bug issue |
Health Reporting
Every 6 cycles (~30 min), the watchdog posts a health report to the session state issue:
[WATCHDOG] Health report — cycle N:
- Quality gate violations: 0
- State label mismatches: 2
- Priority ordering issues: 0
- PR pipeline issues: 1
- Zombie/stuck/looping supervisors: 0
- Missing labels/links: 5
- Session introspection findings: 3
- Misbehavior (force_merge, direct push): 0
- Stuck/looping agents: 1
- Context exhaustion signals: 0
- Cross-agent conflicts: 2
- One-off agents dispatched this period: 1
- Issues created this period: 2
Configuration
The watchdog is configured in .opencode/agents/ca-system-watchdog.md.
Key parameters:
- Model:
anthropic/claude-opus-4-6(highest capability for complex analysis) - Temperature:
0.1(deterministic auditing) - Cycle interval: 5 minutes
- Deep introspection interval: Every 6th cycle (~30 min)
- Context self-management: Every 20 cycles, discard accumulated tool outputs
Constraints
The watchdog operates under strict constraints to avoid interfering with the build system:
- No filesystem access — works exclusively through APIs
- No merging PRs — never calls
forgejo_merge_pull_request - No modifying agent definitions — creates
needs feedbackissues instead - No direct master pushes — all corrections go through one-off agents
- Corrections limited to: state label fixes, dependency link fixes, and issue creation
Related Documentation
- Quality Automation — CI/CD quality gates
- CI/CD Pipeline — pipeline architecture
- Review Playbook — PR review process