Files
healthlog/docs/tasks/items/data-migration-row-selection.md
T
av 3d24248075 docs: документация приведена к канону av-dev-pm 4
- каждая запись каталога задач получила тип вместо тега kind: и префикса
  заголовка; секция роадмапа «Разработка» стала «Сопровождением», порядок
  секций канонический
- поправлены протухшие факты: нереализованные маршруты Read API, MCP и
  `healthlog import`, словарь слоёв в инварианте, семантика гейта по покрытию
  диффа, периметр перестал дублировать security.md
- замер слияния переведён с находки 49 на находку 54, заполнены Purpose спек
  storage и parsing
2026-08-05 19:09:35 +03:00

3.4 KiB

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

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

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

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

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

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

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 (раздел про миграции), если форма отбора окажется общей.

Связано