<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Applied AI on Programmer.ie: Modern AI programming</title>
    <link>http://programmer.ie/books/applied-ai/</link>
    <description>Recent content in Applied AI on Programmer.ie: Modern AI programming</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 14 Sep 2026 05:00:30 +0100</lastBuildDate>
    <atom:link href="http://programmer.ie/books/applied-ai/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Beyond the Chat Box</title>
      <link>http://programmer.ie/books/applied-ai/01-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:01 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/01-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 1 — Where You Stand&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-missing-operation&#34;&gt;The missing operation&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/ernanhughes/codeai&#34;&gt;CodeAI&lt;/a&gt; has a call whose shape is almost disappointingly ordinary:&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;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)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It sends one prepared request through the OpenCode gateway and returns a &lt;code&gt;CallResult&lt;/code&gt;. It does not open a conversation window. It does not know which chapter you are writing. It does not decide whether the returned paragraph belongs in the manuscript.&lt;/p&gt;&#xA;&lt;p&gt;That small separation is where this book begins.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Never Stand in Front of the Steamroller</title>
      <link>http://programmer.ie/books/applied-ai/02-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:02 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/02-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 1 — Where You Stand&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;a-dated-position&#34;&gt;A dated position&lt;/h2&gt;&#xA;&lt;p&gt;This book will be wrong about things.&lt;/p&gt;&#xA;&lt;p&gt;Not as a disclaimer. As a statement about what kind of document this is. Everything here is a view from one position on a hill that is still being climbed. From where we are standing in late 2026, certain shapes are visible and certain ones are not, and some of what currently looks like a permanent feature of the landscape will turn out to have been a cloud.&lt;/p&gt;</description>
    </item>
    <item>
      <title>If There&#39;s Any Doubt, It&#39;s Deterministic</title>
      <link>http://programmer.ie/books/applied-ai/03-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:03 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/03-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 1 — Where You Stand&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;seven-operations-one-of-them-intelligent&#34;&gt;Seven operations, one of them intelligent&lt;/h2&gt;&#xA;&lt;p&gt;Take the paragraph review from Chapter 1 and write down everything the process actually has to do. Not the prompt — the process.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Select the paragraph to review.&lt;/li&gt;&#xA;&lt;li&gt;Decide whether it has changed since the last review.&lt;/li&gt;&#xA;&lt;li&gt;Decide whether there is budget left for a call.&lt;/li&gt;&#xA;&lt;li&gt;Identify claims in the paragraph that need supporting evidence.&lt;/li&gt;&#xA;&lt;li&gt;Extract the flagged sentence and its position.&lt;/li&gt;&#xA;&lt;li&gt;Check that a cited source resolves and that its year matches the bibliography.&lt;/li&gt;&#xA;&lt;li&gt;Decide whether to write the change to the file.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Six of those have exactly one correct answer, computable without a model. Selection is an index lookup and change detection is a hash comparison. Budget is arithmetic; extraction is parsing. Source checking resolves the request and compares it against the bibliography. The write decision evaluates policy.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scrum Built the Training Set</title>
      <link>http://programmer.ie/books/applied-ai/04-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:04 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/04-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 1 — Where You Stand&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;an-uncomfortable-piece-of-bookkeeping&#34;&gt;An uncomfortable piece of bookkeeping&lt;/h2&gt;&#xA;&lt;p&gt;Software engineering was the first knowledge profession to be substantially automated by language models. The usual explanation is that code is logical and therefore tractable for a machine.&lt;/p&gt;&#xA;&lt;p&gt;That explanation is wrong, and believing it will cost you, because it points at the wrong property when you go looking for the next domain.&lt;/p&gt;&#xA;&lt;p&gt;Here is what actually happened. For roughly two decades the industry adopted a family of methodologies — Agile, Scrum, Kanban, whatever your organization called its version — that mandated a particular discipline of record-keeping. Work had to be:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Meat Proxy</title>
      <link>http://programmer.ie/books/applied-ai/05-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:05 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/05-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 1 — Where You Stand&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;ten-weeks&#34;&gt;Ten weeks&lt;/h2&gt;&#xA;&lt;p&gt;Week one, the model drafts a paragraph review and you read every line of it. You disagree with two of its four flags, check a source yourself, rewrite one sentence. The whole thing takes twenty minutes and you feel you have earned the output.&lt;/p&gt;&#xA;&lt;p&gt;Week three, the reviews have been good. You read them properly but you stop re-checking the sources it says it checked. Nothing bad happens.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Price of Intelligence</title>
      <link>http://programmer.ie/books/applied-ai/06-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:06 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/06-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 1 — Where You Stand&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-invoice-nobody-runs-at-prototype-time&#34;&gt;The invoice nobody runs at prototype time&lt;/h2&gt;&#xA;&lt;p&gt;The paragraph review from Chapter 1 costs about 1,200 tokens in and 400 out. At prototype scale that is a rounding error, and it is why nobody computes the next four numbers.&lt;/p&gt;&#xA;&lt;p&gt;A manuscript has 3,000 paragraphs. That is one full pass.&lt;/p&gt;&#xA;&lt;p&gt;The review is not run once. Every edit invalidates the review of the paragraph it touched, and a careful author edits most paragraphs four or five times.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Intelligence in the Wrong Direction</title>
      <link>http://programmer.ie/books/applied-ai/07-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:07 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/07-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 1 — Where You Stand&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-thing-the-marketing-does-not-cover&#34;&gt;The thing the marketing does not cover&lt;/h2&gt;&#xA;&lt;p&gt;Every vendor will sell you more capability. None of them can sell you direction.&lt;/p&gt;&#xA;&lt;p&gt;A more capable model pointed at the wrong objective does not produce less wrong work. It produces &lt;em&gt;better-executed&lt;/em&gt; wrong work at greater volume, wrapped in more convincing prose. The gap between what you wanted and what you got does not shrink with capability. Frequently it widens, because a weaker model&amp;rsquo;s output was obviously off and a stronger model&amp;rsquo;s output is plausibly off.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Where Are the Finished Projects?</title>
      <link>http://programmer.ie/books/applied-ai/08-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:08 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/08-chapter/</guid>
      <description>&lt;p&gt;&lt;em&gt;Part 1 — Where You Stand&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-tireless-coworker&#34;&gt;The tireless coworker&lt;/h2&gt;&#xA;&lt;p&gt;Imagine you are given a colleague with the properties the industry has been describing for three years.&lt;/p&gt;&#xA;&lt;p&gt;They never tire. They work through the night and the weekend. They have read essentially everything and can recall it instantly. They write code faster than you can read it, and they will take on the tedious parts you have been avoiding since March.&lt;/p&gt;</description>
    </item>
    <item>
      <title>One Runtime, Many Windows</title>
      <link>http://programmer.ie/books/applied-ai/09-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:09 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/09-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;tuesday-three-times&#34;&gt;Tuesday, three times&lt;/h2&gt;&#xA;&lt;p&gt;Monday evening, on your laptop, you work through a design problem with a model. Forty minutes of back-and-forth. You settle three decisions and rule out two approaches for reasons that took a while to articulate.&lt;/p&gt;&#xA;&lt;p&gt;Tuesday morning, on the train, you open the same app on your phone. It is a new conversation. You paste in what you can remember.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Revolver, Not a Foundation</title>
      <link>http://programmer.ie/books/applied-ai/10-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:10 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/10-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-book-you-could-write-better-next-year&#34;&gt;The book you could write better next year&lt;/h2&gt;&#xA;&lt;p&gt;Write a book with AI this year and you will be able to write the same book better next year. And better again the year after. The same is true of the code, the research synthesis, the review process, the classifier — anything where a model does part of the work.&lt;/p&gt;</description>
    </item>
    <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>
    <item>
      <title>Your Applied AI</title>
      <link>http://programmer.ie/books/applied-ai/30-chapter/</link>
      <pubDate>Mon, 14 Sep 2026 05:00:30 +0100</pubDate>
      <guid>http://programmer.ie/books/applied-ai/30-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;you-will-still-open-the-chat-window-tomorrow&#34;&gt;You will still open the chat window tomorrow&lt;/h2&gt;&#xA;&lt;p&gt;You have read a book about getting AI out of the chat box. Tomorrow morning you will type something into one.&lt;/p&gt;&#xA;&lt;p&gt;That is not a contradiction, and it is worth saying why before anything else. Conversation is the most direct way a person has to say what they want. Typing or talking to a model will stay part of how you work for as long as intent has to come from somewhere, and intent comes from you.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
