audit-trail: WHEN сценария «Системное событие» — «системный процесс (без пользователя) вызывает сервис аудита»; NOTE: обмен через recognition_job в Срезе 0 аудит не пишет (R-7, design #20). design.md: R-25, R-26 и решения fix-волны финального ревью (№100–105). openspec validate --strict проходит. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2.5 KiB
Spec Delta: audit-trail
Purpose
Все действия из enum audit_action пишутся в audit_event одним способом — через сервис аудита; журнал только
дополняется, записи неизменяемы (ТЗ 8.2).
ADDED Requirements
Requirement: Единая точка записи
Сервис аудита SHALL предоставлять метод записи события с полями action (из enum audit_action), section
(из audit_section), object_type, object_id, user_id (NULL для системных действий), consolidation_version_id,
description, before_value, after_value (jsonb), comment, result, changed_field, ip_address, user_agent;
occurred_at SHALL проставляться сервером (UTC). Запись SHALL выполняться в той же транзакции, что и изменение данных.
NOTE: В Срезе 0 обмен через recognition_job аудит не пишет (рулинг R-7, design #20); сервис готов к использованию Срезом 2+.
Scenario: Системное событие
- WHEN системный процесс (без пользователя) вызывает сервис аудита
- THEN в
audit_eventпоявляется строка сuser_id = NULL,before_value/after_valueсодержат старый и новый статус
Scenario: Откат транзакции
- WHEN изменение данных и запись аудита выполняются в одной транзакции, и она откатывается
- THEN строка
audit_eventне сохраняется
Requirement: Журнал только дополняется
ORM-модель audit_event MUST NOT использоваться для UPDATE или DELETE в коде ядра; тест SHALL проверять, что в
src/ нет обращений, изменяющих или удаляющих audit_event, а сервис аудита не имеет методов изменения.
Scenario: Попытка изменить запись
- WHEN код вызывает обновление строки
audit_eventчерез сервис аудита - THEN такого метода нет (ошибка на этапе типизации/теста), запись остаётся прежней