Hatch Pet v2 look-direction generation progressively shrinks later poses despite fixed-slot geometry and hard source validation
Summary
While upgrading a custom Codex pet to the v2 16-direction look system, the official coherent-row workflow repeatedly generates later look directions at a much smaller apparent size than the neutral pose.
The issue persists even after aligning generation and validation geometry, locking the camera/scale semantics, and using an explicit fixed 8-slot wide layout. The hard source-geometry preflight correctly rejects the bad rows, but the generation step itself still produces progressive shrinkage toward the later directions.
This looks like a generation/workflow limitation rather than a registration or validator bug.
Environment
- Platform: Windows 11
- Codex Desktop with custom pet / Hatch Pet workflow
- Custom v2 look-direction pipeline (11-row atlas)
- Generation row geometry: 2048x768
- 8 equal nominal slots: 256 px each
- Returned canvas mapping: proportional W/8
- Source rows must originate from one coherent 8-pose generation job
- No per-pose repair, scaling, or translation is permitted
Neutral geometry used
Generation and validation were aligned to the same effective-visible convention (alpha > 16).
Effective neutral geometry:
- visible width: 170 px
- visible height: 182 px
- planted baseline: 196
- lower-body center: 108.18307567127746
The same values are propagated into:
pet_request.json- row-9 prompt
- row-10 prompt
- all eight construction-guide envelopes
- all eight planted baselines / lower-body-center guides
Generation contract
The generation prompt and guide explicitly require:
- orthographic character turntable
- rotation in place only
- locked camera
- constant camera distance
- constant character scale
- constant ground plane
- fixed planted-foot baseline
- fixed lower-body center
- no depth scaling
- no perspective size change
- no zoom
- no forward/backward translation
- one pose per fixed nominal slot
- no crossing into adjacent slots
- no progressive shrinking toward 157.5° / 337.5°
The construction guide is 2048x768 with eight identical neutral-derived slot envelopes and chroma-only gutters.
Latest controlled row-9 result
One generation only; no retry. The hard preflight used a single shared prospective scale of 0.610384.
| Direction | Projected height | Baseline | Lower center | Inside nominal slot |
|---|---:|---:|---:|---|
| 000 | 156 | 196 | 108.062 | No |
| 022.5 | 158 | 196 | 108.508 | No |
| 045 | 160 | 196 | 107.645 | Yes |
| 067.5 | 158 | 196 | 107.859 | Yes |
| 090 | 163 | 196 | 108.538 | Yes |
| 112.5 | 137 | 196 | 107.466 | No |
| 135 | 137 | 196 | 107.954 | No |
| 157.5 | 135 | 196 | 108.145 | No |
Validator height range: 173–191 px.
All baselines and lower-body-center checks pass, but the generated poses are systematically too small and shrink severely in the later directions.
Adjacent continuity metrics
| Transition | Center shift | Area ratio | Result |
|---|---:|---:|---|
| 000 → 022.5 | 9.06 px | 1.063x | center fail |
| 022.5 → 045 | 18.53 px | 1.175x | center + area + gutter fail |
| 045 → 067.5 | 12.04 px | 1.134x | center fail |
| 067.5 → 090 | 6.96 px | 1.005x | pass |
| 090 → 112.5 | 13.00 px | 1.146x | center fail |
| 112.5 → 135 | 0.50 px | 1.001x | pass |
| 135 → 157.5 | 3.64 px | 1.018x | pass |
Several poses also cross their nominal W/8 slot boundaries.
Important observation
Baseline and lower-body-center consistency are now good. The persistent failure is mainly apparent scale drift in the generated artwork itself, especially at 112.5°, 135°, and 157.5°.
A global shared registration transform cannot fix this: increasing the smallest later pose enough to reach the minimum would make earlier poses too large. Per-pose normalization would violate the coherent-row/shared-scale constraints.
Safeguards already added locally
The local workflow now hard-blocks bad rows before assembly or installation. It checks:
- exactly 8 ordered isolated pose groups
- source slot/gutter containment
- one shared prospective registration scale
- projected height
- baseline
- lower-body center
- adjacent center shift
- adjacent apparent-area ratio
- projected edge safety
A failed row 9 blocks row 10 and installation.
The local Hatch Pet regression suite currently passes 50 tests, and validator/assembly behavior was intentionally left unchanged while generation-facing guidance was strengthened.
Expected behavior
A single coherent 8-pose look row should preserve neutral-matched apparent size across all directions while rotating in place, with no progressive shrinking or slot drift.
Actual behavior
The generated row repeatedly becomes smaller toward later angles, even with fixed-slot construction guides and explicit constant-camera/constant-scale constraints. The hard preflight rejects it, so no valid v2 candidate can be produced.
Questions
- Is there a known/recommended generation workflow for v2 look rows that reliably preserves constant apparent scale across 8 coherent directions?
- Is this a known limitation of the current image-generation step used by Hatch Pet / Codex pets?
- Are there recommended prompt patterns, canvas/aspect settings, or reference-image strategies that have produced stable 16-direction pets?
- Is there an official v2 Hatch Pet implementation newer than the currently published v1-oriented
openai/skillsversion? - If coherent source rows are required, is there any spec-compliant deterministic normalization stage intended for this exact scale-drift failure mode?
I can provide the preserved source-geometry JSON diagnostics and example generated strips if useful.