<?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>Posts tagged ai agents · Silviu Bojica</title><link>https://silviu.bojica.com/tags/ai-agents/</link><description>Posts tagged ai agents, by Silviu Bojica.</description><language>en</language><copyright>© 2026 Silviu Bojica</copyright><lastBuildDate>Tue, 10 Nov 2026 00:00:00 +0100</lastBuildDate><atom:link href="https://silviu.bojica.com/tags/ai-agents/index.xml" rel="self" type="application/rss+xml"/><item><title>A small software factory, with AI agents as the crew</title><link>https://silviu.bojica.com/posts/software-factory/</link><guid isPermaLink="true">https://silviu.bojica.com/posts/software-factory/</guid><pubDate>Tue, 10 Nov 2026 00:00:00 +0100</pubDate><category>orgthread</category><category>ai agents</category><description>In four days, orgthread grew from zero to twelve actions, all coded by AI agents. The work runs through a small software factory: 9 steps, three roles, and four times a check caught a mistake.</description><content:encoded>&lt;p&gt;Since Saturday, 7 November 2026, orgthread has grown from zero to twelve actions: read, write, list, patch, download, upload, version, delete, copy, move, new folders and search. I did not write the code. AI agents wrote it, in a small software factory. The factory started as steps that I ran by hand. On Monday, 9 November, I put those steps into one skill. From delete on, the last five actions went through the same 9 steps.&lt;/p&gt;&#10;&lt;p&gt;This post shows how the factory works. It also shows the four times when one of its checks caught a mistake.&lt;/p&gt;&#10;&lt;h2 id="a-building-site-not-one-long-chat"&gt;A building site, not one long chat&lt;/h2&gt;&#10;&lt;p&gt;One chat that does it all fills up fast. It asks about the software architecture, writes the code, runs the tests and explains the result. Soon the chat is full of code and test output, and my architecture choices are far up in it.&lt;/p&gt;&#10;&lt;p&gt;So I split the work into roles, as on a building site. I am the owner. I agree on the plan with a site manager. A trade does the work. The site manager checks it before I sign it off.&lt;/p&gt;&#10;&lt;p&gt;Each feature is its own building site. The factory is the line that every site follows: the same roles, the same steps and the same checks, feature after feature.&lt;/p&gt;&#10;&lt;p&gt;In the factory, each role is its own AI session:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;The master chat&lt;/strong&gt; keeps the plan of the whole project. It starts one feature master for each feature and reads its final report. It stays short.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;The feature master&lt;/strong&gt; is the site manager. It asks me the architecture questions, writes down my architecture choices, starts the code session, checks its work, and walks me through the code.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;The code session&lt;/strong&gt; is the trade. It writes the code and the tests on its own branch. A branch is a separate line of the code. The main line stays clean until I say yes.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Each session also runs with the model and the effort that fit its work. A quick check gets a fast model and a low effort. Code that is hard to undo, such as delete, gets the strongest model and the most effort.&lt;/p&gt;&#10;&lt;p&gt;The factory is part of a plugin of mine. A plugin is a package of skills and scripts that an agent can load. I start the factory with one skill, a set of written instructions that the agent follows when I type &lt;code&gt;/org:implement&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="nine-steps"&gt;Nine steps&lt;/h2&gt;&#10;&lt;p&gt;Each feature goes through the same 9 steps. Every reply of the feature master starts with its place, for example &amp;ldquo;Step 3 of 9: grill both ways&amp;rdquo;. So I always know where the work stands, even when I come back after a day.&lt;/p&gt;&#10;&#10;&lt;figure class="diagram"&gt;&#10; &lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 648" role="img" aria-labelledby="factory-title factory-desc"&gt;&#10; &lt;title id="factory-title"&gt;The 9 steps of the software factory&lt;/title&gt;&#10; &lt;desc id="factory-desc"&gt;Nine steps, from top to bottom. 1, the master chat starts the job. 2, the feature master reads the project and its code. 3, the feature master grills the architecture both ways with me, and this step repeats until I say yes to the architecture choices. 4, the feature master starts the code session. 5, the code session writes the code and the tests on its own branch. 6, the feature master checks the report against the branch. 7, the feature master walks me through the code. 8, a test run. 9, the merge and the deploy. I decide at steps 3, 7, 8 and 9. From steps 6, 7, 8 and 9, the work can go back to step 5.&lt;/desc&gt;&#10; &lt;defs&gt;&#10; &lt;marker id="factory-arrow-orange" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"&gt;&lt;path class="d-head-orange" d="M0 0 L10 5 L0 10 z"/&gt;&lt;/marker&gt;&#10; &lt;/defs&gt;&#10;&#10; &lt;rect class="d-box" x="4" y="10" width="416" height="56" rx="12"/&gt;&#10; &lt;circle class="d-num-bg" cx="32" cy="38" r="14"/&gt;&#10; &lt;text class="d-num" x="32" y="44" text-anchor="middle" font-size="16"&gt;1&lt;/text&gt;&#10; &lt;text class="d-t" x="58" y="35" font-size="17"&gt;Start the job&lt;/text&gt;&#10; &lt;text class="d-mono" x="58" y="55" font-size="13"&gt;master chat&lt;/text&gt;&#10;&#10; &lt;rect class="d-box" x="4" y="76" width="416" height="56" rx="12"/&gt;&#10; &lt;circle class="d-num-bg" cx="32" cy="104" r="14"/&gt;&#10; &lt;text class="d-num" x="32" y="110" text-anchor="middle" font-size="16"&gt;2&lt;/text&gt;&#10; &lt;text class="d-t" x="58" y="101" font-size="17"&gt;Read the project and its code&lt;/text&gt;&#10; &lt;text class="d-mono" x="58" y="121" font-size="13"&gt;feature master&lt;/text&gt;&#10;&#10; &lt;rect class="d-box" x="4" y="142" width="416" height="56" rx="12"/&gt;&#10; &lt;circle class="d-num-bg" cx="32" cy="170" r="14"/&gt;&#10; &lt;text class="d-num" x="32" y="176" text-anchor="middle" font-size="16"&gt;3&lt;/text&gt;&#10; &lt;text class="d-t" x="58" y="167" font-size="17"&gt;Grill the architecture both ways&lt;/text&gt;&#10; &lt;text class="d-mono" x="58" y="187" font-size="13"&gt;feature master with me&lt;/text&gt;&#10; &lt;path class="d-head-orange" d="M398 161 L407 170 L398 179 L389 170 z"/&gt;&#10;&#10; &lt;rect class="d-box" x="4" y="208" width="416" height="56" rx="12"/&gt;&#10; &lt;circle class="d-num-bg" cx="32" cy="236" r="14"/&gt;&#10; &lt;text class="d-num" x="32" y="242" text-anchor="middle" font-size="16"&gt;4&lt;/text&gt;&#10; &lt;text class="d-t" x="58" y="233" font-size="17"&gt;Start the code session&lt;/text&gt;&#10; &lt;text class="d-mono" x="58" y="253" font-size="13"&gt;feature master&lt;/text&gt;&#10;&#10; &lt;rect class="d-door" x="4" y="274" width="416" height="56" rx="12"/&gt;&#10; &lt;circle class="d-num-bg" cx="32" cy="302" r="14"/&gt;&#10; &lt;text class="d-num" x="32" y="308" text-anchor="middle" font-size="16"&gt;5&lt;/text&gt;&#10; &lt;text class="d-t" x="58" y="299" font-size="17"&gt;Write the code and tests on a branch&lt;/text&gt;&#10; &lt;text class="d-mono" x="58" y="319" font-size="13"&gt;code session&lt;/text&gt;&#10;&#10; &lt;rect class="d-box" x="4" y="340" width="416" height="56" rx="12"/&gt;&#10; &lt;circle class="d-num-bg" cx="32" cy="368" r="14"/&gt;&#10; &lt;text class="d-num" x="32" y="374" text-anchor="middle" font-size="16"&gt;6&lt;/text&gt;&#10; &lt;text class="d-t" x="58" y="365" font-size="17"&gt;Check the report against the branch&lt;/text&gt;&#10; &lt;text class="d-mono" x="58" y="385" font-size="13"&gt;feature master&lt;/text&gt;&#10;&#10; &lt;rect class="d-box" x="4" y="406" width="416" height="56" rx="12"/&gt;&#10; &lt;circle class="d-num-bg" cx="32" cy="434" r="14"/&gt;&#10; &lt;text class="d-num" x="32" y="440" text-anchor="middle" font-size="16"&gt;7&lt;/text&gt;&#10; &lt;text class="d-t" x="58" y="431" font-size="17"&gt;Walk me through the code&lt;/text&gt;&#10; &lt;text class="d-mono" x="58" y="451" font-size="13"&gt;feature master with me&lt;/text&gt;&#10; &lt;path class="d-head-orange" d="M398 425 L407 434 L398 443 L389 434 z"/&gt;&#10;&#10; &lt;rect class="d-box" x="4" y="472" width="416" height="56" rx="12"/&gt;&#10; &lt;circle class="d-num-bg" cx="32" cy="500" r="14"/&gt;&#10; &lt;text class="d-num" x="32" y="506" text-anchor="middle" font-size="16"&gt;8&lt;/text&gt;&#10; &lt;text class="d-t" x="58" y="497" font-size="17"&gt;Test run&lt;/text&gt;&#10; &lt;text class="d-mono" x="58" y="517" font-size="13"&gt;feature master with me&lt;/text&gt;&#10; &lt;path class="d-head-orange" d="M398 491 L407 500 L398 509 L389 500 z"/&gt;&#10;&#10; &lt;rect class="d-box" x="4" y="538" width="416" height="56" rx="12"/&gt;&#10; &lt;circle class="d-num-bg" cx="32" cy="566" r="14"/&gt;&#10; &lt;text class="d-num" x="32" y="572" text-anchor="middle" font-size="16"&gt;9&lt;/text&gt;&#10; &lt;text class="d-t" x="58" y="563" font-size="17"&gt;Merge and deploy&lt;/text&gt;&#10; &lt;text class="d-mono" x="58" y="583" font-size="13"&gt;feature master with me&lt;/text&gt;&#10; &lt;path class="d-head-orange" d="M398 557 L407 566 L398 575 L389 566 z"/&gt;&#10;&#10; &lt;path class="d-line d-line-orange" stroke-dasharray="5 4" d="M420 158 C446 158 446 182 424 182" marker-end="url(#factory-arrow-orange)"/&gt;&#10; &lt;path class="d-line d-line-orange" stroke-dasharray="5 4" d="M452 566 V302 H424" marker-end="url(#factory-arrow-orange)"/&gt;&#10; &lt;path class="d-line d-line-orange" stroke-dasharray="5 4" d="M420 368 H452"/&gt;&#10; &lt;path class="d-line d-line-orange" stroke-dasharray="5 4" d="M420 434 H452"/&gt;&#10; &lt;path class="d-line d-line-orange" stroke-dasharray="5 4" d="M420 500 H452"/&gt;&#10; &lt;path class="d-line d-line-orange" stroke-dasharray="5 4" d="M420 566 H452"/&gt;&#10;&#10; &lt;path class="d-head-orange" d="M20 615 L29 624 L20 633 L11 624 z"/&gt;&#10; &lt;text class="d-m" x="40" y="629" font-size="15"&gt;I decide&lt;/text&gt;&#10; &lt;path class="d-line d-line-orange" stroke-dasharray="5 4" d="M200 624 H236" marker-end="url(#factory-arrow-orange)"/&gt;&#10; &lt;text class="d-m" x="246" y="629" font-size="15"&gt;The work can go back&lt;/text&gt;&#10;&lt;/svg&gt;&#10;&#10; &lt;figcaption&gt;The 9 steps. I decide at the four orange marks. Step 3 repeats until I say yes to the architecture choices. From steps 6 to 9, the work can go back to the code session.&lt;/figcaption&gt;&#10;&lt;/figure&gt;&#10;&#10;&lt;p&gt;The diagram has two kinds of marks. The orange diamonds are the four points where I decide. No code is written before I approve the architecture choices. No code merges or goes live before I say yes.&lt;/p&gt;&#10;&lt;p&gt;The dashed lines show where the work can go back. That is not a failure. It is the reason the steps exist.&lt;/p&gt;&#10;&lt;h2 id="grill-both-ways"&gt;Grill both ways&lt;/h2&gt;&#10;&lt;p&gt;Step 3 sets the shape of the feature. The feature master asks me one question at a time. Each question comes with a short trade-off and a recommendation.&lt;/p&gt;&#10;&lt;p&gt;For delete, there were seven questions. Can it delete folders? No, files only, for now. Where may it delete? Only in folders that I list in a setting. How do I undo a delete? With a restore command, decided but not built yet.&lt;/p&gt;&#10;&lt;p&gt;&amp;ldquo;Both ways&amp;rdquo; means that I can ask back at any time. When an answer is not clear, the feature master gives me an example from the real code.&lt;/p&gt;&#10;&lt;p&gt;I do not only answer. When the direction does not fit, I challenge it. I also bring my own ideas, and the feature master weighs them with the same trade-offs as its own. Then I decide.&lt;/p&gt;&#10;&lt;p&gt;The grill ends in a note of my architecture choices. The code session starts only after I approve it.&lt;/p&gt;&#10;&lt;p&gt;In step 7, the same thing happens with the code. The feature master walks me through it from the top down, one level at a time. I say yes only to code that I understand.&lt;/p&gt;&#10;&lt;h2 id="four-times-the-checks-paid-off"&gt;Four times the checks paid off&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;The builder found a gap in older code.&lt;/strong&gt; The architecture choices for delete said that each delete needs a fingerprint. A fingerprint is a short code for one exact version of a file. While it built copy, the code session found that delete let an empty fingerprint through. The fix went into the next version, for both copy and delete. A second pair of eyes on old code is part of the work, not extra.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Green on the Mac, red on Linux.&lt;/strong&gt; A test for a failed move used &lt;code&gt;chflags&lt;/code&gt; to lock a folder. All tests passed on my Mac. The test run on GitHub, which runs on Linux, failed. &lt;code&gt;chflags&lt;/code&gt; exists only on macOS. The test now uses a folder without the right to write, which works on both. The program itself was fine. Only the test was wrong. This is why tests run in more than one place.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;A report is not proof.&lt;/strong&gt; One session reported that orgthread had failed, so it used the old way to the files instead. The real cause was a wrong path that the session gave to orgthread. The tool itself worked. This is why the feature master checks each report against the branch and the facts, before it tells me that something is done or broken.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;A yes must come from me.&lt;/strong&gt; At one point, my yes for a push came to the session through another session. The safety check of the agent refused it. It wanted my own yes, in that session. This is slower, but right. A yes that travels from session to session is easy to copy, and hard to check.&lt;/p&gt;&#10;&lt;h2 id="what-it-costs"&gt;What it costs&lt;/h2&gt;&#10;&lt;p&gt;The factory is not free. A feature takes more steps and more questions than one quick chat. I answer each architecture question myself. On a busy day, several sessions run at once. Each session&amp;rsquo;s title starts with a sign that shows its state: working, waiting for me, or done.&lt;/p&gt;&#10;&lt;p&gt;A very small change, one file and a few lines, does not need the whole factory. It stays in a plain chat. But it still goes on a branch, and it still waits for my yes before it goes live.&lt;/p&gt;&#10;&lt;p&gt;For the last five actions, the cost was worth it to me. Each one went through the same steps and the same checks.&lt;/p&gt;&#10;&lt;h2 id="two-days-in-numbers"&gt;Two days in numbers&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;11 versions&lt;/strong&gt; deployed, from 0.2.8 to 0.2.18.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;36 commits&lt;/strong&gt; to the main line.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;176 more tests:&lt;/strong&gt; from 267 to 443.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;5 new actions&lt;/strong&gt; through the factory: delete, copy, move, new folders and search.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;6 actions improved:&lt;/strong&gt; read, write, patch, download, upload and list.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;4 mistakes&lt;/strong&gt; caught by the checks, the ones above.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;By my own estimate, the same work by hand would have taken me three to four weeks.&lt;/p&gt;&#10;&lt;h2 id="what-you-can-take-from-it"&gt;What you can take from it&lt;/h2&gt;&#10;&lt;p&gt;You do not need my plugin to use the idea. Three rules carry most of it:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Split the roles.&lt;/strong&gt; One session plans, one builds, one checks. Each chat stays short and keeps its focus.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Put a check between the steps.&lt;/strong&gt; Each report is checked against the real branch, and each test runs in more than one place.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;The owner says yes.&lt;/strong&gt; No merge and no deploy without it, and the yes comes from the owner, not from another agent.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="where-it-stands"&gt;Where it stands&lt;/h2&gt;&#10;&lt;p&gt;All twelve actions are live in orgthread version 0.2.18. Each of the last five, from delete to search, has its note of architecture choices, its tests and an entry in the changelog. I build orgthread with AI agents as the crew. I set the architecture, and nothing merges or goes live without my yes.&lt;/p&gt;&#10;&lt;p&gt;The code of orgthread is public on &lt;a class="out" href="https://github.com/orgthread/orgthread"&gt;&lt;span class="out-text"&gt;GitHub&lt;/span&gt;&lt;span class="arrow-out" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. To follow the build, subscribe to the &lt;a href="https://silviu.bojica.com/tags/orgthread/index.xml"&gt;Build log feed&lt;/a&gt;.&lt;/p&gt;&#10;</content:encoded></item></channel></rss>