Наблюдаемость AI-агентов: как понять, что сделал агент, и что для этого логировать
Наблюдаемость AI-агентов — это способность восстановить, что агент сделал, почему и чем это подтверждено. Она складывается из двух слоёв: рантайм (журнал действий, трейсы, вывод проверок) и процесс (договор о задаче, критерии приёмки, отчёт со ссылками на доказательства). Без обоих слоёв фраза агента «готово» ничего не значит.
Что такое наблюдаемость AI-агента
Наблюдаемость AI-агентов — это возможность по артефактам, а не по памяти и не по словам агента, ответить на три вопроса: что он сделал, почему именно так и чем подтверждено, что результат верен. Если после двадцати минут работы агент говорит «готово, но два теста падают, возможно, из-за тайминга», а на вопрос «какие пути затронуты» отвечает «дайте посмотреть код», — наблюдаемости нет. Агент не глупый: ему просто нечего предъявить.
Проблема системная. Один и тот же агент за неделю может десять раз честно сказать «готово», и каждый раз это будет значить что-то своё: где-то прогнаны все тесты, где-то только один, где-то ничего. Чем дольше живёт проект, тем дороже каждая следующая сессия, потому что она начинается с раскопок.
Два слоя: рантайм и процесс
Наблюдаемость путают с логами, но логи — только половина.
| Слой | Что отвечает | Артефакты |
|---|---|---|
| Рантайм | Что произошло | Журнал действий агента, трейсы, вывод тестов и сборки, коммиты |
| Процесс | Чего хотели и почему сделано так | Договор о задаче (скоуп, критерии приёмки), рубрика оценки, отчёт агента |
Только рантайм: видно, что упало, но непонятно, чего добивались. Только процесс: понятно, чего хотели, но не видно, почему не получилось. Нужны оба.
Почему агент не сделает это сам
Сказать агенту «логируй получше» не сработает по трём причинам.
- Он не знает, чего не знает. Агент не залогирует сигнал, о важности которого не догадывается.
- Формат плавает. В одной сессии он пишет подробно, в другой — одной строкой. Сравнивать сессии и считать агрегаты невозможно.
- Процесс логами не закрыть. Ответ на «почему так» живёт в документах, созданных до работы, а не в выводе команд.
Поэтому наблюдаемость закладывают в харнес — окружение агента: шаблоны, хуки, скрипты, обязательный формат отчёта.
Что логировать: минимальный набор
Хороший журнал — не стенограмма всего подряд, а набор фактов, по которым можно восстановить ход работы и посчитать статистику.
- Идентификаторы: id сессии, id задачи или фичи, модель агента.
- Действия с побочными эффектами: какие команды запущены, какие файлы изменены. Чтение файлов обычно можно не писать.
- Результаты проверок: какая команда проверки, код возврата, сколько тестов прошло и упало.
- Ретраи: сколько попыток ушло на шаг и чем они отличались.
- Расход: токены и время, если инструмент их отдаёт.
- Итог: задача принята, отклонена или брошена, и почему.
Чего не писать: секреты, токены доступа, персональные данные из вывода команд. Журнал может уйти в общий доступ или снова в контекст модели.
Журнал действий через хуки Claude Code
В Claude Code журнал удобно вести хуками — командами, которые запускает сам инструмент, а не модель, поэтому они срабатывают всегда. Хук получает на вход JSON с описанием события, в том числе id сессии, имя инструмента и его параметры. Пример настройки в .claude/settings.json, которая после каждого вызова Bash, Edit или Write дописывает строку в журнал:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Bash|Edit|Write",
"hooks": [
{ "type": "command", "command": ".claude/hooks/log-action.sh" }
]
}
]
}
}
#!/usr/bin/env bash
# .claude/hooks/log-action.sh — одна JSON-строка на действие
mkdir -p .agent/logs
jq -c '{ts: (now | todate), session: .session_id, tool: .tool_name,
cmd: .tool_input.command, file: .tool_input.file_path}' \
>> .agent/logs/actions.jsonl || true
Формат JSONL (одна JSON-запись на строку) удобен тем, что его легко фильтровать jq и грузить в любую систему анализа. Кроме того, Claude Code сам хранит полную историю сессий локально в каталоге ~/.claude/projects/ — её можно открыть, если нужно посмотреть рассуждения и вывод целиком, но для статистики свой компактный журнал удобнее.
Трассировка: трейс на сессию, span на задачу
Когда агентов много или они работают по расписанию, текстовых журналов мало: нужны агрегаты. Здесь пригодятся обычные инструменты распределённой трассировки и стандарт OpenTelemetry.
- Трейс — одна сессия агента.
- Span — одна задача внутри сессии.
- Вложенные span — шаги верификации: сборка, тесты, e2e.
Минимум атрибутов на span: id фичи и сессии, модель, результат проверки, токены, число ретраев. Такие данные читаются в Jaeger, Grafana Tempo, Honeycomb и отвечают на вопросы, которые не видно в одной сессии: какой тип задач чаще требует ретраев, где агент тратит больше всего токенов, после какого изменения харнеса упала доля принятых задач. У Claude Code есть встроенная выгрузка метрик и событий через OpenTelemetry — она включается переменными окружения, подробности в документации инструмента.
Коммиты как журнал
Самый дешёвый и надёжный журнал у вас уже есть — git. Его нужно лишь сделать читаемым.
- Один коммит — одна задача. Тогда
git logсовпадает со списком сделанного, а откат задачи — одинgit revert. - В сообщении — что и как проверено. Не «fix», а «что изменено, почему, какой командой проверено».
- Коммит только после зелёной проверки. Тогда каждая точка истории — рабочее состояние, и
git bisectнаходит виновника.
fix(payments): округление скидки до копеек
Скидка считалась во float, на сумме 999.99 терялась копейка.
Перевёл расчёт на int в копейках.
Проверено: make test (142 passed), make e2e checkout — ок.
Вне скоупа: округление в отчётах, записано в BACKLOG.md.
Отчёт агента: доказательства вместо впечатлений
Финальное сообщение агента — тоже артефакт наблюдаемости, если у него фиксированная форма. Пропишите шаблон в AGENTS.md или CLAUDE.md:
## Отчёт в конце задачи
- Что сделано: список изменений (файл — суть)
- Как проверено: точные команды и их результат
- Что НЕ проверено и почему
- Отклонения от договора о задаче
- Открытые вопросы к человеку
Главное правило: каждое утверждение ссылается на доказательство — файл и строку, вывод теста, запись в журнале. «Выглядит нормально» и «мне кажется, ок» отчётом не считаются. Пункт «что не проверено» особенно ценен: он честно показывает границы уверенности.
Договор до кода и рубрика после
Процессный слой начинается до работы. Короткий договор о задаче (sprint contract) фиксирует скоуп, критерии приёмки, раздел «вне скоупа» и открытые вопросы, которые решает человек. Раздел «вне скоупа» предотвращает половину споров о результате.
После работы результат оценивают по рубрике, а не по впечатлению. Иначе два опытных ревьюера дадут разные вердикты, и оценка станет лотереей.
| Измерение | Вопрос | Доказательство |
|---|---|---|
| Корректность | Выполнены критерии приёмки? | Вывод тестов, e2e |
| Архитектура | Соблюдены границы модулей? | файл:строка |
| Тесты | Новое поведение покрыто? | Список новых тестов |
| Ошибки | Обработаны сбои и краевые случаи? | Тест или файл:строка |
| Наблюдаемость | Понятно по логам, что происходит? | Фрагмент журнала |
Каждое измерение оценивается A/B/C/D, и оценка без ссылки недействительна. Простое правило решения: одна D или две C — отклонить со списком того, что исправить. Эту же рубрику может применять отдельный агент-проверяющий.
Как разобрать, что сделал агент за сессию
Если отчёта нет или ему нет доверия, пройдите по артефактам в таком порядке.
- Состояние дерева:
git status— что не закоммичено, нет ли мусорных файлов. - История:
git log --statс начала сессии — какие коммиты и файлы. - Масштаб изменений:
git diff --stat main...HEAD, затем полный diff по важным файлам. - Журнал действий: какие команды запускались и что вернули проверки.
- Повторная проверка: сами запустите сборку и тесты. Доверяйте выводу команды, а не пересказу.
# какие команды запускал агент в последней сессии
jq -r 'select(.tool=="Bash") | .cmd' .agent/logs/actions.jsonl | tail -n 30
# какие файлы правил чаще всего
jq -r '.file // empty' .agent/logs/actions.jsonl | sort | uniq -c | sort -rn | head
Типичные ошибки
- Логировать всё. Гигабайты стенограмм никто не читает. Пишите действия с побочными эффектами и результаты проверок.
- Свободный формат. Если формат журнала задаёт сам агент, агрегатов не будет. Формат задаёт харнес.
- Верить отчёту без вывода команд. «Тесты зелёные» без вывода — это мнение.
- Слепые ретраи. Без причины сбоя агент правит случайные места. Требуйте сначала диагноз со ссылкой на лог, потом правку.
- «Уберём потом». Отладочные файлы и незакоммиченные изменения сбивают с толку следующую сессию: она не отличит временное от намеренного.
Итог
Наблюдаемость AI-агентов строится из двух слоёв: рантайм (журнал действий через хуки, трейсы, коммиты с описанием проверок) и процесс (договор о задаче до кода, рубрика и отчёт со ссылками на доказательства). Тогда «готово» означает одно и то же в каждой сессии, а разбор работы агента занимает минуты. Эта тема разобрана на практике в курсе по harness engineering, на сквозном проекте платёжного бэкенда.
Частые вопросы
Чем наблюдаемость AI-агентов отличается от обычного мониторинга?
Мониторинг отвечает, работает ли система сейчас. Наблюдаемость агента должна ответить ещё и почему агент принял решение и чем подтверждён результат, поэтому к логам добавляются договор о задаче, рубрика и отчёт.
Где Claude Code хранит историю сессий?
Локально, в каталоге ~/.claude/projects/ в виде файлов JSONL по сессиям. Для статистики удобнее вести свой компактный журнал через хуки.
Можно ли доверять отчёту агента о проделанной работе?
Только если каждое утверждение подкреплено проверяемым доказательством: выводом команды, ссылкой файл:строка, записью журнала. Критичные проверки лучше перезапустить самому.
Нужен ли Jaeger или Grafana для одного разработчика?
Обычно нет: хватает журнала JSONL, дисциплины коммитов и шаблона отчёта. Системы трассировки окупаются, когда агентов несколько или они работают регулярно без присмотра.
Что делать, если агент не пишет отчёт по шаблону?
Держать шаблон коротким и в начале файла инструкций, а соблюдение проверять механикой: хуком на завершение или отдельным агентом-проверяющим, который возвращает работу без отчёта.
Эта тема подробно разобрана с практикой в курсе «Harness Engineering: инженерия надёжности AI-агентов».
Перейти к курсу