Yingzao: скилл Guizang, который превращает фото китайской архитектуры в editorial-постер
Claude Code / Codex-скилл, где детерминированный Python стоит воротами перед единственным дорогим вызовом GPT-Image-2. Разбираю контракт трёх картинок, восемь гейтов, токен-систему из 104 токенов и шесть семей китайских дисплейных глифов — и то, что из этого стоит перенести в собственные скиллы.
Коротко
- Что это. Скилл
yingzao(«营造» — «возводить»; отсылка к «Инчжао фаши», строительному канону династии Сун) берёт реальное фото китайского здания, улицы, лавки, интерьера или местной еды и делает арт-директорский постер с китайским дисплейным шрифтом. Рисует GPT-Image-2 в режиме edit; сам скилл ничего не рисует — он готовит, проверяет и запечатывает вход в модель. - Зачем читать, если постеры не нужны. Это самый последовательный из виденных мной примеров, где код делает то, что умеет (измерение, покрытие шрифтов, коллизии, геометрию, передачу входов), а модель — то, что не умеет код (семантическую вырезку, реконструкцию пространства, материалы, свет, связь текста с картинкой). «Сначала компилируем, потом вызываем» — и ни одной скрытой повторной генерации.
- Кто автор. Один из самых заметных китайских AI-блогеров и авторов скиллов:
guizang-ppt-skill— 25.6k ★,Humanizer-zh— 16.7k ★,guizang-social-card-skill— 6.8k ★. Yingzao — свежий и пока небольшой, но по инженерной плотности выше остальных. - Что настораживает. Нет лицензии; жёсткая привязка к GPT-Image-2 и инструменту imagegen (Codex-first); 43 референс-постера неизвестного происхождения лежат прямо в репозитории; шрифты с CJK не входят в поставку; церемония тяжёлая — 10–20 вызовов инструментов до одной картинки. Качество постеров я не проверял: доступа к GPT-Image-2 в этой сессии нет.
Что скилл делает — глазами пользователя
Вход, выход, установка и границы применимости
Вход: одна или несколько фотографий, место или название объекта, сколько постеров нужно, нужен ли коллаж «оригинал ↔ постер». Если пользователь говорит «решай сам», по умолчанию: один постер, только подтверждённые короткие слова, без коллажа.
Выход: постер в одном из пяти форматов (3:4, 4:3, 16:9, 9:16, 1:1), по запросу — сравнение с оригиналом, по отдельному согласию — раскадровка 3×3 и промпт для видеомодели.
Типовой промпт из README (перевод):
Используй $yingzao, чтобы сделать из этой фотографии старого города Датун editorial-постер 3:4. Место и заголовок выбери по данным, которые я дал; коллаж с оригиналом не нужен.
Что именно происходит с фотографией
Диагностика и защита
- Одна композиционная проблема. Скилл определяет тип кадра — фасад в лоб, съёмка снизу, диагональ, кадр «в раме», фрагмент конструкции, «сцена-нарратив» — и исправляет ровно одну проблему, а не всё подряд.
- Якоря идентичности. Скат крыши, взлёт карниза, табличка над входом, силуэт, асимметрия — то, по чему здание узнаётся. Их запрещено «выравнивать» и «улучшать» в другое здание.
- Идея до референсов. Прежде чем смотреть образцы, агент письменно фиксирует четыре домена: как обработан субъект, как фон участвует в композиции, как текст взаимодействует с реальным силуэтом, какой ненормативный приём вёрстки ломает «двойное центрирование». Логика: чем больше референсов до идеи, тем банальнее результат.
Дизайн и генерация
- Один рецепт, одна доминирующая референс-картинка — вместо десятков стилевых слов, склеенных в промпт.
- Дисплейный шрифт по наблюдаемым признакам: ширина, центр тяжести, контраст штрихов, окончания, внутренние просветы, ритм, поверхность-носитель. Мелкий текст — другой, обычной гарнитурой.
- Семантическая вырезка субъекта, перенос, зонная материализация — и реальный контур здания должен перекрывать заголовок, делить с ним кромку или «вкусываться» в него негативной формой.
- Мульти-фото «в одно». Из каждого снимка извлекается субъект; всё собирается в одну сцену с общей перспективой, светом, контактными тенями и единым языком кромок. Прямоугольники исходных фото сохраняются только по явной просьбе о коллаже.
Для чего подходит
- Старая архитектура, исторические кварталы, народное жильё, сады, местные пространства.
- Культурные лавки, тёплые интерьеры, ремесленные предметы, местная еда.
- Обложки для тревел-заметок, одиночные постеры, многофотографийные сцены одного места.
- Всё, где нужен дизайн китайского дисплейного шрифта и взаимодействие текста с субъектом.
Для чего не подходит
- Обычная товарная реклама и карточки маркетплейсов.
- Рутинная ретушь: экспозиция, резкость, замена неба.
- Выдуманные «древние здания» без реального места и субъекта.
- Детерминированный коллаж с наложением текста, где модель изображений вообще не нужна.
Установка и требования
npx skills add https://github.com/op7418/guizang-yingzao-skill --skill yingzao python3 yingzao/scripts/check_dependencies.py
Python 3.10+, Pillow, NumPy, OpenCV (headless), fontTools. Нужен агент, который поддерживает Skills, читает локальные изображения и умеет вызывать генерацию или редактирование картинок. На практике это Codex со встроенным imagegen или Claude Code с собственным мостом к OpenAI Images API — документация описывает параметры именно gpt-image-2 и /v1/images/edits.
Скрипт зависимостей не ставит пакеты глобально: _runtime.py ищет совместимый .venv в рабочей директории вызывающего и её родителях или берёт интерпретатор из CAP_PYTHON; не нашёл — останавливается и объясняет. Артефакты пишутся только в output/yingzao/<run-id>/ в директории пользователя, никогда внутрь пакета скилла.
Центральный контракт: три картинки на вход модели
Кто отвечает за геометрию, кто за механику, кто за вёрстку
Для «высокостилизованных» задач — то есть почти всегда — вызов модели изображений получает три картинки в фиксированном порядке. Это не рекомендация, а контракт, который проверяет скрипт prepare_generation.py.
Порядок картинок фиксирован и проверяется скриптом: первая всегда edit target, вторая — доминирующий референс, третья — подложка; дополнительные снимки того же места идут с четвёртой позиции. Маркеры S1 / B1 / T1 на подложке ссылаются на действия, вписанные в промпт.
| Позиция | Роль | Что даёт модели | Чего в ней нет |
|---|---|---|---|
| Image 1 — edit target | Выправленный оригинал | Единственный источник реальной геометрии и идентичности здания | Никаких стилевых правок |
| Image 2 — primary visual reference | Одна реальная референс-пластина из каталога (43 штуки в assets/reference-plates/) | Целостный визуальный механизм: обработка субъекта, активный фон, иерархия материалов, напряжение «текст ↔ изображение» | Её здание, текст, бренды, символы — переносить запрещено |
| Image 3 — typeset guide | Разреженная нейтральная серая подложка, отрисованная typeset_compose.py настоящим шрифтом | Подтверждённый текст, реальные границы глифов, общие оси, порядок чтения, зоны действий с маркерами, контур субъекта для окклюзии | Пикселей целевого фото, финальных цветов, текстур, «веб-контейнеров» |
| Image 4+ — support | Дополнительные снимки того же места | Только поимённо названные объекты | — |
Разделение труда сформулировано жёстко. Модель обязана сделать то, что код не может: семантическую вырезку, восстановление фона, перерисовку глифов в заданной морфологии, окклюзию текста реальным контуром. Код обязан сделать то, что модель не гарантирует: проверить покрытие шрифта (cmap), коллизии, выравнивание, геометрию, подготовку входов. Схема «обрезал, наложил фильтр, напечатал заголовок» объявлена недействительной: если результат воспроизводим без модели, вызов бессмыслен — это отдельный токен-политика cap.policy.image-model-value-gate.
Отдельно запрещены «два острова»: субъект по центру, заголовок по центру, друг друга не касаются. Три домена — субъект, фон, взаимодействие — должны читаться на масштабе миниатюры.
Пайплайн: пять стадий и что остаётся на диске
От проверки зависимостей до единственного разрешённого вызова
output/yingzao/<run-id>/
inputs/ # выправленные копии; оригиналы не трогаются
analysis/ # preflight, brief, glyph-brief, typeset-spec/guide/report,
# recipe.json, design-plan.json, generation-prompt.txt,
# generation-call.json, readback.md
drafts/ # только если пользователь просил исследовать варианты
final/ # постер и опциональное сравнение
recipe-history.json # история рецептов для де-дубликации между сессиями
-
〇стадия 0
Безопасный вход
check_dependencies.pyдолжен вернуть 0, иначе стоп. Каждый снимок проходитphoto_preflight.py: размер, пропорции, экспозиция, резкость, плотность кромок, оценка крена, доминирующие цвета, кандидаты негативного пространства, EXIF. Вердикт —hero / support / reject; числа названы «доказательствами для решения», а не заменой взгляду на здание.При необходимости —
rectify.py: детерминированный поворот, перспектива, кроп. Исправляется только крен камеры и трапеция; реальный скат крыши, кривая карниза, асимметрия и намеренная косая съёмка не выпрямляются. Крен до 0,3° считается «не трогать» и помечаетсяauto_roll_noop=true.Факты градируются:
VERIFIED / OBSERVED / USER-CONFIRMED / UNCONFIRMED; в постер попадают только первые три.Артефактыanalysis/preflight.jsonanalysis/rectify.jsoninputs/01-*.png -
一стадия 1
Заморозить идею, потом искать референс
Сначала письменно фиксируются четыре домена: субъект, фон, взаимодействие, приём вёрстки. Только потом
design_tokens.py suggest --tag … --maximize-distance --history … --record-historyиrecipe <id> --json. Ноль совпадений — код возврата 2 — переформулировать теги; «кандидаты по алфавиту» запрещены.Из
reference_assetsрецепта выбирается ровно одна доминирующая пластина. Она должна быть совместима с целью по главной оси, доле субъекта в кадре, топологии негативного пространства и границе взаимодействия — и реально демонстрировать все три домена, а не только «цвет, бумагу и шрифт».Результат —
creative-brief.md, где записано только то, что меняет решения генерации, и проход восьми ворот.Артефактыanalysis/recipe.jsonanalysis/creative-brief.mdrecipe-history.json -
二стадия 2
Глифы и пространство
design-plan.json: четыре–шесть «биндингов» с полямиtarget / prompt_instruction / visible_result / guide_markers, каждый в одном из доменовsubject / background / typography / interaction. В план входят все активные токены рецепта — ровно по одному разу.typeset_compose.py blank spec.json guide.png --report report.jsonрисует подложку и проверяет: покрытие cmap для каждого символа (отсутствующий глиф — отказ, «тофу» от Pillow не считается), реальные границы чернил, группы выравнивания с допуском 0,25 % ширины холста, зоны запрета для линий и примитивов, контракты окклюзии, порядок вертикального письма. Отчётpassed=true— единственный пропуск дальше.Если заголовок в режиме
reinterpret— дополнительноglyph-brief.md(раздел «Глифы»).Артефактыanalysis/design-plan.jsonanalysis/typeset-spec.jsonanalysis/typeset-guide.pnganalysis/typeset-report.jsonanalysis/glyph-brief.md -
三стадия 3
Компиляция и один вызов
Промпт пишется вручную по минимальному контракту из двенадцати обязательных секций:
Primary transformation,Image roles,Composition diagnosis,Composition repair,Subject treatment,Background treatment,Interaction,Reference transfer,Identity invariants,Typography layout,Text (verbatim),Do not add; опциональноDisplay glyph design. В нём запрещены списки токенов, примеры провалов, чеклисты и ручная секцияMechanism bindings— её компилирует скрипт.prepare_generation.pyпроверяет, что все картинки разные, размер подложки совпадает с отчётом, отчёт пройден, в промпте есть все секции и поимённо названы Image 1/2/3, у каждого активного токена есть путь доставки, маркеры промпта и подложки совпадают в обе стороны, дляreinterpretесть scaffold, точный заголовок и глиф-бриф. Затем вписывает биндинги в финальный промпт, копирует входы в стабильные пути и пишетgeneration-call.json.Только при выводе
READYразрешён вызов — строгоimagegen(manifest["tool_arguments"]). Пересказывать промпт, менять порядок картинок, подставлять «последнюю картинку из чата» нельзя.Артефактыanalysis/generation-prompt.txtanalysis/generation-call.jsoninputs/02-primary-reference.*final/poster.png -
四стадия 4
Одно чтение и передача решения пользователю
Агент открывает результат инструментом чтения изображений и проверяет ровно пять вещей: субъект узнаваем и действительно вырезан, перемещён или материализован; фон активен, а не исходное небо или градиент; заголовок — не обычный шрифт, текст точен, оси и роли мелкого текста держатся; окклюзия, общая кромка или негативная форма состоялись; механизм Image 2 виден, а не только похожие цвета. Ноль–три наблюдения уходят в
readback.md.Без оценок, без proof-листов, без автоповтора. Правки — только после отзыва пользователя: локальные (глиф, опечатка, кромка) — edit текущего постера с блокировкой остальных пикселей; структурные (субъект, фон, макет, референс) — возврат к выправленному оригиналу и переделка идеи, референса и подложки. Затирать латками сломанную топологию запрещено.
Затем один вопрос: расширить ли в раскадровку 3×3 и промпт для видео. Видео само не генерируется.
Артефактыanalysis/readback.mdfinal/comparison.pngvideo/storyboard-3x3.pngvideo/VIDEO_PROMPT.md
Параметры GPT-Image-2, зашитые в документацию
model=gpt-image-2; реальные фото — через /v1/images/edits; для финала quality=high, low/medium только по явной просьбе «быстро посмотреть»; без input_fidelity; без прозрачного фона; маска действует только на первую картинку. Размеры: 3:4 — 1536×2048, 4:3 — 2048×1536, 16:9 — 2048×1152, 9:16 — 1152×2048, 1:1 — 1536×1536.
Восемь жёстких ворот перед вызовом
Проверяется вход и план, не результат; при провале — чинить или деградировать, но не «сгенерировать и посмотреть»
preflight-gates.md объявлен «единственным источником правды для гейтов перед дорогим вызовом». Он не оценивает результат и не запускает повторы. Ниже — суть каждого гейта и моё пояснение, зачем он нужен.
- 1
Зависимости и пути
Скрипт зависимостей вернул 0; работа идёт в
output/yingzao/<run-id>/пользователя; внутри пакета скилла нет кэша, тестовых картинок и артефактов.Скилл устанавливается в чужие проекты — он не должен их пачкать и не должен зависеть от глобального Python.
- 2
Фото, идентичность, геометрия
У каждого снимка есть отчёт preflight и роль; стратегия композиции — одна из
preserve / deterministic-rectify-crop / semantic-recompose— и одно главное исправление; якоря идентичности не тронуты; дорисовывать разрешено только то, что непрерывно продолжается (небо, вода, земля, прямая колонна, стена), а не крышу, этажи, окна или скульптуры.Модель охотно «достраивает» здания — гейт заранее запрещает выдумывать конструкцию.
- 3
Факты и текст
Текст только из
VERIFIED / OBSERVED / USER-CONFIRMED; слова разбиты на «обязательно / можно / нельзя / рискованно»; редкие иероглифы не несут гигантских структурных заголовков; «исторический памятник», «реставрация», «перенос», «новодел» и «современное здание» не перепутаны.Модель портит редкие знаки, а туристический текст врёт о датах — оба риска закрываются до генерации.
- 4
Идея и доминирующий референс
Четыре домена записаны до поиска; ровно одна реальная пластина на входе; она совместима по оси, силуэту, доле и негативному пространству;
requires / conflicts / mutex_groupsразрешены; референс демонстрирует все три домена, а не только цвет и бумагу.Референс, у которого после вычитания брендов и здания остаются лишь прилагательные, — не референс.
- 5
Добавленная стоимость модели
Домен субъекта содержит вырезку, перестройку масштаба или позиции либо зонную материализацию; домен фона — цветовое поле, окно, срез светлоты или восстановленное пространство; домен взаимодействия — окклюзию, общую кромку, проникновение или негативную форму; всё видно на миниатюре; есть ненормативный приём вёрстки. Провал: центрированный заголовок на исходном фото, «два острова», фильтр плюс текст, обычный градиент, прямоугольный коллаж.
Если результат можно собрать без модели — платить за вызов бессмысленно.
- 6
Типографическая подложка
typeset_compose.pyвернулpassed=true; у каждого дисплейного слоя явныйglyph_design_mode;literalрисуется какguide_render: text,reinterpret— какscaffold; для «текст за субъектом» естьsubject_front + subject-footprint, снятые с контура Image 1.Полноразмерный контур обычного шрифта на подложке — самый сильный якорь для модели; гейт не даёт ему победить глиф-бриф.
- 7
Дисплейные глифы
literal— обычный шрифт;reinterpret— естьglyph-brief.mdс одной морфологической семьёй и минимум пятью видимыми признаками; для заголовка из 2–5 знаков — покомпонентная таблица оптических компенсаций; мелкий текст остаётся обычным.Без наблюдаемой формы «премиальный винтажный сун» превращается в системный шрифт по умолчанию.
- 8
Вызов и вывод
Порядок входов, три–пять инвариантов идентичности, короткий текст, количество, пропорция, качество и путь сохранения определены;
recipe.jsonиdesign-plan.jsonсохранены; все токены доставлены ровно один раз; промпт соответствует минимальному контракту; маркеры совпадают в обе стороны;prepare_generation.pyвернулREADY.Единая точка, где план становится манифестом, — и только манифест идёт в модель.
Условные ворота
- Иностранный или латинский референс. Переносится только механизм; китайская семантика, целевая геометрия и местные материалы «перехватывают» содержание; удаляются исходные топонимы, люди, бренды, религиозные символы и архитектурная идентичность.
- «Буквенное окно» (заголовок как маска для фото). Контейнер совместим с осью субъекта и полностью сохраняет хотя бы одну зону идентичности; широкие многоярусные карнизы и высокочастотные фасады обычно в окно не идут.
- Семантический декор. Только из видимого, подтверждённого пользователем или проверенного; несёт не меньше двух композиционных задач; входит максимум в три роли.
layered-final-type(программная накладка текста поверх арт-подложки). Только если пользователь выбрал его до генерации и подготовлены шрифт, маска и место; никогда как латка после провала модели с текстом.- Несколько вариантов. Разные
familyи главный макет, плюс хотя бы одно видимое отличие в контейнере субъекта, действии глифов, главном материале, полярности светлоты или языке кромок. «Только другой фон» новым вариантом не считается.
Токен-система: дизайн-токены как поисковый индекс, а не как промпт
104 токена, 22 рецепта, 7 слотов взаимоисключения — и запрет склеивать их в промпт
Файл references/design-tokens.json (версия 1.10.0, namespace cap) — машинно-читаемый каталог. Цифры на дату разбора:
Категории по числу токенов: typography 20, layout 15, policy 14, material 13, background 9, color 8, depth 7, subject 6, context 4, grid 3, spacing 3, content 2.
Четыре уровня, заимствованные у дизайн-систем
Вычислимые базовые величины: колонки сетки, поля, доля окклюзии, z-индекс. Сами по себе стиль не задают — это линейка, а не замысел.
Отвечают на вопрос «за что это отвечает в кадре»: китайский дисплейный заголовок, метаданные, масштаб фона, защита идентичности, местный акцентный цвет.
Переиспользуемый визуальный механизм: «буквенное окно-монумент», «непрерывные вертикальные окна», «поле текста-источника», «маска кромки орнаментом», «здание мелкой растровой точкой».
Уже проверенная на совместимость группа токенов с указанием референсов. Автор подчёркивает: «стартовая точка, а не шаблон» — область субъекта, текст, цвета и материалы всё равно берутся из текущей фотографии.
Слоты взаимоисключения
Скелет каждого рецепта: из каждого слота — ровно один механизм. Взаимоисключение ограничивает только «главные» механизмы одного типа; бумажная текстура, шрифт метаданных, защита идентичности и z-отношения добавляются как зависимости.
Контракт токена
{
"id": "cap.layout.type-window",
"tier": "component",
"label": "字窗纪念碑",
"intent": "让短标题同时成为图像容器和背景尺度",
"value": { "subject_inside": "60-75%", "identity_breakout": "25-40%" },
"tags": ["塔", "门楼", "短标题", "字窗"],
"requires": ["cap.type.display-cn", "cap.subject.identity-protection"],
"conflicts": ["cap.layout.multi-image-collage"],
"constraints": ["标题限 2-5 个汉字", "至少一个身份锚点越出蒙版"]
}
«Буквенное окно-монумент»: короткий заголовок становится и контейнером для фото, и масштабом фона; субъект на 60–75 % внутри букв, 25–40 % якорей идентичности вырывается наружу; заголовок 2–5 знаков.
id— стабильный интерфейсcap.<category>.<name>; переименовывать нельзя, только добавлять алиасы и записи о миграции.intent— визуальная задача, не прилагательное.value— диапазоны, а не псевдоточные числа.requires— жёсткая зависимость;compatible— плюс к очкам, не обязанность;conflicts— двусторонний жёсткий конфликт.constraints— границы на естественном языке, которые должны быть закрыты в брифе или гейтах.prompt— кандидат на описание действия, который никогда не склеивается автоматически с другими.sources— доказательство из референсов, «не разрешение на копирование».
Ключевая мысль, повторённая в трёх документах
Красивый референс — это высокоразмерная взаимозависимость композиции, материала, цвета, масштаба, кромок и вёрстки, которую нельзя полностью описать словами. Разбор на токены нужен для поиска и объяснения; при генерации надо вернуться к одной реальной картинке. «Безопасное пересечение большего числа токенов» даёт посредственный общий знаменатель. Поэтому:
- промпт выражает одно художественное направление;
prompt-поля токенов не конкатенируются — исполнитель сливает совместимые токены в 4–6 действий над текущей фотографией;- но каждый активный токен обязан иметь путь доставки:
prompt+guide(вошёл в биндинг и стоит маркером на Image 3) илиpreprocess(только детерминированная коррекция);generation-call.json.token_deliveryфиксирует это,missingдолжен быть нулём.
Секцию Mechanism bindings агент не пишет руками — её компилирует скрипт из плана; в промпте пользователя она запрещена. Так исключается расхождение между тем, что задумано, что нарисовано на подложке и что реально ушло в модель.
Мелкие механики, за которыми приятно наблюдать
- Стилевой отпечаток и история. Рецепт выводит шестиосевой отпечаток (
ground / polarity / era / texture / saturation / image_behavior) из своих токенов;--maximize-distance --history --record-historyрасталкивает варианты и не даёт двум сессиям скатиться в один и тот же «бежевый винтаж». История лежит у пользователя, не в пакете. - Оценка кандидатов. Прямое совпадение геометрии +3, явная совместимость +2, тот же реальный источник +1, слабая посадка −2, непонятное культурное происхождение −3, конфликт или риск для якоря идентичности — вылет. Очки только сортируют, жёстких ограничений не перекрывают.
- Контролируемые теги. 41 наблюдаемый признак — 单体 建筑群 中轴 偏侧 横向 竖向 低机位 正立面 天空留白 … 食物 饮品 店铺 桥 塔 城墙 城门 院落 街巷 屋檐 门洞 — плюс алиасы вида «храм / монастырь / старый храм → 山寺», «сад → 院落». Свободные синонимы не принимаются: если все теги не совпали, команда возвращает код 2.
- «Базовые качественные» токены (
cap.policy.*,cap.subject.preflight-rectification,cap.primitive.optical-alignment) не про стиль, а про то, чтобы композиция и вёрстка не сломались до стилевого микса. Среди нихtypography-context-fit-gate: жирный гротеск или гигантские геометрические знаки разрешены только при монументальном объёме, жёсткой оси, современной коммерции или «ночном» тоне; тёплое дерево, ручная работа, еда и культурные интерьеры получают сун/мин-шрифты и мелкие засечки. - Правила расширения. Не создавать токен под каждый референс; «премиально, ретро, восточно, атмосферно» — не токены; новый токен обязан иметь тег для поиска, слот или объяснение, почему не в слоте, и хотя бы одно ограничение, проверяемое до генерации.
Китайский дисплейный шрифт: literal против reinterpret
Как заставить модель нарисовать не системный сун, а спроектированные глифы
Самая предметная часть скилла. Проблема: модели изображений на слово «宋体» (Songti) или «serif» рисуют системный шрифт по умолчанию; слова «премиальный, винтажный, художественный» задают настроение, но не форму — и модель тоже скатывается в дефолт.
Разделение ролей
Дисплейный заголовок из 2–5 знаков может идти в режим reinterpret: подложка фиксирует текст, границы знаков, порядок чтения, общие оси и базовую линию, но контур обычного шрифта не является финальным — модель перерисовывает глифы внутри этого пространства. Название места, даты, факты, пиньинь и метаданные всегда literal: настоящий обычный шрифт, без лигатур, вариантов, недостающих штрихов и «эрозии материалом». Один постер — одна морфологическая семья; официальные имена — только нормативными знаками; изменение формы не должно менять топологию компонентов иероглифа.
Глиф-бриф: обязателен перед первой генерацией
glyph_design_mode: reinterpret / literal Родословная: сун-мин / стела-печать / лишу / геометрический гротеск / народная кисть / … Ширина и центр тяжести: широкий / квадратный / узкий; высокий / средний / низкий Контраст горизонталь : вертикаль — __ : 1; есть ли резкие перепады Окончания: резаный клин / прямой срез «дерево» / круглое / лишу-вынос / сухая кисть Полости (внутренние просветы): открытые / квадратные / круглые / восьмиугольные / узкие Соединения: независимые / общий штрих / «шиповое» соединение / частичная связность Ритм: стабильная моноширина / нарастание / лёгкий сдвиг / скачки — и почему это подходит фото Блокировка группы: locked-wordmark / expressive-sequence; общая высота; базовая линия; слоты Поверхность: чистая / ксилография с эрозией туши / каменная притирка / минеральный пигмент / стёртая табличка Соответствие архитектуре: форма отвечает на __ в фотографии Неизменно: нормативный знак, топология компонентов, порядок чтения, границы, общие оси
Требование: не меньше пяти признаков, видимых на финальной картинке, и обязательный пункт «соответствие архитектуре». Тест на общность: если после удаления названия здания бриф подходит к любому постеру — он слишком общий. Для заголовка из 2–5 знаков — покомпонентная таблица «знак / оптическая проблема в этом заголовке / действие над контуром / компоненты, которые нельзя менять». Пример из документации: знак 小 от природы узкий и рядом со сложными знаками кажется маленьким — точки раздвинуть, центральную вертикаль сделать хребтом, но базовую линию не покидать.
Шесть семей китайской морфологии
Наброски ниже — мои схемы одного и того же креста «十» в шести манерах, чтобы показать, чем семьи различаются на уровне штриха. Это иллюстрация принципа, а не образцы из репозитория: там семьи описаны словами.
A. Резаный сун с клиновидными окончаниями
- Форма
- Контраст горизонтали к вертикали 1:2,2–1:3, прямые вертикали, ручная волна горизонталей, короткие ножевые клинья вместо треугольных засечек, слегка сжатые квадратные полости, лёгкие сколы ксилографии.
- Где уместна
- Документы, дерево, старые храмы, старые таблички, «издательские» темы.
- Чего нельзя
- Грязная кромка на всех штрихах; потеря штрихов из-за «эрозии».
B. Печать / надпись на стеле
- Форма
- Плотный квадрат, слегка округлённые углы, «зубильные» точки на окончаниях, малые стабильные полости, горизонтальное сжатие как у надписи над воротами. Лучше всего 1–4 знака.
- Где уместна
- Таблички, горные ворота, названия, стелы.
- Чего нельзя
- Поддельные печати, произвольные вариантные знаки, длинный текст.
C. Каркасно-геометрическая
- Форма
- Вертикали как колонны, горизонтали как балки, повороты прямым срезом или коротким «шипом», полости квадратные, круглые или восьмиугольные, модуль заимствован у доугун, кессона или арки. Стабильный вес, но не обычный жирный гротеск.
- Где уместна
- Кессоны, доугун, проёмы, строгая ось, модульная геометрия.
- Чего нельзя
- Все штрихи как схема трубопровода; смена отношений компонентов ради геометрии.
D. Широкая лишу
- Форма
- Низкий центр тяжести, широкий разлёт, сдержанный вынос окончаний горизонталей, короткие вертикали, плоско-квадратные полости; все знаки одной высоты и ширины — подходит для полноширинной равномерной строки.
- Где уместна
- Стены, ворота, длинные мосты, горизонтальные гребни крыш, монументы.
- Чего нельзя
- Утрированные «голова шелкопряда — хвост ласточки» и каллиграфические «летящие пробелы»; для мелкого текста не применяется.
E. Народная наивная кисть
- Форма
- Резкие перепады толщины, локальные вытяжки, неровная кромка, лёгкий сдвиг знаков, одно естественное соединение; целое читается на миниатюре.
- Где уместна
- Народные предметы, ручная работа, росписи, лёгкий тревел-нарратив.
- Чего нельзя
- Торжественные храмы, охранные архивы, длинный текст; «наивность» не равна ошибке или пропуску штриха.
F. Рациональный мин
- Форма
- Очень тонкие, но непрерывные горизонтали, чистые вертикали, острые короткие окончания, узковатый знак, стабильный центр, открытые полости; характер из пропорций, а не текстуры.
- Где уместна
- Архивы, фото-ориентированные и тихие интерьеры, современный editorial.
- Чего нельзя
- Тонкие горизонтали на высокочастотном фоне; конкуренция с другим выразительным заголовком за первый уровень.
Почему подложка не «запирает» обычный сун
typeset-guide по-прежнему считает cmap, границы и оси настоящим шрифтом, но при reinterpret рисует на Image 3 не полноразмерные контуры, а слоты знаков и мелкие метки с текстом (guide_render: scaffold). Слоты — пространственное доказательство, а не блоки вёрстки; точный текст фиксирует секция Text (verbatim) в промпте. Если доминирующий референс не поддерживает выбранную морфологию — меняется референс, а не добавляется второй «разбавляющий».
Минимальный фрагмент промпта
Display glyph design — reinterpret only the large verified title "__" inside Image 3's measured bounds. Preserve its <locked-wordmark / expressive-sequence> group geometry, including the measured character slots, common optical height and baseline; do not copy the guide font silhouette. Use <родословная> with <ширина/центр>, <контраст>, <окончания>, <полости>, <соединения или ритм>, and <поверхность>, derived from the target's <геометрия/материал здания>. Keep every Chinese component and stroke topology legible. Keep all small metadata literal and conventional.
Антипример из той же документации: make the font artistic, premium, vintage and Chinese — настроение без формы; модель вернётся к дефолтному сун или жирному гротеску.
Факты и текст: что вообще может быть написано на постере
Градация источников, четыре класса информации, 4–7 единиц на постер
Логика документа research-and-annotation.md: поиск нужен не для энциклопедической справки, а чтобы найти информацию, сжимаемую в короткие слова, которые строят контекст места и участвуют в вёрстке.
Приоритет источников
- Органы охраны памятников, госструктуры, официальный туризм, сайт объекта, музеи, архивы.
- Проектные и реставрационные организации, научные статьи, краеведческие издания.
- Надёжные новостные агентства и картографические сервисы.
- Энциклопедии, травелоги и соцсети — только как зацепки для поиска, не как опора для утверждений об охранном статусе, датировке, подлинности или авторе.
Одноимённые объекты сначала разводятся по городу, кварталу, видимой табличке и карте; не развели — спросить пользователя, не смешивать.
| Класс | Определение | Попадает в постер? |
|---|---|---|
VERIFIED | Есть надёжный источник, прямо подтверждающий утверждение | Да; ссылка на источник сохраняется в карточке факта |
OBSERVED | Видно на фото пользователя: доугун, текст таблички, зверь на гребне крыши | Да, как «наблюдение по фото»; внешний вид не превращать в датировку |
USER-CONFIRMED | Имя, место, контекст съёмки, явно данные пользователем | Да, при необходимости с пометкой «по данным пользователя» |
UNCONFIRMED | Легенды, туристические тексты, единственный слабый источник, догадка по внешности | Нет; только в список «проверить» |
Отдельный акцент на разнице между «основан при Мин» и «нынешнее здание — современная реконструкция»: оба утверждения могут быть верны одновременно, но сокращение до «минская башня» вводит в заблуждение о возрасте деревянных конструкций.
Компиляция в текст постера
На постер одного здания — 4–7 информационных единиц:
- один главный заголовок — нормативное имя;
- одна метка места — город, квартал или перекрёсток в виде «улица × улица», «квартал · сторона», «зона · узел»; полные адреса и координаты не идут в главное поле;
- одно временное отношение — например, «основан при Мин · современная реконструкция»;
- один–три архитектурных термина — «доугун», «три яруса — три карниза», «крестообразная крыша сешань»;
- ноль–одна видимая надпись или городская связь.
Один факт на двух языках — одна единица, не две; английский — только когда точен и несёт роль структурного знака, индекса или ритма. Длинные фразы сжимаются до именных; микротекст длиннее двух строк нежелателен — модели нестабильны на мелком длинном тексте, лучше меньше, чем псевдоиероглифы. Слово, которому не нашлось роли шрифта и колонки, удаляется, а не уменьшается до «одинокой мелочи в углу».
Режим аннотаций — только по явной просьбе
Выноски к конструктивным элементам включаются только для обучающего или экскурсионного постера. Каждая выноска обязана указывать на реальную видимую цель; линии — горизонтально-вертикальные ломаные из специального жёлоба, не через текст, табличку, главный гребень, шпиль или лица; отступ от обычного текста не меньше 0,5 em, от дисплейного — не меньше 0,25 высоты знака; на постер одного здания обычно 2–4 линии.
Как устроен репозиторий
Тонкая точка входа, референсы по требованию, 3300 строк Python, 24 теста
guizang-yingzao-skill/
├── README.md # 158 строк, полностью на китайском
└── yingzao/
├── SKILL.md # 78 строк: контракт + рабочий поток + таблица «когда что читать»
├── agents/openai.yaml # display_name, brand_color #AC3C33, allow_implicit_invocation: true
├── requirements.txt # Pillow, numpy, opencv-python-headless, fonttools
├── references/ # 13 документов ≈ 1 700 строк
│ ├── preflight-gates.md # «единственный источник правды» для 8 ворот
│ ├── image-generation-workflow.md # порядок входов, параметры GPT-Image-2, контракт промпта, readback
│ ├── token-system.md # 4 уровня, слоты, оси, правила расширения
│ ├── design-tokens.json # 104 токена, 22 рецепта — машинно-читаемый
│ ├── display-glyph-morphology.md # 6 семей китайских дисплейных глифов, глиф-бриф
│ ├── frontend-layout-guide.md # спецификация подложки, гарантии компилятора, контракты окклюзии
│ ├── mixing-logic.md # выбор рецепта и одной доминирующей пластины
│ ├── creative-brief.md # шаблон брифа перед генерацией
│ ├── photo-preflight.md # триаж hero/support/reject, оси фото → шрифт и материал
│ ├── research-and-annotation.md # градация фактов, карточка факта, режим аннотаций
│ ├── art-direction.md # метод: масштабы, шрифт как форма, активный фон, культурный перевод
│ ├── video-storyboard.md # опциональная раскадровка 3×3
│ ├── reference-encoding-matrix.md # покарточная кодировка первых 9 пластин
│ └── reference-encoding-expansion-2026.md # ещё 34 пластины
├── scripts/ # 9 Python-скриптов ≈ 3 300 строк
│ ├── _runtime.py # поиск .venv вызывающего / CAP_PYTHON, без глобальных установок
│ ├── check_dependencies.py # проверка без установки
│ ├── photo_preflight.py # количественная предпроверка фото (357 строк)
│ ├── rectify.py # детерминированный поворот / перспектива / кроп (206)
│ ├── subject_mask.py # маска субъекта: полигон или GrabCut (166)
│ ├── design_tokens.py # validate / query / tags / suggest / recipe / render (835)
│ ├── typeset_compose.py # рендер и гейтинг подложки настоящим шрифтом (887)
│ ├── prepare_generation.py # компиляция и валидация трёхкартиночного handoff (584)
│ ├── fit_canvas.py # подгонка к точному холсту без растяжения
│ └── make_comparison.py # коллаж «постер первым, оригинал рядом»
├── tests/ # 24 теста: typeset 13, prepare 6, runtime 3, preflight 2
└── assets/
├── readme-hero.webp # стена работ, 2400×1350
├── reference-plates/ # 43 пластины, 14 МБ — вход для модели
└── reference-thumbnails/ # те же 43 имени, 2 МБ — превью для HTML-каталога
Тонкая точка входа
SKILL.md — 78 строк: «ядро контракта» из восьми пунктов, извлечение входа, четыре стадии и таблица «в какой ситуации какой файл читать». Всё остальное — по требованию. Это прямая реализация progressive disclosure из методички Anthropic по скиллам; token-system.md даже ссылается на scripts/quick_validate.py из skill-creator.
Один источник правды на каждую заботу
Гейты — только в preflight-gates.md; вызов модели и промпт — только в image-generation-workflow.md; выбор референса — в mixing-logic.md. Каждый файл начинается с фразы «этот файл отвечает только за X, за Y смотри Z». Дублирования почти нет.
Двухслойные ассеты
Пластины и миниатюры носят одинаковые имена — осознанное разделение по качеству, а не две библиотеки; recipe <id> --json возвращает пластину и откатывается к миниатюре только при её отсутствии. assets/README.md предупреждает: при добавлении и удалении синхронизировать оба набора.
Скрипты не пишут в пакет и не тянут шрифты
Ни кэша, ни HTML-каталога, ни тестовых картинок внутрь yingzao/; правило повторено в трёх местах и подкреплено sys.dont_write_bytecode = True в каждом скрипте. Шрифтов в поставке нет: в typeset-spec.json поле font — абсолютный путь к вашему TTF/OTF с покрытием CJK; скрипт лишь проверит cmap.
Что мне нравится и что вызывает вопросы
Оценка без прогона: качество постеров не проверялось
Сильное
- Compile → gate → call. Вся дорогая часть — один вызов GPT-Image-2 в
quality=high— защищена детерминированной проверкой, которая возвращаетREADYили список ошибок. Модель вызывается из манифеста, а не «по памяти из брифа». Это убирает главный источник ошибок агентов: тихую перефразировку промпта и перепутанные картинки. - Двусторонняя трассировка. Маркеры
S1 / B1 / T1 / I1живут одновременно в плане, в спецификации и отчёте подложки, на самой картинке Image 3 и в скомпилированной секции промпта. Скрипт проверяет, что нет маркера, который есть только в документе, и нет бейджа, который не привязан к действию. «Токен без пути доставки — не доставлен» — редкая дисциплина. - Анти-усреднение. Одна доминирующая реальная референс-картинка и запрет конкатенировать
prompt-поля токенов — осознанный ответ на типичную деградацию, когда двадцать стилевых слов дают бежевую кашу. - Бюджетная дисциплина и контроль у пользователя. Одно чтение результата, ноль–три наблюдения, никаких автоматических повторов, proof-листов и оценок. Следующий раунд — только по отзыву. Для инструмента, где каждый вызов стоит денег, это честнее «самоулучшающихся» циклов.
- Предметная глубина. Шесть морфологических семей китайского шрифта с наблюдаемыми признаками, таблица «ось фотографии → шрифт и материал», карточки кодировки 43 референсов, различение «основан при Мин» и «современная реконструкция». Это не обёртка над промптом, а зашитая экспертиза арт-директора.
- Гигиена установки. Поиск
.venvвызывающего, отказ от глобальных установок, запись только вoutput/пользователя, ноль записей в пакет. Скилл рассчитан жить в чужих репозиториях.
Спорное и рискованное
- Нет лицензии. Формально — «все права защищены»: копировать код и документы в свои проекты нельзя, только читать и вдохновляться. Для репозитория, распространяемого через
npx skills add, это странно; вероятно, недосмотр, но пока не исправлен. - 43 референс-постера неизвестного происхождения в репозитории. Документы аккуратно повторяют «sources — не разрешение на копирование», но сами изображения (14 МБ) распространяются вместе со скиллом, авторство пластин не указано. Юридический риск для тех, кто ставит скилл в рабочие проекты.
- Жёсткая привязка к GPT-Image-2 и imagegen. Параметры API, размеры,
/v1/images/edits— всё про OpenAI; целевой агент, судя поagents/openai.yamlи синтаксису$yingzao, — Codex. В Claude Code скилл заведётся, но мост к Images API придётся строить самому; с другими моделями изображений контракт трёх картинок формально применим, но ничего не проверено. - Документация на 100 % китайская. Для агента это не барьер, для человека-мейнтейнера вне китайского рынка — да. Контролируемые теги и алиасы тоже только китайские.
- Тяжёлая церемония. На один постер — preflight-отчёт, возможно rectify,
recipe.json,creative-brief.md,design-plan.json, спецификация, подложка и отчёт, приreinterpret— глиф-бриф, промпт, манифест, readback. Это 10–20 вызовов инструментов до одной картинки. Для профессионального результата оправдано; для «быстро посмотреть» — нет, и скилл честно заявляет, что не для этого. - Шрифты не в поставке. Без собственного CJK-шрифта с полным покрытием подложка не соберётся —
typeset_compose.pyоткажет на первом отсутствующем глифе. Правильное, но неочевидное для новичка требование; в README его нет. - Примеры вычищены при релизе. История — 18 коммитов за шесть дней (29.08–03.09.2026). До релиз-коммита
01be93bв репозитории лежала папкаexamples/с шестью реальными прогонами по Датуну и Инсяню — постер, подложка, сетка, промпт и спека на каждый; релиз удалил её вместе со старым пакетомchinese-architecture-poster/. Увидеть настоящий прогон теперь можно только черезgit showпо старым коммитам — и это ранняя версия пайплайна, до токенов и контракта трёх картинок. - Тесты покрывают скрипты, не результат. 24 теста проверяют компилятор подложки, гейт handoff, рантайм и preflight — то, что детерминировано. Качества постеров они не измеряют, и в текущем дереве нет ни одного примерного прогона с промежуточными артефактами, по которому можно понять, как выглядит «правильный»
design-plan.jsonна реальном кейсе.
Что я не проверял
- Качество постеров на реальных фото — нет доступа к GPT-Image-2 в этой сессии; стена работ в README — единственное свидетельство, и она подобрана автором.
- Устойчивость
photo_preflight.pyиrectify.pyна разных снимках — скрипты не запускались. - Работоспособность вне связки Codex + GPT-Image-2 — не подтверждено.
- Число звёзд и форков — снимок на 5 сентября 2026; растёт быстро.
Что забрать в свои скиллы
Семь переносимых приёмов, не зависящих от постеров и китайской архитектуры
Гейт-скрипт как единственное разрешение
Перед дорогим или необратимым действием — вызов модели, деплой, публикация — детерминированный скрипт, который либо печатает READY и пишет манифест, либо перечисляет ошибки. Агент действует из манифеста, а не из своей памяти о плане.
План в JSON, который компилируется в промпт
Не просить агента «учесть всё из брифа», а заставить записать 4–6 конкретных действий с полями target / instruction / visible_result / markers — и пусть скрипт вставит их в промпт и проверит, что каждое сущностное требование дошло. Требование без пути доставки не доставлено.
Одна доминирующая ссылка вместо усреднения
При работе с примерами — дизайн, код, тексты — один образец задаёт всю механику, плюс максимум один вторичный на одну деталь. Список из двадцати «хороших практик» в промпте деградирует в среднее.
Градация фактов до вывода
VERIFIED / OBSERVED / USER-CONFIRMED / UNCONFIRMED с правилом «в выход попадают только первые три» — универсальная защита от галлюцинаций в любом генеративном скилле, от отчётов до документации.
Одно чтение результата, ноль скрытых ретраев
Проверить фиксированный короткий список, записать 0–3 наблюдения, отдать решение пользователю. Прозрачный бюджет и отсутствие «самоулучшающихся» петель, которые сжигают деньги и меняют результат без спроса.
Гигиена рантайма
Поиск окружения вызывающего, никаких глобальных установок, никакой записи в пакет скилла, все артефакты — в предсказуемую директорию пользователя.
Тонкий SKILL.md и таблица «когда что читать»
Точка входа короче ста строк с контрактом и потоком; вся глубина — в референсах по требованию, у каждого из которых одна забота и явные границы.
Для моего present-html
Напрямую применимы предполётный контроль перед публикацией (в publish-presentation.mjs он уже есть — можно расширить), пометки «не подтверждено» (уже практикуются) и правило одного чтения результата без скрытых итераций.
Источники
Что реально использовано при разборе
- Репозиторий github.com/op7418/guizang-yingzao-skill — README,
yingzao/SKILL.md, все файлыreferences/,scripts/,tests/,assets/. Клон от 5 сентября 2026, веткаmain, коммит58c9b87; полная история из 18 коммитов и удалённая папкаexamples/— черезgit logиgit show. - Метаданные репозитория и автора — звёзды, даты, лицензия, топики: GitHub REST API, api.github.com/repos/op7418/guizang-yingzao-skill и api.github.com/users/op7418/repos.
- Профиль автора и другие скиллы: github.com/op7418, guizang-ppt-skill, guizang-social-card-skill, guizang-material-illustration.
- Инструмент установки
npx skills add: github.com/vercel-labs/skills, skills.sh/agent/claude-code. - Подборка китайских скиллов, где упоминаются работы автора: github.com/shishirui/awesome-claude-skills-zh.
- Иллюстрация «стена работ»: readme-hero.webp из репозитория автора; используется иллюстративно.