[Fable 5][uncertain][P2] ObjectSaleChart: ось X строится по месяцам только первого type — серии parking/nonliv рисуются на чужих месяцах #1246

Closed
opened 2026-06-13 04:58:12 +00:00 by bot-backend · 0 comments
Collaborator

Из армейского ревью Claude Fable 5 (2026-06-11) — UNCERTAIN (1/2 верификаторов real)

⚠️ Только 1 из 2 адверсариальных верификаторов подтвердил баг как real. Заведено по решению Anton (2026-06-13) — требует дополнительной проверки перед фиксом. Severity P2 (correctness), confidence 0.7.

Файл

frontend/src/components/analytics/ObjectSaleChart.tsx:44

Evidence (цитата кода)

const months = Object.values(byType)[0]?.months ?? [];
const series = Object.entries(byType).flatMap(([type, d]) => [
  {
    name: `${type} · реализовано`,
    type: "bar",
    stack: type,
    data: d.realised,

Why bug (по версии finder'а)

Бэкенд object_sale_graph (analytics_queries.py:673, ORDER BY type, report_month) отдаёт до 3 типов (apartments/nonliv/parking) с разными наборами месяцев — parking/nonliv обычно стартуют позже и имеют меньше точек. Фронт строит category-ось из месяцев ТОЛЬКО первого типа, а data всех серий привязывается позиционно → бары и линия цены для второго/третьего типа отображаются на чужих месяцах, лишние точки молча обрезаются. Финансовый drill-in /analytics/objects/[id] показывает продажи/цены не в тех месяцах.

Suggested fix

Строить union всех месяцев (как в PrinzipVelocityChart: Array.from(new Set(...)).sort()) и маппить значения каждого типа по месяцу через find/Map, null для отсутствующих + connectNulls.

Verify notes (вердикты адверсариальных верификаторов)

  • [real/P2] Подтверждено трассировкой: hook вызывается без type-фильтра, бэкенд отдаёт все типы (ORDER BY type, report_month); скрейпер тянет apartments и parking двумя независимыми DOM.РФ-эндпойнтами без выравнивания месяцев. Фронт берёт ось X из months только первого типа, а data всех серий — голые массивы, ECharts маппит позиционно: серия parking, стартующая позже (типично), рисуется со сдвигом на чужих месяцах; лишние точки молча обрезаются.
  • [refuted/P3] Премиссы опровергнуты данными: в sale_graph лишь 2 типа (nonliv — только в sales_agg). Прогон по prod-БД, все 5 снапшотов (новейший 2026-06-03): из 1329 пар (obj, snapshot) с обоими типами 0 имеют различающиеся месячные сетки — DOM.RF всегда отдаёт идентичный набор report_month для обоих типов. Позиционная привязка к months первого типа не смещается; «parking стартует позже» в данных не встречается. Остался гипотетический hardening — не баг.

Provenance

  • Finders: fe-rest
  • Confidence: 0.7
  • Verifier votes: 1 real / 1 refuted (на основании 2 попыток)
  • Originally batched at: main@d796027
## Из армейского ревью Claude Fable 5 (2026-06-11) — UNCERTAIN (1/2 верификаторов real) ⚠️ **Только 1 из 2 адверсариальных верификаторов подтвердил баг как `real`**. Заведено по решению Anton (2026-06-13) — требует **дополнительной проверки** перед фиксом. Severity **P2** (correctness), confidence 0.7. ## Файл [`frontend/src/components/analytics/ObjectSaleChart.tsx:44`](frontend/src/components/analytics/ObjectSaleChart.tsx:44) ## Evidence (цитата кода) ``` const months = Object.values(byType)[0]?.months ?? []; const series = Object.entries(byType).flatMap(([type, d]) => [ { name: `${type} · реализовано`, type: "bar", stack: type, data: d.realised, ``` ## Why bug (по версии finder'а) Бэкенд object_sale_graph (analytics_queries.py:673, ORDER BY type, report_month) отдаёт до 3 типов (apartments/nonliv/parking) с разными наборами месяцев — parking/nonliv обычно стартуют позже и имеют меньше точек. Фронт строит category-ось из месяцев ТОЛЬКО первого типа, а data всех серий привязывается позиционно → бары и линия цены для второго/третьего типа отображаются на чужих месяцах, лишние точки молча обрезаются. Финансовый drill-in /analytics/objects/[id] показывает продажи/цены не в тех месяцах. ## Suggested fix Строить union всех месяцев (как в PrinzipVelocityChart: Array.from(new Set(...)).sort()) и маппить значения каждого типа по месяцу через find/Map, null для отсутствующих + connectNulls. ## Verify notes (вердикты адверсариальных верификаторов) - [real/P2] Подтверждено трассировкой: hook вызывается без type-фильтра, бэкенд отдаёт все типы (ORDER BY type, report_month); скрейпер тянет apartments и parking двумя независимыми DOM.РФ-эндпойнтами без выравнивания месяцев. Фронт берёт ось X из months только первого типа, а data всех серий — голые массивы, ECharts маппит позиционно: серия parking, стартующая позже (типично), рисуется со сдвигом на чужих месяцах; лишние точки молча обрезаются. - [refuted/P3] Премиссы опровергнуты данными: в sale_graph лишь 2 типа (nonliv — только в sales_agg). Прогон по prod-БД, все 5 снапшотов (новейший 2026-06-03): из 1329 пар (obj, snapshot) с обоими типами 0 имеют различающиеся месячные сетки — DOM.RF всегда отдаёт идентичный набор report_month для обоих типов. Позиционная привязка к months первого типа не смещается; «parking стартует позже» в данных не встречается. Остался гипотетический hardening — не баг. ## Provenance - Finders: `fe-rest` - Confidence: 0.7 - Verifier votes: 1 real / 1 refuted (на основании 2 попыток) - Originally batched at: main@d796027
bot-backend added the
Fable 5 ревью
label 2026-06-13 04:58:12 +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#1246
No description provided.