Files
av bd5d17b079 первая встреча непокрытой секции стала наблюдаемым событием
- свёртка спрашивает журнал, встречалось ли имя строго раньше по паре
  (received_at, id), и пишет WARN с атрибутом uncovered_new; повторные молчат.
  Признак выводится, а не хранится — реестр был бы второй копией факта
- добавлена подкоманда `healthlog uncovered`: перечень накопленного, чтение
  только на чтение, экранированные имена и названные границы носителя
- синк документации: ADR о выводе новизны из журнала, две записи в журнал
  дефектов, два правила промоутом в конвенции, терминал оператора назван
  адресатом недоверенного входа
2026-08-04 13:39:48 +03:00

4.9 KiB

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