
Защищённые от несанкционированного вмешательства журналы аудита для ИИ-агентов: связанные хэш-цепочкой записи Runtime Records, без зависимостей, проверяемые кем угодно.
Аудит-трейлы для AI-агентов с защитой от подмены — Runtime Records, связанные хеш-цепочкой и отображаемые в виде Runtime Report, который ваши клиенты могут проверить сами.
Каждое действие, фиксируемое вашей инструментацией (вызовы инструментов, вызовы моделей, доступ к данным, подтверждения), становится одной Runtime Record в журнале, доступном только для добавления и связанном хеш-цепочкой; Runtime Report — это та же цепочка, отрендеренная в виде HTML-страницы, которая пересчитывает хеш-цепочку в браузере читателя и отображает то, что показывает, на основе проверенных ею записей (для проверки, не полагающейся на код самой страницы, запустите halo verify на JSONL). Любая сторона, владеющая контрольной точкой цепочки, может убедиться, что записи вплоть до этой контрольной точки не были изменены с момента её создания, не доверяя тому, кто их создал — эта контрольная точка является несущим элементом: одна лишь цепочка обеспечивает защиту от подмены для всех, кроме стороны, управляющей регистратором (LIMITS.md §1). Когда служба безопасности клиента спрашивает: «что ваш агент делал с нашими данными?», вы отправляете им ссылку вместо абзаца текста. Проверки безопасности уже включают вопросы об AI рядом с чек-листом SOC 2 — и всё чаще эти вопросы исходят из ISO 42001, статей EU AI Act о ведении записей и собственных опросников клиентов. Сегодня письменное заверение всё ещё проходит. Ставка этого проекта в том, что так будет недолго.
Упоминается в Help Net Security (август 2026).
Формат записей открыт и свободен для реализации. Этот пакет — эталонная реализация: регистратор, верификатор, клиент-свидетель и сервер отчётов.
Используете halo-record или думаете об этом? Расскажите, кто вы и для чего → Кто использует halo-record?
Вас просят внедрить регистратор внутрь вашего агента. Не стоит принимать это на веру:
pip install halo-record устанавливает ровно один пакет.halo serve --verify-email (отправляет одноразовый код и имя субъекта отчёта по SMTP через сервер, настроенный в $HALO_SMTP_HOST, на адрес, введённый просматривающим отчёт). Все они отключены, пока вы их не вызовете; никакое другое содержимое записей не покидает вашу инфраструктуру.summaries=False) не сохраняет сводку вовсе. Редактирование выполняется по мере возможностей (регулярные выражения по распространённым форматам секретов и PII плюс энтропийный перехватчик): относитесь к этому как к дополнительному уровню защиты, а не как к гарантии. Поля результата, которые вы передаёте помимо summary, сканируются и маскируются теми же шаблонами, но не обрезаются до 200 символов (LIMITS §13).Что доказывает каждый уровень — несущее различие в этом проекте (LIMITS.md §1): цепочка, которую вы храните сами, доказывает, что записи не были отредактированы, относительно головы, которая уже есть у кого-то; только контрольные точки, хранящиеся вне оператора, доказывают, что ни одна не была удалена; и никакой хеш не доказывает, что каждое действие было зафиксировано.
| Утверждение | Собственная цепочка | + Внешние контрольные точки | + Доверенная фиксация |
|---|---|---|---|
| Обнаружение правок в установленном артефакте | ✔ | ✔ | ✔ |
| Обнаружение перезаписи зафиксированной истории | — | ✔ | ✔ |
| Обнаружение отсутствующих/запоздалых контрольных точек | — | ✔ (согласованная периодичность) | ✔ |
| Доказательство, что каждое действие было записано | — | — | зависит от границы фиксации |
Посмотрите до установки: пример Runtime Report — вымышленные данные, настоящая цепочка, и его скрипт пересчитывает хеш-цепочку встроенных записей в вашем браузере при открытии.
Агент не нужен. С uv устанавливать ничего не требуется:
uvx --from halo-record halo demo --serve
или классическим способом:
pip install halo-record
halo demo --serve
Либо создаёт вымышленного поставщика support-агента с двумя клиентами, фиксирует цепочки (с локальным файлом-свидетелем, заменяющим одного внешнего по отношению к оператору — см. LIMITS.md §1), выдаёт их защищённые Runtime Reports и открывает консоль оператора в вашем браузере. Затем попробуйте тест на подмену: удалите строку из одного из файлов .jsonl и перезагрузите. Отчёт это обнаружит.
Одна строка на границе:
from halo_record import trace
agent = trace(run_my_agent, profile="my-agent", log="audit.jsonl") # wraps your entrypoint; records the run boundary to ./audit.jsonl — add record_call() or a framework adapter at each tool boundary to capture individual calls
Удобный shim from halo import ... также поставляется — но имя halo на PyPI принадлежит не связанному с ним пакету терминального спиннера, и если этот пакет установлен, он выигрывает импорт. halo_record однозначен, поэтому в примерах используется он.
Без log= записи попадают в ~/.halo/my-agent.jsonl (одна цепочка на агента). Обёртка фиксирует границу запуска; доказательства содержатся в записях отдельных вызовов. Захватывайте их с помощью адаптера фреймворка (матрица ниже) — или явно, что также показывает, как связываются делегирования:
from halo_record import Recorder, record_call
rec = Recorder("audit.jsonl")
with record_call(rec, "crm.lookup", {"account": "acct-9"}) as call: # one sealed record per tool call
call.result = crm.lookup("acct-9")
with record_call(rec, "payments.refund", {"amount": 120},
parent_id=rec.last_record_id()) as call: # child links to the action that spawned it
call.result = payments.refund(120)
Затем сформируйте отчёт:
halo report audit.jsonl -o report.html # one chain -> HTML that re-verifies in the browser
halo serve ./records --port 8721 # all tenants, gated per customer