opencode-config/docs/handoff/pr-201-restore-cover-subicon-slot.md
Sergey 85d7d62fcd
fix(cover): restore sub-icon slot in cover.svg (#201)
* fix(cover): restore sub-icon slot in cover.svg

* docs(cover): add ADR-089 and handoff for PR #201

---------

Co-authored-by: opencode-agent <agent@opencode.local>
2026-08-01 02:56:40 +03:00

3.4 KiB
Raw Permalink Blame History

pr title
201 fix(cover): restore sub-icon slot in cover.svg

Что сделано

Восстановлена ровно одна строка slot-комментария sub-icon в .opencode/draw-image/templates/cover.svg (та самая, что удалил PR#197): <!-- slot: name=sub-icon, x=412, y=600, w=200, h=200, fit=contain, recolor=accent --> Изменений в коде движка (src/render.ts) и команде /cover нет — ситуативность (1 или 2 иконки) обеспечивается условным рендером слотов (PR#144). Структурных изменений нет (одна строка в существующем файле).

Проверено: 58/58 тестов проходят (тесты на tests/fixtures/cover.svg, не на продакшн-шаблоне); assets/cover.png (icon=opencode, без sub-icon) побайтово идентичен (18077 bytes, cmp → IDENTICAL); рендер с двумя иконками → 23171 bytes (больше, как ожидалось).

Почему

PR#197 удалил slot-комментарий sub-icon из продакшн-шаблона, из-за чего переданный sub-icon молча отбрасывался — buildSvg итерирует по слотам, объявлённым в шаблоне, а не по args.slots. Команда /cover (PR#199) документирует sub-icon как optional и передаёт его в draw-image — возникала рассогласованность: команда обещает sub-icon, рендерер его игнорирует. Восстановление слота делает сценарий «icon + sub-icon + title» рабочим, а условный рендер (PR#144) сохраняет одно-иконочный кейс побайтово идентичным. Частичный реверс ADR-087 (только sub-icon; badge/subtitle остаются удалёнными — вне scope).

Pending

— (после merge: memory-syncer может зафиксировать, что продакшн cover.svg снова объявляет sub-icon — project-map уже обновлён в этом PR)

Watch out

  • Только sub-icon восстановленbadge и subtitle остаются удалёнными из продакшн-шаблона (PR#197). Lime-стандарт (ADR-088) запрещает subtitle; badge не используется. Не путать с tests/fixtures/cover.svg, где все 4 типа слотов присутствуют (fixture тестирует движок, продакшн — бренд-стандарт).
  • Условный рендер (PR#144) — ключевая инварианта: одно-иконочный кейс побайтово идентичен. Если будущий PR меняет render.ts или slot-parser, проверить cmp assets/cover.png не сломался.
  • buildSvg итерирует по шаблонным слотам, не по args.slots — это контракт движка: шаблон объявляет layout (слоты), args — данные. Добавить новый слот в продакшн = добавить slot-комментарий в templates/cover.svg (как сделано здесь), а не менять движок.