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

4.0 KiB

Новизна имени секции выводится из журнала, а не хранится реестром

  • Дата: 2026-08-04
  • Источник: openspec/changes/archive/2026-08-04-aktivnaya-proverka-novyh-sekcij/design.md

Решение

Признак «имя непокрытой секции встречено впервые» не хранится: он считается запросом к журналу — «встречалось ли имя в доставках, стоящих строго раньше этой по паре (received_at, id)». Реестр-таблица по образцу category_value — очевидный ответ на тот же вопрос, уже применённый в этом проекте, — отвергнут.

Почему

Цитата из источника:

Форма ответа взята у category_value — «когда имя встретилось впервые по журналу», — а носитель другой: факт уже лежит в delivery.uncovered_sections. Реестр здесь не добавляет ни одного сведения, он кэш запроса, а запрос идёт считанные разы за жизнь имени.

И там же, о цене реестра:

Компромисс: вторая копия факта, обязанная сходиться с колонкой при каждой пересборке, плюс миграция и новая единица хранения витрины (а значит и отпечатка). Ноль новых сведений: имя выводимо из журнала.

Третья рассмотренная форма — множество виденных имён в памяти процесса — отвергнута по инварианту «хранилище есть свёртка по журналу»: состояние стало бы функцией жизни процесса, и живой приём разошёлся бы с пересборкой в том, что считает первой встречей.

Чем платим

Ценой названы три вещи, и все они следствия выбранного носителя:

  • проход по журналу на каждой доставке с непокрытыми секциями. Измерено на синтетическом журнале годового объёма: у секции, приезжающей давно, ранний выход даёт десятки микросекунд, у появившейся только что — около 52 мс на доставку, пока её не покроет отдельная задача;
  • границы носителя наследуются целиком: имя, вытесненное границей списка в 32 имени, события не даёт вовсе; пересборка заполняет колонку заново и только по сохранившимся телам; покрытая разбором секция уходит из перечня;
  • история не переживает удаления тел. Ретеншен, срезающий архив, унесёт с собой и записи о непокрытых секциях за те же периоды.

Когда пересматривать

Последнее и есть условие пересмотра, названное заранее: задаче ретеншена архива реестр понадобится — именно затем, чтобы история пережила удаление тел, и тогда это уже другая цена, а не вторая копия факта. Запрет реестра в спеке uncovered-sections — решение этого изменения, а не запрет навсегда.