The sinews post described an experiment that had just started: whether an architecture that keeps data off the control flow keeps an AI agent from piling complexity into a few places. Its first run has now been going for a little over two weeks. This is a progress report, not a results post. It says how far the run has got, what went wrong along the way, and when it should finish. It deliberately says nothing about how either stack is doing.
The results of this experiment are meant to be read once, over complete runs, with the tests registered before the data. Looking at trajectories halfway through is how an experimenter starts nudging an experiment, even without meaning to. So this post only uses what the run's operation shows: which checkpoint each chain has reached, the logs of the waits and the restarts, and how long the queue of tests is. The correctness, cost and structure of the code are left alone until the end.
What is running
This is Run A of three: the two stacks as they were built, side by side. A later run crosses the front ends and back ends, and a third adds a control stack with no injection of any kind.
| what | Run A |
|---|---|
| stacks | Angular on Spring (dependency injection, halfway) and TanStack on OfficeFloor (function injection, additive) |
| change requests | 250 per chain, in five acts of fifty, every fourth one changing behaviour that already exists |
| chains | 10 per stack, one after another, each starting from the same almost empty application |
| agent | Claude Opus 5.5, a fresh session for every request, shown only that request's own test |
| condition | just-solve: the bare change request, with no structural guidance or grading |
| tests | each request's own test after every checkpoint; the full suite of every test so far after every tenth checkpoint and the last |
| size of the job | 2,500 agent checkpoints and 2,510 test jobs per stack |
| started | 27 October 2026, just after midnight Perth time, both stacks within a second of each other |
The plan was for two laptops, one per stack. In practice both stacks, each with its own test processor, run on one laptop. Each run has its own working directory, test queue and ports, so they do not interfere with each other. They do compete for the same CPU, and that matters for how long the testing takes, as described below.
Before it started: the stream's own bugs
Every expected value in every test comes from a reference model of the application, and three generated two-user scenarios sit beside each request's story. A thousand tests by the end means a thousand chances for the model, the test generator or a test helper to be wrong. So before Run A, the stream was calibrated on both stacks twice.
The rule for telling the stream's bugs from the agent's was simple. Two different agents building two different stacks will not make the same mistake at the same step of the same scenario. If both stacks fail a test in the same way, the stream is wrong.
- First calibration (one chain per stack). From checkpoint 86 both stacks failed the same generated scenarios at the same steps. The causes were in the model: a date worked out in calendar days instead of business days, and identities kept as positions, which were reused after a merge or a transfer. Twenty-two requests were also reworded to say rules the model had been applying without stating them.
- Second calibration (two chains per stack). About seventy tests failed in common or across chains. Each one was replayed through the model and read against its request. About fifty-five turned out to be the stream's, from eighteen causes, and each was fixed where it lived.
No rule was weakened to make a test pass. The second set of fixes was committed on 26 October, the night before Run A started, and nothing has been committed to the harness or the stream since. A fault found during a run is fixed after the run, for the next one. A running stream does not change.
Where it has got to
As of the evening of 12 November:
| Angular / Spring | TanStack / OfficeFloor | |
|---|---|---|
| chains finished by the agent | 7 of 10 | 6 of 10 |
| agent working on | chain 8, request 14 | chain 7, request 114 |
| checkpoints committed | 1,763 of 2,500 (71%) | 1,613 of 2,500 (65%) |
| tests running on | chain 6, full suite at request 240 | chain 6, request 85 |
| test jobs done | 1,494 of 2,510 (60%), 276 waiting | 1,339 of 2,510 (53%), 279 waiting |
Every agent session so far has finished. None of the 3,376 has ended in failure, and none had to be cut short and gated on its partial work. No test job has errored either. A test job that fails some of its tests is still a job that ran, and those numbers are what this post leaves out.
The gap between the two stacks should not be read as a result. Wall-clock time on a shared laptop mixes the agent's own work with whatever else the machine was doing. The agents' cost, turns and time will be compared properly, over complete chains, at the end.
What happened along the way
The run is designed not to stop for anything a person can fix later. If the usage limit is hit, a token is rejected, the API fails or the network drops, the agent turn waits and tries again, indefinitely. The test queue is on disk, so a test job that dies is simply run again. Both of those were tested for real.
| when (Perth time) | what happened | effect |
|---|---|---|
| 27 Oct 00:03 | Both stacks start chain 1. | |
| 27 Oct 10:24 to 29 Oct afternoon | Usage limit reached. Both stacks share one account, so both waited, retrying every half hour (107 times each). | About 53 hours of waiting. That is why chain 1 took about 80 hours on both stacks, against 26 to 37 hours for every chain since. |
| 4 Nov 01:58 | Weekly usage limit reached. | Both agents waited again, 49 retries each. The test processors kept working through the backlog. |
| 5 Nov 02:26 | The laptop's battery ran out. | Everything stopped. Both agents were idle, waiting on the limit, so no agent work was cut off. Both test processors were partway through a full suite. |
| 10 Nov 13:38 | Both runs resumed with the same run ids. | Each chain continued from its last committed checkpoint. Each test processor found the job its predecessor had died in and ran it again from the beginning. Nothing was lost, apart from five and a half days. |
| 10 Nov onward | Running without a stop since the resume. | The weekly limit had reset, so neither agent has had to wait again. |
The resume was one command per stack, naming the same run and repository as before. It refuses a different repository, so a resumed run cannot quietly continue on the wrong stack. Its first lines in the log are a check worth showing. For every chain already finished it reports that checkpoints 1 to 250 are committed and leaves the branch alone. For the chain that was cut off, it names the checkpoint it is continuing from.
Smaller things the logs show, none of which needed anyone to step in:
- One agent process crashed: its JavaScript runtime died with a segmentation fault partway through a turn. The harness treated it as a transient error, waited a minute, and ran the turn again.
- One of the probes the harness runs to record what the agent touched timed out after fifteen minutes and was skipped. The checkpoint itself was not affected.
- One agent found its usual port still in use by an earlier application, started its own test run on another port, and carried on.
- One agent tried to write a log to
/tmp, which its sandbox does not allow, and wrote it into its own task directory instead. The sandbox exists so the agent can never see a future test, and it held.
The long pole is testing, not the agent
The tests run beside the agent, not in its way. After every checkpoint the agent's commit is queued for testing and the next request starts straight away. A separate processor works through the queue in order, on a port of its own, with each job's tests fixed at the version of the harness it was queued under.
The plan budgeted about 45 minutes for the full suite at request 250, which is about a thousand tests. With two agents and two test processors sharing one laptop, it is closer to three hours. Full suites run every tenth request and grow with the application, so they take most of a chain's testing time. A whole chain has kept its test processor busy for 34 to 44 hours, while the agent finishes a chain in 26 to 37. So every chain the agent finishes adds to the backlog, which has grown since the resume to about 275 jobs per stack.
This affects only when the results arrive, not what they are. A chain's results are committed to its branch once its last test has run, and the order in which tests run cannot change their outcome.
When it should finish
These estimates use the rates of the chains finished since the first usage-limit stall, and assume no further stops:
| agent finishes | last test finishes | |
|---|---|---|
| Angular / Spring | about Monday 16 November | about Wednesday 18 November |
| TanStack / OfficeFloor | about Tuesday 17 November | about Friday 20 November |
Another usage-limit stall would push the agent dates back but barely move the test dates, because the test processors keep working while the agents wait. Another flat battery would push both back. Then the analysis runs over every checkpoint of every chain, and that will be the next post with numbers in it.
What this post leaves out, on purpose
Nothing here says whether either stack is passing its tests, what the agent is spending, or what is happening to the structure of the code. The runs record all of it at every checkpoint: the agent's whole session and diff, its cost and turns, every test's result, and every structure measure. All of it will be read together once both runs are complete, and compared chain against chain, ten a side. A run that is two-thirds done could be read as an early answer, and that is the reason not to read it yet.