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

22 lines
3.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
pr: 201
title: "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` (как сделано здесь), а не менять движок.