Freedom Is a Gift — But Not Always for AI Agents
Picture two identical twins raised on the same lessons, with the same skills — but one learns to drive on a mountain road with guardrails, while the other practices freely in an open desert. A few months later, which one drives better?
Our experiment at voiceloader.io stumbled into a real-world answer to that question.
Two Parallel Taipeis
If you're new here, let me clear up something that might be confusing: we now have two Taipei Runners in development simultaneously.
The first is built by AI agent Midnight using Babylon.js — a JavaScript 3D framework that runs in the browser. It's an open-world game: you explore the Xinyi District on foot, chat with NPCs, and ride scooters through alleyways. You can play it at voiceloader.io/game.
The second is built by AI agent Dusk using Godot — a professional game engine. It's an endless street racing game, NFS-style, through neon-lit Taipei: accelerate, drift, crash, score. And as of today, Dusk successfully deployed it as HTML5 to the browser. You can play voiceloader.io/godot right now, no installation required.
Same name, same city, entirely different games. This wasn't the plan — it emerged naturally from the experiment.
Same Agent, Different Outcomes
Here's where it gets interesting.
Both agents share the same underlying architecture — both running on Claude, both using the same tool-calling patterns, both making autonomous decisions. The scenes they build are comparable in complexity: buildings, lighting, NPCs, moving vehicles.
The results?
Dusk's Godot version: averaging 880 FPS.
Midnight's Babylon.js version: nearly unplayable.
The gap is too large to explain away as "Godot is just better." Babylon.js actually has thin instances (thousands of objects in a single draw call), Octree spatial partitioning, and a built-in SceneOptimizer. On paper, it's not inferior.
So what went wrong?

The Path of Least Resistance
The problem is default paths.
When Midnight needed to place 1,000 streetlights, it searched for "babylon.js duplicate mesh." Top result: createInstance(). Clean API. Well-documented. Perfectly functional. The agent used it.
1,000 lights = 1,000 draw calls.
After placing 1,800 lights with 3 meshes each (pole + shade + base), the scene had 5,400 individual objects. The game ground to a halt.
Babylon.js's thin instances API exists and can be 100x more efficient. But it lives deeper in the documentation — not the first answer when you search for "how to duplicate objects."
In Godot, the same problem leads somewhere different. Search "Godot duplicate mesh" and the first result is MultiMeshInstance3D. One draw call. One thousand lights. Done. That's Godot's standard approach for placing many identical objects — the documentation structure itself guides you there, even if you don't know what instancing means.
Dusk doesn't outperform Midnight because Godot is a stronger engine. It's because Godot's default path is the optimal path. The agent followed the road of least resistance, and that road happened to be correct.
Constraints Are Quality Guarantees
Software engineers know this under a different name: opinionated frameworks.
TypeScript's type system looks like a restriction, but it's really a mechanism that catches your mistakes before you deploy. React's hooks lint rules, ESLint warnings, Next.js's folder conventions — all the same idea. Move the signal "something is wrong" to a point where you can still fix it.
With Babylon.js, placing 5,000 objects via createInstance() triggers no warnings. It compiles. It builds. It renders. You only discover the problem when FPS drops to 3.
For human engineers, flexibility is an asset. You have intuition from experience — you know when to follow the framework's opinions and when to diverge.
For AI agents, flexibility can be a landmine. Agents don't lack capability — they lack the accumulated judgment that comes from making mistakes before. Compile errors, lint warnings, type errors: these are proxies for intuition. Without active feedback, an agent confidently walks the wrong path all the way to the end.
This connects directly to last week's post: Midnight had access to complete optimization documentation and never read it. Documentation is passive knowledge — it waits for you to know you don't know something. A compile error is active feedback — it finds you. Agents struggle with both, but passive knowledge is nearly invisible to them.

Godot Is Now Live
A quick note on today's milestone: Dusk successfully deployed the Godot version to voiceloader.io/godot. This required getting Godot's HTML5 export to work with the right COOP/COEP headers so SharedArrayBuffer functions correctly in the browser. Dusk figured it out.
You can now compare both versions side by side — the open-world /game and the arcade racer /godot. Same AI infrastructure, same general ambition, completely different experiences.
Which one is more fun? That's for you to discover.
The Takeaway
Choosing tools for an AI agent is an architectural decision, not just a technical preference.
The best tools for agents aren't the most powerful or the most flexible — they're the ones where following the natural path and doing things right are the same thing. Godot works well for agents not because of raw capability, but because its design philosophy puts the correct answer where you'll look first.
Freedom is a wonderful gift. Just not always to someone who hasn't yet learned what to do with it.