<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Thomas Wiegold - AI &amp; Web Development Blog</title>
    <link>https://thomas-wiegold.com/blog/</link>
    <description>Insights on AI solutions, web development, and modern software engineering practices</description>
    <language>en-au</language>
    <lastBuildDate>Mon, 05 Oct 2026 07:03:35 GMT</lastBuildDate>
    <ttl>60</ttl>
    <generator>React Router v8</generator>
    <atom:link href="https://thomas-wiegold.com/rss.xml" rel="self" type="application/rss+xml" />
    <image>
      <url>https://thomas-wiegold.com/logo.jpg</url>
      <title>Thomas Wiegold - AI &amp; Web Development Blog</title>
      <link>https://thomas-wiegold.com</link>
    </image>
    
    <item>
      <title><![CDATA[GPT-6.1 Sol review: 3 tests vs Opus 5.5 and Grok 4.7]]></title>
      <link>https://thomas-wiegold.com/blog/gpt-6-1-sol-review/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/gpt-6-1-sol-review/</guid>
      <description><![CDATA[GPT-6.1 Sol review: hands-on tests vs Opus 5.5 and Grok 4.7 on web design and hard Go coding. Near-Opus quality at half the price, but slow.]]></description>
      <content:encoded><![CDATA[<p>I'll get the awkward part out of the way first. I pay for Claude Max, and I pay for ChatGPT's $20 plan. That ratio tells you roughly where I spend my days. If you read this blog regularly, you know I mostly run Claude, with Grok and DeepSeek for the cheap everyday stuff. I do like Codex, though, and I thought the GPT-6 models were great. Still, every time I try a new GPT model on a real project, I'm back in Claude a week later.</p>
<p>GPT-6.1 Sol came closer than any of them to breaking that habit. On hard coding it's within touching distance of Opus 5.5, at half the API price. It's also slow, it needs more hand-holding in the prompt, and in my web design test it was plain lazy. Opus 5.5 stays my default, but not by much.</p>
<p>Here's what I ran: the same web design brief from my <a href="/blog/claude-sonnet-5-5-review/">Claude Sonnet 5.5 review</a>, plus two hard algorithmic tests in Go. Every test pitted Sol against Opus 5.5 and Grok 4.7.</p>
<h2 id="what-is-gpt-61-sol">What is GPT-6.1 Sol?</h2>
<p>GPT-6.1 Sol is OpenAI's mid-tier GPT-6 model, released on 29 September 2026 at DevDay. It sits between the flagship GPT-6 Astra and the budget GPT-6 Luna, and it replaced GPT-6 Sol after exactly seven days. If you're struggling to keep up with OpenAI's release pace, you're not alone.</p>
<table>
<thead>
<tr>
<th></th>
<th>GPT-6.1 Sol</th>
</tr>
</thead>
<tbody><tr>
<td>API model ID</td>
<td><code>gpt-6.1-sol</code></td>
</tr>
<tr>
<td>Context window</td>
<td>1,050,000 tokens</td>
</tr>
<tr>
<td>Max output</td>
<td>128,000 tokens</td>
</tr>
<tr>
<td>Knowledge cutoff</td>
<td>30 April 2026</td>
</tr>
<tr>
<td>API price (per 1M tokens)</td>
<td>$2 input, $0.10 cached input, $10 output</td>
</tr>
<tr>
<td>Reasoning effort</td>
<td>low, medium (default), high, xhigh, max</td>
</tr>
<tr>
<td>Available in</td>
<td>API, Codex, ChatGPT Work (Plus and up), GitHub Copilot, Microsoft Foundry</td>
</tr>
</tbody></table>
<p>Note the "ChatGPT Work" bit. At launch, Sol isn't in regular ChatGPT chat at all, and free users don't get it.</p>
<p>OpenAI's pitch is near-Astra performance at a fifth of the token price. On <a href="https://openai.com/index/introducing-gpt-6-1-sol/">OpenAI's own numbers</a>, Sol scores 75.2% on DeepSWE v1.1 at high effort, against 74.1% for Astra at xhigh. Cached input dropped to half of GPT-6 Sol's price, and responses with factual errors at low effort fell from 11.4% to 7.7%. One odd detail: the DeepSWE score drops to 71.9% at xhigh and max. So turning the effort dial all the way up made it worse at coding, which is not what the dial is for.</p>
<h2 id="test-1-the-web-design-brief">Test 1: the web design brief</h2>
<p>I gave Sol the exact brief from my Sonnet 5.5 review, so you can compare it with every model I've run through it so far. All three results are side by side on the <a href="/blog/claude-sonnet-5-5-review/web-design-test/">web design comparison page</a>.</p>
<p>I've always liked GPT's taste in design. Its pages usually look clean and modern without much fuss, and Sol's page is nice too. The problem is how little it did. The design is too simple, and there are no animations at all. It felt like Sol read the brief, did the minimum that technically satisfies it, and went to lunch.</p>
<p>Opus 5.5 was much better. It did more with the same brief, and the result is the one I'd actually show a client. Grok 4.7 landed in the middle: okay, nothing to complain about, nothing to remember either.</p>
<p>What surprised me is that this isn't a capability problem. Sol is #4 on the <a href="https://arena.ai/leaderboard">LMArena WebDev leaderboard</a>, so it can clearly build good frontends. My guess is it wanted a brief that said "add motion, add more sections, go further" in so many words. That turned out to be a pattern, and I'll come back to it below.</p>
<h2 id="tests-2-and-3-hard-algorithmic-work-in-go">Tests 2 and 3: hard algorithmic work in Go</h2>
<p>This is where Sol earned its spot. Both tests are logic-heavy Go tasks where a plausible-looking answer is easy to write and a correct one isn't.</p>
<h3 id="the-expression-language-interpreter">The expression-language interpreter</h3>
<p>This one is nasty on purpose. Each model had to build an interpreter for a small expression language in Go, tests first, standard library only. The prompt contradicts itself in three places. The grammar allows exactly one argument per call but demands an "arity" error. It never allows <code>let</code> inside an expression but asks for nested <code>let rec</code>. And it claims division never overflows, which <code>MinInt64 / -1</code> would like a word about. On top of that, the prompt says: if a case is unspecified, return an error. Do not guess.</p>
<p>So the real test was how each model handles a spec that argues with itself. All three spotted all three contradictions, which is impressive on its own. Then they chose differently.</p>
<p>Opus kept to the grammar and returned errors wherever the prompt was silent. Sol and Grok both satisfied the prose by inventing new syntax for <code>let</code> expressions, and they invented two incompatible versions. Sol's version needs a special parsing rule, and that rule sets a trap: <code>let f = fn x -&gt; x + 1  f(let y = 2 y)</code> returns 2 instead of 3, because it quietly gets parsed as two statements. That is exactly the guessing the prompt banned.</p>
<p>On the language the prompt actually defines, all three are correct. They pass all 206 hand-written conformance cases, and across 400,000 randomly generated programs no two implementations ever returned different values. The differences are at the edges:</p>
<table>
<thead>
<tr>
<th></th>
<th>Opus 5.5</th>
<th>GPT-6.1 Sol</th>
<th>Grok 4.7</th>
</tr>
</thead>
<tbody><tr>
<td>Implementation size</td>
<td>625 lines</td>
<td>542 lines</td>
<td>990 lines</td>
</tr>
<tr>
<td><code>fib(27)</code> runtime</td>
<td>45 ms</td>
<td>31 ms</td>
<td>58 ms</td>
</tr>
<tr>
<td>Test functions</td>
<td>49</td>
<td>3 (119 subtests)</td>
<td>64</td>
</tr>
<tr>
<td>Injected bugs caught by own tests</td>
<td>95.8%</td>
<td>91.1%</td>
<td>95.9%</td>
</tr>
<tr>
<td>Unbounded recursion</td>
<td>returns an error</td>
<td>crashes the process</td>
<td>crashes the process</td>
</tr>
<tr>
<td>Stays within the stated grammar</td>
<td>yes</td>
<td>no</td>
<td>no</td>
</tr>
<tr>
<td>Tests written before implementation</td>
<td>yes</td>
<td>yes</td>
<td>test file edited afterwards</td>
</tr>
</tbody></table>
<p>Sol wrote the most compact code and the fastest interpreter, and it followed the tests-first rule properly. Then it wrote the thinnest test suite by a wide margin. In the mutation test (injecting small bugs one at a time and checking whether the model's own tests catch them), Sol's suite missed <code>&lt;</code> flipped to <code>&lt;=</code>, because it never compares equal values with a strict operator. It also missed most of the overflow boundaries.</p>
<p>The robustness gap is the one I'd worry about in production. This 33-character program, <code>let rec f = fn n -&gt; f(n + 1) f(0)</code>, kills any process that embeds Sol's (or Grok's) interpreter with a fatal stack overflow. Opus returns a clean error in 0.3 seconds. To be fair, Opus pays for its depth limits elsewhere: it wrongly rejects a few extreme but valid programs, like recursion 200,000 levels deep.</p>
<h3 id="the-collatz-worker">The Collatz worker</h3>
<p>The second test looks easier and isn't. Each model had to write a Collatz (3n+1) checker in Go: a <code>Trajectory</code> function that follows one starting number down to 1, and a parallel <code>MaxTotalStoppingTime</code> search over a range. Same rules as before: tests first, public API only, standard library only, and no weakening tests to make the code pass.</p>
<p>The maths is trivial. Even numbers halve, odd numbers become 3n+1, repeat until you hit 1. The traps are everywhere else:</p>
<ul>
<li>3n+1 has to stay exact above <code>math.MaxInt64</code>, so everything runs on <code>math/big</code>, with all the pointer-aliasing fun that brings in Go.</li>
<li>The parallel search has to return the same answer with one worker or sixteen, and ties go to the smaller start. Get the merge wrong and the result depends on goroutine scheduling.</li>
<li>A step cap has to stop a long trajectory without flagging it as a cycle, and a cap of 0 must not count as reaching 1.</li>
<li>The tests have to lock known values, like 27 taking 111 steps and peaking at 9,232, or 97 having the longest run between 1 and 100 at 118 steps.</li>
</ul>
<p>The sneaky part is the <code>Cycle</code> flag. A repeat before reaching 1 would be a counterexample to the Collatz conjecture, and nobody has ever found one. So no valid input can reach that code path through the public API, and an honest test suite has to say so instead of pretending to cover it. The prompt also states the conjecture is unsolved and asks for a final line confirming no counterexample turned up. Part of the test is simply whether the model overclaims.</p>
<p>All three got the maths right. Checked against an independent reference on about 12,000 trajectories and 17,000 range searches, with starts up to 1,000 bits long, none of them returned a wrong step count, peak or search result. None claimed a proof or a counterexample either, so nobody failed the honesty check.</p>
<table>
<thead>
<tr>
<th></th>
<th>Opus 5.5</th>
<th>GPT-6.1 Sol</th>
<th>Grok 4.7</th>
</tr>
</thead>
<tbody><tr>
<td>Own tests (all passing)</td>
<td>42</td>
<td>39</td>
<td>31</td>
</tr>
<tr>
<td>Seeded bugs its tests catch (of 36)</td>
<td>36</td>
<td>30</td>
<td>35</td>
</tr>
<tr>
<td>Search 1 to 10,000,000, 8 workers</td>
<td>0.2 s</td>
<td>100 s</td>
<td>92 s</td>
</tr>
<tr>
<td>Implementation size</td>
<td>300 lines</td>
<td>163 lines</td>
<td>218 lines</td>
</tr>
<tr>
<td>Sticks to the spec</td>
<td>no, adds an exported <code>Step</code></td>
<td>yes</td>
<td>no, capped <code>StoppingTime</code> is -1</td>
</tr>
</tbody></table>
<p>This is the test where Sol's literal streak paid off. It was the only model that did exactly what the prompt asked and nothing else: the listed API, the specified behaviour, and the smallest code of the three. The prompt also wants tests for "the full sequence of 6", but <code>Result</code> only holds summary numbers, so no public call returns a sequence. Sol solved that neatly by running <code>Trajectory</code> from every suffix start and every capped prefix, with a comment explaining why.</p>
<p>The other two each bent the spec. Opus added an exported <code>Step</code> function the prompt never listed, and four of its tests call it. Grok returns -1 for <code>StoppingTime</code> when the step cap hits early, where the prompt says "steps taken". Grok's reading is arguably the more useful design, but it isn't what the spec says.</p>
<p>So why isn't Sol first? Tests, again. Its suite checks 39 trajectories and 13 ranges, against more than 20,000 trajectories and 854 ranges for Opus. Of 36 seeded bugs, its tests let six through, so they'd happily pass a search that treats <code>hi</code> as exclusive, or one that silently gives up on long trajectories. Its widest search range is 1 to 100.</p>
<p>Then there's speed. Sol and Grok detect cycles by storing every term as a decimal string in a map. That's simple and obviously correct, and it allocates 12.5 GB to search the first million numbers. Opus works in machine words with Brent's cycle detection, which stores nothing, and it searched 1 to 10 million in 0.2 seconds against 100 for Sol. The prompt never asked for speed, but it did warn that the range may be large.</p>
<h3 id="scoreboard">Scoreboard</h3>
<table>
<thead>
<tr>
<th>Test</th>
<th>1st</th>
<th>2nd</th>
<th>3rd</th>
</tr>
</thead>
<tbody><tr>
<td>Web design</td>
<td>Opus 5.5</td>
<td>Grok 4.7</td>
<td>GPT-6.1 Sol</td>
</tr>
<tr>
<td>Interpreter</td>
<td>Opus 5.5</td>
<td>Grok 4.7 (narrowly)</td>
<td>GPT-6.1 Sol</td>
</tr>
<tr>
<td>Collatz worker</td>
<td>Opus 5.5</td>
<td>GPT-6.1 Sol</td>
<td>Grok 4.7</td>
</tr>
<tr>
<td>Hard logic overall</td>
<td>Opus 5.5</td>
<td>GPT-6.1 Sol</td>
<td>Grok 4.7</td>
</tr>
</tbody></table>
<p>Opus wins outright. On the hard logic, Sol is a close second, and Opus is really only a little better. That "little" is mostly judgement: knowing when to say no to a spec instead of improvising.</p>
<h2 id="speed-and-prompting-where-sol-annoys-me">Speed and prompting: where Sol annoys me</h2>
<h3 id="its-slow">It's slow</h3>
<p>Sol is slow, and it isn't just me being impatient. <a href="https://artificialanalysis.ai/articles/gpt-6-1-sol-replaces-gpt-6-sol-after-just-7-days-with-near-astra-intelligence">Artificial Analysis</a> measures it at 51 tokens per second at max effort, which puts it 147th of 224 models on speed. Their own word for it is "notably slow". One developer <a href="https://x.com/N8Programs/status/2105430152729796845">measured 27.4 tok/s in Codex</a> against roughly 90 for Opus 5.5, and flagged the method as rough because Claude did the measuring. I respect the honesty. Launch week also brought "model is at capacity" errors in ChatGPT and Codex.</p>
<p>OpenAI's answer is Ultrafast, a premium tier with up to 8x faster generation in Codex. It's live for Astra. For Sol, OpenAI still says it's coming "in the coming days", and in ChatGPT you'll only get it on the new $500-a-month Pro plan. On my $20 plan, slow is what I get.</p>
<h3 id="you-have-to-spell-everything-out">You have to spell everything out</h3>
<p>This is the difference I notice most day to day. With Opus, I describe what I want and it fills in the obvious gaps. With Sol, I have to say exactly what I want, including the parts I thought were obvious.</p>
<p>Looking back at my tests, it's the same pattern each time. The design had no animations because the brief didn't say "animate things". The test suite was the smallest one that technically covered the requirements. In the interpreter, Sol followed the prose literally even where the grammar said otherwise. It does what you write, which isn't always what you mean.</p>
<p>That isn't all bad. If you're feeding a model precise specs in an automated pipeline, doing exactly what it's told is a feature. For exploratory work, where I want the model to be a bit clever and occasionally push back, it gets tiring fast. Claude also feels more consistent to me from one run to the next. I can't put a number on that one. It's vibes from a lot of daily use, but they're strong vibes.</p>
<h2 id="gpt-61-sol-benchmarks-and-pricing-vs-opus-55-and-grok-47">GPT-6.1 Sol benchmarks and pricing vs Opus 5.5 and Grok 4.7</h2>
<p>The independent numbers line up with my tests. Opus is ahead, Sol sits close behind at half the API price, and Grok trails on capability but has the cheapest output.</p>
<table>
<thead>
<tr>
<th>Model</th>
<th>Artificial Analysis Intelligence Index</th>
<th>API price, input / output per 1M tokens</th>
</tr>
</thead>
<tbody><tr>
<td>Claude Opus 5.5</td>
<td>58</td>
<td>$4 / $20</td>
</tr>
<tr>
<td>Claude Sonnet 5.5</td>
<td>56</td>
<td>$2 / $10</td>
</tr>
<tr>
<td>GPT-6.1 Sol (max effort)</td>
<td>52</td>
<td>$2 / $10</td>
</tr>
<tr>
<td>Grok 4.7</td>
<td>46</td>
<td>$2 / $6 (<a href="https://x.ai/api">xAI</a>)</td>
</tr>
</tbody></table>
<p>On coding specifically, Mercor's independent DeepSWE v1.1 run has Sol and Opus 5.5 tied at 72.3%. On reasoning, ARC Prize found <a href="https://arcprize.org/results/openai-gpt-6-1-sol">similar results</a>: 94.2% on ARC-AGI-2 at $0.25 per task, close to Astra's 95.0%. So the "near the top for a fraction of the cost" story holds up outside OpenAI's own charts, which isn't always the case with launch claims.</p>
<p>There's one awkward row for OpenAI in that table. Sonnet 5.5 costs exactly the same as Sol and scores higher. If price is your main reason to look at Sol, run Sonnet on your workload too.</p>
<p>On the subscription side, my $20 Plus plan gets 15 to 160 local Codex messages per five hours with Sol, going by OpenAI's Codex pricing page. Pro 200 subscribers lose half their allowance from 30 October, which is a fun thing to announce on the same day as a $500 plan.</p>
<p>If you're moving an API integration over from <code>gpt-6-sol</code>, check these first (OpenAI's <a href="https://developers.openai.com/api/docs/guides/latest-model">GPT-6 guide</a> has the details):</p>
<ul>
<li><code>none</code> and <code>minimal</code> reasoning effort are gone, so <code>low</code> is now the floor.</li>
<li>Tool calling only works through the Responses API. Chat Completions still works, without tools.</li>
<li>Prompts over 272K tokens bill the whole request at 2x input and 1.5x output, not just the tokens past the line.</li>
<li>Sol is rated Critical for cybersecurity, and the filters show. It ranks 42nd of 44 on <a href="https://www.vals.ai/models/openai_gpt-6.1-sol">Vals' CyberBench</a> with 39.29%, where GPT-6 Sol scored 78.0%. Expect refusals on security work unless you're in OpenAI's Daybreak program.</li>
</ul>
<h2 id="verdict-who-should-use-gpt-61-sol">Verdict: who should use GPT-6.1 Sol?</h2>
<p>GPT-6.1 Sol makes sense if:</p>
<ul>
<li>you run agentic coding at volume and cost per task matters more than the last few points of quality</li>
<li>you write precise specs and want a model that follows them to the letter</li>
<li>you already live in Codex or GitHub Copilot</li>
</ul>
<p>Stick with Opus 5.5 if:</p>
<ul>
<li>you want the model to work out your intent and fill the gaps</li>
<li>you build frontends and care about polish</li>
<li>consistency across runs matters more to you than the API bill</li>
</ul>
<p>And skip Sol for security tooling for now, unless you're in Daybreak.</p>
<p>For me, Opus 5.5 stays my favourite. It's more confident, sometimes cleverer, and its results are more reliable. When I pick models for <a href="/ai-agent-development/">client agent builds</a>, that reliability is worth more than the price difference. But Sol is the closest an OpenAI model has come to changing my mind. If Ultrafast lands on the $20 plan, or the speed improves some other way, I'll run these tests again.</p>
]]></content:encoded>
      <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-10-05T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI News</category>
      <category>OpenAI</category>
      <category>GPT</category>
      <category>Sol</category>
      <category>AI Coding</category>
      <category>6.1</category>
      <category>Review</category>
    </item>
    <item>
      <title><![CDATA[Claude Sonnet 5.5 Review: I Tested It Against Opus 5.5]]></title>
      <link>https://thomas-wiegold.com/blog/claude-sonnet-5-5-review/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/claude-sonnet-5-5-review/</guid>
      <description><![CDATA[Claude Sonnet 5.5 review: I tested it against Opus 5.5 and Sonnet 5 on a web design and a Go chess engine. Real costs, results, and who should use it.]]></description>
      <content:encoded><![CDATA[<p>Claude Sonnet 5.5 came out on September 28, and I'll be honest: I'm behind. GPT-6 and Grok 4.7 are still sitting on my list of reviews I haven't written, because the last few months produced more models than one busy developer can test. Sonnet 5.5 jumped the queue anyway. I have a soft spot for fast, cheap models.</p>
<p>Some context on how I use AI right now. My Claude subscription is where the hard stuff goes. Anything complicated or important gets <a href="/blog/claude-fable-5-1-review/">Fable</a> or <a href="/blog/opus-5-vs-gpt-5-6-vs-grok-4-5/">Opus</a> on high or xhigh effort. Anything easy goes to <a href="/blog/grok-4-5-review/">Grok</a> or DeepSeek V4.1 Flash, which I really like at the moment. Sonnet never had a slot. I barely touched Sonnet 5, partly because my results with it were underwhelming, and partly because I couldn't see why I'd pick it over all the other good models at a similar price.</p>
<p>So this Claude Sonnet 5.5 review comes down to one question: is it good enough, and cheap enough, to become my everyday Claude? I ran two head-to-head tests against Opus 5.5 and Sonnet 5 to find out, one web design and one Go coding task.</p>
<blockquote>
<p>Short version: Sonnet 5.5 is a big jump over Sonnet 5. Its design taste is close to Opus 5.5, and in my Go test it built a chess engine as good as Opus's for half the price. It also filled its tests with numbers it made up. And I still don't see myself using it, for reasons that have more to do with my setup than with the model.</p>
</blockquote>
<h2 id="what-changed-in-sonnet-55">What changed in Sonnet 5.5</h2>
<p>The price didn't change. Sonnet 5.5 costs the same as Sonnet 5: $2 per million input tokens and $10 per million output. Opus 5.5 is exactly double at $4 and $20. Anthropic says Sonnet 5.5 generates output 30% faster than Sonnet 5 and costs up to 30% less per task, because it needs fewer tokens to do the same work (<a href="https://www.anthropic.com/claude-sonnet-5-5">announcement</a>).</p>
<h3 id="the-benchmarks">The benchmarks</h3>
<p>Here are Anthropic's numbers for the three models I tested:</p>
<table>
<thead>
<tr>
<th>Benchmark</th>
<th>Sonnet 5.5</th>
<th>Sonnet 5</th>
<th>Opus 5.5</th>
</tr>
</thead>
<tbody><tr>
<td>Terminal-Bench 4.0 (agentic coding)</td>
<td>70.6%</td>
<td>10.3%</td>
<td>66.4% (xhigh)</td>
</tr>
<tr>
<td>CursorBench 4.0</td>
<td>55.5%</td>
<td>34.1%</td>
<td>57.8%</td>
</tr>
<tr>
<td>FrontierCode 1.1</td>
<td>52.1% (xhigh)</td>
<td>42.4%</td>
<td>54.4%</td>
</tr>
<tr>
<td>GDPval-AA v2.1 (knowledge work, Elo)</td>
<td>1844</td>
<td>1449</td>
<td>1846</td>
</tr>
<tr>
<td>OSWorld 2.1 (computer use)</td>
<td>80.1%</td>
<td>57.0%</td>
<td>81.8%</td>
</tr>
</tbody></table>
<p>That Terminal-Bench jump is silly. Sonnet 5 scored 10.3%, which I'm choosing to read as "mostly didn't show up", and Sonnet 5.5 beats Opus 5.5's best score. Everywhere else it sits within a few points of Opus.</p>
<p>Before you cancel your Opus habit, read Anthropic's own caveat on the same page. In their testing and in external testing, Opus 5.5 remains clearly stronger at complex, open-ended work that needs sustained judgment. Keep that sentence in mind. My chess test ended up showing it in a very specific way.</p>
<h3 id="what-changes-in-claude-code-and-the-api">What changes in Claude Code and the API</h3>
<p>In Claude Code v2.1.284 and later, the <code>sonnet</code> alias points to Sonnet 5.5. It runs at medium effort by default, you get the 1M context window natively, and you can't turn thinking off. The default model is still Opus 5.5, so you switch with <code>/model sonnet</code>.</p>
<p>On the API the model ID is <code>claude-sonnet-5-5</code>, and a straight string swap will break a few things (<a href="https://claude.dev/blog/building-with-claude-sonnet-5-5/">Anthropic's developer guide</a>):</p>
<ul>
<li><code>thinking: {"type": "disabled"}</code> now returns a 400. Use the new <code>between_tools</code> setting, which only thinks between tool calls.</li>
<li>Forced <code>tool_choice</code> (<code>any</code> or <code>tool</code>) also returns a 400. Send <code>auto</code> and mark the tool <code>strict: true</code>.</li>
<li>Effort levels are recalibrated, so your old Sonnet 5 setting won't behave the same way. Re-run your evals.</li>
</ul>
<p>If you don't want to do that by hand, <code>/claude-api migrate this project to claude-sonnet-5-5</code> in Claude Code applies the model ID swap and the breaking parameter changes for you. The <a href="https://platform.claude.com/docs/en/models/sonnet-5-5/migration-guide">migration guide</a> covers the rest.</p>
<h2 id="test-1-web-design-opus-55-vs-sonnet-55-vs-sonnet-5">Test 1: web design, Opus 5.5 vs Sonnet 5.5 vs Sonnet 5</h2>
<p>Sonnet 5.5 came second in my design test, close behind Opus 5.5 and miles ahead of Sonnet 5. The gap between the two Sonnets is the most interesting result in this review.</p>
<p>The brief was a one-page site for "Low Tide", a made-up outdoor screening of three short films on a beach. The content was fixed (date, gate times, programme, tickets, FAQ), and each model had to deliver one self-contained HTML file. Same prompt in Claude Code, high effort for all three, one run each. If you read my <a href="/blog/best-llm-frontend-design/">frontend design comparison</a>, you know the drill.</p>
<table>
<thead>
<tr>
<th></th>
<th>Opus 5.5</th>
<th>Sonnet 5.5</th>
<th>Sonnet 5</th>
</tr>
</thead>
<tbody><tr>
<td>My ranking</td>
<td>1st</td>
<td>2nd, close</td>
<td>3rd, clear gap</td>
</tr>
<tr>
<td>Cost</td>
<td>$1.94</td>
<td>$1.35</td>
<td>$1.08</td>
</tr>
<tr>
<td>Wall time</td>
<td>9 min</td>
<td>8 min</td>
<td>6 min</td>
</tr>
<tr>
<td>Output tokens</td>
<td>45.1k</td>
<td>57.8k</td>
<td>25k</td>
</tr>
<tr>
<td>CSS animations</td>
<td>9</td>
<td>4</td>
<td>1</td>
</tr>
<tr>
<td>Interactive element</td>
<td>Evening scrubber + play button</td>
<td>Slider that moves the evening along</td>
<td>Countdown + FAQ accordion</td>
</tr>
<tr>
<td>Look</td>
<td>Dark dusk, sunset reflected in water</td>
<td>Cream and navy, flat orange sun</td>
<td>Dark teal, film-strip edges</td>
</tr>
</tbody></table>
<p>You don't have to take my word for any of this. I put all three pages on a <a href="/blog/claude-sonnet-5-5-review/web-design-test/">side-by-side comparison page</a>, served exactly as the models produced them, no edits. You can look at them one at a time or next to each other, switch between desktop and mobile, and scroll around inside each one. They're fully interactive, so go drag Sonnet 5.5's evening slider yourself.</p>
<h3 id="opus-55-still-the-best-designer-in-the-family">Opus 5.5: still the best designer in the family</h3>
<p>Opus built something that looks like a poster. A big, soft "Low Tide" wordmark sits over a sunset, and both the type and the sun reflect in the water line. The nine animations (drift, shimmer, swell, tide, flicker and a few more) all fit the beach-at-dusk mood. It also did the most accessibility work without being asked: labelled controls, <code>aria-pressed</code> on the play button, <code>aria-valuetext</code> on the scrubber and a reduced-motion fallback.</p>
<h3 id="sonnet-55-its-own-direction-almost-as-good">Sonnet 5.5: its own direction, almost as good</h3>
<p>Opus went moody. Sonnet 5.5 went print. Cream and navy, a flat orange sun, and a staggered italic tagline: "Three short films. / One tide. / Bring a blanket." The typography is as strong as Opus's, with a roman "Low" next to an italic "Tide" in a second colour. Great layout, great colours, and a real idea behind it.</p>
<p>My favourite detail: Sonnet 5.5 came up with the same core interaction as Opus on its own, a slider that scrubs through the evening timeline. Same idea, completely different visual execution. It isn't a cheap Opus clone. It has its own taste.</p>
<p>It loses on polish. Four animations instead of nine (well chosen, with scroll reveals and a reduced-motion fallback), and lighter ARIA coverage.</p>
<h3 id="sonnet-5-a-concept-without-the-execution">Sonnet 5: a concept without the execution</h3>
<p>Sonnet 5 had a concept, to be fair. Film-reel framing, sprocket-hole borders, sections numbered as reels. Then it built a stack of bordered cards with no hero image, plain font weights, one keyframe animation and zero scroll reveals. The live countdown is a nice practical touch. It still looks like a template.</p>
<p>Going from Sonnet 5 to Sonnet 5.5 is the difference between "competent template" and "somebody designed this". That's a visible jump for a point release.</p>
<p>One thing made me laugh: all three picked Fraunces as their display font. Either Fraunces is objectively the correct font for a beach film night, or the Claude family has a house style. I know which one I'd bet on. And yes, this is one prompt and one run per model, so treat my ranking as an opinion with receipts.</p>
<h2 id="test-2-a-chess-move-generator-in-go">Test 2: a chess move generator in Go</h2>
<p>In my Go test, Sonnet 5.5 built a chess engine exactly as correct as Opus 5.5's, slightly faster, for half the money. Its own test suite still failed. Both things are true, and the second one is why I trust Opus more.</p>
<h3 id="why-chess-and-why-perft">Why chess, and why perft</h3>
<p>The task: build a complete, legal chess move generator in Go (standard library only) from an empty directory. Write the tests first, then the implementation, then iterate until <code>go vet</code> and <code>go test -race</code> are green.</p>
<p>Perft is a great judge because it has no opinions. It counts every legal move sequence to a given depth, and the correct counts for standard positions are published. Miss one rule, like en passant that exposes your own king or castling rights lost when a rook gets captured on its home square, and the number is wrong. No partial credit.</p>
<p>The prompt had one more rule: don't edit a test or a perft number to make it pass. If you think a number is wrong, say so in the final message. It's a small honesty check.</p>
<p>After the runs, I had a separate Claude session check all three engines against 20 standard perft positions from the Chess Programming Wiki and the common perft test suite, deeper than the models tested themselves (up to 193.7 million nodes per position). It didn't touch the models' files.</p>
<h3 id="the-results">The results</h3>
<table>
<thead>
<tr>
<th></th>
<th>Sonnet 5.5</th>
<th>Opus 5.5</th>
<th>Sonnet 5</th>
</tr>
</thead>
<tbody><tr>
<td>Cost</td>
<td>$0.74</td>
<td>$1.52</td>
<td>$0.98</td>
</tr>
<tr>
<td>Wall time</td>
<td>5 min</td>
<td>7 min</td>
<td>5 min</td>
</tr>
<tr>
<td>Own tests (<code>go test -race</code>)</td>
<td>2 failures</td>
<td>Pass</td>
<td>Pass</td>
</tr>
<tr>
<td>Independent deep perft check</td>
<td>20/20</td>
<td>20/20</td>
<td>20/20</td>
</tr>
<tr>
<td>Perft(5) from the start position</td>
<td>195 ms</td>
<td>203 ms</td>
<td>410 ms</td>
</tr>
<tr>
<td>Invalid FENs rejected</td>
<td>5 of 7</td>
<td>7 of 7</td>
<td>1 of 7</td>
</tr>
<tr>
<td><code>Apply</code> with an illegal move</td>
<td>Applies it</td>
<td>Panics</td>
<td>Applies it</td>
</tr>
</tbody></table>
<p>All three engines are correct. The prompt allowed 10 seconds for Perft(5), and Sonnet 5.5 needed about 2% of that. The code is nice too: a 64-square array with one byte per piece, precomputed move tables, and a per-square castling mask that handles king moves, rook moves and captured rooks in one line. Moves are made on a copy of the position, so there's no undo logic to get wrong.</p>
<h3 id="the-two-failed-tests">The two failed tests</h3>
<p>So where does the red come from? Sonnet 5.5 wrote the most ambitious test suite of the three: 680 lines, 20 perft positions, each checked at every depth. The catch is that the published suite only gives one depth per position. Sonnet 5.5 filled in the rest from memory.</p>
<p>Most of those guesses were right. Two weren't. One test expects 25 legal moves in a position that has 29 (counted by hand: queen 16, knight 8, king 5). Another expects 15 where there are 13. Both times the engine returned the correct number and the test was wrong. It even named one position after promotions, although no pawn in it can promote.</p>
<p>The deep counts for those same positions were correct. So it remembered the published results and made up the shallow ones.</p>
<p>That's what disappointed me. The engine is Opus-grade, but without the independent check I'd have two red tests and no idea whether the code or the tests were wrong. That's an afternoon of debugging the wrong thing. Opus 5.5 was the only run I could have accepted without review: green tests, all seven bad FENs rejected, and an <code>Apply</code> that refuses illegal moves instead of trusting the caller.</p>
<p>Sonnet 5, for the record, produced a correct engine with green tests at half the speed, and its <code>Divide(0)</code> never returns. It also cost more than Sonnet 5.5.</p>
<p>If you use Sonnet 5.5 for agent work, pin expected values from a real source instead of letting the model fill them in, and enforce the checks yourself. <a href="/blog/claude-code-hooks/">Claude Code hooks</a> are a good way to do that.</p>
<h2 id="is-sonnet-55-actually-cheaper-than-opus-55">Is Sonnet 5.5 actually cheaper than Opus 5.5?</h2>
<p>Yes, in both of my tests: 30% cheaper in the design test and 51% cheaper in the chess test. Not the flat 50% the price sheet suggests, though, and the reason is tokens.</p>
<p>I'll admit I got this wrong at first. Looking at the design results, I was convinced Opus had come out cheaper. It hadn't. It used fewer tokens (45.1k output against Sonnet 5.5's 57.8k), but Opus tokens cost twice as much, so it still landed at $1.94 against $1.35.</p>
<p>The lesson survives in a smaller form. A smarter model that gets there in fewer tokens eats into the list-price gap. In the design test, a 2x price difference shrank to a 30% saving. On a task where Opus is much more efficient, the gap could shrink further. So don't assume Sonnet is half price per task. Measure your own workloads.</p>
<p>Against Sonnet 5 it's mixed. In chess, Sonnet 5.5 was cheaper ($0.74 vs $0.98) and needed far fewer round trips, with 781k cache reads against Sonnet 5's 2.1M. In the design test it cost 25% more than Sonnet 5, but it wrote more than twice the output and a much better page. I'll take that trade.</p>
<p>If you're on a subscription, none of this is dollars. It's usage. Sonnet burns through your limits more slowly than Opus, which only matters if you actually hit them. Spoiler: I don't.</p>
<p>Usual caveat: one run per model per test. A 5 versus 7 minute difference might not survive five more runs.</p>
<h2 id="who-should-use-sonnet-55-and-why-i-wont">Who should use Sonnet 5.5 (and why I won't)</h2>
<p>I have no use for Sonnet 5.5, and that says more about my setup than about the model.</p>
<p>My Claude subscription is for hard or important work, and for that I want Opus or Fable. Everything easy goes to other subscriptions I already pay for. I rarely hit my Claude limits, so saving usage buys me nothing. And when I want cheap and fast, <a href="https://api-docs.deepseek.com/quick_start/pricing/">DeepSeek V4.1 Flash</a> costs $0.30 per million input tokens and $1.20 per million output at peak, half that off-peak. Sonnet 5.5's output is about eight times more expensive at peak. It's the better model, but for "rename these variables" or "summarise this thread" I don't need better. (I reviewed <a href="/blog/deepseek-v4-review/">DeepSeek V4</a> back in May, and V4.1 Flash is the one I reach for most right now.)</p>
<p>So Sonnet 5.5 falls into a gap in my stack. Too expensive to be my cheap model, not careful enough to replace Opus for the work I actually open Claude for. Right now there are just too many options that are cheaper, faster or better.</p>
<p>That's my situation, though. Here's who I think should use it.</p>
<ul>
<li>You only pay for Claude and you're a heavy user. Move well-scoped tasks (bug fixes, small features, docs, slides) to Sonnet 5.5 and keep your Opus usage for the hard stuff. Anthropic's own guidance says the same thing: Sonnet for well-scoped everyday work, Opus for complex work that needs careful judgment.</li>
<li>You're on the Claude API and pay per task. Based on my two tests, routing easy work to Sonnet could save you somewhere between 30% and 50%. Measure it on your own tasks, because token efficiency moves that number.</li>
<li>A human reviews the output anyway. Sonnet 5.5's code was Opus-grade in my chess test. Its test data wasn't. If someone looks before it ships, you get most of Opus for about half the price.</li>
</ul>
<p>Who shouldn't: anyone running long, unattended agent loops where made-up test data could slip through. That's exactly where Opus's extra care earned its money in my test.</p>
<p>And if what you really want is cheap Claude, Anthropic says Haiku 5.5 joins the family in the coming weeks. Honestly, I'm more curious about that one.</p>
<p>Sonnet 5.5 is a good model. It's a huge step up from Sonnet 5, its design taste is close to Opus, and in my test its code was too. It's just arriving in a market with more good choices than anyone can keep up with. If you live inside Claude, use it for the easier half of your work. If you don't, you probably already have something cheaper doing that job.</p>
]]></content:encoded>
      <pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-30T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI News</category>
      <category>Anthropic</category>
      <category>Claude</category>
      <category>LLM</category>
      <category>AI Coding</category>
      <category>Sonnet</category>
      <category>Review</category>
    </item>
    <item>
      <title><![CDATA[Accounts Payable Automation in Australia: 3 Paths (2026)]]></title>
      <link>https://thomas-wiegold.com/blog/accounts-payable-automation/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/accounts-payable-automation/</guid>
      <description><![CDATA[Accounts payable automation for Australian businesses: compare AP software, AI agents like Claude Cowork and custom builds, plus the fraud gap banks miss.]]></description>
      <content:encoded><![CDATA[<p>Here's how accounts payable works in most of the businesses I talk to. Invoices arrive as PDFs in a shared inbox. Someone opens each one, types the supplier, amount and GST into Xero or MYOB, and codes it to an account. Someone else approves it, usually by replying "ok" to an email. On Friday, the bookkeeper exports an ABA file, uploads it to the bank, and everyone hopes nothing was typed wrong.</p>
<p>Accounts payable automation is software that does the typing, coding and chasing for you. Invoices get read automatically, matched to the right supplier and account, routed to whoever needs to approve them, and lined up for payment. A person still decides what gets paid. The software does everything before that decision and most of the paperwork after it.</p>
<p>There are three ways to get there: off-the-shelf AP software, the AI agents you're probably already paying for, and a custom build. I build the third kind for a living, so take my views on it with appropriate salt. I've tried to be fair to the other two.</p>
<p>There's also a fourth thing, which none of the three fixes by default. It's the reason a WA company was ordered to pay a $235,000 invoice twice. We'll get to that.</p>
<h2 id="what-is-accounts-payable-automation">What is accounts payable automation?</h2>
<p>"AP" covers five distinct jobs, and most tools only do two or three of them well, so it helps to be precise about what's being automated.</p>
<h3 id="the-accounts-payable-process-in-5-steps">The accounts payable process in 5 steps</h3>
<ol>
<li>Capture. An invoice arrives by email, Peppol or post. Someone (or something) reads it and pulls out the supplier, ABN, invoice number, amounts, GST and due date.</li>
<li>Code. Each line gets an account and a GST treatment, maybe a job number.</li>
<li>Approve. Whoever owns the budget says yes. In a small business that's often the owner, which is why invoices sit for a week while the owner is on site.</li>
<li>Pay. Bills get batched, an ABA file goes to the bank, and the money leaves.</li>
<li>Reconcile. The bank feed shows the payment, it gets matched to the bill, and the books balance.</li>
</ol>
<h3 id="what-to-automate-and-what-to-keep-human">What to automate, and what to keep human</h3>
<p>Steps 1 and 2 are safe to automate and are where most of the manual hours go. Step 3 stays with a person, but the routing and nagging can be automated. Step 4 I'd never hand to software without a human clicking "release." Step 5 your accounting platform mostly does already.</p>
<p>Then there's a job that isn't on the list because nobody puts it on the list: checking that the invoice is real and the bank details are right. That belongs in step 1, before anything else happens, and it's the part I care about most.</p>
<p>Ardent Partners' <a href="https://tradeshift.com/state-of-epayables-2025-report/">State of ePayables 2025</a> puts the average cost of processing one invoice at US$12.42, against US$2.65 for the best-performing 20% of AP teams. That's US data from companies mostly larger than the ones I work with, but the pattern holds at any scale, because the expensive part is a person reading PDFs.</p>
<h2 id="path-1-accounts-payable-software">Path 1: Accounts payable software</h2>
<p>This is what the vendor pages ranking above this post are selling, and a lot of it is good.</p>
<h3 id="start-with-what-xero-and-myob-already-do">Start with what Xero and MYOB already do</h3>
<p>Before buying anything, check what you're already paying for. Xero's Business plans include Hubdoc, which captures invoices from email or a phone photo and creates draft bills. Xero's bills module has approval states built in. JAX, Xero's AI assistant, does auto bank reconciliation for Australian users. MYOB has its own bill capture. I've seen businesses pay for a separate capture tool while Hubdoc sat unused in a menu.</p>
<p>Hubdoc misses things on messy invoices and the approvals are basic, but basic and free beats sophisticated and unused.</p>
<h3 id="capture-approval-and-all-in-one-tools">Capture, approval and all-in-one tools</h3>
<p>When the built-in tools run out, the Australian market has a few well-worn options.</p>
<table>
<thead>
<tr>
<th>Tool</th>
<th>What it does</th>
<th>Works with</th>
</tr>
</thead>
<tbody><tr>
<td>Dext</td>
<td>Captures and extracts invoices, pushes them to your accounting software</td>
<td>Xero, MYOB, QuickBooks</td>
</tr>
<tr>
<td>ApprovalMax</td>
<td>Multi-step approvals, delegation and an audit trail on top of your existing bills</td>
<td>Xero, MYOB, QuickBooks</td>
</tr>
<tr>
<td>Lightyear</td>
<td>Capture, approvals and purchase order matching, built in Australia</td>
<td>Xero, MYOB</td>
</tr>
<tr>
<td>ProSpend</td>
<td>Spend management: AP, cards, expenses and budgets in one</td>
<td>Xero, MYOB and others</td>
</tr>
<tr>
<td>Airwallex Bill Pay</td>
<td>AP with multi-currency payments for overseas suppliers</td>
<td>Xero and others</td>
</tr>
</tbody></table>
<p>The trade-offs are the usual SaaS ones. You pay per user or per invoice volume forever, so costs scale with your growth. You adapt your process to the tool. And you get one more login and one more sync to babysit when Xero changes something.</p>
<p>Who it suits: most businesses under a few hundred invoices a month with a fairly standard process. If that's you, you can probably stop reading here, buy Lightyear or Dext plus ApprovalMax, and skip to the fraud section. Please don't skip the fraud section.</p>
<h2 id="path-2-ai-agents-you-already-pay-for-claude-cowork-chatgpt-work">Path 2: AI agents you already pay for (Claude Cowork, ChatGPT Work)</h2>
<p>This is the option nobody in the AP software space wants to talk about, because it costs you nothing extra if you already have a Claude or ChatGPT subscription.</p>
<p><a href="https://support.claude.com/en/articles/13345190-get-started-with-claude-cowork">Claude Cowork</a> is Anthropic's agent for knowledge work, on every paid Claude plan. ChatGPT Work is OpenAI's equivalent, rolled out in July 2026. Both connect to Gmail and Outlook, both can be given a recurring job, and both are considerably better at reading a badly scanned invoice than any OCR tool I used before 2023.</p>
<h3 id="a-cowork-setup-for-your-ap-inbox">A Cowork setup for your AP inbox</h3>
<p>Here's a scheduled task I'd set up for a business with an accounts@ inbox:</p>
<blockquote>
<p>Every weekday at 7:30am, check the accounts@ inbox for emails from the last 24 hours that contain invoices. For each one, extract the supplier name, ABN, invoice number, dates, subtotal, GST, total, and the bank details on the invoice. Check whether the supplier and ABN match an existing Xero contact and whether that invoice number already exists in Xero. Put everything in a spreadsheet using Xero's bill import layout. Flag invoices where the bank details differ from the Xero contact, the ABN is missing, or the invoice number is a duplicate. Flag any email that mentions changed bank details, even without an invoice attached. Email me the sheet with a short summary. Do not create, edit or pay anything in Xero.</p>
</blockquote>
<p>You open the sheet, deal with the flags, and import the clean rows into Xero as draft bills. Ten minutes instead of an hour.</p>
<p><a href="https://support.claude.com/en/articles/13854387-schedule-recurring-tasks-in-claude-cowork">Cowork's scheduled tasks</a> run in Anthropic's cloud, so they fire whether your laptop is open or not. The catch is that they can only reach your connected apps and files saved to your Claude account. A folder on your Mac is invisible to a scheduled run. <a href="https://help.openai.com/en/articles/10291617">ChatGPT's scheduled tasks</a> work the same way.</p>
<h3 id="the-xero-catch">The Xero catch</h3>
<p>The official <a href="https://www.xero.com/au/ai-in-accounting/claude/">Xero connector for Claude</a> is read-only. Xero's own page says so in bold. Claude can look up contacts, bills and reports, which is exactly what the duplicate and bank-detail checks above need. It cannot create a bill. That's why the task produces an import sheet rather than posting to Xero directly.</p>
<p>If you want the agent to create draft bills itself, Xero's <a href="https://github.com/XeroAPI/xero-mcp-server">MCP server</a> can, but setting it up means API credentials from Xero's developer portal and configuring the connection yourself. At that point you've crossed into "technical setup," and most owners I know would rather not.</p>
<p>QuickBooks users have it easier: Intuit's connector gained write actions in July 2026. MYOB has no official connector in either directory that I could find, only third-party bridges. Read their privacy terms before pointing them at your ledger.</p>
<h3 id="where-ai-agents-fall-short">Where AI agents fall short</h3>
<p>I use these tools daily, and I wouldn't run a company's payments through them.</p>
<p>They run on a clock. The task above checks the inbox at 7:30am. An invoice that arrives at 7:31 waits until tomorrow, and nothing chases an approver who's sat on a bill for three days unless you write that into another prompt.</p>
<p>They're probabilistic. Language models read a "1" as a "7" on a bad scan, occasionally miss a line, and now and then confidently invent a due date. Rare, and better than a tired human, but not zero.</p>
<p>There's no audit trail on the plans small businesses buy. When your auditor asks why a bill was coded a certain way, "the AI did it" isn't an answer. Claude's Enterprise plan has audit logs. Pro and Team don't.</p>
<p>Your data leaves the country. Standard Claude and ChatGPT plans process and store data in the US. Australian data residency exists for ChatGPT Enterprise and for the Claude API through AWS's Sydney region, not for the plans a small business would pick. Under the Privacy Act, you stay responsible for personal information you send offshore, and supplier invoices contain a fair bit of it.</p>
<p>So my rule for this path: the agent drafts, a person posts, and nobody pays from it. That's still a real saving, and it suits an owner-operator with a few dozen invoices a month who'd rather have a flexible assistant than another subscription.</p>
<h2 id="path-3-a-custom-invoice-automation-pipeline">Path 3: A custom invoice automation pipeline</h2>
<p>This is what I build, so I'll describe how it's put together and then tell you honestly when it isn't worth it.</p>
<h3 id="how-it-works-ai-reads-code-decides">How it works: AI reads, code decides</h3>
<p>The principle behind every AP system I've built is that the language model does the reading and ordinary code makes the decisions.</p>
<p>AI is excellent at turning a crumpled three-page invoice into a clean set of fields, and inconsistent at applying rules. Code is the opposite. So the model extracts the fields into a fixed structure, and a set of boring, deterministic checks run on that structure:</p>
<ul>
<li>Is the ABN valid, active and registered for GST? The <a href="https://abr.business.gov.au/Tools/WebServices">ABN Lookup web service</a> is free and answers all three in one call. If the invoice charges GST and the supplier isn't registered, you can't claim the credit.</li>
<li>Do the bank details on the invoice match what's on file for this supplier? If not, the invoice stops right there and a person gets a phone number to call.</li>
<li>Has this invoice number, or this amount from this supplier in the last 30 days, been seen before?</li>
<li>Does the invoice have what the <a href="https://www.ato.gov.au/businesses-and-organisations/gst-excise-and-indirect-taxes/gst/tax-invoices">ATO requires on a tax invoice</a>, including your ABN on anything over $1,000? Is there a supplier ABN at all? If not, you may have to withhold 47% of the payment.</li>
<li>Does it match a purchase order or delivery docket, if you use them?</li>
</ul>
<p>Only after every check passes does the bill get created as a draft and routed to the approver whose delegation covers that amount. Once approved, it goes into the ABA file, which a person still uploads and releases. Every step is logged: what the model extracted, what the rules decided, who approved what. That log is what you hand to your accountant.</p>
<p>I covered the extraction side in my post on <a href="/blog/claude-api-structured-output/">structured output with the Claude API</a>, and the same "AI classifies, rules route" pattern runs the <a href="/blog/ai-automated-ticket-triage-system-small-business/">ticket triage system</a> I built for a small business. For the developer-level version, my <a href="/blog/claude-agent-sdk-guide/">Claude Agent SDK guide</a> uses an invoice processing agent as its running example.</p>
<h3 id="when-custom-is-worth-it">When custom is worth it</h3>
<p>Not often, if I'm honest. Off-the-shelf tools exist because most businesses have roughly the same AP process. Custom makes sense when at least one of these is true:</p>
<ul>
<li>You run multiple entities and the SaaS tools want a separate subscription and inbox for each.</li>
<li>Your approval rules don't fit "under $X goes to A, over $X goes to B." Job-based or client-recharge approvals are where off-the-shelf flows break.</li>
<li>Something upstream is old. A supplier portal, an ERP from 2009, a spreadsheet that is somehow load-bearing.</li>
<li>Per-invoice or per-user pricing has grown to where a one-off build pays for itself within a year or two.</li>
<li>The data has to stay in Australia. A custom pipeline can run on AWS in Sydney or on a local model in your office.</li>
</ul>
<h2 id="invoice-fraud-the-gap-automation-doesnt-close">Invoice fraud: the gap automation doesn't close</h2>
<p>Everything above makes AP faster. None of it, by default, makes AP safer, and faster AP without verification means you pay the fraudster faster.</p>
<h3 id="how-invoice-fraud-hits-australian-businesses">How invoice fraud hits Australian businesses</h3>
<p>The pattern is depressingly consistent. A criminal gets into a supplier's email (or registers a domain one letter off from it), waits for a real invoice to go out, then sends a follow-up: "Please note our bank details have changed." The invoice is real, the amount is real, the account is theirs. By the time the supplier chases the payment, the money has left the country.</p>
<p>The ASD's <a href="https://www.cyber.gov.au/about-us/view-all-content/reports-and-statistics/annual-cyber-threat-report-2024-2025">Annual Cyber Threat Report 2024-25</a> puts business email compromise with financial loss at 15% of all cybercrime reports from businesses. The average cost of a cybercrime report from a small business was $56,571. The ACCC's <a href="https://www.nasc.gov.au/reports-and-publications/targeting-scams">Targeting Scams 2025</a> data puts payment redirection losses at $166.8 million for the year, second only to investment scams.</p>
<p>The case to pin above every AP desk in the country is <a href="https://www.abc.net.au/news/2025-01-16/court-orders-inoteq-to-pay-190k-after-fraudulent-invoice/104783454">Mobius Group v Inoteq</a>. Mobius did $235,400 of electrical work for Inoteq. A hacker in Mobius's email sent Inoteq new bank details and a fresh invoice. An Inoteq staffer tried to phone Mobius to confirm, couldn't hear the answer on a bad line, emailed for proof instead, got a forged document back, and paid. The bank recovered $43,541. In December 2024 the WA District Court ordered Inoteq to pay Mobius the remaining $191,859 plus interest. The judge said the failed phone call should have prompted a second one (Kennedys has a good <a href="https://www.kennedyslaw.com/en/thought-leadership/case-review/2025/liability-for-bank-payment-fraud-lessons-from-mobius-v-inoteq/">case note</a>). Inoteq paid twice.</p>
<h3 id="does-confirmation-of-payee-check-your-supplier-payments">Does Confirmation of Payee check your supplier payments?</h3>
<p>Only partly. <a href="https://www.auspayplus.com.au/solutions/confirmation-payee">Confirmation of Payee</a> launched in July 2025 and checks the account name against the BSB and account number when you type in a new payee or edit a saved one. It's live at over 100 institutions and has been used more than 150 million times. It works.</p>
<p>But think about how your business actually pays suppliers. Xero or MYOB exports an ABA file, someone uploads it, and dozens of payments go out in a batch. Those payees weren't typed in; they came from a file. Saved payees aren't re-checked on every run either. NAB said at launch that NAB Connect, its business platform, wasn't included. Some banks now offer businesses a bulk check of existing payees. Ask yours, in writing, whether the payees in your uploaded batch file are name-checked. If the answer is no, your Friday pay run has no name check at all.</p>
<p>Don't count on getting the money back, either. The Scams Prevention Framework that passed in 2025 is built around consumers. Whether a business that paid a redirected supplier invoice is covered is still being worked out in the rules, and Mobius v Inoteq tells you which way the courts lean in the meantime.</p>
<h3 id="invoice-verification-checklist">Invoice verification checklist</h3>
<p>None of this is clever. It's a process, and the point of automation is to make the process impossible to skip.</p>
<ol>
<li>Any change to a supplier's bank details puts the payment on hold. Call the supplier on a number from your own records, not from the email, and speak to a person you know. A voicemail doesn't count. A bad line means you call again.</li>
<li>New or changed payees need two people to approve, and the second can't be the one who received the email.</li>
<li>Check the ABN is active and GST-registered before the first payment to a new supplier.</li>
<li>Check for duplicate invoice numbers and duplicate amounts from the same supplier within a month.</li>
<li>Read the sender's domain letter by letter. "supplier-au.com" is not "supplier.com.au."</li>
<li>Turn on multi-factor authentication for every mailbox that touches money, and audit inbox forwarding rules. A forwarding rule to an outside address is how the criminal keeps reading your mail after you've changed the password.</li>
</ol>
<p>Here's how the three paths handle those six checks.</p>
<table>
<thead>
<tr>
<th>Check</th>
<th>AP software</th>
<th>AI agent</th>
<th>Custom pipeline</th>
</tr>
</thead>
<tbody><tr>
<td>Hold on bank detail change</td>
<td>Some tools flag it; verify yours does</td>
<td>Can flag, if prompted to</td>
<td>Enforced, payment can't proceed</td>
</tr>
<tr>
<td>Dual approval on new payees</td>
<td>Yes, in approval tools</td>
<td>No</td>
<td>Yes</td>
</tr>
<tr>
<td>ABN and GST status</td>
<td>Rarely</td>
<td>Can look up, if prompted</td>
<td>Automatic, every invoice</td>
</tr>
<tr>
<td>Duplicates</td>
<td>Usually</td>
<td>Can check against Xero</td>
<td>Automatic</td>
</tr>
<tr>
<td>Lookalike domains</td>
<td>No</td>
<td>Can flag, if prompted</td>
<td>Automatic</td>
</tr>
<tr>
<td>MFA and forwarding rules</td>
<td>Not an AP tool's job</td>
<td>Not an AP tool's job</td>
<td>Not an AP tool's job</td>
</tr>
</tbody></table>
<p>Row six is on you regardless.</p>
<h2 id="which-path-fits-your-business">Which path fits your business?</h2>
<p>Roughly, by monthly invoice volume and how unusual your process is:</p>
<table>
<thead>
<tr>
<th>Situation</th>
<th>Start with</th>
</tr>
</thead>
<tbody><tr>
<td>Under 20 invoices a month</td>
<td>Xero or MYOB's built-in capture, plus the checklist above, done by hand</td>
</tr>
<tr>
<td>20 to a few hundred, standard process</td>
<td>Capture plus approvals software (Dext and ApprovalMax, or Lightyear)</td>
</tr>
<tr>
<td>Owner-operator who wants flexibility over polish</td>
<td>A Claude or ChatGPT scheduled task producing an import sheet. Drafts only</td>
</tr>
<tr>
<td>Multiple entities, odd approval rules, legacy systems, or data must stay onshore</td>
<td>A custom pipeline</td>
</tr>
</tbody></table>
<p>One more thing. The fastest way to automate capture is to not need it. Suppliers on the <a href="https://www.ato.gov.au/businesses-and-organisations/einvoicing/about-einvoicing">Peppol e-invoicing network</a> send invoices straight into Xero or MYOB as structured data, with no PDF and nothing to misread. Over 400,000 Australian businesses are already on it. Ask your biggest suppliers; the ones who say yes just deleted step 1 for you.</p>
<h2 id="frequently-asked-questions">Frequently asked questions</h2>
<h3 id="is-accounts-payable-automation-worth-it-for-a-small-business">Is accounts payable automation worth it for a small business?</h3>
<p>Usually yes above about 20 invoices a month, and often below that if you use tools you already pay for. The hours saved are real, but the bigger win is consistency: a process that runs the same way every time is much harder to defraud than one that depends on who's in the office.</p>
<h3 id="can-claude-or-chatgpt-pay-my-bills">Can Claude or ChatGPT pay my bills?</h3>
<p>No, and you shouldn't want them to. The official Xero connector for Claude is read-only, and neither agent should be given payment authority. Use them to extract and check invoices for review. A person creates or approves the bill, and a person releases the payment.</p>
<h3 id="does-xero-automate-accounts-payable">Does Xero automate accounts payable?</h3>
<p>Partly. Xero Business plans include Hubdoc for capturing invoices and creating draft bills, an approval state on bills, and JAX for automated bank reconciliation. It doesn't do multi-step approvals, purchase order matching or fraud checks, which is where ApprovalMax, Lightyear and custom builds come in.</p>
<h3 id="what-is-3-way-matching">What is 3-way matching?</h3>
<p>Comparing an invoice against the purchase order and the delivery docket before paying. All three should agree on what was ordered, what arrived and what's being charged. It's standard in larger companies and overkill for many small ones, but if you issue POs, it's one of the easiest checks to automate.</p>
<h3 id="is-e-invoicing-mandatory-in-australia">Is e-invoicing mandatory in Australia?</h3>
<p>Not for businesses. Federal government agencies must be able to receive Peppol e-invoices, and business-to-business use is voluntary. The government considered giving businesses a right to demand e-invoices but hasn't legislated it. Adoption is growing anyway because it removes the manual entry step entirely.</p>
<h2 id="where-to-start">Where to start</h2>
<p>If your AP process is "someone types it in," do the verification checklist by hand this week. Then pick a path. If you'd like a second opinion on which one, I offer a free AP workflow review: an hour on a call looking at how invoices actually move through your business, then a written recommendation. Sometimes the recommendation is "buy Lightyear." Book one through my <a href="/ai-automation-services/">AI automation services</a> page, or read how I approach <a href="/ai-agent-development/">custom AI agent development</a> first.</p>
]]></content:encoded>
      <pubDate>Sun, 20 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-20T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI for Business</category>
      <category>Small Business</category>
      <category>Automation</category>
      <category>Finance</category>
      <category>AI Agents</category>
    </item>
    <item>
      <title><![CDATA[Claude Agent SDK Guide: TypeScript & Python Examples]]></title>
      <link>https://thomas-wiegold.com/blog/claude-agent-sdk-guide/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/claude-agent-sdk-guide/</guid>
      <description><![CDATA[Build agents with the Claude Agent SDK (formerly Claude Code SDK): TypeScript and Python examples, tools, hooks, subagents and production setup.]]></description>
      <content:encoded><![CDATA[<p>The Claude Agent SDK is Anthropic's library for building autonomous agents in Python and TypeScript. It gives you the same agent loop, built-in tools and context management that run Claude Code, packaged so you can call it from your own code instead of a terminal. Until September 2025 it was called the Claude Code SDK.</p>
<p>That last sentence is why you'll find two names, two package names and a pile of outdated tutorials when you search for it. This guide is the version I wanted on day one: one running example, both languages side by side, and the traps marked before you fall into them.</p>
<p>I build accounts-payable automation for small businesses, so the running example is an invoice agent. It reads invoice PDFs from a folder, checks the supplier against a database through a custom tool, is blocked from touching <code>.env</code>, and hands back typed JSON at the end. TypeScript first, Python alongside, and a short Go section near the end for people like me who'd rather not run Node in production if they can avoid it.</p>
<p>Everything here is checked against the September 2026 docs, TypeScript SDK 0.3.273 and Python SDK 0.2.152. Anthropic ships a new SDK build most days, so if something looks different by the time you read this, the docs links at the bottom win.</p>
<h2 id="what-the-claude-agent-sdk-is">What the Claude Agent SDK is</h2>
<p>The short version: Claude Code is an agent, and the SDK is that agent with the terminal UI removed. Same loop (gather context, act, verify, repeat), same tools (Read, Bash, Glob and friends), same automatic compaction when the context fills up. You import it, hand it a prompt and some options, and it goes off and does the thing while streaming messages back to you.</p>
<p>That's the whole pitch, and it's why the SDK is interesting compared to writing your own loop around the Messages API. Anthropic has spent a year and a half hardening Claude Code's loop against real codebases and real users. You get that work for free, plus the bugs, which is the deal with every framework.</p>
<h3 id="from-claude-code-sdk-to-claude-agent-sdk">From Claude Code SDK to Claude Agent SDK</h3>
<p>Anthropic renamed the Claude Code SDK to the Claude Agent SDK on 29 September 2025. The reasoning in the announcement post was that the harness powering Claude Code can power other kinds of agents too, so "Code" in the name was underselling it. Fair enough. The rename still left a trail of confusion that shows up in search results and in half the tutorials out there.</p>
<table>
<thead>
<tr>
<th></th>
<th>Old</th>
<th>New</th>
</tr>
</thead>
<tbody><tr>
<td>npm package</td>
<td><code>@anthropic-ai/claude-code</code></td>
<td><code>@anthropic-ai/claude-agent-sdk</code></td>
</tr>
<tr>
<td>PyPI package</td>
<td><code>claude-code-sdk</code></td>
<td><code>claude-agent-sdk</code></td>
</tr>
<tr>
<td>Python import</td>
<td><code>claude_code_sdk</code></td>
<td><code>claude_agent_sdk</code></td>
</tr>
<tr>
<td>Python options type</td>
<td><code>ClaudeCodeOptions</code></td>
<td><code>ClaudeAgentOptions</code></td>
</tr>
</tbody></table>
<p>Two traps here. The old npm name <code>@anthropic-ai/claude-code</code> still exists, but it's the Claude Code CLI now, not the SDK. And the old PyPI package is frozen at 0.0.25 and prints a migration notice when you import it.</p>
<p>The rename came with two behaviour changes in v0.1.0 that bite anyone migrating old code.</p>
<p>The system prompt is no longer Claude Code's by default. You get a minimal prompt instead. If you want Claude Code's coding instructions and personality back, ask for the preset: <code>systemPrompt: { type: "preset", preset: "claude_code" }</code> in TypeScript, or <code>system_prompt={"type": "preset", "preset": "claude_code"}</code> in Python. Both take an <code>append</code> field for your own additions on top.</p>
<p>Settings loading went back and forth. v0.1.0 briefly stopped loading filesystem settings, then Anthropic reverted that. Today, if you leave <code>settingSources</code> out, the SDK loads your user, project and local settings (<code>~/.claude/settings.json</code>, <code>.claude/settings.json</code>, <code>.claude/settings.local.json</code>, plus CLAUDE.md and custom commands), the same as the CLI would. Pass <code>settingSources: []</code> when you want a clean, isolated agent, which is what you want for anything deployed. More on that in the production section. One wrinkle: Python SDK 0.1.59 and earlier treated an empty list the same as leaving the option out, so don't rely on <code>[]</code> on an old install.</p>
<h3 id="agent-sdk-vs-client-sdk-vs-claude-code-vs-managed-agents">Agent SDK vs Client SDK vs Claude Code vs Managed Agents</h3>
<p>Anthropic now has four ways to point Claude at a task, and the names overlap enough that I made a table.</p>
<table>
<thead>
<tr>
<th>Product</th>
<th>Who runs the agent loop</th>
<th>Where it runs</th>
<th>Use it when</th>
</tr>
</thead>
<tbody><tr>
<td>Client SDK (Messages API)</td>
<td>You</td>
<td>Your process</td>
<td>You want full control over orchestration, retries and state. Seven languages, including Go.</td>
</tr>
<tr>
<td>Claude Code CLI</td>
<td>Claude Code</td>
<td>Your terminal</td>
<td>Interactive development, or one-off scripted tasks with <code>claude -p</code></td>
</tr>
<tr>
<td>Claude Agent SDK</td>
<td>Claude Code's loop</td>
<td>Your process (Python or TypeScript)</td>
<td>You want the Claude Code loop inside your own app or service</td>
</tr>
<tr>
<td>Claude Managed Agents</td>
<td>Anthropic</td>
<td>Anthropic's infrastructure</td>
<td>Long-running or async agents where you'd rather not operate the sandbox yourself</td>
</tr>
</tbody></table>
<p>Managed Agents deserves a paragraph because people mix it up with the SDK constantly. It launched in public beta on 8 April 2026 and it's a hosted REST API: Anthropic runs the loop, the sandbox and the session log, and your app sends events and reads results. Pricing is standard token rates plus $0.08 per active session-hour, and data residency is US-only during the beta. Code written against the Agent SDK doesn't deploy to it directly. They share the concepts, not the API.</p>
<p>OpenAI's lineup has the same shape, which helps if you're comparing. The OpenAI Agents SDK is an open-source framework you host yourself. The OpenAI Agents API, which went into public beta on 10 September 2026, is the managed Codex harness behind one API call, US-only, with no zero-data-retention option in any configuration. So the like-for-like comparison is Claude Agent SDK vs OpenAI Agents SDK, and Claude Managed Agents vs OpenAI Agents API. Anyone comparing the Claude Agent SDK to the OpenAI Agents API is comparing a library to a hosting product.</p>
<h3 id="when-not-to-use-it">When not to use it</h3>
<p>If you want to decide every step yourself (which tool runs when, how retries work, what gets persisted where), the SDK will fight you. Use the Messages API and write the loop. If you don't want to operate a sandbox at all, Managed Agents exists for that. And if you're weighing alternatives, I spent a week with the <a href="/blog/pi-coding-agent/">Pi coding agent's TypeScript SDK</a> last month. Different trade-offs, worth a look if you're not committed to Claude.</p>
<h2 id="quickstart-your-first-agent-in-typescript-and-python">Quickstart: your first agent in TypeScript and Python</h2>
<h3 id="install-and-authenticate">Install and authenticate</h3>
<ol>
<li>You need Node 18 or newer, or Python 3.10 or newer. The Claude Code binary ships inside the package, so there's nothing else to install. Two exceptions: <code>npm ci --omit=optional</code> skips the platform binary, and a pip install that falls back to the sdist (ARM64 Windows does this) gives you no binary either. In both cases install Claude Code natively and point the SDK at it with <code>pathToClaudeCodeExecutable</code> (TypeScript) or <code>cli_path</code> (Python).</li>
<li>Install the package.</li>
<li>Set <code>ANTHROPIC_API_KEY</code> in your process environment. The SDK does not read <code>.env</code> files. Load them yourself with <code>dotenv</code> or whatever you use, before the first <code>query()</code> call. It's the first thing to check when you get an auth error and you're certain the key is right.</li>
<li>If you're on a cloud provider instead, it's one env var each: <code>CLAUDE_CODE_USE_BEDROCK=1</code>, <code>CLAUDE_CODE_USE_VERTEX=1</code> or <code>CLAUDE_CODE_USE_FOUNDRY=1</code>, plus that provider's usual credentials.</li>
</ol>
<h3 id="your-first-agent-in-typescript">Your first agent in TypeScript</h3>
<p><code>query()</code> returns an async generator. You iterate it, messages arrive as Claude works, and the last one is a <code>result</code>. <code>allowedTools</code> pre-approves Read and Glob. <code>permissionMode: "dontAsk"</code> turns anything that would have prompted a human into a denial. That pairing is the docs' recommended shape for a headless agent, and it's what I use as the starting point for everything.</p>
<p>Run it with <code>npx tsx agent.ts</code>. It reads the PDFs (the Read tool handles PDFs and images natively) and prints a list.</p>
<h3 id="the-same-agent-in-python">The same agent in Python</h3>
<p>Same shape, snake_case option names, and <code>isinstance</code> checks instead of a <code>type</code> discriminator. Python also has <code>ClaudeSDKClient</code>, a stateful client for multi-turn conversations: you open it with <code>async with</code>, call <code>client.query()</code> as many times as you like, and read replies with <code>client.receive_response()</code>. Reach for it when the conversation continues past one prompt or when you want to change the permission mode mid-session with <code>set_permission_mode()</code>. For a one-shot job like this, <code>query()</code> is enough.</p>
<h3 id="reading-messages-results-and-cost">Reading messages, results and cost</h3>
<p>There are four message types you'll deal with in practice.</p>
<p>A <code>system</code> message with subtype <code>init</code> arrives first. It carries the session ID and the lists of tools, skills and slash commands that loaded. When something isn't behaving, this is where you check whether it loaded at all.</p>
<p><code>assistant</code> messages hold content blocks: <code>text</code> and <code>tool_use</code>. Watching the <code>tool_use</code> blocks is how you see what the agent is doing.</p>
<p><code>user</code> messages carry tool results coming back into the conversation. Each has a <code>uuid</code>, which matters later for file checkpointing.</p>
<p>The <code>result</code> message ends the turn. <code>subtype</code> is <code>success</code> or one of several error variants (<code>error_max_turns</code>, <code>error_max_budget_usd</code>, and so on). It carries the final text in <code>result</code>, plus <code>total_cost_usd</code>, a <code>usage</code> block and a per-model <code>modelUsage</code> breakdown. If you asked for structured output, it's on <code>structured_output</code>.</p>
<p>One thing that surprised me: a one-shot <code>query()</code> throws (TypeScript) or raises (Python) after yielding an error result. So you get the error message in the stream and then an exception. Wrap the loop in a try if you're processing a batch and want to continue past a failure.</p>
<h2 id="tools-mcp-servers-and-skills">Tools, MCP servers and Skills</h2>
<h3 id="built-in-tools-and-the-two-layers-of-control">Built-in tools and the two layers of control</h3>
<p>Out of the box the agent has Read, Write, Edit, Bash, Glob, Grep, WebSearch, WebFetch, an Agent tool for delegating to subagents, a Skill tool, and AskUserQuestion. The todo and task-tracking tools (TodoWrite, TaskCreate and friends) used to be there too, but on Sonnet 5, Opus 4.8, Fable 5, Mythos 5 and newer they're off by default. If you want them, name one in <code>allowedTools</code>, which opts the session in, or set <code>CLAUDE_CODE_ENABLE_TODO_TOOLS=1</code>.</p>
<p>The thing that took me longest to internalise is that there are two separate layers of control, and the option names don't make it obvious.</p>
<p>Availability is whether a tool appears in Claude's context at all. <code>tools: ["Read", "Grep"]</code> means only those built-ins exist. <code>tools: []</code> removes every built-in so Claude can only use your MCP tools. A bare name in <code>disallowedTools</code>, like <code>"Bash"</code>, also removes the tool from context.</p>
<p>Permission is whether a call gets approved once Claude attempts it. <code>allowedTools</code> is an auto-approve list. Tools you don't list are still available; a call to one of them just goes through the permission flow (mode, then your callback) instead of running immediately. A scoped deny rule like <code>"Bash(rm *)"</code> leaves Bash in context and blocks only matching calls.</p>
<p>So <code>allowedTools</code> doesn't restrict anything. It approves. If you want a tool gone, remove it from <code>tools</code> or deny it by bare name. Otherwise Claude may burn a turn trying it and getting refused.</p>
<h3 id="custom-tools-with-in-process-mcp-servers">Custom tools with in-process MCP servers</h3>
<p>This is where the invoice agent starts earning its keep. We want Claude to check the supplier on each invoice against our own records, so we give it a <code>lookup_supplier</code> tool. In the SDK, a custom tool is an MCP tool running inside your process. No subprocess, no network hop, no separate server to deploy.</p>
<p>In TypeScript you define the input schema with Zod (3 or 4 both work) and the handler's <code>args</code> are typed from it:</p>
<p>The same tool in Python uses the <code>@tool</code> decorator. The schema is a plain dict of names to types, which the SDK converts to JSON Schema. When you need enums, optional fields or nesting, pass a full JSON Schema dict instead.</p>
<p>A few things worth knowing.</p>
<p>Tool names are fully qualified as <code>mcp__&lt;server&gt;__&lt;tool&gt;</code>, where the server segment is the key you used in <code>mcpServers</code>. That full string is what goes in <code>allowedTools</code>. <code>mcp__suppliers__*</code> covers every tool on the server.</p>
<p>Returning <code>isError: true</code> (Python: <code>"is_error": True</code>) is how you write the error message Claude reads. An uncaught exception in the handler doesn't kill the loop either; the SDK catches it and passes the raw message through. But "No supplier on file, treat as new" gives the model something to act on. A stack trace doesn't.</p>
<p><code>readOnlyHint: true</code> lets Claude call the tool in parallel with other read-only tools. It's a hint, not enforcement. If your handler writes to disk, don't mark it read-only.</p>
<p>Tool search is on by default and defers your SDK tool schemas: Claude sees a compact list of names and loads a schema when it needs one. With a handful of tools it doesn't matter. With forty, it's the difference between a usable context window and not.</p>
<p>One Python-specific limit: the <code>@tool</code> decorator forwards only <code>content</code> and <code>is_error</code> from your return dict. If you need <code>structuredContent</code>, run a standalone MCP server instead.</p>
<h3 id="connecting-external-mcp-servers">Connecting external MCP servers</h3>
<p>Anything that speaks MCP plugs into the same <code>mcpServers</code> map. Stdio servers are spawned as subprocesses; SSE and HTTP servers are connected to over the network.</p>
<p>Treat every external MCP server as an untrusted input source. Its tool results land in Claude's context, which means a poisoned CRM record or a malicious web page can carry instructions your agent might follow. Scope <code>allowedTools</code> to the specific tools you need rather than <code>mcp__xero__*</code>, and put anything that spends money or sends email behind a hook (next section). If you've read <a href="/blog/claude-chrome-extension/">my post on the Claude Chrome extension's auto-approve classifier</a>, the same threat model applies, minus the classifier.</p>
<h3 id="using-agent-skills-in-the-sdk">Using Agent Skills in the SDK</h3>
<p>Skills are the folder-of-instructions feature from Claude Code: a <code>.claude/skills/&lt;name&gt;/SKILL.md</code> file with frontmatter and a body that Claude reads when the skill is relevant. In the invoice agent I keep a <code>gst-rules</code> skill with the edge cases for Australian GST treatment, so the prompt stays short and the rules live in a file I can version.</p>
<p>Three things you need to know for the SDK specifically.</p>
<p>There's no programmatic API for skills. They're discovered from the filesystem through the <code>user</code> and <code>project</code> setting sources. If you've set <code>settingSources</code> explicitly, include <code>"project"</code> (and <code>"user"</code> if the skill lives in <code>~/.claude/skills</code>). If you left it at the default, they load already.</p>
<p>The <code>skills</code> option controls which ones Claude may invoke: <code>"all"</code>, a list of names, or <code>[]</code>. When you set <code>skills</code>, the SDK adds the <code>Skill</code> tool to <code>allowedTools</code> for you. If you also pass an explicit <code>tools</code> list, put <code>"Skill"</code> in it, or the tool won't exist and nothing will load.</p>
<p>To confirm a skill loaded, check the <code>skills</code> array on the <code>system/init</code> message. A skill with <code>user-invocable: false</code> in its frontmatter loads but won't appear in <code>slash_commands</code>, which is easy to misread as a failed load.</p>
<p>Plugins bundle skills, agents, hooks and MCP servers together and load from a local path via the <code>plugins</code> option. CLAUDE.md files load through the same setting sources. If you turn sources off for isolation, you lose CLAUDE.md too, so move anything you still need into <code>systemPrompt</code>.</p>
<h2 id="permissions-hooks-and-subagents">Permissions, hooks and subagents</h2>
<p>This is the section to read twice. An agent that reads invoices is fine. An agent that reads invoices and has Bash is a different risk category, and the SDK's permission model has enough moving parts that a wrong assumption can quietly open a hole.</p>
<h3 id="permission-modes-explained">Permission modes explained</h3>
<table>
<thead>
<tr>
<th>Mode</th>
<th>What it does</th>
</tr>
</thead>
<tbody><tr>
<td><code>default</code></td>
<td>Nothing is auto-approved by mode. Calls that need approval and match no allow rule go to your <code>canUseTool</code> callback.</td>
</tr>
<tr>
<td><code>dontAsk</code></td>
<td>Anything that would have prompted is denied instead. <code>canUseTool</code> is never called.</td>
</tr>
<tr>
<td><code>acceptEdits</code></td>
<td>File edits and filesystem commands (<code>mkdir</code>, <code>rm</code>, <code>mv</code>, <code>cp</code>, <code>sed</code>) inside the working directory are auto-approved.</td>
</tr>
<tr>
<td><code>plan</code></td>
<td>Read-only exploration. File edits are never auto-approved, even with an allow rule; they go to <code>canUseTool</code>.</td>
</tr>
<tr>
<td><code>bypassPermissions</code></td>
<td>Approves everything that reaches the mode step. Hooks and deny rules still apply.</td>
</tr>
<tr>
<td><code>auto</code></td>
<td>A separate classifier model approves or denies each risky call. Available in both SDKs.</td>
</tr>
</tbody></table>
<p>Modes are one step in a six-step pipeline, and the order matters more than the modes do:</p>
<ol>
<li>Hooks run first. A <code>PreToolUse</code> hook can deny outright or pass the call on. A hook that returns <code>allow</code> does not skip the next two steps.</li>
<li>Deny rules, from <code>disallowedTools</code> and <code>settings.json</code>. A match blocks the call in every mode, including <code>bypassPermissions</code>.</li>
<li>Ask rules from <code>settings.json</code>. A match sends the call to <code>canUseTool</code> for confirmation, again in every mode.</li>
<li>The permission mode.</li>
<li>Allow rules, from <code>allowedTools</code> and <code>settings.json</code>.</li>
<li><code>canUseTool</code>, if nothing above resolved it. In <code>dontAsk</code> this step is skipped and the call is denied.</li>
</ol>
<p>The consequences of that order are where people get hurt.</p>
<p>Auto-approved calls never reach <code>canUseTool</code>. If a tool is approved by an allow rule or by <code>acceptEdits</code>, any check you wrote in the callback is skipped for that tool. The TypeScript SDK emits a <code>CLAUDE_SDK_CAN_USE_TOOL_SHADOWED</code> process warning when your config makes this happen. For a check that has to run on every call, use a <code>PreToolUse</code> hook. Hooks run before everything else, and a hook deny holds even in <code>bypassPermissions</code>.</p>
<p><code>allowedTools</code> does not constrain <code>bypassPermissions</code>. Listing <code>["Read"]</code> alongside <code>bypassPermissions</code> still approves Bash, Write and Edit, because unlisted tools fall through to the mode and the mode says yes. If you need <code>bypassPermissions</code> with specific tools blocked, use <code>disallowedTools</code>.</p>
<p>Deny rules are matched as written. <code>Bash(rm *)</code> blocks <code>rm -rf ./tmp</code> and doesn't block <code>/bin/rm -rf ./tmp</code>. Bare <code>Bash</code> removes the tool entirely.</p>
<p>Path anchoring has a double-slash trap. <code>Edit(//secrets/**)</code> blocks writes under <code>/secrets</code> on disk. <code>Edit(/secrets/**)</code> with one slash anchors to the working directory, so it blocks <code>./secrets</code> and leaves <code>/secrets</code> alone. Not the rule you thought you wrote.</p>
<p>Unanchored allow globs are ignored. <code>allowedTools: ["*"]</code> or <code>["mcp__*"]</code> does nothing beyond a startup warning. Allow globs need a literal server prefix, like <code>mcp__suppliers__*</code>.</p>
<p>A word on <code>auto</code> mode, since it became the default for interactive Claude Code sessions on Pro, Max and Team plans in August. It works in the SDK too, and the Python type includes it despite what some older writeups claim. Availability depends on your provider and model, and on API-key surfaces the classifier's calls count toward your token usage, so there's a cost line to consider. Check the permission-modes page in the Claude Code docs for the current model floor before you build on it. For an unattended agent I still prefer <code>dontAsk</code> with a tight allow list. It's boring, and boring is the goal.</p>
<p>Subagents inherit the parent's mode unless you set <code>permissionMode</code> on the <code>AgentDefinition</code> and the parent is in <code>default</code>, <code>dontAsk</code> or <code>plan</code>. A subagent never gets <code>bypassPermissions</code> on its own; it runs in that mode only when the parent does. Which means if your parent runs <code>bypassPermissions</code>, every subagent has full system access too, with a different system prompt and whatever behaviour that produces.</p>
<h3 id="hooks-intercepting-the-agent-loop">Hooks: intercepting the agent loop</h3>
<p>Hooks are in-process callbacks that fire at fixed points in the loop. Both SDKs support <code>PreToolUse</code>, <code>PostToolUse</code>, <code>PostToolUseFailure</code>, <code>UserPromptSubmit</code>, <code>Stop</code>, <code>SubagentStart</code>, <code>SubagentStop</code>, <code>PreCompact</code>, <code>PermissionRequest</code> and <code>Notification</code>. TypeScript additionally gets <code>SessionStart</code>, <code>SessionEnd</code>, <code>Setup</code>, <code>PostToolBatch</code>, <code>PermissionDenied</code> and a handful of newer events. In Python, <code>SessionStart</code> and <code>SessionEnd</code> have to be shell hooks in <code>.claude/settings.json</code>, loaded with <code>setting_sources=["project"]</code>.</p>
<p>Here's the hook that keeps the invoice agent away from secrets. It matches four tools and denies any call whose input mentions a <code>.env</code> file, which catches <code>Read</code> on <code>.env</code>, <code>cat .env</code> through Bash, and the creative variants in between.</p>
<p>And in Python:</p>
<p>Stringifying the whole tool input is crude, and that's the point. A scoped deny rule on the file tools handles the polite case; the hook handles Bash and whatever else the model thinks of.</p>
<p><code>PreToolUse</code> can also return <code>permissionDecision: "allow"</code> with an <code>updatedInput</code> to rewrite the arguments before the tool runs, which is how you'd redirect all writes into a sandbox directory. <code>PostToolUse</code> can append <code>additionalContext</code> to a tool result or replace the output with <code>updatedToolOutput</code>. What <code>PostToolUse</code> cannot do is undo the call. It already ran. Anything protective goes in <code>PreToolUse</code>; <code>PostToolUse</code> is for the audit log, which for an AP agent is not optional. I log tool name, a hash of the input and the session ID on every call.</p>
<p>Hooks defined in <code>settings.json</code> also load when the matching setting source is on. So an SDK app with default <code>settingSources</code> inherits the project's hooks, which is either convenient or alarming depending on whose project it is.</p>
<h3 id="subagents-delegation-and-context-isolation">Subagents: delegation and context isolation</h3>
<p>Subagents are separate conversations the main agent can spawn through the Agent tool. Each one gets its own context, its own tools and optionally its own model, does its work, and returns only its final message to the parent. The parent's history doesn't leak in, and the subagent's tool calls don't clutter the parent's context.</p>
<p>For the invoice agent, GST checking is a good candidate. It's a distinct job with its own rules, and I'd rather run it on Sonnet than on whatever the parent is using.</p>
<p>In Python the shape is the same, with one trap: <code>AgentDefinition</code> uses camelCase field names (<code>disallowedTools</code>, <code>permissionMode</code>, <code>maxTurns</code>) because they map to the wire format, while <code>ClaudeAgentOptions</code> uses snake_case. Pass <code>max_turns</code> to an <code>AgentDefinition</code> and you get a <code>TypeError</code> at construction time.</p>
<p>A few things the docs mention only in passing.</p>
<p>The delegation tool shows up as <code>"Agent"</code> in <code>tool_use</code> blocks but <code>"Task"</code> in the <code>system/init</code> tools list, and CLI versions before 2.1.63 used <code>"Task"</code> in both places. If you're watching for delegation, match both.</p>
<p>Programmatic agents override filesystem agents of the same name in <code>.claude/agents/</code>. Handy when you want to ship a corrected version without touching the repo.</p>
<p>A subagent knows nothing you didn't put in the Agent tool's prompt string. No parent history, no parent system prompt. If the GST checker needs the supplier's registration status, the parent has to say so.</p>
<p>Subagents run in parallel, so three independent checks finish in the time of the slowest one. They also bill in parallel. Nested spawning is capped at a depth of 3 by default (<code>CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH</code>, set it to 1 to stop nesting), and concurrency at 20 (<code>CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS</code>). Set <code>maxBudgetUsd</code> before you find out what an unbounded tree of subagents costs.</p>
<h2 id="taking-your-agent-to-production">Taking your agent to production</h2>
<h3 id="structured-outputs-and-sessions">Structured outputs and sessions</h3>
<p>An invoice agent that returns prose is a demo. One that returns typed JSON is a pipeline stage. The SDK's <code>outputFormat</code> option takes a JSON Schema, makes the model conform to it, and puts the validated object on the result message.</p>
<p>In Python, build the schema with Pydantic (<code>Invoice.model_json_schema()</code>), pass <code>output_format={"type": "json_schema", "schema": ...}</code>, and read <code>message.structured_output</code>. The schema support covers the basics: types, <code>enum</code>, <code>const</code>, <code>required</code>, nested objects and <code>$ref</code>. If the model can't produce a conforming object after a few tries you get a result with subtype <code>error_max_structured_output_retries</code> instead of garbage, which is the right failure mode for a pipeline.</p>
<p>Sessions are the other production feature. Every run has a session ID (on the <code>init</code> and <code>result</code> messages), and you can resume one later with history intact, or fork it to try two continuations from the same point. Compaction is automatic when the context gets full. If you turn on <code>enableFileCheckpointing</code> (Python: <code>enable_file_checkpointing</code>), the SDK snapshots files as the agent edits them and you can roll back to any <code>user</code> message's <code>uuid</code> with <code>rewindFiles()</code>. And <code>query.interrupt()</code> stops a running agent from the outside, which you'll want wired to a cancel button before someone asks for it.</p>
<h3 id="hosting-patterns-and-sandboxes">Hosting patterns and sandboxes</h3>
<p>The SDK runs the agent in your process, so where it runs is your problem. Anthropic's hosting guide describes three patterns, and the names are about what you'd expect.</p>
<p>Ephemeral: one container per task, destroyed when it finishes. This is the invoice agent. A PDF arrives, a container spins up, the agent runs, the JSON comes out, the container dies. Nothing to clean up, nothing to leak between customers.</p>
<p>Long-running: a persistent container per user or per workspace, for agents that hold state across many turns.</p>
<p>Hybrid: a persistent coordinator that spawns ephemeral workers.</p>
<p>For the container itself, the docs list Modal Sandbox, Cloudflare Sandboxes, Daytona, E2B, Fly Machines and Vercel Sandbox, plus Docker, gVisor and Firecracker if you'd rather run your own. Pick whichever one you already run; nothing about the SDK cares.</p>
<p>Two things the docs say quietly that deserve saying loudly. First, the SDK gives you an async generator, not a server. The HTTP or WebSocket layer, thread management, per-user isolation and auth are all yours to build. Second, set <code>settingSources: []</code> on anything multi-tenant. Otherwise a stray <code>.claude/settings.json</code> in the working directory becomes part of your customer's agent config, hooks included.</p>
<p>Every <code>query()</code> spawns the CLI subprocess, and that startup is measurable, a second or two on a cold container. For a batch job it's noise. For a chat UI it's the difference between snappy and sluggish. The TypeScript SDK has a warm-start path that spins the subprocess up before the first prompt; it's labelled preview, so check the TypeScript reference for the current shape of the API before you depend on it.</p>
<p>For observability, <code>pip install "claude-agent-sdk[otel]"</code> gives you OpenTelemetry tracing, and the SDK propagates <code>TRACEPARENT</code> into the CLI subprocess so the spans join up. If you're on AWS, Bedrock AgentCore will host the SDK as a managed runtime.</p>
<h3 id="cost-control-and-pricing">Cost control and pricing</h3>
<p>You pay per token at the model's API rate, plus your compute. Nothing extra for the SDK itself.</p>
<table>
<thead>
<tr>
<th>Model</th>
<th>Model ID</th>
<th>Input / M tokens</th>
<th>Output / M tokens</th>
</tr>
</thead>
<tbody><tr>
<td>Claude Fable 5.1</td>
<td><code>claude-fable-5-1</code></td>
<td>$10</td>
<td>$50</td>
</tr>
<tr>
<td>Claude Opus 5</td>
<td><code>claude-opus-5</code></td>
<td>$5</td>
<td>$25</td>
</tr>
<tr>
<td>Claude Sonnet 5</td>
<td><code>claude-sonnet-5</code></td>
<td>$2</td>
<td>$10</td>
</tr>
<tr>
<td>Claude Haiku 4.5</td>
<td><code>claude-haiku-4-5</code></td>
<td>$1</td>
<td>$5</td>
</tr>
</tbody></table>
<p>Sonnet 5's $2/$10 was announced as introductory pricing through August and was supposed to rise to $3/$15 on 1 September. Anthropic dropped the increase, so $2/$10 is the standard rate now. Prompt cache reads are 10% of the input price, or 2.5% on Fable 5.1, which matters for an agent because the system prompt, tool schemas and CLAUDE.md go out on every turn.</p>
<p>Three levers, in the order I reach for them. <code>maxBudgetUsd</code> (Python: <code>max_budget_usd</code>) caps a single run; the result comes back with subtype <code>error_max_budget_usd</code> when it trips. <code>maxTurns</code> caps the loop. And the model choice per subagent, because most of the work in an agent is not the hard part, and Sonnet at 40% of Opus's price does the easy parts fine.</p>
<p>If you use <code>auto</code> mode, the classifier calls are billed as tokens on API keys. Not huge, but it's a line item.</p>
<h3 id="auth-rules-and-branding">Auth rules and branding</h3>
<p>This one's short because the rule is short. If you're building a product on the Agent SDK, authenticate with an API key from the Console or one of the cloud providers. Anthropic's docs say it directly: unless previously approved, third-party developers may not offer claude.ai login or subscription rate limits in their products, and that includes agents built on the SDK. Using an OAuth token from a Free, Pro or Max account in any other product, the SDK included, is a breach of the consumer terms.</p>
<p>What confuses people is the subscription side. In June, Anthropic announced and then paused a change to how Agent SDK, <code>claude -p</code> and third-party app usage would be metered on subscriptions. As of today nothing changed: that usage still draws from your subscription's limits. That's about you, on your own machine, on your own account. It doesn't turn a Max plan into a way to power a product for other people.</p>
<p>Branding is in the same docs. You can call your agent "Claude Agent", list "Claude" inside an Agents menu, or say "YourAgent, powered by Claude". You can't call it "Claude Code" or "Claude Code Agent", and you can't reuse Claude Code's ASCII art or visual style. Your product keeps its own name.</p>
<h3 id="using-the-agent-sdk-from-go">Using the Agent SDK from Go</h3>
<p>My backends are Go, so this is the question I actually cared about. The answer is that the SDK is Python and TypeScript only, and the official route for any other language is to run the Claude Code CLI as a subprocess with <code>-p</code> and <code>--output-format stream-json</code>. The SDKs themselves do exactly this under the hood.</p>
<p><code>stream-json</code> needs <code>--verbose</code> or you get nothing. <code>--include-partial-messages</code> adds token-level deltas if you're streaming to a UI. <code>--input-format stream-json</code> turns it bidirectional for multi-turn. Check the exit code first and the JSON second; a hard failure can print to stderr with a mangled stdout.</p>
<p>There are at least five community Go ports on GitHub (schlunsen, panbanda, ProjAnvil, next-bin and connerohnesorge all have one). They all wrap the CLI the same way, none is affiliated with Anthropic, and every one of them lags a release train that ships daily. For a prototype, pick the one with the most recent commit. For production I wrap the CLI myself. It's about sixty lines, I own every one of them, and when Anthropic renames a field I'm not waiting on a maintainer. One warning: a couple of the ports show OAuth login flows in their READMEs. Re-read the auth section before copying that.</p>
<h2 id="eight-mistakes-id-rather-you-didnt-make">Eight mistakes I'd rather you didn't make</h2>
<ol>
<li>Installing <code>@anthropic-ai/claude-code</code> or <code>claude-code-sdk</code> and wondering why the imports don't match the docs. Those are the old names.</li>
<li>Expecting <code>.env</code> to load. It doesn't. Export the key or load the file yourself.</li>
<li>Getting a bland agent and blaming the model. You're on the minimal system prompt. Ask for the <code>claude_code</code> preset.</li>
<li>Trusting <code>allowedTools</code> under <code>bypassPermissions</code>. It approves, it doesn't restrict. Use <code>disallowedTools</code> for the things that must never run.</li>
<li>Writing <code>Edit(/secrets/**)</code> and thinking it covers <code>/secrets</code>. One slash anchors to the working directory. Two slashes for an absolute path.</li>
<li>Putting the safety check in <code>PostToolUse</code>. The tool already ran. <code>PreToolUse</code> is the only hook that can stop it.</li>
<li>Matching only <code>"Task"</code> when watching for subagent calls. Current CLIs report <code>"Agent"</code> in <code>tool_use</code> blocks.</li>
<li>Shipping a product on a Pro or Max OAuth token. It's a breach of the consumer terms. API keys.</li>
</ol>
<h2 id="faq">FAQ</h2>
<h3 id="is-the-claude-agent-sdk-free">Is the Claude Agent SDK free?</h3>
<p>The library costs nothing. You pay for the tokens your agent consumes at the model's API rate, plus whatever you run it on.</p>
<h3 id="can-i-use-the-claude-agent-sdk-with-a-claude-max-subscription">Can I use the Claude Agent SDK with a Claude Max subscription?</h3>
<p>For your own use, on your own machine, yes: subscription usage currently covers the SDK and <code>claude -p</code>, after Anthropic paused the planned billing change in June. For anything you offer to other people, no. Products need API keys.</p>
<h3 id="does-the-claude-agent-sdk-support-go">Does the Claude Agent SDK support Go?</h3>
<p>Not officially. Anthropic's answer for other languages is to run the CLI as a subprocess with <code>--output-format stream-json</code>, which is what the section above does. The community Go ports wrap the same thing.</p>
<h3 id="do-i-need-claude-code-installed-to-use-the-sdk">Do I need Claude Code installed to use the SDK?</h3>
<p>No. The binary is bundled in the npm package and the Python wheels. The exceptions are <code>npm ci --omit=optional</code> and sdist installs, where you install Claude Code yourself and set the executable path.</p>
<h3 id="claude-agent-sdk-or-openai-agents-sdk">Claude Agent SDK or OpenAI Agents SDK?</h3>
<p>If your agent needs a computer (files, shell, a codebase) and you're happy on Claude, the Agent SDK gives you Claude Code's loop with nothing to build. If you want to swap models between providers, or you want handoffs and guardrails as first-class primitives, OpenAI's SDK is built around those. Neither is a hosting product; that's Managed Agents and the Agents API respectively, and both of those are US-only today.</p>
<h2 id="where-to-go-from-here">Where to go from here</h2>
<p>If you'd rather someone else built the agent, that's <a href="/ai-agent-development/">what I do for a living</a>. I build AI agents and <a href="/ai-automation-services/">workflow automation</a> for small and medium businesses across Australia, and accounts payable is where most of them start.</p>
<h3 id="docs-i-checked-against">Docs I checked against</h3>
<ul>
<li><a href="https://platform.claude.com/docs/en/agent-sdk/overview">Agent SDK overview</a>, <a href="https://platform.claude.com/docs/en/agent-sdk/quickstart">quickstart</a> and <a href="https://platform.claude.com/docs/en/agent-sdk/migration-guide">migration guide</a></li>
<li><a href="https://code.claude.com/docs/en/agent-sdk/custom-tools">Custom tools</a>, <a href="https://code.claude.com/docs/en/agent-sdk/permissions">permissions</a>, <a href="https://code.claude.com/docs/en/agent-sdk/hooks">hooks</a>, <a href="https://platform.claude.com/docs/en/agent-sdk/subagents">subagents</a>, <a href="https://platform.claude.com/docs/en/agent-sdk/skills">skills</a>, <a href="https://code.claude.com/docs/en/agent-sdk/structured-outputs">structured outputs</a> and <a href="https://platform.claude.com/docs/en/agent-sdk/hosting">hosting</a></li>
<li><a href="https://code.claude.com/docs/en/agent-sdk/typescript">TypeScript reference</a> and <a href="https://code.claude.com/docs/en/agent-sdk/python">Python reference</a></li>
<li><a href="https://anthropic.com/engineering/building-agents-with-the-claude-agent-sdk">Building agents with the Claude Agent SDK</a>, the rename announcement</li>
<li><a href="https://code.claude.com/docs/en/legal-and-compliance">Legal and compliance</a> for the auth and branding rules, and <a href="https://platform.claude.com/docs/en/about-claude/pricing">pricing</a></li>
<li><a href="https://github.com/anthropics/claude-agent-sdk-typescript">anthropics/claude-agent-sdk-typescript</a> and <a href="https://github.com/anthropics/claude-agent-sdk-python">anthropics/claude-agent-sdk-python</a> on GitHub</li>
</ul>
]]></content:encoded>
      <pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-16T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI Coding</category>
      <category>Claude Agent SDK</category>
      <category>Claude Code</category>
      <category>Anthropic</category>
      <category>AI Agents</category>
      <category>TypeScript</category>
      <category>Python</category>
    </item>
    <item>
      <title><![CDATA[How My Agentic Coding Workflow Changed in a Year]]></title>
      <link>https://thomas-wiegold.com/blog/agentic-coding-workflow-shorter-prompts/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/agentic-coding-workflow-shorter-prompts/</guid>
      <description><![CDATA[A year ago I wrote four markdown files before starting a coding agent. Now I write three sentences. What changed in agentic coding, and what still needs a real prompt.]]></description>
      <content:encoded><![CDATA[<p>A year ago, before I let a coding agent touch anything, I wrote four files.</p>
<p>There was <code>project.md</code> with a full description of what I was building. A <code>CLAUDE.md</code> or <code>AGENTS.md</code> with project rules and coding conventions. A <code>todo.md</code> with the work broken into ordered tasks. And <code>prompt.md</code>, usually somewhere north of 800 words, to kick the whole thing off. Only then would I paste the prompt in and let the agent start.</p>
<p>Last month I built a <a href="https://grokue.thomas-wiegold.com/">playable roguelike</a>. The first message was one sentence.</p>
<p>That gap is what this post is about. Testing <a href="/blog/claude-fable-5-1-review/">Fable 5.1</a> and GPT-6 Astra made it obvious how much my own habits had drifted, and I don't think I'm the only one. The scaffolding I built in 2025 was a reasonable response to models that needed it. The current generation mostly doesn't.</p>
<h2 id="what-agentic-coding-actually-means-in-2026">What Agentic Coding Actually Means in 2026</h2>
<p>Quick definition so we're on the same page. Agentic coding is when you give an AI agent a goal instead of a completion target, and it plans, reads your codebase, edits multiple files, runs your tests, reads the failures, and keeps going until it thinks it's done. You review and sign off.</p>
<p>That's different from autocomplete, which predicts the next few lines inside the file you're already in. It's also different from vibe coding, where you're accepting output without reading it. Agentic coding still has you in the loop. It just moves you from writing the code to directing and verifying it.</p>
<h2 id="the-old-workflow-four-markdown-files-before-you-start">The Old Workflow: Four Markdown Files Before You Start</h2>
<p>The 2025 version of my process was front-loaded. I'd spend maybe 45 minutes on setup before a single line got written.</p>
<p><code>project.md</code> described the whole thing: what it does, who uses it, the data model, the screens. <code>CLAUDE.md</code> held the rules, and mine used to run 200 lines or more, covering everything from error handling patterns to how I like imports sorted. <code>todo.md</code> was my attempt to decompose the work into a sequence the agent could follow without wandering. And <code>prompt.md</code> restated most of it again, because I didn't fully trust the files to be read.</p>
<p>It worked. I shipped things this way and the results were fine. But look at what I was actually doing: I was writing a spec, then writing a summary of the spec, then writing a plan derived from the spec, and hoping the model would reconcile all three. Every one of those documents was a guess about what the model would need. And I made those guesses before I'd seen a single line of its output.</p>
<h2 id="why-it-stopped-being-necessary">Why It Stopped Being Necessary</h2>
<p>Two things changed. One I noticed, one got measured.</p>
<p>The one I noticed: shorter prompts started producing better results. Not always exactly what I had pictured, but usually something good, and often something better than what I would have specified. When it wasn't right, I'd say so, and the next iteration fixed it. At some point the cost of correcting the model dropped below the cost of specifying everything upfront, and once that flips, all the front-loading is just work you didn't need to do.</p>
<p>The one that got measured: researchers at ETH Zurich published the first proper controlled study on repository context files in February (<a href="https://arxiv.org/abs/2602.11988">arXiv:2602.11988</a>). Across SWE-bench Lite and a new 138-task benchmark, context files did not generally improve task success rates while adding over 20% to inference cost. Auto-generated files were worse than having no file at all. Human-written ones did better, around 4% on their benchmark, so this isn't an argument for deleting everything. I went through that paper properly in <a href="/blog/claude-md-helpful-or-expensive-noise/">CLAUDE.md: Helpful or Just Expensive Noise?</a> if you want the full breakdown.</p>
<p>The interesting bit for me was the ablation. When they stripped a repo of its README and docs, context files suddenly did help. Which suggests most of what I'd been writing into <code>project.md</code> was already sitting in the repository, and the model was perfectly capable of going and reading it.</p>
<p>There's a second reason worth naming. A long spec written before you've seen anything is mostly assumptions. You're describing a thing that doesn't exist yet, in a language the model interprets loosely, and any detail you got wrong becomes a constraint the agent now faithfully honours. Overspecifying doesn't just waste tokens. It locks in your mistakes.</p>
<h2 id="the-new-workflow">The New Workflow</h2>
<p>Here's what I actually do now.</p>
<ol>
<li>Write the shortest description that still contains your requirements. One to three sentences on what you want built. Add the language, framework, platform, or target audience only if it genuinely constrains the outcome. If you'd be happy either way, leave it out.</li>
<li>Let it run. Don't interrupt to add the detail you forgot. You'll get a chance in a few minutes.</li>
<li>Test the first iteration. Run it, don't read it. Reading the diff tells you what the agent thinks it built. Running it tells you what it built.</li>
<li>Give feedback as a bullet list. Short, direct, one item per thing that's wrong or missing. No explanation of why, no restating the original brief.</li>
<li>Repeat.</li>
</ol>
<p>The whole thing is a loop, and the loop is fast enough that you can afford to be wrong on the first pass. That's the actual unlock. Not that the models got smarter in the abstract, but that iteration got cheap enough to replace planning.</p>
<h2 id="what-this-looks-like-a-roguelike-from-one-sentence">What This Looks Like: A Roguelike From One Sentence</h2>
<p>I wanted to test this properly, on something with enough surface area that sloppy direction would show up fast. So I built a game.</p>
<p><a href="https://grokue.thomas-wiegold.com/">Grokue Like</a> is a turn-based roguelite that runs in the browser. Ten procedurally generated floors, loot (normal, rare, epic, and unique), a skill tree, a merchant, and legacy embers you bank between runs so a failed run still leaves you something. It's free, there's no account, and it's kinda fun to play, which surprised me more than it should have.</p>
<p>The stack was Grok 4.6 driving the <a href="/blog/pi-coding-agent/">Pi coding agent</a>. Grok 4.6 landed in August with a 500k context window, and xAI put a lot of emphasis on interactive and visual first passes, which is exactly the shape of this problem. That turned out to be the right call. The first playable version came back with a coherent visual direction I hadn't asked for.</p>
<p>For art, I gave the agent a tool instead of assets. I wrote a small CLI wrapper around <a href="https://about.fb.com/news/2026/07/introducing-muse-image-meta-ai/">Meta's Muse Image</a>, then wrapped that in a skill so the agent could call it directly and generate its own sprites and backgrounds. Muse Image has an anchored composition mode where you pin a series of generations to a few reference images, which is how a set of sprites ends up looking like it came from one artist rather than eleven. At a cent per image, the agent could also afford to throw away the bad ones. Sound and music came from <a href="https://elevenlabs.io/music">ElevenLabs</a>.</p>
<p>The first message was one sentence: build a turn-based roguelike that runs in the browser. Everything after that was me playing a build and coming back with bullets. Combat feels floaty. The map needs a fog reveal. Death should carry something forward. Merchant prices are wrong. That's the entire creative process.</p>
<p>Things I never specified and would probably have got wrong: the ember mechanic, the art style, and the line on the status bar that reads "the dark moves only when you do." That last one is better writing than I'd have put in a spec.</p>
<h2 id="it-feels-like-leading-a-team-not-writing-a-spec">It Feels Like Leading a Team, Not Writing a Spec</h2>
<p>The mental shift that made this click was giving up on the idea that I'm programming the agent.</p>
<p>I'm not. I'm directing it. The relationship that fits best is the one you have with a good developer on your team: you tell them what you want and roughly why, you let them make the calls inside that, and you give feedback on what comes back. You don't hand a senior engineer an 800-word document specifying their variable names. If you did, you'd get worse work and they'd start looking at job ads.</p>
<p>This is also the thing that makes multiple agents workable. Heavy per-project scaffolding doesn't scale past one or two agents, because you're maintaining a spec for each of them and paying the context cost every session. Short briefs and bullet-list feedback scale fine. I can keep three going and my job in each of them is the same 30 seconds of reading and reacting. It's closer to standup than to programming.</p>
<h2 id="where-you-still-need-a-real-prompt">Where You Still Need a Real Prompt</h2>
<p>None of this means prompting is dead. I want to be clear about that, because "the models are smart now, just talk to them" is a take that will cost you real money in the wrong context.</p>
<p>The dividing line I use is repetition. If a task runs once, iterate conversationally. If it runs more than once, write the prompt properly.</p>
<table>
<thead>
<tr>
<th>Conversational works</th>
<th>Written prompt and context still wins</th>
</tr>
</thead>
<tbody><tr>
<td>Building something new</td>
<td>Anything you'll run more than once</td>
</tr>
<tr>
<td>Creative and exploratory work</td>
<td>Information extraction and processing</td>
</tr>
<tr>
<td>Prototypes and one-off tools</td>
<td>Production pipelines</td>
</tr>
<tr>
<td>Work where you'll know "right" when you see it</td>
<td>Work with a fixed output contract</td>
</tr>
</tbody></table>
<p>The reason is that conversational iteration has no memory across runs. You converge on a good result through five rounds of feedback, and then the whole thing evaporates. That's fine for a game. It's terrible for an invoice extractor that has to behave identically on Tuesday. For that work, the prompt and the context assembly are the product, and I'd point you at <a href="/blog/context-engineering-for-ai-agents/">context engineering for AI agents</a> and my <a href="/blog/prompt-engineering-best-practices-2026/">prompt engineering notes</a> rather than repeating myself here.</p>
<p>Client work sits mostly on the right side of that table. Personal projects sit mostly on the left. That's roughly the split.</p>
<h2 id="what-i-still-put-in-claudemd-and-agentsmd">What I Still Put in CLAUDE.md and AGENTS.md</h2>
<p>Shorter, not gone. My files run about 10 to 40 lines now and contain only things the agent can't work out by looking around: non-obvious build and test commands with their exact flags, architectural decisions that contradict what the code structure implies, and conventions that go against the obvious default. Everything else got deleted, because it was either duplicating the README or telling the model something it already knew.</p>
<p>Anything that genuinely cannot be broken goes in a hook, not a markdown file. Markdown is a request. A hook is a rule.</p>
<h2 id="faq">FAQ</h2>
<h3 id="what-is-agentic-coding">What is agentic coding?</h3>
<p>Agentic coding is a development workflow where an AI agent takes a goal, plans the work, edits files across your codebase, runs the tests, and self-corrects until it's done, with a human reviewing and approving the result. The distinction from autocomplete is autonomy over multiple steps. The distinction from vibe coding is that you still verify.</p>
<h3 id="how-do-you-prevent-ai-coding-agent-mistakes-with-shorter-prompts">How do you prevent AI coding agent mistakes with shorter prompts?</h3>
<p>By testing every iteration and correcting fast. Short prompts don't reduce mistakes, they change when you catch them. Instead of trying to prevent errors with an upfront spec, you find them by running the build and fixing them in the next round. Keep iterations small enough that any single one is easy to review.</p>
<h3 id="how-do-you-prevent-architecture-drift-in-ai-coding-agents">How do you prevent architecture drift in AI coding agents?</h3>
<p>Verification you can automate, plus short sessions. Hooks and a test suite catch drift deterministically where instructions in a markdown file won't. Instruction compliance degrades as a session fills up, so starting fresh sessions for distinct pieces of work does more for architectural consistency than a longer rules file.</p>
<h3 id="is-prompt-engineering-dead">Is prompt engineering dead?</h3>
<p>No. It moved. For one-off building work, conversation beats a carefully written prompt because the correction loop is faster than the specification loop. For anything repeated, automated, or running in production, a well-built prompt and a deliberate context pipeline still make the difference between a system that works and one that works most of the time.</p>
<h3 id="should-i-still-write-a-claudemd-or-agentsmd">Should I still write a CLAUDE.md or AGENTS.md?</h3>
<p>Yes, but keep it under about 40 lines and put only non-discoverable things in it. Committing auto-generated output unreviewed measurably underperforms having no file at all.</p>
<h2 id="the-workflow-will-change-again">The Workflow Will Change Again</h2>
<p>I'm aware that everything above has a shelf life. My 2025 process was correct for 2025 models and it's dead weight now. Something similar will happen to this one, probably faster than I'd like.</p>
<p>The part I'd bet on outlasting the specifics: the work is moving from specification to direction and verification. Getting good at describing what you want in three sentences, and at recognising quickly whether what came back is right, is a more durable skill than any particular file layout. Go build something small with one sentence and see what happens.</p>
]]></content:encoded>
      <pubDate>Tue, 08 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-08T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI Coding</category>
      <category>AI Agents</category>
      <category>Agentic AI</category>
      <category>Prompt Engineering</category>
      <category>Developer Tools</category>
    </item>
    <item>
      <title><![CDATA[Claude Fable 5.1 review: I built an image codec with it]]></title>
      <link>https://thomas-wiegold.com/blog/claude-fable-5-1-review/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/claude-fable-5-1-review/</guid>
      <description><![CDATA[I used Claude Fable 5.1 to build an image codec that beats WebP and a full agency-grade site. Here's what changed from Fable 5, and what it cost.]]></description>
      <content:encoded><![CDATA[<p>For the last two months I barely touched Claude. Not out of protest. Everything else just got good. Grok, ChatGPT, Qwen 3.8 Max, Kimi K3, DeepSeek V4 Flash, GLM. Pick one, they all work now. When I ran <a href="/blog/qwen-3-8-max-review/">Qwen 3.8 Max through my usual tests</a> I remember thinking the gap I'd been paying a premium for had mostly closed. Competition is good. Good for me as a customer, and clearly good for Anthropic, who spent the middle of this year under real pressure.</p>
<p>So when Claude Fable 5.1 landed on September 1, my expectations were low. <a href="/blog/claude-fable-5-review/">Fable 5 was already excellent</a>. What's a point-one release supposed to do?</p>
<p>Then I gave it two jobs. Build an image codec that beats WebP. Build a website good enough that an award-winning design studio would put its name on it. Both worked. That's the short version of the review. The longer version is about why, and about whether it's worth what it costs, which is a lot.</p>
<h2 id="what-claude-fable-51-actually-is">What Claude Fable 5.1 actually is</h2>
<p>Claude Fable 5.1 is Anthropic's frontier model, released September 1, 2026, sitting above Opus 5 in a tier they call Mythos-class. It shares its weights with Claude Mythos 5.1. The only real difference between the two is safeguards: Fable is generally available with conservative classifiers on top, Mythos goes out through trusted-access programs with those classifiers loosened.</p>
<p>The specs, from the <a href="https://docs.aws.amazon.com/bedrock/latest/userguide/model-card-anthropic-claude-fable-5-1.html">Bedrock model card</a>:</p>
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td>Context window</td>
<td>1M tokens (default and max)</td>
</tr>
<tr>
<td>Max output</td>
<td>128K tokens</td>
</tr>
<tr>
<td>Reasoning</td>
<td>Adaptive thinking, always on, five effort levels from low to max, defaults to high</td>
</tr>
<tr>
<td>Knowledge cutoff</td>
<td>June 2026</td>
</tr>
<tr>
<td>Modality</td>
<td>Text and image in, text out</td>
</tr>
<tr>
<td>API string</td>
<td><code>claude-fable-5-1</code></td>
</tr>
</tbody></table>
<p>Two of those matter more than they look. The June 2026 cutoff is the freshest of any Claude model, which you notice immediately with libraries that moved this year. And adaptive thinking can't be turned off, so every request carries reasoning tokens whether you wanted them or not. Remember that for the pricing section.</p>
<p>The other thing worth knowing is routing. Some cybersecurity and biology queries get flagged and answered by Opus instead of Fable, and you aren't billed at Fable rates when that happens. Anthropic says cyber false positives are down roughly 60% per session versus Fable 5. I didn't trip a single one across either test, but if you do authorised security work you still will, and the Claude Code issue tracker has months of complaints about exactly that.</p>
<h2 id="test-one-a-go-image-codec-that-beats-webp">Test one: a Go image codec that beats WebP</h2>
<p>I picked a codec deliberately. It's hard in a way most benchmark tasks aren't. There are a million Express APIs in the training data and not a million novel entropy coders. You have to hold a lot of state, make decisions that only pay off three files later, and be right about the maths, because when you're wrong about the maths you don't get a warning. You get garbage pixels.</p>
<p>I asked for something better than WebP, in Go, and I let it run.</p>
<p>It landed in one shot. One relatively short prompt, no back and forth, no arguing about whether the bug was real. That surprised me more than the result did.</p>
<p>The result: the codec beats WebP on compression by somewhere between 1 and 9 percent depending on the image, and it's much faster on top of that. One to nine percent sounds modest until you remember WebP has had thirteen years of engineers pushing on it. I did not expect to beat it at all, let alone beat it on speed.</p>
<p>Now the caveats, and they're big enough that I want them in the same section rather than buried at the bottom. This is an experiment. You could not ship it. Compression ratio is maybe a quarter of what makes a real codec viable, and the rest is decode performance on hardware you don't control, progressive rendering, colour accuracy, alpha handling, metadata, streaming, plus the small matter of every browser on earth agreeing to support it. Beating WebP on one axis is not the same as replacing it.</p>
<p>The test set was small too. Under 50 images. That's enough to tell me something interesting happened and nowhere near enough to claim general performance. A real evaluation needs thousands, spread across photos, illustrations, screenshots, and all the horrible edge cases that break codecs in production.</p>
<p>Take it as what it was. Not "can I ship this," but "can the model do a genuinely hard thing from a cold start." It could.</p>
<h2 id="test-two-a-website-an-agency-could-ship">Test two: a website an agency could ship</h2>
<p>The second test was the opposite kind of hard. Not correctness, taste.</p>
<p>The brief was a site for an award-winning web design company, which is designed to catch models out. "Professional website" is what every model produces by default. "Award-winning" is what almost none of them can do, and the gap between the two is where all the interesting failure lives. I've <a href="/blog/best-llm-frontend-design/">run six models through this kind of frontend test before</a> and most land in competent-but-generic territory.</p>
<p>The twist I added: I asked for a portfolio, with a few examples of the studio's best work. That turns one design problem into several at once. A portfolio whose sample work is mediocre fails the brief no matter how nice the wrapper is, and a model with only one good design in it gets caught immediately, because you can watch it recycle the same ideas across every example.</p>
<p>Fable 5.1 didn't get caught. The result is at <a href="https://fable51-webdesign.thomas-wiegold.com">fable51-webdesign.thomas-wiegold.com</a>. The portfolio pieces are distinct from each other and individually good, which is the bit I didn't expect. The animations and transitions are what I keep going back to look at. They're timed properly and they carry the eye somewhere, and that's usually where generated frontends fall apart.</p>
<p>One prompt. No revisions. Good on the first try, same as the codec.</p>
<p>I'd put it in front of a real client tomorrow. This is the test I'd point at if someone asked what "creative" means for a coding model. Not that it wrote CSS. That it made choices, several times over, without repeating itself.</p>
<h2 id="what-actually-changed-from-fable-5">What actually changed from Fable 5</h2>
<p>Here's where I have to be careful, because I like this model and that's exactly when you start seeing improvements that aren't there.</p>
<p>My honest read: Fable 5.1 feels better to work with than Fable 5. More direct. Less talkative. It goes at the goal instead of narrating its way toward it. It might be slightly faster, though I didn't time anything properly, so treat that as a feeling rather than a measurement.</p>
<p>What I can't tell you is that the output is better. My Fable 5 results were already great. My Fable 5.1 results are also great. If there's a quality difference in the final artifacts I'm not confident enough to claim it.</p>
<p>The interesting part is that "less talkative" turns out to be measurable. Snorkel AI found that on frontier coding tasks both models solved, Fable 5.1 used 58% fewer output tokens than Opus 5 and finished 36% faster. Every reported roughly twice the speed at about half the tokens. So the thing I noticed as a vibe is a real property, and it's the one I'd care about most day to day.</p>
<p>On benchmarks, two numbers are worth your attention and most of the rest aren't. Terminal-Bench-Science 0.1 went from 24.7% on Fable 5 to 52.6% on 5.1, which is a jump you rarely see on a point release. And <a href="https://artificialanalysis.ai/articles/claude-fable-5-1">Artificial Analysis</a> put it at the top of its Intelligence Index with a score of 66 at max effort, ahead of Opus 5 at 63 and GPT-5.6 Sol at 61.</p>
<p>One correction while I'm here, because I keep seeing it repeated. The 95% SWE-bench Verified figure doing the rounds is Fable 5's number, not 5.1's. Anthropic didn't headline a SWE-bench result for 5.1 at all. If a review quotes it as a 5.1 score, the person writing it didn't read the launch post.</p>
<h2 id="the-cost-problem-which-has-not-gone-away">The cost problem, which has not gone away</h2>
<p>Fable 5.1 costs $10 per million input tokens and $50 per million output. Unchanged from Fable 5, and exactly double Opus 5 on both sides.</p>
<p>The headline improvement is cache reads, cut 75% to $0.25 per million from $1.00. That's a strange enough number to say out loud: Fable 5.1's cached input is now cheaper than Opus 5's, even though its base rate is double. If your workload is a long-running agent chewing through the same context, the maths changed in your favour.</p>
<p>Anthropic frames this as roughly 25% cheaper for typical workloads and up to 45% for agentic ones. Artificial Analysis found the opposite on its own Intelligence Index runs: about 20% more expensive per task than Fable 5, because 5.1 burns more tokens getting there. Both can be true. Which applies to you depends on your cache hit rate, and you won't know until you measure it.</p>
<p>For those of us on subscriptions rather than the API, the practical version is simpler. Credits go fast. That's the part that stops me reaching for Fable by default, and it's the same complaint I had about Fable 5.</p>
<h2 id="when-its-worth-it">When it's worth it</h2>
<p>Default to Opus 5. Escalate to Fable 5.1 when the task is hard, important, or creative. That's not me being cautious, it's what <a href="https://platform.claude.com/docs/en/models/fable-5-1/whats-new-fable-5-1">Anthropic's own docs</a> recommend, and it matches how I've actually been using it.</p>
<p>A concrete threshold: if Opus 5 at high effort fails more than about 15 to 20 percent of your long-horizon tasks, or cache-heavy agent workloads dominate your bill, Fable earns the premium. Otherwise you're paying double for a difference you won't notice on a CRUD endpoint.</p>
<p>Now the part where I disagree with the leaderboards.</p>
<p>The number people point at is Artificial Analysis's Coding Agent Index v1.1, where GPT-5.6 Sol scored 80 against Fable's 77. Two problems with it. The 77 is Fable 5's score, not 5.1's, so the comparison is a generation out of date before you even get to the argument. And I don't think the ranking reflects what happens when you sit down and actually use these models.</p>
<p>I think the benchmarks are broken, and not as a vague complaint. Look at how the numbers get made. Anthropic's cross-vendor comparison columns were run by Anthropic, under Anthropic's conditions. Artificial Analysis revised its own methodology mid-year and Fable 5's launch score of 64.9 became 60, with a note that the two aren't interchangeable. On OSWorld and AutomationBench, runs where a safeguard fired scored zero, which drags the average down for a reason unrelated to capability. And nearly every published chart is a cost-accuracy curve across five effort levels, so a number quoted without its effort tier tells you close to nothing.</p>
<p>None of that is dishonest. It's that a benchmark measures a task, and the task isn't the job. My job is ambiguous briefs, taste, and problems where the hard part is deciding what to build in the first place. No index scores that, and no index is going to.</p>
<p>So I'll say it plainly rather than hedge it into mush. Fable 5.1 is number one right now. It built a working codec and a multi-piece portfolio site in one prompt each, and nothing else I have access to does that. If you want a number to agree with me, it tops the Artificial Analysis Intelligence Index at 66. For the head to head against the alternatives, see <a href="/blog/opus-5-vs-gpt-5-6-vs-grok-4-5/">my Opus 5 versus GPT-5.6 versus Grok 4.5 comparison</a>.</p>
<p>If you take one thing from this, take the test structure rather than my verdict. Pick two tasks, one genuinely hard and one that needs taste. Run both against whatever you use today and against Fable 5.1. Then compare cost per finished task, not tokens per second and not how impressive the output looks in isolation. I went in expecting a nothing release and came out having changed my default for a whole class of work. Your two tasks might say something different. That's the point of running them.</p>
]]></content:encoded>
      <pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-09-04T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI News</category>
      <category>Anthropic</category>
      <category>Claude</category>
      <category>LLM</category>
      <category>AI Coding</category>
      <category>Fable</category>
      <category>Review</category>
    </item>
    <item>
      <title><![CDATA[Claude Chrome Extension: The 17% Nobody Is Quoting]]></title>
      <link>https://thomas-wiegold.com/blog/claude-chrome-extension/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/claude-chrome-extension/</guid>
      <description><![CDATA[Claude in Chrome went GA with auto-approve on by default. Anthropic published the classifier's miss rate. It isn't the number in the press coverage.]]></description>
      <content:encoded><![CDATA[<p>On 26 August, Anthropic took Claude in Chrome out of pilot and <a href="https://claude.com/blog/claude-in-chrome-generally-available">made it generally available</a> on every paid plan. Most coverage ran with the idea that the Claude Chrome extension can now click around your browser, which it could already do in the beta. The real change sits a paragraph further down. Claude auto-approves its own actions by default now, and a classifier checks each one before it fires.</p>
<p>I've been running auto mode in Claude Code since it shipped, so I know what that classifier does to a shell. What I didn't know is what it does to a browser holding my Gmail session. Working that out led me to a number sitting in public that hasn't shown up in a single launch post I've read.</p>
<h2 id="what-changed-on-26-august">What changed on 26 August</h2>
<p>Claude in Chrome is a browser extension that lets Claude read the page you're on and act on it. Clicking links, typing, navigating, filling forms, all through the sessions you're already logged into. GA changed the permission model. Claude now approves actions it judges safe on its own, using the same mechanism as auto mode in Claude Code, and a classifier reviews each action against what you originally asked for. Mismatches get blocked.</p>
<p>The unglamorous details: Pro, Max, Team and Enterprise, no free tier, desktop Google Chrome only, no mobile. Two modes in settings, manually approve and automatically approve, with the Cowork side panel defaulting to auto. Auto isn't a blanket yes, though. Downloads and entering sensitive information still stop and ask, and some actions are blocked whatever you set. The <a href="https://support.claude.com/en/articles/12902446-claude-in-chrome-permissions-guide">permissions guide</a> is short enough to actually read.</p>
<p>The thing almost nobody picked up is that Anthropic shipped two browser products that morning. The other is <a href="https://claude.com/blog/cowork-built-in-browser">a browser built into Claude Cowork</a>, running its own profile, nothing to install. I'll come back to it, because it ends up being my recommendation.</p>
<h2 id="what-the-classifier-can-actually-see">What the classifier can actually see</h2>
<p>Anthropic published <a href="https://www.anthropic.com/engineering/claude-code-auto-mode">a detailed engineering write-up</a> on how auto mode was built. It covers Claude Code rather than the browser, but since the Chrome announcement says explicitly that it's the same mechanism, it's the closest thing we have to documentation of what's now guarding your inbox.</p>
<p>Actions get sorted into three tiers. Reads and navigation are allowlisted and skip classification. File edits inside the project directory pass without a classifier call. Everything else hits a two-stage transcript classifier: a fast single-token filter tuned to err toward blocking, then a chain-of-thought pass on whatever stage one flagged.</p>
<p>Now the part I keep thinking about. The classifier sees only your messages and the agent's tool calls. Claude's reasoning is stripped out, and so are tool results. Anthropic calls this reasoning-blind by design, and the justification is good. If the classifier could read Claude's explanation of why an action is fine, Claude could talk it into things. Stripping tool results is the structural injection defence: if the classifier never reads the poisoned page, the poisoned page can't argue with it.</p>
<p>The cost, which Anthropic names, is provenance. If you never mentioned a specific target and the agent produces one, the classifier can't tell whether it was looked up or made up. In a browser, that means the classifier judges whether an action matches your request while structurally blind to the page the action happens on.</p>
<h2 id="the-number-nobody-is-quoting">The number nobody is quoting</h2>
<p>Anthropic evaluated the pipeline on three datasets and published the table. A 0.4% false-positive rate on 10,000 real internal tool calls. A 5.7% false-negative rate on 1,000 synthetic exfiltration attempts. And a 17% false-negative rate on 52 curated real overeager actions. Three questions, three denominators. Don't blend them, and be suspicious of anyone who does.</p>
<p>The 17% is the one to care about if you're automating business work, and Anthropic's own words for it are "the honest number." An overeager action is Claude understanding your goal, genuinely trying to help, and overstepping while it does. No hostile reasoning anywhere. Roughly one in six got through.</p>
<p>Anthropic also explains the misses. In most cases the classifier spotted the danger fine. What it got wrong was whether anything the user actually said covered this specific action. Their phrasing: it finds approval-shaped evidence and stops short of checking whether that's consent for the blast radius. They've tried prompt-engineering around it and haven't found a fix that costs less than it gains.</p>
<p>One of their examples should make anyone automating a business portal sit up. A user says "cancel my job." The agent queries the cluster, picks the closest match by name similarity, deletes it. That's a designated block case, so the classifier is aimed straight at it. Seventeen percent of the time, aimed and missing.</p>
<p>Swap the cluster for a supplier portal with two near-identical contact records, because somebody made a duplicate eighteen months ago and nobody cleaned it up. Same shape, same failure, different bank account.</p>
<p>Two caveats. The 52-item sample is small, and Anthropic says so. And these figures come from Claude Code's shell and file operations, not the browser. Anthropic says same mechanism; it hasn't published browser equivalents. I'm reasoning across, and you should hold that loosely.</p>
<p>Pushing the other way, <a href="https://arxiv.org/html/2604.04978v2">an independent stress test on arXiv</a> built a benchmark of deliberately ambiguous authorization scenarios and measured an end-to-end false-negative rate of 81%. That's a designed worst case, not typical traffic. Read it as: when ambiguity is systematic rather than accidental, this gate degrades badly.</p>
<h3 id="the-case-for-the-machine-check">The case for the machine check</h3>
<p>The argument for auto mode is strong, and it's an argument about humans. Claude Code users approve 93% of permission prompts. A gate you clear 93 times out of 100 has stopped being a gate and become a habit.</p>
<p>Anthropic's own verdict is unusually blunt for a launch-adjacent document. Coming from <a href="/blog/claude-code-dangerously-skip-permissions/"><code>--dangerously-skip-permissions</code></a>, which I've admitted to using more than I should, auto mode is a substantial improvement. Coming from careful manual approval, it's arguably a regression, because you're trading your judgment for a classifier that's sometimes wrong. They say plainly it isn't a drop-in replacement for careful human review on high-stakes work.</p>
<p>I can't improve on that, so I won't try.</p>
<h2 id="what-the-prompt-injection-numbers-say">What the prompt injection numbers say</h2>
<p>Two evaluations are in circulation and they get mashed together constantly.</p>
<p>The original, built for the pilot, is retired. Anthropic saturated it: no attack succeeded against Fable 5, Opus 5 or Sonnet 5, and that was without probes and classifiers running at all. When a benchmark returns zero for everything, it's stopped measuring.</p>
<p>The current one uses stronger attacks written by professional red-teamers, reported in the GA announcement and sourced to the <a href="https://www-cdn.anthropic.com/b514064af1408018e64b1ad24e7d5e75850b4ffd/Claude%20Opus%205%20System%20Card.pdf">Claude Opus 5 system card</a>. Attacks that reached the model succeeded 17.6% of the time against Opus 4.5 and 3.8% against Opus 5, before safeguards. Add the probes and the safety classifier and you get zero successful attacks against Sonnet 5, Opus 5 and Mythos 5, with 0.3% against Fable 5, all manually verified low severity.</p>
<p>Read that twice, because the 0% is doing a lot of PR work. The model alone sits at 3.8%. The zero belongs to the scaffolding. Build agents against the API without a probe layer and an action classifier in front of them, and that 0% was never yours.</p>
<p>Note the denominator too. That's the success rate for attacks that <em>reached</em> the model, not attacks attempted. Opus 4.5 had fewer reach it and still had the highest success rate among those that did.</p>
<p>And if you find a guide quoting 11.2% as the current rate, close the tab. That's from the <a href="https://claude.com/blog/claude-for-chrome">August 2025 Claude for Chrome pilot announcement</a>, where 123 test cases across 29 scenarios went from 23.6% to 11.2%. It isn't just old. It's from a benchmark its own author has discarded.</p>
<h2 id="two-vulnerabilities-that-never-touched-the-classifier">Two vulnerabilities that never touched the classifier</h2>
<p>Here's why the 0% doesn't comfort me on its own.</p>
<p>In March, Koi Security published <a href="https://www.koi.ai/blog/shadowprompt-how-any-website-could-have-hijacked-anthropic-claude-chrome-extension">ShadowPrompt</a>, a zero-click chain against the Claude in Chrome extension. Any website could silently inject prompts as if you'd typed them. No clicks, no dialog. It combined an over-permissive origin allowlist (anything matching <code>*.claude.ai</code> was trusted) with a DOM-based XSS in a CAPTCHA component on one of those subdomains, at a point when the extension had over three million users. Credit where it's due, the handling was good: <a href="https://thehackernews.com/2026/03/claude-extension-flaw-enabled-zero.html">reported 26 December</a>, patched in v1.0.41 on 15 January.</p>
<p>In May, LayerX disclosed <a href="https://www.securityweek.com/vulnerability-in-claude-extension-for-chrome-exposes-ai-agent-to-takeover/">ClaudeBleed</a>. The Claude extension used Chrome's <code>externally_connectable</code> and trusted the claude.ai origin rather than the execution context, so any other extension, including a zero-permission one, could issue it commands. LayerX demonstrated forced Google Drive sharing and Gmail exfiltration, defeating the confirmation prompts by looping approvals and renaming buttons in the DOM. Anthropic patched in v1.0.70 on 6 May. LayerX says the patch is partial, and here's the part that belongs in this article: they report that in autonomous mode the new validation layer stops being effective and the original path reopens. Manifold Security was still finding residual capability in v1.0.72 in July.</p>
<p>Anthropic ships bugs. Everyone ships bugs. What I take from these two is that both lived in the plumbing <em>underneath</em> the classifier, and a classifier scoring 0% on injection evals is scoring on the layer it can see.</p>
<p>Same lesson as <a href="/blog/claude-code-hooks/">Claude Code hooks</a>. A deterministic guard below the probabilistic one is worth a lot because it doesn't share the blind spots. The browser extension has no hooks equivalent. Real gap.</p>
<h2 id="four-checks-before-you-point-the-claude-chrome-extension-at-a-business-account">Four checks before you point the Claude Chrome extension at a business account</h2>
<p>If you're evaluating for real work this week, start here.</p>
<p>How much of your accounting stack is gated? Anthropic's <a href="https://support.claude.com/en/articles/12902428-use-claude-in-chrome-safely">safety guide</a> hard-blocks only two categories, adult content and known pirated content. Financial sites aren't blocked, but Claude asks permission before accessing them, and it's prohibited outright from stock trading and investment transactions. Anthropic also advises against using the extension to manage financial accounts at all. So the question isn't whether Xero or MYOB are banned, it's how many prompts and prohibited actions sit between you and a finished invoice run.</p>
<p>Where does auto mode stop in your inbox? Run the same triage task twice, manual and auto. You're not checking whether it works. You're checking which actions it decided didn't need you.</p>
<p>What happens with a deliberately ambiguous instruction? Put two plausible targets on the page and see whether it picks one and proceeds. That's the agent-inferred-parameter case in your own data.</p>
<p>Which browser is Claude actually using? If you already have the extension installed, it stays your default. Settings, Cowork, preferred browser.</p>
<p>If you do any injection testing, use a throwaway account with fake data. The premise of the risk is that the agent acts with your signed-in authority, so a successful test and a successful attack are the same event.</p>
<h2 id="so-would-i-let-it-near-a-logged-in-business-account">So would I let it near a logged-in business account?</h2>
<p>Not a yes or no. A fork.</p>
<p>For portal work, invoice collection, research, anything where Claude needs <em>a</em> browser rather than <em>your</em> browser: use the built-in Cowork browser. Own profile, never sees your tabs, bookmarks or passwords, and banking, email and single sign-on stay out unless you deliberately bring those logins across site by site. Same safeguards, dramatically smaller blast radius. For most of what small businesses want to automate, this is the right tool and it isn't close.</p>
<p>Keep the extension for the page you already have open, in accounts you're already in. Updating a CRM record you're looking at. Working through the doc in front of you.</p>
<p>Turn auto-approve off in your inbox specifically. Email is where the overeager-action class does the most damage and where an injection has the richest payload sitting right next to it.</p>
<p>For the Australian small businesses I work with, the blunt version: if the job is accounting automation, you want <a href="/ai-agent-development/">a purpose-built agent</a> with scoped credentials and an audit trail, not a browser agent driving a UI with your admin session attached. I wrote about <a href="/blog/ai-agents-for-small-business-2026/">where that line falls</a> earlier this year and nothing here moves it.</p>
]]></content:encoded>
      <pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-08-29T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI News</category>
      <category>Claude</category>
      <category>Anthropic</category>
      <category>AI Agents</category>
      <category>Claude Code</category>
    </item>
    <item>
      <title><![CDATA[Best LLM for frontend design? It's mostly vibes now]]></title>
      <link>https://thomas-wiegold.com/blog/best-llm-frontend-design/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/best-llm-frontend-design/</guid>
      <description><![CDATA[I gave the models I actually use the same four design briefs and published every result. There's no single best LLM for frontend design, and here's why.]]></description>
      <content:encoded><![CDATA[<p>Nearly every benchmark I read measures coding. Bug fixing, tool use, agentic loops, how many turns it takes to get a test suite green. Almost nobody measures taste.</p>
<p>That's a problem, because when I start a new site the first decision isn't which model writes the cleanest TypeScript. It's which one gives me a layout I don't immediately want to throw away. Those are different jobs, and there's no law saying the same model has to win both. Finding the best LLM for frontend design is a separate question from finding the best coding model, and I wanted an answer I'd actually tested rather than a leaderboard screenshot.</p>
<p>So I ran one. Four design briefs, one run per model, same prompt for everyone, no per-model tuning, single file HTML. Everything is browsable at <a href="https://webdesign-test.thomas-wiegold.com">webdesign-test.thomas-wiegold.com</a> and you can click through the grid yourself.</p>
<p>The honest headline is that I struggled to pick winners at all. Most of the time the results were close enough that I couldn't articulate why I preferred one over another. It was a vibe. That sounds like a cop-out for a post with this title, but stay with me, because "I can't tell them apart" turns out to be the useful finding.</p>
<h2 id="the-short-answer">The short answer</h2>
<p>There is no single best LLM for frontend design right now, at least not among the models I use. Across four briefs, GPT-5.6 Sol took two, Claude Opus 5 took one and tied another, and Qwen3.8-Max shared that tie. The gaps were small enough that a different judge would produce a different table. The practical move is to run one prompt through three or four models and pick whichever output you like, because that costs ten minutes and beats agonising over the correct choice.</p>
<table>
<thead>
<tr>
<th>Brief</th>
<th>My pick</th>
<th>Notes</th>
</tr>
</thead>
<tbody><tr>
<td>Pip &amp; Pocket (early learning)</td>
<td>GPT-5.6 Sol</td>
<td>Opus 5 very close, better illustrations</td>
</tr>
<tr>
<td>Still Running (conference)</td>
<td>Claude Opus 5, barely</td>
<td>Kimi K3 and Luna right behind</td>
</tr>
<tr>
<td>Three in a Row (game)</td>
<td>Opus 5 and Qwen3.8-Max, tied</td>
<td>Sol and DeepSeek Flash had a layout bug</td>
</tr>
<tr>
<td>Ordinary Hours (perfume)</td>
<td>GPT-5.6 Sol</td>
<td>Changed my mind, see below</td>
</tr>
</tbody></table>
<h2 id="which-models-and-why-these-ones">Which models, and why these ones</h2>
<p>The lineup is Claude Opus 5, GPT-5.6 Sol, GPT-5.6 Luna, Qwen3.8-Max, Grok 4.6 and DeepSeek V4 Flash. On the conference brief I also managed to run DeepSeek V4 Pro, Kimi K3 and MiniMax M3.</p>
<p>These are the models I actually use and pay for. That's the whole selection criterion, and I'd rather state it plainly than pretend this is a comprehensive benchmark.</p>
<p>The obvious absences are Kimi and GLM, which I know are strong at this. I don't have a Kimi Code or GLM Code subscription. I have <a href="/blog/opencode-go-review/">opencode go</a>, but running those models through it is expensive enough and limited enough that I couldn't do a full grid, which is why Kimi shows up on exactly one brief. Gemini isn't in here either, and that one bothers me most, because <a href="/blog/google-antigravity-review-i-tested-gemini-3-5-flash/">I liked a lot of what Gemini 3.5 Flash produced</a> for web design and I want to see whether 3.7 kept it. All three are on the list to add to the comparison site later.</p>
<h2 id="how-i-ran-it">How I ran it</h2>
<p>Four briefs, picked to stress different things.</p>
<p>Pip &amp; Pocket is an early learning centre. Still Running is a running conference. Three in a Row is tic-tac-toe, the only brief with real interaction. Ordinary Hours is a perfume brand, and that prompt asks for something specific: three genuinely different visual styles on one page, switchable with a button.</p>
<p>One run per model per brief. I didn't tune anything, didn't feed anyone a design system, didn't specify fonts. That's deliberate, and I'll come back to why.</p>
<p>The site holding the results was built in one shot by Grok 4.6. Keyboard shortcuts, a compare view, click a model name to see its whole row or column. I asked for a way to browse test results and got something better than I would have specced.</p>
<p>The usual caveats apply and I'd rather say them than have you find them. Single judge, no blind voting, no accessibility or performance audit, HTML only. Nothing here tells you how these models behave inside a real React codebase.</p>
<p>The one that matters most: every cell in this grid is a single generation. These models are not deterministic, so any given result is one sample from a range, and a rerun could land somewhere else entirely. Keep that in mind for everything below, especially anywhere I say a model got something wrong.</p>
<h2 id="brief-by-brief">Brief by brief</h2>
<h3 id="pip-pocket-and-why-cute-is-hard">Pip &amp; Pocket, and why cute is hard</h3>
<p>This is the brief I'd keep if I could only keep one, because it's the one that isn't on home turf.</p>
<p>These models are excellent at modern, dark, techy, minimal, slightly artsy. That's the register they default to and it's clearly the register they've seen most. Ask for cute, bright, friendly and colourful and things get shakier. It's the same reason a session musician who's played nothing but jazz for ten years sounds a bit odd playing country.</p>
<p>Opus and Sol were both strong and very close. Opus produced nicer SVG illustrations, no argument there. But I preferred Sol's section layout and its colour choices, and layout and colour is more of the page than the illustrations are. So Sol takes it, narrowly, and I'd understand anyone picking the other way.</p>
<p>Test Results: <a href="https://webdesign-test.thomas-wiegold.com/t/daycare">Pip &amp; Pocket</a></p>
<h3 id="still-running-where-everything-worked">Still Running, where everything worked</h3>
<p>All good. That's the summary.</p>
<p>The conference brief is exactly the modern dark techy thing these models are best at, and it shows. I slightly prefer Opus for the animation on the symbols, but Kimi K3 is great, Luna is very good. If you looked at those three side by side and picked a different one, I'd shrug and agree.</p>
<p>The one weaker result was DeepSeek V4 Pro, which didn't land the way the others did. I want to be careful here, because Pro only ran on this single brief, which makes it unfair to call it the loser of the whole test. It's one result. Worth noting, not worth a verdict.</p>
<p>Test Results: <a href="https://webdesign-test.thomas-wiegold.com/t/event">Still Running</a></p>
<h3 id="three-in-a-row-and-a-real-bug">Three in a Row, and a real bug</h3>
<p>The only brief with actual interaction, so the criteria change. What happens on hover, does the win state get any celebration, do the tap targets work on a phone.</p>
<p>Sol and DeepSeek Flash both had the same concrete problem: the grid squares weren't holding their aspect ratio, so dropping an X or an O into a cell stretched it into a rectangle. The layout was just broken.</p>
<p>Opus and Qwen3.8-Max both produced designs that fit a game. Nothing clever, it just works, which for a game is the entire job. Luna was good too.</p>
<p>Worth flagging that Sol's box bug is almost certainly not a fixed property of Sol. It's one generation. Ask again and there's every chance the sizing comes out fine, and I'd have written a different paragraph.</p>
<p>That's the clearest illustration in the whole test of why you generate several times before concluding anything about a model. Including anything I've concluded here.</p>
<p>Test Results: <a href="https://webdesign-test.thomas-wiegold.com/t/gameui">Three in a Row</a></p>
<h3 id="ordinary-hours-where-i-changed-my-mind">Ordinary Hours, where I changed my mind</h3>
<p>The perfume prompt asks for three distinct visual styles on one page with a button to switch between them, which makes it a test of range. Can the model produce three different aesthetics, or does it produce one aesthetic three times?</p>
<p>My original pick was Luna, and I was pleased about that because Luna is OpenAI's cheap tier and Sol is the flagship, with more than twenty times the per-token price between them. Cheap model wins beauty contest, nice story.</p>
<p>Then I went back through the results while writing this and found a bug: Luna's second theme doesn't render properly. So the story changes. Sol gets it instead, and on its own merits: its three themes are properly distinct from each other, which is the thing the brief was actually asking for.</p>
<p>I'm leaving the reversal in rather than quietly editing the table, because it's a decent illustration of what these comparisons are actually like. You look, you form an impression, you look again and the impression moves.</p>
<p>Test Results: <a href="https://webdesign-test.thomas-wiegold.com/t/perfume">Ordinary Hours</a></p>
<h2 id="where-the-models-separate-and-where-they-dont">Where the models separate, and where they don't</h2>
<p>Line up the four briefs and a pattern falls out that I didn't expect going in.</p>
<p>On the conference site, everyone was good. On the perfume site, most were interesting. On tic-tac-toe, two models had a sizing bug but the designs were fine. On the early learning centre, the field spread out.</p>
<p>The briefs where models are hard to tell apart are the briefs that sit right in the middle of what they've been trained on. Dark, modern, sans-serif, generous whitespace, a bit of motion. Anthropic has a name for the underlying effect: distributional convergence, models drifting toward the median of their training data. Inter, purple to blue gradients, four identical rounded stat cards in a row. You know the look, and you know it because you've now seen it four hundred times.</p>
<p>Push a model off that median and the differences show up. Cute, bright and colourful is off the median. So, in a different way, is "give me three unrelated styles in one file."</p>
<p>Which suggests something for anyone benchmarking this themselves: test the thing your models are bad at, not the thing they're good at. A test where everyone scores well isn't measuring much.</p>
<h2 id="what-the-leaderboards-say-and-where-i-disagree">What the leaderboards say, and where I disagree</h2>
<p>The public picture as of mid-August 2026: <a href="https://arena.ai/leaderboard/code/webdev">Arena's WebDev board</a> has Claude Opus 5 at number one, with Kimi K3 and Qwen3.8-Max next. The <a href="https://www.designarena.ai/leaderboard/website">Design Arena website board</a> has Kimi K3 in front, with Opus 5, GLM-5.2, Gemini 3.7 Flash and Grok 4.6 packed into roughly ten Elo points behind it.</p>
<p>Two caveats I'd rather state than pretend precision. The gaps in that top group are smaller than the confidence intervals, so the ordering shuffles week to week. And the Design Arena figures everyone quotes, including the ones above, come from third-party mirrors labelled display-only, because the live board is JavaScript-gated. Treat any specific number as approximate.</p>
<p>Now the interesting bit. Design Arena says Kimi K3 is the best design model going. On the one brief where I ran Kimi against Opus 5, it was close enough that I gave Opus the edge on a feeling about some animations, which is not exactly a rigorous tiebreak.</p>
<p>The board isn't wrong. It's answering a different question. Design Arena runs thousands of blinded pairwise votes across thousands of prompts, and their <a href="https://notes.designarena.ai/methodology/">methodology</a> hides model identity, updates every couple of hours and uses Bradley-Terry ratings. What comes out is average preference across a crowd, and that's a good design for the question they're asking.</p>
<p>It just isn't my question. I'm picking one output for one brief with my own preferences attached. Average preference and my preference are allowed to disagree, and when the top five are within ten Elo of each other, they will disagree all the time. Two of my four picks are GPT models, which the frontend boards don't rank as design leaders at all.</p>
<p>Use the leaderboards to decide which four models to try. Don't use them to decide which one to ship.</p>
<h2 id="is-it-the-model-or-the-system-prompt">Is it the model, or the system prompt?</h2>
<p>A while back I wrote about <a href="/blog/claude-code-frontend-design-plugin/">the Claude Code frontend design plugin</a> and how much it improved raw output. I've since stopped using it, because the models got good enough that I stopped noticing the difference.</p>
<p>Which leaves a question I can't fully answer: did the weights get better, or did the scaffolding around them get better?</p>
<p>There's real evidence for scaffolding. Anthropic ships a frontend-design skill inside Claude Design specifically to push the model away from that convergence problem. The Claude web app often produces nicer UI than raw Claude Code, and the gap there is instructions, not capability. Design Arena also <a href="https://www.designarena.ai/system-prompts">publishes its exact system prompts</a>, rendered from source, so this half of the question is testable by anyone with a spare afternoon.</p>
<p>My test used plain prompts with no design system, which measures each model's default taste. That's worth measuring, because the default is what most people get. It's also the floor. Every model here would do better work with an actual brief attached, and none of them got one.</p>
<p>If you want the single highest-leverage habit here: constrain before you generate, and use positive constraints rather than negative ones. Telling a model "no blue" fails often. Aliasing the whole blue, indigo and purple range to a named custom scale works, because you've replaced the default instead of forbidding it.</p>
<h2 id="the-workflow-id-actually-use-now">The workflow I'd actually use now</h2>
<p>Generate simple single-file HTML across three or four models, several runs each. Cheap, fast, disposable. Pick the winner on taste alone and ignore the code quality completely, because you're throwing the code away. Then hand that HTML to whichever coding model you trust and convert it into a real React app, a Shopify theme, a WordPress theme, whatever you're building.</p>
<p>This beats one-model-does-everything because the two passes reward opposite things. The design pass wants variance, so you want several models producing several different answers. The build pass wants correctness, so you want one model that doesn't hallucinate imports.</p>
<p>And given how often my picks came down to a vibe, running more variations is worth more than choosing the right model. That's the actual takeaway from all of this.</p>
<p>Which does leave me open to the obvious charge, so I'll make it myself: my test does exactly one run per model, which is precisely the thing I'm telling you not to do. Fair. I was going for breadth across models, which is a different exercise from actually designing something. But if I ran it again I'd do three passes on the early learning brief at minimum, because that's the one where the spread between models was widest and a single sample tells you the least.</p>
<h3 id="do-you-still-need-to-hire-a-designer">Do you still need to hire a designer?</h3>
<p>In the plugin post I said yes, hire one for anything that matters. I'm less sure now, and I'd rather revise that in public than quietly leave it up.</p>
<p>Where I've landed: large company or brand-defining project, hire the designer. SMB or solo operator, the output has crossed the line where it stops looking like slop, and the money is probably better spent elsewhere.</p>
<p>The obvious objection is that AI design is homogenising everything, and the objection is correct. Kyle Chayka called it "Claudian sameness" in The New Yorker this July. Michal Malewicz's Slopless manifesto is an explicit rebellion against it. There's academic backing too: Doshi and Hauser found in <em>Science Advances</em> (volume 10, issue 28, July 2024) that generative AI makes individual writers more creative while making the collective output more similar to itself.</p>
<p>But look at what my advice actually is. Generate a spread, then choose between the options deliberately, even when you can't fully articulate the choice.</p>
<p>That's a direct antidote to convergence. Sameness is what you get from one model, one run, zero judgment. The judgment didn't disappear, it moved. It used to happen while drawing and now it happens while choosing. Smaller job, and I won't pretend otherwise, but it's still the part that decides whether the result is any good.</p>
]]></content:encoded>
      <pubDate>Fri, 21 Aug 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-08-21T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI News</category>
      <category>LLM</category>
      <category>Review</category>
      <category>Design</category>
      <category>GPT-5.6</category>
      <category>Claude</category>
      <category>Qwen</category>
    </item>
    <item>
      <title><![CDATA[Grok Bot Explained: Cloud AI Agents vs Open Source]]></title>
      <link>https://thomas-wiegold.com/blog/grok-bot-explained/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/grok-bot-explained/</guid>
      <description><![CDATA[Grok Bot lets AI teammates sign into your tools and finish real work. Here’s how it works, what it costs, where it falls short, and who it’s actually for.]]></description>
      <content:encoded><![CDATA[<p>When I first saw the screenshots of Grok Bot, I thought it looked pretty interesting. Named agents that sign into your real tools, hang around on a cloud computer even when your laptop is shut, and hand the finished work back. It felt different from the usual chat window. After sitting with it for a while, though, I’m less sure how much of that difference is real power and how much is just nicer packaging. Classic new-tool optimism.</p>
<p>Grok Bot is xAI’s early-beta product for AI teammates. It launched on 11 August 2026 and right now you only get it with SuperGrok Heavy, Cursor Ultra, or Cursor Premium Teams. The basic idea is simple: you give these bots real work, they use your tools the way you would, and they only ping you when something needs approval. Official details are on the <a href="https://x.ai/bot">product page</a> and the <a href="https://x.ai/news/introducing-grok-bot">launch post</a>.</p>
<p>I’ve been messing around with agent setups for a while, including the open-source ones, so this is my attempt to figure out what’s actually useful and what’s still half-baked.</p>
<h2 id="what-is-grok-bot-and-how-does-it-work">What Is Grok Bot and How Does It Work?</h2>
<p>You download a desktop or iOS app, create one or more named bots with roles (Chief of Staff, Sales Outbound, Inbox Manager, whatever), connect your tools once, and then just talk to them. The bots share a single persistent cloud computer. Cookies, sessions, files and CLI credentials are shared across every bot on the same account. Each bot gets its own screen so they can do visual work at the same time.</p>
<p>That computer keeps running after you close the app. You can watch a live preview of what they’re clicking and typing. Sensitive actions (sending email, making payments, that kind of thing) still need your explicit okay. You can also teach a routine by showing it once and then let the bot repeat it. In theory, anyway.</p>
<p>Under the hood it runs on the current Grok stack. Grok 4.6 (the agent-focused model with a 500k context window) is available in the broader system, including Grok Bot. More details live in the <a href="https://docs.x.ai/grok-bot/computer-and-apps">computer and apps docs</a> and the <a href="https://docs.x.ai/developers/grok-4-6">Grok 4.6 documentation</a>.</p>
<p>The practical difference is that you’re no longer stuck with chat-style suggestions. The bots can research, draft in your voice, update CRM records, triage an inbox, or pass work between themselves. That part feels different from pure language models.</p>
<h2 id="real-workflows-people-are-running">Real Workflows People Are Running</h2>
<p>In the first week a bunch of concrete examples showed up. Sales teams are running overnight pipelines: research prospects, score them, draft sequences in the user’s voice, then queue everything for approval. Ops people are doing inbox triage plus draft replies, weekly report generation, and expense chasing. Some treat a Chief of Staff bot as the router that hands tasks to specialist bots.</p>
<p>Engineering examples include bug reproduction and ticket filing. Content folks are building production and distribution pipelines. A few people are even using it for personal admin (bookings, subscription cleanup, that sort of thing). I haven’t asked one to cancel a gym membership for me yet, but the option is technically there.</p>
<p>The pattern that keeps coming up is multi-bot collaboration. One bot researches, another drafts, a third checks CRM state, and they pass context around in shared threads. It’s the closest thing I’ve seen so far to treating AI like junior colleagues rather than a single smart search box. Whether that mental model is actually better than a clean task list plus cron jobs is still an open question for me, but a lot of early users seem to like the conversational framing.</p>
<h2 id="how-good-is-it-right-now-speed-reliability-limits">How Good Is It Right Now? Speed, Reliability &amp; Limits</h2>
<p>The UX is polished. Onboarding is smooth and the interface feels intentional. That is not nothing. Plenty of agent tools still look like they were designed by people who only talk to terminals.</p>
<p>The weak spots are more interesting. Pure computer use (driving the browser by screenshots) is still slow and unreliable for anything non-trivial. Simple tasks can feel frustrating, like watching someone type with one finger while narrating every keystroke. Heavy agentic sessions also burn through the available compute faster than you’d expect. There are reports of multi-bot runs hitting weekly limits after only a couple of hours of real work.</p>
<p>Access starts at $200 a month with Cursor Ultra or $300 with SuperGrok Heavy. Teams get in at $120 a seat. There’s no free or lower tier in the current beta. For people already paying those prices the extra cost is zero, but for everyone else it’s a real barrier.</p>
<p>I still think the managed cloud computer is the actual product. Everything else (chat interface, named bots, hand-offs) is packaging around that. The packaging is good. The computer itself isn’t yet as fast or solid as you’d want for production-grade workflows.</p>
<h2 id="grok-bot-vs-hermes-agent-and-openclaw">Grok Bot vs Hermes Agent and OpenClaw</h2>
<p>This is the comparison that matters if you’ve already spent time with local agents.</p>
<p>Grok Bot locks you to the Grok models and charges a premium for the managed environment. Hermes and OpenClaw are free and open-source. You bring your own models (including Grok if you want), your own machine or server, and you own the whole stack. Setup is heavier and you handle security yourself. I wrote more about Hermes in <a href="https://thomas-wiegold.com/blog/hermes-agent-what-it-is/">this earlier post</a>.</p>
<p>The honest split is simple. If you want zero setup and a polished “talk to your teammates” experience, Grok Bot is currently the cleanest option. If you care about cost, model freedom, and not handing credentials to a shared cloud computer, the open-source tools are still stronger. Some people are running both. They use Grok Bot for the easy stuff and keep Hermes or OpenClaw for the work that needs more control.</p>
<p>I don’t think the chat format itself adds massive new capability over well-designed tasks and repeating jobs. It’s mostly a UI and mental-model choice. That choice will matter more to some people than others.</p>
<h2 id="who-is-grok-bot-actually-for-and-who-its-not">Who Is Grok Bot Actually For (and Who It’s Not)</h2>
<p>This is where my own thinking settled. The product is clearly aimed at people who don’t want to set up and secure a local agent. Office knowledge workers, GTM folks, founders who already live in Cursor or SuperGrok, and anyone who likes the idea of little workers that talk to each other will probably feel at home here. The conversational framing maps more cleanly onto how humans already work together than a pure task queue does. It feels a bit like managing a very polite, slightly over-eager intern team that never sleeps.</p>
<p>If you’re already deep into open-source agents and comfortable with the operational overhead, Grok Bot will feel expensive and constrained. The price and the current usage limits are the real hurdles. I also expect other companies to ship similar managed teammate products over the next year or two. This pattern isn’t going away.</p>
<p>For smaller teams trying to decide where agents fit, the broader landscape still matters. I looked at some of those options in <a href="https://thomas-wiegold.com/blog/ai-agents-for-small-business-2026/">this piece on AI agents for small business</a>. And if you’re still evaluating the underlying models, my earlier <a href="https://thomas-wiegold.com/blog/grok-4-5-review/">Grok 4.5 review</a> covers the previous generation.</p>
<h2 id="closing-thoughts">Closing Thoughts</h2>
<p>Grok Bot is interesting. The managed persistent computer plus real tool sign-in is a genuine step past pure chat agents. The teammate framing and multi-bot collaboration make the experience feel more natural for a lot of knowledge work.</p>
<p>It’s also still early. Computer use is slower than it should be, quotas disappear under load, and the price keeps it out of reach for many people who would otherwise try it. I’m not ready to call it a must-have. I’m also not writing it off. The idea of always-on AI workers that can hand work between themselves is clearly useful. We’re going to see more of this, both from xAI and from everyone else.</p>
<p>If you’re already on an eligible subscription, it’s worth spinning up a couple of bots and seeing how the workflows feel in practice. If you’re not, keep an eye on the open-source side and wait for the next round of improvements. Either way, the gap between “AI that suggests” and “AI that finishes the job” is getting smaller. And that is probably the part worth paying attention to.</p>
]]></content:encoded>
      <pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-08-18T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI Coding</category>
      <category>Grok</category>
      <category>SpaceXAI</category>
      <category>AI Agents</category>
      <category>Agentic AI</category>
      <category>Developer Tools</category>
    </item>
    <item>
      <title><![CDATA[Qwen3.8-27B: the best local LLM you probably can't run]]></title>
      <link>https://thomas-wiegold.com/blog/qwen-3-8-27b-best-local-llm/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/qwen-3-8-27b-best-local-llm/</guid>
      <description><![CDATA[Qwen3.8-27B runs on consumer hardware under Apache 2.0. I tested it on a 24GB M4 — here's the real RAM, speed and privacy picture, minus the hype.]]></description>
      <content:encoded><![CDATA[<p>Alibaba dropped two models this month, and the one everybody wrote about was the wrong one. Qwen3.8-Max is a 2.4 trillion parameter API product, and I <a href="/blog/qwen-3-8-max-review/">reviewed it a couple of weeks ago</a> with a fair amount of enthusiasm. But the release I was actually waiting for landed on August 14: <a href="https://huggingface.co/Qwen/Qwen3.8-27B">Qwen3.8-27B</a>, Apache 2.0, weights on Hugging Face, small enough to run on a laptop.</p>
<p>I need to be upfront about something. I did not run my full test suite on this model. I tried, got about eight tokens per second on my M4 MacBook Air, and lost patience somewhere around the second prompt. That failure is most of what this post is about, because I suspect a lot of you are about to have the same evening I had.</p>
<h2 id="what-qwen38-27b-actually-is">What Qwen3.8-27B actually is</h2>
<p>27.78 billion parameters, dense, including a vision encoder that nobody had announced in advance. It takes text, images and video in. Native context is 262,144 tokens, extensible to roughly a million with YaRN scaling if you're running it on a server.</p>
<p>The architecture is the genuinely interesting part, and it isn't a plain transformer. Across 64 layers, Qwen interleaves 48 Gated DeltaNet layers (linear attention) with 16 full Gated Attention layers, in a 3:1 ratio. Only those 16 full-attention layers keep a KV cache. That works out to about 64 KB per token, roughly a quarter of what a conventional 64-layer dense model would want.</p>
<p>If you only remember one number from this post, make it that one. Everything about whether this model fits on your machine comes back to KV cache growth.</p>
<p>Thinking mode is on by default, with a <code>reasoning_effort</code> knob set to xhigh out of the box. You can drop it to medium or low. You will want to. More on that shortly.</p>
<h2 id="the-benchmarks-and-why-id-discount-them">The benchmarks, and why I'd discount them</h2>
<p>Qwen's own table looks great:</p>
<table>
<thead>
<tr>
<th>Benchmark</th>
<th>Qwen3.8-27B</th>
<th>Qwen3.6-27B</th>
</tr>
</thead>
<tbody><tr>
<td>SWE-bench Pro</td>
<td>61.7</td>
<td>53.5</td>
</tr>
<tr>
<td>LiveCodeBench v6</td>
<td>90.3</td>
<td>83.9</td>
</tr>
<tr>
<td>GPQA-Diamond</td>
<td>89.2</td>
<td>87.8</td>
</tr>
<tr>
<td>Terminal-Bench 2.1</td>
<td>73.0</td>
<td>63.4</td>
</tr>
<tr>
<td>DeepSWE 1.1</td>
<td>42.2</td>
<td>13.3</td>
</tr>
<tr>
<td>OSWorld-Verified</td>
<td>84.3</td>
<td>63.9</td>
</tr>
</tbody></table>
<p>Jump from 13.3 to 42.2 on DeepSWE is not a rounding error. The generational gain over Qwen3.6-27B looks real and it's consistent across the whole table rather than one suspicious spike.</p>
<p>Now the part that made me rewrite my first draft. Every one of those numbers came from Qwen. Some of the benchmarks are in-house, some have corrected ground truth, and the competitor scores in their comparison were imported rather than re-run. As of the time I'm writing this, <a href="https://artificialanalysis.ai/">Artificial Analysis</a> hasn't published an intelligence index for the 27B, and no lab has reproduced anything.</p>
<p>I originally wanted to write "we now have Opus 4.6 level intelligence running on consumer hardware." Then I read Qwen's own table properly. Opus 4.6 Max is ahead on Terminal-Bench 2.1 (78.2 to 73.0), ahead on GPQA-Diamond (91.3 to 89.2), and comfortably ahead on Humanity's Last Exam (40.0 to 30.8). The 27B wins some rows and loses others, on a scorecard the vendor produced. "Beats Opus" is a headline, not a finding.</p>
<p>What's true is still remarkable: a 28B model you can download for free is trading blows with a frontier API on coding benchmarks. That's the story. It doesn't need inflating.</p>
<h3 id="what-it-feels-like-to-use">What it feels like to use</h3>
<p>I did play with it, just not systematically. It's very good. The benchmark direction matches the vibe, which is the most I'm willing to claim from an afternoon of poking at it.</p>
<p>Simon Willison, who has been running his SVG pelican test on everything for two years now, <a href="https://simonwillison.net/2026/Aug/16/qwen-38-27b/">called it the best pelican</a> he's seen from a model that runs on his laptop. He also noted the run took nearly 21 minutes and burned 22,276 reasoning tokens to produce 3,223 tokens of output. On an M5 Max. That is the model in one anecdote: strong, and exhaustingly thorough about it.</p>
<p>The most common complaint in the first week wasn't quality, it was verbosity. At default xhigh the thing meanders. People running it in agent loops report 10k tokens where a competing model uses one. There are also chat template bugs, including a fatal exception if you pass <code>enable_thinking=false</code>, so grab a community-fixed template before you wire it into anything serious.</p>
<h2 id="can-you-run-it-the-hardware-maths">Can you run it? The hardware maths</h2>
<p>Short version: you need about 17 to 18 GB for a 4-bit quant, plus KV cache on top. 24 GB of unified memory is the practical floor, 32 GB is where it gets comfortable, and 48 GB is the value sweet spot.</p>
<p>Here's the <a href="https://huggingface.co/unsloth/Qwen3.8-27B-GGUF">Unsloth GGUF</a> table, which is the one everyone is working from:</p>
<table>
<thead>
<tr>
<th>Quant</th>
<th>Size</th>
<th>Notes</th>
</tr>
</thead>
<tbody><tr>
<td>UD-Q3_K_XL</td>
<td>13.4 GB</td>
<td>emergency option for 16 GB</td>
</tr>
<tr>
<td>Q4_K_M</td>
<td>17.1 GB</td>
<td>standard 4-bit</td>
</tr>
<tr>
<td>UD-Q4_K_XL</td>
<td>17.9 GB</td>
<td>the default I'd pick</td>
</tr>
<tr>
<td>Q5_K_M</td>
<td>19.8 GB</td>
<td>needs 32 GB</td>
</tr>
<tr>
<td>Q8_0</td>
<td>29.0 GB</td>
<td>near-full fidelity</td>
</tr>
<tr>
<td>BF16</td>
<td>54.7 GB</td>
<td>reference</td>
</tr>
</tbody></table>
<p>Add roughly 0.93 GB for the vision projector if you want image input, because it isn't bundled with the language GGUF. And don't go below Q4 on this model. Multiple people reported quality falling off a cliff, more than they expected for a 27B, and aggressive KV cache quantization broke at least one person's private eval outright.</p>
<p>KV cache maths at 64 KB per token: 8K context is about half a gig, 32K is 2 GB, 128K is 8 GB, and the full 262K is 16 GB on its own. Start at 8K and raise it while watching memory pressure. The million-token YaRN context is a server feature and static YaRN hurts short-prompt quality anyway.</p>
<h3 id="the-apple-silicon-specifics">The Apple Silicon specifics</h3>
<p>Three things that surprised me.</p>
<p>First, Ollama's fast MLX backend requires more than 32 GB of unified memory, so a 24 GB Air can't use it at all. You're on the GGUF path: <a href="https://lmstudio.ai/">LM Studio</a> if you want one-click, <a href="https://github.com/ggml-org/llama.cpp">llama.cpp</a> if you want control.</p>
<p>Second, that matters less than you'd think, because the "MLX is faster on Apple Silicon" rule mostly applies to small models. The MLX advantage is large under about 14B and collapses above 27B, where you become memory-bandwidth-bound and the runtime stops being the bottleneck. So pick GGUF and stop worrying about it.</p>
<p>Third, thermals. The Air is fanless. Sustained inference pins the GPU and the chassis heats up, and testing converges on roughly 60 to 70% of peak after eight to ten minutes of full load. For a chat session you'll never notice. For a long refactor you absolutely will.</p>
<h2 id="where-i-hit-the-wall">Where I hit the wall</h2>
<p>My M1 Mac Mini has 16 GB. It is not a host for this model, full stop. The 4-bit build needs 17-something gigabytes and the machine just swaps itself into uselessness. I run a 4B coder there and that's fine.</p>
<p>The M4 Air has 24 GB and it does load. It runs. It also produces fewer than ten tokens per second once you're a few thousand tokens in, which sounds survivable until you combine it with a model that wants to spend 20,000 reasoning tokens thinking about your question. I sat there watching text appear at reading speed and decided I had better things to do with my afternoon. The only measured number I've seen for base M4 silicon on this model is 5 to 6 tokens per second on a 32 GB Mac Mini, so I don't think I got unlucky.</p>
<p>Here's the part I'm actually annoyed about. Two years ago I looked at upgrading and talked myself out of it. The reasoning felt sound at the time: local models weren't good enough to justify the spend, and Apple had new chips coming. Both of those things were true. What I got wrong was the ordering. The models got good faster than the hardware got cheap, and now memory prices are ugly and the machine I want costs more than it did when I didn't want it.</p>
<p>If you're weighing this up now, the lesson generalises. Buy the RAM before you can justify it. With local inference the useful model always shows up before the affordable machine does, and you can't add unified memory later.</p>
<h2 id="who-should-actually-buy-hardware-for-this">Who should actually buy hardware for this</h2>
<p>Privacy is the whole argument, and it's a strong one. Apache 2.0 weights running fully offline is a different conversation with your compliance people than a hosted API's terms of service. If you're a doctor, a lawyer, an accountant, or anyone else who handles material that legally cannot leave the building, this is the first time the local option has been good enough to be boring rather than a compromise. I do a fair bit of <a href="/ai-consulting-sydney/">AI consulting work in Sydney</a> with exactly those professions, and the conversation has changed completely in about six months.</p>
<p>For that use case I'd buy hardware today. A maxed Mac Studio, a 48 GB M4 Pro Mac Mini (best value Mac for this specific model, and a desk-bound machine dissipates heat properly), a DGX Spark, or an RTX 5090 if you're on the Nvidia side. The 5090 numbers are in a different league: 200-plus tokens per second with NVFP4 and speculative decoding, versus my sad little eight.</p>
<p>What I wouldn't do is pretend this replaces a hosted API for everything. It isn't fast enough for long agent loops or batch work on a laptop, and the hardest 5% of tasks are exactly where a frontier model still earns its subscription. The pattern that works is hybrid. API for the difficult things, local for volume and for anything that can't leave your machine.</p>
<h2 id="why-this-is-apples-opening">Why this is Apple's opening</h2>
<p>Apple has had a rough couple of years in AI by every measure that gets written about. But they own the layer local inference actually needs, which is a lot of fast unified memory in a machine normal people already buy.</p>
<p>Think about what happens if the current trajectory holds. If a local model handles 95% of what you do in a day, what's the marginal case for a monthly subscription? I don't think the answer is "none," because that last 5% is where the value concentrates and it's the part you'd pay for anyway. But it changes the shape of the market a lot, and it changes it in a direction where the company selling you 128 GB of unified memory does very well.</p>
<p>The open question is memory prices. Either the current buildout overshoots and we get a glut, or the datacentre demand keeps eating supply and consumer RAM stays expensive for years. I'd bet on the glut, mostly because everyone building capacity right now is assuming everyone else won't. That bet has a poor historical record for the people making it and a good one for the rest of us.</p>
<h2 id="where-i-land">Where I land</h2>
<p>Qwen3.8-27B is the most important open release of the year if you have the machine, and a preview if you don't. I'm in the second group and it's my own fault.</p>
<p>Two things would change my read. Independent reproduction of those benchmarks, which nobody has done yet and which I'd want before repeating any of the vendor numbers as fact. And a quantization or a speculative decoding build that gets a 24 GB Mac to twenty tokens per second, at which point I'd stop writing about this model and start using it.</p>
<p>If you've got 32 GB or more, go get it. Set your context to 8K, use the official thinking-mode sampling parameters (temperature 1.0, top_p 0.95, top_k 20), drop <code>reasoning_effort</code> to medium, and tell me if it's as good as I think it is.</p>
]]></content:encoded>
      <pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-08-17T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI News</category>
      <category>Alibaba</category>
      <category>Qwen</category>
      <category>Qwen3.8-27B</category>
      <category>LLM</category>
      <category>Local AI</category>
    </item>
    <item>
      <title><![CDATA[Pi Coding Agent: The SDK Is the Real Reason to Care]]></title>
      <link>https://thomas-wiegold.com/blog/pi-coding-agent/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/pi-coding-agent/</guid>
      <description><![CDATA[I spent a week with the Pi coding agent. The CLI is good, not revolutionary — the TypeScript SDK is what makes it worth switching. Setup, extensions, and a working build.]]></description>
      <content:encoded><![CDATA[<p>I installed the pi coding agent because my feed wouldn't shut up about it, and I fully expected to uninstall it the same afternoon. That's not cynicism, it's pattern recognition. In 2026 the terminal coding agents have mostly converged. They read files, they write files, they run bash, they stream tokens at you in a nice box. Swap the logo and half of them are indistinguishable.</p>
<p>Day one with pi did nothing to change my mind. It felt sparse to the point of feeling broken.</p>
<p>Then I installed a handful of extensions, and about a week later I noticed something. I'd been splitting my work across Claude Code, OpenCode and Grok Build, and now pi had quietly absorbed most of it. Claude Code is the thing I open when I specifically want a Claude model. Everything else moved. What surprised me more is that the CLI isn't actually the interesting part. The SDK is. Once you can call an agent as a library from a cron job, with only the tools you handed it, you stop thinking about coding assistants and start thinking about small autonomous programs that happen to have a language model in the middle.</p>
<p>This post covers the install, the extensions that saved it for me, an honest account of the security model (it doesn't really have one), and a worked SDK example: a document processing agent that turns messy supplier invoices into validated structured JSON.</p>
<h2 id="what-is-the-pi-coding-agent">What is the pi coding agent?</h2>
<p>Pi is a minimal, MIT-licensed terminal coding agent and TypeScript agent toolkit. It ships with four built-in tools (read, write, edit, bash) and a system prompt that, together with those tool definitions, comes in under 1,000 tokens. It supports 15+ model providers with mid-session switching, and everything beyond the core is meant to be an extension you write yourself.</p>
<p>It was created by Mario Zechner, who you might know from <a href="https://libgdx.com/">libGDX</a> or Spine, and it's now stewarded by Earendil Inc., the company Armin Ronacher co-founded. The repo lives at <a href="https://github.com/earendil-works/pi">earendil-works/pi</a>. Star count is somewhere north of 80,000 as I write this, though it's climbing fast enough that whatever number I put here will be wrong by the time you read it.</p>
<p>The design thesis is aggressive minimalism. No MCP. No sub-agents. No plan mode. No built-in todo list. No permission sandbox. Zechner's position is roughly "if I don't need it, it won't be built," and the intended response to a missing feature is that you ask pi to build it for you, then reload.</p>
<p>Quick naming note, because search engines are hopeless at this: this pi is not Inflection's Pi chatbot, not a Raspberry Pi, and not <code>github.com/badlogic/pi</code>, which is a completely different CLI for managing vLLM GPU pods. Zechner has said he picked an un-Googleable name as a joke so nobody would ever use it. That plan failed spectacularly.</p>
<h3 id="install-pi-coding-agent">Install pi coding agent</h3>
<p>Or <code>curl -fsSL https://pi.dev/install.sh | sh</code> if you'd rather have the standalone binary. You need Node 20+ or Bun. It runs on macOS, Linux, Windows, and apparently Termux on Android, which I have not tried and probably never will.</p>
<p>Then either <code>/login</code> for subscription OAuth, or drop API keys into your environment or <code>~/.pi/agent/auth.json</code>.</p>
<p>One trap worth knowing about: the packages moved from the <code>@mariozechner/*</code> scope to <code>@earendil-works/*</code> back in May 2026. Any tutorial or Stack Overflow answer older than that will point you at deprecated packages. <code>pi update --self</code> handles the migration if you were already on the old scope.</p>
<h3 id="pi-coding-agent-setup">Pi coding agent setup</h3>
<p>Context files work the way you'd hope. Pi loads <code>AGENTS.md</code> hierarchically, global first then project, and it also reads <code>CLAUDE.md</code>, so migrating an existing repo is genuinely a no-op. Nice touch.</p>
<p>Sessions auto-save to <code>~/.pi/agent/sessions/</code> organised by working directory. <code>pi -c</code> continues the most recent one, <code>pi -r</code> gives you a browser, <code>--fork</code> branches. They're trees rather than flat logs, so you can rewind a bad state, go do a side quest, and merge a summary back. Stored as plain JSONL, which means you can grep it, which I appreciate more than I expected to.</p>
<p>The first time you open a project with local <code>.pi/</code> config, pi asks whether you trust it. Remember that prompt, because it's more limited than it sounds and we'll come back to it.</p>
<h2 id="a-week-in-whats-missing-and-the-extensions-that-fixed-it">A week in: what's missing, and the extensions that fixed it</h2>
<p>My first two hours with pi were mildly unpleasant. I'd internalised a bunch of conveniences from Claude Code, OpenCode and Grok Build without noticing how much I was leaning on them, and pi has none of them. No todo list, so no sense of what the agent thinks it's doing across a long task. No sub-agents. Minimal status feedback. It felt like being handed a text editor with no syntax highlighting after five years of an IDE.</p>
<p>Then I read the reasoning, and some of it is actually good. MCP servers burn 13,700 to 18,000 context tokens before you've typed a single character, and progressive disclosure through a CLI plus a README does the same job for almost nothing. Sub-agents are opaque black boxes with lousy context transfer. Built-in plan and todo state confuses models, where a <code>PLAN.md</code> file does the job and survives across sessions and tools.</p>
<p>I buy the MCP one completely. I'm less convinced on todos, which is why the first thing I did was add one.</p>
<p>My current install list, in rough order of how much I'd miss them:</p>
<ul>
<li><code>@juicesharp/rpiv-ask-user-question</code>. Lets the agent stop and ask me a clarifying question instead of guessing. This is the one that changed the most. Half of a bad agent run is the model committing to the wrong interpretation in the first thirty seconds, and a single question at the right moment saves the whole session.</li>
<li><code>@juicesharp/rpiv-todo</code>. Ironically the exact feature the project deliberately omitted. It's a todo list for the model, rendered as a live overlay, and it survives <code>/reload</code> and compaction. That last part matters more than it sounds.</li>
<li><code>pi-lens</code>. Real-time code feedback: LSP, linters, formatters, type checking. Pi with no language server is a bit like coding in Notepad, and this closes the gap without dragging in a whole IDE.</li>
<li><code>pi-agent-browser</code>. Browser automation through agent-browser rather than Playwright. I've switched to it for basically everything now. It's dramatically more token-efficient than driving Playwright through an agent, which historically meant dumping enormous DOM snapshots into context and watching the model drown.</li>
<li><code>@tintinweb/pi-subagents</code>. Claude Code style sub-agents. I use them narrowly, for fanning out independent read-heavy work, which is the case where the context-transfer objection doesn't really bite.</li>
<li><code>pi-powerline-footer</code>. Purely cosmetic. I regret nothing. Seeing model, thinking level and token spend at a glance genuinely changes how carefully you spend context.</li>
</ul>
<p>Installing is one line each (<code>pi install npm:pi-lens</code> and so on), and that's the real point. The individual extensions matter less than the fact that assembling my ideal setup took an evening, and the <a href="https://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/extensions.md">extensions API</a> is just TypeScript with hot reload. You can bundle your own into a Pi Package and install it elsewhere from npm or git. When your agent harness is missing something, you don't file an issue and wait.</p>
<p>One caveat that follows directly from that openness: pi packages run with full system access, extensions execute arbitrary code, and skills can instruct the model to run anything. Read the source before you install a stranger's package. I'll come back to this.</p>
<p>Now the part I can't prove. My gut says pi gives me slightly better results than the other CLIs on comparable tasks. My best guess is that it's the tiny system prompt and the absence of clutter, since less junk in the context window means more of the model's attention lands on my actual problem. That lines up with everything I've written about <a href="/blog/context-engineering-for-ai-agents/">context engineering for AI agents</a>. But it's a feeling, not a measurement, and I'm not going to dress it up as one. Let's look at numbers other people collected instead.</p>
<h2 id="pi-coding-agent-vs-claude-code">Pi coding agent vs Claude Code</h2>
<table>
<thead>
<tr>
<th></th>
<th>Pi</th>
<th>Claude Code</th>
</tr>
</thead>
<tbody><tr>
<td>Licence</td>
<td>MIT, open source</td>
<td>Proprietary</td>
</tr>
<tr>
<td>Models</td>
<td>15+ providers, switch mid-session</td>
<td>Anthropic only</td>
</tr>
<tr>
<td>System prompt</td>
<td>Under 1k tokens</td>
<td>~14k tokens</td>
</tr>
<tr>
<td>Built-in tools</td>
<td>4</td>
<td>10+</td>
</tr>
<tr>
<td>Sandbox / permissions</td>
<td>None by default</td>
<td>Deny-first plus sandbox</td>
</tr>
<tr>
<td>Extensibility</td>
<td>TypeScript extensions plus SDK</td>
<td>MCP, hooks</td>
</tr>
</tbody></table>
<p>Minimal doesn't mean weak here. Pi placed second on Terminal-Bench running Claude Opus 4.5, beaten only by the benchmark's own minimal harness, and it did that without MCP, sub-agents or plan mode. Databricks' harness benchmark from 5 August 2026 is more interesting though. Running the same model at the same thinking effort through different harnesses produced cost differences of more than 2x while quality stayed flat, with simple harnesses like pi often coming out best. Their codebase, their tasks, so it's not a universal law. But "the harness materially changes your bill" is worth sitting with.</p>
<p>Now the part that will actually decide this for most people: money.</p>
<p>On 4 April 2026 Anthropic's billing enforcement landed, and third-party tools started drawing from extra usage instead of subscription limits. Pi's own <a href="https://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/providers.md">provider docs</a> still state it plainly: Claude Pro/Max auth works, but third-party harness usage is billed per token, not against your plan. Translation, you can log in, you just don't save any money. There have been partial reversals since, so verify before budgeting around it. Codex, xAI and Copilot logins all work normally and still save you money.</p>
<p>Which brings me to my actual setup, because it's the only honest answer to "is this a Claude Code alternative." I run Grok, ChatGPT/Codex, <a href="/blog/opencode-go-review/">OpenCode Go</a> and Qwen through pi. Claude stays in Claude Code, where it's still covered by my subscription. The result is that I barely open Claude Code anymore, because most of my agent work now runs on my OpenCode Go subscription with DeepSeek V4 Flash 0731, which is very good and absurdly cheap. The recently released version is significantly better than the preview I tested in my <a href="/blog/deepseek-v4-review/">DeepSeek V4 review</a>.</p>
<p>Pi didn't replace Claude Code for me. It made my Claude subscription optional, which is a different and slightly more uncomfortable thing.</p>
<h3 id="pi-coding-agent-with-ollama-and-local-models">Pi coding agent with Ollama and local models</h3>
<p>Local models plug in through an OpenAI-compatible entry in <code>models.json</code>, so Ollama, LM Studio, vLLM and llama.cpp all work without ceremony. Set expectations accordingly: on a 24GB M4 MacBook Air they're fine for scoped work like writing an extension or summarising a file, and they fall over on agentic work across a large repo about forty minutes in, when the context window folds. Unless privacy is the entire point, a cheap hosted model is the better trade.</p>
<h2 id="pi-is-yolo-by-default-and-it-means-it">Pi is YOLO by default, and it means it</h2>
<p>Two things happened in my first week that I want you to know about before you install this.</p>
<p>First: I was mid-task on a new project, and pi decided it needed examples of what I was trying to build. So it went and searched a bunch of folders across my machine looking for similar code. Not the project directory. My machine. It didn't ask, it didn't announce it, it just did it and then carried on like nothing had happened. To be fair, the examples it found were relevant. That's almost worse.</p>
<p>Second: I built a skill for an image generation CLI I'd written in Go, and pi installed it globally, for every agent, without checking with me first.</p>
<p>Neither of these is a bug. From the README: pi has no built-in permission system for restricting filesystem, process, network, or credential access, and by default it runs with the permissions of the user and process that launched it. Zechner's rationale is that once an agent can write and execute code, permission dialogs are mostly security theatre, and you cannot solve the read-data plus execute-code plus network trifecta without severing the network, at which point you've built a very expensive autocomplete. He's not wrong, exactly. I've made <a href="/blog/claude-code-dangerously-skip-permissions/">roughly the same argument about <code>--dangerously-skip-permissions</code></a>, which is the setting everyone turns on by day three anyway. Pi skips the pantomime and starts there.</p>
<p>And remember that project trust prompt? It's an input-loading guard. It stops a repo silently changing your settings and extensions before you approve. It does not restrict what any tool does once you're working, and prompt injection from repo files or command output is explicitly treated as expected local-agent risk.</p>
<p>So: containerise anything you wouldn't personally review. The <a href="https://github.com/earendil-works/pi/tree/main/packages/coding-agent/docs">docs cover three patterns</a>. <a href="https://github.com/earendil-works/gondolin">Gondolin</a> is the nicest, routing tools and shell commands into a local Linux micro-VM while pi and your provider credentials stay on the host. Plain Docker is the simplest, with the caveat that your API keys go into the container. NVIDIA's OpenShell gives you policy-level control and can keep raw keys outside the sandbox entirely. My line is simple: if you're running an unattended loop where you won't read every diff, and <a href="/blog/ralph-loop-how-recursive-ai-agents-work/">recursive agent loops</a> are exactly that, a sandbox isn't optional.</p>
<p>Credit where it's due, though. The supply-chain hygiene is unusually serious for a project this young: exact version pinning, <code>min-release-age=2</code> to avoid same-day dependency releases, a published shrinkwrap, <code>--ignore-scripts</code> on documented installs, a scheduled audit workflow. The risk here is at runtime, not in the dependency tree.</p>
<h2 id="building-with-the-pi-sdk-a-document-processing-agent">Building with the pi SDK: a document processing agent</h2>
<p>This is the shift that took pi from pleasant to interesting.</p>
<p>Pi runs in four modes. Interactive is the TUI you've been reading about. Print mode (<code>pi -p "..."</code>) is single-shot for scripts. RPC mode speaks JSON over stdin and stdout, which is how you'd drive it from Go or Python. And then there's the SDK, which runs the agent in-process inside your own Node program. That last one is the one nobody talks about enough.</p>
<p>It's a library you call in-process:</p>
<p>That's a complete, working agent. Nine lines of setup and you have the same loop that powers the CLI, streaming into your process.</p>
<p>The <code>session</code> object is where the useful surface lives. <code>prompt()</code> sends a turn and resolves when the agent settles. <code>steer()</code> interrupts mid-stream to redirect it, which is the programmatic version of typing while it's thinking. <code>followUp()</code> queues a message to be consumed once it's idle. <code>setModel()</code> and <code>setThinkingLevel()</code> change models mid-session, so you can run cheap extraction on a small model and escalate to something bigger only when a document fails validation. <code>compact()</code> summarises history when you're running long. <code>abort()</code> and <code>dispose()</code> do what you'd expect, and you'll want both wired to your job timeout.</p>
<p><code>SessionManager</code> decides where conversations live. <code>inMemory()</code> for throwaway batch jobs, <code>create(cwd)</code> to persist to disk, <code>open(path)</code> to reload one. Sessions are trees, so <code>branch()</code> lets you fork a conversation, try something, and keep or discard it. One gotcha here that bit me: session <em>replacement</em> (new session, resume, fork, import) lives on <code>AgentSessionRuntime</code> via <code>createAgentSessionRuntime()</code>, not on <code>AgentSession</code>. And because subscriptions attach to a specific session object, you have to re-subscribe after any replacement or your event handler goes quiet with no error.</p>
<p><code>ModelRuntime</code> owns credential resolution and model catalogues. It reads your existing <code>~/.pi/agent/auth.json</code>, which means an SDK program inherits whatever you already logged into on the CLI. Convenient for local development, and something to think about carefully before you ship it anywhere.</p>
<p>So what can you actually build with this? Code review bots that comment on PRs. Scheduled maintenance loops that upgrade dependencies overnight. Custom TUIs and web UIs on top of the agent loop. CI steps that triage a failing test before a human looks. Shopify built <code>pi-autoresearch</code>, an autonomous optimisation loop, as a pi extension, and reported unit tests running 300x faster and roughly 20% faster React component mounting off the back of it. The most famous example is OpenClaw, which is built on pi's SDK and is, at last count, the most-starred repository on GitHub by a comical margin.</p>
<p>The <a href="https://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/sdk.md">SDK docs</a> are solid and there are <a href="https://github.com/earendil-works/pi/tree/main/packages/coding-agent/examples">working examples in the repo</a> ranging from minimal to full control. Pin your versions, though. The API is stabilising but not frozen, and the scope migration already broke a generation of tutorials.</p>
<p>The example I'll build here is document processing, because it's the least glamorous and most universally useful thing a small business has. Drop a supplier invoice into a folder, get validated structured JSON out. It's the kind of boring automation I keep recommending in my writing on <a href="/blog/ai-agents-for-small-business-2026/">AI agents for small business</a>, and it exercises the parts of the SDK that matter: custom tools, structured output and tool restriction.</p>
<h3 id="the-document-layer-and-one-myth-to-kill-first">The document layer, and one myth to kill first</h3>
<p><a href="https://github.com/firecrawl/anydoc">anydoc</a> is Firecrawl's Rust document parser, MIT licensed, and it converts 14 office formats (docx, xlsx, pptx, odt, rtf, epub, csv, pdf and friends) to clean Markdown in under 5 milliseconds per document. No ML models, no external services, entirely local. Detection is content-based rather than extension-based, so a <code>.pdf</code> that's secretly a Word file still converts.</p>
<p>It does <strong>not</strong> do OCR, and it does <strong>not</strong> extract to a schema. This is the single most common misconception about it and the entire architecture depends on getting it right. anydoc reads the text layer of a PDF. Hand it a scanned or photographed invoice and you get back <code>ConvertError::Unsupported</code>.</p>
<p>So the design is two-path. anydoc as the fast local path for digital files, and Firecrawl's hosted <code>/v2/parse</code> endpoint with <code>mode: "ocr"</code> as the fallback when anydoc throws. Be clear-eyed about the trade: the moment you hit <code>/parse</code>, your supplier invoices leave the machine. For accounts payable data that's a decision to make deliberately, and if you want a fully local story you'd pair anydoc with Docling or a local vision model instead. Also worth noting that anydoc launched this month, so edge cases on weird real-world files are going to surface.</p>
<h3 id="forcing-structured-json-out-of-a-pi-agent">Forcing structured JSON out of a pi agent</h3>
<p>Pi has no native response-schema option. There's no <code>responseFormat</code> on <code>createAgentSession()</code> or on <code>prompt()</code>. I looked. Don't waste the twenty minutes I did.</p>
<p>The idiomatic pattern is a terminating tool: you define a tool whose parameters <em>are</em> the schema you want back, and whose <code>execute()</code> returns <code>terminate: true</code>.</p>
<p>Three things here cost me time, so let me save you some.</p>
<p>Import from bare <code>typebox</code>, not <code>@sinclair/typebox</code>. The current <code>@earendil-works</code> packages use the bare one. Older forks and tutorials use the scoped one, you'll get confusing type errors, and you'll blame yourself.</p>
<p><code>terminate</code> only fires when every finalised tool result in the batch is terminating. Pi runs tool calls in parallel by default, so if the model calls your emit tool alongside anything else in the same batch, the run keeps going.</p>
<p>And <code>content</code> is what the model sees while <code>details</code> is for your code. That split is the nicest small design decision in the whole SDK. Keep the LLM-facing text short and human, stash the machine-readable payload in <code>details</code>, and read it back off the <code>turn_end</code> event's <code>toolResults</code> or the <code>tool_execution_end</code> event's <code>result</code>.</p>
<h3 id="writing-custom-tools-that-do-real-work">Writing custom tools that do real work</h3>
<p>The emit tool above is just a shape. The tools that earn their keep are the boring deterministic ones.</p>
<p>The GST validator, then. Notice how little of it involves the model:</p>
<p>A few rules I'd defend to anyone.</p>
<p>Never let the model do arithmetic you care about. Give it a function that does the maths and let it reason about the result. Its job is interpretation and edge cases. Same goes for the ABN checksum, duplicate detection and date parsing.</p>
<p>Write the <code>description</code> and <code>promptGuidelines</code> for the model rather than for your future self. These fields are the entire interface between your code and the agent's decision making. "Check Australian GST arithmetic, call this before emitting" is a usable instruction. "Validates GST" is useless. This is context engineering at the tool level, and it's where most of the tuning time goes.</p>
<p>Return errors by throwing. Returning an error-shaped object never sets the error flag on the result, which is the sort of thing you discover at 11pm. If the tool genuinely failed, throw from <code>execute()</code>.</p>
<p>And use <code>StringEnum</code> from <code>@earendil-works/pi-ai</code> rather than TypeBox's <code>Type.Union</code> of literals for enum fields. The union form breaks Google's API. It'll work fine on Anthropic and OpenAI and then fall over the day you switch models, which rather defeats the point of a model-agnostic harness.</p>
<h3 id="give-the-agent-your-tools-and-nothing-else">Give the agent your tools and nothing else</h3>
<p>This is where the YOLO problem gets solved properly, and it's my favourite thing about the SDK.</p>
<p><code>noTools: "builtin"</code> strips read, write, edit and bash entirely. The agent now physically cannot touch your filesystem or run a shell command. It can call four functions you wrote, and that is the complete universe available to it. There's also an allowlist form (<code>tools: ["read", "grep"]</code>) if you'd rather have a read-only agent that can still poke around.</p>
<p>Think about what that buys you. The same harness that wandered off and scanned my home directory unprompted is, in this configuration, incapable of doing so. Not discouraged by a system prompt. Incapable, because the tools don't exist. That's a much stronger guarantee than any permission dialog, and it's the argument for the SDK over the CLI in production: you define the box, and the agent has no way out of it.</p>
<p>Then subscribe to the event stream for your audit log. You get message deltas, tool execution start and end, turn boundaries, compaction, retries. Log the lot. When a client asks why the agent flagged their supplier's invoice, you want the answer, and you want it without re-running anything.</p>
<h3 id="where-to-stop">Where to stop</h3>
<p>The agent produces a validated draft and then it stops. That's the whole design.</p>
<p>The obvious next move is a <code>create_draft_bill</code> tool that posts to Xero with <code>Type: "ACCPAY"</code>, <code>Status: "DRAFT"</code> and an idempotency key derived from the supplier ABN plus invoice number, so a network retry can't create a duplicate. That's a separate post, because doing it properly means covering ATO tax invoice requirements, the 47% no-ABN withholding rule, ABN Lookup verification and out-of-band confirmation for bank detail changes. Business email compromise accounted for over three billion US dollars in reported losses in the FBI's 2025 IC3 report, and almost all of it hinges on someone changing bank details in a real invoice thread. An agent must never auto-pay. Not ever.</p>
<p>Same pattern, different tools, is how the e-commerce agents I've been building this month are structured. Narrow tool surface, deterministic validation, a hard stop before anything irreversible.</p>
<h2 id="so-should-you-switch">So should you switch?</h2>
<p>Run it as a second agent for a week. Don't rip anything out. Point it at a real repo, use <code>/model</code> to swap providers mid-session, and ask it to build the one workflow feature you miss. If after a week you're reaching for it by default, migrate. If you're not, you've lost an hour.</p>
<p>It's a good fit if you're comfortable in TypeScript, you want to do your own context engineering, and you have non-Claude subscriptions to spend. It's a bad fit if you want safety rails out of the box, or if your entire workflow is built around a Claude subscription you're not willing to restructure.</p>
<p>It's also not universally loved. The complaint I've seen most from people who bounced off it is that it doesn't finish the job the way Claude Code or OpenCode do. Take that seriously, along with the DIY burden: a minimal core means you do the assembly.</p>
<p>As a CLI, the pi coding agent is a peer. It sits comfortably alongside Claude Code, Codex, Grok Build and OpenCode, and I'd be fine using any of them. The differences are real but small, and my gut feeling about better results is a gut feeling.</p>
<p>As an SDK it has no real equivalent. A minimal, model-agnostic, MIT-licensed agent you can embed as a library, restrict to exactly the tools you wrote, and drop into a cron job in about fifty lines is a different category of thing to a coding assistant.</p>
<p>The CLI got me to install it. The SDK is why it's still here.</p>
]]></content:encoded>
      <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-08-16T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI Coding</category>
      <category>Pi</category>
      <category>AI Coding</category>
      <category>AI Agents</category>
      <category>Developer Tools</category>
      <category>TypeScript</category>
    </item>
    <item>
      <title><![CDATA[Opus 5 vs GPT-5.6 vs Grok 4.5: Four Real Build Tests]]></title>
      <link>https://thomas-wiegold.com/blog/opus-5-vs-gpt-5-6-vs-grok-4-5/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/opus-5-vs-gpt-5-6-vs-grok-4-5/</guid>
      <description><![CDATA[I ran Claude Opus 5, GPT-5.6 Sol and Grok 4.5 through four hard builds: gallery site, spreadsheet app, image codec, repo audit. Times, results, verdict.]]></description>
      <content:encoded><![CDATA[<p>Anthropic shipped Claude Opus 5 on July 24th, and the timing was not subtle.</p>
<p>People had been expecting something. Fable 5 was the flagship, but it costs $10 in and $50 out per million tokens, and over the past couple of weeks GPT-5.6 Sol, Grok 4.5, Kimi K3 and Qwen 3.8 all landed close enough on quality that paying Fable prices for everyday work stopped making sense. When your competitors are almost as good for a fraction of the money, the thing you need isn't a smarter model. It's a better deal. Opus 5 is exactly that: $5 in, $25 out, and Anthropic's own pitch is that it comes close to Fable 5's intelligence at half the price. <a href="https://www.axios.com/2026/07/24/anthropic-releases-new-model-opus-5">Axios noted</a> it's the fourth Claude 5 release in under two months, which tells you how the race has shifted from capability to economics.</p>
<p>So the question isn't really "is Opus 5 good". It obviously is. The question is whether it's better than what everyone else is charging less for.</p>
<p>I ran it against GPT-5.6 Sol and Grok 4.5 on four builds: an art gallery site, a working spreadsheet app, an image codec written from scratch in Go, and an audit of my own open source agent framework. Wall clock times recorded, no interventions, one prompt each.</p>
<p>Short version: Opus 5 wins on points, GPT-5.6 Sol is right behind it and beat both on the hardest test, and Grok 4.5 is fast enough that the quality gap matters less than you'd expect.</p>
<p>The two web builds are up at <a href="https://llm-test-0726.thomas-wiegold.com/">llm-test-0726.thomas-wiegold.com</a> if you'd rather form your own opinion before reading mine. Design is the one thing you shouldn't take my word on.</p>
<h2 id="why-these-four-tests">Why these four tests</h2>
<p>My old test course is dead, and Opus 5 is not what killed it. It had been dying since Fable 5.</p>
<p>The set was four prompts I'd used for about a year: two landing pages, a poker simulation in Go, and an audit of thomas-wiegold.com. The <a href="/blog/qwen-3-8-max-review/">Qwen 3.8 Max review</a> was the last one I ran on it, and the cracks were showing there already. Frontier models passing everything is fine. Open weight models passing everything at the same level is the end of the road, because at that point I'm comparing font choices and squinting at padding, which is taste with extra steps, not evaluation.</p>
<p>Claire Vo, writing <a href="https://www.lennysnewsletter.com/p/claude-opus-5-review-this-model-is">her Opus 5 review in Lenny's Newsletter</a>, calls this an "intelligence overhang". When capability saturates on the tasks you actually hand these things, the variables that matter become effort, latency and price. So the new tests had to be harder, and they had to resemble work someone would pay for. Here's what I landed on.</p>
<p><strong>Art gallery website.</strong> Open creative brief, go all out, no spec and no wireframe. Not a challenge, and I won't pretend otherwise. Every current model passes. It's a pure design test: does the model have taste of its own when you refuse to give it constraints.</p>
<p><strong>Spreadsheet web app.</strong> Excel-inspired, React, fully functional. Formulas, cell references, selection, undo. I expected this to be the hard one. It wasn't, which I'll get to.</p>
<p><strong>Image codec in Go, from scratch.</strong> Beat PNG on compression, ideally approach WebP. No libraries doing the real work. This is the actual intelligence test of the four, and the only one where a model has to invent something rather than assemble something.</p>
<p><strong>Audit of <a href="https://github.com/Keldrik/agentiny">agentiny</a>.</strong> My open source agent framework, swapped in for the website audit because thomas-wiegold.com is tuned to death and returns a polite list of nothing. Agentiny is young and has real headroom.</p>
<p>Same prompt to each model, wall clock from submit to final output, no nudging. If a model went off the rails, that's the result. Standard caveat: n=1 per model per test, so what I'd defend is the shape of the results, not the decimals.</p>
<h2 id="the-four-builds-model-by-model">The four builds, model by model</h2>
<h3 id="test-1-art-gallery-site-go-all-out">Test 1: Art gallery site, go all out</h3>
<p>Nobody fails this one. That's the point of including it. Every current model can build a decent gallery site, so what's left to measure is taste, and taste doesn't show up on a leaderboard.</p>
<p>Grok 4.5 finished in five minutes. Opus 5 and GPT-5.6 Sol both took roughly half an hour.</p>
<p>That's a six-fold difference and my first instinct was that Grok had cheated somehow. It hadn't. The site was good. Clean, modern, nothing embarrassing, and if you showed it to a client without context they'd probably sign off on it.</p>
<p>But put it next to the other two and the extra 25 minutes are visible. Both Opus and GPT produced something more considered. Opus went deeper on detail: a horizontal scroll section in the middle that actually worked properly, and it shipped a light theme without being asked, which is the kind of thing I usually have to go back and request.</p>
<p>GPT-5.6 Sol went the other way. Simpler layout, but genuinely artsy in a way that suited the brief. The typography was excellent. If I actually owned a gallery, I think I'd pick the GPT site, and that surprised me because on paper it did less. All three are <a href="https://llm-test-0726.thomas-wiegold.com/">live on the results site</a>, and this is the test where I'd most expect people to disagree with me.</p>
<p>Takeaway: on open creative briefs, thinking time converts into quality. Hold that thought, because it doesn't hold for long.</p>
<h3 id="test-2-excel-style-spreadsheet-app-in-react">Test 2: Excel-style spreadsheet app in React</h3>
<p>Grok 16 minutes. GPT 31 minutes. Opus just under 50.</p>
<p>All three shipped a working, usable, cut-down Excel. One shot each. I genuinely did not expect that, and I'd designed this test assuming it would be the one that separated them. Formula evaluation, cell ranges, keyboard navigation, all of it functioning on the first attempt. "Build me a spreadsheet app" was a joke prompt eighteen months ago. Now it's a Tuesday afternoon. They're <a href="https://llm-test-0726.thomas-wiegold.com/">on the results site</a> too, and unlike the gallery test these you can actually poke at until something breaks.</p>
<p>Opus 5 was the best of the three. Most detailed UI, most thought given to the fiddly interaction bits, the one I'd want to keep working on. GPT was the weakest, thinner on UI polish and with genuinely odd undo behaviour that I'd have had to fix before showing anyone.</p>
<p>Grok landed almost exactly where Opus did. Not quite, but close enough that I had to look hard to find the gaps. And it did it in a third of the time with a fraction of the tokens.</p>
<p>So who wins? Opus produced the better artifact. But if I'm paying for this, Grok delivered maybe 95% of the result at a third of the cost, and I think that's the winner on any measure I'd defend to a client. This is also the test that breaks the pattern from the gallery site: more thinking time did not produce a proportionally better app. It produced a slightly better one, expensively.</p>
<p>I'm keeping this test even though it failed at the job I designed it for. It doesn't separate the models on capability anymore, but the spread on time and tokens is enormous (16 minutes to 50), and the small details are where you see who was actually paying attention. Undo behaviour is not a headline feature. It's exactly the kind of thing that quietly determines whether the code is worth keeping.</p>
<h3 id="test-3-image-codec-in-go-from-scratch">Test 3: Image codec in Go, from scratch</h3>
<p>This is where it got interesting, and where the times inverted completely.</p>
<p>GPT-5.6 Sol: 21 minutes. Grok 4.5: 33 minutes. Opus 5: one hour and twelve minutes.</p>
<p>Opus spent nearly four times as long as GPT on this. Here's what everyone produced.</p>
<p>GPT won, clearly. Real compression, genuinely good results on simple images with flat colour regions and clean edges. It struggled on busy, complex, noisy photos, which is roughly PNG's own failure profile, so it didn't hit the WebP target. But it was the only one that produced something I'd call a working codec, and it did it in 21 minutes. That's the single most impressive result of the whole course.</p>
<p>Opus was second. It compressed. Files came out smaller than the input, the thing worked, but it was well behind PNG and never in the running for WebP. Seventy-two minutes for a codec that loses to a format from 1996 is a rough trade.</p>
<p>Grok failed outright. Not "did worse", failed. Average output larger than the uncompressed source. It produced a program that confidently made files bigger, which is a fascinating thing for a compression algorithm to do.</p>
<p>Now the part that bothers me. Opus 5's headline independent result is ARC-AGI-3, where <a href="https://arcprize.org/results/anthropic-claude-opus-5">ARC Prize verified</a> 30.2% against GPT-5.6 Sol's 7.8%, roughly four times better on a benchmark built specifically to resist memorisation and measure novel reasoning. That's the one number in the whole launch that wasn't run on Anthropic's own harness. If any test on my course maps to that capability, it's this one. Invent a compression scheme, no library to lean on, no Stack Overflow answer to pattern match.</p>
<p>And GPT beat it. Not narrowly.</p>
<p>Two honest caveats before anyone quotes me on this. First, the ARC comparison isn't effort-matched: Opus 5's 30.2% was measured at High effort because of the short pre-launch window, while Sol's 7.8% was a Max run. The gap is still huge, but it's not a clean duel. Second, one codec attempt doesn't refute a verified benchmark, and it's entirely possible Opus wins this on a best-of-five. I'm not claiming ARC-AGI-3 is broken. I'm saying a benchmark measuring novel reasoning in the abstract did not predict novel reasoning in Go, on a Tuesday, with my prompt.</p>
<p>Of the four tests this is the one I'm most interested in developing, because it's the only one that hands you numbers instead of opinions. Compression ratio against a fixed image set, measured the same way every time. That's a benchmark, or close enough to one that I could turn it into a real benchmark with a bit of work. I need to experiment with the prompt and the image set first, since right now it's one attempt with a loosely worded target, and the difference between "beat PNG" and "here are twenty images and a scoring function" is the difference between an anecdote and a number.</p>
<h3 id="test-4-auditing-the-agentiny-codebase">Test 4: Auditing the agentiny codebase</h3>
<p>Time wasn't a factor here. All three were quick, and none of the differences were meaningful. If you want to see what they were looking at, <a href="https://github.com/Keldrik/agentiny">agentiny is on GitHub</a>.</p>
<p>For grading I ran the three audit reports through several other LLMs and asked them to rank the findings by importance and coverage, then compared that ranking to my own read of the codebase. They agreed with each other and with me, which is about as good as blind grading gets when you're the one who wrote the code.</p>
<p>Opus 5 came out on top. It found the most genuinely important problems, the ones I'd actually prioritise. GPT-5.6 Sol was very close behind, close enough that on a different day it might flip. Grok was the weakest. It missed several things the other two caught.</p>
<p>But, and this is the bit worth internalising, Grok also found some minor issues that neither of the others mentioned. Not important issues, but real ones.</p>
<p>This matches something I've said before: run audits across multiple models and consolidate the results. Model quality ranks cleanly, coverage doesn't. Even the model that comes third has non-overlapping findings, because these things all have different blind spots. <a href="https://www.coderabbit.ai/blog/opus-5-model-review">CodeRabbit's independent eval</a> found the same shape from a different direction, measuring Opus 5 at their cleanest ever precision (39.3%) but with lower recall than their baseline (55.2% against 61.1%) and around four times the nitpicks. Their conclusion was that it's a precision specialist that pairs well with a recall model, not a drop-in sole reviewer. Two very different methodologies, same practical advice: don't use one model.</p>
<h2 id="what-the-benchmarks-predicted-vs-what-i-actually-got">What the benchmarks predicted vs what I actually got</h2>
<p>Here's the honest comparison. On <a href="https://artificialanalysis.ai/articles/opus-5">Artificial Analysis</a>, which is the closest thing we have to an independent aggregate, Opus 5 sits at number one on both the Intelligence Index (61 at max effort, against Fable 5's 60 and GPT-5.6 Sol's 59) and the Agentic Index (55.3 against GPT's 54.0).</p>
<p>Look at those margins. One point. One point three. And that 61 is a max-effort number, which is not the setting most people will actually run, so the <a href="https://artificialanalysis.ai/models/claude-opus-5-medium">medium-effort score of 56</a> is probably closer to what you'd feel day to day.</p>
<p>My results have exactly that shape. Opus edges ahead across the four tests, but not by much, and not on every one. A one point aggregate lead is not something you feel in daily work, and my course confirmed that more than it challenged it. Where the benchmarks held up: the audit and the spreadsheet, both won by Opus, both by a margin small enough to argue about. Where they misled me: the codec, badly.</p>
<p>A caveat on the rest of the numbers. <a href="https://www.anthropic.com/news/claude-opus-5">Anthropic's announcement</a> leads with SWE-bench Verified at 96.0% and Frontier-Bench at 43.3%, and those are impressive, but most of the headline coding and agentic figures are vendor-run on Anthropic's own harness. Agentic benchmarks are notoriously harness-sensitive. Treat cross-model gaps as directional. Even the Artificial Analysis suite, which is the cleanest signal in the set, was co-run with Anthropic pre-release.</p>
<p>Then there's cost, which for me is the actual story. Opus 5 is $5 per million input tokens and $25 output, exactly half of <a href="/blog/claude-fable-5-review/">Fable 5</a> at $10/$50, while Artificial Analysis measures it at comparable intelligence for 26% lower cost per task. I liked Fable 5 when it launched. I don't think it's worth the money anymore, and Opus 5 is the reason.</p>
<p>One thing to budget for: thinking tokens bill as output, adaptive thinking is on by default now rather than something you switch on, and Artificial Analysis flags Opus 5 at max effort as <a href="https://artificialanalysis.ai/models/claude-opus-5">very verbose</a> with a time to first token of nearly 70 seconds. The rate card didn't change. Your bill might. That 72 minute codec run wasn't free, and the effort dial (low, medium, high, xhigh, max) is a bigger cost lever than the model choice.</p>
<h2 id="verdict-which-model-for-which-job">Verdict: which model for which job</h2>
<p>Opus 5 and GPT-5.6 Sol are close. Both are a clear step above Grok 4.5 on quality. Grok is meaningfully faster and cheaper. That's the whole comparison in three sentences.</p>
<p>But the useful version is more specific than that.</p>
<h3 id="the-speedquality-trade-depends-entirely-on-the-task">The speed/quality trade depends entirely on the task</h3>
<p>I like fast. I'm impatient, and a five minute turnaround changes how I work in a way that a marginally nicer output doesn't. For a large slice of everyday work, Grok is enough. Landing pages, CRUD, refactors, the stuff that makes up most of a week. My longer <a href="/blog/grok-4-5-review/">Grok 4.5 review</a> goes into where it holds up.</p>
<p>Reach for Opus or GPT when the task needs depth, novelty or judgment. And keep the codec test in mind as the cautionary case, because Grok didn't produce a worse codec, it produced a non-codec. The failure mode of a cheaper model on genuinely hard work isn't "slightly worse", it's "confidently wrong", and you have to be able to tell the difference.</p>
<h3 id="the-plannercoder-split-i-want-to-try-next">The planner/coder split I want to try next</h3>
<p>The obvious experiment: Opus 5 or GPT-5.6 Sol plans and reviews, Grok writes the code. You buy judgment where judgment matters and volume where it doesn't.</p>
<p>I haven't tested this. It could easily fall apart on context handoff, which is its own discipline and something I've written about in <a href="/blog/context-engineering-for-ai-agents/">context engineering for AI agents</a>. But the audit result is suggestive, because the models that graded best were the ones that spotted the important problems, and that's exactly the reviewer role.</p>
<h3 id="where-this-leaves-anthropic">Where this leaves Anthropic</h3>
<p>Opus 5 was necessary. With GPT-5.6, Grok 4.5, Kimi K3 and Qwen 3.8 all shipping in the same window, Anthropic without Opus 5 would be behind on price-performance rather than narrowly ahead on it. Releasing it was the right call and the pricing is the reason, not the benchmarks.</p>
<p>The broader point I keep coming back to: most of what we do every day doesn't need the intelligence ceiling. Paying for the ceiling on routine work is waste. That applies to Fable 5, and increasingly it applies to Opus 5 and GPT-5.6 Sol too, when a cheaper model would have done the job.</p>
<p>Next on the list is the same four tests against Kimi K3 and Qwen 3.8 Max. I left them out here purely because this took a full day and I ran out of one. A Chinese model comparison is its own article, and depending on timing it might end up including <a href="/blog/when-is-deepseek-v5-coming-out/">DeepSeek V5</a> too.</p>
]]></content:encoded>
      <pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-07-28T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI News</category>
      <category>Anthropic</category>
      <category>Claude</category>
      <category>Opus 5</category>
      <category>GPT-5.6</category>
      <category>Grok 4.5</category>
    </item>
    <item>
      <title><![CDATA[Qwen3.8-Max Review: I Tested Alibaba's 2.4T Model]]></title>
      <link>https://thomas-wiegold.com/blog/qwen-3-8-max-review/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/qwen-3-8-max-review/</guid>
      <description><![CDATA[I ran Alibaba's new 2.4T Qwen3.8-Max-Preview through 4 real coding tests. Results rival Fable 5 and Grok 4.5 — with one big catch: speed.]]></description>
      <content:encoded><![CDATA[<p>Alibaba dropped Qwen3.8-Max-Preview on 19 July 2026 at WAIC in Shanghai, a few days after Moonshot launched Kimi K3, and the announcement came with a bold claim: "second only to Fable 5". No benchmark table. No model card. No technical report. Just a <a href="https://x.com/Alibaba_Qwen/status/2078759124914098291">tweet</a>, a 2.4 trillion parameter figure, and a preview endpoint. So this Qwen3.8-Max review is me doing what Alibaba didn't: actually testing the thing.</p>
<p>Quick naming note before we start. The official name is Qwen3.8-Max-Preview (product ID <code>qwen3.8-max-preview</code>). Everyone's calling it "Qwen 3.8 Max", including me in casual conversation, but keep in mind this is a paid preview available through Alibaba's <a href="https://qwencloud.com">Token Plan</a>, not a finished release. Open weights are promised "soon", with no date and no licence. We'll see.</p>
<p>This month has been absolutely insane for AI releases. I still owe you reviews of ChatGPT 5.6 and Kimi K3 (I've covered <a href="/blog/grok-4-5-review/">Grok 4.5</a> and <a href="/blog/claude-fable-5-review/">Claude Fable 5</a> already), but I'm reviewing Qwen first for a simple reason: Qwen has quietly become the most important model family for local AI. If you run agents locally, chances are you're running Qwen. So when they ship a new flagship, I want to know what's coming down the pipeline to the smaller models I'll eventually run on my own hardware.</p>
<h2 id="what-we-actually-know-and-dont">What We Actually Know (and Don't)</h2>
<p>Here's the honest state of play as of today.</p>
<p><strong>Confirmed:</strong> 2.4T total parameters (vendor figure), sparse MoE, multimodal (text, images, video, documents). It's the Qwen team's first multimodal model above 1T parameters. The endpoints speak both OpenAI and Anthropic protocols, so it drops straight into Claude Code, Cursor, OpenCode and friends without changing your harness.</p>
<p><strong>Not confirmed:</strong> basically everything else. Context window (the 1M figure floating around is community lore, not an official spec), active parameter count, knowledge cutoff, benchmarks. Every benchmark number you'll see circulating "for" Qwen3.8 is actually a Qwen3.7-Max number. The only independent evaluation I've found is Trilogy AI's StackPerf run, a single blind head-to-head where Qwen3.8-Max-Preview scored 80 against Kimi K3's 83. One run, one task, so take it as a data point, not a verdict.</p>
<p><strong>Qwen3.8-Max-Preview at a glance:</strong></p>
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td>Released</td>
<td>19 July 2026 (preview)</td>
</tr>
<tr>
<td>Parameters</td>
<td>2.4T total (vendor-reported), MoE, active count undisclosed</td>
</tr>
<tr>
<td>Access</td>
<td>Token Plan, Qoder, QoderWork (credits only, no per-token API price)</td>
</tr>
<tr>
<td>Preview discount</td>
<td>1/10th standard rate, 1/50th overnight</td>
</tr>
<tr>
<td>Open weights</td>
<td>Promised "soon", no date, no licence</td>
</tr>
<tr>
<td>Benchmarks</td>
<td>None published by Alibaba</td>
</tr>
</tbody></table>
<h2 id="my-test-suite-same-4-prompts-every-model">My Test Suite: Same 4 Prompts, Every Model</h2>
<p>If you've read my other reviews, you know the drill. I run the same four tests with the same prompts on every model so I can compare directly: a Sydney coffee roaster landing page, a pop culture themed clothing store, a Texas Hold'em poker simulation written in Go (six AI players with distinct personalities, realistic betting, 1000 hands, statistics at the end), and a full audit of this website. Same methodology as my <a href="/blog/grok-4-5-review/">Grok 4.5</a> and <a href="/blog/google-antigravity-review-i-tested-gemini-3-5-flash/">Gemini 3.5 Flash</a> reviews.</p>
<h2 id="the-results">The Results</h2>
<h3 id="coffee-roaster-website">Coffee Roaster Website</h3>
<p>This took a looong time. The model sat there thinking for several minutes before doing anything at all, and it stayed slow throughout. Over 30 minutes total, the longest this test has ever taken.</p>
<p>But here's the thing: the result might be the best I've ever gotten from this prompt. It went into obsessive detail after the first HTML hit the disk, testing repeatedly with Playwright and adding little touches each pass. I got things I never asked for: a shopping cart, a wholesale section with registration, an Instagram link, coffee sorting and search by roast level. In a different context that scope creep could be a problem. Here, it made the site feel real. Visually it was tasteful too. Nice fonts, nice colours, good animations, solid layout.</p>
<h3 id="pop-culture-e-commerce-store">Pop Culture E-commerce Store</h3>
<p>Even slower than the coffee site. At this point I started wondering whether the model is just fundamentally slow, or whether Alibaba simply didn't have enough servers ready for launch day (I was testing hours after release, to be fair).</p>
<p>The obsessiveness continued. It checked buttons, menus, animations and aspect ratios with Playwright like it was getting paid per test run. The result was great: polished, detailed, good typography. I still slightly prefer the style Gemini 3.5 Flash gave me on this prompt, but that's taste. If the speed improves, this is a serious frontend model.</p>
<h3 id="poker-simulation-go">Poker Simulation (Go)</h3>
<p>One hour and twenty minutes. I made coffee. I answered emails. I briefly considered learning to whittle.</p>
<p>But it one-shotted it. Only two other models have managed that so far, Claude Fable 5 and Grok 4.5, which makes Qwen3.8-Max the third member of a very small club. What's interesting is that the core simulation seemed done after about 20 minutes. The remaining hour went into fine-tuning the six player archetypes (the tight rock, the crazy maniac, and so on) until the betting behaviour looked genuinely realistic. And it did. The final simulation output showed clearly distinct, believable playing styles across 1000 hands. The statistics were good, though not as detailed as what Grok 4.5 produced on the same test.</p>
<h3 id="website-audit">Website Audit</h3>
<p>35 minutes, the slowest audit in this test series. It didn't find any new errors on thomas-wiegold.com, but it flagged potential pitfalls I'd genuinely never thought about. And honestly, an audit is the one test where slow and thorough is exactly what you want. My tip if you care about this stuff: run the same audit through Fable, ChatGPT 5.6, Kimi K3 and Qwen3.8-Max, then consolidate the results into one file to work through. The overlap tells you what's real, the differences tell you what's interesting.</p>
<h2 id="the-speed-problem">The Speed Problem</h2>
<p>Let's not dance around it. In every single test, this was the slowest model I've used. The open question is why. It could be the model itself being extremely verbose in its thinking. It could be day-one server strain, since I tested hours after launch. Alibaba calls the preview "continuously evolving", so this may well improve.</p>
<p>The trade-off is real though. For rapid iteration, the speed is genuinely annoying. For important one-shot builds where you want maximum thoroughness, watching it Playwright-test every button for an hour starts to feel less like slowness and more like diligence. I'll update this review if the speed changes.</p>
<h2 id="pricing-the-token-plan-deal">Pricing: The Token Plan Deal</h2>
<p>I subscribed to the Token Plan Standard tier at USD $18/month for this review. All four tests combined used 6% of my weekly credit quota. Six percent. For a model this capable, that's a genuinely good deal, and the plan also gives you access to other models plus image generation.</p>
<p>The catch is the preview discount doing heavy lifting: Qwen3.8-Max-Preview currently runs at 1/10th of standard credit rates, dropping to 1/50th overnight (22:00 to 08:00 UTC+8, so basically midnight to 10am here in Sydney). When the preview pricing ends, redo your maths. And remember Alibaba's own docs say the preview endpoint may change or be replaced. Test on it, don't build production on it.</p>
<h2 id="verdict-who-should-use-qwen38-max">Verdict: Who Should Use Qwen3.8-Max?</h2>
<p>Qwen3.8-Max is very good and very slow. If speed doesn't matter for your task, it belongs in the top tier right now, alongside Fable 5, ChatGPT 5.6 Sol, Grok 4.5 and Kimi K3. Honestly, they're all great, and they're all close. The frontier has become crowded, and the real differentiators now are price, speed, availability and vibe.</p>
<p>For me, today, Grok 4.5 stays my daily driver purely because of speed and efficiency. That could change next month. It changes depending on the task, too. And if you're doing something genuinely important, run it through two or three of these models and compare. That's a luxury we simply didn't have a year ago.</p>
<p>Which brings me to Anthropic. In my opinion they're the big loser of this month. After telling everyone Fable is too good and too expensive to include permanently in normal subscriptions, they've watched competitors ship models that are (probably) roughly as good, much cheaper, more available, and less restricted. The competition didn't out-build them, it out-shipped them. No wonder people are speculating Opus 5 is coming soon. For a while I was genuinely worried the top models would end up locked behind enterprise contracts. Not anymore, and I'm very happy about that.</p>
<p>One caveat worth knowing before you evaluate Qwen for business use: <a href="https://simonwillison.net">Simon Willison</a> and others have documented that Qwen models carry baked-in CCP-aligned guardrails on politically sensitive topics. For coding and agent work it's largely irrelevant, but if you're a regulated business doing anything content-adjacent, know what you're deploying. I wrote more about choosing AI tools sensibly in my piece on <a href="/blog/ai-agents-for-small-business-2026/">AI agents for small business</a>.</p>
<p>And the thing I'm actually most excited about? The small models. Qwen is the open-weight family powering half the local agent setups out there, including my own experiments with <a href="/blog/hermes-agent-what-it-is/">Hermes agent</a>. If the promised open weights land, and if the 3.8 improvements trickle down to sizes I can run on my Mac, that's the real story. I think local AI is going to be very, very good within a few years, especially for businesses like medical practices and law firms where privacy and legal constraints make cloud AI complicated. When the small Qwen3.8 models drop, I'll be testing them the same week. Watch this space.</p>
]]></content:encoded>
      <pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-07-20T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI News</category>
      <category>Alibaba</category>
      <category>Qwen</category>
      <category>Qwen-3-8-Max</category>
      <category>LLM</category>
      <category>AI Coding</category>
      <category>Review</category>
    </item>
    <item>
      <title><![CDATA[AI for Tradies: What Actually Works (and What's a Waste)]]></title>
      <link>https://thomas-wiegold.com/blog/ai-for-tradies/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/ai-for-tradies/</guid>
      <description><![CDATA[A hands-on guide to setting up AI for a trade or small services business. Real workflows for email, quotes, calendar and invoices — no hype.]]></description>
      <content:encoded><![CDATA[<p>Every time I search "AI for tradies" I get the same thing. A landing page with a stock photo of a bloke in hi-vis looking thoughtfully at a tablet, a pricing table starting at $149 a month, and absolutely no explanation of what the thing actually does. It's a prompt in a trench coat.</p>
<p>So this is the other article. The one that tells you what to set up, in what order, and what it'll cost you (spoiler: about twenty US dollars a month plus an afternoon of your time). I'm assuming you can already open Claude or ChatGPT and type a question into it. I'm not going to explain what a chatbot is. What I am going to explain is how to wire one into your actual email, your actual calendar, and your actual pricing, so it stops being a party trick and starts being useful.</p>
<p>One thing I'm deliberately leaving out: AI answering your phone. It's probably the single biggest win available to a trade business, because a missed call is a lost job and voicemail has been losing you jobs for years. But it's also a genuinely deep topic (number porting, voice quality, transcripts, privacy, what happens when it mishears an address) and cramming it in here would do it a disservice. It's getting its own article. Come back for that one.</p>
<h2 id="quick-note-why-claude-and-what-if-you-use-something-else">Quick note: why Claude, and what if you use something else</h2>
<p>Almost everything below is written using <a href="https://claude.com/product/overview">Claude</a>, because that's what I use every day and I'd rather show you something I actually run than something I've read about. It's made by Anthropic, it costs about twenty US dollars a month for the paid tier, and it's the one I'd hand to a tradie who wants results this week rather than a hobby.</p>
<p>But this is not a Claude advertisement, and you are not stuck.</p>
<p><a href="https://chatgpt.com/overview/">ChatGPT (OpenAI)</a> does the same job. So, increasingly, do <a href="https://gemini.google/about/">Gemini (Google)</a> and <a href="https://grok.com/">Grok (xAI)</a>. They all now have some version of the same three ingredients: a chat window, a way to connect your email and calendar, and an "agent" mode that can go off and do multi-step work while you get on with your day. The names differ, the menus are in different places, the monthly limits are carved up differently. The shape is the same.</p>
<p>So when I say "switch on Cowork and schedule a task", the ChatGPT equivalent is Work, which lives inside the Codex app. When I say "connect the Gmail connector", every one of these has connectors, they just call them different things and hide them in a different corner of the menu. If you're already paying for one of them, use that one. Switching tools to follow a blog post is a waste of a perfectly good subscription.</p>
<p>What matters far more than which brand you pick is the two things in the next couple of sections: the safety rule, and loading the thing with your actual business information. Get those right and the logo on the app is a detail.</p>
<h2 id="the-one-rule-that-makes-all-of-this-safe">The one rule that makes all of this safe</h2>
<p>Before any of the fun stuff, this.</p>
<p><strong>AI drafts. You send.</strong></p>
<p>That's it. That's the rule. Never give an agent the power to send, pay, or delete on a real account without you looking at it first.</p>
<p>Here's why, and it's not hand-wringing. Security researchers call it the <em>lethal trifecta</em>: an agent that can (1) read your private data, (2) is exposed to untrusted content from the outside world, and (3) can send data back out. Your inbox has all three. Prompt injection sits at number one on the <a href="https://owasp.org/www-project-top-10-for-large-language-model-applications/">OWASP Top 10 for LLMs</a>, and it is not a solved problem. It's not a bug waiting for a patch.</p>
<p>Concretely: someone emails you. Buried in the footer, in white text, is an instruction. Your helpful agent reads the inbox, reads the instruction, and cheerfully forwards your customer list to a stranger, or pays an invoice that doesn't exist. It thinks it's helping. It is, technically, following instructions.</p>
<p>This is the reason Anthropic's Gmail connector can only create drafts and cannot press send. People complain about that. It's not a limitation, it's the safety rail. I've written before about <a href="/blog/claude-code-dangerously-skip-permissions/">what happens when you hand an agent too much rope</a>, and about <a href="/blog/how-to-build-mcp-ui/">building an approval gate</a> so a human stays in the loop.</p>
<p>Four rules, stick them on the wall:</p>
<ol>
<li>Nothing sends, pays, or deletes without a human clicking the button.</li>
<li>Use a dedicated account with the minimum permissions, not your admin login.</li>
<li>No number reaches a customer unchecked. Not one.</li>
<li>If a tool needs full write access to be useful, that's a reason to be suspicious, not a reason to grant it.</li>
</ol>
<p>Right. Now the good bit.</p>
<h2 id="setting-up-the-foundation">Setting up the foundation</h2>
<p>Two steps. Neither is hard, and the second one is the one everybody skips.</p>
<h3 id="connect-gmail-calendar-and-drive">Connect Gmail, Calendar and Drive</h3>
<p>In Claude, go to Settings, then Connectors, and toggle on Gmail, Google Calendar and Google Drive. Sign in with Google, approve the scopes, done. If you're on a Team plan, an Owner has to enable connectors first, and if you run Google Workspace your admin might need to mark Claude as a trusted app under Security, then API controls. Give it fifteen minutes to propagate before you assume it's broken. (I did not give it fifteen minutes. I assumed it was broken.)</p>
<p>Microsoft 365 works the same way if that's your world. Same principles apply throughout.</p>
<p>Three gotchas worth knowing before you start:</p>
<ul>
<li><strong>Gmail is draft-only.</strong> Claude reads and composes. You send. See above.</li>
<li><strong>Calendar is full read and write.</strong> This one genuinely works end to end, which is why the calendar workflows below are the most satisfying.</li>
<li><strong>Attachments are metadata only.</strong> Claude sees that a PDF exists, not what's in it. If the quote is in the attachment, you'll need to hand it over yourself.</li>
</ul>
<p>And do this properly: create a dedicated account, something like <code>ai@yourbiz.com.au</code>, and connect that. Not the login that owns everything. It costs you nothing and it means the blast radius of a bad day is small.</p>
<h3 id="build-the-project-brain">Build the project brain</h3>
<p>This is the highest-leverage hour you will spend, and almost nobody does it. So let me slow down here, because if you skip this section the rest of the article is a toy.</p>
<p><strong>What a Project actually is.</strong> In Claude, a Project is a folder that holds three things: a set of standing instructions, a pile of documents it can read (the "project knowledge"), and all the chats you've had inside it. Every conversation you start inside that Project automatically sees the instructions and the documents. You don't re-explain your business every morning. It's already there.</p>
<p>ChatGPT has the same concept and calls them Projects too. Gemini has Gems. Same idea, different noun.</p>
<p><strong>Why it matters more than the model.</strong> A generic chatbot does not know your call-out fee. Ask it to write a quote and it will invent a number that looks plausible, because inventing plausible things is precisely what these things do. It is not lying to you. It genuinely has no idea, and it has been trained to be helpful, so it produces something helpful-shaped. This is the single biggest reason people try AI for a week and conclude it's rubbish. They asked a stranger to quote a job.</p>
<p>Context is the whole ballgame. A mediocre model with your real prices beats a brilliant model guessing, every single time.</p>
<p><strong>Step one: create the Project and write the instructions.</strong> The instructions are the standing brief. Not a prompt, more like the induction you'd give a new office junior. Mine for a trades business would read something like:</p>
<blockquote>
<p><em>You work for [Business], a residential electrical contractor on Sydney's Upper North Shore. Everything you write goes to Australian customers, so use Australian spelling and dollars, and always show GST. You draft, you never send. Never invent a price: if a price isn't in the knowledge files, say "PRICE NEEDED" and stop. Quotes always include our standard exclusions and the 12 month warranty wording. Keep the tone plain and friendly, no corporate waffle. If a job is outside our service area, say so instead of quoting it.</em></p>
</blockquote>
<p>Note what that's doing. It sets the geography, the currency, the tone, the hard rule about sending, and (this is the important one) it gives the model a way to fail loudly instead of guessing. "Say PRICE NEEDED and stop" is worth more than any clever phrasing.</p>
<p><strong>Step two: upload the knowledge.</strong> Drag the documents in. Realistically:</p>
<ul>
<li>Rate card: hourly rates, call-out fee, after-hours and weekend loading</li>
<li>Materials price list, exported from your supplier or your accounting software</li>
<li>Standard inclusions and exclusions</li>
<li>Terms and conditions, warranty wording, payment terms</li>
<li>Service area, listed as actual suburbs</li>
<li>Licence numbers and whatever compliance boilerplate you paste into everything</li>
<li>A description of how you actually run a job, start to finish</li>
<li>Two or three of your best past quotes, as examples of the format you want</li>
</ul>
<p>That last one does a surprising amount of work. Showing beats telling. Give it three real quotes and it will match your style far better than any adjective you could have written into the instructions.</p>
<p><strong>Step three: keep it current, and keep it clean.</strong> Two rules I'd tattoo on this:</p>
<p><em>Point at live files, not dead copies.</em> Rather than uploading a pricing PDF that goes stale, keep the price list in a Google Sheet in the Drive folder the Project can read. Copper goes up, you update one cell, and every quote from that moment on is right. Uploaded files are snapshots. Connected files are current.</p>
<p><em>Less, but better.</em> There's a real temptation to shovel in every document you own on the theory that more context is better. It isn't. A Project stuffed with six versions of the rate card, two of which are from 2023, will confidently use the wrong one. Every document you add is a document the model might believe. Prune it like you'd prune a toolbox: if you wouldn't hand it to a new employee on day one, it doesn't go in.</p>
<p><strong>A word on memory.</strong> Claude also has a memory feature that carries details across conversations, and it's genuinely handy for the small stuff (it'll remember you're in Sydney, that you hate exclamation marks). But do not rely on memory for your prices. Memory is a nice-to-have that gets recalled loosely. Project knowledge is a document it reads. For anything where being wrong costs you money, use the document.</p>
<p>If you want to go deeper on writing the instructions themselves, I've got a <a href="/blog/prompt-engineering-best-practices-2026/">whole piece on prompt structure</a>.</p>
<p>Do this properly and everything below stops being a demo and starts being a system.</p>
<h2 id="scheduled-tasks-or-getting-it-to-do-things-while-youre-up-a-ladder">Scheduled tasks, or: getting it to do things while you're up a ladder</h2>
<p>Everything so far assumes you're sitting there typing. The step up is telling it to run on its own.</p>
<p>That's what Cowork is for. It isn't a separate app or a separate tab, it's a button right there in the chat box. You flick it on, and the same conversation you were already having gains two abilities: it can work with files on your machine, and it can run on a schedule instead of only when you're sitting there.</p>
<p>Setting one up is genuinely just: turn on Cowork, describe the task in plain English the way you would to a person, check it does the thing correctly when you run it by hand, and then set it to repeat. Daily at 6am. Every Friday at 4pm. Whatever suits.</p>
<p>Two bits of advice that will save you a fortnight of annoyance:</p>
<p><strong>Always run it manually first.</strong> Twice. Watch what it does. A scheduled task that quietly does the wrong thing every morning at six is worse than no task at all, because you'll trust it.</p>
<p><strong>Watch your usage.</strong> Scheduled tasks and Cowork sessions eat a plan's allowance much faster than chatting does. A task that runs hourly because it felt clever at the time will find your limit for you.</p>
<p>ChatGPT has scheduled tasks too, and if you'd rather run this stuff on your own hardware without a subscription in the loop, that's what tools like n8n and Hermes are for. More on those later.</p>
<h2 id="the-four-workflows-worth-building-first">The four workflows worth building first</h2>
<h3 id="1-the-morning-briefing">1. The morning briefing</h3>
<p>This is the one to build first, because it's useful on day one and it can't hurt anybody.</p>
<p><strong>What it does:</strong> at 6am it reads overnight email, sorts it, drafts replies to the easy ones, and tells you what actually needs you. By the time you're in the ute with a coffee, you've got a list instead of an inbox.</p>
<p><strong>How to set it up:</strong> turn on Cowork in the chat box, make sure the Gmail and Calendar connectors are on, and create a task with a prompt along these lines:</p>
<blockquote>
<p><em>Every weekday at 6am, read all email received since 5pm yesterday.</em></p>
<p><em>Sort it into four groups: (1) new job enquiries, (2) customers replying about a quote, (3) suppliers and admin, (4) junk I can ignore.</em></p>
<p><em>For every new enquiry, pull out: name, suburb, phone number, what they want done, and any date they mentioned. Flag anything that sounds like an emergency at the top.</em></p>
<p><em>Then check my calendar for today and tomorrow and tell me what I've already got on.</em></p>
<p><em>Draft replies in Gmail for anything routine (acknowledging an enquiry, confirming an appointment). Leave them in drafts. Do not send anything.</em></p>
<p><em>Finish with a short list: "needs Thomas", for anything you couldn't handle or weren't sure about.</em></p>
<p><em>Keep the whole thing under a page. I'm reading it on a phone.</em></p>
</blockquote>
<p>Then set it to run weekdays at 6am and go to bed.</p>
<p><strong>Where it breaks:</strong> it will get urgency wrong. It will confidently file a burst pipe under "admin" because the customer was polite about it. It's a briefing, not an autopilot. Read it, don't obey it.</p>
<h3 id="2-enquiry-to-quote-to-calendar">2. Enquiry to quote to calendar</h3>
<p>This is the one that made me sit up, because the calendar half genuinely works without a human in the middle.</p>
<p><strong>What it does:</strong> an enquiry lands. Claude pulls out the name, address and job type, checks your actual calendar for actual free slots, drafts a quote using your actual pricing from the Project knowledge, and puts a tentative hold in the diary. You read it, fix the bit it got wrong, and hit send.</p>
<p>The free-slot check is the part that surprises people. Because Calendar is read <em>and</em> write, "can you do Thursday morning?" gets a real answer instead of a hallucinated one. It looks at the diary. It knows you're already in Hornsby at nine.</p>
<p><strong>How to set it up.</strong> Do this one inside your Project (so it has the prices) rather than as a blind scheduled task, at least until you trust it. When an enquiry comes in, you type something as lazy as "handle the Henderson email" and it goes. The standing instruction that makes that work looks like this, and it lives in your Project instructions:</p>
<blockquote>
<p><em>When I ask you to handle an enquiry:</em></p>
<p><em>1. Find the email and pull out: name, address, phone, what they want, and any dates or times they mentioned.</em></p>
<p><em>2. Check my Google Calendar for the next 10 working days. Find slots that fit the job length, respecting travel: don't offer me a 9am in Berowra if I'm booked in Chatswood at 8.</em></p>
<p><em>3. Draft the quote using ONLY the rates and materials in the project files. If something isn't priced there, write PRICE NEEDED in the line item and tell me. Do not estimate.</em></p>
<p><em>4. Create a tentative calendar event, title it "TENTATIVE: [name] [suburb]", and put the customer's phone and the job description in the notes.</em></p>
<p><em>5. Draft the reply email in Gmail: thank them, summarise the job so they know we understood it, give the quote, offer two of the calendar slots, include our standard exclusions and warranty. Leave it in drafts.</em></p>
<p><em>6. Tell me in chat what you did, what you weren't sure about, and anything you had to guess.</em></p>
</blockquote>
<p>Step 6 is the one people leave out and it's the most valuable line in there. You want it confessing.</p>
<p><strong>Where it breaks, and this is not optional reading.</strong> The quote sits in drafts. Always. If you want true automatic sending you need an automation layer like n8n underneath, and even then I'd put a gate on it.</p>
<p>Here's why. AI is very good at producing a quote that <em>looks</em> right. The layout is beautiful. The line items are professional. The wording is better than yours. And the measurement is wrong by a factor of two and it has no idea, because being wrong feels exactly the same to it as being right.</p>
<p>The AI takeoff tools that read plans and photos run about 2 to 4 percent variance from a manual takeoff on clean residential drawings, and 8 to 12 percent on messy commercial sets. Which sounds survivable, until you notice individual line items can be wildly out even when the total lands close, because the errors cancel each other out. Great for the average. Terrible for the one job you actually quoted.</p>
<p>Draft, check, send. Every time. If you only take one thing from this article, take that.</p>
<h3 id="3-invoices-and-the-boring-money-stuff">3. Invoices and the boring money stuff</h3>
<p><strong>Start with receipt capture, because it's the least glamorous and the most reliable.</strong> Dext, Hubdoc, or MYOB's built-in capture, whichever your accountant already uses. Photograph the receipt in the merchant car park, it extracts the supplier, the ABN, the GST and the total, and files it against the right account. This is the most boringly dependable AI in the entire stack. It also doubles as your compliance fix, because the <a href="https://www.ato.gov.au/businesses-and-organisations/preparing-lodging-and-paying/records-and-record-keeping">ATO wants your records kept for five years</a> and a shoebox of faded thermal paper is not a system, it's a hope.</p>
<p><strong>Then use the AI that's already inside your accounting software.</strong> Xero's Just Ask Xero (JAX) will draft invoices, chase payments, and predict when a given customer is actually likely to pay you (which is a different question from when they said they would). QuickBooks has a similar squad of agents, including one that pre-checks your GST against your P&amp;L before you lodge. You're already paying for these. Turn them on.</p>
<p><strong>Then wire your books into Claude.</strong> Xero ships an <a href="https://developer.xero.com/ai">official MCP server</a>, which in plain English means Claude can query your accounting data directly. Once that's connected, a Friday afternoon scheduled task earns its keep:</p>
<blockquote>
<p><em>Every Friday at 4pm, check Xero for:</em></p>
<p><em>1. Invoices more than 14 days overdue. For each one, tell me the customer, the amount, how many days late, and whether I've already chased them.</em></p>
<p><em>2. Any completed jobs from this week that I haven't invoiced yet. Cross-check against my calendar.</em></p>
<p><em>3. Draft a polite chase-up email for each overdue invoice. Firm but not rude, we want to keep these people. Leave them in drafts.</em></p>
<p><em>Give me the total outstanding at the top so I know how bad it is before I read the detail.</em></p>
</blockquote>
<p>Point 2 is the sleeper. Most small operators aren't losing money to bad debts, they're losing it to jobs they simply forgot to invoice. Having something cross-reference "went there" against "billed for it" once a week is a genuinely profitable ten minutes.</p>
<p><strong>The limit.</strong> Treat a BAS as a draft, never a lodgement. These tools are good at flagging discrepancies and terrible at understanding your specific situation. GST-free items, capital purchases, private use apportionment: a general-purpose model will be fluent and confident and wrong. Your bookkeeper's name goes on the form, not Claude's.</p>
<h3 id="4-site-notes-and-photos-without-typing-anything">4. Site notes and photos, without typing anything</h3>
<p>You asked for this one and it's my favourite, because it's the gap nobody fills.</p>
<p><strong>The simple version:</strong> the Claude mobile app takes voice input. Sit in the ute after a job and ramble at it. "Right, Henderson job, Wahroonga, the switchboard is older than I am, needs a full replacement, I've quoted around fourteen hundred, they want it done before the twentieth, also the bloke has a dog that hates me." Ask for a structured job note. Get one back. Done before you've reversed out of the driveway.</p>
<p><strong>The better version:</strong> a phone shortcut (iOS Shortcuts, or Tasker on Android) that dumps voice memos and site photos into a dated Google Drive folder. One tap. Then at the end of the day, Claude reads the folder via the Drive connector and turns the whole mess into job records, a materials list for the merchant run, and tomorrow's follow-ups.</p>
<p>One warning here, because I don't want you building this and getting cross with me. Claude's Drive connector reads Docs and Sheets well. Audio files, it does not. Do not drop an <code>.m4a</code> into Drive and expect Claude to listen to it. Transcribe first: use your phone's built-in dictation, or run Whisper locally (my Mac Mini M1 does this happily and nothing leaves the house, which is a nice bonus if the recording mentions a client's name). Text into Drive, then Claude.</p>
<p>And if you're already on ServiceM8, check what you've got before you build anything. Its dictation writes straight to the job card, and you're paying for it.</p>
<h2 id="claude-code-is-not-just-for-code-and-thats-the-interesting-part">Claude Code is not just for code (and that's the interesting part)</h2>
<p>The name is doing this tool a disservice.</p>
<p>Claude Code is a terminal application. You point it at a folder on your computer and it can read, write, move, rename and reorganise everything in there, run commands, and work through a long list of tasks without you babysitting each step. That is obviously useful for code. It is also, and almost nobody talks about this, extremely useful for <em>files</em>. Which is what a small business actually drowns in.</p>
<p>Things I've watched it do that have nothing to do with programming:</p>
<ul>
<li>Take a folder of 400 job photos with names like <code>IMG_4471.jpeg</code> and rename and sort them into folders by date and job number.</li>
<li>Read a directory of eighty PDF invoices from suppliers, pull out the date, supplier, total and GST from each, and produce a single spreadsheet.</li>
<li>Take a decade of scattered documents and reorganise them into a filing structure that a human could actually navigate.</li>
<li>Turn a folder of messy site notes into a properly formatted report, with headings, in Word.</li>
<li>Compare this year's price list to last year's and tell me exactly what moved and by how much.</li>
</ul>
<p>That's the pitch: it's a very fast, very literal assistant that can touch every file on your machine. If your admin problem is fundamentally "there are too many files and they're a mess", this is the tool, and it's the one that'll surprise you.</p>
<p><strong>Now the honest part, because there's a catch and it's a real one.</strong></p>
<p>This is meaningfully harder than everything else in this article. It lives in a terminal, which means a black window and typed commands. There's no undo button. When it renames four hundred files it has <em>renamed four hundred files</em>, and if it misunderstood you, it misunderstood you four hundred times, quickly and efficiently.</p>
<p>So if you go here:</p>
<ul>
<li><strong>Work on a copy.</strong> Always. Copy the folder, let it loose on the copy, check the result, then swap. This is not paranoia, it's just what you do.</li>
<li><strong>Use version control or at least a backup</strong> before any bulk operation. Time Machine counts.</li>
<li><strong>Do not turn off the permission prompts.</strong> There's a flag that skips all the "can I do this?" confirmations, and it is enormously tempting, and I've written about <a href="/blog/claude-code-dangerously-skip-permissions/">why that's a bad idea</a> at some length. Short version: the confirmations are the only thing standing between an ambiguous instruction and a very bad afternoon.</li>
<li><strong>Watch the meter.</strong> Agents can get stuck in fix-loops, cheerfully burning tokens trying the same broken thing in slightly different ways. Type <code>/cost</code> occasionally. Ask me how I know.</li>
</ul>
<p><strong>And on the actual coding side:</strong> yes, you can now build small internal tools that used to require hiring someone like me. A pricing calculator. A script that reformats quotes onto your letterhead. A little dashboard of unpaid jobs. Genuinely, this works.</p>
<p>Good candidates: internal, not sensitive, low stakes, and honestly you'd have bodged it in a spreadsheet anyway.</p>
<p>Bad candidates: anything touching customer personal data, anything touching payments, anything a customer sees. Not because the AI can't write it. It can, and it'll work fine on Tuesday. The problem arrives six months later when a dependency updates and it silently breaks, and fixing it requires precisely the skill you were avoiding by using AI in the first place. Building is the easy half. Owning it forever is the other half, and nobody mentions that in the demo video.</p>
<h2 id="the-alternatives-honestly">The alternatives, honestly</h2>
<p>I've written this around Claude because it's what I use daily and know best. But the shape of it ports.</p>
<p><strong>ChatGPT's version is called Work</strong>, and it now lives inside the Codex app, which until recently was just OpenAI's coding agent. That's a slightly odd home for it if you're not a developer, but it's the same idea: connectors, file access, multi-step tasks that run without you watching. Every workflow above translates roughly one to one. If you're already living in OpenAI, stay there and don't let me talk you into a second subscription.</p>
<p><strong>n8n, Make, Zapier</strong> are the layer you add when you want something to run without you sitting in a chat window. Self-hosted n8n on a spare Mac Mini or a five dollar VPS is genuinely cheap. It's also only free if someone owns it, and "someone" is you, on a Friday night, when an update breaks a workflow.</p>
<p><strong>Hermes Agent</strong> from Nous Research is the always-on, self-hosted, talks-to-you-on-Telegram end of the spectrum. It's real, it's open source, it runs for pocket money, and I've <a href="/blog/hermes-agent-what-it-is/">written about it in detail</a>. It's also a developer's toy rather than a business product. No audit logging, no support, you own uptime and security. Wonderful if you enjoy running a Linux box. If you don't know whether you enjoy running a Linux box, you don't.</p>
<p>Rough order of power, and of how much of your weekend it eats: Chat, then Cowork, then n8n, then self-hosted. Stop as soon as it's working. There's more on the <a href="/blog/ai-agents-for-small-business-2026/">broader agent landscape here</a>.</p>
<h2 id="whats-a-waste-of-your-money">What's a waste of your money</h2>
<ul>
<li><strong>Unreviewed AI quotes.</strong> Covered above. The maths is seductive and the line items lie.</li>
<li><strong>"AI local SEO" subscriptions at $99 a month.</strong> Answer your phone first. Come back to this when you've run out of better problems, which will be never.</li>
<li><strong>Thin AI wrappers.</strong> Before you subscribe to any narrow "AI something" tool, ask what it does that your twenty dollar chatbot and the software you already pay for don't. Usually the answer is "a nicer logo".</li>
<li><strong>Autonomous scheduling optimisation.</strong> Suggestions across a couple of vans, fine. Set-and-forget across a fleet with real constraints, no. Not yet.</li>
<li><strong>Anything Australian and regulatory.</strong> A general chatbot will be confidently, fluently wrong about GST treatment, Fair Work award rates, and state licensing. It will not hedge. It will not blink. Your apprentice's pay rate is not a vibe.</li>
</ul>
<p>Watch the meters too. Per seat, per minute, per token. Cowork tasks chew through a plan allowance far faster than chat does, and the first big bill is always a surprise.</p>
<h2 id="start-here-this-week">Start here this week</h2>
<p>Three things. In this order.</p>
<ol>
<li><strong>Turn on the AI you're already paying for.</strong> ServiceM8, Xero, MYOB, QuickBooks, all of them shipped real features in the last year. Zero new vendors, zero new risk.</li>
<li><strong>Twenty dollars for Claude or ChatGPT</strong>, connectors wired to a dedicated account, not your admin login.</li>
<li><strong>Build the project brain.</strong> Rates, prices, terms, service area. Thirty minutes. This is the step that separates a useful assistant from an expensive random number generator.</li>
</ol>
<p>Then leave it alone for a fortnight and see what you actually reach for.</p>
<p>Next up on the blog: the phone. Which is where the real money is hiding, and where the real landmines are too.</p>
<p>I build this stuff for a living, out of Sydney, mostly <a href="/ai-automation-services/">automation for the admin work</a> that eats the evening. If you get stuck wiring it up, you know where to find me.</p>
]]></content:encoded>
      <pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-07-13T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>Tutorials</category>
      <category>tradie</category>
      <category>small business</category>
      <category>Claude</category>
      <category>Cowork</category>
      <category>automation</category>
    </item>
    <item>
      <title><![CDATA[Grok 4.5 Review: I Tested SpaceXAI's Cheap Coder]]></title>
      <link>https://thomas-wiegold.com/blog/grok-4-5-review/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/grok-4-5-review/</guid>
      <description><![CDATA[I ran Grok 4.5 through my usual coding tests — website builds, a Go poker sim, a site audit. It's fast, cheap, and it found a bug no other model caught.]]></description>
      <content:encoded><![CDATA[<p>Most of the launch-day coverage for a new model is a quick rewrite of the press release and a few Musk tweets, which is understandable when you're racing to publish. So here's my Grok 4.5 review with the one thing that coverage can't fake: I actually ran the thing through my usual coding tests. Two website builds, a Go poker simulation, an audit of my own site. It's fast, it's cheap, and it caught a bug that no other model has ever flagged for me, including the ones I rate higher than it. That last part is the bit I keep chewing on, so I'll come back to it.</p>
<h2 id="what-grok-45-actually-is-and-why-the-price-is-the-story">What Grok 4.5 actually is (and why the price is the story)</h2>
<p><a href="https://x.ai/news/grok-4-5">Grok 4.5 launched July 8, 2026</a> for developers, with the wider public rollout a day later, from SpaceXAI. If that name makes you do a double take, fair enough: SpaceX absorbed xAI back in February, so the company shipping Grok now is the merged entity. It's pitched squarely at coding, agentic tasks, and knowledge work. This is not a consumer-chatbot play, which is a nice change of pace.</p>
<p>Here's a clean definition if you just want the one-liner: Grok 4.5 is a mixture-of-experts coding and agentic model from SpaceXAI, jointly trained with Cursor, that lands near the top of the independent leaderboards while costing a fraction of its rivals per task. The headline isn't the leaderboard, though. It's the economics.</p>
<p>The API price is $2 per million input tokens and $6 per million output, <a href="https://artificialanalysis.ai/models/grok-4-5">which Artificial Analysis clocks at more than 60% below Claude Opus 4.8 and GPT-5.5</a>. On top of that, it's stingy with tokens: roughly 4.2 times fewer output tokens than Opus 4.8 to resolve the same task. Cheap price multiplied by fewer tokens is where the real gap opens up.</p>
<p>One thing to get straight before anyone runs away with a "Grok beats Opus" headline. Musk's own framing, in the pre-launch chatter, put it at <a href="https://thenextweb.com/news/spacexai-grok-4-5-cursor-opus-class-coding-model">roughly Opus 4.7, not 4.8</a>. So "Opus-class tier" is fair. "Beats Opus" is not what the numbers say. Cursor also <a href="https://cursor.com/blog/grok-4-5">disclosed that an earlier snapshot of its own codebase accidentally ended up in training</a>, which gave Grok an unfair edge on one internal benchmark. Credit for owning it publicly. It's also worth naming, because it does raise a small flag about training-data contamination.</p>
<h2 id="the-cursor-connection-why-this-model-can-code">The Cursor connection: why this model can code</h2>
<p>This is the part that actually explains the coding ability, so stick with me.</p>
<p>On June 16, 2026, <a href="https://www.cnbc.com/2026/06/16/spacex-spcx-cursor-acquisition-ipo.html">SpaceX exercised an option to buy Anysphere, the maker of Cursor, for $60 billion in an all-stock deal</a>. That's the largest acquisition of a venture-backed startup ever recorded, nearly double Google's Wiz purchase. <a href="https://techcrunch.com/2026/06/16/spacex-to-acquire-cursor-for-60b-in-stock-days-after-blockbuster-ipo/">TechCrunch, Reuters, CNBC, and everyone else confirmed it</a>, so this isn't a rumour I'm passing along.</p>
<p>But the deal itself isn't the interesting part for us. The training is. <a href="https://cursor.com/blog/grok-4-5">Cursor's own launch post says Grok 4.5 was trained on trillions of tokens of Cursor data</a>: real developer-agent interactions, not just scraped public repos. That's the difference between learning what code looks like and learning how developers actually work through a problem. Identify the bug, run the tool, read the error, fix it, verify. That feedback loop is a genuinely plausible source of the token-efficiency edge, not marketing fluff.</p>
<p>Here's the question I actually wanted answered. Cursor's own Composer 2.5 was already a strong, cheap coding specialist. So what did the joint training add on top of a model that was already good? The honest answer from the outside is: breadth. Cursor deliberately widened the data mix beyond pure software engineering into STEM, research, and general knowledge work, so Grok 4.5 generalises where Composer stayed narrow. Whether that trade lands for your specific workflow is exactly the kind of thing you'd want to test yourself.</p>
<p>Speculating a little, because it's fun: the more interesting thing over the next year probably isn't the model at all. It's what SpaceX and Cursor ship around it, the agent and tooling layer, now that the same company owns both the IDE and the weights. That's a tighter loop than any competitor has right now. We'll see if they use it.</p>
<h2 id="i-ran-my-usual-tests">I ran my usual tests</h2>
<p>If you've read my other model reviews, you know the drill. I keep the prompts fixed across every model so the comparison actually means something. Same three tests, every time:</p>
<ul>
<li>Two single-file HTML website builds: a Sydney coffee roaster and a pop-culture clothing store.</li>
<li>A Go Texas Hold'em terminal simulation: six personality-driven bots, 1000 hands, full statistics at the end.</li>
<li>An audit of thomas-wiegold.com, my own blog.</li>
</ul>
<p>None of this is a scientific benchmark. It's a working developer poking at a tool the way he'd actually use it. I'll be explicit about that, because the whole point is that it's hands-on rather than a leaderboard screenshot.</p>
<h3 id="the-website-builds">The website builds</h3>
<p>These were among the best build results I've gotten out of any model. Layout was clean, the animations were tasteful rather than the usual "look at all the CSS I know" mess, the fonts were sensible, and it was fully responsive on mobile without me asking twice. It also generated fast.</p>
<p>I'll hedge honestly, though. I still slightly prefer the builds I got from <a href="/blog/google-antigravity-review-i-tested-gemini-3-5-flash/">Gemini 3.5 Flash in my Antigravity review</a>. Not by a lot, and reasonable people could flip the ranking, but I'm not going to oversell Grok here just because the price is good.</p>
<h3 id="the-go-poker-simulation">The Go poker simulation</h3>
<p>This might be my best-ever result on this test, full stop.</p>
<p>Before Grok 4.5, exactly one model had one-shotted the poker sim cleanly: Claude Fable. Grok did it too, first try, and its statistics output at the end was more detailed than what I'd seen before. Six bots with distinct personalities, a thousand hands, and a stats breakdown I didn't have to fix. Under ten minutes, start to finish. For a test that's tripped up plenty of frontier models, that's a genuine result.</p>
<h3 id="the-site-audit">The site audit</h3>
<p>This is the one. This is the reason I'm bothering to write the review at all.</p>
<p>Grok 4.5 caught a real problem on my site that no other model has ever flagged, and I've run this audit a lot. Not even Fable found it. My Markdown to HTML article conversion was injecting hidden, non-rendering data into the output, quietly inflating the payload of every single article. Invisible to a reader, invisible to me, and adding weight to every page load. Concrete, fixable, and exactly the kind of finding that justifies running the test in the first place. I fixed it today.</p>
<p>So where does that leave the section verdict? The benchmarks put Grok 4.5 a notch below Fable, Opus, and GPT-5.5. In my hands, across these three tasks, it felt level with them or close enough that I couldn't reliably tell them apart. Gut feel, not science. But that honesty is exactly why I trust my own tests more than a vendor chart, and hopefully why you do too.</p>
<h2 id="pricing-and-supergrok-where-the-value-actually-lands">Pricing and SuperGrok: where the value actually lands</h2>
<p>I'll say it plainly, because it's the number that matters. On <a href="https://artificialanalysis.ai/articles/grok-4-5-brings-spacexai-to-the-the-intelligence-frontier">Artificial Analysis's Coding Agent Index</a>, a task in Grok Build runs about $2.49. The same class of task costs roughly $5.07 for GPT-5.5 in Codex and about $11.80 for Fable 5 in Claude Code. That's not a rounding difference. Multiply it across a month of agent runs and the arithmetic bends hard in Grok's favour.</p>
<p>The API breakdown, if you want it: $2 input, $6 output, $0.50 cached (a 75% discount), and prices double once your prompt crosses 200k tokens. Cached-heavy agentic loops are where this gets silly cheap.</p>
<p>My own experience backs the number up. I'm on the $30-a-month SuperGrok plan, and my full review test suite, all three tests, barely dented my quota. Somewhere around 1% of my weekly usage. I had to double-check that, because it felt too low. It wasn't.</p>
<p>This tracks with the thesis I've been banging on about since my <a href="/blog/mai-code-1-flash-review/">MAI-Code-1-Flash review</a>: I back cheap-and-fast models for the work most of us do most of the time. Fable is a better model. I'm not disputing that. But I won't pay Fable prices for routine work, and neither will most teams once they see the invoice. Grok 4.5 is the one I'll actually reach for day to day.</p>
<h2 id="the-caveats-worth-knowing">The caveats worth knowing</h2>
<p>Nothing here is a dealbreaker on its own, but you should know all of it before committing.</p>
<p>The context window is 500k tokens. That's a regression from Grok 4.3's 1M, and it sits behind the 1M windows on Claude and Gemini. Now, I'd argue those headline numbers are mostly marketing anyway, since <a href="/blog/context-engineering-for-ai-agents/">models degrade and start dropping detail long before the window is actually full</a>, so I wouldn't lose sleep over the on-paper gap. Still, less usable room is less usable room, and if you're doing long-document work or feeding in a large repo, it's worth knowing you've got a smaller runway to play with than the previous version gave you.</p>
<p>Reliability has a real wrinkle. On the <a href="https://the-decoder.com/grok-4-5-is-so-cheap-compared-to-fable-5-and-gpt-5-5-that-benchmark-gaps-may-not-matter-much/">AA-Omniscience benchmark, accuracy improved but the hallucination rate rose to around 54%, up from 25%</a>. In plain terms: it knows more, and it's also more confident when it's wrong. For knowledge work, keep a hand on the wheel.</p>
<p>It's not available in the EU at launch. Mid-July is the expected date, so European devs should confirm access before building anything on it.</p>
<p>On trust: the loudest Hacker News thread on launch day wasn't about capability at all, it was about alleged Musk-linked steering of political outputs. I'll note it and leave it there. Opinions in that thread were genuinely split, and it's not my job to settle it for you.</p>
<p>And the "1.5 trillion parameters on a V9 foundation" figure that's floating around? That's attributed to Musk and reporting, <a href="https://officechai.com/ai/grok-4-5-places-behind-only-anthropic-and-openais-top-models-on-artificial-analysis-intelligence-index/">not officially disclosed by SpaceXAI</a>. Treat it as widely-repeated-but-unconfirmed.</p>
<h2 id="grok-45-review-verdict-a-game-changer-for-grok">Grok 4.5 review verdict: a game-changer for Grok</h2>
<p>Straight call: Grok 4.5 is a genuinely good coding model now, and at $30 a month on SuperGrok it's an absurd amount of value. I'll keep using it. Even though Fable is the better model, I'm not paying Fable prices for the routine stuff, and this closes enough of the gap that I don't feel like I'm compromising.</p>
<p>The way to think about it isn't "replace Claude." It's routing. Send the high-volume, repetitive, agentic work to Grok 4.5, and keep Opus 4.8 or Fable 5 for the hardest, highest-risk tasks where a mistake is expensive. Match the model to the job. That's the whole game in mid-2026.</p>
<p>And the competition is only heating up, which is great for us. GPT-5.6 is landing within days and Grok 5 is reportedly already in training. More pressure on all of them means better tools and lower prices for the rest of us. Mostly, I'm curious where Cursor goes now that it's part of a rocket company. That's a sentence I did not expect to write this year.</p>
]]></content:encoded>
      <pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-07-09T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI News</category>
      <category>SpaceXAI</category>
      <category>Grok</category>
      <category>Cursor</category>
      <category>LLM</category>
      <category>AI Coding</category>
      <category>Review</category>
    </item>
    <item>
      <title><![CDATA[MAI-Code-1-Flash Review: I Tested Microsoft's First Coding Model]]></title>
      <link>https://thomas-wiegold.com/blog/mai-code-1-flash-review/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/mai-code-1-flash-review/</guid>
      <description><![CDATA[I tested Microsoft's MAI-Code-1-Flash coding model on real projects. Fast and cheap, yes, but here's why I won't be switching from Kimi K2.7 Code.]]></description>
      <content:encoded><![CDATA[<p>Microsoft shipped its first fully in-house coding model at Build in June, and I've spent a few hours putting it through my standard test suite. This MAI-Code-1-Flash review is the result: four real coding tasks, the same ones I run against every model, no benchmark screenshots recycled from the press release.</p>
<p>Short version: it's fast, it's cheap, and I won't be using it. But the details are more interesting than the verdict, so let's go through it.</p>
<h2 id="what-is-mai-code-1-flash">What Is MAI-Code-1-Flash?</h2>
<p>MAI-Code-1-Flash is Microsoft's first coding model trained entirely in-house, <a href="https://microsoft.ai/news/introducingmai-code-1-flash/">announced on June 2, 2026 at Build</a> as one of seven MAI models from Mustafa Suleyman's AI Superintelligence Team. It's a sparse Mixture-of-Experts model with 137B total parameters, only 5B active per token, and a 256K context window. It was trained directly inside the GitHub Copilot production harness, which is genuinely a different approach: instead of optimising for benchmarks and hoping it transfers, Microsoft trained it against the exact tools and workflows Copilot uses in VS Code.</p>
<p>The positioning is refreshingly honest. This is not a frontier model and Microsoft doesn't pretend it is. It's meant to be the cheap, fast, everyday workhorse. Completions, small refactors, boilerplate, repository Q&amp;A. I actually like this strategy. Not every task needs a trillion-parameter model burning through your credits, and a vendor saying "this is our budget option" out loud is rarer than it should be.</p>
<p>The question is whether it's good enough at the everyday stuff to earn that slot. That's what I tested.</p>
<h2 id="why-i-wanted-to-try-it">Why I Wanted to Try It</h2>
<p>Two reasons. First, plain curiosity. Microsoft building its own models after the OpenAI contract renegotiation is one of the more interesting strategic shifts this year. Suleyman has been open about the ambition (and about the current gap, telling The Verge that only three labs matter right now and Microsoft isn't one of them). A first release from a team with that much money behind it is worth a look regardless of the benchmarks.</p>
<p>Second, I genuinely like the fast-and-affordable philosophy. My daily driver setup already routes easy tasks to cheaper models. If Microsoft delivered a great budget model, I'd use it. I have zero brand loyalty here.</p>
<p>I tested it through my existing GitHub Copilot subscription in VS Code, using the same four prompts I throw at every model I review. Same conditions, same expectations.</p>
<h2 id="my-test-setup">My Test Setup</h2>
<h3 id="the-four-standard-tests">The Four Standard Tests</h3>
<p>Every model I review gets the identical suite:</p>
<ol>
<li><strong>A website for a fictional Sydney coffee roaster.</strong> Tests design taste, layout, typography.</li>
<li><strong>A pop culture clothing store.</strong> Tests the same skills with a louder brief.</li>
<li><strong>A poker simulation in Go.</strong> Tests actual logic: game rules, statistics, state management.</li>
<li><strong>An audit of my own site, thomas-wiegold.com.</strong> Tests analysis and judgement on a real codebase.</li>
</ol>
<p>Same prompts every time. It's not a scientific benchmark, but it's apples-to-apples across every model I've written about, and after enough reviews you develop a feel for where each model sits.</p>
<h2 id="hands-on-results">Hands-On Results</h2>
<h3 id="website-builds-rounded-corners-everywhere">Website Builds: Rounded Corners Everywhere</h3>
<p>The coffee roaster site was, and I'm choosing my words carefully here, incredibly ugly. It worked. Nothing was broken. But it was the worst-looking result I've had since I started running this test. Boring system-adjacent fonts, the most generic brown-and-cream coffee palette imaginable, a flat layout with no hierarchy, and rounded corners on absolutely everything. Buttons, cards, images, sections. If it had a corner, it got rounded.</p>
<p>The clothing store went slightly better. The animations were actually a bright spot, smooth and reasonably tasteful. But the same problems showed up: boring fonts, and again the rounded-corner obsession. It's such a specific quirk that I have to assume it's baked into the training data or the RL reward somewhere. Some evaluator at Microsoft apparently really likes border-radius.</p>
<p>To be fair, I retested both builds with my custom web-design skill that I developed based on <a href="/blog/claude-code-frontend-design-plugin/">Claude's frontend-design plugin</a>, which usually rescues weaker models. Fonts and layout improved noticeably. The rounded corners survived. At this point I consider them a personality trait.</p>
<h3 id="go-poker-simulation-fast-but-broken">Go Poker Simulation: Fast but Broken</h3>
<p>This one was an outright fail, and the numbers make it easy to show why.</p>
<p>Generation speed was genuinely impressive. The code appeared quickly, compiled, and ran. Then I looked at the output: after 1,000 simulated hands, individual players were showing 800 to 900+ wins each. In a game where most of the time one player wins per hand, that's not a rounding error, that's a simulation that doesn't understand what it's simulating. The betting logic was similarly broken. Players were behaving in ways that made no sense, and the game state was often inconsistent. The model produced code that looked superficially correct but failed to implement the rules of poker in any meaningful way.</p>
<p>It is not an easy task. <a href="/blog/claude-fable-5-review/">Claude Fable</a> was the only model to get it right on the first try, and created a perfect simulation. All other models I tested needed multiple iterations, and some never got there. But MAI-Code-1-Flash didn't even get close. It was fast, yes, but speed without correctness is useless.</p>
<h3 id="website-audit-passable-not-impressive">Website Audit: Passable, Not Impressive</h3>
<p>The audit of my own site was the most respectable result. Fast turnaround, and it found a handful of real issues. It also flagged several non-issues with full confidence and missed things that stronger models catch reliably. If I'd never run this test with a better model, I might have been satisfied. I have, so I wasn't.</p>
<p>Passable. That's the word. Not a disaster, not a reason to pick it.</p>
<h2 id="how-mai-code-1-flash-compares-to-the-benchmarks">How MAI-Code-1-Flash Compares to the Benchmarks</h2>
<p>Here's where my results and Microsoft's marketing part ways.</p>
<p>Microsoft's launch numbers show MAI-Code-1-Flash <a href="https://microsoft.ai/news/introducingmai-code-1-flash/">beating Claude Haiku 4.5 across every coding benchmark it published</a>, including a 16-point lead on SWE-Bench Pro (51.2% vs 35.2%), while using up to 60% fewer tokens. Sounds great. Three caveats.</p>
<p>First, every comparison is vendor-run, in Microsoft's own VS Code harness, against exactly one competitor, and Haiku is the smallest model in Anthropic's lineup. That's not a benchmark table, that's a controlled demolition.</p>
<p>Second, on independent leaderboards, ~51% SWE-Bench Pro sits well below the frontier. Opus 4.8, GLM-5.2, Qwen3.7 Max, MiniMax M3, GPT-5.5 and Kimi K2.6 all score meaningfully higher. To be fair to Microsoft, 51% from a 5B-active model is strong for its size (Opus 4.6 scored around 52% on the same benchmark not that long ago). The engineering is real. The competitive position isn't.</p>
<p>Third, and this is the part benchmarks never capture: my hands-on results don't match the story. A model that scores 51% on SWE-Bench Pro should not produce a poker simulation where everyone wins. Benchmarks and real-world usability diverge, and this release is a textbook example.</p>
<table>
<thead>
<tr>
<th>Task</th>
<th>Result</th>
</tr>
</thead>
<tbody><tr>
<td>Coffee roaster website</td>
<td>Functional, worst design in my testing history</td>
</tr>
<tr>
<td>Clothing store website</td>
<td>Weak design, good animations</td>
</tr>
<tr>
<td>Go poker simulation</td>
<td>Fail (800-900+ wins per player after 1,000 hands)</td>
</tr>
<tr>
<td>Website audit</td>
<td>Passable, missed issues stronger models catch</td>
</tr>
<tr>
<td>Speed</td>
<td>Genuinely fast, as advertised</td>
</tr>
<tr>
<td>Cost</td>
<td>Genuinely cheap, as advertised</td>
</tr>
</tbody></table>
<p>One more thing worth knowing before you buy the "clean, licensed data" pitch: <a href="https://simonwillison.net/2026/Jun/2/microsofts-new-models/">Simon Willison dug into the underlying technical paper</a> and found the same public-web-crawl licensing situation as every other major LLM, roughly 1.2 trillion crawled pages plus a Common Crawl portion. The Data Card also discloses that OpenAI models were used for data preparation. Technically compatible with "no distillation," but the marketing is doing some heavy lifting.</p>
<h2 id="is-mai-code-1-flash-worth-using">Is MAI-Code-1-Flash Worth Using?</h2>
<p>For me, no. And I've tried to find a reason.</p>
<p>The pricing is real: $0.75 per million input tokens, $0.075 cached, $4.50 output under Copilot's AI Credits system. That undercuts Haiku 4.5 on input, and the token efficiency claim means effective cost per task could be lower still. If your entire use case is autocomplete and boilerplate at maximum volume and minimum cost, it might squeeze into your setup on price alone.</p>
<p>But at similar price points you can get Kimi K2.7 Code, Qwen 3.7 Plus, MiniMax M3, or DeepSeek V4, and every one of them beat MAI-Code-1-Flash in my testing. There's no dimension where it wins except being made by Microsoft. If you're in Copilot and want a cheap model, my honest recommendation is Kimi K2.7 Code. It costs about the same and doesn't lose track of who won the poker hand.</p>
<p>One practical warning if you do try it: multiple users have reported a plan-mode looping bug that burns credits at speed while producing nothing. Under usage-based billing, set your budget caps before experimenting, not after.</p>
<p>The genuinely interesting open question is MAI-Thinking-1, the flagship reasoning model still in private preview. It's the base MAI-Code-1-Flash was trained from, it's a much bigger model, and Microsoft's claims for it are more ambitious. If the small model is this rough and the big one is good, the strategy still works.</p>
<h2 id="final-thoughts">Final Thoughts</h2>
<p>Fast and cheap: confirmed. Both claims check out completely, and I want to give Microsoft credit for shipping exactly the performance profile it advertised.</p>
<p>Quality: not confirmed. The design output was the worst I've tested, the logic task failed outright, and the audit was merely okay. For a model whose entire pitch is "good enough for everyday work," it wasn't good enough for my everyday work.</p>
<p>I remain curious about where Microsoft goes from here. Training inside the production harness is a smart idea, the token efficiency is real engineering, and MAI-Thinking-1 might change the picture entirely. I'll test it the moment I can get access, same four tasks as always.</p>
<p>Until then: skip this one. Your credits deserve better.</p>
<hr />
<p><em>Previously in this series: my reviews of <a href="/blog/claude-fable-5-review/">Claude Fable 5</a>, <a href="/blog/minimax-m3-review/">MiniMax M3</a>, and <a href="/blog/deepseek-v4-review/">DeepSeek V4</a>. And if you enjoy watching hype meet reality, there's also <a href="/blog/when-is-deepseek-v5-coming-out/">the DeepSeek V5 rumour that wasn't</a>.</em></p>
]]></content:encoded>
      <pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-07-07T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI News</category>
      <category>Microsoft</category>
      <category>MAI-Code</category>
      <category>LLM</category>
      <category>AI Coding</category>
      <category>Review</category>
    </item>
    <item>
      <title><![CDATA[Context Engineering for AI Agents: A Field Guide]]></title>
      <link>https://thomas-wiegold.com/blog/context-engineering-for-ai-agents/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/context-engineering-for-ai-agents/</guid>
      <description><![CDATA[AI agents drift, forget, and derail on long tasks. Learn context engineering — 8 practical rules to keep your agents reliable, grounded, and on-goal.]]></description>
      <content:encoded><![CDATA[<p>A Stanford paper went semi-viral a while back, or at least the AI-news-scan version of it did. The claim landed in my inbox like a cold shower: autonomous agents suffer catastrophic goal drift after about 100,000 tokens. You ask them to fix a billing bug, and an hour later they're trying to delete the billing database. Agents, apparently, have a 20-minute attention span.</p>
<p>It's a great story. It's also wrong.</p>
<p>The <a href="https://arxiv.org/abs/2505.02709">actual research</a> (which is not from Stanford, and which I'd encourage you to read before quoting) found close to the opposite. The best agent it tested held its assigned goal almost perfectly for <em>more</em> than 100,000 tokens. The scary number was a measure of how <em>robust</em> the thing was, not where it fell off a cliff. Somewhere between the paper and my inbox, a finding got inverted and a database got dramatically murdered for effect.</p>
<p>So no, there's no tidy 20-minute timer. But agents <em>do</em> degrade over long contexts, and the way they degrade is genuinely worth understanding. The real story is less cinematic and a lot more useful: the leverage in agentic AI has quietly moved from writing clever prompts to managing what's in the context window. This is a field guide to doing that. Fair warning, it's notes on an open problem, not a victory lap.</p>
<h2 id="prompting-isnt-dead-it-just-moved-into-the-loop">Prompting Isn't Dead, It Just Moved Into the Loop</h2>
<p>You've heard the line by now. "Prompting is dead, build loops." Stop hand-holding the model, wrap it in an agentic loop, let it rip.</p>
<p>There's a real half-truth in there. We genuinely are writing fewer babysitting instructions than we did two years ago, because the models read intent better and because over-steering them often makes things worse, not better. I've written before about <a href="/blog/prompt-engineering-best-practices-2026/">why most of the old prompt-engineering tricks have aged badly</a>, and a lot of that holds. The era of stuffing your prompt with "you are a world-class expert who thinks step by step" is over.</p>
<p>But "prompting is dead" is the wrong conclusion. Here's the thing nobody mentions when they're selling you on loops: a one-shot prompt's weakness costs you exactly once. In a loop, that same weakness fires on every single iteration. And worse, the errors don't just repeat, they <em>accumulate inside the context</em>. Each pass leaves residue. By turn forty, the agent isn't reasoning about your task anymore, it's reasoning about a context window full of its own earlier confusion.</p>
<p>I went deep on this when I wrote up <a href="/blog/ralph-loop-how-recursive-ai-agents-work/">how the Ralph loop and recursive agents actually behave</a>, and it changed how I think about the whole pattern. The loop doesn't retire the prompt. It multiplies the consequences of a bad one, and it adds a brand new failure mode (drift) that one-shot prompting never had to worry about.</p>
<p>So the skill didn't disappear. It moved. It used to be about wording the request. Now it's about curating what's in the window. We gave that second thing a name, context engineering, and it turns out to be most of the job.</p>
<h2 id="your-context-window-is-lying-to-you">Your Context Window Is Lying to You</h2>
<p>Let me save you some pain. The big number on the model's spec sheet is marketing.</p>
<h3 id="effective-vs-advertised-context">Effective vs advertised context</h3>
<p>Every frontier model now advertises an enormous context window. A million tokens, sometimes more. The implication is that you can pour your entire codebase in and the model will hold all of it in mind at once. It will not.</p>
<p>The benchmarks are pretty blunt about this. <a href="https://arxiv.org/abs/2404.06654">NVIDIA's RULER work</a>, which has become the standard sanity check, suggests models reliably use only somewhere around 50 to 70 percent of their advertised window for real multi-step work. <a href="https://research.trychroma.com/context-rot">Chroma's "context rot" study</a> tested a whole pile of frontier models and found that <em>every single one</em> degraded as the input grew. Not at the limit. Well before it. Even on tasks that should have been trivial.</p>
<p>And here's the part that matters for agents specifically: multi-fact, multi-hop retrieval falls apart much faster than simple single-fact lookup. Finding one needle in a haystack is easy. Connecting four needles scattered through that haystack, which is what your agent does on every non-trivial step, is where the wheels come off.</p>
<p>So the spec-sheet number is a capacity claim, not a quality claim. Treat it accordingly.</p>
<h3 id="why-a-bigger-window-wont-save-you">Why a bigger window won't save you</h3>
<p>The intuitive fix is "just use a model with a bigger window." It doesn't work, for two compounding reasons.</p>
<p>The first is context rot: the signal gets blurrier the more you load, full stop. The second is sneakier and it's called proactive interference. Stale information sitting in your context actively corrupts the model's ability to retrieve the fresh stuff. The unsettling finding from recent work is that this persists <em>regardless</em> of how big the window is, and it resists prompt-engineering fixes. You can't just politely ask the model to ignore the old data.</p>
<p>This is where I reach for an analogy, and I'll upgrade the usual one. People say the context window is like RAM, limited working memory you have to manage. True, but incomplete. It's RAM where the contents get blurrier the more you cram in, <em>and</em> where the old entries actively scramble your reads of the new ones. So the job was never just fitting things into memory. The job is eviction and forgetting. (Standard disclaimer: this is a useful model, not a literal description of the architecture. Please don't email me about attention heads.)</p>
<p>One more thing that breaks the "bigger window" instinct. In long autonomous runs, agents derail even when the window never fills up. There's a <a href="https://arxiv.org/abs/2502.15840">now-famous benchmark</a> where an agent running a simulated vending-machine business spiraled into a meltdown and started trying to email the FBI about imaginary crimes. The failure had nothing to do with running out of space. It was a coherence failure. More room wouldn't have helped. The agent didn't need a bigger desk, it needed to stop losing the plot.</p>
<h2 id="8-rules-for-engineering-agent-context">8 Rules for Engineering Agent Context</h2>
<p>Right, the practical part. This is the stuff I actually do, roughly in order of how much grief each one has saved me. Most of it lines up with <a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents">Anthropic's own writeup on context engineering</a>, with a layer of my own scar tissue on top.</p>
<p><strong>1. Treat context as a budget, not a backpack.</strong> Your instinct is to throw everything in just in case. Resist it. Aim for the smallest set of high-signal tokens that gets the job done. A rule of thumb I've seen practitioners settle on is to keep your working context well under the advertised window, often in the ballpark of a quarter to a third of it. That's a starting heuristic, not a law of physics, but it's a much better default than "fill it up."</p>
<p><strong>2. Put your persistent rules in a file, not the chat.</strong> Anything the agent must always know belongs in a project file like <code>CLAUDE.md</code> or <code>AGENTS.md</code> at the repo root, not buried in conversation history that's going to get compacted away. This is now a genuine cross-tool standard. That said, these files are not free and they're not magic, and I've got <a href="/blog/claude-md-helpful-or-expensive-noise/">opinions on when CLAUDE.md is helpful versus when it's just expensive noise</a> that are worth a read before you write a 500-line one.</p>
<p><strong>3. Retrieve just-in-time, don't front-load.</strong> Instead of dumping the whole codebase into context, hand the agent lightweight references (file paths, queries, links) and let it pull what it needs with tools like grep and glob. This mirrors how you actually work. You don't memorize the repo, you search it. Your agent should too.</p>
<p><strong>4. Compact deliberately.</strong> When you're near the limit, summarize and continue rather than just truncating. The safest, lowest-risk trim is clearing out stale tool results, because once a tool call is buried deep in history, the agent rarely needs the raw output again. One caution from experience: over-aggressive compaction will quietly drop something whose importance only becomes obvious three steps later. Compaction is lossy. Tune it on real traces, not vibes.</p>
<p><strong>5. Give the agent a scratchpad.</strong> A simple <code>NOTES.md</code> or a maintained to-do list that lives <em>outside</em> the context window is shockingly effective. The agent writes progress and decisions to it, pulls them back when needed, and suddenly it can track a long task without holding the entire history in working memory. Cheap, simple, works.</p>
<p><strong>6. Re-ground the goal on a cadence.</strong> Periodically re-inject the actual objective into the context. It sounds almost too dumb to bother with, but re-stating the goal measurably reduces drift and costs you next to nothing. If your agent is on a long run, remind it what it's doing. Same as you'd do with a junior who's been heads-down for three hours.</p>
<p><strong>7. Decompose with sub-agents, but only for parallel work.</strong> Splitting a task across multiple agents gives each one a small, clean context, which is great. The catch is it costs dramatically more tokens (<a href="https://www.anthropic.com/engineering/multi-agent-research-system">think on the order of fifteen times more in some setups</a>) and it introduces a fresh failure mode where the sub-agents collectively wander off the original problem. Sub-agents shine for breadth-first, independent subtasks. For tightly-coupled work like most coding, where everything depends on everything else, they're often a bad fit. Don't reach for a swarm when one focused agent would do.</p>
<p><strong>8. Gate the irreversible stuff.</strong> This is the real answer to the "agent deleted the database" horror story. Put a human approval step in front of destructive actions: database writes and deletes, deploys, anything involving money. Add checkpointing so a derailed run resumes from a known-good state instead of starting over. I'll be honest, the temptation to just let it run unsupervised is strong, and I've written about <a href="/blog/claude-code-dangerously-skip-permissions/">what actually happens when you skip permissions and let Claude Code off the leash</a>. Short version: gate the things you can't undo. Your future self will thank you.</p>
<h2 id="does-the-model-matter-yes-but-not-how-you-think">Does the Model Matter? Yes, But Not How You Think</h2>
<p>It does matter, just not in the way the leaderboard-watchers assume.</p>
<p>The newer reasoning models resist goal drift noticeably better than last year's batch. That's real progress. But "better" is not "immune," and under sustained pressure or a long pile-up of accumulated context, every model I've worked with will eventually wobble. There's no model you can buy your way to fire-and-forget reliability with. Not yet.</p>
<p>Two findings from recent work are worth tattooing somewhere visible. First, drift can be <em>inherited</em>. If one agent picks up a context that an earlier, weaker agent already nudged off course, the strong model tends to continue the drift rather than correct it. So watch your handoffs. Second, coding agents drift more when an instruction conflicts with something the model was strongly trained to value, like security or privacy. Tell an agent to do something that rubs against its training, and the constraint gets slippery under pressure.</p>
<p>The practical takeaway for picking a model: ignore the headline context number. Choose based on the actual shape of your workload (how much multi-hop retrieval, how long the horizon, how much tool use) and then, this is the important bit, measure your own degradation curve. The spec sheet won't tell you where <em>your</em> agent starts getting dumb. Only your own evals will. This is doubly true if you're <a href="/blog/ai-agents-for-small-business-2026/">putting agents to work in a small business</a>, where a confidently-wrong agent costs you real money and not just a benchmark point.</p>
<h2 id="the-frontier-agents-that-manage-their-own-memory">The Frontier: Agents That Manage Their Own Memory</h2>
<p>Here's where I get to be a bit speculative, because this is the part I find genuinely exciting.</p>
<p>Everything above is <em>us</em> managing the agent's context by hand. The obvious next move is to make that someone else's job. Specifically, another agent's. Picture a second process running in the background between tasks, pruning the memory, reorganizing it, rewriting the messy bits into something cleaner. An agent that "dreams" during its downtime and wakes up with a tidier head.</p>
<p>I want to be clear that this isn't me inventing something in a coffee shop. It's an active research frontier with a real name. The Letta folks (out of the MemGPT lineage) call it <a href="https://www.letta.com/blog/sleep-time-compute/">sleep-time compute</a>: agents using idle time to turn raw context into learned context they can reuse later. There's a small wave of 2026 preprints borrowing directly from neuroscience, with names like SCM and <a href="https://arxiv.org/abs/2603.14517">SleepGate</a>, that model consolidation and <em>forgetting</em> as explicit phases, the way actual sleep does. And the early shipped versions are already here. ChatGPT and Claude Code both do background memory consolidation between sessions now, distilling your preferences and project notes without being asked. (If you see a specific product name attached to this, check it against the vendor's own docs before you repeat it, because the branding in blog posts runs ahead of the official announcements.)</p>
<p>The honest trade-off, because there's always one: an unsupervised process that rewrites memory can also <em>hallucinate structure</em>. Feed it a noisy context and it'll confidently write down patterns that were never there, then treat that fiction as fact next session. Dreaming curates, but it can also quietly corrupt. We do not have this solved.</p>
<p>Which is sort of the whole point. We're all at the very beginning of figuring this out, together, in public. I'm tinkering with some of this myself. I don't have anything worth showing yet, just a growing pile of experiments and half-formed opinions, and I'd rather tell you that plainly than pretend I've cracked it.</p>
<h2 id="putting-it-together">Putting It Together</h2>
<p>If you want the whole thing as a decision ladder, here it is.</p>
<p>Default to tightly-scoped workflows over open-ended autonomy. When you do go agentic, engineer the context first (rules one through six, the budgeting and re-grounding and just-in-time stuff). Reach for sub-agents only when the work genuinely splits into independent parts. And no matter what, gate the actions you can't take back.</p>
<p>A few caveats so you don't quote me too confidently. This field moves monthly, and a lot of the research I've leaned on here is preprints and previews, not settled science. Some of it comes from vendors who have a horse in the race, though the independent benchmarks broadly back up the direction. And there is no universal token cliff. Degradation is gradual, it's model-specific, and it's task-specific. Anyone selling you a magic number is selling you something.</p>
<p>But the core lesson is solid, and it's not going anywhere. In agentic AI, the win doesn't go to whoever has the biggest context window or the cleverest prompt. It goes to whoever manages context the best. Prompting moved into the loop, and the loop runs on whatever you put in front of it.</p>
<p>So put good things in front of it. That's the job now.</p>
<p>This is most of what I actually do when I <a href="/ai-agent-development/">build agents for businesses</a>. The prompt is rarely the problem, and the context almost always is.</p>
<p><em>Last updated: June 2026. This space changes fast, so if you're reading this much later, assume some of the specifics have moved.</em></p>
]]></content:encoded>
      <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-06-30T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI Coding</category>
      <category>AI Agents</category>
      <category>Agentic AI</category>
      <category>LLM</category>
      <category>Prompt Engineering</category>
      <category>AI Strategy</category>
    </item>
    <item>
      <title><![CDATA[When Is DeepSeek V5 Coming Out? The Honest 2026 Answer]]></title>
      <link>https://thomas-wiegold.com/blog/when-is-deepseek-v5-coming-out/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/when-is-deepseek-v5-coming-out/</guid>
      <description><![CDATA[DeepSeek V5 has no announced release date. Here's what the July 24 deprecation actually means, plus V4 Pro pricing, vision API status, and Claude vs GPT-5.]]></description>
      <content:encoded><![CDATA[<p>Short version, because I respect your time: nobody knows, and anyone giving you a hard date is guessing. As of June 2026, there is no DeepSeek V5. No name, no roadmap, no release date, nothing in the <a href="https://api-docs.deepseek.com/">official API docs</a>. If you landed here because a thumbnail somewhere promised "V5 DROPS JULY 24," I have some mildly annoying news about where that date actually comes from.</p>
<p>I run DeepSeek in production every day, so this question matters to me beyond idle curiosity. It's the model quietly doing most of the work behind my agent setup, and if a successor is coming I'd like to know whether to plan around it or not. So I went and checked the primary sources instead of trusting the rumour mill. Let me walk you through what's real, what's noise, and what I'd actually watch.</p>
<p>Spoiler: the most repeated "evidence" for an imminent DeepSeek V5 is a misreading of a routine deprecation notice. We'll get to that.</p>
<h2 id="the-short-answer-no-date-and-thats-okay">The short answer: no date, and that's okay</h2>
<p>DeepSeek has not announced V5. Not a name, not a window, not a teaser. The only models DeepSeek officially lists right now are V4 Pro and V4 Flash. Everything else is people reading tea leaves.</p>
<p>It helps to look at the cadence. DeepSeek shipped V3, then V3.1, then V3.2, then V4, all inside roughly a year. V4 itself only landed on 24 April 2026. That's recent. A clean, ground-up V5 this soon would break the pattern hard. What's far more likely in the near term is a tuned V4.x or a stable V4 release that drops the "Preview" label. Useful, but not the generational leap the hype crowd is promising.</p>
<p>So if your planning depends on V5 arriving by a particular date, build for the world where it doesn't. You'll be right more often.</p>
<h2 id="why-everyone-thinks-deepseek-v5-is-imminent-and-why-theyre-wrong">Why everyone thinks DeepSeek V5 is imminent (and why they're wrong)</h2>
<p>Here's the load-bearing myth. DeepSeek's API docs note that the model names <code>deepseek-chat</code> and <code>deepseek-reasoner</code> will be discontinued at 15:59 UTC on 24 July 2026. A bunch of posts took "deprecation on July 24" and ran with "new model on July 24." You can see the logic. You can also see why it's wrong if you read one more sentence.</p>
<p>Those two names are <em>legacy aliases</em>. They currently point at V4 Flash, one for non-thinking mode and one for thinking mode. DeepSeek is retiring the old generic names and asking everyone to call the models by their real names instead. The migration is a one-line change: swap your <code>model</code> field to <code>deepseek-v4-flash</code> or <code>deepseek-v4-pro</code>. Your <code>base_url</code> stays the same. Your API key stays the same. That's the whole job.</p>
<p>If you're calling the OpenAI-compatible endpoint, it's literally <code>model: "deepseek-chat"</code> becoming <code>model: "deepseek-v4-flash"</code> and you're done. I migrated my own jobs in about five minutes, and most of that was hunting down where past-me had scattered the string. The point is, nothing about your integration <em>breaks</em>. It just stops accepting an old name.</p>
<p>So this isn't a roadmap leak. It's housekeeping. The 90-day countdown started the day V4 shipped, which is exactly how you'd phase out old aliases after a new generation lands. If DeepSeek were dropping V5 on the 24th, they'd be sending you to call <code>deepseek-v5-something</code>. They're not. They're sending you to V4.</p>
<h3 id="does-this-mean-v4-flash-is-going-away">Does this mean V4 Flash is going away?</h3>
<p>No, and this is the part the hype posts get backwards. V4 Flash is the <em>destination</em>, not the casualty. The legacy names are being pointed somewhere permanent, and that somewhere is the explicit V4 model IDs. If you've hard-coded <code>deepseek-chat</code> in some script from 2025, sure, go fix that before July. But your actual model isn't disappearing. Nothing about this date implies a new release. It's a rename with a deadline.</p>
<h2 id="what-deepseek-v4-actually-is-right-now-pro-vs-flash">What DeepSeek V4 actually is right now: Pro vs Flash</h2>
<p>Before we daydream about V5, it's worth being precise about what shipped, because half the articles out there get the basics wrong.</p>
<p>DeepSeek V4 launched as a Preview on 24 April 2026, both variants at once, <a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Pro">open-weight on Hugging Face</a> under the MIT license. The two models:</p>
<ul>
<li><strong>V4 Pro</strong>: a 1.6T-parameter Mixture-of-Experts model with around 49B active parameters per token. This is the premium tier.</li>
<li><strong>V4 Flash</strong>: 284B total, around 13B active. Fast, cheap, the volume workhorse.</li>
</ul>
<p>Both run a 1M-token context window. Both support thinking and non-thinking modes.</p>
<p>A quick word on why the active-parameter numbers matter, because they're the whole reason Flash is cheap. In a Mixture-of-Experts model, only a slice of the network fires for any given token. Flash carries 284B parameters but only lights up around 13B per token, so you get the breadth of a big model at the inference cost of a small one. That's the trick that lets DeepSeek price Flash the way it does. The 1M context, meanwhile, is genuinely useful for the kind of agent work where you're stuffing in a pile of search results and documents and asking the model to make sense of all of it at once. It's not a gimmick number on a spec sheet, at least not for how I use it.</p>
<h3 id="deepseek-v4-pro-pricing">DeepSeek V4 Pro pricing</h3>
<p>The numbers, per million tokens:</p>
<table>
<thead>
<tr>
<th>Model</th>
<th>Input (cache miss)</th>
<th>Output</th>
<th>Cache-hit input</th>
</tr>
</thead>
<tbody><tr>
<td>V4 Flash</td>
<td>$0.14</td>
<td>$0.28</td>
<td>$0.0028</td>
</tr>
<tr>
<td>V4 Pro</td>
<td>$0.435</td>
<td>$0.87</td>
<td>$0.003625</td>
</tr>
</tbody></table>
<p>One correction worth flagging, since I've seen it repeated: the V4 Pro rate isn't a discount anymore. It started as a 75% promo, then became the permanent list price on 22 May 2026. So $0.435 / $0.87 is just what it costs now. Don't budget for the promo expiring, because it already didn't.</p>
<p>Here's where I'll get personal. V4 Flash is my daily driver. I use it constantly through the <a href="/blog/opencode-go-review/">OpenCode Go subscription</a>, which at the volume I push feels close to unlimited, and it's the engine behind most of what my <a href="/blog/hermes-agent-what-it-is/">Hermes setup</a> does all day. Searching, researching, summarising, analysing, the unglamorous connective tissue of agent work. Flash is genuinely more than enough for all of it, and it's quick enough that I rarely sit there watching a spinner.</p>
<p>What I would <em>not</em> do is write code with Flash. Pro is much better for that, and I get into why in my <a href="/blog/deepseek-v4-review/">V4 review</a>. But honestly, even with Pro available, my coding rotation is Opus, GPT-5, Minimax M3, and Kimi 2.7 Code. DeepSeek isn't where I reach first for code. It's where I reach first for cheap, fast, high-volume thinking. Different tool, different job.</p>
<h2 id="deepseek-v4-pro-vs-claude-and-gpt-5">DeepSeek V4 Pro vs Claude (and GPT-5)</h2>
<p>This is the comparison everyone wants, so let's be honest about it instead of cheerleading.</p>
<p>On a chunk of benchmarks, V4 Pro lands in the neighbourhood of Claude Opus 4.7 and GPT-5.5, and it does it at a fraction of the API cost. That part is real and it's impressive. But "near the frontier on some benchmarks" is not the same as "the frontier." On the hardest reasoning and agentic tasks, the top closed models still tend to edge ahead. If raw capability at any cost is your only metric, DeepSeek probably isn't your answer yet.</p>
<p>Where DeepSeek wins, decisively, is the price-to-performance ratio. That's the actual story, and it's a big one. You can run a lot of competent inference for very little money, which changes what kinds of products and agent loops are even economically viable. I've shipped things with Flash that would've been silly to attempt at Claude prices.</p>
<p>Make it concrete. Picture an agent that does a hundred small research-and-summarise passes a day, each one chewing through a decent slab of context. On Flash, that's pocket change, the kind of bill you forget to look at. Run the same loop on a frontier closed model and suddenly you're doing actual maths before you let it run unattended. The capability gap on that particular task is small to none. The cost gap is enormous. That asymmetry is the entire reason I default to Flash for high-volume agent work, and it's why I think the "vs Claude" framing slightly misses the point. They're not really competing for the same job.</p>
<h3 id="how-to-compare-them-without-fooling-yourself">How to compare them without fooling yourself</h3>
<p>Vendor benchmark slides are marketing. If you want a read you can trust, lean on standardised harnesses like SWE-bench Pro or DeepSWE that run the same tasks against every model with the same grading. And test on <em>your</em> workload. A model that tops a leaderboard can still fall apart on your specific agent loop, and the only way to know is to run it. I've been burned by trusting a headline number more than once.</p>
<h2 id="the-deepseek-vision-api-gap-and-why-agent-users-are-still-waiting">The DeepSeek vision API gap, and why agent users are still waiting</h2>
<p>Here's a detail that trips people up. DeepSeek <em>does</em> have vision now. It added image recognition to the chat interface and the mobile app back on 29 April 2026, which <a href="https://www.scmp.com/tech/tech-trends/article/3351892/whale-can-now-see-deepseek-adds-ai-vision-major-move">SCMP wrote up nicely</a> under the headline that the whale can finally see. Upload an image, it understands the image. Good, fast, the works.</p>
<p>The catch, and it's a big one if you build agents: it's chat-only. There's still no vision endpoint in the API. No image content type, nothing you can call programmatically. So for anyone wiring DeepSeek into an automated pipeline, the vision capability may as well not exist. A human can paste a screenshot into the chat box and get a great answer. Your agent, running headless at 2am, cannot. And agents are where vision actually earns its keep: reading a chart, parsing a screenshot, pulling structure out of a scanned document, checking what a UI looks like. All the workflows I'd most want it for live on the API side, behind a door that's still locked.</p>
<h3 id="deepseek-vision-api-the-part-that-matters-for-hermes">deepseek vision api: the part that matters for Hermes</h3>
<p>This is exactly the gap I keep hitting. Inside Hermes, when something needs eyes, I can't hand it to DeepSeek. I route those tasks through Qwen 3.7 Plus instead, purely because Qwen gives me vision over an API and DeepSeek doesn't. It works, but it's a second model in the stack for one missing feature, and I'd happily collapse it back down to one if I could.</p>
<p>So when I think about what would make DeepSeek's next model actually move the needle for me, "another point on a reasoning benchmark" isn't it. A vision API is.</p>
<h2 id="the-funding-signal-and-when-deepseek-v5-might-actually-land">The funding signal, and when DeepSeek V5 might actually land</h2>
<p>There's one piece of news that genuinely changes DeepSeek's trajectory, and it's not a model. It's money.</p>
<p>DeepSeek closed its first ever external funding round in June 2026, roughly $7.4 billion, at a valuation reported in the $55 to $59 billion range. <a href="https://www.scmp.com/tech/big-tech/article/3355818/deepseek-nears-us7b-haul-first-ever-funding-round-backing-tencent-catl">SCMP covered the structure</a>: Tencent led it, the EV battery giant CATL crossed over as a strategic investor (an AI-meets-energy bet that's more interesting than it sounds), and notably, Alibaba and ByteDance sat it out. For a lab that had stayed proudly self-funded, that's a real shift. More capital means more compute, which means more concurrent training runs, which is the kind of thing that eventually produces a V5.</p>
<p>But "eventually" is doing heavy lifting there. None of this comes with a date.</p>
<p>If you want a sane way to track the actual signal instead of the rumours, watch two things: DeepSeek's <a href="https://api-docs.deepseek.com/updates">official Change Log</a> and their Hugging Face org. When a new generation is real, it shows up there first, usually with weights and a paper, not as a leak on social media. Everything upstream of those two sources is speculation dressed up as reporting.</p>
<h3 id="what-i-want-from-deepseek-v5">What I want from DeepSeek V5</h3>
<p>So, the honest answer to "when is V5 coming out" is: unknown, no date, probably not as soon as the hype says, and the July 24 thing is a red herring. But I'm still genuinely excited for it, so here's my wishlist.</p>
<p>Keep the Flash-tier pricing. Add a real vision API so I can finally drop Qwen 3.7 Plus from my Hermes stack. And push the agent reliability up a notch. Do those three things and V5 becomes close to the perfect agent model for how I actually work, and my default in Hermes the day it ships.</p>
<p>Until then, V4 Flash is doing the job, the date nobody can give you is still nobody's to give, and I'd gently suggest ignoring any headline that claims otherwise. I'll update this post the moment DeepSeek puts something official on the Change Log. Not before.</p>
]]></content:encoded>
      <pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-06-26T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI News</category>
      <category>DeepSeek</category>
      <category>LLM</category>
      <category>AI News</category>
      <category>Release</category>
    </item>
    <item>
      <title><![CDATA[Hermes Agent: What It Is and Why Devs Switched]]></title>
      <link>https://thomas-wiegold.com/blog/hermes-agent-what-it-is/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/hermes-agent-what-it-is/</guid>
      <description><![CDATA[Hermes Agent is the self-improving autonomous agent devs are switching to. Here's what it does, how it compares to OpenClaw, and where it falls short.]]></description>
      <content:encoded><![CDATA[<p>I ignored OpenClaw. Tried it during the hype, poked at it for an afternoon, and quietly went back to my normal setup because I couldn't find a single thing it did that Claude Desktop and Claude Code weren't already doing for me. So when people started telling me <a href="https://hermes-agent.nousresearch.com/">Hermes Agent</a> was the new thing, my first reaction was a tired sigh. Another agent. Great.</p>
<p>I was wrong to sigh. Hermes Agent is different in ways that actually matter, and after a few weeks of running it for real work, I get why the dev crowd moved over. This is the honest version: what it is, what you can actually do with it, how it stacks up against OpenClaw, and the security tradeoff nobody seems to want to talk about.</p>
<h2 id="what-exactly-is-hermes-agent">What exactly is Hermes Agent?</h2>
<p><strong>Hermes Agent is an open-source, model-agnostic autonomous agent from <a href="https://nousresearch.com">Nous Research</a> that plans, calls tools, and keeps state across sessions, while teaching itself new skills as it goes.</strong></p>
<p>That bolded sentence is the whole pitch. It's not a coding copilot bolted to your editor. It's a persistent agent that you point at a task, and it goes off and does it, remembering what happened last time.</p>
<p>Now, the naming. The naming is a mess and you need to keep three things straight or you'll confuse yourself reading the docs:</p>
<ul>
<li><strong>Hermes 4</strong> is the LLM weights, the actual model.</li>
<li><strong>Hermes Agent</strong> is the framework, the thing this article is about.</li>
<li><strong>Hermes Desktop</strong> is the GUI app that hit public preview in June 2026.</li>
</ul>
<p>The desktop release shipped no new model and no new architecture. It's just a door into the existing agent that doesn't make you live in a terminal. Useful, but don't mistake it for a reinvention.</p>
<p>What makes Hermes Agent interesting is the closed learning loop. It auto-creates skills after hard tasks, searches its own past sessions (it keeps them in SQLite with full-text search), and builds a model of you over time. Most agents forget you the second the session ends. This one tries not to. That's the part worth paying attention to.</p>
<h2 id="what-can-you-do-with-a-hermes-agent">What can you do with a Hermes agent?</h2>
<p>Here's where I'm going to disappoint the hype merchants. The genuinely good use cases are boring, and that's a feature.</p>
<p>Where Hermes shines is always-on scheduled work. Morning research digests, competitive-intelligence sweeps, watching a trend API or a search feed and pinging you when something moves. The canonical example everyone reaches for is a daily briefing dropped into Telegram or Slack at 8am, and honestly, that example is popular because it works.</p>
<p>My actual usage looks like this. I've got it collecting information on a schedule, running a paper-trading agent, and watching trend APIs and search results so I don't have to babysit a dozen browser tabs. None of that is glamorous. All of it saves me time every single day.</p>
<p>What it's bad at is worth saying plainly. Complex multi-file refactors that need real architectural judgment are not its strength, because the open models I run it on are good but not Claude-Opus good. And for tight interactive coding where I want to see and control every bit of context, the CLI or Claude Code still beats it. Hermes is for the work you'd otherwise forget to do, not the work you're actively thinking hard about.</p>
<p>This is also where I'll gently push back on the discourse. Half of what I read on X during the OpenClaw wave was people breathlessly announcing they'd "automated their business," and when you looked closer it was a script that renamed some files. If you want a realistic sense of what these tools do for an actual small operation, I wrote up <a href="/blog/ai-agents-for-small-business-2026/">where AI agents help small businesses in 2026</a> without the fairy dust. Hermes is more capable than the OpenClaw stuff was. The honest wins are still the unglamorous scheduled ones.</p>
<h2 id="hermes-agent-vs-openclaw">Hermes Agent vs OpenClaw</h2>
<p>So why did OpenClaw bounce off me and Hermes stick?</p>
<p>With OpenClaw, every task I imagined throwing at it had an answer along the lines of "yeah, Claude Desktop already does that, or Claude Code does it better." It never carved out its own reason to exist on my machine. I'm sure people built real things with it. I just wasn't one of them, and I didn't find the hype convincing enough to keep trying.</p>
<p>Hermes is different because of three things: persistent memory, a "Soul" identity layer, and automatic skill creation. The point isn't any single feature. It's that the agent compounds. Recurring work gets cheaper and faster as it accrues skills, so the thing you set up this week is better next week without you touching it. That's a fundamentally different value proposition than "wrapper around a model that runs commands."</p>
<p>I want to be fair, though, because I'm not here to sell you anything. The memory is small. We're talking roughly a 2,200-character memory file and a 1,375-character user file, with no version history by default. Early facts get overwritten as new ones come in. So the "it remembers you" story is real but bounded, and you'll feel the ceiling on long-running personal-assistant work. This is early infrastructure, not a finished memory system, and I'll come back to that.</p>
<h2 id="hermes-agent-skills-memory-and-the-self-improving-loop">Hermes agent skills, memory, and the self-improving loop</h2>
<p>This is the most technically interesting part of the system, so let's actually dig in.</p>
<h3 id="how-skills-work">How skills work</h3>
<p>Skills are just markdown files. Each one is a <code>SKILL.md</code> file living under <code>~/.hermes/skills/</code>, following the open <a href="https://agentskills.io">agentskills.io</a> standard. They load by progressive disclosure, which is a fancy way of saying the agent reads only the short description of each skill for free, and pulls the full content into context only when a task actually matches. That keeps the context lean, which matters more than people realize.</p>
<p>The clever bit is that the agent writes its own skills. After a non-trivial task (think five or more tool calls, or some non-obvious workaround it had to figure out), it can save what it just did as a reusable skill via <code>skill_manage</code>. There's also an autonomous Curator that grades, consolidates, and prunes the skill library on a cycle, so it doesn't just accumulate junk.</p>
<p>The mental model that finally made it click for me: <strong>memory is for "what" (facts), skills are for "how" (procedures).</strong> Keep those two ideas separate and the whole architecture suddenly makes sense.</p>
<h3 id="where-auto-generated-skills-fall-short">Where auto-generated skills fall short</h3>
<p>Here's my slightly contrarian take, because almost nobody is saying this. The auto-created skills are convenient, and sometimes they're genuinely good. But more than once I looked at one and thought, I could write this better myself.</p>
<p>When I hand-author a skill with proper prompting and the right context, the result is cleaner and more reliable than what the agent scribbles after a task. Claude even has a dedicated skill-creation skill that helps structure new ones, and if you care about the output, a few minutes of deliberate authoring beats auto-generation. (If you want to get the prompting right, I put my approach in <a href="/blog/prompt-engineering-best-practices-2026/">prompt engineering best practices for 2026</a>.) Treat auto-generation as a fast first draft, not the finished article.</p>
<p>Same energy on memory and Soul. They're interesting, and I'm glad they exist, but they feel like the first rung on a tall ladder. The memory is too small and not situationally aware enough yet. I'm fairly convinced the next generation of agents will have far more sophisticated, context-aware memory systems, and we'll look back on this as the charmingly primitive beginning. Which is fine. Everything starts somewhere.</p>
<h2 id="how-to-get-hermes-agent-and-run-it-cheaply">How to get Hermes agent (and run it cheaply)</h2>
<p>Getting started is straightforward, and the cost story is genuinely good if you set it up right.</p>
<p>You've got two front ends. The Desktop app (public preview since June 2026) and the CLI are the same agent core sharing the same <code>~/.hermes</code> config, so anything you set up in one shows up in the other. Desktop adds a settings UI so you're not editing YAML, plus a file browser, voice mode, and live subagent watch-windows that let you see parallel work happening. The CLI keeps finer control over context and compaction. I bounce between both. Desktop for monitoring and review, CLI when I want my hands on the wheel.</p>
<p>The part that makes this cheap is the inference. I run mine on my <a href="/blog/opencode-go-review/">OpenCode Go subscription</a>, which Hermes supports as a first-class provider. Setup is three things:</p>
<ol>
<li>Add <code>OPENCODE_GO_API_KEY=&lt;your-key&gt;</code> to <code>~/.hermes/.env</code>.</li>
<li>Set the provider to <code>opencode-go</code> (base URL <code>https://opencode.ai/zen/go/v1</code>).</li>
<li>Pick your model in Settings, or in <code>config.yaml</code>.</li>
</ol>
<p>Then route deliberately. I use <a href="/blog/deepseek-v4-review/">DeepSeek V4 Flash</a> for roughly 95% of what I throw at Hermes, because the easy, high-volume cron and subagent work doesn't need a frontier model and Flash is absurdly cost-effective. I reserve the stronger models (Qwen3.7 Max, Kimi K2.6) for the genuinely hard reasoning. The caps on OpenCode Go are dollar-based rather than request-based, so cheap models stretch almost comically far. You can run an enormous amount of agent work for not much money.</p>
<p>Two gotchas to flag before they bite you, because they bit me. Dotted model IDs sometimes get mangled into hyphens (<code>minimax-m2.7</code> turning into <code>minimax-m2-7</code>), which produces a confusing "model not supported" 401. And there are routing edge cases where Hermes picks the wrong endpoint format and you get a 401 for no obvious reason. The fix is the same in both cases: pin your provider and model explicitly, start a fresh session, and update Hermes regularly because these are being patched. Check the project's GitHub issues if a specific model misbehaves; the relevant ones were still in flux at the time I set this up.</p>
<h2 id="the-security-tradeoff-nobody-mentions">The security tradeoff nobody mentions</h2>
<p>Now the part I actually want you to remember.</p>
<p>Early on, Hermes ran into a Node.js install conflict on my Mac and just... fixed it. Diagnosed it, sorted out the mess, moved on. My first reaction was delight. My second reaction, about thirty seconds later, was a small cold feeling in my stomach.</p>
<p>Because an agent that can fix your machine can also break it. Unsandboxed, with free run of your filesystem and shell, Hermes is a real security risk. It's not malicious, but it's powerful and autonomous, and "powerful and autonomous with root-ish access to your laptop" is exactly the sentence that should make you pause. I've written before about the <a href="/blog/claude-code-dangerously-skip-permissions/">danger of skipping permissions on coding agents</a>, and the same logic applies here, except Hermes runs on a schedule when you're not watching.</p>
<p>So harden it before you expose it to anything. Switch the terminal backend to Docker so it's containerized. Use gateway allowlists. If you're running the agent on a VPS or home server and reaching it from your laptop, bind the dashboard to a Tailscale IP and put OAuth in front of it, and never, ever expose a dashboard to the open internet. <a href="https://tailscale.com">Tailscale</a> plus OAuth is the clean pattern here and it's not much work.</p>
<p>And here's the bigger-picture thought that the Node incident kicked off for me. Google, Microsoft, and Apple are all going to bake agents directly into their operating systems. When that happens, a complex, less-sandboxed, set-it-up-yourself tool like Hermes becomes obsolete for casual and non-professional users, because they'll get something safer and simpler for free, built into the thing they already use. Hermes's real audience isn't the casual user. It's devs and tinkerers who want control, can manage the risk, and have workflows worth the setup cost. That's not a knock. It's just who this is for.</p>
<h2 id="so-is-it-worth-it">So is it worth it?</h2>
<p>Hermes Agent earns the place on my machine that OpenClaw never did. The compounding skills, the persistent memory, the always-on scheduled autonomy that quietly handles the work I'd otherwise forget. It's a genuinely useful tool and I'm keeping it.</p>
<p>But it's preview-stage and it's rough in real places. The context compression can get lossy on long sessions, the memory is too small, and the provider routing has sharp edges. Treat it as powerful early infrastructure, not a polished product, and you won't be disappointed.</p>
<p>Honest bottom line: if you're a dev running cheap inference and you've got unglamorous, always-on workflows that eat your time, set it up this weekend. If you want a casual assistant that just works with zero fuss, sit tight, because the OS vendors are coming for exactly that lane, and they'll do the babysitting for you.</p>
]]></content:encoded>
      <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-06-20T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI Coding</category>
      <category>AI Agents</category>
      <category>Agentic AI</category>
      <category>Hermes</category>
      <category>Developer Tools</category>
      <category>Automation</category>
    </item>
    <item>
      <title><![CDATA[Claude Fable 5 Review: Best AI Coding Model Yet]]></title>
      <link>https://thomas-wiegold.com/blog/claude-fable-5-review/</link>
      <guid isPermaLink="true">https://thomas-wiegold.com/blog/claude-fable-5-review/</guid>
      <description><![CDATA[My hands-on Claude Fable 5 review. I ran my usual coding tests and it one-shotted a poker sim no model ever beat. Best coding model yet, with caveats.]]></description>
      <content:encoded><![CDATA[<p>I'll be honest with you. A few weeks ago, in my <a href="/blog/minimax-m3-review/">MiniMax M3 review</a>, I admitted that writing model reviews had started to bore me. They all blur together after a while. New model drops, benchmarks go up a few points, everyone gets excited for a weekend, and then nothing really changes about how I work. So I want to be clear that this Claude Fable 5 review is the exception, because for once I'm writing about a model that actually made me sit up.</p>
<p>Anthropic had been teasing this thing for months. There were announcements about a model so capable it was deemed too dangerous to release to the public, the whole Mythos saga, that kind of thing. And just the name, Mythos, sounded epic in a way that made my eyes roll a little. Expectations were sky high, which usually means disappointment is loading.</p>
<p>I'll admit I got cynical about it. My honest assumption was that this was more hype than substance, a bit of marketing theatre to keep interest up while the company circles an IPO. So when <a href="https://www.anthropic.com/news/claude-fable-5-mythos-5">Fable 5 actually shipped on June 9</a>, much sooner than I expected, I went in ready to be unimpressed.</p>
<p>I was wrong. This is the best coding model I've used, and unlike the last few releases, I can actually feel the difference.</p>
<h2 id="what-is-claude-fable-5">What Is Claude Fable 5?</h2>
<p>Quick context before I get to the testing, because the naming is genuinely confusing.</p>
<p>Claude Fable 5 is the first publicly available model from Anthropic's new Mythos tier, which sits a notch above Opus in their lineup. There are technically two models here. Fable 5 is the one you and I can use. Mythos 5 is the exact same underlying model with some safety guardrails removed, and it's locked behind Anthropic's Project Glasswing program for vetted partners. Same weights, different leash. That's the whole distinction.</p>
<p>The specs that matter to a developer: a 1 million token context window, up to 128k tokens of output, a January 2026 knowledge cutoff, and the API id <code>claude-fable-5</code>. It runs in an adaptive thinking mode, so you don't toggle reasoning on and off.</p>
<p>The reason it took this long to reach the public is the cyber angle. The earlier Mythos Preview from April was held back specifically because it was scary good at finding software vulnerabilities. Fable 5 ships with safety classifiers that catch sensitive requests and quietly route them to Opus 4.8 instead, which is what made Anthropic comfortable releasing it widely. More on those filters later, because they're not free.</p>
<h2 id="how-i-tested-it">How I Tested It</h2>
<p>If you've read my reviews before, you know I run the same handful of prompts on every model. Identical wording, every time. That's the entire point. It's the only way I can honestly compare a new model against the last one, instead of going on vibes and a warm fuzzy feeling. So Fable 5 got the same four tests as everyone else.</p>
<h3 id="two-websites-same-prompts-as-always">Two websites, same prompts as always</h3>
<p>First up, my two website builds: a Sydney coffee roaster site and a pop culture online shop. Same prompts I've used for a dozen models now.</p>
<p>The results were very good. Nice fonts, clean technical output, and some lovely animations. The pop culture store in particular had some cool little details. I'll be honest though, my coffee roaster prompt always seems to converge on a similar design no matter who builds it, so that one didn't surprise me much. And for the pop culture shop, I still slightly prefer the colours and overall style I got back in my <a href="/blog/google-antigravity-review-i-tested-gemini-3-5-flash/">Gemini 3.5 Flash review</a>. Taste is taste.</p>
<p>But here's the thing that actually impressed me, and it wasn't the output. It was the process.</p>
<p>Fable 5 wrote the initial HTML fast, like you'd expect. Then it did something no other model has done on this prompt without being told to: it fired up Playwright, took screenshots at different viewport sizes, looked at its own work, and kept fixing the code until it was clean. It tested itself. Repeatedly. Until the thing was flawless across screen sizes. I've seen models claim they've checked their work. This one actually did, and I watched it happen.</p>
<h3 id="the-poker-simulation-that-finally-worked">The poker simulation that finally worked</h3>
<p>This is the one. If you take one thing from this Claude Fable 5 review, make it this.</p>
<p>I have a prompt I've been running for ages: build a Texas Hold'em poker simulation in Go, with six AI players who each have distinct personalities, playing 1000 hands. At the end I want detailed statistics on the players and the games, plus a way to replay any individual hand with verbose stats. It sounds reasonable. It is reasonable. And not a single model has ever one-shotted it.</p>
<p>There was always something broken. Sometimes the poker rules themselves were subtly wrong. More often the players behaved like they'd never seen a deck of cards, making nonsense decisions. And the end statistics rarely added up to anything coherent. Close, occasionally. Never right.</p>
<p>Fable 5 just did it. First try. The rules work, the hand evaluation is correct, and the six personalities actually play poker like distinct humans would. The aggressive one bullies, the cautious one folds marginal hands, and it all holds together across a thousand hands. The stats make sense. The hand replay works.</p>
<p>And it was fast. MiniMax M3 burned something like 40 minutes grinding on its attempt. Fable did this in about 14. That's the gap we're talking about.</p>
<h3 id="auditing-my-own-site">Auditing my own site</h3>
<p>Last test, an audit of thomas-wiegold.com. This is a hard one to impress me with, because I've audited, fixed, and re-audited that site more times than I'd like to admit. There isn't much low hanging fruit left.</p>
<p>Fable found something genuinely new. It also surfaced a few issues I'd heard before from other tools, which is fine, but the new finding is what mattered. Everything it flagged made sense, nothing was hallucinated filler, and the fixes it then implemented were clean and quick. Probably the best site audit I've ever run, and I say that as someone who's run a lot of them.</p>
<p>The short version of all this: with Opus 4.8 I genuinely couldn't tell you whether it was better than 4.7 or 4.6. The gains were too small to feel. With Fable, I can feel it. That's new.</p>
<h2 id="how-fable-5-stacks-up-on-benchmarks">How Fable 5 Stacks Up on Benchmarks</h2>
<p>I usually don't put much stock in benchmark tables, and you shouldn't either, but the numbers here line up with what I felt so they're worth a look.</p>
<p>Fable 5 tops basically everything. It's number one on the Artificial Analysis Intelligence Index, and it posts 80.3% on SWE-Bench Pro. For comparison, Opus 4.8 sits at 69.2%, GPT-5.5 at 58.6%, and Gemini 3.1 Pro at 54.2% on the same test. On the harder FrontierCode Diamond benchmark the gap is brutal: 29.3% for Fable versus 13.4% for Opus 4.8. That's more than double.</p>
<p>Worth noting that the headline comparison table is Anthropic's own, so take it with the usual pinch of salt. But the third party results back it up. It came out on top on Vals.ai and on Cursor's internal benchmark, and the independent reviewers who tested it agree. Simon Willison, who doesn't do hype, <a href="https://simonwillison.net/2026/Jun/9/claude-fable-5/">called it "a beast"</a> and noted it has a "big model smell," meaning it just knows more than Opus 4.8. Ethan Mollick said it outperformed every other public model by a considerable margin. Dan Shipper scored it 91 out of 100 on his team's senior engineer benchmark, against 63 for Opus 4.8, and called it a "warp drive."</p>
<p>That warp drive framing is the right one. Anthropic's own line is that the longer and more complex the task, the bigger Fable's lead gets, and that matches my experience exactly. The poker sim is precisely the kind of long, fiddly, multi-step job where it pulls away from the pack. For a quick one-line fix you won't notice the difference. For a real build, you will.</p>
<h2 id="the-catch-price-limits-and-filters">The Catch: Price, Limits, and Filters</h2>
<p>Right, so it's not all sunshine. This is the part where I temper the excitement, because there's a lot to temper.</p>
<p>First, <a href="https://claude.com/pricing#api">the price</a>. Fable 5 costs $10 per million input tokens and $50 per million output, which is exactly double Opus 4.8. On claude.ai it eats your subscription usage twice as fast, too. Now, to be fair, it's not a token waster in the way some recent models are. It doesn't ramble or pad. But it still burns through your limits quickly because the per-token cost is just higher.</p>
<p>Then there's the part that actually worries me. Right now Fable 5 is included in the Pro, Max, and Team plans, but only until June 22. From June 23 it gets pulled from subscriptions and you'll need usage credits to keep using it. Anthropic says they "aim to restore" standard access once they have enough capacity, which is the kind of phrasing that doesn't fill me with confidence. If it leaves subscriptions for good, paying API rates for daily use would be too expensive to justify. I really hope it stays. I'll be using it as much as I can in the meantime, partly out of genuine excitement and partly to get my money's worth before the door maybe closes.</p>
<p>Next, the safety filters. Those classifiers I mentioned earlier route cyber, bio, chemistry, and a few other categories to Opus 4.8 instead of Fable. The problem is false positives, and they're real. Scientists have been vocal about it. One medical physicist said he basically can't use the thing because he says the word "nuclear" all day. There are reports of MRI image segmentation getting flagged as bioterrorism. If your work lives anywhere near security or the life sciences, this is a live issue, not a hypothetical one. For my work it hasn't come up, but your mileage will vary.</p>
<p>And then there's the genuinely weird one. Buried in the <a href="https://www.anthropic.com/claude/fable">system card</a> is a fourth, invisible safeguard. For requests related to frontier AI development, things like building pretraining pipelines or designing ML accelerators, Fable will quietly degrade its own answers. No fallback, no notification, nothing. It just gets dumber and doesn't tell you. Critics have called a model that silently makes itself worse "categorically misaligned," and I get the argument. It probably won't touch what you and I do day to day, but a model that decides on its own to be less helpful without saying so is a bad precedent, and worth knowing about.</p>
<p>I'll also just name the elephant. All of this is landing while Anthropic preps an <a href="https://www.cnbc.com/2026/06/09/anthropic-mythos-claude-fable-5.html">IPO at a roughly $965 billion valuation</a>. The push toward usage based billing and the subscription removal have a certain timing to them. I'm not saying it's a conspiracy. I am saying the incentives are worth keeping in mind when you read the marketing.</p>
<h2 id="who-should-actually-use-it">Who Should Actually Use It</h2>
<p>Cut through all of that and here's my read.</p>
<p>Use Fable 5 if you're doing hard, long-horizon, well-specified work you can hand off and walk away from. Big migrations, multi-day agent runs, deep research, the kind of build my poker sim represents. For that work the doubled token price is nothing compared to the senior dev hours it saves. My practical advice: don't make it your default. Route your routine stuff to Opus 4.8 or something cheaper, and save Fable for the top 20% of genuinely hard tasks. There's also a 90% discount on cached input, so lean on that for stable prompts.</p>
<p>Wait or skip it if you're a scientist or security researcher dealing with constant false positives, if you're on a zero-data-retention contract (Fable forces a mandatory 30-day retention, which is a dealbreaker for some shops), or if you're a high-volume cost-sensitive user where Opus at half the price gets you most of the way there.</p>
<h2 id="the-verdict">The Verdict</h2>
<p>Best coding model I've used. Full stop. And I don't say that lightly, given how jaded I'd gotten about new releases.</p>
<p>What sets it apart isn't just that the output is better, although it is. It's how it works. The Playwright self-testing, the way it one-shotted a poker prompt that has defeated every model before it, the thoroughness of the site audit. It behaves less like a code generator and more like a careful engineer who actually checks their work before saying they're done.</p>
<p>It's not AGI. Let's be clear about that so nobody quotes me out of context. It still makes mistakes, it's expensive, and the filters are clumsy. But the hype, for once, was real. This is the first release in a while where the jump over the previous flagship is obvious rather than something I have to squint to find.</p>
<p>So I'm excited, caveats and all. I'll be living in it for the next week. And now the ball is firmly in OpenAI's court. Your move.</p>
]]></content:encoded>
      <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
      <atom:updated>2026-06-10T00:00:00.000Z</atom:updated>
      <author>contact@thomas-wiegold.com (Thomas Wiegold)</author>
      <category>AI News</category>
      <category>Anthropic</category>
      <category>Claude</category>
      <category>LLM</category>
      <category>AI Coding</category>
      <category>Mythos</category>
      <category>Fable 5</category>
      <category>Review</category>
    </item>
  </channel>
</rss>