SIXTY-TWO&
NEW PIECES
A clean world, twenty mouths to open, forty walking legs,
and one shared nap.
Then we sleep.
Source of truth: NEXT_ART_ASK.md. This page is the operational read. If they disagree, the markdown wins.
→
01 The shopping list sixty-two PNGs, four families.
| ID | Family | Files | State | Canvas | Code change? | Scope |
|---|---|---|---|---|---|---|
| F1 | World, no-bots variant /assets/reference/world-no-bots.png |
1 | n/a | 1536 × 1024 | 1-line URL swap (separate PR) | Must |
| F2 | Active speaking <id>/active/speaking.png |
20 | Active · color | 256 × 310 | None | Must |
| F3 | Active walk cycle <id>/active/walk-a.png · walk-b.png |
40 | Active · color | 256 × 310 | None | Must |
| F4 | Shared sleeping _shared/sleeping.png |
1 | Passive · sepia | 256 × 310 | None (wired) | Must |
| F5 | Full turnaround set back · left · right × passive + active × 20 |
120 | Both | 256 × 310 | None | Deferred |
| v3.1 scope | 62 |
02 F1 · World illustration, no-bots variant remove the inked-in bots. keep everything else.
Acceptance
- Pixel-identical canvas 1536 × 1024 to
world-style-guide.png. - Crop
x:155 y:15 w:945 h:705overlays exactly — rooms, paths, props, rooflines unchanged. - All inked-in bot figures inside the crop are gone. Desks, props, "where they stood" floor markings stay.
- No new bots, props, or annotations introduced.
- No erase halos — paper tone holds inside the crop.
Spec
- Path/assets/reference/
world-no-bots.png - Canvas1536 × 1024
- FormatPNG, sRGB
- Backgroundopaque paper
- Cropx:155 y:15 w:945 h:705
Reference
public/assets/reference/ — anchor on this and only this. Open both at 100% side-by-side to verify.
Shifting layout inside the crop forces a world.json retune. Don't.
03 F2 · Active speaking poses twenty open mouths. one per resident.
Acceptance
- Same character, same palette, same hat, same accent, same props as that resident's
active/front.png. - Mouth clearly open. Subtle speaking gesture (raised hand, head tilt) welcome but not required.
- Silhouette reads at 32px height.
- Feet pivot on the same bottom-center pixel as
front.png. - No speech-bubble graphic baked into the PNG — engine overlays it.
Spec
- Path/assets/residents/
<id>/active/speaking.png - Canvas256 × 310
- FormatPNG RGBA, sRGB
- Backgroundtransparent
- Stateactive (color)
- Pivotfeet-center, bottom
Reference
Each resident's existing active/front.png. Color-pick the accent before painting; do not reinterpret.
Passive bots do not speak in v3.1 — passive speaking.png is not requested.
04 F3 · Active walk cycle two frames, opposite legs, no bounce.
Acceptance
walk-aandwalk-bare alternating gait frames of the same character. Same hat, accent, props.- Opposite legs forward in A vs B; opposite arms swinging.
- Pivot stays on feet-center bottom edge in both frames. If a foot lifts, the standing foot is the pivot.
- No vertical bounce between frames — the engine handles bob.
- Forward-facing (south) gait. Side/back are F5 (deferred).
Spec
- Path A<id>/active/walk-a.png
- Path B<id>/active/walk-b.png
- Canvas256 × 310
- Backgroundtransparent
- Stateactive (color)
- Namingkebab-case · case-sensitive
TS enum: walkA/walkB. On disk: walk-a.png/walk-b.png via POSE_FILE_STEM.
Reference
Each resident's active/front.png.
Passive walk frames are not requested — the wander runtime only animates the bot the user is watching, which is active by definition.
05 F4 · Universal sleeping pose one file. shared by all twenty.
Acceptance
- Reads as "asleep at desk" — slumped forward, eyes shut or
Zz, head onto a small implied surface in front. No bed. - Monochrome sepia ink only. No accent colors.
- Pivot on feet-center bottom edge so day↔night swap doesn't jump.
- Generic body — strip hats, props, per-character accessories. Works for any resident.
Spec
- Path/assets/residents/
_shared/sleeping.png - Canvas256 × 310
- Backgroundtransparent
- Statepassive (sepia)
- Pivotfeet-center, bottom
Reference
Any existing passive/front.png for ink weight and sepia tone.
Renderer already resolves every sleeping lookup to _shared/sleeping.png via residentAssetUrl() — drop the file, done.
06 F5 · Turnarounds stretch. do not start.
What it would unlock
Wander runtime already emits facing: 'N' | 'S' | 'E' | 'W'. Side/back PNGs let residents face the direction they walk. Today everyone faces south.
Nice-to-have. Not v3.1.
If approved (future)
- Filesback · left · right
- Statespassive + active
- Per resident6 files × 20 = 120
Key rules (for later)
leftandrightare mirrored stances, not renamed duplicates.backis a true rear view — no face.- Accent stays exact across all four directions.
07 Inherited rules (from v3 resident guide) the part nobody re-reads. read it.
Figure rules
- Hand-drawn ink & paper. Closed shapes, soft outlines, slight wobble.
- Proportions: 45% head · 30% torso · 25% legs.
- Cute first, geometric never. Corners always rounded.
- Skin is warm beige
#e6c7a3. Never tinted. - One accent color per resident — locked by v3.
What stays off the sprite
- Drop shadow — engine adds it. Don't bake one in.
- Speech bubble — engine overlays it.
- Alert badge, focus ring, path dashes — all engine.
- Paper grain & ink specks — those live on the page background, not the sprite.
- Selection halo — engine swap, not art.
Active palette
SKIN ONLY · #e6c7a3
colors are locked. don't pick a new one.
08 Pre-delivery self-check run before you zip.
- At 32px height, every figure has a clear, distinguishable silhouette.
- No baked drop shadow under any figure — engine adds it.
- No baked speech bubble, alert badge, focus ring, or path dashes.
- Filenames match §3 paths exactly, case-sensitive.
- Canvas
256 × 310 RGBA, transparent background. (file foo.pngconfirms.) - Pivot: dropping the new file on
front.pnglands feet on the same y-coordinate. - Active poses re-use the exact accent from that resident's
active/front.png. - Passive sprites are sepia only — no color accents slipped in.
- F1 no-bots world overlays x:155 y:15 w:945 h:705 on the v3 file pixel-for-pixel.
- F4 shared
sleeping.pngreads as "asleep" with no character hat or prop.
09 Automated gate the build will tell on you.
The check
pnpm assets:check
Lists every expected F1–F4 path vs. what's on disk. Pass = 62/62 present, exit code 0.
Any ✗ line is a missing or misnamed file. Fix the spelling/casing, re-run.
Landing order (project lead)
- Art PR first. Drop F1–F4 at the exact paths.
- Run
pnpm assets:check— expect 62/62. - Hard-reload the dev server. F2/F3/F4 render immediately.
- Code PR second — one-line swap of
WORLD_ILLUSTRATION_URLwhen F1 lands.
Never mix art and code in one PR.
10 Not asking (don't drift wide) out of scope.
- Per-room interior scenesworld is one approved illustration
- GIFs, APNGs, sprite sheetsengine swaps individual PNGs
- New residentscast locked at 20
- New props / icons / glyphslegend symbols are inline SVG
- UI chrome, HUD, panelsCSS + tokens from lookbook.css
- Selection rings / alert badges / halosengine overlays
- Day-tint variants of the worldCSS overlays on the same PNG
- Re-skins of existing residentsaccents locked by v3