## Why Веб хаба собирался, когда модуль был один. После hub-modules (#87) и wiki-module (#91) у хаба два модуля со своими агентами, а оболочка по-прежнему говорит на языке Jira. Владелец 24.10.2026 заметил, что блок в боковой панели вводит в заблуждение: «агент на связи» — это только агент jira, у вики нет ни агента, ни кнопки, неясно, к чему относится «данные на …». Владелец попросил пересмотреть весь веб и организовать его под модули в новом имени sdlc-hub (#97). Аудит 24.10.2026 (код, спеки, живой хаб в двух темах и на 390 px) показал, что это не одна подпись: - в контракте веб-модуля нет понятия «состояние модуля» (агент, свежесть данных и её охват, обновление, пакет в работе): каждый модуль рисует свой блок по-своему, оболочка не может ни свести их, ни показать сводку; - блок jira грузит полный снимок доски на каждой странице ради одного времени `last_sync`; - ход пакетов отслеживает только jira; автообновления хаба и пакеты из MCP не видны, время данных отстаёт; - оболочка привязана к jira: `/` ведёт на доску, типы jira и `closed.ts` лежат в ядре, модуль wiki импортирует форматтер из модуля jira; - CSS модулей не разделён: правило разметки Jira в карточке (`div.wiki h1`) ломает заголовки страницы «Вики»; - пакет синхронизации вики нового проекта теряется: `POST /projects` отдаёт один `batch_id`; - страница «Задачи» прокручивается по горизонтали на 1440 px, просрочка в таблице показана только цветом. ## What Changes - **Состояние модуля — данные, а не компонент.** Модуль описывает: название для показа, агента, свежесть (время, охват «все проекты» / «проект», ошибка), действие обновления и правило «чей пакет». Ядро рисует блок одинаково в боковой панели, свёрнутой панели, на узком экране и на «Обзоре». - **Ядро отслеживает пакеты и агентов.** Один опрос `GET /agents` для всех модулей; один трекер пакетов (вынос `RefreshProvider` из модуля jira) — подхват незавершённого пакета модуля любого автора, тексты событий, 409, остановка опроса, перечитывание данных модуля по завершении. - **Навигация по модулям и «Обзор».** Боковая панель группирует разделы под заголовками модулей; новая страница ядра «Обзор» (`/app/?project=`) — главная: карточка каждого модуля (состояние + сводка от модуля) и последние пакеты проекта. - **Адреса модулей с префиксом модуля:** `/app/jira/board`, `/app/jira/issues`, `/app/jira/issues/{key}`, `/app/jira/feed`, `/app/wiki`; прежние адреса перенаправляют с сохранением параметров; `/` и `/links` хаба — на `/app/`. - **API для блока состояния:** `GET /projects` — время последнего полного обновления Jira; `GET /batches` — модуль пакета; `POST`/`PATCH /projects` — пакеты по модулям. - **Граница ядра и модулей в вебе:** типы jira, `closed.ts` и словари jira уходят в модуль jira; форматтеры дат — в ядро; классы CSS модуля не совпадают с классами другого модуля и ядра (тест-страж); `fact_status` удаляется из веба. - **Доработки по аудиту:** заголовок вкладки «<страница> · <проект> · SDLC Hub»; окно «Новый проект» с группами полей по модулям и подсказками под полем; узкий экран с меткой проекта и сводной точкой состояния, модальная выезжающая панель; «Задачи» без горизонтальной прокрутки страницы, просрочка текстом; «Вики» открывает корень и показывает понятную шапку; мелкие тексты («Команды хаба», подсказка выбора проекта). - **Закрываемые follow-ups:** #94 (веб: T4.1, T4.2, T4.4, T4.5, T10.1–T10.7), #90 (T7.5, T7.6), #73 (M-1…M-7), #68 (N-1, N-2, M-2, M-12, M-14, M-17, T5.3), #35 (M-9, O-16; T3.1/M-10 — отметить сделанным). Остаются открытыми: #68 M-18 (заголовки разделов 16 против 24 px) и #94 T9.1 (лишний `GET /projects`) — в коде не закрыты. ## Non-Goals - Переименование (#97) — делается раньше; этот change строится на `sdlc_hub`, «SDLC Hub», ключах `sdlc-hub-*`. - Страница «Агенты и очередь», настройки хаба в вебе. - Полное удаление «статуса по факту» из базы, API, MCP и агента (#60); здесь — только из типов веба. - Разметка Jira в ленте (С6 аудита), сворачивание фильтров доски на телефоне (С12), 409 `no_root` у `/wiki/status` (С10), доступность компонентов `ui/` (`Menu`, `Segmented`, `ThemeSwitch`), доработки окна карточки из #42, служебные метки `fact-*`/`kind-*` в карточке — в follow-up. - Изменения логики доски, списка задач, ленты и вики сверх перечисленного. ## Anti-Goals - Блок состояния, который снова надо читать как загадку: у каждой строки должно быть видно, к какому модулю она относится и что именно обновит кнопка (все проекты или текущий). - Ядро веба, знающее про jira или wiki по имени: всё, что оболочка показывает о модуле, приходит из описания модуля. - Две основные (primary) кнопки на одном экране.