DEV Community

Ali Suleyman TOPUZ
Ali Suleyman TOPUZ

Posted on Originally published at topuzas.Medium on

I Finally Put Claude Managed Agents’ August Update Through Its Paces, and It Fixes the Four Things…

I Finally Put Claude Managed Agents’ August Update Through Its Paces, and It Fixes the Four Things I Was Hacking Around Myself

A quick correction before I even start: the title of this piece says “August 10” because that’s the date going around in a couple of newsletters and on X, but when I actually went and checked the Anthropic platform release notes, all four of these shipped together on August 7, 2026. I’m not going to pretend I caught that on my own either, I only noticed because I went to link the changelog entry and the date on the page didn’t match what I’d written in my notes. So: August 7. Same batch, just the correct day.

I’ve been running a handful of Claude Managed Agents sessions in production since the spring, mostly cron-triggered research and data-cleanup jobs, plus one multiagent coordinator that reviews pull requests overnight. Every single one of those deployments had some homemade duct tape wrapped around it: a wrapper script that killed the session if the token spend looked wrong, a hardcoded region because a client’s legal team asked, a manual skill-upload step I kept forgetting to run after editing a SKILL.md, and absolutely no way for the cheap model doing the actual work to ask a smarter model “wait, is this the right approach” without me building that plumbing myself.

This update replaces four of those five things I was building by hand. I only kept the fifth, which I’ll get to at the end. Here’s what actually changed, what I tested, and where I still don’t fully trust it.

What shipped, in one table

+----------------------------+----------------------------------------------------------+
| Feature | What it actually does |
+----------------------------+----------------------------------------------------------+
| Session budgets | Hard USD cap on a session's spend at public list price; |
| | session pauses with budget_reached instead of burning |
| | through your card |
+----------------------------+----------------------------------------------------------+
| Inference geo pinning | Pin model inference to "us" or leave it "global", set at |
| | agent creation or overridden per session |
+----------------------------+----------------------------------------------------------+
| Automatic skill loading | Mount a GitHub repo, anything in its root .claude/skills |
| from .claude/skills | is discovered and available with zero manual config |
+----------------------------+----------------------------------------------------------+
| Advisor / mid-session | A more capable model the primary thread can consult |
| consultation | mid-turn for planning or a sanity check, without you |
| | building the call yourself |
+----------------------------+----------------------------------------------------------+
Enter fullscreen mode Exit fullscreen mode

I’ll go through them in the order I actually tested them, which is roughly the order of “how much money was I worried about losing.”

1. Session budgets: the one I wanted six months ago

The failure mode I’d hit before this shipped was embarrassingly simple. A cron-triggered research agent with web_search enabled got into a loop chasing down a dead link, kept retrying variations of the same query, and by the time I noticed, it had burned through what would normally be a week of that agent's budget in about forty minutes. Nothing crashed. Nothing errored. It just kept going because nothing was watching the meter.

The new budget parameter is a hard cap you set when you create a session, priced at public list rates regardless of any negotiated discount you have. When the cumulative cost hits the cap, the session doesn't error out, it pauses into idle status with a budget_reached stop reason, and everything about it, files, tool state, conversation history, stays intact. You raise the cap and it picks up exactly where it left off. No re-prompting needed.

from anthropic import Anthropic
client = Anthropic()
BETAS = ["managed-agents-2026-04-01"]
session = client.beta.sessions.create(
    agent=analyst.id,
    environment_id=env.id,
    budget={
        "type": "limit",
        "max_list_cost": {"currency": "USD", "amount": "1000"}, # $10.00, in cents
    },
    betas=BETAS,
)
with client.beta.sessions.events.stream(session.id, betas=BETAS) as stream:
    for ev in stream:
        if ev.type == "session.usage":
            print(f"spent so far: {ev.usage.list_cost} / budget: {ev.budget.max_list_cost}")
        elif ev.type == "session.status_idle":
            print(f"stopped: {ev.stop_reason.type}") # end_turn or budget_reached
            break
Enter fullscreen mode Exit fullscreen mode

If it does hit the cap and you decide it’s worth letting it keep going, raising the budget resumes it automatically:

client.beta.sessions.update(
    session.id,
    budget={"type": "limit", "max_list_cost": {"currency": "USD", "amount": "5000"}},
    betas=BETAS,
)
Enter fullscreen mode Exit fullscreen mode

A few details I only found by actually reading the fine print instead of skimming the announcement post:

The amount is an integer string in cents, no floats, so "1050" is ten dollars fifty, and if you type "10.50" it just gets rejected. You can only attach a budget when you create the session, there's no bolting one onto an already-running uncapped session after the fact, which makes sense once you think about it: retrofitting a cap onto a session that already spent unboundedly doesn't protect you from anything. And the enforcement happens between model requests, not mid-request, so the recorded spend can tick slightly past the cap because the request that crosses the line is allowed to finish. That's a reasonable tradeoff, I'd rather eat one extra request's worth of overage than have a request get killed mid-tool-call and leave something in a weird state.

The one thing I wish worked differently: lowering a budget below what’s already been spent throws a BadRequestError, and removing a budget entirely (budget=None) is a one-way door, you can't put a cap back on later. Both make sense defensively, but I'd have liked at least a "soft re-cap" option for the second case.

For anything not actively streaming events, and honestly most of my cron jobs aren’t, there’s a session.budget_reached webhook you can subscribe to instead, which is what I switched my research-agent fleet over to. A small supervisor process gets pinged, decides whether the extra spend is justified, and either raises the cap or lets it sit paused.

2. Inference geo pinning: smaller than it sounds, still useful

I’ll be honest, I went into this section expecting a full multi-region story and came out a little underwhelmed, though not in a bad way. Right now there are exactly two values for inference_geo: "us" and "global". That's it. You set it inside the model object, either when you create the agent or as a per-session override.

ant beta:agents create \
  --name "US-only compliance agent" \
  --model '{id: claude-opus-5, inference_geo: us}' \
  --system "You are a helpful assistant." \
  --format json
Enter fullscreen mode Exit fullscreen mode

If your workspace’s allowed_inference_geos doesn't include the value you pinned, you get rejected, not just when you save the agent but on every single turn a session serves. If a compliance team narrows the allowlist after the fact, running sessions stop being able to take new turns rather than silently ignoring the change. I actually like that better than a soft warning, because the alternative is a compliance gap nobody notices until an audit.

The part that’ll matter more to your invoice than to your legal team: pinning to "us" costs 1.1x standard pricing across input, output, and both cache categories, on Claude 4.6 and later. If you're on a Priority Tier commitment, that multiplier eats into your committed throughput at the same 1.1x rate too. For the one client project where I actually needed this, the markup was trivial next to the alternative of building my own region-routing layer, so I'm not complaining, but if you're pinning purely out of habit rather than an actual requirement, it's worth checking whether you need to.

The other gotcha: if you’re running a multiagent setup, the coordinator’s pin and every roster member’s pin have to match exactly, all set to the same value or all unset. Mixed rosters get rejected outright. I tripped over this once testing a coordinator-plus-advisor setup (more on advisors below) where I’d pinned the coordinator but left the advisor’s geo unset. Four hundred, immediately, with a clear enough error message that I didn’t have to dig.

3. Automatic skill loading from .claude/skills

This is the one that directly killed a workflow step I hated. Before this, if I wanted an agent to use a custom skill, I had to package it, upload it through the skills API, get back a skill_id, and wire that into the agent's skills array. Every time I edited a SKILL.md in the repo, I had to remember to re-upload it. I forgot more than once, shipped a stale skill, and spent an annoying hour figuring out why the agent wasn't following instructions I was staring right at in the repo.

Now, if a session mounts a GitHub repository as a resource, anything sitting in that repo’s root .claude/skills directory gets discovered automatically at session start, no manual upload, no entry in the agent config.

resources:
  - type: github_repository
    url: https://github.com/your-org/your-repo
    mount_path: /workspace/repo
    authorization_token: ghp_your_token_here
Enter fullscreen mode Exit fullscreen mode

The directory structure has to be exact, and I got bitten by this once too:

your-repo/
├── .claude/
│ └── skills/
│ ├── code-review/
│ │ └── SKILL.md
│ └── release-process/
│ ├── SKILL.md
│ └── scripts/
│ └── run_checks.sh
└── src/
Enter fullscreen mode Exit fullscreen mode

One directory level deep, no more, no less. .claude/skills/SKILL.md directly doesn't count, and neither does nesting it under a subfolder like .claude/skills/tools/code-review/SKILL.md. I had the second problem on my first attempt, since I'd organized my skills by category out of habit, and the agent just never mentioned having them.

Two things I want to flag before anyone gets too excited and mounts a repo they don’t fully control:

Discovery happens once, at session start. If someone pushes a commit to .claude/skills mid-session, the running session does not pick it up, you need a fresh session for that. That's actually fine for my use case, but it surprised me the first time I edited a skill mid-debug and wondered why nothing changed.

More importantly: this is a real trust boundary, and the docs are upfront about it in a way I appreciated. Anyone who can commit to the mounted repo can add or modify a skill, it’s loaded without any review step, and the session’s tools, bash, web_fetch, whatever you've enabled, give those instructions actual reach into your environment. If you're mounting a repo that accepts external contributions, a malicious or just careless PR to .claude/skills is functionally the same as someone editing your agent's system prompt. I only mount repos where I control the merge queue for anything touching that directory, and I'd suggest branch protection on .claude/skills specifically if you're doing this at a team where more than a couple of people can merge.

One real limitation worth knowing up front: this only works in cloud sandboxes. If you’re running self-hosted sandboxes, GitHub repository resources aren’t supported at all, so the automatic discovery path isn’t available to you. The workaround I’ve been using for a self-hosted setup is unglamorous but works: keep uploading skills the old way, through the skills array with type: custom and an explicit skill_id, and just accept that the sync step is manual there. It's not as good, but it's the same mechanism that worked before this update, so nothing regresses, you just don't get the new convenience.

skills:
  - type: anthropic
    skill_id: xlsx
  - type: custom
    skill_id: skill_01AbCdEfGhIjKlMnOpQrStUv
Enter fullscreen mode Exit fullscreen mode

Repository skills and manually attached skills coexist fine, by the way. I’m running both right now, Anthropic’s built-in skills plus a couple of my own attached the old way plus a mounted repo with team-specific skills, and nothing conflicts as long as names don’t collide.

4. Mid-session advisor: the smart-model-checks-the-cheap-model pattern, built in

This is the feature I was most skeptical of going in, because I’d already built something like it myself for the PR-review coordinator, and I assumed the built-in version would be a worse copy of what I had. I was wrong, mostly.

The pattern is one I actually wrote about in a different piece: route cheap, fast-model work by default, and escalate to an expensive model only when you actually need it. What I’d never gotten right by hand was letting the cheap model ask the expensive one a question mid-task, rather than escalating the whole task. My homemade version always ended up either escalating too eagerly, because the cheap model couldn’t tell when it was actually stuck, or not escalating at all, because I hadn’t wired the check in for that particular step.

The advisor roster entry solves this by making the consultation something the model itself can decide to trigger, not something you have to hardcode into your workflow:

curl -fsS https://api.anthropic.com/v1/agents \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: managed-agents-2026-04-01" \
  -H "content-type: application/json" \
  -d '{
    "name": "Backend engineer",
    "model": "claude-sonnet-5",
    "system": "You implement backend features end to end. Consult the advisor before major backend design decisions.",
    "multiagent": {
      "type": "coordinator",
      "agents": [
        {"type": "advisor", "model": "claude-opus-5"}
      ]
    }
  }'
Enter fullscreen mode Exit fullscreen mode

There are exactly two fields, type and model, and the constraint that actually matters: the advisor has to meet a minimum capability bar relative to the agent consulting it, the agent's own model can't be more capable than its advisor, and equal-capability pairs are allowed. Try to pair a stronger model as the "worker" with a weaker one as "advisor" and you get a 400 before anything even runs.

What happens under the hood, once I actually watched the event stream for it, is cleaner than what I’d built myself. Each consultation spins up as its own platform-managed thread, anthropic.advisor, that runs, delivers its advice as an agent.thread_message_received event on the primary thread, and terminates itself. No tool-use events fire for it, and there's no visible "message sent" event either, the platform composes what gets sent to the advisor internally. If the consultation fails or gets interrupted, it's non-fatal, the agent just gets a generic notice and keeps going rather than the whole turn failing. That last part matters more than it sounds like it should: my hand-rolled version had exactly one failure mode I never fully fixed, which was a flaky advisor call taking down the entire task instead of just being skipped.

The detail that’ll trip people up if they’re inspecting event streams for debugging: whether you actually see the advice text depends on which model you’re consulting. Some advisor models return plaintext, readable straight off the event stream. Others, Claude Opus 5 among them, return a redacted placeholder to the client, [{"type": "redacted"}], while the consulting agent still gets the full advice server-side. I spent a confused twenty minutes the first time I saw a redacted block, assuming something was broken, before I found the line in the docs explaining it's intentional. If you're building any kind of observability dashboard on top of this, budget for the fact that you won't always get to show a human what the advisor actually said, only that a consultation happened and roughly how long it took.

Billing-wise, advisor calls get charged at the advisor model’s own rates and show up in both the advisor thread’s usage and the session total, with automatic prompt caching on the advisor side that you don’t have to configure. And advisor threads are specifically exempt from the 25 concurrent-thread limit, which is a small thing but saved me from having to think about whether a burst of consultations could starve out my actual worker threads.

One real constraint that shaped how I’m using this: only the session’s primary thread can consult the advisor. Roster agents in a multiagent setup can’t call it themselves. For my PR-review coordinator, that means the advisor pattern works great for the coordinator’s own top-level decisions, but if I want an individual reviewer sub-agent to get a second opinion, I still have to route that back up through the coordinator myself. Not a dealbreaker, just something to plan the roster around rather than assume you get for free everywhere.

The thing I keep coming back to

I wrote a separate piece recently about Microsoft’s Agent Framework going GA with its own production harness, and the throughline there was that a bunch of cross-cutting concerns I’d been building by hand as custom middleware, logging, tracing, basic rate limiting, turned out to be things the platform now handles natively once it matured past preview. I didn’t expect to be writing almost the same sentence about Claude Managed Agents a few weeks later, but here I am.

Spend caps, region pinning, skill distribution, and model escalation are four things I was solving myself with wrapper scripts, hardcoded configs, a manual upload habit I kept breaking, and an ad hoc escalation function that only half worked. None of those were hard problems individually, but they were all the kind of infrastructure tax that has nothing to do with what the agent is actually supposed to accomplish, and all of it was mine to maintain and mine to have bugs in. Now three and a half of the four are the platform’s job instead of mine.

The half is deliberate: I’m still writing my own domain-specific guardrails, what counts as a “major backend design decision” worth consulting the advisor over, which repos I trust enough to mount for skill loading, what my actual budget number should be for a given job. That’s the right line, honestly. I don’t want the platform guessing at my business logic, I want it handling the plumbing so I can spend my time on the guessing.

What I’d still ask for: a soft re-cap option after removing a budget, more than two geo options if the compliance ask ever gets more granular than “US or not,” and some way for a roster sub-agent to reach the advisor without routing through the coordinator. None of those are blocking anything I’m doing today. But if you’d told me in the spring that I’d get all three of the other things fixed for free in one release, I’d have taken it and stopped complaining about the fourth.

Tags: claude-managed-agents, ai-agents, anthropic, llm-infrastructure, agentops, production-ai, multiagent-systems

Top comments (0)