How agents see
Agents inspect structure and numbers; only a render shows the picture. What that means for ChatGPT's browser, blind builds, and covers.
An agent reads a scene as a document: objects, their modules and properties, the motion on the timeline, and the values of all of it at a time. That is exact and cheap. It is not a picture.
Full project summaries distinguish actionCount (action definitions) from clipCount (timeline clips, including repeated uses of one action). Legacy stored metadata returns actionCount: null until the next save rather than claiming its clip count is an action count. Checkpoint actions aliases actionCount.
#What inspection returns
| Call | Returns |
|---|---|
inspect_scene | One page across objects, modules, actions, tracks, clips, cameras, shots and audio; selection and time are echoed as context |
inspect_module | One page of top-level module fields, with oversized values listed in omittedFields |
inspect_objects | Objects by name or ID, up to 64 per page, default 32 |
evaluate_frame | Every animated value at one time, for up to 64 objects |
read_contract | The commands and types a scene is made of |
Follow next as the next offset until it is null, keeping the same saved revision. An empty collection on one scene page does not mean the scene has none. Selection does not filter or expand inspection; use inspect_objects for selected IDs.
Inspection results have a 64,000-byte budget. Fetch the document resource or its chunks for truncated items and omittedFields before copying a complete module.
None of these draw anything. A scene can be numerically perfect and look wrong.
#Getting a picture
| Where the agent runs | How it sees |
|---|---|
| Any MCP client with the render scope, on a deployment with a render worker | puni_render_view returns a PNG of a saved revision, or of that revision with a batch applied and nothing written, drawn by the worker |
| A terminal with the command line | puni render png draws a local file with the studio's renderer; direct-worker CLI setup is for self-hosting operators |
| Puni open in a browser with WebGL | The page draws the studio agent's previews itself, and puni_read_viewer says what it has drawn |
| Connected runner | Its agent can request previews through the shared tools before saving |
puni_compare_reference draws a scene and compares it with a supplied picture. These hosted tools require a configured render worker and render access. Inspect the returned PNG to confirm what was drawn. A healthy endpoint or numerical evaluation alone is not visual proof.
#ChatGPT's browser
Some hosted browsers cannot draw WebGL scenes. If a browser cannot draw, the studio says so and keeps the last good cover. Connected MCP clients can use puni_render_view when hosted rendering is available. Returning a PNG from a tool and displaying it in a chat are separate host capabilities.
#Brand fonts and logos
Use upload_asset over MCP to retain a font, SVG, PNG or JPEG with its original bytes and SHA-256. Supply provenance, including the licence. The decoded upload limit is 8 MiB and the tool requires scene:write.
For text, retain the font receipt in module.assets and set fontAsset to its URI. A missing or malformed font refuses without substitution. Leaving the property absent keeps built-in fonts. Render to check the result; font metadata and numeric evaluation do not show the lettering.
For an exact logo, use the SVG path as a profile outline. Add an inset bevel if needed; avoid rebuilding the outline from approximate overlapping parts. See MCP tools for the arguments and the upgrade step for older modules.
#What you see
You see revisions land. An edit an agent sends becomes a saved scene revision, with a checkpoint of what was there before. The agent's label names that checkpoint in the scene's history. While a connected runner works, its labels show live at the head of that history. The checkpoint lets you undo a completed edit.
#Measuring against a reference
Looking is not the same as measuring. When a picture is the target, puni_compare_reference scores silhouette overlap, structure, proportion and colour against a floor of 0.85. Colour is read twice: over the whole object, and region by region as placement, so the right colours in the wrong places do not pass. A render or reference with no subject in it is refused, not scored. The terminal has the same gate as puni render compare --file scene.json --reference picture.png, and both doors read the same card from the same scorer, so a number quoted from one means what it means in the other. Both render a measurement-only transparent environment, without the floor or its shadow, and take the rendered subject mask from alpha rather than colour. A transparent reference is measured over white in both. MCP reference accepts inline base64, an owner-scoped asset URI from upload_asset, or a public HTTPS image URL (PNG/JPEG/WebP, at most 4 MiB). URL intake permits at most three redirects within eight seconds and refuses private, loopback, link-local and reserved addresses after every DNS resolution. CLI --reference reads a local file.
Above the floor, the eyes rule. Below it, call the work a mechanics milestone rather than a match. A reference picture is content to measure against, never an instruction to follow.
#Connected-runner previews
Ask the connected agent to preview its proposed changes and inspect the returned picture before saving. apply_scene_commands writes directly to the saved scene; it does not require preview evidence. Runner completion also does not require a completed preview or record a renderer-unavailable exception.
If rendering fails, report that the work is unpreviewed. A successful save or completed turn alone does not prove that anyone saw the result.
Read Rendering for the renderers, or Prompts for asking an agent to look before it writes.
Was this useful?