Praetor · The autonomous SRE commander

When production goes
down, Praetor takes
the call.

Production outages cost enterprises $1–5M per hour. Mean-time-to-resolution averages 8.85 hours. Praetor is an autonomous incident commander — once the alert lands, it investigates, decides, remediates, verifies, and escalates to code if the runtime fix isn't enough. No humans in the loop between page and verdict.

Recorded Runs
Resolved
6
Scenario Families
10
Typed Actions
A three-phase product

One environment.
Three ways to use it.

The same nine-service simulated cluster, the same six-component verifiable reward, three different audiences experiencing it. The LLM agent learning, the human practicing, the real deployed site being rescued.

01
For ML Researchers

Observatory

Replay any recorded trained-agent run. Inspect the six-component reward decomposition, watch the per-component sparklines rise across the episode, see the action timeline tier-by-tier.

Open observatory →
02
For SREs & Engineers

Apprentice Mode

Solve the same incidents the AI was trained on. PagerDuty alert lands, you investigate a real-feeling cluster with an AI coach nudging you. Three scenarios, easy to hard.

Start training →
03
For Hackathon Judges

Real-Time

Plug a real deployed site into the trained agent. Inject a fault, watch ops actions stream in, escalate to code investigation if the site stays degraded. Sim-to-real, live.

Connect a site →
“Six independent reward components, every one a pure verifiable function — no learned reward model, no LLM-as-judge, no exploits.”
— from our hackathon submission · RLVR design note
Why this matters

No public RL environment
existed for SRE incident response.

The market

Every tech company runs an on-call rotation. Outages cost $1–5M per hour at enterprise scale, and MTTR is climbing as systems get more distributed, not shrinking. The observability and incident management market is $45B and the workflow has barely changed in fifteen years.

If the work is methodical reasoning under uncertainty — exactly what RL-trained LLM agents should be good at — why is there no benchmark?

What Praetor is

An autonomous incident commander. Once paged, Praetor investigates with a typed action vocabulary (10 SRE-shaped actions), decides what to fix using the trained policy, executes via the same Backend Protocol that the simulator uses, verifies recovery, and escalates to code investigation if runtime ops aren't enough.

Trained with the hackathon's recommended recipe: SFT warm-start from senior-SRE behavioral-clone trajectories, then GRPO fine-tuning over a six-axis verifiable reward. Same policy runs against the simulator, against a real deployed site, and against the codebase.

Phase 1 · Watch Praetor work

Every page becomes a recorded run.

Each row is Praetor — the autonomous incident commander — attempting one of three scenario families. Pick a run to see the action timeline, the 6-component reward decomposition, and the per-step service map evolve from red to green.

Recorded Runs
Resolved
Avg Score
Conditions
Run
All families OOM DB Pool Bad Deploy Disk Full Slow Query Cert Expiry ✓ Resolved

Episode

Run ID
Task
Seed
Model
Alert
Verdict
Score
Steps used

Reward decomposition RLVR · 6 components

Per-component reward over the episode

Service map final state

🗺️
Pick a run to see services

Action timeline click to expand

Pick a run and hit Replay

Aggregate — success rate by scenario family

Loading aggregate...
Phase 3 · Praetor on a live site

Point Praetor at a deployed site. It takes it from there.

Praetor probes the site, classifies what's wrong on its own, runs the runtime fix, and if that's not enough, opens the codebase you point it at and tells you which lines to look at.

0

Connect your platform optional — the right path for real production

Praetor isn't a black box that reaches into someone else's infrastructure. It works through a contract. Connect your platform here and Praetor will (1) link your repo for tier-2 code analysis, (2) generate the adapter file you drop into your own deployment, and (3) take over Real-Time once your adapter goes live.

Sign in with your GitHub account to scope tier-2 code analysis to one of your repos. Real OAuth via device flow — no password entry, no callback URL needed.

1

Connect to a deployed site

Paste the URL of a site that exposes the operator contract (/ops/health, /ops/restart, etc). The site can be hosted anywhere — Render, Vercel, Fly, HF Space.

No site to point at? Use built-in demo target → (this server's /ops/* endpoints)
Not connected
3

Link your codebase — for tier-2 escalation when ops can't fully heal

For toy sites, runtime ops are usually enough. For real sites at Paytm / Amazon / Airbnb scale, the bug often lives in the code itself. Praetor reads the code only when ops actions don't fully heal the fault.

4

Run Praetor

Praetor uses the classification it just made. No need to tell it what's wrong — it figured that out.

No fault detected? Inject a test fault →

Live unified timeline tier 1 ops · tier 2 code

Connect a site and inject a fault

An end-to-end
SRE training system,
not just an environment.

A full RL substrate, a behavioral-clone seed dataset, an SFT+GRPO training notebook, an interactive observability dashboard, a sim-to-real bridge, and a tier-2 code escalation module — packaged as one product.

Built for three audiences

Different needs.
Same substrate.

For ML researchers

A clean RL benchmark

  • OpenEnv-compatible spec with full action_space / observation_space declarations
  • Six independent reward components — RLVR with no learned reward model to game
  • Parametric scenario families with seed-deterministic trajectories
  • Out-of-the-box SFT + GRPO Colab notebook (Qwen2.5-Coder-1.5B, 4-bit LoRA via Unsloth)
  • Anti-reward-hacking regression tests pinning the four common exploits
For SREs & engineering teams

A flight simulator

  • Three difficulty-graded scenarios (OOM, DB pool exhaustion, bad deployment cascade)
  • Real-feeling 9-service cluster with cascading dependencies and live metrics
  • AI coach that nudges you toward the right move with Why? explanations on every action
  • Structured post-mortem at the end with senior-SRE comparison
  • Per-user progress tracking, no production at risk
For hackathon judges

A complete submission

  • Reward curves across four conditions × three families × thirty seeds (360 episodes)
  • Sim-to-real demo: same trained policy, deployed HTTP site, real chaos injection
  • Tier-2 code escalation: when ops can't fully heal, the agent investigates the codebase
  • 268 passing tests covering every critical path
  • Public Space, Colab notebook, blog, video — all linked in the README
Capability matrix

Every claim, verifiable.

CapabilityWhere it livesVerified by
Six-component verifiable reward incident_commander_env/server/grading/components.py 29 unit tests in test_reward_components.py
Anti-reward-hacking ×4 exploits closed scenarios/ + actions/handlers.py 15 regression tests in test_reward_hacks.py
Seeded reproducibility simulation/cluster.py + metrics_engine.py 3 tests in test_seeded_reproducibility.py
Parametric scenario families 3 families scenarios/scenario_*.py integration tests in test_environment.py
Backend Protocol server/backends/protocol.py 19 contract tests in test_backend_protocol.py
WebsiteBackend (HTTP) sim-to-real server/backends/website.py 23 mock-HTTP tests in test_website_backend.py
Tier-2 code escalation training/code_investigator.py 9 tests with synthetic repo in test_code_investigator.py
Episode JSONL traces & observatory training/episode_logger.py + /runs + /watch 9 tests in test_observe_mode.py
Training pipeline (SFT → GRPO) training/train_grpo.ipynb 20 plumbing tests in test_training_modules.py
Technical stack

Boring tools.
Sharp choices.

Environment

FastAPI · Pydantic v2

Typed action / observation / state contracts, OpenEnv-compatible reset / step / state surface.

Simulator

Pure-Python cluster

9-service in-memory simulation, deterministic with a seed, zero external dependencies.

Training

HuggingFace TRL · Unsloth

SFTTrainer + GRPOTrainer, 4-bit Qwen2.5-Coder-1.5B with LoRA r=16. Self-contained Colab.

Sim-to-real

HTTP Operator API

Minimal /ops/* contract any deployable site can implement. No Docker required.

Tier 2

Heuristic + LLM

Shallow git clone, scenario-keyword grep, ranked code findings, optional LLM summary.

Frontend

Vanilla, no framework

Hand-written HTML/CSS/JS. Loads instantly, no build step, no bundle.

Telemetry

JSONL episode logs

Every run writes a structured trace under runs/<id>/episode.jsonl. Replayable forever.

Quality

268 tests, < 9 s

Covers every critical path. CI-friendly. Mock-HTTP suites isolate from network.

The incident curriculum

Six fault shapes.
Every one is real.

Praetor's curriculum mirrors the most common production incident classes. Each scenario is parametric — every (seed, difficulty) pair produces a fresh instance — so the agent learns the shape of the fault, not three fixed cases.

OOM Crash
Easy
java.lang.OutOfMemoryError: Java heap space
Fix: restart with a higher memory limit. The agent must spot the OOMKilled pattern, infer the limit was too low, and avoid restarting unrelated services.
Heroku 2014 (Postgres OOM), Reddit 2017 (Cassandra), almost every Java microservice ever.
DB Pool Exhaustion
Medium
PSQLException: pool exhausted (20/20)
Fix: raise pool size + restart the leaking service. The agent must trace symptoms from the user-facing frontend two layers down to the DB before acting.
GitHub 2018, Discord 2020, Shopify 2016 — all cascade-from-DB outages.
Bad Deployment Cascade
Hard
Memory leak v2.4.0 — autoscaler exhausted quota
Fix: rollback the bad deploy before restarting the starved dependents. Action ordering matters. Wrong order is the rubric's whole point.
Knight Capital 2012 ($440M), CrowdStrike 2024 (global Windows outage), Facebook BGP 2021.
Disk Full
Easy
[Errno 28] No space left on device
Fix: restart cycles the volume. The trap is that metrics look mostly fine — only logs reveal the ENOSPC error pattern.
Slack 2020 (logs filled root), GitHub 2018, Stripe 2017 (audit log spillover).
Slow Query / Lock Contention
Medium
Lock wait timeout exceeded; txn rolled back
Fix: rollback the deploy that introduced the slow query. The trap is that restart is a quick fix that doesn't last — the binary still has the bad query.
GitHub 2020 (24h incident, slow query in DB upgrade), Instagram 2017 migration.
TLS Certificate Expired
Easy
ssl.SSLError: certificate has expired
Fix: restart triggers the cert renewal hook. The whole point is that metrics look almost normal. Only the logs (and error rate) tell the truth.
Microsoft Teams 2020, Spotify 2021, Azure DevOps 2018, LinkedIn 2017, Cloudflare 1.1.1.1 2021.
From page to verdict

The autonomous loop, end-to-end.

Once the alert lands, no humans in the loop. Praetor runs the same five-stage cycle a senior on-call engineer runs — except it never sleeps, never panics, and writes a clean trace of every decision.

1

Page

Alert lands via webhook. Praetor receives POST /reset with the incident task_id + seed.

2

Investigate

list_services, read_logs, check_metrics, describe_service — picks the right diagnostics for the symptom.

3

Decide

The trained policy outputs a typed action. Restart vs rollback vs reconfigure — the right one for this fault.

4

Act

Same Backend Protocol whether the substrate is the simulator or a real deployed site. One trained policy, two execution paths.

5

Verify

Polls /ops/health for a stable green window. Declares resolved with an accurate root_cause string for the postmortem.

If runtime ops aren't enough — escalate to code When stage 5 doesn't go green, Praetor opens the linked codebase (GitHub, Azure Repos, or uploaded ZIP), greps for files matching the failing service + scenario keywords, ranks suspects, and writes a Code Escalation Report with a suggested fix. Diagnosis-only today; the next step is shipping the patch as a PR.

API Reference

Base URL: http://localhost:8000

POST/resetStart a new incident episode
Request:  { "task_id": "oom_crash" }
Response:
{ "observation": { "message": "INCIDENT ALERT...", "alert": "...", "dependency_graph": {...} },
  "reward": 0.01, "done": false,
  "info": { "task_id": "oom_crash", "max_steps": 15 } }
POST/stepExecute an SRE action
Request:
{ "action_type": "read_logs", "target_service": "payment-service",
  "parameters": { "lines": 50, "severity": "ERROR" } }
Response:
{ "observation": { "message": "Logs for payment-service...", "logs": [...] },
  "reward": 0.03, "done": false, "info": { "step_count": 2 } }
GET/stateCurrent episode state
Response:
{ "episode_id": "uuid", "step_count": 5, "task_id": "oom_crash",
  "incident_resolved": true, "current_score": 0.99 }
GET/tasksList available scenarios (with backstory, goals, prereqs)
Response:
{ "tasks": { "oom_crash": { "skill_tag": "Your first page", "backstory": "...", "learning_goals": [...] }, ... } }
GET/coach/hintRule-based contextual hint for the current game state
Response:
{ "hint": "Next: read_logs on payment-service...", "suggested_action": {...}, "tone": "encourage" }
POST/coach/explainPlain-English explanation of the last observation
Request:
{ "last_action": {...}, "last_message": "...log text..." }
Response:
{ "explanation": "OutOfMemoryError means...", "matched_terms": [...] }
GET/postmortemEnd-of-episode review with criteria, trajectory, and senior comparison
Response:
{ "grade_letter": "A", "score": 0.99, "criteria": [...], "user_trajectory": [...], "ideal_trajectory": [...] }
GET/healthLiveness check
Response: { "status": "ok" }

Pick your incident

Start with "Your first page" if you're new. Each scenario unlocks the next. Your progress is saved in this browser.