Профілі були даними без виконавця. Тепер ланцюг замкнено: черга в БД →
диспетчер у AgentService → зонд по SSH/Telnet → вивантаження стрімом →
звірка sha256 і дедуплікація.
Агент (internal/ncmx):
- усе побудовано навколо пошуку промпту: у консолі немає ані коду
завершення, ані довжини відповіді
- промпт шукається лише в хвості 512 байтів, інакше "banner motd #"
обривав би збір на середині конфігу
- дедлайн на паузу між байтами, а не на всю операцію: збір із шасі
триває хвилини, а тиша означає завислий пристрій або хибний regex
- ключі SSH обладнання не звіряються свідомо: залізо міняє їх з кожною
прошивкою, і known_hosts на сотні пристроїв означав би не збирати
конфіги зовсім
Сервер: черга ncm.jobs із FOR UPDATE SKIP LOCKED (два екземпляри не
надішлють одне завдання двічі), диспетчер, прибирання завислих.
Знайдено живим прогоном:
- сервер ігнорував поле encoding: агент стискав gzip і рахував sha256
від оригіналу, сервер рахував від стиснених байтів і відхиляв кожен
бекап. Поле в контракті з Етапу 2, реалізації не було — інтеграційний
тест користувався "none" і повз дірку проходив
- промпт обрізався не по рядку: шаблон [>#]\s*$ ловить лише символ, і
в конфізі лишалось ім'я пристрою окремим рядком
- у конфіг потрапляли escape-послідовності bash і подвоєні \r\r\n від
PTY: 295 байтів / 12 рядків замість 286 / 10. Після виправлення —
285 / 10, різниця лише у фінальному переводі рядка
Живий прогін проти стенду: success, конфіг 285 байтів, повторний збір —
unchanged без другої версії.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Модулі вкомпільовані (без .so): один бінарник на Alpine, Windows і роутер.
Креденшели беруться на момент виконання, бо мають TTL. Розклад вирівняний
по сітці інтервалу, тому переживає рестарт. Буфер обмежений і за кількістю,
і за пам'яттю; при переповненні викидає найстаріше, зміни статусу — останніми.
Перевірено на Debian 13 / Go 1.25: go vet чисто, go test -race усі пакети ok.
Релізний бінарник 12 МБ, базовий RSS 11.6 МБ при бюджеті 30 МБ.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>