Idempotency
- Render is a pure function: same inputs, same bytes. Ids and timestamps never enter the pixel path.
- Server renders with
@sealpixel/renderare the same pure function. The renderer stores nothing and keeps no job cache, so a retry renders again and returns the same bytes. A host that caches results chooses its own key; op ids and timestamps do not belong in it, because they never change the pixels. - Client dispatch with an id already in the log is a no-op.
- Scripts and infrastructure in the repository run twice without changes: builds skip when inputs match, goldens rewrite only on change, the SST stack shows no diff on a second deploy.