* 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>
3.4 KiB
| 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(как сделано здесь), а не менять движок.