Interface work sets the agent a task that does not exist in pure code: the result has to be seen. The browser can open the application, interact with it and return visual evidence. Canvas assembles an interactive artifact next to the conversation. And design mode inside the browser hands the agent the selected element together with a screenshot and component data. Three different ways to close the loop on observable state rather than on a retelling, and they differ in what the evidence is bound to: the live application, a separate artifact or a specific node of the markup.
The naive request sounds familiar: make the button prettier. It fails not because the model does not understand aesthetics but because there is neither a point of application nor a criterion in it. The agent has to guess which button is meant and what counts as better, and any reading it picks will be someone else's. Then begins a search through variants that costs more and takes longer than one precise formulation. Checking your own request is easy: if it cannot tell you which change counts as done and which does not, there will be nothing to judge the result by either.
Design mode closes exactly that hole. It hands over data rather than words: the path to the element, its attributes, computed styles, the component's props from the tree and the visual surroundings. You can select one element or several, outline an area on a frozen frame and add a spoken description. The difference is fundamental: the agent gets an exact address and the current state instead of a natural-language description where every word can be read two ways. The computed styles matter most here - they show what actually applied to the node after all inheritance and overrides, not what is written in the source file.
It helps to state the visual loop in full once, because a step is easy to skip in it. The development server is up, started by the project's reproducible command. An exact element or area is selected, not the whole page. The request describes a measurable state: spacing, alignment, overflow, contrast. Both a wide and a narrow viewport are checked. After the change a screenshot or a recording is taken. And the diff contains no accidental edits scattered across the whole design.
That last item of the loop is the most underestimated. Design changes spread easily: an edit to one component touches shared variables, and those touch half the interface. The mechanism is the usual one for design systems: a value looks local until it turns out that another dozen places refer to it. That is why a visual task ends not with a screenshot but with a look at the diff: it shows whether the change stayed local or you have just changed spacing across the entire application.
Canvas stands apart in this row, and its boundary is better understood in advance. It gives an interactive artifact next to the conversation - convenient for a quick look at a variant of a component, for comparing two approaches to a layout or for showing an idea to someone. But the artifact does not live inside the application: it has neither your application's environment nor its style variables. It answers the question of how this might look, not the question of how this will work in the project. Mixing those two questions is the fastest way to mistake a good sketch for a verified change.
The limit of visual evidence in general deserves separate understanding. A screenshot shows the state at one moment and in one viewport. It does not prove keyboard operation, does not check the semantics of the markup, says nothing about loading and error states and does not answer for accessibility. It is valuable evidence but narrow: a full interface check is made of interaction, automated checks and a deliberate look at the states a screenshot does not show.
There is a thoroughly prosaic way to fool yourself as well, familiar to anyone who has worked with hot reload. The screenshot shows the desired state, but the edit in the diff is a different one; or the other way round, the diff looks right while the screen shows the old picture. Both mean the same thing: the evidence is not bound to the change. The frame may have been captured before the reload, the server may have been serving the previous build and the browser a cached page. The sign is the mismatch between what is visible and what is written in the files, and the cure is not an argument with the agent but an honest reload and a fresh screenshot.
The engineering conclusion is simple: visual tools are good because they turn a vague better into a verifiable state. Their strength is not the pretty picture but the precision of addressing and the presence of evidence after the change. Everything else is ordinary discipline: a measurable criterion, a narrow scope, a look at the diff and an understanding of what the screenshot does not prove.
The typical failures in interface work are predictable. Asking for prettier without a point of application or a criterion. Checking only the wide screen and getting a broken narrow layout. Taking a screenshot for an acceptance test and skipping the keyboard, accessibility and error states. Confusing an artifact next to the conversation with a check in the real application. And not looking at the diff, only to find later that a local edit spread across the whole design.
The visual loop
[ ] the development server is up, started by the project's reproducible command
[ ] an exact element or area is selected, not the whole page
[ ] the request describes a measurable state: spacing, alignment, overflow, contrast
[ ] both a wide and a narrow viewport are checked
[ ] a screenshot or recording is taken after the change
[ ] the diff contains no accidental edits across the whole design