- рядом с воркером свёртки живёт горутина, раз в минуту разбирающая журнал
пассивным чекпойнтом; «журнал не разбирается» видно строкой владельцу, а не
только по `df`. Признак — пара чисел, а не флаг занятости: тот молчит под
удерживаемым читателем (`busy=0` при 6256 страницах и пяти перенесённых), а
при занятой блокировке отдаёт `-1` вместо ответа, и `-1 >= -1` читалось бы как
«разобрано целиком»
- каталог отвечает `304` на `If-None-Match`, не открывая снимок витрины. Метка
собрана из всего, от чего зависит ответ: версии витрины (`data_version` с
закреплённого соединения плюс поколение — значение локально для соединения и
не переживает переоткрытия), горизонта измерения и области действия ресурса.
Версия снимается до и после сборки: снятая после пометила бы устаревший снимок
свежим номером
- предел и дедлайн ответа отложены в задачу Read API точек вместе с измеренной
ценой первого запроса; попутно починен флаки-тест чужой задачи, искавший
значение точки в сыром буфере записи лога
- секции `workouts` и `stateOfMind` покрыты разбором: тренировка лежит одной
строкой вместе с маршрутом и внутренними рядами, запись — по ключу `род + id`;
миграция 00007 заводит обе таблицы и возвращает в очередь `partial`-доставки
с этими ключами
- сущность заменяется целиком, но условно: приехавшая побеждает, если не теряет
содержания сохранённой (множество ключей и длины верхнеуровневых массивов), а
при равном содержании выигрывает версия из более поздней доставки ЖУРНАЛА —
«побеждает приехавшая» было бы функцией порядка свёртки, и живая витрина
расходилась бы с пересборкой молча
- отпечаток витрины покрывает тренировки и записи и снимается одним снимком
базы; отчёт `reindex` считает «было и стало» по каждой единице хранения
- половина потока (50 доставок из 104) не несёт metrics вовсе и до сих пор
числилась parsed: ретеншен, поверив статусу, срезал бы тела stateOfMind,
которых в экспорте Apple нет
- разбор перечисляет верхнеуровневые ключи data, непокрытые проглатываются
декодированием: тело 40 МиБ из непокрытой секции удерживает 0 МиБ
- статус partial и колонка delivery.uncovered_sections; миграция переводит
прежние parsed в pending — им верить нельзя
- витрина не изменилась: отпечаток совпал с прогоном до изменения
- отношение победы было нетранзитивным: полнота (частичный порядок) плюс
тай-брейк (тотальный) в попарной свёртке давали цикл, из-за которого одна
и та же доставка меняла содержимое объекта при каждой пересборке
- надмножество побеждает только при совпадении значений общих содержательных
ключей: иначе точка без единого измерения вытесняла измерение
- Less стал тотальным, isEmpty не материализует значение, имя метрики в
координате столкновения обрезается, отпечаток витрины включает units и sealed
- на живом архиве строгий no-op: 1737 объектов, содержимое совпало побайтово
Триаж свёл 62 сырые находки девяти проходов к 33 причинам: 3 блокера,
4 «сейчас», 2 развилки. Все закрыты регрессионными тестами.
- схема точки сна определяется по самой точке, а не по индексу в исходном
массиве: одна пропущенная точка меняла эпизод и сводку местами
- доставка сворачивается одной транзакцией: частичное состояние было
недетерминированным (восемь прогонов — семь состояний)
- граница размера на распакованном теле: 400 КиБ gzip разворачивались в
400 МиБ мимо max_body_mb
- столкновение — расхождение канонических форм, а не байтов; WARN с
координатами объекта; payload без HTML-экранирования
- выравнивание по местной метке: получасовые зоны уводили часовую выгрузку
в minute
- доставка из одних суточных сводок больше не отвергается целиком
- единицы не переписываются молча; счётчик считает сохранённые точки
- все выходы Fold логируются, исход пишется на переживающем отмену контексте
Четыре развилки вынесены блокерами в беклог.