feat(forecast): forecast compute-date/horizons/schema meta footer (#958) #1128

Merged
bot-backend merged 1 commit from feat/forecast-meta-footer into main 2026-06-07 11:09:05 +00:00
Collaborator

Что

Компактная строка происхождения/свежести в подвале Section 6: «Прогноз рассчитан: <дата> · горизонты N / M мес · схема X» над advisory-дисклеймером. Раньше эти данные жили только в экспортах — для прогнозного инструмента дата расчёта это сигнал доверия/устаревания, а горизонты были видны лишь неявно через ось графика.

Относится к #958 (UI экран прогноза).

Ключевое

Дата свежести берётся из created_at конверта прогноза (время персиста рана, всегда выставлено), а meta.generated_at — фолбэк. Детерминированный ассемблер/оркестратор НАМЕРЕННО не штампует generated_at (воспроизводимость тестов) → он часто null в реальных ранах; но персистнутый ран всегда несёт created_at — это и есть настоящее «когда рассчитан». (Без этой правки строка показывала бы только горизонты+схему — дата бы не появлялась.)

Содержимое

  • ForecastMetaLine.tsx (новый) — три независимо-гардированных сегмента: RU-дата (toLocaleDateString("ru"), время «, ЧЧ:ММ» только если оно есть и не полночь), горизонты, наиболее приглушённая схема. Graceful: null когда все сегменты пусты (202-pending / тонкий отчёт); невалидная дата → сегмент пропускается.
  • Section6Forecast.tsx — проводка runCreatedAt={data.created_at} из конверта в ForecastReady → ForecastMetaLine; advisory-дисклеймер остаётся ПОСЛЕДНИМ; borderTop сохранён.

Качество

Self-reviewed (полный diff прочитан): date-гарды верны (null/NaN/empty/midnight/no-T), все цвета — токены, нет регрессии (advisory последним, borderTop на обёртке), ForecastEnvelope.created_at существует + проброшен, нет SSR-tz-риска (данные прогноза резолвятся только client-side). npm run build зелёный, prettier чисто, no any, no deps. Чистый pure-presentational компонент (170 строк, 2 файла).

Тест-план (post-deploy)

/site-finder/analysis/66:41:0702048:27 → низ Секции 6: строка «Прогноз рассчитан: <дата>, ЧЧ:ММ · горизонты 6 / 12 / 18 / 24 мес · схема 1.0» над дисклеймером (мок-фикстура имеет created_at 2026-06-04 → дата отображается).

## Что Компактная строка происхождения/свежести в подвале Section 6: **«Прогноз рассчитан: <дата> · горизонты N / M мес · схема X»** над advisory-дисклеймером. Раньше эти данные жили только в экспортах — для прогнозного инструмента дата расчёта это сигнал доверия/устаревания, а горизонты были видны лишь неявно через ось графика. Относится к #958 (UI экран прогноза). ## Ключевое Дата свежести берётся из **`created_at` конверта прогноза** (время персиста рана, всегда выставлено), а `meta.generated_at` — фолбэк. Детерминированный ассемблер/оркестратор НАМЕРЕННО не штампует `generated_at` (воспроизводимость тестов) → он часто null в реальных ранах; но персистнутый ран всегда несёт `created_at` — это и есть настоящее «когда рассчитан». (Без этой правки строка показывала бы только горизонты+схему — дата бы не появлялась.) ## Содержимое - `ForecastMetaLine.tsx` (новый) — три независимо-гардированных сегмента: RU-дата (`toLocaleDateString("ru")`, время «, ЧЧ:ММ» только если оно есть и не полночь), горизонты, наиболее приглушённая схема. Graceful: `null` когда все сегменты пусты (202-pending / тонкий отчёт); невалидная дата → сегмент пропускается. - `Section6Forecast.tsx` — проводка `runCreatedAt={data.created_at}` из конверта в `ForecastReady → ForecastMetaLine`; advisory-дисклеймер остаётся ПОСЛЕДНИМ; borderTop сохранён. ## Качество Self-reviewed (полный diff прочитан): date-гарды верны (null/NaN/empty/midnight/no-T), все цвета — токены, нет регрессии (advisory последним, borderTop на обёртке), `ForecastEnvelope.created_at` существует + проброшен, нет SSR-tz-риска (данные прогноза резолвятся только client-side). `npm run build` зелёный, prettier чисто, no `any`, no deps. Чистый pure-presentational компонент (170 строк, 2 файла). ## Тест-план (post-deploy) `/site-finder/analysis/66:41:0702048:27` → низ Секции 6: строка «Прогноз рассчитан: <дата>, ЧЧ:ММ · горизонты 6 / 12 / 18 / 24 мес · схема 1.0» над дисклеймером (мок-фикстура имеет `created_at` 2026-06-04 → дата отображается).
bot-backend added the
scope/frontend
GG-форсайт
site-finder
labels 2026-06-07 11:09:02 +00:00
bot-backend added 1 commit 2026-06-07 11:09:03 +00:00
feat(forecast): show compute date / horizons / schema in Section 6 footer
All checks were successful
CI / changes (push) Successful in 6s
CI / backend-tests (push) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 6s
Deploy / changes (push) Successful in 6s
Deploy / build-backend (push) Has been skipped
Deploy / build-worker (push) Has been skipped
Deploy / build-frontend (push) Successful in 2m58s
Deploy / deploy (push) Successful in 1m2s
7756ed4631
Surface report.meta provenance as a compact muted caption above the advisory
disclaimer: «Прогноз рассчитан: <дата> · горизонты N / M мес · схема X». The
freshness date sources from the run's persist time (envelope created_at, always
set) with meta.generated_at as fallback — the deterministic assembler leaves
generated_at null, but created_at is the real compute timestamp. Until now this
provenance lived only in exports; horizons appeared only via the chart axis.

New ForecastMetaLine.tsx: three independently-guarded segments (RU long date
with optional non-midnight time, horizons, most-muted schema); graceful null
when meta empty / 202-pending. Advisory disclaimer stays last.

Part of #958.
bot-backend merged commit 7756ed4631 into main 2026-06-07 11:09:05 +00:00
Sign in to join this conversation.
No reviewers
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#1128
No description provided.