
Agents (AI systems that perform tasks) need autonomy — the ability to act independently without constantly asking for permission.
| Too Little Autonomy | Too Much Autonomy |
|---|---|
| Agent stops constantly to ask permission | Agent takes unintended or risky actions |
| Slows down productivity | Security risks (files, credentials, production systems) |
| Frustrating for users | Potentially irreversible damage |
Asking for permission too often creates its own safety problem — users stop reading carefully, and approvals become meaningless (like clicking "I Agree" without reading).
The core design philosophy behind Auto-review.
Agent Action → Ask User? YES or NO → Proceed
Low Stakes ←————————————→ High Stakes
Agent moves freely Agent slows down
Risk is not absolute — the same action can be safe or dangerous depending on the situation.
python script.py
Three factors together:
Risk = Action + Context + Consequence
A specialized small AI model that reviews actions before they execute, acting as a contextual gatekeeper.
User Request
↓
Parent Agent plans an action
↓
Classifier Agent reviews the action ← (NEW STEP)
↓
Allow or Block
↓
Action executes (or doesn't)
| Goal | Why |
|---|---|
| Small model | Must be fast and cheap to run |
| Enough reasoning | Must make nuanced judgments |
| Context-aware | Can inspect files before deciding |
Be more lenient when security stakes are lower. Be more cautious when security stakes are higher.
The classifier isn't just a passive rule-checker — it can actively investigate before making a decision.
Some actions can't be judged from the command alone:
python script.py ← Can't tell if safe just from this
ReadFile — read the contents of a fileGrep — search for patterns inside filesGlob — find files matching a patternListDir — see what's in a directoryClassifier sees: python script.py
↓
Classifier uses ReadFile to inspect script.py
↓
Classifier sees: script deletes /prod database
↓
Classifier BLOCKS the action
When the classifier blocks an action, it explains why to the parent agent — not just to the user.
Classifier blocks action
↓
Sends explanation to Parent Agent
↓
Parent Agent finds a SAFER alternative
↓
User is never interrupted
Is this action justified by what the user asked for?
This allows normal development work to continue while flagging actions that go beyond what was requested.
If the classifier were a separate service, every action would require:
Agent → [Network call] → Classifier Service → [Network call back] → Agent
This adds delay before every single tool call.
The classifier runs in the same stream as the parent agent — similar to how subagents work.
Same RPC Stream
┌─────────────────────────────┐
│ Parent Agent │
│ ↓ │
│ Classifier (inline) │
│ ↓ │
│ Tool executes │
└─────────────────────────────┘
A rigorous testing process to ensure the classifier catches risky actions without blocking normal work.
When the policy changed, the entire dataset had to be re-labeled — otherwise you'd be testing a new classifier against an outdated standard.
A quality signal that reveals unstable classifier behavior.
Same action tested 10 times:
✅ Allow ✅ Allow ❌ Block ✅ Allow ❌ Block ❌ Block ✅ Allow ❌ Block ✅ Allow ✅ Allow
= 6 allows, 4 blocks → FLAPPING
| Metric | Value |
|---|---|
| Actions blocked by classifier | ~4% |
| Chats with at least one user interruption | ~7% |
| Previous enterprise block rate (before Auto-review) | ~40% |
100 agent actions
↓
~4 get blocked by classifier
↓
Most blocks → Parent Agent finds safer path (no user interruption)
↓
Only ~7% of total chats ever interrupt the user
From 40% of actions blocked (old way) → 7% of chats interrupted (new way)
┌─────────────────────────────────────────────────────┐
│ THE BIG PICTURE │
│ │
│ User Request │
│ ↓ │
│ Parent Agent plans action │
│ ↓ │
│ Classifier Agent (small, fast, agentic) │
│ • Reads context (files, tools) │
│ • Asks: "Is this justified by user's intent?" │
│ • Considers: action + context + consequence │
│ ↓ ↓ │
│ ALLOW BLOCK + Explanation │
│ ↓ ↓ │
│ Action runs Parent Agent finds safer path │
│ ↓ │
│ (rarely) Interrupt user │
└─────────────────────────────────────────────────────┘
Autonomy is a dial, not a switch. Agents move freely when stakes are low. Agents slow down when crossing meaningful boundaries. The classifier makes that judgment — in context, in real time, without slowing everything down.