<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Freedium</title>
	<atom:link href="https://freedium.net/feed/" rel="self" type="application/rss+xml" />
	<link>https://freedium.net</link>
	<description></description>
	<lastBuildDate>Wed, 28 Oct 2026 07:44:37 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
<site xmlns="com-wordpress:feed-additions:1">257772020</site>	<item>
		<title>Building Dynamic Workflows: A New Agentic System</title>
		<link>https://freedium.net/building-dynamic-workflows-a-new-agentic-system/</link>
					<comments>https://freedium.net/building-dynamic-workflows-a-new-agentic-system/#respond</comments>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 28 Oct 2026 07:44:37 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://freedium.net/building-dynamic-workflows-a-new-agentic-system/</guid>

					<description><![CDATA[Read this story for free: link Most multi-agent systems work in one of two ways. A lead agent calls helpers one at a time and waits on every report, or an engineer hard-codes a pipeline&#8230;]]></description>
										<content:encoded><![CDATA[<p>Read this story for free: <a href="https://medium.com/@fareedkhandev/d304abd20dd0?source=friends_link&amp;sk=838a695e36e1db3bdff9ec91627c015c" rel="nofollow noopener noreferrer" target="_blank">link<span></span></a></p>
<p>Most multi-agent systems work in one of two ways. A lead agent calls helpers one at a time and waits on every report, or an engineer hard-codes a pipeline that runs the same steps for every job. A newer approach, <a href="https://x.com/ClaudeDevs/status/2108591328732856655" rel="nofollow noopener noreferrer" target="_blank">dynamic workflow introduced by Anthropic<span></span></a>, lets the lead write the whole plan once as a short program, and plain code runs it with many workers in parallel.</p>
<p>Here is the architecture we are going to build, one component at a time:</p>
<ul>
<li><strong>A benchmark</strong>: 72 planted bugs and a scorer that checks findings against a hidden key.</li>
<li><strong>An answer ledger</strong>: caching, replay and crash recovery.</li>
<li><strong>A runtime</strong>: workers that run in parallel phases under one budget.</li>
<li><strong>An audit kit</strong>: scan workers, and skeptics that vote on what they find.</li>
<li><strong>A plan language</strong>: restricted Python, checked before it can spend.</li>
<li><strong>The lead</strong>: it reads a 500-token fact sheet instead of the code.</li>
<li><strong>An evaluation</strong>: five designs and an ablation.</li>
</ul>
<p>By the end, a lead that reads only that sheet finds 0.45 of the planted bugs on average, against 0.30 for a hand-written plan and 0.02 for one agent alone. The full code is in my GitHub repository, dynamic-workflow-agents.</p>
<p>These are the files we are going to write:</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>dynamic-workflows/</span></span>
<span class="line"><span>├──</span><span> build/</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> config.py</span><span>     # model roles, prices, paths</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> bench.py</span><span>      # the hidden key and the scorer</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> shards.py</span><span>     # code packed into shards</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> llm.py</span><span>        # replies, ledger, front door, budget</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> runtime.py</span><span>    # threads, parallel, background runs</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> kit.py</span><span>        # scan, check, vote and report</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> plans.py</span><span>      # whitelist, dry run, approval gate</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> lead.py</span><span>       # fact sheet in, program out</span></span>
<span class="line"><span>│</span><span>   └──</span><span> prompts.json</span><span>  # the instructions each role reads</span></span>
<span class="line"><span>└──</span><span> data/algorithms/</span><span>  # the library, the bugs and the key</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>dynamic-workflows/</span></span>
<span class="line"><span>├──</span><span> build/</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> config.py</span><span>     # model roles, prices, paths</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> bench.py</span><span>      # the hidden key and the scorer</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> shards.py</span><span>     # code packed into shards</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> llm.py</span><span>        # replies, ledger, front door, budget</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> runtime.py</span><span>    # threads, parallel, background runs</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> kit.py</span><span>        # scan, check, vote and report</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> plans.py</span><span>      # whitelist, dry run, approval gate</span></span>
<span class="line"><span>│</span><span>   ├──</span><span> lead.py</span><span>       # fact sheet in, program out</span></span>
<span class="line"><span>│</span><span>   └──</span><span> prompts.json</span><span>  # the instructions each role reads</span></span>
<span class="line"><span>└──</span><span> data/algorithms/</span><span>  # the library, the bugs and the key</span></span></code></pre>
<h3>Why Multi-Agent Systems Often Fail</h3>
<p>Most failures come from two limits. One agent can hold only so much text, and on a large job it forgets what it read or stops early. A lead that hands out tasks one by one becomes the bottleneck, and its context grows with every report.</p>
<p>Our audit shows both: 849 Python files, about 1.35 million tokens, with 72 bugs I planted myself. One agent alone found 0, 1 and 4 of them in three runs and stopped on its own each time. A lead with helpers covered all 14 shards but found only 12 bugs.</p>
<h3>Designing Dynamic Workflows</h3>
<p>Every job goes through six steps:</p>
<ul>
<li>Scout: plain code reads the job and writes a one-page fact sheet.</li>
<li><strong>Plan</strong>: the lead writes a short Python program from that sheet.</li>
<li><strong>Check</strong>: a whitelist refuses whatever a plan may not do.</li>
<li><strong>Rehearse</strong>: a free stand-in model runs the plan once to price it.</li>
<li><strong>Approve</strong>: a gate lets the plan go or holds it for a person.</li>
<li><strong>Run</strong>: the runtime executes the plan in the background under one budget.</li>
</ul>
<p>Before the comparison runs I wrote down eleven predictions. The evaluation checks five of them:</p>
<ul>
<li><strong>H1</strong>: the workflow beats one agent alone.</li>
<li><strong>H1b</strong>: it also beats one agent given the same money.</li>
<li><strong>H5</strong>: a second round of scanning adds bugs.</li>
<li><strong>H4</strong>: skeptics raise precision by at least 0.15 and cost at most 0.05 recall.</li>
<li><strong>H6</strong>: running a finding&#8217;s failing call makes the skeptic more accurate.</li>
</ul>
<h3>Environment Setup</h3>
<p>We start from an empty project with one package, <code>jsonschema</code>, and any OpenAI-compatible endpoint.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>uv</span><span> init</span><span> dynamic-workflows</span><span> --python</span><span> 3.12</span><span> &#x26;&#x26; </span><span>cd</span><span> dynamic-workflows</span></span>
<span class="line"><span>uv</span><span> add</span><span> jsonschema</span></span>
<span class="line"><span>export</span><span> LLM_BASE_URL</span><span>=</span><span>"https://your-endpoint/v1"</span><span>   # any OpenAI-compatible server</span></span>
<span class="line"><span>export</span><span> LLM_API_KEY</span><span>=</span><span>"your key"</span><span>                    # read once, never printed</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>uv</span><span> init</span><span> dynamic-workflows</span><span> --python</span><span> 3.12</span><span> &#x26;&#x26; </span><span>cd</span><span> dynamic-workflows</span></span>
<span class="line"><span>uv</span><span> add</span><span> jsonschema</span></span>
<span class="line"><span>export</span><span> LLM_BASE_URL</span><span>=</span><span>"https://your-endpoint/v1"</span><span>   # any OpenAI-compatible server</span></span>
<span class="line"><span>export</span><span> LLM_API_KEY</span><span>=</span><span>"your key"</span><span>                    # read once, never printed</span></span></code></pre>
<p><code>MODELS gives each role its model, and</code> PRICE` is the cost of one call in <strong>credits</strong>.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>"""config.py: the settings every other file reads."""</span></span>
<span class="line"><span>import</span><span> json, os</span></span>
<span class="line"><span>from</span><span> pathlib </span><span>import</span><span> Path</span></span>
<span class="line"></span>
<span class="line"><span>CAP_CREDITS</span><span> =</span><span> 1500.0</span><span>                                     # the cap of a front door given no budget of its own</span></span>
<span class="line"><span>BASE_URL</span><span> =</span><span> os.environ.get(</span><span>"LLM_BASE_URL"</span><span>, </span><span>"http://127.0.0.1:8000/v1"</span><span>)      </span><span># any OpenAI-compatible endpoint</span></span>
<span class="line"><span>API_KEY</span><span> =</span><span> os.environ.get(</span><span>"LLM_API_KEY"</span><span>, </span><span>""</span><span>)              </span><span># read once from the environment, never printed</span></span>
<span class="line"><span>MODELS</span><span> =</span><span> {</span><span>"lead"</span><span>: </span><span>"Qwen/Qwen3.8-Max"</span><span>, </span><span>"worker"</span><span>: </span><span>"Qwen/Qwen3.8-27B"</span><span>,        </span><span># the code asks for a role, not a model</span></span>
<span class="line"><span>          "judge"</span><span>: </span><span>"Qwen/Qwen3.7-Plus"</span><span>, </span><span>"fast"</span><span>: </span><span>"Qwen/Qwen3.8-Flash-Next"</span><span>}</span></span>
<span class="line"><span>PRICE</span><span> =</span><span> {</span><span>"Qwen/Qwen3.8-Max"</span><span>: </span><span>0.5</span><span>, </span><span>"Qwen/Qwen3.8-27B"</span><span>: </span><span>0.2</span><span>, </span><span>"Qwen/Qwen3.7-Plus"</span><span>: </span><span>0.2</span><span>, </span><span>"Qwen/Qwen3.8-Flash-Next"</span><span>: </span><span>0.2</span><span>}   </span><span># credits per call, whatever its length</span></span>
<span class="line"><span>TEMPERATURE</span><span>, </span><span>TOP_P</span><span> =</span><span> 0.6</span><span>, </span><span>0.95</span><span>                           # reasoning models loop under greedy decoding, so we sample</span></span>
<span class="line"><span>SHARD_TOKENS</span><span>, </span><span>CHARS_PER_TOKEN</span><span> =</span><span> 100_000</span><span>, </span><span>2.54542</span><span>         # code per worker call, and characters per token (both measured later)</span></span>
<span class="line"><span>MAX_AGENTS_PER_RUN</span><span> =</span><span> 1000</span><span>                                # a backstop against a plan that loops forever</span></span>
<span class="line"><span>DATA</span><span> =</span><span> Path(</span><span>"data/algorithms"</span><span>)                           </span><span># the library, its planted bugs and the answer key</span></span>
<span class="line"><span>PROMPTS</span><span> =</span><span> json.loads((Path(</span><span>__file__</span><span>).parent </span><span>/</span><span> "prompts.json"</span><span>).read_text(</span><span>encoding</span><span>=</span><span>"utf-8"</span><span>))      </span><span># the instructions, one text per role</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>"""config.py: the settings every other file reads."""</span></span>
<span class="line"><span>import</span><span> json, os</span></span>
<span class="line"><span>from</span><span> pathlib </span><span>import</span><span> Path</span></span>
<span class="line"></span>
<span class="line"><span>CAP_CREDITS</span><span> =</span><span> 1500.0</span><span>                                     # the cap of a front door given no budget of its own</span></span>
<span class="line"><span>BASE_URL</span><span> =</span><span> os.environ.get(</span><span>"LLM_BASE_URL"</span><span>, </span><span>"http://127.0.0.1:8000/v1"</span><span>)      </span><span># any OpenAI-compatible endpoint</span></span>
<span class="line"><span>API_KEY</span><span> =</span><span> os.environ.get(</span><span>"LLM_API_KEY"</span><span>, </span><span>""</span><span>)              </span><span># read once from the environment, never printed</span></span>
<span class="line"><span>MODELS</span><span> =</span><span> {</span><span>"lead"</span><span>: </span><span>"Qwen/Qwen3.8-Max"</span><span>, </span><span>"worker"</span><span>: </span><span>"Qwen/Qwen3.8-27B"</span><span>,        </span><span># the code asks for a role, not a model</span></span>
<span class="line"><span>          "judge"</span><span>: </span><span>"Qwen/Qwen3.7-Plus"</span><span>, </span><span>"fast"</span><span>: </span><span>"Qwen/Qwen3.8-Flash-Next"</span><span>}</span></span>
<span class="line"><span>PRICE</span><span> =</span><span> {</span><span>"Qwen/Qwen3.8-Max"</span><span>: </span><span>0.5</span><span>, </span><span>"Qwen/Qwen3.8-27B"</span><span>: </span><span>0.2</span><span>, </span><span>"Qwen/Qwen3.7-Plus"</span><span>: </span><span>0.2</span><span>, </span><span>"Qwen/Qwen3.8-Flash-Next"</span><span>: </span><span>0.2</span><span>}   </span><span># credits per call, whatever its length</span></span>
<span class="line"><span>TEMPERATURE</span><span>, </span><span>TOP_P</span><span> =</span><span> 0.6</span><span>, </span><span>0.95</span><span>                           # reasoning models loop under greedy decoding, so we sample</span></span>
<span class="line"><span>SHARD_TOKENS</span><span>, </span><span>CHARS_PER_TOKEN</span><span> =</span><span> 100_000</span><span>, </span><span>2.54542</span><span>         # code per worker call, and characters per token (both measured later)</span></span>
<span class="line"><span>MAX_AGENTS_PER_RUN</span><span> =</span><span> 1000</span><span>                                # a backstop against a plan that loops forever</span></span>
<span class="line"><span>DATA</span><span> =</span><span> Path(</span><span>"data/algorithms"</span><span>)                           </span><span># the library, its planted bugs and the answer key</span></span>
<span class="line"><span>PROMPTS</span><span> =</span><span> json.loads((Path(</span><span>__file__</span><span>).parent </span><span>/</span><span> "prompts.json"</span><span>).read_text(</span><span>encoding</span><span>=</span><span>"utf-8"</span><span>))      </span><span># the instructions, one text per role</span></span></code></pre>
<h3>Planted-Bug Benchmark</h3>
<p>I took a public library of 849 Python files and planted one bug in each of 72 files. Each bug makes at least one of the file&#8217;s doctest examples fail, and never more than 40% of them. The copy that agents read has those examples removed.</p>
<ul>
<li><code>left out:</code> the twelve kinds of one-line edit, the doctest proof and the leak test (the repository&#8217;s notebook has them)</li>
</ul>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>"""bench.py: the files, the hidden key and the scorer."""</span></span>
<span class="line"><span>import</span><span> ast, functools, json, re</span></span>
<span class="line"></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> DATA</span></span>
<span class="line"></span>
<span class="line"><span>AUDITED</span><span> =</span><span> DATA</span><span> /</span><span> "audited"</span><span>                                    # the copy of the library that agents read</span></span>
<span class="line"><span>WORK</span><span> =</span><span> sorted</span><span>(p.relative_to(</span><span>AUDITED</span><span>).as_posix() </span><span>for</span><span> p </span><span>in</span><span> AUDITED</span><span>.rglob(</span><span>"*.py"</span><span>))     </span><span># every file an audit must read</span></span>
<span class="line"><span>KEY</span><span> =</span><span> json.loads((</span><span>DATA</span><span> /</span><span> "hidden"</span><span> /</span><span> "answer_key.json"</span><span>).read_text(</span><span>encoding</span><span>=</span><span>"utf-8"</span><span>))   </span><span># the 72 planted bugs, in a folder no agent tool opens</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>"""bench.py: the files, the hidden key and the scorer."""</span></span>
<span class="line"><span>import</span><span> ast, functools, json, re</span></span>
<span class="line"></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> DATA</span></span>
<span class="line"></span>
<span class="line"><span>AUDITED</span><span> =</span><span> DATA</span><span> /</span><span> "audited"</span><span>                                    # the copy of the library that agents read</span></span>
<span class="line"><span>WORK</span><span> =</span><span> sorted</span><span>(p.relative_to(</span><span>AUDITED</span><span>).as_posix() </span><span>for</span><span> p </span><span>in</span><span> AUDITED</span><span>.rglob(</span><span>"*.py"</span><span>))     </span><span># every file an audit must read</span></span>
<span class="line"><span>KEY</span><span> =</span><span> json.loads((</span><span>DATA</span><span> /</span><span> "hidden"</span><span> /</span><span> "answer_key.json"</span><span>).read_text(</span><span>encoding</span><span>=</span><span>"utf-8"</span><span>))   </span><span># the 72 planted bugs, in a folder no agent tool opens</span></span></code></pre>
<p>The scorer must know which function a line belongs to.</p>
<p>							&lt;button data-code=&quot;# bench.py<br />
@functools.lru_cache(maxsize=None)<br />
def audited_tree(path):<br />
    # parsed once, then reused<br />
    return ast.parse((AUDITED / path).read_text(encoding=&#x22;utf-8&#x22;))</p>
<p>def function_at(path, line):<br />
    &#x22;&#x22;&#x22;(name, first line, last line) of the innermost function around a line, or None.&#x22;&#x22;&#x22;<br />
    best = None</p>
<p>    def walk(node, prefix):<br />
        nonlocal best<br />
        for child in ast.iter_child_nodes(node):<br />
            if isinstance(child, (ast.FunctionDef, ast.AsyncFunctionDef)):<br />
                # the innermost function holding the line wins<br />
                if child.lineno &lt;= line = best[1]):<br />
                    best = (prefix + child.name, child.lineno, child.end_lineno)<br />
                walk(child, prefix + child.name + &#x22;.&#x22;)<br />
            else:                                             # methods get their class name<br />
                walk(child, prefix + child.name + &#x22;.&#x22; if isinstance(child, ast.ClassDef) else prefix)<br />
    if path in WORK:                                          # a path a model made up is never opened<br />
        walk(audited_tree(path), &#x22;&#x22;)<br />
    return best&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-3 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># bench.py</span></span>
<span class="line"><span>@functools.lru_cache</span><span>(</span><span>maxsize</span><span>=</span><span>None</span><span>)</span></span>
<span class="line"><span>def</span><span> audited_tree</span><span>(path):</span></span>
<span class="line"><span>    # parsed once, then reused</span></span>
<span class="line"><span>    return</span><span> ast.parse((</span><span>AUDITED</span><span> /</span><span> path).read_text(</span><span>encoding</span><span>=</span><span>"utf-8"</span><span>))</span></span>
<span class="line"></span>
<span class="line"><span>def</span><span> function_at</span><span>(path, line):</span></span>
<span class="line"><span>    """(name, first line, last line) of the innermost function around a line, or None."""</span></span>
<span class="line"><span>    best </span><span>=</span><span> None</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> walk</span><span>(node, prefix):</span></span>
<span class="line"><span>        nonlocal</span><span> best</span></span>
<span class="line"><span>        for</span><span> child </span><span>in</span><span> ast.iter_child_nodes(node):</span></span>
<span class="line"><span>            if</span><span> isinstance</span><span>(child, (ast.FunctionDef, ast.AsyncFunctionDef)):</span></span>
<span class="line"><span>                # the innermost function holding the line wins</span></span>
<span class="line"><span>                if</span><span> child.lineno </span><span>&#x3C;=</span><span> line </span><span>&#x3C;=</span><span> child.end_lineno </span><span>and</span><span> (best </span><span>is</span><span> None</span><span> or</span><span> child.lineno </span><span>&gt;=</span><span> best[</span><span>1</span><span>]):</span></span>
<span class="line"><span>                    best </span><span>=</span><span> (prefix </span><span>+</span><span> child.name, child.lineno, child.end_lineno)</span></span>
<span class="line"><span>                walk(child, prefix </span><span>+</span><span> child.name </span><span>+</span><span> "."</span><span>)</span></span>
<span class="line"><span>            else</span><span>:                                             </span><span># methods get their class name</span></span>
<span class="line"><span>                walk(child, prefix </span><span>+</span><span> child.name </span><span>+</span><span> "."</span><span> if</span><span> isinstance</span><span>(child, ast.ClassDef) </span><span>else</span><span> prefix)</span></span>
<span class="line"><span>    if</span><span> path </span><span>in</span><span> WORK</span><span>:                                          </span><span># a path a model made up is never opened</span></span>
<span class="line"><span>        walk(audited_tree(path), </span><span>""</span><span>)</span></span>
<span class="line"><span>    return</span><span> best</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># bench.py</span></span>
<span class="line"><span>@functools.lru_cache</span><span>(</span><span>maxsize</span><span>=</span><span>None</span><span>)</span></span>
<span class="line"><span>def</span><span> audited_tree</span><span>(path):</span></span>
<span class="line"><span>    # parsed once, then reused</span></span>
<span class="line"><span>    return</span><span> ast.parse((</span><span>AUDITED</span><span> /</span><span> path).read_text(</span><span>encoding</span><span>=</span><span>"utf-8"</span><span>))</span></span>
<span class="line"></span>
<span class="line"><span>def</span><span> function_at</span><span>(path, line):</span></span>
<span class="line"><span>    """(name, first line, last line) of the innermost function around a line, or None."""</span></span>
<span class="line"><span>    best </span><span>=</span><span> None</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> walk</span><span>(node, prefix):</span></span>
<span class="line"><span>        nonlocal</span><span> best</span></span>
<span class="line"><span>        for</span><span> child </span><span>in</span><span> ast.iter_child_nodes(node):</span></span>
<span class="line"><span>            if</span><span> isinstance</span><span>(child, (ast.FunctionDef, ast.AsyncFunctionDef)):</span></span>
<span class="line"><span>                # the innermost function holding the line wins</span></span>
<span class="line"><span>                if</span><span> child.lineno </span><span>&#x3C;=</span><span> line </span><span>&#x3C;=</span><span> child.end_lineno </span><span>and</span><span> (best </span><span>is</span><span> None</span><span> or</span><span> child.lineno </span><span>&gt;=</span><span> best[</span><span>1</span><span>]):</span></span>
<span class="line"><span>                    best </span><span>=</span><span> (prefix </span><span>+</span><span> child.name, child.lineno, child.end_lineno)</span></span>
<span class="line"><span>                walk(child, prefix </span><span>+</span><span> child.name </span><span>+</span><span> "."</span><span>)</span></span>
<span class="line"><span>            else</span><span>:                                             </span><span># methods get their class name</span></span>
<span class="line"><span>                walk(child, prefix </span><span>+</span><span> child.name </span><span>+</span><span> "."</span><span> if</span><span> isinstance</span><span>(child, ast.ClassDef) </span><span>else</span><span> prefix)</span></span>
<span class="line"><span>    if</span><span> path </span><span>in</span><span> WORK</span><span>:                                          </span><span># a path a model made up is never opened</span></span>
<span class="line"><span>        walk(audited_tree(path), </span><span>""</span><span>)</span></span>
<span class="line"><span>    return</span><span> best</span></span></code></pre>
<p>A finding counts when it names the right file and function and lands within five lines of the bug:</p>
<p><code>match</code> applies it to a list of findings.</p>
<p>							 0 else None<br />
        said = f.get(&#x22;function&#x22;, &#x22;&#x22;).split(&#x22;.&#x22;)[-1]                                # the name the model gave, as a second chance<br />
        hits = [b for b in key if b[&#x22;path&#x22;] == path and abs(line &#8211; b[&#x22;line&#x22;]) <span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># bench.py</span></span>
<span class="line"><span>def</span><span> normalise_path</span><span>(path):</span></span>
<span class="line"><span>    # ./x, /x and .../audited/x all mean x</span></span>
<span class="line"><span>    return</span><span> re.sub(</span><span>r</span><span>"</span><span>^(</span><span>.</span><span>/</span><span>|</span><span>/</span><span>|</span><span>.</span><span>*</span><span>audited/</span><span>)</span><span>+</span><span>"</span><span>, </span><span>""</span><span>, re.sub(</span><span>r</span><span>"/</span><span>+</span><span>"</span><span>, </span><span>"/"</span><span>, </span><span>str</span><span>(path).strip().replace(</span><span>"</span><span>\</span><span>"</span><span>, </span><span>"/"</span><span>)))</span></span>
<span class="line"></span>
<span class="line"><span>def</span><span> match</span><span>(findings, key</span><span>=</span><span>KEY</span><span>, window</span><span>=</span><span>5</span><span>):</span></span>
<span class="line"><span>    """A finding counts when it names the same file and function as a planted bug, within `window` lines."""</span></span>
<span class="line"><span>    found, wrong </span><span>=</span><span> {}, </span><span>set</span><span>()</span></span>
<span class="line"><span>    for</span><span> f </span><span>in</span><span> findings:</span></span>
<span class="line"><span>        path, line </span><span>=</span><span> normalise_path(f[</span><span>"file"</span><span>]), </span><span>int</span><span>(f.get(</span><span>"line"</span><span>) </span><span>or</span><span> 0</span><span>)</span></span>
<span class="line"><span>        span </span><span>=</span><span> function_at(path, line) </span><span>if</span><span> line </span><span>&gt;</span><span> 0</span><span> else</span><span> None</span></span>
<span class="line"><span>        said </span><span>=</span><span> f.get(</span><span>"function"</span><span>, </span><span>""</span><span>).split(</span><span>"."</span><span>)[</span><span>-</span><span>1</span><span>]                                </span><span># the name the model gave, as a second chance</span></span>
<span class="line"><span>        hits </span><span>=</span><span> [b </span><span>for</span><span> b </span><span>in</span><span> key </span><span>if</span><span> b[</span><span>"path"</span><span>] </span><span>==</span><span> path </span><span>and</span><span> abs</span><span>(line </span><span>-</span><span> b[</span><span>"line"</span><span>]) </span><span>&#x3C;=</span><span> window</span></span>
<span class="line"><span>                and</span><span> ((span </span><span>and</span><span> span[</span><span>0</span><span>] </span><span>==</span><span> b[</span><span>"function"</span><span>]) </span><span>or</span><span> (said </span><span>and</span><span> said </span><span>==</span><span> b[</span><span>"function"</span><span>].split(</span><span>"."</span><span>)[</span><span>-</span><span>1</span><span>]))]</span></span>
<span class="line"><span>        if</span><span> hits:</span></span>
<span class="line"><span>            found.setdefault(</span><span>min</span><span>(hits, </span><span>key</span><span>=lambda</span><span> b: </span><span>abs</span><span>(line </span><span>-</span><span> b[</span><span>"line"</span><span>]))[</span><span>"id"</span><span>], f)     </span><span># the nearest bug wins, and saying it twice counts once</span></span>
<span class="line"><span>        else</span><span>:</span></span>
<span class="line"><span>            wrong.add((path, span[</span><span>0</span><span>] </span><span>if</span><span> span </span><span>else</span><span> f</span><span>"line </span><span>{</span><span>line </span><span>//</span><span> 10}</span><span>"</span><span>))           </span><span># one wrong idea per place, however often repeated</span></span>
<span class="line"><span>    # recall over the key, precision over what was reported</span></span>
<span class="line"><span>    tp, fp </span><span>=</span><span> len</span><span>(found), </span><span>len</span><span>(wrong)</span></span>
<span class="line"><span>    return</span><span> {</span><span>"found"</span><span>: </span><span>sorted</span><span>(found), </span><span>"recall"</span><span>: tp </span><span>/</span><span> len</span><span>(key), </span><span>"precision"</span><span>: tp </span><span>/</span><span> (tp </span><span>+</span><span> fp) </span><span>if</span><span> tp </span><span>+</span><span> fp </span><span>else</span><span> None</span><span>, </span><span>"tp"</span><span>: tp, </span><span>"fp"</span><span>: fp}</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># bench.py</span></span>
<span class="line"><span>def</span><span> normalise_path</span><span>(path):</span></span>
<span class="line"><span>    # ./x, /x and .../audited/x all mean x</span></span>
<span class="line"><span>    return</span><span> re.sub(</span><span>r</span><span>"</span><span>^(</span><span>.</span><span>/</span><span>|</span><span>/</span><span>|</span><span>.</span><span>*</span><span>audited/</span><span>)</span><span>+</span><span>"</span><span>, </span><span>""</span><span>, re.sub(</span><span>r</span><span>"</span><span>/</span><span>+</span><span>"</span><span>, </span><span>"/"</span><span>, </span><span>str</span><span>(path).strip().replace(</span><span>"</span><span>\</span><span>"</span><span>, </span><span>"/"</span><span>)))</span></span>
<span class="line"></span>
<span class="line"><span>def</span><span> match</span><span>(findings, key</span><span>=</span><span>KEY</span><span>, window</span><span>=</span><span>5</span><span>):</span></span>
<span class="line"><span>    """A finding counts when it names the same file and function as a planted bug, within `window` lines."""</span></span>
<span class="line"><span>    found, wrong </span><span>=</span><span> {}, </span><span>set</span><span>()</span></span>
<span class="line"><span>    for</span><span> f </span><span>in</span><span> findings:</span></span>
<span class="line"><span>        path, line </span><span>=</span><span> normalise_path(f[</span><span>"file"</span><span>]), </span><span>int</span><span>(f.get(</span><span>"line"</span><span>) </span><span>or</span><span> 0</span><span>)</span></span>
<span class="line"><span>        span </span><span>=</span><span> function_at(path, line) </span><span>if</span><span> line </span><span>&gt;</span><span> 0</span><span> else</span><span> None</span></span>
<span class="line"><span>        said </span><span>=</span><span> f.get(</span><span>"function"</span><span>, </span><span>""</span><span>).split(</span><span>"."</span><span>)[</span><span>-</span><span>1</span><span>]                                </span><span># the name the model gave, as a second chance</span></span>
<span class="line"><span>        hits </span><span>=</span><span> [b </span><span>for</span><span> b </span><span>in</span><span> key </span><span>if</span><span> b[</span><span>"path"</span><span>] </span><span>==</span><span> path </span><span>and</span><span> abs</span><span>(line </span><span>-</span><span> b[</span><span>"line"</span><span>]) </span><span>&#x3C;=</span><span> window</span></span>
<span class="line"><span>                and</span><span> ((span </span><span>and</span><span> span[</span><span>0</span><span>] </span><span>==</span><span> b[</span><span>"function"</span><span>]) </span><span>or</span><span> (said </span><span>and</span><span> said </span><span>==</span><span> b[</span><span>"function"</span><span>].split(</span><span>"."</span><span>)[</span><span>-</span><span>1</span><span>]))]</span></span>
<span class="line"><span>        if</span><span> hits:</span></span>
<span class="line"><span>            found.setdefault(</span><span>min</span><span>(hits, </span><span>key</span><span>=lambda</span><span> b: </span><span>abs</span><span>(line </span><span>-</span><span> b[</span><span>"line"</span><span>]))[</span><span>"id"</span><span>], f)     </span><span># the nearest bug wins, and saying it twice counts once</span></span>
<span class="line"><span>        else</span><span>:</span></span>
<span class="line"><span>            wrong.add((path, span[</span><span>0</span><span>] </span><span>if</span><span> span </span><span>else</span><span> f</span><span>"line </span><span>{</span><span>line </span><span>//</span><span> 10}</span><span>"</span><span>))           </span><span># one wrong idea per place, however often repeated</span></span>
<span class="line"><span>    # recall over the key, precision over what was reported</span></span>
<span class="line"><span>    tp, fp </span><span>=</span><span> len</span><span>(found), </span><span>len</span><span>(wrong)</span></span>
<span class="line"><span>    return</span><span> {</span><span>"found"</span><span>: </span><span>sorted</span><span>(found), </span><span>"recall"</span><span>: tp </span><span>/</span><span> len</span><span>(key), </span><span>"precision"</span><span>: tp </span><span>/</span><span> (tp </span><span>+</span><span> fp) </span><span>if</span><span> tp </span><span>+</span><span> fp </span><span>else</span><span> None</span><span>, </span><span>"tp"</span><span>: tp, </span><span>"fp"</span><span>: fp}</span></span></code></pre>
<h3>Answer Ledger</h3>
<p>I rerun model calls constantly. I store each reply under a fingerprint of its question and never pay for the same question twice.</p>
<p>A <code>Reply</code> holds one answer.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>"""llm.py: replies, the ledger, one front door and one budget."""</span></span>
<span class="line"><span>import</span><span> hashlib, json, re, sqlite3, threading, time, urllib.request, zlib</span></span>
<span class="line"><span>from</span><span> dataclasses </span><span>import</span><span> asdict, dataclass</span></span>
<span class="line"></span>
<span class="line"><span>from</span><span> jsonschema </span><span>import</span><span> Draft202012Validator</span></span>
<span class="line"></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> API_KEY</span><span>, </span><span>BASE_URL</span><span>, </span><span>CAP_CREDITS</span><span>, </span><span>PRICE</span></span>
<span class="line"></span>
<span class="line"><span>@dataclass</span></span>
<span class="line"><span>class</span><span> Reply</span><span>:</span></span>
<span class="line"><span>    text: </span><span>str</span><span> =</span><span> ""</span><span>                 # the answer</span></span>
<span class="line"><span>    finish: </span><span>str</span><span> =</span><span> None</span><span>             # stop, length or error</span></span>
<span class="line"><span>    prompt_tokens: </span><span>int</span><span> =</span><span> 0</span><span>         # as the server counted them</span></span>
<span class="line"><span>    completion_tokens: </span><span>int</span><span> =</span><span> 0</span></span>
<span class="line"><span>    seconds: </span><span>float</span><span> =</span><span> 0.0</span></span>
<span class="line"><span>    model: </span><span>str</span><span> =</span><span> ""</span></span>
<span class="line"><span>    cached: </span><span>bool</span><span> =</span><span> False</span><span>           # True when the ledger answered instead of the network</span></span>
<span class="line"></span>
<span class="line"><span>class</span><span> CacheMiss</span><span>(</span><span>RuntimeError</span><span>):</span></span>
<span class="line"><span>    """Replay met a question the ledger has never seen."""</span></span>
<span class="line"></span>
<span class="line"><span>class</span><span> SpendRefused</span><span>(</span><span>RuntimeError</span><span>):</span></span>
<span class="line"><span>    """A paid call was refused: there is no client to pay with."""</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>"""llm.py: replies, the ledger, one front door and one budget."""</span></span>
<span class="line"><span>import</span><span> hashlib, json, re, sqlite3, threading, time, urllib.request, zlib</span></span>
<span class="line"><span>from</span><span> dataclasses </span><span>import</span><span> asdict, dataclass</span></span>
<span class="line"></span>
<span class="line"><span>from</span><span> jsonschema </span><span>import</span><span> Draft202012Validator</span></span>
<span class="line"></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> API_KEY</span><span>, </span><span>BASE_URL</span><span>, </span><span>CAP_CREDITS</span><span>, </span><span>PRICE</span></span>
<span class="line"></span>
<span class="line"><span>@dataclass</span></span>
<span class="line"><span>class</span><span> Reply</span><span>:</span></span>
<span class="line"><span>    text: </span><span>str</span><span> =</span><span> ""</span><span>                 # the answer</span></span>
<span class="line"><span>    finish: </span><span>str</span><span> =</span><span> None</span><span>             # stop, length or error</span></span>
<span class="line"><span>    prompt_tokens: </span><span>int</span><span> =</span><span> 0</span><span>         # as the server counted them</span></span>
<span class="line"><span>    completion_tokens: </span><span>int</span><span> =</span><span> 0</span></span>
<span class="line"><span>    seconds: </span><span>float</span><span> =</span><span> 0.0</span></span>
<span class="line"><span>    model: </span><span>str</span><span> =</span><span> ""</span></span>
<span class="line"><span>    cached: </span><span>bool</span><span> =</span><span> False</span><span>           # True when the ledger answered instead of the network</span></span>
<span class="line"></span>
<span class="line"><span>class</span><span> CacheMiss</span><span>(</span><span>RuntimeError</span><span>):</span></span>
<span class="line"><span>    """Replay met a question the ledger has never seen."""</span></span>
<span class="line"></span>
<span class="line"><span>class</span><span> SpendRefused</span><span>(</span><span>RuntimeError</span><span>):</span></span>
<span class="line"><span>    """A paid call was refused: there is no client to pay with."""</span></span></code></pre>
<p><code>http_client</code> is the only code that touches the network.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>def</span><span> http_client</span><span>(model, messages, </span><span>**</span><span>params):</span></span>
<span class="line"><span>    """One chat completion over plain HTTP. A failed call raises, so it is never stored."""</span></span>
<span class="line"><span>    body </span><span>=</span><span> json.dumps({</span><span>"model"</span><span>: model, </span><span>"messages"</span><span>: messages, </span><span>**</span><span>params}).encode()          </span><span># the question in chat completions form</span></span>
<span class="line"><span>    head </span><span>=</span><span> {</span><span>"Authorization"</span><span>: </span><span>f</span><span>"Bearer </span><span>{API_KEY}</span><span>"</span><span>, </span><span>"Content-Type"</span><span>: </span><span>"application/json"</span><span>}   </span><span># the key travels in a header only</span></span>
<span class="line"><span>    start </span><span>=</span><span> time.perf_counter()</span></span>
<span class="line"><span>    # one POST, ten minutes at most</span></span>
<span class="line"><span>    with</span><span> urllib.request.urlopen(urllib.request.Request(</span><span>BASE_URL</span><span> +</span><span> "/chat/completions"</span><span>, body, head), </span><span>timeout</span><span>=</span><span>600</span><span>) </span><span>as</span><span> r:</span></span>
<span class="line"><span>        data </span><span>=</span><span> json.load(r)</span></span>
<span class="line"><span>    choice, use </span><span>=</span><span> data[</span><span>"choices"</span><span>][</span><span>0</span><span>], data[</span><span>"usage"</span><span>]          </span><span># the answer and the server's token counts</span></span>
<span class="line"><span>    return</span><span> Reply(choice[</span><span>"message"</span><span>].get(</span><span>"content"</span><span>) </span><span>or</span><span> ""</span><span>, choice[</span><span>"finish_reason"</span><span>], use[</span><span>"prompt_tokens"</span><span>], use[</span><span>"completion_tokens"</span><span>],</span></span>
<span class="line"><span>                 time.perf_counter() </span><span>-</span><span> start, model)</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>def</span><span> http_client</span><span>(model, messages, </span><span>**</span><span>params):</span></span>
<span class="line"><span>    """One chat completion over plain HTTP. A failed call raises, so it is never stored."""</span></span>
<span class="line"><span>    body </span><span>=</span><span> json.dumps({</span><span>"model"</span><span>: model, </span><span>"messages"</span><span>: messages, </span><span>**</span><span>params}).encode()          </span><span># the question in chat completions form</span></span>
<span class="line"><span>    head </span><span>=</span><span> {</span><span>"Authorization"</span><span>: </span><span>f</span><span>"Bearer </span><span>{API_KEY}</span><span>"</span><span>, </span><span>"Content-Type"</span><span>: </span><span>"application/json"</span><span>}   </span><span># the key travels in a header only</span></span>
<span class="line"><span>    start </span><span>=</span><span> time.perf_counter()</span></span>
<span class="line"><span>    # one POST, ten minutes at most</span></span>
<span class="line"><span>    with</span><span> urllib.request.urlopen(urllib.request.Request(</span><span>BASE_URL</span><span> +</span><span> "/chat/completions"</span><span>, body, head), </span><span>timeout</span><span>=</span><span>600</span><span>) </span><span>as</span><span> r:</span></span>
<span class="line"><span>        data </span><span>=</span><span> json.load(r)</span></span>
<span class="line"><span>    choice, use </span><span>=</span><span> data[</span><span>"choices"</span><span>][</span><span>0</span><span>], data[</span><span>"usage"</span><span>]          </span><span># the answer and the server's token counts</span></span>
<span class="line"><span>    return</span><span> Reply(choice[</span><span>"message"</span><span>].get(</span><span>"content"</span><span>) </span><span>or</span><span> ""</span><span>, choice[</span><span>"finish_reason"</span><span>], use[</span><span>"prompt_tokens"</span><span>], use[</span><span>"completion_tokens"</span><span>],</span></span>
<span class="line"><span>                 time.perf_counter() </span><span>-</span><span> start, model)</span></span></code></pre>
<p>The fingerprint includes a <strong>sample index</strong>: samples 0 and 1 of one question get independent answers.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>class</span><span> Ledger</span><span>:</span></span>
<span class="line"><span>    """Every answer, under a fingerprint of its question."""</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> __init__</span><span>(self, path):</span></span>
<span class="line"><span>        # one row per answer, keyed by fingerprint</span></span>
<span class="line"><span>        self</span><span>.db, </span><span>self</span><span>.lock </span><span>=</span><span> sqlite3.connect(</span><span>str</span><span>(path), </span><span>check_same_thread</span><span>=</span><span>False</span><span>), threading.Lock()</span></span>
<span class="line"><span>        self</span><span>.db.execute(</span><span>"CREATE TABLE IF NOT EXISTS calls (key TEXT PRIMARY KEY, role, reply BLOB, seconds REAL, credits REAL, created REAL)"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>    @</span><span>staticmethod</span></span>
<span class="line"><span>    def</span><span> key</span><span>(model, messages, params, sample</span><span>=</span><span>0</span><span>):</span></span>
<span class="line"><span>        blob </span><span>=</span><span> json.dumps([model, messages, params, sample], </span><span>sort_keys</span><span>=</span><span>True</span><span>)     </span><span># the question, exactly as it was asked</span></span>
<span class="line"><span>        return</span><span> hashlib.sha256(blob.encode()).hexdigest()</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> get</span><span>(self, key):</span></span>
<span class="line"><span>        with</span><span> self</span><span>.lock:</span></span>
<span class="line"><span>            row </span><span>=</span><span> self</span><span>.db.execute(</span><span>"SELECT reply FROM calls WHERE key = ?"</span><span>, (key,)).fetchone()</span></span>
<span class="line"><span>        # stored replies come back marked cached</span></span>
<span class="line"><span>        return</span><span> Reply(</span><span>**</span><span>{</span><span>**</span><span>json.loads(zlib.decompress(row[</span><span>0</span><span>])), </span><span>"cached"</span><span>: </span><span>True</span><span>}) </span><span>if</span><span> row </span><span>else</span><span> None</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> put</span><span>(self, key, reply, role</span><span>=</span><span>""</span><span>, credits</span><span>=</span><span>0.0</span><span>):</span></span>
<span class="line"><span>        with</span><span> self</span><span>.lock:</span></span>
<span class="line"><span>            self</span><span>.db.execute(</span><span>"INSERT OR REPLACE INTO calls VALUES (?,?,?,?,?,?)"</span><span>,</span></span>
<span class="line"><span>                            (key, role, zlib.compress(json.dumps(asdict(reply)).encode()), reply.seconds, </span><span>credits</span><span>, time.time()))</span></span>
<span class="line"><span>            self</span><span>.db.commit()                          </span><span># a crash loses at most the calls still in flight</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>class</span><span> Ledger</span><span>:</span></span>
<span class="line"><span>    """Every answer, under a fingerprint of its question."""</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> __init__</span><span>(self, path):</span></span>
<span class="line"><span>        # one row per answer, keyed by fingerprint</span></span>
<span class="line"><span>        self</span><span>.db, </span><span>self</span><span>.lock </span><span>=</span><span> sqlite3.connect(</span><span>str</span><span>(path), </span><span>check_same_thread</span><span>=</span><span>False</span><span>), threading.Lock()</span></span>
<span class="line"><span>        self</span><span>.db.execute(</span><span>"CREATE TABLE IF NOT EXISTS calls (key TEXT PRIMARY KEY, role, reply BLOB, seconds REAL, credits REAL, created REAL)"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>    @</span><span>staticmethod</span></span>
<span class="line"><span>    def</span><span> key</span><span>(model, messages, params, sample</span><span>=</span><span>0</span><span>):</span></span>
<span class="line"><span>        blob </span><span>=</span><span> json.dumps([model, messages, params, sample], </span><span>sort_keys</span><span>=</span><span>True</span><span>)     </span><span># the question, exactly as it was asked</span></span>
<span class="line"><span>        return</span><span> hashlib.sha256(blob.encode()).hexdigest()</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> get</span><span>(self, key):</span></span>
<span class="line"><span>        with</span><span> self</span><span>.lock:</span></span>
<span class="line"><span>            row </span><span>=</span><span> self</span><span>.db.execute(</span><span>"SELECT reply FROM calls WHERE key = ?"</span><span>, (key,)).fetchone()</span></span>
<span class="line"><span>        # stored replies come back marked cached</span></span>
<span class="line"><span>        return</span><span> Reply(</span><span>**</span><span>{</span><span>**</span><span>json.loads(zlib.decompress(row[</span><span>0</span><span>])), </span><span>"cached"</span><span>: </span><span>True</span><span>}) </span><span>if</span><span> row </span><span>else</span><span> None</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> put</span><span>(self, key, reply, role</span><span>=</span><span>""</span><span>, credits</span><span>=</span><span>0.0</span><span>):</span></span>
<span class="line"><span>        with</span><span> self</span><span>.lock:</span></span>
<span class="line"><span>            self</span><span>.db.execute(</span><span>"INSERT OR REPLACE INTO calls VALUES (?,?,?,?,?,?)"</span><span>,</span></span>
<span class="line"><span>                            (key, role, zlib.compress(json.dumps(asdict(reply)).encode()), reply.seconds, </span><span>credits</span><span>, time.time()))</span></span>
<span class="line"><span>            self</span><span>.db.commit()                          </span><span># a crash loses at most the calls still in flight</span></span></code></pre>
<p>Every call goes through one front door, <code>LLM</code>.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>class</span><span> LLM</span><span>:</span></span>
<span class="line"><span>    def</span><span> __init__</span><span>(self, ledger, mode</span><span>=</span><span>"collect"</span><span>, client</span><span>=</span><span>None</span><span>, scripted</span><span>=</span><span>None</span><span>, budget</span><span>=</span><span>None</span><span>):</span></span>
<span class="line"><span>        self</span><span>.ledger, </span><span>self</span><span>.mode, </span><span>self</span><span>.client, </span><span>self</span><span>.scripted </span><span>=</span><span> ledger, mode, client, scripted</span></span>
<span class="line"><span>        self</span><span>.budget </span><span>=</span><span> budget </span><span>or</span><span> Budget(</span><span>CAP_CREDITS</span><span>)</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>class</span><span> LLM</span><span>:</span></span>
<span class="line"><span>    def</span><span> __init__</span><span>(self, ledger, mode</span><span>=</span><span>"collect"</span><span>, client</span><span>=</span><span>None</span><span>, scripted</span><span>=</span><span>None</span><span>, budget</span><span>=</span><span>None</span><span>):</span></span>
<span class="line"><span>        self</span><span>.ledger, </span><span>self</span><span>.mode, </span><span>self</span><span>.client, </span><span>self</span><span>.scripted </span><span>=</span><span> ledger, mode, client, scripted</span></span>
<span class="line"><span>        self</span><span>.budget </span><span>=</span><span> budget </span><span>or</span><span> Budget(</span><span>CAP_CREDITS</span><span>)</span></span></code></pre>
<p><code>chat</code> tries, in order: the ledger, replay refusal, a free stand-in, the budget, and only then the network.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>    def</span><span> chat</span><span>(self, model, messages, </span><span>*</span><span>, role</span><span>=</span><span>""</span><span>, sample</span><span>=</span><span>0</span><span>, </span><span>**</span><span>params):</span></span>
<span class="line"><span>        key </span><span>=</span><span> Ledger.key(model, messages, params, sample)      </span><span># the same question always gets the same key</span></span>
<span class="line"><span>        if</span><span> hit </span><span>:=</span><span> self</span><span>.ledger.get(key):</span></span>
<span class="line"><span>            return</span><span> hit                                </span><span># free, instant and identical to the first answer</span></span>
<span class="line"><span>        if</span><span> self</span><span>.mode </span><span>==</span><span> "replay"</span><span>:</span></span>
<span class="line"><span>            raise</span><span> CacheMiss(</span><span>f</span><span>"</span><span>{</span><span>role </span><span>or</span><span> model</span><span>}</span><span>: no stored answer, run in collect mode first"</span><span>)</span></span>
<span class="line"><span>        if</span><span> self</span><span>.scripted:                             </span><span># a stand-in answers for free and leaves no trace</span></span>
<span class="line"><span>            return</span><span> self</span><span>.scripted(model, messages, </span><span>dict</span><span>(params, </span><span>sample</span><span>=</span><span>sample))</span></span>
<span class="line"><span>        if</span><span> self</span><span>.client </span><span>is</span><span> None</span><span>:                       </span><span># no client means nothing can be paid for</span></span>
<span class="line"><span>            raise</span><span> SpendRefused(</span><span>"no client, so nothing can be collected"</span><span>)</span></span>
<span class="line"><span>        price </span><span>=</span><span> PRICE</span><span>.get(model, </span><span>0.2</span><span>)</span></span>
<span class="line"><span>        self</span><span>.budget.admit(price)                      </span><span># may wait here until somebody raises the cap</span></span>
<span class="line"><span>        try</span><span>:</span></span>
<span class="line"><span>            reply </span><span>=</span><span> self</span><span>.client(model, messages, </span><span>**</span><span>params)</span></span>
<span class="line"><span>        except</span><span> BaseException</span><span>:</span></span>
<span class="line"><span>            self</span><span>.budget.settle(price, </span><span>0.0</span><span>)            </span><span># a failed call is not billed and not stored</span></span>
<span class="line"><span>            raise</span></span>
<span class="line"><span>        self</span><span>.budget.settle(price, price)</span></span>
<span class="line"><span>        self</span><span>.ledger.put(key, reply, role, price)</span></span>
<span class="line"><span>        return</span><span> reply</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>    def</span><span> chat</span><span>(self, model, messages, </span><span>*</span><span>, role</span><span>=</span><span>""</span><span>, sample</span><span>=</span><span>0</span><span>, </span><span>**</span><span>params):</span></span>
<span class="line"><span>        key </span><span>=</span><span> Ledger.key(model, messages, params, sample)      </span><span># the same question always gets the same key</span></span>
<span class="line"><span>        if</span><span> hit </span><span>:=</span><span> self</span><span>.ledger.get(key):</span></span>
<span class="line"><span>            return</span><span> hit                                </span><span># free, instant and identical to the first answer</span></span>
<span class="line"><span>        if</span><span> self</span><span>.mode </span><span>==</span><span> "replay"</span><span>:</span></span>
<span class="line"><span>            raise</span><span> CacheMiss(</span><span>f</span><span>"</span><span>{</span><span>role </span><span>or</span><span> model</span><span>}</span><span>: no stored answer, run in collect mode first"</span><span>)</span></span>
<span class="line"><span>        if</span><span> self</span><span>.scripted:                             </span><span># a stand-in answers for free and leaves no trace</span></span>
<span class="line"><span>            return</span><span> self</span><span>.scripted(model, messages, </span><span>dict</span><span>(params, </span><span>sample</span><span>=</span><span>sample))</span></span>
<span class="line"><span>        if</span><span> self</span><span>.client </span><span>is</span><span> None</span><span>:                       </span><span># no client means nothing can be paid for</span></span>
<span class="line"><span>            raise</span><span> SpendRefused(</span><span>"no client, so nothing can be collected"</span><span>)</span></span>
<span class="line"><span>        price </span><span>=</span><span> PRICE</span><span>.get(model, </span><span>0.2</span><span>)</span></span>
<span class="line"><span>        self</span><span>.budget.admit(price)                      </span><span># may wait here until somebody raises the cap</span></span>
<span class="line"><span>        try</span><span>:</span></span>
<span class="line"><span>            reply </span><span>=</span><span> self</span><span>.client(model, messages, </span><span>**</span><span>params)</span></span>
<span class="line"><span>        except</span><span> BaseException</span><span>:</span></span>
<span class="line"><span>            self</span><span>.budget.settle(price, </span><span>0.0</span><span>)            </span><span># a failed call is not billed and not stored</span></span>
<span class="line"><span>            raise</span></span>
<span class="line"><span>        self</span><span>.budget.settle(price, price)</span></span>
<span class="line"><span>        self</span><span>.ledger.put(key, reply, role, price)</span></span>
<span class="line"><span>        return</span><span> reply</span></span></code></pre>
<p>We test it with a fake client that counts calls.</p>
<p>							&lt;button data-code=&quot;import time<br />
from config import MODELS<br />
from llm import LLM, Ledger, Reply</p>
<p>paid = []                                           # one entry per call that reaches the &#x22;network&#x22;<br />
def fake_client(model, messages, **params):         # a stand-in for the network: it answers after a pause<br />
    paid.append(1)<br />
    time.sleep(0.05)<br />
    return Reply(&#x27;{&#x22;answer&#x22;: &#x22;ok&#x22;}&#x27;, &#x22;stop&#x22;, 10, 5, 0.05, model)</p>
<p>llm = LLM(Ledger(&#x22;:memory:&#x22;), client=fake_client)<br />
ask = lambda door, q: door.chat(MODELS[&#x22;worker&#x22;], [{&#x22;role&#x22;: &#x22;user&#x22;, &#x22;content&#x22;: q}], role=&#x22;demo&#x22;)<br />
for q in (&#x22;what is 2+2?&#x22;, &#x22;name a sorting algorithm&#x22;, &#x22;what is 2+2?&#x22;):<br />
    print(f&#x22;{q:<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>import</span><span> time</span></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> MODELS</span></span>
<span class="line"><span>from</span><span> llm </span><span>import</span><span> LLM</span><span>, Ledger, Reply</span></span>
<span class="line"></span>
<span class="line"><span>paid </span><span>=</span><span> []                                           </span><span># one entry per call that reaches the "network"</span></span>
<span class="line"><span>def</span><span> fake_client</span><span>(model, messages, </span><span>**</span><span>params):         </span><span># a stand-in for the network: it answers after a pause</span></span>
<span class="line"><span>    paid.append(</span><span>1</span><span>)</span></span>
<span class="line"><span>    time.sleep(</span><span>0.05</span><span>)</span></span>
<span class="line"><span>    return</span><span> Reply(</span><span>'{"answer": "ok"}'</span><span>, </span><span>"stop"</span><span>, </span><span>10</span><span>, </span><span>5</span><span>, </span><span>0.05</span><span>, model)</span></span>
<span class="line"></span>
<span class="line"><span>llm </span><span>=</span><span> LLM(Ledger(</span><span>":memory:"</span><span>), </span><span>client</span><span>=</span><span>fake_client)</span></span>
<span class="line"><span>ask </span><span>=</span><span> lambda</span><span> door, q: door.chat(</span><span>MODELS</span><span>[</span><span>"worker"</span><span>], [{</span><span>"role"</span><span>: </span><span>"user"</span><span>, </span><span>"content"</span><span>: q}], </span><span>role</span><span>=</span><span>"demo"</span><span>)</span></span>
<span class="line"><span>for</span><span> q </span><span>in</span><span> (</span><span>"what is 2+2?"</span><span>, </span><span>"name a sorting algorithm"</span><span>, </span><span>"what is 2+2?"</span><span>):</span></span>
<span class="line"><span>    print</span><span>(</span><span>f</span><span>"</span><span>{</span><span>q</span><span>:&#x3C;26</span><span>}</span><span> from the ledger: </span><span>{</span><span>ask(llm, q).cached</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"><span>try</span><span>:</span></span>
<span class="line"><span>    ask(LLM(llm.ledger, </span><span>mode</span><span>=</span><span>"replay"</span><span>, </span><span>client</span><span>=</span><span>fake_client), </span><span>"a new question"</span><span>)</span></span>
<span class="line"><span>except</span><span> Exception</span><span> as</span><span> e:</span></span>
<span class="line"><span>    print</span><span>(</span><span>f</span><span>"</span><span>{type</span><span>(e).</span><span>__name__}</span><span>: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>what </span><span>is</span><span> 2</span><span>+</span><span>2</span><span>?</span><span>               from</span><span> the ledger: </span><span>False</span></span>
<span class="line"><span>name a sorting algorithm   </span><span>from</span><span> the ledger: </span><span>False</span></span>
<span class="line"><span>what </span><span>is</span><span> 2</span><span>+</span><span>2</span><span>?</span><span>               from</span><span> the ledger: </span><span>True</span></span>
<span class="line"><span>CacheMiss: demo: no stored answer, run </span><span>in</span><span> collect mode first</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>import</span><span> time</span></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> MODELS</span></span>
<span class="line"><span>from</span><span> llm </span><span>import</span><span> LLM</span><span>, Ledger, Reply</span></span>
<span class="line"></span>
<span class="line"><span>paid </span><span>=</span><span> []                                           </span><span># one entry per call that reaches the "network"</span></span>
<span class="line"><span>def</span><span> fake_client</span><span>(model, messages, </span><span>**</span><span>params):         </span><span># a stand-in for the network: it answers after a pause</span></span>
<span class="line"><span>    paid.append(</span><span>1</span><span>)</span></span>
<span class="line"><span>    time.sleep(</span><span>0.05</span><span>)</span></span>
<span class="line"><span>    return</span><span> Reply(</span><span>'{"answer": "ok"}'</span><span>, </span><span>"stop"</span><span>, </span><span>10</span><span>, </span><span>5</span><span>, </span><span>0.05</span><span>, model)</span></span>
<span class="line"></span>
<span class="line"><span>llm </span><span>=</span><span> LLM(Ledger(</span><span>":memory:"</span><span>), </span><span>client</span><span>=</span><span>fake_client)</span></span>
<span class="line"><span>ask </span><span>=</span><span> lambda</span><span> door, q: door.chat(</span><span>MODELS</span><span>[</span><span>"worker"</span><span>], [{</span><span>"role"</span><span>: </span><span>"user"</span><span>, </span><span>"content"</span><span>: q}], </span><span>role</span><span>=</span><span>"demo"</span><span>)</span></span>
<span class="line"><span>for</span><span> q </span><span>in</span><span> (</span><span>"what is 2+2?"</span><span>, </span><span>"name a sorting algorithm"</span><span>, </span><span>"what is 2+2?"</span><span>):</span></span>
<span class="line"><span>    print</span><span>(</span><span>f</span><span>"</span><span>{</span><span>q</span><span>:&#x3C;26</span><span>}</span><span> from the ledger: </span><span>{</span><span>ask(llm, q).cached</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"><span>try</span><span>:</span></span>
<span class="line"><span>    ask(LLM(llm.ledger, </span><span>mode</span><span>=</span><span>"replay"</span><span>, </span><span>client</span><span>=</span><span>fake_client), </span><span>"a new question"</span><span>)</span></span>
<span class="line"><span>except</span><span> Exception</span><span> as</span><span> e:</span></span>
<span class="line"><span>    print</span><span>(</span><span>f</span><span>"</span><span>{type</span><span>(e).</span><span>__name__}</span><span>: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>what </span><span>is</span><span> 2</span><span>+</span><span>2</span><span>?</span><span>               from</span><span> the ledger: </span><span>False</span></span>
<span class="line"><span>name a sorting algorithm   </span><span>from</span><span> the ledger: </span><span>False</span></span>
<span class="line"><span>what </span><span>is</span><span> 2</span><span>+</span><span>2</span><span>?</span><span>               from</span><span> the ledger: </span><span>True</span></span>
<span class="line"><span>CacheMiss: demo: no stored answer, run </span><span>in</span><span> collect mode first</span></span></code></pre>
<p>The repeat came from the ledger for free, and replay raised <code>CacheMiss</code> without touching the network.</p>
<h3>Shard Packer</h3>
<p>Big shards look cheap because billing is per call, yet a model can miss details past the start of a long input. A <strong>shard</strong> is the code that one worker reads in a single call. <code>numbered</code> adds line numbers, and <code>TOKENS</code> sizes each file as a worker sees it.</p>
<p>							5}| {ln}&#x22; for i, ln in enumerate(lines, 1))</p>
<p>TOKENS = {p: int(len(numbered(p)) / CHARS_PER_TOKEN) for p in WORK}      # each file&#x27;s size as a worker sees it&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-3 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>"""shards.py: numbered lines, packed into shards."""</span></span>
<span class="line"><span>from</span><span> bench </span><span>import</span><span> AUDITED</span><span>, </span><span>WORK</span></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> CHARS_PER_TOKEN</span></span>
<span class="line"></span>
<span class="line"><span>def</span><span> numbered</span><span>(path):</span></span>
<span class="line"><span>    lines </span><span>=</span><span> (</span><span>AUDITED</span><span> /</span><span> path).read_text(</span><span>encoding</span><span>=</span><span>"utf-8"</span><span>).split(</span><span>"</span><span>n</span><span>"</span><span>)</span></span>
<span class="line"><span>    # a path header, then numbered lines</span></span>
<span class="line"><span>    return</span><span> f</span><span>"### </span><span>{</span><span>path</span><span>}n</span><span>"</span><span> +</span><span> "</span><span>n</span><span>"</span><span>.join(</span><span>f</span><span>"</span><span>{</span><span>i</span><span>:&gt;5</span><span>}</span><span>| </span><span>{</span><span>ln</span><span>}</span><span>"</span><span> for</span><span> i, ln </span><span>in</span><span> enumerate</span><span>(lines, </span><span>1</span><span>))</span></span>
<span class="line"></span>
<span class="line"><span>TOKENS</span><span> =</span><span> {p: </span><span>int</span><span>(</span><span>len</span><span>(numbered(p)) </span><span>/</span><span> CHARS_PER_TOKEN</span><span>) </span><span>for</span><span> p </span><span>in</span><span> WORK</span><span>}      </span><span># each file's size as a worker sees it</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>"""shards.py: numbered lines, packed into shards."""</span></span>
<span class="line"><span>from</span><span> bench </span><span>import</span><span> AUDITED</span><span>, </span><span>WORK</span></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> CHARS_PER_TOKEN</span></span>
<span class="line"></span>
<span class="line"><span>def</span><span> numbered</span><span>(path):</span></span>
<span class="line"><span>    lines </span><span>=</span><span> (</span><span>AUDITED</span><span> /</span><span> path).read_text(</span><span>encoding</span><span>=</span><span>"utf-8"</span><span>).split(</span><span>"</span><span>n</span><span>"</span><span>)</span></span>
<span class="line"><span>    # a path header, then numbered lines</span></span>
<span class="line"><span>    return</span><span> f</span><span>"### </span><span>{</span><span>path</span><span>}n</span><span>"</span><span> +</span><span> "</span><span>n</span><span>"</span><span>.join(</span><span>f</span><span>"</span><span>{</span><span>i</span><span>:&gt;5</span><span>}</span><span>| </span><span>{</span><span>ln</span><span>}</span><span>"</span><span> for</span><span> i, ln </span><span>in</span><span> enumerate</span><span>(lines, </span><span>1</span><span>))</span></span>
<span class="line"></span>
<span class="line"><span>TOKENS</span><span> =</span><span> {p: </span><span>int</span><span>(</span><span>len</span><span>(numbered(p)) </span><span>/</span><span> CHARS_PER_TOKEN</span><span>) </span><span>for</span><span> p </span><span>in</span><span> WORK</span><span>}      </span><span># each file's size as a worker sees it</span></span></code></pre>
<p><code>pack</code> fills each shard with whole files until the next one would not fit.</p>
<p>							&lt;button data-code=&quot;# shards.py<br />
def pack(paths, target):<br />
    &#x22;&#x22;&#x22;Whole files packed into shards of about &#x60;target&#x60; tokens, first fit.&#x22;&#x22;&#x22;<br />
    shards, sizes = [], []<br />
    # folder by folder, biggest files first<br />
    for folder in sorted({p.split(&#x22;/&#x22;)[0] for p in paths}):<br />
        for p in sorted((q for q in paths if q.split(&#x22;/&#x22;)[0] == folder), key=lambda q: -TOKENS[q]):<br />
            # the first shard with room takes the file<br />
            for i, size in enumerate(sizes):<br />
                if size + TOKENS[p] <span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># shards.py</span></span>
<span class="line"><span>def</span><span> pack</span><span>(paths, target):</span></span>
<span class="line"><span>    """Whole files packed into shards of about `target` tokens, first fit."""</span></span>
<span class="line"><span>    shards, sizes </span><span>=</span><span> [], []</span></span>
<span class="line"><span>    # folder by folder, biggest files first</span></span>
<span class="line"><span>    for</span><span> folder </span><span>in</span><span> sorted</span><span>({p.split(</span><span>"/"</span><span>)[</span><span>0</span><span>] </span><span>for</span><span> p </span><span>in</span><span> paths}):</span></span>
<span class="line"><span>        for</span><span> p </span><span>in</span><span> sorted</span><span>((q </span><span>for</span><span> q </span><span>in</span><span> paths </span><span>if</span><span> q.split(</span><span>"/"</span><span>)[</span><span>0</span><span>] </span><span>==</span><span> folder), </span><span>key</span><span>=lambda</span><span> q: </span><span>-</span><span>TOKENS</span><span>[q]):</span></span>
<span class="line"><span>            # the first shard with room takes the file</span></span>
<span class="line"><span>            for</span><span> i, size </span><span>in</span><span> enumerate</span><span>(sizes):</span></span>
<span class="line"><span>                if</span><span> size </span><span>+</span><span> TOKENS</span><span>[p] </span><span>&#x3C;=</span><span> target:</span></span>
<span class="line"><span>                    shards[i].append(p)</span></span>
<span class="line"><span>                    sizes[i] </span><span>+=</span><span> TOKENS</span><span>[p]</span></span>
<span class="line"><span>                    break</span></span>
<span class="line"><span>            else</span><span>:                                    </span><span># no room anywhere: start a new shard</span></span>
<span class="line"><span>                shards.append([p])</span></span>
<span class="line"><span>                sizes.append(</span><span>TOKENS</span><span>[p])</span></span>
<span class="line"><span>    return</span><span> shards</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># shards.py</span></span>
<span class="line"><span>def</span><span> pack</span><span>(paths, target):</span></span>
<span class="line"><span>    """Whole files packed into shards of about `target` tokens, first fit."""</span></span>
<span class="line"><span>    shards, sizes </span><span>=</span><span> [], []</span></span>
<span class="line"><span>    # folder by folder, biggest files first</span></span>
<span class="line"><span>    for</span><span> folder </span><span>in</span><span> sorted</span><span>({p.split(</span><span>"/"</span><span>)[</span><span>0</span><span>] </span><span>for</span><span> p </span><span>in</span><span> paths}):</span></span>
<span class="line"><span>        for</span><span> p </span><span>in</span><span> sorted</span><span>((q </span><span>for</span><span> q </span><span>in</span><span> paths </span><span>if</span><span> q.split(</span><span>"/"</span><span>)[</span><span>0</span><span>] </span><span>==</span><span> folder), </span><span>key</span><span>=lambda</span><span> q: </span><span>-</span><span>TOKENS</span><span>[q]):</span></span>
<span class="line"><span>            # the first shard with room takes the file</span></span>
<span class="line"><span>            for</span><span> i, size </span><span>in</span><span> enumerate</span><span>(sizes):</span></span>
<span class="line"><span>                if</span><span> size </span><span>+</span><span> TOKENS</span><span>[p] </span><span>&#x3C;=</span><span> target:</span></span>
<span class="line"><span>                    shards[i].append(p)</span></span>
<span class="line"><span>                    sizes[i] </span><span>+=</span><span> TOKENS</span><span>[p]</span></span>
<span class="line"><span>                    break</span></span>
<span class="line"><span>            else</span><span>:                                    </span><span># no room anywhere: start a new shard</span></span>
<span class="line"><span>                shards.append([p])</span></span>
<span class="line"><span>                sizes.append(</span><span>TOKENS</span><span>[p])</span></span>
<span class="line"><span>    return</span><span> shards</span></span></code></pre>
<p>My rule, fixed in advance, takes the largest size within 0.05 of the best recall, and on 283 files with 24 planted bugs it picked 100,000 tokens. A later whole-system test disagreed: a slim plan found 0.38 of the bugs at 20,000-token shards and 0.18 at 100,000.</p>
<p>Every workflow compared below used 100,000-token shards.</p>
<h3>Worker Threads and Event Stream</h3>
<p>A <strong>run</strong> is one execution of a plan, and a plan is a Python function that receives the run.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>"""runtime.py: workers, threads, events, phases and background runs."""</span></span>
<span class="line"><span>import</span><span> collections, concurrent.futures </span><span>as</span><span> cf, threading, time</span></span>
<span class="line"><span>from</span><span> dataclasses </span><span>import</span><span> dataclass, field</span></span>
<span class="line"></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> MAX_AGENTS_PER_RUN</span><span>, </span><span>MODELS</span><span>, </span><span>PRICE</span><span>, </span><span>TEMPERATURE</span><span>, </span><span>TOP_P</span></span>
<span class="line"><span>from</span><span> llm </span><span>import</span><span> CacheMiss, SpendRefused, extract_json, validate</span></span>
<span class="line"></span>
<span class="line"><span>class</span><span> RunCancelled</span><span>(</span><span>RuntimeError</span><span>):</span></span>
<span class="line"><span>    """The run was cancelled."""</span></span>
<span class="line"></span>
<span class="line"><span>ABORT</span><span> =</span><span> (RunCancelled, SpendRefused, CacheMiss)    </span><span># only these end a run, other failures stay with the worker</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>"""runtime.py: workers, threads, events, phases and background runs."""</span></span>
<span class="line"><span>import</span><span> collections, concurrent.futures </span><span>as</span><span> cf, threading, time</span></span>
<span class="line"><span>from</span><span> dataclasses </span><span>import</span><span> dataclass, field</span></span>
<span class="line"></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> MAX_AGENTS_PER_RUN</span><span>, </span><span>MODELS</span><span>, </span><span>PRICE</span><span>, </span><span>TEMPERATURE</span><span>, </span><span>TOP_P</span></span>
<span class="line"><span>from</span><span> llm </span><span>import</span><span> CacheMiss, SpendRefused, extract_json, validate</span></span>
<span class="line"></span>
<span class="line"><span>class</span><span> RunCancelled</span><span>(</span><span>RuntimeError</span><span>):</span></span>
<span class="line"><span>    """The run was cancelled."""</span></span>
<span class="line"></span>
<span class="line"><span>ABORT</span><span> =</span><span> (RunCancelled, SpendRefused, CacheMiss)    </span><span># only these end a run, other failures stay with the worker</span></span></code></pre>
<p>Each worker leaves a <strong>thread</strong>, its whole conversation.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>@dataclass</span></span>
<span class="line"><span>class</span><span> Thread</span><span>:</span></span>
<span class="line"><span>    """One worker's whole conversation, kept so a person can read it afterwards."""</span></span>
<span class="line"><span>    id</span><span>: </span><span>str</span></span>
<span class="line"><span>    phase: </span><span>str</span></span>
<span class="line"><span>    label: </span><span>str</span><span>                                     # what the plan called it, such as "scan:logic:maths#3"</span></span>
<span class="line"><span>    model: </span><span>str</span></span>
<span class="line"><span>    role: </span><span>str</span><span> =</span><span> "worker"</span></span>
<span class="line"><span>    messages: </span><span>list</span><span> =</span><span> field(</span><span>default_factory</span><span>=</span><span>list</span><span>)   </span><span># everything the worker was sent</span></span>
<span class="line"><span>    replies: </span><span>list</span><span> =</span><span> field(</span><span>default_factory</span><span>=</span><span>list</span><span>)    </span><span># every Reply it got back</span></span>
<span class="line"><span>    status: </span><span>str</span><span> =</span><span> "waiting"</span><span>                        # waiting, running, done or failed</span></span>
<span class="line"><span>    started: </span><span>float</span><span> =</span><span> 0.0</span><span>                           # seconds since the run began</span></span>
<span class="line"><span>    ended: </span><span>float</span><span> =</span><span> 0.0</span></span>
<span class="line"><span>    cost: </span><span>float</span><span> =</span><span> 0.0</span><span>                              # credits charged for its paid calls</span></span>
<span class="line"><span>    result: </span><span>object</span><span> =</span><span> None</span></span>
<span class="line"><span>    error: </span><span>str</span><span> =</span><span> None</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>@dataclass</span></span>
<span class="line"><span>class</span><span> Thread</span><span>:</span></span>
<span class="line"><span>    """One worker's whole conversation, kept so a person can read it afterwards."""</span></span>
<span class="line"><span>    id</span><span>: </span><span>str</span></span>
<span class="line"><span>    phase: </span><span>str</span></span>
<span class="line"><span>    label: </span><span>str</span><span>                                     # what the plan called it, such as "scan:logic:maths#3"</span></span>
<span class="line"><span>    model: </span><span>str</span></span>
<span class="line"><span>    role: </span><span>str</span><span> =</span><span> "worker"</span></span>
<span class="line"><span>    messages: </span><span>list</span><span> =</span><span> field(</span><span>default_factory</span><span>=</span><span>list</span><span>)   </span><span># everything the worker was sent</span></span>
<span class="line"><span>    replies: </span><span>list</span><span> =</span><span> field(</span><span>default_factory</span><span>=</span><span>list</span><span>)    </span><span># every Reply it got back</span></span>
<span class="line"><span>    status: </span><span>str</span><span> =</span><span> "waiting"</span><span>                        # waiting, running, done or failed</span></span>
<span class="line"><span>    started: </span><span>float</span><span> =</span><span> 0.0</span><span>                           # seconds since the run began</span></span>
<span class="line"><span>    ended: </span><span>float</span><span> =</span><span> 0.0</span></span>
<span class="line"><span>    cost: </span><span>float</span><span> =</span><span> 0.0</span><span>                              # credits charged for its paid calls</span></span>
<span class="line"><span>    result: </span><span>object</span><span> =</span><span> None</span></span>
<span class="line"><span>    error: </span><span>str</span><span> =</span><span> None</span></span></code></pre>
<p><code>Run keeps everything a run leaves.</code></p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>class</span><span> Run</span><span>:</span></span>
<span class="line"><span>    def</span><span> __init__</span><span>(self, title, goal</span><span>=</span><span>""</span><span>, </span><span>*</span><span>, llm, run_id</span><span>=</span><span>None</span><span>, concurrency</span><span>=</span><span>16</span><span>, max_agents</span><span>=</span><span>MAX_AGENTS_PER_RUN</span><span>):</span></span>
<span class="line"><span>        self</span><span>.title, </span><span>self</span><span>.goal, </span><span>self</span><span>.llm, </span><span>self</span><span>.run_id </span><span>=</span><span> title, goal, llm, run_id </span><span>or</span><span> title.lower().replace(</span><span>" "</span><span>, </span><span>"-"</span><span>)</span></span>
<span class="line"><span>        self</span><span>.t0, </span><span>self</span><span>.max_agents, </span><span>self</span><span>.lock </span><span>=</span><span> time.perf_counter(), max_agents, threading.Lock()</span></span>
<span class="line"><span>        # slots cap concurrency, cancelled refuses new workers</span></span>
<span class="line"><span>        self</span><span>.slots, </span><span>self</span><span>.cancelled </span><span>=</span><span> threading.BoundedSemaphore(concurrency), threading.Event()</span></span>
<span class="line"><span>        # what a person reads afterwards</span></span>
<span class="line"><span>        self</span><span>.threads, </span><span>self</span><span>.phases, </span><span>self</span><span>.events, </span><span>self</span><span>.dropped, </span><span>self</span><span>.current </span><span>=</span><span> [], [], [], [], </span><span>None</span></span>
<span class="line"><span>        self</span><span>.status, </span><span>self</span><span>.result, </span><span>self</span><span>.error, </span><span>self</span><span>._worker </span><span>=</span><span> "created"</span><span>, </span><span>None</span><span>, </span><span>None</span><span>, </span><span>None</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> elapsed</span><span>(self):</span></span>
<span class="line"><span>        return</span><span> time.perf_counter() </span><span>-</span><span> self</span><span>.t0</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> emit</span><span>(self, kind, </span><span>**</span><span>data):</span></span>
<span class="line"><span>        self</span><span>.events.append({</span><span>"t"</span><span>: </span><span>round</span><span>(</span><span>self</span><span>.elapsed(), </span><span>3</span><span>), </span><span>"type"</span><span>: kind, </span><span>**</span><span>data})      </span><span># the run's stream: every event, in order</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>class</span><span> Run</span><span>:</span></span>
<span class="line"><span>    def</span><span> __init__</span><span>(self, title, goal</span><span>=</span><span>""</span><span>, </span><span>*</span><span>, llm, run_id</span><span>=</span><span>None</span><span>, concurrency</span><span>=</span><span>16</span><span>, max_agents</span><span>=</span><span>MAX_AGENTS_PER_RUN</span><span>):</span></span>
<span class="line"><span>        self</span><span>.title, </span><span>self</span><span>.goal, </span><span>self</span><span>.llm, </span><span>self</span><span>.run_id </span><span>=</span><span> title, goal, llm, run_id </span><span>or</span><span> title.lower().replace(</span><span>" "</span><span>, </span><span>"-"</span><span>)</span></span>
<span class="line"><span>        self</span><span>.t0, </span><span>self</span><span>.max_agents, </span><span>self</span><span>.lock </span><span>=</span><span> time.perf_counter(), max_agents, threading.Lock()</span></span>
<span class="line"><span>        # slots cap concurrency, cancelled refuses new workers</span></span>
<span class="line"><span>        self</span><span>.slots, </span><span>self</span><span>.cancelled </span><span>=</span><span> threading.BoundedSemaphore(concurrency), threading.Event()</span></span>
<span class="line"><span>        # what a person reads afterwards</span></span>
<span class="line"><span>        self</span><span>.threads, </span><span>self</span><span>.phases, </span><span>self</span><span>.events, </span><span>self</span><span>.dropped, </span><span>self</span><span>.current </span><span>=</span><span> [], [], [], [], </span><span>None</span></span>
<span class="line"><span>        self</span><span>.status, </span><span>self</span><span>.result, </span><span>self</span><span>.error, </span><span>self</span><span>._worker </span><span>=</span><span> "created"</span><span>, </span><span>None</span><span>, </span><span>None</span><span>, </span><span>None</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> elapsed</span><span>(self):</span></span>
<span class="line"><span>        return</span><span> time.perf_counter() </span><span>-</span><span> self</span><span>.t0</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> emit</span><span>(self, kind, </span><span>**</span><span>data):</span></span>
<span class="line"><span>        self</span><span>.events.append({</span><span>"t"</span><span>: </span><span>round</span><span>(</span><span>self</span><span>.elapsed(), </span><span>3</span><span>), </span><span>"type"</span><span>: kind, </span><span>**</span><span>data})      </span><span># the run's stream: every event, in order</span></span></code></pre>
<p>A <strong>phase</strong> is a named stretch of the run, such as Scan or Verify.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> phase</span><span>(self, title):</span></span>
<span class="line"><span>        with</span><span> self</span><span>.lock:</span></span>
<span class="line"><span>            if</span><span> self</span><span>.current:                       </span><span># closing a phase records its workers and time</span></span>
<span class="line"><span>                mine </span><span>=</span><span> [t </span><span>for</span><span> t </span><span>in</span><span> self</span><span>.threads </span><span>if</span><span> t.phase </span><span>==</span><span> self</span><span>.current[</span><span>"name"</span><span>]]</span></span>
<span class="line"><span>                self</span><span>.emit(</span><span>"run.phase_ended"</span><span>, </span><span>phase</span><span>=</span><span>self</span><span>.current[</span><span>"name"</span><span>], </span><span>agents</span><span>=</span><span>len</span><span>(mine), </span><span>seconds</span><span>=</span><span>round</span><span>(</span><span>self</span><span>.elapsed() </span><span>-</span><span> self</span><span>.current[</span><span>"started"</span><span>], </span><span>2</span><span>))</span></span>
<span class="line"><span>            self</span><span>.current </span><span>=</span><span> {</span><span>"name"</span><span>: title, </span><span>"started"</span><span>: </span><span>self</span><span>.elapsed()} </span><span>if</span><span> title </span><span>else</span><span> None</span></span>
<span class="line"><span>            if</span><span> self</span><span>.current:</span></span>
<span class="line"><span>                self</span><span>.phases.append(</span><span>self</span><span>.current)</span></span>
<span class="line"><span>                self</span><span>.emit(</span><span>"run.phase_started"</span><span>, </span><span>phase</span><span>=</span><span>title, </span><span>index</span><span>=</span><span>len</span><span>(</span><span>self</span><span>.phases))</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> log</span><span>(self, message):</span></span>
<span class="line"><span>        self</span><span>.emit(</span><span>"run.log"</span><span>, </span><span>message</span><span>=</span><span>str</span><span>(message)[:</span><span>500</span><span>])</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> phase</span><span>(self, title):</span></span>
<span class="line"><span>        with</span><span> self</span><span>.lock:</span></span>
<span class="line"><span>            if</span><span> self</span><span>.current:                       </span><span># closing a phase records its workers and time</span></span>
<span class="line"><span>                mine </span><span>=</span><span> [t </span><span>for</span><span> t </span><span>in</span><span> self</span><span>.threads </span><span>if</span><span> t.phase </span><span>==</span><span> self</span><span>.current[</span><span>"name"</span><span>]]</span></span>
<span class="line"><span>                self</span><span>.emit(</span><span>"run.phase_ended"</span><span>, </span><span>phase</span><span>=</span><span>self</span><span>.current[</span><span>"name"</span><span>], </span><span>agents</span><span>=</span><span>len</span><span>(mine), </span><span>seconds</span><span>=</span><span>round</span><span>(</span><span>self</span><span>.elapsed() </span><span>-</span><span> self</span><span>.current[</span><span>"started"</span><span>], </span><span>2</span><span>))</span></span>
<span class="line"><span>            self</span><span>.current </span><span>=</span><span> {</span><span>"name"</span><span>: title, </span><span>"started"</span><span>: </span><span>self</span><span>.elapsed()} </span><span>if</span><span> title </span><span>else</span><span> None</span></span>
<span class="line"><span>            if</span><span> self</span><span>.current:</span></span>
<span class="line"><span>                self</span><span>.phases.append(</span><span>self</span><span>.current)</span></span>
<span class="line"><span>                self</span><span>.emit(</span><span>"run.phase_started"</span><span>, </span><span>phase</span><span>=</span><span>title, </span><span>index</span><span>=</span><span>len</span><span>(</span><span>self</span><span>.phases))</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> log</span><span>(self, message):</span></span>
<span class="line"><span>        self</span><span>.emit(</span><span>"run.log"</span><span>, </span><span>message</span><span>=</span><span>str</span><span>(message)[:</span><span>500</span><span>])</span></span></code></pre>
<p><code>_new_thread</code> also holds the runaway backstop.</p>
<p>							= self.max_agents:                      # over the limit: record what was refused<br />
                self.dropped.append(label)<br />
                self.emit(&#x22;run.dropped&#x22;, label=label, limit=self.max_agents)<br />
                if len(self.dropped) &gt;= self.max_agents:                  # asking for twice the limit is treated as a runaway<br />
                    self.log(f&#x22;the plan asked for {2 * self.max_agents} workers, twice its limit: cancelled as a runaway&#x22;)<br />
                    self.cancelled.set()<br />
                return None<br />
            t = Thread(f&#x22;{self.run_id}/t{len(self.threads) + 1:03d}&#x22;, phase or (self.current[&#x22;name&#x22;] if self.current else &#x22;&#x22;),<br />
                       label or &#x22;worker&#x22;, MODELS.get(model, model), role)<br />
            self.threads.append(t)<br />
            return t&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-3 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> _new_thread</span><span>(self, label, model, phase, role):</span></span>
<span class="line"><span>        """The next worker's thread, or None when the worker limit is reached."""</span></span>
<span class="line"><span>        with</span><span> self</span><span>.lock:</span></span>
<span class="line"><span>            if</span><span> len</span><span>(</span><span>self</span><span>.threads) </span><span>&gt;=</span><span> self</span><span>.max_agents:                      </span><span># over the limit: record what was refused</span></span>
<span class="line"><span>                self</span><span>.dropped.append(label)</span></span>
<span class="line"><span>                self</span><span>.emit(</span><span>"run.dropped"</span><span>, </span><span>label</span><span>=</span><span>label, </span><span>limit</span><span>=</span><span>self</span><span>.max_agents)</span></span>
<span class="line"><span>                if</span><span> len</span><span>(</span><span>self</span><span>.dropped) </span><span>&gt;=</span><span> self</span><span>.max_agents:                  </span><span># asking for twice the limit is treated as a runaway</span></span>
<span class="line"><span>                    self</span><span>.log(</span><span>f</span><span>"the plan asked for </span><span>{2</span><span> *</span><span> self</span><span>.max_agents</span><span>}</span><span> workers, twice its limit: cancelled as a runaway"</span><span>)</span></span>
<span class="line"><span>                    self</span><span>.cancelled.set()</span></span>
<span class="line"><span>                return</span><span> None</span></span>
<span class="line"><span>            t </span><span>=</span><span> Thread(</span><span>f</span><span>"</span><span>{self</span><span>.run_id</span><span>}</span><span>/t</span><span>{len</span><span>(</span><span>self</span><span>.threads) </span><span>+</span><span> 1</span><span>:03d</span><span>}</span><span>"</span><span>, phase </span><span>or</span><span> (</span><span>self</span><span>.current[</span><span>"name"</span><span>] </span><span>if</span><span> self</span><span>.current </span><span>else</span><span> ""</span><span>),</span></span>
<span class="line"><span>                       label </span><span>or</span><span> "worker"</span><span>, </span><span>MODELS</span><span>.get(model, model), role)</span></span>
<span class="line"><span>            self</span><span>.threads.append(t)</span></span>
<span class="line"><span>            return</span><span> t</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> _new_thread</span><span>(self, label, model, phase, role):</span></span>
<span class="line"><span>        """The next worker's thread, or None when the worker limit is reached."""</span></span>
<span class="line"><span>        with</span><span> self</span><span>.lock:</span></span>
<span class="line"><span>            if</span><span> len</span><span>(</span><span>self</span><span>.threads) </span><span>&gt;=</span><span> self</span><span>.max_agents:                      </span><span># over the limit: record what was refused</span></span>
<span class="line"><span>                self</span><span>.dropped.append(label)</span></span>
<span class="line"><span>                self</span><span>.emit(</span><span>"run.dropped"</span><span>, </span><span>label</span><span>=</span><span>label, </span><span>limit</span><span>=</span><span>self</span><span>.max_agents)</span></span>
<span class="line"><span>                if</span><span> len</span><span>(</span><span>self</span><span>.dropped) </span><span>&gt;=</span><span> self</span><span>.max_agents:                  </span><span># asking for twice the limit is treated as a runaway</span></span>
<span class="line"><span>                    self</span><span>.log(</span><span>f</span><span>"the plan asked for </span><span>{2</span><span> *</span><span> self</span><span>.max_agents</span><span>}</span><span> workers, twice its limit: cancelled as a runaway"</span><span>)</span></span>
<span class="line"><span>                    self</span><span>.cancelled.set()</span></span>
<span class="line"><span>                return</span><span> None</span></span>
<span class="line"><span>            t </span><span>=</span><span> Thread(</span><span>f</span><span>"</span><span>{self</span><span>.run_id</span><span>}</span><span>/t</span><span>{len</span><span>(</span><span>self</span><span>.threads) </span><span>+</span><span> 1</span><span>:03d</span><span>}</span><span>"</span><span>, phase </span><span>or</span><span> (</span><span>self</span><span>.current[</span><span>"name"</span><span>] </span><span>if</span><span> self</span><span>.current </span><span>else</span><span> ""</span><span>),</span></span>
<span class="line"><span>                       label </span><span>or</span><span> "worker"</span><span>, </span><span>MODELS</span><span>.get(model, model), role)</span></span>
<span class="line"><span>            self</span><span>.threads.append(t)</span></span>
<span class="line"><span>            return</span><span> t</span></span></code></pre>
<p><code>agent()</code> starts one worker and returns a checked value or <code>None</code>.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> agent</span><span>(self, prompt</span><span>=</span><span>""</span><span>, </span><span>*</span><span>, schema</span><span>=</span><span>None</span><span>, model</span><span>=</span><span>"worker"</span><span>, label</span><span>=</span><span>""</span><span>, system</span><span>=</span><span>""</span><span>, data</span><span>=</span><span>None</span><span>, sample</span><span>=</span><span>0</span><span>, role</span><span>=</span><span>"worker"</span><span>, phase</span><span>=</span><span>None</span><span>):</span></span>
<span class="line"><span>        """One worker: its checked JSON answer, or None. Only an exception that must end the whole run gets out."""</span></span>
<span class="line"><span>        if</span><span> self</span><span>.cancelled.is_set():</span></span>
<span class="line"><span>            raise</span><span> RunCancelled(</span><span>self</span><span>.run_id)</span></span>
<span class="line"><span>        t </span><span>=</span><span> self</span><span>._new_thread(label, model, phase, role)</span></span>
<span class="line"><span>        if</span><span> t </span><span>is</span><span> None</span><span>:</span></span>
<span class="line"><span>            return</span><span> None</span></span>
<span class="line"><span>        self</span><span>.emit(</span><span>"run.agent_started"</span><span>, </span><span>thread</span><span>=</span><span>t.id, </span><span>label</span><span>=</span><span>t.label, </span><span>phase</span><span>=</span><span>t.phase)</span></span>
<span class="line"><span>        with</span><span> self</span><span>.slots:                           </span><span># at most `concurrency` workers talk at the same time</span></span>
<span class="line"><span>            t.started, t.status </span><span>=</span><span> self</span><span>.elapsed(), </span><span>"running"</span></span>
<span class="line"><span>            try</span><span>:</span></span>
<span class="line"><span>                t.result </span><span>=</span><span> self</span><span>._converse(t, system, (prompt </span><span>+</span><span> "</span><span>nn</span><span>"</span><span> +</span><span> (data </span><span>or</span><span> ""</span><span>)).strip(), schema, sample)</span></span>
<span class="line"><span>                t.status </span><span>=</span><span> "done"</span><span> if</span><span> t.result </span><span>is</span><span> not</span><span> None</span><span> else</span><span> "failed"</span></span>
<span class="line"><span>            except</span><span> ABORT</span><span>:</span></span>
<span class="line"><span>                t.status </span><span>=</span><span> "failed"</span></span>
<span class="line"><span>                raise</span></span>
<span class="line"><span>            except</span><span> Exception</span><span> as</span><span> e:                 </span><span># any other failure stays the worker's own</span></span>
<span class="line"><span>                t.status, t.error </span><span>=</span><span> "failed"</span><span>, </span><span>f</span><span>"</span><span>{type</span><span>(e).</span><span>__name__}</span><span>: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>[:</span><span>300</span><span>]</span></span>
<span class="line"><span>            finally</span><span>:</span></span>
<span class="line"><span>                t.ended </span><span>=</span><span> self</span><span>.elapsed()</span></span>
<span class="line"><span>        self</span><span>.emit(</span><span>"run.agent_ended"</span><span>, </span><span>thread</span><span>=</span><span>t.id, </span><span>label</span><span>=</span><span>t.label, </span><span>phase</span><span>=</span><span>t.phase, </span><span>ok</span><span>=</span><span>t.status </span><span>==</span><span> "done"</span><span>, </span><span>credits</span><span>=</span><span>round</span><span>(t.cost, </span><span>2</span><span>),</span></span>
<span class="line"><span>                  seconds</span><span>=</span><span>round</span><span>(t.ended </span><span>-</span><span> t.started, </span><span>2</span><span>), </span><span>cached</span><span>=</span><span>bool</span><span>(t.replies) </span><span>and</span><span> all</span><span>(r.cached </span><span>for</span><span> r </span><span>in</span><span> t.replies))</span></span>
<span class="line"><span>        return</span><span> t.result</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> agent</span><span>(self, prompt</span><span>=</span><span>""</span><span>, </span><span>*</span><span>, schema</span><span>=</span><span>None</span><span>, model</span><span>=</span><span>"worker"</span><span>, label</span><span>=</span><span>""</span><span>, system</span><span>=</span><span>""</span><span>, data</span><span>=</span><span>None</span><span>, sample</span><span>=</span><span>0</span><span>, role</span><span>=</span><span>"worker"</span><span>, phase</span><span>=</span><span>None</span><span>):</span></span>
<span class="line"><span>        """One worker: its checked JSON answer, or None. Only an exception that must end the whole run gets out."""</span></span>
<span class="line"><span>        if</span><span> self</span><span>.cancelled.is_set():</span></span>
<span class="line"><span>            raise</span><span> RunCancelled(</span><span>self</span><span>.run_id)</span></span>
<span class="line"><span>        t </span><span>=</span><span> self</span><span>._new_thread(label, model, phase, role)</span></span>
<span class="line"><span>        if</span><span> t </span><span>is</span><span> None</span><span>:</span></span>
<span class="line"><span>            return</span><span> None</span></span>
<span class="line"><span>        self</span><span>.emit(</span><span>"run.agent_started"</span><span>, </span><span>thread</span><span>=</span><span>t.id, </span><span>label</span><span>=</span><span>t.label, </span><span>phase</span><span>=</span><span>t.phase)</span></span>
<span class="line"><span>        with</span><span> self</span><span>.slots:                           </span><span># at most `concurrency` workers talk at the same time</span></span>
<span class="line"><span>            t.started, t.status </span><span>=</span><span> self</span><span>.elapsed(), </span><span>"running"</span></span>
<span class="line"><span>            try</span><span>:</span></span>
<span class="line"><span>                t.result </span><span>=</span><span> self</span><span>._converse(t, system, (prompt </span><span>+</span><span> "</span><span>nn</span><span>"</span><span> +</span><span> (data </span><span>or</span><span> ""</span><span>)).strip(), schema, sample)</span></span>
<span class="line"><span>                t.status </span><span>=</span><span> "done"</span><span> if</span><span> t.result </span><span>is</span><span> not</span><span> None</span><span> else</span><span> "failed"</span></span>
<span class="line"><span>            except</span><span> ABORT</span><span>:</span></span>
<span class="line"><span>                t.status </span><span>=</span><span> "failed"</span></span>
<span class="line"><span>                raise</span></span>
<span class="line"><span>            except</span><span> Exception</span><span> as</span><span> e:                 </span><span># any other failure stays the worker's own</span></span>
<span class="line"><span>                t.status, t.error </span><span>=</span><span> "failed"</span><span>, </span><span>f</span><span>"</span><span>{type</span><span>(e).</span><span>__name__}</span><span>: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>[:</span><span>300</span><span>]</span></span>
<span class="line"><span>            finally</span><span>:</span></span>
<span class="line"><span>                t.ended </span><span>=</span><span> self</span><span>.elapsed()</span></span>
<span class="line"><span>        self</span><span>.emit(</span><span>"run.agent_ended"</span><span>, </span><span>thread</span><span>=</span><span>t.id, </span><span>label</span><span>=</span><span>t.label, </span><span>phase</span><span>=</span><span>t.phase, </span><span>ok</span><span>=</span><span>t.status </span><span>==</span><span> "done"</span><span>, </span><span>credits</span><span>=</span><span>round</span><span>(t.cost, </span><span>2</span><span>),</span></span>
<span class="line"><span>                  seconds</span><span>=</span><span>round</span><span>(t.ended </span><span>-</span><span> t.started, </span><span>2</span><span>), </span><span>cached</span><span>=</span><span>bool</span><span>(t.replies) </span><span>and</span><span> all</span><span>(r.cached </span><span>for</span><span> r </span><span>in</span><span> t.replies))</span></span>
<span class="line"><span>        return</span><span> t.result</span></span></code></pre>
<p>First we pull the JSON out of a reply.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>def</span><span> extract_json</span><span>(text):</span></span>
<span class="line"><span>    """The first JSON object in a reply, even inside a code fence."""</span></span>
<span class="line"><span>    t </span><span>=</span><span> re.sub(</span><span>r</span><span>"</span><span>^</span><span>`</span><span>{3}</span><span>[a-zA-Z]</span><span>*</span><span>s</span><span>*|</span><span>s</span><span>*</span><span>`</span><span>{3}</span><span>$</span><span>"</span><span>, </span><span>""</span><span>, text.strip())     </span><span># `{3} is three backticks</span></span>
<span class="line"><span>    for</span><span> start </span><span>in</span><span> [i </span><span>for</span><span> i, c </span><span>in</span><span> enumerate</span><span>(t) </span><span>if</span><span> c </span><span>==</span><span> "{"</span><span>]:</span></span>
<span class="line"><span>        try</span><span>:</span></span>
<span class="line"><span>            return</span><span> json.JSONDecoder().raw_decode(t[start:])[</span><span>0</span><span>]</span></span>
<span class="line"><span>        except</span><span> ValueError</span><span>:</span></span>
<span class="line"><span>            continue</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>def</span><span> extract_json</span><span>(text):</span></span>
<span class="line"><span>    """The first JSON object in a reply, even inside a code fence."""</span></span>
<span class="line"><span>    t </span><span>=</span><span> re.sub(</span><span>r</span><span>"</span><span>^</span><span>`</span><span>{3}</span><span>[a-zA-Z]</span><span>*</span><span>s</span><span>*|</span><span>s</span><span>*</span><span>`</span><span>{3}</span><span>$</span><span>"</span><span>, </span><span>""</span><span>, text.strip())     </span><span># `{3} is three backticks</span></span>
<span class="line"><span>    for</span><span> start </span><span>in</span><span> [i </span><span>for</span><span> i, c </span><span>in</span><span> enumerate</span><span>(t) </span><span>if</span><span> c </span><span>==</span><span> "{"</span><span>]:</span></span>
<span class="line"><span>        try</span><span>:</span></span>
<span class="line"><span>            return</span><span> json.JSONDecoder().raw_decode(t[start:])[</span><span>0</span><span>]</span></span>
<span class="line"><span>        except</span><span> ValueError</span><span>:</span></span>
<span class="line"><span>            continue</span></span></code></pre>
<p><code>validate</code> turns schema errors into short lines a model can fix.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>def</span><span> validate</span><span>(obj, schema):</span></span>
<span class="line"><span>    if</span><span> obj </span><span>is</span><span> None</span><span>:</span></span>
<span class="line"><span>        return</span><span> [</span><span>"the reply is not a JSON object"</span><span>]</span></span>
<span class="line"><span>    # at most eight short problems the model can fix</span></span>
<span class="line"><span>    errors </span><span>=</span><span> sorted</span><span>(Draft202012Validator(schema).iter_errors(obj), </span><span>key</span><span>=lambda</span><span> e: </span><span>list</span><span>(e.path))</span></span>
<span class="line"><span>    return</span><span> [</span><span>f</span><span>"</span><span>{</span><span>'/'</span><span>.join(</span><span>map</span><span>(</span><span>str</span><span>, e.path)) </span><span>or</span><span> 'top level'</span><span>}</span><span>: </span><span>{</span><span>e.message[:</span><span>120</span><span>]</span><span>}</span><span>"</span><span> for</span><span> e </span><span>in</span><span> errors[:</span><span>8</span><span>]]</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>def</span><span> validate</span><span>(obj, schema):</span></span>
<span class="line"><span>    if</span><span> obj </span><span>is</span><span> None</span><span>:</span></span>
<span class="line"><span>        return</span><span> [</span><span>"the reply is not a JSON object"</span><span>]</span></span>
<span class="line"><span>    # at most eight short problems the model can fix</span></span>
<span class="line"><span>    errors </span><span>=</span><span> sorted</span><span>(Draft202012Validator(schema).iter_errors(obj), </span><span>key</span><span>=lambda</span><span> e: </span><span>list</span><span>(e.path))</span></span>
<span class="line"><span>    return</span><span> [</span><span>f</span><span>"</span><span>{</span><span>'/'</span><span>.join(</span><span>map</span><span>(</span><span>str</span><span>, e.path)) </span><span>or</span><span> 'top level'</span><span>}</span><span>: </span><span>{</span><span>e.message[:</span><span>120</span><span>]</span><span>}</span><span>"</span><span> for</span><span> e </span><span>in</span><span> errors[:</span><span>8</span><span>]]</span></span></code></pre>
<p>A worker&#8217;s conversation has at most two turns.</p>
<p>Those turns live in <code>_converse</code>.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> _converse</span><span>(self, t, system, user, schema, sample):</span></span>
<span class="line"><span>        params </span><span>=</span><span> {</span><span>"temperature"</span><span>: </span><span>TEMPERATURE</span><span>, </span><span>"top_p"</span><span>: </span><span>TOP_P</span><span>, </span><span>"max_tokens"</span><span>: </span><span>16000</span><span>}</span></span>
<span class="line"><span>        if</span><span> schema </span><span>is</span><span> not</span><span> None</span><span>:</span></span>
<span class="line"><span>            params[</span><span>"response_format"</span><span>] </span><span>=</span><span> {</span><span>"type"</span><span>: </span><span>"json_object"</span><span>}      </span><span># JSON mode when the plan wants a schema</span></span>
<span class="line"><span>        if</span><span> t.model </span><span>==</span><span> MODELS</span><span>[</span><span>"worker"</span><span>] </span><span>or</span><span> t.role </span><span>==</span><span> "scan"</span><span>:</span></span>
<span class="line"><span>            params[</span><span>"enable_thinking"</span><span>] </span><span>=</span><span> False</span><span>      # thinking doubled recall but took 50 times as long</span></span>
<span class="line"><span>        t.messages </span><span>=</span><span> ([{</span><span>"role"</span><span>: </span><span>"system"</span><span>, </span><span>"content"</span><span>: system}] </span><span>if</span><span> system </span><span>else</span><span> []) </span><span>+</span><span> [{</span><span>"role"</span><span>: </span><span>"user"</span><span>, </span><span>"content"</span><span>: user}]</span></span>
<span class="line"><span>        for</span><span> turn </span><span>in</span><span> range</span><span>(</span><span>2</span><span>):                      </span><span># the first answer, then at most one repair</span></span>
<span class="line"><span>            r </span><span>=</span><span> self</span><span>.llm.chat(t.model, t.messages, </span><span>role</span><span>=</span><span>t.role, </span><span>sample</span><span>=</span><span>sample, </span><span>**</span><span>params)</span></span>
<span class="line"><span>            t.replies.append(r)</span></span>
<span class="line"><span>            t.cost </span><span>+=</span><span> 0</span><span> if</span><span> r.cached </span><span>else</span><span> PRICE</span><span>.get(t.model, </span><span>0.2</span><span>)</span></span>
<span class="line"><span>            obj </span><span>=</span><span> r.text </span><span>if</span><span> schema </span><span>is</span><span> None</span><span> else</span><span> extract_json(r.text)</span></span>
<span class="line"><span>            errors </span><span>=</span><span> [] </span><span>if</span><span> schema </span><span>is</span><span> None</span><span> else</span><span> validate(obj, schema)</span></span>
<span class="line"><span>            if</span><span> not</span><span> errors:</span></span>
<span class="line"><span>                return</span><span> obj</span></span>
<span class="line"><span>            # the repair turn lists the problems</span></span>
<span class="line"><span>            t.messages </span><span>+=</span><span> [{</span><span>"role"</span><span>: </span><span>"assistant"</span><span>, </span><span>"content"</span><span>: r.text[:</span><span>6000</span><span>]},</span></span>
<span class="line"><span>                           {</span><span>"role"</span><span>: </span><span>"user"</span><span>, </span><span>"content"</span><span>: </span><span>"Your answer does not match the schema:</span><span>n</span><span>- "</span><span> +</span><span> "</span><span>n</span><span>- "</span><span>.join(errors)</span></span>
<span class="line"><span>                            +</span><span> "</span><span>n</span><span>Send the corrected JSON object only."</span><span>}]</span></span>
<span class="line"><span>        t.error </span><span>=</span><span> "schema: "</span><span> +</span><span> " | "</span><span>.join(errors)[:</span><span>240</span><span>]</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> _converse</span><span>(self, t, system, user, schema, sample):</span></span>
<span class="line"><span>        params </span><span>=</span><span> {</span><span>"temperature"</span><span>: </span><span>TEMPERATURE</span><span>, </span><span>"top_p"</span><span>: </span><span>TOP_P</span><span>, </span><span>"max_tokens"</span><span>: </span><span>16000</span><span>}</span></span>
<span class="line"><span>        if</span><span> schema </span><span>is</span><span> not</span><span> None</span><span>:</span></span>
<span class="line"><span>            params[</span><span>"response_format"</span><span>] </span><span>=</span><span> {</span><span>"type"</span><span>: </span><span>"json_object"</span><span>}      </span><span># JSON mode when the plan wants a schema</span></span>
<span class="line"><span>        if</span><span> t.model </span><span>==</span><span> MODELS</span><span>[</span><span>"worker"</span><span>] </span><span>or</span><span> t.role </span><span>==</span><span> "scan"</span><span>:</span></span>
<span class="line"><span>            params[</span><span>"enable_thinking"</span><span>] </span><span>=</span><span> False</span><span>      # thinking doubled recall but took 50 times as long</span></span>
<span class="line"><span>        t.messages </span><span>=</span><span> ([{</span><span>"role"</span><span>: </span><span>"system"</span><span>, </span><span>"content"</span><span>: system}] </span><span>if</span><span> system </span><span>else</span><span> []) </span><span>+</span><span> [{</span><span>"role"</span><span>: </span><span>"user"</span><span>, </span><span>"content"</span><span>: user}]</span></span>
<span class="line"><span>        for</span><span> turn </span><span>in</span><span> range</span><span>(</span><span>2</span><span>):                      </span><span># the first answer, then at most one repair</span></span>
<span class="line"><span>            r </span><span>=</span><span> self</span><span>.llm.chat(t.model, t.messages, </span><span>role</span><span>=</span><span>t.role, </span><span>sample</span><span>=</span><span>sample, </span><span>**</span><span>params)</span></span>
<span class="line"><span>            t.replies.append(r)</span></span>
<span class="line"><span>            t.cost </span><span>+=</span><span> 0</span><span> if</span><span> r.cached </span><span>else</span><span> PRICE</span><span>.get(t.model, </span><span>0.2</span><span>)</span></span>
<span class="line"><span>            obj </span><span>=</span><span> r.text </span><span>if</span><span> schema </span><span>is</span><span> None</span><span> else</span><span> extract_json(r.text)</span></span>
<span class="line"><span>            errors </span><span>=</span><span> [] </span><span>if</span><span> schema </span><span>is</span><span> None</span><span> else</span><span> validate(obj, schema)</span></span>
<span class="line"><span>            if</span><span> not</span><span> errors:</span></span>
<span class="line"><span>                return</span><span> obj</span></span>
<span class="line"><span>            # the repair turn lists the problems</span></span>
<span class="line"><span>            t.messages </span><span>+=</span><span> [{</span><span>"role"</span><span>: </span><span>"assistant"</span><span>, </span><span>"content"</span><span>: r.text[:</span><span>6000</span><span>]},</span></span>
<span class="line"><span>                           {</span><span>"role"</span><span>: </span><span>"user"</span><span>, </span><span>"content"</span><span>: </span><span>"Your answer does not match the schema:</span><span>n</span><span>- "</span><span> +</span><span> "</span><span>n</span><span>- "</span><span>.join(errors)</span></span>
<span class="line"><span>                            +</span><span> "</span><span>n</span><span>Send the corrected JSON object only."</span><span>}]</span></span>
<span class="line"><span>        t.error </span><span>=</span><span> "schema: "</span><span> +</span><span> " | "</span><span>.join(errors)[:</span><span>240</span><span>]</span></span></code></pre>
<p><code>run_sync</code> runs a whole plan.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> run_sync</span><span>(self, plan):</span></span>
<span class="line"><span>        self</span><span>.status </span><span>=</span><span> "running"</span></span>
<span class="line"><span>        self</span><span>.emit(</span><span>"run.created"</span><span>, </span><span>title</span><span>=</span><span>self</span><span>.title)</span></span>
<span class="line"><span>        try</span><span>:</span></span>
<span class="line"><span>            self</span><span>.result </span><span>=</span><span> plan(</span><span>self</span><span>)</span></span>
<span class="line"><span>            self</span><span>.status </span><span>=</span><span> "completed"</span></span>
<span class="line"><span>        except</span><span> RunCancelled:</span></span>
<span class="line"><span>            self</span><span>.status </span><span>=</span><span> "cancelled"</span></span>
<span class="line"><span>        except</span><span> Exception</span><span> as</span><span> e:                     </span><span># includes the aborts that end a run</span></span>
<span class="line"><span>            self</span><span>.status, </span><span>self</span><span>.error </span><span>=</span><span> "failed"</span><span>, </span><span>f</span><span>"</span><span>{type</span><span>(e).</span><span>__name__}</span><span>: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>[:</span><span>300</span><span>]</span></span>
<span class="line"><span>        finally</span><span>:                                   </span><span># always close the last phase</span></span>
<span class="line"><span>            self</span><span>.phase(</span><span>None</span><span>)</span></span>
<span class="line"><span>            self</span><span>.emit(</span><span>"run.ended"</span><span>, </span><span>status</span><span>=</span><span>self</span><span>.status, </span><span>seconds</span><span>=</span><span>round</span><span>(</span><span>self</span><span>.elapsed(), </span><span>2</span><span>), </span><span>agents</span><span>=</span><span>len</span><span>(</span><span>self</span><span>.threads),</span></span>
<span class="line"><span>                      credits</span><span>=</span><span>round</span><span>(</span><span>sum</span><span>(t.cost </span><span>for</span><span> t </span><span>in</span><span> self</span><span>.threads), </span><span>2</span><span>))</span></span>
<span class="line"><span>        return</span><span> self</span><span>.result</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> run_sync</span><span>(self, plan):</span></span>
<span class="line"><span>        self</span><span>.status </span><span>=</span><span> "running"</span></span>
<span class="line"><span>        self</span><span>.emit(</span><span>"run.created"</span><span>, </span><span>title</span><span>=</span><span>self</span><span>.title)</span></span>
<span class="line"><span>        try</span><span>:</span></span>
<span class="line"><span>            self</span><span>.result </span><span>=</span><span> plan(</span><span>self</span><span>)</span></span>
<span class="line"><span>            self</span><span>.status </span><span>=</span><span> "completed"</span></span>
<span class="line"><span>        except</span><span> RunCancelled:</span></span>
<span class="line"><span>            self</span><span>.status </span><span>=</span><span> "cancelled"</span></span>
<span class="line"><span>        except</span><span> Exception</span><span> as</span><span> e:                     </span><span># includes the aborts that end a run</span></span>
<span class="line"><span>            self</span><span>.status, </span><span>self</span><span>.error </span><span>=</span><span> "failed"</span><span>, </span><span>f</span><span>"</span><span>{type</span><span>(e).</span><span>__name__}</span><span>: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>[:</span><span>300</span><span>]</span></span>
<span class="line"><span>        finally</span><span>:                                   </span><span># always close the last phase</span></span>
<span class="line"><span>            self</span><span>.phase(</span><span>None</span><span>)</span></span>
<span class="line"><span>            self</span><span>.emit(</span><span>"run.ended"</span><span>, </span><span>status</span><span>=</span><span>self</span><span>.status, </span><span>seconds</span><span>=</span><span>round</span><span>(</span><span>self</span><span>.elapsed(), </span><span>2</span><span>), </span><span>agents</span><span>=</span><span>len</span><span>(</span><span>self</span><span>.threads),</span></span>
<span class="line"><span>                      credits</span><span>=</span><span>round</span><span>(</span><span>sum</span><span>(t.cost </span><span>for</span><span> t </span><span>in</span><span> self</span><span>.threads), </span><span>2</span><span>))</span></span>
<span class="line"><span>        return</span><span> self</span><span>.result</span></span></code></pre>
<p><code>parallel</code> runs thunks, functions with no arguments, all at once. It is a <strong>barrier</strong>: it returns when the slowest is done.</p>
<p>In one fixed-plan scan phase, finished workers waited 37 worker-minutes for the slowest.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> parallel</span><span>(self, thunks):</span></span>
<span class="line"><span>        thunks </span><span>=</span><span> list</span><span>(thunks)</span></span>
<span class="line"><span>        out, aborts </span><span>=</span><span> [</span><span>None</span><span>] </span><span>*</span><span> len</span><span>(thunks), []</span></span>
<span class="line"><span>        # one task per thunk, up to 64 threads</span></span>
<span class="line"><span>        with</span><span> cf.ThreadPoolExecutor(</span><span>max</span><span>(</span><span>1</span><span>, </span><span>min</span><span>(</span><span>len</span><span>(thunks), </span><span>64</span><span>))) </span><span>as</span><span> pool:</span></span>
<span class="line"><span>            futures </span><span>=</span><span> {pool.submit(fn): i </span><span>for</span><span> i, fn </span><span>in</span><span> enumerate</span><span>(thunks)}</span></span>
<span class="line"><span>            for</span><span> f </span><span>in</span><span> cf.as_completed(futures):</span></span>
<span class="line"><span>                try</span><span>:</span></span>
<span class="line"><span>                    out[futures[f]] </span><span>=</span><span> f.result()      </span><span># results keep the order of the thunks</span></span>
<span class="line"><span>                except</span><span> ABORT</span><span> as</span><span> e:</span></span>
<span class="line"><span>                    aborts.append(e)</span></span>
<span class="line"><span>                    self</span><span>.cancelled.set()           </span><span># stop the work that has not started yet</span></span>
<span class="line"><span>                except</span><span> Exception</span><span> as</span><span> e:</span></span>
<span class="line"><span>                    self</span><span>.log(</span><span>f</span><span>"a parallel task failed: </span><span>{type</span><span>(e).</span><span>__name__}</span><span>: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"><span>        if</span><span> aborts:                                 </span><span># the first abort ends the phase for everyone</span></span>
<span class="line"><span>            raise</span><span> aborts[</span><span>0</span><span>]</span></span>
<span class="line"><span>        return</span><span> out</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> parallel</span><span>(self, thunks):</span></span>
<span class="line"><span>        thunks </span><span>=</span><span> list</span><span>(thunks)</span></span>
<span class="line"><span>        out, aborts </span><span>=</span><span> [</span><span>None</span><span>] </span><span>*</span><span> len</span><span>(thunks), []</span></span>
<span class="line"><span>        # one task per thunk, up to 64 threads</span></span>
<span class="line"><span>        with</span><span> cf.ThreadPoolExecutor(</span><span>max</span><span>(</span><span>1</span><span>, </span><span>min</span><span>(</span><span>len</span><span>(thunks), </span><span>64</span><span>))) </span><span>as</span><span> pool:</span></span>
<span class="line"><span>            futures </span><span>=</span><span> {pool.submit(fn): i </span><span>for</span><span> i, fn </span><span>in</span><span> enumerate</span><span>(thunks)}</span></span>
<span class="line"><span>            for</span><span> f </span><span>in</span><span> cf.as_completed(futures):</span></span>
<span class="line"><span>                try</span><span>:</span></span>
<span class="line"><span>                    out[futures[f]] </span><span>=</span><span> f.result()      </span><span># results keep the order of the thunks</span></span>
<span class="line"><span>                except</span><span> ABORT</span><span> as</span><span> e:</span></span>
<span class="line"><span>                    aborts.append(e)</span></span>
<span class="line"><span>                    self</span><span>.cancelled.set()           </span><span># stop the work that has not started yet</span></span>
<span class="line"><span>                except</span><span> Exception</span><span> as</span><span> e:</span></span>
<span class="line"><span>                    self</span><span>.log(</span><span>f</span><span>"a parallel task failed: </span><span>{type</span><span>(e).</span><span>__name__}</span><span>: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"><span>        if</span><span> aborts:                                 </span><span># the first abort ends the phase for everyone</span></span>
<span class="line"><span>            raise</span><span> aborts[</span><span>0</span><span>]</span></span>
<span class="line"><span>        return</span><span> out</span></span></code></pre>
<p>One worker on the fake client shows the events a run records:</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>from</span><span> runtime </span><span>import</span><span> Run</span></span>
<span class="line"></span>
<span class="line"><span>SCHEMA</span><span> =</span><span> {</span><span>"type"</span><span>: </span><span>"object"</span><span>, </span><span>"required"</span><span>: [</span><span>"answer"</span><span>]}</span></span>
<span class="line"><span>run </span><span>=</span><span> Run(</span><span>"one worker"</span><span>, </span><span>llm</span><span>=</span><span>llm)</span></span>
<span class="line"><span>run.run_sync(</span><span>lambda</span><span> r: (r.phase(</span><span>"Scan"</span><span>), r.agent(</span><span>"hello"</span><span>, </span><span>schema</span><span>=</span><span>SCHEMA</span><span>, </span><span>label</span><span>=</span><span>"scan#0"</span><span>))[</span><span>1</span><span>])</span></span>
<span class="line"><span>t </span><span>=</span><span> run.threads[</span><span>0</span><span>]</span></span>
<span class="line"><span>print</span><span>([e[</span><span>"type"</span><span>][</span><span>4</span><span>:] </span><span>for</span><span> e </span><span>in</span><span> run.events])</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"</span><span>{</span><span>t.id</span><span>}</span><span> | </span><span>{</span><span>t.phase</span><span>}</span><span> | </span><span>{</span><span>t.label</span><span>}</span><span> | </span><span>{</span><span>t.status</span><span>}</span><span> | </span><span>{</span><span>t.cost</span><span>}</span><span> credits | </span><span>{len</span><span>(t.replies)</span><span>}</span><span> reply"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>[</span><span>'created'</span><span>, </span><span>'phase_started'</span><span>, </span><span>'agent_started'</span><span>, </span><span>'agent_ended'</span><span>, </span><span>'phase_ended'</span><span>, </span><span>'ended'</span><span>]</span></span>
<span class="line"><span>one</span><span>-</span><span>worker</span><span>/</span><span>t001 </span><span>|</span><span> Scan </span><span>|</span><span> scan</span><span>#0 | done | 0.2 credits | 1 reply</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>from</span><span> runtime </span><span>import</span><span> Run</span></span>
<span class="line"></span>
<span class="line"><span>SCHEMA</span><span> =</span><span> {</span><span>"type"</span><span>: </span><span>"object"</span><span>, </span><span>"required"</span><span>: [</span><span>"answer"</span><span>]}</span></span>
<span class="line"><span>run </span><span>=</span><span> Run(</span><span>"one worker"</span><span>, </span><span>llm</span><span>=</span><span>llm)</span></span>
<span class="line"><span>run.run_sync(</span><span>lambda</span><span> r: (r.phase(</span><span>"Scan"</span><span>), r.agent(</span><span>"hello"</span><span>, </span><span>schema</span><span>=</span><span>SCHEMA</span><span>, </span><span>label</span><span>=</span><span>"scan#0"</span><span>))[</span><span>1</span><span>])</span></span>
<span class="line"><span>t </span><span>=</span><span> run.threads[</span><span>0</span><span>]</span></span>
<span class="line"><span>print</span><span>([e[</span><span>"type"</span><span>][</span><span>4</span><span>:] </span><span>for</span><span> e </span><span>in</span><span> run.events])</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"</span><span>{</span><span>t.id</span><span>}</span><span> | </span><span>{</span><span>t.phase</span><span>}</span><span> | </span><span>{</span><span>t.label</span><span>}</span><span> | </span><span>{</span><span>t.status</span><span>}</span><span> | </span><span>{</span><span>t.cost</span><span>}</span><span> credits | </span><span>{len</span><span>(t.replies)</span><span>}</span><span> reply"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>[</span><span>'created'</span><span>, </span><span>'phase_started'</span><span>, </span><span>'agent_started'</span><span>, </span><span>'agent_ended'</span><span>, </span><span>'phase_ended'</span><span>, </span><span>'ended'</span><span>]</span></span>
<span class="line"><span>one</span><span>-</span><span>worker</span><span>/</span><span>t001 </span><span>|</span><span> Scan </span><span>|</span><span> scan</span><span>#0 | done | 0.2 credits | 1 reply</span></span></code></pre>
<p>A real worker on the library read 100,911 tokens and took 18.7 seconds.</p>
<h3>Session Budget and Recovery</h3>
<p>All workers draw on one meter. At the cap a worker waits until a person raises it.</p>
<p><code>admit</code> reserves a call&#8217;s price first.</p>
<p>							 self.cap + 1e-9:<br />
                self.paused = True<br />
                self.cond.wait(timeout=1.0)<br />
            self.paused = False<br />
            self.reserved += cost&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-3 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>class</span><span> Budget</span><span>:</span></span>
<span class="line"><span>    def</span><span> __init__</span><span>(self, cap):</span></span>
<span class="line"><span>        # spent is billed, reserved is held for calls in flight</span></span>
<span class="line"><span>        self</span><span>.cap, </span><span>self</span><span>.spent, </span><span>self</span><span>.reserved, </span><span>self</span><span>.paused </span><span>=</span><span> float</span><span>(cap), </span><span>0.0</span><span>, </span><span>0.0</span><span>, </span><span>False</span></span>
<span class="line"><span>        self</span><span>.cond </span><span>=</span><span> threading.Condition()</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> admit</span><span>(self, cost):</span></span>
<span class="line"><span>        with</span><span> self</span><span>.cond:                               </span><span># reserve the price, or wait here until the cap is raised</span></span>
<span class="line"><span>            while</span><span> self</span><span>.spent </span><span>+</span><span> self</span><span>.reserved </span><span>+</span><span> cost </span><span>&gt;</span><span> self</span><span>.cap </span><span>+</span><span> 1e-9</span><span>:</span></span>
<span class="line"><span>                self</span><span>.paused </span><span>=</span><span> True</span></span>
<span class="line"><span>                self</span><span>.cond.wait(</span><span>timeout</span><span>=</span><span>1.0</span><span>)</span></span>
<span class="line"><span>            self</span><span>.paused </span><span>=</span><span> False</span></span>
<span class="line"><span>            self</span><span>.reserved </span><span>+=</span><span> cost</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>class</span><span> Budget</span><span>:</span></span>
<span class="line"><span>    def</span><span> __init__</span><span>(self, cap):</span></span>
<span class="line"><span>        # spent is billed, reserved is held for calls in flight</span></span>
<span class="line"><span>        self</span><span>.cap, </span><span>self</span><span>.spent, </span><span>self</span><span>.reserved, </span><span>self</span><span>.paused </span><span>=</span><span> float</span><span>(cap), </span><span>0.0</span><span>, </span><span>0.0</span><span>, </span><span>False</span></span>
<span class="line"><span>        self</span><span>.cond </span><span>=</span><span> threading.Condition()</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> admit</span><span>(self, cost):</span></span>
<span class="line"><span>        with</span><span> self</span><span>.cond:                               </span><span># reserve the price, or wait here until the cap is raised</span></span>
<span class="line"><span>            while</span><span> self</span><span>.spent </span><span>+</span><span> self</span><span>.reserved </span><span>+</span><span> cost </span><span>&gt;</span><span> self</span><span>.cap </span><span>+</span><span> 1e-9</span><span>:</span></span>
<span class="line"><span>                self</span><span>.paused </span><span>=</span><span> True</span></span>
<span class="line"><span>                self</span><span>.cond.wait(</span><span>timeout</span><span>=</span><span>1.0</span><span>)</span></span>
<span class="line"><span>            self</span><span>.paused </span><span>=</span><span> False</span></span>
<span class="line"><span>            self</span><span>.reserved </span><span>+=</span><span> cost</span></span></code></pre>
<p><code>settle</code> bills it, and <code>raise_to</code> lifts the cap.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>    def</span><span> settle</span><span>(self, reserved, actual):</span></span>
<span class="line"><span>        with</span><span> self</span><span>.cond:                               </span><span># a reservation becomes spending, or is released if the call was not billed</span></span>
<span class="line"><span>            self</span><span>.reserved </span><span>-=</span><span> reserved</span></span>
<span class="line"><span>            self</span><span>.spent </span><span>+=</span><span> actual</span></span>
<span class="line"><span>            self</span><span>.cond.notify_all()</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> raise_to</span><span>(self, cap):</span></span>
<span class="line"><span>        with</span><span> self</span><span>.cond:                               </span><span># raising the cap wakes every waiting worker</span></span>
<span class="line"><span>            self</span><span>.cap, </span><span>self</span><span>.paused </span><span>=</span><span> float</span><span>(cap), </span><span>False</span></span>
<span class="line"><span>            self</span><span>.cond.notify_all()</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># llm.py</span></span>
<span class="line"><span>    def</span><span> settle</span><span>(self, reserved, actual):</span></span>
<span class="line"><span>        with</span><span> self</span><span>.cond:                               </span><span># a reservation becomes spending, or is released if the call was not billed</span></span>
<span class="line"><span>            self</span><span>.reserved </span><span>-=</span><span> reserved</span></span>
<span class="line"><span>            self</span><span>.spent </span><span>+=</span><span> actual</span></span>
<span class="line"><span>            self</span><span>.cond.notify_all()</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> raise_to</span><span>(self, cap):</span></span>
<span class="line"><span>        with</span><span> self</span><span>.cond:                               </span><span># raising the cap wakes every waiting worker</span></span>
<span class="line"><span>            self</span><span>.cap, </span><span>self</span><span>.paused </span><span>=</span><span> float</span><span>(cap), </span><span>False</span></span>
<span class="line"><span>            self</span><span>.cond.notify_all()</span></span></code></pre>
<p><code>start</code> runs a long plan on its own thread.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> start</span><span>(self, plan):</span></span>
<span class="line"><span>        # the plan runs on its own thread</span></span>
<span class="line"><span>        self</span><span>._worker </span><span>=</span><span> threading.Thread(</span><span>target</span><span>=</span><span>self</span><span>.run_sync, </span><span>args</span><span>=</span><span>(plan,), </span><span>daemon</span><span>=</span><span>True</span><span>)</span></span>
<span class="line"><span>        self</span><span>._worker.start()</span></span>
<span class="line"><span>        return</span><span> self</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> wait</span><span>(self):</span></span>
<span class="line"><span>        self</span><span>._worker.join()                        </span><span># block until the plan has finished</span></span>
<span class="line"><span>        return</span><span> self</span><span>.result</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> cancel</span><span>(self):</span></span>
<span class="line"><span>        self</span><span>.cancelled.set()                       </span><span># workers already talking finish, new ones are refused</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> start</span><span>(self, plan):</span></span>
<span class="line"><span>        # the plan runs on its own thread</span></span>
<span class="line"><span>        self</span><span>._worker </span><span>=</span><span> threading.Thread(</span><span>target</span><span>=</span><span>self</span><span>.run_sync, </span><span>args</span><span>=</span><span>(plan,), </span><span>daemon</span><span>=</span><span>True</span><span>)</span></span>
<span class="line"><span>        self</span><span>._worker.start()</span></span>
<span class="line"><span>        return</span><span> self</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> wait</span><span>(self):</span></span>
<span class="line"><span>        self</span><span>._worker.join()                        </span><span># block until the plan has finished</span></span>
<span class="line"><span>        return</span><span> self</span><span>.result</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> cancel</span><span>(self):</span></span>
<span class="line"><span>        self</span><span>.cancelled.set()                       </span><span># workers already talking finish, new ones are refused</span></span></code></pre>
<p><code>statusline</code> answers &#8220;how is it going?&#8221; from any thread.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> statusline</span><span>(self):</span></span>
<span class="line"><span>        """One line answering 'how is it going?' from any thread."""</span></span>
<span class="line"><span>        n </span><span>=</span><span> collections.Counter(t.status </span><span>for</span><span> t </span><span>in</span><span> self</span><span>.threads)</span></span>
<span class="line"><span>        return</span><span> (</span><span>f</span><span>"</span><span>{self</span><span>.run_id</span><span>}</span><span> | </span><span>{self</span><span>.status</span><span>}</span><span> | phase </span><span>{len</span><span>(</span><span>self</span><span>.phases)</span><span>}</span><span>: </span><span>{self</span><span>.current[</span><span>'name'</span><span>] </span><span>if</span><span> self</span><span>.current </span><span>else</span><span> '-'</span><span>}</span><span> | "</span></span>
<span class="line"><span>                f</span><span>"</span><span>{</span><span>n[</span><span>'running'</span><span>]</span><span>}</span><span> running, </span><span>{</span><span>n[</span><span>'done'</span><span>]</span><span>}</span><span> done, </span><span>{</span><span>n[</span><span>'failed'</span><span>]</span><span>}</span><span> failed | </span><span>{sum</span><span>(t.cost </span><span>for</span><span> t </span><span>in</span><span> self</span><span>.threads)</span><span>:.1f</span><span>}</span><span> credits | "</span></span>
<span class="line"><span>                f</span><span>"</span><span>{self</span><span>.elapsed()</span><span>:.1f</span><span>}</span><span>s"</span><span> +</span><span> (</span><span>" | PAUSED at the budget"</span><span> if</span><span> self</span><span>.llm.budget.paused </span><span>else</span><span> ""</span><span>))</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># runtime.py</span></span>
<span class="line"><span>    def</span><span> statusline</span><span>(self):</span></span>
<span class="line"><span>        """One line answering 'how is it going?' from any thread."""</span></span>
<span class="line"><span>        n </span><span>=</span><span> collections.Counter(t.status </span><span>for</span><span> t </span><span>in</span><span> self</span><span>.threads)</span></span>
<span class="line"><span>        return</span><span> (</span><span>f</span><span>"</span><span>{self</span><span>.run_id</span><span>}</span><span> | </span><span>{self</span><span>.status</span><span>}</span><span> | phase </span><span>{len</span><span>(</span><span>self</span><span>.phases)</span><span>}</span><span>: </span><span>{self</span><span>.current[</span><span>'name'</span><span>] </span><span>if</span><span> self</span><span>.current </span><span>else</span><span> '-'</span><span>}</span><span> | "</span></span>
<span class="line"><span>                f</span><span>"</span><span>{</span><span>n[</span><span>'running'</span><span>]</span><span>}</span><span> running, </span><span>{</span><span>n[</span><span>'done'</span><span>]</span><span>}</span><span> done, </span><span>{</span><span>n[</span><span>'failed'</span><span>]</span><span>}</span><span> failed | </span><span>{sum</span><span>(t.cost </span><span>for</span><span> t </span><span>in</span><span> self</span><span>.threads)</span><span>:.1f</span><span>}</span><span> credits | "</span></span>
<span class="line"><span>                f</span><span>"</span><span>{self</span><span>.elapsed()</span><span>:.1f</span><span>}</span><span>s"</span><span> +</span><span> (</span><span>" | PAUSED at the budget"</span><span> if</span><span> self</span><span>.llm.budget.paused </span><span>else</span><span> ""</span><span>))</span></span></code></pre>
<p>Forty workers get a cap of 5 credits, enough for 25 calls at 0.2 each.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>from</span><span> llm </span><span>import</span><span> Budget</span></span>
<span class="line"></span>
<span class="line"><span>paid.clear()</span></span>
<span class="line"><span>capped </span><span>=</span><span> LLM(Ledger(</span><span>":memory:"</span><span>), </span><span>client</span><span>=</span><span>fake_client, </span><span>budget</span><span>=</span><span>Budget(</span><span>5.0</span><span>))</span></span>
<span class="line"><span>run </span><span>=</span><span> Run(</span><span>"forty workers"</span><span>, </span><span>llm</span><span>=</span><span>capped, </span><span>concurrency</span><span>=</span><span>10</span><span>)</span></span>
<span class="line"><span>run.start(</span><span>lambda</span><span> r: r.parallel([</span><span>lambda</span><span> i</span><span>=</span><span>i: r.agent(</span><span>f</span><span>"question </span><span>{</span><span>i</span><span>}</span><span>"</span><span>, </span><span>schema</span><span>=</span><span>SCHEMA</span><span>) </span><span>for</span><span> i </span><span>in</span><span> range</span><span>(</span><span>40</span><span>)]))</span></span>
<span class="line"><span>time.sleep(</span><span>1.2</span><span>)</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"requests sent </span><span>{len</span><span>(paid)</span><span>}n{</span><span>run.statusline()</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"><span>capped.budget.raise_to(</span><span>10.0</span><span>)</span></span>
<span class="line"><span>run.wait()</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"cap raised to </span><span>{</span><span>capped.budget.cap</span><span>}</span><span>: </span><span>{</span><span>run.status</span><span>}</span><span>, spent </span><span>{</span><span>capped.budget.spent</span><span>:.1f</span><span>}</span><span>, requests sent </span><span>{len</span><span>(paid)</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>requests sent </span><span>25</span></span>
<span class="line"><span>forty</span><span>-</span><span>workers </span><span>|</span><span> running </span><span>|</span><span> phase </span><span>0</span><span>: </span><span>-</span><span> |</span><span> 10</span><span> running, </span><span>25</span><span> done, </span><span>0</span><span> failed </span><span>|</span><span> 5.0</span><span> credits</span><span> |</span><span> 1.</span><span>2s</span><span> |</span><span> PAUSED</span><span> at the budget</span></span>
<span class="line"><span>cap raised to </span><span>10.0</span><span>: completed, spent </span><span>8.0</span><span>, requests sent </span><span>40</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>from</span><span> llm </span><span>import</span><span> Budget</span></span>
<span class="line"></span>
<span class="line"><span>paid.clear()</span></span>
<span class="line"><span>capped </span><span>=</span><span> LLM(Ledger(</span><span>":memory:"</span><span>), </span><span>client</span><span>=</span><span>fake_client, </span><span>budget</span><span>=</span><span>Budget(</span><span>5.0</span><span>))</span></span>
<span class="line"><span>run </span><span>=</span><span> Run(</span><span>"forty workers"</span><span>, </span><span>llm</span><span>=</span><span>capped, </span><span>concurrency</span><span>=</span><span>10</span><span>)</span></span>
<span class="line"><span>run.start(</span><span>lambda</span><span> r: r.parallel([</span><span>lambda</span><span> i</span><span>=</span><span>i: r.agent(</span><span>f</span><span>"question </span><span>{</span><span>i</span><span>}</span><span>"</span><span>, </span><span>schema</span><span>=</span><span>SCHEMA</span><span>) </span><span>for</span><span> i </span><span>in</span><span> range</span><span>(</span><span>40</span><span>)]))</span></span>
<span class="line"><span>time.sleep(</span><span>1.2</span><span>)</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"requests sent </span><span>{len</span><span>(paid)</span><span>}n{</span><span>run.statusline()</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"><span>capped.budget.raise_to(</span><span>10.0</span><span>)</span></span>
<span class="line"><span>run.wait()</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"cap raised to </span><span>{</span><span>capped.budget.cap</span><span>}</span><span>: </span><span>{</span><span>run.status</span><span>}</span><span>, spent </span><span>{</span><span>capped.budget.spent</span><span>:.1f</span><span>}</span><span>, requests sent </span><span>{len</span><span>(paid)</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>requests sent </span><span>25</span></span>
<span class="line"><span>forty</span><span>-</span><span>workers </span><span>|</span><span> running </span><span>|</span><span> phase </span><span>0</span><span>: </span><span>-</span><span> |</span><span> 10</span><span> running, </span><span>25</span><span> done, </span><span>0</span><span> failed </span><span>|</span><span> 5.0</span><span> credits</span><span> |</span><span> 1.</span><span>2s</span><span> |</span><span> PAUSED</span><span> at the budget</span></span>
<span class="line"><span>cap raised to </span><span>10.0</span><span>: completed, spent </span><span>8.0</span><span>, requests sent </span><span>40</span></span></code></pre>
<p>The run stopped at exactly 25 requests, and after the cap went up it finished with forty. Next I cancel a two-phase run about halfway, then run the same plan again on the same ledger.</p>
<p>							&lt;button data-code=&quot;plan = lambda r: (r.parallel([lambda i=i: r.agent(f&#x22;scan {i}&#x22;, schema=SCHEMA, phase=&#x22;Scan&#x22;) for i in range(30)]),<br />
                  r.parallel([lambda i=i: r.agent(f&#x22;verify {i}&#x22;, schema=SCHEMA, model=&#x22;judge&#x22;, phase=&#x22;Verify&#x22;) for i in range(30)]))<br />
paid.clear()<br />
ledger = Ledger(&#x22;:memory:&#x22;)<br />
first = Run(&#x22;crash&#x22;, llm=LLM(ledger, client=fake_client), concurrency=8).start(plan)<br />
while len(paid) <span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>plan </span><span>=</span><span> lambda</span><span> r: (r.parallel([</span><span>lambda</span><span> i</span><span>=</span><span>i: r.agent(</span><span>f</span><span>"scan </span><span>{</span><span>i</span><span>}</span><span>"</span><span>, </span><span>schema</span><span>=</span><span>SCHEMA</span><span>, </span><span>phase</span><span>=</span><span>"Scan"</span><span>) </span><span>for</span><span> i </span><span>in</span><span> range</span><span>(</span><span>30</span><span>)]),</span></span>
<span class="line"><span>                  r.parallel([</span><span>lambda</span><span> i</span><span>=</span><span>i: r.agent(</span><span>f</span><span>"verify </span><span>{</span><span>i</span><span>}</span><span>"</span><span>, </span><span>schema</span><span>=</span><span>SCHEMA</span><span>, </span><span>model</span><span>=</span><span>"judge"</span><span>, </span><span>phase</span><span>=</span><span>"Verify"</span><span>) </span><span>for</span><span> i </span><span>in</span><span> range</span><span>(</span><span>30</span><span>)]))</span></span>
<span class="line"><span>paid.clear()</span></span>
<span class="line"><span>ledger </span><span>=</span><span> Ledger(</span><span>":memory:"</span><span>)</span></span>
<span class="line"><span>first </span><span>=</span><span> Run(</span><span>"crash"</span><span>, </span><span>llm</span><span>=</span><span>LLM(ledger, </span><span>client</span><span>=</span><span>fake_client), </span><span>concurrency</span><span>=</span><span>8</span><span>).start(plan)</span></span>
<span class="line"><span>while</span><span> len</span><span>(paid) </span><span>&#x3C;</span><span> 25</span><span>:                                  </span><span># let it get about halfway, then pull the plug</span></span>
<span class="line"><span>    time.sleep(</span><span>0.01</span><span>)</span></span>
<span class="line"><span>first.cancel()</span></span>
<span class="line"><span>first.wait()</span></span>
<span class="line"><span>before </span><span>=</span><span> len</span><span>(paid)</span></span>
<span class="line"><span>second </span><span>=</span><span> Run(</span><span>"crash"</span><span>, </span><span>llm</span><span>=</span><span>LLM(ledger, </span><span>client</span><span>=</span><span>fake_client), </span><span>concurrency</span><span>=</span><span>8</span><span>)</span></span>
<span class="line"><span>second.run_sync(plan)</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"first run </span><span>{</span><span>first.status</span><span>}</span><span> after </span><span>{</span><span>before</span><span>}</span><span> paid calls, then the second run </span><span>{</span><span>second.status</span><span>}</span><span> with </span><span>{len</span><span>(paid) </span><span>-</span><span> before</span><span>}</span><span> new calls, </span><span>{len</span><span>(paid)</span><span>}</span><span> in all"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>first run cancelled after </span><span>30</span><span> paid calls, then the second run completed </span><span>with</span><span> 30</span><span> new calls, </span><span>60</span><span> in</span><span> all</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>plan </span><span>=</span><span> lambda</span><span> r: (r.parallel([</span><span>lambda</span><span> i</span><span>=</span><span>i: r.agent(</span><span>f</span><span>"scan </span><span>{</span><span>i</span><span>}</span><span>"</span><span>, </span><span>schema</span><span>=</span><span>SCHEMA</span><span>, </span><span>phase</span><span>=</span><span>"Scan"</span><span>) </span><span>for</span><span> i </span><span>in</span><span> range</span><span>(</span><span>30</span><span>)]),</span></span>
<span class="line"><span>                  r.parallel([</span><span>lambda</span><span> i</span><span>=</span><span>i: r.agent(</span><span>f</span><span>"verify </span><span>{</span><span>i</span><span>}</span><span>"</span><span>, </span><span>schema</span><span>=</span><span>SCHEMA</span><span>, </span><span>model</span><span>=</span><span>"judge"</span><span>, </span><span>phase</span><span>=</span><span>"Verify"</span><span>) </span><span>for</span><span> i </span><span>in</span><span> range</span><span>(</span><span>30</span><span>)]))</span></span>
<span class="line"><span>paid.clear()</span></span>
<span class="line"><span>ledger </span><span>=</span><span> Ledger(</span><span>":memory:"</span><span>)</span></span>
<span class="line"><span>first </span><span>=</span><span> Run(</span><span>"crash"</span><span>, </span><span>llm</span><span>=</span><span>LLM(ledger, </span><span>client</span><span>=</span><span>fake_client), </span><span>concurrency</span><span>=</span><span>8</span><span>).start(plan)</span></span>
<span class="line"><span>while</span><span> len</span><span>(paid) </span><span>&#x3C;</span><span> 25</span><span>:                                  </span><span># let it get about halfway, then pull the plug</span></span>
<span class="line"><span>    time.sleep(</span><span>0.01</span><span>)</span></span>
<span class="line"><span>first.cancel()</span></span>
<span class="line"><span>first.wait()</span></span>
<span class="line"><span>before </span><span>=</span><span> len</span><span>(paid)</span></span>
<span class="line"><span>second </span><span>=</span><span> Run(</span><span>"crash"</span><span>, </span><span>llm</span><span>=</span><span>LLM(ledger, </span><span>client</span><span>=</span><span>fake_client), </span><span>concurrency</span><span>=</span><span>8</span><span>)</span></span>
<span class="line"><span>second.run_sync(plan)</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"first run </span><span>{</span><span>first.status</span><span>}</span><span> after </span><span>{</span><span>before</span><span>}</span><span> paid calls, then the second run </span><span>{</span><span>second.status</span><span>}</span><span> with </span><span>{len</span><span>(paid) </span><span>-</span><span> before</span><span>}</span><span> new calls, </span><span>{len</span><span>(paid)</span><span>}</span><span> in all"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>first run cancelled after </span><span>30</span><span> paid calls, then the second run completed </span><span>with</span><span> 30</span><span> new calls, </span><span>60</span><span> in</span><span> all</span></span></code></pre>
<p>The plan needs sixty calls whether or not it is interrupted, and no call was paid for twice.</p>
<h3>Audit Task Kit</h3>
<p>Three kit steps call the model: <code>scan</code> gives a worker one shard and one <strong>lens</strong>, <code>check gives a skeptic a batch, and</code> report` writes the list.</p>
<p>The <strong>skeptic</strong> is told that most reports are false alarms and to answer <code>real: false</code> when unsure.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>"""kit.py: the words of an audit: scan, check, vote and report."""</span></span>
<span class="line"><span>import</span><span> collections</span></span>
<span class="line"></span>
<span class="line"><span>from</span><span> bench </span><span>import</span><span> WORK</span><span>, function_at, normalise_path</span></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> MODELS</span><span>, </span><span>PROMPTS</span><span>, </span><span>SHARD_TOKENS</span></span>
<span class="line"><span>from</span><span> shards </span><span>import</span><span> numbered, pack</span></span>
<span class="line"></span>
<span class="line"><span>LENSES</span><span> =</span><span> [</span><span>"boundaries"</span><span>, </span><span>"logic"</span><span>, </span><span>"state"</span><span>]                 </span><span># a lens points a worker at one family of mistakes, "general" at none</span></span>
<span class="line"><span>FINDINGS</span><span> =</span><span> {</span><span>"type"</span><span>: </span><span>"object"</span><span>, </span><span>"required"</span><span>: [</span><span>"findings"</span><span>], </span><span>"properties"</span><span>: {</span><span>"findings"</span><span>: {</span><span>"type"</span><span>: </span><span>"array"</span><span>, </span><span>"items"</span><span>: {</span></span>
<span class="line"><span>    "type"</span><span>: </span><span>"object"</span><span>, </span><span>"required"</span><span>: [</span><span>"file"</span><span>, </span><span>"line"</span><span>, </span><span>"claim"</span><span>], </span><span>"properties"</span><span>: {</span><span>"line"</span><span>: {</span><span>"type"</span><span>: </span><span>"integer"</span><span>}}}}}}</span></span>
<span class="line"><span>VERDICTS</span><span> =</span><span> {</span><span>"type"</span><span>: </span><span>"object"</span><span>, </span><span>"required"</span><span>: [</span><span>"verdicts"</span><span>], </span><span>"properties"</span><span>: {</span><span>"verdicts"</span><span>: {</span><span>"type"</span><span>: </span><span>"array"</span><span>, </span><span>"items"</span><span>: {</span></span>
<span class="line"><span>    "type"</span><span>: </span><span>"object"</span><span>, </span><span>"required"</span><span>: [</span><span>"report"</span><span>, </span><span>"real"</span><span>], </span><span>"properties"</span><span>: {</span><span>"real"</span><span>: {</span><span>"type"</span><span>: </span><span>"boolean"</span><span>}}}}}}</span></span>
<span class="line"><span>REPORT</span><span> =</span><span> {</span><span>"type"</span><span>: </span><span>"object"</span><span>, </span><span>"required"</span><span>: [</span><span>"bugs"</span><span>], </span><span>"properties"</span><span>: {</span><span>"bugs"</span><span>: {</span><span>"type"</span><span>: </span><span>"array"</span><span>, </span><span>"items"</span><span>: {</span><span>"type"</span><span>: </span><span>"object"</span><span>, </span><span>"required"</span><span>: [</span><span>"ids"</span><span>]}}}}</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>"""kit.py: the words of an audit: scan, check, vote and report."""</span></span>
<span class="line"><span>import</span><span> collections</span></span>
<span class="line"></span>
<span class="line"><span>from</span><span> bench </span><span>import</span><span> WORK</span><span>, function_at, normalise_path</span></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> MODELS</span><span>, </span><span>PROMPTS</span><span>, </span><span>SHARD_TOKENS</span></span>
<span class="line"><span>from</span><span> shards </span><span>import</span><span> numbered, pack</span></span>
<span class="line"></span>
<span class="line"><span>LENSES</span><span> =</span><span> [</span><span>"boundaries"</span><span>, </span><span>"logic"</span><span>, </span><span>"state"</span><span>]                 </span><span># a lens points a worker at one family of mistakes, "general" at none</span></span>
<span class="line"><span>FINDINGS</span><span> =</span><span> {</span><span>"type"</span><span>: </span><span>"object"</span><span>, </span><span>"required"</span><span>: [</span><span>"findings"</span><span>], </span><span>"properties"</span><span>: {</span><span>"findings"</span><span>: {</span><span>"type"</span><span>: </span><span>"array"</span><span>, </span><span>"items"</span><span>: {</span></span>
<span class="line"><span>    "type"</span><span>: </span><span>"object"</span><span>, </span><span>"required"</span><span>: [</span><span>"file"</span><span>, </span><span>"line"</span><span>, </span><span>"claim"</span><span>], </span><span>"properties"</span><span>: {</span><span>"line"</span><span>: {</span><span>"type"</span><span>: </span><span>"integer"</span><span>}}}}}}</span></span>
<span class="line"><span>VERDICTS</span><span> =</span><span> {</span><span>"type"</span><span>: </span><span>"object"</span><span>, </span><span>"required"</span><span>: [</span><span>"verdicts"</span><span>], </span><span>"properties"</span><span>: {</span><span>"verdicts"</span><span>: {</span><span>"type"</span><span>: </span><span>"array"</span><span>, </span><span>"items"</span><span>: {</span></span>
<span class="line"><span>    "type"</span><span>: </span><span>"object"</span><span>, </span><span>"required"</span><span>: [</span><span>"report"</span><span>, </span><span>"real"</span><span>], </span><span>"properties"</span><span>: {</span><span>"real"</span><span>: {</span><span>"type"</span><span>: </span><span>"boolean"</span><span>}}}}}}</span></span>
<span class="line"><span>REPORT</span><span> =</span><span> {</span><span>"type"</span><span>: </span><span>"object"</span><span>, </span><span>"required"</span><span>: [</span><span>"bugs"</span><span>], </span><span>"properties"</span><span>: {</span><span>"bugs"</span><span>: {</span><span>"type"</span><span>: </span><span>"array"</span><span>, </span><span>"items"</span><span>: {</span><span>"type"</span><span>: </span><span>"object"</span><span>, </span><span>"required"</span><span>: [</span><span>"ids"</span><span>]}}}}</span></span></code></pre>
<p><code>batches cuts a list into groups, and</code> flatten` joins lists back into one.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># kit.py</span></span>
<span class="line"><span>def</span><span> batches</span><span>(items, size):</span></span>
<span class="line"><span>    items, size </span><span>=</span><span> list</span><span>(items), </span><span>max</span><span>(</span><span>1</span><span>, </span><span>int</span><span>(size))</span></span>
<span class="line"><span>    return</span><span> [items[i:i </span><span>+</span><span> size] </span><span>for</span><span> i </span><span>in</span><span> range</span><span>(</span><span>0</span><span>, </span><span>len</span><span>(items), size)]</span></span>
<span class="line"></span>
<span class="line"><span>def</span><span> flatten</span><span>(lists):</span></span>
<span class="line"><span>    return</span><span> [x </span><span>for</span><span> xs </span><span>in</span><span> lists </span><span>if</span><span> xs </span><span>for</span><span> x </span><span>in</span><span> xs]           </span><span># one list from a list of lists, skipping workers that failed (None)</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># kit.py</span></span>
<span class="line"><span>def</span><span> batches</span><span>(items, size):</span></span>
<span class="line"><span>    items, size </span><span>=</span><span> list</span><span>(items), </span><span>max</span><span>(</span><span>1</span><span>, </span><span>int</span><span>(size))</span></span>
<span class="line"><span>    return</span><span> [items[i:i </span><span>+</span><span> size] </span><span>for</span><span> i </span><span>in</span><span> range</span><span>(</span><span>0</span><span>, </span><span>len</span><span>(items), size)]</span></span>
<span class="line"></span>
<span class="line"><span>def</span><span> flatten</span><span>(lists):</span></span>
<span class="line"><span>    return</span><span> [x </span><span>for</span><span> xs </span><span>in</span><span> lists </span><span>if</span><span> xs </span><span>for</span><span> x </span><span>in</span><span> xs]           </span><span># one list from a list of lists, skipping workers that failed (None)</span></span></code></pre>
<p><code>finding</code> builds one finding, and <code>key_of</code> names its place.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># kit.py</span></span>
<span class="line"><span>def</span><span> finding</span><span>(obj, source</span><span>=</span><span>""</span><span>):</span></span>
<span class="line"><span>    path, line, conf </span><span>=</span><span> normalise_path(obj.get(</span><span>"file"</span><span>, </span><span>""</span><span>)), </span><span>int</span><span>(obj.get(</span><span>"line"</span><span>) </span><span>or</span><span> 0</span><span>), obj.get(</span><span>"confidence"</span><span>)</span></span>
<span class="line"><span>    span </span><span>=</span><span> function_at(path, line)                         </span><span># models often name the wrong function</span></span>
<span class="line"><span>    # texts are cut to keep prompts small</span></span>
<span class="line"><span>    return</span><span> {</span><span>"file"</span><span>: path, </span><span>"line"</span><span>: line, </span><span>"function"</span><span>: span[</span><span>0</span><span>] </span><span>if</span><span> span </span><span>else</span><span> str</span><span>(obj.get(</span><span>"function"</span><span>) </span><span>or</span><span> ""</span><span>), </span><span>"source"</span><span>: source,</span></span>
<span class="line"><span>            "claim"</span><span>: </span><span>str</span><span>(obj.get(</span><span>"claim"</span><span>) </span><span>or</span><span> ""</span><span>)[:</span><span>400</span><span>], </span><span>"failing_call"</span><span>: </span><span>str</span><span>(obj.get(</span><span>"failing_call"</span><span>) </span><span>or</span><span> ""</span><span>)[:</span><span>400</span><span>],</span></span>
<span class="line"><span>            "expected"</span><span>: </span><span>str</span><span>(obj.get(</span><span>"expected"</span><span>) </span><span>or</span><span> ""</span><span>)[:</span><span>200</span><span>], </span><span>"confidence"</span><span>: </span><span>min</span><span>(</span><span>1.0</span><span>, </span><span>max</span><span>(</span><span>0.0</span><span>, </span><span>float</span><span>(conf))) </span><span>if</span><span> isinstance</span><span>(conf, (</span><span>int</span><span>, </span><span>float</span><span>)) </span><span>else</span><span> 0.5</span><span>}</span></span>
<span class="line"></span>
<span class="line"><span>def</span><span> key_of</span><span>(f):</span></span>
<span class="line"><span>    """The place a finding is about: its file and function, or its file and ten-line block."""</span></span>
<span class="line"><span>    return</span><span> f</span><span>"</span><span>{</span><span>f[</span><span>'file'</span><span>]</span><span>}</span><span>::</span><span>{</span><span>f[</span><span>'function'</span><span>]</span><span>}</span><span>"</span><span> if</span><span> f[</span><span>"function"</span><span>] </span><span>else</span><span> f</span><span>"</span><span>{</span><span>f[</span><span>'file'</span><span>]</span><span>}</span><span>::line </span><span>{</span><span>f[</span><span>'line'</span><span>] </span><span>//</span><span> 10</span><span> *</span><span> 10}</span><span>"</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># kit.py</span></span>
<span class="line"><span>def</span><span> finding</span><span>(obj, source</span><span>=</span><span>""</span><span>):</span></span>
<span class="line"><span>    path, line, conf </span><span>=</span><span> normalise_path(obj.get(</span><span>"file"</span><span>, </span><span>""</span><span>)), </span><span>int</span><span>(obj.get(</span><span>"line"</span><span>) </span><span>or</span><span> 0</span><span>), obj.get(</span><span>"confidence"</span><span>)</span></span>
<span class="line"><span>    span </span><span>=</span><span> function_at(path, line)                         </span><span># models often name the wrong function</span></span>
<span class="line"><span>    # texts are cut to keep prompts small</span></span>
<span class="line"><span>    return</span><span> {</span><span>"file"</span><span>: path, </span><span>"line"</span><span>: line, </span><span>"function"</span><span>: span[</span><span>0</span><span>] </span><span>if</span><span> span </span><span>else</span><span> str</span><span>(obj.get(</span><span>"function"</span><span>) </span><span>or</span><span> ""</span><span>), </span><span>"source"</span><span>: source,</span></span>
<span class="line"><span>            "claim"</span><span>: </span><span>str</span><span>(obj.get(</span><span>"claim"</span><span>) </span><span>or</span><span> ""</span><span>)[:</span><span>400</span><span>], </span><span>"failing_call"</span><span>: </span><span>str</span><span>(obj.get(</span><span>"failing_call"</span><span>) </span><span>or</span><span> ""</span><span>)[:</span><span>400</span><span>],</span></span>
<span class="line"><span>            "expected"</span><span>: </span><span>str</span><span>(obj.get(</span><span>"expected"</span><span>) </span><span>or</span><span> ""</span><span>)[:</span><span>200</span><span>], </span><span>"confidence"</span><span>: </span><span>min</span><span>(</span><span>1.0</span><span>, </span><span>max</span><span>(</span><span>0.0</span><span>, </span><span>float</span><span>(conf))) </span><span>if</span><span> isinstance</span><span>(conf, (</span><span>int</span><span>, </span><span>float</span><span>)) </span><span>else</span><span> 0.5</span><span>}</span></span>
<span class="line"></span>
<span class="line"><span>def</span><span> key_of</span><span>(f):</span></span>
<span class="line"><span>    """The place a finding is about: its file and function, or its file and ten-line block."""</span></span>
<span class="line"><span>    return</span><span> f</span><span>"</span><span>{</span><span>f[</span><span>'file'</span><span>]</span><span>}</span><span>::</span><span>{</span><span>f[</span><span>'function'</span><span>]</span><span>}</span><span>"</span><span> if</span><span> f[</span><span>"function"</span><span>] </span><span>else</span><span> f</span><span>"</span><span>{</span><span>f[</span><span>'file'</span><span>]</span><span>}</span><span>::line </span><span>{</span><span>f[</span><span>'line'</span><span>] </span><span>//</span><span> 10</span><span> *</span><span> 10}</span><span>"</span></span></code></pre>
<p><code>dedupe merges findings about one place and counts the workers behind them.</code></p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># kit.py</span></span>
<span class="line"><span>def</span><span> dedupe</span><span>(findings):</span></span>
<span class="line"><span>    # group by place, keep the most confident</span></span>
<span class="line"><span>    groups </span><span>=</span><span> collections.defaultdict(</span><span>list</span><span>)</span></span>
<span class="line"><span>    for</span><span> f </span><span>in</span><span> findings:</span></span>
<span class="line"><span>        groups[key_of(f)].append(f)</span></span>
<span class="line"><span>    return</span><span> [</span><span>dict</span><span>(</span><span>max</span><span>(g, </span><span>key</span><span>=lambda</span><span> f: (f[</span><span>"confidence"</span><span>], </span><span>-</span><span>f[</span><span>"line"</span><span>], f[</span><span>"claim"</span><span>], f[</span><span>"failing_call"</span><span>], f[</span><span>"source"</span><span>])),   </span><span># ties are broken by</span></span>
<span class="line"><span>                 reports</span><span>=</span><span>sum</span><span>(f.get(</span><span>"reports"</span><span>, </span><span>1</span><span>) </span><span>for</span><span> f </span><span>in</span><span> g)) </span><span>for</span><span> _, g </span><span>in</span><span> sorted</span><span>(groups.items())]                 </span><span># content, so every run keeps the same one</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># kit.py</span></span>
<span class="line"><span>def</span><span> dedupe</span><span>(findings):</span></span>
<span class="line"><span>    # group by place, keep the most confident</span></span>
<span class="line"><span>    groups </span><span>=</span><span> collections.defaultdict(</span><span>list</span><span>)</span></span>
<span class="line"><span>    for</span><span> f </span><span>in</span><span> findings:</span></span>
<span class="line"><span>        groups[key_of(f)].append(f)</span></span>
<span class="line"><span>    return</span><span> [</span><span>dict</span><span>(</span><span>max</span><span>(g, </span><span>key</span><span>=lambda</span><span> f: (f[</span><span>"confidence"</span><span>], </span><span>-</span><span>f[</span><span>"line"</span><span>], f[</span><span>"claim"</span><span>], f[</span><span>"failing_call"</span><span>], f[</span><span>"source"</span><span>])),   </span><span># ties are broken by</span></span>
<span class="line"><span>                 reports</span><span>=</span><span>sum</span><span>(f.get(</span><span>"reports"</span><span>, </span><span>1</span><span>) </span><span>for</span><span> f </span><span>in</span><span> g)) </span><span>for</span><span> _, g </span><span>in</span><span> sorted</span><span>(groups.items())]                 </span><span># content, so every run keeps the same one</span></span></code></pre>
<p>A place survives only when enough skeptics call it real, which is what <code>vote</code> checks.</p>
<p>							= need]&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-3 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># kit.py</span></span>
<span class="line"><span>def</span><span> vote</span><span>(candidates, verdicts, need</span><span>=</span><span>2</span><span>):</span></span>
<span class="line"><span>    # keep places that at least `need` skeptics called real</span></span>
<span class="line"><span>    real </span><span>=</span><span> collections.Counter(v[</span><span>"key"</span><span>] </span><span>for</span><span> v </span><span>in</span><span> verdicts </span><span>if</span><span> v </span><span>and</span><span> v.get(</span><span>"real"</span><span>) </span><span>is</span><span> True</span><span>)</span></span>
<span class="line"><span>    return</span><span> [</span><span>dict</span><span>(c, </span><span>votes</span><span>=</span><span>real[key_of(c)]) </span><span>for</span><span> c </span><span>in</span><span> candidates </span><span>if</span><span> real[key_of(c)] </span><span>&gt;=</span><span> need]</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># kit.py</span></span>
<span class="line"><span>def</span><span> vote</span><span>(candidates, verdicts, need</span><span>=</span><span>2</span><span>):</span></span>
<span class="line"><span>    # keep places that at least `need` skeptics called real</span></span>
<span class="line"><span>    real </span><span>=</span><span> collections.Counter(v[</span><span>"key"</span><span>] </span><span>for</span><span> v </span><span>in</span><span> verdicts </span><span>if</span><span> v </span><span>and</span><span> v.get(</span><span>"real"</span><span>) </span><span>is</span><span> True</span><span>)</span></span>
<span class="line"><span>    return</span><span> [</span><span>dict</span><span>(c, </span><span>votes</span><span>=</span><span>real[key_of(c)]) </span><span>for</span><span> c </span><span>in</span><span> candidates </span><span>if</span><span> real[key_of(c)] </span><span>&gt;=</span><span> need]</span></span></code></pre>
<p>What a skeptic reads comes from <code>reports</code>, one block per finding.</p>
<p>							 60:                              # a very long function: a window around the line instead<br />
            first, last = f[&#x22;line&#x22;] &#8211; 15, f[&#x22;line&#x22;] + 15<br />
        code = &#x22;n&#x22;.join(numbered(f[&#x22;file&#x22;]).split(&#x22;n&#x22;)[max(1, first):last + 1]) if f[&#x22;file&#x22;] in WORK else &#x22;(no such file)&#x22;<br />
        # one block per finding, with its code<br />
        blocks.append(f&#x22;&#8212; report {i} &#8212;nfile: {f[&#x27;file&#x27;]}nfunction: {f[&#x27;function&#x27;] or &#x27;(none)&#x27;}nline: {f[&#x27;line&#x27;]}nclaim: {f[&#x27;claim&#x27;]}n&#x22;<br />
                      f&#x22;failing call: {f[&#x27;failing_call&#x27;] or &#x27;(none given)&#x27;}nexpected by the finder: {f[&#x27;expected&#x27;] or &#x27;(not given)&#x27;}ncode:n{code}&#x22;)<br />
    return &#x22;nn&#x22;.join(blocks)&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-3 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># kit.py</span></span>
<span class="line"><span>def</span><span> reports</span><span>(batch):</span></span>
<span class="line"><span>    blocks </span><span>=</span><span> []</span></span>
<span class="line"><span>    for</span><span> i, f </span><span>in</span><span> enumerate</span><span>(batch, </span><span>1</span><span>):</span></span>
<span class="line"><span>        name, first, last </span><span>=</span><span> function_at(f[</span><span>"file"</span><span>], f[</span><span>"line"</span><span>]) </span><span>or</span><span> (</span><span>""</span><span>, f[</span><span>"line"</span><span>] </span><span>-</span><span> 15</span><span>, f[</span><span>"line"</span><span>] </span><span>+</span><span> 15</span><span>)</span></span>
<span class="line"><span>        if</span><span> last </span><span>-</span><span> first </span><span>&gt;</span><span> 60</span><span>:                              </span><span># a very long function: a window around the line instead</span></span>
<span class="line"><span>            first, last </span><span>=</span><span> f[</span><span>"line"</span><span>] </span><span>-</span><span> 15</span><span>, f[</span><span>"line"</span><span>] </span><span>+</span><span> 15</span></span>
<span class="line"><span>        code </span><span>=</span><span> "</span><span>n</span><span>"</span><span>.join(numbered(f[</span><span>"file"</span><span>]).split(</span><span>"</span><span>n</span><span>"</span><span>)[</span><span>max</span><span>(</span><span>1</span><span>, first):last </span><span>+</span><span> 1</span><span>]) </span><span>if</span><span> f[</span><span>"file"</span><span>] </span><span>in</span><span> WORK</span><span> else</span><span> "(no such file)"</span></span>
<span class="line"><span>        # one block per finding, with its code</span></span>
<span class="line"><span>        blocks.append(</span><span>f</span><span>"--- report </span><span>{</span><span>i</span><span>}</span><span> ---</span><span>n</span><span>file: </span><span>{</span><span>f[</span><span>'file'</span><span>]</span><span>}n</span><span>function: </span><span>{</span><span>f[</span><span>'function'</span><span>] </span><span>or</span><span> '(none)'</span><span>}n</span><span>line: </span><span>{</span><span>f[</span><span>'line'</span><span>]</span><span>}n</span><span>claim: </span><span>{</span><span>f[</span><span>'claim'</span><span>]</span><span>}n</span><span>"</span></span>
<span class="line"><span>                      f</span><span>"failing call: </span><span>{</span><span>f[</span><span>'failing_call'</span><span>] </span><span>or</span><span> '(none given)'</span><span>}n</span><span>expected by the finder: </span><span>{</span><span>f[</span><span>'expected'</span><span>] </span><span>or</span><span> '(not given)'</span><span>}n</span><span>code:</span><span>n{</span><span>code</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"><span>    return</span><span> "</span><span>nn</span><span>"</span><span>.join(blocks)</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># kit.py</span></span>
<span class="line"><span>def</span><span> reports</span><span>(batch):</span></span>
<span class="line"><span>    blocks </span><span>=</span><span> []</span></span>
<span class="line"><span>    for</span><span> i, f </span><span>in</span><span> enumerate</span><span>(batch, </span><span>1</span><span>):</span></span>
<span class="line"><span>        name, first, last </span><span>=</span><span> function_at(f[</span><span>"file"</span><span>], f[</span><span>"line"</span><span>]) </span><span>or</span><span> (</span><span>""</span><span>, f[</span><span>"line"</span><span>] </span><span>-</span><span> 15</span><span>, f[</span><span>"line"</span><span>] </span><span>+</span><span> 15</span><span>)</span></span>
<span class="line"><span>        if</span><span> last </span><span>-</span><span> first </span><span>&gt;</span><span> 60</span><span>:                              </span><span># a very long function: a window around the line instead</span></span>
<span class="line"><span>            first, last </span><span>=</span><span> f[</span><span>"line"</span><span>] </span><span>-</span><span> 15</span><span>, f[</span><span>"line"</span><span>] </span><span>+</span><span> 15</span></span>
<span class="line"><span>        code </span><span>=</span><span> "</span><span>n</span><span>"</span><span>.join(numbered(f[</span><span>"file"</span><span>]).split(</span><span>"</span><span>n</span><span>"</span><span>)[</span><span>max</span><span>(</span><span>1</span><span>, first):last </span><span>+</span><span> 1</span><span>]) </span><span>if</span><span> f[</span><span>"file"</span><span>] </span><span>in</span><span> WORK</span><span> else</span><span> "(no such file)"</span></span>
<span class="line"><span>        # one block per finding, with its code</span></span>
<span class="line"><span>        blocks.append(</span><span>f</span><span>"--- report </span><span>{</span><span>i</span><span>}</span><span> ---</span><span>n</span><span>file: </span><span>{</span><span>f[</span><span>'file'</span><span>]</span><span>}n</span><span>function: </span><span>{</span><span>f[</span><span>'function'</span><span>] </span><span>or</span><span> '(none)'</span><span>}n</span><span>line: </span><span>{</span><span>f[</span><span>'line'</span><span>]</span><span>}n</span><span>claim: </span><span>{</span><span>f[</span><span>'claim'</span><span>]</span><span>}n</span><span>"</span></span>
<span class="line"><span>                      f</span><span>"failing call: </span><span>{</span><span>f[</span><span>'failing_call'</span><span>] </span><span>or</span><span> '(none given)'</span><span>}n</span><span>expected by the finder: </span><span>{</span><span>f[</span><span>'expected'</span><span>] </span><span>or</span><span> '(not given)'</span><span>}n</span><span>code:</span><span>n{</span><span>code</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"><span>    return</span><span> "</span><span>nn</span><span>"</span><span>.join(blocks)</span></span></code></pre>
<p><code>AuditKit</code> binds the steps to one run, and run <code>r</code> offsets each sample index by <code>100 * r</code> so three runs sample independently.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># kit.py</span></span>
<span class="line"><span>class</span><span> AuditKit</span><span>:</span></span>
<span class="line"><span>    def</span><span> __init__</span><span>(self, run, number</span><span>=</span><span>0</span><span>):</span></span>
<span class="line"><span>        self</span><span>.run, </span><span>self</span><span>.offset </span><span>=</span><span> run, </span><span>100</span><span> *</span><span> number          </span><span># run r uses sample indexes 100 r, 100 r + 1, ...</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> scan</span><span>(self, shard, lens</span><span>=</span><span>"general"</span><span>, sample</span><span>=</span><span>0</span><span>, model</span><span>=</span><span>"worker"</span><span>):</span></span>
<span class="line"><span>        # a lens adds a paragraph, the shard is numbered code</span></span>
<span class="line"><span>        label </span><span>=</span><span> f</span><span>"scan:</span><span>{</span><span>lens</span><span>}</span><span>:</span><span>{</span><span>shard[</span><span>0</span><span>].split(</span><span>'/'</span><span>)[</span><span>0</span><span>]</span><span>}</span><span>#</span><span>{</span><span>sample</span><span>}</span><span>"</span></span>
<span class="line"><span>        obj </span><span>=</span><span> self</span><span>.run.agent(</span><span>system</span><span>=</span><span>PROMPTS</span><span>[</span><span>"scan"</span><span>] </span><span>+</span><span> (</span><span>f</span><span>"</span><span>nn{PROMPTS</span><span>[</span><span>'lens_'</span><span> +</span><span> lens]</span><span>}</span><span>"</span><span> if</span><span> lens </span><span>in</span><span> LENSES</span><span> else</span><span> ""</span><span>), </span><span>schema</span><span>=</span><span>FINDINGS</span><span>,</span></span>
<span class="line"><span>                             data</span><span>=</span><span>"</span><span>nn</span><span>"</span><span>.join(</span><span>map</span><span>(numbered, shard)), </span><span>model</span><span>=</span><span>model, </span><span>role</span><span>=</span><span>"scan"</span><span>, </span><span>label</span><span>=</span><span>label, </span><span>sample</span><span>=</span><span>self</span><span>.offset </span><span>+</span><span> sample)</span></span>
<span class="line"><span>        return</span><span> [finding(f, label) </span><span>for</span><span> f </span><span>in</span><span> (obj </span><span>or</span><span> {}).get(</span><span>"findings"</span><span>, []) </span><span>if</span><span> isinstance</span><span>(f, </span><span>dict</span><span>)]</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> check</span><span>(self, batch, sample</span><span>=</span><span>0</span><span>, model</span><span>=</span><span>"judge"</span><span>):</span></span>
<span class="line"><span>        batch </span><span>=</span><span> [f </span><span>for</span><span> f </span><span>in</span><span> batch </span><span>if</span><span> f][:</span><span>8</span><span>]           </span><span># a skeptic reads at most eight findings at once</span></span>
<span class="line"><span>        obj </span><span>=</span><span> batch </span><span>and</span><span> self</span><span>.run.agent(</span><span>system</span><span>=</span><span>PROMPTS</span><span>[</span><span>"skeptic"</span><span>], </span><span>data</span><span>=</span><span>reports(batch), </span><span>schema</span><span>=</span><span>VERDICTS</span><span>, </span><span>model</span><span>=</span><span>model, </span><span>role</span><span>=</span><span>"skeptic"</span><span>,</span></span>
<span class="line"><span>                                       label</span><span>=</span><span>f</span><span>"check:</span><span>{</span><span>batch[</span><span>0</span><span>][</span><span>'file'</span><span>].split(</span><span>'/'</span><span>)[</span><span>0</span><span>]</span><span>}</span><span>#</span><span>{</span><span>sample</span><span>}</span><span>"</span><span>, </span><span>sample</span><span>=</span><span>self</span><span>.offset </span><span>+</span><span> sample)</span></span>
<span class="line"><span>        # match verdicts to findings by number</span></span>
<span class="line"><span>        said </span><span>=</span><span> {v.get(</span><span>"report"</span><span>): v </span><span>for</span><span> v </span><span>in</span><span> (obj </span><span>or</span><span> {}).get(</span><span>"verdicts"</span><span>, []) </span><span>if</span><span> isinstance</span><span>(v, </span><span>dict</span><span>)}</span></span>
<span class="line"><span>        return</span><span> [{</span><span>"key"</span><span>: key_of(f), </span><span>"real"</span><span>: said.get(i, {}).get(</span><span>"real"</span><span>), </span><span>"reason"</span><span>: </span><span>str</span><span>(said.get(i, {}).get(</span><span>"reason"</span><span>, </span><span>""</span><span>))[:</span><span>200</span><span>]}</span></span>
<span class="line"><span>                for</span><span> i, f </span><span>in</span><span> enumerate</span><span>(batch, </span><span>1</span><span>)]</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># kit.py</span></span>
<span class="line"><span>class</span><span> AuditKit</span><span>:</span></span>
<span class="line"><span>    def</span><span> __init__</span><span>(self, run, number</span><span>=</span><span>0</span><span>):</span></span>
<span class="line"><span>        self</span><span>.run, </span><span>self</span><span>.offset </span><span>=</span><span> run, </span><span>100</span><span> *</span><span> number          </span><span># run r uses sample indexes 100 r, 100 r + 1, ...</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> scan</span><span>(self, shard, lens</span><span>=</span><span>"general"</span><span>, sample</span><span>=</span><span>0</span><span>, model</span><span>=</span><span>"worker"</span><span>):</span></span>
<span class="line"><span>        # a lens adds a paragraph, the shard is numbered code</span></span>
<span class="line"><span>        label </span><span>=</span><span> f</span><span>"scan:</span><span>{</span><span>lens</span><span>}</span><span>:</span><span>{</span><span>shard[</span><span>0</span><span>].split(</span><span>'/'</span><span>)[</span><span>0</span><span>]</span><span>}</span><span>#</span><span>{</span><span>sample</span><span>}</span><span>"</span></span>
<span class="line"><span>        obj </span><span>=</span><span> self</span><span>.run.agent(</span><span>system</span><span>=</span><span>PROMPTS</span><span>[</span><span>"scan"</span><span>] </span><span>+</span><span> (</span><span>f</span><span>"</span><span>nn{PROMPTS</span><span>[</span><span>'lens_'</span><span> +</span><span> lens]</span><span>}</span><span>"</span><span> if</span><span> lens </span><span>in</span><span> LENSES</span><span> else</span><span> ""</span><span>), </span><span>schema</span><span>=</span><span>FINDINGS</span><span>,</span></span>
<span class="line"><span>                             data</span><span>=</span><span>"</span><span>nn</span><span>"</span><span>.join(</span><span>map</span><span>(numbered, shard)), </span><span>model</span><span>=</span><span>model, </span><span>role</span><span>=</span><span>"scan"</span><span>, </span><span>label</span><span>=</span><span>label, </span><span>sample</span><span>=</span><span>self</span><span>.offset </span><span>+</span><span> sample)</span></span>
<span class="line"><span>        return</span><span> [finding(f, label) </span><span>for</span><span> f </span><span>in</span><span> (obj </span><span>or</span><span> {}).get(</span><span>"findings"</span><span>, []) </span><span>if</span><span> isinstance</span><span>(f, </span><span>dict</span><span>)]</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> check</span><span>(self, batch, sample</span><span>=</span><span>0</span><span>, model</span><span>=</span><span>"judge"</span><span>):</span></span>
<span class="line"><span>        batch </span><span>=</span><span> [f </span><span>for</span><span> f </span><span>in</span><span> batch </span><span>if</span><span> f][:</span><span>8</span><span>]           </span><span># a skeptic reads at most eight findings at once</span></span>
<span class="line"><span>        obj </span><span>=</span><span> batch </span><span>and</span><span> self</span><span>.run.agent(</span><span>system</span><span>=</span><span>PROMPTS</span><span>[</span><span>"skeptic"</span><span>], </span><span>data</span><span>=</span><span>reports(batch), </span><span>schema</span><span>=</span><span>VERDICTS</span><span>, </span><span>model</span><span>=</span><span>model, </span><span>role</span><span>=</span><span>"skeptic"</span><span>,</span></span>
<span class="line"><span>                                       label</span><span>=</span><span>f</span><span>"check:</span><span>{</span><span>batch[</span><span>0</span><span>][</span><span>'file'</span><span>].split(</span><span>'/'</span><span>)[</span><span>0</span><span>]</span><span>}</span><span>#</span><span>{</span><span>sample</span><span>}</span><span>"</span><span>, </span><span>sample</span><span>=</span><span>self</span><span>.offset </span><span>+</span><span> sample)</span></span>
<span class="line"><span>        # match verdicts to findings by number</span></span>
<span class="line"><span>        said </span><span>=</span><span> {v.get(</span><span>"report"</span><span>): v </span><span>for</span><span> v </span><span>in</span><span> (obj </span><span>or</span><span> {}).get(</span><span>"verdicts"</span><span>, []) </span><span>if</span><span> isinstance</span><span>(v, </span><span>dict</span><span>)}</span></span>
<span class="line"><span>        return</span><span> [{</span><span>"key"</span><span>: key_of(f), </span><span>"real"</span><span>: said.get(i, {}).get(</span><span>"real"</span><span>), </span><span>"reason"</span><span>: </span><span>str</span><span>(said.get(i, {}).get(</span><span>"reason"</span><span>, </span><span>""</span><span>))[:</span><span>200</span><span>]}</span></span>
<span class="line"><span>                for</span><span> i, f </span><span>in</span><span> enumerate</span><span>(batch, </span><span>1</span><span>)]</span></span></code></pre>
<p><code>names</code> lists what a plan may call.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># kit.py</span></span>
<span class="line"><span>    def</span><span> report</span><span>(self, confirmed, model</span><span>=</span><span>"lead"</span><span>):</span></span>
<span class="line"><span>        # one line per confirmed finding</span></span>
<span class="line"><span>        rows </span><span>=</span><span> "</span><span>n</span><span>"</span><span>.join(</span><span>f</span><span>"C</span><span>{</span><span>i</span><span>}</span><span> | </span><span>{</span><span>f[</span><span>'file'</span><span>]</span><span>}</span><span>:</span><span>{</span><span>f[</span><span>'line'</span><span>]</span><span>}</span><span> | </span><span>{</span><span>f[</span><span>'function'</span><span>] </span><span>or</span><span> '-'</span><span>}</span><span> | </span><span>{</span><span>f[</span><span>'votes'</span><span>]</span><span>}</span><span> votes | </span><span>{</span><span>f[</span><span>'claim'</span><span>][:</span><span>160</span><span>]</span><span>}</span><span>"</span></span>
<span class="line"><span>                         for</span><span> i, f </span><span>in</span><span> enumerate</span><span>(confirmed, </span><span>1</span><span>))</span></span>
<span class="line"><span>        obj </span><span>=</span><span> (confirmed </span><span>and</span><span> self</span><span>.run.agent(</span><span>system</span><span>=</span><span>PROMPTS</span><span>[</span><span>"report"</span><span>], </span><span>data</span><span>=</span><span>rows, </span><span>schema</span><span>=</span><span>REPORT</span><span>, </span><span>model</span><span>=</span><span>model, </span><span>role</span><span>=</span><span>"report"</span><span>, </span><span>label</span><span>=</span><span>"report"</span><span>,</span></span>
<span class="line"><span>                                            sample</span><span>=</span><span>self</span><span>.offset)) </span><span>or</span><span> {}</span></span>
<span class="line"><span>        rank </span><span>=</span><span> {i: g.get(</span><span>"severity"</span><span>, </span><span>"unranked"</span><span>) </span><span>for</span><span> g </span><span>in</span><span> obj.get(</span><span>"bugs"</span><span>, []) </span><span>for</span><span> i </span><span>in</span><span> g[</span><span>"ids"</span><span>]}      </span><span># the severity the report gave each id</span></span>
<span class="line"><span>        bugs </span><span>=</span><span> [</span><span>dict</span><span>(f, </span><span>severity</span><span>=</span><span>rank.get(</span><span>f</span><span>"C</span><span>{</span><span>i</span><span>}</span><span>"</span><span>, </span><span>"unranked"</span><span>)) </span><span>for</span><span> i, f </span><span>in</span><span> enumerate</span><span>(confirmed, </span><span>1</span><span>)]   </span><span># a finding the writer forgot is added back</span></span>
<span class="line"><span>        return</span><span> {</span><span>"bugs"</span><span>: bugs, </span><span>"summary"</span><span>: </span><span>str</span><span>(obj.get(</span><span>"summary"</span><span>, </span><span>""</span><span>))[:</span><span>600</span><span>], </span><span>"left_out"</span><span>: </span><span>sum</span><span>(</span><span>f</span><span>"C</span><span>{</span><span>i</span><span>}</span><span>"</span><span> not</span><span> in</span><span> rank </span><span>for</span><span> i </span><span>in</span><span> range</span><span>(</span><span>1</span><span>, </span><span>len</span><span>(confirmed) </span><span>+</span><span> 1</span><span>))}</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> names</span><span>(self):</span></span>
<span class="line"><span>        run, budget </span><span>=</span><span> self</span><span>.run, </span><span>self</span><span>.run.llm.budget       </span><span># everything a plan may call</span></span>
<span class="line"><span>        return</span><span> {</span><span>"agent"</span><span>: </span><span>lambda</span><span> prompt</span><span>=</span><span>""</span><span>, </span><span>**</span><span>kw: run.agent(prompt, </span><span>**</span><span>dict</span><span>(kw, </span><span>sample</span><span>=</span><span>self</span><span>.offset </span><span>+</span><span> kw.get(</span><span>"sample"</span><span>, </span><span>0</span><span>))),</span></span>
<span class="line"><span>                "parallel"</span><span>: run.parallel, </span><span>"phase"</span><span>: run.phase, </span><span>"log"</span><span>: run.log, </span><span>"budget"</span><span>: </span><span>lambda</span><span>: </span><span>round</span><span>(budget.cap </span><span>-</span><span> budget.spent </span><span>-</span><span> budget.reserved, </span><span>2</span><span>),</span></span>
<span class="line"><span>                "work"</span><span>: </span><span>list</span><span>(</span><span>WORK</span><span>), </span><span>"shards"</span><span>: </span><span>lambda</span><span> tokens</span><span>=</span><span>SHARD_TOKENS</span><span>: pack(</span><span>WORK</span><span>, </span><span>int</span><span>(tokens)), </span><span>"batches"</span><span>: batches, </span><span>"flatten"</span><span>: flatten,</span></span>
<span class="line"><span>                "render"</span><span>: </span><span>lambda</span><span> shard: </span><span>"</span><span>nn</span><span>"</span><span>.join(</span><span>map</span><span>(numbered, shard)), </span><span>"dedupe"</span><span>: dedupe, </span><span>"key_of"</span><span>: key_of, </span><span>"scan"</span><span>: </span><span>self</span><span>.scan,</span></span>
<span class="line"><span>                "check"</span><span>: </span><span>self</span><span>.check, </span><span>"vote"</span><span>: vote, </span><span>"report"</span><span>: </span><span>self</span><span>.report, </span><span>"LENSES"</span><span>: </span><span>list</span><span>(</span><span>LENSES</span><span>), </span><span>"MODELS"</span><span>: </span><span>sorted</span><span>(</span><span>MODELS</span><span>),</span></span>
<span class="line"><span>                "SCHEMAS"</span><span>: {</span><span>"findings"</span><span>: </span><span>FINDINGS</span><span>, </span><span>"verdicts"</span><span>: </span><span>VERDICTS</span><span>}}</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># kit.py</span></span>
<span class="line"><span>    def</span><span> report</span><span>(self, confirmed, model</span><span>=</span><span>"lead"</span><span>):</span></span>
<span class="line"><span>        # one line per confirmed finding</span></span>
<span class="line"><span>        rows </span><span>=</span><span> "</span><span>n</span><span>"</span><span>.join(</span><span>f</span><span>"C</span><span>{</span><span>i</span><span>}</span><span> | </span><span>{</span><span>f[</span><span>'file'</span><span>]</span><span>}</span><span>:</span><span>{</span><span>f[</span><span>'line'</span><span>]</span><span>}</span><span> | </span><span>{</span><span>f[</span><span>'function'</span><span>] </span><span>or</span><span> '-'</span><span>}</span><span> | </span><span>{</span><span>f[</span><span>'votes'</span><span>]</span><span>}</span><span> votes | </span><span>{</span><span>f[</span><span>'claim'</span><span>][:</span><span>160</span><span>]</span><span>}</span><span>"</span></span>
<span class="line"><span>                         for</span><span> i, f </span><span>in</span><span> enumerate</span><span>(confirmed, </span><span>1</span><span>))</span></span>
<span class="line"><span>        obj </span><span>=</span><span> (confirmed </span><span>and</span><span> self</span><span>.run.agent(</span><span>system</span><span>=</span><span>PROMPTS</span><span>[</span><span>"report"</span><span>], </span><span>data</span><span>=</span><span>rows, </span><span>schema</span><span>=</span><span>REPORT</span><span>, </span><span>model</span><span>=</span><span>model, </span><span>role</span><span>=</span><span>"report"</span><span>, </span><span>label</span><span>=</span><span>"report"</span><span>,</span></span>
<span class="line"><span>                                            sample</span><span>=</span><span>self</span><span>.offset)) </span><span>or</span><span> {}</span></span>
<span class="line"><span>        rank </span><span>=</span><span> {i: g.get(</span><span>"severity"</span><span>, </span><span>"unranked"</span><span>) </span><span>for</span><span> g </span><span>in</span><span> obj.get(</span><span>"bugs"</span><span>, []) </span><span>for</span><span> i </span><span>in</span><span> g[</span><span>"ids"</span><span>]}      </span><span># the severity the report gave each id</span></span>
<span class="line"><span>        bugs </span><span>=</span><span> [</span><span>dict</span><span>(f, </span><span>severity</span><span>=</span><span>rank.get(</span><span>f</span><span>"C</span><span>{</span><span>i</span><span>}</span><span>"</span><span>, </span><span>"unranked"</span><span>)) </span><span>for</span><span> i, f </span><span>in</span><span> enumerate</span><span>(confirmed, </span><span>1</span><span>)]   </span><span># a finding the writer forgot is added back</span></span>
<span class="line"><span>        return</span><span> {</span><span>"bugs"</span><span>: bugs, </span><span>"summary"</span><span>: </span><span>str</span><span>(obj.get(</span><span>"summary"</span><span>, </span><span>""</span><span>))[:</span><span>600</span><span>], </span><span>"left_out"</span><span>: </span><span>sum</span><span>(</span><span>f</span><span>"C</span><span>{</span><span>i</span><span>}</span><span>"</span><span> not</span><span> in</span><span> rank </span><span>for</span><span> i </span><span>in</span><span> range</span><span>(</span><span>1</span><span>, </span><span>len</span><span>(confirmed) </span><span>+</span><span> 1</span><span>))}</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> names</span><span>(self):</span></span>
<span class="line"><span>        run, budget </span><span>=</span><span> self</span><span>.run, </span><span>self</span><span>.run.llm.budget       </span><span># everything a plan may call</span></span>
<span class="line"><span>        return</span><span> {</span><span>"agent"</span><span>: </span><span>lambda</span><span> prompt</span><span>=</span><span>""</span><span>, </span><span>**</span><span>kw: run.agent(prompt, </span><span>**</span><span>dict</span><span>(kw, </span><span>sample</span><span>=</span><span>self</span><span>.offset </span><span>+</span><span> kw.get(</span><span>"sample"</span><span>, </span><span>0</span><span>))),</span></span>
<span class="line"><span>                "parallel"</span><span>: run.parallel, </span><span>"phase"</span><span>: run.phase, </span><span>"log"</span><span>: run.log, </span><span>"budget"</span><span>: </span><span>lambda</span><span>: </span><span>round</span><span>(budget.cap </span><span>-</span><span> budget.spent </span><span>-</span><span> budget.reserved, </span><span>2</span><span>),</span></span>
<span class="line"><span>                "work"</span><span>: </span><span>list</span><span>(</span><span>WORK</span><span>), </span><span>"shards"</span><span>: </span><span>lambda</span><span> tokens</span><span>=</span><span>SHARD_TOKENS</span><span>: pack(</span><span>WORK</span><span>, </span><span>int</span><span>(tokens)), </span><span>"batches"</span><span>: batches, </span><span>"flatten"</span><span>: flatten,</span></span>
<span class="line"><span>                "render"</span><span>: </span><span>lambda</span><span> shard: </span><span>"</span><span>nn</span><span>"</span><span>.join(</span><span>map</span><span>(numbered, shard)), </span><span>"dedupe"</span><span>: dedupe, </span><span>"key_of"</span><span>: key_of, </span><span>"scan"</span><span>: </span><span>self</span><span>.scan,</span></span>
<span class="line"><span>                "check"</span><span>: </span><span>self</span><span>.check, </span><span>"vote"</span><span>: vote, </span><span>"report"</span><span>: </span><span>self</span><span>.report, </span><span>"LENSES"</span><span>: </span><span>list</span><span>(</span><span>LENSES</span><span>), </span><span>"MODELS"</span><span>: </span><span>sorted</span><span>(</span><span>MODELS</span><span>),</span></span>
<span class="line"><span>                "SCHEMAS"</span><span>: {</span><span>"findings"</span><span>: </span><span>FINDINGS</span><span>, </span><span>"verdicts"</span><span>: </span><span>VERDICTS</span><span>}}</span></span></code></pre>
<h4>Fixed baseline</h4>
<p>I need a plan to beat first: scan every shard through all three lenses, check each finding with three skeptics, keep what two confirm.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>"""plans.py: a fixed plan, the whitelist, the dry run and the gate."""</span></span>
<span class="line"><span>import</span><span> ast, builtins, collections, hashlib, json, re, threading, zlib</span></span>
<span class="line"></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> PRICE</span></span>
<span class="line"><span>from</span><span> kit </span><span>import</span><span> AuditKit</span></span>
<span class="line"><span>from</span><span> llm </span><span>import</span><span> LLM</span><span>, Budget, Ledger, Reply</span></span>
<span class="line"><span>from</span><span> runtime </span><span>import</span><span> Run</span></span>
<span class="line"></span>
<span class="line"><span>FIXED_PROGRAM</span><span> =</span><span> """phase("Scan")</span></span>
<span class="line"><span>found = flatten(parallel([lambda s=s, lens=lens: scan(s, lens) for s in shards(100000) for lens in LENSES]))</span></span>
<span class="line"><span>candidates = dedupe(found)</span></span>
<span class="line"><span>phase("Verify")</span></span>
<span class="line"><span>verdicts = flatten(parallel([lambda b=b, k=k: check(b, sample=k) for b in batches(candidates, 6) for k in range(3)]))</span></span>
<span class="line"><span>confirmed = vote(candidates, verdicts, need=2)</span></span>
<span class="line"><span>phase("Report")</span></span>
<span class="line"><span>result = report(confirmed)"""</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>"""plans.py: a fixed plan, the whitelist, the dry run and the gate."""</span></span>
<span class="line"><span>import</span><span> ast, builtins, collections, hashlib, json, re, threading, zlib</span></span>
<span class="line"></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> PRICE</span></span>
<span class="line"><span>from</span><span> kit </span><span>import</span><span> AuditKit</span></span>
<span class="line"><span>from</span><span> llm </span><span>import</span><span> LLM</span><span>, Budget, Ledger, Reply</span></span>
<span class="line"><span>from</span><span> runtime </span><span>import</span><span> Run</span></span>
<span class="line"></span>
<span class="line"><span>FIXED_PROGRAM</span><span> =</span><span> """phase("Scan")</span></span>
<span class="line"><span>found = flatten(parallel([lambda s=s, lens=lens: scan(s, lens) for s in shards(100000) for lens in LENSES]))</span></span>
<span class="line"><span>candidates = dedupe(found)</span></span>
<span class="line"><span>phase("Verify")</span></span>
<span class="line"><span>verdicts = flatten(parallel([lambda b=b, k=k: check(b, sample=k) for b in batches(candidates, 6) for k in range(3)]))</span></span>
<span class="line"><span>confirmed = vote(candidates, verdicts, need=2)</span></span>
<span class="line"><span>phase("Report")</span></span>
<span class="line"><span>result = report(confirmed)"""</span></span></code></pre>
<p>Across three runs the plan found 20, 23 and 22 of the 72 bugs, a recall of 0.28, 0.32 and 0.31, for about 14 credits a run.</p>
<h3>Restricted Plan Language</h3>
<p>Our fixed plan never changes, yet in its own records rounds two and three found 9 planted bugs that round one missed. A better plan scans until a round adds little and shrinks when <code>budget()</code> is low. A list of settings cannot express that, which is why the lead writes Python.</p>
<p>It is a restricted Python that can be checked before it runs and reaches only the names it is given. The restriction is a <strong>whitelist</strong> of rules that each forbid one thing. It is not a security boundary, because the plans come from our own lead.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>ALLOWED</span><span> =</span><span> {</span><span>getattr</span><span>(ast, n) </span><span>for</span><span> n </span><span>in</span><span> (            </span><span># the only kinds of syntax a plan may use</span></span>
<span class="line"><span>    "Module Expr Assign AugAssign For If Break Continue Return FunctionDef Lambda ListComp DictComp SetComp GeneratorExp comprehension "</span></span>
<span class="line"><span>    "Call keyword Name Attribute Subscript Slice Constant List Tuple Dict Set BoolOp BinOp UnaryOp Compare IfExp JoinedStr FormattedValue "</span></span>
<span class="line"><span>    "arguments arg Starred Load Store And Or Add Sub Mult Div FloorDiv Mod Not USub UAdd Eq NotEq Lt LtE Gt GtE In NotIn Is IsNot"</span><span>).split()}</span></span>
<span class="line"><span>WHY_NOT</span><span> =</span><span> {ast.While: </span><span>"use a for loop over range(n), so the loop states its bound"</span><span>, ast.Import: </span><span>"a plan has nothing to import"</span><span>,</span></span>
<span class="line"><span>           ast.Try: </span><span>"a plan must not hide errors, and failed workers already return None"</span><span>}</span></span>
<span class="line"><span>METHODS</span><span> =</span><span> {</span><span>"append"</span><span>, </span><span>"extend"</span><span>, </span><span>"get"</span><span>, </span><span>"items"</span><span>, </span><span>"keys"</span><span>, </span><span>"values"</span><span>, </span><span>"update"</span><span>, </span><span>"add"</span><span>, </span><span>"setdefault"</span><span>, </span><span>"pop"</span><span>, </span><span>"sort"</span><span>, </span><span>"split"</span><span>, </span><span>"strip"</span><span>, </span><span>"lower"</span><span>, </span><span>"upper"</span><span>,</span></span>
<span class="line"><span>           "join"</span><span>, </span><span>"startswith"</span><span>, </span><span>"endswith"</span><span>, </span><span>"count"</span><span>, </span><span>"index"</span><span>, </span><span>"replace"</span><span>}      </span><span># the methods a plan may call on data, with format left out on purpose</span></span>
<span class="line"><span>BUILTINS</span><span> =</span><span> [</span><span>"len"</span><span>, </span><span>"range"</span><span>, </span><span>"enumerate"</span><span>, </span><span>"zip"</span><span>, </span><span>"sorted"</span><span>, </span><span>"min"</span><span>, </span><span>"max"</span><span>, </span><span>"sum"</span><span>, </span><span>"any"</span><span>, </span><span>"all"</span><span>, </span><span>"list"</span><span>, </span><span>"dict"</span><span>, </span><span>"set"</span><span>, </span><span>"tuple"</span><span>, </span><span>"str"</span><span>, </span><span>"int"</span><span>,</span></span>
<span class="line"><span>            "float"</span><span>, </span><span>"round"</span><span>, </span><span>"abs"</span><span>]</span></span>
<span class="line"></span>
<span class="line"><span>class</span><span> PlanRejected</span><span>(</span><span>ValueError</span><span>):</span></span>
<span class="line"><span>    """A plan program failed the whitelist check or the dry run."""</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>ALLOWED</span><span> =</span><span> {</span><span>getattr</span><span>(ast, n) </span><span>for</span><span> n </span><span>in</span><span> (            </span><span># the only kinds of syntax a plan may use</span></span>
<span class="line"><span>    "Module Expr Assign AugAssign For If Break Continue Return FunctionDef Lambda ListComp DictComp SetComp GeneratorExp comprehension "</span></span>
<span class="line"><span>    "Call keyword Name Attribute Subscript Slice Constant List Tuple Dict Set BoolOp BinOp UnaryOp Compare IfExp JoinedStr FormattedValue "</span></span>
<span class="line"><span>    "arguments arg Starred Load Store And Or Add Sub Mult Div FloorDiv Mod Not USub UAdd Eq NotEq Lt LtE Gt GtE In NotIn Is IsNot"</span><span>).split()}</span></span>
<span class="line"><span>WHY_NOT</span><span> =</span><span> {ast.While: </span><span>"use a for loop over range(n), so the loop states its bound"</span><span>, ast.Import: </span><span>"a plan has nothing to import"</span><span>,</span></span>
<span class="line"><span>           ast.Try: </span><span>"a plan must not hide errors, and failed workers already return None"</span><span>}</span></span>
<span class="line"><span>METHODS</span><span> =</span><span> {</span><span>"append"</span><span>, </span><span>"extend"</span><span>, </span><span>"get"</span><span>, </span><span>"items"</span><span>, </span><span>"keys"</span><span>, </span><span>"values"</span><span>, </span><span>"update"</span><span>, </span><span>"add"</span><span>, </span><span>"setdefault"</span><span>, </span><span>"pop"</span><span>, </span><span>"sort"</span><span>, </span><span>"split"</span><span>, </span><span>"strip"</span><span>, </span><span>"lower"</span><span>, </span><span>"upper"</span><span>,</span></span>
<span class="line"><span>           "join"</span><span>, </span><span>"startswith"</span><span>, </span><span>"endswith"</span><span>, </span><span>"count"</span><span>, </span><span>"index"</span><span>, </span><span>"replace"</span><span>}      </span><span># the methods a plan may call on data, with format left out on purpose</span></span>
<span class="line"><span>BUILTINS</span><span> =</span><span> [</span><span>"len"</span><span>, </span><span>"range"</span><span>, </span><span>"enumerate"</span><span>, </span><span>"zip"</span><span>, </span><span>"sorted"</span><span>, </span><span>"min"</span><span>, </span><span>"max"</span><span>, </span><span>"sum"</span><span>, </span><span>"any"</span><span>, </span><span>"all"</span><span>, </span><span>"list"</span><span>, </span><span>"dict"</span><span>, </span><span>"set"</span><span>, </span><span>"tuple"</span><span>, </span><span>"str"</span><span>, </span><span>"int"</span><span>,</span></span>
<span class="line"><span>            "float"</span><span>, </span><span>"round"</span><span>, </span><span>"abs"</span><span>]</span></span>
<span class="line"></span>
<span class="line"><span>class</span><span> PlanRejected</span><span>(</span><span>ValueError</span><span>):</span></span>
<span class="line"><span>    """A plan program failed the whitelist check or the dry run."""</span></span></code></pre>
<p>Rules 2 and 4 check the syntax.</p>
<p>							 1_000_000:<br />
            out.append(f&#x22;line {line}: the number {n.value} is larger than any plan needs&#x22;)<br />
        # rule 4: only allowed method calls<br />
        elif isinstance(n, ast.Attribute) and (n.attr.startswith(&#x22;_&#x22;) or id(n) not in called or n.attr not in METHODS):<br />
            out.append(f&#x22;line {line}: &#x27;.{n.attr}&#x27; is not allowed: a plan may only call {&#x27;, &#x27;.join(sorted(METHODS))} on data&#x22;)<br />
    return out&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-3 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>def</span><span> rule_syntax</span><span>(tree):</span></span>
<span class="line"><span>    """Rules 2 and 4: only the allowed syntax, no number above a million, and attributes only as calls of a few methods."""</span></span>
<span class="line"><span>    # called attributes, so a bare one stands out</span></span>
<span class="line"><span>    called, out </span><span>=</span><span> {</span><span>id</span><span>(n.func) </span><span>for</span><span> n </span><span>in</span><span> ast.walk(tree) </span><span>if</span><span> isinstance</span><span>(n, ast.Call)}, []</span></span>
<span class="line"><span>    for</span><span> n </span><span>in</span><span> ast.walk(tree):</span></span>
<span class="line"><span>        line </span><span>=</span><span> getattr</span><span>(n, </span><span>"lineno"</span><span>, </span><span>1</span><span>)</span></span>
<span class="line"><span>        if</span><span> type</span><span>(n) </span><span>not</span><span> in</span><span> ALLOWED</span><span>:                                </span><span># rule 2: syntax outside the list</span></span>
<span class="line"><span>            out.append(</span><span>f</span><span>"line </span><span>{</span><span>line</span><span>}</span><span>: </span><span>{type</span><span>(n).</span><span>__name__}</span><span> is not allowed: </span><span>{WHY_NOT</span><span>.get(</span><span>type</span><span>(n), </span><span>'it is not part of the plan language'</span><span>)</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"><span>        # rule 2 again: a number no plan needs</span></span>
<span class="line"><span>        elif</span><span> isinstance</span><span>(n, ast.Constant) </span><span>and</span><span> type</span><span>(n.value) </span><span>is</span><span> int</span><span> and</span><span> abs</span><span>(n.value) </span><span>&gt;</span><span> 1_000_000</span><span>:</span></span>
<span class="line"><span>            out.append(</span><span>f</span><span>"line </span><span>{</span><span>line</span><span>}</span><span>: the number </span><span>{</span><span>n.value</span><span>}</span><span> is larger than any plan needs"</span><span>)</span></span>
<span class="line"><span>        # rule 4: only allowed method calls</span></span>
<span class="line"><span>        elif</span><span> isinstance</span><span>(n, ast.Attribute) </span><span>and</span><span> (n.attr.startswith(</span><span>"_"</span><span>) </span><span>or</span><span> id</span><span>(n) </span><span>not</span><span> in</span><span> called </span><span>or</span><span> n.attr </span><span>not</span><span> in</span><span> METHODS</span><span>):</span></span>
<span class="line"><span>            out.append(</span><span>f</span><span>"line </span><span>{</span><span>line</span><span>}</span><span>: '.</span><span>{</span><span>n.attr</span><span>}</span><span>' is not allowed: a plan may only call </span><span>{</span><span>', '</span><span>.join(</span><span>sorted</span><span>(</span><span>METHODS</span><span>))</span><span>}</span><span> on data"</span><span>)</span></span>
<span class="line"><span>    return</span><span> out</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>def</span><span> rule_syntax</span><span>(tree):</span></span>
<span class="line"><span>    """Rules 2 and 4: only the allowed syntax, no number above a million, and attributes only as calls of a few methods."""</span></span>
<span class="line"><span>    # called attributes, so a bare one stands out</span></span>
<span class="line"><span>    called, out </span><span>=</span><span> {</span><span>id</span><span>(n.func) </span><span>for</span><span> n </span><span>in</span><span> ast.walk(tree) </span><span>if</span><span> isinstance</span><span>(n, ast.Call)}, []</span></span>
<span class="line"><span>    for</span><span> n </span><span>in</span><span> ast.walk(tree):</span></span>
<span class="line"><span>        line </span><span>=</span><span> getattr</span><span>(n, </span><span>"lineno"</span><span>, </span><span>1</span><span>)</span></span>
<span class="line"><span>        if</span><span> type</span><span>(n) </span><span>not</span><span> in</span><span> ALLOWED</span><span>:                                </span><span># rule 2: syntax outside the list</span></span>
<span class="line"><span>            out.append(</span><span>f</span><span>"line </span><span>{</span><span>line</span><span>}</span><span>: </span><span>{type</span><span>(n).</span><span>__name__}</span><span> is not allowed: </span><span>{WHY_NOT</span><span>.get(</span><span>type</span><span>(n), </span><span>'it is not part of the plan language'</span><span>)</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"><span>        # rule 2 again: a number no plan needs</span></span>
<span class="line"><span>        elif</span><span> isinstance</span><span>(n, ast.Constant) </span><span>and</span><span> type</span><span>(n.value) </span><span>is</span><span> int</span><span> and</span><span> abs</span><span>(n.value) </span><span>&gt;</span><span> 1_000_000</span><span>:</span></span>
<span class="line"><span>            out.append(</span><span>f</span><span>"line </span><span>{</span><span>line</span><span>}</span><span>: the number </span><span>{</span><span>n.value</span><span>}</span><span> is larger than any plan needs"</span><span>)</span></span>
<span class="line"><span>        # rule 4: only allowed method calls</span></span>
<span class="line"><span>        elif</span><span> isinstance</span><span>(n, ast.Attribute) </span><span>and</span><span> (n.attr.startswith(</span><span>"_"</span><span>) </span><span>or</span><span> id</span><span>(n) </span><span>not</span><span> in</span><span> called </span><span>or</span><span> n.attr </span><span>not</span><span> in</span><span> METHODS</span><span>):</span></span>
<span class="line"><span>            out.append(</span><span>f</span><span>"line </span><span>{</span><span>line</span><span>}</span><span>: '.</span><span>{</span><span>n.attr</span><span>}</span><span>' is not allowed: a plan may only call </span><span>{</span><span>', '</span><span>.join(</span><span>sorted</span><span>(</span><span>METHODS</span><span>))</span><span>}</span><span> on data"</span><span>)</span></span>
<span class="line"><span>    return</span><span> out</span></span></code></pre>
<p>Rule 3 checks every name.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>def</span><span> rule_names</span><span>(tree, names):</span></span>
<span class="line"><span>    """Rule 3: only the given names. None starts with an underscore, and the language itself cannot be reassigned."""</span></span>
<span class="line"><span>    # names the plan binds itself</span></span>
<span class="line"><span>    bound </span><span>=</span><span> {n.id </span><span>for</span><span> n </span><span>in</span><span> ast.walk(tree) </span><span>if</span><span> isinstance</span><span>(n, ast.Name) </span><span>and</span><span> isinstance</span><span>(n.ctx, ast.Store)}</span></span>
<span class="line"><span>    bound </span><span>|=</span><span> {n.name </span><span>for</span><span> n </span><span>in</span><span> ast.walk(tree) </span><span>if</span><span> isinstance</span><span>(n, ast.FunctionDef)} </span><span>|</span><span> {n.arg </span><span>for</span><span> n </span><span>in</span><span> ast.walk(tree) </span><span>if</span><span> isinstance</span><span>(n, ast.arg)}</span></span>
<span class="line"><span>    out </span><span>=</span><span> []</span></span>
<span class="line"><span>    for</span><span> n </span><span>in</span><span> ast.walk(tree):</span></span>
<span class="line"><span>        name </span><span>=</span><span> n.id </span><span>if</span><span> isinstance</span><span>(n, ast.Name) </span><span>else</span><span> n.name </span><span>if</span><span> isinstance</span><span>(n, ast.FunctionDef) </span><span>else</span><span> n.arg </span><span>if</span><span> isinstance</span><span>(n, ast.arg) </span><span>else</span><span> None</span></span>
<span class="line"><span>        stored </span><span>=</span><span> not</span><span> isinstance</span><span>(n, ast.Name) </span><span>or</span><span> isinstance</span><span>(n.ctx, ast.Store)</span></span>
<span class="line"><span>        if</span><span> name </span><span>is</span><span> None</span><span>:</span></span>
<span class="line"><span>            continue</span></span>
<span class="line"><span>        if</span><span> name.startswith(</span><span>"_"</span><span>) </span><span>and</span><span> name </span><span>!=</span><span> "_"</span><span>:                  </span><span># a lone _ is the usual name for an unused value</span></span>
<span class="line"><span>            out.append(</span><span>f</span><span>"line </span><span>{</span><span>n.lineno</span><span>}</span><span>: the name '</span><span>{</span><span>name</span><span>}</span><span>' starts with an underscore, which is not allowed"</span><span>)</span></span>
<span class="line"><span>        elif</span><span> name </span><span>in</span><span> names </span><span>and</span><span> stored:</span></span>
<span class="line"><span>            out.append(</span><span>f</span><span>"line </span><span>{</span><span>n.lineno</span><span>}</span><span>: '</span><span>{</span><span>name</span><span>}</span><span>' is part of the plan language and cannot be reassigned"</span><span>)</span></span>
<span class="line"><span>        # a name it reads must be defined</span></span>
<span class="line"><span>        elif</span><span> not</span><span> stored </span><span>and</span><span> name </span><span>not</span><span> in</span><span> names </span><span>|</span><span> set</span><span>(</span><span>BUILTINS</span><span>) </span><span>|</span><span> bound:</span></span>
<span class="line"><span>            out.append(</span><span>f</span><span>"line </span><span>{</span><span>n.lineno</span><span>}</span><span>: the name '</span><span>{</span><span>name</span><span>}</span><span>' is not defined: the plan language has no such name"</span><span>)</span></span>
<span class="line"><span>    return</span><span> sorted</span><span>(</span><span>set</span><span>(out), </span><span>key</span><span>=lambda</span><span> s: </span><span>int</span><span>(s.split(</span><span>":"</span><span>)[</span><span>0</span><span>][</span><span>5</span><span>:]))</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>def</span><span> rule_names</span><span>(tree, names):</span></span>
<span class="line"><span>    """Rule 3: only the given names. None starts with an underscore, and the language itself cannot be reassigned."""</span></span>
<span class="line"><span>    # names the plan binds itself</span></span>
<span class="line"><span>    bound </span><span>=</span><span> {n.id </span><span>for</span><span> n </span><span>in</span><span> ast.walk(tree) </span><span>if</span><span> isinstance</span><span>(n, ast.Name) </span><span>and</span><span> isinstance</span><span>(n.ctx, ast.Store)}</span></span>
<span class="line"><span>    bound </span><span>|=</span><span> {n.name </span><span>for</span><span> n </span><span>in</span><span> ast.walk(tree) </span><span>if</span><span> isinstance</span><span>(n, ast.FunctionDef)} </span><span>|</span><span> {n.arg </span><span>for</span><span> n </span><span>in</span><span> ast.walk(tree) </span><span>if</span><span> isinstance</span><span>(n, ast.arg)}</span></span>
<span class="line"><span>    out </span><span>=</span><span> []</span></span>
<span class="line"><span>    for</span><span> n </span><span>in</span><span> ast.walk(tree):</span></span>
<span class="line"><span>        name </span><span>=</span><span> n.id </span><span>if</span><span> isinstance</span><span>(n, ast.Name) </span><span>else</span><span> n.name </span><span>if</span><span> isinstance</span><span>(n, ast.FunctionDef) </span><span>else</span><span> n.arg </span><span>if</span><span> isinstance</span><span>(n, ast.arg) </span><span>else</span><span> None</span></span>
<span class="line"><span>        stored </span><span>=</span><span> not</span><span> isinstance</span><span>(n, ast.Name) </span><span>or</span><span> isinstance</span><span>(n.ctx, ast.Store)</span></span>
<span class="line"><span>        if</span><span> name </span><span>is</span><span> None</span><span>:</span></span>
<span class="line"><span>            continue</span></span>
<span class="line"><span>        if</span><span> name.startswith(</span><span>"_"</span><span>) </span><span>and</span><span> name </span><span>!=</span><span> "_"</span><span>:                  </span><span># a lone _ is the usual name for an unused value</span></span>
<span class="line"><span>            out.append(</span><span>f</span><span>"line </span><span>{</span><span>n.lineno</span><span>}</span><span>: the name '</span><span>{</span><span>name</span><span>}</span><span>' starts with an underscore, which is not allowed"</span><span>)</span></span>
<span class="line"><span>        elif</span><span> name </span><span>in</span><span> names </span><span>and</span><span> stored:</span></span>
<span class="line"><span>            out.append(</span><span>f</span><span>"line </span><span>{</span><span>n.lineno</span><span>}</span><span>: '</span><span>{</span><span>name</span><span>}</span><span>' is part of the plan language and cannot be reassigned"</span><span>)</span></span>
<span class="line"><span>        # a name it reads must be defined</span></span>
<span class="line"><span>        elif</span><span> not</span><span> stored </span><span>and</span><span> name </span><span>not</span><span> in</span><span> names </span><span>|</span><span> set</span><span>(</span><span>BUILTINS</span><span>) </span><span>|</span><span> bound:</span></span>
<span class="line"><span>            out.append(</span><span>f</span><span>"line </span><span>{</span><span>n.lineno</span><span>}</span><span>: the name '</span><span>{</span><span>name</span><span>}</span><span>' is not defined: the plan language has no such name"</span><span>)</span></span>
<span class="line"><span>    return</span><span> sorted</span><span>(</span><span>set</span><span>(out), </span><span>key</span><span>=lambda</span><span> s: </span><span>int</span><span>(s.split(</span><span>":"</span><span>)[</span><span>0</span><span>][</span><span>5</span><span>:]))</span></span></code></pre>
<p>Rule 1 keeps a plan short and rule 5 asks it to assign <code>result</code>.</p>
<p>							 6000 or len(src.splitlines()) &gt; 80:             # rule 1: short enough to read in one sitting<br />
        return [f&#x22;line 1: the program has {len(src.splitlines())} lines and {len(src)} characters, and the limit is 80 and 6,000&#x22;]<br />
    try:<br />
        tree = ast.parse(src)<br />
    except SyntaxError as e:<br />
        return [f&#x22;line {e.lineno}: this is not valid Python ({e.msg})&#x22;]<br />
    has_result = any(isinstance(n, ast.Name) and n.id == &#x22;result&#x22; and isinstance(n.ctx, ast.Store) for n in ast.walk(tree))   # rule 5: the plan sets result<br />
    # rules 2, 3 and 4 walk the syntax tree<br />
    return rule_syntax(tree) + rule_names(tree, set(names)) + ([] if has_result else [&#x22;line 1: the program never assigns &#x60;result&#x60;&#x22;])&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-3 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>def</span><span> check_program</span><span>(src, names):</span></span>
<span class="line"><span>    """Every problem with a plan program, by line. An empty list means it may go on."""</span></span>
<span class="line"><span>    if</span><span> len</span><span>(src) </span><span>&gt;</span><span> 6000</span><span> or</span><span> len</span><span>(src.splitlines()) </span><span>&gt;</span><span> 80</span><span>:             </span><span># rule 1: short enough to read in one sitting</span></span>
<span class="line"><span>        return</span><span> [</span><span>f</span><span>"line 1: the program has </span><span>{len</span><span>(src.splitlines())</span><span>}</span><span> lines and </span><span>{len</span><span>(src)</span><span>}</span><span> characters, and the limit is 80 and 6,000"</span><span>]</span></span>
<span class="line"><span>    try</span><span>:</span></span>
<span class="line"><span>        tree </span><span>=</span><span> ast.parse(src)</span></span>
<span class="line"><span>    except</span><span> SyntaxError</span><span> as</span><span> e:</span></span>
<span class="line"><span>        return</span><span> [</span><span>f</span><span>"line </span><span>{</span><span>e.lineno</span><span>}</span><span>: this is not valid Python (</span><span>{</span><span>e.msg</span><span>}</span><span>)"</span><span>]</span></span>
<span class="line"><span>    has_result </span><span>=</span><span> any</span><span>(</span><span>isinstance</span><span>(n, ast.Name) </span><span>and</span><span> n.id </span><span>==</span><span> "result"</span><span> and</span><span> isinstance</span><span>(n.ctx, ast.Store) </span><span>for</span><span> n </span><span>in</span><span> ast.walk(tree))   </span><span># rule 5: the plan sets result</span></span>
<span class="line"><span>    # rules 2, 3 and 4 walk the syntax tree</span></span>
<span class="line"><span>    return</span><span> rule_syntax(tree) </span><span>+</span><span> rule_names(tree, </span><span>set</span><span>(names)) </span><span>+</span><span> ([] </span><span>if</span><span> has_result </span><span>else</span><span> [</span><span>"line 1: the program never assigns `result`"</span><span>])</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>def</span><span> check_program</span><span>(src, names):</span></span>
<span class="line"><span>    """Every problem with a plan program, by line. An empty list means it may go on."""</span></span>
<span class="line"><span>    if</span><span> len</span><span>(src) </span><span>&gt;</span><span> 6000</span><span> or</span><span> len</span><span>(src.splitlines()) </span><span>&gt;</span><span> 80</span><span>:             </span><span># rule 1: short enough to read in one sitting</span></span>
<span class="line"><span>        return</span><span> [</span><span>f</span><span>"line 1: the program has </span><span>{len</span><span>(src.splitlines())</span><span>}</span><span> lines and </span><span>{len</span><span>(src)</span><span>}</span><span> characters, and the limit is 80 and 6,000"</span><span>]</span></span>
<span class="line"><span>    try</span><span>:</span></span>
<span class="line"><span>        tree </span><span>=</span><span> ast.parse(src)</span></span>
<span class="line"><span>    except</span><span> SyntaxError</span><span> as</span><span> e:</span></span>
<span class="line"><span>        return</span><span> [</span><span>f</span><span>"line </span><span>{</span><span>e.lineno</span><span>}</span><span>: this is not valid Python (</span><span>{</span><span>e.msg</span><span>}</span><span>)"</span><span>]</span></span>
<span class="line"><span>    has_result </span><span>=</span><span> any</span><span>(</span><span>isinstance</span><span>(n, ast.Name) </span><span>and</span><span> n.id </span><span>==</span><span> "result"</span><span> and</span><span> isinstance</span><span>(n.ctx, ast.Store) </span><span>for</span><span> n </span><span>in</span><span> ast.walk(tree))   </span><span># rule 5: the plan sets result</span></span>
<span class="line"><span>    # rules 2, 3 and 4 walk the syntax tree</span></span>
<span class="line"><span>    return</span><span> rule_syntax(tree) </span><span>+</span><span> rule_names(tree, </span><span>set</span><span>(names)) </span><span>+</span><span> ([] </span><span>if</span><span> has_result </span><span>else</span><span> [</span><span>"line 1: the program never assigns `result`"</span><span>])</span></span></code></pre>
<p><code>run_program</code> runs a plan only after it passes, with nothing but the kit and a few built-ins in reach.</p>
<p>							&lt;button data-code=&quot;# plans.py<br />
def run_program(src, kit):<br />
    problems = check_program(src, kit.names())<br />
    if problems:<br />
        raise PlanRejected(&#x22; | &#x22;.join(problems[:5]))<br />
    # only the kit&#x27;s names and safe built-ins<br />
    env = dict(kit.names(), __builtins__={n: getattr(builtins, n) for n in BUILTINS})<br />
    exec(compile(src, f&#x22;&#x22;, &#x22;exec&#x22;), env)<br />
    return env.get(&#x22;result&#x22;)&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-3 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>def</span><span> run_program</span><span>(src, kit):</span></span>
<span class="line"><span>    problems </span><span>=</span><span> check_program(src, kit.names())</span></span>
<span class="line"><span>    if</span><span> problems:</span></span>
<span class="line"><span>        raise</span><span> PlanRejected(</span><span>" | "</span><span>.join(problems[:</span><span>5</span><span>]))</span></span>
<span class="line"><span>    # only the kit's names and safe built-ins</span></span>
<span class="line"><span>    env </span><span>=</span><span> dict</span><span>(kit.names(), </span><span>__builtins__</span><span>=</span><span>{n: </span><span>getattr</span><span>(builtins, n) </span><span>for</span><span> n </span><span>in</span><span> BUILTINS</span><span>})</span></span>
<span class="line"><span>    exec</span><span>(</span><span>compile</span><span>(src, </span><span>f</span><span>"&#x3C;plan </span><span>{</span><span>kit.run.run_id</span><span>}</span><span>&gt;"</span><span>, </span><span>"exec"</span><span>), env)</span></span>
<span class="line"><span>    return</span><span> env.get(</span><span>"result"</span><span>)</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>def</span><span> run_program</span><span>(src, kit):</span></span>
<span class="line"><span>    problems </span><span>=</span><span> check_program(src, kit.names())</span></span>
<span class="line"><span>    if</span><span> problems:</span></span>
<span class="line"><span>        raise</span><span> PlanRejected(</span><span>" | "</span><span>.join(problems[:</span><span>5</span><span>]))</span></span>
<span class="line"><span>    # only the kit's names and safe built-ins</span></span>
<span class="line"><span>    env </span><span>=</span><span> dict</span><span>(kit.names(), </span><span>__builtins__</span><span>=</span><span>{n: </span><span>getattr</span><span>(builtins, n) </span><span>for</span><span> n </span><span>in</span><span> BUILTINS</span><span>})</span></span>
<span class="line"><span>    exec</span><span>(</span><span>compile</span><span>(src, </span><span>f</span><span>"&#x3C;plan </span><span>{</span><span>kit.run.run_id</span><span>}</span><span>&gt;"</span><span>, </span><span>"exec"</span><span>), env)</span></span>
<span class="line"><span>    return</span><span> env.get(</span><span>"result"</span><span>)</span></span></code></pre>
<p>The checker refused all fourteen hostile programs I wrote, each with a reason a model can act on.</p>
<h3>Dry Runs and the Approval Gate</h3>
<p>A plan can pass every rule and still be costly, since how many workers it starts depends on what earlier workers send back. A <strong>dry run</strong> runs the plan as written against a stand-in model that answers at once and costs nothing.</p>
<p>							&gt; (j % 16)) % 60, &#x22;claim&#x22;: &#x22;a made-up finding&#x22;,<br />
                                &#x22;confidence&#x22;: 0.5} for j in range(seed % 3)]}          # none, one or two findings per call<br />
    elif system.startswith(&#x22;You check&#x22;):<br />
        seed = zlib.crc32((text[:200] + str(params.get(&#x22;sample&#x22;, 0))).encode())<br />
        answer = {&#x22;verdicts&#x22;: [{&#x22;report&#x22;: i, &#x22;real&#x22;: (seed &gt;&gt; i) % 5 <span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>def</span><span> blind</span><span>(model, messages, params):</span></span>
<span class="line"><span>    system, text </span><span>=</span><span> messages[</span><span>0</span><span>][</span><span>"content"</span><span>], messages[</span><span>-</span><span>1</span><span>][</span><span>"content"</span><span>]</span></span>
<span class="line"><span>    # answers come from a hash of the question</span></span>
<span class="line"><span>    seed </span><span>=</span><span> zlib.crc32((text[:</span><span>300</span><span>] </span><span>+</span><span> str</span><span>(params.get(</span><span>"sample"</span><span>, </span><span>0</span><span>))).encode())</span></span>
<span class="line"><span>    if</span><span> system.startswith(</span><span>"You are reviewing"</span><span>):</span></span>
<span class="line"><span>        paths </span><span>=</span><span> re.findall(</span><span>r</span><span>"</span><span>^</span><span>### </span><span>(S</span><span>+</span><span>)$</span><span>"</span><span>, text, re.M) </span><span>or</span><span> [</span><span>"unknown.py"</span><span>]</span></span>
<span class="line"><span>        answer </span><span>=</span><span> {</span><span>"findings"</span><span>: [{</span><span>"file"</span><span>: paths[(seed </span><span>+</span><span> 7</span><span> *</span><span> j) </span><span>%</span><span> len</span><span>(paths)], </span><span>"line"</span><span>: </span><span>5</span><span> +</span><span> (seed </span><span>&gt;&gt;</span><span> (j </span><span>%</span><span> 16</span><span>)) </span><span>%</span><span> 60</span><span>, </span><span>"claim"</span><span>: </span><span>"a made-up finding"</span><span>,</span></span>
<span class="line"><span>                                "confidence"</span><span>: </span><span>0.5</span><span>} </span><span>for</span><span> j </span><span>in</span><span> range</span><span>(seed </span><span>%</span><span> 3</span><span>)]}          </span><span># none, one or two findings per call</span></span>
<span class="line"><span>    elif</span><span> system.startswith(</span><span>"You check"</span><span>):</span></span>
<span class="line"><span>        seed </span><span>=</span><span> zlib.crc32((text[:</span><span>200</span><span>] </span><span>+</span><span> str</span><span>(params.get(</span><span>"sample"</span><span>, </span><span>0</span><span>))).encode())</span></span>
<span class="line"><span>        answer </span><span>=</span><span> {</span><span>"verdicts"</span><span>: [{</span><span>"report"</span><span>: i, </span><span>"real"</span><span>: (seed </span><span>&gt;&gt;</span><span> i) </span><span>%</span><span> 5</span><span> &#x3C;</span><span> 2</span><span>} </span><span>for</span><span> i </span><span>in</span><span> range</span><span>(</span><span>1</span><span>, </span><span>len</span><span>(re.findall(</span><span>r</span><span>"</span><span>^</span><span>--- report </span><span>d</span><span>+</span><span> ---</span><span>$</span><span>"</span><span>, text, re.M)) </span><span>+</span><span> 1</span><span>)]}</span></span>
<span class="line"><span>    else</span><span>:                                                         </span><span># the report: every finding in a group of its own</span></span>
<span class="line"><span>        answer </span><span>=</span><span> {</span><span>"bugs"</span><span>: [{</span><span>"ids"</span><span>: [i], </span><span>"severity"</span><span>: </span><span>"medium"</span><span>} </span><span>for</span><span> i </span><span>in</span><span> re.findall(</span><span>r</span><span>"</span><span>^(</span><span>C</span><span>d</span><span>+</span><span>)</span><span> |</span><span>"</span><span>, text, re.M)], </span><span>"summary"</span><span>: </span><span>"a made-up report"</span><span>}</span></span>
<span class="line"><span>    return</span><span> Reply(json.dumps(answer), </span><span>"stop"</span><span>, </span><span>model</span><span>=</span><span>model)</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>def</span><span> blind</span><span>(model, messages, params):</span></span>
<span class="line"><span>    system, text </span><span>=</span><span> messages[</span><span>0</span><span>][</span><span>"content"</span><span>], messages[</span><span>-</span><span>1</span><span>][</span><span>"content"</span><span>]</span></span>
<span class="line"><span>    # answers come from a hash of the question</span></span>
<span class="line"><span>    seed </span><span>=</span><span> zlib.crc32((text[:</span><span>300</span><span>] </span><span>+</span><span> str</span><span>(params.get(</span><span>"sample"</span><span>, </span><span>0</span><span>))).encode())</span></span>
<span class="line"><span>    if</span><span> system.startswith(</span><span>"You are reviewing"</span><span>):</span></span>
<span class="line"><span>        paths </span><span>=</span><span> re.findall(</span><span>r</span><span>"</span><span>^</span><span>### </span><span>(S</span><span>+</span><span>)$</span><span>"</span><span>, text, re.M) </span><span>or</span><span> [</span><span>"unknown.py"</span><span>]</span></span>
<span class="line"><span>        answer </span><span>=</span><span> {</span><span>"findings"</span><span>: [{</span><span>"file"</span><span>: paths[(seed </span><span>+</span><span> 7</span><span> *</span><span> j) </span><span>%</span><span> len</span><span>(paths)], </span><span>"line"</span><span>: </span><span>5</span><span> +</span><span> (seed </span><span>&gt;&gt;</span><span> (j </span><span>%</span><span> 16</span><span>)) </span><span>%</span><span> 60</span><span>, </span><span>"claim"</span><span>: </span><span>"a made-up finding"</span><span>,</span></span>
<span class="line"><span>                                "confidence"</span><span>: </span><span>0.5</span><span>} </span><span>for</span><span> j </span><span>in</span><span> range</span><span>(seed </span><span>%</span><span> 3</span><span>)]}          </span><span># none, one or two findings per call</span></span>
<span class="line"><span>    elif</span><span> system.startswith(</span><span>"You check"</span><span>):</span></span>
<span class="line"><span>        seed </span><span>=</span><span> zlib.crc32((text[:</span><span>200</span><span>] </span><span>+</span><span> str</span><span>(params.get(</span><span>"sample"</span><span>, </span><span>0</span><span>))).encode())</span></span>
<span class="line"><span>        answer </span><span>=</span><span> {</span><span>"verdicts"</span><span>: [{</span><span>"report"</span><span>: i, </span><span>"real"</span><span>: (seed </span><span>&gt;&gt;</span><span> i) </span><span>%</span><span> 5</span><span> &#x3C;</span><span> 2</span><span>} </span><span>for</span><span> i </span><span>in</span><span> range</span><span>(</span><span>1</span><span>, </span><span>len</span><span>(re.findall(</span><span>r</span><span>"</span><span>^</span><span>--- report </span><span>d</span><span>+</span><span> ---</span><span>$</span><span>"</span><span>, text, re.M)) </span><span>+</span><span> 1</span><span>)]}</span></span>
<span class="line"><span>    else</span><span>:                                                         </span><span># the report: every finding in a group of its own</span></span>
<span class="line"><span>        answer </span><span>=</span><span> {</span><span>"bugs"</span><span>: [{</span><span>"ids"</span><span>: [i], </span><span>"severity"</span><span>: </span><span>"medium"</span><span>} </span><span>for</span><span> i </span><span>in</span><span> re.findall(</span><span>r</span><span>"</span><span>^(</span><span>C</span><span>d</span><span>+</span><span>)</span><span> |</span><span>"</span><span>, text, re.M)], </span><span>"summary"</span><span>: </span><span>"a made-up report"</span><span>}</span></span>
<span class="line"><span>    return</span><span> Reply(json.dumps(answer), </span><span>"stop"</span><span>, </span><span>model</span><span>=</span><span>model)</span></span></code></pre>
<p><code>dry_run</code> prices what the program did at the real prices, and a time limit covers its running time.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>def</span><span> dry_run</span><span>(src, budget</span><span>=</span><span>150</span><span>, timeout</span><span>=</span><span>60</span><span>):</span></span>
<span class="line"><span>    llm </span><span>=</span><span> LLM(Ledger(</span><span>":memory:"</span><span>), </span><span>scripted</span><span>=</span><span>blind, </span><span>budget</span><span>=</span><span>Budget(budget))          </span><span># budget() starts where the real run starts</span></span>
<span class="line"><span>    run </span><span>=</span><span> Run(</span><span>"dry run"</span><span>, </span><span>llm</span><span>=</span><span>llm, </span><span>run_id</span><span>=</span><span>"dry-"</span><span> +</span><span> hashlib.sha256(src.encode()).hexdigest()[:</span><span>8</span><span>], </span><span>concurrency</span><span>=</span><span>64</span><span>)</span></span>
<span class="line"><span>    kit </span><span>=</span><span> AuditKit(run)</span></span>
<span class="line"><span>    problems </span><span>=</span><span> check_program(src, kit.names())</span></span>
<span class="line"><span>    if</span><span> problems:</span></span>
<span class="line"><span>        return</span><span> None</span><span>, problems</span></span>
<span class="line"><span>    worker </span><span>=</span><span> threading.Thread(</span><span>target</span><span>=lambda</span><span>: run.run_sync(</span><span>lambda</span><span> r: run_program(src, kit)), </span><span>daemon</span><span>=</span><span>True</span><span>)</span></span>
<span class="line"><span>    worker.start()</span></span>
<span class="line"><span>    worker.join(timeout)</span></span>
<span class="line"><span>    if</span><span> worker.is_alive():                                         </span><span># a clock bounds the running time, which no rule can check</span></span>
<span class="line"><span>        run.cancel()</span></span>
<span class="line"><span>        return</span><span> None</span><span>, [</span><span>f</span><span>"line 1: the dry run did not finish within </span><span>{</span><span>timeout</span><span>}</span><span> s, so the plan probably loops without end"</span><span>]</span></span>
<span class="line"><span>    if</span><span> run.status </span><span>!=</span><span> "completed"</span><span>:</span></span>
<span class="line"><span>        return</span><span> None</span><span>, [</span><span>f</span><span>"line 1: the dry run ended </span><span>{</span><span>run.status</span><span>}</span><span>: </span><span>{</span><span>run.error </span><span>or</span><span> f</span><span>'</span><span>{len</span><span>(run.dropped)</span><span>}</span><span> workers refused by the agent limit'</span><span>}</span><span>"</span><span>]</span></span>
<span class="line"><span>    # price the calls at the real prices</span></span>
<span class="line"><span>    calls </span><span>=</span><span> collections.Counter(t.model </span><span>for</span><span> t </span><span>in</span><span> run.threads </span><span>for</span><span> _ </span><span>in</span><span> t.replies)</span></span>
<span class="line"><span>    return</span><span> {</span><span>"agents"</span><span>: </span><span>len</span><span>(run.threads), </span><span>"calls"</span><span>: </span><span>sum</span><span>(calls.values()), </span><span>"credits"</span><span>: </span><span>round</span><span>(</span><span>sum</span><span>(</span><span>PRICE</span><span>.get(m, </span><span>0.2</span><span>) </span><span>*</span><span> n </span><span>for</span><span> m, n </span><span>in</span><span> calls.items()), </span><span>1</span><span>),</span></span>
<span class="line"><span>            "phases"</span><span>: {p[</span><span>"name"</span><span>]: </span><span>sum</span><span>(t.phase </span><span>==</span><span> p[</span><span>"name"</span><span>] </span><span>for</span><span> t </span><span>in</span><span> run.threads) </span><span>for</span><span> p </span><span>in</span><span> run.phases}}, []</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>def</span><span> dry_run</span><span>(src, budget</span><span>=</span><span>150</span><span>, timeout</span><span>=</span><span>60</span><span>):</span></span>
<span class="line"><span>    llm </span><span>=</span><span> LLM(Ledger(</span><span>":memory:"</span><span>), </span><span>scripted</span><span>=</span><span>blind, </span><span>budget</span><span>=</span><span>Budget(budget))          </span><span># budget() starts where the real run starts</span></span>
<span class="line"><span>    run </span><span>=</span><span> Run(</span><span>"dry run"</span><span>, </span><span>llm</span><span>=</span><span>llm, </span><span>run_id</span><span>=</span><span>"dry-"</span><span> +</span><span> hashlib.sha256(src.encode()).hexdigest()[:</span><span>8</span><span>], </span><span>concurrency</span><span>=</span><span>64</span><span>)</span></span>
<span class="line"><span>    kit </span><span>=</span><span> AuditKit(run)</span></span>
<span class="line"><span>    problems </span><span>=</span><span> check_program(src, kit.names())</span></span>
<span class="line"><span>    if</span><span> problems:</span></span>
<span class="line"><span>        return</span><span> None</span><span>, problems</span></span>
<span class="line"><span>    worker </span><span>=</span><span> threading.Thread(</span><span>target</span><span>=lambda</span><span>: run.run_sync(</span><span>lambda</span><span> r: run_program(src, kit)), </span><span>daemon</span><span>=</span><span>True</span><span>)</span></span>
<span class="line"><span>    worker.start()</span></span>
<span class="line"><span>    worker.join(timeout)</span></span>
<span class="line"><span>    if</span><span> worker.is_alive():                                         </span><span># a clock bounds the running time, which no rule can check</span></span>
<span class="line"><span>        run.cancel()</span></span>
<span class="line"><span>        return</span><span> None</span><span>, [</span><span>f</span><span>"line 1: the dry run did not finish within </span><span>{</span><span>timeout</span><span>}</span><span> s, so the plan probably loops without end"</span><span>]</span></span>
<span class="line"><span>    if</span><span> run.status </span><span>!=</span><span> "completed"</span><span>:</span></span>
<span class="line"><span>        return</span><span> None</span><span>, [</span><span>f</span><span>"line 1: the dry run ended </span><span>{</span><span>run.status</span><span>}</span><span>: </span><span>{</span><span>run.error </span><span>or</span><span> f</span><span>'</span><span>{len</span><span>(run.dropped)</span><span>}</span><span> workers refused by the agent limit'</span><span>}</span><span>"</span><span>]</span></span>
<span class="line"><span>    # price the calls at the real prices</span></span>
<span class="line"><span>    calls </span><span>=</span><span> collections.Counter(t.model </span><span>for</span><span> t </span><span>in</span><span> run.threads </span><span>for</span><span> _ </span><span>in</span><span> t.replies)</span></span>
<span class="line"><span>    return</span><span> {</span><span>"agents"</span><span>: </span><span>len</span><span>(run.threads), </span><span>"calls"</span><span>: </span><span>sum</span><span>(calls.values()), </span><span>"credits"</span><span>: </span><span>round</span><span>(</span><span>sum</span><span>(</span><span>PRICE</span><span>.get(m, </span><span>0.2</span><span>) </span><span>*</span><span> n </span><span>for</span><span> m, n </span><span>in</span><span> calls.items()), </span><span>1</span><span>),</span></span>
<span class="line"><span>            "phases"</span><span>: {p[</span><span>"name"</span><span>]: </span><span>sum</span><span>(t.phase </span><span>==</span><span> p[</span><span>"name"</span><span>] </span><span>for</span><span> t </span><span>in</span><span> run.threads) </span><span>for</span><span> p </span><span>in</span><span> run.phases}}, []</span></span></code></pre>
<p>The <strong>approval gate</strong> applies a policy written before any plan was priced: a plan of up to 40 credits and a third of the budget passes on its own.</p>
<p>							 budget:                                   # nor one costing more than the budget<br />
        return &#x22;refused&#x22;, f&#x22;estimated {est[&#x27;credits&#x27;]:.1f} credits is more than the whole budget of {budget:.0f}&#x22;<br />
    limit, cost = min(AUTO_APPROVE[&#x22;max_credits&#x22;], AUTO_APPROVE[&#x22;max_share&#x22;] * budget), f&#x22;estimated {est[&#x27;credits&#x27;]:.1f} credits&#x22;<br />
    if est[&#x22;credits&#x22;] <span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>AUTO_APPROVE</span><span> =</span><span> {</span><span>"max_credits"</span><span>: </span><span>40.0</span><span>, </span><span>"max_share"</span><span>: </span><span>1</span><span> /</span><span> 3</span><span>}         </span><span># the policy, written down before any plan is priced</span></span>
<span class="line"></span>
<span class="line"><span>def</span><span> approve</span><span>(est, budget, person</span><span>=</span><span>None</span><span>):</span></span>
<span class="line"><span>    if</span><span> est </span><span>is</span><span> None</span><span>:                                               </span><span># a plan that failed its checks never runs</span></span>
<span class="line"><span>        return</span><span> "refused"</span><span>, </span><span>"the plan failed its check or its dry run"</span></span>
<span class="line"><span>    if</span><span> est[</span><span>"credits"</span><span>] </span><span>&gt;</span><span> budget:                                   </span><span># nor one costing more than the budget</span></span>
<span class="line"><span>        return</span><span> "refused"</span><span>, </span><span>f</span><span>"estimated </span><span>{</span><span>est[</span><span>'credits'</span><span>]</span><span>:.1f</span><span>}</span><span> credits is more than the whole budget of </span><span>{</span><span>budget</span><span>:.0f</span><span>}</span><span>"</span></span>
<span class="line"><span>    limit, cost </span><span>=</span><span> min</span><span>(</span><span>AUTO_APPROVE</span><span>[</span><span>"max_credits"</span><span>], </span><span>AUTO_APPROVE</span><span>[</span><span>"max_share"</span><span>] </span><span>*</span><span> budget), </span><span>f</span><span>"estimated </span><span>{</span><span>est[</span><span>'credits'</span><span>]</span><span>:.1f</span><span>}</span><span> credits"</span></span>
<span class="line"><span>    if</span><span> est[</span><span>"credits"</span><span>] </span><span>&#x3C;=</span><span> limit:</span></span>
<span class="line"><span>        return</span><span> "approved"</span><span>, </span><span>f</span><span>"</span><span>{</span><span>cost</span><span>}</span><span> is under the automatic limit of </span><span>{</span><span>limit</span><span>:.1f</span><span>}</span><span>"</span></span>
<span class="line"><span>    if</span><span> person </span><span>is</span><span> None</span><span>:                                            </span><span># above the limit a person decides, or the plan waits</span></span>
<span class="line"><span>        return</span><span> "held"</span><span>, </span><span>f</span><span>"</span><span>{</span><span>cost</span><span>}</span><span> is over the automatic limit of </span><span>{</span><span>limit</span><span>:.1f</span><span>}</span><span>, so a person must approve it"</span></span>
<span class="line"><span>    yes </span><span>=</span><span> bool</span><span>(person(est))</span></span>
<span class="line"><span>    return</span><span> (</span><span>"approved"</span><span> if</span><span> yes </span><span>else</span><span> "refused"</span><span>), </span><span>f</span><span>"a person </span><span>{</span><span>'approved'</span><span> if</span><span> yes </span><span>else</span><span> 'refused'</span><span>}</span><span> it after reading the </span><span>{</span><span>cost</span><span>}</span><span>"</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># plans.py</span></span>
<span class="line"><span>AUTO_APPROVE</span><span> =</span><span> {</span><span>"max_credits"</span><span>: </span><span>40.0</span><span>, </span><span>"max_share"</span><span>: </span><span>1</span><span> /</span><span> 3</span><span>}         </span><span># the policy, written down before any plan is priced</span></span>
<span class="line"></span>
<span class="line"><span>def</span><span> approve</span><span>(est, budget, person</span><span>=</span><span>None</span><span>):</span></span>
<span class="line"><span>    if</span><span> est </span><span>is</span><span> None</span><span>:                                               </span><span># a plan that failed its checks never runs</span></span>
<span class="line"><span>        return</span><span> "refused"</span><span>, </span><span>"the plan failed its check or its dry run"</span></span>
<span class="line"><span>    if</span><span> est[</span><span>"credits"</span><span>] </span><span>&gt;</span><span> budget:                                   </span><span># nor one costing more than the budget</span></span>
<span class="line"><span>        return</span><span> "refused"</span><span>, </span><span>f</span><span>"estimated </span><span>{</span><span>est[</span><span>'credits'</span><span>]</span><span>:.1f</span><span>}</span><span> credits is more than the whole budget of </span><span>{</span><span>budget</span><span>:.0f</span><span>}</span><span>"</span></span>
<span class="line"><span>    limit, cost </span><span>=</span><span> min</span><span>(</span><span>AUTO_APPROVE</span><span>[</span><span>"max_credits"</span><span>], </span><span>AUTO_APPROVE</span><span>[</span><span>"max_share"</span><span>] </span><span>*</span><span> budget), </span><span>f</span><span>"estimated </span><span>{</span><span>est[</span><span>'credits'</span><span>]</span><span>:.1f</span><span>}</span><span> credits"</span></span>
<span class="line"><span>    if</span><span> est[</span><span>"credits"</span><span>] </span><span>&#x3C;=</span><span> limit:</span></span>
<span class="line"><span>        return</span><span> "approved"</span><span>, </span><span>f</span><span>"</span><span>{</span><span>cost</span><span>}</span><span> is under the automatic limit of </span><span>{</span><span>limit</span><span>:.1f</span><span>}</span><span>"</span></span>
<span class="line"><span>    if</span><span> person </span><span>is</span><span> None</span><span>:                                            </span><span># above the limit a person decides, or the plan waits</span></span>
<span class="line"><span>        return</span><span> "held"</span><span>, </span><span>f</span><span>"</span><span>{</span><span>cost</span><span>}</span><span> is over the automatic limit of </span><span>{</span><span>limit</span><span>:.1f</span><span>}</span><span>, so a person must approve it"</span></span>
<span class="line"><span>    yes </span><span>=</span><span> bool</span><span>(person(est))</span></span>
<span class="line"><span>    return</span><span> (</span><span>"approved"</span><span> if</span><span> yes </span><span>else</span><span> "refused"</span><span>), </span><span>f</span><span>"a person </span><span>{</span><span>'approved'</span><span> if</span><span> yes </span><span>else</span><span> 'refused'</span><span>}</span><span> it after reading the </span><span>{</span><span>cost</span><span>}</span><span>"</span></span></code></pre>
<p>I priced three plans: the fixed plan, one that shrinks when <code>budget()</code> is low, and a runaway that passes every rule yet asks for a million workers.</p>
<p>							 100 else [&#x22;general&#x22;]<br />
skeptics = 3 if budget() &gt; 100 else 1<br />
found = dedupe(flatten(parallel([lambda s=s, l=l: scan(s, l) for s in shards(40000) for l in lenses])))<br />
verdicts = flatten(parallel([lambda b=b, k=k: check(b, sample=k) for b in batches(found, 6) for k in range(skeptics)]))<br />
result = report(vote(found, verdicts, need=skeptics // 2 + 1))&#x22;&#x22;&#x22;<br />
RUNAWAY = &#x27;for i in range(1000000):n    agent(&#x22;look again&#x22;, label=f&#x22;again#{i}&#x22;)nresult = report([])&#x27;<br />
estimates = {&#x22;fixed plan&#x22;: dry_run(FIXED_PROGRAM)[0], &#x22;fit the budget, sees 150&#x22;: dry_run(FIT, 150)[0], &#x22;fit the budget, sees 45&#x22;: dry_run(FIT, 45)[0]}<br />
for name, e in estimates.items():<br />
    print(f&#x22;{name:3} workers, {e[&#x27;credits&#x27;]:&gt;4.1f} credits | gate at a budget of 45: {approve(e, 45)[0]}&#x22;)<br />
print(&#x22;runaway passes the rules:&#x22;, not check_program(RUNAWAY, names), &#x22;| dry run:&#x22;, dry_run(RUNAWAY)[1][0])</p>
<p>#### OUTPUT ####<br />
fixed plan                49 workers, 10.1 credits | gate at a budget of 45: approved<br />
fit the budget, sees 150 118 workers, 23.9 credits | gate at a budget of 45: held<br />
fit the budget, sees 45   40 workers,  8.3 credits | gate at a budget of 45: approved<br />
runaway passes the rules: True | dry run: line 1: the dry run ended cancelled: 1000 workers refused by the agent limit&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-3 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>from</span><span> kit </span><span>import</span><span> AuditKit</span></span>
<span class="line"><span>from</span><span> plans </span><span>import</span><span> FIXED_PROGRAM</span><span>, approve, check_program, dry_run</span></span>
<span class="line"></span>
<span class="line"><span>names </span><span>=</span><span> AuditKit(Run(</span><span>"api"</span><span>, </span><span>llm</span><span>=</span><span>llm)).names()</span></span>
<span class="line"></span>
<span class="line"><span>FIT</span><span> =</span><span> """lenses = LENSES if budget() &gt; 100 else ["general"]</span></span>
<span class="line"><span>skeptics = 3 if budget() &gt; 100 else 1</span></span>
<span class="line"><span>found = dedupe(flatten(parallel([lambda s=s, l=l: scan(s, l) for s in shards(40000) for l in lenses])))</span></span>
<span class="line"><span>verdicts = flatten(parallel([lambda b=b, k=k: check(b, sample=k) for b in batches(found, 6) for k in range(skeptics)]))</span></span>
<span class="line"><span>result = report(vote(found, verdicts, need=skeptics // 2 + 1))"""</span></span>
<span class="line"><span>RUNAWAY</span><span> =</span><span> 'for i in range(1000000):</span><span>n</span><span>    agent("look again", label=f"again#</span><span>{i}</span><span>")</span><span>n</span><span>result = report([])'</span></span>
<span class="line"><span>estimates </span><span>=</span><span> {</span><span>"fixed plan"</span><span>: dry_run(</span><span>FIXED_PROGRAM</span><span>)[</span><span>0</span><span>], </span><span>"fit the budget, sees 150"</span><span>: dry_run(</span><span>FIT</span><span>, </span><span>150</span><span>)[</span><span>0</span><span>], </span><span>"fit the budget, sees 45"</span><span>: dry_run(</span><span>FIT</span><span>, </span><span>45</span><span>)[</span><span>0</span><span>]}</span></span>
<span class="line"><span>for</span><span> name, e </span><span>in</span><span> estimates.items():</span></span>
<span class="line"><span>    print</span><span>(</span><span>f</span><span>"</span><span>{</span><span>name</span><span>:&#x3C;24</span><span>}</span><span> {</span><span>e[</span><span>'agents'</span><span>]</span><span>:&gt;3</span><span>}</span><span> workers, </span><span>{</span><span>e[</span><span>'credits'</span><span>]</span><span>:&gt;4.1f</span><span>}</span><span> credits | gate at a budget of 45: </span><span>{</span><span>approve(e, </span><span>45</span><span>)[</span><span>0</span><span>]</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"><span>print</span><span>(</span><span>"runaway passes the rules:"</span><span>, </span><span>not</span><span> check_program(</span><span>RUNAWAY</span><span>, names), </span><span>"| dry run:"</span><span>, dry_run(</span><span>RUNAWAY</span><span>)[</span><span>1</span><span>][</span><span>0</span><span>])</span></span>
<span class="line"></span>
<span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>fixed plan                </span><span>49</span><span> workers, </span><span>10.1</span><span> credits</span><span> |</span><span> gate at a budget of </span><span>45</span><span>: approved</span></span>
<span class="line"><span>fit the budget, sees </span><span>150</span><span> 118</span><span> workers, </span><span>23.9</span><span> credits</span><span> |</span><span> gate at a budget of </span><span>45</span><span>: held</span></span>
<span class="line"><span>fit the budget, sees </span><span>45</span><span>   40</span><span> workers,  </span><span>8.3</span><span> credits</span><span> |</span><span> gate at a budget of </span><span>45</span><span>: approved</span></span>
<span class="line"><span>runaway passes the rules: </span><span>True</span><span> |</span><span> dry run: line </span><span>1</span><span>: the dry run ended cancelled: </span><span>1000</span><span> workers refused by the agent limit</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>from</span><span> kit </span><span>import</span><span> AuditKit</span></span>
<span class="line"><span>from</span><span> plans </span><span>import</span><span> FIXED_PROGRAM</span><span>, approve, check_program, dry_run</span></span>
<span class="line"></span>
<span class="line"><span>names </span><span>=</span><span> AuditKit(Run(</span><span>"api"</span><span>, </span><span>llm</span><span>=</span><span>llm)).names()</span></span>
<span class="line"></span>
<span class="line"><span>FIT</span><span> =</span><span> """lenses = LENSES if budget() &gt; 100 else ["general"]</span></span>
<span class="line"><span>skeptics = 3 if budget() &gt; 100 else 1</span></span>
<span class="line"><span>found = dedupe(flatten(parallel([lambda s=s, l=l: scan(s, l) for s in shards(40000) for l in lenses])))</span></span>
<span class="line"><span>verdicts = flatten(parallel([lambda b=b, k=k: check(b, sample=k) for b in batches(found, 6) for k in range(skeptics)]))</span></span>
<span class="line"><span>result = report(vote(found, verdicts, need=skeptics // 2 + 1))"""</span></span>
<span class="line"><span>RUNAWAY</span><span> =</span><span> 'for i in range(1000000):</span><span>n</span><span>    agent("look again", label=f"again#</span><span>{i}</span><span>")</span><span>n</span><span>result = report([])'</span></span>
<span class="line"><span>estimates </span><span>=</span><span> {</span><span>"fixed plan"</span><span>: dry_run(</span><span>FIXED_PROGRAM</span><span>)[</span><span>0</span><span>], </span><span>"fit the budget, sees 150"</span><span>: dry_run(</span><span>FIT</span><span>, </span><span>150</span><span>)[</span><span>0</span><span>], </span><span>"fit the budget, sees 45"</span><span>: dry_run(</span><span>FIT</span><span>, </span><span>45</span><span>)[</span><span>0</span><span>]}</span></span>
<span class="line"><span>for</span><span> name, e </span><span>in</span><span> estimates.items():</span></span>
<span class="line"><span>    print</span><span>(</span><span>f</span><span>"</span><span>{</span><span>name</span><span>:&#x3C;24</span><span>}</span><span> {</span><span>e[</span><span>'agents'</span><span>]</span><span>:&gt;3</span><span>}</span><span> workers, </span><span>{</span><span>e[</span><span>'credits'</span><span>]</span><span>:&gt;4.1f</span><span>}</span><span> credits | gate at a budget of 45: </span><span>{</span><span>approve(e, </span><span>45</span><span>)[</span><span>0</span><span>]</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"><span>print</span><span>(</span><span>"runaway passes the rules:"</span><span>, </span><span>not</span><span> check_program(</span><span>RUNAWAY</span><span>, names), </span><span>"| dry run:"</span><span>, dry_run(</span><span>RUNAWAY</span><span>)[</span><span>1</span><span>][</span><span>0</span><span>])</span></span>
<span class="line"></span>
<span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>fixed plan                </span><span>49</span><span> workers, </span><span>10.1</span><span> credits</span><span> |</span><span> gate at a budget of </span><span>45</span><span>: approved</span></span>
<span class="line"><span>fit the budget, sees </span><span>150</span><span> 118</span><span> workers, </span><span>23.9</span><span> credits</span><span> |</span><span> gate at a budget of </span><span>45</span><span>: held</span></span>
<span class="line"><span>fit the budget, sees </span><span>45</span><span>   40</span><span> workers,  </span><span>8.3</span><span> credits</span><span> |</span><span> gate at a budget of </span><span>45</span><span>: approved</span></span>
<span class="line"><span>runaway passes the rules: </span><span>True</span><span> |</span><span> dry run: line </span><span>1</span><span>: the dry run ended cancelled: </span><span>1000</span><span> workers refused by the agent limit</span></span></code></pre>
<p>The same program costs 23.9 credits when the rehearsal sees a budget of 150 and 8.3 when it sees 45.</p>
<p>So the rehearsal has to see the same budget as the real run. The fixed plan&#8217;s estimate of 10.1 credits was 27% below the 13.8 of its three real runs.</p>
<h3>Lead Planner</h3>
<p>Ordinary code writes the lead&#8217;s fact sheet, and the sheet costs nothing and never changes between runs. Here it is, abridged.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>THE</span><span> WORK</span></span>
<span class="line"><span>-</span><span> 849</span><span> Python</span><span> files,</span><span> 91,327</span><span> lines,</span><span> about</span><span> 1,348,181</span><span> tokens</span><span> with</span><span> line</span><span> numbers.</span><span> The</span><span> largest</span><span> file</span><span> is</span><span> 13,353</span><span> tokens.</span></span>
<span class="line"></span>
<span class="line"><span>MEASURED</span><span> SO</span><span> FAR</span></span>
<span class="line"><span>-</span><span> The</span><span> measured</span><span> best</span><span> shard</span><span> size</span><span> is</span><span> 100k</span><span> tokens.</span></span>
<span class="line"></span>
<span class="line"><span>PRICES</span><span> AND</span><span> LIMITS</span></span>
<span class="line"><span>-</span><span> Price</span><span> per</span><span> call</span><span> in</span><span> credits:</span><span> worker</span><span> 0.2,</span><span> fast</span><span> 0.2,</span><span> judge</span><span> 0.2,</span><span> lead</span><span> 0.5.</span><span> Billing</span><span> is</span><span> per</span><span> call,</span><span> not</span><span> per</span><span> token.</span></span>
<span class="line"><span>-</span><span> At</span><span> most</span><span> 1000</span><span> workers</span><span> per</span><span> run,</span><span> and</span><span> about</span><span> 32</span><span> run</span><span> at</span><span> the</span><span> same</span><span> time.</span></span>
<span class="line"><span>-</span><span> Budget</span><span> for</span><span> this</span><span> job:</span><span> 150</span><span> credits.</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>THE</span><span> WORK</span></span>
<span class="line"><span>-</span><span> 849</span><span> Python</span><span> files,</span><span> 91,327</span><span> lines,</span><span> about</span><span> 1,348,181</span><span> tokens</span><span> with</span><span> line</span><span> numbers.</span><span> The</span><span> largest</span><span> file</span><span> is</span><span> 13,353</span><span> tokens.</span></span>
<span class="line"></span>
<span class="line"><span>MEASURED</span><span> SO</span><span> FAR</span></span>
<span class="line"><span>-</span><span> The</span><span> measured</span><span> best</span><span> shard</span><span> size</span><span> is</span><span> 100k</span><span> tokens.</span></span>
<span class="line"></span>
<span class="line"><span>PRICES</span><span> AND</span><span> LIMITS</span></span>
<span class="line"><span>-</span><span> Price</span><span> per</span><span> call</span><span> in</span><span> credits:</span><span> worker</span><span> 0.2,</span><span> fast</span><span> 0.2,</span><span> judge</span><span> 0.2,</span><span> lead</span><span> 0.5.</span><span> Billing</span><span> is</span><span> per</span><span> call,</span><span> not</span><span> per</span><span> token.</span></span>
<span class="line"><span>-</span><span> At</span><span> most</span><span> 1000</span><span> workers</span><span> per</span><span> run,</span><span> and</span><span> about</span><span> 32</span><span> run</span><span> at</span><span> the</span><span> same</span><span> time.</span></span>
<span class="line"><span>-</span><span> Budget</span><span> for</span><span> this</span><span> job:</span><span> 150</span><span> credits.</span></span></code></pre>
<p>It holds file and token counts, a few measured rates and the prices, about 500 tokens for a job of 1,348,181.</p>
<ul>
<li><code>left out:</code> the code that builds the sheet, about twenty lines of string formatting</li>
</ul>
<p><code>Lead</code> talks to the model and keeps a tally of what it read.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>"""lead.py: the lead reads a fact sheet and writes the plan."""</span></span>
<span class="line"><span>import</span><span> re</span></span>
<span class="line"></span>
<span class="line"><span>from</span><span> bench </span><span>import</span><span> WORK</span></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> MODELS</span><span>, </span><span>PRICE</span><span>, </span><span>PROMPTS</span><span>, </span><span>TEMPERATURE</span><span>, </span><span>TOP_P</span></span>
<span class="line"><span>from</span><span> kit </span><span>import</span><span> AuditKit</span></span>
<span class="line"><span>from</span><span> llm </span><span>import</span><span> LLM</span><span>, Budget</span></span>
<span class="line"><span>from</span><span> plans </span><span>import</span><span> approve, dry_run, run_program</span></span>
<span class="line"><span>from</span><span> runtime </span><span>import</span><span> Run</span></span>
<span class="line"></span>
<span class="line"><span>FENCE</span><span> =</span><span> "`"</span><span> *</span><span> 3</span><span>                                           # three backticks, built so this file's own fence stays open</span></span>
<span class="line"></span>
<span class="line"><span>class</span><span> Lead</span><span>:</span></span>
<span class="line"><span>    """The lead: it reads the fact sheet and writes plan programs."""</span></span>
<span class="line"><span>    def</span><span> __init__</span><span>(self, llm):</span></span>
<span class="line"><span>        self</span><span>.llm, </span><span>self</span><span>.read </span><span>=</span><span> llm, []</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> ask</span><span>(self, messages, sample</span><span>=</span><span>0</span><span>):</span></span>
<span class="line"><span>        r </span><span>=</span><span> self</span><span>.llm.chat(</span><span>MODELS</span><span>[</span><span>"lead"</span><span>], messages, </span><span>role</span><span>=</span><span>"lead"</span><span>, </span><span>sample</span><span>=</span><span>sample, </span><span>temperature</span><span>=</span><span>TEMPERATURE</span><span>, </span><span>top_p</span><span>=</span><span>TOP_P</span><span>, </span><span>max_tokens</span><span>=</span><span>8000</span><span>)</span></span>
<span class="line"><span>        self</span><span>.read.append(r.prompt_tokens)                </span><span># kept, to count what the lead had to read</span></span>
<span class="line"><span>        return</span><span> r</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>"""lead.py: the lead reads a fact sheet and writes the plan."""</span></span>
<span class="line"><span>import</span><span> re</span></span>
<span class="line"></span>
<span class="line"><span>from</span><span> bench </span><span>import</span><span> WORK</span></span>
<span class="line"><span>from</span><span> config </span><span>import</span><span> MODELS</span><span>, </span><span>PRICE</span><span>, </span><span>PROMPTS</span><span>, </span><span>TEMPERATURE</span><span>, </span><span>TOP_P</span></span>
<span class="line"><span>from</span><span> kit </span><span>import</span><span> AuditKit</span></span>
<span class="line"><span>from</span><span> llm </span><span>import</span><span> LLM</span><span>, Budget</span></span>
<span class="line"><span>from</span><span> plans </span><span>import</span><span> approve, dry_run, run_program</span></span>
<span class="line"><span>from</span><span> runtime </span><span>import</span><span> Run</span></span>
<span class="line"></span>
<span class="line"><span>FENCE</span><span> =</span><span> "`"</span><span> *</span><span> 3</span><span>                                           # three backticks, built so this file's own fence stays open</span></span>
<span class="line"></span>
<span class="line"><span>class</span><span> Lead</span><span>:</span></span>
<span class="line"><span>    """The lead: it reads the fact sheet and writes plan programs."""</span></span>
<span class="line"><span>    def</span><span> __init__</span><span>(self, llm):</span></span>
<span class="line"><span>        self</span><span>.llm, </span><span>self</span><span>.read </span><span>=</span><span> llm, []</span></span>
<span class="line"></span>
<span class="line"><span>    def</span><span> ask</span><span>(self, messages, sample</span><span>=</span><span>0</span><span>):</span></span>
<span class="line"><span>        r </span><span>=</span><span> self</span><span>.llm.chat(</span><span>MODELS</span><span>[</span><span>"lead"</span><span>], messages, </span><span>role</span><span>=</span><span>"lead"</span><span>, </span><span>sample</span><span>=</span><span>sample, </span><span>temperature</span><span>=</span><span>TEMPERATURE</span><span>, </span><span>top_p</span><span>=</span><span>TOP_P</span><span>, </span><span>max_tokens</span><span>=</span><span>8000</span><span>)</span></span>
<span class="line"><span>        self</span><span>.read.append(r.prompt_tokens)                </span><span># kept, to count what the lead had to read</span></span>
<span class="line"><span>        return</span><span> r</span></span></code></pre>
<p><code>write_program</code>asks for a plan, checks it, rehearses it, and hands every problem back, for up to two repairs.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># lead.py</span></span>
<span class="line"><span>    def</span><span> write_program</span><span>(self, job, page, budget</span><span>=</span><span>150</span><span>, sample</span><span>=</span><span>0</span><span>, repairs</span><span>=</span><span>2</span><span>):</span></span>
<span class="line"><span>        # the job and the fact sheet are all the lead reads</span></span>
<span class="line"><span>        messages </span><span>=</span><span> [{</span><span>"role"</span><span>: </span><span>"system"</span><span>, </span><span>"content"</span><span>: </span><span>PROMPTS</span><span>[</span><span>"lead"</span><span>]}, {</span><span>"role"</span><span>: </span><span>"user"</span><span>, </span><span>"content"</span><span>: </span><span>f</span><span>"THE JOB</span><span>n{</span><span>job</span><span>}nn{</span><span>page</span><span>}</span><span>"</span><span>}]</span></span>
<span class="line"><span>        attempts </span><span>=</span><span> []</span></span>
<span class="line"><span>        for</span><span> _ </span><span>in</span><span> range</span><span>(</span><span>1</span><span> +</span><span> repairs):</span></span>
<span class="line"><span>            r </span><span>=</span><span> self</span><span>.ask(messages, sample)</span></span>
<span class="line"><span>            # take out the python block, then check and rehearse it</span></span>
<span class="line"><span>            m </span><span>=</span><span> re.search(</span><span>FENCE</span><span> +</span><span> r</span><span>"</span><span>(?:</span><span>python</span><span>|</span><span>py</span><span>)</span><span>?</span><span>s</span><span>*</span><span>n</span><span>(.</span><span>*?</span><span>)</span><span>"</span><span> +</span><span> FENCE</span><span>, r.text, re.S)</span></span>
<span class="line"><span>            src </span><span>=</span><span> m.group(</span><span>1</span><span>).strip() </span><span>if</span><span> m </span><span>else</span><span> None</span></span>
<span class="line"><span>            est, problems </span><span>=</span><span> dry_run(src, budget) </span><span>if</span><span> src </span><span>else</span><span> (</span><span>None</span><span>, [</span><span>f</span><span>"line 1: the reply has no </span><span>{FENCE}</span><span>python block"</span><span>])</span></span>
<span class="line"><span>            attempts.append({</span><span>"src"</span><span>: src, </span><span>"problems"</span><span>: problems, </span><span>"estimate"</span><span>: est})</span></span>
<span class="line"><span>            if</span><span> not</span><span> problems:</span></span>
<span class="line"><span>                break</span></span>
<span class="line"><span>            # hand every problem back in the checker's own words</span></span>
<span class="line"><span>            messages </span><span>+=</span><span> [{</span><span>"role"</span><span>: </span><span>"assistant"</span><span>, </span><span>"content"</span><span>: r.text[:</span><span>8000</span><span>]}, {</span><span>"role"</span><span>: </span><span>"user"</span><span>, </span><span>"content"</span><span>: </span><span>"Your program has these problems:</span><span>n</span><span>- "</span></span>
<span class="line"><span>                         +</span><span> "</span><span>n</span><span>- "</span><span>.join(problems[:</span><span>8</span><span>]) </span><span>+</span><span> f</span><span>"</span><span>n</span><span>Send the whole corrected program in one </span><span>{FENCE}</span><span>python block."</span><span>}]</span></span>
<span class="line"><span>        return</span><span> {</span><span>"src"</span><span>: src, </span><span>"valid"</span><span>: </span><span>not</span><span> problems, </span><span>"tries"</span><span>: </span><span>len</span><span>(attempts), </span><span>"attempts"</span><span>: attempts, </span><span>"estimate"</span><span>: est}</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># lead.py</span></span>
<span class="line"><span>    def</span><span> write_program</span><span>(self, job, page, budget</span><span>=</span><span>150</span><span>, sample</span><span>=</span><span>0</span><span>, repairs</span><span>=</span><span>2</span><span>):</span></span>
<span class="line"><span>        # the job and the fact sheet are all the lead reads</span></span>
<span class="line"><span>        messages </span><span>=</span><span> [{</span><span>"role"</span><span>: </span><span>"system"</span><span>, </span><span>"content"</span><span>: </span><span>PROMPTS</span><span>[</span><span>"lead"</span><span>]}, {</span><span>"role"</span><span>: </span><span>"user"</span><span>, </span><span>"content"</span><span>: </span><span>f</span><span>"THE JOB</span><span>n{</span><span>job</span><span>}nn{</span><span>page</span><span>}</span><span>"</span><span>}]</span></span>
<span class="line"><span>        attempts </span><span>=</span><span> []</span></span>
<span class="line"><span>        for</span><span> _ </span><span>in</span><span> range</span><span>(</span><span>1</span><span> +</span><span> repairs):</span></span>
<span class="line"><span>            r </span><span>=</span><span> self</span><span>.ask(messages, sample)</span></span>
<span class="line"><span>            # take out the python block, then check and rehearse it</span></span>
<span class="line"><span>            m </span><span>=</span><span> re.search(</span><span>FENCE</span><span> +</span><span> r</span><span>"</span><span>(?:</span><span>python</span><span>|</span><span>py</span><span>)</span><span>?</span><span>s</span><span>*</span><span>n</span><span>(.</span><span>*?</span><span>)</span><span>"</span><span> +</span><span> FENCE</span><span>, r.text, re.S)</span></span>
<span class="line"><span>            src </span><span>=</span><span> m.group(</span><span>1</span><span>).strip() </span><span>if</span><span> m </span><span>else</span><span> None</span></span>
<span class="line"><span>            est, problems </span><span>=</span><span> dry_run(src, budget) </span><span>if</span><span> src </span><span>else</span><span> (</span><span>None</span><span>, [</span><span>f</span><span>"line 1: the reply has no </span><span>{FENCE}</span><span>python block"</span><span>])</span></span>
<span class="line"><span>            attempts.append({</span><span>"src"</span><span>: src, </span><span>"problems"</span><span>: problems, </span><span>"estimate"</span><span>: est})</span></span>
<span class="line"><span>            if</span><span> not</span><span> problems:</span></span>
<span class="line"><span>                break</span></span>
<span class="line"><span>            # hand every problem back in the checker's own words</span></span>
<span class="line"><span>            messages </span><span>+=</span><span> [{</span><span>"role"</span><span>: </span><span>"assistant"</span><span>, </span><span>"content"</span><span>: r.text[:</span><span>8000</span><span>]}, {</span><span>"role"</span><span>: </span><span>"user"</span><span>, </span><span>"content"</span><span>: </span><span>"Your program has these problems:</span><span>n</span><span>- "</span></span>
<span class="line"><span>                         +</span><span> "</span><span>n</span><span>- "</span><span>.join(problems[:</span><span>8</span><span>]) </span><span>+</span><span> f</span><span>"</span><span>n</span><span>Send the whole corrected program in one </span><span>{FENCE}</span><span>python block."</span><span>}]</span></span>
<span class="line"><span>        return</span><span> {</span><span>"src"</span><span>: src, </span><span>"valid"</span><span>: </span><span>not</span><span> problems, </span><span>"tries"</span><span>: </span><span>len</span><span>(attempts), </span><span>"attempts"</span><span>: attempts, </span><span>"estimate"</span><span>: est}</span></span></code></pre>
<p>I asked the same lead for ten programs, one per sample index. From here on the model is real, and each output is the one the original run recorded. That run also retried failed calls and showed each skeptic a sandbox result, two steps this build leaves out.</p>
<p>							5} {w[&#x27;estimate&#x27;][&#x27;agents&#x27;]:&gt;8} {w[&#x27;estimate&#x27;][&#x27;credits&#x27;]:&gt;8.1f}&#x22;)</p>
<p>#### OUTPUT ####<br />
tries  workers  credits<br />
    1      263     52.9<br />
    1      182     36.4<br />
    1      261     52.5<br />
    2      173     34.9<br />
    2      252     50.4<br />
    2      112     22.4<br />
    2      196     39.2<br />
    1      226     45.5<br />
    1      263     52.9<br />
    1      263     52.9&#8243; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-3 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>from</span><span> pathlib </span><span>import</span><span> Path</span></span>
<span class="line"><span>from</span><span> lead </span><span>import</span><span> Lead</span></span>
<span class="line"><span>from</span><span> llm </span><span>import</span><span> http_client</span></span>
<span class="line"></span>
<span class="line"><span>JOB</span><span> =</span><span> "Find the behaviour bugs in a library of 849 Python files [...]. Report each bug with its file, its line and a call that shows it."</span></span>
<span class="line"><span>PAGE</span><span> =</span><span> Path(</span><span>"page.txt"</span><span>).read_text()                              </span><span># the fact sheet shown above</span></span>
<span class="line"><span>live </span><span>=</span><span> LLM(Ledger(</span><span>"ledger.sqlite"</span><span>), </span><span>client</span><span>=</span><span>http_client)          </span><span># the real model</span></span>
<span class="line"><span>programs </span><span>=</span><span> [Lead(live).write_program(</span><span>JOB</span><span>, </span><span>PAGE</span><span>, </span><span>budget</span><span>=</span><span>150</span><span>, </span><span>sample</span><span>=</span><span>k) </span><span>for</span><span> k </span><span>in</span><span> range</span><span>(</span><span>10</span><span>)]</span></span>
<span class="line"><span>print</span><span>(</span><span>"tries  workers  credits"</span><span>)</span></span>
<span class="line"><span>for</span><span> w </span><span>in</span><span> programs:</span></span>
<span class="line"><span>    print</span><span>(</span><span>f</span><span>"</span><span>{</span><span>w[</span><span>'tries'</span><span>]</span><span>:&gt;5</span><span>}</span><span> {</span><span>w[</span><span>'estimate'</span><span>][</span><span>'agents'</span><span>]</span><span>:&gt;8</span><span>}</span><span> {</span><span>w[</span><span>'estimate'</span><span>][</span><span>'credits'</span><span>]</span><span>:&gt;8.1f</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>tries  workers  </span><span>credits</span></span>
<span class="line"><span>    1</span><span>      263</span><span>     52.9</span></span>
<span class="line"><span>    1</span><span>      182</span><span>     36.4</span></span>
<span class="line"><span>    1</span><span>      261</span><span>     52.5</span></span>
<span class="line"><span>    2</span><span>      173</span><span>     34.9</span></span>
<span class="line"><span>    2</span><span>      252</span><span>     50.4</span></span>
<span class="line"><span>    2</span><span>      112</span><span>     22.4</span></span>
<span class="line"><span>    2</span><span>      196</span><span>     39.2</span></span>
<span class="line"><span>    1</span><span>      226</span><span>     45.5</span></span>
<span class="line"><span>    1</span><span>      263</span><span>     52.9</span></span>
<span class="line"><span>    1</span><span>      263</span><span>     52.9</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>from</span><span> pathlib </span><span>import</span><span> Path</span></span>
<span class="line"><span>from</span><span> lead </span><span>import</span><span> Lead</span></span>
<span class="line"><span>from</span><span> llm </span><span>import</span><span> http_client</span></span>
<span class="line"></span>
<span class="line"><span>JOB</span><span> =</span><span> "Find the behaviour bugs in a library of 849 Python files [...]. Report each bug with its file, its line and a call that shows it."</span></span>
<span class="line"><span>PAGE</span><span> =</span><span> Path(</span><span>"page.txt"</span><span>).read_text()                              </span><span># the fact sheet shown above</span></span>
<span class="line"><span>live </span><span>=</span><span> LLM(Ledger(</span><span>"ledger.sqlite"</span><span>), </span><span>client</span><span>=</span><span>http_client)          </span><span># the real model</span></span>
<span class="line"><span>programs </span><span>=</span><span> [Lead(live).write_program(</span><span>JOB</span><span>, </span><span>PAGE</span><span>, </span><span>budget</span><span>=</span><span>150</span><span>, </span><span>sample</span><span>=</span><span>k) </span><span>for</span><span> k </span><span>in</span><span> range</span><span>(</span><span>10</span><span>)]</span></span>
<span class="line"><span>print</span><span>(</span><span>"tries  workers  credits"</span><span>)</span></span>
<span class="line"><span>for</span><span> w </span><span>in</span><span> programs:</span></span>
<span class="line"><span>    print</span><span>(</span><span>f</span><span>"</span><span>{</span><span>w[</span><span>'tries'</span><span>]</span><span>:&gt;5</span><span>}</span><span> {</span><span>w[</span><span>'estimate'</span><span>][</span><span>'agents'</span><span>]</span><span>:&gt;8</span><span>}</span><span> {</span><span>w[</span><span>'estimate'</span><span>][</span><span>'credits'</span><span>]</span><span>:&gt;8.1f</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>tries  workers  </span><span>credits</span></span>
<span class="line"><span>    1</span><span>      263</span><span>     52.9</span></span>
<span class="line"><span>    1</span><span>      182</span><span>     36.4</span></span>
<span class="line"><span>    1</span><span>      261</span><span>     52.5</span></span>
<span class="line"><span>    2</span><span>      173</span><span>     34.9</span></span>
<span class="line"><span>    2</span><span>      252</span><span>     50.4</span></span>
<span class="line"><span>    2</span><span>      112</span><span>     22.4</span></span>
<span class="line"><span>    2</span><span>      196</span><span>     39.2</span></span>
<span class="line"><span>    1</span><span>      226</span><span>     45.5</span></span>
<span class="line"><span>    1</span><span>      263</span><span>     52.9</span></span>
<span class="line"><span>    1</span><span>      263</span><span>     52.9</span></span></code></pre>
<p>Six were valid at the first try. The four that needed a repair (<code>tries</code> 2) had all broken the same rule, the length limit, with 103, 176, 141 and 159 lines where 80 is the maximum. All ten looped and decided from their results, but only one read <code>budget()</code>.</p>
<h3>A Full Audit of the Real Library</h3>
<p><code>audit</code> runs every stage in turn, from the lead&#8217;s first draft to the background run.</p>
<p>							= set(WORK),<br />
             &#x22;credits&#x22;: sum(PRICE.get(t.model, 0.2) * len(t.replies) for t in run.threads)}</p>
<p>    return {&#x22;decision&#x22;: decision, &#x22;why&#x22;: why, &#x22;plan&#x22;: plan, &#x22;run&#x22;: run, &#x22;result&#x22;: result, &#x22;stats&#x22;: stats, &#x22;lead_read&#x22;: sum(lead.read)}&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-3 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># lead.py</span></span>
<span class="line"><span>def</span><span> audit</span><span>(llm, job, page, budget</span><span>=</span><span>150</span><span>, sample</span><span>=</span><span>0</span><span>, person</span><span>=</span><span>None</span><span>):</span></span>
<span class="line"><span>    lead </span><span>=</span><span> Lead(llm)</span></span>
<span class="line"><span>    plan </span><span>=</span><span> lead.write_program(job, page, budget, sample)</span></span>
<span class="line"><span>    decision, why </span><span>=</span><span> approve(plan[</span><span>"estimate"</span><span>], budget, person)</span></span>
<span class="line"><span>    if</span><span> decision </span><span>!=</span><span> "approved"</span><span>:</span></span>
<span class="line"><span>        return</span><span> {</span><span>"decision"</span><span>: decision, </span><span>"why"</span><span>: why, </span><span>"plan"</span><span>: plan}</span></span>
<span class="line"></span>
<span class="line"><span>    # the approved plan runs on a budget of its own</span></span>
<span class="line"><span>    run </span><span>=</span><span> Run(</span><span>"the lead's own plan"</span><span>, job, </span><span>llm</span><span>=</span><span>LLM(llm.ledger, llm.mode, llm.client, llm.scripted, Budget(budget)), </span><span>run_id</span><span>=</span><span>f</span><span>"d</span><span>{</span><span>sample</span><span>}</span><span>"</span><span>, </span><span>concurrency</span><span>=</span><span>32</span><span>)</span></span>
<span class="line"><span>    result </span><span>=</span><span> run.start(</span><span>lambda</span><span> r: run_program(plan[</span><span>"src"</span><span>], AuditKit(run, sample))).wait()</span></span>
<span class="line"></span>
<span class="line"><span>    # which files the scan workers saw</span></span>
<span class="line"><span>    seen </span><span>=</span><span> {p </span><span>for</span><span> t </span><span>in</span><span> run.threads </span><span>if</span><span> t.role </span><span>==</span><span> "scan"</span><span> for</span><span> p </span><span>in</span><span> re.findall(</span><span>r</span><span>"</span><span>^</span><span>### </span><span>(S</span><span>+</span><span>)$</span><span>"</span><span>, t.messages[</span><span>1</span><span>][</span><span>"content"</span><span>], re.M)}</span></span>
<span class="line"><span>    stats </span><span>=</span><span> {</span><span>"agents"</span><span>: </span><span>len</span><span>(run.threads), </span><span>"calls"</span><span>: </span><span>sum</span><span>(</span><span>len</span><span>(t.replies) </span><span>for</span><span> t </span><span>in</span><span> run.threads), </span><span>"covered"</span><span>: seen </span><span>&gt;=</span><span> set</span><span>(</span><span>WORK</span><span>),</span></span>
<span class="line"><span>             "credits"</span><span>: </span><span>sum</span><span>(</span><span>PRICE</span><span>.get(t.model, </span><span>0.2</span><span>) </span><span>*</span><span> len</span><span>(t.replies) </span><span>for</span><span> t </span><span>in</span><span> run.threads)}</span></span>
<span class="line"></span>
<span class="line"><span>    return</span><span> {</span><span>"decision"</span><span>: decision, </span><span>"why"</span><span>: why, </span><span>"plan"</span><span>: plan, </span><span>"run"</span><span>: run, </span><span>"result"</span><span>: result, </span><span>"stats"</span><span>: stats, </span><span>"lead_read"</span><span>: </span><span>sum</span><span>(lead.read)}</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># lead.py</span></span>
<span class="line"><span>def</span><span> audit</span><span>(llm, job, page, budget</span><span>=</span><span>150</span><span>, sample</span><span>=</span><span>0</span><span>, person</span><span>=</span><span>None</span><span>):</span></span>
<span class="line"><span>    lead </span><span>=</span><span> Lead(llm)</span></span>
<span class="line"><span>    plan </span><span>=</span><span> lead.write_program(job, page, budget, sample)</span></span>
<span class="line"><span>    decision, why </span><span>=</span><span> approve(plan[</span><span>"estimate"</span><span>], budget, person)</span></span>
<span class="line"><span>    if</span><span> decision </span><span>!=</span><span> "approved"</span><span>:</span></span>
<span class="line"><span>        return</span><span> {</span><span>"decision"</span><span>: decision, </span><span>"why"</span><span>: why, </span><span>"plan"</span><span>: plan}</span></span>
<span class="line"></span>
<span class="line"><span>    # the approved plan runs on a budget of its own</span></span>
<span class="line"><span>    run </span><span>=</span><span> Run(</span><span>"the lead's own plan"</span><span>, job, </span><span>llm</span><span>=</span><span>LLM(llm.ledger, llm.mode, llm.client, llm.scripted, Budget(budget)), </span><span>run_id</span><span>=</span><span>f</span><span>"d</span><span>{</span><span>sample</span><span>}</span><span>"</span><span>, </span><span>concurrency</span><span>=</span><span>32</span><span>)</span></span>
<span class="line"><span>    result </span><span>=</span><span> run.start(</span><span>lambda</span><span> r: run_program(plan[</span><span>"src"</span><span>], AuditKit(run, sample))).wait()</span></span>
<span class="line"></span>
<span class="line"><span>    # which files the scan workers saw</span></span>
<span class="line"><span>    seen </span><span>=</span><span> {p </span><span>for</span><span> t </span><span>in</span><span> run.threads </span><span>if</span><span> t.role </span><span>==</span><span> "scan"</span><span> for</span><span> p </span><span>in</span><span> re.findall(</span><span>r</span><span>"</span><span>^</span><span>### </span><span>(S</span><span>+</span><span>)$</span><span>"</span><span>, t.messages[</span><span>1</span><span>][</span><span>"content"</span><span>], re.M)}</span></span>
<span class="line"><span>    stats </span><span>=</span><span> {</span><span>"agents"</span><span>: </span><span>len</span><span>(run.threads), </span><span>"calls"</span><span>: </span><span>sum</span><span>(</span><span>len</span><span>(t.replies) </span><span>for</span><span> t </span><span>in</span><span> run.threads), </span><span>"covered"</span><span>: seen </span><span>&gt;=</span><span> set</span><span>(</span><span>WORK</span><span>),</span></span>
<span class="line"><span>             "credits"</span><span>: </span><span>sum</span><span>(</span><span>PRICE</span><span>.get(t.model, </span><span>0.2</span><span>) </span><span>*</span><span> len</span><span>(t.replies) </span><span>for</span><span> t </span><span>in</span><span> run.threads)}</span></span>
<span class="line"></span>
<span class="line"><span>    return</span><span> {</span><span>"decision"</span><span>: decision, </span><span>"why"</span><span>: why, </span><span>"plan"</span><span>: plan, </span><span>"run"</span><span>: run, </span><span>"result"</span><span>: result, </span><span>"stats"</span><span>: stats, </span><span>"lead_read"</span><span>: </span><span>sum</span><span>(lead.read)}</span></span></code></pre>
<p>On a budget of 150 credits, the lead&#8217;s first program was priced at 263 workers and 52.9 credits, above the automatic limit of 40. My standing rule, written before I saw any estimate, approved it at under half the budget. Here is the program, trimmed to its core.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span># the lead's own program, trimmed to its core</span></span>
<span class="line"><span>phase(</span><span>"Scan"</span><span>)</span></span>
<span class="line"><span>shardlist </span><span>=</span><span> list</span><span>(shards(</span><span>100000</span><span>))</span></span>
<span class="line"><span>roundlenses </span><span>=</span><span> [</span><span>"general"</span><span>, </span><span>"logic"</span><span>, </span><span>"boundaries"</span><span>, </span><span>"state"</span><span>] </span><span>*</span><span> 3</span><span> +</span><span> [</span><span>"general"</span><span>, </span><span>"logic"</span><span>]       </span><span># fourteen rounds</span></span>
<span class="line"></span>
<span class="line"><span>allfindings </span><span>=</span><span> []</span></span>
<span class="line"></span>
<span class="line"><span>for</span><span> sampleid, lens </span><span>in</span><span> enumerate</span><span>(roundlenses):</span></span>
<span class="line"><span>    found </span><span>=</span><span> flatten(parallel([</span><span>lambda</span><span> s</span><span>=</span><span>s, l</span><span>=</span><span>lens, r</span><span>=</span><span>sampleid: scan(s, l, </span><span>sample</span><span>=</span><span>r) </span><span>for</span><span> s </span><span>in</span><span> shardlist]))</span></span>
<span class="line"><span>    allfindings.extend(found)</span></span>
<span class="line"></span>
<span class="line"><span>candidates </span><span>=</span><span> dedupe(allfindings)</span></span>
<span class="line"><span>phase(</span><span>"Verify"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>verdicts </span><span>=</span><span> flatten(parallel([</span><span>lambda</span><span> b</span><span>=</span><span>b, k</span><span>=</span><span>k: check(b, </span><span>sample</span><span>=</span><span>k) </span><span>for</span><span> b </span><span>in</span><span> batches(candidates, </span><span>8</span><span>) </span><span>for</span><span> k </span><span>in</span><span> range</span><span>(</span><span>3</span><span>)]))</span></span>
<span class="line"><span>confirmed </span><span>=</span><span> vote(candidates, verdicts, </span><span>need</span><span>=</span><span>2</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>phase(</span><span>"Report"</span><span>)</span></span>
<span class="line"><span>result </span><span>=</span><span> report(confirmed)</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span># the lead's own program, trimmed to its core</span></span>
<span class="line"><span>phase(</span><span>"Scan"</span><span>)</span></span>
<span class="line"><span>shardlist </span><span>=</span><span> list</span><span>(shards(</span><span>100000</span><span>))</span></span>
<span class="line"><span>roundlenses </span><span>=</span><span> [</span><span>"general"</span><span>, </span><span>"logic"</span><span>, </span><span>"boundaries"</span><span>, </span><span>"state"</span><span>] </span><span>*</span><span> 3</span><span> +</span><span> [</span><span>"general"</span><span>, </span><span>"logic"</span><span>]       </span><span># fourteen rounds</span></span>
<span class="line"></span>
<span class="line"><span>allfindings </span><span>=</span><span> []</span></span>
<span class="line"></span>
<span class="line"><span>for</span><span> sampleid, lens </span><span>in</span><span> enumerate</span><span>(roundlenses):</span></span>
<span class="line"><span>    found </span><span>=</span><span> flatten(parallel([</span><span>lambda</span><span> s</span><span>=</span><span>s, l</span><span>=</span><span>lens, r</span><span>=</span><span>sampleid: scan(s, l, </span><span>sample</span><span>=</span><span>r) </span><span>for</span><span> s </span><span>in</span><span> shardlist]))</span></span>
<span class="line"><span>    allfindings.extend(found)</span></span>
<span class="line"></span>
<span class="line"><span>candidates </span><span>=</span><span> dedupe(allfindings)</span></span>
<span class="line"><span>phase(</span><span>"Verify"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>verdicts </span><span>=</span><span> flatten(parallel([</span><span>lambda</span><span> b</span><span>=</span><span>b, k</span><span>=</span><span>k: check(b, </span><span>sample</span><span>=</span><span>k) </span><span>for</span><span> b </span><span>in</span><span> batches(candidates, </span><span>8</span><span>) </span><span>for</span><span> k </span><span>in</span><span> range</span><span>(</span><span>3</span><span>)]))</span></span>
<span class="line"><span>confirmed </span><span>=</span><span> vote(candidates, verdicts, </span><span>need</span><span>=</span><span>2</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>phase(</span><span>"Report"</span><span>)</span></span>
<span class="line"><span>result </span><span>=</span><span> report(confirmed)</span></span></code></pre>
<p>The fourteen scan rounds, the rotating lenses and the three skeptics per batch were the lead&#8217;s own choices, sized to its instruction to stay under half the budget.</p>
<p>							&lt;button data-code=&quot;from bench import match<br />
from lead import audit</p>
<p>out = audit(live, JOB, PAGE, budget=150, sample=0, person=lambda est: est[&#x22;credits&#x22;] <span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>from</span><span> bench </span><span>import</span><span> match</span></span>
<span class="line"><span>from</span><span> lead </span><span>import</span><span> audit</span></span>
<span class="line"></span>
<span class="line"><span>out </span><span>=</span><span> audit(live, </span><span>JOB</span><span>, </span><span>PAGE</span><span>, </span><span>budget</span><span>=</span><span>150</span><span>, </span><span>sample</span><span>=</span><span>0</span><span>, </span><span>person</span><span>=lambda</span><span> est: est[</span><span>"credits"</span><span>] </span><span>&#x3C;=</span><span> 75</span><span>)    </span><span># my standing rule: half the job budget</span></span>
<span class="line"><span>est, score </span><span>=</span><span> out[</span><span>"plan"</span><span>][</span><span>"estimate"</span><span>], match(out[</span><span>"result"</span><span>][</span><span>"bugs"</span><span>])</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"estimate </span><span>{</span><span>est[</span><span>'agents'</span><span>]</span><span>}</span><span> workers and </span><span>{</span><span>est[</span><span>'credits'</span><span>]</span><span>:.1f</span><span>}</span><span> credits, gate: </span><span>{</span><span>out[</span><span>'decision'</span><span>]</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"</span><span>{</span><span>out[</span><span>'run'</span><span>].status</span><span>}</span><span>: </span><span>{</span><span>out[</span><span>'stats'</span><span>][</span><span>'agents'</span><span>]</span><span>}</span><span> workers, </span><span>{</span><span>out[</span><span>'stats'</span><span>][</span><span>'calls'</span><span>]</span><span>}</span><span> calls, </span><span>{</span><span>out[</span><span>'stats'</span><span>][</span><span>'credits'</span><span>]</span><span>:.1f</span><span>}</span><span> credits at full price"</span><span>)</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"</span><span>{len</span><span>(out[</span><span>'result'</span><span>][</span><span>'bugs'</span><span>])</span><span>}</span><span> bugs reported, scored against the hidden key: recall </span><span>{</span><span>score[</span><span>'recall'</span><span>]</span><span>:.2f</span><span>}</span><span>, precision </span><span>{</span><span>score[</span><span>'precision'</span><span>]</span><span>:.2f</span><span>}</span><span> "</span></span>
<span class="line"><span>      f</span><span>"(</span><span>{</span><span>score[</span><span>'tp'</span><span>]</span><span>}</span><span> planted, </span><span>{</span><span>score[</span><span>'fp'</span><span>]</span><span>}</span><span> other places)"</span><span>)</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"the lead read </span><span>{</span><span>out[</span><span>'lead_read'</span><span>]</span><span>:,</span><span>}</span><span> prompt tokens in all, and every file was read by a scan worker: </span><span>{</span><span>out[</span><span>'stats'</span><span>][</span><span>'covered'</span><span>]</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>estimate </span><span>263</span><span> workers </span><span>and</span><span> 52.9</span><span> credits</span><span>, gate: approved</span></span>
<span class="line"><span>completed: </span><span>236</span><span> workers, </span><span>247</span><span> calls, </span><span>49.7</span><span> credits</span><span> at full price</span></span>
<span class="line"><span>50</span><span> bugs reported, scored against the hidden key: recall </span><span>0.53</span><span>, precision </span><span>0.76</span><span> (</span><span>38</span><span> planted, </span><span>12</span><span> other places)</span></span>
<span class="line"><span>the lead read </span><span>1</span><span>,</span><span>780</span><span> prompt tokens </span><span>in</span><span> all</span><span>, </span><span>and</span><span> every </span><span>file</span><span> was read by a scan worker: </span><span>True</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>from</span><span> bench </span><span>import</span><span> match</span></span>
<span class="line"><span>from</span><span> lead </span><span>import</span><span> audit</span></span>
<span class="line"></span>
<span class="line"><span>out </span><span>=</span><span> audit(live, </span><span>JOB</span><span>, </span><span>PAGE</span><span>, </span><span>budget</span><span>=</span><span>150</span><span>, </span><span>sample</span><span>=</span><span>0</span><span>, </span><span>person</span><span>=lambda</span><span> est: est[</span><span>"credits"</span><span>] </span><span>&#x3C;=</span><span> 75</span><span>)    </span><span># my standing rule: half the job budget</span></span>
<span class="line"><span>est, score </span><span>=</span><span> out[</span><span>"plan"</span><span>][</span><span>"estimate"</span><span>], match(out[</span><span>"result"</span><span>][</span><span>"bugs"</span><span>])</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"estimate </span><span>{</span><span>est[</span><span>'agents'</span><span>]</span><span>}</span><span> workers and </span><span>{</span><span>est[</span><span>'credits'</span><span>]</span><span>:.1f</span><span>}</span><span> credits, gate: </span><span>{</span><span>out[</span><span>'decision'</span><span>]</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"</span><span>{</span><span>out[</span><span>'run'</span><span>].status</span><span>}</span><span>: </span><span>{</span><span>out[</span><span>'stats'</span><span>][</span><span>'agents'</span><span>]</span><span>}</span><span> workers, </span><span>{</span><span>out[</span><span>'stats'</span><span>][</span><span>'calls'</span><span>]</span><span>}</span><span> calls, </span><span>{</span><span>out[</span><span>'stats'</span><span>][</span><span>'credits'</span><span>]</span><span>:.1f</span><span>}</span><span> credits at full price"</span><span>)</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"</span><span>{len</span><span>(out[</span><span>'result'</span><span>][</span><span>'bugs'</span><span>])</span><span>}</span><span> bugs reported, scored against the hidden key: recall </span><span>{</span><span>score[</span><span>'recall'</span><span>]</span><span>:.2f</span><span>}</span><span>, precision </span><span>{</span><span>score[</span><span>'precision'</span><span>]</span><span>:.2f</span><span>}</span><span> "</span></span>
<span class="line"><span>      f</span><span>"(</span><span>{</span><span>score[</span><span>'tp'</span><span>]</span><span>}</span><span> planted, </span><span>{</span><span>score[</span><span>'fp'</span><span>]</span><span>}</span><span> other places)"</span><span>)</span></span>
<span class="line"><span>print</span><span>(</span><span>f</span><span>"the lead read </span><span>{</span><span>out[</span><span>'lead_read'</span><span>]</span><span>:,</span><span>}</span><span> prompt tokens in all, and every file was read by a scan worker: </span><span>{</span><span>out[</span><span>'stats'</span><span>][</span><span>'covered'</span><span>]</span><span>}</span><span>"</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>estimate </span><span>263</span><span> workers </span><span>and</span><span> 52.9</span><span> credits</span><span>, gate: approved</span></span>
<span class="line"><span>completed: </span><span>236</span><span> workers, </span><span>247</span><span> calls, </span><span>49.7</span><span> credits</span><span> at full price</span></span>
<span class="line"><span>50</span><span> bugs reported, scored against the hidden key: recall </span><span>0.53</span><span>, precision </span><span>0.76</span><span> (</span><span>38</span><span> planted, </span><span>12</span><span> other places)</span></span>
<span class="line"><span>the lead read </span><span>1</span><span>,</span><span>780</span><span> prompt tokens </span><span>in</span><span> all</span><span>, </span><span>and</span><span> every </span><span>file</span><span> was read by a scan worker: </span><span>True</span></span></code></pre>
<p>The ledger timed every call:</p>
<p>In the main paid session the wall clock was 41 minutes for 120 minutes of calls, and verification was the slow phase: 193 scan calls took 14 minutes, while 39 skeptic calls took 23.</p>
<p>The lead&#8217;s one planning call read 1,780 prompt tokens. One agent alone carried up to 91,171 in a single prompt, and the scan workers read 18.4 million between them.</p>
<p>With 20 or 60 credits on its sheet instead of 150, the lead&#8217;s plans cost 8.3 and 18.1 and caught 28% and 39% of the bugs.</p>
<h3>Five-Design Evaluation</h3>
<p>One scorer and one hidden key judge all five:</p>
<ul>
<li><strong>A</strong>: one agent working alone.</li>
<li><strong>A2</strong>: that agent with a dynamic run&#8217;s budget.</li>
<li><strong>B</strong>: the lead with helpers.</li>
<li><strong>C</strong>: the hand-written fixed plan.</li>
<li><strong>D</strong>: the dynamic workflow.</li>
</ul>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>  design</span><span>  runs</span><span>  mean</span><span> recall</span><span>  mean</span><span> precision</span><span>  mean</span><span> credits</span></span>
<span class="line"><span>  ------</span><span>  ----</span><span>  -----------</span><span>  --------------</span><span>  ------------</span></span>
<span class="line"><span>  A</span><span>          3</span><span>         0.02</span><span>            1.00</span><span>          23.7</span></span>
<span class="line"><span>  A2</span><span>         2</span><span>         0.04</span><span>            0.78</span><span>          46.4</span></span>
<span class="line"><span>  B</span><span>          1</span><span>         0.17</span><span>            0.67</span><span>          10.3</span></span>
<span class="line"><span>  C</span><span>          3</span><span>         0.30</span><span>            0.82</span><span>          13.8</span></span>
<span class="line"><span>  D</span><span>          3</span><span>         0.45</span><span>            0.71</span><span>          48.4</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>  design</span><span>  runs</span><span>  mean</span><span> recall</span><span>  mean</span><span> precision</span><span>  mean</span><span> credits</span></span>
<span class="line"><span>  ------</span><span>  ----</span><span>  -----------</span><span>  --------------</span><span>  ------------</span></span>
<span class="line"><span>  A</span><span>          3</span><span>         0.02</span><span>            1.00</span><span>          23.7</span></span>
<span class="line"><span>  A2</span><span>         2</span><span>         0.04</span><span>            0.78</span><span>          46.4</span></span>
<span class="line"><span>  B</span><span>          1</span><span>         0.17</span><span>            0.67</span><span>          10.3</span></span>
<span class="line"><span>  C</span><span>          3</span><span>         0.30</span><span>            0.82</span><span>          13.8</span></span>
<span class="line"><span>  D</span><span>          3</span><span>         0.45</span><span>            0.71</span><span>          48.4</span></span></code></pre>
<p>The intervals are bootstrap resamples of the runs:</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>[boot] mean recall D - A: 95% interval +0.30 to +0.56</span></span>
<span class="line"><span>[boot] mean recall D - A2: 95% interval +0.28 to +0.54</span></span>
<span class="line"><span>[boot] mean recall D - C: 95% interval +0.06 to +0.25</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>#### OUTPUT ####</span></span>
<span class="line"><span>[boot] mean recall D - A: 95% interval +0.30 to +0.56</span></span>
<span class="line"><span>[boot] mean recall D - A2: 95% interval +0.28 to +0.54</span></span>
<span class="line"><span>[boot] mean recall D - C: 95% interval +0.06 to +0.25</span></span></code></pre>
<p>Money alone does not explain the gap: the agent given 248 turns still quit on its own.</p>
<p>The lead&#8217;s plan beats the fixed plan by +0.06 to +0.25 at about 3.5 times the cost. I never ran a fixed plan told to scan fourteen times, so the gain cannot be split between more reading and better planning.</p>
<p>Both workflows read every file, so most missed bugs were read and never reported. H1, H1b and H5 held, with a second scan round adding 5, 6 and 2 bugs.</p>
<p>H4 missed both bars: skeptics raised precision by 0.25, but the interval&#8217;s low end, +0.13, fell short of +0.15, and recall may have dropped by up to 0.069. H6 did not hold: skeptics scored 0.84 with the failing call and 0.85 without.</p>
<h3>Ablation Ledger</h3>
<p>For each feature I measured what removing it does to the number it was built for.</p>
<p>A second round of scanning and verification by skeptics earned their calls, while the lenses, the sandbox and a cross-generation judge came out neutral. On the 40 places of one run, a single skeptic gave precision 0.08 higher than three without losing recall, though the interval starts at +0.003.</p>
<h3>Known Limits</h3>
<p>Three of my eleven predictions held.</p>
<p>The dynamic runs were no more consistent than one agent, perhaps because each run was a different plan. They cost 3.5 times the money of the fixed plan, and 0.71 precision against 0.82. Precision is a lower bound, because every place outside the key counts as a false alarm.</p>
<p>Each design had three runs or fewer, on one library and one model family, and the intervals are wide. The library is public, though models asked to write its 72 functions back matched them at a median similarity of only 0.17.</p>
<h3>What the Study Cost</h3>
<p>Over three days the runs made 2,616 calls and spent 557.4 credits, about 29 hours of model time.</p>
<p>If you build on this, calibrate the blind stand-in on one real run first, and give the lead a stopping rule for its loops. The code, the data and the full notebook are in the repository.</p>
<p><a href="https://github.com/FareedKhan-dev/dynamic-workflow-agents" rel="nofollow noopener noreferrer" target="_blank"><strong>GitHub &#8211; FareedKhan-dev/dynamic-workflow-agents: Claude and Qwen editions of Dynamic Workflows from…</strong><span></span></a><br />
<em>Claude and Qwen editions of Dynamic Workflows from Scratch &#8211; FareedKhan-dev/dynamic-workflow-agents</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://freedium.net/building-dynamic-workflows-a-new-agentic-system/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">146</post-id>	</item>
		<item>
		<title>8 New AI Terms You Should Know to Be Ahead of 90% of People</title>
		<link>https://freedium.net/8-new-ai-terms-you-should-know-to-be-ahead-of-90-of-people/</link>
					<comments>https://freedium.net/8-new-ai-terms-you-should-know-to-be-ahead-of-90-of-people/#respond</comments>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Wed, 28 Oct 2026 02:07:47 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://freedium.net/8-new-ai-terms-you-should-know-to-be-ahead-of-90-of-people/</guid>

					<description><![CDATA[I recently read this piece from Shreyas Naphad, "If You Understand These 5 AI Terms, You're Ahead of 90% of People," and had fun reading it. As an AI enthusiast and a technical writer who's&#8230;]]></description>
										<content:encoded><![CDATA[<p>I recently read this piece from <a href="https://medium.com/u/17d9ae451abc" rel="nofollow noopener noreferrer" target="_blank">Shreyas Naphad<span></span></a>, &#8220;<a href="https://pub.towardsai.net/if-you-understand-these-5-ai-terms-youre-ahead-of-90-of-people-c7622d353319" rel="nofollow noopener noreferrer" target="_blank">If You Understand These 5 AI Terms, You&#8217;re Ahead of 90% of People<span></span></a>,&#8221; and had fun reading it.</p>
<p>As an AI enthusiast and a technical writer who&#8217;s been writing about AI for more than five years now, I&#8217;m already familiar with all five terms. But then I thought, hey, there are more AI terms people should know, including some newer ones.</p>
<p>So I wrote this piece to share eight more terms and explain them in the best non too technical way I can. The next time you hear or read about them, you&#8217;ll know what they mean and why people are talking about them.</p>
<p>Let&#8217;s start.</p>
<h4>1. Harness</h4>
<p>A raw model is a brain in a jar. It can think. But on its own, it cannot open Slack, send an email on your behalf, or even know when to quit.</p>
<p>A <strong>harness</strong> is the software around the model that lets it do those things. It gives the model access to tools and information, manages permissions, and controls when it should retry, stop, or ask you for help.</p>
<p>A simple way to describe it is:</p>
<p><strong>Agent = Model + Harness</strong></p>
<p>For a coding agent, the harness provides tools to read files, edit code, and run tests. It also manages the instructions and feedback the model receives.</p>
<p>Two apps can use the same model and still perform differently because their harnesses give it different tools, instructions, and ways to check its work.</p>
<p>That&#8217;s why the software around a model matters so much. OpenAI&#8217;s article on <a href="https://openai.com/index/harness-engineering/" rel="nofollow noopener noreferrer" target="_blank">harness engineering<span></span></a> describes how its team built an environment where Codex could write code, run checks, and respond to feedback.</p>
<p>When you compare AI tools, look at how they help the model complete your task, and which model they use.</p>
<h4>2. Agents</h4>
<p>An agent can take multiple steps and use tools to complete a task.</p>
<p>For example, you could ask one to help resolve a refund. With the right access, it could find the order, check the refund policy, prepare a request, and ask for your approval before submitting it.</p>
<p>The basic process is: plan, act, check the result, and decide what to do next. <a href="https://www.anthropic.com/engineering/building-effective-agents" rel="nofollow noopener noreferrer" target="_blank">Anthropic&#8217;s explanation of agents<span></span></a> describes how these systems use feedback to guide their next actions.</p>
<p>The diagram below shows an autonomous agent using tools based on environmental feedback in a loop.</p>
<p>Think of an agent as an assistant with a to-do list and permission to use certain software. You give it the goal, and it works through the steps.</p>
<p>What it can finish depends on its tools and permissions. An agent that can only browse the web has different abilities from one connected to your email, files, and calendar.</p>
<p>Before using one, check what it can access, what it can change, and when it needs your approval.</p>
<h4>3. MCP (Model Context Protocol)</h4>
<p>MCP is basically the USB-C for AI.</p>
<p>It gives AI apps a standard way to connect to tools and data sources.</p>
<p>Without a shared standard, developers often need to build separate integrations for different AI apps. MCP lets them build a connection that multiple compatible apps can use.</p>
<p>An MCP server makes certain tools or information available to an AI app. For example, it could let an assistant search company documents or create an issue in a project management tool.</p>
<p>The <a href="https://modelcontextprotocol.io/specification/draft/server/index" rel="nofollow noopener noreferrer" target="_blank">MCP documentation<span></span></a> explains how these connections work.</p>
<p>The USB-C comparison helps explain the shared standard, but there&#8217;s still some setup involved. The AI app must support the connection, and you need to grant the appropriate permissions.</p>
<p>If a product says it supports MCP, check which services you can connect and what the assistant can do through them.</p>
<h4>4. Loop engineering</h4>
<p>An agent often works in a loop: choose an action, perform it, check the result, and try again if necessary.</p>
<p>A coding agent might edit a file, run a test, read the error, and make another change.</p>
<p>That process becomes a problem when the agent keeps repeating an unsuccessful action or stops before the task is complete.</p>
<p>Loop engineering means designing how that cycle works, including how the agent receives feedback and decides whether to continue. It&#8217;s an emerging area of agent development discussed in research on <a href="https://arxiv.org/abs/2608.21884" rel="nofollow noopener noreferrer" target="_blank">loop engineering<span></span></a>.</p>
<p>You need to answer questions such as:</p>
<ul>
<li>What counts as finished?</li>
<li>How many times can the agent retry?</li>
<li>How much time or money can it spend?</li>
<li>When should it ask for help?</li>
<li>Who or what checks the result?</li>
</ul>
<p>For example, you could require a coding agent to pass specific tests before reporting success. You could also tell it to stop after three failed attempts and explain the problem.</p>
<p>The harness provides the tools and controls. Loop engineering helps determine how the agent uses them repeatedly to finish the work.</p>
<h4>5. Skills</h4>
<p>A skill is a saved recipe an agent can follow when a task matches.</p>
<p>For an expense report, that recipe might explain which fields to include, how to group expenses, and what to do when a receipt is missing.</p>
<p>In the Agent Skills format, the instructions live in a <code>SKILL.md</code> file. The package can also include scripts, templates, and reference documents. <a href="https://www.anthropic.com/research/skills" rel="nofollow noopener noreferrer" target="_blank">Anthropic&#8217;s Skills documentation<span></span></a> explains the format.</p>
<p>You can add custom or template skills on Claude from the Skills tab.</p>
<p>In ChatGPT, you can add skills on the Customize page.</p>
<p>The agent initially sees the skill&#8217;s name and description. When it identifies a relevant skill, it loads the detailed instructions. That means it doesn&#8217;t need to read every procedure before every task.</p>
<p>MCP gives the agent access to tools and data. Skills explain how to perform particular jobs with them.</p>
<p>For example, a connection might let an agent access your spreadsheets. A skill could tell it how to prepare your company&#8217;s monthly sales report.</p>
<p>You write the procedure once, then reuse it instead of explaining the whole process in every chat.</p>
<h4>6. GEO/AEO</h4>
<p>This one is not about building agents. It&#8217;s about being found by them.</p>
<p>People used to Google and click ten blue links. That&#8217;s SEO, or Search Engine Optimization.</p>
<p>Now they ask ChatGPT, Claude, Perplexity, or Google&#8217;s AI Overview and read the answer. Fewer clicks.</p>
<ul>
<li><strong>GEO</strong> (Generative Engine Optimization): It focuses on whether AI-generated answers mention your business, cite your content, or recommend your product.</li>
<li><strong>AEO</strong> (Answer Engine Optimization): It focuses on making content useful for direct answers, including search engine answer features and AI assistants.</li>
</ul>
<p>SEO = &#8220;rank on page one.&#8221;</p>
<p>GEO/AEO = &#8220;be the source the AI quotes.&#8221;</p>
<p>The terms overlap, and companies don&#8217;t always draw the same distinction between them. <a href="https://about.ads.microsoft.com/content/dam/sites/msa-about/global/common/content-lib/pdf/from-discovery-to-influence-a-guide-to-aeo-and-geo.pdf" rel="nofollow noopener noreferrer" target="_blank">Microsoft&#8217;s guide to AEO and GEO<span></span></a> covers both approaches.</p>
<p>For example, someone might ask an AI assistant, &#8220;What&#8217;s a good accounting tool for a small business?&#8221; If you sell accounting software, you&#8217;d want your product considered in that answer.</p>
<p>Clear explanations, accurate product details, and reliable sources can help make your content useful. None of these guarantees that an AI assistant will mention it.</p>
<p>If you run a website or business, you may want to check whether AI answers include you, alongside your search rankings and traffic.</p>
<h4>7. Computer Use</h4>
<p>Computer use lets an AI system interact with a screen by clicking, typing, scrolling, and selecting items.</p>
<p>It works roughly like this:</p>
<p>Screenshot → decide what to do → click or type → check the screen again.</p>
<p>That&#8217;s how an agent can fill out a form or complete a task through a website&#8217;s interface.</p>
<p>Most of the popular AI chatbots like ChatGPT, Claude, Perplexity, or Grok already support Computer Use. In ChatGPT, you can enable this feature under the Integrations menu on the Settings page.</p>
<p>Computer use is helpful when an app doesn&#8217;t offer a suitable API. An API lets software exchange information and perform actions directly. With computer use, the agent works through the buttons and fields you would use yourself.</p>
<p>For example, an agent could enter details into a booking form even without a dedicated connection to the booking service.</p>
<p>It can also click the wrong button, misread a page, or get stuck. Check what it can access and review important actions, especially purchases, submissions, and account changes.</p>
<h4>8. AGI/Superintelligence</h4>
<p>AGI, or artificial general intelligence, generally refers to AI that can perform a broad range of intellectual tasks at a level comparable to humans.</p>
<p>That could include learning unfamiliar subjects, solving different types of problems, and applying knowledge across areas.</p>
<p>Researchers disagree about the exact definition and how to test for it. Google DeepMind&#8217;s <a href="https://deepmind.google/research/publications/66938/" rel="nofollow noopener noreferrer" target="_blank">Levels of AGI framework<span></span></a> offers one approach based on how broadly capable a system is and how well it performs.</p>
<p>Superintelligence goes further. It refers to AI that would substantially outperform humans across a broad range of intellectual tasks.</p>
<p>A basic way to remember the distinction is:</p>
<ul>
<li><strong>AGI:</strong> broadly capable AI, often described in terms of human-level performance.</li>
<li><strong>Superintelligence:</strong> broadly capable AI that exceeds human performance.</li>
</ul>
<p>Being excellent at one task doesn&#8217;t establish either capability. A system might write strong code or solve difficult math problems and still struggle with other work.</p>
<p>When a company uses these terms, check what it means by them and what its system has demonstrated. That will tell you more than the label alone.</p>
<p>And in case you missed it, the US government <a href="https://www.forbes.com/sites/siladityaray/2026/09/30/trump-signs-order-renaming-ai-to-super-intelligence--heres-what-it-says/" rel="nofollow noopener noreferrer" target="_blank">officially renamed AI to &#8220;Superintelligence.&#8221;<span></span></a> You can learn more about the backstory in the article below:</p>
<p><a href="https://generativeai.pub/trump-wants-to-rename-artificial-intelligence-120599248cbd" rel="nofollow noopener noreferrer" target="_blank"><strong>Trump Wants to Rename &#8220;Artificial Intelligence&#8221;</strong><span></span></a><br />
<em>His candidates are &#8220;Extreme Intelligence&#8221; or &#8220;Superior Intelligence&#8221;</em></p>
<p>I hope you learned something new in this post.</p>
<p>The next time you hear about a company that says its product has agents, you can ask what specific tasks they are designed for. If it supports MCP, you can check which apps it connects to. If an agent can use your computer, you&#8217;ll know to ask what it can access and when it needs your permission.</p>
<p>You&#8217;ll also have an easier time following AI news. A headline about AGI or superintelligence will make more sense when you understand what those words mean and why their definitions are still debated.</p>
<p>The next time you come across these terms, you&#8217;ll understand the explanation and be able to decide whether the tool or idea is useful to you.</p>
<p>That&#8217;s about it. Welcome to the top 10%.</p>
<p>This story is published under the <a href="https://generativeai.pub/" rel="nofollow noopener noreferrer" target="_blank">Generative AI<span></span></a> publication. Connect with us on <a href="https://www.linkedin.com/company/generative-ai-publication" rel="nofollow noopener noreferrer" target="_blank">LinkedIn<span></span></a> and follow <a href="https://www.zeniteq.com/" rel="nofollow noopener noreferrer" target="_blank">Zeniteq<span></span></a> to stay in the loop with the latest AI stories. Let&#8217;s shape the future of AI together!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://freedium.net/8-new-ai-terms-you-should-know-to-be-ahead-of-90-of-people/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">143</post-id>	</item>
		<item>
		<title>Why Google’s New Harness² Open Source Release Changes How I Think About AI Agents</title>
		<link>https://freedium.net/why-googles-new-harness%c2%b2-open-source-release-changes-how-i-think-about-ai-agents/</link>
					<comments>https://freedium.net/why-googles-new-harness%c2%b2-open-source-release-changes-how-i-think-about-ai-agents/#respond</comments>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 20:55:11 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://freedium.net/why-googles-new-harness%c2%b2-open-source-release-changes-how-i-think-about-ai-agents/</guid>

					<description><![CDATA[For the past year, our conversations with other developers about AI agents have followed the exact same script. An agent fails at a complex task, like reconciling a messy spreadsheet or pulling specific legal clauses&#8230;]]></description>
										<content:encoded><![CDATA[<p>For the past year, our conversations with other developers about AI agents have followed the exact same script. An agent fails at a complex task, like reconciling a messy spreadsheet or pulling specific legal clauses from a folder of PDFs.</p>
<p>Out immediate reaction is always to blame the model. We wait for the next frontier release,or we spend weeks setting up a fine tuning pipeline, hoping that changing the model weights will magically fix a broken workflow.</p>
<p>When Google Research quietly dropped the open source code for <strong>Harness2</strong> on Github a few days agon under an Apache 2.0 licence.</p>
<p>After spending time reading through their October 2026 research paper (Harness2: Recursive Agent Harnessing for an Open World) and inspecting the repository, I am convinced we have been solving the wrong problem. Most of the time, our AI agents do not need a smarter base model. They need a better working environment.</p>
<h3>What is Google Harness2</h3>
<p>In Simple language,Harness² is an open source Python framework from Google Research that helps AI agents improve at unfamiliar tasks by automatically upgrading their operating setup while keeping the underlying AI model frozen.</p>
<p>To understand why i find this so practical, we first need to clarify what a &#8216;harness&#8217; actually is. When you deploy an AI agent, the large language model is just the brain in a jar. The harness is the entire system wrapping that brain. It includes the instructions you give it, the tools it can access, how it stores memory, and how it delegates substacks.</p>
<p>Usually, engineers build a harness once by hand and leave it static. When the agent hits a real world problem that the developer did not anticipate, the static harness breaks. Harness² solves this by treating the harness itself as something that can be tested, rewritten and improved automatically during execution.</p>
<h3>The Eight Editable Components Around the Model</h3>
<p>Important aspect in the google-research/harness2 repository is how specific the architecture is. Many frameworks stop at automated prompt tweaking. If you have ever built a production agent, you know that changing a few words in a system prompt rarely fixes a deep workflow issue.</p>
<p>Harness² exposes eight distinct components around the frozen model that it can read and modify:</p>
<ol>
<li>System Prompt: this defines the main role and objective for the harness</li>
<li>Guardrails: This sets the strict behavioral rules and boundaries</li>
<li>Memory: Controlling how the agent stores and recalls context across steps.</li>
<li>Tool guidance: Explains when and how to use specific tools that are available</li>
<li>Subagents: manages how work is split and delegated to helper agents.</li>
<li>Skills: Packages reusable procedures for specific jobs.</li>
<li>Scrips: Provides executable code helpers for routine actions.</li>
<li>Plugins: Connects external extensions into the tool loop.</li>
</ol>
<p>By giving framework permission to edit all eight areas, you allow the system to fix the actual root cause of a failure. If an agent keeps crashing because it reads a massive file all at once, Harness² does not just tell the prompt to &#8220;be careful&#8221;. It can write a validation script, adjust the tool guidance, or spin up a subagent to chunk the data first.</p>
<h3>How the Propose, Probe, and Compose Loop Works.</h3>
<p>The core engine inside Harness² runs on a three tep cycle that the authors call <strong>Propose, Probe and Compose.</strong> What makes this genuinely clevel to me in that it works without needing a human answer key (ground truth feedback) during the task.</p>
<p>Suppose you ask an agent to adjust a set of financial records and it struggles.</p>
<h4>How Harness² steps in</h4>
<ul>
<li>First durint the <strong>Propose</strong> stage, an improper model looks at the task and generates alternative versions of the harness. One version might add a new verification skill. Another version might tighten the guardrails around how numbers are extracted.</li>
<li>Second, in the <strong>Probe</strong> stage, the framework runs these different candidate harnesses on the exact task using the exact same frozen model (such as Gemini 3.8 flash or GLM 5) and the same executor (like Opencode or codex). Instead of checking the final answer against a grading rubric that does not exist yet, it observes the behavioral differences between the runs. Did one version inspect the directory before editing files while the other blindly overwrote data? That execution trace is the evidence.</li>
<li>Third, during the compose stage, Harness² compares those execution traces, picks the modifications that actually helped the agent behave more sensibly, and combines them into a refined harness for the final run.</li>
</ul>
<p>You can run this loop in parallel recursion (testing multiple wide ideas at one) or sequential recursion (stacking refinements step by step to go deeper).</p>
<h3>Why the Dual Loop Memory Matters</h3>
<p>If Harness² had to run that entire testing loop from scratch on every single ticket without learning anything permanent, it would be too slow and expensive for my taste.</p>
<p>Thankfully, the researchers built a second loop called harnessing level recursion. Every time the agent finishes a task and finds a harness recursion. Every time the agent finishes a task and finds a harness upgrade that worked, it saves the winning setup and the evidence into a persistent improvement library, including a local EXPERIENCE.MD file.</p>
<p>When a brand new task arrives tomorrow, the agent still start from a clean base harness so old modifications do not pollute the new job. However, the improver reads the library of past lessons to propose smarter upgrades right out of the gate. In my view, this closely mirrors how human software teams work, we keep a clean main branch, but we bring out past debugging experience to every new sprint.</p>
<h3>Looking at the Numbers</h3>
<p>On Workbuddy Bench (which tests office, web and coding work), adding Harness² to an OpenCode executor running GLM 5 jumped from average score from <strong>64.2</strong> to <strong>75.7.</strong> That is 11.5 point gains without touching a single weight inside the model. With Gemini 3.5 Flash, the average score climbed from <strong>72.4</strong> to <strong>77.5</strong>, while also cutting down the average number of steps the agent needed to finish the job.</p>
<p>The test is also done on <strong>JobBench</strong> for professional workflows and LAB for complex legal tasks, showing steady gains across board.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://freedium.net/why-googles-new-harness%c2%b2-open-source-release-changes-how-i-think-about-ai-agents/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">142</post-id>	</item>
		<item>
		<title>The Recon Playbook Every Hacker Uses (But No One Talks About)b</title>
		<link>https://freedium.net/the-recon-playbook-every-hacker-uses-but-no-one-talks-aboutb/</link>
					<comments>https://freedium.net/the-recon-playbook-every-hacker-uses-but-no-one-talks-aboutb/#respond</comments>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 19:00:10 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://freedium.net/the-recon-playbook-every-hacker-uses-but-no-one-talks-aboutb/</guid>

					<description><![CDATA[Hii Amigos! Most people treat recon like a simple checklist but real hackers know it's where most of the work (and the best bugs) actually come from. In this guide, I'm breaking down the ultimate&#8230;]]></description>
										<content:encoded><![CDATA[<p><strong>Hii Amigos!</strong><br />
Most people treat recon like a simple checklist but real hackers know it&#8217;s where most of the work (and the best bugs) actually come from. In this guide, I&#8217;m breaking down the ultimate recon workflow, from basic steps to advanced techniques that uncovers hidden assets and attack surfaces no scanner will ever show you.<br />
Welcome to our <strong>The Recon Playbook Every Hacker Uses</strong>.</p>
<p>There is a famous saying like युद्धाय कर्तव्यं कर्म पूर्वं विद्यात्। which means Before entering the battle, one must first understand their duty and know the field</p>
<p>The first step is to define your Attack surface and categorize the target into three levels like</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>1)Low scope targets(Small Surface Area)</span></span>
<span class="line"><span>2)Medium-Scope Targets (Moderate Surface Area)</span></span>
<span class="line"><span>3)Huge-Scope Targets (Enterprise-Level / Large Attack Surface)</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>1)Low scope targets(Small Surface Area)</span></span>
<span class="line"><span>2)Medium-Scope Targets (Moderate Surface Area)</span></span>
<span class="line"><span>3)Huge-Scope Targets (Enterprise-Level / Large Attack Surface)</span></span></code></pre>
<p>Irrespective of Attack surfaces lets dive into enumeration part. Basically there are two different types of enumerations they are</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>1)Horizantal Enumeration</span></span>
<span class="line"><span>2)Vertical Enumeration</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>1)Horizantal Enumeration</span></span>
<span class="line"><span>2)Vertical Enumeration</span></span></code></pre>
<ol>
<li><strong>Horizontal Enumeration(Breadth-First Recon):</strong></li>
</ol>
<p>Horizontal enumeration means expanding wide across the attack surface instead of going deep on a single domain.Its like exploring all the roads in a city before choosing which house to break into.</p>
<p>2.<strong>Vertical Enumeration (Depth-First Recon):</strong><br />
Vertical enumeration means going deep into a single target instead of spreading wide. It&#8217;s like finding one house and then exploring every room, basement, secret door, and hidden passage inside it. You focus on one domain or endpoint and dig layer by layer until you fully understand everything beneath the surface.</p>
<p>ok now lets get our hands dirty</p>
<p>If your attack surface is very huge.<br />
First understand the target and collect all the acquisitions of our target. For example consider google as your target (Mandiant,Motorola Mobility,Nest Labs,DoubleClick,Looker,Fitbit,YouTube,Waze,,Impermium,Anvato,Kaggle,DeepMind and many more )You can get about these acquisitions in the internet a small google search or AI search can give you all the Acquisitions of the target.</p>
<p>If you are doing any Blackhat understand the architecture of the target like who is owning the company what are the subsidiary companies and acquisitions as well construct the flow and choose the weakest target from the info you gathered and then try to escalate it that target level by finding appropriate bugs(Author is not responsible for any illegal and misuse of this content.This article was intended for purely educated purposes only).</p>
<p>Now find the <a href="https://www.cloudflare.com/learning/network-layer/what-is-an-autonomous-system/" rel="nofollow noopener noreferrer" target="_blank">ASN<span></span></a> and Ip ranges of the target for that we can use <a href="https://bgp.he.net/" rel="nofollow noopener noreferrer" target="_blank">https://bgp.he.net/<span></span></a> and get the ASN numbers or one can also use github tools like</p>
<p>Now select the ASN and use whois to find the IP ranges of that.For example lets pick AS394089</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>─$</span><span> whois</span><span> -h</span><span> whois.radb.net</span><span> --</span><span> '-i origin AS394089'</span><span> |</span><span> grep</span><span> -Eo</span><span> "([0-9.]+){4}/[0-9]+"</span><span> |</span><span> uniq</span><span> -u</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>─$</span><span> whois</span><span> -h</span><span> whois.radb.net</span><span> --</span><span> '-i origin AS394089'</span><span> |</span><span> grep</span><span> -Eo</span><span> "([0-9.]+){4}/[0-9]+"</span><span> |</span><span> uniq</span><span> -u</span></span></code></pre>
<p>use the above command to find all the ip ranges in that ASN range</p>
<p>Now select an ip range and save it in a text file and resolve it to domain names using mapcidr and hakrevdns the following command</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>cat</span><span> ip.txt</span><span> |</span><span> mapcidr</span><span> -si</span><span> -silent</span><span> -o</span><span> ips.txt</span><span> |</span><span> cat</span><span> ips.txt</span><span> |</span><span> hakrevdns</span><span> -t</span><span> 100</span><span> -d</span><span> |</span><span> anew</span><span> domains.txt</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>cat</span><span> ip.txt</span><span> |</span><span> mapcidr</span><span> -si</span><span> -silent</span><span> -o</span><span> ips.txt</span><span> |</span><span> cat</span><span> ips.txt</span><span> |</span><span> hakrevdns</span><span> -t</span><span> 100</span><span> -d</span><span> |</span><span> anew</span><span> domains.txt</span></span></code></pre>
<p>you can use any of our github tools as there are lots of tools available in the market the main goal is resolve that ip range into subdomains.Bigger attack surface pick all the ip ranges and resolve them into subdomains.now keep these subdomains apart.Now take the main domain and use some platforms like <a href="https://securitytrails.com/" rel="nofollow noopener noreferrer" target="_blank">security trails<span></span></a>, <a href="https://subdomainfinder.c99.nl/" rel="nofollow noopener noreferrer" target="_blank">c99 subfinder<span></span></a>,<a href="https://crt.sh/" rel="nofollow noopener noreferrer" target="_blank">crt.sh<span></span></a>,<a href="https://www.virustotal.com/" rel="nofollow noopener noreferrer" target="_blank">virus total<span></span></a> ,<a href="https://web.archive.org/" rel="nofollow noopener noreferrer" target="_blank">way back machine<span></span></a>,<a href="https://www.shodan.io/" rel="nofollow noopener noreferrer" target="_blank">shodan<span></span></a>,<a href="https://en.fofa.info/" rel="nofollow noopener noreferrer" target="_blank">fofa<span></span></a>,<a href="https://search.censys.io/" rel="nofollow noopener noreferrer" target="_blank">censys<span></span></a> … and collect the subdomains as many as you can</p>
<p>some of the traditional techniques are described below</p>
<p>							 assetfinder-subdomains.txt<br />
subenum -d target.com -r<br />
bbot -t target.com -p subdomain-enum<br />
amass enum -passive -d target.com | cut -d&#x27;]&#x27; -f 2 | awk &#x27;{print $1}&#x27; | sort -u &gt; amass-subs1.txt<br />
amass enum -active -d target.com | cut -d&#x27;]&#x27; -f 2 | awk &#x27;{print $1}&#x27; | sort -u &gt; amass-subs2.txt&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-3 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>subfinder </span><span>-</span><span>d target.com </span><span>-</span><span>all </span><span>-</span><span>recursive </span><span>-</span><span>o subfinder</span><span>-</span><span>subdomains.txt</span></span>
<span class="line"><span>assetfinder </span><span>--</span><span>subs</span><span>-</span><span>only target.com </span><span>&gt;</span><span> assetfinder</span><span>-</span><span>subdomains.txt</span></span>
<span class="line"><span>subenum </span><span>-</span><span>d target.com </span><span>-</span><span>r</span></span>
<span class="line"><span>bbot </span><span>-</span><span>t target.com </span><span>-</span><span>p subdomain</span><span>-enum</span></span>
<span class="line"><span>amass </span><span>enum</span><span> -</span><span>passive </span><span>-</span><span>d target.com </span><span>|</span><span> cut </span><span>-</span><span>d</span><span>']'</span><span> -</span><span>f </span><span>2</span><span> |</span><span> awk </span><span>'{print </span><span>$</span><span>1</span><span>}'</span><span> |</span><span> sort </span><span>-</span><span>u </span><span>&gt;</span><span> amass</span><span>-</span><span>subs1.txt</span></span>
<span class="line"><span>amass </span><span>enum</span><span> -</span><span>active </span><span>-</span><span>d target.com </span><span>|</span><span> cut </span><span>-</span><span>d</span><span>']'</span><span> -</span><span>f </span><span>2</span><span> |</span><span> awk </span><span>'{print </span><span>$</span><span>1</span><span>}'</span><span> |</span><span> sort </span><span>-</span><span>u </span><span>&gt;</span><span> amass</span><span>-</span><span>subs2.txt</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>subfinder </span><span>-</span><span>d target.com </span><span>-</span><span>all </span><span>-</span><span>recursive </span><span>-</span><span>o subfinder</span><span>-</span><span>subdomains.txt</span></span>
<span class="line"><span>assetfinder </span><span>--</span><span>subs</span><span>-</span><span>only target.com </span><span>&gt;</span><span> assetfinder</span><span>-</span><span>subdomains.txt</span></span>
<span class="line"><span>subenum </span><span>-</span><span>d target.com </span><span>-</span><span>r</span></span>
<span class="line"><span>bbot </span><span>-</span><span>t target.com </span><span>-</span><span>p subdomain</span><span>-enum</span></span>
<span class="line"><span>amass </span><span>enum</span><span> -</span><span>passive </span><span>-</span><span>d target.com </span><span>|</span><span> cut </span><span>-</span><span>d</span><span>']'</span><span> -</span><span>f </span><span>2</span><span> |</span><span> awk </span><span>'{print </span><span>$</span><span>1</span><span>}'</span><span> |</span><span> sort </span><span>-</span><span>u </span><span>&gt;</span><span> amass</span><span>-</span><span>subs1.txt</span></span>
<span class="line"><span>amass </span><span>enum</span><span> -</span><span>active </span><span>-</span><span>d target.com </span><span>|</span><span> cut </span><span>-</span><span>d</span><span>']'</span><span> -</span><span>f </span><span>2</span><span> |</span><span> awk </span><span>'{print </span><span>$</span><span>1</span><span>}'</span><span> |</span><span> sort </span><span>-</span><span>u </span><span>&gt;</span><span> amass</span><span>-</span><span>subs2.txt</span></span></code></pre>
<p>As subfinder and subenum were passive enum tools and also they covers most of the available platforms so add api key to get better results.And you can also perform Bruteforce using ffuf for subdomains you can try seclists</p>
<p>ffuf -u &#8220;https://FUZZ.target.com&#8221; -w seclists-wordlist.txt -mc 200,301,302</p>
<p>now after gathering all the subdomains make them into a single file and find the active subdomains out of the using httpx-toolkit</p>
<p>							 live-subs.txt<br />
&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-1/2 -translate-y-1/2 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>cat</span><span> total-subdomains.txt</span><span> |</span><span> httpx-toolkit</span><span> -ports</span><span> 80,443</span><span> &gt;</span><span> live-subs.txt</span></span>
<span class="line"></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>cat</span><span> total-subdomains.txt</span><span> |</span><span> httpx-toolkit</span><span> -ports</span><span> 80,443</span><span> &gt;</span><span> live-subs.txt</span></span>
<span class="line"></span></code></pre>
<p>Now you will have a list of active subdomains and filter out them to get unique urls so that no duplicates will be present and then you can use aquatone/Eyewitness/gowitness/screenshotter …. lots of tools available.after getting the screenshots you can manually inspect or if you use eyeballer it will analyse the screenshots. And decide on which target to pentest or maintain table according to the order of target to hunt/pentest.</p>
<p>Now on all the subdomains use paramspider ,katana,x8,arjun,gau,urldedupe to find endpoints in the live-subs.txt</p>
<p>							urls.txt<br />
cat urls.txt | grep -E &#x22;.php|.asp|.aspx|.jspx|.jsp&#x22; | grep &#x27;=&#x27; | sort &gt; output.txt<br />
cat output.txt | sed &#x27;s/=.*/=/&#x27; &gt;final.txt&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-3 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>paramspider</span><span> -l</span><span> live-subs.txt</span></span>
<span class="line"><span>katana</span><span> -u</span><span> live-subs.txt</span><span> -d</span><span> 2</span><span> -o</span><span> endpoints.txt</span></span>
<span class="line"><span>echo</span><span> target.com</span><span> |</span><span> gau</span><span> --mc</span><span> 200</span><span> |</span><span> urldedupe</span><span> &gt;</span><span>urls.txt</span></span>
<span class="line"><span>cat</span><span> urls.txt</span><span> |</span><span> grep</span><span> -E</span><span> ".php|.asp|.aspx|.jspx|.jsp"</span><span> |</span><span> grep</span><span> '='</span><span> |</span><span> sort</span><span> &gt;</span><span> output.txt</span></span>
<span class="line"><span>cat</span><span> output.txt</span><span> |</span><span> sed</span><span> 's/=.*/=/'</span><span> &gt;</span><span>final.txt</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>paramspider</span><span> -l</span><span> live-subs.txt</span></span>
<span class="line"><span>katana</span><span> -u</span><span> live-subs.txt</span><span> -d</span><span> 2</span><span> -o</span><span> endpoints.txt</span></span>
<span class="line"><span>echo</span><span> target.com</span><span> |</span><span> gau</span><span> --mc</span><span> 200</span><span> |</span><span> urldedupe</span><span> &gt;</span><span>urls.txt</span></span>
<span class="line"><span>cat</span><span> urls.txt</span><span> |</span><span> grep</span><span> -E</span><span> ".php|.asp|.aspx|.jspx|.jsp"</span><span> |</span><span> grep</span><span> '='</span><span> |</span><span> sort</span><span> &gt;</span><span> output.txt</span></span>
<span class="line"><span>cat</span><span> output.txt</span><span> |</span><span> sed</span><span> 's/=.*/=/'</span><span> &gt;</span><span>final.txt</span></span></code></pre>
<p>And now focus on google dorking and Github dorking to find sensitive files ,API keys or creds, js endpoints.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>site:example.com</span><span> -www</span><span> -shop</span><span> -share</span><span> -ir</span><span> -mfa</span></span>
<span class="line"><span>site:example.com</span><span> ext:php</span><span> inurl:?</span></span>
<span class="line"><span>site:example[.]com</span><span> inurl:api</span><span> |</span><span> site:*/rest</span><span> |</span><span> site:*/v1</span><span> |</span><span> site:*/v2</span><span> |</span><span> site:*/v3</span></span>
<span class="line"><span>site:</span><span>"example[.]com"</span><span> ext:log</span><span> |</span><span> ext:txt</span><span> |</span><span> ext:conf</span><span> |</span><span> ext:cnf</span><span> |</span><span> ext:ini</span><span> |</span><span> ext:env</span><span> |</span><span> ext:sh</span><span> |</span><span> ext:bak</span><span> |</span><span> ext:backup</span><span> |</span><span> ext:swp</span><span> |</span><span> ext:old</span><span> |</span><span> ext:~</span><span> |</span><span> ext:git</span><span> |</span><span> ext:svn</span><span> |</span><span> ext:htpasswd</span><span> |</span><span> ext:htaccess</span><span> |</span><span> ext:json</span></span>
<span class="line"><span>inurl:conf</span><span> |</span><span> inurl:env</span><span> |</span><span> inurl:cgi</span><span> |</span><span> inurl:bin</span><span> |</span><span> inurl:etc</span><span> |</span><span> inurl:root</span><span> |</span><span> inurl:sql</span><span> |</span><span> inurl:backup</span><span> |</span><span> inurl:admin</span><span> |</span><span> inurl:php</span><span> site:example[.]com</span></span>
<span class="line"><span>inurl:</span><span>"error"</span><span> |</span><span> intitle:</span><span>"exception"</span><span> |</span><span> intitle:</span><span>"failure"</span><span> |</span><span> intitle:</span><span>"server at"</span><span> |</span><span> inurl:exception</span><span> |</span><span> "database error"</span><span> |</span><span> "SQL syntax"</span><span> |</span><span> "undefined index"</span><span> |</span><span> "unhandled exception"</span><span> |</span><span> "stack trace"</span><span> site:example[.]com</span></span>
<span class="line"><span>inurl:q</span><span>=</span><span> |</span><span> inurl:s</span><span>=</span><span> |</span><span> inurl:search</span><span>=</span><span> |</span><span> inurl:query</span><span>=</span><span> |</span><span> inurl:keyword</span><span>=</span><span> |</span><span> inurl:lang</span><span>=</span><span> inurl:</span><span>&#x26; </span><span>site:example.com</span></span>
<span class="line"><span>inurl:url</span><span>=</span><span> |</span><span> inurl:return</span><span>=</span><span> |</span><span> inurl:next</span><span>=</span><span> |</span><span> inurl:redirect</span><span>=</span><span> |</span><span> inurl:redir</span><span>=</span><span> |</span><span> inurl:ret</span><span>=</span><span> |</span><span> inurl:r2</span><span>=</span><span> |</span><span> inurl:page</span><span>=</span><span> inurl:</span><span>&#x26; </span><span>inurl:http</span><span> site:example.com</span></span>
<span class="line"><span>inurl:id</span><span>=</span><span> |</span><span> inurl:pid</span><span>=</span><span> |</span><span> inurl:category</span><span>=</span><span> |</span><span> inurl:cat</span><span>=</span><span> |</span><span> inurl:action</span><span>=</span><span> |</span><span> inurl:sid</span><span>=</span><span> |</span><span> inurl:dir</span><span>=</span><span> inurl:</span><span>&#x26; </span><span>site:example.com</span></span>
<span class="line"><span>inurl:http</span><span> |</span><span> inurl:url</span><span>=</span><span> |</span><span> inurl:path</span><span>=</span><span> |</span><span> inurl:dest</span><span>=</span><span> |</span><span> inurl:html</span><span>=</span><span> |</span><span> inurl:data</span><span>=</span><span> |</span><span> inurl:domain</span><span>=</span><span>  |</span><span> inurl:page</span><span>=</span><span> inurl:</span><span>&#x26; </span><span>site:example.com</span></span>
<span class="line"><span>inurl:include</span><span> |</span><span> inurl:dir</span><span> |</span><span> inurl:detail</span><span>=</span><span> |</span><span> inurl:file</span><span>=</span><span> |</span><span> inurl:folder</span><span>=</span><span> |</span><span> inurl:inc</span><span>=</span><span> |</span><span> inurl:locate</span><span>=</span><span> |</span><span> inurl:doc</span><span>=</span><span> |</span><span> inurl:conf</span><span>=</span><span> inurl:</span><span>&#x26; </span><span>site:example.com</span></span>
<span class="line"><span>inurl:cmd</span><span> |</span><span> inurl:exec</span><span>=</span><span> |</span><span> inurl:query</span><span>=</span><span> |</span><span> inurl:code</span><span>=</span><span> |</span><span> inurl:do</span><span>=</span><span> |</span><span> inurl:run</span><span>=</span><span> |</span><span> inurl:read</span><span>=</span><span>  |</span><span> inurl:ping</span><span>=</span><span> inurl:</span><span>&#x26; </span><span>site:example.com</span></span>
<span class="line"><span>site:example.com</span><span> intext:”choose</span><span> file”</span><span> |</span><span> intext:</span><span>"select file"</span><span> |</span><span> intext:</span><span>"upload PDF"</span></span>
<span class="line"><span>inurl:login</span><span> |</span><span> inurl:signin</span><span> |</span><span> intitle:login</span><span> |</span><span> intitle:signin</span><span> |</span><span> inurl:secure</span><span> site:example[.]com</span></span>
<span class="line"><span>inurl:test</span><span> |</span><span> inurl:env</span><span> |</span><span> inurl:dev</span><span> |</span><span> inurl:staging</span><span> |</span><span> inurl:sandbox</span><span> |</span><span> inurl:debug</span><span> |</span><span> inurl:temp</span><span> |</span><span> inurl:internal</span><span> |</span><span> inurl:demo</span><span> site:example.com</span></span>
<span class="line"><span>site:example.com</span><span> ext:txt</span><span> |</span><span> ext:pdf</span><span> |</span><span> ext:xml</span><span> |</span><span> ext:xls</span><span> |</span><span> ext:xlsx</span><span> |</span><span> ext:ppt</span><span> |</span><span> ext:pptx</span><span> |</span><span> ext:doc</span><span> |</span><span> ext:docx</span></span>
<span class="line"><span>intext:“confidential”</span><span> |</span><span> intext:“Not</span><span> for</span><span> Public</span><span> Release”</span><span> |</span><span> intext:”internal</span><span> use</span><span> only”</span><span> |</span><span> intext:“do</span><span> not</span><span> distribute”</span></span>
<span class="line"><span>inurl:/content/usergenerated</span><span> |</span><span> inurl:/content/dam</span><span> |</span><span> inurl:/jcr:content</span><span> |</span><span> inurl:/libs/granite</span><span> |</span><span> inurl:/etc/clientlibs</span><span> |</span><span> inurl:/content/geometrixx</span><span> |</span><span> inurl:/bin/wcm</span><span> |</span><span> inurl:/crx/de</span><span> site:example[.]com</span></span>
<span class="line"><span>site:firebaseio.com</span><span> "example[.]com"</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>site:example.com</span><span> -www</span><span> -shop</span><span> -share</span><span> -ir</span><span> -mfa</span></span>
<span class="line"><span>site:example.com</span><span> ext:php</span><span> inurl:?</span></span>
<span class="line"><span>site:example[.]com</span><span> inurl:api</span><span> |</span><span> site:*/rest</span><span> |</span><span> site:*/v1</span><span> |</span><span> site:*/v2</span><span> |</span><span> site:*/v3</span></span>
<span class="line"><span>site:</span><span>"example[.]com"</span><span> ext:log</span><span> |</span><span> ext:txt</span><span> |</span><span> ext:conf</span><span> |</span><span> ext:cnf</span><span> |</span><span> ext:ini</span><span> |</span><span> ext:env</span><span> |</span><span> ext:sh</span><span> |</span><span> ext:bak</span><span> |</span><span> ext:backup</span><span> |</span><span> ext:swp</span><span> |</span><span> ext:old</span><span> |</span><span> ext:~</span><span> |</span><span> ext:git</span><span> |</span><span> ext:svn</span><span> |</span><span> ext:htpasswd</span><span> |</span><span> ext:htaccess</span><span> |</span><span> ext:json</span></span>
<span class="line"><span>inurl:conf</span><span> |</span><span> inurl:env</span><span> |</span><span> inurl:cgi</span><span> |</span><span> inurl:bin</span><span> |</span><span> inurl:etc</span><span> |</span><span> inurl:root</span><span> |</span><span> inurl:sql</span><span> |</span><span> inurl:backup</span><span> |</span><span> inurl:admin</span><span> |</span><span> inurl:php</span><span> site:example[.]com</span></span>
<span class="line"><span>inurl:</span><span>"error"</span><span> |</span><span> intitle:</span><span>"exception"</span><span> |</span><span> intitle:</span><span>"failure"</span><span> |</span><span> intitle:</span><span>"server at"</span><span> |</span><span> inurl:exception</span><span> |</span><span> "database error"</span><span> |</span><span> "SQL syntax"</span><span> |</span><span> "undefined index"</span><span> |</span><span> "unhandled exception"</span><span> |</span><span> "stack trace"</span><span> site:example[.]com</span></span>
<span class="line"><span>inurl:q</span><span>=</span><span> |</span><span> inurl:s</span><span>=</span><span> |</span><span> inurl:search</span><span>=</span><span> |</span><span> inurl:query</span><span>=</span><span> |</span><span> inurl:keyword</span><span>=</span><span> |</span><span> inurl:lang</span><span>=</span><span> inurl:</span><span>&#x26; </span><span>site:example.com</span></span>
<span class="line"><span>inurl:url</span><span>=</span><span> |</span><span> inurl:return</span><span>=</span><span> |</span><span> inurl:next</span><span>=</span><span> |</span><span> inurl:redirect</span><span>=</span><span> |</span><span> inurl:redir</span><span>=</span><span> |</span><span> inurl:ret</span><span>=</span><span> |</span><span> inurl:r2</span><span>=</span><span> |</span><span> inurl:page</span><span>=</span><span> inurl:</span><span>&#x26; </span><span>inurl:http</span><span> site:example.com</span></span>
<span class="line"><span>inurl:id</span><span>=</span><span> |</span><span> inurl:pid</span><span>=</span><span> |</span><span> inurl:category</span><span>=</span><span> |</span><span> inurl:cat</span><span>=</span><span> |</span><span> inurl:action</span><span>=</span><span> |</span><span> inurl:sid</span><span>=</span><span> |</span><span> inurl:dir</span><span>=</span><span> inurl:</span><span>&#x26; </span><span>site:example.com</span></span>
<span class="line"><span>inurl:http</span><span> |</span><span> inurl:url</span><span>=</span><span> |</span><span> inurl:path</span><span>=</span><span> |</span><span> inurl:dest</span><span>=</span><span> |</span><span> inurl:html</span><span>=</span><span> |</span><span> inurl:data</span><span>=</span><span> |</span><span> inurl:domain</span><span>=</span><span>  |</span><span> inurl:page</span><span>=</span><span> inurl:</span><span>&#x26; </span><span>site:example.com</span></span>
<span class="line"><span>inurl:include</span><span> |</span><span> inurl:dir</span><span> |</span><span> inurl:detail</span><span>=</span><span> |</span><span> inurl:file</span><span>=</span><span> |</span><span> inurl:folder</span><span>=</span><span> |</span><span> inurl:inc</span><span>=</span><span> |</span><span> inurl:locate</span><span>=</span><span> |</span><span> inurl:doc</span><span>=</span><span> |</span><span> inurl:conf</span><span>=</span><span> inurl:</span><span>&#x26; </span><span>site:example.com</span></span>
<span class="line"><span>inurl:cmd</span><span> |</span><span> inurl:exec</span><span>=</span><span> |</span><span> inurl:query</span><span>=</span><span> |</span><span> inurl:code</span><span>=</span><span> |</span><span> inurl:do</span><span>=</span><span> |</span><span> inurl:run</span><span>=</span><span> |</span><span> inurl:read</span><span>=</span><span>  |</span><span> inurl:ping</span><span>=</span><span> inurl:</span><span>&#x26; </span><span>site:example.com</span></span>
<span class="line"><span>site:example.com</span><span> intext:”choose</span><span> file”</span><span> |</span><span> intext:</span><span>"select file"</span><span> |</span><span> intext:</span><span>"upload PDF"</span></span>
<span class="line"><span>inurl:login</span><span> |</span><span> inurl:signin</span><span> |</span><span> intitle:login</span><span> |</span><span> intitle:signin</span><span> |</span><span> inurl:secure</span><span> site:example[.]com</span></span>
<span class="line"><span>inurl:test</span><span> |</span><span> inurl:env</span><span> |</span><span> inurl:dev</span><span> |</span><span> inurl:staging</span><span> |</span><span> inurl:sandbox</span><span> |</span><span> inurl:debug</span><span> |</span><span> inurl:temp</span><span> |</span><span> inurl:internal</span><span> |</span><span> inurl:demo</span><span> site:example.com</span></span>
<span class="line"><span>site:example.com</span><span> ext:txt</span><span> |</span><span> ext:pdf</span><span> |</span><span> ext:xml</span><span> |</span><span> ext:xls</span><span> |</span><span> ext:xlsx</span><span> |</span><span> ext:ppt</span><span> |</span><span> ext:pptx</span><span> |</span><span> ext:doc</span><span> |</span><span> ext:docx</span></span>
<span class="line"><span>intext:“confidential”</span><span> |</span><span> intext:“Not</span><span> for</span><span> Public</span><span> Release”</span><span> |</span><span> intext:”internal</span><span> use</span><span> only”</span><span> |</span><span> intext:“do</span><span> not</span><span> distribute”</span></span>
<span class="line"><span>inurl:/content/usergenerated</span><span> |</span><span> inurl:/content/dam</span><span> |</span><span> inurl:/jcr:content</span><span> |</span><span> inurl:/libs/granite</span><span> |</span><span> inurl:/etc/clientlibs</span><span> |</span><span> inurl:/content/geometrixx</span><span> |</span><span> inurl:/bin/wcm</span><span> |</span><span> inurl:/crx/de</span><span> site:example[.]com</span></span>
<span class="line"><span>site:firebaseio.com</span><span> "example[.]com"</span></span></code></pre>
<p>And also check for any leaks or data breaches on the specific target and now perform portscans on the ip addresses and note down the protocols ,services and their versions by looking at each live website note down the technology stack,CMS and their versions using wappalyzer extension.</p>
<p>Now all with information we are good to go and start hunting and look for real vulnerabilities that will impact.</p>
<p>The tools tools i mentioned and that were to be downloaded are</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>https://github.com/OWASP/Amass</span></span>
<span class="line"><span>https://github.com/hakluke/hakrevdns</span></span>
<span class="line"><span>https://github.com/projectdiscovery/subfinder</span></span>
<span class="line"><span>https://github.com/tomnomnom/assetfinder</span></span>
<span class="line"><span>https://github.com/blacklanternsecurity/bbot</span></span>
<span class="line"><span>https://github.com/aboul3la/Sublist3r</span></span>
<span class="line"><span>https://github.com/FortyNorthSecurity/EyeWitness</span></span>
<span class="line"><span>https://github.com/BishopFox/eyeballer</span></span>
<span class="line"><span>https://github.com/projectdiscovery/katana</span></span>
<span class="line"><span>https://github.com/GerbenJavado/LinkFinder</span></span>
<span class="line"><span>https://github.com/zseano/JS-Scan</span></span>
<span class="line"><span>https://github.com/tomnomnom/waybackurls</span></span>
<span class="line"><span>https://github.com/s0md3v/Arjun</span></span>
<span class="line"><span>https://github.com/devanshbatham/ParamSpider</span></span>
<span class="line"><span>https://github.com/Sh1Yo/x8</span></span>
<span class="line"><span>https://github.com/zricethezav/gitleaks</span></span>
<span class="line"><span>https://github.com/dxa4481/truffleHog</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>https://github.com/OWASP/Amass</span></span>
<span class="line"><span>https://github.com/hakluke/hakrevdns</span></span>
<span class="line"><span>https://github.com/projectdiscovery/subfinder</span></span>
<span class="line"><span>https://github.com/tomnomnom/assetfinder</span></span>
<span class="line"><span>https://github.com/blacklanternsecurity/bbot</span></span>
<span class="line"><span>https://github.com/aboul3la/Sublist3r</span></span>
<span class="line"><span>https://github.com/FortyNorthSecurity/EyeWitness</span></span>
<span class="line"><span>https://github.com/BishopFox/eyeballer</span></span>
<span class="line"><span>https://github.com/projectdiscovery/katana</span></span>
<span class="line"><span>https://github.com/GerbenJavado/LinkFinder</span></span>
<span class="line"><span>https://github.com/zseano/JS-Scan</span></span>
<span class="line"><span>https://github.com/tomnomnom/waybackurls</span></span>
<span class="line"><span>https://github.com/s0md3v/Arjun</span></span>
<span class="line"><span>https://github.com/devanshbatham/ParamSpider</span></span>
<span class="line"><span>https://github.com/Sh1Yo/x8</span></span>
<span class="line"><span>https://github.com/zricethezav/gitleaks</span></span>
<span class="line"><span>https://github.com/dxa4481/truffleHog</span></span></code></pre>
<p>The more you understand about target both in width and depth then the more weird little doors start showing up that you never expected. Sure, tools and automation help a lot, but the real win comes from being curious, patient and thinking a bit differently. Whether you&#8217;re spreading out with horizontal enumeration or vertical enumeration remember most hackers actually win during recon. Tools are temporary but the basic fundamentals and the right way to approach is ultimate key to success.</p>
<p>Follow and clap for more interesting content</p>
<p><em>…………………………….__<strong>Thank you for reading!…………………………………..</strong></em></p>
<p><em>If you need professional pentesting(Web app ,Network,Android and ios)or red team engagements to strengthen your organization&#8217;s defenses, feel free to contact me at kosanamharish232242@gmail.com(</em><a href="https://www.linkedin.com/in/kosanam-harish-737815213/" rel="nofollow noopener noreferrer" target="_blank">https://www.linkedin.com/in/kosanam-harish-737815213/<span></span></a>)<em>. I&#8217;m here to help you identify vulnerabilities and build robust security strategies to stay ahead of emerging threats.Stay curious, stay secure, and thank you reading</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://freedium.net/the-recon-playbook-every-hacker-uses-but-no-one-talks-aboutb/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">141</post-id>	</item>
		<item>
		<title>Bug Bounty Recon: Horizontal Correlation.</title>
		<link>https://freedium.net/bug-bounty-recon-horizontal-correlation/</link>
					<comments>https://freedium.net/bug-bounty-recon-horizontal-correlation/#respond</comments>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 18:58:34 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://freedium.net/bug-bounty-recon-horizontal-correlation/</guid>

					<description><![CDATA[Considering becoming a member on medium? Use this link at no extra cost to yourself, and support me :) (https://medium.com/@nynan/membership) Example: We start with domain.com but how do we find other domains owned by the&#8230;]]></description>
										<content:encoded><![CDATA[<p>Considering becoming a member on medium? Use this link at no extra cost to yourself, and support me 🙂 (<a href="https://medium.com/@nynan/membership" rel="nofollow noopener noreferrer" target="_blank">https://medium.com/@nynan/membership<span></span></a>)</p>
<p>Example: We start with <code>domain.com</code> but how do we find other domains owned by the same user? perhaps <code>secretDomain.com</code> or <code>vulnerableDomain.com</code></p>
<p>The first step of effective bug bounty hunting is in depth reconnaissance; the first step of reconnaissance is <strong>Horizontal Correlation</strong>. The more assets you know about, the more you can attack. By expanding the <strong>attack surface</strong>, you are more likely to find vulnerabilities.</p>
<p>I have found <strong>four methods</strong> to find root domains:</p>
<ol>
<li>The <strong>&#8220;WHOIS&#8221; method</strong></li>
<li>Using <strong>CIDR</strong>s and <strong>ASN</strong>s</li>
<li><strong>Google Dorks</strong></li>
<li>researching <strong>Subsidiaries and Acquisitions</strong></li>
</ol>
<h3>WHOIS method</h3>
<p><a href="http://wikipedia.org/wiki/WHOIS" rel="nofollow noopener noreferrer" target="_blank">Wikipedia<span></span></a> tells us:</p>
<blockquote>
<p><strong>WHOIS</strong> (pronounced as the phrase &#8220;who is&#8221;) is a query and response <a href="https://en.wikipedia.org/wiki/Communications_protocol" rel="nofollow noopener noreferrer" target="_blank">protocol<span></span></a> that is widely used for querying <a href="https://en.wikipedia.org/wiki/Database" rel="nofollow noopener noreferrer" target="_blank">databases<span></span></a> that store the registered users or assignees of an <a href="https://en.wikipedia.org/wiki/Internet" rel="nofollow noopener noreferrer" target="_blank">Internet<span></span></a> resource, such as a <a href="https://en.wikipedia.org/wiki/Domain_name" rel="nofollow noopener noreferrer" target="_blank">domain name<span></span></a>, an <a href="https://en.wikipedia.org/wiki/IP_address" rel="nofollow noopener noreferrer" target="_blank">IP address<span></span></a> block or an <a href="https://en.wikipedia.org/wiki/Autonomous_system_(Internet)" rel="nofollow noopener noreferrer" target="_blank">autonomous system<span></span></a>, but is also used for a wider range of other information.</p>
</blockquote>
<p>Or, in simple terms: The WHOIS protocol allows us to get information about a domain. We can use this information to find more domains.</p>
<p>Let&#8217;s run through an imaginary <strong>example</strong>:</p>
<ol>
<li>we are targetting domain.com</li>
<li>we run the <code>whois</code> command on domain.com and discover the email that registered domain.com is &#8220;alice123@email.com&#8221;</li>
</ol>
<ol>
<li>We use a reverse WHOIS service, such as <a href="https://viewdns.info/reversewhois/" rel="nofollow noopener noreferrer" target="_blank">ViewDNS<span></span></a>, to discover alice123@email.com has also registered <code>secretDomain.com</code> and <code>personalDomain.com</code></li>
</ol>
<p>We have increased our attack surface by <strong>200%</strong>! And there is still the most valuable step to go: <strong>Iterate.</strong> Repeat the process with the new domains discovered to find possibly even more domains.</p>
<p>NOTE: Companies may try to hide this information. So make sure to check the information belongs to the target organisation and not an obfuscation company.</p>
<h3>CIDRs and ASNs</h3>
<p><strong>C</strong>lassless <strong>I</strong>nter-<strong>D</strong>omain <strong>R</strong>outing (CIDR) is a difficult, advanced but interesting concept. I would recommend doing some additional research, however for this article I will define it with:</p>
<ul>
<li>A <strong>CIDR Range</strong> is a range of IPs.</li>
</ul>
<p>When a company has many domains it requires many IPs to map those domains to. And thus it will A CIDR is used to organise these by using consecutive IPs. A CIDR range is notated by a / and then a number. Eg, <code>127.0.0.0/24</code></p>
<p>An <strong>A</strong>utonomous <strong>S</strong>ystem <strong>N</strong>umber (ASN) is number representing an &#8220;area of the internet&#8221; it is made from a collection of <strong>CIDRs</strong>. Once more, ASNs are a complex topic and I recommend a more indepth research. <strong>Importantly</strong> for us: large companies will have their own ASNs, which we can use to find domains.</p>
<p>Let&#8217;s make this process clear with another imaginary <strong>example</strong>:</p>
<ol>
<li>The target is <code>domain.com</code></li>
<li>Use the <code>dig</code>command on different subdomains to check what their ASNs are. <code>dig a subdomain.domain.com +short</code></li>
<li>If lots of the subdomains are consistent with their ASN, we could assume that they own their own ASN.</li>
<li>Use a service like <a href="https://bgpview.io/" rel="nofollow noopener noreferrer" target="_blank">bgpview.io<span></span></a> to get IPs from the ASNs you&#8217;ve found</li>
</ol>
<p>The first three steps can be <em>avoided</em> if you use your research skills to find an organisations ASN(s). This is just one method. Very big organisations can have multiple ASNs, it <strong>pays dividends</strong> to do extra thorough research in this early stage of bug bounty hunting.</p>
<h3>Google Dorks</h3>
<p><strong>Google Dorks</strong> (other dorks are available*) are pieces of text which give you more functionality to a search engine. They can allow us to discover <em>secrets</em>, other <em>domains</em>, and much <em>more</em>.</p>
<p>(*Other dorks include, Bing dorks, Yandex dorks, or any other search engine!)</p>
<p>In the list of the many google dorks, there is one specific one that allows for Horizontal Correlation. This dork is <code>intext:.</code></p>
<p>How do we use this to find new domains? I&#8217;ll demonstrate in an example.</p>
<ol>
<li>Go to the known target page.</li>
<li>Find something that would be <em>common to all domains</em>. This is often something overlooked, such as the <strong>copyright</strong> line in the <strong>footer</strong>, or a link to a <strong>Term&#8217;s and Conditions</strong>. For this <strong>example</strong>, let&#8217;s say we go to our imaginary target and we see &#8220;©2021 imaginaryCompany All rights reserved.&#8221; in the footer.</li>
</ol>
<ol start="3">
<li>Copy this and put into the search engine <code>intext:"©2021 imaginaryCompany All rights reserved."</code>. We can see that a new domain has been discovered (newDomain.com)</li>
</ol>
<p>BONUS TIP: If you&#8217;re hacking a target that owns a top level domain such as .gov or .mil, you can use the <code>site:*.tld</code> dork to find all the domains google has indexed. Eg, <code>site:*.gov</code></p>
<h3>Subsidiaries and Acquisitions</h3>
<p>A <strong>Subsidiary Company</strong> is a company owned by a holding company. You may have heard of this in terms of a &#8220;<em>Parent company</em>&#8221; and &#8220;<em>Child companies</em>&#8220;</p>
<p><em>If</em> the scope of your target is very broad, it may include subsidiary companies. We can use <strong>google</strong>, other <strong>search engines</strong>, or <strong>specific sites</strong> in order to find these.</p>
<p><strong>Example</strong>: If we google &#8220;Yahoo subsidiaries&#8221; we see there is a child company names &#8220;Flurry&#8221;. This has expanded our target surface. (Always refer to the scope of engagement before pentesting a new asset).</p>
<p>An <strong>Acquisition</strong> is when a Company buys another company. This new company may also be included in the scope of the program.</p>
<p>Similarly to the subsidiary, we can use OSINT skills for acquisitions of a company to find new domains.</p>
<p>Example: If we google &#8220;Yahoo Acquisitions&#8221;, we find a whole wiki page dedicated to this topic, and we find many examples, eg &#8220;Flickr&#8221;.</p>
<h3>Summary</h3>
<p>By now you should have a long list of root domains which will be a strong foundation for your bug bounty process and will yield you more data to be used during the next stage, <strong>vertical correlation.</strong></p>
<p>If you thought any of this information was useful, liking the article 👏 would be a free and easy way to support me. I look forward to posting more informational content.</p>
<p>Considering becoming a member on medium? Use this link at no extra cost to yourself, and support me 🙂 (<a href="https://medium.com/@nynan/membership" rel="nofollow noopener noreferrer" target="_blank">https://medium.com/@nynan/membership<span></span></a>)</p>
<p><em>DISCLAIMER: I take no responsibility for any actions committed by readers. Only perform enumeration on targets you have permission for. Always read and check the scope of a program for guidance. Horizontal Correlation often causes false positives, you should check you are allowed to target these before doing any more actions.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://freedium.net/bug-bounty-recon-horizontal-correlation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">140</post-id>	</item>
		<item>
		<title>Use Swift Like a Senior Engineer</title>
		<link>https://freedium.net/use-swift-like-a-senior-engineer/</link>
					<comments>https://freedium.net/use-swift-like-a-senior-engineer/#respond</comments>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 15:28:18 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://freedium.net/use-swift-like-a-senior-engineer/</guid>

					<description><![CDATA[Not a Medium Member? "Read For Free" In this article, we will see the Swift Tips and Tricks that will make you think like a Senior Engineer. Read Part 2 👇 Use Swift Like a&#8230;]]></description>
										<content:encoded><![CDATA[<blockquote>
<p><em>Not a Medium Member?<a href="https://nameisjayant2.medium.com/use-swift-like-a-senior-engineer-2d4a6b8a0f0e?sk=f7a9eee59f35d80c5154ab66ee01e8e3" rel="nofollow noopener noreferrer" target="_blank"> &#8220;Read For Free&#8221;<span></span></a></em></p>
</blockquote>
<p>In this article, we will see the <strong>Swift Tips and Tricks</strong> that will make you think like a <strong>Senior Engineer.</strong></p>
<blockquote>
<p><strong>Read Part 2</strong> 👇</p>
</blockquote>
<p><a href="https://medium.com/ios-lab/use-swift-like-a-senior-engineer-part-2-feb014be5731" rel="nofollow noopener noreferrer" target="_blank"><strong>Use Swift Like a Senior Engineer — Part (2)</strong><span></span></a><br />
<em>These Swift tricks will think you like a Senior Engineer</em></p>
<p>Let&#8217;s get started!</p>
<h3>1. Overload the pattern-matching operator for custom matching behavior</h3>
<p>First, let&#8217;s understand the <strong>&#8220;pattern-matching&#8221;</strong> operator.</p>
<blockquote>
<p>In <strong>Swift</strong>, &#8220;~=&#8221; is the <strong>pattern-matching operator.</strong></p>
</blockquote>
<p>Look at this code:</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>switch</span><span> number {</span></span>
<span class="line"><span>case</span><span> 1</span><span>...</span><span>5</span><span>:</span></span>
<span class="line"><span>    print</span><span>(</span><span>"Small number"</span><span>)</span></span>
<span class="line"><span>default:</span></span>
<span class="line"><span>    break</span></span>
<span class="line"><span>}</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>switch</span><span> number {</span></span>
<span class="line"><span>case</span><span> 1</span><span>...</span><span>5</span><span>:</span></span>
<span class="line"><span>    print</span><span>(</span><span>"Small number"</span><span>)</span></span>
<span class="line"><span>default:</span></span>
<span class="line"><span>    break</span></span>
<span class="line"><span>}</span></span></code></pre>
<p>When Swift compiles and runs the above code, it internally does it like this:</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>(</span><span>1</span><span>...</span><span>5</span><span>) </span><span>~=</span><span> number</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>(</span><span>1</span><span>...</span><span>5</span><span>) </span><span>~=</span><span> number</span></span></code></pre>
<p>It checks whether the number is within the specified range.</p>
<blockquote>
<p>In Swift, we can easily <strong>overload</strong> the <strong>pattern-matching operator (~=).</strong></p>
</blockquote>
<h4>Why do we overload the <strong>pattern-matching operator (~=)?</strong></h4>
<p>Generally, when we use a <strong>pattern-matching operator</strong>, Swift uses the built-in logic. If we overload it, we can provide our own logic, and Swift will use it.</p>
<p>Suppose we have a struct called <strong>Circle</strong>,</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>struct</span><span> Circle</span><span>{</span></span>
<span class="line"><span>    var</span><span> radius:</span><span>Double</span></span>
<span class="line"><span>}</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>struct</span><span> Circle</span><span>{</span></span>
<span class="line"><span>    var</span><span> radius:</span><span>Double</span></span>
<span class="line"><span>}</span></span></code></pre>
<p>Let&#8217;s use this in a switch statement,</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>var</span><span> circle </span><span>=</span><span> Circle</span><span>(</span><span>radius</span><span>: </span><span>10</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>    switch</span><span> circle.radius {</span></span>
<span class="line"><span>    case</span><span> 10</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Hello"</span><span>)</span></span>
<span class="line"><span>    default:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Not 10"</span><span>)</span></span>
<span class="line"><span>    }</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>var</span><span> circle </span><span>=</span><span> Circle</span><span>(</span><span>radius</span><span>: </span><span>10</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>    switch</span><span> circle.radius {</span></span>
<span class="line"><span>    case</span><span> 10</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Hello"</span><span>)</span></span>
<span class="line"><span>    default:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Not 10"</span><span>)</span></span>
<span class="line"><span>    }</span></span></code></pre>
<p>Here, it is simple: we pass the radius to the switch statement and check whether it falls within the given number.</p>
<p>That&#8217;s fine!</p>
<p>But what if we want this, so that we do not pass the <strong>&#8220;circle.radius&#8221;</strong> only passes the circle, and the <strong><mark class="bg-emerald-300 dark:bg-emerald-700 dark:text-white">switch statement compares each case with the radius of the circle</mark></strong><mark class="bg-emerald-300 dark:bg-emerald-700 dark:text-white">, </mark>like this:</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>var</span><span> circle</span><span> =</span><span> Circle</span><span>(</span><span>radius</span><span>: </span><span>10</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>switch</span><span> circle {</span></span>
<span class="line"><span>case</span><span> 10</span><span>:</span></span>
<span class="line"><span>    print</span><span>(</span><span>"Hello"</span><span>)</span></span>
<span class="line"><span>default</span><span>:</span></span>
<span class="line"><span>    print</span><span>(</span><span>"Not 10"</span><span>)</span></span>
<span class="line"><span>}</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>var</span><span> circle</span><span> =</span><span> Circle</span><span>(</span><span>radius</span><span>: </span><span>10</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>switch</span><span> circle {</span></span>
<span class="line"><span>case</span><span> 10</span><span>:</span></span>
<span class="line"><span>    print</span><span>(</span><span>"Hello"</span><span>)</span></span>
<span class="line"><span>default</span><span>:</span></span>
<span class="line"><span>    print</span><span>(</span><span>"Not 10"</span><span>)</span></span>
<span class="line"><span>}</span></span></code></pre>
<p>As of now, it will give a compile-time error: <strong>&#8220;Expression pattern of type &#8216;Int&#8217; cannot match values of type &#8216;Circle'&#8221;.</strong></p>
<p>To resolve this error, we will override the <strong>pattern-matching operator</strong> to implement our own logic and make the code above work.</p>
<p>							 Bool {<br />
    return value.radius == pattern<br />
}&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-1/2 -translate-y-1/2 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>func</span><span> ~=</span><span> (</span><span>pattern</span><span>:</span><span>Double</span><span>,</span><span>value</span><span>:Circle) </span><span>-&gt;</span><span> Bool</span><span> {</span></span>
<span class="line"><span>    return</span><span> value.radius </span><span>==</span><span> pattern</span></span>
<span class="line"><span>}</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>func</span><span> ~=</span><span> (</span><span>pattern</span><span>:</span><span>Double</span><span>,</span><span>value</span><span>:Circle) </span><span>-&gt;</span><span> Bool</span><span> {</span></span>
<span class="line"><span>    return</span><span> value.radius </span><span>==</span><span> pattern</span></span>
<span class="line"><span>}</span></span></code></pre>
<p>Here, we override the <strong>pattern-matching operator,</strong> which takes two mandatory parameters.</p>
<p><strong>pattern</strong> — the cases of the switch statement.</p>
<p><strong>value</strong> — with whom we need to compare</p>
<p>Inside the function, we compare the pattern and the circle&#8217;s radius.</p>
<p>Now, when we write a switch statement like this, it will work;</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>let</span><span> circle </span><span>=</span><span> Circle</span><span>(</span><span>radius</span><span>: </span><span>10</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>    switch</span><span> circle {</span></span>
<span class="line"><span>    case</span><span> 10</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Hello"</span><span>)</span></span>
<span class="line"><span>    default:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Not 10"</span><span>)</span></span>
<span class="line"><span>    }</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>let</span><span> circle </span><span>=</span><span> Circle</span><span>(</span><span>radius</span><span>: </span><span>10</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>    switch</span><span> circle {</span></span>
<span class="line"><span>    case</span><span> 10</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Hello"</span><span>)</span></span>
<span class="line"><span>    default:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Not 10"</span><span>)</span></span>
<span class="line"><span>    }</span></span></code></pre>
<p>When we pass the circle, inside the switch, it will compare the circle&#8217;s radius.</p>
<p>We can also define as many overrides of the <strong>pattern-matching operator</strong> as we want.</p>
<p>Suppose we want to check whether the <strong>circle&#8217;s radius</strong> falls in a specific range.</p>
<p>							&lt;button data-code=&quot;func ~= (pattern: ClosedRange, value: Circle) -&gt; Bool {<br />
    return pattern.contains(value.radius)<br />
}&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-1/2 -translate-y-1/2 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>func</span><span> ~=</span><span> (</span><span>pattern</span><span>: </span><span>ClosedRange</span><span>&#x3C;</span><span>Double</span><span>&gt;, </span><span>value</span><span>: Circle) </span><span>-&gt;</span><span> Bool</span><span> {</span></span>
<span class="line"><span>    return</span><span> pattern.</span><span>contains</span><span>(value.radius)</span></span>
<span class="line"><span>}</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>func</span><span> ~=</span><span> (</span><span>pattern</span><span>: </span><span>ClosedRange</span><span>&#x3C;</span><span>Double</span><span>&gt;, </span><span>value</span><span>: Circle) </span><span>-&gt;</span><span> Bool</span><span> {</span></span>
<span class="line"><span>    return</span><span> pattern.</span><span>contains</span><span>(value.radius)</span></span>
<span class="line"><span>}</span></span></code></pre>
<p>Now, in the switch statement, we can check the specific range as well.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>let</span><span> circle </span><span>=</span><span> Circle</span><span>(</span><span>radius</span><span>: </span><span>10</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>    switch</span><span> circle {</span></span>
<span class="line"><span>    case</span><span> 1</span><span>...</span><span>10</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Hello"</span><span>)</span></span>
<span class="line"><span>    default:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Not 10"</span><span>)</span></span>
<span class="line"><span>    }</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>let</span><span> circle </span><span>=</span><span> Circle</span><span>(</span><span>radius</span><span>: </span><span>10</span><span>)</span></span>
<span class="line"></span>
<span class="line"><span>    switch</span><span> circle {</span></span>
<span class="line"><span>    case</span><span> 1</span><span>...</span><span>10</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Hello"</span><span>)</span></span>
<span class="line"><span>    default:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Not 10"</span><span>)</span></span>
<span class="line"><span>    }</span></span></code></pre>
<p>Here, we can now check whether the radius is in the <strong>1…10</strong> range or not.</p>
<p>Let&#8217;s take another example,</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>let</span><span> input </span><span>=</span><span> "admin"</span></span>
<span class="line"></span>
<span class="line"><span>switch</span><span> input {</span></span>
<span class="line"><span>case</span><span> "ADMIN"</span><span>:</span></span>
<span class="line"><span>    print</span><span>(</span><span>"Matched"</span><span>)</span></span>
<span class="line"><span>default:</span></span>
<span class="line"><span>    print</span><span>(</span><span>"No match"</span><span>)</span></span>
<span class="line"><span>}</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>let</span><span> input </span><span>=</span><span> "admin"</span></span>
<span class="line"></span>
<span class="line"><span>switch</span><span> input {</span></span>
<span class="line"><span>case</span><span> "ADMIN"</span><span>:</span></span>
<span class="line"><span>    print</span><span>(</span><span>"Matched"</span><span>)</span></span>
<span class="line"><span>default:</span></span>
<span class="line"><span>    print</span><span>(</span><span>"No match"</span><span>)</span></span>
<span class="line"><span>}</span></span></code></pre>
<p>Here, when we compare the input, it falls through to the default case because Swift compares <strong>strings case-sensitively.</strong></p>
<blockquote>
<p><strong>admin</strong> !== <strong>ADMIN</strong></p>
</blockquote>
<p>Let&#8217;s overload the ~= for <strong>case-sensitively matching.</strong></p>
<p>							 Bool {<br />
    pattern.lowercased() == value.lowercased()<br />
}&#8221; data-toggle-ms=&#8221;1200&#8243; aria-label=&#8221;Copy code&#8221; data-nosnippet=&#8221;&#8221; class=&#8221;code-copy-btn absolute right-3 top-1/2 -translate-y-1/2 size-8 p-1.5 flex items-center justify-center bg-black/50 text-white rounded-md transition-colors duration-200 cursor-pointer hover:bg-black/70&#8243;&gt;<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>func</span><span> ~=</span><span> (</span><span>pattern</span><span>: </span><span>String</span><span>, </span><span>value</span><span>: </span><span>String</span><span>) </span><span>-&gt;</span><span> Bool</span><span> {</span></span>
<span class="line"><span>    pattern.</span><span>lowercased</span><span>() </span><span>==</span><span> value.</span><span>lowercased</span><span>()</span></span>
<span class="line"><span>}</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>func</span><span> ~=</span><span> (</span><span>pattern</span><span>: </span><span>String</span><span>, </span><span>value</span><span>: </span><span>String</span><span>) </span><span>-&gt;</span><span> Bool</span><span> {</span></span>
<span class="line"><span>    pattern.</span><span>lowercased</span><span>() </span><span>==</span><span> value.</span><span>lowercased</span><span>()</span></span>
<span class="line"><span>}</span></span></code></pre>
<p>Inside the function, we changed both the value and pattern to lowercase.</p>
<p>Now it doesn&#8217;t matter whether the string is in uppercase or lowercase; Swift will not compare strings <strong>case-sensitively inside the switch.</strong></p>
<h3>2. Switch on multiple optional values simultaneously</h3>
<p>This means that we can <strong>utilize the tuple pattern</strong> in a switch statement to handle multiple values simultaneously.</p>
<p>Let&#8217;s understand with an example,</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>func</span><span> test</span><span>(){</span></span>
<span class="line"><span>    var</span><span> optionalInt1: </span><span>Int</span><span>?</span><span> =</span><span> 1</span></span>
<span class="line"><span>    var</span><span> optionalInt2: </span><span>Int</span><span>?</span><span> =</span><span> nil</span></span>
<span class="line"></span>
<span class="line"><span>    switch</span><span> (optionalInt1, optionalInt2) {</span></span>
<span class="line"><span>    case</span><span> let</span><span> (value1</span><span>?</span><span>, value2</span><span>?</span><span>)</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Both have values: </span><span>(value1)</span><span> and </span><span>(value2)</span><span>"</span><span>)</span></span>
<span class="line"><span>    case</span><span> let</span><span> (value1</span><span>?</span><span>, </span><span>nil</span><span>)</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"First has a value: </span><span>(value1)</span><span>, second is nil"</span><span>)</span></span>
<span class="line"><span>    case</span><span> let</span><span> (</span><span>nil</span><span>, value2</span><span>?</span><span>)</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"First is nil, second has a value: </span><span>(value2)</span><span>"</span><span>)</span></span>
<span class="line"><span>    case</span><span> (</span><span>nil</span><span>, </span><span>nil</span><span>)</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Both are nil"</span><span>)</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>func</span><span> test</span><span>(){</span></span>
<span class="line"><span>    var</span><span> optionalInt1: </span><span>Int</span><span>?</span><span> =</span><span> 1</span></span>
<span class="line"><span>    var</span><span> optionalInt2: </span><span>Int</span><span>?</span><span> =</span><span> nil</span></span>
<span class="line"></span>
<span class="line"><span>    switch</span><span> (optionalInt1, optionalInt2) {</span></span>
<span class="line"><span>    case</span><span> let</span><span> (value1</span><span>?</span><span>, value2</span><span>?</span><span>)</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Both have values: </span><span>(value1)</span><span> and </span><span>(value2)</span><span>"</span><span>)</span></span>
<span class="line"><span>    case</span><span> let</span><span> (value1</span><span>?</span><span>, </span><span>nil</span><span>)</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"First has a value: </span><span>(value1)</span><span>, second is nil"</span><span>)</span></span>
<span class="line"><span>    case</span><span> let</span><span> (</span><span>nil</span><span>, value2</span><span>?</span><span>)</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"First is nil, second has a value: </span><span>(value2)</span><span>"</span><span>)</span></span>
<span class="line"><span>    case</span><span> (</span><span>nil</span><span>, </span><span>nil</span><span>)</span><span>:</span></span>
<span class="line"><span>        print</span><span>(</span><span>"Both are nil"</span><span>)</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre>
<p>Here, we have two optional values (<strong>optionalInt1</strong>, <strong>optionalInt2</strong>). Depending on their value, we will execute different actions.</p>
<p>In the first case, we check if both values are non-nil, then print the statement.</p>
<p>In the second and third cases, we check where one of the optional values is nil.</p>
<p>In the final case, we check if both optional values are nil.</p>
<blockquote>
<p>This way, we can structure the switch statement and handle each combination explicitly.</p>
</blockquote>
<h3>3. Iterate over items and indices in collections</h3>
<p>When we need to iterate over a sequence in Swift, the <strong>enumerated()</strong> function is the one that comes to mind.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>var</span><span> ingredients </span><span>=</span><span> [</span><span>"Apple"</span><span>, </span><span>"Banana"</span><span>, </span><span>"Orange"</span><span>]</span></span>
<span class="line"></span>
<span class="line"><span>for</span><span> (i, ingredient) </span><span>in</span><span> ingredients.</span><span>enumerated</span><span>() {</span></span>
<span class="line"><span>        print</span><span>(</span><span>"ingredient number </span><span>(i </span><span>+</span><span> 1</span><span>)</span><span> is </span><span>(ingredient)</span><span>"</span><span>)</span></span>
<span class="line"><span>}</span></span>
<span class="line"></span>
<span class="line"><span>// output</span></span>
<span class="line"></span>
<span class="line"><span>0</span><span> Apple</span></span>
<span class="line"><span>1</span><span> Banana</span></span>
<span class="line"><span>2</span><span> Orange</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>var</span><span> ingredients </span><span>=</span><span> [</span><span>"Apple"</span><span>, </span><span>"Banana"</span><span>, </span><span>"Orange"</span><span>]</span></span>
<span class="line"></span>
<span class="line"><span>for</span><span> (i, ingredient) </span><span>in</span><span> ingredients.</span><span>enumerated</span><span>() {</span></span>
<span class="line"><span>        print</span><span>(</span><span>"ingredient number </span><span>(i </span><span>+</span><span> 1</span><span>)</span><span> is </span><span>(ingredient)</span><span>"</span><span>)</span></span>
<span class="line"><span>}</span></span>
<span class="line"></span>
<span class="line"><span>// output</span></span>
<span class="line"></span>
<span class="line"><span>0</span><span> Apple</span></span>
<span class="line"><span>1</span><span> Banana</span></span>
<span class="line"><span>2</span><span> Orange</span></span></code></pre>
<blockquote>
<p>It displays the <strong>index</strong> with the <strong>ingredient name.</strong></p>
</blockquote>
<p>But it&#8217;s crucial to understand the limitations of <strong>enumerated().</strong></p>
<p>The index it produces <strong>starts at zero and increments by 1 for each item,</strong> which is perfect for use as a counter but not necessarily as an index, especially if the collection isn&#8217;t zero-based.</p>
<p>We know that <strong>enumerated()</strong> starts at <strong>index 0</strong>, but not all collections begin at index 0.</p>
<p>Let&#8217;s see the example,</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>var</span><span> ingredients </span><span>=</span><span> [</span><span>"Apple"</span><span>, </span><span>"Banana"</span><span>, </span><span>"Orange"</span><span>]</span></span>
<span class="line"><span>var</span><span> slice </span><span>=</span><span> ingredients.</span><span>dropFirst</span><span>() </span><span>// Apple will be removed from the list.</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>var</span><span> ingredients </span><span>=</span><span> [</span><span>"Apple"</span><span>, </span><span>"Banana"</span><span>, </span><span>"Orange"</span><span>]</span></span>
<span class="line"><span>var</span><span> slice </span><span>=</span><span> ingredients.</span><span>dropFirst</span><span>() </span><span>// Apple will be removed from the list.</span></span></code></pre>
<p>Here, the slice variable is <strong>Array.SubSequence</strong> and its index are,</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>1</span><span>, </span><span>2</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>1</span><span>, </span><span>2</span></span></code></pre>
<p>So when we loop it with <strong>enumerated(),</strong></p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>for</span><span> (i, value) </span><span>in</span><span> slice.</span><span>enumerated</span><span>() {</span></span>
<span class="line"><span>    print</span><span>(</span><span>"i ="</span><span>, i, </span><span>"value ="</span><span>, value)</span></span>
<span class="line"><span>}</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>for</span><span> (i, value) </span><span>in</span><span> slice.</span><span>enumerated</span><span>() {</span></span>
<span class="line"><span>    print</span><span>(</span><span>"i ="</span><span>, i, </span><span>"value ="</span><span>, value)</span></span>
<span class="line"><span>}</span></span></code></pre>
<p>The output will look like this,</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>i</span><span> = 0 </span><span>value</span><span> = Banana</span></span>
<span class="line"><span>i</span><span> = 1 </span><span>value</span><span> = Orange</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>i</span><span> = 0 </span><span>value</span><span> = Banana</span></span>
<span class="line"><span>i</span><span> = 1 </span><span>value</span><span> = Orange</span></span></code></pre>
<p>This looks fine until you use <strong>i</strong> as an index,</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>slice[</span><span>i</span><span>] </span><span>// crash</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>slice[</span><span>i</span><span>] </span><span>// crash</span></span></code></pre>
<p>The application will crash because,</p>
<p>i is 0,1</p>
<p>But the valid indices are 1 and 2.</p>
<p>To resolve this problem, we will use the <strong>zip()</strong> method. This method pairs each element with its index, even if the collection has been modified.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>var</span><span> ingredients </span><span>=</span><span> [</span><span>"Apple"</span><span>, </span><span>"Banana"</span><span>, </span><span>"Orange"</span><span>]</span></span>
<span class="line"></span>
<span class="line"><span>var</span><span> slice </span><span>=</span><span> ingredients.</span><span>dropFirst</span><span>()</span></span>
<span class="line"></span>
<span class="line"><span>for</span><span> (index, value) </span><span>in</span><span> zip</span><span>(slice.</span><span>indices</span><span>, slice) {</span></span>
<span class="line"><span>    print</span><span>(index, value)</span></span>
<span class="line"><span>}</span></span>
<span class="line"></span>
<span class="line"><span>// output</span></span>
<span class="line"><span>1</span><span> Banana</span></span>
<span class="line"><span>2</span><span> Orange</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>var</span><span> ingredients </span><span>=</span><span> [</span><span>"Apple"</span><span>, </span><span>"Banana"</span><span>, </span><span>"Orange"</span><span>]</span></span>
<span class="line"></span>
<span class="line"><span>var</span><span> slice </span><span>=</span><span> ingredients.</span><span>dropFirst</span><span>()</span></span>
<span class="line"></span>
<span class="line"><span>for</span><span> (index, value) </span><span>in</span><span> zip</span><span>(slice.</span><span>indices</span><span>, slice) {</span></span>
<span class="line"><span>    print</span><span>(index, value)</span></span>
<span class="line"><span>}</span></span>
<span class="line"></span>
<span class="line"><span>// output</span></span>
<span class="line"><span>1</span><span> Banana</span></span>
<span class="line"><span>2</span><span> Orange</span></span></code></pre>
<p>The index will now start at 1 and remain valid for each item.</p>
<p>Another way to use with the <strong>indices,</strong></p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>for</span><span> index </span><span>in</span><span> slice.</span><span>indices</span><span> {</span></span>
<span class="line"><span>    print</span><span>(index, slice[index])</span></span>
<span class="line"><span>}</span></span>
<span class="line"></span>
<span class="line"><span>// output</span></span>
<span class="line"><span>1</span><span> Banana</span></span>
<span class="line"><span>2</span><span> Orange</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>for</span><span> index </span><span>in</span><span> slice.</span><span>indices</span><span> {</span></span>
<span class="line"><span>    print</span><span>(index, slice[index])</span></span>
<span class="line"><span>}</span></span>
<span class="line"></span>
<span class="line"><span>// output</span></span>
<span class="line"><span>1</span><span> Banana</span></span>
<span class="line"><span>2</span><span> Orange</span></span></code></pre>
<h3>4. Label loop statements to control execution of nested loops</h3>
<p>Suppose you have nested loops like this,</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>for</span><span> i </span><span>in</span><span> 1</span><span>...</span><span>3</span><span> {</span></span>
<span class="line"><span>    for</span><span> j </span><span>in</span><span> 1</span><span>...</span><span>3</span><span> {</span></span>
<span class="line"><span>        if</span><span> j </span><span>==</span><span> 2</span><span> {</span></span>
<span class="line"><span>            break</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>        print</span><span>(</span><span>"i:"</span><span>, i, </span><span>"j:"</span><span>, j)</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>for</span><span> i </span><span>in</span><span> 1</span><span>...</span><span>3</span><span> {</span></span>
<span class="line"><span>    for</span><span> j </span><span>in</span><span> 1</span><span>...</span><span>3</span><span> {</span></span>
<span class="line"><span>        if</span><span> j </span><span>==</span><span> 2</span><span> {</span></span>
<span class="line"><span>            break</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>        print</span><span>(</span><span>"i:"</span><span>, i, </span><span>"j:"</span><span>, j)</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span></code></pre>
<p>Here, we place a break statement inside the inner loop, but the outer loop continues running.</p>
<p>Sometimes you want to,</p>
<ul>
<li>break the outer loop</li>
<li>continue the outer loop</li>
<li>Stop the execution of the program</li>
</ul>
<p>Currently, it isn&#8217;t easy to do the above scenarios.</p>
<p>To do this, a <strong>loop label</strong> comes in.</p>
<p>							<span class="ready block"></span><span class="success hidden"></span></p>
<pre class="shiki github-light"><code><span class="line"><span>outerLoop</span><span>:</span><span> for</span><span> i </span><span>in</span><span> 1</span><span>...</span><span>3</span><span> {</span></span>
<span class="line"><span>    for</span><span> j </span><span>in</span><span> 1</span><span>...</span><span>3</span><span> {</span></span>
<span class="line"><span>        if</span><span> j </span><span>==</span><span> 2</span><span> {</span></span>
<span class="line"><span>            break</span><span> outerLoop</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>        print</span><span>(</span><span>"i:"</span><span>, i, </span><span>"j:"</span><span>, j)</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span>
<span class="line"></span>
<span class="line"><span>// output</span></span>
<span class="line"></span>
<span class="line"><span>i</span><span>:</span><span> 1</span><span> j</span><span>:</span><span> 1</span></span></code></pre>
<pre class="shiki github-dark"><code><span class="line"><span>outerLoop</span><span>:</span><span> for</span><span> i </span><span>in</span><span> 1</span><span>...</span><span>3</span><span> {</span></span>
<span class="line"><span>    for</span><span> j </span><span>in</span><span> 1</span><span>...</span><span>3</span><span> {</span></span>
<span class="line"><span>        if</span><span> j </span><span>==</span><span> 2</span><span> {</span></span>
<span class="line"><span>            break</span><span> outerLoop</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>        print</span><span>(</span><span>"i:"</span><span>, i, </span><span>"j:"</span><span>, j)</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span>
<span class="line"></span>
<span class="line"><span>// output</span></span>
<span class="line"></span>
<span class="line"><span>i</span><span>:</span><span> 1</span><span> j</span><span>:</span><span> 1</span></span></code></pre>
<p>As you can see, we provide a label to the <strong>outer loop</strong>; now it is easy to break the outer loop with minimal effort, or you can do anything with it.</p>
<p><em>Thank you for reading until the end. Before you go:</em></p>
<ul>
<li><em>Please consider <strong><strong>clapping</strong></strong> and <strong><strong>following</strong></strong> 👏</em></li>
<li>Follow us on <a href="https://x.com/nameisjayant" rel="nofollow noopener noreferrer" target="_blank">Twitter(X)<span></span></a>, <a href="https://www.linkedin.com/in/jayant-kumar-%F0%9F%87%AE%F0%9F%87%B3-262597171/" rel="nofollow noopener noreferrer" target="_blank">LinkedIn<span></span></a>, <a href="https://nameisjayant.substack.com/" rel="nofollow noopener noreferrer" target="_blank">Substack<span></span></a>, and <a href="https://www.youtube.com/@ProgrammingSimplified0" rel="nofollow noopener noreferrer" target="_blank">YouTube<span></span></a>.</li>
</ul>
<p><a href="https://medium.com/ios-lab/swift-6-2-features-you-should-start-using-today-4f3bc7b3f91c" rel="nofollow noopener noreferrer" target="_blank"><strong>Swift 6.2 Features You Should Start Using Today</strong><span></span></a><br />
<em>These Swift 6.2 features will definitely blow your mind</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://freedium.net/use-swift-like-a-senior-engineer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">139</post-id>	</item>
		<item>
		<title>9 better ways to use ChatGPT than collecting more prompts</title>
		<link>https://freedium.net/9-better-ways-to-use-chatgpt-than-collecting-more-prompts/</link>
					<comments>https://freedium.net/9-better-ways-to-use-chatgpt-than-collecting-more-prompts/#respond</comments>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 14:34:41 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://freedium.net/9-better-ways-to-use-chatgpt-than-collecting-more-prompts/</guid>

					<description><![CDATA[Quick summary Use simpler prompts, then keep refining in the same chat Show ChatGPT the actual file, image or screenshot Use Projects and memory to keep useful context Use Temporary Chat when you want a&#8230;]]></description>
										<content:encoded><![CDATA[<h3>Quick summary</h3>
<ul>
<li>Use simpler prompts, then keep refining in the same chat</li>
<li>Show ChatGPT the actual file, image or screenshot</li>
<li>Use Projects and memory to keep useful context</li>
<li>Use Temporary Chat when you want a clean slate</li>
<li>Search when facts may have changed, and let recurring tasks check things later</li>
</ul>
<p>You probably already know the basic ChatGPT routine: ask a question, get an answer, try again if it&#8217;s not quite right. That&#8217;s how I used it when it first came out too. But ChatGPT has changed a lot since then.</p>
<p>It can now work with files and images, remember useful context, keep ongoing work together, search for current information and run tasks later. Yet it&#8217;s still easy to use it the old way: open a blank chat, type one question, copy the answer and leave.</p>
<h4><strong>We&#8217;re using a 2026 product with a 2023 mental model.</strong></h4>
<p>And that&#8217;s happening at huge scale. According to <a href="https://www.similarweb.com/top-websites/ai-chatbots-and-tools/" rel="nofollow noopener noreferrer" target="_blank">Similarweb&#8217;s current rankings<span></span></a>, ChatGPT is still the most-used standalone AI chatbot by global web traffic, ahead of Gemini and Claude.</p>
<p>My own habits changed too. I used to collect prompts and spend more time trying to word them perfectly. I even wrote about the <a href="https://medium.com/design-bootcamp/10-chatgpt-prompts-i-use-daily-as-a-ux-product-designer-d8feb1d4bc1e" rel="nofollow noopener noreferrer" target="_blank">10 ChatGPT prompts I used regularly as a product designer<span></span></a>.</p>
<p>I still use prompts, obviously. I just care less about making them clever now. The bigger difference comes from knowing what context to give ChatGPT, when to show it the actual file or image, what to let it remember, and when to check the answer.</p>
<p>These are the habits I find more useful now.</p>
<h3>1. Don&#8217;t overthink the first prompt</h3>
<p>A useful prompt usually needs three things:</p>
<p><strong>What you need → Useful context → What you want back</strong></p>
<p>Instead of:</p>
<blockquote>
<p>Plan dinner for this week.</p>
</blockquote>
<p>Try:</p>
<blockquote>
<p>Plan five simple dinners for two adults. I only want to cook for around 30 minutes each night, and I&#8217;d like to reuse ingredients where possible. Give me the meals first, then one combined shopping list.</p>
</blockquote>
<p>That is usually enough. You don&#8217;t need to tell ChatGPT that it is a &#8220;world-class expert&#8221; or turn a simple request into a page of instructions.</p>
<p>When the result is wrong, I usually find it easier to correct the conversation than rewrite the whole prompt.</p>
<h3>2. Keep the conversation going</h3>
<p>I still see people treating every ChatGPT prompt like a Google search: ask once, judge the result, then start again.</p>
<p>You can simply continue:</p>
<blockquote>
<p>Too detailed. Give me the three things that matter.</p>
</blockquote>
<blockquote>
<p>Keep the plan, but make it cheaper.</p>
</blockquote>
<blockquote>
<p>I don&#8217;t understand the second point. Explain it without technical terms.</p>
</blockquote>
<p>Sometimes the first answer is close and only needs a few tweaks. Other times, seeing the answer makes me realise that my original request wasn&#8217;t clear enough.</p>
<p>I&#8217;ve found this more useful than endlessly polishing the initial prompt. The conversation itself becomes part of the instruction.</p>
<h3>3. Show ChatGPT the actual thing</h3>
<p>This is probably the easiest upgrade. If you already have the source, just show it to ChatGPT: upload the document or spreadsheet, send the screenshot, or take a photo of what you&#8217;re looking at.</p>
<p>On desktop, you can usually just drag and drop the file or image into the chat. You can also use the attachment button if that&#8217;s easier. Explaining something manually often removes useful context.</p>
<p>Imagine writing:</p>
<blockquote>
<p>My electricity bill seems much higher this month. It has several sections and different rates. Can you explain why?</p>
</blockquote>
<p>If you already have the bill, showing it is more useful. You can ask:</p>
<blockquote>
<p>Explain this bill in plain English. What seems to have changed, and what should I check?</p>
</blockquote>
<p>Before spending five minutes describing something to ChatGPT, I now ask myself whether I can simply show it.</p>
<h3>4. Keep ongoing work in a Project</h3>
<p>I used to have separate chats for things I kept returning to. One for an article, another for a trip, another for a work project. Then two weeks later, I would open a new conversation and explain half of it again.</p>
<p>Projects solve much of that because you can keep related chats, files and instructions together. The context builds instead of disappearing into dozens of separate conversations.</p>
<p>A Project could be:</p>
<ul>
<li>Your job search</li>
<li>A holiday</li>
<li>A house renovation</li>
<li>Learning a new subject</li>
<li>Writing a book</li>
<li>A long-running work project</li>
</ul>
<p>Imagine you&#8217;re planning a trip to Japan. You could keep your flights, hotels, saved places and budget in one Project, then later ask:</p>
<blockquote>
<p>We now have a free afternoon in Kyoto. What fits with the rest of our trip?</p>
</blockquote>
<p>You no longer need to explain the trip from the beginning. I started using Projects for the same reason, and eventually wrote about the <a href="https://medium.com/design-bootcamp/i-stopped-re-explaining-myself-to-chatgpt-my-output-got-far-more-consistent-2aad6def8dea" rel="nofollow noopener noreferrer" target="_blank">three ChatGPT Projects I set up once and keep returning to<span></span></a>.</p>
<p>For things that develop over weeks or months, this has been much more useful than having one giant prompt.</p>
<h3>5. Let ChatGPT remember the useful context</h3>
<p>Some things are useful once, but annoying to repeat in every chat. You can tell ChatGPT things like:</p>
<blockquote>
<p>I prefer short answers unless I ask for detail.</p>
</blockquote>
<blockquote>
<p>I usually cook for two.</p>
</blockquote>
<blockquote>
<p>I&#8217;m a beginner learning Spanish.</p>
</blockquote>
<p>That way, future conversations can start with more useful context already in place, instead of you retyping the same preferences.</p>
<p>I still wouldn&#8217;t use memory for every personal detail. I keep it for things that genuinely improve future answers.</p>
<h3>6. Use Temporary Chat when you want a fresh start</h3>
<p>Sometimes I want the opposite. I don&#8217;t want previous context or an ongoing project influencing the conversation.</p>
<p>That is what Temporary Chat is useful for.</p>
<p>I find it handy for researching a surprise present, exploring a completely unrelated subject, or testing something without wanting the conversation to become part of the context I regularly use.</p>
<p>My simple rule is: if the context will become more useful over time, I keep it together. If I deliberately want a clean conversation, I use Temporary Chat.</p>
<h3>7. Let it organise the mess</h3>
<p>One of my favourite uses of ChatGPT has very little to do with getting expert advice. I give it things I already know but haven&#8217;t organised.</p>
<p>For example:</p>
<blockquote>
<p>I need to renew my insurance, return a package before Thursday, book the dentist, clean the spare room before my family visits on Saturday, buy groceries and pick someone up on Friday evening.</p>
</blockquote>
<p>Then:</p>
<blockquote>
<p>Sort this into what I should do today, tomorrow and later this week. Put anything with a deadline first.</p>
</blockquote>
<p>I already knew what needed to get done. The annoying part was working out what to do first. The same works for messy notes, packing lists, emails or research.</p>
<p>I use ChatGPT this way a lot to organise messy thoughts without handing over the thinking, which I wrote more about in <a href="https://medium.com/design-bootcamp/does-chatgpt-make-us-lazy-or-help-us-think-faster-7c45a6762f5e" rel="nofollow noopener noreferrer" target="_blank">how I use ChatGPT without outsourcing my thinking<span></span></a>.</p>
<p>Sometimes the most useful thing it does is simply turn a messy pile of thoughts into something easier to act on.</p>
<h3>8. Ask it to search when things may have changed</h3>
<p>I wouldn&#8217;t rely only on what an AI model already knows for things such as:</p>
<ul>
<li>Current prices</li>
<li>Travel requirements</li>
<li>Laws and regulations</li>
<li>Product specifications</li>
<li>News</li>
<li>Recent statistics</li>
</ul>
<p>When freshness matters, I usually make that part explicit:</p>
<blockquote>
<p>Check current sources before answering.</p>
</blockquote>
<p>Or:</p>
<blockquote>
<p>Find the latest information and link the original sources.</p>
</blockquote>
<p>If the subject is messy:</p>
<blockquote>
<p>Tell me if reliable sources disagree.</p>
</blockquote>
<p>The difference is simple. If I ask, &#8220;Help me think through whether I should buy a tablet,&#8221; I want reasoning. If I ask, &#8220;What are the current prices and specifications of these three tablets?&#8221;, I want fresh information.</p>
<p>If the answer includes a number, ranking, or claim I may want to verify, I want the source link too.</p>
<h3>9. Let ChatGPT check things for you later</h3>
<p>This is one of the newer behaviours that feels genuinely different from how I used ChatGPT a few years ago. ChatGPT can now run some tasks later or repeatedly instead of waiting for you to remember to return.</p>
<p>For example:</p>
<blockquote>
<p>Every Monday morning, give me the week&#8217;s weather forecast.</p>
</blockquote>
<blockquote>
<p>Remind me on the 25th of every month to pay this bill.</p>
</blockquote>
<blockquote>
<p>Every Friday, summarise the biggest news in an industry I follow.</p>
</blockquote>
<p>You can also use recurring checks for something you&#8217;re waiting for:</p>
<blockquote>
<p>Check whether tickets for this event have gone on sale. Tell me when they do.</p>
</blockquote>
<p>Previously, ChatGPT depended on me to remember to check something. For some tasks, I can now hand that part over too.</p>
<h3>Before I trust the answer, I ask one more question</h3>
<p>ChatGPT is much more capable than when I started using it. It can also still give a confident answer that turns out to be wrong.</p>
<p>When the consequence matters, I sometimes ask:</p>
<blockquote>
<p>What part of your answer are you least certain about?</p>
</blockquote>
<blockquote>
<p>Separate the facts from your assumptions.</p>
</blockquote>
<p>Or simply:</p>
<blockquote>
<p>What should I verify before relying on this?</p>
</blockquote>
<p>I do this especially with research, numbers, and subjects I don&#8217;t know well enough to spot a bad answer myself.</p>
<p>This has also changed how I write prompts for work. In my more recent article on <a href="https://medium.com/design-bootcamp/12-chatgpt-claude-prompts-for-senior-product-designers-7ed65a2802c0" rel="nofollow noopener noreferrer" target="_blank">12 ChatGPT and Claude prompts for senior product designers<span></span></a>, many prompts focus less on getting a smarter first answer and more on asking AI to show uncertainty, separate assumptions, and stop when evidence is missing.</p>
<p>That habit works outside design too.</p>
<h3>I spend less time thinking about prompts now</h3>
<p>When ChatGPT first appeared, much of the advice focused on prompts: how to phrase a request, what role to assign the AI, and which wording produced the best output.</p>
<p>I still care about prompts, but much less than I used to.</p>
<blockquote>
<p><em>The bigger improvement now comes from continuing the conversation, giving ChatGPT the actual files and images, keeping related work together, letting useful context carry forward, searching when information could have changed, and asking it to check things again later.</em></p>
</blockquote>
<p>That&#8217;s what&#8217;s changed most for me. If you still mostly open a chat, ask one question, get the answer, and leave, you&#8217;re probably using only the simplest part of what ChatGPT can do.</p>
<h3>Further reading</h3>
<p><a href="https://medium.com/design-bootcamp/i-stopped-re-explaining-myself-to-chatgpt-my-output-got-far-more-consistent-2aad6def8dea" rel="nofollow noopener noreferrer" target="_blank"><strong>3 ChatGPT Projects I set up once and use for everything</strong><span></span></a><br />
<em>Set the context once, and every conversation inside already knows what you need.</em></p>
<p><a href="https://medium.com/design-bootcamp/does-chatgpt-make-us-lazy-or-help-us-think-faster-7c45a6762f5e" rel="nofollow noopener noreferrer" target="_blank"><strong>How I use ChatGPT without outsourcing my thinking</strong><span></span></a><br />
<em>What an MIT study on cognitive debt changed about how I actually use AI.</em></p>
<p><a href="https://medium.com/design-bootcamp/12-chatgpt-claude-prompts-for-senior-product-designers-7ed65a2802c0" rel="nofollow noopener noreferrer" target="_blank"><strong>12 ChatGPT &#x26; Claude Prompts for Senior Product Designers</strong><span></span></a><br />
<em>The prompts I kept after years of prototyping, QA, research, design reviews and testing AI agents.</em></p>
<ul>
<li><a href="https://openai.com/academy/projects/" rel="nofollow noopener noreferrer" target="_blank">Using projects in ChatGPT<span></span></a>, by OpenAI Academy</li>
<li><a href="https://help.openai.com/en/articles/10291617-scheduled-tasks-in-chatgpt" rel="nofollow noopener noreferrer" target="_blank">Scheduled tasks in ChatGPT<span></span></a>, by OpenAI</li>
<li><a href="https://help-lb.openai.com/en/articles/7925741-sharing-conversations-and-scheduled-tasks-in-chatgpt" rel="nofollow noopener noreferrer" target="_blank">Sharing conversations and scheduled tasks in ChatGPT<span></span></a>, by OpenAI</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://freedium.net/9-better-ways-to-use-chatgpt-than-collecting-more-prompts/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">138</post-id>	</item>
		<item>
		<title>Why Rust Is the Fastest Growing Programming Language in 2025</title>
		<link>https://freedium.net/why-rust-is-the-fastest-growing-programming-language-in-2025/</link>
					<comments>https://freedium.net/why-rust-is-the-fastest-growing-programming-language-in-2025/#respond</comments>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 12:45:47 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://freedium.net/why-rust-is-the-fastest-growing-programming-language-in-2025/</guid>

					<description><![CDATA[When the White House publishes a cybersecurity report recommending a programming language over industry standards like C and C++, you pay attention. That happened in February 2024, when the US government officially endorsed Rust for&#8230;]]></description>
										<content:encoded><![CDATA[<p>When the White House publishes a cybersecurity report recommending a programming language over industry standards like C and C++, you pay attention.</p>
<p>That happened in February 2024, when the US government officially endorsed Rust for memory safety reasons. But this wasn&#8217;t just political theater. It reflected a seismic shift already happening across the technology industry.</p>
<p>Rust&#8217;s developer community doubled from 2 million users in Q1 2022 to 4 million in Q1 2024 — a growth rate that outpaces every other programming language tracked by major developer surveys.</p>
<p>I&#8217;ve been watching Rust&#8217;s rise for three years now, and what started as curiosity from systems programmers has evolved into something bigger. Let me show you why Rust isn&#8217;t just growing fast — it&#8217;s fundamentally changing how we think about software development.</p>
<h3>The Numbers That Tell the Story</h3>
<p>First, let&#8217;s establish what &#8220;fastest growing&#8221; actually means with hard data:</p>
<p>In the last 12 months alone, Rust&#8217;s community grew by 33%, according to SlashData&#8217;s Developer Nation survey. That&#8217;s not a small bump — that&#8217;s exponential growth in an industry where established languages typically see single-digit percentage increases.</p>
<p>For the ninth consecutive year, Rust ranked as the &#8220;most loved&#8221; language in Stack Overflow&#8217;s Developer Survey, with an 83% admiration rate. This isn&#8217;t just popularity — it&#8217;s sustained enthusiasm from developers who actually use it.</p>
<p>According to JetBrains data, 2.26 million developers used Rust in the last 12 months, with 709,000 identifying it as their primary language. The gap between those numbers is telling — Rust is spreading into multi-language environments, not replacing entire tech stacks overnight.</p>
<p>But here&#8217;s the metric that surprised me most: Rust reached its highest-ever position at #13 in the TIOBE Index in February 2025, up from never ranking higher than 17th previously.</p>
<h3>What Makes Developers Actually Choose Rust?</h3>
<p>I&#8217;ve interviewed dozens of developers who made the switch to Rust, and three themes emerge consistently:</p>
<p><strong>Memory Safety Without the Performance Tax</strong></p>
<p>Traditional systems languages like C and C++ give you raw speed but force you to manually manage memory. One mistake — a buffer overflow, a use-after-free error, a data race — and your application crashes or worse, becomes a security vulnerability.</p>
<p>Rust&#8217;s ownership model ensures memory safety without needing a garbage collector, using static typing and compile-time checks to catch errors before they reach production.</p>
<p>Here&#8217;s what that means practically: At Discord, engineers rewrote performance-critical services from Go to Rust and saw significant improvements. At Amazon, Rust powers AWS Lambda&#8217;s performance layer. At Microsoft, parts of Windows are being rewritten in Rust.</p>
<p>These aren&#8217;t experimental side projects — they&#8217;re production systems handling millions of requests.</p>
<p><strong>Concurrency That Actually Works</strong></p>
<p>Writing multi-threaded code in C++ feels like defusing a bomb while blindfolded. You&#8217;re constantly worried about race conditions, deadlocks, and data corruption.</p>
<p>Rust&#8217;s borrow checker won&#8217;t let your code compile if there&#8217;s a potential race condition. This sounds annoying (and initially, it is), but it transforms how you write concurrent code.</p>
<p>A GitHub staff software engineer noted that Rust enables developers to write &#8220;readable, maintainable, and crash-free multi-threaded programs while also enabling low-level memory control&#8221;.</p>
<p>The confidence you get from knowing your concurrent code is provably safe changes everything. You stop being defensive and start being productive.</p>
<p><strong>The Ecosystem Is Maturing Fast</strong></p>
<p>Three years ago, choosing Rust meant building everything from scratch. Today, the landscape has transformed.</p>
<p>Cargo, Rust&#8217;s package manager, simplifies project management and dependency tracking, contributing to an efficient development workflow and a strong ecosystem of open-source libraries.</p>
<p>Need to build a web server? Actix, Axum, and Rocket provide production-ready frameworks. Working with databases? SQLx and Diesel have you covered. Building async systems? Tokio has become the de facto standard.</p>
<p>The library ecosystem isn&#8217;t at JavaScript or Python levels yet, but it&#8217;s crossing the threshold where you can build most applications without constantly reinventing wheels.</p>
<h3>Where Rust Is Actually Being Used in 2025</h3>
<p>Rust is gaining traction in industries like cloud computing, systems programming, blockchain, and embedded systems. But let&#8217;s get specific about what that looks like:</p>
<p><strong>Cloud Infrastructure</strong>: AWS uses Rust for Lambda, Firecracker (their microVM technology), and Bottlerocket (their container-focused Linux distribution). When you run serverless functions on AWS, there&#8217;s a good chance Rust is handling the orchestration.</p>
<p><strong>Operating Systems</strong>: Microsoft is integrating Rust into Windows kernel components. The Linux kernel officially supports Rust as a second language for driver development. This is huge — these are the most conservative codebases in computing.</p>
<p><strong>Web Services</strong>: Cloudflare uses Rust for their edge computing platform. Dropbox rewrote their sync engine in Rust. These are companies where performance and reliability directly impact revenue.</p>
<p><strong>Blockchain and Crypto</strong>: Solana, Polkadot, and numerous DeFi protocols are built entirely in Rust. Love or hate crypto, these systems handle billions of dollars and demand zero-downtime reliability.</p>
<p>Rust is thriving in high-demand sectors such as cloud computing, data analysis, AI infrastructure, and embedded systems — essentially anywhere where performance and reliability are non-negotiable.</p>
<h3>The Real Reason Companies Are Switching</h3>
<p>Here&#8217;s something most articles won&#8217;t tell you: Companies aren&#8217;t adopting Rust primarily for performance. They&#8217;re adopting it for <strong>reliability and security</strong>.</p>
<p>Memory safety bugs account for roughly 70% of security vulnerabilities in systems software. Every buffer overflow, every use-after-free bug, every dangling pointer is a potential exploit waiting to happen.</p>
<p>The TIOBE CEO directly attributed Rust&#8217;s growth surge to increasing security awareness, noting &#8220;Rust is preparing itself for a top 10 position in the TIOBE index&#8221; as companies prioritize memory-safe languages.</p>
<p>The economics are simple: One security breach can cost millions in damages, regulatory fines, and reputation loss. Preventing those bugs at compile-time instead of discovering them in production is worth the investment in learning a new language.</p>
<h3>The Challenges That Still Remain</h3>
<p>I&#8217;d be lying if I said Rust was perfect. After working with it for two years, here are the real obstacles:</p>
<p><strong>The Learning Curve Is Brutal</strong></p>
<p>Rust is rarely a developer&#8217;s first programming language, as most Rust professionals come from diverse coding backgrounds with substantial experience. The ownership system, lifetimes, and borrow checker represent entirely new mental models.</p>
<p>Expect at least three months before you&#8217;re productive in Rust. Expect six months before you stop fighting the compiler. Expect a year before it clicks and you wonder how you ever wrote C++ without it.</p>
<p><strong>Compile Times Are Painful</strong></p>
<p>Rust does extensive work at compile time — borrow checking, trait resolution, monomorphization of generics. This makes runtime fast but compilation slow.</p>
<p>On large projects, clean builds can take minutes. During development, incremental compilation helps, but it&#8217;s still noticeably slower than C++ or Go.</p>
<p><strong>The Ecosystem Has Gaps</strong></p>
<p>Unlike languages with a longer market presence, Rust is still relatively untested in large enterprise solutions, and developers often need to build services from scratch.</p>
<p>You won&#8217;t find the mature GUI frameworks, extensive ML libraries, or enterprise integration tools that Python or Java provide. Those will come, but they&#8217;re not here yet.</p>
<h3>Why This Growth Will Continue</h3>
<p>Despite the challenges, I&#8217;m convinced Rust&#8217;s growth trajectory will accelerate for three reasons:</p>
<p><strong>1. The Security Imperative</strong>: As software becomes more critical to infrastructure, finance, and safety, memory safety won&#8217;t be optional. Regulations will follow government recommendations.</p>
<p><strong>2. The Talent Pipeline</strong>: One in six Go developers are considering switching to Rust, according to recent surveys. As more senior developers learn Rust, they&#8217;ll bring it to their organizations.</p>
<p><strong>3. The Tooling Improvements</strong>: Every Rust release improves compile times, error messages, and developer experience. The language is actively addressing its weaknesses.</p>
<p>The Rust Foundation, backed by Amazon, Google, Huawei, Microsoft, and Mozilla, ensures the language is here to stay for years to come.</p>
<h3>Should You Learn Rust in 2025?</h3>
<p>Here&#8217;s my honest take after two years of production Rust experience:</p>
<p><strong>Learn Rust if you&#8217;re:</strong></p>
<ul>
<li>Working in systems programming, cloud infrastructure, or embedded systems</li>
<li>Building performance-critical services where milliseconds matter</li>
<li>Concerned about security and want to prevent entire classes of bugs</li>
<li>Ready to invest time upfront for long-term productivity gains</li>
<li>Curious about modern language design and want to expand your thinking</li>
</ul>
<p><strong>Stick with your current language if:</strong></p>
<ul>
<li>You&#8217;re building CRUD apps, websites, or standard business software</li>
<li>Your team has no Rust experience and tight deadlines</li>
<li>You work in domains where Python/JavaScript libraries are essential</li>
<li>Learning curve time isn&#8217;t available right now</li>
</ul>
<p>Rust isn&#8217;t replacing JavaScript for web development or Python for data science. It&#8217;s carving out dominance in systems programming, cloud infrastructure, and any domain where performance and reliability are paramount.</p>
<h3>The Bottom Line</h3>
<p>While JavaScript maintains the top spot with 25.2 million active developers, Rust&#8217;s developer community doubling in just two years represents the fastest growth of any programming language.</p>
<p>This isn&#8217;t hype — it&#8217;s a fundamental shift in how we build software. Memory safety, fearless concurrency, and zero-cost abstractions aren&#8217;t just nice features. They&#8217;re becoming requirements as software eats the world and security becomes critical.</p>
<p>I&#8217;ve watched languages come and go over my career. Rust feels different. It&#8217;s solving real problems that have plagued systems programming for 50 years, and it&#8217;s doing so without sacrificing performance.</p>
<p>The question isn&#8217;t whether Rust will continue growing. The question is how fast the rest of the industry will catch up.</p>
<p><strong>Are you learning Rust or considering it?</strong> What&#8217;s holding you back, or what convinced you to dive in? Drop your thoughts in the comments — I&#8217;m genuinely curious where other developers stand on this.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://freedium.net/why-rust-is-the-fastest-growing-programming-language-in-2025/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">137</post-id>	</item>
		<item>
		<title>How to know what&#8217;s trending in your niche (without scrolling for hours) 📡</title>
		<link>https://freedium.net/how-to-know-whats-trending-in-your-niche-without-scrolling-for-hours-%f0%9f%93%a1/</link>
					<comments>https://freedium.net/how-to-know-whats-trending-in-your-niche-without-scrolling-for-hours-%f0%9f%93%a1/#respond</comments>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 10:44:09 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://freedium.net/how-to-know-whats-trending-in-your-niche-without-scrolling-for-hours-%f0%9f%93%a1/</guid>

					<description><![CDATA[How to know what&#x27;s trending in your niche (without scrolling for hours) 📡Here are the tools that *actually* work.Tom OrbachNov 06, 2025∙ Paid8863ShareI’m going to show you exactly how I spot trends before 99% of&#8230;]]></description>
										<content:encoded><![CDATA[<h2 class="post-title published title-X77sOw" dir="auto">How to know what&#x27;s trending in your niche (without scrolling for hours) 📡</h2>
<h3 class="subtitle subtitle-HEEcLo" dir="auto">Here are the tools that *actually* work.</h3>
<p><a rel="nofollow noopener noreferrer" target="_blank" href="https://substack.com/@marketingideas" class="pencraft pc-display-contents pc-reset"><img decoding="async" loading="lazy" class="img-OACg1c object-fit-cover-u4ReeV pencraft pc-reset" src="https://substackcdn.com/image/fetch/$s_!Z3w1!,w_36,h_36,c_fill,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0bfeccd-1ba4-4639-b5f8-0307eef18cb5_3280x3280.png" alt="Tom Orbach&apos;s avatar" width="36" height="36" /></a><span><a rel="nofollow noopener noreferrer" target="_blank" class="pencraft pc-reset decoration-hover-underline-zSXGjA reset-PDs18X" href="https://substack.com/@marketingideas">Tom Orbach</a></span><time datetime="2025-11-06T08:33:39.063Z" title="2025-11-06T08:33:39.063Z">Nov 06, 2025</time>∙ <!-- -->Paid8863Share</p>
<p>I’m going to show you exactly how I spot trends before 99% of marketers.</p>
<p><span>Not by doomscrolling LinkedIn every morning. Not with Google Alerts (those are useless now). And </span><em>definitely</em><span> not by reading 20 newsletters.</span></p>
<p><strong>I use 5 specific tools</strong><span> that can surface what’s actually blowing up in YOUR industry right now. Before it hits the news, before your competitors see it.</span></p>
<p>Let me show you 👇</p>
<figure><a rel="nofollow noopener noreferrer" class="image-link image2 is-viewable-img can-restack" target="_blank" href="https://substackcdn.com/image/fetch/$s_!txZ5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f222663-927c-45c8-87da-2446b9fcba49_1920x1080.jpeg"><img decoding="async" loading="lazy" src="https://substackcdn.com/image/fetch/$s_!txZ5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f222663-927c-45c8-87da-2446b9fcba49_1920x1080.jpeg" width="1456" height="819" class="sizing-normal" alt="" /></a></figure>
<h2 class="header-anchor-post">Why I stopped recommending Google Alerts 📉</h2>
<p><span>For years I told people to set up </span><a rel="nofollow noopener noreferrer" target="_blank" href="https://www.google.com/alerts">Google News Alerts</a><span>:</span></p>
<pre><code>“Just add keywords like ‘trending+[industry]’ and you’re good!”</code></pre>
<p>You get an email as soon as a new article pops up.</p>
<figure><a rel="nofollow noopener noreferrer" class="image-link image2 is-viewable-img can-restack" target="_blank" href="https://substackcdn.com/image/fetch/$s_!msfl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F774569a3-28a5-4190-86c6-f2e770a00ff3_1764x1340.png"><img decoding="async" src="https://substackcdn.com/image/fetch/$s_!msfl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F774569a3-28a5-4190-86c6-f2e770a00ff3_1764x1340.png" width="1456" height="1106" class="sizing-normal" alt="" loading="lazy" /></a></figure>
<p>But that advice is pretty useless now.</p>
<p><strong>People don’t wait for news outlets to tell them what’s interesting.</strong><span> They’re already talking about it on X, Reddit, Discord, or wherever they hang out. Then </span><em>maybe</em><span> a journalist writes about it 2-3 days later.</span></p>
<p>Most viral moments in your niche never even make it to news sites. They live in social feeds and forums (and die there too).</p>
<p>If you want to catch trends → you need to see them where they actually start.</p>
<p><span>Here are</span><strong> 5 tools</strong><span> for doing exactly that (for almost $0):</span></p>
<h2 class="paywall-title">This post is for paid subscribers</h2>
<p><a rel="nofollow noopener noreferrer" target="_blank" href="https://www.marketingideas.com/subscribe?simple=true&amp;next=https%3A%2F%2Fwww.marketingideas.com%2Fp%2Fhow-to-know-whats-trending-in-your%3Futm_source%3Dchatgpt.com&amp;utm_source=paywall&amp;utm_medium=web&amp;utm_content=177948364">Subscribe</a><a rel="nofollow noopener noreferrer" target="_blank" href="https://substack.com/sign-in?redirect=%2Fp%2Fhow-to-know-whats-trending-in-your%3Futm_source%3Dchatgpt.com&amp;for_pub=marketingideas&amp;change_user=false">Already a paid subscriber?<!-- --> <b>Sign in</b></a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://freedium.net/how-to-know-whats-trending-in-your-niche-without-scrolling-for-hours-%f0%9f%93%a1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">136</post-id>	</item>
		<item>
		<title>Why a voice-AI app suddenly climbed GitHub’s weekly trend list</title>
		<link>https://freedium.net/why-a-voice-ai-app-suddenly-climbed-githubs-weekly-trend-list/</link>
					<comments>https://freedium.net/why-a-voice-ai-app-suddenly-climbed-githubs-weekly-trend-list/#respond</comments>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 09:47:24 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://freedium.net/why-a-voice-ai-app-suddenly-climbed-githubs-weekly-trend-list/</guid>

					<description><![CDATA[Most AI projects that rise quickly on GitHub offer a sharp promise. A new model. A clever benchmark. A demo that does one thing unusually well. VoiceStudio's promise is messier, which is why it is&#8230;]]></description>
										<content:encoded><![CDATA[<p>Most AI projects that rise quickly on GitHub offer a sharp promise. A new model. A clever benchmark. A demo that does one thing unusually well.</p>
<p>VoiceStudio&#8217;s promise is messier, which is why it is more interesting. The open-source desktop app puts voice cloning, voice design, video dubbing, transcription, dictation and audiobook production under one roof. It also exposes a local API and MCP support for agents. That is a lot of surface area for one repository, and it is probably the first reason people have started passing it around.</p>
<p>The project calls itself a fully local ElevenLabs alternative. That comparison will attract clicks, but it does not explain the attention on its own. Plenty of open-source projects can generate speech. VoiceStudio has caught a particular moment in the market because it treats voice as a working medium, not a novelty that begins and ends with typing a sentence into a demo page.</p>
<p>The distinction matters. A good synthetic voice is impressive for about five minutes. A tool that can turn a script into a narrated draft, keep a creator&#8217;s working files on their own hardware, help with a dub, and fit into an existing automation workflow changes a different part of the job.</p>
<h3>The cloud voice stack has become oddly fragmented</h3>
<p>For a small creator, voice work can now involve more subscriptions than it should. One tool makes the voice. Another transcribes an interview. Another translates the script. Another handles timing for a video. A separate service may deal with long-form narration. Each one has a login, a credit balance and slightly different rules about where audio is stored.</p>
<p>That stack did not appear because creators love switching tabs. It appeared because cloud AI companies tend to sell a single outstanding capability first. The result is useful software with a frustrating handoff problem. Export an audio file here. Upload it there. Correct the script in a third place. Discover that a workflow that made sense for a twenty-second clip is awkward when the job is a multilingual course or a ten-hour audiobook.</p>
<p>VoiceStudio&#8217;s appeal is that it starts with the workflow instead. Its own feature list joins clone, dub, design and local models as parts of one desktop application. The project even includes a floating dictation widget, batch jobs and an API for other software. It is not trying to win by making a single voice demo look magical. It is trying to remove the small gaps between the jobs people already do.</p>
<p>This is a more difficult product to build, but it is easier to understand once you have spent time making videos, turning rough notes into spoken drafts, or working with audio that cannot casually be uploaded to five services.</p>
<h3>Local changes the calculation, even when it is slower</h3>
<p>&#8220;Run it locally&#8221; can sound like a hobbyist slogan. In voice work, it has a practical meaning. Raw voice recordings often contain names, places, customer conversations, unreleased scripts and the speaker&#8217;s identity. A company may accept that material living with a specialist provider. An independent creator may not care. A journalist, a small studio or a team handling client material may care a lot.</p>
<p>VoiceStudio says its local workflows run on the user&#8217;s hardware, with remote services optional and usage analytics requiring consent. Its setup documentation lists Apple Silicon acceleration through Metal and CUDA acceleration on compatible Windows and Linux machines. The project can run on a CPU too, although it says that route is slower and needs roughly 5 GB of free disk space for the small CPU PyTorch build.</p>
<p>That does not make local software automatically better. Local models still need to be downloaded, updates still matter, and a laptop can be a poor place to run a large generation job while you are editing video. Some people will prefer a cloud service because it is faster, simpler and sounds better on the task they care about.</p>
<p>But local execution gives a user a choice that subscription products often hide. You can keep a routine task close to the files it depends on. You can work without turning every draft into an upload. You can decide when the convenience of a remote model is worth it. That is an ordinary engineering trade-off, and it feels more valuable as voice becomes part of more everyday work.</p>
<h3>The project is selling a workstation, not a model</h3>
<p>This is the part that many AI product conversations miss. Models are becoming easier to access. The inconvenient work is around them: installing the right runtime, managing voices and models, moving content through a production sequence, and connecting output to the tools that already hold the work.</p>
<p>VoiceStudio makes that packaging unusually visible. It offers an Electron desktop app for macOS, Windows and Linux, can install through a one-command installer, and supports several engines rather than asking users to commit to a single model. The default setup uses OmniVoice, but the software is designed to let users choose another engine where the workflow calls for it.</p>
<p>That model flexibility is not a small technical detail. A creator may accept a slower local engine for a private draft and use a different engine for a polished delivery. A developer may want the local API to generate audio from an internal tool. A team that needs dubbed video cares about timing and editing controls as much as it cares about a pleasing narrator.</p>
<p>Cloud companies have had this advantage for years. They made complicated infrastructure feel like a button. Open source is starting to compete by doing the same for a bundle of models and workflows, while giving users more choice about where the work runs.</p>
<h3>Voice is moving closer to the agent workflow</h3>
<p>The local API and MCP support explain another part of the timing. Voice used to be an output format. A tool wrote an audio file after the &#8220;real&#8221; work was complete. That boundary is getting less clear.</p>
<p>An agent can use speech as an input through dictation, call a local voice generator to prepare a draft narration, create versions for review, or produce audio as one step in a larger publishing workflow. VoiceStudio&#8217;s documentation explicitly positions the product around creation, production and connection, including local API and MCP integration for agents.</p>
<p>That does not mean every coding agent needs permission to clone a voice. It means the tools are beginning to connect. For a creator who already relies on automation for scripts, captions, image generation and editing, keeping the audio layer separate is increasingly inconvenient. A local voice tool that can be called by the rest of that system is more useful than a beautiful web interface with no way in or out.</p>
<p>There is a caution here. Automation makes it easier to produce a lot of convincing audio very quickly. The workflow should make permissions, review and disclosure easier too. VoiceStudio&#8217;s own responsible-use note is unambiguous: clone voices only with permission. That is not legal fine print to skim past. It is the condition that separates a practical creator tool from a shortcut that creates problems for someone else.</p>
<h3>The impressive part is how much it tries to cover</h3>
<p>It is fair to be sceptical of repositories that promise everything. A broad feature list can mean that no individual capability is as dependable as a focused paid alternative. It can also mean that installation, model downloads and hardware support need more attention than a browser-based subscription.</p>
<p>VoiceStudio does not hide all of that complexity. Its documentation explains different hardware paths, lists the dependencies required to build the current main branch, and directs users to separate performance, model and troubleshooting guides. That is healthy. Local AI becomes less useful when &#8220;easy&#8221; means the tool fails silently after a multi-gigabyte download.</p>
<p>The current repository is also not a tiny experiment. It has more than 53,000 GitHub stars, around 6,000 forks and thousands of commits. That community signal does not prove that every feature is production-ready. It does show that people are willing to test, extend and argue about a local voice workstation at a scale that would have seemed unlikely only a few years ago.</p>
<p>For readers deciding whether to install it, the sensible question is narrower than &#8220;Can it replace ElevenLabs?&#8221; Start with the one voice task that currently sends you between tools. A private narration draft. A transcript-to-audio review copy. A first pass at dubbing a short video. If it removes friction there, the project has earned a place in the stack. If it does not, a cloud tool may still be the better choice.</p>
<h3>Why this one caught attention now</h3>
<p>VoiceStudio is benefiting from a change in expectations. People no longer want to be impressed by a model in isolation. They want software that can fit into their existing work without forcing every file through a new service.</p>
<p>The project gives that demand a concrete shape: a desktop app, local execution, several voice tasks, optional remote workers, an API, and an integration point for agents. None of those ingredients are new by themselves. Putting them together in a tool that a creator or developer can install is what makes the project stand out.</p>
<p>The interesting test is what happens after the GitHub attention moves on. VoiceStudio will need to keep improving voice quality, setup reliability and the experience of moving between local and remote work. It will also need to remain strict about consent as cloning gets easier. But the popularity makes sense. It is not selling an abstract future of synthetic voice. It is offering a way to bring a scattered, cloud-heavy workflow back onto a user&#8217;s own machine.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://freedium.net/why-a-voice-ai-app-suddenly-climbed-githubs-weekly-trend-list/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">135</post-id>	</item>
	</channel>
</rss>
