Closes#19 · мержить последним из стопки:#45 → #46 → #47 → этот (ветка от feat/15-alerts)
Что сделано
README по «Требованиям к оформлению»:
цели и задачи;
что реализовано — таблица по разделам со ссылками на требования ТЗ;
развёртывание — локально за 5 минут (make demo-repo + make run), полный стек в Docker, сервер, переменные окружения, проверки;
входные и выходные данные — команды и кнопки, что пишется в репозиторий и БД, используемые API;
ограничения — безопасность, лимиты, что пока не сделано.
Плюс структура репозитория.
examples/ — демо-сервисы в том же Compose-проекте, что и бот (make demo-up / make demo-down):
hello — 🟢, проверки ✅, в логе материал для grep и агента;
crash — 💥, затем 🔁;
cpu_hog — 🔥;
unhealthy — 🩺.
Ещё syntax_error.py и lint_fail.py для демонстрации коммита и agent_prompts.md — обычные вопросы агенту и атаки с ожидаемой реакцией.
make local-proxy — read-only Docker API для make run.
Как проверено
Инструкция «Вариант А» на чистом клоне: make install, make demo-repo, .env → бот поднимается до Start polling; миграции применяются на пустой SQLite.
Демо-сервисы на локальном Docker с настоящим монитором алертов: 🩺 сразу, 💥 краш через ~15 с со счётчиком (обновляется не чаще раза в минуту), 🔥 через минуту, 🔁 после трёх рестартов. Этот смоук нашёл две проблемы в алертах, исправлены в #47 (79ea5ce).
Closes #19 · **мержить последним из стопки:** #45 → #46 → #47 → этот (ветка от `feat/15-alerts`)
## Что сделано
- **README** по «Требованиям к оформлению»:
1. цели и задачи;
2. что реализовано — таблица по разделам со ссылками на требования ТЗ;
3. развёртывание — локально за 5 минут (`make demo-repo` + `make run`), полный стек в Docker, сервер, переменные окружения, проверки;
4. входные и выходные данные — команды и кнопки, что пишется в репозиторий и БД, используемые API;
5. ограничения — безопасность, лимиты, что пока не сделано.
Плюс структура репозитория.
- **`examples/`** — демо-сервисы в том же Compose-проекте, что и бот (`make demo-up` / `make demo-down`):
- `hello` — 🟢, проверки ✅, в логе материал для grep и агента;
- `crash` — 💥, затем 🔁;
- `cpu_hog` — 🔥;
- `unhealthy` — 🩺.
Ещё `syntax_error.py` и `lint_fail.py` для демонстрации коммита и `agent_prompts.md` — обычные вопросы агенту и атаки с ожидаемой реакцией.
- `make local-proxy` — read-only Docker API для `make run`.
## Как проверено
- Инструкция «Вариант А» на чистом клоне: `make install`, `make demo-repo`, `.env` → бот поднимается до `Start polling`; миграции применяются на пустой SQLite.
- Демо-сервисы на локальном Docker с настоящим монитором алертов: 🩺 сразу, 💥 краш через ~15 с со счётчиком (обновляется не чаще раза в минуту), 🔥 через минуту, 🔁 после трёх рестартов. Этот смоук нашёл две проблемы в алертах, исправлены в #47 (`79ea5ce`).
- ruff (сломанные нарочно `syntax_error.py` / `lint_fail.py` исключены), 296 тестов.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
- app/logs/grep.py: подмножество grep (шаблон, -i -v -E -c -C N), разбор
shlex без исполнения, BRE → regex, таймаут на строку и бюджет на поиск,
лимиты 200 символов / 500 строк вывода
- app/logs/journal.py: каждый поиск в log_queries (L-6)
- бот: выбор контейнера, хвост 50/200 строк или 5 мин/1 ч/24 ч, свой grep
по 24 ч, длинный результат — файлом .log (L-5)
- логи Docker: не больше 50 000 строк и 5 МБ, сохраняются новейшие
- fix: кнопки меню и /menu, /help больше не проглатываются шагами ввода
(имя файла, содержимое, сообщение коммита, grep) — фильтр free_input
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- prefilter: правила из config/agent_rules.yaml (длина, команды, shell,
секреты и системные файлы, prompt injection) — без LLM
- guard: отдельный вызов, JSON {verdict, reason}; невалидный ответ = attack,
недоступный LLM — «попробуйте позже», а не атака
- planner: только AgentLogQuery (контейнер из белого списка, ≤ 7 д, шаблон
≤ 200 без вложенных квантификаторов, лимит ≤ 500); логи в LLM не идут
- бот: «🤖 Спросить агента» → показывает построенный grep и строки;
атака — вежливый отказ и 🛡 администраторам; квота 30 в сутки
- журнал agent_requests + log_queries (mode=agent)
- при LLM_PROVIDER=mock агент выключен
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- детекторы по состоянию после каждого раунда снапшотов: краш, OOM,
цикл рестартов, unhealthy, перегрузка ≥ 1 мин, мало места, Docker
недоступен; пороги в config/alerts.yaml
- AlertService: ключ kind+service, повтор в 10 мин — счётчик в исходном
сообщении, «✅ восстановлено» ответом; разовые события (🛡) со счётчиком
- рассылка всем активным (🛡 — только админам), темп ~25/с, RetryAfter,
заблокировавший бота пропускается; alert_deliveries для правок и ответов
- «🚨 Алерты»: активные + 7 дней по 10, карточка; кнопки «📜 Логи»,
«🩺 Статус» под алертом открывают новое сообщение, а не затирают алерт
- 🛡 атаки через агента идут через общий сервис алертов
- убраны заглушки «Раздел в разработке» — у всех разделов свои роутеры
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Найдено смоуком на живых контейнерах (examples/, #19):
- контейнер с restart: on-failure поднимается за секунду — между раундами
его не видно в exited; краш теперь распознаётся и по росту RestartCount
(сравнение со снапшотами до текущего раунда), повторы — счётчик
- алерт закрывается, только когда условия нет resolve_after (60 с): иначе
флапающий сервис получал бы «✅ восстановлено» после каждого раунда
- правки сообщений со счётчиком — не чаще раза в минуту на алерт
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- README: цели и задачи, что реализовано, развёртывание (локально за 5 минут
и полный стек), переменные, команды и данные, используемые API,
ограничения и лимиты, что не сделано, структура репозитория
- examples/: hello (healthy + материал для grep/агента), crash (💥 и 🔁),
cpu_hog (🔥), unhealthy (🩺), syntax_error/lint_fail для коммита,
вопросы агенту и атаки; make demo-up / demo-down в том же Compose-проекте
- make local-proxy: read-only Docker API для `make run`
- ARCHITECTURE: краш при restart-политике и гистерезис алертов
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #19 · мержить последним из стопки: #45 → #46 → #47 → этот (ветка от
feat/15-alerts)Что сделано
README по «Требованиям к оформлению»:
make demo-repo+make run), полный стек в Docker, сервер, переменные окружения, проверки;Плюс структура репозитория.
examples/— демо-сервисы в том же Compose-проекте, что и бот (make demo-up/make demo-down):hello— 🟢, проверки ✅, в логе материал для grep и агента;crash— 💥, затем 🔁;cpu_hog— 🔥;unhealthy— 🩺.Ещё
syntax_error.pyиlint_fail.pyдля демонстрации коммита иagent_prompts.md— обычные вопросы агенту и атаки с ожидаемой реакцией.make local-proxy— read-only Docker API дляmake run.Как проверено
make install,make demo-repo,.env→ бот поднимается доStart polling; миграции применяются на пустой SQLite.79ea5ce).syntax_error.py/lint_fail.pyисключены), 296 тестов.🤖 Generated with Claude Code
- prefilter: правила из config/agent_rules.yaml (длина, команды, shell, секреты и системные файлы, prompt injection) — без LLM - guard: отдельный вызов, JSON {verdict, reason}; невалидный ответ = attack, недоступный LLM — «попробуйте позже», а не атака - planner: только AgentLogQuery (контейнер из белого списка, ≤ 7 д, шаблон ≤ 200 без вложенных квантификаторов, лимит ≤ 500); логи в LLM не идут - бот: «🤖 Спросить агента» → показывает построенный grep и строки; атака — вежливый отказ и 🛡 администраторам; квота 30 в сутки - журнал agent_requests + log_queries (mode=agent) - при LLM_PROVIDER=mock агент выключен Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>