<?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>Addable Labs — Blog</title>
    <link>https://addablelabs.se/</link>
    <description>Notes from building apps and adopting AI: app development and the AI journey, from Addable Labs.</description>
    <language>en</language>
    <lastBuildDate>Tue, 22 Sep 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://addablelabs.se/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Ashlands: what one prompt built</title>
      <link>https://addablelabs.se/blog/ashlands-what-one-prompt-built/</link>
      <guid isPermaLink="true">https://addablelabs.se/blog/ashlands-what-one-prompt-built/</guid>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate>
      <description>One prompt and a fleet of sub-agents produced 94,000 lines of a running game — and could not close the last stretch. What the Gauntlet Loop got right, what it cost, and what the founder brought to the run.</description>
      <category>AI journey</category>
      <content:encoded>&lt;p&gt;On 31 July 2026 we gave Claude Code &lt;a href=&quot;https://github.com/addable-labs/ashlands#this-is-an-experiment&quot;&gt;one
prompt&lt;/a&gt;:
build an action role-playing game at the level of Morrowind, in Three.js,
fan out sub-agents, have a separate harsh critic compare each piece against
the real game side by side, and don&#39;t stop until every critic is wowed. No
architecture, no task list, no definition of done. The build ran for three
days; on 10 August, at our request, the agent wrote an evaluation of its own
run. Both are public: &lt;a href=&quot;https://github.com/addable-labs/ashlands&quot;&gt;Ashlands&lt;/a&gt;
is MIT-licensed, and its &lt;a href=&quot;https://github.com/addable-labs/ashlands/blob/main/EVALUATION.md&quot;&gt;evaluation
report&lt;/a&gt; is
deliberately weighted toward what went wrong — and is the agent&#39;s own
account of its own run, worth remembering for every number below.&lt;/p&gt;
&lt;p&gt;The prompt follows the &lt;strong&gt;Gauntlet Loop&lt;/strong&gt;, the method Matt Shumer described
in &lt;a href=&quot;https://somethingbig.ai/gauntlet-loop&quot;&gt;How to Run a Gauntlet Loop&lt;/a&gt;: run
it inside an agentic system rather than a chat, state the goal without
prescribing the implementation, give the critic a concrete reference to
compare against, let the lead agent split the work into pieces that can be
judged separately, and never let a builder grade its own work. Others have
run it since; the games they built are collected on &lt;a href=&quot;https://somethingbig.ai/games&quot;&gt;his
site&lt;/a&gt;, several of them very good.&lt;/p&gt;
&lt;h2&gt;What came out&lt;/h2&gt;
&lt;p&gt;About 94,000 lines of TypeScript across 160 files; sixteen subsystems, each
behind a named contract; eighteen quests with dialogue, factions, crime and
a journal; zero binary assets — terrain, materials, sky, flora,
architecture, creatures, music and sound all generated from code. The agent
also built the machinery that judges it: 32 gate checks and 17 end-to-end
checks driving a real browser. At the close the gate was failing 1 of 32,
end-to-end passed 16 of 16, and the game ran at 20 to 35 frames per second
at capture resolution on a MacBook Air.&lt;/p&gt;
&lt;p&gt;And it plays: you can walk the world, use skills and finish all eighteen
quests — a script drives every one to its final stage without sticking. What
is open is art direction and frame rate: a palette check failing on one
vantage, stair-stepping where water meets terrain, mottling at distance. Not
a game that falls over — an unfinished one.&lt;/p&gt;
&lt;h2&gt;What the method got right&lt;/h2&gt;
&lt;p&gt;Contracts first: one named interface per subsystem, communicating only
through an event bus, which let sub-agents write terrain, sky, combat and
audio at once with almost no integration conflicts — the report calls it the
decision most responsible for the codebase existing. Builders kept away from
critics: agents grading their own work declared success, independent critics
did not. And negatives as the most valuable output — four of the six rounds
in the closing phase ended with an agent making a change, measuring it,
finding it worse and reverting, keeping the measurement, and each closed a
line of investigation for good.&lt;/p&gt;
&lt;h2&gt;What went wrong&lt;/h2&gt;
&lt;p&gt;The brief&#39;s terminal condition, a blind side-by-side against the real game,
never happened: no reference screenshots were ever obtained, so every &amp;quot;beats
Morrowind&amp;quot; score was an agent comparing a frame against its own recollection
— a deviation from the method, whose third principle is to give the critic
something concrete to inspect.&lt;/p&gt;
&lt;p&gt;The most expensive failure was not bad code but confident wrong diagnosis.
One vantage rendered as a flat terracotta wash, and three rounds of
sub-agents were sent to the terrain material, the lighting and the
atmosphere; all three measured correctly, found nothing and reverted. The
cause was one missing distance term in the camera-placement search, which
had climbed to the nearest high shoulder and aimed point-blank at the peak:
no shader change can fix a frame with no depth in it. A second multi-round
hunt was the same bug class.&lt;/p&gt;
&lt;h2&gt;Where the corrections came from&lt;/h2&gt;
&lt;p&gt;The report is the agent&#39;s voice, and it is thin exactly where the human was
decisive: we played the game as it was built and steered it. The
first-person arms took about eleven rounds. On 1 August: &amp;quot;Those are really
bad arms! Fingers go the wrong way and arms look like pipes rather that real
arms.&amp;quot; Later that day: &amp;quot;The hand looks like a left hand, but the player is
holding the sword in its right hand.&amp;quot; That evening we compared it to early
image generation, where horses had five legs, and asked for the arm to be
started over from a picture rather than patched. On 2 August, with a
screenshot: &amp;quot;the knockles should be on the right side of the hand, not the
left&amp;quot;, then &amp;quot;if you dont get the hand right this time, i want you to
research how others do it&amp;quot;. The agent&#39;s own summary of 3 August is blunter
than the report: &amp;quot;User feedback each time was correct and mine was not.&amp;quot;&lt;/p&gt;
&lt;p&gt;The frame rate went the same way: every sub-agent wanted 60 frames per
second on a fanless laptop, none got near it, and we worked out why —
several agents were testing at once, each driving its own browser and GPU,
so what each measured was not what a player would see. &amp;quot;We are doing all
development on a MacBook Air. FPS will not become perfect. Also some other
agents are working too. Keep going,&amp;quot; we wrote on 1 August. The report
records that collision as a finding of its own — a load average of 37 on
eight cores — and credits &amp;quot;the user&amp;quot; in one clause.&lt;/p&gt;
&lt;p&gt;Then we asked for the two things the run was missing: &amp;quot;Build the regression
gate, and think about how we can transition from random walk workflow to a
highly structured and intentional map of steps you need sub-agents to take.&amp;quot;
Both are in the repository now: the gate nothing merges without, and a
pipeline that serialises verification to one browser and allows one change
to the global look per round — a factory, arriving from inside a
single-prompt run, two days in.&lt;/p&gt;
&lt;h2&gt;What it cost&lt;/h2&gt;
&lt;p&gt;Over three days the run spawned 242 sub-agents across 34 workflow
launches — at most seven alive at once, and never ten. They are
short-lived, a median of forty minutes, so the total climbed while the
number running together stayed small: five or more for seventeen of the
seventy-two hours, the crowd behind that load average of 37.&lt;/p&gt;
&lt;p&gt;The last six of those 242 ran in the closing phase and five completed:
about 1.32 million tokens and 654 tool calls over roughly 3.8 hours, for
one shipped visual fix and four closed investigations. The sixth died
before reading a file when the account hit its weekly token limit — the
ceiling on this method is quota, and quota arrives without warning. About a
million of those tokens went into the one vantage whose cause was that
missing distance term.&lt;/p&gt;
&lt;h2&gt;Where the loop fits&lt;/h2&gt;
&lt;p&gt;The report&#39;s closing argument, which it marks as opinion rather than
measurement, is that the cost of the loop is set by the critic and not the
builder. The builder side worked; judging the work is what consumed the
tokens, and this run had close to a worst-case critic on every axis. Two
questions predict the outcome better than anything else: is there an
executable oracle that answers yes or no without a model&#39;s opinion, and does
a failing check name the thing to fix? Porting a library, implementing a
spec, optimising for speed, balancing a card game over a hundred thousand
simulated matches — all yes. A renderer with no reference imagery: no on
both counts.&lt;/p&gt;
&lt;h2&gt;What we take into the factory&lt;/h2&gt;
&lt;p&gt;We run agents the other way round — stages, gates, a ledger and a founder
review before anything is published, which is how &lt;a href=&quot;https://addablelabs.se/blog/how-this-site-was-built-by-agents/&quot;&gt;this site was
built&lt;/a&gt; and what the &lt;a href=&quot;https://addablelabs.se/blog/why-we-run-an-agent-run-factory/&quot;&gt;factory
article&lt;/a&gt; describes. This run was
steered, and the steers are in the repository: the arms, the frame-rate
diagnosis, the gate and the map of steps. The instruments were built
during the loop by the agent whose work they judged, and were wrong seven
times. So, for our own runs: build the instrument first and calibrate it
against a known defect, put the reference in the critic&#39;s hands before the
first round, and keep a person where an agent cannot tell you it is wrong.
Contract-first decomposition, builders kept away from critics and a clean
negative treated as a complete answer — those we take as they are.&lt;/p&gt;
&lt;p&gt;The method is what got 94,000 lines running at all, and the report closes
by adding to it: a revised starting prompt for anyone rerunning this,
whose addition is how the work is to be verified — name the reference,
name the instrument, say what a pass looks like before the first agent
starts. Run it that way and this run would have ended further along.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Morrowind is named here only as the design target the experiment measured
itself against; Ashlands contains no assets from those games. The Elder
Scrolls and Morrowind are trademarks of ZeniMax Media.&lt;/em&gt;&lt;/p&gt;
</content:encoded>
    </item>
    <item>
      <title>Why we run an agent-run software factory</title>
      <link>https://addablelabs.se/blog/why-we-run-an-agent-run-factory/</link>
      <guid isPermaLink="true">https://addablelabs.se/blog/why-we-run-an-agent-run-factory/</guid>
      <pubDate>Mon, 21 Sep 2026 00:00:00 +0000</pubDate>
      <description>The first article in a series about the factory behind this site — what Gas City and Beads are, what we took from Steve Yegge&#39;s work and what we changed, with one build in real numbers.</description>
      <category>AI journey</category>
      <content:encoded>&lt;p&gt;Addable Labs builds software largely with AI agents, and since September 2026
this website has been built and maintained by what we call the factory: a
small team of coding agents organised like a company, coordinating through a
shared issue tracker, with one person in charge. The article &lt;a href=&quot;https://addablelabs.se/blog/how-this-site-was-built-by-agents/&quot;&gt;How this site
was built by agents&lt;/a&gt; told the story
of one build; this series describes the setup itself, one layer at a time,
starting with the obvious question: why run something like this at all, and
what is it built on?&lt;/p&gt;
&lt;h2&gt;What one agent and one person could not do&lt;/h2&gt;
&lt;p&gt;nivå was built the other way round: one
coding agent and one person, 480 commits in 26 days, every one co-authored
by the agent. That setup does not start from nothing. A file of working
agreements, four written routines — review, gates, deploys and content
changes — eighteen notes the agent keeps for itself, ten of them things we
have corrected, a progress log with an entry per session and 105 recorded
decisions carry the work from one session to the next.&lt;/p&gt;
&lt;p&gt;What that setup cannot do is talk to anyone but us. On 12 September, with
four agents on one computer, each on its own project, we had the nivå agent
write a message we could carry to the other three by hand, and pasted it
into the rules file every agent on the machine reads first. Every task
starts with us, and when two sessions need to know about each other, we
carry the message. That does not scale to agents that plan, build, review
and publish while we do something else, and it keeps us in details we do not
want to be in.&lt;/p&gt;
&lt;p&gt;Three things had to change: the work had to sit in a shared ledger that any
session could claim from, not in one project&#39;s notes; sessions had to hand
work to each other and follow it up without a person in between; and the
person in charge had to be involved at a few known points — a plan to approve,
a branch to read before it is pushed — instead of all the time.&lt;/p&gt;
&lt;h2&gt;Steve Yegge&#39;s iterations&lt;/h2&gt;
&lt;p&gt;The setup we run is built on open-source work that Steve Yegge started in
October 2025 with &lt;a href=&quot;https://github.com/gastownhall/beads&quot;&gt;Beads&lt;/a&gt;, an issue
tracker he describes as memory for coding agents rather than a to-do list for
people. In January 2026 came &lt;a href=&quot;https://yegge.ai/essays/welcome-to-gas-town/&quot;&gt;Gas
Town&lt;/a&gt;, his orchestrator: up to
thirty agent sessions coordinating through Beads, a dozen or so active at a
time, with a fixed cast of roles and a thesis we have adopted wholesale, in
his words: &amp;quot;an agent is not a session&amp;quot; — sessions are disposable, the work is
persistent. In April 2026 &lt;a href=&quot;https://yegge.ai/essays/welcome-to-gas-city/&quot;&gt;Gas
City&lt;/a&gt; arrived: in his words,
&amp;quot;Gas Town, but torn apart and rewritten from the ground up as an SDK for
building your own dark factories&amp;quot;. He is careful to say that he did not write
it — Julian Knutsen and Chris Sells did. Then in August 2026, &amp;quot;&lt;a href=&quot;https://yegge.ai/essays/fences-not-sandboxes/&quot;&gt;Fences, not
Sandboxes&lt;/a&gt;&amp;quot; described the
organisation of fifty to sixty agents he runs, governed by written rules
rather than by containment.&lt;/p&gt;
&lt;p&gt;We went through all of that on 20 September 2026 and found that nearly
everything we wanted — a factory per project, a coordinator you can talk to,
delegation with follow-up, one shared ledger — already existed, was actively
maintained and MIT-licensed. We built on it rather than build another
orchestrator, and ran the first build the same afternoon.&lt;/p&gt;
&lt;h2&gt;Gas City and Beads, briefly&lt;/h2&gt;
&lt;p&gt;Beads is a command-line issue tracker backed by a version-controlled
database. Every unit of work is a bead — a task, a message between agents,
the record of a session — with dependencies between them. A bead blocked by
another is not offered to any agent, which is how order is kept without a
central scheduler. An agent claims a bead, works, writes down what it did
and closes it; if its session dies halfway, the bead stays open for the next
one.&lt;/p&gt;
&lt;p&gt;Gas City is the orchestrator around that ledger and hard-codes no roles. An
agent is configuration: a name, a prompt, a scope. A formula is a workflow
written as steps and dependencies; applied, it becomes a graph of beads that
the orchestrator drives to completion, restarting sessions that crash. Packs
bundle agents and formulas so that a methodology can be pinned like a
dependency. The maintainers&#39; own rule for the framework is that it &amp;quot;moves
work; it doesn&#39;t reason about it&amp;quot; — the judgement lives in the prompts.&lt;/p&gt;
&lt;h2&gt;What we took, and what we changed&lt;/h2&gt;
&lt;p&gt;We took the principles as they are. Work persists, sessions do not. Roles are
configuration, not code. Planner, builder and reviewer are different agents,
and review runs in several lanes. Rules are written in the files every session
reads first. And, from the &amp;quot;Fences&amp;quot; essay, governance by refusal rather than
by cage — a fence, in the definition he quotes, is &amp;quot;any mechanism that turns
you away if you aren&#39;t supposed to be there&amp;quot;.&lt;/p&gt;
&lt;p&gt;Yegge runs fifty to sixty agents; we run a handful of sessions at a time on
one computer and mean to run one factory per project — so far there is one,
for this site. The org chart is small: one mayor, and a floor of roles taken
as they are from the upstream starter pack — requirements, plan, plan
review, decomposition, implementation, three review lanes, a publisher —
each started as a session when a build step needs it and retired afterwards.
Our own contribution so far is the mayor&#39;s prompt, limits on how many
sessions one computer runs at once and the rules of a shared machine. The
founder&#39;s gate sits at the plan, since the second build. No agent pushes on
its own: publishing means a branch we read locally, and nothing reaches
GitHub until we say so. We talk to the mayor over Discord.&lt;/p&gt;
&lt;h2&gt;One build, in numbers&lt;/h2&gt;
&lt;p&gt;The redesign of this site was the factory&#39;s second build, and the documents
it wrote are in the repository. It began on 20 September 2026 at 17:34 UTC
with a short brief, and the review report was finalised at 00:14 the next
morning: six hours and forty minutes of wall-clock time. In between, the
requirements step produced 31 requirements with acceptance criteria; the
plan step rendered three design directions as real pages — we were already
looking at them on the preview server and picked one within two minutes of
being asked — and approved the reviewed plan at 19:45; the decomposition
produced ten work items; one implementation worker, in four sessions, worked
through them in 22 commits; and three review lanes found two required fixes,
made by a fix lane before the report was written. The branch ended at 39
commits touching 90 source files, passing ten automated gates, 101 tests and
Lighthouse scores of 97 to 100 on all seven pages it checks. Our part was
six short messages while the run was on — the pick, our corrections, the
plan-gate answers — and, next morning, our verdict on the finished page. The
run itself was 112 beads, 17 agent sessions in ten roles and ten mails
between the mayor and the floor that we never had to carry; nothing went
public on the agents&#39; own say-so.&lt;/p&gt;
&lt;p&gt;The first build, earlier the same day, took about four hours for 27
requirements and ten work items, needed one required fix and had no gate
before the end: we saw the result when it was done and did not like the look
of it. Neither run was flawless. In the first, a session claimed a
bookkeeping record instead of its task and needed fourteen minutes to work
around it; it wrote the fix into its notes, and when the second build&#39;s
first session hit the same race, it was on its task within a minute. Both
runs left us a list of open items; we consider those lists part of the
product.&lt;/p&gt;
&lt;h2&gt;Thanks&lt;/h2&gt;
&lt;p&gt;None of this would exist without Steve Yegge&#39;s willingness to build in public
and to release Beads and Gas Town under a licence that let us build on them,
nor without Julian Knutsen, Chris Sells and the community around the Gas Town
Hall organisation, who made Gas City. Thank you. The code is on GitHub — &lt;a href=&quot;https://github.com/gastownhall/gascity&quot;&gt;Gas
City&lt;/a&gt;,
&lt;a href=&quot;https://github.com/gastownhall/beads&quot;&gt;Beads&lt;/a&gt; and the &lt;a href=&quot;https://github.com/gastownhall/gascity-packs&quot;&gt;packs
registry&lt;/a&gt; — and the essays are
on Yegge&#39;s site: &lt;a href=&quot;https://yegge.ai/essays/welcome-to-gas-town/&quot;&gt;Welcome to Gas
Town&lt;/a&gt;, &lt;a href=&quot;https://yegge.ai/essays/welcome-to-gas-city/&quot;&gt;Welcome to Gas
City&lt;/a&gt;, &lt;a href=&quot;https://yegge.ai/essays/fences-not-sandboxes/&quot;&gt;Fences, not
Sandboxes&lt;/a&gt; and &lt;a href=&quot;https://yegge.ai/essays/beads-best-practices/&quot;&gt;Beads Best
Practices&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;What comes next&lt;/h2&gt;
&lt;p&gt;The next articles take the setup one layer at a time — the roles, the beads
the agents communicate through, the life of a request, the rules a change has
to pass, what the founder sees and decides, what went wrong and what it costs.&lt;/p&gt;
</content:encoded>
    </item>
    <item>
      <title>How this site was built by agents</title>
      <link>https://addablelabs.se/blog/how-this-site-was-built-by-agents/</link>
      <guid isPermaLink="true">https://addablelabs.se/blog/how-this-site-was-built-by-agents/</guid>
      <pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate>
      <description>The stages, gates and founder reviews behind the first site an agent-run software factory produced end to end.</description>
      <category>App development</category>
      <content:encoded>&lt;p&gt;Addable Labs builds software largely with AI agents, and this website is the
first thing an agent-run software factory produced for the company from
start to finish, in two builds. This article describes the stages, what we
looked at and the checks that stand between an agent&#39;s change and a
published page.&lt;/p&gt;
&lt;h2&gt;The stages&lt;/h2&gt;
&lt;p&gt;Each run moved through a fixed sequence, and every stage wrote a document the
next one had to read: requirements, a plan, a review of that plan, a
decomposition into work items, the implementation, a review of the result and
publication. The requirements turned a short brief into numbered statements
with acceptance criteria. In the first build the plan chose the stack and
fixed the URL structure, the article schema and the colour palette, with the
alternatives it rejected; in the second it chose the design system. The
decomposition cut the plan into work items, each with its own proof command,
and an agent implemented them one at a time on a local branch.&lt;/p&gt;
&lt;h2&gt;What the founder reviews&lt;/h2&gt;
&lt;p&gt;Nothing on this site goes public on an agent&#39;s say-so. But the first build
ran without a gate: requirements, plan and ten work items went through in
four hours, and the founder&#39;s verdict on the finished site was &amp;quot;a page from
the 90s&amp;quot;. The second build put our gate at the plan: we picked one of three
rendered directions, answered the plan&#39;s open questions and judged the
result on the preview next morning. We own the parts no agent can settle:
the wording about the company, the Swedish text, which private projects may
be mentioned and the steps that touch the domain and hosting.&lt;/p&gt;
&lt;h2&gt;The gates&lt;/h2&gt;
&lt;p&gt;One command runs every check, and the same command is set to run on each pull
request. It builds the site, checks that every internal link resolves,
validates the HTML, checks every page&#39;s structure — landmarks, one main
heading, a skip link, alt text — measures the contrast of every colour pair in
both schemes, confirms that every English page has a Swedish counterpart and
both sets of interface strings have the same keys, validates the feeds and
greps the output for the facts the pages must state. Each gate has a test
proving that it fails when something is deliberately broken.&lt;/p&gt;
&lt;h2&gt;Two honest observations&lt;/h2&gt;
&lt;p&gt;Most of what the agents wrote was not code: in the first build, 6,900 lines
of requirements, plans, summaries and reviews against 3,700 of site, gates
and tests. Precision in the documents mattered more than cleverness in the
code: the one fix the review required was a gate that hard-coded a
placeholder we are meant to replace.&lt;/p&gt;
&lt;p&gt;The gates catch mechanical mistakes, not untruths: a missing Swedish page or
a colour that fails contrast is caught automatically; whether a sentence
about a product is true is not. So the facts about the apps trace to a
source — the README each was taken from and the date it was read — and we
still read all of it. Agents also made mistakes: one session claimed a
bookkeeping record instead of its task and needed fourteen minutes to work
around it.&lt;/p&gt;
&lt;p&gt;The site is plain: static HTML and CSS, two small scripts (an appearance
toggle and a scroll-reveal effect; the page works without both), one
self-hosted typeface and no third-party requests or analytics. That was a
decision, and the part that matters — nothing loaded from anyone else&#39;s
servers — is verified by a gate on every build.&lt;/p&gt;
</content:encoded>
    </item>
  </channel>
</rss>
