Why image generation kept giving us squares, and how we made it cool
Every hero image for our first publishing wave came out a perfect square. We wanted wide 16:9 banners. We got 1024x1024 tiles, every time, no matter what we passed. The cause was almost insultingly small: the image model, fal-ai/nano-banana-pro, silently ignores the image_size parameter we were setting. It wants aspect_ratio and resolution instead. Set those, and the squares become banners. That is the whole bug.
It would be easy to file this under “annoying API quirk, now documented” and move on. That is the cheap version of the lesson. The real one is about working with AI image generation, and with AI tools in general, like an adult.
We skipped the part that was our job
Here is what actually happened. We reached for an image model, passed the parameter that sounded right, and assumed the tool would do the obvious thing. It did not. A silently dropped parameter is the worst failure mode an API has, because nothing errors. You get a confident, wrong result and no signal that you asked for the impossible. Every square came back looking deliberate.
But the tool was not the one that failed first. We were. We wired the thing in without doing the part that was ours to do: understand what we were trying to accomplish, then design how to get there. We assumed the AI would cover for a gap in our own understanding. It will not, and it should not. That is the trap, and the square images were only the symptom.
A design partner, not a deliverer
The framing we landed on is the one worth keeping. AI is a great design partner. It is not your deliverer. You stay responsible for understanding the problem and designing the solution. The model is the tool you build that solution with, not the place you outsource the thinking to.
When you respect that line, the image model is excellent: describe the frame you have already decided you want, and it renders it. When you cross it, when you expect the model to figure out the goal you never defined, you get trap doors like this one. The square image is what skipping the design step looks like in pixels.
This is the same lesson the clickable mockup taught us in a different medium, which we wrote about in a clickable mockup in an afternoon: the tool is fast and cheap, but only after a human has decided what question it is answering. The speed is real. It does not replace the deciding.
The fix that generalizes
The fix is not “memorize every API’s quirks.” That game is unwinnable, and the next model will have different ones. The fix is to understand what you are building, design the solution, and then partner with the model to produce it. And when a model surprises you, write the surprise down where the next person, or the next agent, will read it before they hit the same wall.
So the aspect_ratio and resolution rule for this model now lives as a params card inside the chronicle skill itself, next to the code that calls the model. The next hero gets generated correctly because the understanding is captured, not because anyone remembered. Documenting the decision is how you keep a one-afternoon trap from becoming a recurring one. You can see how that skill threads through everything we publish in how the Chronicler works.
The square images were a small bug. The habit underneath them, expecting the AI to deliver an outcome we had not designed, is the expensive one. Catch that habit and most of your AI trap doors close on their own.
For agents: try this yourself
If you wire AI tools into a product, adapt one of these. Full prompt text lives in this post’s prompts sidecar, the-square-image-trap.prompts.md.
- Reproduce the silent-param check. For any model call, list every parameter you pass, then verify against the model’s actual schema which ones it honors. Flag any you set that it silently ignores.
- Apply the design-first rule. Before calling an AI tool, write down the outcome you have already decided you want. If you cannot state it, you are asking the model to do your design work, and it will not.
- Critique an integration for outsourced thinking. Look at one place you call an AI model and ask: did I define the goal, or am I hoping the model infers it? Mark every spot where the second is true.
How this was made
Drafted by the Chronicler from the build sessions behind our first publishing wave, then edited and published by Brian Wones.
See how the Chronicler works →