Анимированный питомец для Codex
Создаёт анимированного питомца для Codex по концепции, бренду или картинкам: рисует позы, собирает спрайт-лист, проверяет качество и упаковывает в pet.json.
- Что делает
- Создаёт анимированного питомца для Codex по концепции, бренду или картинкам: рисует позы, собирает спрайт-лист, проверяет качество и упаковывает в pet.json.
- Когда брать
- Когда нужен свой питомец Codex в любом стиле, талисман компании или потенциального клиента либо полный анимированный атлас питомца.
- Когда не брать
- Если нужна одна картинка, а не набор поз для анимации питомца.
- Пример запроса
- Сделай анимированного питомца для Codex в виде плюшевой лисы в фирменных цветах нашей компании.
- Нужно подключить
- Codex, системный скилл imagegen, терминал, Python, jq
- Работает лучше с
- веб-поиск для изучения бренда
Как включить
- Скачайте архив и распакуйте его.
- Положите папку
hatch-petв~/.agents/skills/. - Вызовите скилл командой
$hatch-petили найдите его через/skills.
Текст
---
name: hatch-pet
description: Создавай, чини, проверяй, визуально контролируй и упаковывай совместимых с Codex анимированных питомцев и их спрайт-листы по рисунку персонажа, сгенерированным изображениям, фирменным признакам компании или потенциального клиента либо визуальным референсам. Используй, когда пользователю нужен рабочий процесс питомца Codex на лёгких исполнителях, нестандартный непиксельный стиль питомца, питомец-талисман компании или потенциального клиента либо полный анимированный атлас питомца 8x9 с прозрачными неиспользуемыми ячейками, контактными листами для проверки и упаковкой в pet.json. Этот скилл опирается на установленный системный скилл $imagegen для генерации изображений и использует входящие в комплект скрипты для детерминированной сборки спрайт-листа.
---
Вылупление питомца
Обзор
Создай совместимого с Codex анимированного питомца по концепции, фирменному признаку, названию компании или потенциального клиента, одному или нескольким референсным изображениям или любой их комбинации. Этот процесс сохраняет детерминированный конвейер hatch-pet для геометрии атласа, проверки, визуального контроля и упаковки, но использует краткие промты под каждое состояние и допускает любой визуальный стиль, безопасный для питомца.
Входные данные от пользователя необязательны. Если пользователь не указал имя питомца, выведи его из концепции, бренда, компании или имён файлов референсов; если это невозможно, выбери короткое дружелюбное имя. Если пользователь не дал описания, выведи его из концепции или референсов. Если референсных изображений нет, сначала сгенерируй базового питомца по тексту, а затем используй его как канонический референс для каждой строки анимации.
Делегирование генерации
Для всей обычной визуальной генерации используй $imagegen.
Прежде чем генерировать базовое изображение, полосы строк или строки-исправления, загрузи и выполняй установленный скилл генерации изображений:
${CODEX_HOME:-$HOME/.codex}/skills/.system/imagegen/SKILL.md
Не обращайся напрямую к Image API, CLI изображений или любому другому пути генерации изображений. Пусть $imagegen сам выбирает свой путь (сначала встроенный) и правила запасных вариантов. Если $imagegen сообщает, что запасной вариант требует подтверждения, спроси пользователя, прежде чем продолжать.
При вызове $imagegen передавай сгенерированный промт питомца как авторитетную визуальную спецификацию. Промты питомца должны оставаться краткими, привязанными к состоянию, ориентированными на производство спрайтов и опираться на перечисленные входные изображения. Более длинные правила и проверки качества держи в этом скилле и в детерминированных скриптах проверки, а не раздувай ими каждый промт для изображения. Не оборачивай промты в общую схему промтов $imagegen.
Скрипты этого скилла используй только для детерминированной работы с изображениями: подготовки направляющих раскладки и промтов, зеркального отражения одобренной строки running-left, извлечения кадров, проверки строк, сборки итогового атласа и создания контактных листов и превью движения для контроля качества. Шаги с оболочкой и jq на стороне родительского агента отвечают за обновление манифеста, упаковку и очистку.
Контроль хранилища
Встроенный путь $imagegen сохраняет байты сгенерированных PNG в журнале запуска (rollout), который его вызвал, даже когда он также записывает файл в ${CODEX_HOME:-$HOME/.codex}/generated_images. Последующее удаление файлов уменьшает использование файловой системы, но не уменьшает уже записанный журнал. Держи генерацию изображений изолированной и ограниченной:
- Используй одного лёгкого исполнителя генерации на одну визуальную задачу. Не объединяй несколько задач базового изображения или строк в одного исполнителя.
- Исполнители должны возвращать только
selected_source=...иqa_note=...; они не должны включать в финальный ответ превью изображений в Markdown, base64 или дополнительные визуальные вложения. - Родитель не должен визуально открывать каждый сгенерированный PNG. Используй контроль качества исполнителя по каждой задаче и осматривай только итоговый контактный лист.
- После копирования выбранного сгенерированного результата в
decoded/удали выбранный оригинал из${CODEX_HOME:-$HOME/.codex}/generated_images, если он лежит там, а затем по возможности удали ставший пустым каталог генерации. - Для полных запусков, чувствительных к хранилищу, спроси пользователя, использовать ли запасной вариант через CLI
$imagegen, если он доступен. Этот путь требует локальных учётных данных API и явного подтверждения пользователя, но может избежать встраивания встроенных данных изображений в события журнала.
Изучение бренда
Если пользователь называет бренд, компанию, продукт или потенциального клиента вместо конкретного описания аватара или референсного изображения, перед подготовкой запуска питомца запусти лёгкого субагента-разведчика. Разведчик должен использовать веб-поиск и предпочитать официальные источники: сайт бренда, страницы продукта, документацию, страницы «О нас», пресс-страницы или страницы бренда. Надёжные вторичные источники используй, только когда официальных страниц слишком мало. Держи поиск узким: достаточно, чтобы извлечь визуальные признаки и черты характера, а не писать бриф по исследованию рынка.
Пропусти изучение, когда пользователь уже даёт конкретное описание талисмана или аватара либо референсные изображения, если только он прямо не просит исследовать бренд.
Обязанности разведчика:
- найти в вебе 2–4 подходящих источника, отдавая предпочтение официальным страницам
- написать гибкий бриф в markdown, а не жёсткий перечень полей
- охватить идентичность и категорию, аудиторию и контекст использования, визуальную систему, характер и тон, мотивы продукта и предметной области, подсказки для превращения в талисман, чего избегать, а также доказательства и степень уверенности
- помечать как предположение рекомендации по талисману, выведенные из источников
- не копировать логотипы, читаемые знаки, скриншоты интерфейса, слоганы и текст
- завершить бриф кратким разделом
Generation handoff, содержащим толькоbrand_name,brand_brief,avatar_seed,avoidиbrand_sources - не генерировать изображения, не готовить папки запуска и не править посторонние файлы
Используй такой промт для разведчика:
Изучи бренд для создания талисмана в hatch-pet.
Бренд/продукт/потенциальный клиент: <brand name>
Контекст пользователя: <short user request>
Файл результата: <absolute path to brand-discovery.md>
Используй веб-поиск. Отдавай предпочтение официальным страницам бренда, продукта, документации, «О нас», пресс-страницам и страницам бренда. Надёжные вторичные источники используй, только если официальных слишком мало. Запиши гибкий бриф в markdown в файл результата. Заголовки могут меняться в зависимости от бренда, но бриф должен охватывать:
- идентичность и категорию: каноническое название, тип продукта, что он делает
- аудиторию и контекст использования: кому он служит и где встречается
- визуальную систему: палитру, формы, качество линий, материалы, ощущение от шрифтов, иконографию, узоры
- характер и тон: эмоциональные черты, энергию, степень формальности, игривость
- мотивы продукта и предметной области: предметы, рабочие процессы, глаголы, метафоры, окружение
- подсказки для превращения в талисман: возможные формы, фирменные черты, аксессуары, что должно читаться в размере питомца
- чего избегать: логотипы и текст, элементы, чувствительные с точки зрения товарных знаков, вводящие в заблуждение признаки, путаницу с конкурентами, неудачные для талисмана варианты
- доказательства и степень уверенности: URL источников и заметки там, где доказательства слабые или выведены
Не копируй логотипы, читаемые знаки, скриншоты интерфейса, слоганы и текст. Чётко помечай рекомендации по талисману, которые выведены, а не взяты напрямую из источников.
Закончи бриф разделом `Generation handoff`, содержащим ровно:
- brand_name=<canonical brand/product name>
- brand_brief=<one sentence, max 45 words, covering palette/tone/domain motifs/personality>
- avatar_seed=<short mascot-safe visual idea, no logo copying>
- avoid=<short comma-separated list>
- brand_sources=<comma-separated source URLs>
Верни ровно:
brand_discovery_file=<absolute output file path>
brand_name=<canonical brand/product name>
brand_brief=<same compact sentence from Generation handoff>
avatar_seed=<same short seed from Generation handoff>
avoid=<same short avoid list from Generation handoff>
brand_sources=<same comma-separated URLs from Generation handoff>
Родитель должен сохранить бриф в markdown до подготовки запуска, затем передать его в prepare_pet_run.py как --brand-discovery-file вместе с --brand-name, --brand-brief, повторяющимся --brand-source и кратким значением --pet-notes на основе avatar_seed, если пользователь не дал лучшего описания аватара. Держи полный бриф для проверки; на промты должны влиять только компактные поля передачи. Если веб-поиск недоступен, а пользователь назвал лишь бренд, спроси о признаках бренда, прежде чем генерировать.
В обычном запуске питомца ожидай до 10 задач визуальной генерации: 1 базовый питомец плюс 9 задач полос строк. Контракт приложения Codex сейчас использует все 9 состояний: idle, running-right, running-left, waving, jumping, failed, waiting, running и review. Единственное детерминированное визуальное получение — running-left: его можно получить зеркальным отражением running-right только после того, как running-right сгенерирована, визуально осмотрена и явно одобрена как безопасная для отражения. Если зеркальное отражение неуместно, сгенерируй running-left как обычную строку с опорой на изображения через $imagegen.
После выбора визуального результата родительский агент копирует именно это изображение в путь decoded/ этой задачи и отмечает задачу выполненной в imagegen-jobs.json. Не пиши вспомогательные скрипты, заполняющие результаты строк. Детерминированные скрипты Python могут обрабатывать только уже сгенерированные визуальные результаты.
Только базовая задача может быть генерацией по одному промту. Каждая задача полосы строки, сгенерированная через $imagegen, должна использовать входные изображения, перечисленные в imagegen-jobs.json, включая каноническую базовую ссылку, созданную после копирования выбранного базового результата. Считай недействительной любую генерацию строки без приложенных опорных изображений.
Безопасные для питомца стили
Стиль по умолчанию — auto: выведи стиль питомца из промта пользователя и референсов, затем сохраняй этот стиль во всех строках. Если пользователь называет стиль, соблюдай его. Поддерживаемые пресеты стилей: pixel, plush, clay, sticker, flat-vector, 3d-toy, painterly, brand-inspired и auto.
Допустим любой стиль, если он остаётся безопасным для питомца:
- компактный силуэт всего тела, читаемый внутри ячейки
192x208 - одинаковые лицо, пропорции, материал, палитра и аксессуары во всех строках
- чистый фон хромакея, который можно удалить
- детали достаточно крупные, чтобы читаться в размере питомца
- нет текста, подписей, интерфейса и читаемых логотипов, если пользователь прямо не предоставил одобренные референсные работы и не попросил их
Непиксельные стили полноправны. Плюшевый, глиняный, стикерный, векторный, 3D-игрушечный, живописный талисман, тушь и стили, вдохновлённые брендом, следует принимать, если они удовлетворяют ограничениям атласа и читаемости.
Прозрачность и эффекты
Строки питомца обрабатываются в прозрачные ячейки 192x208, поэтому каждый сгенерированный пиксель должен либо принадлежать спрайту питомца, либо быть чистым удаляемым фоном хромакея. Предпочитай изменения позы, выражения и силуэта декоративным эффектам.
Детерминированный растровый конвейер отвечает за инвариант прозрачности: пиксели, которые становятся полностью прозрачными, нормализуются, чтобы не сохранять скрытых остатков RGB, а проверка атласа должна завершаться ошибкой, если экспортированные файлы нарушают этот инвариант. Не маскируй цветные ореолы или остатки в прозрачных пикселях, принимая визуально непоследовательные результаты.
Допустимые эффекты должны удовлетворять всем этим условиям:
- Эффект относится к состоянию и помогает объяснить анимацию.
- Эффект физически прикреплён к силуэту питомца, касается его или перекрывает его, а не парит рядом.
- Эффект находится в том же слоте кадра, что и питомец, и не создаёт отдельного компонента спрайта.
- Эффект непрозрачный, достаточно резкий для чистого извлечения и использует цвета, не совпадающие с хромакеем.
- Эффект достаточно мал, чтобы оставаться читаемым в
192x208без загромождения.
По умолчанию избегай следующего, потому что оно обычно ломает очистку прозрачного фона или извлечение компонентов:
- меток волн, дуг движения, линий скорости, штрихов действия, остаточных изображений, размытия или смазывания
- отдельных звёзд, свободных искр, парящей пунктуации, парящих значков, падающих слёз, отдельных клубов дыма или свободной пыли
- падающих теней, контактных теней, отброшенных теней, овальных теней на полу, пятен на полу, следов приземления, всплесков удара, свечения, ореола, ауры или мягких прозрачных эффектов
- текста, подписей, номеров кадров, видимых сеток, направляющих отметок, облачков речи, облачков мыслей, панелей интерфейса, фрагментов кода, шахматной прозрачности, белого фона, чёрного фона или декораций
- цветов, близких к хромакею, в питомце, аксессуаре, эффектах, бликах или тенях
- случайных пикселей, оторванных кусочков контура, крапа и шума, обрезанных частей тела, перекрывающихся поз или любой позы, заходящей в соседний слот кадра
Указания по состояниям:
idle: делай спокойным и ненавязчивым. Используй только едва заметное дыхание, крошечное моргание, лёгкое покачивание головы или тела, очень небольшое покачивание материала или другое тихое движение, сохраняющее характер. Цикл всё равно должен содержать заметное микроразличие; не принимай шесть практически одинаковых копий. Не показывай махание, ходьбу, бег, прыжки, разговор, работу, проверку, эмоциональные реакции, крупные жесты, взаимодействие с предметами или новые аксессуары.waving: показывай махание только позой лапы, руки, крыла или конечности. Не рисуй метки волн, дуги движения, линии, искры, символы или парящие эффекты вокруг жеста.jumping: показывай вертикальное движение только положением тела. Не рисуй тени, пыль, следы приземления, всплески удара, батуты и намёки на пол.failed: слёзы, прикреплённые клубы дыма или прикреплённые звёзды допустимы, если они соответствуют правилам допустимых эффектов; не используй красные крестики, парящие символы, отдельный дым, отдельные звёзды или отдельные капли слёз.waiting: покажи, что Codex нужны одобрение, помощь или ввод пользователя, выжидающей просящей позой. Отличай от обычногоidleиreview.running: показывай активную работу над задачей, обработку, размышление, сканирование, набор текста или сосредоточенное усилие. Не показывай буквальный бег ногами, трусцу, спринт, беговую дорожку, поднятые колени, длинные шаги, размахивание руками, движение в определённом направлении, линии скорости, облака пыли, тени на полу, шлейфы движения или отдельные эффекты движения.review: показывай сосредоточенность наклоном, морганием, глазами, наклоном головы или положением лапы или руки. Не добавляй лупы, бумаги, код, интерфейс, знаки препинания, символы и другие новые аксессуары, если их нет в базовой идентичности питомца.running-rightиrunning-left: показывай движение с направлением (тяга) только движением тела, конечностей и аксессуаров.running-rightдолжна смотреть и двигаться вправо;running-left— влево. Ритм должен заметно чередоваться на протяжении цикла, а не повторять один почти статичный шаг. Не рисуй линии скорости, облака пыли, тени на полу, шлейфы движения или отдельные эффекты движения.
Видимый план выполнения
Для каждого запуска питомца веди видимый контрольный список, чтобы пользователь видел, на каком этапе работа. Создай список до начала, держи активным один шаг и обновляй список по мере завершения каждого шага.
Используй этот список для обычного запуска питомца, заменяя <Pet> на имя питомца или «твоего питомца»:
- Готовим
<Pet>. - Придумываем основной облик
<Pet>. - Рисуем позы
<Pet>. - Вылупляем
<Pet>.
Что означает каждый шаг:
Готовим <Pet>.Выбери или подтверди имя питомца, описание, исходные изображения, пресет стиля, заметки по стилю и рабочую папку. Для запросов с одним лишь брендом, продуктом или компанией сначала запусти разведчика бренда и зафиксируй компактный бриф бренда, URL источников и зерно аватара.Придумываем основной облик <Pet>.Сгенерируй главное референсное изображение питомца. Оно становится визуальным источником истины.Рисуем позы <Pet>.Сгенерируй строки поз через лёгких исполнителей, начиная сidleиrunning-right, чтобы подтвердить идентичность и походку. Отражайrunning-leftзеркально, только еслиrunning-rightявно работает при отражении.Вылупляем <Pet>.Преврати одобренные позы в итоговые файлы питомца, проверь контактный лист, превью и результаты проверки, исправь все сломанные части, сохраниpet.jsonиspritesheet.webp, затем сообщи пути к результатам.
Отмечай шаг выполненным, только когда реальный файл, изображение или решение существует. Если это запуск для починки, начни с первого подходящего шага, а не перезапускай весь список.
Основной рабочий процесс
- Подготовь папку запуска питомца и манифест задач imagegen:
SKILL_DIR="${CODEX_HOME:-$HOME/.codex}/skills/hatch-pet"
python "$SKILL_DIR/scripts/prepare_pet_run.py" \
--pet-name "<Name>" \
--description "<one sentence>" \
--reference /absolute/path/to/reference.png \
--output-dir /absolute/path/to/run \
--pet-notes "<stable pet description>" \
--brand-discovery-file /absolute/path/to/brand-discovery.md \
--brand-name "<optional researched brand name>" \
--brand-brief "<optional compact researched brand cue sentence>" \
--brand-source "https://example.com/source" \
--style-preset auto \
--style-notes "<optional freeform style notes>" \
--force
Все аргументы выше необязательны, кроме флагов, нужных для выражения ограничений пользователя. Для запросов только с текстом передай концепцию через --pet-notes и опусти --reference; prepare_pet_run.py при необходимости сам выведет имя, описание, хромакей и выходную папку. Для запросов с одним лишь брендом сначала запусти разведчика, сохрани бриф в markdown, затем передай путь к брифу через --brand-discovery-file, avatar_seed через --pet-notes, brand_name через --brand-name, brand_brief через --brand-brief и каждый URL источника через повторяющийся --brand-source.
- Изучи
imagegen-jobs.jsonи найди следующие готовые задачи$imagegen. Задача готова, когда еёstatusне равенcomplete, а каждый id изdepends_onуже выполнен. Предпочитай читать манифест напрямую черезjqили в редакторе, а не добавлять вспомогательные скрипты для показа статуса:
jq '.jobs[] | {id, kind, status, depends_on, prompt_file, retry_prompt_file, input_images, output_path, derivation_policy}' /absolute/path/to/run/imagegen-jobs.json
- По умолчанию генерируй визуальные задачи лёгкими исполнителями:
- Сначала сгенерируй и скопируй
base, используя лёгкого исполнителя базового изображения. - Затем сгенерируй и скопируй
idleиrunning-rightкак проверку идентичности и походки, используя одного лёгкого исполнителя на строку. - Осмотри
running-right; отражайrunning-leftзеркально, только если визуальная идентичность, расположение аксессуаров, отметины, освещение и смысл направления остаются верными. - Сгенерируй
running-leftобычным образом лёгким исполнителем, когда отражение изменило бы смысл или идентичность. - Сгенерируй остальные строки лёгкими исполнителями, используя каждое входное изображение, перечисленное для каждой задачи.
Для каждой готовой визуальной задачи вызывай $imagegen с файлом промта, указанным в imagegen-jobs.json, каждым перечисленным входным изображением с его меткой роли и встроенным путём image_gen по умолчанию, если сам $imagegen не направляет иначе. Родительский агент должен сводить свою работу с изображениями к минимуму: не открывай каждое сгенерированное базовое изображение или строку в журнале родителя. Исполнители возвращают только путь к выбранному источнику и одно предложение с заметкой о качестве; родитель записывает путь выбранного источника в манифест.
prepare_pet_run.py создаёт 9 направляющих изображений раскладки под строки в references/layout-guides/, по одному на состояние анимации. Задачи строк прикладывают подходящую направляющую как входное изображение только для раскладки, чтобы модель следовала правильному числу кадров, интервалам, центрированию и безопасным полям. Считай эти направляющие невидимыми вспомогательными построениями: сгенерированная полоса строки не должна содержать видимых рамок, границ, отметок центра, подписей, цветов направляющих или фона направляющей.
При генерации полос строк сохраняй главенство блокировки идентичности в промте строки. Сохраняй тот же стиль, лицо, отметины, палитру, материалы, дизайн аксессуаров, пропорции тела и силуэт, что и в каноническом базовом изображении. Задачи строк по умолчанию прикладывают направляющую раскладки и каноническую базу; декодированная база хранится в папке запуска для детерминированной обработки, а не отправляется как лишнее входное изображение для генерации.
Если $imagegen возвращает ошибку транспортного уровня Bad Request для строки, повтори эту же строку один раз с её сгенерированным retry_prompt_file. Повторный промт сохраняет id строки, число кадров, хромакей, идентичность канонической базы и действие состояния. Оставь каноническую базу приложенной. Если повтор всё равно не удался, остановись и сообщи о строке, на которой сбой, и путях к промтам, а не переключайся на любой другой путь генерации.
- После выбора сгенерированного результата для задачи скопируй его в путь декодированного результата и отметь задачу выполненной. Для
baseтакже создай каноническую референсную копию идентичности:
RUN_DIR=/absolute/path/to/run
JOB_ID=<job-id>
SOURCE=/absolute/path/to/generated-output.png
OUTPUT_REL=$(jq -r --arg id "$JOB_ID" '.jobs[] | select(.id == $id) | .output_path' "$RUN_DIR/imagegen-jobs.json")
mkdir -p "$(dirname "$RUN_DIR/$OUTPUT_REL")"
cp "$SOURCE" "$RUN_DIR/$OUTPUT_REL"
if [ "$JOB_ID" = "base" ]; then mkdir -p "$RUN_DIR/references"; cp "$RUN_DIR/$OUTPUT_REL" "$RUN_DIR/references/canonical-base.png"; fi
UPDATED_AT=$(date -u +%Y-%m-%dT%H:%M:%SZ)
TMP_MANIFEST=$(mktemp)
jq --arg id "$JOB_ID" --arg source "$SOURCE" --arg at "$UPDATED_AT" '(.jobs[] | select(.id == $id)) += {status: "complete", source_path: $source, completed_at: $at}' "$RUN_DIR/imagegen-jobs.json" > "$TMP_MANIFEST"
mv "$TMP_MANIFEST" "$RUN_DIR/imagegen-jobs.json"
Если скопированный источник находится в ${CODEX_HOME:-$HOME/.codex}/generated_images, удали исходный сгенерированный файл после того, как декодированная копия существует:
GENERATED_ROOT="${CODEX_HOME:-$HOME/.codex}/generated_images"
case "$SOURCE" in
"$GENERATED_ROOT"/*)
rm -f "$SOURCE"
rmdir "$(dirname "$SOURCE")" 2>/dev/null || true
;;
esac
- Получай
running-leftтолько когда это визуально безопасно:
python "$SKILL_DIR/scripts/derive_running_left_from_running_right.py" \
--run-dir /absolute/path/to/run \
--confirm-appropriate-mirror \
--decision-note "<why mirroring preserves this pet's identity>"
Этот скрипт отражает каждый слот кадра сгенерированной полосы на месте, чтобы строка влево сохраняла временной порядок строки вправо. Не заменяй его зеркальным отражением всей полосы целиком, которое обращает время анимации.
- Когда все задачи выполнены, запусти скрипты обработки изображений напрямую:
RUN_DIR=/absolute/path/to/run
mkdir -p "$RUN_DIR/final" "$RUN_DIR/qa"
python "$SKILL_DIR/scripts/extract_strip_frames.py" \
--decoded-dir "$RUN_DIR/decoded" \
--output-dir "$RUN_DIR/frames" \
--states all \
--method auto
python "$SKILL_DIR/scripts/inspect_frames.py" \
--frames-root "$RUN_DIR/frames" \
--json-out "$RUN_DIR/qa/review.json" \
--require-components
python "$SKILL_DIR/scripts/compose_atlas.py" \
--frames-root "$RUN_DIR/frames" \
--output "$RUN_DIR/final/spritesheet.png" \
--webp-output "$RUN_DIR/final/spritesheet.webp"
python "$SKILL_DIR/scripts/validate_atlas.py" \
"$RUN_DIR/final/spritesheet.webp" \
--json-out "$RUN_DIR/final/validation.json"
python "$SKILL_DIR/scripts/make_contact_sheet.py" \
"$RUN_DIR/final/spritesheet.webp" \
--output "$RUN_DIR/qa/contact-sheet.png"
python "$SKILL_DIR/scripts/render_animation_previews.py" \
--frames-root "$RUN_DIR/frames" \
--output-dir "$RUN_DIR/qa/previews"
Если GIF-превью показывают скачки размера или сдвиги базовой линии, вызванные подгонкой каждого кадра под ячейку при извлечении, а исходная полоса строки сама имела стабильный масштаб и положение, заново запусти извлечение кадров с явным режимом стабильности строк, а затем снова запусти проверку, сборку атласа, валидацию, создание контактного листа и превью:
python "$SKILL_DIR/scripts/extract_strip_frames.py" \
--decoded-dir "$RUN_DIR/decoded" \
--output-dir "$RUN_DIR/frames" \
--states all \
--method stable-slots
python "$SKILL_DIR/scripts/inspect_frames.py" \
--frames-root "$RUN_DIR/frames" \
--json-out "$RUN_DIR/qa/review.json" \
--require-components \
--allow-stable-slots
Используй stable-slots как осознанную корректировку по результатам контроля качества, а не как вариант по умолчанию. Она должна уменьшать скачки движения из-за извлечения, не скрывая обрезанные широкие позы или плохие исходные полосы.
Ожидаемый результат до очистки:
run/
pet_request.json
imagegen-jobs.json
prompts/
decoded/
frames/frames-manifest.json
final/spritesheet.webp
final/validation.json
qa/contact-sheet.png
qa/previews/*.gif
qa/review.json
qa/run-summary.json
Результат упаковки по умолчанию записывается вне каталога запуска. Если задан CODEX_HOME, используй его; иначе используй $HOME/.codex.
${CODEX_HOME:-$HOME/.codex}/pets/<pet-name>/
pet.json
spritesheet.webp
Упаковка через оболочку и jq:
RUN_DIR=/absolute/path/to/run
PET_ID=$(jq -r '.pet_id' "$RUN_DIR/pet_request.json")
DISPLAY_NAME=$(jq -r '.display_name' "$RUN_DIR/pet_request.json")
DESCRIPTION=$(jq -r '.description' "$RUN_DIR/pet_request.json")
PET_DIR="${CODEX_HOME:-$HOME/.codex}/pets/$PET_ID"
mkdir -p "$PET_DIR"
cp "$RUN_DIR/final/spritesheet.webp" "$PET_DIR/spritesheet.webp"
jq -n --arg id "$PET_ID" --arg displayName "$DISPLAY_NAME" --arg description "$DESCRIPTION" '{id: $id, displayName: $displayName, description: $description, spritesheetPath: "spritesheet.webp"}' > "$PET_DIR/pet.json"
Запиши qa/run-summary.json после упаковки:
jq -n --arg run_dir "$RUN_DIR" --arg spritesheet "$RUN_DIR/final/spritesheet.webp" --arg validation "$RUN_DIR/final/validation.json" --arg contact_sheet "$RUN_DIR/qa/contact-sheet.png" --arg review "$RUN_DIR/qa/review.json" --arg package "$PET_DIR" '{ok: true, run_dir: $run_dir, spritesheet: $spritesheet, validation: $validation, contact_sheet: $contact_sheet, review: $review, package: $package}' > "$RUN_DIR/qa/run-summary.json"
После детерминированной обработки изображений осмотри qa/contact-sheet.png и qa/previews/*.gif лёгким исполнителем визуального контроля, прежде чем принимать питомца. Детерминированная проверка необходима, но недостаточна. Блокируй приёмку, если какая-либо строка меняет вид или тип тела, лицо, отметины, палитру, материал, дизайн аксессуара, стиль, неожиданно меняет сторону аксессуара или общий силуэт. Превью движения также должны отклонять непреднамеренные скачки размера, перевёрнутый или застывший ритм движения в направлении, неверное направление взгляда и циклы idle, которые технически различаются, но визуально неподвижны.
После того как модельный визуальный контроль принял контактный лист, удали промежуточные артефакты запуска:
Оставь pet_request.json, final/spritesheet.webp, final/validation.json, qa/contact-sheet.png, qa/previews/, qa/review.json и qa/run-summary.json. Удали сгенерированные файлы промтов, направляющие раскладки, декодированные полосы строк, извлечённые кадры, final/spritesheet.png и манифест задач imagegen. Пропусти очистку, если пользователь хочет отладочные артефакты или запуск ещё нуждается в починке.
Лёгкие визуальные исполнители
Используй лёгких субагентов для тяжёлой работы с изображениями по умолчанию. Это ограничивает каждый журнал $imagegen одним выбранным изображением, держит визуальные данные контактных листов вне родительского потока и снижает стоимость, сохраняя полный контракт приложения из 9 состояний.
Делегирование субагентам
Если пользователь прямо не запретил, используй для этого запуска субагентов. Если пользователь не разрешал использование субагентов или намерение по их использованию неясно, попроси у пользователя разрешение запустить субагентов для параллельных направлений работы.
Обязанности родителя:
- запустить разведчика бренда до подготовки, когда пользователь называет лишь бренд, продукт, компанию или потенциального клиента
- подготовить запуск и изучить
imagegen-jobs.json - поручить базовую задачу, задачи строк и итоговый визуальный контроль контактного листа лёгким исполнителям
- скопировать выбранные результаты исполнителей в их декодированные пути и отметить задачи выполненными в
imagegen-jobs.json - создать
references/canonical-base.pngиз выбранного базового результата - выполнить одобренное зеркальное получение
running-left, когда оно уместно - выполнить детерминированную обработку изображений, упаковку, повторную генерацию для починки и очистку
Обязанности исполнителя базового изображения:
- обрабатывать только задачу
base - прочитать
prompts/base-pet.mdи использовать любые перечисленные референсные изображения - использовать только
$imagegen - учитывать любую компактную строку вдохновения брендом в промте как общее визуальное указание по внешнему виду и характеру, не копируя логотипы, читаемые знаки, скриншоты интерфейса, слоганы и текст
- возвращать только
selected_source=/absolute/path/to/selected-output.pngиqa_note=<one sentence>
Обязанности исполнителя строки:
- обрабатывать ровно одну задачу строки
- прочитать промт строки и использовать все перечисленные входные изображения
- использовать только
$imagegen; не рисовать, не править, не размножать плиткой и не синтезировать спрайты локально - провести быструю визуальную проверку здравого смысла: число кадров, идентичность, фон хромакея, интервалы, обрезка и отдельные эффекты
- применять правила прозрачности и эффектов из промта строки, включая: никаких отдельных эффектов, никаких меток волн для
waving, никаких линий скорости или пыли для строк бега с направлением, никакого буквального бега ногами для строкиrunningбез направления и только прикреплённые непрозрачные спрайтовые слёзы, дым и звёзды, когда промт состояния их допускает - возвращать только
selected_source=/absolute/path/to/selected-output.pngиqa_note=<one sentence>
Обязанности исполнителя итогового визуального контроля:
- осмотреть
qa/contact-sheet.pngи GIF строк вqa/previews/, при необходимости используяqa/review.jsonиfinal/validation.jsonкак текстовый контекст - проверить, что все 9 строк соответствуют контракту состояний приложения Codex и одной и той же идентичности питомца
- вернуть компактный результат:
visual_qa=passилиvisual_qa=failплюс заметки по починке конкретных строк при провале - не править файлы, не ставить починки в очередь, не упаковывать и не очищать
Выбор модели для исполнителей:
- Для изучения бренда предпочитай меньшую способную модель, так как он возвращает компактный исследовательский бриф, а не занимается оркестрацией.
- Для визуальных исполнителей предпочитай меньшую способную модель, например
gpt-5.4-miniсо средним рассуждением, когда доступно переопределение модели. - Модель родителя или модель по умолчанию используй только для оркестрации или когда меньшая модель исполнителя недоступна.
- Держи не более двух активных исполнителей генерации одновременно, если пользователь прямо не просит большего параллелизма. Запускай итоговый визуальный контроль одним исполнителем после детерминированной обработки изображений. Закрывай исполнителей после того, как их результат использован.
Используй такой промт для исполнителя базового изображения:
Сгенерируй базовое изображение hatch-pet.
Каталог запуска: <absolute run dir>
Id задачи: base
Файл промта: <absolute base prompt file>
Входные изображения:
- <absolute path> — <role>
Используй только $imagegen. Прочитай базовый промт и приложи каждое перечисленное входное изображение. Если в промте есть вдохновение брендом, используй его только как общее указание, безопасное для талисмана; не копируй логотипы, читаемые знаки, скриншоты интерфейса, слоганы и текст. Перед возвратом визуально проверь, что результат — один отцентрованный питомец в полный рост на плоском фоне хромакея, без текста, декораций, теней и отдельных эффектов.
Не правь манифесты, не копируй в decoded, не отмечай задачи выполненными, не генерируй строки, не запускай скрипты обработки изображений, не чини, не упаковывай и не открывай посторонние файлы.
Не включай в финальный ответ превью изображений в Markdown, base64 или дополнительные вложения.
Верни ровно:
selected_source=/absolute/path/to/selected-output.png
qa_note=<one sentence>
Используй такой промт для исполнителя строки:
Сгенерируй одну строку hatch-pet.
Каталог запуска: <absolute run dir>
Id строки: <row-id>
Файл промта: <absolute prompt file>
Файл повторного промта: <absolute retry prompt file>
Входные изображения:
- <absolute path> — <role>
- <absolute path> — <role>
Используй только $imagegen. Прочитай промт строки и приложи каждое перечисленное входное изображение. Если imagegen вернёт Bad Request, повтори один раз с повторным промтом и теми же входными изображениями.
Перед возвратом визуально проверь: точное число кадров, ту же идентичность питомца, что в канонической базе, плоский фон хромакея, полные раздельные необрезанные позы и отсутствие отдельных эффектов и направляющих отметок. Правила прозрачности и эффектов из промта обязательны: никаких отдельных эффектов, никаких меток волн для `waving`, никаких линий скорости или пыли для строк бега с направлением, никакого буквального бега ногами для строки `running` без направления и только прикреплённые непрозрачные спрайтовые слёзы, дым и звёзды, когда промт состояния их допускает.
Не правь манифесты, не копируй в decoded, не отмечай задачи выполненными, не отражай строки зеркально, не запускай скрипты обработки изображений, не чини, не упаковывай и не открывай посторонние файлы.
Не включай в финальный ответ превью изображений в Markdown, base64 или дополнительные вложения.
Верни ровно:
selected_source=/absolute/path/to/selected-output.png
qa_note=<one sentence>
Используй такой промт для исполнителя итогового визуального контроля:
Визуально проверь один итоговый контактный лист hatch-pet.
Каталог запуска: <absolute run dir>
Контактный лист: <absolute run dir>/qa/contact-sheet.png
Каталог превью: <absolute run dir>/qa/previews
JSON проверки: <absolute run dir>/qa/review.json
JSON валидации: <absolute run dir>/final/validation.json
Визуально осмотри контактный лист и GIF-превью. Подтверди ту же идентичность питомца, стиль, палитру, силуэт, лицо, пропорции и аксессуары во всех строках:
0 idle, 1 running-right, 2 running-left, 3 waving, 4 jumping, 5 failed, 6 waiting, 7 running, 8 review.
Забракуй строки с дрейфом идентичности, отсутствующими или пустыми кадрами, скопированными отметками направляющих, белым или непрозрачным фоном, обрезанными телами, наложением слотов, отдельными эффектами, тенями, свечением, смазыванием, пылью, артефактами хромакея, движением, не соответствующим состоянию строки, непреднамеренными скачками размера, неверным направлением взгляда, перевёрнутой или нечередующейся походкой либо циклами idle, которые фактически статичны.
Не правь файлы, не ставь починки в очередь, не упаковывай, не очищай и не проверяй посторонние файлы.
Верни ровно:
visual_qa=pass|fail
qa_note=<one sentence summary>
repair_rows=<comma-separated row ids, or none>
repair_notes=<short row-specific notes, or none>
Порядок починки
Если проверка кадров или итоговый визуальный контроль не пройдены, прочитай qa/review.json, заново сгенерируй наименьшую сбойную область, скопируй заменяющую строку в тот же путь декодированного результата и оставь эту задачу отмеченной выполненной с новыми source_path и completed_at. Чини сбойную строку, а не весь лист.
Для починки идентичности используй каноническое базовое изображение, исходные референсы, контактный лист и точную заметку о сбое строки как опорный контекст. Дай исполнителю строки существующий промт строки плюс краткую заметку о починке из qa/review.json; сохраняй каноническую идентичность питомца и выбранный стиль.
При скачках движения из-за извлечения не начинай с повторной генерации изображений. Если исходная полоса уже сохраняет масштаб и базовую линию на уровне строки, заново запусти детерминированный конвейер с --method stable-slots, проверь с --allow-stable-slots, затем заново проверь GIF-превью. Генерируй строку заново, только когда сама исходная полоса обрезана, нестабильна или семантически неверна.
Правила
- Оставляй
$imagegenосновным слоем генерации. - Для запросов о бренде, продукте, компании или потенциальном клиенте без конкретного описания аватара или референсного изображения запусти изучение бренда до генерации базового изображения и передай в запуск только компактный бриф.
- Используй
$imagegenкак единственный слой визуальной генерации. Не вызывай из этого скилла API изображений, CLI изображений, локальные растровые генераторы или разовые скрипты генерации. - Держи референсные изображения приложенными и видимыми для
$imagegen, когда выбранный путь поддерживает референсы. - Прикладывай изображение
references/layout-guides/<state>.pngстроки к каждой задаче полосы строки как направляющую только для раскладки и не принимай результаты, копирующие пиксели направляющей. - По умолчанию используй лёгких визуальных исполнителей для генерации базового изображения, визуальной генерации полос строк и итогового контроля контактного листа; родитель отвечает за обновления манифеста, детерминированные скрипты изображений, упаковку и очистку.
- Генерируй каждую обычную визуальную задачу через
$imagegen: базовое изображение плюс все полосы строк, кроме явно одобренных зеркальных полученийrunning-left. - Считай только базовую задачу допускающей генерацию по одному промту; каждая задача строки должна прикладывать перечисленные для неё опорные изображения.
- Генерируй
running-rightдо того, как решишь, можно ли получитьrunning-leftзеркальным отражением. - При зеркальном получении
running-leftсохраняй порядок кадров и смысл времени; получай её детерминированным скриптом, а не зеркальным отражением всей полосы целиком. - Не получай и не используй повторно
waiting,running,failed,review,jumpingилиwavingиз другого состояния: у каждого своя семантика в приложении, и каждое должно быть сгенерировано как своя строка. - Никогда не подставляй вместо отсутствующих результатов
$imagegenнарисованные локально, размноженные плиткой, преобразованные или сгенерированные кодом полосы строк. - Отмечай визуальную задачу выполненной только после того, как выбранный результат скопирован в путь декодированного результата.
- Не полагайся на сгенерированные изображения в точной геометрии атласа; используй детерминированные скрипты изображений этого скилла.
- Используй хромакей, сохранённый в
pet_request.json; не навязывай фиксированный зелёный экран. - Держи силуэт, лицо, материалы, палитру, стиль и аксессуары питомца согласованными во всех строках.
- Считай дрейф визуальной идентичности или стиля блокирующей проблемой, даже когда в
qa/review.jsonиfinal/validation.jsonнет ошибок. - Считай проваленным контактный лист, на котором видны обрезанные референсы, повторяющиеся плитки, белый фон ячеек или не относящиеся к спрайту фрагменты.
- Считай проваленными GIF-превью, показывающие скачки размера из-за извлечения, перевёрнутое направленное время, неверное направление взгляда или неподвижные циклы idle.
- Считай проваленными строками запрещённые отдельные эффекты, артефакты, близкие к хромакею, тени, свечение, смазывание, пыль, следы приземления, метки волн, линии скорости или шлейфы движения.
- Считай ошибки в
qa/review.jsonблокирующими. Предупреждения требуют визуального осмотра.
Критерии приёмки
- Итоговый атлас — PNG или WebP,
1536x1872, с поддержкой прозрачности, построен на ячейках192x208. - Используемые ячейки не пусты, а неиспользуемые полностью прозрачны.
- Атлас соответствует числу строк и кадров из
references/animation-rows.md. - Контактный лист и превью движения по строкам созданы и осмотрены лёгким исполнителем визуального контроля.
- В
qa/review.jsonнет ошибок. - Построчная проверка подтверждает, что циклы анимации достаточно полны для приложения Codex.
- Превью движения не показывают непреднамеренных скачков размера, перевёрнутого ритма движения в направлении или неверной семантики строк.
- Непиксельные стили принимаются, если они читаемы в размере питомца и согласованы во всех строках.
${CODEX_HOME:-$HOME/.codex}/pets/<pet-name>/pet.jsonи${CODEX_HOME:-$HOME/.codex}/pets/<pet-name>/spritesheet.webpподготовлены вместе для пользовательских питомцев.
Перевод: iiuniversitet. Оригинал: https://github.com/openai/skills/tree/main/skills/.curated/hatch-pet, лицензия Apache-2.0. Изменения: перевод на русский язык.
Оригинал на английском
---
name: hatch-pet
description: Create, repair, validate, visually QA, and package Codex-compatible animated pets and pet spritesheets from character art, generated images, company or prospect brand cues, or visual references. Use when a user wants a lightweight-worker Codex pet workflow, a non-pixel custom pet style, a prospect or company mascot pet, or a full 8x9 animated pet atlas with transparent unused cells, QA contact sheets, and pet.json packaging. This skill composes the installed $imagegen system skill for visual generation and uses bundled scripts for deterministic spritesheet assembly.
---
# Hatch Pet
## Overview
Create a Codex-compatible animated pet from a concept, brand cue, company/prospect name, one or more reference images, or any combination of those inputs. This workflow keeps the deterministic hatch-pet pipeline for atlas geometry, validation, visual QA, and packaging, while using concise state-specific prompts and allowing any pet-safe visual style.
User-facing inputs are optional. If the user omits a pet name, infer one from the concept, brand, company, or reference filenames; if that is not possible, choose a short friendly name. If the user omits a description, infer one from the concept or references. If the user omits reference images, generate the base pet from text first, then use that base as the canonical reference for every animation row.
## Generation Delegation
Use `$imagegen` for all normal visual generation.
Before generating base art, row strips, or repair rows, load and follow the installed image generation skill:
```text
${CODEX_HOME:-$HOME/.codex}/skills/.system/imagegen/SKILL.md
```
Do not call the Image API, image CLI, or any other image-generation path directly. Let `$imagegen` choose its own built-in-first path and fallback rules. If `$imagegen` says a fallback requires confirmation, ask the user before continuing.
When invoking `$imagegen`, pass the generated pet prompt as the authoritative visual spec. Pet prompts should stay concise, state-specific, sprite-production oriented, and grounded in the listed input images. Keep longer policy and QA rules in this skill and the deterministic review scripts rather than expanding them into every image prompt. Do not wrap prompts in the generic `$imagegen` shared prompt schema.
Use this skill's scripts for deterministic image work only: preparing layout guides and prompts, mirroring approved `running-left`, extracting frames, validating rows, composing the final atlas, and creating contact-sheet plus motion-preview QA media. Parent-owned shell/`jq` steps handle manifest updates, packaging, and cleanup.
## Storage Controls
The built-in `$imagegen` path stores generated PNG bytes in the rollout that invokes it, even when it also writes a file under `${CODEX_HOME:-$HOME/.codex}/generated_images`. Deleting files later reduces filesystem use, but it does not shrink an already-written rollout. Keep image generation isolated and bounded:
- Use one lightweight generation worker per visual job. Do not batch multiple base/row jobs into the same worker.
- Workers must return only `selected_source=...` and `qa_note=...`; they must not include Markdown image previews, base64, or extra visual attachments in their final response.
- The parent must not open every generated PNG visually. Use worker QA for each job and inspect only the final contact sheet.
- After copying the selected generated output into `decoded/`, remove the selected original from `${CODEX_HOME:-$HOME/.codex}/generated_images` when it lives there, then remove its now-empty generation directory if possible.
- For storage-sensitive full runs, ask the user whether to use the `$imagegen` CLI fallback when available. That path requires local API credentials and explicit user confirmation, but it can avoid built-in image payloads being embedded in rollout events.
## Brand Discovery
If the user provides a brand, company, product, or prospect name rather than a concrete avatar description or reference image, run a lightweight discovery subagent before preparing the pet run. The discovery worker must use web search and prefer official sources such as the brand site, product pages, docs, about pages, press pages, or brand pages. Use reputable secondary sources only when official pages are too thin. Keep the search narrow: enough to extract visual and personality cues, not a market-research brief.
Skip discovery when the user already provides a concrete mascot/avatar description or reference images, unless the user explicitly asks for brand research.
Discovery worker responsibilities:
- search the web for 2-4 relevant sources, preferring official pages
- write an adaptive markdown brief rather than a rigid field dump
- cover identity/category, audience/use context, visual system, personality/tone, product/domain motifs, mascot translation cues, avoidances, and evidence/confidence
- mark mascot guidance that is inferred from sources as inference
- avoid copying logos, readable marks, UI screenshots, slogans, or text
- end with a compact `Generation handoff` section containing only `brand_name`, `brand_brief`, `avatar_seed`, `avoid`, and `brand_sources`
- do not generate images, prepare run folders, or edit unrelated files
Use this discovery worker prompt:
```text
Research a brand for hatch-pet mascot creation.
Brand/product/prospect: <brand name>
User context: <short user request>
Output file: <absolute path to brand-discovery.md>
Use web search. Prefer official brand, product, docs, about, press, or brand pages. Use reputable secondary sources only if official sources are too thin. Write an adaptive markdown brief to the output file. Headings may flex by brand, but the brief must cover:
- identity/category: canonical name, product type, what it does
- audience/use context: who it serves and where it appears
- visual system: palette, shapes, line quality, materials, typography feel, iconography, patterns
- personality/tone: emotional traits, energy, formality, playfulness
- product/domain motifs: objects, workflows, verbs, metaphors, environments
- mascot translation cues: candidate forms, signature traits, props, what must read at pet size
- avoidances: logos/text, trademark-sensitive elements, misleading cues, competitor confusion, poor mascot fits
- evidence/confidence: source URLs plus notes where evidence is weak or inferred
Do not copy logos, readable marks, UI screenshots, slogans, or text. Clearly label mascot guidance that is inferred rather than directly sourced.
End the brief with a `Generation handoff` section containing exactly:
- brand_name=<canonical brand/product name>
- brand_brief=<one sentence, max 45 words, covering palette/tone/domain motifs/personality>
- avatar_seed=<short mascot-safe visual idea, no logo copying>
- avoid=<short comma-separated list>
- brand_sources=<comma-separated source URLs>
Return exactly:
brand_discovery_file=<absolute output file path>
brand_name=<canonical brand/product name>
brand_brief=<same compact sentence from Generation handoff>
avatar_seed=<same short seed from Generation handoff>
avoid=<same short avoid list from Generation handoff>
brand_sources=<same comma-separated URLs from Generation handoff>
```
The parent should save the markdown brief before preparing the run, then pass it to `prepare_pet_run.py` as `--brand-discovery-file` together with `--brand-name`, `--brand-brief`, repeated `--brand-source`, and a concise `--pet-notes` value based on `avatar_seed` when the user did not provide a better avatar description. Keep the full brief for review; only the compact handoff fields should shape prompts. If web search is unavailable and the user gave only a bare brand name, ask for brand cues before generating.
For a normal pet run, expect up to 10 visual generation jobs: 1 base pet plus 9 row-strip jobs. The Codex app contract currently uses all 9 states: `idle`, `running-right`, `running-left`, `waving`, `jumping`, `failed`, `waiting`, `running`, and `review`. The only deterministic visual derivation is `running-left`, which may be produced by mirroring `running-right` only after `running-right` has been generated, visually inspected, and explicitly approved as safe to mirror. If mirroring is not appropriate, generate `running-left` as a normal grounded `$imagegen` row.
After selecting a visual output, the parent agent copies that exact image into the job's `decoded/` path and marks the job complete in `imagegen-jobs.json`. Do not write helper scripts that populate row outputs. The deterministic Python scripts may only process already-generated visual outputs.
Only the base job may be prompt-only. Every row-strip job generated through `$imagegen` must use the input images listed in `imagegen-jobs.json`, including the canonical base reference created after the selected base output is copied. Treat any row generation without attached grounding images as invalid.
## Pet-Safe Styles
Default style is `auto`: infer the pet's style from the user's prompt and references, then preserve that style across every row. If the user names a style, honor it. Supported style presets include `pixel`, `plush`, `clay`, `sticker`, `flat-vector`, `3d-toy`, `painterly`, `brand-inspired`, and `auto`.
Any style is acceptable when it remains pet-safe:
- compact whole-body silhouette readable inside a `192x208` cell
- consistent face, proportions, material, palette, and props across all rows
- clean removable chroma-key background
- details large enough to read at pet size
- no text, labels, UI, or readable logos unless the user explicitly provides approved reference art and asks for them
Non-pixel styles are first-class. Plush, clay, sticker, vector, 3D toy, painterly mascot, ink, and brand-inspired looks should be accepted when they satisfy the atlas and readability constraints.
## Transparency And Effects
Pet rows are processed into transparent `192x208` cells, so every generated pixel must either belong to the pet sprite or be cleanly removable chroma-key background. Prefer pose, expression, and silhouette changes over decorative effects.
The deterministic raster pipeline owns the transparency invariant: pixels that become fully transparent are normalized so they do not retain hidden RGB residue, and atlas validation should fail if exported files violate that invariant. Do not paper over colored halos or transparent-pixel residue by accepting visually inconsistent outputs.
Allowed effects must satisfy all of these conditions:
- The effect is state-relevant and helps explain the animation.
- The effect is physically attached to, touching, or overlapping the pet silhouette, not floating nearby.
- The effect is inside the same frame slot as the pet and does not create a separate sprite component.
- The effect is opaque, hard-edged enough for clean extraction, and uses non-chroma-key colors.
- The effect is small enough to remain readable at `192x208` without clutter.
Avoid these by default because they usually break transparent-background cleanup or component extraction:
- wave marks, motion arcs, speed lines, action streaks, afterimages, blur, or smears
- detached stars, loose sparkles, floating punctuation, floating icons, falling tear drops, separated smoke clouds, or loose dust
- cast shadows, contact shadows, drop shadows, oval floor shadows, floor patches, landing marks, impact bursts, glow, halo, aura, or soft transparent effects
- text, labels, frame numbers, visible grids, guide marks, speech bubbles, thought bubbles, UI panels, code snippets, checkerboard transparency, white backgrounds, black backgrounds, or scenery
- chroma-key-adjacent colors in the pet, prop, effects, highlights, or shadows
- stray pixels, disconnected outline bits, speckle/noise, cropped body parts, overlapping poses, or any pose that crosses into a neighboring frame slot
State-specific guidance:
- `idle`: keep this calm and low-distraction. Use only subtle breathing, a tiny blink, a slight head or body bob, a very small material sway, or another quiet persona-preserving motion. The loop must still contain visible micro-variation; do not accept six effectively identical copies. Do not show waving, walking, running, jumping, talking, working, reviewing, emotional reactions, large gestures, item interactions, or new props.
- `waving`: show the wave through paw, hand, wing, or limb pose only. Do not draw wave marks, motion arcs, lines, sparkles, symbols, or floating effects around the gesture.
- `jumping`: show vertical motion through body position only. Do not draw shadows, dust, landing marks, impact bursts, bounce pads, or floor cues.
- `failed`: tears, attached smoke puffs, or attached stars are allowed if they obey the allowed-effects rules; do not use red X marks, floating symbols, detached smoke, detached stars, or separate tear droplets.
- `waiting`: show that Codex needs approval, help, or user input through an expectant asking pose. Keep it distinct from ordinary idle and review.
- `running`: show active task work, processing, thinking, scanning, typing, or focused effort. Do not show literal foot-running, jogging, sprinting, treadmill motion, raised knees, long steps, pumping arms, directional travel, speed lines, dust clouds, floor shadows, motion trails, or detached motion effects.
- `review`: show focus through lean, blink, eyes, head tilt, or paw/hand position. Do not add magnifying glasses, papers, code, UI, punctuation, symbols, or other new props unless they already exist in the base pet identity.
- `running-right` and `running-left`: show directional drag movement through body, limb, and prop movement only. `running-right` must face and travel right; `running-left` must face and travel left. Their cadence must visibly alternate across the loop rather than repeating one nearly static stride. Do not draw speed lines, dust clouds, floor shadows, motion trails, or detached motion effects.
## Visible Progress Plan
For every pet run, keep a visible checklist so the user can see where the work is up to. Create the checklist before starting, keep one step active at a time, and update it as each step finishes.
Use this checklist for a normal pet run, replacing `<Pet>` with the pet's name or `your pet`:
1. Getting `<Pet>` ready.
2. Imagining `<Pet>`'s main look.
3. Picturing `<Pet>`'s poses.
4. Hatching `<Pet>`.
What each step means:
- `Getting <Pet> ready.` Choose or confirm the pet name, description, source images, style preset, style notes, and working folder. For bare brand/product/company requests, first run the brand discovery worker and capture the compact brand brief, source URLs, and avatar seed.
- `Imagining <Pet>'s main look.` Generate the pet's main reference image. This becomes the visual source of truth.
- `Picturing <Pet>'s poses.` Generate pose rows through lightweight workers, starting with `idle` and `running-right` to confirm identity and gait. Only mirror `running-left` if `running-right` clearly works when flipped.
- `Hatching <Pet>.` Turn the approved poses into final pet files, review the contact sheet, previews, and validation results, fix any broken parts, save `pet.json` and `spritesheet.webp`, then report the output paths.
Only mark a step complete when the real file, image, or decision exists. If this is a repair run, start from the first relevant step instead of restarting the whole checklist.
## Default Workflow
1. Prepare a pet run folder and imagegen job manifest:
```bash
SKILL_DIR="${CODEX_HOME:-$HOME/.codex}/skills/hatch-pet"
python "$SKILL_DIR/scripts/prepare_pet_run.py" \
--pet-name "<Name>" \
--description "<one sentence>" \
--reference /absolute/path/to/reference.png \
--output-dir /absolute/path/to/run \
--pet-notes "<stable pet description>" \
--brand-discovery-file /absolute/path/to/brand-discovery.md \
--brand-name "<optional researched brand name>" \
--brand-brief "<optional compact researched brand cue sentence>" \
--brand-source "https://example.com/source" \
--style-preset auto \
--style-notes "<optional freeform style notes>" \
--force
```
All arguments above are optional except any flags needed to express user constraints. For text-only requests, pass the concept through `--pet-notes` and omit `--reference`; `prepare_pet_run.py` will infer a name, description, chroma key, and output directory as needed.
For brand-only requests, run the discovery worker first, save the markdown brief, then pass the brief path through `--brand-discovery-file`, `avatar_seed` through `--pet-notes`, `brand_name` through `--brand-name`, `brand_brief` through `--brand-brief`, and each source URL through repeated `--brand-source`.
2. Inspect `imagegen-jobs.json` for the next ready `$imagegen` jobs. A job is ready when its `status` is not `complete` and every id in `depends_on` is already complete. Prefer reading the manifest directly with `jq` or the editor instead of adding helper scripts for status display:
```bash
jq '.jobs[] | {id, kind, status, depends_on, prompt_file, retry_prompt_file, input_images, output_path, derivation_policy}' /absolute/path/to/run/imagegen-jobs.json
```
3. Generate visual jobs with lightweight workers by default:
- Generate and copy `base` first, using a lightweight base worker.
- Generate and copy `idle` and `running-right` next as the identity and gait check, using one lightweight worker per row.
- Inspect `running-right`; mirror `running-left` only when visual identity, prop placement, markings, lighting, and direction semantics remain correct.
- Generate `running-left` normally with a lightweight worker when mirroring would change meaning or identity.
- Generate the remaining rows with lightweight workers, using every input image listed for each job.
For each ready visual job, invoke `$imagegen` with the prompt file listed in `imagegen-jobs.json`, every listed input image with its role label, and the default built-in `image_gen` path unless `$imagegen` itself routes otherwise. The parent agent must keep its own image handling minimal: do not open every generated base or row in the parent rollout. Workers return only the selected source path and a one-sentence QA note; the parent records the selected source path in the manifest.
`prepare_pet_run.py` creates 9 row-specific layout guide images under `references/layout-guides/`, one per animation state. Row jobs attach the matching guide as a layout-only input so the model can follow the correct frame count, spacing, centering, and safe padding. Treat these guides as invisible construction references: the generated row strip must not include visible boxes, borders, center marks, labels, guide colors, or the guide background.
When generating row strips, keep the identity lock in the row prompt authoritative. Preserve the same style, face, markings, palette, materials, prop design, body proportions, and silhouette from the canonical base. Row jobs attach the layout guide and canonical base by default; the decoded base is kept in the run folder for deterministic processing rather than sent as a redundant generation input.
If `$imagegen` returns a transport-level `Bad Request` for a row, retry that same row once with its generated `retry_prompt_file`. The retry prompt preserves the row id, frame count, chroma key, canonical-base identity, and state action. Keep the canonical base attached. If the retry still fails, stop and report the failing row and prompt paths instead of switching to any other generation path.
4. After selecting a generated output for a job, copy it into the decoded output path and mark the job complete. For `base`, also create the canonical identity reference:
```bash
RUN_DIR=/absolute/path/to/run
JOB_ID=<job-id>
SOURCE=/absolute/path/to/generated-output.png
OUTPUT_REL=$(jq -r --arg id "$JOB_ID" '.jobs[] | select(.id == $id) | .output_path' "$RUN_DIR/imagegen-jobs.json")
mkdir -p "$(dirname "$RUN_DIR/$OUTPUT_REL")"
cp "$SOURCE" "$RUN_DIR/$OUTPUT_REL"
```
```bash
if [ "$JOB_ID" = "base" ]; then mkdir -p "$RUN_DIR/references"; cp "$RUN_DIR/$OUTPUT_REL" "$RUN_DIR/references/canonical-base.png"; fi
```
```bash
UPDATED_AT=$(date -u +%Y-%m-%dT%H:%M:%SZ)
TMP_MANIFEST=$(mktemp)
jq --arg id "$JOB_ID" --arg source "$SOURCE" --arg at "$UPDATED_AT" '(.jobs[] | select(.id == $id)) += {status: "complete", source_path: $source, completed_at: $at}' "$RUN_DIR/imagegen-jobs.json" > "$TMP_MANIFEST"
mv "$TMP_MANIFEST" "$RUN_DIR/imagegen-jobs.json"
```
If the copied source is under `${CODEX_HOME:-$HOME/.codex}/generated_images`, delete the original generated file after the decoded copy exists:
```bash
GENERATED_ROOT="${CODEX_HOME:-$HOME/.codex}/generated_images"
case "$SOURCE" in
"$GENERATED_ROOT"/*)
rm -f "$SOURCE"
rmdir "$(dirname "$SOURCE")" 2>/dev/null || true
;;
esac
```
5. Derive `running-left` only when it is visually safe:
```bash
python "$SKILL_DIR/scripts/derive_running_left_from_running_right.py" \
--run-dir /absolute/path/to/run \
--confirm-appropriate-mirror \
--decision-note "<why mirroring preserves this pet's identity>"
```
That script mirrors each generated frame slot in place so the leftward row preserves the rightward row's temporal order. Do not replace it with a whole-strip mirror that reverses animation timing.
6. When all jobs are complete, run the image-processing scripts directly:
```bash
RUN_DIR=/absolute/path/to/run
mkdir -p "$RUN_DIR/final" "$RUN_DIR/qa"
```
```bash
python "$SKILL_DIR/scripts/extract_strip_frames.py" \
--decoded-dir "$RUN_DIR/decoded" \
--output-dir "$RUN_DIR/frames" \
--states all \
--method auto
```
```bash
python "$SKILL_DIR/scripts/inspect_frames.py" \
--frames-root "$RUN_DIR/frames" \
--json-out "$RUN_DIR/qa/review.json" \
--require-components
```
```bash
python "$SKILL_DIR/scripts/compose_atlas.py" \
--frames-root "$RUN_DIR/frames" \
--output "$RUN_DIR/final/spritesheet.png" \
--webp-output "$RUN_DIR/final/spritesheet.webp"
```
```bash
python "$SKILL_DIR/scripts/validate_atlas.py" \
"$RUN_DIR/final/spritesheet.webp" \
--json-out "$RUN_DIR/final/validation.json"
```
```bash
python "$SKILL_DIR/scripts/make_contact_sheet.py" \
"$RUN_DIR/final/spritesheet.webp" \
--output "$RUN_DIR/qa/contact-sheet.png"
```
```bash
python "$SKILL_DIR/scripts/render_animation_previews.py" \
--frames-root "$RUN_DIR/frames" \
--output-dir "$RUN_DIR/qa/previews"
```
If the preview GIFs show size popping or baseline jumps caused by per-frame fit-to-cell extraction, and the original row strip itself had stable scale and placement, rerun frame extraction with the explicit row-stability mode and then re-run inspection, atlas composition, validation, contact sheet generation, and previews:
```bash
python "$SKILL_DIR/scripts/extract_strip_frames.py" \
--decoded-dir "$RUN_DIR/decoded" \
--output-dir "$RUN_DIR/frames" \
--states all \
--method stable-slots
```
```bash
python "$SKILL_DIR/scripts/inspect_frames.py" \
--frames-root "$RUN_DIR/frames" \
--json-out "$RUN_DIR/qa/review.json" \
--require-components \
--allow-stable-slots
```
Use `stable-slots` as a deliberate QA-driven correction, not the default. It should reduce extraction-induced motion pops without hiding clipped wide poses or bad source strips.
Expected output before cleanup:
```text
run/
pet_request.json
imagegen-jobs.json
prompts/
decoded/
frames/frames-manifest.json
final/spritesheet.webp
final/validation.json
qa/contact-sheet.png
qa/previews/*.gif
qa/review.json
qa/run-summary.json
```
Package output is written outside the run directory by default. If `CODEX_HOME` is set, use it; otherwise use `$HOME/.codex`.
```text
${CODEX_HOME:-$HOME/.codex}/pets/<pet-name>/
pet.json
spritesheet.webp
```
Package with shell and `jq`:
```bash
RUN_DIR=/absolute/path/to/run
PET_ID=$(jq -r '.pet_id' "$RUN_DIR/pet_request.json")
DISPLAY_NAME=$(jq -r '.display_name' "$RUN_DIR/pet_request.json")
DESCRIPTION=$(jq -r '.description' "$RUN_DIR/pet_request.json")
PET_DIR="${CODEX_HOME:-$HOME/.codex}/pets/$PET_ID"
mkdir -p "$PET_DIR"
cp "$RUN_DIR/final/spritesheet.webp" "$PET_DIR/spritesheet.webp"
jq -n --arg id "$PET_ID" --arg displayName "$DISPLAY_NAME" --arg description "$DESCRIPTION" '{id: $id, displayName: $displayName, description: $description, spritesheetPath: "spritesheet.webp"}' > "$PET_DIR/pet.json"
```
Write `qa/run-summary.json` after packaging:
```bash
jq -n --arg run_dir "$RUN_DIR" --arg spritesheet "$RUN_DIR/final/spritesheet.webp" --arg validation "$RUN_DIR/final/validation.json" --arg contact_sheet "$RUN_DIR/qa/contact-sheet.png" --arg review "$RUN_DIR/qa/review.json" --arg package "$PET_DIR" '{ok: true, run_dir: $run_dir, spritesheet: $spritesheet, validation: $validation, contact_sheet: $contact_sheet, review: $review, package: $package}' > "$RUN_DIR/qa/run-summary.json"
```
After deterministic image processing, inspect `qa/contact-sheet.png` and `qa/previews/*.gif` with a lightweight visual QA worker before accepting the pet. Deterministic validation is necessary but not sufficient. Block acceptance if any row changes species/body type, face, markings, palette, material, prop design, style, prop side unexpectedly, or overall silhouette. Motion previews must also reject unintended size popping, reversed or stagnant directional cadence, wrong facing direction, and idle loops that are technically different but visually inert.
After model visual QA accepts the contact sheet, remove intermediate run artifacts:
Keep `pet_request.json`, `final/spritesheet.webp`, `final/validation.json`, `qa/contact-sheet.png`, `qa/previews/`, `qa/review.json`, and `qa/run-summary.json`. Remove generated prompt files, layout guides, decoded row strips, extracted frames, `final/spritesheet.png`, and the imagegen job manifest. Skip cleanup when the user wants debug artifacts or the run still needs repair.
## Lightweight Visual Workers
Use lightweight subagents for image-heavy work by default. This bounds each `$imagegen` rollout to one selected image, keeps contact-sheet vision payloads out of the parent thread, and reduces cost while preserving the full 9-state app contract.
## Subagent Delegation
Unless explicitly forbidden by the user, use subagents for this run. If the user has not allowed the use of subagents, or the intent on subagent use is vague, then ask the user for permission to spawn subagents for parallel lanes of work.
Parent responsibilities:
- run the brand discovery worker before preparation when the user provides a bare brand/product/company/prospect name
- prepare the run and inspect `imagegen-jobs.json`
- assign the base job, row jobs, and final contact-sheet QA to lightweight workers
- copy selected worker outputs into their decoded paths and mark jobs complete in `imagegen-jobs.json`
- create `references/canonical-base.png` from the selected base output
- run the approved `running-left` mirror derivation when appropriate
- run deterministic image processing, packaging, repair regeneration, and cleanup
Base worker responsibilities:
- handle only the `base` job
- read `prompts/base-pet.md` and use any listed reference images
- use `$imagegen` only
- honor any compact brand inspiration line in the prompt as broad visual/personality guidance, without copying logos, readable marks, UI screenshots, slogans, or text
- return only `selected_source=/absolute/path/to/selected-output.png` and `qa_note=<one sentence>`
Row worker responsibilities:
- handle exactly one row job
- read the row prompt and use all listed input images
- use `$imagegen` only; do not draw, edit, tile, or synthesize sprites locally
- perform a quick visual sanity check for frame count, identity, chroma background, spacing, clipping, and detached effects
- enforce the row prompt's transparency and effects rules, including no detached effects, no wave marks for `waving`, no speed lines or dust for directional running rows, no literal foot-running for the non-directional `running` row, and only attached opaque sprite-like tears/smoke/stars when allowed by the state prompt
- return only `selected_source=/absolute/path/to/selected-output.png` and `qa_note=<one sentence>`
Final visual QA worker responsibilities:
- inspect `qa/contact-sheet.png` plus the row GIFs under `qa/previews/`, with `qa/review.json` and `final/validation.json` as text context when useful
- verify all 9 rows match the Codex app state contract and the same pet identity
- return a compact result: `visual_qa=pass` or `visual_qa=fail`, plus row-specific repair notes when failing
- do not edit files, queue repairs, package, or clean up
Model choice for workers:
- Prefer a smaller capable model for brand discovery, since it returns a compact research brief rather than doing orchestration.
- Prefer a smaller capable model for visual workers, such as `gpt-5.4-mini` with medium reasoning, when model override is available.
- Use the parent/default model only for orchestration or when a smaller worker model is unavailable.
- Keep at most two generation workers active at once unless the user explicitly asks for higher parallelism. Run final visual QA as a single worker after deterministic image processing. Close workers after their result has been consumed.
Use this base worker prompt:
```text
Generate the hatch-pet base image.
Run dir: <absolute run dir>
Job id: base
Prompt file: <absolute base prompt file>
Input images:
- <absolute path> — <role>
Use $imagegen only. Read the base prompt and attach every listed input image. If the prompt contains brand inspiration, use it only as broad mascot-safe guidance; do not copy logos, readable marks, UI screenshots, slogans, or text. Before returning, visually check that the result is one centered full-body pet on a flat chroma background, with no text, scenery, shadows, or detached effects.
Do not edit manifests, copy into decoded, mark jobs complete, generate rows, run image-processing scripts, repair, package, or open unrelated files.
Do not include Markdown image previews, base64, or extra attachments in the final response.
Return exactly:
selected_source=/absolute/path/to/selected-output.png
qa_note=<one sentence>
```
Use this row worker prompt:
```text
Generate one hatch-pet row.
Run dir: <absolute run dir>
Row id: <row-id>
Prompt file: <absolute prompt file>
Retry prompt file: <absolute retry prompt file>
Input images:
- <absolute path> — <role>
- <absolute path> — <role>
Use $imagegen only. Read the row prompt and attach every listed input image. If imagegen returns Bad Request, retry once with the retry prompt and the same input images.
Before returning, visually check: exact frame count, same pet identity as canonical base, flat chroma background, complete separated unclipped poses, and no detached effects or guide marks. The prompt's transparency and effects rules are mandatory: no detached effects, no wave marks for `waving`, no speed lines or dust for directional running rows, no literal foot-running for the non-directional `running` row, and only attached opaque sprite-like tears/smoke/stars when allowed by the state prompt.
Do not edit manifests, copy into decoded, mark jobs complete, mirror rows, run image-processing scripts, repair, package, or open unrelated files.
Do not include Markdown image previews, base64, or extra attachments in the final response.
Return exactly:
selected_source=/absolute/path/to/selected-output.png
qa_note=<one sentence>
```
Use this final visual QA worker prompt:
```text
Visually QA one finalized hatch-pet contact sheet.
Run dir: <absolute run dir>
Contact sheet: <absolute run dir>/qa/contact-sheet.png
Preview dir: <absolute run dir>/qa/previews
Review JSON: <absolute run dir>/qa/review.json
Validation JSON: <absolute run dir>/final/validation.json
Inspect the contact sheet and the preview GIFs visually. Confirm the same pet identity, style, palette, silhouette, face, proportions, and props across all rows:
0 idle, 1 running-right, 2 running-left, 3 waving, 4 jumping, 5 failed, 6 waiting, 7 running, 8 review.
Fail rows with identity drift, missing/blank frames, copied guide marks, white/nontransparent backgrounds, cropped bodies, slot overlap, detached effects, shadows/glows/smears/dust, chroma-key artifacts, motion that does not match the row state, unintended size popping, wrong facing direction, reversed or non-alternating gait, or idle loops that are effectively static.
Do not edit files, queue repairs, package, clean up, or inspect unrelated files.
Return exactly:
visual_qa=pass|fail
qa_note=<one sentence summary>
repair_rows=<comma-separated row ids, or none>
repair_notes=<short row-specific notes, or none>
```
## Repair Workflow
If frame inspection or final visual QA fails, read `qa/review.json`, regenerate the smallest failing scope, copy the replacement row into the same decoded output path, and keep that job marked complete with the new `source_path` and `completed_at`. Repair the failed row, not the whole sheet.
For identity repairs, use the canonical base image, original references, contact sheet, and exact row failure note as grounding context. Give the row worker the existing row prompt plus a compact repair note from `qa/review.json`; preserve the canonical pet identity and chosen style.
For extraction-induced motion popping, do not regenerate imagery first. If the source strip already preserves row-level scale and baseline, rerun the deterministic pipeline with `--method stable-slots`, inspect with `--allow-stable-slots`, then re-check the preview GIFs. Regenerate the row only when the original strip itself is clipped, unstable, or semantically wrong.
## Rules
- Keep `$imagegen` as the primary generation layer.
- For brand/product/company/prospect requests without a concrete avatar description or reference image, run brand discovery before base generation and pass only the compact brief into the run.
- Use `$imagegen` as the only visual generation layer. Do not invoke image APIs, image CLIs, local raster generators, or one-off generation scripts from this skill.
- Keep reference images attached/visible for `$imagegen` whenever the chosen path supports references.
- Attach the row's `references/layout-guides/<state>.png` image to every row-strip job as a layout-only guide, and do not accept outputs that copy guide pixels.
- Use lightweight visual workers for base generation, row-strip visual generation, and final contact-sheet QA by default; the parent owns manifest updates, deterministic image scripts, packaging, and cleanup.
- Generate every normal visual job with `$imagegen`: base plus all row strips that are not explicitly approved `running-left` mirror derivations.
- Treat only the base job as eligible for prompt-only generation; every row job must attach its listed grounding images.
- Generate `running-right` before deciding whether `running-left` can be mirrored.
- When `running-left` is mirrored, preserve frame order and timing semantics; derive it through the deterministic script instead of mirroring an entire strip wholesale.
- Do not derive or reuse `waiting`, `running`, `failed`, `review`, `jumping`, or `waving` from another state; each has distinct app semantics and must be generated as its own row.
- Never substitute locally drawn, tiled, transformed, or code-generated row strips for missing `$imagegen` outputs.
- Only mark a visual job complete after its selected output has been copied into the decoded output path.
- Do not rely on generated images for exact atlas geometry; use this skill's deterministic image scripts.
- Use the chroma key stored in `pet_request.json`; do not force a fixed green screen.
- Keep the pet's silhouette, face, materials, palette, style, and props consistent across all rows.
- Treat visual identity or style drift as a blocker even when `qa/review.json` and `final/validation.json` have no errors.
- Treat a contact sheet that shows cropped references, repeated tiles, white cell backgrounds, or non-sprite fragments as failed.
- Treat preview GIFs that show extraction-induced size popping, reversed directional timing, wrong facing direction, or inert idle loops as failed.
- Treat forbidden detached effects, chroma-key-adjacent artifacts, shadows, glows, smears, dust, landing marks, wave marks, speed lines, or motion trails as failed rows.
- Treat `qa/review.json` errors as blockers. Warnings require visual review.
## Acceptance Criteria
- Final atlas is PNG or WebP, `1536x1872`, transparent-capable, and based on `192x208` cells.
- Used cells are non-empty and unused cells are fully transparent.
- Atlas follows the row/frame counts in `references/animation-rows.md`.
- Contact sheet and per-row motion previews have been produced and inspected by a lightweight visual QA worker.
- `qa/review.json` has no errors.
- Row-by-row review confirms the animation cycles are complete enough for the Codex app.
- Motion previews do not show unintended size popping, reversed directional cadence, or wrong row semantics.
- Non-pixel styles are accepted when readable at pet size and consistent across rows.
- `${CODEX_HOME:-$HOME/.codex}/pets/<pet-name>/pet.json` and `${CODEX_HOME:-$HOME/.codex}/pets/<pet-name>/spritesheet.webp` are staged together for custom pets.
Источник: openai/skills / hatch-pet ↗. Ссылка проверена 2026-10-10.