agent fleet · two books · three approval surfaces

Meridian Ops

$0.056 for one closed incident, 15 events end to end, on the ledger. Running unattended since August.

status live 24/7role designed + built end to end
Meridian Ops: The Commander Console board on monday.com: a production monitor run waiting on a
The Commander Console board on monday.com: a production monitor run waiting on a human, three lab runs closed with their real costs in the Cost USD column.
Meridian Ops: The Discord surface: the fleet's drafted comms posted to #meridian-ops with one
The Discord surface: the fleet's drafted comms posted to #meridian-ops with one Approve button, wired to the same gate as the web board and the monday webhook.
recorded runlive
One recording, two halves: a Discord approval closing a run across every surface, then the live board replaying a real run and the history page.
$0.056the exact token cost of one closed incident, 15 events end to end, on the ledger next to the run.
5 sitesthe production book. Real deployments on real uptime monitors, this portfolio among them.
3 surfacesweb board, monday.com item, Discord button. All three call the same approve function.
0 executedagainst production the fleet notifies and drafts only. Execution is not wired, on purpose.
3 to 4sthe fleet brain's median triage latency across the nightly golden runs, re-measured every night by the eval harness.
What it solves

Portfolio AI demos sit dead until a visitor presses run. This one was already working when you arrived: every event is appended to an event-sourced SQLite log with per-call token cost, the monitors have real uptime history on my real sites, and the system has already caught real problems, including a misconfigured canary check that it escalated to P2 on its own after the skeptic cited the client's profile. A daily budget cap pauses the operation honestly instead of degrading it silently. The triage stage also runs re-platformed on Azure Functions with Azure OpenAI, same gates ported, as a sibling repo.

The constraint

Two requirements that pull against each other. It had to be already working when a stranger arrives, which means running unattended around the clock on real infrastructure. And it had to be safe to point at my actual deployed sites, which means an agent fleet with opinions about incidents on systems I cannot afford to have it break. Everything else follows from holding both at once.

Who it serves

Me, as the operator, and any visitor who wants to fire a lab incident and sit in the commander seat for their own run.

Who it is for

Hiring teams asking whether agent autonomy and governance can coexist in one system.

How it works
  1. Incidents arrive three waysA visitor fires a lab ticket, the scheduler invents one with realistic texture, or a production monitor opens one after three consecutive failed checks on a real site.
  2. The fleet works itTriage classifies with a confidence score, runbook drafts concrete steps for that client's constraints, comms writes the client update, and the skeptic attacks all three against the client profile before anything advances.
  3. Gates run in codeSecurity floor, close-season floors, comms bans, confidence floor, and the skeptic's raise-only rule. The model proposes; code decides.
  4. A human approves, anywhereThe run parks at the commander gate and appears on the web board, as a monday.com item, and as a Discord embed with an approve button. All three call the same function.
  5. Approval leaves receiptsA real email goes out via Resend, a ledger row lands with the run's exact token cost, and every surface flips to closed on its own.
  6. Production stays untouchableFor real sites the fleet notifies and drafts only. Execution against production is not wired, by design.
The decision that was not obvious

The skeptic can only raise severity. Never lower it. That sounds like a small rule and it is the one that makes the fleet trustworthy: a reviewer that can argue a P1 down to a P3 is a reviewer that will eventually be talked into it by a confident draft, and the failure is silent. Raise-only means the worst case is a human reading a ticket that turned out to be smaller than flagged, which costs a minute. The same logic drove the production book: the fleet can notify and draft against my real sites but cannot execute, so the blast radius of a wrong call is a message, not an outage. Deliberately less capable, in the two places where capability is the risk.

What I would change if I rebuilt it today

The monitor debounce state started in memory and lost open-incident context on every restart. It moved to SQLite, but I would start event-sourced for operational state too, not just run history. The skeptic would also get its own eval suite from day one: meridian-evals proved that gate logic drifts when three implementations share a regex by copy-paste.

Built with
TypeScript Claude (Sonnet) SQLite event log SSE node-cron Fly.io monday.com GraphQL + webhooks discord.js Resend receipts Azure Functions sibling