свёртка доставки в объекты и сшивка с приёмом

- internal/fold — свёртка по идентификатору доставки, тело из архива: тот же
  код, каким пойдёт пересборка витрины
- приём зовёт свёртку на context.WithoutCancel с собственным дедлайном;
  исход разбора на код ответа не влияет
- слой доставки хранится в delivery.derived_layer и наследуется от
  ПРЕДШЕСТВУЮЩЕЙ доставки автоматизации: без границы по времени свёртка
  переставала быть функцией от префикса журнала (1737 объектов против 1742)
- task verify:archive — сходимость на живом архиве, 99 доставок из 99
This commit is contained in:
av
2026-08-01 18:03:59 +03:00
parent c9ddf0b4dd
commit 32f21044e4
17 changed files with 898 additions and 36 deletions
+23 -1
View File
@@ -24,4 +24,26 @@
---
Пока пусто — конвейер заведён 2026-08-01, задач через него не проходило.
## 2026-08-01 — свёртка не воспроизводилась при пересборке журнала
- **Где:** `internal/store/delivery.go`, `LastDerivedLayer`
- **Симптом:** прогон живого архива (99 доставок) вторым проходом дал 1742
объекта вместо 1737, а координат сна 182 вместо 174. Нашёл тест сходимости
на шаге apply — не ревью.
- **Причина:** доставка без плотных метрик наследует слой автоматизации.
Запрос брал последний выведенный слой **вообще**, а не последний до этой
доставки, поэтому при пересборке доставка наследовала слой «из будущего».
Свёртка переставала быть функцией от префикса журнала.
- **Почему не поймали:** формулировка «наследует последний надёжно выведенный
слой той же автоматизации» звучит однозначно и в спеке, и в дизайне —
пропущенное слово «предшествующей» не выглядит пропуском. Проходы `specs` и
`architecture` сверяли код со спекой и понятиями, а инвариант
«`import + replay` даёт то же состояние» ни один из них не проверял на
конкретном правиле: он записан в архитектуре как свойство системы, а не как
критерий для каждого узла, читающего состояние.
- **Что меняем:** в рубрику `healthlog-review-rubric` и в проход `ops` — вопрос
«читает ли узел состояние, которое сам же меняет, и остаётся ли он функцией
от префикса журнала». Дешевле правила: любой запрос к `delivery` из свёртки
обязан иметь границу по `received_at` разбираемой доставки. Тест сходимости
на живом архиве (`internal/fold/replay_test.go`) остаётся постоянным —
именно он это поймал.