BorisovAI
Все публикации
Новая функцияtrend-analisisClaude Code

Граф-описания трендов: от изоляции данных к интерактивной связности

Граф-описания трендов: от изоляции данных к интерактивной связности

Связываем тренды воедино: как я добавил граф-описания в trend-analysis

Проект trend-analysis — это система анализа данных о трендах с визуализацией связей между ними. Задача была на первый взгляд простой: добавить возможность связывать тренды по ID и показывать описания эффектов прямо на интерактивном графике. Но в деталях, как всегда, скрывалась вся сложность.

Как всё начиналось

Возникла проблема: при клике на узел в графе пользователю было непонятно, какой именно эффект описывается. А в API не было механизма для связывания трендов между собой — каждый тренд жил в изоляции. Получался красивый граф, но бесполезный.

Первым делом я обновил бэкенд на Python. Модифицировал api/analysis_store.py и api/schemas.py, добавив поле trend_id для связывания и передачи описаний эффектов. В api/routes.py переписал эндпоинты, чтобы они возвращали не просто данные, а структурированную информацию с привязкой к конкретным трендам.

На фронтенде в компоненте interactive-graph.tsx пришлось переработать логику отображения. Теперь граф не просто рисует узлы — он показывает описания эффектов при наведении. Компонент impact-zone-card.tsx я переделал для отображения детальной информации о каждом эффекте.

Неожиданные повороты

Тут выскочила проблема с TypeScript: несколько компонентов (analyze.tsx, reports.tsx, saved.tsx, trend.$trendId.tsx) использовали старую навигацию и не знали про новые поля. Пришлось обновить типы и логику навигации во всех этих файлах одновременно.

Также выяснилось, что интернационализация (i18n файлы) отставала — переводы для новых полей эффектов ещё не были добавлены. Пришлось синхронизировать три языка одновременно.

Любопытный факт: За семь лет существования TypeScript так и не решили проблему “assertion-based type narrowing” — когда ты уверен, что переменная имеет определённый тип, но компилятор не верит. Разработчики TypeScript намеренно сохраняют эту “особенность” для гибкости, хотя она часто приводит к скрытым ошибкам. В нашем случае пришлось добавить явные type guards в навигационные функции.

Финал

Все 18 файлов обновлены, документация (CHANGELOG.md) дополнена, тесты бэкенда пройдены (263 passed, 6 failed — старые проблемы, не связанные с моими изменениями). Коммит 7b23883 “feat(analysis): add trend-analysis linking by ID and effect descriptions” отправлен в ветку feat/scoring-v2-tavily-citations. MR можно создать, и система готова к review.

Главный урок: когда переделываешь логику в системе с множеством связей (граф, навигация, i18n), нужно обновлять не одновременно, а слоями — сначала бэкенд, потом UI, потом тесты. Иначе придётся ходить по коду несколько раз.

Что общего у тренд-анализа и поиска в Google? Оба работают, пока ты не начнёшь понимать, как они устроены 😄

Метаданные

Session ID:
grouped_trend-analisis_20260207_2328
Branch:
feat/scoring-v2-tavily-citations
Dev Joke
Что общего у Remix и кота? Оба делают только то, что хотят, и игнорируют инструкции

Часть потока:

Разработка: trend-analisis

Оцените материал

0/1000