- internal/fold — свёртка по идентификатору доставки, тело из архива: тот же код, каким пойдёт пересборка витрины - приём зовёт свёртку на context.WithoutCancel с собственным дедлайном; исход разбора на код ответа не влияет - слой доставки хранится в delivery.derived_layer и наследуется от ПРЕДШЕСТВУЮЩЕЙ доставки автоматизации: без границы по времени свёртка переставала быть функцией от префикса журнала (1737 объектов против 1742) - task verify:archive — сходимость на живом архиве, 99 доставок из 99
50 lines
3.9 KiB
Markdown
50 lines
3.9 KiB
Markdown
# Журнал проскочивших дефектов
|
|
|
|
Сюда попадает дефект, который **прошёл ревью и всплыл позже**. Записывается
|
|
сразу, а не ретроспективно: со временем теряется не сам факт, а причина
|
|
непоймания — единственное, ради чего журнал существует.
|
|
|
|
Реализованные задачи, находки ревью и решения сюда не пишутся: у них есть
|
|
коммит, спека и беклог. Здесь только промахи конвейера.
|
|
|
|
Форма записи:
|
|
|
|
```
|
|
## 2026-08-01 — <краткое последствие>
|
|
|
|
- **Где:** internal/store/bucket.go:120
|
|
- **Симптом:** <как обнаружилось, кем и когда>
|
|
- **Почему не поймали:** <какой проход обязан был найти и что ему помешало>
|
|
- **Что меняем:** <правило прохода, шаг гейта, конвенция — либо «ничего, цена
|
|
поимки выше цены дефекта»>
|
|
```
|
|
|
|
Последний пункт важнее остальных. Вывод «ничего не меняем» — законный исход:
|
|
не всякий дефект стоит того, чтобы усложнять ради него ревью каждой задачи.
|
|
|
|
---
|
|
|
|
## 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`) остаётся постоянным —
|
|
именно он это поймал.
|