Reviews
Meta-reviewer course corrections and recurring failure patterns.
Web UI → Agent Review (GET /api/reviews) is where the self-healing
loop’s output surfaces: when a turn stalls or fails, the loop monitor
captures its trajectory and a cold-context meta-reviewer files a course
correction — where the path bent, what changes next time, and a lesson the
agent recalls in future runs. See Harness for how the
monitoring itself works.
Individual reviews

Each entry in the main list shows: timestamp, a verdict badge, the session ID and reason, the misdirection (what went wrong), the correction (what should happen instead), and — if one was filed — a lesson ID that’s now recalled automatically in future runs. A counter at the top (“N incident(s) awaiting review”) reflects any incidents the meta-reviewer hasn’t processed yet.
If nothing has gone wrong yet, the page just says so — reviews only appear after the loop monitor actually catches a stalled or failing turn.
Recurring patterns
A separate Recurring patterns section appears only when the pattern miner has clustered the same failure across two or more sessions — deterministic clustering, no LLM in this detection path, and read-only: nothing here has touched code yet. Each pattern card shows:
- a failing/passing verdict badge and a status badge (new → proposed → approved → pr_open, or dismissed)
- occurrence count and first/last-seen timestamps
- once proposed: a summary, root cause, and a proposed fix
Below 3 occurrences a pattern just sits as “recurring, no proposal yet.” At 3+ it’s picked up on the next sweep and gets a summary/root cause/proposed fix.
A proposed pattern shows Approve — run sandbox fix and
Dismiss. Approve calls POST /api/signatures/:id/approve, which
spawns aios resident approve <id> in the background — a sandboxed
patch/test/PR attempt that can take minutes; you’re pinged on Telegram
when it finishes. Dismiss calls PUT /api/signatures/:id with
{status: "dismissed"} and drops it from the list.
A successful sandbox attempt opens a PR — a link appears on the card — but it is never merged automatically. It waits for your review like any other PR.
Approving is a real, running action (it starts the sandbox pipeline), so the dashboard asks you to confirm before firing it. Dismissing is just a status label change and is instant.