первая встреча непокрытой секции стала наблюдаемым событием
- свёртка спрашивает журнал, встречалось ли имя строго раньше по паре (received_at, id), и пишет WARN с атрибутом uncovered_new; повторные молчат. Признак выводится, а не хранится — реестр был бы второй копией факта - добавлена подкоманда `healthlog uncovered`: перечень накопленного, чтение только на чтение, экранированные имена и названные границы носителя - синк документации: ADR о выводе новизны из журнала, две записи в журнал дефектов, два правила промоутом в конвенции, терминал оператора назван адресатом недоверенного входа
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
# Новизна имени секции выводится из журнала, а не хранится реестром
|
||||
|
||||
- **Дата:** 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` — решение этого изменения, а не запрет навсегда.
|
||||
Reference in New Issue
Block a user