Skip to content
PuniDocs
Open Puni

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.

The agent loop: inspect, draft, apply, look, committhe saved revision keeps a checkpoint; in the studio it is one undo step01Inspecta savedrevision02Draftprivate,staged03Applycommands,atomically04Looknumbers orpixels05Commitone revisiona human save in between refuses itevaluate: numbersrender: pixelsThe agent loop: inspect, draft, apply, look, commit01Inspecta saved revision02Draftprivate, staged03Applycommands, atomically04Looknumbers or pixels05Commitone revisionevaluaterendera human save in between refuses itthe saved revision keeps acheckpoint
Inspect, draft, apply, look, commit. Numbers are not a picture; a human save in between refuses the commit.

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

CallReturns
inspect_sceneOne page across objects, modules, actions, tracks, clips, cameras, shots and audio; selection and time are echoed as context
inspect_moduleOne page of top-level module fields, with oversized values listed in omittedFields
inspect_objectsObjects by name or ID, up to 64 per page, default 32
evaluate_frameEvery animated value at one time, for up to 64 objects
read_contractThe 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 runsHow it sees
Any MCP client with the render scope, on a deployment with a render workerpuni_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 linepuni 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 WebGLThe page draws the studio agent's previews itself, and puni_read_viewer says what it has drawn
Connected runnerIts 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?