## 1. Правило слияния точек - [x] 1.1 `candidate` получает флаг `incoming`; схлопывание совпавших канонических форм поднимает флаг, а байты оставляет встреченные первыми - [x] 1.2 `pointLess` — лексикографический порядок по паре `(не incoming, каноническая форма)`; `pointDominates` не трогается - [x] 1.3 `resolve` возвращает признак «победил сохранённый при наличии пришедших»; `mergePoints` считает удержания - [x] 1.4 `MergeStats.PointsHeld` и `PointsHeldAt`; проброс через `mergeResult`, `SaveBuckets`, `fold.Stats`, `replay.Outcome`/`Report` и лог свёртки — без значений точек ## 2. Порядок свёртки равен порядку журнала - [x] 2.1 `Worker.Pass` прекращает проход на исходе `Deferred`; доставка, оставшаяся `pending` без такого исхода, курсор двигает - [x] 2.2 `Store.ParsedAfter` — есть ли доставка позже данной в статусе `parsed` или `partial` (кортежный предикат; индекс — `delivery_received_at`, цена измерена и названа в design.md) - [x] 2.3 воркер пишет одну запись `WARN` на доставку о свёртке вне порядка журнала; пересборка эту проверку не выполняет ## 3. Тесты - [x] 3.1 пришедшая побеждает сохранённую при равной полноте - [x] 3.2 столкновение внутри одной доставки решается порядком канонических форм и не зависит от порядка элементов массива - [x] 3.3 повторная присылка канонически совпавшего содержимого не переписывает объект (хеш не двигается) - [x] 3.4 полнота сильнее происхождения; счётчик удержаний растёт - [x] 3.5 сходимость: живой путь через воркер с отложенной занятостью базы доставкой даёт тот же отпечаток, что пересборка - [x] 3.6 проход воркера не перешагивает отложенную доставку - [x] 3.7 `WARN` о свёртке вне порядка журнала пишется, не содержит значений и не пишется на `failed`-преемнице - [x] 3.8 при разошедшихся значениях пустые ключи сохранённой точки её не удерживают (сценарий, парный к 3.4) ## 4. Документы - [x] 4.1 `docs/architecture.md` — «Разрешение столкновений» плюс **все** упоминания правила: инвариант в шапке, «порядок прихода значения не имеет» в разделе синхронизации; таблица двух правил равной полноты (точки против сущностей) с критерием выбора - [x] 4.2 `CLAUDE.md` — формулировка инварианта «ничего не теряем молча»: «выигрывает более полная, при равной полноте — стоящая позже в журнале» - [x] 4.3 `internal/store/entity.go` — комментарии, чей довод («порядок свёртки журналу не равен») этим изменением сужен до окна видимости - [x] 4.4 `docs/research/apple-health.md` — перемер 2026-08-04 с **методом**: ключ со слоем, 155 доставок, 460 995 координат, 80 129 спорных, 981 полнотой, 79 148 тай-брейком, 75 494 меняют исход - [x] 4.5 `docs/review.md` — запись о дефекте (посылка оракула умерла с ростом корпуса) и о том, что конвейер её не ловил - [x] 4.7 вопрос владельцу в `docs/tasks/items/journal-order-on-ingest.md` (раздел «Вопросы» + тег `question`): решение (в) порядок журнала не восстанавливает, а цена окна выросла с вывода слоя до значений точек - [x] 4.6 `docs/conventions/` — промоут двух правил: «в проверке на живом корпусе утверждается инвариант, число печатается» и «оракул сходимости называет свою посылку рядом с собой» ## 5. Оракулы - [x] 5.1 `task gate` зелёный - [x] 5.2 `task verify:archive` — ноль противоречащих часов, `step_count` накопительная, отпечаток изменился - [x] 5.3 `task verify:archive` второй раз подряд — тот же отпечаток - [x] 5.4 `task verify:busy` зелёный - [x] 5.5 замер удержаний на живом архиве — число названо, не утверждено ## Приёмочные критерии из ревью предложения (профиль `design`, проход `rubric`) Свойства, по которым судится узел рода «правило слияния версий в хранилище-свёртке по журналу» плюс «упорядочивающий воркер очереди». - [x] Р1 исход слияния — функция префикса журнала и только его; запрос воркера «есть ли доставка позже» влияет на лог и MUST NOT влиять на содержимое - [x] Р2 законные расхождения живого пути и пересборки перечислены поимённо, и у оракула названа посылка - [x] Р3 повторная свёртка идемпотентна на суффиксе журнала; свёртка более ранней доставки после более поздней меняет состояние наблюдаемо - [x] Р4 победитель — функция множества кандидатов и их происхождения, но не порядка точек внутри доставки; отношение победы ациклично (проверка перестановками ТРОЙКИ, не пары) - [x] Р5 правило тотально на вырожденном входе: один кандидат, равные канонические формы с разными байтами, не-JSON, несравнимые множества - [x] Р6 победитель сохраняется дословно; цена лишних записей названа числом - [x] Р7 правило структурно: не читает ни значение точки, ни род, ни витрину - [x] Р8 барьер очереди не останавливает поток: названо, что держит очередь и что её освобождает; канонизация и сжатие вне транзакции записи - [x] Р9 наблюдаемость отличает «правило сработало» от «не сработало» и не несёт значений здоровья; тест на утечку разбирает запись, а не ищет подстроку в сыром буфере - [x] Р10 ни одно утверждение теста не пришпилено к числу, производному от размера корпуса: утверждается инвариант, число печатается - [x] Р11 два правила равной полноты (точки и сущности) не расходятся молча: различие механизмов и критерий выбора записаны - [x] Р12 место снапшота Apple в порядке журнала — либо названо, либо явно отложено до задачи импорта (сегодня стадия снапшота пуста) ## Критерии приёмки задачи Приходят из `docs/tasks/items/tie-break-equal-completeness.md`, дословно. Числа в них производны от размера корпуса — по каждому названо, чем именно измерено и что при этом печатается, а не утверждается (`docs/review.md`, 2026-08-02). - [x] ни одна метрика не теряет род из-за столкновения равной полноты; `step_count` снова накопительная — оракул: `task verify:archive`, ноль противоречащих часов - [x] живая свёртка и пересборка дают **один** отпечаток витрины — оракул: `healthlog reindex` против живого состояния; это же и есть страховка от потерянной коммутативности - [x] повторный прогон реплея даёт тот же отпечаток — оракул: `task verify:archive`, второй прогон подряд - [x] столкновение **внутри одной доставки** разрешается прежним байтовым порядком — оракул: тест на двух точках одной доставки с равной полнотой - [x] «пришедшая точка проиграла сохранённой» считается отдельно от общего `MergeStats.Overwrites` — оракул: тест плюс прогон на живом архиве, число сходится с замером 2026-08-04