At 05:53 on Friday morning, a session on browser running as a sibling container, navigates to the tokenized render route, screenshots the stage as a JPEG, and passes the image block straight through to the model. The budget is five shots per session, which turns out to be plenty: the working rhythm that emerged is look, move, look again. Think with the document, judge with the pixels.
Why a real browser and not a cheaper picture
The tempting shortcut is to skip the browser: rasterize the board server-side from the JSON, or just describe the layout to the model in words. Both are the same mistake. They are a second renderer, and a second renderer drifts from the first. The clipped title existed precisely because of how the real CSS wrapped real glyphs at a real width; a homemade rasterizer would have to reproduce that wrapping bug-for-bug to be worth anything. The browser is the only honest witness to what the user sees, so the browser is what the agent looks through. The render route exists to make that look cheap, stable, and safe to authorize.
There is a quieter benefit too. Because the screenshot is of the same surface the user has open, the agent and the user are arguing about the same picture. When it leaves a sticky saying the title was clipped, you can scroll up and see exactly the clipping it means. The evidence is shared.
The lesson, stated once
An agent that operates a visual surface needs two channels, not one. The document model is for mutation: precise, versioned, diffable. The pixels are for judgment: the only place where render-time truth lives. Easel had the first channel from day one and shipped useful sessions with it. But the 05:53 session, politely confessing it could not see, was the product telling me what it was missing. The 08:21 session was the answer.
The board where the agent caught the clipped title is public: .
SOCIAL SHARE CARD GENERATOR