<?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>Jakub Kornafel — Log (EN)</title>
    <link>https://jakubkornafel.com/log/</link>
    <atom:link href="https://jakubkornafel.com/log/feed.xml" rel="self" type="application/rss+xml"/>
    <description>What I am building, what broke, and what the evidence actually supports.</description>
    <language>en</language>
    <lastBuildDate>Thu, 27 Aug 2026 00:00:00 +0000</lastBuildDate>
    <item>
      <title>A gate without a spend ceiling is not a gate</title>
      <link>https://jakubkornafel.com/log/gate-without-a-spend-ceiling/</link>
      <guid isPermaLink="true">https://jakubkornafel.com/log/gate-without-a-spend-ceiling/</guid>
      <pubDate>Thu, 27 Aug 2026 00:00:00 +0000</pubDate>
      <category>Build</category>
      <description>My pipeline could tell you whether the work was good. It could not tell you that the answer had cost four hours and eight failed attempts to reach.</description>
      <content:encoded><![CDATA[<p>My pipeline had gates I was proud of. Criteria, thresholds, a reviewer that was not the author, a verdict that could say no.</p>

<p>Then I asked it a question it could not answer: <em>what did this cost?</em></p>

<p>It knew the artifact was good enough. It had no idea whether reaching that verdict took forty minutes or four hours, twelve dollars or two hundred. It could not tell a clean first-pass approval from a run that limped over the line on its tenth attempt at the same unresolved issue.</p>

<p>Those two runs are not the same result. Only one of them is a working system.</p>

<h3>The cap that bounds the wrong thing</h3>

<p>I had iteration caps — ten loops per phase, maximum. That felt like control. It is not. An iteration cap bounds how many times a loop runs, not what each turn costs, and in my pipeline one review round fans out to eight verifiers running in parallel. That single step can cost more than every phase before it combined, and no cap anywhere notices.</p>

<p>So I shipped a ledger. A budget declared before work starts. Checked when crossing between phases and on every loop back, never mid-work. Cross an edge already over the ceiling and the run stops with an explicit verdict instead of quietly finishing and presenting you with a bill.</p>

<p>The part I underestimated is the route analysis. It measures the spend that did not move the run forward — everything consumed by attempts that ended in a loop back — and flags reasons that repeat. That last number is the uncomfortable one. A run that reached a pass on the tenth identical retry is a failing run wearing a passing badge, and nothing in my old reports would have shown it.</p>

<h3>Why this is worth more than it looks</h3>

<p>There is a study from March that made me rethink how I add anything to an agent at all.</p>

<p>Researchers gave a coding agent one extra thing: a map of which tests cover which code, handed over as a plain text file the agent could read. Regressions — tests that used to pass and stopped — fell from 6.08% to 1.82%. A 70% drop from one file.</p>

<p>The same study ran a second branch. Instead of the map, they gave the agent procedural instructions: work test-first, follow this discipline. Regressions rose to 9.94%. Worse than doing nothing at all.</p>

<div class="pull">
  <span>The rule I am keeping</span>
  <p>Give an agent context, not procedure. Telling it how to behave made things measurably worse. Telling it what is true made things 70% better. Every instruction I am tempted to write now gets that test first.</p>
</div>

<p>Which is also why the budget lives in the state file rather than in a prompt asking the agent to be careful with money. An agent cannot be careful with a number it cannot see.</p>

<div class="cta">
  <p><b>If you are running agents and cannot say what last week cost you</b>, you are not running an autonomous system — you are running up a bill. I build the part that can say no. <a href="mailto:jakubkornafel@gmail.com">Send me the system and the deadline.</a></p>
</div>]]></content:encoded>
    </item>
    <item>
      <title>The number everyone quotes is measuring the wrong thing</title>
      <link>https://jakubkornafel.com/log/the-measurement-nobody-publishes/</link>
      <guid isPermaLink="true">https://jakubkornafel.com/log/the-measurement-nobody-publishes/</guid>
      <pubDate>Thu, 27 Aug 2026 00:00:00 +0000</pubDate>
      <category>Note</category>
      <description>Swap the harness and the benchmark moves three points. Swap the model and it moves twenty-five. So the harness barely matters — unless you look at what the benchmark never measures.</description>
      <content:encoded><![CDATA[<p>Someone asked me a fair question this week: by how much does a well-built harness actually improve a coding agent? Give me a number.</p>

<p>So I went and got the numbers.</p>

<p>On the public leaderboards you can occasionally find the same model running under two different harnesses. The gap is three to eight percentage points. Meanwhile, keep the harness fixed and swap the model underneath, and the score moves twenty-five.</p>

<p>Read only that, and the conclusion writes itself: the harness barely matters, buy a better model, go home.</p>

<h3>Except that is not what any of us are actually worried about</h3>

<p>Those benchmarks measure one task, in one container, that either passes or fails. Nobody in production is losing sleep over one task in one container.</p>

<p>What people lose sleep over is a system that falls over every few days. A result that cannot be reproduced next Tuesday. A verdict nobody can audit after the fact. A run that reports success while quietly having invented the file it claims to have edited.</p>

<p>For that — for stability, reproducibility, auditability — there is no public benchmark at all. The closest attempt I could find is three weeks old, and its own preregistered audit came back inconclusive.</p>

<p>Where the numbers do exist, they are not small. One study cut regressions by 70% by handing the agent a single context file. Another measured a 9.5% drop in failed tasks from adding a critic that checks the plan before execution. Both of those are harness changes. Neither shows up on a leaderboard.</p>

<div class="pull">
  <span>The honest position</span>
  <p>The number you want does not exist yet. The numbers that do exist are measuring something else, and the gap between them is exactly where production systems live.</p>
</div>

<p>Which means for now the burden is on you. Measure the thing you actually care about — crash frequency, rework rate, how often a verdict survives review — because nobody is going to publish it for you.</p>

<div class="cta">
  <p><b>If you have that measurement and it looks bad</b>, I would genuinely like to see it. That is the problem I work on. <a href="mailto:jakubkornafel@gmail.com">jakubkornafel@gmail.com</a></p>
</div>]]></content:encoded>
    </item>
    <item>
      <title>My own site lied to me for three weeks</title>
      <link>https://jakubkornafel.com/log/three-failed-deploys/</link>
      <guid isPermaLink="true">https://jakubkornafel.com/log/three-failed-deploys/</guid>
      <pubDate>Thu, 27 Aug 2026 00:00:00 +0000</pubDate>
      <category>Note</category>
      <description>Three deploys failed. The site kept answering with 200. I only found out because I went looking for something else entirely.</description>
      <content:encoded><![CDATA[<p>I spend my working life building systems that can tell a human when something has gone wrong.</p>

<p>My own site spent three weeks serving a version two commits behind, and I had no idea.</p>

<p>Here is what happened. On 6 August I pushed two changes to a subpage. Three deploys ran. All three failed. Each one recorded a build duration of zero milliseconds and the message "Page build failed." — no detail, no notification, nothing in my inbox.</p>

<p>Zero milliseconds means the build never even started, so it was not my code. Something upstream fell over.</p>

<p>And the site? The site was fine. HTTP 200, valid certificate, everything loading. Because the last successful build was still being served, exactly as it had been the day before. The failure had no visible surface at all. From the outside, from my own browser, from anyone else's — a healthy website.</p>

<p>I only found it because I was poking at something unrelated and checked the deploy status out of curiosity.</p>

<h3>The uncomfortable parallel</h3>

<p>This is the same failure mode I build gates against all day, arriving from a direction I did not defend.</p>

<p>An agent reports success. The tests pass. The diff looks clean. Everything on the surface says the work is done, and the only way to know otherwise is to check something the reporting party does not control — run the actual application, query the actual state, compare against something the optimiser cannot touch.</p>

<p>I had that instinct about agents. I did not have it about my own deployment pipeline, which had been quietly serving stale content for twenty-one days.</p>

<p>The fix, incidentally, was deleting work rather than adding it. The site is plain HTML, but every deploy was running it through a template engine it never needed — 165 seconds to publish half a megabyte. One empty file later, deploys are a straight file copy and take 19 seconds. Nine tenths of the time was spent on a step whose only real contribution was being able to fail.</p>

<div class="pull">
  <span>What I am taking from this</span>
  <p>A system that cannot tell you it failed will let you believe it succeeded for as long as you allow. Silence is not a status. If nothing has reported a problem in three weeks, that is a claim worth testing, not a reason to relax.</p>
</div>

<div class="cta">
  <p>Go and check the last successful deploy of the thing you are most confident about. I will wait. If the answer surprises you, <a href="mailto:jakubkornafel@gmail.com">tell me about it</a> — I collect these.</p>
</div>]]></content:encoded>
    </item>
  </channel>
</rss>
