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