первая встреча непокрытой секции стала наблюдаемым событием
- свёртка спрашивает журнал, встречалось ли имя строго раньше по паре (received_at, id), и пишет WARN с атрибутом uncovered_new; повторные молчат. Признак выводится, а не хранится — реестр был бы второй копией факта - добавлена подкоманда `healthlog uncovered`: перечень накопленного, чтение только на чтение, экранированные имена и названные границы носителя - синк документации: ADR о выводе новизны из журнала, две записи в журнал дефектов, два правила промоутом в конвенции, терминал оператора назван адресатом недоверенного входа
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
## Why
|
||||
|
||||
Разбор уже перечисляет секции тела, которых он не покрывает, и пишет их в
|
||||
`delivery.uncovered_sections`. Момент, ради которого колонка заводилась —
|
||||
«поток принёс секцию, которой раньше не было», — **фиксируется, но ничем не
|
||||
наблюдается**: узнать о нём можно только запросом в базу руками, а догадаться
|
||||
заглянуть в колонку некому.
|
||||
|
||||
Пользователь дописывает на телефоне оставшиеся метрики (`symptoms`, `ecg`,
|
||||
`heartRateNotifications`, `cycleTracking`, `medications`, вес), и данные
|
||||
появятся сами. Пропущенный момент стоит дорого не сразу: тело живёт в архиве до
|
||||
следующего проверенного экспорта, и разбор новой секции, написанный через
|
||||
квартал, писать будет уже не по чему.
|
||||
|
||||
## What Changes
|
||||
|
||||
- Первая по журналу встреча имени непокрытой секции даёт запись уровня `WARN` в
|
||||
логирующем чекпоинте свёртки, с именами отдельным атрибутом; повторные встречи
|
||||
того же имени события не дают.
|
||||
- Тот же признак переживает **отказ** свёртки: доставка, у которой не вывелся
|
||||
слой, всё равно записывает список непокрытых секций, поэтому промолчать о
|
||||
новом имени здесь значило бы потерять событие навсегда — следующая доставка
|
||||
сочтёт имя уже виденным. Отложенный по обстоятельствам исход события не даёт:
|
||||
учётной записи он не меняет, доставка вернётся следующим проходом.
|
||||
- Новизна **выводится из журнала**, а не хранится: строгое сравнение пары
|
||||
`(received_at, id)` с прежними доставками, запросом вне транзакции записи.
|
||||
Схема не трогается, отдельного реестра не заводится, состояние остаётся
|
||||
свёрткой по журналу — пересборка полного архива повторяет те же события.
|
||||
- Появляется подкоманда `healthlog uncovered`: перечень непокрытых секций,
|
||||
накопленных журналом, — имя, число доставок, первая и последняя встреча.
|
||||
Без ручного SQL по рабочей базе, чтением только на чтение, с объявленным
|
||||
пределом вывода и экранированием имён.
|
||||
- Границы носителя названы спекой, а не замолчаны: обрезка списка на 32 имени,
|
||||
обнуление производных полей пересборкой и уход имени из колонки после того,
|
||||
как секцию покрыли.
|
||||
|
||||
Разбор самих новых секций сюда **не входит**: их формы никто не видел, и вслепую
|
||||
разбор не пишется. Каждая приехавшая секция станет отдельной задачей — тогда,
|
||||
когда её будет на чём проверить.
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `uncovered-sections`: наблюдение за секциями, которых разбор не покрывает —
|
||||
событие первой по журналу встречи имени и перечень накопленного.
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
- `storage`: перечень оснований, повышающих уровень записи чекпоинта свёртки,
|
||||
дополнен первой встречей имени непокрытой секции. Перечень нормирован там и
|
||||
читается как исчерпывающий — без правки следующий автор снял бы новую ветвь как
|
||||
незаказанную.
|
||||
|
||||
Capability `parsing` не меняется: разбор непокрытых секций остаётся как есть,
|
||||
новое поведение читает его результат.
|
||||
|
||||
## Impact
|
||||
|
||||
- `internal/store` — запрос «какие из этих имён встречались строго раньше в
|
||||
журнале» и запрос перечня для команды; обе — чтение по существующей колонке
|
||||
через `json_each`, вне транзакции записи.
|
||||
- `internal/fold` — признак новизны в `Stats`, ветвь эскалации в едином
|
||||
логирующем чекпоинте и в пути отказа.
|
||||
- `cmd/healthlog` — подкоманда `uncovered`.
|
||||
- `docs/architecture.md`, `docs/research/apple-health.md` — раздел про
|
||||
неразобранные секции и сверка перечня не виденных живьём секций с множеством
|
||||
покрытых имён разбора.
|
||||
Reference in New Issue
Block a user