The execution boundary
When you runnanny 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.
What Nanny enforces
All three limits are enforced on every run:| Limit | Requirement | Behaviour |
|---|---|---|
timeout | None — works for any process | Killed when wall-clock time exceeds the configured value |
steps | Rust SDK or Python SDK | Killed when step count reaches the configured limit |
cost | Rust SDK or Python SDK | Killed when accumulated cost reaches the configured budget |
Passthrough mode
When running outsidenanny run, every macro becomes a no-op:
nanny run. The behaviour is identical either way.