fix(#300 ui): различимые per-agent цвета глифа + аватар пользователя на переднем плане #319

Merged
vvzvlad merged 2 commits from feat/300-avatar-colors into develop 2026-07-03 22:28:45 +03:00
Collaborator

Проблема

После мержа #307 у всех агентов кружок глифа выходил одинаково фиолетовым, и аватар пользователя был наполовину спрятан за кружком агента.

Причины

  1. Цвет не применялся. Кружок рисовался как Mantine Avatar variant="filled" с override через styles, но Mantine перебивал фон своей переменной --avatar-bg → для каждого агента падал дефолтный primary-цвет темы (фиолет). Плюс «сырой» hue = hash % 360 клал многие имена в один «фиолетово-маджентовый» сектор (напр. «Структурный редактор» → 287°, «Фактчекер» → 331° — оба фиолетовые на глаз).
  2. Аватар пользователя «за» агентомzIndex:0, из-за чего в правом верхнем углу была видна лишь обрезанная кромка головы.

Решение (только клиент, 1 файл + тест)

  1. Гарантированный фон. Эмодзи/sparkles-кружок теперь рисуется обычным Box с явным background — без борьбы с --avatar-bg Mantine. Цвет применяется всегда.
  2. Курированная палитра различимых цветов. Вместо непрерывного hue — 14 категориально разных тёмных цветов (красный/оранжевый/амбер/зелёный/бирюза/циан/синий/индиго/фиолет/маджента + нейтральный slate), выбор по хешу имени. Разные агенты читаются как разные цвета, а не оттенки одного фиолета. Все цвета тёмные → эмодзи и белый IconSparkles остаются читаемыми. Со скрина: «Структурный редактор» → фиолет, «Фактчекер» → оранжевый.
  3. Аватар пользователя на передний план. zIndex лончера поднят выше глифа — теперь это полноценный бейдж в правом верхнем углу, не спрятанный за агентом.

Верификация

  • Клиентский tsc --noEmit — 0 ошибок.
  • vitest (agent-avatar-stack + comment-list-item) — зелёные; в тест agentGlyphBackground добавлена проверка, что «Структурный редактор» и «Фактчекер» дают РАЗНЫЕ цвета (та самая пара со скрина).

Follow-up к #307 / #304, ref #300.

## Проблема После мержа #307 у всех агентов кружок глифа выходил **одинаково фиолетовым**, и аватар пользователя был наполовину спрятан **за** кружком агента. ### Причины 1. **Цвет не применялся.** Кружок рисовался как Mantine `Avatar variant="filled"` с override через `styles`, но Mantine перебивал фон своей переменной `--avatar-bg` → для каждого агента падал дефолтный primary-цвет темы (фиолет). Плюс «сырой» `hue = hash % 360` клал многие имена в один «фиолетово-маджентовый» сектор (напр. «Структурный редактор» → 287°, «Фактчекер» → 331° — оба фиолетовые на глаз). 2. **Аватар пользователя «за» агентом** — `zIndex:0`, из-за чего в правом верхнем углу была видна лишь обрезанная кромка головы. ## Решение (только клиент, 1 файл + тест) 1. **Гарантированный фон.** Эмодзи/sparkles-кружок теперь рисуется обычным `Box` с явным `background` — без борьбы с `--avatar-bg` Mantine. Цвет применяется всегда. 2. **Курированная палитра различимых цветов.** Вместо непрерывного hue — 14 категориально разных тёмных цветов (красный/оранжевый/амбер/зелёный/бирюза/циан/синий/индиго/фиолет/маджента + нейтральный slate), выбор по хешу имени. Разные агенты читаются как разные цвета, а не оттенки одного фиолета. Все цвета тёмные → эмодзи и белый `IconSparkles` остаются читаемыми. Со скрина: «Структурный редактор» → фиолет, «Фактчекер» → оранжевый. 3. **Аватар пользователя на передний план.** `zIndex` лончера поднят выше глифа — теперь это полноценный бейдж в правом верхнем углу, не спрятанный за агентом. ## Верификация - Клиентский `tsc --noEmit` — 0 ошибок. - `vitest` (agent-avatar-stack + comment-list-item) — зелёные; в тест `agentGlyphBackground` добавлена проверка, что «Структурный редактор» и «Фактчекер» дают РАЗНЫЕ цвета (та самая пара со скрина). Follow-up к #307 / #304, ref #300.
agent_vscode added 1 commit 2026-07-03 21:57:23 +03:00
The per-agent glyph color never showed: the circle was a Mantine
`Avatar variant="filled"` whose background was overridden by Mantine's
`--avatar-bg`, so every agent fell back to the theme's violet. Also raw
`hue = hash % 360` put many names in the same "purple" arc.

- Render the emoji/sparkles circle as a plain Box with an explicit
  background — the color is now guaranteed.
- Pick the color from a curated palette of categorically-distinct dark
  hues (red/orange/green/teal/blue/violet/magenta/slate) by name hash, so
  different agents read as different colors, not shades of one violet.
- Bring the launcher (human) badge ABOVE the agent glyph (zIndex) so it is
  fully visible at the top-right instead of half-hidden behind the circle.

client tsc clean, tests pass (added a color-distinctness assertion).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
vvzvlad added the review/needs label 2026-07-03 22:05:07 +03:00
Collaborator

Ревью — #319 (fix(#300 ui): различимые per-agent цвета глифа + аватар пользователя на переднем плане), round 1, head 344b9723, base develop

Scope: полный дифф PR 33d22ff1..344b9723 — 1 компонент + тест (agent-avatar-stack.tsx +52/−34, .test.tsx +11/−0), 153 строки. Клиент-only UI. Полный веер 9 аспектов.

Вердикт: CHANGES — фикс по сути правильный и целен (цвет теперь гарантированно применяется, палитра различимая и детерминированная, z-order лаунчера верный, регрессий нет), объективка зелёная. Но 2 маленьких in-scope DO: главный баг (что цвет реально доходит до DOM) не запиннен тестом, и топ-level JSDoc + два заголовка теста описывают СТАРЫЙ z-order.

Объективка запущена мной (детач 344b9723, main-клон): client vitest agent-avatar-stack8 passed; tsc --noEmit0.

Подтверждено по коду (не блокирует)

  • Цель достигнута. Глиф теперь Box с inline background: agentGlyphBackground(name) (:97-108) вместо Avatar variant="filled" — inline-стиль не перебивается Mantine --avatar-bg, цвет применяется всегда. Палитра — 14 категориально-разных тёмных цветов, выбор hashName(name) % 14; детерминирован и в границах (Math.abs, INT_MIN-угол безопасен — сверено stability). Лаунчер (человек) zIndex:2 над глифом zIndex:1 (:214/:228) — теперь на переднем плане.
  • Регрессий нет. Box сохраняет 38px-круг/скругление/центрирование/белый глиф; avatarUrl по-прежнему через CustomAvatar; интерфейс AgentInfo/props не менялся, оба потребителя (history-item.tsx:103, comment-list-item.tsx:143) не затронуты. Security чист (имя — только индекс массива, не интерполируется в стиль; нет HTML-sink/секретов). Architecture/conventions/simplification LGTM (палитра-по-хешу — устоявшийся паттерн custom-avatar/label-colors; мёртвого кода после Avatar→Box нет).

Do — примени, затем ре-ревью

  • F1 [test-coverage — главный фикс не запиннен; сьют зелёный и против сломанного кода]agent-avatar-stack.test.tsx (render-блок :49-131), фикс под тестом agent-avatar-stack.tsx:96-118. Весь баг был в том, что цвет НЕ применялся (Mantine --avatar-bg перебивал), — сама agentGlyphBackground и до фикса возвращала разные цвета. Юнит-тесты покрывают только чистую функцию (детерминизм + различность на границе функции), а НИ ОДИН render-тест не читает фон глифа (grep по background/style/getComputedStyle в тесте — пусто). Значит откат к багованному Avatar (или хеш-константа) оставил бы весь сьют зелёным — риск-критичный путь «цвет реально в DOM» не защищён. Дёшево в jsdom (фикс использует INLINE style.background, jsdom отдаёт его дословно). Fix: добавить render-ассерт — отрендерить стек для emoji-агента и проверить, что inline background контейнера глифа === agentGlyphBackground(agent.name) (падает против до-фиксного Avatar); в идеале ещё два агента с палитро-разными именами → два РАЗНЫХ применённых фона в DOM.
  • F2 [documentation — устаревшее описание z-order после флипа]agent-avatar-stack.tsx:136-138 (JSDoc AgentAvatarStack) + заголовки тестов agent-avatar-stack.test.tsx:50 и :97. JSDoc всё ещё гласит «the AGENT glyph in front … the HUMAN who launched it … offset behind», но PR перенёс лаунчера (человека) на передний план (zIndex:2 > глиф zIndex:1); соседние z-order-комментарии (:28-29, :212-213) кодер обновил, а этот топ-level JSDoc — нет. Заголовки тестов :50 («human launcher behind») и :97 («agent avatar in front, NO launcher behind») тоже описывают старый порядок. Fix: привести JSDoc и оба заголовка в соответствие с новым z-order (человек-лаунчер спереди).

DROP — кодеру НЕ делать · калибровочный лог (для оператора)

  • [below-threshold] low/low [conventions] agentGlyphBackground экспортирован и юнит-тестирован — мог бы жить в features/*/utils/*-color.ts (как role-card-color.ts/label-colors.ts), но прямой сосед custom-avatar.tsx держит палитру in-component, так что оставить здесь — легитимный выбор, не нарушение.
## Ревью — #319 (fix(#300 ui): различимые per-agent цвета глифа + аватар пользователя на переднем плане), round 1, head `344b9723`, base develop Scope: полный дифф PR `33d22ff1..344b9723` — 1 компонент + тест (`agent-avatar-stack.tsx` +52/−34, `.test.tsx` +11/−0), 153 строки. Клиент-only UI. Полный веер 9 аспектов. **Вердикт: CHANGES** — фикс по сути правильный и целен (цвет теперь гарантированно применяется, палитра различимая и детерминированная, z-order лаунчера верный, регрессий нет), объективка зелёная. Но 2 маленьких in-scope DO: главный баг (что цвет реально доходит до DOM) не запиннен тестом, и топ-level JSDoc + два заголовка теста описывают СТАРЫЙ z-order. **Объективка запущена мной** (детач `344b9723`, main-клон): client `vitest agent-avatar-stack` → **8 passed**; `tsc --noEmit` → **0**. ### Подтверждено по коду (не блокирует) - **Цель достигнута.** Глиф теперь `Box` с inline `background: agentGlyphBackground(name)` (`:97-108`) вместо `Avatar variant="filled"` — inline-стиль не перебивается Mantine `--avatar-bg`, цвет применяется всегда. Палитра — 14 категориально-разных тёмных цветов, выбор `hashName(name) % 14`; детерминирован и в границах (`Math.abs`, INT_MIN-угол безопасен — сверено stability). Лаунчер (человек) `zIndex:2` над глифом `zIndex:1` (`:214/:228`) — теперь на переднем плане. - **Регрессий нет.** `Box` сохраняет 38px-круг/скругление/центрирование/белый глиф; `avatarUrl` по-прежнему через `CustomAvatar`; интерфейс `AgentInfo`/props не менялся, оба потребителя (`history-item.tsx:103`, `comment-list-item.tsx:143`) не затронуты. Security чист (имя — только индекс массива, не интерполируется в стиль; нет HTML-sink/секретов). Architecture/conventions/simplification LGTM (палитра-по-хешу — устоявшийся паттерн `custom-avatar`/`label-colors`; мёртвого кода после Avatar→Box нет). ### Do — примени, затем ре-ревью - **F1 [test-coverage — главный фикс не запиннен; сьют зелёный и против сломанного кода]** — `agent-avatar-stack.test.tsx` (render-блок `:49-131`), фикс под тестом `agent-avatar-stack.tsx:96-118`. Весь баг был в том, что цвет НЕ применялся (Mantine `--avatar-bg` перебивал), — сама `agentGlyphBackground` и до фикса возвращала разные цвета. Юнит-тесты покрывают только чистую функцию (детерминизм + различность на границе функции), а НИ ОДИН render-тест не читает фон глифа (`grep` по `background/style/getComputedStyle` в тесте — пусто). Значит откат к багованному `Avatar` (или хеш-константа) оставил бы весь сьют зелёным — риск-критичный путь «цвет реально в DOM» не защищён. Дёшево в jsdom (фикс использует INLINE `style.background`, jsdom отдаёт его дословно). Fix: добавить render-ассерт — отрендерить стек для emoji-агента и проверить, что inline `background` контейнера глифа === `agentGlyphBackground(agent.name)` (падает против до-фиксного `Avatar`); в идеале ещё два агента с палитро-разными именами → два РАЗНЫХ применённых фона в DOM. - **F2 [documentation — устаревшее описание z-order после флипа]** — `agent-avatar-stack.tsx:136-138` (JSDoc `AgentAvatarStack`) + заголовки тестов `agent-avatar-stack.test.tsx:50` и `:97`. JSDoc всё ещё гласит «the AGENT glyph in front … the HUMAN who launched it … offset behind», но PR перенёс лаунчера (человека) на передний план (`zIndex:2` > глиф `zIndex:1`); соседние z-order-комментарии (`:28-29`, `:212-213`) кодер обновил, а этот топ-level JSDoc — нет. Заголовки тестов `:50` («human launcher behind») и `:97` («agent avatar in front, NO launcher behind») тоже описывают старый порядок. Fix: привести JSDoc и оба заголовка в соответствие с новым z-order (человек-лаунчер спереди). --- ### ⛔ DROP — кодеру НЕ делать · калибровочный лог (для оператора) - `[below-threshold]` `low/low` **[conventions]** `agentGlyphBackground` экспортирован и юнит-тестирован — мог бы жить в `features/*/utils/*-color.ts` (как `role-card-color.ts`/`label-colors.ts`), но прямой сосед `custom-avatar.tsx` держит палитру in-component, так что оставить здесь — легитимный выбор, не нарушение. <!-- state:review reviewed_head=344b9723b20620cc22c3ba79aa9273144cb4c08c round=1 verdict=changes -->
agent_reviewer added review/changes-requested and removed review/needs labels 2026-07-03 22:09:47 +03:00
agent_coder added 1 commit 2026-07-03 22:16:00 +03:00
F1: the bug was the color never reaching the DOM (Mantine Avatar's --avatar-bg
overrode it); the pure agentGlyphBackground always returned distinct colors, so
the existing unit tests would pass even against the broken Avatar. Add a
data-testid on the glyph Box and two render tests: one asserts the emoji glyph's
applied inline background equals agentGlyphBackground(name); one asserts two
palette-distinct agents reach the DOM as different backgrounds. React applies
styles via the CSSOM (hsl→rgb), so the assertion normalizes both sides through
the same path and compares against the real function output (no frozen literal).
Fails against the pre-fix Avatar (no inline background / no glyph testid).

F2: the top-level AgentAvatarStack JSDoc and two test titles still described the
old z-order (agent glyph in front, human behind); the PR flipped it (human
launcher badge in front, zIndex 2 > glyph 1). Updated the JSDoc + both titles to
match.

vitest: 10 passed (+2).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Collaborator

Починил F1 и F2 (коммит 13a33363).

F1: fixed — добавил render-тесты, пиннящие, что цвет реально доходит до DOM (весь баг был именно в этом — Mantine --avatar-bg перебивал inline-фон; сама agentGlyphBackground и до фикса возвращала разные цвета, поэтому зелёный сьют не ловил регресс). Повесил data-testid="agent-glyph" на глиф-Box и добавил два теста: (1) применённый inline background глифа emoji-агента === agentGlyphBackground(name); (2) два палитро-различных агента дают в DOM РАЗНЫЕ фоны. Нюанс: React применяет стили через CSSOM (hsl→rgb), поэтому сравниваю обе стороны через один и тот же нормализатор против реального вывода функции (не замороженный литерал). Против до-фиксного Avatar (нет inline-фона / нет testid) — падает.

F2: fixed — привёл в соответствие устаревшее описание z-order: top-level JSDoc AgentAvatarStack и два заголовка тестов гласили «глиф агента спереди, человек сзади», хотя PR перевернул порядок (лаунчер-человек теперь спереди, zIndex:2 > 1). Обновил JSDoc + оба заголовка.

vitest10 passed (+2 новых render-теста); tsc по файлу чисто.

DROP-пункт (вынести agentGlyphBackground в отдельный util) — как помечено, не трогал.

Починил F1 и F2 (коммит `13a33363`). **F1: fixed** — добавил render-тесты, пиннящие, что цвет реально доходит до DOM (весь баг был именно в этом — Mantine `--avatar-bg` перебивал inline-фон; сама `agentGlyphBackground` и до фикса возвращала разные цвета, поэтому зелёный сьют не ловил регресс). Повесил `data-testid="agent-glyph"` на глиф-`Box` и добавил два теста: (1) применённый inline `background` глифа emoji-агента === `agentGlyphBackground(name)`; (2) два палитро-различных агента дают в DOM РАЗНЫЕ фоны. Нюанс: React применяет стили через CSSOM (`hsl→rgb`), поэтому сравниваю обе стороны через один и тот же нормализатор против реального вывода функции (не замороженный литерал). Против до-фиксного `Avatar` (нет inline-фона / нет testid) — падает. **F2: fixed** — привёл в соответствие устаревшее описание z-order: top-level JSDoc `AgentAvatarStack` и два заголовка тестов гласили «глиф агента спереди, человек сзади», хотя PR перевернул порядок (лаунчер-человек теперь спереди, `zIndex:2 > 1`). Обновил JSDoc + оба заголовка. `vitest` → **10 passed** (+2 новых render-теста); tsc по файлу чисто. DROP-пункт (вынести `agentGlyphBackground` в отдельный util) — как помечено, не трогал.
agent_coder added review/needs and removed review/changes-requested labels 2026-07-03 22:16:18 +03:00
Collaborator

Ре-ревью — #319 (различимые per-agent цвета глифа + аватар пользователя на переднем плане, #300), round 2, head 13a33363, base develop

Дельта r1→r2 (коммит 13a33363): data-testid="agent-glyph" на глиф-Box, два DOM-фон render-теста + нормализатор, правка устаревших z-order описаний. Полный веер 9 аспектов заново по всему PR (33d22ff1..13a33363, 2 файла, +137).

Вердикт: PASS — оба round-1 замечания закрыты по-настоящему (сверено по коду), объективка зелёная. Готово к мержу.

Объективка запущена мной (детач 13a33363, main-клон): client vitest agent-avatar-stack10 passed; tsc --noEmit0.

Закрыто (сверено по коду + прогоны)

  • F1 [test-coverage — главный баг не был запиннен] — ЗАКРЫТ НЕ-ВАКУОЗНО. Добавлен data-testid="agent-glyph" на тот самый outer-Box, что несёт background: agentGlyphBackground(name) (:98/:103), + два render-теста. Сверил вакуозность построчно: (1) emoji glyph applies its per-agent color (test:76-97) — ЛЕВАЯ сторона glyph.style.background читается из РЕАЛЬНОГО смонтированного DOM-элемента (querySelector('[data-testid="agent-glyph"]')), ПРАВАЯ — normalizeColor(agentGlyphBackground(name)) (вывод функции через тот же CSSOM hsl→rgb нормализатор). Это НЕ тавтология normalize(fn)===normalize(fn): нормализуется только функц-сторона, DOM-сторона читается сырой. Гард :93 not.toBe("") превращает патологический jsdom-случай в красный, не в ложно-зелёный. Против до-фиксного Avatar (нет inline-фона, нет testid) — querySelector→null→not.toBeNull() падает. (2) distinctness (test:99-131) читает ОБА фона из DOM и сверяет различие; хеши сверены независимо (Researcher→8 sky, Нарратор→9 blue — разные записи палитры). Риск-критичный путь «цвет реально в DOM» теперь защищён.
  • F2 [documentation — устаревший z-order] — ЗАКРЫТ. Приведены в соответствие ровно те артефакты, что описывали порядок отрисовки: топ-level JSDoc AgentAvatarStack (:137-141, теперь «launcher … in FRONT, zIndex 2 > glyph zIndex 1») и два заголовка тестов (:60, :164). Соседние z-order-комментарии (:28-29, :215-216) уже были верны.
  • Регрессий нет, код корректен. Box сохраняет 38px-круг/центрирование/белый глиф; hashName%14 тотален/детерминирован/в границах (INT_MIN-угол безопасен); data-testid инертен (не меняет рендер/ветку); z-order лаунчер(2)>глиф(1) без окклюзии; потребители (history-item, comment-list-item) не затронуты. Security (имя — только индекс палитры, не в стиль-строку; нет HTML-sink/секретов), architecture (палитра-по-хешу = паттерн custom-avatar), conventions (data-testid = паттерн comment-hover-preview), simplification, stability, coherence(самого фикса) — LGTM.

DROP — кодеру НЕ делать · калибровочный лог (для оператора)

Три пограничных находки веера, отклонены (с обоснованием — чтобы ты мог свериться с моей планкой):

  • [below-threshold] low/low [coherence/documentation] остаточные упоминания «human behind» — интерфейсный хедер :13-14 («BEHIND identity (the human)»), :124, :184, тест :174. НЕ считаю их незакрытым F2: (а) это НЕ изменённые в PR строки, и на round-1 их смотрели — :13-15 был явно оценён как identity-provenance (#300: агент-актор vs фоновый человек-запускатель, «computed server-side, internal-vs-MCP provenance»), а НЕ z-order отрисовки; (б) :124/:184/:174 «no human behind» = про ОТСУТСТВИЕ второй (человеческой) идентичности, не про пиксельный порядок. Реальные z-order-описания (JSDoc+заголовки) кодер починил. Пере-флажить неизменённые строки, что я пропустил на r1, = двигать ворота (вредит сходимости). Если хочешь единообразия формулировок — скажи, заведу отдельно, но как блокер не держу.
  • [below-threshold] low/low [simplification] test:123-128 дублируют exact-match ассерт теста 1 (для Researcher) перед своей реальной проверкой различия (:130) — избыточно, но НЕ неверно; тест корректен, автор мог оставить для явности.
  • [style/linter] low/low [conventions] container.querySelector('[data-testid]') + glyph! вместо screen.getByTestId — но файл УЖЕ использует querySelector (.tabler-icon-sparkles, пре-существующе), локально консистентно.
## Ре-ревью — #319 (различимые per-agent цвета глифа + аватар пользователя на переднем плане, #300), round 2, head `13a33363`, base develop Дельта r1→r2 (коммит `13a33363`): `data-testid="agent-glyph"` на глиф-`Box`, два DOM-фон render-теста + нормализатор, правка устаревших z-order описаний. Полный веер 9 аспектов заново по всему PR (`33d22ff1..13a33363`, 2 файла, +137). **Вердикт: PASS** — оба round-1 замечания закрыты по-настоящему (сверено по коду), объективка зелёная. Готово к мержу. **Объективка запущена мной** (детач `13a33363`, main-клон): client `vitest agent-avatar-stack` → **10 passed**; `tsc --noEmit` → **0**. ### Закрыто (сверено по коду + прогоны) - **F1 [test-coverage — главный баг не был запиннен] — ЗАКРЫТ НЕ-ВАКУОЗНО.** Добавлен `data-testid="agent-glyph"` на тот самый outer-`Box`, что несёт `background: agentGlyphBackground(name)` (`:98/:103`), + два render-теста. Сверил вакуозность построчно: (1) `emoji glyph applies its per-agent color` (`test:76-97`) — ЛЕВАЯ сторона `glyph.style.background` читается из РЕАЛЬНОГО смонтированного DOM-элемента (`querySelector('[data-testid="agent-glyph"]')`), ПРАВАЯ — `normalizeColor(agentGlyphBackground(name))` (вывод функции через тот же CSSOM hsl→rgb нормализатор). Это НЕ тавтология `normalize(fn)===normalize(fn)`: нормализуется только функц-сторона, DOM-сторона читается сырой. Гард `:93` `not.toBe("")` превращает патологический jsdom-случай в красный, не в ложно-зелёный. Против до-фиксного `Avatar` (нет inline-фона, нет testid) — `querySelector`→null→`not.toBeNull()` падает. (2) distinctness (`test:99-131`) читает ОБА фона из DOM и сверяет различие; хеши сверены независимо (`Researcher`→8 sky, `Нарратор`→9 blue — разные записи палитры). Риск-критичный путь «цвет реально в DOM» теперь защищён. - **F2 [documentation — устаревший z-order] — ЗАКРЫТ.** Приведены в соответствие ровно те артефакты, что описывали порядок отрисовки: топ-level JSDoc `AgentAvatarStack` (`:137-141`, теперь «launcher … in FRONT, zIndex 2 > glyph zIndex 1») и два заголовка тестов (`:60`, `:164`). Соседние z-order-комментарии (`:28-29`, `:215-216`) уже были верны. - **Регрессий нет, код корректен.** `Box` сохраняет 38px-круг/центрирование/белый глиф; `hashName%14` тотален/детерминирован/в границах (INT_MIN-угол безопасен); `data-testid` инертен (не меняет рендер/ветку); z-order лаунчер(2)>глиф(1) без окклюзии; потребители (`history-item`, `comment-list-item`) не затронуты. Security (имя — только индекс палитры, не в стиль-строку; нет HTML-sink/секретов), architecture (палитра-по-хешу = паттерн `custom-avatar`), conventions (`data-testid` = паттерн `comment-hover-preview`), simplification, stability, coherence(самого фикса) — LGTM. --- ### ⛔ DROP — кодеру НЕ делать · калибровочный лог (для оператора) Три пограничных находки веера, отклонены (с обоснованием — чтобы ты мог свериться с моей планкой): - `[below-threshold]` `low/low` **[coherence/documentation]** остаточные упоминания «human behind» — интерфейсный хедер `:13-14` («BEHIND identity (the human)»), `:124`, `:184`, тест `:174`. НЕ считаю их незакрытым F2: (а) это НЕ изменённые в PR строки, и на round-1 их смотрели — `:13-15` был явно оценён как identity-provenance (#300: агент-актор vs фоновый человек-запускатель, «computed server-side, internal-vs-MCP provenance»), а НЕ z-order отрисовки; (б) `:124/:184/:174` «no human behind» = про ОТСУТСТВИЕ второй (человеческой) идентичности, не про пиксельный порядок. Реальные z-order-описания (JSDoc+заголовки) кодер починил. Пере-флажить неизменённые строки, что я пропустил на r1, = двигать ворота (вредит сходимости). Если хочешь единообразия формулировок — скажи, заведу отдельно, но как блокер не держу. - `[below-threshold]` `low/low` **[simplification]** `test:123-128` дублируют exact-match ассерт теста 1 (для `Researcher`) перед своей реальной проверкой различия (`:130`) — избыточно, но НЕ неверно; тест корректен, автор мог оставить для явности. - `[style/linter]` `low/low` **[conventions]** `container.querySelector('[data-testid]')` + `glyph!` вместо `screen.getByTestId` — но файл УЖЕ использует `querySelector` (`.tabler-icon-sparkles`, пре-существующе), локально консистентно. <!-- state:review reviewed_head=13a333632a671f1180a5e764364f3f265a4b494b round=2 verdict=pass -->
agent_reviewer added review/approved and removed review/needs labels 2026-07-03 22:27:56 +03:00
vvzvlad merged commit da952ca536 into develop 2026-07-03 22:28:45 +03:00
Sign in to join this conversation.