Search

Your AI Ops Bot Is Not Your Co-Founder: Guardrails First

Letting an agent touch production needs blast-radius limits, not trust. The guardrails to set first, the failure modes they stop, and where to keep a human.

Mohit12 min read
Guardrail gates between an AI ops bot and production systems.

The verdict. If you are the founder with a cron watching a billing, trading, or live production system, do not give it operator keys and “use judgment.” Give it a narrow read-only observability lane, a logged human approval boundary, and a paused-by-default escalation path. The July Polymarket receipts show why: two automated config pushes silently changed a real-money bot; the second caused financial loss whose exact amount was not recorded.

1. The operator and the leak: your monitor has deploy authority

You run a lean product. Maybe it is a subscription app, a marketplace, a trading strategy, or a service with a production queue. A scheduled agent reads dashboards, notices a bad number, and looks useful right up to the moment “fix it” means changing the same configuration that controls revenue, price, access, or execution.

That is the decision behind AI ops bot production guardrails. Not “can an agent read a graph?” It can. The question is whether the same unattended process may write a config, reload a service, select a branch, or silently correct a state it does not fully understand.

The Polymarket monitor was not imaginary. The July 5 receipt for process ID 110351 reports 13 wins / 11 losses, +$5.42 PnL, 54.2% win rate, and 1.47 profit factor at 01:01 IST. At 05:03, that same session was 22 wins / 29 losses and -$7.88; DOGE accounted for 10 trades and -$7.87, so the monitor cut DOGE from $2 to $1. (Receipt: ~/.hermes/kit-log.md, 2026-07-05 01:01 and 05:03 entries, preserved in cron sessions 76938 and 79083.)

Those are reasonable observations. The leak was authority. The monitor could also push the local config.yaml and reload live operation. It was not a reporter with a draft recommendation; it was a small, unattended production operator.

For a useful contrast, read the decision posture in our guide to workflow automation choices: an automation is only cheap while its failure is cheap. A production bot touching money has a different failure budget.

2. The mechanism: split seeing from changing

A trustworthy production agent has three separate lanes:

  1. Observe. Collect bounded, read-only evidence: health, recent events, limited aggregates, and the current approved configuration fingerprint.
  2. Explain. Produce a short report and a proposed diff with the evidence that triggered it. It can recommend “pause,” “roll back,” or “change this field,” but it cannot execute the change.
  3. Approve and apply. A named human reviews the diff, approves it in a durable log, and invokes a separately scoped writer. The writer applies only that approved diff and records the resulting version or reload receipt.

That split is not bureaucracy. It stops a monitoring context from becoming a mutation context. A cron does not know whether another agent has a branch checked out, whether an on-server emergency setting is deliberate, or whether a temporary divergence is the correct production state.

The local scripts/monitor.py shows what the read-only lane can do without deploy authority. It uses Paramiko for collection, captures the dashboard as the bot user, and queries the journal through SQLite reads. It calculates session totals, per-asset trades, wins, win rate, PnL, cost, streaks, hourly results, and recent fills. Its config parser reports per-asset bet and stop-loss maps on a $1–$5 grid. (Receipt: /Users/kit/projects/polymarket/scripts/monitor.py, lines 1–25, 104–157, 160–208, and 241–255.)

The point is architectural: rich reporting did not require writing the live system. The current project safety policy also says not to deploy, restart, stop, or reconfigure without explicit approval, and forbids full production-database scans or copies. Its historical journal-bloat note records disagreement_polls at roughly 93 million rows / 50GB; research is directed to static backups and O(trades) extraction instead. (Receipt: /Users/kit/projects/polymarket/AGENTS.md, lines 21–29; GBrain projects/polymarket-bot.)

In plain English: the monitor should be allowed to answer, “What changed?” It should not be allowed to decide, “I will change it back.”

3. The two receipts that kill the co-founder fantasy

Incident A: the helpful hourly sync that reverted deliberate production work

On July 5, hourly cron c2269ff8f672 pushed the local config.yaml to the live server. The local file carried old v_min values; the server values had been deliberately lowered for trade frequency. The cron reverted the server to the older, tighter gates, and the bot missed trades. The root cause recorded in the incident was that the cron loaded the polymarket-ops skill, which instructed ./deploy.sh reload when handling issues. (Receipt: kit-log, 2026-07-05 “Cron config-overwrite incident”; session 20260704_210838_f20d6a, messages 85235–85237.)

The remediation was specific: rewrite the cron prompt as read-only, reduce it from 1 hour to 6 hours, and patch the skill with a cron guard. The lesson in the receipt is better than any generic AI policy: automated agents must never push configuration to production without explicit human approval.

Notice what this was not. It was not a bad model answer. It was a bad capability boundary. The automation had an unreviewed write path from a local working copy to a real-money system.

Incident B: the development branch became production by accident

On July 6/7, a background Kanban/delegated agent was working in ~/projects/polymarket/ on disagreement-strategy-v14.3. It committed fr-edge config changes: cut-overlay, $2 base sizes across assets, -$5 stop-loss, and re-enabled SOL. The hourly cron then ran cd ~/projects/polymarket && ./deploy.sh reload, pushing that development-branch config to live instead of the intended fable-branch configuration. (Receipt: kit-log, 2026-07-06/07; session 20260704_210838_f20d6a, message 85488.)

The incident record names corrupted fields: observe_only, v_min, order_price_buffer, edge_enabled, bet sizes, and stop-loss. The result was financial loss from trading with the wrong configuration. The receipt does not contain the exact loss amount, so this article does not invent one. That absence is part of the finding: if a system can make an unauthorized money-affecting change, its audit trail must make the resulting loss attributable, or you cannot honestly price the incident afterward.

The response had five parts:

  1. Move the cron into /Users/kit/projects/polymarket-lat-ops/, so it never touched the old directory.
  2. Harden the prompt to use /tmp only, fixed bet sizes, and no Git operations.
  3. Add a KANBAN/DELEGATION BLOCKED rule to the operations skill.
  4. Mark the old project path stale with an explicit block against cron and delegated work.
  5. Pause the cron until a person manually resumed it.

That is the right instinct, with one refinement for your own system: do not rely on path warnings alone. Use separate credentials. The observer should have no production mutation token to misuse; the approved writer should accept a signed or logged change request, not a conversational instruction.

4. Compare the authority models before you automate

The table is about authority, not vendors. A different model does not repair an unsafe permission boundary.

Approach Good for Cost shape Catch
Broad autonomous operator Throwaway sandboxes Cheap until it writes Wrong context can mutate production
Read-only AI monitor Money and production systems Build reporting first It cannot self-remediate
Approval-gated writer Small, reviewable changes Human review time Needs a durable diff and log
Deterministic runbook Known, reversible incidents Engineering time Fails outside its assumptions
Do nothing / fix process first No receipt or owner for changes $0 Keep humans on the console

Choose the read-only monitor as the default. Add the approval-gated writer only after you can name every field it may touch, the rollback for each field, the human who can approve it, and the receipt that proves the change landed.

The July data also makes the point that humans do not need to be fast to be useful. At 13:02 on July 5, the monitor restored DOGE from $1 to $2 because its recent 20-trade / one-hour windows were positive; deploy.sh reload hit a branch-mismatch prompt, so the change used a manual SCP plus SIGUSR2 fallback and verified config_reloaded. (Receipt: kit-log 2026-07-05 13:02; cron session 79518.) The human boundary did not prevent action. It forced an explicit intervention when the tool itself signaled that its branch context was unsafe.

5. Cost: the expensive part is unpriced authority

There is no honest dollar total for these incidents in the receipts. Do not manufacture an ROI spreadsheet from a missing loss figure. What can be priced is the shape of the exposure: an unattended hourly config push; a wrong branch; multiple altered risk fields; and a real-money execution system.

The operational evidence shows why small config edits are not small consequences. On July 5, session reporting moved from + $5.42 at 01:01 to -$7.88 at 05:03, then later recorded 46 wins / 60 losses, -$11.84 PnL, 43.4% win rate, and 0.80 profit factor at 19:02. These are session snapshots, not proof that one config action caused each move. (Receipt: kit-log 2026-07-05 monitor entries; cron session 81668.) Treating ordinary performance variance as proof of a deploy effect would be another dishonest claim.

On July 6, the receipt for PID 130583 reported 136 trades, +$4.20 session PnL, and 47.1% win rate. Asset totals were BTC +$7.57, DOGE +$6.57, XRP +$0.35, ETH -$5.07, and BNB -$5.22. ETH’s stop-loss was adjusted from -10 to -8 through the manual fallback after a branch-mismatch prompt. (Receipt: July 6 monitor receipt summarized in session 89555; manual fallback receipt in session 83094.)

The business conclusion is blunt: your expected cost is not the agent subscription. It is the worst change an unattended process can apply before anyone sees its report. If that cost matters, remove the unattended writer.

6. Failure modes to name before the bot gets keys

The stale-local overwrite. A local file is not necessarily the source of truth. If an operator made a deliberate production adjustment, a “sync” can erase it with no syntax error and no obvious outage. Incident A is this failure mode exactly.

The working-directory branch leak. cd is an authorization decision when the directory can contain a different branch and a different config. Incident B turned a development workspace into a production deployment source.

The skill becomes a permission escalator. A prompt or skill that says “reload on issues” is not harmless guidance when a cron has deploy access. It turns broad language into a repeatable mutation route.

The monitor confuses reporting with repair. A health check can safely say an asset is losing. It cannot safely infer that it should rewrite stop-loss, re-enable an asset, or change risk gates without knowing the current experiment and approved intent.

The unbounded evidence query. A monitor that scans every historical row can become its own outage. The policy’s ~93M-row / 50GB journal history is the receipt: limit queries by process or time, use static backups for research, and keep operational reads proportional to trades. (Receipt: /Users/kit/projects/polymarket/AGENTS.md, line 25; GBrain projects/polymarket-bot.)

The silent money story. “Financial loss” was recorded, but not the amount. Without an append-only change log that ties actor, diff, approval, timestamp, deploy receipt, and business outcome together, you cannot distinguish strategy variance from configuration damage after the fact.

7. When not to use an AI ops bot: fix the process for $0

Do not add an AI monitor yet if any of these are true:

  • You cannot name a single human owner for each production config.
  • You do not have a current approved-config snapshot or a rollback command that was tested outside an incident.
  • The agent needs broad SSH, cloud, database, or deployment credentials just to produce a report.
  • Another worker can edit the same working tree or configuration at the same time.
  • Your metrics are not bounded and attributable; “the dashboard looked bad” is not a change request.
  • You cannot show the last change, its approver, and the evidence that it actually landed.

Fix the process first: freeze unattended mutations, create a plain change log, make a read-only collector, and have a person run the existing deploy procedure. That is not anti-automation. It is refusing to automate ambiguity.

For the same reason, do not confuse a model swap with a safe operations design. The local inference field guide makes the parallel case: preserve a reference lane and validate the actual contract before you call a cutover production-ready.

8. The 30-day test: prove the boundary, not the vibes

Run this as a generic test on your own money-touching or production workflow. Week 1 establishes the baseline; it does not authorize changes.

Metric Baseline week Day 30 target Receipt
Monitor runs completed N runs >=95% scheduled runs Run log + heartbeat
Unauthorized mutations 0 0 Config audit diff
Config changes with approval M approved changes 100% logged approval Change request ID
Outcome attribution Unmeasured or partial Strategy-only variance Versioned config + event ledger

Use N for the number of scheduled monitor runs you actually attempted in the baseline week and M for the approval-gated changes you actually made; they are variables, not invented benchmarks. Record every report, every proposed diff, every approval, every rejected proposal, and the exact config/version fingerprint before and after a human-approved change.

The decision rule is one line: keep the monitor only if it reaches at least 95% scheduled-run uptime, records zero unauthorized mutations, and ties every config change to a logged approval; otherwise remove its write capability and fix the process.

Bottom line

An AI agent watching production is not your co-founder. It is an observability component with an unusually convincing interface, and it should be built like one: narrow reads, bounded evidence, a visible proposal, explicit human approval, and a writer that is separate from the watcher.

The July receipts do not argue against monitoring. They argue against unattended authority. Build the reporting pipeline first, keep mutation paused by default, and let the approval log, not the model’s confidence, decide whether a production change happens.


More on this decision, three ways to look at it:

OBSERVE • EXPLAIN • APPROVE

OBSERVE • EXPLAIN • APPROVE

Sources

  • ~/.hermes/kit-log.md historical entries for 2026-07-05 and 2026-07-06/07, preserved in Hermes session transcripts: incident A (20260704_210838_f20d6a, messages 85235–85237), incident B (85488–85490), and monitor snapshots (76938, 79083, 79518, 81668, 83094).
  • /Users/kit/projects/polymarket/scripts/monitor.py, read-only collection design, bounded session/per-asset calculations, config parsing.
  • /Users/kit/projects/polymarket/AGENTS.md, current safety policy and journal-query boundary.
  • GBrain: sessions/digest/2026-07-07 and projects/polymarket-bot, incident cross-check and historical operating context.