# Этап 5 — панель (дашборд смысла) **Статус:** ✅ РЕАЛИЗОВАНО (2026-09-14) **Цель:** единая сводка по атомам, версиям, каналам, доходу и графу. ## Запуск ```bash python3 stage5/panel.py --all # всё: проекты + cost + граф python3 stage5/panel.py --project rabota-ufa # только проект python3 stage5/panel.py --graph # только граф (AGE) ``` ## Что показывает - **projects** — атомы по проектам (типы: claim/instruction/stat/qa), версии под каналы (web_article/telegram), активные каналы (newsletter/podcast/youtube). - **cost** — стоимость запусков (`runs`, stage=embed) + доход по каналам (`publications.metrics.revenue`). - **graph** — AGE-граф: вершины/рёбра (подсчёт из AGE), типы связей (duplicate), connected components (Union-Find из Postgres). ## Дизайн - **Минимальная версия** — один Python-скрипт, без FastAPI/React (это отдельный V5). - **Источник истины** — Postgres (atom_relations для связей/компонентов); AGE — только подсчёт вершин/рёбер (agtype не выводится в psql). - **Идемпотентно** — только чтение, никаких записей. ## Ключевой факт agtype-колонки AGE **не отображаются** в `psql`-выводе (известная проблема). Поэтому типы связей и connected components читаются из Postgres, а из AGE — только `count(*)` вершин/рёбер.