(low) compare/page.tsx handleResult: dedup-гард сравнивает не все отображаемые поля → возможен стейл медианной цены/района/подписей #1423

Closed
opened 2026-06-15 05:53:55 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: frontend · Файл: frontend/src/app/site-finder/compare/page.tsx:40-57

Файл: frontend/src/app/site-finder/compare/page.tsx:44-56 (handleResult/setColumns).

Что не так: ранний-выход в setColumns сравнивает только 6 полей — status, score, verdictLabel, velocityScore, pipeline24mo, confidenceValue (строки 47-51) — и возвращает prev (проглатывает апдейт), если они равны. Но CompareTable реально рендерит ещё: medianPricePerM2 ('Медиана ₽/м²', CompareTable.tsx:141-144), districtName (подзаголовок колонки, :240-250), scoreLabel (подпись рядом с баллом, :107-112), confidenceLabel (текст достоверности, :165-174) и errorMsg (:279). Эти поля в гард не входят. Если повторная эмиссия onResult для того же cad несёт обновлённую медиану/район/подпись при идентичных 6 проверяемых полях — апдейт будет проглочен, в таблице останется старое значение.

Импакт: edge-case. Для одного cad результат /analyze детерминирован и кэшируется (staleTime), поэтому повторные эмиссии обычно несут идентичные данные; расхождение возможно лишь при refetch после истечения staleTime, когда поменялись только медиана/район/подпись, а 6 ключевых метрик байтово совпали — тогда пользователь видит устаревшую цену/район без индикации. Не краш, не частый случай.

Как чинить: либо добавить недостающие поля (medianPricePerM2, districtName, scoreLabel, confidenceLabel, errorMsg) в сравнение гард; либо сравнивать глубоким равенством всего объекта col, чтобы набор проверяемых ключей не расходился с тем, что рендерится.

Почему баг: Гард намеренно отбрасывает state-update, но набор ключей неполон относительно того, что компонент реально показывает. На практике для одного cad результат /analyze детерминирован и кэшируется 5 мин (staleTime), поэтому повторные эмиссии обычно несут идентичные данные; расхождение возможно лишь при refetch после истечения staleTime, когда меняется только медиана/район, а 6 ключевых метрик байтово совпали — тогда пользователь видит устаревшую цену/район без индикации. Edge-case, отсюда low.

Как чинить: Включить в сравнение все отображаемые поля (medianPricePerM2, districtName, scoreLabel, confidenceLabel, errorMsg) либо заменить ручной diff на сравнение по JSON/shallow-equal всех полей CompareColumn.


deep-audit «армия ботов 2» · verify+harden, confidence 0.7 · unit U83

**Severity:** low · **Категория:** frontend · **Файл:** `frontend/src/app/site-finder/compare/page.tsx:40-57` Файл: frontend/src/app/site-finder/compare/page.tsx:44-56 (handleResult/setColumns). Что не так: ранний-выход в setColumns сравнивает только 6 полей — status, score, verdictLabel, velocityScore, pipeline24mo, confidenceValue (строки 47-51) — и возвращает prev (проглатывает апдейт), если они равны. Но CompareTable реально рендерит ещё: medianPricePerM2 ('Медиана ₽/м²', CompareTable.tsx:141-144), districtName (подзаголовок колонки, :240-250), scoreLabel (подпись рядом с баллом, :107-112), confidenceLabel (текст достоверности, :165-174) и errorMsg (:279). Эти поля в гард не входят. Если повторная эмиссия onResult для того же cad несёт обновлённую медиану/район/подпись при идентичных 6 проверяемых полях — апдейт будет проглочен, в таблице останется старое значение. Импакт: edge-case. Для одного cad результат /analyze детерминирован и кэшируется (staleTime), поэтому повторные эмиссии обычно несут идентичные данные; расхождение возможно лишь при refetch после истечения staleTime, когда поменялись только медиана/район/подпись, а 6 ключевых метрик байтово совпали — тогда пользователь видит устаревшую цену/район без индикации. Не краш, не частый случай. Как чинить: либо добавить недостающие поля (medianPricePerM2, districtName, scoreLabel, confidenceLabel, errorMsg) в сравнение гард; либо сравнивать глубоким равенством всего объекта col, чтобы набор проверяемых ключей не расходился с тем, что рендерится. **Почему баг:** Гард намеренно отбрасывает state-update, но набор ключей неполон относительно того, что компонент реально показывает. На практике для одного cad результат /analyze детерминирован и кэшируется 5 мин (staleTime), поэтому повторные эмиссии обычно несут идентичные данные; расхождение возможно лишь при refetch после истечения staleTime, когда меняется только медиана/район, а 6 ключевых метрик байтово совпали — тогда пользователь видит устаревшую цену/район без индикации. Edge-case, отсюда low. **Как чинить:** Включить в сравнение все отображаемые поля (medianPricePerM2, districtName, scoreLabel, confidenceLabel, errorMsg) либо заменить ручной diff на сравнение по JSON/shallow-equal всех полей CompareColumn. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.7 · unit U83</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:53:55 +00:00
bot-backend added the
scope/frontend
label 2026-06-15 11:02:02 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1423
No description provided.