Artist brief · v3.1 art ask · 2026-05-24

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.

passive → active
F1 – F4 · MUST 62 files · art PR first, code PR after F1 lands. F4 sleep path already wired. F5 · DEFERRED Turnarounds not started without explicit budget. art first, code second.

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.

CROP · LOCKED
World style guide with crop window overlay
origin (155, 15)
945 × 705 visible stage
remove bots from inside this rectangle only.
Full file1536 × 1024 (identical to v3)
Crop rectanglex:155  y:15  w:945  h:705
Chrome edgesright at x≈1100 · bottom at y≈720
Verify byoverlay at 100% — rooms must match
F1
World, no-bots variant clean stage for live sprites to land on.
1file
Code changeURL swap, separate PR

Acceptance

  • Pixel-identical canvas 1536 × 1024 to world-style-guide.png.
  • Crop x:155 y:15 w:945 h:705 overlays 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/world-style-guide.png — 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.

F2
Active speaking, all 20 residents renderer swaps to this when a bot speaks or is spoken to.
20files
Code changeNone — drop-in

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.

F3
Active walk frames, all 20 residents engine alternates walk-a ↔ walk-b every ~260ms.
40files
Code changeNone — drop-in

Acceptance

  • walk-a and walk-b are 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.

F4
Shared sleep pose generic body, no character hat or props.
1file
Code changeNone — already wired

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.

F5
Side & back poses · deferred do not begin without explicit budget approval.
120files
Code changeNone

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)

  • left and right are mirrored stances, not renamed duplicates.
  • back is 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

e9d4b3
c89568
6f8a4a
4f6b8a
6e4f7a
9c3a3a
b08a3a

SKIN ONLY · #e6c7a3

colors are locked. don't pick a new one.

08 Pre-delivery self-check run before you zip.

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)

  1. Art PR first. Drop F1–F4 at the exact paths.
  2. Run pnpm assets:check — expect 62/62.
  3. Hard-reload the dev server. F2/F3/F4 render immediately.
  4. Code PR second — one-line swap of WORLD_ILLUSTRATION_URL when F1 lands.

Never mix art and code in one PR.

10 Not asking (don't drift wide) out of scope.