# 🐞 Не отбирать строки в data-миграциях по обрезаемым спискам

- **Тип:** fix
- **Категория:** Ядро
- **Зачем:** Миграция 00007 отбирает по uncovered_sections, который обрезается на 32 — следующая покрытая секция унаследует слепую зону
- **Теги:** goal:journal-and-rebuild

Остаток задачи «Дозакрыть находки ревью по слиянию сущностей» (архивный change
`dozakryt-nahodki-sushchnostej`).

Двигает строку «Завершения» цели: «Data-миграции не наследуют слепые зоны обрезаемых списков».

## Оракул: механизм доказан, дефект пока пустой

Миграция `00007` переводит в `pending` доставки, у которых имя ставшей покрытой
секции стоит в `uncovered_sections`:

```sql
WHERE EXISTS (SELECT 1 FROM json_each(delivery.uncovered_sections)
              WHERE json_each.value IN ('workouts', 'stateOfMind'))
```

Список `uncovered_sections` обрезается на 32 имени **в порядке встречи**
(`hae.maxUncovered`, счётчик `UncoveredDropped`). Секция, стоящая в теле после
тридцати двух незнакомых ключей, в список не попадает — и отбор миграции её не
найдёт. Оракул жил в `tmp/adv/uncovered_test.go`: тело с 32 ключами `junk` и
секцией `ecg` за ними даёт список без `ecg`.

Для `00007` дефект **пустой**: HAE шлёт одну секцию за доставку
(`docs/research/apple-health.md`, находка 50), секций восемь, тела с 32 незнакомыми
ключами в архиве не существует. Но следующая покрытая секция унаследует ту же
слепую зону, а к тому времени причину никто не вспомнит.

## Что делать

Записать принцип и выбрать форму отбора:

- **Принцип:** data-миграция не отбирает строки по списку, который где-то
  обрезается. Отбирать надо по признаку, который обрезке не подлежит, —
  например «эту доставку смотрел разбор старше версии N».
- Практическое следствие для существующего кода: `UncoveredDropped > 0` обязан
  означать безусловное пересворачивание — доставка, у которой список обрезан,
  про своё покрытие ничего достоверного не говорит.
- Кандидат в `docs/conventions/README.md` (раздел про миграции), если форма отбора
  окажется общей.

## Связано

- [Проверка секций, которых поток ещё не приносил](unseen-sections-check.md) —
  именно она следующей сделает секцию покрытой и напишет такую миграцию.
