From 2e26edbb3a3766e7a324598792e6dd69dc45ec6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Tue, 19 May 2026 14:22:05 +0300 Subject: [PATCH] docs(brain): brain dashboard design spec MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Standalone HTML dashboard that visualises the observer episode log over the automation-graph topology — 4 views (map / task-replay / session feed / aggregate), graph as shared canvas, 3-phase build order. Co-Authored-By: Claude Opus 4.7 (1M context) --- cspell-words.txt | 8 + .../2026-05-19-brain-dashboard-design.md | 195 ++++++++++++++++++ 2 files changed, 203 insertions(+) create mode 100644 docs/superpowers/specs/2026-05-19-brain-dashboard-design.md diff --git a/cspell-words.txt b/cspell-words.txt index 1a9a8c56..97f3e4a9 100644 --- a/cspell-words.txt +++ b/cspell-words.txt @@ -1475,3 +1475,11 @@ DWC инжектим фикстурный роута + +# Brain dashboard design spec (2026-05-19) +визуализирующий +анимируются +неподсвеченными +полл +инференс +вендорено diff --git a/docs/superpowers/specs/2026-05-19-brain-dashboard-design.md b/docs/superpowers/specs/2026-05-19-brain-dashboard-design.md new file mode 100644 index 00000000..d25daecf --- /dev/null +++ b/docs/superpowers/specs/2026-05-19-brain-dashboard-design.md @@ -0,0 +1,195 @@ +# Дашборд мозга — дизайн + +**Дата:** 2026-05-19 +**Статус:** согласован в brainstorming-сессии, готов к writing-plans +**Источник:** brainstorming-сессия Claude + Дмитрий + +## 1. Контекст и проблема + +`docs/automation-graph.html` («карта мозга») — статический снимок: 124 узла, 130 рёбер, 11 размеченных конфликтов, плюс ручная теплокарта `NODE_META` за фиксированное окно. Карта показывает *топологию на момент*, но не показывает *работу*: как решались задачи, какие узлы задействованы, где возникли ошибки и ретраи, куда перенаправлялось, где сталкивались узлы. + +Журнал исполнения уже существует — `docs/observer/episodes-YYYY-MM.jsonl`: наблюдатель (ADR-011) пишет одну запись на каждый ход (Stop-событие). В записи — выбранный узел, инструменты, ошибки, ретраи, перенаправления, hard-floor, классификация задачи, окружение. **Данные есть — нет визуализации.** Карта и журнал между собой не связаны. + +## 2. Цель и не-цели + +**Цель:** standalone-дашборд, визуализирующий журнал эпизодов поверх топологии карты — три способа смотреть на работу мозга плюс сама карта. + +**В scope:** + +- Чтение `episodes-*.jsonl` (схема v1 и v2). +- Четыре view: Карта, Разбор задачи, Лента сессии, Агрегат. +- Граф как общий холст для траекторий и тепла. +- Три слоя «конфликтов» (см. §6). + +**Не-цели (YAGNI):** + +- Не меняем формат эпизодов и логику наблюдателя (исключение — отдельная задача, §13). +- Не правим `/brain-retro` и контролёры. +- Не пиксель-полировка — Forest накладывается на этапе реализации (frontend-design). +- Нет истории до запуска наблюдателя — её физически нет. +- Не Vue/Vuetify-приложение — это dev-инструмент, zero-build (см. §3). + +## 3. Зафиксированные решения + +**Тех-модель: standalone HTML + локальный статик-сервер.** Один HTML-файл без сборки; читает свежий JSONL через статик-сервер (`fetch` с `file://` браузер блокирует). Сервер — ~20 строк на `node:http`, запуск npm-командой, гасится по Ctrl-C. Ноль новых npm-зависимостей, ноль постоянных демонов. Отвергнуты: «запекаемый файл» (генератор вшивает данные — лента не живая) и «Vue/Vuetify-приложение» (сборка + стек портала в dev-инструменте; vis.js всё равно не Vue). + +**Раскладка: граф баннером сверху.** Постоянная полоса графа сверху, рабочая зона view снизу; переключатель view меняет нижнюю зону. Граф всегда виден; широкие таблицы и ленты снизу. + +## 4. Архитектура + +### 4.1. Слой данных + +Источник — `docs/observer/episodes-YYYY-MM.jsonl`, append-only, одна строка = один эпизод. + +Сервер `tools/brain-dashboard-server.mjs`: + +- статика из корня репо (HTML, JS, JSONL, `automation-graph.html`, vis.js); +- эндпоинт `GET /api/episodes` → JSON-список имён файлов `docs/observer/episodes-*.jsonl` (дашборд не угадывает имена); +- больше ничего; только localhost. + +Парсер (JS, внутри дашборда): + +- читает каждую строку JSONL → объект эпизода; +- нормализует **v1** (строки без `schema_version` — нет `decision_provenance` / `environment` / `task_size` / `prompt_signal`, `outcome` уже проставлен) и **v2** (`schema_version: 2`); +- битые строки и строки-маркеры `observer_error` — пропускаются, ведётся счётчик «N пропущено»; +- результат — нормализованный массив эпизодов единой формы (отсутствующие v1-поля → `null`). + +Производные данные (тепло, кластеры, агрегаты) считаются в браузере при загрузке. Ноль вшитых данных → всегда свежо. + +### 4.2. Карта = общий холст + +Сейчас топология зашита константами внутри `automation-graph.html` (один файл ≈2900 строк): `NODES` (стр. 229), `EDGES` (стр. 418), секции, `CONFLICT`-данные (стр. ≈406–614), `NODE_META` (стр. 1898), `NODE_SECTION` (стр. 2155). + +**Рефактор-вынос:** константы топологии (`NODES`, `EDGES`, `SECTIONS`, `CONFLICT`-данные, `NODE_SECTION`) выносятся в `docs/automation-graph-data.js`. Старая карта `