v2 pet look-direction rows (9-10) never activate — pet does not look toward cursor (feature-gated?)
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
- Install a valid v2 pet under
~/.codex/pets/<id>/with:
pet.jsoncontaining"spriteVersionNumber": 2spritesheet.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)
- Select the pet, summon it via pet mode.
- Fully quit and relaunch the app (⌘Q) to rule out stale caching.
- 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 bundledhatch-petdeterministic validation. - Manifest:
pet.jsondeclaresspriteVersionNumber: 2and the correctspritesheetPath; 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-petskill, one installed vianpx 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 andspriteVersionNumberhandling code paths.
Questions
- Is the look-direction runtime currently behind a server-side feature gate (Statsig), similar to what was reported in #20706?
- 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?
- If it is not gated, what else does the runtime require beyond
spriteVersionNumber: 2and 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
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗