<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Agents on Electric Nexus</title><link>https://arkoniak.com/tags/agents/</link><description>Recent content in Agents on Electric Nexus</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 18 Oct 2026 20:00:00 +0300</lastBuildDate><atom:link href="https://arkoniak.com/tags/agents/index.xml" rel="self" type="application/rss+xml"/><item><title>Exerakt: How the Models Work Together</title><link>https://arkoniak.com/posts/exerakt-pipeline/</link><pubDate>Sun, 18 Oct 2026 20:00:00 +0300</pubDate><guid>https://arkoniak.com/posts/exerakt-pipeline/</guid><description>How Claude, Jev and a local Bonsai model are put together into one pipeline, and what its first run showed: most failures that looked like the executor&amp;rsquo;s were mine.</description><content:encoded><![CDATA[<p>Once I knew what to build and with what, the next question was how to organise it. The idea of
Claude, Jev and Bonsai working together is clear on paper, but how does it work in practice? What is
called when and in which order, who depends on whom, and who checks whom?</p>
<h2 id="the-plan">The plan</h2>
<p>The work goes from the top down, in three levels. The whole client is split into milestones, each
ending in something that runs end to end: first a client that can only read, then one that can
write, then accounts, threads, and so on. When a milestone starts, Claude splits it into steps, and
when a step starts, Claude splits it into cards. Detail is added only one level ahead: only the
milestone we are working on is split into steps, and only the current step is split into cards.
This is called rolling wave planning. Every step ends with a review, and the review may change the
plan for the next steps, so there is no detailed plan for work that the earlier work can still
change. But there is always a more or less clear picture of what lies ahead and what is still left
to do. The diagram below shows the whole cycle.</p>
<pre class="mermaid">flowchart TD
    M[&#34;Milestone&lt;br/&gt;(e.g. a client that can write)&#34;] --&gt;|Claude splits the current milestone| S[Steps]
    S --&gt;|Claude splits the current step| C[&#34;Cards: signatures,&lt;br/&gt;frozen tests, task&#34;]
    C --&gt; L[[&#34;Card loop&lt;br/&gt;(Bonsai writes, checks, Jev decides)&#34;]]
    L --&gt; R[Step review by Claude]
    R --&gt;|next step| S
    R -.-&gt;|may change the plan| M</pre><p>The unit of work is a card: one small task for the executor (normally Bonsai), usually a few functions in one file.
Before a card goes anywhere, Claude has already written everything around it: the types and
function signatures with empty bodies, the module&rsquo;s description, and the tests. The tests are
frozen. Bonsai sees the task, the files it may change and the tests, and fills in the bodies. If a
test file changes by a single byte, the attempt does not count, so the model cannot pass a test by
rewriting it. For a model working on its own this is the most important guard.</p>
<p>The cards are run by an orchestrator, a separate program that Claude wrote. For each
card it asks Bonsai for code and then checks the result, cheapest checks first:</p>
<ol>
<li>Did the model touch only the files it was allowed to touch?</li>
<li>Does it compile, and does clippy have nothing to say?</li>
<li>Does the code break any of the project&rsquo;s mechanical rules, such as which crate may depend on
which?</li>
<li>Do the tests pass?</li>
<li>Only then Jev: questions that a machine cannot check, like &ldquo;does the code do what the task
describes&rdquo; or &ldquo;does every function belong to the module&rsquo;s stated responsibility&rdquo;.</li>
</ol>
<p>The first four checks cost nothing and are exact, so Jev only sees code that already
works. When a check fails, the errors go back to Bonsai for another attempt. Jev also looks at
the failure and decides whether it is worth retrying (a typo, a wrong method name) or whether the
card should go back to Claude (the task itself looks wrong, or the model is going in circles).
After three failed attempts the card goes back to Claude anyway. The second diagram shows one
card&rsquo;s way through this loop.</p>
<pre class="mermaid">flowchart TD
    B[Bonsai writes the code] --&gt; G1{&#34;Only the allowed&lt;br/&gt;files changed?&#34;}
    G1 --&gt;|yes| G2{&#34;Compiles,&lt;br/&gt;clippy clean?&#34;}
    G2 --&gt;|yes| G3{&#34;Project rules&lt;br/&gt;hold?&#34;}
    G3 --&gt;|yes| G4{&#34;Tests pass?&#34;}
    G4 --&gt;|yes| J{&#34;Jev: does the code&lt;br/&gt;do what the task says?&#34;}
    J --&gt;|yes| A[Accepted, merged into the step]
    J -.-&gt;|not sure| JD[Claude as judge]
    JD -.-&gt; A
    G1 &amp; G2 &amp; G3 &amp; G4 &amp; J --&gt;|no| F{&#34;Jev: what kind&lt;br/&gt;of failure?&#34;}
    F --&gt;|&#34;typo, local mistake:&lt;br/&gt;errors go back&#34;| B
    F --&gt;|&#34;card looks wrong,&lt;br/&gt;model goes in circles,&lt;br/&gt;attempts used up&#34;| E[Back to Claude]</pre><p>There is one more participant for the start. When I searched for how Jev is used, I found the
recommendation to calibrate it on your own tasks before relying on it fully. So Claude was added as
a judge: every question Jev answers is also put to Claude, and while this calibration is on,
Claude&rsquo;s answer decides (the dashed arrows in the second diagram). On the first step Jev cost about 300
times less than Claude for the same questions, which is the reason to want it to take over.</p>
<p>Bonsai (<a href="https://prismml.com/news/bonsai-2-27b">Bonsai 2 27B</a> by PrismML) was chosen for a
simple reason: on my machine, with one 12 GB graphics card, it had a reasonable balance between
speed and quality, about 56 tokens per second with 128K tokens of context. A better candidate
could probably be found, but at that moment it was a model that definitely worked, had a good
context size, and I did not want to spend time searching for another one.</p>
<p>An independent review of Bonsai said that it plans well and codes poorly in agentic tasks. Fixed
signatures and frozen tests were meant to compensate for exactly that: the model does not have to
design anything, only to fill in bodies until the tests pass.</p>
<h2 id="the-first-run">The first run</h2>
<p>The first step was the client&rsquo;s model: pure view state, room list, timeline, dates, previews. Six
cards, 75 frozen tests. One card of six passed on the first attempt, one more on the second, and four
came back to Claude.</p>
<p>When I looked at why, only one of the four was Bonsai&rsquo;s failure: it converged on the answer,
but ran out of attempts on the way. The other three were not its fault:</p>
<ul>
<li>The orchestrator itself had a bug. Bonsai&rsquo;s code had passed every check, and the last thing left
was to ask Claude, as the judge, the same questions Jev had answered. That request failed: the
orchestrator named each question after the project rule it checks, with names like <code>R:S4</code>, and
the colon is not allowed in the format Claude&rsquo;s interface expects for these answers. So a correct
card came back as a failure.</li>
<li>One card asked for a function that returns <code>bool</code> when an operation fails. The project&rsquo;s own rules
say that failures are typed errors. Bonsai followed the card, and Jev correctly rejected the
code for breaking the rules.</li>
<li>One card asked for date calculations and said &ldquo;use Hinnant&rsquo;s algorithm&rdquo;, without writing the
algorithm down. Bonsai spent its whole token budget twice trying to derive it and did not produce
a single line of code.</li>
</ul>
<p>So in this scheme the architect&rsquo;s mistakes look like the executor&rsquo;s mistakes. A badly written card
shows up as a failed attempt, and from the outside it is hard to tell which side is wrong.</p>
<h2 id="what-changed">What changed</h2>
<p>The fixes went to where the problems were. The orchestrator got its bug fixed and a check that
catches it before a run. The card with <code>bool</code> returns a typed error now. The date card got the
formulas themselves, checked against Python&rsquo;s <code>datetime</code> for every year from 1 to 9999. And the
process for writing cards got two new rules: a known algorithm is written out, not named, and
every signature is checked against the project&rsquo;s rules before the card is cut.</p>
<p>The more general lesson is that the pipeline has to tell these failures apart. That is why Jev
classifies every failure, and why &ldquo;the card itself looks wrong&rdquo; goes straight back to Claude
instead of costing Bonsai more attempts.</p>
<p>What Bonsai itself does with the cards it gets is the subject of the next post.</p>
]]></content:encoded></item><item><title>Exerakt: Why I Let Models Write My Matrix Client</title><link>https://arkoniak.com/posts/exerakt-why/</link><pubDate>Sun, 18 Oct 2026 10:00:00 +0300</pubDate><guid>https://arkoniak.com/posts/exerakt-why/</guid><description>Why I started Exerakt: to see how far models can get writing a real program on their own, in a structured process and without a big bill, and to get a Matrix desktop client I actually want to use.</description><content:encoded><![CDATA[<h2 id="the-experiment">The experiment</h2>
<p>I like trying new things. At work I use AI all the time, but as an assistant: I am in the loop for
every feature. I agree with the agent on what it is going to write, correct it as it goes, and keep
its work in line with the bigger picture of the project. This works very well. What I had never
tried is the opposite: let the model work on its own from start to finish, choose the solutions,
find its own mistakes and improve its own code.</p>
<p>At the same time I wanted to use my own experience. A model works better when its work is
structured: there is a problem statement, a breakdown into tasks, steps that end with tests and a
review of the design. Not &ldquo;make it good&rdquo;, but a process that looks like the classic way of building
software, the one I know works. There is nothing new here. It is only a formalisation of what
already exists, written down precisely enough to be run without me.</p>
<p>And I did not want to spend thousands of dollars on it. So the third thing I wanted to see is how
the models work together when each one does the job that fits its price:</p>
<ul>
<li>Claude is the organiser and planner: it designs the interfaces, writes the tests and splits the
work into small tasks.</li>
<li>Jev, a small and very cheap decision model, is the orchestrator: it checks the result against the
task and decides what happens next.</li>
<li><a href="https://prismml.com/news/bonsai-2-27b">Bonsai</a>, a 27B model running locally on my GPU, does all
the grunt work.</li>
</ul>
<p>I had heard about this kind of setup, but I had never used it in practice.</p>
<h2 id="the-project">The project</h2>
<p>Then the question was what to build. I did not want another to-do application or another proof of
concept. I have made too many pet projects like that, and they led nowhere. This time it had to be
something I really need and will use every day.</p>
<p>I chose a desktop client for <a href="https://matrix.org/">Matrix</a>. Matrix is an open, federated
chat protocol: anyone can run a server (I run my own), servers talk to each other the way email
servers do, rooms can be end-to-end encrypted, and any client works with any server.</p>
<p>This may look like a strange choice, because there are already many Matrix desktop clients. But each
of them has something that does not work for me:</p>
<ul>
<li>Element is the closest to what I need, but it runs only on Electron, which is heavy, and on my
Hyprland desktop the left Alt key opens its menu, while I switch keyboard layouts with left Alt.</li>
<li>FluffyChat is poor in features: it turns message HTML into its own widgets, so formatting comes
out badly, and it has no threads.</li>
<li>With the others there were other unpleasant things: no custom themes in Nheko, no text selection
with the mouse in Fractal.</li>
</ul>
<p>These are all good clients, and I have no big complaints about them. I could live with their
shortcomings or send pull requests. The closest to my wishes was
<a href="https://github.com/surakin/tesseract">Tesseract</a>, but it develops fast enough that keeping a fork
would be expensive, and I did not want to carry its Windows and macOS code.</p>
<p>So two things came together: the wish to try a process where models write the code, and the
wish to have a good client made for my needs, one I can change in any direction without depending on
the plans, means or taste of its maintainers. That is how Exerakt was born: a Matrix desktop client
for Wayland, written in Rust.</p>
<p>How it is going is the subject of the next posts.</p>
]]></content:encoded></item></channel></rss>