{"id":17402,"date":"2026-08-04T12:41:13","date_gmt":"2026-08-04T12:41:13","guid":{"rendered":"https:\/\/techtrendfeed.com\/?p=17402"},"modified":"2026-08-04T12:41:14","modified_gmt":"2026-08-04T12:41:14","slug":"the-orchestrators-tax","status":"publish","type":"post","link":"https:\/\/techtrendfeed.com\/?p=17402","title":{"rendered":"The Orchestrator&#8217;s Tax"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<div>\n<p>I used to be deep right into a Claude Code session on a .NET codebase when a doubt<br \/>\n    interrupted the work. 4 subagents had been already operating towards a<br \/>\n    response-pipeline refactor, outcomes had been arriving out of order, and the<br \/>\n    session had began to really feel tougher to purpose about than the code itself.<\/p>\n<p>That&#8217;s normally the second I cease trusting the imprecise sense that issues<br \/>\n    are \u201cin all probability effective.\u201d Generally the code is the issue. Generally the<br \/>\n    structure is. Often the workflow itself deserves inspection. This<br \/>\n    time I made a decision it was the workflow.<\/p>\n<p>At first I assumed I already knew the query. Had been 4 subagents<br \/>\n    just too many? That framing felt cheap. Multi-agent techniques are<br \/>\n    normally offered as an apparent productiveness win, and if one agent helps, 4<br \/>\n    ought to assist extra. However each extra agent additionally consumes tokens, repeats<br \/>\n    some quantity of labor, and provides one other stream of data the orchestrator<br \/>\n    has to reconcile. It regarded like a simple trade-off between<br \/>\n    parallelism and value.<\/p>\n<p>I didn&#8217;t need a basic argument about multi-agent techniques. I wished an<br \/>\n    reply about <i>that<\/i> session. So I finished the coding work and requested the<br \/>\n    orchestrator to critique its personal delegation determination, as factually because it<br \/>\n    may.<\/p>\n<p>The reply was not the one I anticipated. The biggest value within the session<br \/>\n    didn&#8217;t appear like it got here from operating 4 subagents. It regarded prefer it<br \/>\n    got here from the orchestrator itself, particularly from what occurred when it<br \/>\n    recommended checking on the opposite brokers.<\/p>\n<section id=\"TheIncidentWasNotReallyAboutParallelism\">\n<h2>The Incident Was Not Actually About Parallelism<\/h2>\n<div class=\"figure \" id=\"orchestrator_subagent_cost_distribution.png\"><img decoding=\"async\" src=\"https:\/\/martinfowler.com\/articles\/orchestrator-tax\/orchestrator_subagent_cost_distribution.png\" \/><\/p>\n<\/div>\n<p>4 subagents had been launched in a single wave. Three had clear runtimes:<br \/>\n      roughly twelve minutes, 5 and a half minutes, and 7 minutes. A fourth<br \/>\n      was nonetheless operating. Checked out a technique, that already justified the delegation.<br \/>\n      Three duties ran concurrently, so wall-clock time was round twelve minutes<br \/>\n      as a substitute of one thing nearer to 25 if the work had been<br \/>\n      serialized.<\/p>\n<p>However velocity was the seen byproduct, not the attention-grabbing half. What I used to be<br \/>\n      looking for was the fee, and my first intuition was that it needed to be the<br \/>\n      duplicated effort of delegation itself: each subagent studying recordsdata,<br \/>\n      reconstructing context, understanding the duty independently.<\/p>\n<p>That was not the place the largest shock turned up.<\/p>\n<p>At one level through the work, the orchestrator recommended checking on the<br \/>\n      operating brokers. It was a small, throwaway immediate: \u201ctest on the brokers.\u201d I<br \/>\n      adopted it. As an alternative of a light-weight abstract, the device it used pulled again<br \/>\n      the total uncooked transcript of a background agent: tens of 1000&#8217;s of tokens of<br \/>\n      JSONL, intermediate reasoning, and gear output, imported wholesale into the<br \/>\n      major thread. Then it occurred once more, for a second standing test.<\/p>\n<p>There is a crucial caveat right here. The declare that this polling behaviour<br \/>\n      value greater than the duplication tax of 4 brokers was the orchestrator grading<br \/>\n      its personal mistake. I did not have actual per-call token accounting, so deal with that<br \/>\n      rating because the orchestrator&#8217;s account, not a measured truth. The reliable<br \/>\n      half is narrower: the transcript dumps had been actual, the wall-clock timings had been<br \/>\n      actual, and the status-check path clearly launched a big, avoidable value.<br \/>\n      Whether or not it was the one largest value stays a speculation till the tooling<br \/>\n      can instrument it correctly.<\/p>\n<p>What mattered extra was that I might discovered a price I hadn&#8217;t been on the lookout for.<\/p>\n<\/section>\n<section id=\"TheCostsWereNotAllTheSame\">\n<h2>The Prices Had been Not All of the Similar<\/h2>\n<p>As soon as I finished treating the session as one lump \u201csubagent value,\u201d the<br \/>\n      image broke into items that did not belong collectively.<\/p>\n<p>First, two of the 4 subagents had been working in the identical space of the<br \/>\n      response pipeline. Completely different duties, totally different recordsdata, however each needed to<br \/>\n      perceive the identical structure, the identical testing conventions, and far of<br \/>\n      the identical surrounding code earlier than both may start. Every paid that<br \/>\n      orientation value independently. That is not an argument towards delegation.<br \/>\n      It is an argument that the work had been cut up too finely.<\/p>\n<p>Second, one agent ran <code>git stash<\/code> and <code>git stash pop<\/code> whereas sibling brokers<br \/>\n      had been writing elsewhere in the identical tree. Nothing broke, however the danger was<br \/>\n      structural, as a result of repository-wide operations are completely cheap in a<br \/>\n      single-threaded session and turn out to be a lot tougher to justify the second a number of<br \/>\n      writers are energetic directly.<\/p>\n<p>By now I had a rising checklist of culprits: standing polling, duplicated<br \/>\n      orientation, unsafe git operations. I discovered myself attempting to rank them. Which<br \/>\n      one value essentially the most? The longer I attempted to reply that, the much less satisfied I<br \/>\n      turned that rating them was the appropriate query in any respect.<\/p>\n<\/section>\n<section id=\"TheScarceResourceIsTheOrchestratorsWorkingMemory\">\n<h2>The Scarce Useful resource Is the Orchestrator&#8217;s Working Reminiscence<\/h2>\n<div class=\"figure \" id=\"context_pollution_compounds_over_turns.png\"><img decoding=\"async\" src=\"https:\/\/martinfowler.com\/articles\/orchestrator-tax\/context_pollution_compounds_over_turns.png\" \/><\/p>\n<\/div>\n<p>The transcript-polling incident stored bothering me for a purpose that had<br \/>\n      nothing to do with token value. A token invoice is one-time, you pay it and it is<br \/>\n      over. What occurred right here was totally different. The uncooked transcript stayed within the<br \/>\n      orchestrator&#8217;s context after the device name accomplished, and each flip after<br \/>\n      that carried it ahead, whether or not or not it was nonetheless helpful.<\/p>\n<p><i>That was the second I spotted I had been treating two very totally different<br \/>\n      sorts of value as if they had been the identical. Tokens are spent as soon as. Context<br \/>\n      shapes each determination that follows. I wasn&#8217;t merely  token<br \/>\n      consumption anymore. I used to be trying on the high quality of the orchestrator&#8217;s<br \/>\n      working reminiscence.<\/i><\/p>\n<p>That realization was carrying two separate concepts, and I need to pull them aside<br \/>\n      moderately than allow them to blur collectively. The primary is what I simply described.<br \/>\n      Air pollution left in context taxes each later flip. The second just isn&#8217;t about<br \/>\n      operating out of area in any respect. The extra that is sitting in context, competing for<br \/>\n      consideration, the tougher it will get for a mannequin to select what issues proper now,<br \/>\n      even with loads of room nonetheless free. A much bigger context window would not repair that.<br \/>\n      It simply offers the noise extra room to pile up earlier than anybody notices.<\/p>\n<p>Context home windows are solely going to get larger, that is a given. What issues<br \/>\n      just isn&#8217;t how a lot room there&#8217;s, however how a lot of what is sitting in that room is<br \/>\n      well worth the mannequin&#8217;s consideration. That is the true downside subagents want to unravel,<br \/>\n      in the event that they&#8217;re used proper.<\/p>\n<p>Seen this manner, the orchestrator is the one a part of the system that<br \/>\n      accumulates understanding throughout a protracted session. It remembers why a design<br \/>\n      determination was made, carries ahead architectural constraints, and is aware of which<br \/>\n      trade-offs have already been mentioned. The subagents do not, and that is by<br \/>\n      design. They&#8217;re presupposed to be disposable. Exploration, repeated file reads,<br \/>\n      failed approaches, and noisy intermediate reasoning are supposed to keep in<br \/>\n      employee contexts and by no means make the journey again to the principle thread.<\/p>\n<\/section>\n<section id=\"CognitiveLocalityChangesWhatParallelismIsFor\">\n<h2>Cognitive Locality Adjustments What Parallelism Is For<\/h2>\n<p>This reframes the duplicated-orientation downside, which wasn&#8217;t actually \u201ctwo<br \/>\n      brokers studying the identical recordsdata.\u201d It was two brokers independently reconstructing<br \/>\n      the identical psychological mannequin of the codebase, as a result of the work had been partitioned<br \/>\n      by job moderately than by the information every job required. I&#8217;ve began calling<br \/>\n      that distinction <b>cognitive locality<\/b>: Duties that want the identical psychological mannequin ought to normally keep collectively.<br \/>\n      Splitting them simply forces a number of brokers to rebuild the identical understanding<br \/>\n      from scratch.<\/p>\n<p>Parallelism nonetheless issues right here, it is simply not the principle level. Working 4<br \/>\n      brokers concurrently is beneficial, however bizarre. The true profit is that they<br \/>\n      maintain noisy intermediate reasoning out of the principle thread and return solely what<br \/>\n      it nonetheless wants. That is the isolation subagents are supposed to supply, and it<br \/>\n      solely holds if the principle thread respects it.<\/p>\n<p>My working perception now: that is what subagents are literally for. Not that<br \/>\n      they save time, however that they allow you to offload reasoning the orchestrator<br \/>\n      would not want to carry onto, so it has much less to hold and fewer competing for its<br \/>\n      consideration. Get the isolation proper, maintain issues native by cognitive locality,<br \/>\n      and subagents turn out to be the device that protects the orchestrator&#8217;s working reminiscence,<br \/>\n      not only a value you tolerate for parallelism. That is a perception, although, not a<br \/>\n      measurement. What I&#8217;ve truly measured is the opposite facet of it, the price of<br \/>\n      getting the isolation improper.<\/p>\n<\/section>\n<section id=\"TurningASessionIntoStandingRules\">\n<h2>Turning a Session into Standing Guidelines<\/h2>\n<p>My subsequent transfer was the apparent one. Encode the lesson into <code>CLAUDE.md<\/code>, the<br \/>\n      standing instruction file each session masses.<\/p>\n<p>It might have been simple to write down a big corrective coverage right here, however each<br \/>\n      further line in a standing instruction file is a price paid once more on each future<br \/>\n      session. So I compressed the repair into the smallest algorithm that addressed<br \/>\n      the failures I might seen. Each is basically answering the identical query. Does<br \/>\n      this piece of data, or this manner the work is cut up, earn a spot within the<br \/>\n      orchestrator&#8217;s context?<\/p>\n<ol>\n<li>Favor two to 4 brokers in a single wave. If the orchestrator desires 5 or<br \/>\n        extra, it ought to first ask whether or not duties sharing recordsdata or conventions must be<br \/>\n        merged.<\/li>\n<li>Don&#8217;t ballot background brokers for standing when the reply could be given<br \/>\n        from what&#8217;s already identified. Don&#8217;t fetch a full transcript to reply a<br \/>\n        light-weight query.<\/li>\n<li>Don&#8217;t enable repository-wide git operations inside concurrent agent<br \/>\n        prompts.<\/li>\n<li>Deal with overlapping file possession as a consolidation sign, not a cue to<br \/>\n        spawn extra brokers.<\/li>\n<\/ol>\n<p>None of those inform the orchestrator precisely what to do in each case. Every<br \/>\n      one offers it one thing to test or ask itself earlier than performing, not a script to<br \/>\n      run, and none of them is profound by itself. Their solely actual worth is that<br \/>\n      they&#8217;re all aimed on the identical factor, preserving disposable reasoning disposable<br \/>\n      and preserving room within the orchestrator&#8217;s context for what it wants later within the<br \/>\n      session.<\/p>\n<\/section>\n<section id=\"TheNextMistakeWouldHaveBeenMoreGovernance\">\n<h2>The Subsequent Mistake Would Have Been Extra Governance<\/h2>\n<div class=\"figure \" id=\"governance_balance_no_tilt.png\"><img decoding=\"async\" src=\"https:\/\/martinfowler.com\/articles\/orchestrator-tax\/governance_balance_no_tilt.png\" \/><\/p>\n<\/div>\n<p>A later session surfaced a unique hole. I had began the orchestrator<br \/>\n      with specific abilities for the sort of work I wished, coding steering in a single<br \/>\n      case, design steering in one other. I assumed that when a ability was energetic in<br \/>\n      the principle thread, spawned subagents would comply with it mechanically. They do not.<br \/>\n      A subagent would not inherit abilities energetic within the dad or mum session except the<br \/>\n      orchestrator passes them alongside explicitly.<\/p>\n<p>My first intuition was so as to add a confirm-before-spawn gate. The orchestrator<br \/>\n      would cease, checklist which brokers it desires to launch and which abilities every ought to<br \/>\n      load, and look forward to my approval.<\/p>\n<p>I am glad I did not maintain that model. It solved the improper downside. I did not<br \/>\n      have proof that unhealthy spawn plans had been slipping by means of for lack of a<br \/>\n      affirmation step. I might found a lacking truth about ability propagation, and<br \/>\n      that is a unique sort of hole. A common affirmation gate would have added<br \/>\n      a round-trip to each comparable session, and earlier than lengthy I might virtually definitely<br \/>\n      have began approving these prompts on autopilot.<\/p>\n<p>At that time, I spotted I wasn&#8217;t actually bettering governance. I used to be<br \/>\n      simply including one other ritual.<\/p>\n<p>And it nonetheless would not have caught the true downside from earlier than, the<br \/>\n      orchestrator polluting its personal context.<\/p>\n<p>The narrower repair held up higher. Earlier than spawning, the orchestrator states<br \/>\n      which energetic abilities are related to every agent&#8217;s job and factors the subagent<br \/>\n      on the ability file to load, moderately than pasting the entire ability inline.<br \/>\n      Affirmation is just required above the identical batch-size threshold already in<br \/>\n      place, or when file possession is ambiguous.<\/p>\n<p>That left me with a heuristic I now use greater than the rule itself:  <i>Earlier than<br \/>\n      including a line to a standing instruction file, ask whether or not a fairly<br \/>\n      competent orchestrator would make the appropriate determination as soon as it knew the one<br \/>\n      lacking truth.<\/i><\/p>\n<p>If sure, the rule ought to simply state the very fact. If the repair begins specifying a<br \/>\n      determination process, resembling approvals, checkpoints, necessary steps, that is<br \/>\n      normally an indication I am encoding course of the place a small clarification would have<br \/>\n      finished the job.<\/p>\n<p>I do not know but whether or not that heuristic survives tougher circumstances. For now it<br \/>\n      stops me from turning each attention-grabbing incident right into a miniature<br \/>\n      forms.<\/p>\n<\/section>\n<section id=\"WhereThisLeavesMe\">\n<h2>The place This Leaves Me<\/h2>\n<div class=\"figure \" id=\"learning_flywheel_open_ended.png\"><img decoding=\"async\" src=\"https:\/\/martinfowler.com\/articles\/orchestrator-tax\/learning_flywheel_open_ended.png\" \/><\/p>\n<\/div>\n<p>I haven&#8217;t got a settled view of how a lot governance is sufficient, and I do not<br \/>\n      assume this piece earns one.<\/p>\n<p>What I&#8217;ve as a substitute is a small flywheel, with a human nonetheless firmly within the<br \/>\n      center of it. A session exposes a niche. Somebody has to note that it felt<br \/>\n      improper, cease the work lengthy sufficient to examine it, resolve whether or not the issue is<br \/>\n      actual or simply noise, and choose what deserves to turn out to be a standing rule. The<br \/>\n      orchestrator can grade its personal session and floor clues, because it did right here, however<br \/>\n      it can not make that judgment name itself. The selection of what to codify, what<br \/>\n      to depart alone, and what could be an overreaction continues to be mine. The following<br \/>\n      session then tells me whether or not that judgment improved the work or simply created<br \/>\n      a unique sort of waste.<\/p>\n<p>The artifact of this spherical is the present model of<br \/>\n      <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/gist.github.com\/techygarg\/f8f98a2f026538fad4a69b593a964d95\">my CLAUDE.md<\/a>.<br \/>\n      It is not a completed prescription. It is the state of the calibration after this<br \/>\n      iteration. The thresholds in it, two to 4 brokers per wave, 5 as a<br \/>\n      consolidation sign, match the work I used to be doing once I wrote them. I would not<br \/>\n      current them as something like common constants, and I might be suspicious of<br \/>\n      any orchestration write-up that did. They had been additionally calibrated towards Claude Sonnet 5,<br \/>\n      and I have never examined how they maintain up towards others. A unique<br \/>\n      mannequin would possibly fairly want a unique stability. A number of extra guidelines have gathered<br \/>\n      within the file since. Deal with this file as a pattern, not a template, modify and optimize<br \/>\n      it for no matter mannequin and workflow you are truly operating. What issues is not the<br \/>\n      particular file, it is the behavior behind it: noticing a failure, asking what it truly<br \/>\n      value, and writing the rule that will have caught it. <\/p>\n<p>For years we optimized software program techniques round CPU, reminiscence, and throughput.<br \/>\n      The primary wave of LLM tooling taught us to observe tokens. This session made me<br \/>\n      suspect there is a third factor price watching in long-running agent workflows:<br \/>\n      the standard of the orchestrator&#8217;s personal working reminiscence, the one useful resource that,<br \/>\n      as soon as polluted, retains charging hire for the remainder of the session. I do not assume<br \/>\n      that is a settled legislation but. It is a sample that held up within the classes I&#8217;ve<br \/>\n      checked out up to now.<\/p>\n<p>The tax I went on the lookout for was by no means on the subagents. It was on the<br \/>\n      orchestrator, in what it selected to hold ahead. That is the query I carry<br \/>\n      into each multi-agent design now: not what number of brokers to run, however what earns<br \/>\n      a spot within the orchestrator&#8217;s context.<\/p>\n<p>The questions I am left with are genuinely open:<\/p>\n<ul>\n<li>How do I measure this correctly, as a substitute of counting on the orchestrator&#8217;s personal<br \/>\n        account of its errors?<\/li>\n<li>When ought to a lacking truth go into the directions, and when does that flip<br \/>\n        into an excessive amount of course of?<\/li>\n<li>What is the subsequent orchestration mistake I am not seeing but?<\/li>\n<\/ul>\n<p>I anticipate I am going to revise the file once more. That feels much less like a failure of<br \/>\n      foresight and extra like the conventional value of working with a system opaque sufficient<br \/>\n      that doubt itself turns into a part of the tactic.<\/p>\n<\/section>\n<hr class=\"bodySep\" \/>\n<\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>I used to be deep right into a Claude Code session on a .NET codebase when a doubt interrupted the work. 4 subagents had been already operating towards a response-pipeline refactor, outcomes had been arriving out of order, and the session had began to really feel tougher to purpose about than the code itself. That&#8217;s [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":17404,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[56],"tags":[10026,3932],"class_list":["post-17402","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software","tag-orchestrators","tag-tax"],"_links":{"self":[{"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/posts\/17402","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=17402"}],"version-history":[{"count":1,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/posts\/17402\/revisions"}],"predecessor-version":[{"id":17403,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/posts\/17402\/revisions\/17403"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/media\/17404"}],"wp:attachment":[{"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=17402"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=17402"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=17402"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}<!-- This website is optimized by Airlift. Learn more: https://airlift.net. Template:. Learn more: https://airlift.net. Template: 69d9690a190636c2e0989534. Config Timestamp: 2026-04-10 21:18:02 UTC, Cached Timestamp: 2026-08-04 21:30:53 UTC -->