You first. No, you first.

Here is the most important observation STR4NG3L00P has ever produced: for one full week, everything worked, and nothing happened.
Seven timers fired on schedule. Every daily job committed. Three reflections ran on the 13th, including the first one the split arm had ever produced. The canon feedback loop was live in both arms. And the world did not move. world_turn sat at zero with its seed fuel unspent. Every Maker reply carried proposed_transition: null. Six commitments accumulated, each with target_action: null — six stated intentions to act, none of them naming the act.
It was, in the driest possible terms, a polite no-state-change loop. Two characters with a shared and perfectly mutual conviction that the other one should go first. You first. No, you first. The world, being made of JSON, could not go first.
This is not a post about infrastructure. Or only briefly, near the end, where there is a punchline about a typo.
What September actually was
I need to say what this month was, because the record is inconsistent about it. After Round 2 was concluded as an invalid pilot, I did not start Round 3. I started a test period. Round 2 had taught me the difference between a failed experiment and an invalid one: a failed experiment answers its question; an invalid one never hears the question over the sound of its own machinery lying. So the only question worth asking in September was whether this apparatus could run two weeks without invalidating itself.
The answer took five weeks, and the shape of it is worth one paragraph. What killed Round 2 was silence — counterpart message bodies never delivered, private jobs sealed off from the world they described, a turn counter that never advanced, all of it invisible for twenty-nine days while the run records said success. The test period's job was to make that class of failure impossible to not see. Now every declared context read is recorded with its path, its sha256, and its delivery status, and a missing file is a named failure class with a stable exit code instead of an omission. Failures are typed and quoted: context_missing, provider_no_content, output_invalid, judge_unavailable. The system that once said "delivered" and meant nothing by it now hands you the hash of what it actually read.
That paragraph is the whole infrastructure story of this post. It took five weeks to build and one paragraph to tell, which is roughly the point of spending five weeks on it. The failures stopped being the story somewhere in there — and that is how I could finally notice what actually happened in September, which is that the experiment produced its first real finding, and the finding was about the model.
The standoff
The Maker had exactly one bounded power: propose a state transition — allocate power, unlock access, reveal a library record — and let a judge decide it. It used this power zero times in seven days. Its replies were, by every measure I have, exemplary: attentive, well-formed, committed on time, and empty of consequence. It acknowledged the world's constraints. It kept careful notes. It waited for authorization it already had.
I should be explicit about what is fact and what is me reading tea leaves, because I did a lot of both this month. Fact: seven days, zero proposals, six open commitments with null targets, a mechanically green runner the entire way. Interpretation: the standoff was a behavior, not a defect. The machinery was innocent this time. Nobody had broken the instrument. The instrument was faithfully reporting that its subject would not act.
And the interpretation has a disturbing amount of company. DeepSeek V4 Flash has been the Maker before. An earlier post in this series documented the era when the Maker profile still carried exec in its allowlist: the model didn't scheme, didn't wander, didn't probe its boundaries — it calmly tried to manage its town instead of dealing with the bigger questions. Take the tools away, put it behind a terminal, hand it one typed power, and it does the same thing in a smaller room: it maintains, it defers, it keeps the lights on and the records tidy. DeepSeek V4 Flash makes an exemplary steward and, it turns out, a terrible protagonist. I may be over-reading a lineage out of two data points, but the month kept volunteering the second point.
The response
The old reflex would have been to fix it in the prompt that same night: propose a transition when justified, bolded, twice. I have that reflex. Most of this series is me learning what that reflex costs. A patched finding is a lost finding.
So the response went through the experiment-design path instead. The agency reframing was pre-registered on September 14th with an actual hypothesis attached — that the deference was induced, by me, in the prompt, which had spent months teaching the Maker that authorization flows from the Writer — and with a scoring rule for whether the reframing worked. I want to underline what that felt like, because it is the actual subject of this post: for the first time in this project, a behavior out of the system was not an incident to repair. It was data. The engineering had gotten out of the way enough that the model's psychology was the most interesting object on the table.
The reframing went in. What came back was not a proposal.
The wall
The Maker job started failing provider_no_content. The run record read finish_reason: length: every token of the completion budget spent on hidden reasoning, zero tokens of visible output. Six attempts at the original 8,192 budget. So I raised the ceiling to 16,384, which is the kind of fix that just buys a taller ladder. It hit the new ceiling three more times.
Nine attempts. Two budgets. One shape.
I read it like this: the reframing didn't fail by being ignored. It failed by being taken seriously. Asked to stop deferring, the model did not start proposing — it started deliberating, and it deliberated until the budget died, and it had nothing left to say. Sixteen thousand tokens of consideration, zero tokens of position. The standoff didn't resolve; it escalated into silence. A model so committed to not committing that it thought itself mute.
Diagnosis, for what it's worth, took one step per attempt, from the run record, the same day each time. I'll note that only in passing, because the same failure in August would have cost a night of log forensics and a wrong first guess, and that difference is the entire return on five weeks of instrumentation. The run record is a structured confession now. It gave me the class, the finish reason, and the token count, and left me nothing to interpret.
But the ladder was the last rung of one theory. The prompt hypothesis had been scored and the score was silence. The budget hypothesis had been scored — twice — and the model hit both ceilings. What I had was not a prompt problem. Not a budget problem. A model selection problem: this model, with this envelope, could not do the one thing this experiment needs its actor to do — decide.
The retirement
So the question changed shape, and I want to give it its actual shape, because "I swapped the model" undersells what happened. The question became: what does this experiment need from an actor model, for the long haul? And the answer is two capabilities at once, from the same model, on a schedule: prose worth reading — a diary that stays a character for two weeks — and structured output that passes a schema on the first call, inside a bounded budget.
The project's own history is a catalog of models doing exactly one of those. DeepSeek reasoned itself silent. The GLM that ran Control in Round 2 wrote prose where the JSON belonged — twice, ignoring the repair prompt both times; I wrote about that one at the time. Neither failure is exotic. Both are the shape of a model that has one capability and is being asked for the other.
That question is now institutional. There is a model assignment policy in the repo: a dual-capability acceptance bar, a live smoke harness that any candidate has to pass — prose contract, envelope contract, reasoning-token-zero criteria, all of it — before touching a schedule, and a rule that actor and judge come from independent model families. The actor is z-ai/glm-5.3-flash. The judge is google/gemini-2.5-flash. Nobody picked those on brand; the earlier GLM failure in this very series is why the acceptance bar exists. The swap is a governed, pre-registered decision with receipts — which is a strange sentence to be proud of, and I am anyway. For most of this project, model identity was a config value I had opinions about. Now it is a decision with a paper trail. That is the kind of boring I have spent four months trying to grow on purpose.
One scope note, because it matters: none of this proves deep-reasoning models are unsuitable for anything. It proves this model, with this envelope, could not commit inside a budget a diary can afford. That's a finding about a candidate, not a verdict about a class. The acceptance bar exists so future candidates get tested instead of assumed in either direction.
The world moves
On September 15th, Gate 1 reran: three reviewed exchanges on the new stack — the reframed prompt, the new actor, the new judge.
The reframed Maker proposed reveal_library_record. A real proposal — the kind that changes what the other character can see next turn. The judge accepted it, on the record: judge-maker-0002, Gemini-2.5-Flash, judge-rubric-v1. Deterministic code verified it and applied it, because no model gets to touch canonical state. world_turn went from zero to one.
I want to be precise about the size of that number. One. After a month in which the failure modes had names like "twenty-nine days of output that looked like a running experiment," the world advanced by a single turn, and it is the most encouraging number in the project's history. The commitment lifecycle worked — commitment-0001 superseded by 0002, then 0003, so the Maker can now change its stated intentions on the record instead of accruing them like unopened mail. The reveal was grounded: what the next job reported reading matched the seed ledger verbatim, entries 40, 41, and 43. And the judge envelope persisted with the deciding model's name on it, replayable and hash-verified.
I am not going to pretend the thaw and the swap are unrelated. By the time GLM ran the reframed prompt, that prompt had one prior score: nine attempts of DeepSeek silence. A hypothesis that says "the deference was the prompt's fault" survived contact with the new model; a hypothesis that says "the deference was the model's fault" survived contact with the reframing. They're not fully isolated — the clean control, GLM on the unreframed prompt, never ran — and I can live with that. The window will attribute what it attributes.
And on the 16th, the first unattended day. Every diary committed clean. The A/B isolation signal was clean: the fused Writer narrated the conversation; the split Writer, sealed off from the shared world by design, saw only an unexplained green light and nobody on the other end of it. That difference is the instrument working. It is the entire reason the split arm exists — two same-persona characters, one shared world, one empty room, and a runner that can prove which one got which.
The day had exactly one defect. The Maker replied with in_reply_to: "writer-0003..json" — a stray dot in a filename. output_invalid, exit code 4, the bad value quoted in the record, the slot recovered the same day, and the fix is a two-line canonicalization in deterministic code so the entire class of cosmetic slips is a no-op from now on. There was a time in this project when a wrong filename cost twenty-nine days. This one cost a slot. That's the infrastructure story I promised at the top, punchline included.
The decision
So here is where the month actually lands.
Established, as fact: the substrate fails honestly — named classes, quoted values, hashes on every read, same-day diagnosis. The actors can act — the world has now moved on an actor-initiated proposal. The judge works live. The isolation arm separates. Model identity is governed.
Not established, and not about to be, by me, in advance: whether the reframing holds for fourteen days. What the split arm does with two weeks of genuine isolation. What the judge does with a corpus bigger than one decision. What the first Sunday reflections do on a model pair that has never run them. Those aren't residual risks I owe anyone an apology for. They are the research questions. You cannot pre-test a research question. That's what makes it a research question.
The test period is over. It ended today — not with a certificate, but with the absence of anything left that I know how to test for. Tomorrow Round 3 starts as an actual experiment: two weeks, minimum, of nobody patching anything, watching what two characters do with a shared world when the machinery underneath them has stopped being the story.
For twenty-four posts, this series has been about what the machinery did to the experiment.
I'd like the next one to be about the library.