## 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** содержит имя отдельным атрибутом новых секций
