(low) ForecastConfidenceBlock: coverage=1.0 (100%) рендерится как «1» вместо «100%» из-за строгого < 1 #1378

Closed
opened 2026-06-14 18:10:00 +00:00 by bot-backend · 0 comments
Collaborator

Описание

formatFactorValue трактует дробь строго внутри (0,1) как процент, но использует value < 1 (исключающая граница). Coverage-фактор (например domrf_coverage) ровно со значением 1.0 = полное 100% покрытие не проходит тест value > 0 && value < 1 и проваливается в Math.round(1).toLocaleString → рендерит «1» (вид целого-счётчика) вместо «100%». То есть ЛУЧШЕЕ возможное покрытие — единственный случай, отображаемый неверно, в панели, чья цель — доносить доверие к данным. ConfidenceFactor.value: number | null (types/forecast.ts:160). Значение 1.0 достижимо: _clamp_fraction в report_assembler.py:206 явно делает min(1.0, value).

Корень

Эвристика percent-vs-count по диапазону значения с исключающей верхней границей < 1, вместо явной единицы измерения по ключу фактора.

Evidence

/Users/anton/Птица/gendesign/frontend/src/components/site-finder/analysis/ForecastConfidenceBlock.tsx:46-51

function formatFactorValue(value: number | null): string | null {
  if (value == null) return null;
  // Fractions in 0..1 read as percent (e.g. coverage); integers/large stay raw.
  if (value > 0 && value < 1) return `${Math.round(value * 100)}%`;
  return Math.round(value).toLocaleString("ru");
}

Suggested fix

Коротко: включить границу 1.0 — if (value > 0 && value <= 1) return …%. Лучше: управлять форматом percent-vs-count по ключу фактора (coverage-ключи → percent), чтобы deal_count вида 0.x не помечался процентом, а coverage 1.0 читалось «100%».

Обоснование severity

Low: поле note от бэкенда уже содержит человекочитаемый процент («покрытие domrf↔objective 100.0% — достаточно») рядом с лейблом, частично компенсируя; 100% coverage редко на практике; «· 1» — вторичная подсказка, не основное объяснение.


week ревью 1 · multi-agent аудит 2026-06-14 · severity=low · category=correctness

Затронутые файлы:

  • /Users/anton/Птица/gendesign/frontend/src/components/site-finder/analysis/ForecastConfidenceBlock.tsx
## Описание `formatFactorValue` трактует дробь строго внутри (0,1) как процент, но использует `value < 1` (исключающая граница). Coverage-фактор (например `domrf_coverage`) ровно со значением 1.0 = полное 100% покрытие не проходит тест `value > 0 && value < 1` и проваливается в `Math.round(1).toLocaleString` → рендерит «1» (вид целого-счётчика) вместо «100%». То есть ЛУЧШЕЕ возможное покрытие — единственный случай, отображаемый неверно, в панели, чья цель — доносить доверие к данным. `ConfidenceFactor.value: number | null` (types/forecast.ts:160). Значение 1.0 достижимо: `_clamp_fraction` в `report_assembler.py:206` явно делает `min(1.0, value)`. ## Корень Эвристика percent-vs-count по диапазону значения с исключающей верхней границей `< 1`, вместо явной единицы измерения по ключу фактора. ## Evidence `/Users/anton/Птица/gendesign/frontend/src/components/site-finder/analysis/ForecastConfidenceBlock.tsx:46-51` ```ts function formatFactorValue(value: number | null): string | null { if (value == null) return null; // Fractions in 0..1 read as percent (e.g. coverage); integers/large stay raw. if (value > 0 && value < 1) return `${Math.round(value * 100)}%`; return Math.round(value).toLocaleString("ru"); } ``` ## Suggested fix Коротко: включить границу 1.0 — `if (value > 0 && value <= 1) return …%`. Лучше: управлять форматом percent-vs-count по ключу фактора (coverage-ключи → percent), чтобы `deal_count` вида 0.x не помечался процентом, а coverage 1.0 читалось «100%». ## Обоснование severity Low: поле `note` от бэкенда уже содержит человекочитаемый процент («покрытие domrf↔objective 100.0% — достаточно») рядом с лейблом, частично компенсируя; 100% coverage редко на практике; «· 1» — вторичная подсказка, не основное объяснение. --- _week ревью 1 · multi-agent аудит 2026-06-14 · severity=**low** · category=`correctness`_ Затронутые файлы: - `/Users/anton/Птица/gendesign/frontend/src/components/site-finder/analysis/ForecastConfidenceBlock.tsx`
bot-backend added the
week ревью 1
label 2026-06-14 18:10:00 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:01:55 +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#1378
No description provided.