CLAUDE LABJP
BUDGET — You can now cap what a Claude Managed Agents session spends. When it hits the cap, the session stops issuing new model requests and returns a budget_reached stop reasonRESUME — Change or clear the budget and the session picks up again. Deployments take the same setting, but it applies per session they start, not to the deployment as a wholeGEO — A new inference_geo field controls where inference runs. Set it inside the model object when creating an agent, or override it for a single session. It takes us or globalSKILLS — When a Managed Agents session mounts a GitHub repository, any skills sitting in its root .claude/skills directory are discovered automatically at session startTRADEOFF — Convenience and context cost sit on the same scale. Every extra skill you load also shows up in what /skill-doctor charges you each turnCLI — Claude Code has not shipped a confirmed release since v2.1.263 on September 6. Version numbers skip, so check the official changelog against CHANGELOG.md before quoting oneBUDGET — You can now cap what a Claude Managed Agents session spends. When it hits the cap, the session stops issuing new model requests and returns a budget_reached stop reasonRESUME — Change or clear the budget and the session picks up again. Deployments take the same setting, but it applies per session they start, not to the deployment as a wholeGEO — A new inference_geo field controls where inference runs. Set it inside the model object when creating an agent, or override it for a single session. It takes us or globalSKILLS — When a Managed Agents session mounts a GitHub repository, any skills sitting in its root .claude/skills directory are discovered automatically at session startTRADEOFF — Convenience and context cost sit on the same scale. Every extra skill you load also shows up in what /skill-doctor charges you each turnCLI — Claude Code has not shipped a confirmed release since v2.1.263 on September 6. Version numbers skip, so check the official changelog against CHANGELOG.md before quoting one
Articles/Cowork
Cowork/2026-09-08Advanced

Until I planted a failing sample, my unattended checks had never once failed

A check running on an unattended schedule lost its exit code to a single pipe added for readable logs. I measured where the status disappears and built a small harness that checks the checker.

cowork15unattended4shell3quality gate2automation109

Premium Article

I sat down to read three weeks of run records in one go. Every day was green. Not a single failure line.

That should have been a pleasant column to scroll through. Then I ran the same check by hand, plainly, and three violations were still sitting there. My hands stopped.

The check itself was fine. What was broken was the shape of the line calling it. A single | head -5, added so the logs would be easier to read, had stopped carrying the failure home.

A check earns unattended duty only after I've watched it fail on purpose. I keep that sentence in front of me now.

Green meant it had lost the ability to fail

Unattended run records almost always color themselves by one thing: whether the exit code was zero. However strict the check is inside, if the calling line returns zero, the record files it as a success.

The nasty part is that this failure mode still produces output. The violations were written into the log in full detail. Nobody opens a log that didn't fail. A defect that goes silent is easier to catch, in my experience, than one that keeps talking while nobody listens.

As an indie developer I run four technical sites and two WordPress sites, and the daily checks are handed to a Cowork schedule. Precisely because I designed the thing to run with no human watching, I never thought to question its capacity to fail.

Three places where the exit status disappears

Working through it one piece at a time, the leaks narrowed to three.

The first is the pipe. A shell reports the exit status of the rightmost command in a pipeline. Both head and tee finish with zero no matter what happened on their left.

The second is a local declaration inside a function. Write local out=$(cmd) and $? holds the result of the local builtin, not of cmd. Declarations succeed, so it is always zero.

The third is the || fallback. cmd || echo "failed" looks like "tell me if it breaks," but the moment echo succeeds the whole line is zero. Even with set -e in place, that line will not stop anything.

Every one of them came from wanting readability or wanting to be helpful. A character with no intent to break things had quietly disarmed the check.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
You'll be able to confirm today whether the checks you run unattended are actually capable of failing
You'll be able to find, inside your own scripts, the exact spots where pipes, tee, local, and fallbacks drop the exit status
You'll be able to stop weeks of false green from piling up by keeping a 40-line harness in front of every run
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $15 for lifetime access
View Membership →

Related Articles

Cowork2026-07-05
When Claude Declines a Request on Safety Grounds, What Should an Unattended Pipeline Return?
A third kind of ending that is neither an error nor a normal completion — a safety decline. Here is how to fold it into a pipeline you run unattended, with a classifier and a review-queue design drawn from indie development.
Cowork2026-08-23
Not Every Unreachable Connector Means the Same Thing in an Unattended Run
When an unattended task cannot reach a connector, the cause splits into three states: still connecting, unauthenticated, or genuinely absent. Each demands the opposite response. Here is the resolver that tells them apart.
Cowork2026-07-17
It Worked on My Machine, but Nobody Could Trigger It — Four Assumptions I Stripped Out of a Cowork Plugin
I bundled four working automation skills into a plugin and shared it. Only one of them ever fired. Here is how I measured skill trigger rate, and the four assumptions — vocabulary, paths, connections, and naming — I had to strip out before it was portable.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links