Аудиторский след
Аудиторский след (в интерфейсе — «Аудиторский след») — это неизменяемый журнал, в который X7 Insight записывает каждое значимое изменение: кто его сделал, когда (по UTC), что было до и после, и — там, где это требуется, — по какой причине. Ничего из журнала нельзя отредактировать или удалить; можно только дописывать новые записи. Это фундамент воспроизводимости данных исследования; журнал спроектирован под требования 21 CFR Part 11 и EU Annex 11.
Append-only и хеш-цепочка простыми словами
Заголовок раздела «Append-only и хеш-цепочка простыми словами»Две гарантии делают след доверенным:
- Append-only (только дозапись). Записи журнала нельзя ни изменить, ни удалить — ни пользователю, ни администратору, ни даже администратору базы данных. Исправление ошибки — это всегда новая запись поверх старой, а не подмена старой.
- Хеш-цепочка (криптографическое сцепление). Каждая запись несёт «отпечаток» (hash), в расчёт которого входит отпечаток предыдущей записи. Записи сцеплены в непрерывную цепь. Если кто-то попытается изменить, удалить или вставить запись в середину — отпечатки перестанут сходиться, и проверка это немедленно обнаружит.
Что происходит при записи значения
Заголовок раздела «Что происходит при записи значения»Сохранение одного значения — это не одна операция, а фиксированная цепочка реакций, которая целиком выполняется в одной транзакции: либо проходит вся, либо не меняется ничего. Запись в аудит — обязательное звено этой цепочки, а не отдельный «лог после».
-
Проверка прав (PBAC). Есть ли у вас право на запись в этом поле и его области (scope). Нет — отказ, значение не меняется.
-
Проверка блокировки. Не заблокированы ли поле или область. Под жёсткой блокировкой запись невозможна.
-
Гейты правил. Нельзя писать в вычисляемое (derived) поле и в поле, скрытое условием скип-логики.
-
Валидация значения. Тип, диапазон, принадлежность кодлисту — по определению поля.
-
Причина изменения (RfC). При правке уже сохранённого значения причина обязательна; при первичном вводе — нет.
-
Запись значения. Значение сохраняется с проверкой версии (optimistic) и сбросом зависимых осей: SDV, медобзор и кодирование возвращаются в исходное состояние, а заполненная форма переходит в «в работе».
-
Запись в аудит.
audit.append()— в той же транзакции. Изменённого значения без записи в аудите не бывает. -
Инвалидация подписей. Все подписи, покрывавшие это значение, автоматически становятся недействительными.
-
Движок правил. Деривации пересчитываются каскадом (актор — система), затем отрабатывают edit-проверки: block откатывает всю запись, query открывает авто-запрос.
-
Публикация событий. События уходят в транзакционный outbox; подписчики (модули) получают их фоновой службой — только после коммита транзакции.
Что попадает в аудиторский след
Заголовок раздела «Что попадает в аудиторский след»Аудитируются все изменения данных, метаданных, конфигурации, доступа и рабочих объектов, а также закрытый список привилегированных чтений. Обычные чтения не аудируются (иначе журнал утонул бы в шуме).
| Категория | Примеры действий |
|---|---|
| Клинические данные | ввод и правка значения, очистка, отметка «не выполнено», создание субъекта, смена его статуса, создание визита, завершение формы |
| Метаданные (дизайн) | создание и публикация версии дизайна, правка формы или edit check в черновике, утверждение перевода |
| Рабочие объекты | открытие/ответ/закрытие запроса, применение и инвалидация подписи, наложение и снятие блокировки |
| Доступ | выдача и отзыв грантов, создание и назначение ролей, переопределение SoD-конфликта |
| Конфигурация | изменение настройки, регистрация/включение/выключение модуля, согласие на модуль |
| Привилегированные чтения | расслеплённое чтение слепого значения, запуск экспорта, выгрузка самого аудита |
Что содержит одна запись
Заголовок раздела «Что содержит одна запись»Каждая запись журнала описывает одно действие набором полей (в интерфейсе — колонки и детали строки):
| Поле | Что показывает |
|---|---|
| Время (UTC) | момент действия по всемирному времени; локальное представление — только для удобства |
| Актор | кто сделал: пользователь, модуль или система |
| Действие | что произошло (например, «сохранение данных», «применение подписи») |
| Сущность | над каким объектом (значение, форма, субъект, грант…) |
| Scope | путь области действия: исследование → центр → субъект → форма → поле |
| До / После | канонические значения именно тех полей, которые изменились (не вся запись целиком) |
| Причина | текст Reason for Change, где он обязателен |
| Модуль | если действие выполнил модуль — какой |
| Вызвано событием | если действие — это автоматическая реакция (например, сброс подписи), ссылка на исходное событие |
Причина изменения (Reason for Change)
Заголовок раздела «Причина изменения (Reason for Change)»X7 Insight различает первый ввод и правку уже сохранённого значения:
- Первичный ввод (поле было пустым) причины не требует — это соответствует принципу ALCOA «одновременности» записи.
- Любое изменение сохранённого значения, включая его очистку, требует указать причину. Без причины система не сохранит правку. Интерфейс покажет диалог с полем свободного текста и настраиваемым для исследования списком типовых причин.
Причина обязательна также для: снятия блокировки, снятия отметки SDV, отмены и переоткрытия запроса, отклонения ответа на запрос, переопределения SoD-конфликта и экстренного расслепления. Как это выглядит при вводе данных — см. Ввод данных.
Аудиторский след: как читать
Заголовок раздела «Аудиторский след: как читать»Один и тот же просмотрщик открывается на разных уровнях; уровень задаёт, какие записи вы
видите (и требует соответствующего права audit.read в этой области):
- Весь арендатор — раздел Администрирование → Аудит: неизменяемый журнал всей организации.
- Исследование — вкладка Аудит внутри исследования: только его записи.
- Субъект и форма — тот же просмотрщик, открытый со страницы субъекта или формы: сужен до истории конкретного участника или конкретной формы.
Фильтры над таблицей: период «С (UTC)» — «По (UTC)», Актор, Действие, Тип сущности. Колонки: Время (UTC), Актор, Действие, Сущность, Scope. Клик по строке раскрывает детали «До / После», «Причина», «Модуль» и «Вызвано событием».
Проверка целостности цепочки
Заголовок раздела «Проверка целостности цепочки»Кнопка «Проверить целостность журнала» запускает пересчёт всей цепочки от начала. Право на
запуск — audit.verify. Результат:
- Цепочка целостна — «проверено записей: N». Ни одна запись не была изменена, удалена или вставлена в середину.
- Цепочка нарушена — указывается номер (seq) первой сломанной записи. Проверка ловит правку содержимого, удаление записи, вставку в середину (разрыв нумерации) и подмену причины.
Дополнительный пояс защиты — якорение: X7 Insight периодически фиксирует «голову» цепочки (её текущий отпечаток) во внешнем write-once хранилище. Это позволяет доказать целостность, даже если предположить, что кто-то с доступом к базе пересчитал всю цепочку целиком. Вся история якорей входит в каждый инспекционный пакет и пакет закрытия.