<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Codeai on Programmer.ie: Modern AI programming</title>
    <link>http://programmer.ie/tags/codeai/</link>
    <description>Recent content in Codeai on Programmer.ie: Modern AI programming</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 14 Sep 2026 05:00:29 +0100</lastBuildDate>
    <atom:link href="http://programmer.ie/tags/codeai/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>The Smallest Useful Model Call</title>
      <link>http://programmer.ie/books/applied-ai/11-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:11 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/11-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 2 — Get the Model Out of the Chat Box&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-smallest-working-call&#34;&gt;The smallest working call&lt;/h2&gt;&#xA;&lt;p&gt;CodeAI&amp;rsquo;s OpenCode cognition adapter, invoked directly without the recorded-call runtime, does the minimum well. One &lt;code&gt;CallSpec&lt;/code&gt; becomes one user message, the message goes out as an ordinary HTTP request, and a &lt;code&gt;CallResult&lt;/code&gt; comes back:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;adapter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; OpenCodeCognitionAdapter(model&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;mimo-v2.5&amp;#34;&lt;/span&gt;, protocol&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chat_completions&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; adapter&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;invoke(spec)  &lt;span style=&#34;color:#75715e&#34;&gt;# one CallSpec in, one CallResult back&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; result&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;status &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;succeeded&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;RuntimeError&lt;/span&gt;(result&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;error)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;review &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; result&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;raw_output&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It keeps failure in its own channel instead of passing a diagnostic off as a review. It returns the usage with its source label alongside the convenient string. Those two habits already put it ahead of a great deal of production code.&lt;/p&gt;</description>
    </item>
    <item>
      <title>One Operation, Several Model APIs</title>
      <link>http://programmer.ie/books/applied-ai/12-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:12 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/12-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 2 — Get the Model Out of the Chat Box&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;right-model-wrong-dialect&#34;&gt;Right model, wrong dialect&lt;/h2&gt;&#xA;&lt;p&gt;Chapter 11&amp;rsquo;s second live run failed with an HTTP 500. The gateway, the model, and the credential were all right. The request was shaped for OpenCode&amp;rsquo;s Responses endpoint, and &lt;code&gt;mimo-v2.5&lt;/code&gt; is served on Chat Completions.&lt;/p&gt;&#xA;&lt;p&gt;That looks like a configuration slip. It is a property of the ground you are building on.&lt;/p&gt;&#xA;&lt;p&gt;OpenCode Go&amp;rsquo;s catalog, updated on 11 September 2026, lists every model on exactly one of three endpoints (&lt;a href=&#34;https://opencode.ai/docs/go/&#34;&gt;OpenCode&lt;/a&gt;). Three of them carry this chapter:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Normalize at the Boundary</title>
      <link>http://programmer.ie/books/applied-ai/13-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:13 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/13-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 2 — Get the Model Out of the Chat Box&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;three-numbers-that-will-not-add&#34;&gt;Three numbers that will not add&lt;/h2&gt;&#xA;&lt;p&gt;Three calls in Chapter 12 performed the same small task, through the same gateway, and all three succeeded. One route reported 38 input tokens. Another reported 279. The third reported 73.&lt;/p&gt;&#xA;&lt;p&gt;Put those in a spreadsheet and the next move writes itself: sum them, average them, divide the invoice by them, route to whichever chamber is &amp;ldquo;cheapest per token&amp;rdquo;. Every one of those moves assumes the three numbers measure the same thing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Model Is Not the Process</title>
      <link>http://programmer.ie/books/applied-ai/14-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:14 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/14-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 2 — Get the Model Out of the Chat Box&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;nothing-went-wrong&#34;&gt;Nothing went wrong&lt;/h2&gt;&#xA;&lt;p&gt;The task was small — repair one paragraph:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The new cache makes every page load 73% faster, according to the platform team [S1].&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;It stores rendered fragments close to readers.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It had three written criteria: the paragraph must contain no percentage figure, the source marker &lt;code&gt;[S1]&lt;/code&gt; must appear exactly once, and the second sentence must survive word for word.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Context Is an Input, Not a Transcript</title>
      <link>http://programmer.ie/books/applied-ai/15-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:15 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/15-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 3 — Give Intelligence a Runtime&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-question-the-acceptance-could-not-answer&#34;&gt;The question the acceptance could not answer&lt;/h2&gt;&#xA;&lt;p&gt;Chapter 14 ended with a task that was provably complete. The acceptance cited the task&amp;rsquo;s criteria, the call, its final attempt, the interpretation, the exact artifact bytes and the checks run on them.&lt;/p&gt;&#xA;&lt;p&gt;It did not cite what the model was shown.&lt;/p&gt;&#xA;&lt;p&gt;Ask most systems that question and you get one of two answers. The first is &amp;ldquo;the conversation so far&amp;rdquo;: everything that happened, in the order it happened. The second is &amp;ldquo;whatever was in the prompt&amp;rdquo;: a string someone assembled and nobody recorded. Neither answer can be checked afterwards, and neither was decided on purpose.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Externalize Working Memory</title>
      <link>http://programmer.ie/books/applied-ai/16-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:16 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/16-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 3 — Give Intelligence a Runtime&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-step-that-didnt-finish&#34;&gt;The step that didn&amp;rsquo;t finish&lt;/h2&gt;&#xA;&lt;p&gt;A process was reviewing a paragraph. It had compiled its context, recorded the call&amp;rsquo;s manifest, and sent the request. While the provider was still working on it, the process died.&lt;/p&gt;&#xA;&lt;p&gt;The standard recovery is familiar: restart, find the step that didn&amp;rsquo;t finish, and run it again. Someone did exactly that in this chapter&amp;rsquo;s experiment, on a copy of the dead process&amp;rsquo;s files, and the step re-ran to completion.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Raw Output First</title>
      <link>http://programmer.ie/books/applied-ai/17-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:17 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/17-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 3 — Give Intelligence a Runtime&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-success-that-was-cut-off&#34;&gt;The success that was cut off&lt;/h2&gt;&#xA;&lt;p&gt;Chapter 11&amp;rsquo;s fourth live run was recorded as a success. The provider had answered with HTTP 200 and text, and CodeAI&amp;rsquo;s interpreter at the time treated any answer with text as complete. Opening the preserved response told a different story: &lt;code&gt;&amp;quot;finish_reason&amp;quot;: &amp;quot;length&amp;quot;&lt;/code&gt;. The model had used every output token it was allowed, and the review stopped mid-sentence.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Claims, Evidence, and Decisions</title>
      <link>http://programmer.ie/books/applied-ai/18-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:18 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/18-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 3 — Give Intelligence a Runtime&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;three-sentences-and-a-merge&#34;&gt;Three sentences and a merge&lt;/h2&gt;&#xA;&lt;p&gt;A review of a cache change says three things:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;The cache TTL is set to 60 seconds in config/cache.toml. The retry test passes.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;p99 latency stays under 200 ms.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Someone reads it and merges the change. The next day, the deployed configuration turns out to say 600 seconds.&lt;/p&gt;&#xA;&lt;p&gt;The obvious question is whether the review was wrong. The more useful question is narrower: &lt;strong&gt;which part of the decision rested on which sentence, and what had anyone actually checked?&lt;/strong&gt; One sentence could be confirmed against a file. One could be tested. One had no evidence at all. The merge used two of them and knowingly left the third open, or it didn&amp;rsquo;t. The merge record lists no basis, so the basis cannot be reconstructed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Let the Machine Touch Something</title>
      <link>http://programmer.ie/books/applied-ai/19-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:19 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/19-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 3 — Give Intelligence a Runtime&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-edit-that-has-not-happened&#34;&gt;The edit that has not happened&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Constructed scene.&lt;/strong&gt; A reviewer proposes changing a cache setting. The patch is in an artifact. A person decides to apply it. The file still contains the old value.&lt;/p&gt;&#xA;&lt;p&gt;Then a worker returns “done” and nobody opens the file.&lt;/p&gt;&#xA;&lt;p&gt;The decision might have been well supported, the instruction exact, and the worker&amp;rsquo;s return normal — none of those tells the person reading the record whether the file changed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Capability Is Not Authority</title>
      <link>http://programmer.ie/books/applied-ai/20-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:20 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/20-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 4 — Make It Safe and Verifiable&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;a-sensible-correction-refused&#34;&gt;A sensible correction, refused&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Constructed scene.&lt;/strong&gt; A reviewer finds an incorrect cache setting and proposes the right replacement. Its worker can edit files. The person who opened the review asked for inspection only.&lt;/p&gt;&#xA;&lt;p&gt;The correction&amp;rsquo;s quality is beside the point. An accurate proposal grants no permission to apply it. The presence of an editing tool grants none either.&lt;/p&gt;&#xA;&lt;p&gt;Chapter 19 separated the actor&amp;rsquo;s report from evidence about the effect. Now move back to the moment before that effect: the process is about to call a worker that can change something. Which part of the system decides whether it may?&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Agent Cannot Grade Its Own Homework</title>
      <link>http://programmer.ie/books/applied-ai/21-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:21 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/21-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 4 — Make It Safe and Verifiable&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-patch-that-passed&#34;&gt;The patch that passed&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Constructed scene.&lt;/strong&gt; A patch arrives with a note: “all tests pass.” The note is confident and unchanged while you read it. Then you run one small check against the actual file, and it fails.&lt;/p&gt;&#xA;&lt;p&gt;Keep both in front of you. The sentence says success. The command says failure. One of them examined the artifact; the other one is a report about it. The reader who can point to which is which already understands this chapter.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Retries Are Side Effects Too</title>
      <link>http://programmer.ie/books/applied-ai/22-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:22 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/22-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 4 — Make It Safe and Verifiable&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-line-that-may-already-be-there&#34;&gt;The line that may already be there&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Constructed scene.&lt;/strong&gt; An adapter appends one line to a file. The process dies before the completion is recorded. On restart the ledger shows no completed result — but the file has changed.&lt;/p&gt;&#xA;&lt;p&gt;Three responses are available, and two of them lie. Appending again may write the line twice. Writing a success record by hand manufactures evidence for an effect nobody observed. Saying “unknown” is the only honest answer, and it is also the least actionable one. The question that matters is narrower than “what do we do?” It is: &lt;strong&gt;what evidence would justify another append?&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Independent Calls</title>
      <link>http://programmer.ie/books/applied-ai/23-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:23 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/23-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 5 — More Intelligence Is Not Automatically Better&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;three-reviewers-one-paragraph&#34;&gt;Three reviewers, one paragraph&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Constructed scene.&lt;/strong&gt; Three reviewers receive the same versioned paragraph and the same source pack. Each writes a proposal. Every proposal is collected before any is revealed.&lt;/p&gt;&#xA;&lt;p&gt;Contrast that with a second procedure: show the second reviewer the first answer and ask for agreement. The second process costs less and runs faster. It also sounds more confident, while answering a different experimental question. Agreement after exposure cannot distinguish shared insight from shared influence — which is why the blind collection exists first, and why the next four chapters need it before they ask whether extra candidates help.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Models Were Different. Their Mistakes Weren&#39;t</title>
      <link>http://programmer.ie/books/applied-ai/24-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:24 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/24-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 5 — More Intelligence Is Not Automatically Better&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;seven-repairs-one-unresolved-bug&#34;&gt;Seven repairs, one unresolved bug&lt;/h2&gt;&#xA;&lt;p&gt;Open on the stubborn task, before any percentage. The problem statement asks for a function that returns the mean of the list it is given, on every call. The starter code caches its first answer and never lets go:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;average&lt;/span&gt;(xs):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; hasattr(average, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;_n&amp;#39;&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        average&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; len(xs)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        average&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_s &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sum(xs)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; average&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_s &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; average&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_n&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The reference repair is one line: &lt;code&gt;return sum(xs) / len(xs)&lt;/code&gt;. Delete the state.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Make the Problems Harder</title>
      <link>http://programmer.ie/books/applied-ai/25-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:25 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/25-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 5 — More Intelligence Is Not Automatically Better&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;three-tasks-the-baseline-never-solved&#34;&gt;Three tasks the baseline never solved&lt;/h2&gt;&#xA;&lt;p&gt;Chapter 24 ended under a ceiling: eleven of twelve tasks solved by a single draw, one shared failure, nowhere for a portfolio to go. The response was a harder corpus: forty repair tasks in four strata of ten, each stated as misbehavior plus a contract rather than a fault label, with hidden tests defining correctness. On that ground the arms finally differ. Lead with the paired difference, not the percentages: &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Diversity Without More Models</title>
      <link>http://programmer.ie/books/applied-ai/26-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:26 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/26-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 5 — More Intelligence Is Not Automatically Better&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-subgroup-that-almost-rewrites-the-chapter&#34;&gt;The subgroup that almost rewrites the chapter&lt;/h2&gt;&#xA;&lt;p&gt;Start with the temptation, because the discipline only means something if the temptation is real. Inside a failed experiment sits this: one wording — counterfactual — with three draws per task covered 9 of 12 tasks. The normal wording, given three draws per task in the same portfolio, covered 7. Read quickly, that is a better prompt.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Replicate Before You Believe</title>
      <link>http://programmer.ie/books/applied-ai/27-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:27 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/27-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 5 — More Intelligence Is Not Automatically Better&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-challenger-gets-its-matched-fight&#34;&gt;The challenger gets its matched fight&lt;/h2&gt;&#xA;&lt;p&gt;Chapter 26 ended with a subgroup that looked like a better prompt and a refusal to promote it. This chapter runs the test that refusal called for, and states the answer before interpreting it: at twelve draws per task on both sides, counterfactual wording covered 9 of 12 tasks, matching normal wording, passed 44 of 144 candidates, also matching, while using 46% more tokens. Normal stays the default.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What Should Happen Next?</title>
      <link>http://programmer.ie/books/applied-ai/28-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:28 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/28-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 6 — Put Intelligence Into the Process&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;a-claim-awaiting-a-check&#34;&gt;A claim awaiting a check&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Constructed scene.&lt;/strong&gt; A patch sits open with one review comment unresolved: a retry test that may or may not cover the new branch. Three things could happen next. A model could propose a fix. A deterministic check could run the test suite. A person could be asked whether the branch matters at all. Each costs something different, fails differently, and answers a different question. &amp;ldquo;Try a stronger model&amp;rdquo; is not on that list until something has established that generation is the missing operation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Applied AI</title>
      <link>http://programmer.ie/books/applied-ai/29-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:29 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/29-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 6 — Put Intelligence Into the Process&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;one-paragraph-one-process&#34;&gt;One paragraph, one process&lt;/h2&gt;&#xA;&lt;p&gt;A disposable file holds one line:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;draft: models are stochastic, so review is hard [S1].&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The frozen criteria for the task are narrow on purpose: the &lt;code&gt;[S1]&lt;/code&gt; marker must be gone, and the sentence &lt;code&gt;Models supply cognition.&lt;/code&gt; must be present. The &amp;ldquo;reviewer&amp;rdquo; is a fake model adapter that returns one canned revision. That is deliberate. This chapter is not testing whether a model can review a paragraph. Chapters 23 through 28 spent their evidence on what models and model policies do. This one tests whether everything &lt;em&gt;around&lt;/em&gt; the model holds together when the pieces are joined.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
