v2 pet look-direction rows (9-10) never activate — pet does not look toward cursor (feature-gated?)

Open 💬 1 comment Opened Jul 19, 2026 by feifeifeifeifeifeifei

Summary

Valid spriteVersionNumber: 2 pets (8×11 atlas with the 16 look-direction cells in rows 9–10) render and animate correctly for all 9 standard states, but the look-direction behavior never activates — the pet never turns its head toward the cursor. Rows 9–10 appear to be completely unused at runtime.

Possibly related to #20706 (pet/avatar overlay feature gate blocked) — this looks like it could be the same server-side gating, but for the look-direction runtime specifically rather than the overlay itself.

Environment

  • Desktop app: ChatGPT.app for macOS, build 26.715.31925 (prod flavor)
  • Codex CLI: 0.145.0-alpha.18 (originator: Codex Desktop / vscode source)
  • OS: macOS 15 (Darwin 24.6.0), Apple Silicon
  • Plan: ChatGPT account login (auth_mode = chatgpt)
  • Pets: custom pets installed under ~/.codex/pets/<id>/ per the v2 pet contract

Steps to reproduce

  1. Install a valid v2 pet under ~/.codex/pets/<id>/ with:
  • pet.json containing "spriteVersionNumber": 2
  • spritesheet.webp, 1536×2288 RGBA, 8 columns × 11 rows (192×208 cells)
  • rows 0–8 = standard states, rows 9–10 = the 16 clockwise look directions (000° = up)
  1. Select the pet, summon it via pet mode.
  2. Fully quit and relaunch the app (⌘Q) to rule out stale caching.
  3. Move the cursor slowly around / near the pet.

Expected

Per the v2 contract shipped with the bundled hatch-pet skill (references/codex-pet-contract.md): rows 9–10 provide a 16-direction look loop; neutral/front is the pointer deadzone falling back to idle. The pet should glance toward the cursor.

Actual

  • All row 0–8 animations play normally (idle, running, waving, jumping, failed, waiting, review).
  • The pet never enters any look-direction pose. Rows 9–10 are never sampled, regardless of cursor position or proximity.
  • No errors in the desktop logs; the avatar overlay window is created and visible (rendererWindowAppearance=avatarOverlay, rendererWindowVisible=true).

What I verified before filing

  • Atlas validity: 1536×2288, 8×11 grid, mode=RGBA, transparent background, zero RGB residue under fully transparent pixels; passes the bundled hatch-pet deterministic validation.
  • Manifest: pet.json declares spriteVersionNumber: 2 and the correct spritesheetPath; the 2288-px sheet is accepted (a v1-declared sheet of this height is rejected, so the version field is definitely being read).
  • Reproduces with multiple pets: two independent, fully valid v2 pets (one upgraded from v1 via the hatch-pet skill, one installed via npx codex-pets add) show identical behavior — standard rows fine, look rows never used.
  • Not a permissions issue: the overlay reads the cursor via Electron's screen.getCursorScreenPoint() (no Accessibility permission required), and the app bundle does contain the cursor-tracking and spriteVersionNumber handling code paths.

Questions

  1. Is the look-direction runtime currently behind a server-side feature gate (Statsig), similar to what was reported in #20706?
  2. If so, is there a rollout timeline, a minimum app build, or any user-visible way to tell whether the feature is enabled for an account/build?
  3. If it is not gated, what else does the runtime require beyond spriteVersionNumber: 2 and a valid 8×11 atlas?

Happy to provide the full validation JSON, sample atlas, or logs if useful. Thanks — the pets feature is genuinely delightful, looking forward to the head-turning part

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗