- свёртка спрашивает журнал, встречалось ли имя строго раньше по паре (received_at, id), и пишет WARN с атрибутом uncovered_new; повторные молчат. Признак выводится, а не хранится — реестр был бы второй копией факта - добавлена подкоманда `healthlog uncovered`: перечень накопленного, чтение только на чтение, экранированные имена и названные границы носителя - синк документации: ADR о выводе новизны из журнала, две записи в журнал дефектов, два правила промоутом в конвенции, терминал оператора назван адресатом недоверенного входа
53 lines
4.0 KiB
Markdown
53 lines
4.0 KiB
Markdown
# Новизна имени секции выводится из журнала, а не хранится реестром
|
|
|
|
- **Дата:** 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` — решение этого изменения, а не запрет навсегда.
|