Дозакрыты находки ревью по слиянию сущностей

- Правило покрытия получило второй разряд (условный, как у точек), запрет
  вырождения формы и счёт содержательных элементов ряда: скелет из скаляров и
  ряд из null больше не затирают маршрут. Победитель внутри доставки стал
  функцией множества версий — общим помощником с точками, — а провенанс
  поднимается и при совпавшем хеше, иначе отложенная доставка возвращала витрину
  к прежнему содержимому.
- Одно поле не того типа больше не уносит сущность, а пропуски видны в учётной
  записи доставки (миграция 00008, NULL = «не измерялось»); каноническая форма
  считается один раз и вне транзакции; откат бинаря поверх новой схемы отказывает
  на старте; текст ошибки разбора не несёт значений из тела.
- Ревью кода профилем deep (девять проходов) нашло две регрессии и обе закрыты:
  безусловный второй разряд запирал законный досчёт навсегда, а выбор победителя
  был квадратичен по числу присланных версий одного ключа.
This commit is contained in:
av
2026-08-02 16:38:18 +03:00
parent 51a5272c96
commit 8331328134
52 changed files with 4921 additions and 481 deletions
+8 -1
View File
@@ -97,7 +97,14 @@ func TestReplayЖивогоАрхива(t *testing.T) {
if first.Records == 0 {
t.Error("записей в витрине нет — секция stateOfMind не разбирается")
}
t.Logf("тренировок %d, записей %d", first.Workouts, first.Records)
// Удержанные версии сущностей печатаются рядом с их числом. Число — это
// «сколько лежит», а удержания — «сколько правило слияния не пустило», и
// второе отпечатком не проверяется по построению: живой приём и пересборка
// пользуются одним правилом и одинаково сойдутся на одинаково удержанной
// версии. Печатается, а не утверждается: удержание — событие для разбора,
// а не отказ сходимости.
t.Logf("тренировок %d, записей %d, удержано версий сущностей %d",
first.Workouts, first.Records, first.EntitiesHeld)
// Повторное проигрывание того же журнала даёт то же состояние: свёртка
// детерминирована, и пересборка даёт то же, что живой приём.