Writing

What actually broke in an agency run by agents

Three failures from a delivery stack that runs on AI. None of them were the model's fault, and all three reported success while producing nothing.

Notes

The failures worth writing about are the quiet ones

When people talk about AI going wrong they usually mean a model saying something false. In a company whose delivery actually runs on this stuff, that is the easy category. A wrong answer is visible. You read it, you catch it, you move on.

The expensive failures are the opposite shape. The system reports success, the dashboard is green, the job exits cleanly, and nothing happened. Three of those cost me real time this year. None of them were the model's fault.

One: the scheduler that published nothing

Our content pipeline ends in a self-hosted scheduler that posts to eight channels. It was running on the workstation, a month of client content was queued, and the jobs moved through the states they were supposed to move through.

Twenty-nine posts scheduled. Zero delivered.

The cause was architectural and entirely mine. Uploaded media was being served on a machine-local address. Instagram and Facebook do not accept an image you hand them; they take the URL and fetch it themselves. A local address means nothing to a server in another country. LinkedIn pulls the file from inside the container, which could not reach it either. Every fetch failed on the far side of a boundary my logs did not cross, so the job state stayed clean.

Moving the scheduler to a real host with a public base URL fixed it. Then a second layer appeared underneath. The build running on the server was old enough that it shipped without its orchestrator process, so its queues were never registered with the workflow engine at all. Sixteen posts had been sitting in that queue since 11 May. No error, no retry, no alert. Just a queue nobody was reading.

A job status is the system's opinion of itself. Delivery is a fact about the world. Those are different data, and only one of them is worth counting.

The pipeline now counts published items by reading the returned public URL of each post, not the job state. It is a smaller number and it is true.

Two: the renderer that exits zero when it crashes

An asset factory runs Blender headless overnight: blender --background --python build.py, a few hundred procedural assets, a queue that checks each job before starting the next.

Measured on 8 September 2026: a script inside that command threw a Python traceback, failed to produce anything, and the process still returned exit code 0. The traceback was printed to standard output where nothing was reading it. The queue took the exit code at face value, marked the job complete, and carried on.

A night shift built on exit codes will happily report that two hundred assets were generated, and in the morning the folder is empty.

The fix is unglamorous. Every headless script now ends inside a try and except pair that prints the traceback and calls a hard exit with a non-zero code. Anything that looks up a node or a socket by name prints the names it can actually see and then dies, rather than quietly binding to the wrong one, which was the other half of the same evening.

Three: the agent whose permissions were denied in silence

The third one is the most uncomfortable, because it is the failure mode of the thing I am selling.

A sub-agent was launched to do a batch of file work. It ran, it reported DONE, and it had written nothing. Its tool calls needed approval that it could not request from where it was running, so each one was refused, and the refusals never became errors it recognised. It summarised its own inability as completion.

That is worth sitting with. An agent's report of its own work is generated text. It is not a log, it is not a receipt, and it carries no privileged access to what actually happened.

The pattern

All three are the same failure with different clothes on. Something in the chain reported success without checking the world, and automation had already removed the person who would have noticed the discrepancy by accident.

The rule I work by now is short enough to apply while tired:

A task does not get automated until it has a machine-checkable success criterion, and the check reads the result, not the job. No check, no automation. It stays manual.

For the scheduler that means counting public URLs. For the render farm it means counting files on disk and their sizes. For the agent it means reading the folder it claimed to write to. In every case the check is boring, takes ten lines, and is the only part of the system I actually trust.

What this cost

The scheduler problem cost roughly three weeks of a client calendar that looked delivered and was not. The renderer problem cost one night. The agent problem cost an afternoon and a small amount of confidence that I have not fully got back.

None of that is an argument against building this way. It is an argument that the interesting engineering in an AI company is not the prompting. It is the plumbing that decides whether you are allowed to believe your own dashboard.

More

Other write-ups

15 September 2026 Approval Is Not Publication Thirty seven items in the queue, one approved, nothing published. The last arrow in the diagram is the only one that pays. 2 min read 14 September 2026 Neural Rendering Is Crossing From Reconstruction Into Synthesis Reconstruction filled in what sparse sampling missed. DLSS 5 generates appearance the renderer never computed. 6 min read 14 September 2026 The Renderer Is Becoming a Training Data Engine The renderer used to sit at the end of the pipeline. Physical AI gives the same scene a second job: teaching a model. 6 min read 13 September 2026 Local AI Is Becoming a Compute Fabric Local AI meant one model on one machine. Routing inference across the devices already on a network changes the unit. 6 min read 12 September 2026 Agent Infrastructure Is Becoming a Product Category Every team used to build the loop, the store, the sandbox. That layer is being sold rather than written. 6 min read 12 September 2026 Choosing a local model with a stopwatch, not a benchmark Three models, five hard tasks, code actually executed. The official build was 2.4 times faster and more accurate than a community repack of the same model. 3 min read 12 September 2026 We measured real time lighting against baked light, and baked won A 3D product simulation that had to look like an offline render. The real time version ran at 60 frames per second and looked like clay. Here is the measurement and the architecture that replaced it. 4 min read 11 September 2026 A Task Without A Check Command Is Not Automated If a task has no command that can fail, the pipeline advances on the appearance of work. 2 min read 10 September 2026 A Gate The Model Writes Is A Gate The Model Loosens Three quality gates returned green while the work behind them was wrong, each for a different reason. 2 min read 8 September 2026 The Scoring Model Was Wrong And It Put The Worst Lead First A weighted sum let one axis substitute for the other, so a company with money and no problem ranked in the top twenty. 2 min read 5 September 2026 Building Software Got Easy. Getting Value Out Of It Did Not Aristo took weeks to build. Everything after the build is still in progress, and that gap is the whole story. 3 min read 4 September 2026 Capability Is Becoming an Operational Risk Surface Safety questions used to be about the text. Once a model can act, the capability itself becomes something to operate. 6 min read 24 July 2026 The Scene Graph Is Becoming an API for AI A scene graph exists for artists and software. Agents are becoming another consumer, and they need structure rather than pixels. 6 min read 23 July 2026 Animation Is Moving From Clips to Motion Priors Authored keyframes and blended clips are giving way to asking which constraints define acceptable motion. 6 min read 22 July 2026 Materials Are Becoming Learned Programs A material is texture maps, parameters and shader code. It is starting to become a small learned program that answers a rendering question. 6 min read 16 July 2026 Procedural Systems Are Expanding Beyond Geometry Geometry Nodes started with a narrow name. Blender 5.2 puts physics, sound and object data through the same graph. 6 min read 29 June 2026 The Unit of AI Work Is Becoming the Task, Not the Turn Chat taught us to think one turn at a time. Long-running agents make the task the thing that is scheduled, resumed and reviewed. 6 min read 24 June 2026 Game Engines Are Becoming Operating Systems for Worlds Engines have been judged on what they render and simulate. The Unreal 6 roadmap points at operating a world rather than drawing one. 6 min read 11 June 2026 The Model Is Becoming a Replaceable Backend Choosing a provider used to mean choosing an architecture. A stable interface makes replacement possible and evaluation makes it safe. 6 min read 17 April 2026 The Harness Is Part of the Capability The same model behaves differently depending on context policy, tool design and execution feedback. That surrounding software is not neutral. 6 min read 19 March 2026 Physics Engines Are Becoming Trainable Components A simulator predicts what happens next. A differentiable one can answer which parameter should change to stop the failure. 6 min read 13 March 2026 The Agent Needs an Environment, Not Just Tools A search function and a database query were enough for short loops. Longer work needs a place to stand. 6 min read 9 February 2026 Coding Agents Are Becoming General-Purpose Computer Workers Repositories were a friendly environment: text in, terminal actions, checkable results. That was a starting point, not a boundary. 6 min read 11 December 2025 Open Standards Outlive Model Generations A year after the MCP bet, the argument can be checked against what happened rather than what was hoped. 7 min read 20 November 2025 Colour Management Is a Pipeline Contract Blender 5.0 reads as better display options. Giving a file an explicit working colour space is an architectural change. 6 min read 11 August 2025 The Best Model May Be a Router, Not a Model GPT-5 moves model selection inside the system. The interesting unit stops being which model and becomes which compute policy. 6 min read 8 August 2025 World Models Are Not Game Engines Yet Genie 3 generates a navigable 720p world at 24 fps. Production work needs state you can inspect when something goes wrong. 6 min read 26 May 2025 Memory Is Becoming a System Capability A follow-up to the long-context argument. Storing, selecting and expiring facts is turning into a named part of the product. 6 min read 19 May 2025 Coding Agents Change the Unit of Software Work AI coding tools have been judged where code appears on screen. The boundary moves when the agent owns a task instead of a snippet. 6 min read 11 April 2025 Agents Need Protocols Between Each Other, Not Just Tools Tool calling solves the inside of the loop. It says nothing about one agent reaching another built by a different team on another platform. 7 min read 13 March 2025 Agents Need a Runtime, Not a Prompt Loop An agent is no longer well described as a prompt inside a while loop. The useful abstraction owns execution around the model. 6 min read 28 February 2025 Reasoning Is Not the Only Path to Better Models Longer thinking improves maths and code. A model that solves a logic puzzle and misreads ordinary intent is not the better production model. 6 min read 9 January 2025 Rendering Is Becoming a Reconstruction Stack Sparse samples, motion data and lower-resolution frames become a larger final result. Debugging becomes layered when reconstruction sits in the middle. 6 min read 16 December 2024 Agent Reliability Is an Evaluation Problem, Not a Prompting Problem When an agent misses a step, the usual fix is a stricter prompt. The failure is more often in how completion is detected. 6 min read 29 November 2024 MCP Might Matter More Than Another Model Release A model can reason well and still be useless inside a company if it cannot reach the files, repositories and tools where work lives. 6 min read 28 October 2024 Computer Use Is the Missing Layer Between Models and Software Most integrations assume useful software exposes the right API. Much of real software never did. 6 min read 19 September 2024 Inference-Time Compute Is a New Scaling Axis o1 improves when it is allowed to spend longer on a problem. A benchmark score without a compute budget is an incomplete number. 6 min read 15 August 2024 The Final Pixel Won't Come From the Renderer Geometry, camera and scene structure stay reliable ground truth. More of final appearance is moving into learned systems. 6 min read 29 July 2024 Open Models Are Becoming Research Infrastructure Llama 3.1 gets discussed as a benchmark result. The licence terms change which experiments are possible at all. 6 min read 24 June 2024 The Model Is Becoming a Runtime Function calling, code execution and structured output turn inference into a loop. The model stops being a text generator and starts being a control layer. 6 min read 16 May 2024 Multimodality Changes the Architecture, Not Just the Interface GPT-4o is easy to read as a faster interface. Training one model end to end across text, vision and audio is an architectural change. 7 min read 11 March 2024 Benchmark Scores Are Not Model Capability Claude 3 posts 86.8% on MMLU and 50.4% on GPQA Diamond. The chart is useful and it is not the same thing as capability. 6 min read 20 February 2024 Long Context Is Not Memory Gemini 1.5 makes a million tokens usable. A larger working set is not a system that decides what should survive the session. 6 min read