<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AdmilsonCossa</title>
    <description>The latest articles on DEV Community by AdmilsonCossa (@admilsoncossa).</description>
    <link>https://dev.to/admilsoncossa</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2851804%2F378b44af-97ea-4e4b-8f3a-0a09facf6f67.jpeg</url>
      <title>DEV Community: AdmilsonCossa</title>
      <link>https://dev.to/admilsoncossa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/admilsoncossa"/>
    <language>en</language>
    <item>
      <title>Your Worker Crashed After the Side Effect. Should It Run Again?</title>
      <dc:creator>AdmilsonCossa</dc:creator>
      <pubDate>Tue, 01 Sep 2026 11:52:21 +0000</pubDate>
      <link>https://dev.to/admilsoncossa/your-worker-crashed-after-the-side-effect-should-it-run-again-ibl</link>
      <guid>https://dev.to/admilsoncossa/your-worker-crashed-after-the-side-effect-should-it-run-again-ibl</guid>
      <description>&lt;p&gt;A process uploads a batch and crashes after chunk 417 completes. When the job&lt;br&gt;
starts again, it must decide whether chunk 417 should run.&lt;/p&gt;

&lt;p&gt;Running it twice may duplicate a side effect. Skipping it without durable&lt;br&gt;
evidence is not much better.&lt;/p&gt;

&lt;p&gt;An activity boundary gives the operation an explicit identity, hashes its input&lt;br&gt;
and stores its terminal result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;createFileActivityStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;runActivity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/activity&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createFileActivityStore&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.workit-activities&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Application-owned provider boundary. The provider idempotency key remains&lt;/span&gt;
&lt;span class="c1"&gt;// separate from WorkIt's local activity record.&lt;/span&gt;
&lt;span class="kr"&gt;declare&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;uploadToProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AbortSignal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;idempotencyKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;etag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uploadChunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;runActivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;activityId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;upload:batch-42:chunk-417&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;batchId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;batch-42&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;417&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;checksum&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;6d7fce9f&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;upload chunk 417&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;uploadToProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;417&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;idempotencyKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;batch-42:chunk-417&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uploadChunk&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After completion, a new process using the same store can submit the same&lt;br&gt;
activity id and input. WorkIt returns the stored result without invoking the&lt;br&gt;
body again.&lt;/p&gt;

&lt;p&gt;That is terminal activity replay. It is not transparent workflow replay.&lt;/p&gt;
&lt;h2&gt;
  
  
  The application chooses the durable boundary
&lt;/h2&gt;

&lt;p&gt;WorkIt does not persist arbitrary closures, JavaScript stacks or scheduler&lt;br&gt;
state. The caller decides which segment has a durable identity.&lt;/p&gt;

&lt;p&gt;The activity contract records:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;activity id
activity version
canonical input hash
started timestamp
terminal status
result or bounded error evidence
typed cancellation reason when applicable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This explicit boundary is useful because external side effects rarely have&lt;br&gt;
universal retry semantics. Uploading a chunk, charging a card and sending an&lt;br&gt;
email need different idempotency and repair policies.&lt;/p&gt;
&lt;h2&gt;
  
  
  The same id with different input is a conflict
&lt;/h2&gt;

&lt;p&gt;An activity id cannot safely mean two things.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ActivityConflictError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;createMemoryActivityStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;runActivity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/activity&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;memoryStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createMemoryActivityStore&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;runActivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;memoryStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;activityId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;export:42&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;page one&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;first&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;changed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;runActivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;memoryStore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;activityId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;export:42&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;page two&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;changed&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nx"&gt;ActivityConflictError&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second body does not run. WorkIt compares canonical input hashes and fails&lt;br&gt;
at the boundary.&lt;/p&gt;

&lt;p&gt;Inputs that cannot produce a stable JSON representation are rejected. This&lt;br&gt;
includes cyclic objects, functions, symbols, &lt;code&gt;bigint&lt;/code&gt;, non-finite numbers and&lt;br&gt;
&lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Completed records replay; uncertain records do not
&lt;/h2&gt;

&lt;p&gt;An activity record can be started, completed, failed or cancelled. Only a&lt;br&gt;
completed record returns its stored result on a later invocation.&lt;/p&gt;

&lt;p&gt;Started, failed and cancelled records fail closed. WorkIt does not silently&lt;br&gt;
rerun them because their external effects may be uncertain. A provider could&lt;br&gt;
have accepted a request just before the process stopped, or a cancellation&lt;br&gt;
could have arrived after a remote commit.&lt;/p&gt;

&lt;p&gt;The application can inspect the record and choose a repair policy. That may&lt;br&gt;
mean querying the provider by an idempotency key, compensating a partial effect&lt;br&gt;
or authorizing a new activity id.&lt;/p&gt;

&lt;p&gt;The runtime preserves evidence instead of guessing.&lt;/p&gt;
&lt;h2&gt;
  
  
  What restart evidence proves
&lt;/h2&gt;

&lt;p&gt;The release evidence runs the activity, discards the first store instance and&lt;br&gt;
opens a fresh file-store instance over the same directory. A second execution&lt;br&gt;
receives the saved result while the activity body remains at one invocation.&lt;/p&gt;

&lt;p&gt;This proves persistence across a store-shaped restart after a completed&lt;br&gt;
terminal write. The current evidence does not claim multi-process coordination,&lt;br&gt;
recovery after process termination or recovery of arbitrary in-flight work.&lt;/p&gt;
&lt;h2&gt;
  
  
  The application still owns external correctness
&lt;/h2&gt;

&lt;p&gt;Activity records do not replace provider idempotency keys, database&lt;br&gt;
transactions, distributed locks or compensation logic.&lt;/p&gt;

&lt;p&gt;The reliable composition is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;application chooses activity identity
provider receives its own idempotency key
WorkIt records terminal activity evidence
restart reuses completed evidence
uncertain states go through an explicit repair policy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This division keeps local lifecycle ownership separate from remote side-effect&lt;br&gt;
authority.&lt;/p&gt;
&lt;h2&gt;
  
  
  Executable evidence
&lt;/h2&gt;

&lt;p&gt;The relevant proofs are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CORR-012 explicit activity boundary and conflict detection
LIFE-008 file activity store restart replay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run them with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run &lt;span class="nb"&gt;test&lt;/span&gt;:evidence
npm run &lt;span class="nb"&gt;test&lt;/span&gt;:coverage
npm run verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The unit suite also covers input canonicalization, corrupt records, safe file&lt;br&gt;
names, terminal error evidence and cancellation reason persistence.&lt;/p&gt;

&lt;p&gt;The useful promise is intentionally bounded: for an explicit activity id and&lt;br&gt;
matching input, WorkIt can reuse a completed terminal result after restart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/WorkRuntime/workit/blob/main/packages/core/src/activity/index.ts" rel="noopener noreferrer"&gt;&lt;code&gt;@workit/core/activity&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/WorkRuntime/workit/blob/main/packages/core/tests/evidence/correctness/activity-boundary.mjs" rel="noopener noreferrer"&gt;&lt;code&gt;activity-boundary.mjs&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/WorkRuntime/workit/blob/main/packages/core/tests/evidence/lifecycle/activity-restart.mjs" rel="noopener noreferrer"&gt;&lt;code&gt;activity-restart.mjs&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/WorkRuntime/workit/blob/main/packages/core/evidence/claims.json" rel="noopener noreferrer"&gt;&lt;code&gt;claims.json&lt;/code&gt;&lt;/a&gt;
``&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>typescript</category>
      <category>node</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>I Built HaloLog, a Go Logger That Measured 23.9 ns/op. Then I Tried to Break the Claim</title>
      <dc:creator>AdmilsonCossa</dc:creator>
      <pubDate>Tue, 01 Sep 2026 09:42:52 +0000</pubDate>
      <link>https://dev.to/admilsoncossa/i-built-halolog-a-go-logger-that-measured-239-nsop-then-i-tried-to-break-the-claim-f74</link>
      <guid>https://dev.to/admilsoncossa/i-built-halolog-a-go-logger-that-measured-239-nsop-then-i-tried-to-break-the-claim-f74</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 1 of Engineering HaloLog: making high-performance telemetry claims&lt;br&gt;
reproducible and falsifiable.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;23.9 ns/op&lt;/code&gt; is a dangerous number.&lt;/p&gt;

&lt;p&gt;It is precise enough to be repeated and incomplete enough to mislead. Without&lt;br&gt;
the work unit, output contract, clock semantics, sink, concurrency model,&lt;br&gt;
hardware, toolchain, and competing configurations, it is not yet an engineering&lt;br&gt;
result. It is only a number with good typography.&lt;/p&gt;

&lt;p&gt;I built HaloLog, a structured logger for Go, around a zero-allocation hot path.&lt;br&gt;
On the original benchmark host, its bare-message path encoded and dispatched a&lt;br&gt;
complete JSON record in 23.9 ns. That reciprocal is roughly 42 million records&lt;br&gt;
per second on one goroutine.&lt;/p&gt;

&lt;p&gt;The second sentence needs more care than the first. It is arithmetic derived&lt;br&gt;
from a microbenchmark, not a sustained ingestion test. The benchmark writes to&lt;br&gt;
&lt;code&gt;io.Discard&lt;/code&gt;; it does not measure disk, network, batching, backpressure, or a&lt;br&gt;
production log collector. And the 23.9 ns value itself is being re-frozen after&lt;br&gt;
a fairness review changed how Zap should be represented.&lt;/p&gt;

&lt;p&gt;That review is the reason for this article.&lt;/p&gt;

&lt;p&gt;The interesting part of HaloLog is not that one benchmark produced a low&lt;br&gt;
number. It is the attempt to make performance claims executable: allocation&lt;br&gt;
guards fail CI, two encoding architectures are checked against the same byte&lt;br&gt;
contract, optimized paths become ineligible when transforms need structured&lt;br&gt;
data, and competitor configurations remain open to correction.&lt;/p&gt;

&lt;p&gt;This is how that system works, where it is strong, and where its claims stop.&lt;/p&gt;
&lt;h2&gt;
  
  
  First define the operation
&lt;/h2&gt;

&lt;p&gt;The comparative microbenchmark has a narrow job. Each logger must emit one&lt;br&gt;
newline-terminated structured JSON record containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a timestamp;&lt;/li&gt;
&lt;li&gt;a level;&lt;/li&gt;
&lt;li&gt;a message;&lt;/li&gt;
&lt;li&gt;the same scenario-specific field names, types, and values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The measured operation ends when those bytes have been encoded and dispatched&lt;br&gt;
to &lt;code&gt;io.Discard&lt;/code&gt;. Every comparative row uses one goroutine. Setup that an&lt;br&gt;
application would perform once, such as constructing a logger or binding&lt;br&gt;
request context, happens before the timed loop. Dynamic call-site fields remain&lt;br&gt;
inside it.&lt;/p&gt;

&lt;p&gt;That definition makes the result useful for one question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is the CPU and allocation cost of constructing and dispatching this log&lt;br&gt;
record through each public logging API, excluding destination I/O?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It does not answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How many records will my service persist through a particular file,&lt;br&gt;
collector, network, or storage stack under concurrent load?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those questions need different harnesses. Combining them in one number would&lt;br&gt;
hide more than it reveals.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz4q7mu3yshguk8v7b95v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz4q7mu3yshguk8v7b95v.png" alt="Diagram showing setup outside the timer followed by the timed public logger API, JSON encoding, byte dispatch, and io.Discard; disk, network, batching, backpressure, durability, collector throughput, and multi-goroutine scaling are explicitly excluded" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The comparison currently includes HaloLog, phuslu/log, zerolog, Zap, &lt;code&gt;slog&lt;/code&gt;,&lt;br&gt;
and logrus, with dependency versions pinned in the benchmark module. It uses&lt;br&gt;
typed fields where the library provides them. Caller and stack capture are not&lt;br&gt;
enabled for one logger while disabled for another. No comparative row receives&lt;br&gt;
a level-gated or disabled-output shortcut.&lt;/p&gt;

&lt;p&gt;Even after making those choices explicit, one assumption remained too weak:&lt;br&gt;
the benchmark documented output equivalence, but did not execute an output&lt;br&gt;
contract.&lt;/p&gt;
&lt;h2&gt;
  
  
  The maintainer feedback that changed the harness
&lt;/h2&gt;

&lt;p&gt;I opened a narrow discussion with the Zap community. The question was not&lt;br&gt;
whether Zap was “fast enough” or whether HaloLog had won. It was this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For dynamic fields available only at the call site, is&lt;br&gt;
&lt;code&gt;Logger.Info(msg, zap.Int(...))&lt;/code&gt; the idiomatic public hot path Zap should be&lt;br&gt;
represented by? If not, is there another public pattern with the same&lt;br&gt;
timestamp, level, message, and dynamic-field semantics but less per-call&lt;br&gt;
work?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A Zap maintainer replied that the usage looked basic but idiomatic. The useful&lt;br&gt;
part of the reply was elsewhere: &lt;a href="https://github.com/uber-go/zap/blob/master/benchmarks/zap_test.go#L105-L113" rel="noopener noreferrer"&gt;Zap's own benchmark&lt;br&gt;
configuration&lt;/a&gt; overrides the production time encoder with&lt;br&gt;
&lt;code&gt;EpochNanosTimeEncoder&lt;/code&gt;, which is cheaper than the default &lt;code&gt;EpochTimeEncoder&lt;/code&gt;.&lt;br&gt;
The maintainer also suggested asserting the actual output so differences such&lt;br&gt;
as time encoding could not pass unnoticed.&lt;/p&gt;

&lt;p&gt;That was a valid criticism.&lt;/p&gt;

&lt;p&gt;The committed comparison used &lt;code&gt;zap.NewProductionEncoderConfig()&lt;/code&gt;. Its default&lt;br&gt;
timestamp is a floating-point count of Unix seconds. Zap's benchmark override&lt;br&gt;
emits integer Unix nanoseconds. Both records still contain a timestamp, level,&lt;br&gt;
message, and the same dynamic fields, but they do not have the same byte&lt;br&gt;
representation.&lt;/p&gt;

&lt;p&gt;I measured the encoder change instead of arguing that it would be too small to&lt;br&gt;
matter. In an exploratory Windows A/B, the change was material in the one-field&lt;br&gt;
and request-scoped cases, small in the ten-field case, and too noisy to call in&lt;br&gt;
the twenty-field case. Allocation counts did not change.&lt;/p&gt;

&lt;p&gt;I am deliberately not publishing those exploratory percentages as a corrected&lt;br&gt;
cross-platform result. The final comparison must come from the upgraded,&lt;br&gt;
tagged suite with the same sample count and evidence policy on Linux and&lt;br&gt;
Windows. A local result can justify more investigation; it cannot silently&lt;br&gt;
become a public leaderboard.&lt;/p&gt;

&lt;p&gt;The correct response is not to overwrite the old Zap cell under the same name.&lt;br&gt;
Changing the time encoder changes the wire representation. The corrected suite&lt;br&gt;
will therefore report two named configurations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zap production-default timestamp&lt;/strong&gt;: fractional Unix seconds;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zap benchmark timestamp&lt;/strong&gt;: integer Unix nanoseconds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reader can see both the idiomatic production default and the faster variant&lt;br&gt;
used by Zap's own benchmark. Nothing is silently substituted after the fact.&lt;/p&gt;
&lt;h2&gt;
  
  
  Fairness became a test, not a paragraph
&lt;/h2&gt;

&lt;p&gt;The first new test exercises the same constructors as the benchmark. For each&lt;br&gt;
logger it captures a representative one-field operation and verifies:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;exactly one newline-terminated record was emitted;&lt;/li&gt;
&lt;li&gt;the record is valid JSON;&lt;/li&gt;
&lt;li&gt;timestamp and level are present;&lt;/li&gt;
&lt;li&gt;the expected message is present;&lt;/li&gt;
&lt;li&gt;the field value is a JSON number, not an accidentally quoted string.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a semantic contract. It deliberately does not require every logger to&lt;br&gt;
use the same key names for built-in metadata or the same timestamp format.&lt;br&gt;
Requiring byte identity across different public logger formats would be a fake&lt;br&gt;
form of fairness.&lt;/p&gt;

&lt;p&gt;The Zap encoder comparison has a second, stronger test. It installs a fixed&lt;br&gt;
clock and compares the complete bytes against two golden records. That makes&lt;br&gt;
the timestamp difference visible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"info"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"ts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;1700000000.1234567&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"msg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"request completed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"info"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"ts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1700000000123456789&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"msg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"request completed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same semantic fields. Different wire representation. Both facts matter.&lt;/p&gt;

&lt;p&gt;The test does not prove that every benchmark scenario across every library is&lt;br&gt;
byte-equivalent. It proves a representative output contract and pins the exact&lt;br&gt;
Zap difference that triggered the review. Extending that contract is now an&lt;br&gt;
explicit benchmark task, not an assumption buried in methodology prose.&lt;/p&gt;
&lt;h2&gt;
  
  
  Where the HaloLog hot path saves work
&lt;/h2&gt;

&lt;p&gt;HaloLog's measured path is not one clever instruction. Most of the gain comes&lt;br&gt;
from deciding when work must happen and who owns the resulting bytes.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Time is cached, with an explicit accuracy trade-off
&lt;/h3&gt;

&lt;p&gt;The default clock is refreshed by a background goroutine every 10 ms. A log&lt;br&gt;
call reads the cached Unix-nanosecond value instead of acquiring wall-clock time&lt;br&gt;
on every line.&lt;/p&gt;

&lt;p&gt;For the default whole-second JSON format, HaloLog caches the entire prefix for&lt;br&gt;
each &lt;code&gt;(second, level)&lt;/code&gt; pair:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"time":"2026-09-01T10:42:17Z","level":"INFO"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a steady-state cache hit, rendering that prefix is an atomic pointer load&lt;br&gt;
and one append/copy into the line buffer. When the second changes, the next call&lt;br&gt;
rebuilds the immutable entry and atomically publishes it.&lt;/p&gt;

&lt;p&gt;This optimization is not free semantics. A cached clock can lag wall time by&lt;br&gt;
approximately its refresh interval, and scheduler pauses can extend that lag.&lt;br&gt;
Whole-second timestamps intentionally discard sub-second detail. HaloLog offers&lt;br&gt;
millisecond, microsecond, and nanosecond &lt;em&gt;formatting&lt;/em&gt;, but those settings do not&lt;br&gt;
make the global 10 ms clock fresher. The current public logger configuration&lt;br&gt;
does not inject a different clock. A workload requiring tighter timestamp&lt;br&gt;
freshness should not inherit the default-path claim; configurable clock&lt;br&gt;
freshness is a limitation to resolve and benchmark separately.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Request context is encoded when it becomes context
&lt;/h3&gt;

&lt;p&gt;Service logs often repeat the same fields for every line in a request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;reqLog&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;With&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="n"&gt;WithString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"payments"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="n"&gt;WithString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"eu-west-1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="n"&gt;WithString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"request_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requestID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="n"&gt;WithInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"shard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="n"&gt;WithString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"1.4.2"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="n"&gt;Logger&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;reqLog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Typed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"request completed"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The context builder keeps two representations. It stores structured fields for&lt;br&gt;
paths that need transforms, and it encodes their final &lt;code&gt;,"key":value&lt;/code&gt; bytes for&lt;br&gt;
the direct path. After &lt;code&gt;Logger()&lt;/code&gt; creates the child, a direct log line appends&lt;br&gt;
the complete bound byte slice once. It does not re-run five key scans and five&lt;br&gt;
value encoders on every record.&lt;/p&gt;

&lt;p&gt;Construction is not free. Building the context allocates and copy-on-appends to&lt;br&gt;
keep branched builders from sharing writable backing. HaloLog caps bound context&lt;br&gt;
at 32 fields. Those costs occur when the child logger is derived, outside the&lt;br&gt;
per-line benchmark. A fair evaluation should report both construction cost and&lt;br&gt;
steady-state line cost; they answer different lifecycle questions.&lt;/p&gt;

&lt;p&gt;The measured request-scoped scenario uses primitive typed values. Arbitrary&lt;br&gt;
&lt;code&gt;Any&lt;/code&gt; values, mutable references, duplicate keys, and transform-heavy&lt;br&gt;
configurations deserve separate ownership and semantic tests; they do not get&lt;br&gt;
to borrow the primitive direct-path result.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. The fast path is an eligibility decision
&lt;/h3&gt;

&lt;p&gt;With one raw-capable JSON adapter and no masking or sampling, HaloLog can encode&lt;br&gt;
typed fields directly into a pooled byte buffer. The line becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cached header + escaped message + bound context + call-site fields + "}\n"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no intermediate &lt;code&gt;LogEntry&lt;/code&gt; on that path.&lt;/p&gt;

&lt;p&gt;But masking and sampling need structured data. If either is configured, or if&lt;br&gt;
the output shape cannot use the direct JSON encoder, the logger selects the&lt;br&gt;
capture path at construction. Bound context is then prepended as structured&lt;br&gt;
fields, the transform sees the complete record, and the formatter emits it&lt;br&gt;
afterward.&lt;/p&gt;

&lt;p&gt;This is the security property I care about: the optimized path is not asked to&lt;br&gt;
remember to call the masker. It is ineligible when masking exists.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1wcuxyn32ka6jsjn25ok.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1wcuxyn32ka6jsjn25ok.png" alt="Decision diagram showing that a logger with exactly one raw-capable JSON adapter and no masking or sampling uses the direct path; every other configuration uses the structured capture path, preserving the invariant that configured masking makes the direct encoder ineligible" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That does not prove every regular expression is a sufficient PII policy, that&lt;br&gt;
arbitrary values cannot contain secrets, or that encryption and retention are&lt;br&gt;
solved. It proves a narrower architectural invariant: configuring the shipped&lt;br&gt;
masking transform prevents this direct encoder from bypassing it.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. The string scanner optimizes the common case and retains an oracle
&lt;/h3&gt;

&lt;p&gt;JSON strings only need special handling for control bytes, quotes, and&lt;br&gt;
backslashes. On the little-endian targets covered by the current implementation,&lt;br&gt;
HaloLog's scanner examines eight bytes at a time with SWAR (SIMD Within A&lt;br&gt;
Register) bit tricks. A clean word advances without eight separate table&lt;br&gt;
checks. A possible hit falls back to the exact scalar escape path. Other&lt;br&gt;
architectures must earn their own correctness and performance result; this&lt;br&gt;
article does not infer one from amd64.&lt;/p&gt;

&lt;p&gt;The optimization is guarded by two different kinds of evidence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exhaustive placement of every possible byte value across SWAR lanes and
boundary positions;&lt;/li&gt;
&lt;li&gt;structured cases and a Go fuzz target compared against the retained scalar
implementation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Exhaustive” applies to the enumerated byte-position test, not to the infinite&lt;br&gt;
space of possible strings. Fuzzing explores additional combinations; it is not&lt;br&gt;
a proof by itself.&lt;/p&gt;

&lt;p&gt;An experimental portable SIMD implementation produced a surprising result on&lt;br&gt;
one Go version and machine: it lost to the shipped SWAR scanner at typical log&lt;br&gt;
string sizes. That result is interesting, but it is not evidence that SIMD is&lt;br&gt;
inherently slower. It belongs to a separately reproducible experiment with the&lt;br&gt;
exact branch, experiment flag, reductions, size distribution, and crossover&lt;br&gt;
points. The full analysis will be a later article rather than a paragraph that&lt;br&gt;
generalizes past its data.&lt;/p&gt;
&lt;h2&gt;
  
  
  Zero allocation is a regression gate, not an adjective
&lt;/h2&gt;

&lt;p&gt;Benchmark output saying &lt;code&gt;0 B/op&lt;/code&gt; once is weak evidence. A compiler update, an&lt;br&gt;
interface escape, or a seemingly harmless refactor can bring the allocation&lt;br&gt;
back.&lt;/p&gt;

&lt;p&gt;HaloLog currently has eight &lt;code&gt;TestZeroAlloc*&lt;/code&gt; guards covering selected paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;message-only logging;&lt;/li&gt;
&lt;li&gt;interface-style field chains;&lt;/li&gt;
&lt;li&gt;real-adapter dispatch rather than only a discard shortcut;&lt;/li&gt;
&lt;li&gt;direct message encoding;&lt;/li&gt;
&lt;li&gt;bound-context direct and capture paths;&lt;/li&gt;
&lt;li&gt;typed inline and pooled field builders;&lt;/li&gt;
&lt;li&gt;the direct-path field API;&lt;/li&gt;
&lt;li&gt;the level-first line API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They use &lt;code&gt;testing.AllocsPerRun&lt;/code&gt; and fail when the protected operation allocates.&lt;br&gt;
The benchmark workflow treats those tests as a hard gate while reporting&lt;br&gt;
latency without failing on noisy shared-runner nanoseconds.&lt;/p&gt;

&lt;p&gt;This claim has a boundary too. Context construction allocates. Configuration&lt;br&gt;
allocates. Long or hostile values can outgrow retained buffers. Some adapters,&lt;br&gt;
arbitrary-value formatting, transforms, and asynchronous ownership have&lt;br&gt;
different cost models. “Eight protected hot paths remain at zero allocations”&lt;br&gt;
is defensible. “The library never allocates” is not.&lt;/p&gt;

&lt;p&gt;Allocation tests are not concurrency evidence. That is a separate gate. The&lt;br&gt;
main CI calls a reusable workflow pinned by commit and runs the root module&lt;br&gt;
with the race detector on both Linux and Windows. The &lt;code&gt;otelbridge&lt;/code&gt; module runs&lt;br&gt;
its own race-enabled suite. This still does not establish linear scalability or&lt;br&gt;
prove the absence of all concurrency bugs; it means the committed test&lt;br&gt;
executions are race-instrumented on those runners.&lt;/p&gt;
&lt;h2&gt;
  
  
  Two encoders, one tested byte contract
&lt;/h2&gt;

&lt;p&gt;The direct path is optimized for the simplest eligible JSON configuration. The&lt;br&gt;
capture path exists because real logging systems need transforms, multiple&lt;br&gt;
adapters, sampling, metrics, and less specialized values.&lt;/p&gt;

&lt;p&gt;Maintaining two implementations normally creates semantic drift. A quote is&lt;br&gt;
escaped in one but not the other. A negative timestamp crosses an epoch&lt;br&gt;
boundary differently. A bound field appears before call-site fields in one&lt;br&gt;
path and after them in another. A security transform sees only one&lt;br&gt;
representation.&lt;/p&gt;

&lt;p&gt;HaloLog keeps a reference-style formatter and compares the direct path against&lt;br&gt;
it. Golden tests pin complete output segments. Context tests normalize only the&lt;br&gt;
timestamp portion and compare the remaining bytes. Key-prefix and string&lt;br&gt;
oracles retain the older scalar form and compare optimized output against it.&lt;/p&gt;

&lt;p&gt;This is differential testing applied inside one library. It does not prove that&lt;br&gt;
the chosen JSON contract is universally ideal. It makes unintended divergence&lt;br&gt;
between the two implementations observable.&lt;/p&gt;

&lt;p&gt;The same discipline applies to &lt;code&gt;halologgen&lt;/code&gt;, the included schema generator. It&lt;br&gt;
regenerates the committed example into a temporary directory and byte-compares&lt;br&gt;
the result. A misspelled field method or wrong value type becomes a compile-time&lt;br&gt;
problem; nondeterministic generator output becomes a failing test. That is a&lt;br&gt;
different thesis from runtime encoding performance, so it receives its own&lt;br&gt;
article in this series.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why there is no corrected ranking in this article
&lt;/h2&gt;

&lt;p&gt;The repository retains the original published comparison and its methodology.&lt;br&gt;
I am not pasting that table here and quietly changing one competitor's&lt;br&gt;
configuration underneath it.&lt;/p&gt;

&lt;p&gt;The corrected evidence release will upgrade Zap, name both timestamp encoders,&lt;br&gt;
and report Linux and Windows separately. It will use at least ten samples per&lt;br&gt;
row, retain raw benchmark output, publish &lt;code&gt;benchstat&lt;/code&gt; summaries, and treat cells&lt;br&gt;
inside the declared noise threshold as ties. A delta measured on one operating&lt;br&gt;
system will not be projected onto another.&lt;/p&gt;

&lt;p&gt;Until that release is frozen, the defensible result is methodological:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The maintainer feedback identified a faster, semantically different Zap&lt;br&gt;
timestamp configuration. The difference was large enough in exploratory&lt;br&gt;
measurement to require a separately named result, and the harness now has&lt;br&gt;
executable output checks that make the distinction visible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That conclusion survives even if HaloLog's final median or ranking changes.&lt;/p&gt;
&lt;h2&gt;
  
  
  What this article does not prove
&lt;/h2&gt;

&lt;p&gt;It does not prove that HaloLog is the best logger for every Go service.&lt;br&gt;
Performance is one selection criterion. API stability, ecosystem maturity,&lt;br&gt;
operational familiarity, integrations, support horizon, and the cost of&lt;br&gt;
changing an existing logging stack may matter more.&lt;/p&gt;

&lt;p&gt;It does not measure storage throughput or durability. &lt;code&gt;io.Discard&lt;/code&gt; removes the&lt;br&gt;
destination so encoding and dispatch remain visible. A file, socket, collector,&lt;br&gt;
or congested pipeline can dominate the total cost.&lt;/p&gt;

&lt;p&gt;It does not show multi-goroutine scalability or p99 caller latency. Those need a&lt;br&gt;
macro harness with controlled sinks, concurrency, queue capacity, drop policy,&lt;br&gt;
and backpressure. That work is planned separately.&lt;/p&gt;

&lt;p&gt;It does not prove universal zero allocation. It identifies and guards exact&lt;br&gt;
paths on a named Go toolchain.&lt;/p&gt;

&lt;p&gt;It does not prove SIMD is slow, that a 10 ms cached clock is suitable for every&lt;br&gt;
system, or that matching four semantic fields makes all logging formats&lt;br&gt;
interchangeable.&lt;/p&gt;

&lt;p&gt;And a new public project with a small external user base has not earned the&lt;br&gt;
ecosystem evidence of Zap, zerolog, or the standard library. Microbenchmarks can&lt;br&gt;
measure code. They cannot manufacture operational history.&lt;/p&gt;
&lt;h2&gt;
  
  
  Reproduce it, then try to invalidate it
&lt;/h2&gt;

&lt;p&gt;The repository pins dependency versions, test sources, and the historical&lt;br&gt;
methodology. The core checks are ordinary Go tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;test&lt;/span&gt; ./core &lt;span class="nt"&gt;-run&lt;/span&gt; &lt;span class="s1"&gt;'TestZeroAlloc|TestDirectPath|TestContext_'&lt;/span&gt; &lt;span class="nt"&gt;-count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1

go &lt;span class="nb"&gt;test&lt;/span&gt; ./adapters/formatters/json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-run&lt;/span&gt; &lt;span class="s1"&gt;'TestSWAR|TestDirectMatchesFormat|TestAppendKeyPrefix|TestFormatterGolden|TestHeaderZeroAlloc'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1

go &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;-race&lt;/span&gt; ./... &lt;span class="nt"&gt;-count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The corrected comparative run uses the normal Go benchmark toolchain. The Zap&lt;br&gt;
timestamp A/B remains a named benchmark instead of being hidden inside a&lt;br&gt;
generic &lt;code&gt;Zap&lt;/code&gt; row:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;benchmarks
go &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;-run&lt;/span&gt; &lt;span class="s1"&gt;'^$'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-bench&lt;/span&gt; &lt;span class="s1"&gt;'Benchmark(Info|OneField|TenFields|TwentyFields|Context|ZapTimeEncoder)$'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-benchmem&lt;/span&gt; &lt;span class="nt"&gt;-benchtime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1s &lt;span class="nt"&gt;-count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10 &lt;span class="nb"&gt;.&lt;/span&gt; | &lt;span class="nb"&gt;tee &lt;/span&gt;results.txt
benchstat results.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are several useful ways to break the claim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;produce a record that violates the declared output contract;&lt;/li&gt;
&lt;li&gt;find a protected path that allocates on the release toolchain;&lt;/li&gt;
&lt;li&gt;demonstrate a race or ownership failure;&lt;/li&gt;
&lt;li&gt;show that a competitor configuration performs equivalent work with less
overhead;&lt;/li&gt;
&lt;li&gt;reproduce a ranking change on a documented machine;&lt;/li&gt;
&lt;li&gt;find a masking, escaping, timestamp, or context case where the two paths
diverge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open an issue with the smallest counterexample and the complete environment.&lt;br&gt;
That is more valuable than a benchmark screenshot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result I want to preserve
&lt;/h2&gt;

&lt;p&gt;The original result was a low latency number. The more important result is a&lt;br&gt;
process that can survive having that number challenged.&lt;/p&gt;

&lt;p&gt;A maintainer found a configuration difference. The benchmark changed. Output&lt;br&gt;
assumptions became tests. The faster competitor path will be published beside&lt;br&gt;
the production default instead of hidden or used to overwrite history.&lt;/p&gt;

&lt;p&gt;That is the standard I want HaloLog to meet:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fast paths may be specialized. Claims about them may not be vague.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The next articles will go deeper into benchmark contracts, bind-once request&lt;br&gt;
context, byte-identity testing, allocation guards, SWAR versus portable SIMD,&lt;br&gt;
compile-checked telemetry generation, and the gap between encoding&lt;br&gt;
microbenchmarks and logging under load.&lt;/p&gt;

&lt;p&gt;For now, the invitation is simpler: run the evidence, inspect the output, and&lt;br&gt;
find the condition I missed.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/Go-Gen-Ecosystem/halolog" rel="noopener noreferrer"&gt;Go-Gen-Ecosystem/halolog&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Benchmark source:&lt;/strong&gt; &lt;a href="https://github.com/Go-Gen-Ecosystem/halolog/blob/main/benchmarks/comparison_bench_test.go" rel="noopener noreferrer"&gt;comparison_bench_test.go&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Request-context benchmark:&lt;/strong&gt; &lt;a href="https://github.com/Go-Gen-Ecosystem/halolog/blob/main/benchmarks/context_bench_test.go" rel="noopener noreferrer"&gt;context_bench_test.go&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Published historical methodology:&lt;/strong&gt; &lt;a href="https://github.com/Go-Gen-Ecosystem/halolog/blob/main/benchmarks/comprehensive_comparison.md" rel="noopener noreferrer"&gt;comprehensive_comparison.md&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Zap fairness discussion:&lt;/strong&gt; &lt;a href="https://github.com/uber-go/zap/discussions/1576" rel="noopener noreferrer"&gt;uber-go/zap discussion #1576&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next article will isolate benchmark fairness itself: timestamp semantics,&lt;br&gt;
output contracts, maintainer feedback, and what belongs inside the timed loop.&lt;/p&gt;

</description>
      <category>go</category>
      <category>performance</category>
      <category>opensource</category>
      <category>observability</category>
    </item>
    <item>
      <title>AI Agents Are Making an Old Distributed Systems Bug More Expensive</title>
      <dc:creator>AdmilsonCossa</dc:creator>
      <pubDate>Fri, 07 Aug 2026 12:14:13 +0000</pubDate>
      <link>https://dev.to/admilsoncossa/ai-agents-are-making-an-old-distributed-systems-bug-more-expensive-14g1</link>
      <guid>https://dev.to/admilsoncossa/ai-agents-are-making-an-old-distributed-systems-bug-more-expensive-14g1</guid>
      <description>&lt;h2&gt;
  
  
  The dual-write problem existed long before LLMs. Now a duplicate event can trigger fraud investigations, payment holds, refunds, or financial execution.
&lt;/h2&gt;




&lt;p&gt;At 11:57 PM on Black Friday, a global commerce platform approves a €2.4 million payout to a merchant.&lt;/p&gt;

&lt;p&gt;The ledger commits the transaction. The application publishes &lt;code&gt;PayoutApproved&lt;/code&gt;. Then the request times out.&lt;/p&gt;

&lt;p&gt;Nothing is necessarily down. The database is healthy. The broker may also be healthy. The network recovered milliseconds later. Every dashboard is still green.&lt;/p&gt;

&lt;p&gt;Yet the system has lost something more dangerous than availability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It has lost certainty.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvqn84ftb57u8arlvz71z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvqn84ftb57u8arlvz71z.png" alt="Sequence diagram showing a payout database commit followed by an event publication whose acknowledgement is lost, leaving the producer uncertain whether to retry." width="800" height="731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Did the broker receive the event?&lt;/p&gt;

&lt;p&gt;If the producer does nothing, the risk system may never analyze the payout. If the producer retries — and the first publication actually succeeded — the event may be delivered twice. If downstream execution is not idempotent, the same business operation may be applied twice.&lt;/p&gt;

&lt;p&gt;A few milliseconds of uncertainty can become a multimillion-euro question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Did the operation fail, or did we merely fail to observe that it succeeded?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is not fundamentally a Kafka problem, a NATS problem, or an AI problem. It is a distributed systems problem.&lt;/p&gt;

&lt;p&gt;Modern AI agents make it more expensive because event consumers are becoming more capable. A duplicate event no longer has to mean a duplicated projection or a repeated log line. It may wake an agent that assesses fraud, recommends a payment hold, launches an investigation, requests a refund, or calls a tool connected to an external financial system.&lt;/p&gt;

&lt;p&gt;The delivery semantics did not get worse. &lt;strong&gt;What sits behind the event became more powerful.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The architecture needs answers to six questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where does the event become authoritative?&lt;/li&gt;
&lt;li&gt;How is publication recovered after failure?&lt;/li&gt;
&lt;li&gt;How do consumers tolerate redelivery?&lt;/li&gt;
&lt;li&gt;How is ordering preserved where the business requires it?&lt;/li&gt;
&lt;li&gt;How does each irreversible effect receive a stable identity, survive executor crashes, and remain reconcilable when its outcome is unknown?&lt;/li&gt;
&lt;li&gt;How does a probabilistic assessment become one authoritative, deterministic decision?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Your Broker Does Not Solve the Dual-Write Problem
&lt;/h2&gt;

&lt;p&gt;A service that approves a payout typically performs two operations that conceptually belong together but live in two separate transactional systems: the database and the broker.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw4p29q5rnkt5bp5zybpb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw4p29q5rnkt5bp5zybpb.png" alt="Flowchart showing the database update and event publication in different transaction boundaries." width="800" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is no automatic atomic transaction spanning both systems, which creates three distinct failure states:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Failure&lt;/th&gt;
&lt;th&gt;Consequence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Database commits, event publish fails&lt;/td&gt;
&lt;td&gt;Business state exists, downstream systems never learn about it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event published, database transaction rolls back&lt;/td&gt;
&lt;td&gt;Consumers observe something that never became true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Broker accepts event, ACK is lost, producer retries&lt;/td&gt;
&lt;td&gt;Possible duplicate delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is the &lt;strong&gt;dual-write problem&lt;/strong&gt;. A broker gives you decoupling, buffering, durability, fan-out, replay, and failure isolation. What it does &lt;strong&gt;not&lt;/strong&gt; give you is atomicity between an event and the database state that caused that event to exist. That distinction is the foundation for everything that follows.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Broker Guarantees Stop at Their Transaction Boundary
&lt;/h2&gt;

&lt;p&gt;The useful question is not &lt;em&gt;“which broker is best?”&lt;/em&gt; It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Which state transitions can this product make atomic, and where does that atomicity stop?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Kafka and Redpanda can provide transactional guarantees across supported broker operations. Kafka Streams, for example, can atomically combine consumed offsets, state-store updates, and produced records within the Kafka transaction boundary.&lt;/p&gt;

&lt;p&gt;RabbitMQ provides durable queues, publisher confirms, acknowledgements, quorum queues, and routing mechanisms. NATS JetStream provides durable streams, acknowledgements, redelivery, and time-bounded publication deduplication.&lt;/p&gt;

&lt;p&gt;These are valuable guarantees, but they belong to different boundaries:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Boundary&lt;/th&gt;
&lt;th&gt;Guarantee that may be available&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Broker record → broker record&lt;/td&gt;
&lt;td&gt;Broker transaction or atomic stream-processing operation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Producer → broker&lt;/td&gt;
&lt;td&gt;Confirmed or acknowledged publication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Broker → consumer&lt;/td&gt;
&lt;td&gt;Durable delivery with acknowledgement and redelivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application database → broker&lt;/td&gt;
&lt;td&gt;Not atomic without an Outbox or equivalent mechanism&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Broker → external provider&lt;/td&gt;
&lt;td&gt;Not atomic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internal ledger → bank transfer&lt;/td&gt;
&lt;td&gt;Not atomic without a provider-level uniqueness and reconciliation contract&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A broker transaction cannot atomically commit an unrelated Postgres transaction, a payment-provider request, or a bank transfer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose the broker from the workload. Design correctness from the transaction boundary.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. AI Agents Don't Create the Problem — They Increase Its Blast Radius
&lt;/h2&gt;

&lt;p&gt;The dual-write problem predates LLMs by decades. Retries, duplicate messages, lost acknowledgements, and reordered events are established distributed systems failure modes. What's changed is what a consumer can now &lt;em&gt;do&lt;/em&gt; with a duplicate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F526k9j86s2c0dkxjyh2e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F526k9j86s2c0dkxjyh2e.png" alt="Low-risk event path from PayoutApproved through a projection consumer to a dashboard update." width="798" height="81"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1byqpqphcwo4hrmgawgf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1byqpqphcwo4hrmgawgf.png" alt="Higher-risk event path from PayoutApproved through an AI risk agent, fraud recommendation, policy decision, and payment action." width="800" height="51"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the old projection consumer processes a duplicate twice, and the projection is idempotent, the impact may be negligible. If the &lt;em&gt;same duplicate&lt;/em&gt; now traverses an agentic path, it can trigger a second fraud investigation, a second account block, or a second refund instruction.&lt;/p&gt;

&lt;p&gt;That doesn't make AI agents inherently unsafe. It means the architecture around them must assume messages arrive more than once, agents can be wrong, tools can time out, models can change, and external systems can return ambiguous outcomes.&lt;/p&gt;

&lt;p&gt;Once an agent participates, the architecture must distinguish three identities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;eventId&lt;/code&gt; — the immutable identity of a fact that happened;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;decisionRequestId&lt;/code&gt; — the identity of one request for an assessment or decision;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;operationId&lt;/code&gt; — the identity of one intended external business effect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These identifiers are related through causation, but they are not interchangeable. One event may legitimately trigger multiple decisions, and one approved decision may produce multiple external operations. Reusing &lt;code&gt;eventId&lt;/code&gt; for every boundary can suppress legitimate work or accidentally collapse distinct effects into one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An AI agent should never move money simply because it generated a plausible answer.&lt;/strong&gt; The safer boundary separates reasoning from execution:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frway740pm716pxsth1i3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frway740pm716pxsth1i3.png" alt="Safe execution boundary separating an AI assessment, deterministic policy decision, durable external operation, and payment execution." width="795" height="74"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI recommends. Policies decide. Systems execute.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent analyzes, classifies, explains, and recommends. A deterministic service evaluates limits, permissions, segregation of duties, and compliance. Only then does an idempotent executor perform the external effect.&lt;/p&gt;

&lt;p&gt;A retry of the same &lt;code&gt;decisionRequestId&lt;/code&gt; should return the already-recorded assessment. A reevaluation caused by new evidence, a new aggregate version, or an explicit review request receives a new identity. Idempotency here does not require a probabilistic model to generate identical tokens; it prevents a transport retry from creating a second authoritative decision.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. CDC Is More Than a Legacy Escape Hatch
&lt;/h2&gt;

&lt;p&gt;Enterprise systems rarely start clean. Banks, insurers, and telecoms often depend on ERPs and settlement engines built years before event-driven architecture became mainstream. Rewriting them to emit domain events may be too risky.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Change Data Capture&lt;/strong&gt; — commonly Debezium — observes transactional database logs and captures committed changes without touching the legacy application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa3mz16r5dsngqdwntdld.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa3mz16r5dsngqdwntdld.png" alt="CDC flow from a legacy database through log capture and a translation layer into stable domain events." width="800" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The trap: a row mutation is not automatically a domain event. &lt;code&gt;STATUS = 'A'&lt;/code&gt; might mean &lt;em&gt;approved&lt;/em&gt;, &lt;em&gt;awaiting review&lt;/em&gt;, or an internal transition with no meaning outside the legacy system. If downstream services must understand physical tables and cryptic status codes, the database schema has silently become a public contract — and a fragile one.&lt;/p&gt;

&lt;p&gt;A translation layer protects the rest of the organization from the legacy system's physical representation. CDC is also strategic beyond migration: it can feed search indexes, warehouses, read models — and most importantly, it can capture an &lt;strong&gt;Outbox&lt;/strong&gt; table, transporting events the application &lt;em&gt;deliberately&lt;/em&gt; designed rather than technical noise.&lt;/p&gt;

&lt;p&gt;CDC also inherits the ordering and transaction semantics of the source log. A translation layer must preserve transaction identity and commit order where the downstream business invariant depends on them; row-level change order alone is not automatically domain-event order.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Transactional Outbox Fixes the Birth of the Event
&lt;/h2&gt;

&lt;p&gt;A new payment service knows two facts at the same instant: the payout changed state, and an event describing that change must eventually be published. Instead of two independent writes, it records both facts in &lt;strong&gt;one local transaction&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;BEGIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;advanced_payout&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;payouts&lt;/span&gt;
    &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'APPROVED'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;version&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'pay_7f9q'&lt;/span&gt;
      &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="k"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;
    &lt;span class="n"&gt;RETURNING&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;version&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;outbox&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;aggregate_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;aggregate_version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;occurred_at&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="s1"&gt;'evt_01K...'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'PayoutApproved'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'{"payoutId":"pay_7f9q"}'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;advanced_payout&lt;/span&gt;
&lt;span class="n"&gt;RETURNING&lt;/span&gt; &lt;span class="n"&gt;aggregate_version&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- The application must require exactly one returned row.&lt;/span&gt;
&lt;span class="c1"&gt;-- Zero rows means that the expected version was stale.&lt;/span&gt;

&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The version is advanced on the aggregate row inside the same transaction that records the Outbox event. It is not allocated from a standalone database sequence.&lt;/p&gt;

&lt;p&gt;That distinction matters. Database sequences provide unique values, not gapless committed aggregate history. In PostgreSQL, a value obtained from &lt;code&gt;nextval()&lt;/code&gt; is not reclaimed when the surrounding transaction rolls back. A consumer waiting for every sequence value could therefore wait forever for an event that can never exist.&lt;/p&gt;

&lt;p&gt;The schema should protect both identities:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;outbox_event_id_uq&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;outbox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;outbox_aggregate_version_uq&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;outbox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aggregate_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;aggregate_version&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first constraint protects global event identity. The second prevents two committed events from claiming the same position in one aggregate's history.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8sqv8yhlaqcjlo2yqohx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8sqv8yhlaqcjlo2yqohx.png" alt="Transactional Outbox flow recording the payout update and Outbox event in one database transaction before asynchronous publication." width="800" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the transaction fails, neither the state transition nor the event exists. If it commits, both exist with the same aggregate version. Publication becomes a recoverable asynchronous process rather than a second point of failure.&lt;/p&gt;

&lt;p&gt;This solves the &lt;em&gt;birth&lt;/em&gt; of the event. It does not guarantee that publication succeeds before retention expires, that a consumer applies the event, or that an external provider executes the intended effect.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Outbox Does Not Mean Exactly-Once
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8tyduf3xa3xyg211ev9d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8tyduf3xa3xyg211ev9d.png" alt="Sequence diagram showing a relay publishing an Outbox event twice after crashing before it records the first successful publication." width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The duplicate here isn't evidence of a broken broker — it's the correct consequence of recovering safely from uncertainty.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Do not build correctness on the assumption that delivery happens exactly once. Build consumers so repeated delivery does not repeat the business effect.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The working invariant:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Record intent atomically. Retry delivery until it is durably observed. Give every business effect a stable identity. Reconcile every outcome that cannot be proven.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Kafka and Redpanda offer exactly-once semantics &lt;em&gt;inside&lt;/em&gt; defined transactional boundaries. NATS offers publication deduplication within a configured window. None of that automatically makes &lt;code&gt;POST https://external-bank/pay&lt;/code&gt; exactly-once — the broker doesn't control the bank.&lt;/p&gt;

&lt;p&gt;Even “at least once” depends on operational assumptions: retention must not expire, durable storage must remain available, incompatible schemas must not block the consumer indefinitely, and operators must not discard unresolved records. Correctness therefore requires monitoring the age of the oldest unpublished and unprocessed intent, not merely counting successful messages.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Inbox Deduplication Is Atomic Only With Local Effects
&lt;/h2&gt;

&lt;p&gt;Outbox solves one source of duplication, not all of them. If a client retries &lt;code&gt;POST /payouts&lt;/code&gt; after losing the response, the service may create two payouts before the Outbox becomes relevant. Ingress commands therefore need a stable idempotency key and a stored result.&lt;/p&gt;

&lt;p&gt;At consumption time, an Inbox prevents repeated delivery from repeating a &lt;strong&gt;local&lt;/strong&gt; effect — but only when the Inbox row and that effect commit in the same database transaction.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;BEGIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;accepted&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;inbox&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;consumer_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;received_at&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'payout-projection'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'evt_01K...'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;CONFLICT&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt; &lt;span class="k"&gt;NOTHING&lt;/span&gt;
    &lt;span class="n"&gt;RETURNING&lt;/span&gt; &lt;span class="n"&gt;event_id&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;payout_projection&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'APPROVED'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;source_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;payout_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'pay_7f9q'&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;accepted&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Acknowledge the broker message only after COMMIT succeeds.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The uniqueness scope includes &lt;code&gt;consumer_name&lt;/code&gt; because different consumers may legitimately process the same event.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdcxrnikxprbsouxh4kxh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdcxrnikxprbsouxh4kxh.png" alt="Transactional Inbox flow applying the deduplication record and local projection in one transaction before acknowledging the broker." width="798" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The crash behavior is now safe:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Crash point&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Before commit&lt;/td&gt;
&lt;td&gt;Both the Inbox insert and projection update roll back; the broker redelivers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;After commit&lt;/td&gt;
&lt;td&gt;Both the Inbox row and projection update exist; redelivery is a local no-op&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Inbox retention must also cover the maximum broker replay and recovery horizon. Deleting deduplication rows while the corresponding events can still be replayed reopens the duplicate window.&lt;/p&gt;

&lt;p&gt;An Inbox row is therefore a completion record only when the business effect lives inside the same local transaction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An HTTP request, bank transfer, email, or agent tool invocation cannot join that transaction.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  8. External Effects Need a Durable Operation Ledger
&lt;/h2&gt;

&lt;p&gt;For an external effect, “event observed” and “business operation completed” must be separate durable facts.&lt;/p&gt;

&lt;p&gt;If a consumer commits an Inbox row and then crashes before calling the provider, redelivery may find the event already recorded and suppress work that never happened. Inbox conflicts stay normal, the dead-letter queue remains empty, and the missing effect can look like a healthy no-op.&lt;/p&gt;

&lt;p&gt;The consumer must atomically record recoverable work before acknowledging the event:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;BEGIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;accepted&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;inbox&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;consumer_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;received_at&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'payment-executor'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'evt_01K...'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;CONFLICT&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt; &lt;span class="k"&gt;NOTHING&lt;/span&gt;
    &lt;span class="n"&gt;RETURNING&lt;/span&gt; &lt;span class="n"&gt;event_id&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;external_operations&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;operation_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;source_event_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;aggregate_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;operation_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;idempotency_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;attempt_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="s1"&gt;'payout:pay_7f9q:release:decision-12'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'evt_01K...'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'pay_7f9q'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'RELEASE_PAYOUT'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'PENDING'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'payout:pay_7f9q:release:decision-12'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;accepted&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;CONFLICT&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;operation_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt; &lt;span class="k"&gt;NOTHING&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Acknowledge the broker event only after both durable records exist.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;accepted&lt;/code&gt; dependency matters: it makes creation of the external operation conditional on this consumer accepting the event. &lt;code&gt;operationId&lt;/code&gt; identifies the intended business effect. It should not automatically be the same as &lt;code&gt;eventId&lt;/code&gt;: one event may legitimately produce more than one effect, while several redeliveries may refer to the same effect.&lt;/p&gt;

&lt;p&gt;A separate worker claims durable operations using an expiring lease:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fethve935uvxbte6p4f7f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fethve935uvxbte6p4f7f.png" alt="State machine for an external operation moving through PENDING, IN_FLIGHT, CONFIRMED, FAILED_TERMINAL, and UNKNOWN with reconciliation." width="800" height="663"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;IN_FLIGHT&lt;/code&gt; is not allowed to remain permanently owned by a dead worker. When its lease expires, the operation is recovered by a scanner. If dispatch may already have started, the scanner must reconcile or retry with the same provider idempotency key — never assume that the first attempt failed.&lt;/p&gt;

&lt;p&gt;The recovery contract must cover every crash window:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Crash point&lt;/th&gt;
&lt;th&gt;Durable state&lt;/th&gt;
&lt;th&gt;Recovery&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Before the operation transaction commits&lt;/td&gt;
&lt;td&gt;No operation exists&lt;/td&gt;
&lt;td&gt;Broker redelivery recreates it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;After commit, before provider dispatch&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;PENDING&lt;/code&gt; or an unstarted expired claim&lt;/td&gt;
&lt;td&gt;Worker claims and dispatches it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;After dispatch may have started, before local confirmation&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;IN_FLIGHT&lt;/code&gt; with an ambiguous outcome&lt;/td&gt;
&lt;td&gt;Query the provider or retry with the same idempotency key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provider response times out&lt;/td&gt;
&lt;td&gt;&lt;code&gt;UNKNOWN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reconciliation resolves the outcome&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;After &lt;code&gt;CONFIRMED&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Final result exists&lt;/td&gt;
&lt;td&gt;Redelivery and repeated claims are no-ops&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A timeout means &lt;code&gt;UNKNOWN&lt;/code&gt;, not &lt;code&gt;FAILED&lt;/code&gt;. Retrying an &lt;code&gt;UNKNOWN&lt;/code&gt; operation without provider-level uniqueness may duplicate the external effect.&lt;/p&gt;

&lt;p&gt;A provider idempotency key is useful only within the provider's documented scope and retention window. The application's retry and reconciliation horizon must fit that contract. Some providers return the previously stored result for a repeated key; that is a provider guarantee, not a general HTTP property.&lt;/p&gt;

&lt;p&gt;If an irreversible provider supports neither idempotent execution nor lookup by stable business identity, the caller cannot guarantee exactly-once execution. The safe choices are to require manual resolution, introduce a compensating control, or reject that provider for autonomous financial execution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8yhqv9jr3n61pl74l0k9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8yhqv9jr3n61pl74l0k9.png" alt="External operation recovery flow using an operation ledger, expiring worker claim, provider idempotency key, and reconciliation." width="800" height="1231"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Ordering Requires Gap Semantics, Not Just Version Numbers
&lt;/h2&gt;

&lt;p&gt;“Messages are ordered” is incomplete. The useful question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ordered with respect to which aggregate, which committed history, and which consumer contract?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Processing &lt;code&gt;v17 → v19 → v18&lt;/code&gt; may produce an invalid state even when every message eventually arrives. An &lt;code&gt;aggregateVersion&lt;/code&gt; makes stale events and possible gaps detectable, but the number does not enforce ordering by itself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flzxaa1jpx1hqq3zr1zdi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flzxaa1jpx1hqq3zr1zdi.png" alt="Comparison between committed aggregate order v17, v18, v19 and an out-of-order delivery v17, v19, v18." width="796" height="67"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A consumer can observe at least three different kinds of gap.&lt;/p&gt;

&lt;h3&gt;
  
  
  A temporary delivery gap
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;v19&lt;/code&gt; arrives before committed event &lt;code&gt;v18&lt;/code&gt;. A bounded reorder buffer may wait briefly for &lt;code&gt;v18&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  A permanent allocation gap
&lt;/h3&gt;

&lt;p&gt;If versions come from a non-transactional database sequence, a rolled-back transaction may consume &lt;code&gt;v18&lt;/code&gt;. The next committed event is &lt;code&gt;v19&lt;/code&gt;, and &lt;code&gt;v18&lt;/code&gt; will never exist.&lt;/p&gt;

&lt;p&gt;Aggregate versions used for contiguous ordering should therefore be advanced on the aggregate row or event stream inside the same transaction that records the event.&lt;/p&gt;

&lt;h3&gt;
  
  
  A legitimate consumer gap
&lt;/h3&gt;

&lt;p&gt;An aggregate may produce:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v17 PayoutApproved
v18 BeneficiaryVerified
v19 PayoutReleased
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A consumer subscribed only to payout lifecycle events may observe &lt;code&gt;v17 → v19&lt;/code&gt;. That does not prove that &lt;code&gt;v18&lt;/code&gt; is missing or delayed.&lt;/p&gt;

&lt;p&gt;A consumer may require contiguous aggregate versions only when it is guaranteed to observe every committed event in that aggregate stream. A filtered consumer must instead do one of the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;consume all aggregate events and no-op the irrelevant types while advancing its observed version;&lt;/li&gt;
&lt;li&gt;use a consumer-specific sequence;&lt;/li&gt;
&lt;li&gt;fetch the authoritative aggregate state when it observes a jump;&lt;/li&gt;
&lt;li&gt;treat versions as monotonic stale-event protection without assuming contiguity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A reorder buffer must always have explicit bounds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MAX_GAP_AGE
MAX_BUFFERED_EVENTS_PER_AGGREGATE
MAX_BUFFERED_BYTES_PER_AGGREGATE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a bound is exceeded:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Stop applying new events for that aggregate.
2. Do not block unrelated aggregates on the same partition or shard.
3. Fetch the missing event or an authoritative snapshot.
4. Rebuild or reconcile the consumer state.
5. Escalate when the authoritative state cannot be established.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fslfnxn8ag4ue6jhqboe6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fslfnxn8ag4ue6jhqboe6.png" alt="Bounded gap recovery flow deciding whether a missing version is required and reconciling when the reorder-buffer limit expires." width="800" height="1274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A Kafka partition is a storage and ordering boundary. A NATS subject is a routing address. In either case, records for the same ordered aggregate must be routed deterministically to the same serial execution boundary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;finance.payouts.eu.s042.pk_7f9q.approved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parallel workers may preserve arrival order while violating completion order. If an external effect depends on order, the operation ledger must serialize or reject conflicting operations for the same aggregate.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Versions expose ordering violations. Serialization, bounded buffering, authoritative reads, and reconciliation preserve the business invariant.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  10. Edge and Multiregion Systems Make Authority Explicit
&lt;/h2&gt;

&lt;p&gt;A branch, regional gateway, or edge deployment that must survive a disconnected network needs a local database and local Outbox that synchronizes once connectivity returns.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fexpw14qz8oavdgg1sj90.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fexpw14qz8oavdgg1sj90.png" alt="Edge synchronization flow retaining durable local Outbox work while the network is unavailable and synchronizing after recovery." width="798" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A NATS leaf node does not automatically turn a local database into a conflict-free offline store. The architecture must still define: which system is authoritative per entity, how conflicts resolve, how gaps are detected, what happens when local disk fills, and how reconciliation completes.&lt;/p&gt;

&lt;p&gt;If two regions may concurrently mutate the same aggregate, &lt;code&gt;aggregateVersion&lt;/code&gt; can detect the conflict but cannot resolve it. The design still needs a single-writer rule, explicit ownership transfer, or a domain-specific merge protocol. “Last write wins” is not a safe default for financial state.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Local availability with eventual global convergence&lt;/strong&gt; — not global consistency independent of the network.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  11. The Reference Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr20h1upq8z6zngy59um7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr20h1upq8z6zngy59um7.png" alt="Reference architecture connecting legacy CDC and transactional services to a durable broker, AI decision record, deterministic policy, external operation ledger, provider, internal ledger, and reconciliation." width="800" height="1127"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The essential building blocks are: an authoritative transactional source, an atomic Outbox, recoverable publication, durable transport, immutable event identity, transactional Inbox processing for local effects, bounded ordering recovery, stable decision identity, deterministic policy boundaries, a durable external-operation ledger, provider-level idempotency where available, and reconciliation where certainty cannot be obtained synchronously.&lt;/p&gt;




&lt;h2&gt;
  
  
  12. Event Envelopes Are Part of the Contract
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eventId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"evt_01K..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eventType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PayoutApproved"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"aggregateId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pay_7f9q"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"aggregateVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"schemaVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"occurredAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-07T10:57:01Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"correlationId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"corr_8x7b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"causationId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cmd_9c3a"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;eventId&lt;/code&gt; establishes the immutable identity of this fact. &lt;code&gt;aggregateVersion&lt;/code&gt; identifies its committed position in the aggregate history and makes stale delivery or a possible gap detectable; it does not enforce ordering by itself.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;correlationId&lt;/code&gt; groups a wider business flow. &lt;code&gt;causationId&lt;/code&gt; identifies the command or event that directly caused this event. Neither should be used as an idempotency key without first defining the business operation being deduplicated.&lt;/p&gt;

&lt;p&gt;The architecture should maintain separate identities for separate boundaries:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Identity&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eventId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One immutable fact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;decisionRequestId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One request for an assessment or decision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;operationId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One intended external business effect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;correlationId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A wider end-to-end business flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;causationId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The direct cause of this record&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;schemaVersion&lt;/code&gt; also requires an explicit compatibility and migration policy. A version number without rules for backward compatibility, replay, and unsupported consumers is only metadata.&lt;/p&gt;




&lt;h2&gt;
  
  
  13. AI Decisions Need Stable Identity and Evidence
&lt;/h2&gt;

&lt;p&gt;“Payout blocked” is not an adequate decision record. A serious system must preserve enough evidence to reconstruct why an assessment existed and how it became an authoritative action.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"decisionRequestId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dec_req_01K..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sourceEventId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"evt_01K..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"aggregateId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pay_7f9q"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"aggregateVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidenceSnapshotId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"evidence_42"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidenceSnapshotHash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sha256:..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"modelVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"risk-model-2026-08"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"promptVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"toolsetVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policyVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"assessment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"riskLevel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HIGH"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.91&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-07T10:57:03Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first completed assessment for a &lt;code&gt;decisionRequestId&lt;/code&gt; becomes the recorded result. Redelivery of the same request returns that result instead of invoking the model again.&lt;/p&gt;

&lt;p&gt;This is decision idempotency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Retry of the same logical request
    → return the recorded assessment

New evidence, new aggregate state, or explicit reevaluation
    → create a new decisionRequestId
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1d640jxrgpiotq0zaa5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1d640jxrgpiotq0zaa5k.png" alt="AI decision evidence chain connecting the source event, decision identity, evidence snapshot, model versions, recorded assessment, policy, and external operation identity." width="800" height="34"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The goal is not to pretend that a probabilistic model is deterministic. Exact replay may be impossible when hosted models, retrieval indexes, tools, or safety systems change. The goal is to reconstruct the inputs, versions, evidence, recorded output, policy evaluation, approvals, and executed operation.&lt;/p&gt;

&lt;p&gt;The AI assessment is evidence, not financial authority. A deterministic policy service evaluates limits, permissions, segregation of duties, compliance rules, and approval state. Only an authorised policy result may create an external operation.&lt;/p&gt;

&lt;p&gt;Agent tools should follow the same boundary. Read-only evidence tools may be called during assessment. Tools that create irreversible effects must be represented as authorised commands and executed through the external-operation ledger.&lt;/p&gt;




&lt;h2&gt;
  
  
  14. Observability Must Detect Missing Effects, Not Just Failures
&lt;/h2&gt;

&lt;p&gt;A dashboard with green CPU, healthy brokers, and an empty dead-letter queue can still hide a missing payment. The most dangerous failure may look like a successful deduplication no-op.&lt;/p&gt;

&lt;p&gt;Correctness observability needs to measure both backlog and age:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;oldest_pending_outbox_age
oldest_unprocessed_event_age
oldest_pending_operation_age
oldest_in_flight_operation_age
expired_operation_claim_count
unknown_operation_age
reconciliation_backlog
reconciliation_mismatch_count
gap_buffer_oldest_age
gap_buffered_events
authorised_decisions_without_operation
confirmed_operations_without_provider_match
provider_effects_without_internal_confirmation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Backlog size measures load. Oldest-item age measures whether the system is making progress.&lt;/p&gt;

&lt;p&gt;Thresholds should come from business SLOs, provider idempotency windows, settlement deadlines, and the maximum acceptable uncertainty period. A universal threshold such as “five minutes” is meaningless without those contracts.&lt;/p&gt;

&lt;p&gt;The system should periodically reconcile four sets:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fijpge3zd2c6cbbvmdzk4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fijpge3zd2c6cbbvmdzk4.png" alt="Correctness reconciliation across authorised decisions, the external operation ledger, the internal financial ledger, and provider records." width="799" height="52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Examples of correctness violations include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an authorised decision with no durable external operation;&lt;/li&gt;
&lt;li&gt;a &lt;code&gt;PENDING&lt;/code&gt; operation older than its dispatch SLO;&lt;/li&gt;
&lt;li&gt;an expired &lt;code&gt;IN_FLIGHT&lt;/code&gt; claim that no worker recovered;&lt;/li&gt;
&lt;li&gt;an &lt;code&gt;UNKNOWN&lt;/code&gt; operation older than the reconciliation SLO;&lt;/li&gt;
&lt;li&gt;an internally confirmed payment missing from the provider;&lt;/li&gt;
&lt;li&gt;a provider-side payment with no matching internal operation;&lt;/li&gt;
&lt;li&gt;an aggregate gap held beyond its configured bound.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most dangerous state is not merely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service = DOWN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;business_effect = UNKNOWN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;UNKNOWN&lt;/code&gt; must be a first-class, queryable business state with ownership, age, reconciliation policy, and escalation — not a log line inside a generic error counter.&lt;/p&gt;




&lt;h2&gt;
  
  
  15. Security Must Survive the Event Pipeline
&lt;/h2&gt;

&lt;p&gt;Event systems copy information widely, which makes careless identifiers expensive. Don't embed account numbers, card details, or national IDs in topic or subject names — they leak into logs, metrics, traces, and dashboards.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ finance.account.447819002343.payment
✅ finance.payouts.eu.s042.pk_7f9q.approved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An authenticated event is not permanent authorization to repeat an action. Replays and delayed deliveries must pass the current execution contract or an explicitly versioned historical authorization contract.&lt;/p&gt;

&lt;p&gt;Agents should not hold unrestricted provider credentials. The execution worker should receive narrowly scoped authority to perform one approved &lt;code&gt;operationId&lt;/code&gt;, with amount, currency, beneficiary, policy decision, and validity window bound to that operation.&lt;/p&gt;

&lt;p&gt;Encryption in transit and at rest, fine-grained access control, schema governance, controlled replay, dead-letter handling, and data residency controls are non-negotiable. &lt;strong&gt;Durability without governance only makes mistakes survive longer.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  16. Choose the Mechanism From the Invariant
&lt;/h2&gt;

&lt;p&gt;The architecture should follow the invariant. The invariant should not follow the product logo.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Required invariant&lt;/th&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Business state and publication intent are born together&lt;/td&gt;
&lt;td&gt;Transactional Outbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A local projection is not applied twice&lt;/td&gt;
&lt;td&gt;Inbox and local effect in one transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An external effect survives executor crashes&lt;/td&gt;
&lt;td&gt;Durable external-operation ledger&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retried provider calls do not repeat an effect&lt;/td&gt;
&lt;td&gt;Stable &lt;code&gt;operationId&lt;/code&gt; and provider idempotency contract&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ambiguous provider outcomes become resolvable&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;UNKNOWN&lt;/code&gt; state and reconciliation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aggregate transitions do not complete out of order&lt;/td&gt;
&lt;td&gt;Deterministic routing and serial execution per aggregate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A missing version cannot block forever&lt;/td&gt;
&lt;td&gt;Bounded buffer and authoritative reconciliation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A transport retry does not create another AI decision&lt;/td&gt;
&lt;td&gt;Stable &lt;code&gt;decisionRequestId&lt;/code&gt; and stored assessment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Probabilistic reasoning cannot directly move money&lt;/td&gt;
&lt;td&gt;Deterministic policy and approval boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regional autonomy does not create silent conflict&lt;/td&gt;
&lt;td&gt;Explicit authority, ownership transfer, or merge protocol&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replay does not bypass governance&lt;/td&gt;
&lt;td&gt;Versioned authorization, schema, retention, and access policy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Products implement parts of these mechanisms. They do not define the business invariant.&lt;/p&gt;




&lt;h2&gt;
  
  
  17. Exactly-Once Requires an Explicit Boundary
&lt;/h2&gt;

&lt;p&gt;“Does this broker support exactly-once?” is rarely the useful question.&lt;/p&gt;

&lt;p&gt;The useful questions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exactly once inside which transaction boundary?&lt;/li&gt;
&lt;li&gt;Which system assigns the business effect its identity?&lt;/li&gt;
&lt;li&gt;Which component rejects a repeated identity?&lt;/li&gt;
&lt;li&gt;How long is that identity retained?&lt;/li&gt;
&lt;li&gt;Can an ambiguous result be queried?&lt;/li&gt;
&lt;li&gt;What happens when certainty cannot be recovered automatically?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kafka can provide exactly-once processing across supported Kafka operations because the relevant offsets, state, and produced records participate in the Kafka transaction boundary. That guarantee does not automatically include an unrelated database or external provider.&lt;/p&gt;

&lt;p&gt;For irreversible effects, correctness contains both safety and liveness:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Safety:
The same operationId must not create two business effects.

Liveness:
Every authorised operation must eventually become
CONFIRMED, FAILED_TERMINAL, or explicitly escalated.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deduplication without liveness is not sufficient. An Inbox tombstone that suppresses work which never reached the provider may prevent a duplicate while permanently losing the intended effect.&lt;/p&gt;

&lt;p&gt;The end-to-end contract is therefore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Record each business intent atomically.
Deliver until the intent is durably observed.
Create one stable identity per intended effect.
Use destination-level idempotency where available.
Never interpret timeout as definitive failure.
Reconcile every ambiguous outcome.
Escalate when the architecture cannot prove the result.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Exactly-once is not merely a transport property. It is a claim that must name its boundary, identity, enforcement point, retention window, and recovery protocol.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If an irreversible provider offers neither idempotent execution nor lookup by stable business identity, the architecture must not claim exactly-once execution across that boundary.&lt;/p&gt;




&lt;h2&gt;
  
  
  18. What AI Changes
&lt;/h2&gt;

&lt;p&gt;AI does not repeal distributed systems. Agents still run on networks. Tools still time out. Databases still commit independently. Messages can still be duplicated.&lt;/p&gt;

&lt;p&gt;AI also introduces a probabilistic decision boundary between fact and effect. That boundary needs its own durable identity. Reprocessing an event must not silently create another authoritative assessment, while a legitimate reevaluation based on new evidence must remain possible and auditable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F59gjgsbgfst9cywljhge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F59gjgsbgfst9cywljhge.png" alt="Comparison between a traditional event-to-projection path and an agentic path containing reasoning, tool selection, deterministic policy, and external execution." width="799" height="52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What AI changes is the &lt;strong&gt;distance between information and action&lt;/strong&gt; and the number of probabilistic steps inside that distance.&lt;/p&gt;

&lt;p&gt;As agents gain operational authority, distributed-systems correctness becomes more important, not less. Agent reliability is not primarily a prompt-engineering problem. The decisive guarantees still live in atomicity, stable identity, bounded recovery, deterministic authorization, least privilege, reconciliation, and auditability.&lt;/p&gt;

&lt;p&gt;The model is one component. It is not the transaction boundary, the source of financial truth, or the enforcement point for an irreversible effect.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Transactional Outbox makes business state and publication intent atomic at the source. A relay or CDC process transports that intent, while durable delivery and transactional Inbox processing make local consumers tolerant of redelivery.&lt;/p&gt;

&lt;p&gt;Those guarantees stop at the local database boundary. External effects require their own durable operation identity, recoverable claim state, provider-level uniqueness contract, and reconciliation. Aggregate versions expose stale events and possible gaps; deterministic routing, bounded buffering, and authoritative recovery protect the ordering invariant. AI assessments require stable decision identity, evidence snapshots, and deterministic policy approval before they can create an external operation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI agents do not create these distributed systems problems. They make ignoring them more expensive.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A duplicate event can now travel farther. A retry can activate more capable software. An uncertain result can trigger decisions that affect customers, accounts, infrastructure, or money.&lt;/p&gt;

&lt;p&gt;That is why modern agentic architecture should not begin by asking which model is smartest or which broker is fastest. It should begin with the business invariant:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Every financial movement must have a stable operation identity, originate from an authorised and versioned business state, survive publication and executor failures, tolerate redelivery, detect ordering violations, pass deterministic policy controls, use destination-level uniqueness where available, and remain reconcilable when certainty cannot be obtained synchronously.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or, simply:&lt;/p&gt;

&lt;h2&gt;
  
  
  Record intent once. Give every effect an identity. Reconcile uncertainty.
&lt;/h2&gt;

&lt;p&gt;Then ask the question that matters when everything appears healthy and the acknowledgement never arrives:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Can your system prove that the same payment will not leave twice?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And can it also prove that an authorised payment will not disappear behind a successful deduplication record?&lt;/p&gt;

&lt;p&gt;A correct design needs both guarantees: no duplicate effect and no silently lost intent.&lt;/p&gt;

&lt;p&gt;Not whether Kafka stayed online. Not whether the database stayed online. Not whether your AI agent produced the right explanation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Whether the architecture preserved both safety and liveness when the network stopped being able to tell you what happened — and whether every unresolved outcome remained visible until reality could be established.&lt;/strong&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Revision note — August 2026:&lt;/strong&gt; Expanded to cover recoverable external-effect claims and bounded reorder buffers after thoughtful reader feedback.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Technical References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kafka.apache.org/documentation/" rel="noopener noreferrer"&gt;Apache Kafka Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kafka.apache.org/40/getting-started/upgrade/" rel="noopener noreferrer"&gt;Apache Kafka 4.0 — ZooKeeper Removal, KRaft-only Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kafka.apache.org/42/streams/core-concepts/" rel="noopener noreferrer"&gt;Apache Kafka Streams — Exactly-Once Processing Boundary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://debezium.io/documentation/reference/stable/transformations/outbox-event-router.html" rel="noopener noreferrer"&gt;Debezium Outbox Event Router&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://debezium.io/documentation/reference/stable/operations/debezium-server.html" rel="noopener noreferrer"&gt;Debezium Server + NATS JetStream Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.nats.io/learn/jetstream/delivery-and-acknowledgment" rel="noopener noreferrer"&gt;NATS JetStream Delivery and Acknowledgements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.nats.io/learn/jetstream/your-first-stream" rel="noopener noreferrer"&gt;NATS JetStream Publication Deduplication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.nats.io/learn/core-nats/subject-mapping" rel="noopener noreferrer"&gt;NATS Deterministic Subject Partitioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.nats.io/learn/topologies/leaf-nodes" rel="noopener noreferrer"&gt;NATS Leaf Nodes and JetStream Domains&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/functions-sequence.html" rel="noopener noreferrer"&gt;PostgreSQL Sequence Functions — Gaps and Rollbacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rabbitmq.com/docs/queues" rel="noopener noreferrer"&gt;RabbitMQ Queues, Quorum Queues, and Streams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.redpanda.com/streaming/current/develop/transactions/" rel="noopener noreferrer"&gt;Redpanda Transactions and Kafka Compatibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.stripe.com/api/idempotent_requests" rel="noopener noreferrer"&gt;Stripe API — Idempotent Requests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>distributedsystems</category>
      <category>systemdesign</category>
      <category>fintech</category>
    </item>
    <item>
      <title>Your Retry Policy Can Break the SLO Before the First Attempt Starts</title>
      <dc:creator>AdmilsonCossa</dc:creator>
      <pubDate>Wed, 05 Aug 2026 15:46:56 +0000</pubDate>
      <link>https://dev.to/admilsoncossa/plan-retries-before-they-run-2f0l</link>
      <guid>https://dev.to/admilsoncossa/plan-retries-before-they-run-2f0l</guid>
      <description>&lt;p&gt;A retry policy can look reasonable on its own and still be impossible inside the request that owns it.&lt;/p&gt;

&lt;p&gt;Suppose one provider attempt may take 800 milliseconds. The call allows four attempts with increasing backoff, while the request has two seconds left. The individual numbers are valid, yet the composition cannot fit.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@workit/core/time-policy&lt;/code&gt; evaluates that shape before task execution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;planTimePolicy&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/time-policy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;planTimePolicy&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;timeout&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;retry&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;attempt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;800ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;times&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;initialDelay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;factor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;jitter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;valid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The planner does not call the provider. It computes a conservative upper bound from the declared policy and reports typed warnings when the composition cannot fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Runtime policy and planning policy have different jobs
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;run.retry()&lt;/code&gt; owns execution. It invokes the task, observes cancellation,&lt;br&gt;
sleeps with the task signal and decides whether another attempt may start.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;planTimePolicy()&lt;/code&gt; owns pre-execution analysis. It works with declared attempt costs and composition rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;attempt
retry
hedge
timeout
deadline
series
parallel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keeping those responsibilities separate matters. A planner should not produce side effects, while a runtime should not pretend it can predict provider latency that the caller never declared.&lt;/p&gt;

&lt;h2&gt;
  
  
  A deadline is part of the task context
&lt;/h2&gt;

&lt;p&gt;WorkIt 0.5.0 exposes the earliest effective absolute deadline as &lt;code&gt;ctx.deadlineAt&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;deadlineAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deadline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;deadlineAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deadlineAt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;remainingMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deadlineAt&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;deadlineAt&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a task has both an inherited scope deadline and a wrapper deadline, it sees the earlier value. Retry, fallback and hedge compositions preserve that effective deadline for their task bodies.&lt;/p&gt;

&lt;p&gt;The value is introspection, not preemption. The task must still cooperate with &lt;code&gt;ctx.signal&lt;/code&gt;, and external I/O must receive that signal when the client supports abort.&lt;/p&gt;

&lt;h2&gt;
  
  
  A retry count is not a shared admission policy
&lt;/h2&gt;

&lt;p&gt;Per-operation retry limits prevent one wrapper from running forever. They do not stop several sibling operations from consuming too many retries together.&lt;/p&gt;

&lt;p&gt;Version 0.5.0 adds a shared retry budget:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBudget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ProviderRetries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createBudget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ProviderRetries&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;retries&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Application-owned provider boundary.&lt;/span&gt;
&lt;span class="kr"&gt;declare&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;callProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AbortSignal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;operation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;times&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;initialDelay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;retryBudget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ProviderRetries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;ProviderRetries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;retries&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;second&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;second&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The initial invocation is not a retry, so it is not charged. Before each&lt;br&gt;
additional attempt is admitted, the wrapper atomically consumes one unit from the scope-visible budget. When the budget is exhausted, the next retry body does not start.&lt;/p&gt;

&lt;p&gt;This turns “three retries per call” into a policy that can also say “no more than five additional provider invocations across this request.”&lt;/p&gt;
&lt;h2&gt;
  
  
  Check aggregate retry demand
&lt;/h2&gt;

&lt;p&gt;The planner can evaluate that shared policy when the caller supplies a runtime snapshot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;planTimePolicy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;RetryBudgetSnapshot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/time-policy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;retryBudgets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RetryBudgetSnapshot&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
  &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ProviderRetries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;retries&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;providerPolicy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;retry&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;attempt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;800ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;times&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;initialDelay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;retryBudget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ProviderRetries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;planTimePolicy&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;parallel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;policies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;providerPolicy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;providerPolicy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;retryBudgets&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For every referenced budget, the result reports required retries, remaining capacity and one of three statuses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;admissible
exceeded
unverified
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An absent snapshot produces &lt;code&gt;retry_budget_snapshot_missing&lt;/code&gt;. Insufficient&lt;br&gt;
capacity produces &lt;code&gt;retry_budget_exceeded&lt;/code&gt;. Both make the plan invalid because the declared composition cannot be admitted from the supplied state.&lt;/p&gt;
&lt;h2&gt;
  
  
  What the upper bound means
&lt;/h2&gt;

&lt;p&gt;For fixed retry delays, the planner includes attempt duration and the waits between failed attempts. For parallel policies it distinguishes critical-path time from aggregate parallel work. Timeout and deadline nodes can truncate the outer bound while retaining a warning that inner work exceeds it.&lt;/p&gt;

&lt;p&gt;Jitter, dynamic backoff, event-loop stalls and provider latency add uncertainty. The planner reports its bounded contract instead of presenting the result as an exact wall-clock forecast.&lt;/p&gt;
&lt;h2&gt;
  
  
  Executable evidence
&lt;/h2&gt;

&lt;p&gt;The release connects these claims to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CORR-009 retry upper bounds
CORR-010 infeasible deadline warning
CORR-016 bounded time-policy cost model
CORR-021 nested composition model
CORR-024 effective runtime deadline
CORR-025 shared retry admission budget
CORR-027 aggregate retry budget planning
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the proofs with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run &lt;span class="nb"&gt;test&lt;/span&gt;:evidence
npm run &lt;span class="nb"&gt;test&lt;/span&gt;:coverage
npm run verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The bounded model currently checks 640 generated policies, while the nested composition evidence checks 1,516 generated policy trees. These are executable finite models, not theorems over arbitrary TypeScript or real provider timing.&lt;/p&gt;

&lt;p&gt;Planning does not remove runtime uncertainty. It catches policies that are already impossible before that uncertainty begins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/WorkRuntime/workit" rel="noopener noreferrer"&gt;https://github.com/WorkRuntime/workit&lt;/a&gt;&lt;br&gt;
Article source: &lt;a href="https://github.com/WorkRuntime/workit/blob/main/articles/09-plan-retries-before-they-run.md" rel="noopener noreferrer"&gt;https://github.com/WorkRuntime/workit/blob/main/articles/09-plan-retries-before-they-run.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NPM: &lt;a href="https://www.npmjs.com/package/@workit/core" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@workit/core&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>softwareengineering</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Your Async Job Finished. Can You Prove What Actually Ran?</title>
      <dc:creator>AdmilsonCossa</dc:creator>
      <pubDate>Wed, 29 Jul 2026 15:23:37 +0000</pubDate>
      <link>https://dev.to/admilsoncossa/a-receipt-for-async-work-411p</link>
      <guid>https://dev.to/admilsoncossa/a-receipt-for-async-work-411p</guid>
      <description>&lt;p&gt;An async operation can return successfully while leaving an awkward question behind: &lt;strong&gt;what actually happened inside it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a small function, the return value may be enough. For a provider call with retries, cancellation and cleanup, it is not. Operators need to know which attempts ran, why the operation stopped, whether cleanup timed out and whether owned work remained pending.&lt;/p&gt;

&lt;p&gt;WorkIt receipts preserve those lifecycle facts as data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createReceiptRecorder&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/replay&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Application-owned provider boundary.&lt;/span&gt;
&lt;span class="kr"&gt;declare&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;callProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AbortSignal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;observedScope&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;recorder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;observedScope&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;recorder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createReceiptRecorder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;receiptId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;answer:request-42&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;times&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;initialDelay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;provider.answer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;llm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;receipt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;recorder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;observedScope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="nx"&gt;recorder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unsubscribe&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The receipt includes the terminal outcome, normalized lifecycle events, a final scope snapshot and a summary of cleanup or leaked-task evidence. In WorkIt 0.5.0 it can also derive one record for every retry attempt admitted by the outer task boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence, not deterministic replay
&lt;/h2&gt;

&lt;p&gt;The word “replay” is overloaded. Deterministic replay records enough scheduling and nondeterministic input to execute a program again with the same decisions.&lt;br&gt;
That requires control over clocks, random values, I/O, scheduling and usually the runtime itself.&lt;/p&gt;

&lt;p&gt;WorkIt does something narrower. It records what the scope observed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;typed task and scope events
final scope snapshot
terminal outcome
cancellation reason
cleanup failures and timeouts
retry attempt outcomes
telemetry drop and truncation counts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can store and inspect that evidence later. You cannot use it to rerun an arbitrary JavaScript program. The distinction is useful because it keeps the receipt contract small enough to verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attempts belong to the task lifecycle
&lt;/h2&gt;

&lt;p&gt;Before 0.5.0, receipts could include retrying events. Those events explained that another attempt was planned, but they did not provide a terminal outcome for every invocation.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;task:attempt&lt;/code&gt; event closes that gap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onEvent&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;task:attempt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;taskId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;taskId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;outcome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outcome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;durationMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;durationMs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An attempt ends as &lt;code&gt;succeeded&lt;/code&gt;, &lt;code&gt;failed&lt;/code&gt; or &lt;code&gt;cancelled&lt;/code&gt;. Nested retry wrappers do not produce competing generic histories for the same task. The outer retry boundary owns the task-level attempt sequence, while an application can add more specific provider or activity evidence when it needs it.&lt;/p&gt;

&lt;p&gt;That ownership rule prevents a receipt from presenting two incompatible&lt;br&gt;
answers to “how many task attempts ran?”&lt;/p&gt;
&lt;h2&gt;
  
  
  Add metadata at the boundary that knows it
&lt;/h2&gt;

&lt;p&gt;The runtime knows the task id, attempt number, timing and outcome. It does not know whether a particular invocation targeted a primary provider, a regional replica or a billing-sensitive activity.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;createAttemptRecorder()&lt;/code&gt; lets the caller add that context explicitly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createAttemptRecorder&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/replay&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;attemptRecorder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createAttemptRecorder&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;maxAttempts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxMetadataBytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// `callProvider` is the application-owned provider function from the previous&lt;/span&gt;
&lt;span class="c1"&gt;// example.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;callPrimary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;attemptRecorder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;primary&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;answer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;reasonCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nx"&gt;TypeError&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transport_error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;provider_error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;operation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callPrimary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;times&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;initialDelay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reason codes must be bounded slugs. Metadata must be a JSON object and must fit the configured byte limit. Common secret fields are redacted before the record is retained.&lt;/p&gt;

&lt;p&gt;This is deliberately caller-owned enrichment. Inferring provider policy from an arbitrary error object would turn a lifecycle recorder into a second routing engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Redaction belongs before storage
&lt;/h2&gt;

&lt;p&gt;Progress data is often valuable during an incident, although it may contain fields that should never reach a durable ledger.&lt;/p&gt;

&lt;p&gt;Receipt redaction has conservative defaults for common secret names, and the caller can add its own policy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;redactReceipt&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/replay&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;publicReceipt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;redactReceipt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;receipt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;removeFields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;privateNote&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;redactFields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;authorization&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tenantToken&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Redaction is not a substitute for data minimization. The safest private payload is still the one that was never attached to an event. It does, however, provide a clear boundary between local lifecycle evidence and a receipt intended for storage or publication.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a receipt can establish
&lt;/h2&gt;

&lt;p&gt;A captured receipt can support claims about the WorkIt lifecycle it observed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the scope reached a terminal state;&lt;/li&gt;
&lt;li&gt;no owned tasks were pending in the final snapshot;&lt;/li&gt;
&lt;li&gt;cancellation carried a typed reason;&lt;/li&gt;
&lt;li&gt;cleanup failure or timeout events were present;&lt;/li&gt;
&lt;li&gt;admitted retry invocations had terminal outcomes;&lt;/li&gt;
&lt;li&gt;event truncation or telemetry drops were counted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It cannot establish that a remote provider stopped billing, that an external transaction was semantically correct or that an uncaptured event occurred.&lt;/p&gt;

&lt;p&gt;Those limitations are not footnotes. They define where runtime evidence ends and application or provider evidence begins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Executable evidence
&lt;/h2&gt;

&lt;p&gt;The relevant release proofs are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LIFE-004 completed scope receipt
LIFE-005 typed cancellation reason
LIFE-012 admitted attempt evidence and default secret redaction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They run through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run &lt;span class="nb"&gt;test&lt;/span&gt;:evidence
npm run &lt;span class="nb"&gt;test&lt;/span&gt;:coverage
npm run verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tests cover completed and cancelled receipts, cleanup evidence, bounded event windows, redaction, attempt outcomes, metadata limits and installed package consumers.&lt;/p&gt;

&lt;p&gt;The practical result is modest but important: when WorkIt owns an async&lt;br&gt;
lifecycle, it can leave behind a typed account of what it observed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/WorkRuntime/workit/releases/tag/v0.5.0" rel="noopener noreferrer"&gt;https://github.com/WorkRuntime/workit/releases/tag/v0.5.0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/@workit/core" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@workit/core&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>typescript</category>
      <category>node</category>
      <category>softwareengineering</category>
      <category>structuredconcurrency</category>
    </item>
    <item>
      <title>Your AI Agent Finished. Why Are Its Tools Still Running?</title>
      <dc:creator>AdmilsonCossa</dc:creator>
      <pubDate>Wed, 17 Jun 2026 15:25:52 +0000</pubDate>
      <link>https://dev.to/admilsoncossa/ai-agent-scopes-and-tool-lifecycles-14if</link>
      <guid>https://dev.to/admilsoncossa/ai-agent-scopes-and-tool-lifecycles-14if</guid>
      <description>&lt;p&gt;&lt;em&gt;Five articles built the runtime. &lt;a href="https://dev.to/admilsoncossa/inspect-an-ai-agent-run-without-paying-for-logs-youll-never-read-telemetry-shouldnt-be-your-25ja"&gt;The sixth made it observable&lt;/a&gt;. This one introduces the agent primitive: &lt;code&gt;runAgent&lt;/code&gt; plus &lt;code&gt;AgentScope&lt;/code&gt;, with budgets, replayable events, and structured cancellation in the box.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The whole loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;runAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AgentToolCalls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;OpenAITokens&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/ai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CostBudget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;events&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;runAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;plan&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;goal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;planLLM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;cost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;toolCalls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;10s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;synthesize&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;synthesizeLLM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;cost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.004&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That call returns two things — &lt;code&gt;result&lt;/code&gt; (whatever the body returned) and &lt;code&gt;events&lt;/code&gt; (the &lt;strong&gt;complete, ordered, type-discriminated trace&lt;/strong&gt; of the run). No external tracing setup. No DSL. The body is plain &lt;code&gt;async&lt;/code&gt;/&lt;code&gt;await&lt;/code&gt;, the tools are plain functions, and every &lt;code&gt;agent.tool(...)&lt;/code&gt; call is a typed primitive whose budget, retry, and timeout policy live in the call site.&lt;/p&gt;

&lt;p&gt;This is the practical lifecycle primitive between &lt;em&gt;"I wired up an LLM call and a tool router"&lt;/em&gt; and &lt;em&gt;"I can explain, bound, cancel, and replay the run."&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The contract &lt;code&gt;agent.tool(name, input, fn, opts)&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;AgentScope&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;AgentEvent&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;I&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;O&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TaskContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;O&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;O&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AgentToolOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;O&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;AgentToolOptions&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;       &lt;span class="c1"&gt;// charged against OpenAITokens budget&lt;/span&gt;
  &lt;span class="nl"&gt;cost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;       &lt;span class="c1"&gt;// charged against CostBudget budget&lt;/span&gt;
  &lt;span class="nl"&gt;toolCalls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;       &lt;span class="c1"&gt;// charged against AgentToolCalls budget&lt;/span&gt;
  &lt;span class="nl"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;RetryOpts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="nx"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Five things to notice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The tool function is a plain &lt;code&gt;(input, ctx) =&amp;gt; Promise&amp;lt;O&amp;gt;&lt;/code&gt;.&lt;/strong&gt; No generators. No effect type. No "tool description JSON schema" to feed an LLM -- that's your application's job, not the runtime's.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budgets are charged before the call returns.&lt;/strong&gt; Overrun rejects synchronously and cancels the owning scope with &lt;code&gt;CancelReason { kind: "budget", budgetKey, limit, spent }&lt;/code&gt;. Runtime budget accounting stops at the cap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;retry&lt;/code&gt;/&lt;code&gt;timeout&lt;/code&gt; are per-tool&lt;/strong&gt;, composing with the same engine described in articles 02 and 05.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ctx.signal&lt;/code&gt; inside the tool body is linked to the parent scope.&lt;/strong&gt; Client disconnects, deadline fires, sibling fails — all aborts propagate into the tool body so its &lt;code&gt;fetch&lt;/code&gt; / &lt;code&gt;db.query&lt;/code&gt; / &lt;code&gt;provider.call&lt;/code&gt; aborts at the I/O boundary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;agent.events&lt;/code&gt; is a readonly buffer&lt;/strong&gt; that mirrors the event stream. After the run, &lt;code&gt;events&lt;/code&gt; is a replayable log of the whole loop.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  A 50-cent agent with a hard tool-call cap
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;runAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AgentToolCalls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;OpenAITokens&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/ai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CostBudget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CostBudget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="na"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;OpenAITokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tokens&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AgentToolCalls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="na"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tool_calls&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;runAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;reactLoop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;goal&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three caps, three reasons:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Budget&lt;/th&gt;
&lt;th&gt;What it bounds&lt;/th&gt;
&lt;th&gt;What overrun does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CostBudget&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Aggregate USD across the whole run&lt;/td&gt;
&lt;td&gt;Rejects with &lt;code&gt;BudgetExceededError&lt;/code&gt; and cancels the owning scope. The 32 inflight LLM/tool calls see the abort on &lt;code&gt;ctx.signal&lt;/code&gt;; provider-side billing depends on the provider honoring cancellation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OpenAITokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Total tokens across all LLM calls&lt;/td&gt;
&lt;td&gt;Same shape. Use a dedicated key per provider when you want separate caps.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AgentToolCalls&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Total tool calls -- fan-out limiter&lt;/td&gt;
&lt;td&gt;Stops a runaway agent from invoking tools forever. Bench 19-B caps it at 1 and the second tool call fails closed.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/19-agent-scope.mjs"&gt;&lt;code&gt;19-agent-scope.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; Five scenarios -- measured.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Tool events bracket execution&lt;/td&gt;
&lt;td&gt;Single &lt;code&gt;agent.tool("calc", 3, x =&amp;gt; x*x)&lt;/code&gt; call -&amp;gt; 4 events &lt;code&gt;[agent:started, agent:tool_started, agent:tool_succeeded, agent:completed]&lt;/code&gt;, sequential &lt;code&gt;seq: [1,2,3,4]&lt;/code&gt;, monotonic &lt;code&gt;at&lt;/code&gt;, stable &lt;code&gt;agentId&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;AgentToolCalls&lt;/code&gt; cap hit&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;limit: 1&lt;/code&gt;. Second call rejects with &lt;code&gt;BudgetExceededError&lt;/code&gt;, &lt;code&gt;budgetKey: "AgentToolCalls"&lt;/code&gt;, &lt;code&gt;limit: 1&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;OpenAITokens&lt;/code&gt; charged via opts&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;{ tokens: 50 }&lt;/code&gt; then &lt;code&gt;{ tokens: 25 }&lt;/code&gt; -&amp;gt; final &lt;code&gt;spent: 75&lt;/code&gt; exactly.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;Parent scope cancel during tool&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ctx.scope.cancel({ kind: "manual", tag: "user-stop" })&lt;/code&gt; mid-tool -&amp;gt; tool body's &lt;code&gt;ctx.signal&lt;/code&gt; aborts, outer settles &lt;code&gt;CancellationError&lt;/code&gt; with &lt;code&gt;reason.kind: "manual"&lt;/code&gt;, &lt;code&gt;tag: "user-stop"&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;Replayable log, 3-tool run&lt;/td&gt;
&lt;td&gt;8 events: &lt;code&gt;started -&amp;gt; (tool_started -&amp;gt; tool_succeeded) x 3 -&amp;gt; completed&lt;/code&gt;. Seq &lt;code&gt;[1..8]&lt;/code&gt;. Same agentId. Tool names captured in order.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Replayable events -- the typed trace
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;AgentEvent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;agent:started&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="nl"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;agent:tool_started&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="nl"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;agent:tool_succeeded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;agent:tool_failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="nl"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;agent:tool_cancelled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CancelReason&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;agent:completed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="nl"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;agent:failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;         &lt;span class="nl"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seven variants. Discriminated by &lt;code&gt;type&lt;/code&gt;. Every variant carries &lt;code&gt;seq&lt;/code&gt; and &lt;code&gt;at&lt;/code&gt;. Cancelled events carry the typed &lt;code&gt;CancelReason&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What you can do with that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pivot a dashboard&lt;/strong&gt; on &lt;code&gt;tool&lt;/code&gt; x &lt;code&gt;type&lt;/code&gt; for failure heatmaps without parsing logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replay a run&lt;/strong&gt; in a test by walking the events array -- you have the order, the names, the timing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit a charge&lt;/strong&gt; by reconstructing the budget timeline from &lt;code&gt;tool_succeeded&lt;/code&gt; events tagged with the tokens / cost charged at the call site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diff two runs&lt;/strong&gt; on the event sequence to see exactly which tool path diverged.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The events array on the &lt;code&gt;AgentRunResult&lt;/code&gt; is &lt;code&gt;readonly&lt;/code&gt; and mirrors the same event stream that flows through &lt;code&gt;scope.onEvent(...)&lt;/code&gt; -- so live observers see the same shape the post-run audit log sees.&lt;/p&gt;




&lt;h2&gt;
  
  
  How does this compare
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stack&lt;/th&gt;
&lt;th&gt;Tool primitive&lt;/th&gt;
&lt;th&gt;Budget primitive&lt;/th&gt;
&lt;th&gt;Replayable event log&lt;/th&gt;
&lt;th&gt;Scope cancellation&lt;/th&gt;
&lt;th&gt;Bundle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WorkIt &lt;code&gt;runAgent&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yes typed &lt;code&gt;(input, ctx) =&amp;gt; O&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;yes &lt;code&gt;CostBudget&lt;/code&gt; / &lt;code&gt;OpenAITokens&lt;/code&gt; / &lt;code&gt;AgentToolCalls&lt;/code&gt; / &lt;code&gt;createBudget(...)&lt;/code&gt; composable&lt;/td&gt;
&lt;td&gt;yes &lt;code&gt;AgentRunResult.events&lt;/code&gt; typed union&lt;/td&gt;
&lt;td&gt;yes &lt;code&gt;ctx.signal&lt;/code&gt; aborts each tool body&lt;/td&gt;
&lt;td&gt;included in &lt;code&gt;@workit/core/ai&lt;/code&gt; (~8 KB gzip with the rest of &lt;code&gt;/ai&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LangChain agents&lt;/td&gt;
&lt;td&gt;yes but typed loosely; many tools as JSON&lt;/td&gt;
&lt;td&gt;no no first-class budget primitive&lt;/td&gt;
&lt;td&gt;partial via callbacks&lt;/td&gt;
&lt;td&gt;no no scope tree&lt;/td&gt;
&lt;td&gt;~hundreds of KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vercel AI SDK&lt;/td&gt;
&lt;td&gt;yes tool schemas&lt;/td&gt;
&lt;td&gt;no no first-class budget&lt;/td&gt;
&lt;td&gt;events on stream&lt;/td&gt;
&lt;td&gt;yes via &lt;code&gt;AbortSignal&lt;/code&gt;, no scope tree&lt;/td&gt;
&lt;td&gt;medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mastra&lt;/td&gt;
&lt;td&gt;yes generators-based&lt;/td&gt;
&lt;td&gt;partial&lt;/td&gt;
&lt;td&gt;yes trace store&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Roll-your-own with &lt;code&gt;for&lt;/code&gt;-loop + &lt;code&gt;fetch&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;yes, by definition&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;minimal but you wrote the runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The design point: &lt;strong&gt;the agent primitive composes with the same &lt;code&gt;CancelReason&lt;/code&gt;, &lt;code&gt;ctx.signal&lt;/code&gt;, &lt;code&gt;defer&lt;/code&gt;, budget, and &lt;code&gt;scope.tree()&lt;/code&gt; machinery from articles 01-06&lt;/strong&gt;. There is no second runtime. You don't choose between "the agent loop's lifecycle" and "the rest of your app's lifecycle" -- they share one tree.&lt;/p&gt;




&lt;h2&gt;
  
  
  A complete, runnable example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;runAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AgentToolCalls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;OpenAITokens&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/ai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CostBudget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;renderTree&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://api.search.dev/q=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;

  &lt;span class="na"&gt;fetchPage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;

  &lt;span class="na"&gt;summarize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`tl;dr: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;events&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;CostBudget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;AgentToolCalls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tool_calls&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;runAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;search&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;structured concurrency typescript&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;toolCalls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;docs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;hit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`fetchPage[&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;]`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;hit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetchPage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;toolCalls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;10s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})));&lt;/span&gt;

      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;summarize&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;summarize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;cost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;toolCalls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;30s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tool&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;` (&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)`&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's an agent that searches, fetches three pages, summarises, and stops at 50 cents or 12 tool calls -- whichever comes first. Cancel the parent scope and every in-flight &lt;code&gt;fetch&lt;/code&gt; and LLM stream aborts at the TCP layer. No manual &lt;code&gt;AbortController&lt;/code&gt; plumbing. No "did I forget to thread the signal." No &lt;code&gt;try/catch&lt;/code&gt; around the agent loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  Receipts
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node benchmarks/articles/19-agent-scope.mjs           &lt;span class="c"&gt;# 5 contract scenarios&lt;/span&gt;
node benchmarks/articles/run-all.mjs                  &lt;span class="c"&gt;# full 19-bench suite&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Production-side gates that back the same surface:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Claim&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool events bracket execution with monotonic seq&lt;/td&gt;
&lt;td&gt;
&lt;a href="//../benchmarks/articles/19-agent-scope.mjs"&gt;&lt;code&gt;19-agent-scope.mjs&lt;/code&gt;&lt;/a&gt; A verifies four ordered events, sequential &lt;code&gt;seq&lt;/code&gt;, stable &lt;code&gt;agentId&lt;/code&gt;, and monotonic &lt;code&gt;at&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;AgentToolCalls&lt;/code&gt; overflow rejects with &lt;code&gt;BudgetExceededError&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Bench 19 B sets &lt;code&gt;limit: 1&lt;/code&gt;; the second tool call throws with &lt;code&gt;budgetKey: "AgentToolCalls"&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;OpenAITokens&lt;/code&gt; consumed via &lt;code&gt;{ tokens: N }&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Bench 19 C verifies the final token budget &lt;code&gt;spent&lt;/code&gt; is exactly &lt;code&gt;75&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parent scope cancel propagates into tool body&lt;/td&gt;
&lt;td&gt;Bench 19 D verifies the tool body observes abort and the outer scope settles with the original manual reason.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replayable, ordered, typed event log&lt;/td&gt;
&lt;td&gt;Bench 19 E verifies eight events, sequential &lt;code&gt;seq&lt;/code&gt;, monotonic &lt;code&gt;at&lt;/code&gt;, and tool names in call order.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool failure surfaces as &lt;code&gt;agent:tool_failed&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Unit coverage verifies tool errors propagate and are captured in the typed event log.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Closing The Series
&lt;/h2&gt;

&lt;p&gt;The important part is not that WorkIt has an agent helper. The important part is&lt;br&gt;
that the agent helper is not a second runtime. Tool calls, token budgets,&lt;br&gt;
timeouts, retries, cancellation, progress events, and cleanup all use the same&lt;br&gt;
ownership tree as the rest of the library.&lt;/p&gt;

&lt;p&gt;The public claims behind this series are tracked in&lt;br&gt;
&lt;a href="//../evidence/claims.json"&gt;&lt;code&gt;evidence/claims.json&lt;/code&gt;&lt;/a&gt;, exercised by&lt;br&gt;
&lt;code&gt;npm run test:evidence&lt;/code&gt;, and benchmarked by &lt;code&gt;npm run bench:articles&lt;/code&gt;. The prose&lt;br&gt;
is intentionally not the evidence store; it is the readable path through the&lt;br&gt;
engineering tradeoffs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Source, Benchmarks, And Evidence
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;NPM: &lt;a href="https://www.npmjs.com/package/@workit/core" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@workit/core&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/WorkRuntime/workit" rel="noopener noreferrer"&gt;https://github.com/WorkRuntime/workit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Article source: &lt;a href="https://github.com/WorkRuntime/workit/blob/main/articles/07-agent-scope-and-tool-lifecycles.md" rel="noopener noreferrer"&gt;https://github.com/WorkRuntime/workit/blob/main/articles/07-agent-scope-and-tool-lifecycles.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Reproduce: &lt;code&gt;npm run bench:articles&lt;/code&gt; and &lt;code&gt;npm run test:evidence&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>node</category>
    </item>
    <item>
      <title>Inspect an AI Agent Run Without Paying for Logs You'll Never Read — Telemetry Shouldn't Be Your Second Biggest Bill</title>
      <dc:creator>AdmilsonCossa</dc:creator>
      <pubDate>Wed, 10 Jun 2026 08:50:28 +0000</pubDate>
      <link>https://dev.to/admilsoncossa/inspect-an-ai-agent-run-without-paying-for-logs-youll-never-read-telemetry-shouldnt-be-your-25ja</link>
      <guid>https://dev.to/admilsoncossa/inspect-an-ai-agent-run-without-paying-for-logs-youll-never-read-telemetry-shouldnt-be-your-25ja</guid>
      <description>&lt;p&gt;&lt;em&gt;Last time we put hard &lt;a href="https://dev.to/admilsoncossa/most-ai-agents-have-infinite-ambition-and-zero-budget-control-2ee9"&gt;budgets on cost and guaranteed cleanup&lt;/a&gt;. This time we make sure you can inspect an agent run without making telemetry volume the default cost center.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Take a real number. An agent does 200 tool calls per run. Each tool emits 5 events. That's 1,000 events per run. 100K runs/day = &lt;strong&gt;100 million events/day&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At CloudWatch Logs ingestion ($0.50/GB) with 500-byte structured JSON, that is roughly &lt;strong&gt;$9,125/year of telemetry that may not be needed on successful runs.&lt;/strong&gt; Datadog APM, Application Insights, and Honeycomb have different pricing models, but the engineering issue is the same: unbounded event volume turns observability into a cost surface.&lt;/p&gt;

&lt;p&gt;WorkIt's core has zero networking imports.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"node:http|node:https|fetch"&lt;/span&gt; dist/index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's not a feature claim. That's a gate.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/15-core-zero-network.mjs"&gt;&lt;code&gt;15-core-zero-network.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; Walks the published &lt;code&gt;dist/&lt;/code&gt; tree (excluding the explicit &lt;code&gt;observability&lt;/code&gt;, &lt;code&gt;otel&lt;/code&gt;, and &lt;code&gt;worker&lt;/code&gt; subpaths), greps every &lt;code&gt;.js&lt;/code&gt;/&lt;code&gt;.cjs&lt;/code&gt;/&lt;code&gt;.mjs&lt;/code&gt; for &lt;code&gt;node:http&lt;/code&gt;, &lt;code&gt;node:https&lt;/code&gt;, raw &lt;code&gt;http&lt;/code&gt;/&lt;code&gt;https&lt;/code&gt; imports, and &lt;code&gt;fetch(...)&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Files scanned&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forbidden imports found&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Excluded subpaths&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;observability&lt;/code&gt;, &lt;code&gt;otel&lt;/code&gt;, &lt;code&gt;worker&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;assert.equal(hits.length, 0)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;passed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;If a PR adds a networking import to core, the production gate &lt;code&gt;npm run check:no-network&lt;/code&gt; fails. The bench above verifies the same property in the artifact a consumer installs from npm.&lt;/p&gt;




&lt;h2&gt;
  
  
  Layer 1: Local-first by default (cost: $0)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;renderTree&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// your agent code&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;renderTree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;doWork&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero network calls. Zero log lines. Zero telemetry export cost. &lt;code&gt;scope.status()&lt;/code&gt; returns a snapshot. &lt;code&gt;renderTree(...)&lt;/code&gt; prints an ASCII tree. That is the built-in observability surface; exporters are opt-in.&lt;/p&gt;

&lt;p&gt;When you do want telemetry, you opt in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;attachTelemetryExporter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/observability&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;attachment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;attachTelemetryExporter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;otlp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;sampling&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;       &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;errors_and_slow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;slowThresholdMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;circuitBreaker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;failureThreshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;openForMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;sanitize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;stripPII&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four words: &lt;strong&gt;sampled, aggregated, budgeted, circuit-broken.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Layer 2 — Sampling: errors_and_slow is the production default
&lt;/h2&gt;

&lt;p&gt;Same workload, same agent. With &lt;code&gt;errors_and_slow&lt;/code&gt; (slow threshold 2 seconds) and 95% of runs completing fast and successful:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;Without sampling&lt;/th&gt;
&lt;th&gt;With &lt;code&gt;errors_and_slow&lt;/code&gt; (2 s)&lt;/th&gt;
&lt;th&gt;Reduction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;100K runs/day, 5% slow/errored&lt;/td&gt;
&lt;td&gt;100K x 1,000 ev x 500 B = &lt;strong&gt;50 GB/day&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;5K x 1,000 ev x 500 B = &lt;strong&gt;2.5 GB/day&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;20x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudWatch Logs ingestion&lt;/td&gt;
&lt;td&gt;$25/day = &lt;strong&gt;$9,125/year&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;$1.25/day = &lt;strong&gt;$456/year&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$8,669/yr saved&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The intended debugging signal is preserved for slow and failing runs. A passing run rarely needs full trace inspection -- you need it when something breaks or hangs, which is exactly what this policy keeps.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/16-sampling-and-aggregation.mjs"&gt;&lt;code&gt;16-sampling-and-aggregation.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; 100 root scopes x 5 child tasks each. 5% slow, 2% errored. Both modes attach &lt;code&gt;attachTelemetryExporter&lt;/code&gt; to the same workload.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;code&gt;sampling.mode&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Exported events&lt;/th&gt;
&lt;th&gt;Reduction factor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"all"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,300&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;"errors_and_slow"&lt;/code&gt; (slowThresholdMs: 55)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;36&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~36x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The bench asserts &amp;gt;= 5x to stay tolerant of jitter. The measured ratio came out higher than the article's nominal 20x because the synthetic workload concentrates slow/errored scopes; the savings table above uses the conservative ratio.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Sampling modes — how to choose:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"off"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Local dev, high-volume tests -- same shape as Layer 1 ($0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"errors_and_slow"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Production default&lt;/strong&gt; -- keep failing and slow traces, drop the rest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"head"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Random sampling at scope start -- cheap, no buffering, good for high-throughput service tracing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"all"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Debugging session for one run -- opt-in firehose&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A child scope cannot upgrade itself to "kept" if its root was sampled out. This is the rule that keeps traces causally intact.&lt;/p&gt;




&lt;h2&gt;
  
  
  Layer 3 — Aggregation, not enumeration
&lt;/h2&gt;

&lt;p&gt;By default, an aggregated exporter receives &lt;strong&gt;one summary record per scope&lt;/strong&gt;, not per task:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ScopeSummary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;scopeId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;parentId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;durationMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;outcome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;completed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;errored&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cancelled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;taskCounts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;started&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;succeeded&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;cancelled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;retried&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;cleanupFailed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="nl"&gt;droppedTelemetryEvents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;200 tasks succeed -&amp;gt; &lt;strong&gt;1 summary record exported&lt;/strong&gt;. Not 200. Not 1,000.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;attachScopeSummaryExporter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/observability&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;attachScopeSummaryExporter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;otlp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeAggregate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* same circuit breaker / queue / sampling options */&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aggregation level&lt;/th&gt;
&lt;th&gt;Records per scope&lt;/th&gt;
&lt;th&gt;When to use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scope summary (default)&lt;/td&gt;
&lt;td&gt;1 per closed scope&lt;/td&gt;
&lt;td&gt;Production -- cost-efficient&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hybrid (summary + per-task for failures/slow)&lt;/td&gt;
&lt;td&gt;summary + N&lt;/td&gt;
&lt;td&gt;Investigating a specific failure pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-task firehose&lt;/td&gt;
&lt;td&gt;one per event&lt;/td&gt;
&lt;td&gt;Short opt-in debug session&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The summary aggregator is exercised end-to-end by &lt;code&gt;npm run check:exporter-stress&lt;/code&gt; -- 100,000 events with bounded queue and drop-front under back-pressure. The bench in this folder skips the summary path on purpose: &lt;code&gt;attachScopeSummaryExporter&lt;/code&gt; needs the &lt;code&gt;scope:opened&lt;/code&gt; event, which fires before user code can attach inside &lt;code&gt;run.scope&lt;/code&gt;. Companion packages wire it earlier; the production gate covers it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Layer 4 —  Telemetry budget (the safety net)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TelemetryBudget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;TelemetryBudget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;events&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;agentRun&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exporter checks the budget before emitting each event. When a scope's event count would exceed the limit, the event is &lt;strong&gt;dropped silently&lt;/strong&gt;. The first overrun emits one warning. Subsequent overruns are counted into the next scope summary's &lt;code&gt;droppedTelemetryEvents&lt;/code&gt; field. Tasks &lt;strong&gt;continue executing normally&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Telemetry overrun must never affect application behaviour.&lt;/strong&gt; The companion &lt;code&gt;withOTel&lt;/code&gt; wrap sets a default budget at the wrap-call boundary, so the floor is opt-out, not opt-in.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cardinality Discipline And Cost Control
&lt;/h2&gt;

&lt;p&gt;Every exported field is classified bounded or unbounded. Unbounded fields are &lt;strong&gt;never&lt;/strong&gt; emitted as metric labels.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Bound&lt;/th&gt;
&lt;th&gt;In metric labels&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;scope.name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;dev-chosen&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;task.kind&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5 fixed values (&lt;code&gt;io&lt;/code&gt;/&lt;code&gt;llm&lt;/code&gt;/&lt;code&gt;tool&lt;/code&gt;/&lt;code&gt;cpu&lt;/code&gt;/&lt;code&gt;custom&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;outcome&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3 values&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cancelReason.kind&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9 values&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;error.name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;finite by class&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;attempt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bounded by retry limit&lt;/td&gt;
&lt;td&gt;yes (bucketed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;task.id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;unbounded UUID&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;no&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;error.message&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;unbounded text&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;no&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;meta.*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;user-controlled&lt;/td&gt;
&lt;td&gt;explicit opt-in only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Wrap your metric exporter with &lt;code&gt;createCardinalitySafeMetricExporter&lt;/code&gt; and pass an &lt;code&gt;allowedLabels&lt;/code&gt; allow-list -- anything outside is rejected at runtime.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/17-cardinality-safe-metrics.mjs"&gt;&lt;code&gt;17-cardinality-safe-metrics.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; Five candidate metric points, allow-list &lt;code&gt;["task.kind", "outcome", "scope.name"]&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Point&lt;/th&gt;
&lt;th&gt;Labels&lt;/th&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "task.kind": "io",  "outcome": "succeeded" }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes emitted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "task.kind": "llm", "outcome": "failed" }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes emitted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "task.kind": "tool", "task.id": "uuid-abc" }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no rejected -- &lt;code&gt;Metric label "task.id" is not in the allowed label set&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "task.kind": "io",  "error.message": "EHOSTUNREACH at 10.0.0.42 retrying" }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no rejected -- &lt;code&gt;Metric label "error.message" is not in the allowed label set&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "task.kind": "evil" }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes emitted (label-key check only -- out-of-enum &lt;em&gt;value&lt;/em&gt; validation is the OTel-adapter's job)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;The wrapper rejects unbounded label &lt;strong&gt;keys&lt;/strong&gt; at runtime. Out-of-enum value rejection (&lt;code&gt;taskKind: "evil"&lt;/code&gt; failing in OTel) is enforced by the adapter contract, while the wrapper keeps cardinality control at the label-key boundary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Correct usage:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;       &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;io&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;     &lt;span class="c1"&gt;// yes&lt;/span&gt;
&lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;llm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;    &lt;span class="c1"&gt;// yes&lt;/span&gt;
&lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;runTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tool&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;   &lt;span class="c1"&gt;// yes&lt;/span&gt;
&lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;heavyCalc&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cpu&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;    &lt;span class="c1"&gt;// yes&lt;/span&gt;
&lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;custom&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;         &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;custom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Exporter circuit breaker -- the OOM defence
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;circuitBreaker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;failureThreshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;openForMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;maxItems&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxBytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OTLP backend goes down. The exporter sees N consecutive failures -&amp;gt; opens for &lt;code&gt;openForMs&lt;/code&gt; -&amp;gt; events drop (counted, not queued). The bounded queue uses &lt;strong&gt;drop-front&lt;/strong&gt; when full, so you keep the most recent context. After &lt;code&gt;openForMs&lt;/code&gt; elapses -&amp;gt; half-open -&amp;gt; trial export -&amp;gt; close on success.&lt;/p&gt;

&lt;p&gt;Result: &lt;strong&gt;process memory growth bounded under 50 MB&lt;/strong&gt; through 1,000 scopes against a backend that returns 503 for every request. Tracked under &lt;code&gt;tests/perf/exporter-failure.test.ts&lt;/code&gt;. This is the feature that prevents the most embarrassing observability incident -- the telemetry agent eating all process memory because the backend is unreachable. Datadog had this. New Relic had this. We design it out.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;scope.tree()&lt;/code&gt; — the print statement for agents
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;agent-run
|- ok planLLM (243ms)
|- retry fetchTool (attempt 2/3)
|  `- [running] retry-delay (120ms)
|- [running] summarize (running, 45% -- "embedding chunks")
`- failed auditLog (TimeoutError)

5 tasks * 1 ok * 1 failed * 2 running * 1 retrying * deadline in 12s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Print this when something breaks. Print this in your test runner. Print this from a SIGUSR1 dump.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Icon&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ok&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;succeeded (durationMs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;failed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;failed (error.name)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cancelled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;cancelled (reason.kind)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[running]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;running (elapsed -- message)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;retry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;retrying (attempt N/total)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pending&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;pending&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;renderTree&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;renderTree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Progress is a typed event, not a log line
&lt;/h3&gt;

&lt;p&gt;Inside any task body, &lt;code&gt;ctx.report({ pct, message, data })&lt;/code&gt; emits a typed &lt;code&gt;task:progress&lt;/code&gt; event tagged with the task's stable id and name. Your exporter, your dashboard, your test assertion all pivot on the same shape. No &lt;code&gt;console.log&lt;/code&gt;. No string parsing. No grep.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// samples/progress-parallel.sample.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TARGET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;embed.batch.7&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onEvent&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;task:progress&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;taskNames&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;taskId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;TARGET&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;targetProgress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;pct&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;report&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;pct&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`chunk-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`embed.batch.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;llm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;handles&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Asserted by the sample:&lt;/span&gt;
&lt;span class="c1"&gt;//   targetProgress.map(e =&amp;gt; e.pct) === [0.25, 0.5, 0.75, 1]&lt;/span&gt;
&lt;span class="c1"&gt;//   maxActive === 16&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;16 parallel embeddings. One of them is &lt;code&gt;embed.batch.7&lt;/code&gt;. We filter the event stream to that task's id and watch the progress sequence land -- &lt;code&gt;[0.25, 0.5, 0.75, 1]&lt;/code&gt;, with the messages &lt;code&gt;chunk-1&lt;/code&gt;..&lt;code&gt;chunk-4&lt;/code&gt; attached. The other 15 siblings run concurrently and don't interleave their reports into our channel because every event carries the typed &lt;code&gt;taskId&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run sample:progress
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the difference between "tail the log file and hope" and "subscribe to a typed event stream and pivot on the shape that the type system already validated."&lt;/p&gt;

&lt;h3&gt;
  
  
  Snapshots: the stable view of a live runtime
&lt;/h3&gt;

&lt;p&gt;The hot runtime exposes &lt;strong&gt;stable snapshots&lt;/strong&gt;, not live references. Pull one whenever you need to inspect -- the engine doesn't mutate it, you can hand it to anything (logger, diagnostics, test assertion, JSON wire).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ScopeSnapshot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TaskSnapshot&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ScopeSnapshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ScopeSnapshot&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ScopeId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;running&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cancelling&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;closed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;startedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;deadlineAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;pendingCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;completedCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;failedCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;cancelledCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="nx"&gt;TaskSnapshot&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;     &lt;span class="c1"&gt;// every task currently owned by this scope&lt;/span&gt;
  &lt;span class="nl"&gt;scopes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ScopeSnapshot&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;    &lt;span class="c1"&gt;// every child scope, recursively&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;TaskSnapshot&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TaskId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TaskKind&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;             &lt;span class="c1"&gt;// "io" | "llm" | "tool" | "cpu" | "custom"&lt;/span&gt;
  &lt;span class="nl"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;running&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;succeeded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cancelled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;startedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;durationMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;progress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ProgressReport&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three properties matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Snapshot is immutable&lt;/strong&gt; -- taking one twice gives you two independent objects. The runtime never mutates one you already hold.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snapshot is recursive&lt;/strong&gt; -- &lt;code&gt;scopes&lt;/code&gt; is the same shape as the root, all the way down. Tools that walk it (the diagnoser, the renderer, your test assertions) share one shape.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snapshot is the only public surface&lt;/strong&gt; -- &lt;code&gt;renderTree&lt;/code&gt; consumes it, &lt;code&gt;diagnoseSnapshot&lt;/code&gt; consumes it, you consume it. The hot runtime owns the live state; rich tooling lives outside core.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the architectural boundary that keeps core small. Anything that wants to inspect the runtime asks for a snapshot.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;@workit/core/diagnostics&lt;/code&gt; -- the stuck-task detector
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;diagnoseSnapshot&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/diagnostics&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;report&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;diagnoseSnapshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;staleTaskMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="nx"&gt;recentEvents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;agent stalled:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findings&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Diagnoses live, on demand, against an existing snapshot. Subpath-only so the root runtime stays small.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/18-diagnostics-finding-codes.mjs"&gt;&lt;code&gt;18-diagnostics-finding-codes.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; Five hand-crafted snapshots, one per finding code.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;&lt;code&gt;report.status&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Finding codes emitted&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Healthy snapshot&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ok&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;(none)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Task running &amp;gt; 30 s&lt;/td&gt;
&lt;td&gt;&lt;code&gt;needs_attention&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;old_pending_task&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope status &lt;code&gt;cancelling&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;needs_attention&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;scope_cancelling&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pending child scope&lt;/td&gt;
&lt;td&gt;&lt;code&gt;needs_attention&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pending_child_scope&lt;/code&gt; + recursive &lt;code&gt;old_pending_task&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;task:cleanup_timeout&lt;/code&gt; event in window&lt;/td&gt;
&lt;td&gt;&lt;code&gt;needs_attention&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cleanup_timeout&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wire it to a SIGUSR1 handler in production:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SIGUSR1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;renderTree&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rootScope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;diagnoseSnapshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rootScope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;staleTaskMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Something hangs at 3 a.m. -&amp;gt; one signal gives you the live tree and a list of suspicious tasks. No APM. No external service. Stderr.&lt;/p&gt;




&lt;h2&gt;
  
  
  OpenTelemetry -- opt-in, with optional peer
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;attachOpenTelemetry&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/otel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;detach&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;attachOpenTelemetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tracer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;meter&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;@opentelemetry/api&lt;/code&gt; is an optional peer. The root WorkIt package stays at zero runtime dependencies. Install OTel only when you need it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @opentelemetry/api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the peer is missing, &lt;code&gt;attachOpenTelemetry&lt;/code&gt; throws a message that names exactly the install command -- no cryptic "cannot resolve module" trace.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three canonical configurations
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Local development -- default. No setup needed.&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// Inspect: console.log(renderTree(scope.status()))&lt;/span&gt;

&lt;span class="c1"&gt;// Production -- sampled, aggregated, budgeted, circuit-broken.&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;withOTel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;exporter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;       &lt;span class="nx"&gt;otlpExporter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;sampling&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;       &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;errors_and_slow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;slowThresholdMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;aggregation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;per_scope&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;eventBudget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;redact&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;         &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;context.user.email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;circuitBreaker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;failureThreshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;openForMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;agentRun&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Typical bill, 100K runs/day: ~$456/year.&lt;/span&gt;

&lt;span class="c1"&gt;// Full trace debugging: one-off, manual, full event stream.&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;withOTel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;exporter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;otlpExporter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;sampling&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;all&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="na"&gt;aggregation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;per_task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;problemReproduction&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Receipts
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node benchmarks/articles/15-core-zero-network.mjs       &lt;span class="c"&gt;# 0 hits in 14 dist files&lt;/span&gt;
node benchmarks/articles/16-sampling-and-aggregation.mjs &lt;span class="c"&gt;# 1,300 -&amp;gt; 36 events&lt;/span&gt;
node benchmarks/articles/17-cardinality-safe-metrics.mjs &lt;span class="c"&gt;# 2 of 5 unbounded labels rejected&lt;/span&gt;
node benchmarks/articles/18-diagnostics-finding-codes.mjs &lt;span class="c"&gt;# 4 finding codes proven&lt;/span&gt;
node benchmarks/articles/run-all.mjs                    &lt;span class="c"&gt;# full article suite&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Production-side gates that back the same surface:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Claim&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core has zero networking imports&lt;/td&gt;
&lt;td&gt;Static gate finds no &lt;code&gt;node:http&lt;/code&gt;/&lt;code&gt;node:https&lt;/code&gt;/&lt;code&gt;fetch&lt;/code&gt; in &lt;code&gt;dist/index.js&lt;/code&gt;. Reproduced by &lt;a href="//../benchmarks/articles/15-core-zero-network.mjs"&gt;&lt;code&gt;15-core-zero-network.mjs&lt;/code&gt;&lt;/a&gt; over the full published &lt;code&gt;dist/&lt;/code&gt; tree minus the explicit network-bridge subpaths.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sampling reduction (&lt;code&gt;errors_and_slow&lt;/code&gt; @ slowThreshold)&lt;/td&gt;
&lt;td&gt;100 root scopes / 5 children, &amp;gt;= 5x reduction asserted; measured ~36x. Production exporter stress test runs 100,000 events.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aggregation collapses N tasks -&amp;gt; 1 record&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;npm run check:exporter-stress&lt;/code&gt; exercises the full summary path with bounded queue.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telemetry budget never throws&lt;/td&gt;
&lt;td&gt;Property test: any budget x any event volume -&amp;gt; tasks complete normally.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cardinality enforcement at runtime&lt;/td&gt;
&lt;td&gt;
&lt;a href="//../benchmarks/articles/17-cardinality-safe-metrics.mjs"&gt;&lt;code&gt;17-cardinality-safe-metrics.mjs&lt;/code&gt;&lt;/a&gt; verifies unbounded label keys are rejected at the wrapper boundary; adapter coverage owns enum-value validation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Circuit breaker memory bound under 503 backend&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;tests/perf/exporter-failure.test.ts&lt;/code&gt;: &amp;lt; 50 MB heap growth across 1,000 scopes with backend down.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diagnostics finding codes&lt;/td&gt;
&lt;td&gt;
&lt;a href="//../benchmarks/articles/18-diagnostics-finding-codes.mjs"&gt;&lt;code&gt;18-diagnostics-finding-codes.mjs&lt;/code&gt;&lt;/a&gt; verifies healthy snapshots, old pending tasks, cancelling scopes, pending child scopes, and cleanup timeout findings.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OTel optional peer&lt;/td&gt;
&lt;td&gt;Missing peer throws explicit install message; not a cryptic resolver error.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What's coming
&lt;/h2&gt;

&lt;p&gt;You now have an agent that holds itself to a budget, releases its connections, and tells you what's happening inside without sending a byte to the cloud unless you ask.&lt;/p&gt;

&lt;p&gt;Tomorrow: the final article. &lt;strong&gt;Agent scopes and tool lifecycles.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The same ownership tree that cancels streams and bounds observability also&lt;br&gt;
governs agent tool calls, token budgets, progress events, and replayable&lt;br&gt;
execution logs. The point is not a new agent framework; it is one lifecycle&lt;br&gt;
contract for the agent loop and the rest of the application.&lt;/p&gt;




&lt;h2&gt;
  
  
  Source, Benchmarks, And Evidence
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/WorkRuntime/workit" rel="noopener noreferrer"&gt;https://github.com/WorkRuntime/workit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;NPM: &lt;a href="https://www.npmjs.com/package/@workit/core" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@workit/core&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Article source: &lt;a href="https://github.com/WorkRuntime/workit/blob/main/articles/06-observability-without-core-bloat.md" rel="noopener noreferrer"&gt;https://github.com/WorkRuntime/workit/blob/main/articles/06-observability-without-core-bloat.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Reproduce: &lt;code&gt;npm run bench:articles&lt;/code&gt; and &lt;code&gt;npm run test:evidence&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>architecture</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Most AI Agents Have Infinite Ambition and Zero Budget Control</title>
      <dc:creator>AdmilsonCossa</dc:creator>
      <pubDate>Tue, 02 Jun 2026 15:38:56 +0000</pubDate>
      <link>https://dev.to/admilsoncossa/most-ai-agents-have-infinite-ambition-and-zero-budget-control-2ee9</link>
      <guid>https://dev.to/admilsoncossa/most-ai-agents-have-infinite-ambition-and-zero-budget-control-2ee9</guid>
      <description>&lt;h2&gt;
  
  
  Resource Safety And Budgeted Work
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Last time &lt;a href="https://dev.to/admilsoncossa/dont-let-a-billion-rag-docs-drown-your-25-result-pipeline-33nk"&gt;we showed backpressure with channels and &lt;code&gt;work().stream()&lt;/code&gt; — pausing the producer the moment the consumer slows down&lt;/a&gt;. This article puts hard boundaries on cost and guarantees that cleanup always runs, even when the user hits Ctrl-C, the deadline fires, or a sibling throws.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Three primitives. One ownership tree.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;run.bracket&lt;/code&gt; — open, use, release. Always release.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run.uncancellable&lt;/code&gt; — short critical sections that survive cancellation.&lt;/li&gt;
&lt;li&gt;Budgets — hard caps on cost, tokens, or any metric, enforced atomically across parallel work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;No &lt;code&gt;try/finally&lt;/code&gt; you'll forget to write. No "did the connection close" post-mortem&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;run.bracket&lt;/code&gt; -- acquire, use, release. Always release.
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bracket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;                                                   &lt;span class="c1"&gt;// acquire&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;select 1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;        &lt;span class="c1"&gt;// use&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;                                                &lt;span class="c1"&gt;// release&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;                                                           &lt;span class="c1"&gt;// bounded cleanup&lt;/span&gt;
&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;release&lt;/code&gt; runs &lt;strong&gt;once&lt;/strong&gt; on every exit path: success, throw, parent cancel, timeout, sibling failure. The release receives the resource. The release also receives &lt;code&gt;cleanupCtx.signal&lt;/code&gt; so it can give up if the cleanup itself hangs. Nested brackets release LIFO.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/12-bracket-vs-try-finally.mjs"&gt;&lt;code&gt;12-bracket-vs-try-finally.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; Five scenarios -- measured.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Success path&lt;/td&gt;
&lt;td&gt;order: &lt;code&gt;[acquire, use, release:RES-A]&lt;/code&gt;, release ran exactly once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;use&lt;/code&gt; throws&lt;/td&gt;
&lt;td&gt;order: &lt;code&gt;[acquire, use, release:RES-B]&lt;/code&gt;, release runs with the resource, error propagates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;acquire&lt;/code&gt; throws&lt;/td&gt;
&lt;td&gt;order: &lt;code&gt;[acquire]&lt;/code&gt;, &lt;strong&gt;release does NOT run&lt;/strong&gt;, error propagates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;Parent cancel during &lt;code&gt;use&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;order: &lt;code&gt;[acquire, use, release:RES-D]&lt;/code&gt;, outer settled &lt;code&gt;CancellationError&lt;/code&gt; with &lt;code&gt;kind: "manual"&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Hanging release&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native &lt;code&gt;try/finally&lt;/code&gt; with a non-resolving cleanup is &lt;strong&gt;still pending after 250 ms&lt;/strong&gt; (would deadlock forever). &lt;code&gt;run.bracket(..., { timeout: "150ms" })&lt;/code&gt; settles at &lt;strong&gt;t=157 ms&lt;/strong&gt; and emits &lt;code&gt;task:cleanup_timeout&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bundle cost: &lt;strong&gt;+58 B min, +15 B gzip&lt;/strong&gt; on &lt;code&gt;public-api&lt;/code&gt;. Effectively free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use &lt;code&gt;bracket&lt;/code&gt;&lt;/strong&gt; — anything with a single resource that must be closed exactly once: database connections, file handles, distributed locks, HTTP client sessions, ML model contexts.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;code&gt;run.uncancellable&lt;/code&gt; — receipts that always commit
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;receipt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uncancellable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;confirmIntent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recordReceipt&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;receipt_url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;receipt&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The user hits Ctrl-C. The parent scope cancels. The deadline fires. Inside the shielded body, &lt;strong&gt;none of those are visible&lt;/strong&gt; — &lt;code&gt;ctx.signal&lt;/code&gt; is a fresh signal local to the shield. The body runs to completion (or to its own &lt;code&gt;timeout&lt;/code&gt;). When the shield finishes, if the parent had cancelled during the shield, the original &lt;code&gt;CancellationError&lt;/code&gt; rethrows after the body completes.&lt;/p&gt;

&lt;p&gt;Cancellation is &lt;strong&gt;delayed&lt;/strong&gt;, not hidden.&lt;/p&gt;

&lt;p&gt;This is the line that lets you write a Stripe webhook handler, a distributed-lock release, or a database commit without relying on ordinary task cancellation to preserve the critical section. &lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/08-uncancellable-shield.mjs"&gt;&lt;code&gt;08-uncancellable-shield.mjs&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; (article 03) measured the body running 95 ms past a parent cancel before the original reason was rethrown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use &lt;code&gt;uncancellable&lt;/code&gt;&lt;/strong&gt; — short, critical sections that must finish atomically: Stripe charges, audit log flushes, idempotency-key writes, distributed-lock release.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;bracket&lt;/code&gt; vs &lt;code&gt;uncancellable&lt;/code&gt; decision rule:&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;run.bracket&lt;/code&gt; when there is a &lt;strong&gt;resource you opened and must close&lt;/strong&gt;. Cleanup is the contract; the body is just what runs in between.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;run.uncancellable&lt;/code&gt; when there is &lt;strong&gt;a critical section that must run to the end&lt;/strong&gt; even if the parent cancels. There may be no resource.&lt;/li&gt;
&lt;li&gt;Use both together when a critical section needs a resource: spawn a &lt;code&gt;run.bracket&lt;/code&gt; whose &lt;code&gt;use&lt;/code&gt; body is a &lt;code&gt;run.uncancellable&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;run.uncancellable&lt;/code&gt; is &lt;strong&gt;cooperative&lt;/strong&gt;. It cannot stop a non-cooperative CPU loop inside the body. For that, see article 03 — &lt;code&gt;offload&lt;/code&gt; with worker termination.&lt;/p&gt;


&lt;h2&gt;
  
  
  Budgeted Agent Work: A 50-Cent Ceiling
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CostBudget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;CostBudget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;reactLoop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;goal&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Inside any task body, charge with &lt;code&gt;ctx.consumeCost&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;callLLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;consumeCost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total_cost&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// throws + cancels owning scope on overrun&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;ctx.consumeCost(amount)&lt;/code&gt; is atomic. Concurrent charges across siblings serialize through the budget cell. Overrun throws &lt;code&gt;BudgetExceededError&lt;/code&gt; and cancels the &lt;strong&gt;owning scope&lt;/strong&gt; — the scope that set the budget, even if the charge happened five levels deeper. The cancel reason is typed: &lt;code&gt;CancelReason { kind: "budget", budgetKey, limit, spent }&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Built-in budgets:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CostBudget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TokenBudget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;OpenAITokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;AgentToolCalls&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Custom budgets:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBudget&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Anthropic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createBudget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;anthropic-tokens&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tokens&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/13-budget-atomicity-and-cancel.mjs"&gt;&lt;code&gt;13-budget-atomicity-and-cancel.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; Three rules, measured.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;Bench observation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Atomic concurrent charges&lt;/td&gt;
&lt;td&gt;100 sibling tasks each consume 0.01 from a 1.00 cap -&amp;gt; final spent = &lt;strong&gt;1.0000...&lt;/strong&gt; exactly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Owning scope cancellation&lt;/td&gt;
&lt;td&gt;Budget set at depth 0; overrun attempted at depth 5; outer scope cancelled with &lt;code&gt;kind: "budget"&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caller-object immutability&lt;/td&gt;
&lt;td&gt;After 0.5 of charges, the caller's input object stays &lt;code&gt;{ spent: 0, limit: 1, unit: "USD" }&lt;/code&gt; (engine clones); live snapshot reflects the actual spend&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three more rules complete the contract (each tracked in the production suite):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;Where it's enforced&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Inner scope can shadow parent budget&lt;/td&gt;
&lt;td&gt;Evidence coverage verifies an inner budget cell can charge independently while the outer budget remains unchanged.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live read via &lt;code&gt;run.context.budget(key)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Returns a fresh snapshot. Mutating the snapshot does not affect future reads.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snapshots are &lt;code&gt;Readonly&amp;lt;BudgetState&amp;gt;&lt;/code&gt; at the type&lt;/td&gt;
&lt;td&gt;Consumer cannot mutate; engine routes mutation through &lt;code&gt;ctx.consume()&lt;/code&gt; only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  100,000 documents under a token cap
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;group&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;OpenAITokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;embedAll&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/ai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;OpenAITokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tokens&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;embedAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;documents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;concurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;countTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;})),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;embedAll&lt;/code&gt; is a thin helper built on &lt;code&gt;work().inParallel()&lt;/code&gt; from article 02 plus &lt;code&gt;ctx.consume(OpenAITokens, count)&lt;/code&gt; per item. Hit the cap mid-stream -&amp;gt; scope cancels with &lt;code&gt;CancelReason { kind: "budget", limit: 1_000_000, spent: 1_000_000 }&lt;/code&gt;. The 32 inflight embeddings see the abort on their &lt;code&gt;ctx.signal&lt;/code&gt;. Provider calls that honor the signal cancel at the transport boundary. Partial results return and no additional budget is consumed after the cap.&lt;/p&gt;

&lt;p&gt;Tracked: &lt;code&gt;sample:embed100k&lt;/code&gt; runs the full 100,000-document pipeline against a deterministic provider fixture in CI. Asserts &lt;code&gt;maxActive &amp;lt;= concurrency&lt;/code&gt;, &lt;code&gt;finalBudget.spent === total&lt;/code&gt;, &lt;code&gt;output.results.length === total&lt;/code&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Context Overlay Speedup
&lt;/h2&gt;

&lt;p&gt;Budgets, cancellation reasons, request scopes, idempotency keys, agent identity, deadlines — every cross-cutting concern lives in &lt;code&gt;ContextBag&lt;/code&gt;. The first-pass implementation cloned the underlying &lt;code&gt;Map&lt;/code&gt; on every &lt;code&gt;.with()&lt;/code&gt; call. That's quadratic when you have a deep agent stack.&lt;/p&gt;

&lt;p&gt;The fix: an &lt;strong&gt;overlay-based&lt;/strong&gt; context. Think of it as a linked list of single-key deltas pointing at the parent bag. &lt;code&gt;.with(key, value)&lt;/code&gt; returns a child that stores one entry and points at its parent. Lookup walks up the chain. Memory and cost per &lt;code&gt;.with()&lt;/code&gt; are O(1).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/14-context-overlay-perf.mjs"&gt;&lt;code&gt;14-context-overlay-perf.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; 100 &lt;code&gt;.with()&lt;/code&gt; calls over a 5,000-key bag.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;th&gt;Wall time&lt;/th&gt;
&lt;th&gt;Per call&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Naïve clone-on-&lt;code&gt;with&lt;/code&gt; (inline baseline)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;32.6 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~0.33 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WorkIt overlay context&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.011 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~0.0001 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The representative run shows a large constant-factor improvement over the inline clone baseline. Same public API. Same lookup result. The CI gate &lt;code&gt;npm run check:context-performance&lt;/code&gt; asserts the overlay completes the workload in &lt;strong&gt;&amp;lt; 10 ms&lt;/strong&gt; and the bench additionally asserts the inline baseline is at least 10x slower.&lt;/p&gt;

&lt;p&gt;Evidence coverage verifies a deep shadow chain still resolves correctly and child shadows do not leak into the parent.&lt;/p&gt;


&lt;h2&gt;
  
  
  How WorkIt compares on resource safety
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;Cancel-aware&lt;/th&gt;
&lt;th&gt;Cleanup runs on every exit&lt;/th&gt;
&lt;th&gt;Bounded cleanup time&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WorkIt &lt;code&gt;run.bracket&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes via &lt;code&gt;CleanupOpts.timeout&lt;/code&gt; + &lt;code&gt;task:cleanup_timeout&lt;/code&gt; event&lt;/td&gt;
&lt;td&gt;release receives the resource and a cleanup signal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WorkIt &lt;code&gt;run.uncancellable&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yes (delayed rethrow)&lt;/td&gt;
&lt;td&gt;n/a (it's the body, not a release)&lt;/td&gt;
&lt;td&gt;yes via shield &lt;code&gt;timeout&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;for short critical sections, not resource cleanup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;try { } finally { }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no — finally cannot run after a hard cancel; cannot be bounded&lt;/td&gt;
&lt;td&gt;partial — runs only if the awaiter completes settlement&lt;/td&gt;
&lt;td&gt;no — a hanging cleanup deadlocks&lt;/td&gt;
&lt;td&gt;bench 12-E: still pending after 250 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ES2024 &lt;code&gt;using&lt;/code&gt; / &lt;code&gt;await using&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;no — disposal hooks have no signal awareness&lt;/td&gt;
&lt;td&gt;yes on scope exit&lt;/td&gt;
&lt;td&gt;no — no timeout&lt;/td&gt;
&lt;td&gt;best when the resource has an &lt;code&gt;[Symbol.dispose]&lt;/code&gt; and no cleanup timeout is required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effect-TS &lt;code&gt;acquireRelease&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;partial (no built-in timeout on release in the public surface)&lt;/td&gt;
&lt;td&gt;richer, but inside the Effect DSL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;WorkIt is the only row that provides cancel-aware cleanup, guaranteed-to-run release, and a &lt;strong&gt;bounded timeout for the cleanup itself&lt;/strong&gt;, surfaced as a typed event.&lt;/p&gt;


&lt;h2&gt;
  
  
  Receipts
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node benchmarks/articles/12-bracket-vs-try-finally.mjs        &lt;span class="c"&gt;# 5 bracket scenarios&lt;/span&gt;
node benchmarks/articles/13-budget-atomicity-and-cancel.mjs   &lt;span class="c"&gt;# atomic + owning + immutable&lt;/span&gt;
node benchmarks/articles/14-context-overlay-perf.mjs          &lt;span class="c"&gt;# 32.6 ms vs 0.011 ms&lt;/span&gt;
node benchmarks/articles/run-all.mjs                          &lt;span class="c"&gt;# full article suite&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Production-side gates that back the same primitives:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Claim&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;run.bracket&lt;/code&gt; scenarios&lt;/td&gt;
&lt;td&gt;
&lt;a href="//../benchmarks/articles/12-bracket-vs-try-finally.mjs"&gt;&lt;code&gt;12-bracket-vs-try-finally.mjs&lt;/code&gt;&lt;/a&gt; covers success, throw, cancel, timeout, hanging cleanup, and bounded release.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;run.uncancellable&lt;/code&gt; scenarios&lt;/td&gt;
&lt;td&gt;
&lt;a href="//../benchmarks/articles/08-uncancellable-shield.mjs"&gt;&lt;code&gt;08-uncancellable-shield.mjs&lt;/code&gt;&lt;/a&gt; covers parent cancel during body, shield timeout, nested shields, and signal isolation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budget atomicity&lt;/td&gt;
&lt;td&gt;Property test: 100 concurrent charges of 0.01 -&amp;gt; spent = 1.00 exactly. Reproduced by &lt;a href="//../benchmarks/articles/13-budget-atomicity-and-cancel.mjs"&gt;&lt;code&gt;13-budget-atomicity-and-cancel.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budget snapshot immutability&lt;/td&gt;
&lt;td&gt;
&lt;a href="//../tests/evidence/correctness/runtime-contracts.mjs"&gt;&lt;code&gt;tests/evidence/correctness/runtime-contracts.mjs&lt;/code&gt;&lt;/a&gt; verifies caller objects remain unchanged and snapshots are read-only views of budget state.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budget owning-scope cancellation&lt;/td&gt;
&lt;td&gt;Charge attempted at depth 5 cancels the owning scope at depth 0 with &lt;code&gt;kind: "budget"&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context overlay perf&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;npm run check:context-performance&lt;/code&gt; asserts &amp;lt; 10 ms; bench records a representative ~0.01 ms run with a large speedup over the inline baseline.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100K embeddings sample&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sample:embed100k&lt;/code&gt;: 100,000 docs, concurrency 32, token budget enforced, in-CI assertion.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  What's coming
&lt;/h2&gt;

&lt;p&gt;Now you can build an agent that costs 50 cents max, holds a database connection that always closes, and confirms a Stripe charge through a user disconnect.&lt;/p&gt;

&lt;p&gt;Tomorrow: &lt;strong&gt;observability with bounded telemetry cost.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;scope.tree()&lt;/code&gt; as a print statement for agents. The four-layer cost-control architecture — sampling, batching, summarization, budgeting — that takes a 100K-runs/day workload from $9,125/year of CloudWatch ingestion down to &lt;strong&gt;$456/year&lt;/strong&gt; while preserving slow/error traces. 20x less data. One config object.&lt;/p&gt;

&lt;p&gt;The headline: a structured-concurrency runtime where observability is &lt;strong&gt;sampled, batched, summarized, and budgeted by default&lt;/strong&gt; — and you opt out of cost protection, not in.&lt;/p&gt;


&lt;h2&gt;
  
  
  Source, Benchmarks, And Evidence
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;NPM: &lt;a href="https://github.com/WorkRuntime/workit" rel="noopener noreferrer"&gt;https://github.com/WorkRuntime/workit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source &lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://workruntime.github.io/workit/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;workruntime.github.io&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;/li&gt;

&lt;li&gt;Article source: &lt;a href="https://github.com/WorkRuntime/workit/blob/main/articles/05-resource-safety-and-budgeted-work.md" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://github.com/WorkRuntime/workit/blob/main/articles/05-resource-safety-and-budgeted-work.md" rel="noopener noreferrer"&gt;https://github.com/WorkRuntime/workit/blob/main/articles/05-resource-safety-and-budgeted-work.md&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;Reproduce: &lt;code&gt;npm run bench:articles&lt;/code&gt; and &lt;code&gt;npm run test:evidence&lt;/code&gt;
&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>node</category>
      <category>programming</category>
    </item>
    <item>
      <title>Don't let a billion RAG docs drown your 25-result pipeline</title>
      <dc:creator>AdmilsonCossa</dc:creator>
      <pubDate>Mon, 25 May 2026 10:17:41 +0000</pubDate>
      <link>https://dev.to/admilsoncossa/dont-let-a-billion-rag-docs-drown-your-25-result-pipeline-33nk</link>
      <guid>https://dev.to/admilsoncossa/dont-let-a-billion-rag-docs-drown-your-25-result-pipeline-33nk</guid>
      <description>&lt;h2&gt;
  
  
  Backpressure For Streaming Pipelines
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Last time we showed &lt;a href="https://dev.to/admilsoncossa/your-worker-didnt-stop-you-only-stopped-waiting-41m6"&gt;how to terminate non-cooperative CPU work at the worker boundary&lt;/a&gt;. This article stays cooperative but adds the missing piece: backpressure, the runtime contract that lets a producer pause the moment the consumer can't keep up.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A RAG ingest pipeline has a billion candidate documents. You only need the 25 that match a downstream filter. A naive promise collection can materialize far more work than the consumer needs; a hand-rolled async iterator can still fill a prefetch buffer before the first result arrives. With WorkIt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;work&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;billionDocuments&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000_000_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`doc &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;processed&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nf"&gt;work&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;billionDocuments&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inParallel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;enrich&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;processed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things to notice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;work()&lt;/code&gt; accepts an async iterable directly.&lt;/strong&gt; No &lt;code&gt;.from()&lt;/code&gt;, no &lt;code&gt;Readable.from(...)&lt;/code&gt; shim. The signature is &lt;code&gt;Iterable&amp;lt;I&amp;gt; | AsyncIterable&amp;lt;I&amp;gt; -&amp;gt; WorkBuilder&amp;lt;I, I&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;.map().stream()&lt;/code&gt; is the streaming pipeline form.&lt;/strong&gt; &lt;code&gt;.do(fn)&lt;/code&gt; returns a &lt;code&gt;Promise&amp;lt;WorkOutput&amp;lt;R&amp;gt;&amp;gt;&lt;/code&gt; (full batch result). &lt;code&gt;.map(fn)&lt;/code&gt; returns a new builder; &lt;code&gt;.stream()&lt;/code&gt; on a builder returns an &lt;code&gt;AsyncIterable&amp;lt;O&amp;gt;&lt;/code&gt; that respects backpressure. Both terminals exist; you pick by what the consumer is doing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What the producer actually does:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/09-stream-1b-lazy.mjs"&gt;&lt;code&gt;09-stream-1b-lazy.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; 1,000,000,000-row generator. &lt;code&gt;inParallel(16)&lt;/code&gt;. Consumer takes 25, breaks.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;th&gt;Consumed&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Items pulled from the generator&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;maxActive&lt;/th&gt;
&lt;th&gt;In-flight after break&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Naïve eager prefetch buffer (256-deep)&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;281&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0 (all let to settle)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;work().inParallel(16).map().stream()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0 (cancelled at break)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;These are representative captured values. The bench &lt;code&gt;assert&lt;/code&gt;s the invariant: produced items stay bounded by &lt;code&gt;TAKE + CONCURRENCY&lt;/code&gt;. The naïve baseline pulled 281 items because once the prefetch buffer is full it doesn't pause the producer -- it pauses the worker pool, which is a different question.&lt;/p&gt;

&lt;p&gt;That's &lt;strong&gt;backpressure&lt;/strong&gt;: the producer pauses when the consumer slows down or stops, not when the worker pool fills.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;work().stream()&lt;/code&gt; -- bounded, lazy, cancellable
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;summary&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nf"&gt;work&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;documents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inParallel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withRetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;15s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;summarize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Properties the runtime guarantees:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;inParallel(N)&lt;/code&gt; is a hard cap.&lt;/strong&gt; &lt;code&gt;maxActive&lt;/code&gt; never exceeds &lt;code&gt;N&lt;/code&gt;. Property test runs 1..20 wide x 1..100 items, asserts the cap holds across every shape.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;stream()&lt;/code&gt; is lazy.&lt;/strong&gt; The producer iterator pulls only when an inflight slot is free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;break&lt;/code&gt; is cancellation.&lt;/strong&gt; The remaining inflight tasks abort with &lt;code&gt;CancelReason { kind: "manual", tag: "stream_consumer_closed" }&lt;/code&gt;. Their &lt;code&gt;ctx.defer&lt;/code&gt; runs. The producer iterator's &lt;code&gt;return()&lt;/code&gt; runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A throw inside the body&lt;/strong&gt; triggers &lt;code&gt;CancelReason { kind: "manual", tag: "stream_failed" }&lt;/code&gt; for siblings -- typed, distinguishable from the consumer-break path on a dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow consumer pauses producer.&lt;/strong&gt; Tracked under &lt;code&gt;check:stream-memory&lt;/code&gt;: 1,000,000 logical items, slow consumer, bounded heap growth, and no unbounded producer advance.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/10-stream-slow-consumer.mjs"&gt;&lt;code&gt;10-stream-slow-consumer.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; 5,000-item source, &lt;code&gt;inParallel(16)&lt;/code&gt;, consumer ~5 ms per item, take 200.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Consumed&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Produced&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;215&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Producer overshoot&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;15&lt;/strong&gt; (bound: &lt;code&gt;CONCURRENCY + 1&lt;/code&gt; = 17)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;maxActive&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;In-flight after break&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wall time&lt;/td&gt;
&lt;td&gt;~3,108 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;The interesting detail: even with &lt;code&gt;inParallel(16)&lt;/code&gt;, &lt;code&gt;maxActive&lt;/code&gt; stayed at 1 because the consumer was the bottleneck. The runtime didn't speculatively saturate the worker pool -- it paced the producer to consumer demand. That is what "backpressure" actually means. A pool that always runs at capacity isn't backpressure; it's a pool.&lt;/p&gt;

&lt;h3&gt;
  
  
  Streaming map: stop after 12, produce only what demand requires
&lt;/h3&gt;

&lt;p&gt;The most practical reader-facing form of the same property -- a real summarizer pipeline, the size of a real prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// samples/streaming-summarizer.sample.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TAKE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CONCURRENCY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;summary&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nf"&gt;work&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;documents&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inParallel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CONCURRENCY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withRetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;500ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`summary:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;summaries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;summaries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;TAKE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Asserted by the sample:&lt;/span&gt;
&lt;span class="c1"&gt;//   summaries.length === TAKE&lt;/span&gt;
&lt;span class="c1"&gt;//   produced     &amp;lt;= TAKE + CONCURRENCY - 1&lt;/span&gt;
&lt;span class="c1"&gt;//   maxActive    === CONCURRENCY&lt;/span&gt;
&lt;span class="c1"&gt;//   active       === 0       // all in-flight cancelled cleanly on break&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;50-doc generator. Consume 12. Producer never advances past 16. Concurrency cap exact. Active count zero after &lt;code&gt;break&lt;/code&gt;. Retry and timeout policy attached without breaking the pull cadence.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run sample:stream
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Defaults that don't surprise
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;inParallel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1&lt;/code&gt; (sequential)&lt;/td&gt;
&lt;td&gt;Auto-concurrency surprises rate-limited APIs. Sequential is correct.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;withRetry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;Retrying non-idempotent ops silently is a footgun.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;withTimeout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;Cancelling work the user didn't ask to cancel is worse than no timeout.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;onError&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"fail"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Matches &lt;code&gt;Promise.all&lt;/code&gt; intuition. The discriminated &lt;code&gt;WorkOutput&amp;lt;R&amp;gt;&lt;/code&gt; return type forces explicit handling on the others.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You opt &lt;strong&gt;into&lt;/strong&gt; resilience. Nothing is implicit.&lt;/p&gt;




&lt;h2&gt;
  
  
  CSP-style channels -- &lt;code&gt;@workit/core/channel&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;work().stream()&lt;/code&gt; is the right shape when the producer-consumer relationship is one fluent pipeline. When the producer and consumer are independent tasks running side by side -- fan-in, fan-out, work-queue -- you want a channel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createChannel&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/channel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;group&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;orders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createChannel&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nf"&gt;orderSource&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;processOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Channel contract, all five rows verified by &lt;a href="//../benchmarks/articles/11-channel-contract.mjs"&gt;&lt;code&gt;11-channel-contract.mjs&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Bench observation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;send&lt;/code&gt; blocks when the channel is full&lt;/td&gt;
&lt;td&gt;On a &lt;code&gt;capacity: 2&lt;/code&gt; channel, the third &lt;code&gt;send&lt;/code&gt; is still pending after a microtask turn and completes only after a &lt;code&gt;receive&lt;/code&gt; frees a slot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;close()&lt;/code&gt; drains buffered values&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;[1, 2, 3]&lt;/code&gt; delivered, then iteration ended cleanly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Pending &lt;code&gt;send&lt;/code&gt; after &lt;code&gt;close(reason)&lt;/code&gt; rejects&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ChannelClosedError&lt;/code&gt; with &lt;code&gt;reason: { tag: "shutdown" }&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;A &lt;code&gt;signal&lt;/code&gt; cancels a pending &lt;code&gt;receive&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Pending receive rejects when the controller aborts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;Capacity validation&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0&lt;/code&gt;, &lt;code&gt;-1&lt;/code&gt;, &lt;code&gt;0.5&lt;/code&gt;, &lt;code&gt;NaN&lt;/code&gt;, &lt;code&gt;Infinity&lt;/code&gt; all rejected with &lt;code&gt;RangeError&lt;/code&gt; at &lt;code&gt;createChannel(...)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Cancellation composes with the parent scope.&lt;/strong&gt; If the consumer task throws inside &lt;code&gt;group&lt;/code&gt;, sibling cancellation aborts the producer's pending &lt;code&gt;send&lt;/code&gt;. The producer's &lt;code&gt;for await&lt;/code&gt; exits cleanly through the rejection. No orphaned sends, no leaked consumers, no half-drained buffer.&lt;/p&gt;

&lt;p&gt;This is Go's &lt;code&gt;chan&lt;/code&gt; with structured-concurrency parents. Kotlin's &lt;code&gt;Channel&lt;/code&gt; without coroutines. It fills the gap between "raw async iterator" and "RxJS observable" for owned producer-consumer work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bad-batch bisection -- one rotten document doesn't poison the embedding
&lt;/h2&gt;

&lt;p&gt;A real RAG pipeline failure mode: the provider returns 400 for a mixed batch because &lt;strong&gt;one&lt;/strong&gt; of the documents is malformed. With &lt;code&gt;Promise.all&lt;/code&gt;, the whole batch fails, the budget is spent on nothing, and the next 99 documents get re-embedded on retry.&lt;/p&gt;

&lt;p&gt;WorkIt ships &lt;code&gt;embedAllBisection&lt;/code&gt; that splits the failed batch and recovers the good vectors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// samples/embed-bisection.sample.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;embedAllBisection&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;alpha&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bad-doc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gamma&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;embedBatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bad-doc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BadBatchError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;provider rejected mixed batch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;batchSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;onError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;continue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;countTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Asserted by the sample:&lt;/span&gt;
&lt;span class="c1"&gt;//   result.results contains the vectors for "alpha" and "gamma"&lt;/span&gt;
&lt;span class="c1"&gt;//   result.errors  contains exactly one entry pointing at "bad-doc"&lt;/span&gt;
&lt;span class="c1"&gt;//   tokensSpent reflects only the successful work&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;BadBatchError&lt;/code&gt; is the contract. Throw it from &lt;code&gt;embedBatch&lt;/code&gt; and the helper bisects: split the batch in halves, retry each half, isolate the rotten document, keep the good vectors. Token budget accounting follows the actual successful work -- you don't pay for the failed mixed batch twice.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run sample:bisection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the difference between "batch job dies at 2 a.m. and the on-call resyncs the warehouse" and "batch job logs the bad ID and keeps going."&lt;/p&gt;




&lt;h2&gt;
  
  
  Streaming STT with disconnect cleanup (revisited)
&lt;/h2&gt;

&lt;p&gt;Article 1 showed this. Now you can read the backpressure underneath it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;transcribeStream&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/ai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nf"&gt;transcribeStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;microphone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;transcribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transcribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the user closes their laptop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;socket.signal&lt;/code&gt; aborts.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transcribeStream&lt;/code&gt; propagates the abort to the inflight &lt;code&gt;transcribe()&lt;/code&gt; body.&lt;/li&gt;
&lt;li&gt;The provider's HTTP request aborts at the &lt;code&gt;AbortSignal&lt;/code&gt; boundary.&lt;/li&gt;
&lt;li&gt;The async generator's &lt;code&gt;finally&lt;/code&gt; runs, closing the microphone source.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;for await&lt;/code&gt; loop exits.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tracked sample: &lt;strong&gt;&lt;code&gt;sample:stt-disconnect&lt;/code&gt;&lt;/strong&gt; -- disconnects mid-second-chunk, asserts the provider was cancelled, the source was closed, and the cancel reason kind is &lt;code&gt;manual&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  How WorkIt's streaming primitives compare
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Backpressure&lt;/th&gt;
&lt;th&gt;Cancellation&lt;/th&gt;
&lt;th&gt;Structured concurrency&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WorkIt &lt;code&gt;work().stream()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yes producer pauses on consumer&lt;/td&gt;
&lt;td&gt;yes via &lt;code&gt;ctx.signal&lt;/code&gt; and &lt;code&gt;break&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;yes scope-owned&lt;/td&gt;
&lt;td&gt;Backpressure between producer and consumer in one pipeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WorkIt &lt;code&gt;createChannel&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yes blocking &lt;code&gt;send&lt;/code&gt;/&lt;code&gt;receive&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;yes via signal + scope cancel&lt;/td&gt;
&lt;td&gt;yes scope-owned&lt;/td&gt;
&lt;td&gt;Backpressure between independent tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js &lt;code&gt;Readable&lt;/code&gt; stream&lt;/td&gt;
&lt;td&gt;yes via &lt;code&gt;highWaterMark&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;partial via &lt;code&gt;destroy()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;no no scope&lt;/td&gt;
&lt;td&gt;No structured cancel propagation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RxJS observable&lt;/td&gt;
&lt;td&gt;no by default; pressure operators are opt-in&lt;/td&gt;
&lt;td&gt;yes on &lt;code&gt;unsubscribe&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;per-subscription, not per-scope&lt;/td&gt;
&lt;td&gt;Different model: events, not owned tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p-queue&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;partial (concurrency limit)&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Bounds in-flight, not producer pull&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Async generator (raw)&lt;/td&gt;
&lt;td&gt;yes pull-based&lt;/td&gt;
&lt;td&gt;partial via &lt;code&gt;return()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;No bounded concurrency without manual scaffolding&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;WorkIt's streaming and channel primitives are the only ones in the table that tie backpressure &lt;strong&gt;to ownership&lt;/strong&gt; -- cancel the scope, the channel closes, the in-flight work aborts, and cleanup runs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Receipts
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node benchmarks/articles/09-stream-1b-lazy.mjs        &lt;span class="c"&gt;# naive 281 vs WorkIt 40&lt;/span&gt;
node benchmarks/articles/10-stream-slow-consumer.mjs  &lt;span class="c"&gt;# producer overshoot 15 vs bound 17&lt;/span&gt;
node benchmarks/articles/11-channel-contract.mjs      &lt;span class="c"&gt;# 5 channel scenarios&lt;/span&gt;
node benchmarks/articles/run-all.mjs                  &lt;span class="c"&gt;# full article suite&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Production-side gates that back the same primitives:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Claim&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 B virtual stream consumed = 25&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sample:1b&lt;/code&gt; produces &amp;lt;= TAKE+CONCURRENCY items, asserted in CI. Reproduced by &lt;a href="//../benchmarks/articles/09-stream-1b-lazy.mjs"&gt;&lt;code&gt;09-stream-1b-lazy.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 M item slow-consumer gate&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;check:stream-memory&lt;/code&gt; -- heap growth bounded, max active capped, and producer pull remains demand-limited.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Channel backpressure on capacity 2&lt;/td&gt;
&lt;td&gt;
&lt;a href="//../benchmarks/articles/11-channel-contract.mjs"&gt;&lt;code&gt;11-channel-contract.mjs&lt;/code&gt;&lt;/a&gt; verifies the third send blocks until the first receive.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Channel close + drain&lt;/td&gt;
&lt;td&gt;
&lt;a href="//../tests/evidence/correctness/runtime-contracts.mjs"&gt;&lt;code&gt;tests/evidence/correctness/runtime-contracts.mjs&lt;/code&gt;&lt;/a&gt; verifies buffered values drain before &lt;code&gt;done: true&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Channel cancel via signal&lt;/td&gt;
&lt;td&gt;Channel contract coverage verifies pending receives reject with the cancel reason.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Channel composes with &lt;code&gt;group()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Channel contract coverage verifies producer/consumer pipelines deliver values in order.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;work().inParallel(N)&lt;/code&gt; cap&lt;/td&gt;
&lt;td&gt;Property test (&lt;code&gt;fast-check&lt;/code&gt;): for any (N, total), &lt;code&gt;maxActive &amp;lt;= N&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STT disconnect&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sample:stt-disconnect&lt;/code&gt;: provider cancelled, source closed, reason kind = &lt;code&gt;manual&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Run them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run sample:1b
npm run sample:stream
npm run sample:embed100k
npm run sample:bisection
npm run sample:stt-disconnect
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What's coming
&lt;/h2&gt;

&lt;p&gt;Now you have a producer that paces itself to the consumer, a channel that closes when its scope cancels, and a stream that exits cleanly when the user closes the tab.&lt;/p&gt;

&lt;p&gt;Tomorrow we add the next ownership primitive on top: &lt;strong&gt;the budget&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;$0.50&lt;/code&gt; &lt;code&gt;CostBudget&lt;/code&gt;. A &lt;code&gt;100,000&lt;/code&gt;-token &lt;code&gt;OpenAITokens&lt;/code&gt;. A &lt;code&gt;5&lt;/code&gt;-tool-call &lt;code&gt;AgentToolCalls&lt;/code&gt;. Atomic across all parallel children. Inheritable through scope context. Shadowed by inner scopes for sub-budgets. Overrun cancels with &lt;code&gt;CancelReason { kind: "budget" }&lt;/code&gt; and partial results stay.&lt;/p&gt;

&lt;p&gt;The runtime change underneath this is context overlay lookup: 100 &lt;code&gt;.with()&lt;/code&gt; calls over a 5,000-key context bag moved from tens of milliseconds in the inline clone baseline to well under the 10 ms gate, without changing a line of public API. The bench in the next article shows the representative timing.&lt;/p&gt;

&lt;p&gt;The point is not simply "we have budgets." Many frameworks expose budgets. The stronger claim is &lt;strong&gt;budgets that compose with cancellation, race, retry, hedge, fallback, channels, and streams&lt;/strong&gt; under one ownership tree.&lt;/p&gt;




&lt;h2&gt;
  
  
  Source, Benchmarks, And Evidence
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/WorkRuntime/workit" rel="noopener noreferrer"&gt;https://github.com/WorkRuntime/workit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Article source: &lt;a href="https://github.com/WorkRuntime/workit/blob/main/articles/04-backpressure-for-streaming-pipelines.md" rel="noopener noreferrer"&gt;https://github.com/WorkRuntime/workit/blob/main/articles/04-backpressure-for-streaming-pipelines.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Reproduce: &lt;code&gt;npm run bench:articles&lt;/code&gt; and &lt;code&gt;npm run test:evidence&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cancelling a Task Doesn’t Stop the CPU Work — Killing Non-Cooperative Jobs in worker_threads</title>
      <dc:creator>AdmilsonCossa</dc:creator>
      <pubDate>Thu, 21 May 2026 09:04:21 +0000</pubDate>
      <link>https://dev.to/admilsoncossa/your-worker-didnt-stop-you-only-stopped-waiting-41m6</link>
      <guid>https://dev.to/admilsoncossa/your-worker-didnt-stop-you-only-stopped-waiting-41m6</guid>
      <description>&lt;p&gt;&lt;em&gt;Last time we showed &lt;a href="https://dev.to/admilsoncossa/concurrency-retry-and-timeout-under-one-owner-504c"&gt;nine composables that cancel siblings, retry with signal-aware backoff, and hedge tied requests&lt;/a&gt;. That's cooperative cancellation – it works when the body checks the signal and the I/O it makes is signal-aware. This article answers the hard question: what happens when code does not cooperate?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Drop this in a worker module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// benchmarks/articles/lib/spinner.mjs – ignores every signal you throw at it&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;writeFileSync&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:fs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;spin&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;durationMs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;markerPath&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;durationMs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;e6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;markerPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;late-marker-written-by-worker&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;elapsedMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the canonical "non-cooperative" body. Tight loop, no &lt;code&gt;await&lt;/code&gt;, no &lt;code&gt;signal.aborted&lt;/code&gt; check. In a single-threaded JS runtime, cooperative cancellation cannot stop it from the outside. &lt;code&gt;AbortController&lt;/code&gt; can record cancellation, but the callback cannot run until the event loop yields.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;offload&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/worker&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;offload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;spinnerURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;spin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;durationMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;markerPath&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;200ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;200 ms later: &lt;code&gt;TimeoutError&lt;/code&gt;. The worker thread is terminated by the host. The late-marker file &lt;strong&gt;does not exist&lt;/strong&gt; on disk. We &lt;code&gt;stat()&lt;/code&gt; for it in CI and fail the gate if it does.&lt;/p&gt;

&lt;p&gt;That's the only honest answer to "can JS forcibly stop work". The answer is &lt;em&gt;no on the main thread&lt;/em&gt; – but you can move the work to a worker and have the host kill the thread.&lt;/p&gt;

&lt;p&gt;WorkIt has both layers. They are labeled honestly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/07-worker-hard-kill.mjs"&gt;&lt;code&gt;07-worker-hard-kill.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; 5,000 ms spin loop. 200 ms timeout. Late-marker file written &lt;em&gt;after&lt;/em&gt; the loop completes. Timings are representative; the invariant is the marker-file result.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;th&gt;Settled at&lt;/th&gt;
&lt;th&gt;Late-marker file on disk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Main-thread &lt;code&gt;AbortController.abort()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;t=5,001 ms (full duration)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;yes exists&lt;/strong&gt; – the abort callback never even fired; the event loop was starved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;offload({ timeout: "200ms" })&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;t=206 ms with &lt;code&gt;TimeoutError&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;no does not exist&lt;/strong&gt; – and stays absent through an 800 ms grace window&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;The native baseline is the receipt for "AbortController cannot preempt a CPU loop." The body completed all 5 seconds and wrote the marker, and the &lt;code&gt;setTimeout&lt;/code&gt; that was supposed to fire &lt;code&gt;controller.abort()&lt;/code&gt; at 200 ms could not be delivered because the event loop never returned. The abort callback never ran.&lt;/p&gt;




&lt;h2&gt;
  
  
  Layer 1 -- Cooperative cancellation, in-process
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;throwIfAborted&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;                              &lt;span class="c1"&gt;// explicit checkpoint&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;     &lt;span class="c1"&gt;// signal-aware&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;throwIfAborted&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;                              &lt;span class="c1"&gt;// checkpoint after I/O&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cooperative cancellation works when the body checks the signal at safe points and the I/O it makes is signal-aware. WorkIt handles the checkpoints automatically through &lt;code&gt;await&lt;/code&gt; boundaries inside &lt;code&gt;run.retry&lt;/code&gt;, &lt;code&gt;run.timeout&lt;/code&gt;, &lt;code&gt;run.race&lt;/code&gt;, and the &lt;code&gt;work()&lt;/code&gt; builder. You just have to thread &lt;code&gt;ctx.signal&lt;/code&gt; into the I/O calls.&lt;/p&gt;

&lt;p&gt;This works for 95% of code: HTTP, database, filesystem, streams, child processes, sleeps, channel sends. They all take an &lt;code&gt;AbortSignal&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It does not work for the 5% that does CPU loops, sync &lt;code&gt;crypto&lt;/code&gt;, sync &lt;code&gt;JSON.parse&lt;/code&gt; of a 200 MB string, or a fitness test in a genetic algorithm.&lt;/p&gt;

&lt;p&gt;For that 5%, you need Layer 2.&lt;/p&gt;




&lt;h2&gt;
  
  
  Layer 2 -- Hard kill at the worker boundary
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;offload&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core/worker&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transcoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;offload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./ffmpeg-transcode.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transcode&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;webm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;30s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transcoded&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;offload(...)&lt;/code&gt; returns a &lt;code&gt;TaskFn&lt;/code&gt;. Spawn it into a scope. The named export runs in a Worker thread. When the timeout fires the worker is &lt;strong&gt;terminated&lt;/strong&gt; -- not signalled, not asked nicely. The host process keeps running. The promise rejects with &lt;code&gt;TimeoutError&lt;/code&gt;. If the parent scope cancels first, the worker is terminated with a &lt;code&gt;CancellationError&lt;/code&gt; carrying the parent's reason.&lt;/p&gt;

&lt;p&gt;What &lt;code&gt;offload&lt;/code&gt; accepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local file URLs (&lt;code&gt;new URL("./mod.js", import.meta.url)&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Named export only.&lt;/li&gt;
&lt;li&gt;Structured-cloneable input: primitives, arrays, plain objects, &lt;code&gt;Map&lt;/code&gt;, &lt;code&gt;Set&lt;/code&gt;, &lt;code&gt;Date&lt;/code&gt;, &lt;code&gt;RegExp&lt;/code&gt;, &lt;code&gt;ArrayBuffer&lt;/code&gt;, &lt;code&gt;SharedArrayBuffer&lt;/code&gt;, typed array views.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What &lt;code&gt;offload&lt;/code&gt; rejects, before the worker spins up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remote and inline URL schemes (&lt;code&gt;https:&lt;/code&gt;, &lt;code&gt;data:&lt;/code&gt;, &lt;code&gt;blob:&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Path traversal segments.&lt;/li&gt;
&lt;li&gt;Functions, symbols, class instances, custom-prototype objects – including buried inside &lt;code&gt;Map&lt;/code&gt; values, &lt;code&gt;Set&lt;/code&gt; members, or cycles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The worker boundary is covered by unit tests and by &lt;a href="//../tests/evidence/security/worker-boundary.mjs"&gt;&lt;code&gt;tests/evidence/security/worker-boundary.mjs&lt;/code&gt;&lt;/a&gt;. The two interesting subtleties: &lt;code&gt;Object.create(null)&lt;/code&gt; is accepted (a null-prototype object is "plain enough"), and a class with a clean-looking shape is rejected at deep walk because the prototype check runs on the cloneable graph, not just the top level.&lt;/p&gt;

&lt;h3&gt;
  
  
  Worker offload -- the happy path
&lt;/h3&gt;

&lt;p&gt;The hard-kill is the headline, but the everyday use of &lt;code&gt;offload&lt;/code&gt; is mundane CPU work. The repo ships a sample that runs two Fibonacci computations on real worker threads through &lt;code&gt;run.pool&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// samples/worker-offload.sample.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;moduleURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./cpu-worker.sample-worker.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="nf"&gt;offload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;moduleURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fibonacci&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nf"&gt;offload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;moduleURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fibonacci&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// Asserted by the sample:&lt;/span&gt;
&lt;span class="c1"&gt;//   results.map(r =&amp;gt; r.value) === [6_765, 10_946]&lt;/span&gt;
&lt;span class="c1"&gt;//   results.every(r =&amp;gt; r.threadId &amp;gt; 0)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Different OS thread per task. Both results returned. No &lt;code&gt;try/catch&lt;/code&gt; around &lt;code&gt;Worker&lt;/code&gt;. No &lt;code&gt;parentPort&lt;/code&gt; plumbing. Just &lt;code&gt;offload(modURL, "fnName", input)&lt;/code&gt; composed through the same &lt;code&gt;run.pool&lt;/code&gt; you saw in article 02. The same primitive that terminates a CPU spinner at the worker boundary is also the one you use to take a heavy sync transform off the event loop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run sample:worker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The shield: &lt;code&gt;run.uncancellable&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Some code must run to completion even when the parent scope is being cancelled. Database commit. Stripe webhook receipt. Distributed lock release. Audit log flush.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;commit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uncancellable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;flushReceipt&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the shielded body, &lt;code&gt;ctx.signal&lt;/code&gt; is a fresh signal local to the shield -- the parent's cancel does not propagate in. The shield has its own bounded lifetime (&lt;code&gt;timeout: "2s"&lt;/code&gt;). When the shield finishes, if the parent had cancelled during the shield, the original &lt;code&gt;CancellationError&lt;/code&gt; rethrows after the body completes. &lt;strong&gt;Cancellation is delayed, not hidden.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What this is not: &lt;code&gt;run.uncancellable&lt;/code&gt; is &lt;strong&gt;cooperative&lt;/strong&gt;. It cannot stop a non-cooperative CPU loop inside the shielded body. For that, use &lt;code&gt;offload&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/08-uncancellable-shield.mjs"&gt;&lt;code&gt;08-uncancellable-shield.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; Three scenarios -- measured.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;What we measure&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A. Parent cancel mid-body&lt;/td&gt;
&lt;td&gt;Body started t=1 ms, parent cancelled at t=41 ms, body sleeping 120 ms&lt;/td&gt;
&lt;td&gt;Body completed naturally at t=136 ms (&lt;strong&gt;outlived cancel by 95 ms&lt;/strong&gt;), &lt;code&gt;bodyObservedAbort: false&lt;/code&gt;, outer settled &lt;code&gt;cancelled&lt;/code&gt; with &lt;code&gt;reason.kind === "manual"&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B. Shield timeout while body runs&lt;/td&gt;
&lt;td&gt;Shield &lt;code&gt;{ timeout: "100ms" }&lt;/code&gt;, body sleeping 2,000 ms&lt;/td&gt;
&lt;td&gt;Body &lt;strong&gt;observed abort&lt;/strong&gt; at ~100 ms, &lt;code&gt;bodyAbortReasonClass === "TimeoutError"&lt;/code&gt;, outer settled &lt;code&gt;TimeoutError&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C. Nested shields, outer scope cancels&lt;/td&gt;
&lt;td&gt;Inner sleep 80 ms, outer scope cancels at t=20 ms&lt;/td&gt;
&lt;td&gt;Inner completed at t=92 ms, outer-shield body completed at t=92 ms, outer settled &lt;code&gt;cancelled&lt;/code&gt; at t=93 ms with &lt;code&gt;reason.kind === "manual"&lt;/code&gt; -- preserved through both shields&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;A is the "delayed cancel" contract. B is "the shield is bounded by its own timeout, which the body sees as a &lt;code&gt;TimeoutError&lt;/code&gt; on its local signal". C is "nested shields don't lose the outer cancel reason."&lt;/p&gt;




&lt;h2&gt;
  
  
  Cancellation reasons are typed, not strings
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;CancelReason&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deadline&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;deadlineAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;elapsedMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;timeout&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;timeoutMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;parent_failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sibling_failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;siblingId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TaskId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;race_lost&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;winnerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TaskId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;budget&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;budgetKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;spent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scope_ended&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;manual&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every cancellation in WorkIt carries one of these. You can pivot a metric on &lt;code&gt;cancelReason.kind&lt;/code&gt;. You can route a runbook on &lt;code&gt;tag&lt;/code&gt;. You can build a "why did my agent stop" dashboard with seven buckets and an exhaustive &lt;code&gt;switch&lt;/code&gt;. TypeScript will tell you when you forgot a case.&lt;/p&gt;

&lt;p&gt;Compare:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user_clicked_stop&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                  &lt;span class="c1"&gt;// string. lossy. arbitrary.&lt;/span&gt;
&lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DOMException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AbortError&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// class with "Abort" name. that's it.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;AbortSignal.reason&lt;/code&gt; was a stringly-typed escape hatch that won. WorkIt closes it with a discriminated union and tests that every &lt;code&gt;kind&lt;/code&gt; is exercised in the suite.&lt;/p&gt;




&lt;h2&gt;
  
  
  How do other libraries handle non-cooperative work
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Cooperative cancellation&lt;/th&gt;
&lt;th&gt;Hard kill (CPU loops)&lt;/th&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WorkIt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yes signal-aware&lt;/td&gt;
&lt;td&gt;yes built-in&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;offload({ timeout })&lt;/code&gt; terminates the worker thread&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effection&lt;/td&gt;
&lt;td&gt;yes generator ops&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;bring your own worker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effect-TS&lt;/td&gt;
&lt;td&gt;yes fibers&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;bring your own worker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native &lt;code&gt;AbortController&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;the event loop is single-threaded&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you need to kill a sync CPU loop today and you're not on WorkIt, you're hand-rolling worker management – module URL validation, structured-clone classification, timeout-driven termination, parent-cancel propagation, error propagation back to the host. WorkIt's &lt;code&gt;offload&lt;/code&gt; is ~50 lines of public surface and the runtime contract is in CI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Receipts
&lt;/h2&gt;

&lt;p&gt;Two layers. Two benches. One evidence path per claim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node benchmarks/articles/07-worker-hard-kill.mjs       &lt;span class="c"&gt;# main-thread vs offload&lt;/span&gt;
node benchmarks/articles/08-uncancellable-shield.mjs   &lt;span class="c"&gt;# 3 shield contracts&lt;/span&gt;
node benchmarks/articles/run-all.mjs                   &lt;span class="c"&gt;# full article suite&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Production-side gates that back the same contracts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Claim&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Worker hard-kill on CPU spinner&lt;/td&gt;
&lt;td&gt;
&lt;a href="//../benchmarks/articles/07-worker-hard-kill.mjs"&gt;&lt;code&gt;07-worker-hard-kill.mjs&lt;/code&gt;&lt;/a&gt; runs &lt;code&gt;offload({ timeout: "200ms" })&lt;/code&gt; against the spinner module, asserts bounded rejection, and verifies the late-marker file does not exist.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Worker hard-kill on parent cancel&lt;/td&gt;
&lt;td&gt;
&lt;a href="//../tests/evidence/security/worker-boundary.mjs"&gt;&lt;code&gt;tests/evidence/security/worker-boundary.mjs&lt;/code&gt;&lt;/a&gt; verifies parent cancellation terminates worker-owned CPU work.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 concurrent offloads&lt;/td&gt;
&lt;td&gt;Worker unit coverage exercises mixed fast and spinning workers without cross-talk between results.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input validation&lt;/td&gt;
&lt;td&gt;
&lt;a href="//../tests/evidence/security/worker-boundary.mjs"&gt;&lt;code&gt;tests/evidence/security/worker-boundary.mjs&lt;/code&gt;&lt;/a&gt; verifies remote and executable worker URLs are rejected; unit coverage exercises structured-clone classification.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;run.uncancellable&lt;/code&gt; semantics&lt;/td&gt;
&lt;td&gt;
&lt;a href="//../benchmarks/articles/08-uncancellable-shield.mjs"&gt;&lt;code&gt;08-uncancellable-shield.mjs&lt;/code&gt;&lt;/a&gt; covers parent cancel during body, shield timeout, nested shields, signal isolation, and reason preservation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;CancelReason.kind&lt;/code&gt; coverage&lt;/td&gt;
&lt;td&gt;Every kind in the discriminated union has at least one tracked test that produces it.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The ergonomic version of cooperative cancellation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;             &lt;span class="c1"&gt;// signal-aware sleep&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// signal-aware fetch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ergonomic version of hard cancellation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;offload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;modUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Xs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the API. Two layers. Honest labels.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's coming
&lt;/h2&gt;

&lt;p&gt;Tomorrow: backpressure.&lt;/p&gt;

&lt;p&gt;You're consuming a billion-row source you'll never materialize. You want to read 25 from the front, run them through a 16-wide map, and have the producer pause when the consumer can't keep up. You want a transcription stream that exits cleanly when the user closes the tab. You want CSP-style channels for the part of your pipeline that's actually a pipeline.&lt;/p&gt;

&lt;p&gt;The slow-consumer memory gate runs &lt;strong&gt;a million items&lt;/strong&gt; through a paused consumer in CI and asserts the heap doesn't move. That's the next bench.&lt;/p&gt;




&lt;h2&gt;
  
  
  Source, Benchmarks, And Evidence
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/WorkRuntime/workit" rel="noopener noreferrer"&gt;https://github.com/WorkRuntime/workit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Article source: &lt;a href="https://github.com/WorkRuntime/workit/blob/main/articles/03-cancellation-and-worker-boundaries.md" rel="noopener noreferrer"&gt;https://github.com/WorkRuntime/workit/blob/main/articles/03-cancellation-and-worker-boundaries.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Reproduce: &lt;code&gt;npm run bench:articles&lt;/code&gt; and &lt;code&gt;npm run test:evidence&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Your AI Agent Failed. Why Are Its Retries, Timeouts, and Tool Calls Still Running?</title>
      <dc:creator>AdmilsonCossa</dc:creator>
      <pubDate>Thu, 14 May 2026 10:00:15 +0000</pubDate>
      <link>https://dev.to/admilsoncossa/ai-agents-do-not-fail-in-one-place-3oop</link>
      <guid>https://dev.to/admilsoncossa/ai-agents-do-not-fail-in-one-place-3oop</guid>
      <description>&lt;p&gt;&lt;strong&gt;They fail across concurrency, retries, timeouts, queues, tools, streams, and provider calls.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is why the JavaScript ecosystem has huge demand for separate async primitives:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Weekly Downloads&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p-limit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~204M&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p-map&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~53M&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p-timeout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~36M&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p-retry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~38M&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;async-retry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~24M&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p-queue&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~23M&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bottleneck&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~10M&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These libraries are good.&lt;br&gt;&lt;br&gt;
But the &lt;strong&gt;production pain&lt;/strong&gt; is deeper:&lt;/p&gt;

&lt;p&gt;You want concurrency → add &lt;code&gt;p-limit&lt;/code&gt;&lt;br&gt;&lt;br&gt;
You want retries → add &lt;code&gt;p-retry&lt;/code&gt;&lt;br&gt;&lt;br&gt;
You want timeouts → add &lt;code&gt;p-timeout&lt;/code&gt;&lt;br&gt;&lt;br&gt;
You want queues → add &lt;code&gt;p-queue&lt;/code&gt;&lt;br&gt;&lt;br&gt;
You want rate limits → add &lt;code&gt;bottleneck&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now each primitive owns a different part of the lifecycle.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;None coordinate cancellation together.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When an AI agent fails mid‑flight:&lt;br&gt;&lt;br&gt;
 Who stops the retry?&lt;br&gt;&lt;br&gt;
 Who clears the timeout?&lt;br&gt;&lt;br&gt;
 Who drains the queue?&lt;br&gt;&lt;br&gt;
 Who cleans up the tool call?&lt;br&gt;&lt;br&gt;
 Who prevents the losing provider from continuing to bill?&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;WorkIt explores a different model:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;work&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inParallel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withRetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One scope. One owner. One cancellation path. One cleanup model.&lt;/p&gt;

&lt;p&gt;Concurrency, retry, timeout – under the same ownership tree.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Read the full article:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://dev.to/admilsoncossa/concurrency-retry-and-timeout-under-one-owner-504c"&gt;Concurrency, Retry, and Timeout Under One Owner&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @workit/core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ai</category>
      <category>webdev</category>
      <category>node</category>
      <category>programming</category>
    </item>
    <item>
      <title>AI agents do not fail in one place. They fail across retries, timeouts, tools, and provider calls.</title>
      <dc:creator>AdmilsonCossa</dc:creator>
      <pubDate>Mon, 11 May 2026 14:43:53 +0000</pubDate>
      <link>https://dev.to/admilsoncossa/concurrency-retry-and-timeout-under-one-owner-504c</link>
      <guid>https://dev.to/admilsoncossa/concurrency-retry-and-timeout-under-one-owner-504c</guid>
      <description>&lt;p&gt;&lt;strong&gt;Concurrency, Retry, And Timeout Under One Owner.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Last time we showed &lt;code&gt;work(items).inParallel(8).withRetry(3).withTimeout("5s").do(fn)&lt;/code&gt; — the one-line fluent surface for processing a list. That handles the 80% case.&lt;/p&gt;

&lt;p&gt;Check &lt;a href="https://dev.to/admilsoncossa/owned-async-work-in-typescript-ogp"&gt;&lt;strong&gt;Owned Async Work in TypeScript&lt;/strong&gt; — &lt;em&gt;Promise.race does not cancel your work&lt;/em&gt;&lt;/a&gt; and &lt;a href="https://dev.to/admilsoncossa/your-ai-is-still-billing-after-the-user-closed-the-tab-4f47"&gt;&lt;strong&gt;Your AI Is Still Billing After the User Closed the Tab&lt;/strong&gt;&lt;/a&gt;  in case you missed them.&lt;/p&gt;

&lt;p&gt;This article is about the other 20%: orchestrating heterogeneous tasks that race, fall back, hedge, and retry — &lt;strong&gt;with ownership&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Open package.json in enough AI codebases and you'll see combinations like these – or completely different helpers – depending on who wrote the stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"p-limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"^5.0.0"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"p-map"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"^7.0.0"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"p-retry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"^6.2.0"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"p-timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"^6.1.2"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"p-queue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"^8.0.1"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"bottleneck"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s2"&gt;"^2.19.5"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"async-retry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"^1.3.3"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Six libraries is just one example. Some teams roll their own Promise.race loops. Others use async helpers from lodash or bluebird. The pattern is the same: scattered concurrency primitives with no shared ownership.&lt;/p&gt;

&lt;p&gt;When a sibling throws, when a timeout fires, when the user hits stop, you have to stitch together queue state, retry delay, timeout wrapper, underlying I/O, cleanup, and error shape yourself.&lt;/p&gt;

&lt;p&gt;That is the comparison in this article: not "those tools are useless", but "they are separate primitives." WorkIt's claim is ownership and composition. The runnable benches at the end of each section verify the WorkIt invariants on your machine.&lt;/p&gt;

&lt;p&gt;WorkIt has five core composables, all sharing one runtime contract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;all&lt;/span&gt;      &lt;span class="c1"&gt;// Promise.all that actually cancels losers on first failure.&lt;/span&gt;
&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;race&lt;/span&gt;     &lt;span class="c1"&gt;// Promise.race that actually cancels losers.&lt;/span&gt;
&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;      &lt;span class="c1"&gt;// Promise.any that actually cancels remaining tasks.&lt;/span&gt;
&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pool&lt;/span&gt;     &lt;span class="c1"&gt;// p-limit + p-map, but children belong to the scope.&lt;/span&gt;
&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;series&lt;/span&gt;   &lt;span class="c1"&gt;// sequential, with shared cancellation.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plus four more that compose with them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;retry&lt;/span&gt;    &lt;span class="c1"&gt;// backoff with signal-aware sleep.&lt;/span&gt;
&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timeout&lt;/span&gt;  &lt;span class="c1"&gt;// deadline that returns a TaskFn.&lt;/span&gt;
&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fallback&lt;/span&gt; &lt;span class="c1"&gt;// primary -&amp;gt; secondary, type-safe.&lt;/span&gt;
&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hedge&lt;/span&gt;    &lt;span class="c1"&gt;// bounded speculative execution for tail-latency control.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same familiar names. Different runtime contract: &lt;strong&gt;everything below the call belongs to a scope, and the scope owns the cancel.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The composition property under all nine: every WorkIt resilience helper takes a &lt;code&gt;TaskFn&amp;lt;T&amp;gt;&lt;/code&gt; and returns a &lt;code&gt;TaskFn&amp;lt;T&amp;gt;&lt;/code&gt;. That makes the algebra closed – &lt;code&gt;run.timeout(run.retry(callProvider, 3), "5s")&lt;/code&gt; is just function composition. Promise helpers usually return promises or independent wrapper functions, so crossing from timeout to retry to race means you own the glue and the signal threading.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why &lt;code&gt;run.all&lt;/code&gt; improves on Promise.all’s safety
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;fetchProfile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;planLLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;retrieveContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Promise.all&lt;/code&gt; rejects on first failure and &lt;strong&gt;leaves the other two requests running&lt;/strong&gt; unless each branch has its own cancellation wiring. Their &lt;code&gt;.then&lt;/code&gt; handlers can fire after your error handler already returned a 500, producing completion events that are no longer attached to the owning request.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;run.all&lt;/code&gt; rejects on first failure and &lt;strong&gt;cancels the other two&lt;/strong&gt;. &lt;code&gt;ctx.signal&lt;/code&gt; aborts. &lt;code&gt;defer&lt;/code&gt; cleanups run. The reason is typed: &lt;code&gt;CancelReason { kind: "sibling_failed", siblingId, error }&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can pivot a dashboard on that. You cannot pivot on &lt;code&gt;Error: AggregateError&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/01-run-all-vs-promise-all.mjs"&gt;&lt;code&gt;01-run-all-vs-promise-all.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; A succeeds at 50 ms. &lt;strong&gt;B fails at 30 ms.&lt;/strong&gt; C succeeds at 100 ms.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;th&gt;Outer rejected&lt;/th&gt;
&lt;th&gt;A still ran past reject&lt;/th&gt;
&lt;th&gt;C still ran past reject&lt;/th&gt;
&lt;th&gt;Defer ran for losers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Promise.all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;t=35 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+16 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+79 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;run.all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;t=32 ms&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0 ms&lt;/strong&gt; (cancelled at +1 ms)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0 ms&lt;/strong&gt; (cancelled at +1 ms)&lt;/td&gt;
&lt;td&gt;yes before outer reject&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;run.race&lt;/code&gt; – the race that actually races
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;winner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;race&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;callOpenAI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callAnthropic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callGemini&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Six tokens you wrote with &lt;code&gt;Promise.race&lt;/code&gt;. Different runtime contract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each body receives a &lt;code&gt;ctx.signal&lt;/code&gt; linked to the race.&lt;/li&gt;
&lt;li&gt;First settlement cancels the rest at the &lt;code&gt;AbortSignal&lt;/code&gt; boundary, &lt;strong&gt;before TCP completes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Each loser sees &lt;code&gt;CancelReason { kind: "race_lost", winnerId }&lt;/code&gt; — typed, exhaustively narrowed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;await run.race(...)&lt;/code&gt; returns only after losers have finished cleaning up.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/02-run-race-vs-promise-race.mjs"&gt;&lt;code&gt;02-run-race-vs-promise-race.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; Anthropic at 10 ms, OpenAI at 50 ms, Gemini at 80 ms.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;th&gt;Winner at&lt;/th&gt;
&lt;th&gt;OpenAI loser still ran&lt;/th&gt;
&lt;th&gt;Gemini loser still ran&lt;/th&gt;
&lt;th&gt;Loser reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Promise.race&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;t=14 ms&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;+47 ms&lt;/strong&gt; (61 ms total)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;+77 ms&lt;/strong&gt; (91 ms total)&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;run.race&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;t=17 ms&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0 ms&lt;/strong&gt; (cancelled at t=16 ms)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0 ms&lt;/strong&gt; (cancelled at t=16 ms)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;race_lost&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;That loser runtime x N parallel agents x P requests per second is the line on your invoice that nobody wrote.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;run.any&lt;/code&gt; – first success, rest cancelled
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cheapest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;callExpensive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callCheap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callCheaper&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Promise.any&lt;/code&gt; resolves with the first &lt;strong&gt;success&lt;/strong&gt; and ignores the rest. The slower siblings keep running. The faster failing ones got logged and forgotten. &lt;code&gt;run.any&lt;/code&gt; does the same – except the slower siblings actually stop.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/03-run-any-vs-promise-any.mjs"&gt;&lt;code&gt;03-run-any-vs-promise-any.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; A fails at 30 ms. B succeeds at 50 ms. C succeeds at 100 ms.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;th&gt;Resolved at&lt;/th&gt;
&lt;th&gt;C kept running&lt;/th&gt;
&lt;th&gt;Defer ran for C&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Promise.any&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;t=61 ms&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;+47 ms&lt;/strong&gt; (108 ms total)&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;run.any&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;t=65 ms&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;0 ms&lt;/strong&gt; (cancelled at t=65 ms)&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;run.pool&lt;/code&gt; – bounded concurrency that cancels
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;uploadOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;p-limit(8)&lt;/code&gt; is a semaphore. That's useful, and current versions can clear pending queue items when you ask them to. What it is not is a structured scope: it does not automatically turn a sibling failure into in-flight cancellation, typed cancel reasons, cleanup, and a partial-result contract.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;run.pool(8, tasks)&lt;/code&gt; is a semaphore + a scope. Default policy is &lt;code&gt;Promise.all&lt;/code&gt;-style fail-fast: first throw cancels queued and in-flight. Results are positionally indexed regardless of completion order. Switch policy with one line and the &lt;strong&gt;return type changes&lt;/strong&gt; so you can't ignore failures:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;work&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;inParallel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;onError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;collect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uploadOne&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;collect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rejected&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;logFailure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;WorkOutput&amp;lt;R&amp;gt;&lt;/code&gt; is a discriminated union – &lt;code&gt;mode: "fail" | "continue" | "collect"&lt;/code&gt;. Change &lt;code&gt;.onError("continue")&lt;/code&gt; and the return type forces you to handle &lt;code&gt;errors[]&lt;/code&gt;. The compiler is your audit log.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/04-pool-vs-semaphore.mjs"&gt;&lt;code&gt;04-pool-vs-semaphore.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; 10 items, concurrency 4. Item 3 throws at 20 ms; the rest take 100 ms each.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;th&gt;Outer rejected&lt;/th&gt;
&lt;th&gt;Started&lt;/th&gt;
&lt;th&gt;Fulfilled AFTER rejection&lt;/th&gt;
&lt;th&gt;Cancelled&lt;/th&gt;
&lt;th&gt;Never started&lt;/th&gt;
&lt;th&gt;Longest post-rejection run&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;local &lt;code&gt;pLimitLike(4)&lt;/code&gt; semaphore baseline&lt;/td&gt;
&lt;td&gt;t=31 ms&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+295 ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;run.pool(4, ...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;t=33 ms&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0 ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;295 ms of post-rejection work, multiplied across a fleet, becomes avoidable runtime and provider cost.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;run.retry&lt;/code&gt; – composable, cancel-aware backoff
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;callWithRetry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;times&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;backoff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;exponential&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;initialDelay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;200ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxDelay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;jitter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;retryIf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;isTransient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;callWithRetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three things WorkIt makes part of the retry contract:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stop retrying on scope cancellation.&lt;/strong&gt; When the parent scope cancels mid-attempt, &lt;code&gt;run.retry&lt;/code&gt; does not enqueue another attempt. The task settles as &lt;code&gt;cancelled&lt;/code&gt;, not &lt;code&gt;failed&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate input at the boundary.&lt;/strong&gt; &lt;code&gt;run.retry({ times: 1e9 })&lt;/code&gt; would create an unbounded retry policy. &lt;code&gt;run.retry&lt;/code&gt; rejects it: &lt;code&gt;RangeError: retry attempts must be an integer between 1 and 1000&lt;/code&gt;. Bound is &lt;code&gt;MAX_RETRY_ATTEMPTS&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sleep with the scope signal.&lt;/strong&gt; Backoff sleep is interruptible – abort the signal, the sleep rejects, the loop exits. The benchmark below compares against a signal-unaware retry loop; current retry libraries may expose their own abort hooks, but they still do not own WorkIt's scope tree, cleanup, and cancel-reason contract.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/05-retry-on-cancel.mjs"&gt;&lt;code&gt;05-retry-on-cancel.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; Body throws on every attempt. External cancel fires around t=50 ms. Up to 8 retries with 50 ms backoff.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;th&gt;Cancel observed&lt;/th&gt;
&lt;th&gt;Outer settled&lt;/th&gt;
&lt;th&gt;Cancel latency&lt;/th&gt;
&lt;th&gt;Extra attempts after cancel&lt;/th&gt;
&lt;th&gt;Settled as&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;signal-unaware retry loop&lt;/td&gt;
&lt;td&gt;t=63 ms&lt;/td&gt;
&lt;td&gt;t=701 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;638 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rejected&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;run.retry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;t=61 ms&lt;/td&gt;
&lt;td&gt;t=61 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cancelled&lt;/code&gt; (kind: &lt;code&gt;manual&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;638 ms of wasted retry work after the user already cancelled. Per request. Multiply by the agent fan-out.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;run.timeout&lt;/code&gt;– composes with retry, race, and pool
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fastest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;race&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callPrimary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;800ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callSecondary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;800ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;run.timeout(task, "800ms")&lt;/code&gt; returns a &lt;code&gt;TaskFn&lt;/code&gt;. It composes. You can wrap it in &lt;code&gt;run.retry&lt;/code&gt;. You can put it inside &lt;code&gt;run.race&lt;/code&gt;. You can hand it to &lt;code&gt;run.pool&lt;/code&gt;. The signature is closed under composition.&lt;/p&gt;

&lt;p&gt;Promise timeout helpers return promises or decorated promises. Some expose &lt;code&gt;AbortSignal&lt;/code&gt; support. They still do not return a WorkIt &lt;code&gt;TaskFn&lt;/code&gt;, so crossing timeout, retry, race, pool, and cleanup means you own the composition boundary.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;run.fallback&lt;/code&gt; – primary, secondary, type-safe
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;callWithFallback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;callBackupProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Primary fails (after retries) -&amp;gt; secondary runs. Same &lt;code&gt;ctx.signal&lt;/code&gt;. Same scope. Same cancel reason if the parent stops. No nested &lt;code&gt;try/catch&lt;/code&gt;. No "did I forget to await the fallback" Slack message at 2 a.m.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;run.supervise&lt;/code&gt; – restart policy for long-lived work
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;run.retry&lt;/code&gt; is for one operation that may fail transiently and then succeed. &lt;code&gt;run.supervise&lt;/code&gt; is for a &lt;strong&gt;long-lived task&lt;/strong&gt; – a heartbeat, a queue consumer, a connection watcher, an agent keep-alive – that may need restart semantics with bounded backoff.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@workit/core&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;supervise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;attempts&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;attempts&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transient worker failure&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;stable&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;restartOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxRestarts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;backoff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// samples/supervision.sample.js – asserted in CI:&lt;/span&gt;
&lt;span class="c1"&gt;//   result === "stable"&lt;/span&gt;
&lt;span class="c1"&gt;//   attempts === 3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The supervised body fails twice, restarts each time under the policy, and stabilises on the third attempt. The parent scope can still cancel everything at once, and the cancel reason carries down through the supervision wrapper. Restart policies cap at &lt;code&gt;maxRestarts&lt;/code&gt; per &lt;code&gt;resetWindow&lt;/code&gt; so a permanently broken body doesn't infinite-loop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run sample:supervise
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The decision rule: use &lt;code&gt;run.retry&lt;/code&gt; for a single call that can hiccup; use &lt;code&gt;run.supervise&lt;/code&gt; for a process that should keep running.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;run.hedge&lt;/code&gt; – bounded speculative requests
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ranked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hedge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;reranker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;after&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the first call hasn't returned in 2 seconds, fire a second one. First success wins; the rest cancel. Bounded by &lt;code&gt;max&lt;/code&gt;, this is a measured way to reduce tail latency without paying for every speculative fan-out.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bench &lt;a href="//../benchmarks/articles/06-hedge-tied-requests.mjs"&gt;&lt;code&gt;06-hedge-tied-requests.mjs&lt;/code&gt;&lt;/a&gt;.&lt;/strong&gt; Two scenarios, opts &lt;code&gt;{ after: "50ms", max: 3 }&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Body latency&lt;/th&gt;
&lt;th&gt;Attempts fired (timestamps)&lt;/th&gt;
&lt;th&gt;Winner&lt;/th&gt;
&lt;th&gt;Losers cancelled&lt;/th&gt;
&lt;th&gt;Cancel reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;slow&lt;/td&gt;
&lt;td&gt;200 ms&lt;/td&gt;
&lt;td&gt;3 (t=2 ms, 62 ms, 107 ms)&lt;/td&gt;
&lt;td&gt;id=1 at 217 ms&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;race_lost&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fast&lt;/td&gt;
&lt;td&gt;30 ms&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;1&lt;/strong&gt; (no hedge fired)&lt;/td&gt;
&lt;td&gt;id=1 at 31 ms&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;The fast path doesn't pay for hedging at all. The slow path bounded by &lt;code&gt;max&lt;/code&gt;. Every loser tagged with &lt;code&gt;race_lost&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Side-by-side – who actually cancels
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 3 tasks. B fails at 30 ms. A succeeds at 50 ms. C succeeds at 100 ms.&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;     &lt;span class="c1"&gt;// rejects at 30 ms. A and C keep running for ~16/63 ms.&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;race&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;    &lt;span class="c1"&gt;// rejects at 30 ms. A and C keep running.&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;     &lt;span class="c1"&gt;// resolves at 50 ms. C keeps running for ~44 ms.&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;         &lt;span class="c1"&gt;// rejects at 30 ms. A and C cancelled in 1 ms, defer ran.&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;race&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;        &lt;span class="c1"&gt;// rejects at 30 ms. A and C cancelled in 0-1 ms.&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;         &lt;span class="c1"&gt;// resolves at 50 ms. C cancelled in 0 ms, defer ran.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same shape. Different contract. Native primitives return a value. WorkIt primitives own the tree underneath the value.&lt;/p&gt;




&lt;h2&gt;
  
  
  How do other libraries compare
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Cancels on sibling failure&lt;/th&gt;
&lt;th&gt;Signal-aware retry&lt;/th&gt;
&lt;th&gt;Composable timeout (returns &lt;code&gt;TaskFn&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Hedged requests&lt;/th&gt;
&lt;th&gt;Bundle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WorkIt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes built-in&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;14,175 B / 4,835 B gz&lt;/strong&gt; for all nine composables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Promise.all&lt;/code&gt; / &lt;code&gt;race&lt;/code&gt; / &lt;code&gt;any&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;p-limit&lt;/code&gt; + &lt;code&gt;p-retry&lt;/code&gt; + &lt;code&gt;p-timeout&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;partial/manual wiring&lt;/td&gt;
&lt;td&gt;partial/manual wiring&lt;/td&gt;
&lt;td&gt;separate abstractions&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;three deps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RxJS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes on &lt;code&gt;unsubscribe&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;partial via operators&lt;/td&gt;
&lt;td&gt;yes via operators&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;large&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effection&lt;/td&gt;
&lt;td&gt;yes structured (generator ops)&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effect-TS&lt;/td&gt;
&lt;td&gt;yes structured (fibers + typed &lt;code&gt;Cause&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;large&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For simple array processing where nothing else can fail, &lt;code&gt;p-limit&lt;/code&gt; is fine. For full-stack apps where you want a broader effect or operation model, Effection and Effect-TS are solid. WorkIt's distinction is narrower: structured-concurrency composition without leaving &lt;code&gt;async&lt;/code&gt;/&lt;code&gt;await&lt;/code&gt;, with nine composables in one ownership tree and the bundle size shown above.&lt;/p&gt;




&lt;h2&gt;
  
  
  Receipts
&lt;/h2&gt;

&lt;p&gt;The WorkIt runtime claims above are verified by either &lt;code&gt;npm run verify&lt;/code&gt; (the production gate) or &lt;code&gt;npm run bench:articles&lt;/code&gt; (the side-by-side suite that produced the representative timing tables in this article).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run bench:articles
&lt;span class="c"&gt;# full article suite: 19 passed, 0 failed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This article cites benches 01-06 from the full suite. Each bench script is &lt;strong&gt;~100 lines, zero external dependencies&lt;/strong&gt;, and asserts the WorkIt invariant in-line. Timings are representative captured runs; the assertions guard semantic invariants, not exact milliseconds. The folder has its own &lt;code&gt;package.json&lt;/code&gt; so the published package's dependency graph stays empty. Read the README at &lt;a href="//../benchmarks/articles/README.md"&gt;&lt;code&gt;benchmarks/articles/&lt;/code&gt;&lt;/a&gt; for how the promise-helper baselines stay honest.&lt;/p&gt;

&lt;p&gt;Production-side gates that back the same composables:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Claim&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cancellation safety, all composables&lt;/td&gt;
&lt;td&gt;Benches 01-06 plus &lt;a href="//../tests/evidence/lifecycle/owned-work.mjs"&gt;&lt;code&gt;tests/evidence/lifecycle/owned-work.mjs&lt;/code&gt;&lt;/a&gt; verify parent cancellation, sibling failure, retry cancellation, race loser cleanup, and owned background work.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;run.retry&lt;/code&gt; validation&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;RangeError&lt;/code&gt; for &lt;code&gt;times&lt;/code&gt; &amp;lt;= 0, &amp;gt; 1000, NaN, Infinity, fractional. Identical rejection on numeric and object form.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;run.race&lt;/code&gt; / &lt;code&gt;run.any&lt;/code&gt; loser cleanup&lt;/td&gt;
&lt;td&gt;LIFO &lt;code&gt;defer&lt;/code&gt; blocks observed in test for every loser; outer promise does not resolve until cleanup completes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bundle of all nine composables&lt;/td&gt;
&lt;td&gt;Included in 14,175 B min / 4,835 B gzip core-group-import. Tree-shaken if unused.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Nine composables share one engine. Tomorrow we open the engine.&lt;/p&gt;

&lt;p&gt;We'll look at what cooperative cancellation can do, what it cannot do, and where the hard boundary starts. Then we put a CPU spin loop that ignores every signal in front of &lt;code&gt;offload({ timeout: "200ms" })&lt;/code&gt; and verify that worker termination prevents a late marker file from appearing. The CI gate runs &lt;code&gt;stat()&lt;/code&gt; on it.&lt;/p&gt;

&lt;p&gt;AbortController cannot preempt a CPU loop. WorkIt cannot change that language boundary, but a worker thread can be terminated by its host.&lt;/p&gt;




&lt;h2&gt;
  
  
  Source, Benchmarks, And Evidence
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/WorkRuntime/workit" rel="noopener noreferrer"&gt;https://github.com/WorkRuntime/workit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Article source: &lt;a href="https://github.com/WorkRuntime/workit/blob/main/articles/02-concurrency-retry-timeout.md" rel="noopener noreferrer"&gt;https://github.com/WorkRuntime/workit/blob/main/articles/02-concurrency-retry-timeout.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Reproduce: &lt;code&gt;npm run bench:articles&lt;/code&gt; and &lt;code&gt;npm run test:evidence&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>node</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
