Agent monitoring · AI agents · Built in-house

A monitor with no model, and the tests that fixed our agents.

Built in-house at MUVES to keep watch over MUVES OS, our own team of 34 AI agents.

Illustration: a watchtower over a row of small workers, with a checklist instead of a brain

AI agents, at work.

See the ai agents services

Built
A read-only overseer process, plus a fitness test, a router benchmark and local-agent checks
Stack
Node.jsSQLite, read-onlyOllamantfy alerts
Timeline
August to October 2026
Status
Running alongside MUVES OS
Scale
20 rules, 34 agents watched
The problem

Agents fail quietly.

A row of small friendly robots at desks, one quietly posting the same note twice while the others keep working, nobody noticing.

An AI agent rarely crashes in a way anyone notices. It answers a little wrong, skips a step, posts twice, or waits forever on a check that never comes. When the thing watching it is another model, that model can be talked out of the problem too.

We needed two things: a watcher that cannot be argued with, and tests that prove an agent can still do its job after every change.

What we built

A watcher that only reads, and a test bench that only uses real work.

WATCHING LIVE: THE OVERSEERTESTING BEFORE IT COUNTS: EVALUATIONMUVES databaseJobs, messages,memory notes, logs1Read-onlyconnectionIt cannot changewhat it watches220 plainrulesWritten in SQL. Nomodel, so nothingto talk it out ofa problem3IncidentlogicOpens after 2failing runs,closes after 5clean ones4IncidentsRow ids and countsonly. Alerts saythat, not whatReal requestsMessages from thebusiness, notmade-up test text5Fitness testeval.js runs eachagent's realconfig on realcases6RouterbenchmarkDid it pick theright place, andhow fast7Local agentcheckDoes each smallmodel still do itsjobFix, then rerunA prompt, a roleor a plain rulechangesrerun after every fix
How it fits together. The top lane runs all the time and can only read. The bottom lane runs whenever a prompt, a model or a rule changes, and nothing counts as fixed until it passes again.
  1. A read-only connection

    The overseer runs as its own process and opens the database read-only. It imports nothing from the system it watches, so it cannot change it even by mistake.

  2. Rules in plain SQL

    Each rule is a question with a yes or no answer: is a job stuck past its own time limit, was the same request queued twice, did something shaped like a secret land in a log. No model is involved, so it cannot drift or invent a problem.

  3. Incident logic borrowed from site reliability work

    A rule must fail on 2 runs in a row to open an incident, and pass 5 runs in a row to close it. One slow minute does not raise an alarm and one quiet minute does not end one. When the service is in a restart loop, the alarms that loop explains stay quiet.

  4. Incidents that hold no private text

    The evidence kept is row numbers and counts, never the content of a message. Each incident is shown only to people allowed to see the rows it points at. Phone alerts say that something needs attention, not what.

  5. A fitness test on real cases

    eval.js runs each local agent with its real instructions and model against real requests from our own work. The question is whether the cheap agent can actually do the job, not whether it looks cheap.

  6. A router benchmark

    bench-router.js measures whether requests go to the right department, and how fast, separately from whether the output is well formed.

  7. Local agent checks

    A quick pass that confirms every small local model still answers in the shape its job needs.

The rule book

Some of the 20 rules, as the overseer states them.

Each rule carries a severity and the fix it recommends. A person applies the fix.

RuleSeverityRecommended fix
MUVES is not answeringCriticalStart it again on the PC. The keeper log says why it stopped
Something shaped like a secret is in a logCriticalMask it, and change that secret
A memory note is filed in the wrong spaceCriticalKeep it out of prompts at once, re-file it once someone agrees
A job is stuck past its time limitHighMark it failed and tell its thread
A finished answer never reached its threadHighDeliver it now instead of waiting for a restart
An answer was posted twiceHighHide the second copy
A model keeps failingHighRoute around it until it recovers
An answer went out without its checkMediumLook at why the department head did not answer in time
A worker is corrected more often than notMediumMove that worker's outward work up a tier
A routine failed or did not runLowRead the routine's last runs in the journal
What the tests found

Three silent faults, each fixed and rerun.

What we foundThe causeThe fixAfter
The router got 1 of 12 test requests rightThe model's "thinking" mode broke its structured answersThinking mode off for routing12 of 12, about 1 second each
A long prompt reached a local agent cut shortThe engine's default 2,048-token window silently cut a 5,149-token promptA 16K window, set explicitlyThe whole prompt arrives
"Draft an email" was treated as small talkA small 4B model misread the requestPlain rules ahead of the model for clear casesClear requests never reach the guesser
How it runs

On a timer, beside the system it watches.

A kitchen-style timer beside a clipboard of rules with green ticks, and a phone showing only a plain
  • On a short, regular timerthe overseer runs its rules against the live database and updates its incident list.
  • A new rule is tested firston a scratch copy of the database before it watches the real one. One planned rule, a budget check, waits until the data it needs exists.
  • After any changeto a prompt, a model or a routing rule, the fitness test and the benchmark run again. A failure means a prompt to fix or a job to move, not a shrug.
  • Alerts go to a phonethrough a public relay, so they carry no details. The details are on the dashboard, behind a login.
What changed

Faults we would not have seen, found and fixed.

12 of 12routing benchmark, up from 1 of 12
11 of 11local agents passing their fitness test
2 / 5runs to open / close an incident
16Kcontext window, after a silent cut at 2,048
What we'd reuse

A check-up for agents you already run.

If your business already has a chatbot, a phone agent or an automation built by someone else, the same method applies, starting read-only.

  1. Read the transcripts against the agent's job

    What was it supposed to do, and what did it actually say? A booking agent for a clinic, a quoting bot for a contractor, a support bot for an online store.

  2. Build a test set from real conversations

    Twenty real requests with the right outcome written down, rerun after every change.

  3. Add plain rules around it

    Stuck conversations, double replies, missing handoffs, secrets in logs. Rules a person can read.

  4. Log why it did what it did

    A reason next to every decision, so the next fault takes minutes to trace instead of days.

Is an agent of yours doing something odd?

Tell us what it was meant to do and what it does instead. We start read-only, on a free call.