## MODIFIED Requirements ### Requirement: Значения точек не попадают в логи Данные о здоровье чувствительнее токенов. Система MUST NOT писать значения точек, содержимое сущностей и тела доставок в записи лога уровня выше `DEBUG`. Содержимое сущности здесь не менее чувствительно, чем значение точки, а местами более: маршрут тренировки — это геотрек до дома, а `labels` и `associations` записи состояния разума — эмоциональные метки. Разрешены **координаты**: идентификатор и род сущности, метка времени, идентификатор доставки — они описывают, что случилось, а не что измерено. Непокрытые секции называются в логе **именами ключей**: имя секции — это форма пакета, а не измерение. Содержимое секции в лог не попадает ни при каком уровне выше `DEBUG`. Имена идут структурным атрибутом, а не склейкой в текст сообщения: кодировщик экранирует управляющие символы, и имя из чужого тела не разрывает построчный разбор логов. То же относится к идентификатору сущности: он приходит из чужого тела и ограничен по длине при разборе. Частичный разбор уровня записи не повышает: `partial` — установившееся состояние половины потока (53 доставки из 118), и постоянный `WARN` обесценил бы уровень. Повышает уровень другое, и оснований два: - срабатывание границ списка: тело с сотнями секций или с именем длиннее предела на HAE не похоже вовсе; - **первая по журналу встреча имени непокрытой секции** — событие однократное за всю жизнь имени, и правила его живут в capability наблюдения за непокрытыми секциями. Здесь оно названо, чтобы перечень оснований оставался полным: иначе следующий читатель снимет ветвь как незаказанную. #### Scenario: Разбор доставки логируется без значений - **WHEN** доставка разобрана - **THEN** запись лога содержит счётчики (метрик, точек, объектов, сущностей) и идентификатор доставки - **AND** не содержит ни значений точек, ни имён устройств #### Scenario: Удержанная обеднённая версия логируется координатами - **WHEN** приехавшая версия сущности отклонена как теряющая содержание - **THEN** запись `WARN` содержит идентификатор и род сущности - **AND** не содержит ни точек маршрута, ни того, какие поля потерялись #### Scenario: Непокрытые секции названы именами ключей - **WHEN** доставка содержит непокрытую секцию - **THEN** запись лога содержит имена непокрытых ключей отдельным атрибутом - **AND** не содержит ничего из содержимого этих секций - **AND** уровень записи из-за одной лишь частичности не повышается #### Scenario: Границы списка сработали - **WHEN** список непокрытых ключей усечён по числу имён или по длине имени - **THEN** запись лога имеет уровень `WARN` - **AND** содержит число отброшенных имён #### Scenario: Имя непокрытой секции встречено впервые - **WHEN** доставка принесла имя непокрытой секции, которого не было ни в одной доставке раньше неё в журнале - **THEN** запись лога имеет уровень `WARN` - **AND** содержит имя отдельным атрибутом новых секций