overwatch

Your test suite is watching

Catch the breakage while the agent is still there.

overwatch runs your project’s tests beside Claude Code, Codex, OpenCode, Pi, or Neovim. It hands failures back the instant they happen.

Zig · Python · JavaScript · Deno · Go · Rust · zanity

codex · payments-service

› Update the retry calculation

● edit src/retry.py

✕ overwatch python · 1 failed, 42 passed

tests/test_retry.py::test_caps_backoff

The latest edit broke the backoff cap. I’ll fix the boundary and rerun it.

● edit src/retry.py

✓ overwatch python · 43 passed in 0.31s

Failures join the agent’s turn with the test name and full report.

One tight feedback loop

The agent gets the red build, not you.

No tab switching, no stale status, no discovering the regression after the turn is over.

01

Watch continuously

overwatch discovers the runner your project already uses and keeps it beside the session.

02

Report precisely

The agent sees the failing test or compiler error first, followed by the useful edges of the full report.

03

Stay until green

Claude Code wakes on failure. Codex, OpenCode, and Pi keep red builds in the agent loop. Recovery is reported too.

Bring your runner

Polyglot by default.

Every language gets its own watcher, including services nested inside a monorepo.

zigpytestvitestjestbundenogogotestsumcargozanity

Behavior by design

Watchers for agentic engineering. overwatch runs your project’s tests beside Claude Code, Codex, OpenCode, Pi, or Neovim and hands failures back immediately, so the agent fixes what it broke before it moves on. The site has this README as pages.

With Claude Code:

  • Idle session: a failing build starts a turn with the failure.
  • Running turn: the failure joins that turn, read at the agent’s next step.
  • Back to green: the agent is told during a turn; otherwise the status line shows it.
  • The status line always shows the latest result, for example overwatch zig ✓ 4/4 steps succeeded; 48/48 tests passed.

With Codex, overwatch runs the full suite when a session starts, checks again after tools change the workspace, and reports new failures after edits. Completion remains guarded until those failures clear, including during a Stop-hook continuation. Tools remain available for investigation and fixes. A change made outside Codex is picked up with the next prompt. Overwatch supplies transient status text while each check runs, though not every Codex surface renders it, and a concise visible warning for each distinct new failure, with full output saved to a log file. Existing failures form the session baseline, with a compact triage notice and full logs saved separately. They do not block Stop unless the inherited-finding policy requires it. Codex’s status line does not currently accept persistent plugin-defined fields. Codex does not currently let a plugin start a new turn in an idle session, so that is the one difference from the Claude Code behavior above.

With OpenCode, overwatch checks the project at session start, before model calls, and after editing tools. OpenCode 1 appends a red report to the editing tool’s result and warns if the session goes idle. OpenCode 2 also queues one correction pass when the session tries to settle while red.

With Pi, overwatch runs the full suite at session start, adds failures to editing tool results, keeps the latest failure in Pi’s status line, and requests a correction pass whenever guarded failures remain at settlement.

With Neovim, the same long-running watchers put failures in the quickfix list and expose their latest result to status lines, with no agent involved.

Every integration runs the whole suite once to establish the session baseline. Existing failures remain visible in status and a triage inventory; only regressions against that baseline demand a correction.

In Claude Code, the watcher starts with an interactive session, survives /clear, and stops when the session ends. overwatch looks for watchers again as each turn starts and completes, so a project scaffolded mid-session (uv init, zig init), or a sub-project added to one, is watched by its next turn at the latest. A watcher that exits is restarted at once, and the status line says so instead of keeping the last result; one that could not start, or exited within 30 seconds of starting, waits 30 seconds first, then 60. After three such quick exits in a row overwatch stops restarting it on its own and tries again only as turns start, at most every 30 seconds. The agent is told during a turn whenever the watcher exits, and woken with what the watcher last printed when overwatch gives up. Setting "enabled": false in .overwatch.json takes effect at the next check, with no restart.

Keep the agent in the loop.

Install the plugin, restart your harness, and let the next failing test introduce itself.