A design has one renderer
The canvas in the browser and the PNG a design's address answers come from the
same code: the design engine lays the design out once and paints it into one
display list, which a GPU backend (vello) replays on the canvas and a CPU
backend (vello_cpu) replays as the PNG, with the same embedded typeface. A
backend only translates commands; it decides nothing about the drawing. Every surface shows the same area: the design's whole drawing, its root's box
plus anything painted outside it. Nothing else draws a design — not
the browser's own layout, SVG or HTML, and no painter of devpage's own for one
of the two.
Why
The PNG is what an agent checks its work against before a person sees it. If the PNG and the canvas come from different layouts or different paint code they drift — a line breaks differently, a shadow goes missing — and the agent approves a drawing the person never sees. One layout and one display list leave only the rasterizers' edge anti-aliasing to differ, which no reader can see.
Check
The server's PNG route and the WebAssembly module both call the
engine's one function that builds the display list, each backend is a
command-by-command translation, and neither draws anything else. Tests
paint the example designs with both backends and compare each with the
server's PNG by the engine's one rule (render::compare): a pixel is
unexplained when a channel lies more than 8 outside the range of the other
drawing's pixel and its eight neighbours — which is all an anti-aliased edge
can move. At most 0.05% of the pixels may be unexplained, and no cluster of
touching unexplained pixels may be larger than 4. A missing one-pixel divider
or a missing icon fails it; a test proves that on the checkout design.