52 lines
4.2 KiB
XML
52 lines
4.2 KiB
XML
<!-- =================================================================== -->
|
||
<!-- ПРАВИЛО 8: Структурированное логирование для AI -->
|
||
<!-- =================================================================== -->
|
||
<Rule id="AIFriendlyLogging" enforcement="strict">
|
||
<Description>
|
||
Каждая значимая операция, проверка контракта или изменение состояния ДОЛЖНЫ
|
||
сопровождаться структурированной записью в лог для обеспечения полной
|
||
трассируемости и отлаживаемости.
|
||
</Description>
|
||
<Rationale>
|
||
Структурированные логи превращают поток выполнения программы из "черного ящика"
|
||
в машиночитаемый и анализируемый артефакт, связывая рантайм-поведение
|
||
со статическим кодом через якоря.
|
||
</Rationale>
|
||
<Definition type="multi_check">
|
||
<!--
|
||
Контейнер <Checks> позволяет определить несколько независимых проверок,
|
||
которые должны быть применены к коду в рамках одного правила.
|
||
-->
|
||
<Checks>
|
||
<!--
|
||
ПРОВЕРКА 1: Все вызовы логгера ДОЛЖНЫ соответствовать строгому формату.
|
||
Это позитивная проверка: каждая строка, содержащая 'logger.*()', должна совпадать с этим шаблоном.
|
||
-->
|
||
<Check type="positive_regex_on_match" trigger="logger\.(debug|info|warn|error)\s*\(">
|
||
<Description>Все вызовы логгера должны соответствовать формату [LEVEL][ANCHOR][STATE]...</Description>
|
||
<Pattern><![CDATA[logger\.(debug|info|warn|error)\s*\(\s*"\[(DEBUG|INFO|WARN|ERROR)\]\[[A-Z_]+\]\[[a-z_]+\][^"]*"\s*(,.*)?\)]]></Pattern>
|
||
<FailureMessage>Нарушен структурный формат лога. Ожидается: [LEVEL][ANCHOR][STATE] message.</FailureMessage>
|
||
</Check>
|
||
|
||
<!--
|
||
ПРОВЕРКА 2: В строках лога НЕ ДОЛЖНО быть строковой интерполяции.
|
||
Это негативная проверка: если найдена строка, содержащая 'logger.*("$...")', это ошибка.
|
||
-->
|
||
<Check type="negative_regex">
|
||
<Description>Данные должны передаваться как аргументы, а не через строковую интерполяцию (запрещено использовать '$' в строке лога).</Description>
|
||
<Pattern><![CDATA[logger\.(debug|info|warn|error)\s*\(\s*".*\$.*"]]></Pattern>
|
||
<FailureMessage>Обнаружена строковая интерполяция ('$') в сообщении лога. Передавайте данные как аргументы.</FailureMessage>
|
||
</Check>
|
||
|
||
<!--
|
||
ПРОВЕРКА 3: В слое Domain НЕ ДОЛЖНО быть вызовов логгера.
|
||
Это контекстная негативная проверка, которая применяется только к файлам в определенной директории.
|
||
-->
|
||
<Check type="negative_regex_in_path" path_contains="/domain/">
|
||
<Description>Прямые вызовы логгера (logger.*, Timber.*) запрещены в модуле :domain.</Description>
|
||
<Pattern><![CDATA[(logger|Timber)\.(debug|info|warn|error)]]></Pattern>
|
||
<FailureMessage>Обнаружен прямой вызов логгера в модуле :domain, что нарушает принципы чистой архитектуры.</FailureMessage>
|
||
</Check>
|
||
</Checks>
|
||
</Definition>
|
||
</Rule> |