← Назад
营造Yingzao

Yingzao: скилл Guizang, который превращает фото китайской архитектуры в editorial-постер

Claude Code / Codex-скилл, где детерминированный Python стоит воротами перед единственным дорогим вызовом GPT-Image-2. Разбираю контракт трёх картинок, восемь гейтов, токен-систему из 104 токенов и шесть семей китайских дисплейных глифов — и то, что из этого стоит перенести в собственные скиллы.

Репозиторий
op7418/guizang-yingzao-skill
Автор
归藏 / Guizang (@op7418)
Создан
2 сентября 2026
Звёзды / форки
338 / 30 (на 5 сентября 2026)
Лицензия
отсутствует
История
18 коммитов за 29.08–03.09.2026; каталог токенов v1.10.0
Стек
Python 3.10+, Pillow, NumPy, OpenCV, fontTools; GPT-Image-2 edit
Дата разбора
5 сентября 2026

Коротко

Что скилл делает — глазами пользователя

Вход, выход, установка и границы применимости

Стена из десятка постеров, сгенерированных скиллом: серая гравюрная композиция храма Синцзяо с двумя раскрашенными стражами и огромным заголовком 兴教寺; мост Юйцзинь на серо-зелёном поле с охристым заголовком 玉津桥; красная табличка с золотыми знаками 護國威德; башня 1056 года с тонким гротеском; красно-бежевый постер чайной 小南唐 с рваной бумагой; собор 1906 года в вертикальном формате
Стена работ из README репозитория — единственное свидетельство качества, и оно подобрано автором. Что на ней видно: огромный дисплейный заголовок, который перекрывается реальным силуэтом здания; фон как активное цветовое поле (серо-зелёное, охристое, киноварное), а не исходное небо; мелкие метаданные — город, год, тип конструкции — обычной гарнитурой. Иллюстративно, картинка тянется из репозитория автора; при необходимости замените.

Вход: одна или несколько фотографий, место или название объекта, сколько постеров нужно, нужен ли коллаж «оригинал ↔ постер». Если пользователь говорит «решай сам», по умолчанию: один постер, только подтверждённые короткие слова, без коллажа.

Выход: постер в одном из пяти форматов (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.

ПозицияРольЧто даёт моделиЧего в ней нет
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     # история рецептов для де-дубликации между сессиями
  1. 〇стадия 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.json analysis/rectify.json inputs/01-*.png
  2. 一стадия 1

    Заморозить идею, потом искать референс

    Сначала письменно фиксируются четыре домена: субъект, фон, взаимодействие, приём вёрстки. Только потом design_tokens.py suggest --tag … --maximize-distance --history … --record-history и recipe <id> --json. Ноль совпадений — код возврата 2 — переформулировать теги; «кандидаты по алфавиту» запрещены.

    Из reference_assets рецепта выбирается ровно одна доминирующая пластина. Она должна быть совместима с целью по главной оси, доле субъекта в кадре, топологии негативного пространства и границе взаимодействия — и реально демонстрировать все три домена, а не только «цвет, бумагу и шрифт».

    Результат — creative-brief.md, где записано только то, что меняет решения генерации, и проход восьми ворот.

    Артефактыanalysis/recipe.json analysis/creative-brief.md recipe-history.json
  3. 二стадия 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.json analysis/typeset-spec.json analysis/typeset-guide.png analysis/typeset-report.json analysis/glyph-brief.md
  4. 三стадия 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.txt analysis/generation-call.json inputs/02-primary-reference.* final/poster.png
  5. 四стадия 4

    Одно чтение и передача решения пользователю

    Агент открывает результат инструментом чтения изображений и проверяет ровно пять вещей: субъект узнаваем и действительно вырезан, перемещён или материализован; фон активен, а не исходное небо или градиент; заголовок — не обычный шрифт, текст точен, оси и роли мелкого текста держатся; окклюзия, общая кромка или негативная форма состоялись; механизм Image 2 виден, а не только похожие цвета. Ноль–три наблюдения уходят в readback.md.

    Без оценок, без proof-листов, без автоповтора. Правки — только после отзыва пользователя: локальные (глиф, опечатка, кромка) — edit текущего постера с блокировкой остальных пикселей; структурные (субъект, фон, макет, референс) — возврат к выправленному оригиналу и переделка идеи, референса и подложки. Затирать латками сломанную топологию запрещено.

    Затем один вопрос: расширить ли в раскадровку 3×3 и промпт для видео. Видео само не генерируется.

    Артефактыanalysis/readback.md final/comparison.png video/storyboard-3x3.png video/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. 1

    Зависимости и пути

    Скрипт зависимостей вернул 0; работа идёт в output/yingzao/<run-id>/ пользователя; внутри пакета скилла нет кэша, тестовых картинок и артефактов.

    Скилл устанавливается в чужие проекты — он не должен их пачкать и не должен зависеть от глобального Python.

  2. 2

    Фото, идентичность, геометрия

    У каждого снимка есть отчёт preflight и роль; стратегия композиции — одна из preserve / deterministic-rectify-crop / semantic-recompose — и одно главное исправление; якоря идентичности не тронуты; дорисовывать разрешено только то, что непрерывно продолжается (небо, вода, земля, прямая колонна, стена), а не крышу, этажи, окна или скульптуры.

    Модель охотно «достраивает» здания — гейт заранее запрещает выдумывать конструкцию.

  3. 3

    Факты и текст

    Текст только из VERIFIED / OBSERVED / USER-CONFIRMED; слова разбиты на «обязательно / можно / нельзя / рискованно»; редкие иероглифы не несут гигантских структурных заголовков; «исторический памятник», «реставрация», «перенос», «новодел» и «современное здание» не перепутаны.

    Модель портит редкие знаки, а туристический текст врёт о датах — оба риска закрываются до генерации.

  4. 4

    Идея и доминирующий референс

    Четыре домена записаны до поиска; ровно одна реальная пластина на входе; она совместима по оси, силуэту, доле и негативному пространству; requires / conflicts / mutex_groups разрешены; референс демонстрирует все три домена, а не только цвет и бумагу.

    Референс, у которого после вычитания брендов и здания остаются лишь прилагательные, — не референс.

  5. 5

    Добавленная стоимость модели

    Домен субъекта содержит вырезку, перестройку масштаба или позиции либо зонную материализацию; домен фона — цветовое поле, окно, срез светлоты или восстановленное пространство; домен взаимодействия — окклюзию, общую кромку, проникновение или негативную форму; всё видно на миниатюре; есть ненормативный приём вёрстки. Провал: центрированный заголовок на исходном фото, «два острова», фильтр плюс текст, обычный градиент, прямоугольный коллаж.

    Если результат можно собрать без модели — платить за вызов бессмысленно.

  6. 6

    Типографическая подложка

    typeset_compose.py вернул passed=true; у каждого дисплейного слоя явный glyph_design_mode; literal рисуется как guide_render: text, reinterpret — как scaffold; для «текст за субъектом» есть subject_front + subject-footprint, снятые с контура Image 1.

    Полноразмерный контур обычного шрифта на подложке — самый сильный якорь для модели; гейт не даёт ему победить глиф-бриф.

  7. 7

    Дисплейные глифы

    literal — обычный шрифт; reinterpret — есть glyph-brief.md с одной морфологической семьёй и минимум пятью видимыми признаками; для заголовка из 2–5 знаков — покомпонентная таблица оптических компенсаций; мелкий текст остаётся обычным.

    Без наблюдаемой формы «премиальный винтажный сун» превращается в системный шрифт по умолчанию.

  8. 8

    Вызов и вывод

    Порядок входов, три–пять инвариантов идентичности, короткий текст, количество, пропорция, качество и путь сохранения определены; recipe.json и design-plan.json сохранены; все токены доставлены ровно один раз; промпт соответствует минимальному контракту; маркеры совпадают в обе стороны; prepare_generation.py вернул READY.

    Единая точка, где план становится манифестом, — и только манифест идёт в модель.

Условные ворота

Токен-система: дизайн-токены как поисковый индекс, а не как промпт

104 токена, 22 рецепта, 7 слотов взаимоисключения — и запрет склеивать их в промпт

Файл references/design-tokens.json (версия 1.10.0, namespace cap) — машинно-читаемый каталог. Цифры на дату разбора:

104
токена: 8 primitive, 45 semantic, 51 component
12
категорий, от typography (20) до content (2)
22
рецепта с family, signature и sources; в каждом 17–23 токена
7
слотов взаимоисключения — по одному механизму из каждого
6
стилевых осей для отпечатка и де-дубликации
41
контролируемый тег плюс алиасы
43
референс-пластины: 9 первой волны и 34 расширения 2026 года

Категории по числу токенов: typography 20, layout 15, policy 14, material 13, background 9, color 8, depth 7, subject 6, context 4, grid 3, spacing 3, content 2.

Четыре уровня, заимствованные у дизайн-систем

Primitive8 токенов

Вычислимые базовые величины: колонки сетки, поля, доля окклюзии, z-индекс. Сами по себе стиль не задают — это линейка, а не замысел.

Semantic45 токенов

Отвечают на вопрос «за что это отвечает в кадре»: китайский дисплейный заголовок, метаданные, масштаб фона, защита идентичности, местный акцентный цвет.

Component51 токен

Переиспользуемый визуальный механизм: «буквенное окно-монумент», «непрерывные вертикальные окна», «поле текста-источника», «маска кромки орнаментом», «здание мелкой растровой точкой».

Recipe22 связки

Уже проверенная на совместимость группа токенов с указанием референсов. Автор подчёркивает: «стартовая точка, а не шаблон» — область субъекта, текст, цвета и материалы всё равно берутся из текущей фотографии.

Слоты взаимоисключения

Скелет каждого рецепта: из каждого слота — ровно один механизм. Взаимоисключение ограничивает только «главные» механизмы одного типа; бумажная текстура, шрифт метаданных, защита идентичности и z-отношения добавляются как зависимости.

slot.layout-primary — 15 членов: центр, ось, боковой вход, диагональ, разделение, буквенное окно, много окон, проём, модули, монтаж, фрагмент-гигант, плотное поле заголовков slot.subject-container — 7 членов slot.expressive-type — 6 членов slot.glyph-morphology — 6 семей глифов slot.background-scale — 4 члена slot.context-material — 3 члена slot.line-policy — 3 члена

Контракт токена

{
  "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 знаков.

Ключевая мысль, повторённая в трёх документах

Красивый референс — это высокоразмерная взаимозависимость композиции, материала, цвета, масштаба, кромок и вёрстки, которую нельзя полностью описать словами. Разбор на токены нужен для поиска и объяснения; при генерации надо вернуться к одной реальной картинке. «Безопасное пересечение большего числа токенов» даёт посредственный общий знаменатель. Поэтому:

  • промпт выражает одно художественное направление;
  • prompt-поля токенов не конкатенируются — исполнитель сливает совместимые токены в 4–6 действий над текущей фотографией;
  • но каждый активный токен обязан иметь путь доставки: prompt+guide (вошёл в биндинг и стоит маркером на Image 3) или preprocess (только детерминированная коррекция); generation-call.json.token_delivery фиксирует это, missing должен быть нулём.

Мелкие механики, за которыми приятно наблюдать

Китайский дисплейный шрифт: literal против reinterpret

Как заставить модель нарисовать не системный сун, а спроектированные глифы

Самая предметная часть скилла. Проблема: модели изображений на слово «宋体» (Songti) или «serif» рисуют системный шрифт по умолчанию; слова «премиальный, винтажный, художественный» задают настроение, но не форму — и модель тоже скатывается в дефолт.

Разделение ролей

Дисплейный заголовок из 2–5 знаков может идти в режим reinterpret: подложка фиксирует текст, границы знаков, порядок чтения, общие оси и базовую линию, но контур обычного шрифта не является финальным — модель перерисовывает глифы внутри этого пространства. Название места, даты, факты, пиньинь и метаданные всегда literal: настоящий обычный шрифт, без лигатур, вариантов, недостающих штрихов и «эрозии материалом». Один постер — одна морфологическая семья; официальные имена — только нормативными знаками; изменение формы не должно менять топологию компонентов иероглифа.

Глиф-бриф: обязателен перед первой генерацией

glyph_design_mode: reinterpret / literal
Родословная: сун-мин / стела-печать / лишу / геометрический гротеск / народная кисть / …
Ширина и центр тяжести: широкий / квадратный / узкий; высокий / средний / низкий
Контраст горизонталь : вертикаль — __ : 1; есть ли резкие перепады
Окончания: резаный клин / прямой срез «дерево» / круглое / лишу-вынос / сухая кисть
Полости (внутренние просветы): открытые / квадратные / круглые / восьмиугольные / узкие
Соединения: независимые / общий штрих / «шиповое» соединение / частичная связность
Ритм: стабильная моноширина / нарастание / лёгкий сдвиг / скачки — и почему это подходит фото
Блокировка группы: locked-wordmark / expressive-sequence; общая высота; базовая линия; слоты
Поверхность: чистая / ксилография с эрозией туши / каменная притирка / минеральный пигмент / стёртая табличка
Соответствие архитектуре: форма отвечает на __ в фотографии
Неизменно: нормативный знак, топология компонентов, порядок чтения, границы, общие оси

Требование: не меньше пяти признаков, видимых на финальной картинке, и обязательный пункт «соответствие архитектуре». Тест на общность: если после удаления названия здания бриф подходит к любому постеру — он слишком общий. Для заголовка из 2–5 знаков — покомпонентная таблица «знак / оптическая проблема в этом заголовке / действие над контуром / компоненты, которые нельзя менять». Пример из документации: знак 小 от природы узкий и рядом со сложными знаками кажется маленьким — точки раздвинуть, центральную вертикаль сделать хребтом, но базовую линию не покидать.

Шесть семей китайской морфологии

Наброски ниже — мои схемы одного и того же креста «十» в шести манерах, чтобы показать, чем семьи различаются на уровне штриха. Это иллюстрация принципа, а не образцы из репозитория: там семьи описаны словами.

A. Резаный сун с клиновидными окончаниями

cap.type.glyph-carved-song
Форма
Контраст горизонтали к вертикали 1:2,2–1:3, прямые вертикали, ручная волна горизонталей, короткие ножевые клинья вместо треугольных засечек, слегка сжатые квадратные полости, лёгкие сколы ксилографии.
Где уместна
Документы, дерево, старые храмы, старые таблички, «издательские» темы.
Чего нельзя
Грязная кромка на всех штрихах; потеря штрихов из-за «эрозии».

B. Печать / надпись на стеле

cap.type.glyph-seal-inscription
Форма
Плотный квадрат, слегка округлённые углы, «зубильные» точки на окончаниях, малые стабильные полости, горизонтальное сжатие как у надписи над воротами. Лучше всего 1–4 знака.
Где уместна
Таблички, горные ворота, названия, стелы.
Чего нельзя
Поддельные печати, произвольные вариантные знаки, длинный текст.

C. Каркасно-геометрическая

cap.type.glyph-architectural-modular
Форма
Вертикали как колонны, горизонтали как балки, повороты прямым срезом или коротким «шипом», полости квадратные, круглые или восьмиугольные, модуль заимствован у доугун, кессона или арки. Стабильный вес, но не обычный жирный гротеск.
Где уместна
Кессоны, доугун, проёмы, строгая ось, модульная геометрия.
Чего нельзя
Все штрихи как схема трубопровода; смена отношений компонентов ради геометрии.

D. Широкая лишу

cap.type.glyph-clerical-wide
Форма
Низкий центр тяжести, широкий разлёт, сдержанный вынос окончаний горизонталей, короткие вертикали, плоско-квадратные полости; все знаки одной высоты и ширины — подходит для полноширинной равномерной строки.
Где уместна
Стены, ворота, длинные мосты, горизонтальные гребни крыш, монументы.
Чего нельзя
Утрированные «голова шелкопряда — хвост ласточки» и каллиграфические «летящие пробелы»; для мелкого текста не применяется.

E. Народная наивная кисть

cap.type.glyph-folk-naive
Форма
Резкие перепады толщины, локальные вытяжки, неровная кромка, лёгкий сдвиг знаков, одно естественное соединение; целое читается на миниатюре.
Где уместна
Народные предметы, ручная работа, росписи, лёгкий тревел-нарратив.
Чего нельзя
Торжественные храмы, охранные архивы, длинный текст; «наивность» не равна ошибке или пропуску штриха.

F. Рациональный мин

cap.type.glyph-rational-ming
Форма
Очень тонкие, но непрерывные горизонтали, чистые вертикали, острые короткие окончания, узковатый знак, стабильный центр, открытые полости; характер из пропорций, а не текстуры.
Где уместна
Архивы, фото-ориентированные и тихие интерьеры, современный 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: поиск нужен не для энциклопедической справки, а чтобы найти информацию, сжимаемую в короткие слова, которые строят контекст места и участвуют в вёрстке.

Приоритет источников

  1. Органы охраны памятников, госструктуры, официальный туризм, сайт объекта, музеи, архивы.
  2. Проектные и реставрационные организации, научные статьи, краеведческие издания.
  3. Надёжные новостные агентства и картографические сервисы.
  4. Энциклопедии, травелоги и соцсети — только как зацепки для поиска, не как опора для утверждений об охранном статусе, датировке, подлинности или авторе.

Одноимённые объекты сначала разводятся по городу, кварталу, видимой табличке и карте; не развели — спросить пользователя, не смешивать.

КлассОпределениеПопадает в постер?
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.

Что мне нравится и что вызывает вопросы

Оценка без прогона: качество постеров не проверялось

Сильное

  1. Compile → gate → call. Вся дорогая часть — один вызов GPT-Image-2 в quality=high — защищена детерминированной проверкой, которая возвращает READY или список ошибок. Модель вызывается из манифеста, а не «по памяти из брифа». Это убирает главный источник ошибок агентов: тихую перефразировку промпта и перепутанные картинки.
  2. Двусторонняя трассировка. Маркеры S1 / B1 / T1 / I1 живут одновременно в плане, в спецификации и отчёте подложки, на самой картинке Image 3 и в скомпилированной секции промпта. Скрипт проверяет, что нет маркера, который есть только в документе, и нет бейджа, который не привязан к действию. «Токен без пути доставки — не доставлен» — редкая дисциплина.
  3. Анти-усреднение. Одна доминирующая реальная референс-картинка и запрет конкатенировать prompt-поля токенов — осознанный ответ на типичную деградацию, когда двадцать стилевых слов дают бежевую кашу.
  4. Бюджетная дисциплина и контроль у пользователя. Одно чтение результата, ноль–три наблюдения, никаких автоматических повторов, proof-листов и оценок. Следующий раунд — только по отзыву. Для инструмента, где каждый вызов стоит денег, это честнее «самоулучшающихся» циклов.
  5. Предметная глубина. Шесть морфологических семей китайского шрифта с наблюдаемыми признаками, таблица «ось фотографии → шрифт и материал», карточки кодировки 43 референсов, различение «основан при Мин» и «современная реконструкция». Это не обёртка над промптом, а зашитая экспертиза арт-директора.
  6. Гигиена установки. Поиск .venv вызывающего, отказ от глобальных установок, запись только в output/ пользователя, ноль записей в пакет. Скилл рассчитан жить в чужих репозиториях.

Спорное и рискованное

  1. Нет лицензии. Формально — «все права защищены»: копировать код и документы в свои проекты нельзя, только читать и вдохновляться. Для репозитория, распространяемого через npx skills add, это странно; вероятно, недосмотр, но пока не исправлен.
  2. 43 референс-постера неизвестного происхождения в репозитории. Документы аккуратно повторяют «sources — не разрешение на копирование», но сами изображения (14 МБ) распространяются вместе со скиллом, авторство пластин не указано. Юридический риск для тех, кто ставит скилл в рабочие проекты.
  3. Жёсткая привязка к GPT-Image-2 и imagegen. Параметры API, размеры, /v1/images/edits — всё про OpenAI; целевой агент, судя по agents/openai.yaml и синтаксису $yingzao, — Codex. В Claude Code скилл заведётся, но мост к Images API придётся строить самому; с другими моделями изображений контракт трёх картинок формально применим, но ничего не проверено.
  4. Документация на 100 % китайская. Для агента это не барьер, для человека-мейнтейнера вне китайского рынка — да. Контролируемые теги и алиасы тоже только китайские.
  5. Тяжёлая церемония. На один постер — preflight-отчёт, возможно rectify, recipe.json, creative-brief.md, design-plan.json, спецификация, подложка и отчёт, при reinterpret — глиф-бриф, промпт, манифест, readback. Это 10–20 вызовов инструментов до одной картинки. Для профессионального результата оправдано; для «быстро посмотреть» — нет, и скилл честно заявляет, что не для этого.
  6. Шрифты не в поставке. Без собственного CJK-шрифта с полным покрытием подложка не соберётся — typeset_compose.py откажет на первом отсутствующем глифе. Правильное, но неочевидное для новичка требование; в README его нет.
  7. Примеры вычищены при релизе. История — 18 коммитов за шесть дней (29.08–03.09.2026). До релиз-коммита 01be93b в репозитории лежала папка examples/ с шестью реальными прогонами по Датуну и Инсяню — постер, подложка, сетка, промпт и спека на каждый; релиз удалил её вместе со старым пакетом chinese-architecture-poster/. Увидеть настоящий прогон теперь можно только через git show по старым коммитам — и это ранняя версия пайплайна, до токенов и контракта трёх картинок.
  8. Тесты покрывают скрипты, не результат. 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 он уже есть — можно расширить), пометки «не подтверждено» (уже практикуются) и правило одного чтения результата без скрытых итераций.

Источники

Что реально использовано при разборе

  1. Репозиторий github.com/op7418/guizang-yingzao-skill — README, yingzao/SKILL.md, все файлы references/, scripts/, tests/, assets/. Клон от 5 сентября 2026, ветка main, коммит 58c9b87; полная история из 18 коммитов и удалённая папка examples/ — через git log и git show.
  2. Метаданные репозитория и автора — звёзды, даты, лицензия, топики: GitHub REST API, api.github.com/repos/op7418/guizang-yingzao-skill и api.github.com/users/op7418/repos.
  3. Профиль автора и другие скиллы: github.com/op7418, guizang-ppt-skill, guizang-social-card-skill, guizang-material-illustration.
  4. Инструмент установки npx skills add: github.com/vercel-labs/skills, skills.sh/agent/claude-code.
  5. Подборка китайских скиллов, где упоминаются работы автора: github.com/shishirui/awesome-claude-skills-zh.
  6. Иллюстрация «стена работ»: readme-hero.webp из репозитория автора; используется иллюстративно.