Files
healthlog/docs/backlog/otbor-strok-data-migraciyami.md
T
av 8331328134 Дозакрыты находки ревью по слиянию сущностей
- Правило покрытия получило второй разряд (условный, как у точек), запрет
  вырождения формы и счёт содержательных элементов ряда: скелет из скаляров и
  ряд из null больше не затирают маршрут. Победитель внутри доставки стал
  функцией множества версий — общим помощником с точками, — а провенанс
  поднимается и при совпавшем хеше, иначе отложенная доставка возвращала витрину
  к прежнему содержимому.
- Одно поле не того типа больше не уносит сущность, а пропуски видны в учётной
  записи доставки (миграция 00008, NULL = «не измерялось»); каноническая форма
  считается один раз и вне транзакции; откат бинаря поверх новой схемы отказывает
  на старте; текст ошибки разбора не несёт значений из тела.
- Ревью кода профилем deep (девять проходов) нашло две регрессии и обе закрыты:
  безусловный второй разряд запирал законный досчёт навсегда, а выбор победителя
  был квадратичен по числу присланных версий одного ключа.
2026-08-02 16:38:18 +03:00

2.9 KiB

Data-миграции не отбирают строки по обрезаемым спискам

Приоритет: низкий

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

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

Миграция 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/local-research.md, находка 50), секций восемь, тела с 32 незнакомыми ключами в архиве не существует. Но следующая покрытая секция унаследует ту же слепую зону, а к тому времени причину никто не вспомнит.

Что делать

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

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

Связано