ADR-009: Three sheets of four figures, rendered at 2K
Who is this for
Section titled “Who is this for”Developers and the owner — read this before changing SHEET_LAYOUT or the sheet resolution to save money.
SHEET_LAYOUT=3x4: three square sheets with four figures each (2×2), generated in parallel.- Sheets are 2K; single-figure regenerations and the anchor are 1K.
- Status: accepted.
2x6remains available as a setting.
Context
Section titled “Context”With two sheets of six figures the cells are small and figures often touch the sheet border or each other. Every such defect meant regenerating a sheet or a figure, which costs time and money. A sheet is also where most of the pack’s cost is.
Decision
Section titled “Decision”A live A/B run compared the two layouts on the same photo and two outfits, two runs each
(HANDOFF.md, consistency section,
item 10):
| Metric | 3x4 | 2x6 |
|---|---|---|
| Invalid sheets | 0 | 0 |
| Figures at the sheet edge | 9 | 20 |
| Visible edge cuts left in the pack | 0 | 2 |
| Regenerations | 9 | 16 |
| Average time per pack | 121.7 s | 126.5 s |
| Estimated cost per pack | about $0.325 | about $0.345 |
These times were measured on a laptop under load; server timings are lower — see Performance.
- 3x4 became the default. The sticker number equals the pose number; the mapping of poses to sheets lives in
bot/catalog.py. - Sheets stay at 2K. A 1K sheet has enough pixels on paper, but a live 1K render produced a green fringe between fingers and a stair-stepped contour. The saving would have been about $0.10 per pack.
- All image requests of a process share one semaphore,
AI_MAX_PARALLEL_IMAGES(default 9). A stress run of three packs at once — nine sheets in flight — produced no rate-limit answers.
Alternatives considered
Section titled “Alternatives considered”| Alternative | Why not |
|---|---|
| 2x6 (two sheets of six) | Twice as many figures at the edge and more regenerations. |
| 1K sheets | Visible quality loss at the edges for a small saving. |
| Twelve single images | About twelve 1K images instead of three 2K sheets: far more expensive and slower. |
Consequences
Section titled “Consequences”- A pack needs at least four image requests (anchor plus three sheets) in consistency mode, and three sheets must be cut at the same time, which sets the memory peak — see Capacity.
- The daily image quota is consumed at about 4.3–4.4 requests per pack (load test, COST_HISTORY.md).
Evidence
Section titled “Evidence”- Commits
21810a0,6ef2e1e;bot/config.py(sheet_layout,ai_max_parallel_images).
Where to go next
Section titled “Where to go next”Last verified: 2026-11-13 against ai-sticker-pack@b715418 and ai-stickers-landing@e350ff5.