Повний перелік недоробленого — з причинами й перевіркою по коду
Some checks are pending
CI / web (push) Waiting to run
CI / server (push) Waiting to run
CI / agent (push) Waiting to run

Раніше незроблене було розсипане: частина в таблиці «чесний зріз»,
частина в «дрібному боргу», частина лише в текстах етапів, а частина
ніде — як приймач трапів чи кнопки Telegram, що нікуди не ведуть.

Тепер один розділ, складений перевіркою коду: для кожного пункту
звірено, чи є під нього щось у server/internal, agent/internal і
web/src. Імена таблиць і міграцій теж звірені — sla_targets замість
вигаданого sla_reports, 0009_billing_licensing замість 0009_billing.

Розбито за тим, наскільки відсутність помітна: схема без коду,
оголошене без реалізації, зроблене наполовину, відсутні перевірки й
те, що впирається в зовнішні умови.

«Дрібний борг» прибрано — новий перелік поглинає його цілком.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
byrsapty 2026-08-25 18:42:35 +03:00
parent 32b0b003df
commit e371327174

View file

@ -16,7 +16,8 @@ API віддає готове полотно з живими статусами,
## Чого немає: чесний зріз
Схема БД з Етапу 1 покриває майже все з технічного завдання, але **схема ≠
реалізація**. Нижче — розрив між ними.
реалізація**. Нижче — розрив між ними великими мазками; поіменний перелік
із причинами — у розділі «Чого немає: повний перелік» наприкінці.
| Підсистема | Схема | Реалізація |
|------------|-------|------------|
@ -320,16 +321,89 @@ Diff* — усе з ТЗ.
5. **Етап 7 (NCM)** — головний аргумент Enterprise-тарифу.
6. **Етап 10 (мобільний)** — після того, як є що показувати.
Далі за ТЗ лишаються дашборди з NOC TV-режимом, білінг зі Stripe і ліцензійні
ключі — усі три мають готову схему й жодного коду.
Дашборди з NOC TV-режимом зроблено 2026-08-25. Що лишається — нижче,
окремим переліком із причинами.
## Дрібний борг
## Чого немає: повний перелік
- Перетягування вузла через UI не покрите автотестом: синтетичні події не
запускають d3-drag у React Flow. Шлях перевірений тестами сервера.
- Підкладки-плани приміщень віддаються API, але полотно їх не малює — потрібен
прийом і роздача файлів (S3/MinIO або локальний диск).
- `modbus` і `netflow` оголошені в сіді плагінів і не написані. Обидва позначені
`is_core = false`, тож у переліку перевірок система показує їх недоступними —
обіцянки немає. Писати Modbus без жодного інвертора під рукою означало б
віддати неперевірений промисловий протокол.
Стан на 2026-08-25, після розгортання на бойовому сервері. Перелік
складений перевіркою коду, а не з пам'яті: для кожного пункту звірено,
чи є під нього щось у `server/internal`, `agent/internal` і `web/src`.
Порядок — за тим, наскільки відсутність помітна тому, хто користується
системою.
### Схема є, коду немає зовсім
Ці таблиці створені міграціями й порожні. Небезпека тут не в самій
відсутності, а в тому, що схема виглядає як обіцянка.
| Що | Де схема | Чого бракує |
|---|---|---|
| **Білінг і ліцензії** | `0009_billing_licensing.sql` | усього: тарифи, ліміти, Stripe, ключі. Для Micro-SaaS це те, через що продають |
| **Відкат конфігу** | `ncm.rollbacks` | API, UI і — головне — запис на пристрій. Двоетапне погодження в схемі є, виконавця немає |
| **Ескалації сповіщень** | `alr.escalation_policies` | «не підтвердили за 15 хв — буди наступного» |
| **Web Push** | `alr.push_subscriptions` | підписки й доставка. Потрібне для PWA |
| **Звіти SLA** | `core.sla_targets`, `core.sla_periods` | розрахунок доступності за період і вивантаження |
| **Збережені подання** | `core.saved_views` | фільтри інвентарю, які можна назвати й повернутись |
| **Прокрутка дашбордів на TV** | `dashboards.tv_options.rotate_sec` | сам режим NOC TV працює, але сторінки не гортаються по колу |
### Оголошено в переліку можливостей, не написано
| Що | Стан | Чому не зроблено |
|---|---|---|
| **`snmp.walk`** | тип чека є в `core.check_types`, модуля немає | таблиці з динамічним індексом: потрібне виявлення рядків і породження метрик на кожен. Найбільша з відсутніх можливостей опитування |
| **Modbus-TCP** | плагін у сіді, `is_core = false` | немає жодного інвертора чи UPS під рукою. Неперевірений промисловий протокол у мережі з живим обладнанням — гірше, ніж його відсутність |
| **NetFlow / sFlow** | плагін у сіді, `is_core = false` | окремий приймач потоків, за обсягом — власний етап |
| **Приймач SNMP-трапів** | `ts.snmp_traps` і `WriteLogs` готові | на зонді немає слухача 162/udp. Syslog зроблено, трапи — ні |
Обидва плагіни позначені `is_core = false`, тож у переліку перевірок
система показує їх недоступними — обіцянки користувачу немає.
### Зроблено наполовину
**Сповіщення за подіями не спрацьовують.** Движок правил рахує тільки
джерела `metric`, `icmp` і `interface`. Для `syslog`, `trap`, `ncm` і
`compliance` він свідомо повертає порожньо — їх треба обробляти подією в
момент надходження, а не опитуванням. Тобто правило з такими джерелами
можна створити, і воно ніколи не спрацює. Дані при цьому збираються:
журнал пишеться, знахідки відповідності рахуються — не вистачає ланки
між ними й алертом.
**Кнопки в Telegram нікуди не ведуть.** Сповіщення йде з кнопками
«Підтвердити» й «Заглушити 1 год» (`callback_data` у `notify.go`), але
приймача натискань немає: сервер не має вебхука Telegram. Кнопки видно,
натиснути можна, нічого не станеться.
**Підкладки-плани приміщень.** `topo.map_backgrounds` віддається в
`GET /maps/{id}`, полотно їх не малює. Потрібен прийом і роздача файлів
— іконки мап уже зберігаються в базі, тож можна тим самим шляхом, без
S3. Приблизно пів дня.
**Мобільний режим мапи.** Адаптив сторінок є, але на полотні
перетягування вузла пальцем не розведене з панорамуванням: потрібен
явний режим редагування, інакше кожна спроба посунути карту рухатиме
вузол.
**Прототипи шаблонів.** Шаблон описує сталий перелік метрик. Для
інтерфейсів і дисків потрібні прототипи: «на кожен знайдений рядок
таблиці — свій набір метрик». Без цього кожен порт заводиться руками.
### Перевірки, яких немає
**У вебі немає тестового прогону взагалі** — ні vitest, ні jest.
Перевіряється типами й живим браузером. Найпомітніший наслідок:
перетягування вузла на мапі не покрите, бо d3-drag не запускається
синтетичними подіями; серверний бік цієї дії тестами покритий.
**CI жодного разу не запускався.** `.forgejo/workflows/ci.yml` написано,
але раннера немає. Прогони робились руками; те, що CI мав би ловити
(`gofmt`, `go vet`, тести з базою, крос-збірка зонда), проганялось
окремо перед кожним комітом.
### Чого не буде без зовнішніх умов
- **Справжній TLS** на бойовому сервері — потрібен домен. Зараз
самопідписаний: Let's Encrypt не видає сертифікатів на IP-адреси.
- **Telegram Mini App** — окрема робота, і почати варто з приймача
кнопок бота: він дає 90% користі за 10% зусиль.