Skip to main content

The enforcement model

When you run nanny run, Nanny becomes the parent process of your agent. It reads [start].cmd from nanny.toml, spawns it as a child, and owns the process lifecycle — it decides when the process lives and when it dies. The moment any limit is crossed, Nanny kills the child process immediately — the process cannot catch, delay, or prevent the stop. An ExecutionStopped event is emitted with the reason, and Nanny exits with a non-zero status code.

Multi-agent governance

When multiple agents run in the same process — as in CrewAI, LangGraph, AutoGen, or any framework that orchestrates agents within a single Python or Rust runtime — the enforcement model above applies to all of them simultaneously. A single nanny run governs the entire fleet. Each agent activates its own named limit set via @agent("role"). Tool calls from any agent flow through Nanny’s enforcement layer. Each agent’s budget is tracked independently — hitting the analysis budget does not kill the reporter. For cross-process and cross-machine enforcement, use the governance server.

What Nanny enforces

All three limits are enforced on every run: Timeout enforcement works for any process in any language — no SDK required. Step and token enforcement require the agent to report tool calls — either via the Rust SDK macros or the Python SDK decorators.

Passthrough mode

When running outside nanny run, every macro becomes a no-op:
This means you can ship instrumented code and run it in development, CI, and production without Nanny — until you explicitly wrap it with nanny run. The behaviour is identical either way.