diff --git a/doc/member_merkle_audit_findings.txt b/doc/member_merkle_audit_findings.txt index 11b15234..9b86e28b 100644 --- a/doc/member_merkle_audit_findings.txt +++ b/doc/member_merkle_audit_findings.txt @@ -655,6 +655,15 @@ BAD_FORMAT, DEFERRED, ERROR), сохранение корректной суще - Exit0, tracked allocations восстановлены. /tmp/db-sync-completion-design-build.log и /tmp/db-sync-completion-design.log. Это диагностика существующего кода, не тест новой реализации. +Повторная проверка самого плана выявила обязательную предпосылку общего движка: +при merkle_sync_cancel сессия и её round освобождаются. Новый follower начинает с round0, +поэтому прежний BEGIN7 принимается как новый и получает READY. Локальный стенд +/tmp/merkle-reattach-design.c/.mk это подтвердил на штатной protocol-фикстуре после cancel/start: +round7,stateSERVE,READY в очереди. Применение старых PAGE или ложный MT_OK этим стендом +не проверялись и не заявляются. Логи /tmp/merkle-reattach-design-build.log и +/tmp/merkle-reattach-design.log,exit0,allocations восстановлены. +Значит, при переносе нельзя безусловно считать поле round достаточной защитой после пересоздания сессии. + Варианты: А. Сохранить собственный bulk-протокол: потребуются канонический хеш без id, поиск настоящего общего префикса либо полный fallback с0, устойчивый курсор, два явных прохода, round/request/state, @@ -668,6 +677,19 @@ BAD_FORMAT, DEFERRED, ERROR), сохранение корректной суще Конкретный план вариантаБ: +0. До подключения истории закрепить изоляцию пересозданных сессий общего Merkle. + В новой версии wire использовать двустороннее подтверждение попытки: + BEGIN несёт свежий round_id инициатора; READY добавляет свежий accept_id ответчика; + последующие QUERY/PAGE/TURN/CHECK/DONE/ERROR проверяют пару идентификаторов, request и фазу. + Идентификаторы — случайные128 бит с проверкой отказа генерации; каждый новый раунд/handshake + получает новые значения, отмена уничтожает действующий accept_id. Поля namespace/dataset/соединение + остаются частью области сессии. READY принимается только для ожидаемого текущего BEGIN. + Поздний BEGIN после cancel может получить свежий challenge; старые PAGE/DONE содержат прежний accept_id + и не могут примениться или завершить новый запрос. Дубликат BEGIN активной попытки не перезапускает + её применение; повтор WAKE может вызвать новый handshake, но не является успехом или применением данных. + Так не требуется хранить неограниченный архив отменённых сессий или надеяться на порядок доставки. + Проверить это для MEMBERS/FEEDBACK прежде, чем добавлять MESSAGES. Старая версия wire не поддерживается. + 1. Канонический набор истории. Namespace — числовой channel_id; dataset отдельный от MEMBERS/FEEDBACK. Ключ — существующий message_id[32], проверяемый вычислением из group_id/timestamp/signature. @@ -706,13 +728,15 @@ BAD_FORMAT, DEFERRED, ERROR), сохранение корректной суще после закрытия курсора в проверяемой транзакции, обновляет индекс и запускает повтор. 4. Управление раундом и успехом. - Используются существующие round/request/state, два pull-прохода, CHECK/DONE, полный32-байтовый корень, + Используются общий request/state и усиленная пара идентификаторов из п.0, два pull-прохода, + CHECK/DONE, полный32-байтовый корень, revision, deadline и очередь с waiter. Ошибка или повтор неизменной пары разных корней — не успех. done для db_sync/media поступает только от MT_OK; постановка пакета в очередь и конец страницы не подтверждают завершение истории. Последующие изменения вновь делают сессию dirty. Успех означает подтверждённую контрольную точку данного раунда, не вечную глобальную синхронность - при продолжающейся записи. Старый round/request не изменяет данные/позиции, не продлевает deadline - и не завершает новый запрос. Эти свойства нужно проверить именно для подключённой модели истории. + при продолжающейся записи. PAGE/DONE/ERROR прежней пары идентификаторов не изменяет данные/позиции, + не продлевает deadline и не завершает новый запрос. BEGIN/WAKE рассматриваются отдельно как handshake, + а не как доказательство результата. Эти свойства проверяются и для подключённой модели истории. 5. Интеграция, права и владение. Регистрировать MESSAGES после создания общего движка при chat startup; data_ctx — стабильный inst, @@ -777,6 +801,8 @@ BAD_FORMAT, DEFERRED, ERROR), сохранение корректной суще пакет заполнен раньше лимита записей, дубликаты и повтор последней страницы. - PUSH/вставка до и после курсора; третий узел; удаление/TTL; изменения между CHECK и отправкой DONE. - Старые round/request, неожиданные фазы, отмена/повтор, DOWN/REINIT/restart, старый UP без нового события. +- Cancel/start follower, затем прежний BEGIN и PAGE/DONE старого accept_id; новая попытка того же namespace + на том же UP-соединении; повторы BEGIN/READY/WAKE и старый ERROR. Никакой успех/запись от старой пары. - SQL prepare/bind/step/commit, BLOB NOMEM, хеш/VerifyInit, очередь/таймер/waiter: нет частичных данных, ложного MT_OK, потери корректных строк или callback после cancel/free. - ACTIVE-допуск пира, отзыв/возврат, сохранение старых сообщений исключённого автора; различие sound_on/off @@ -789,6 +815,7 @@ BAD_FORMAT, DEFERRED, ERROR), сохранение корректной суще callback отписывает себя/следующий callback и удаляет канал без UAF. - Общий check.sh со STUN и целевые ASAN/UBSan/LSan после реализации. -Статус: план вариантаБ сформирован и логически проверен при указанных предположениях; +Статус: план вариантаБ сформирован и уточнён после отдельной проверки reattach; +логическое обоснование требует п.0 и согласованного индекса, а не опирается на неизменённый старый движок. новая модель и её тесты ещё не реализованы. Перенос нельзя объявлять проверенным текущими203/203 и8/8: эти результаты относятся к уже выполненному исправлению раздела11. diff --git a/doc/tasks.md b/doc/tasks.md index 359afd39..b13b9697 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -105,6 +105,9 @@ План: история как MT_DATA_MESSAGES в общем Merkle, канонический набор без local id, атомарный индекс, полный корень/раунды/курсор; оставить PUSH/ACK. Учесть startup/stop, права, callback dispatch и sleep/sound (общий движок сейчас запрещает сон, db_sync допускает sound_on), исправить TTL ms/us и индекс после DELETE. + Обязательный первый этап: изоляция Merkle после cancel/start. Стенд /tmp/merkle-reattach-design.c + подтвердил принятие прежнего BEGIN7 новой follower-сессией; PAGE/ложный MT_OK не проверялись. + План усилен свежими round_id/accept_id обеих сторон handshake; старые пакеты не подтверждают новый запрос. План отдельно обосновывает сходимость, предпосылки и регрессии; runtime не менялся, перенос не реализован. [member_merkle_audit_findings.txt](member_merkle_audit_findings.txt), раздел12.