From 15ec41f2fd3ee94752ab09194621974a2631ef2a Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 27 Oct 2026 00:55:14 +0100 Subject: [PATCH] Record lost REQUEST after real acknowledgment and author rollback --- doc/chat_audit_findings.txt | 69 +++++++++++++++++++++++++++++++++++++ doc/tasks.md | 11 ++++++ 2 files changed, 80 insertions(+) diff --git a/doc/chat_audit_findings.txt b/doc/chat_audit_findings.txt index 0159e442..8665139f 100644 --- a/doc/chat_audit_findings.txt +++ b/doc/chat_audit_findings.txt @@ -787,3 +787,72 @@ gui-results,native-initial}.log;новая одиночная регрессия Полный аудит attachment/chat остаётся частичным:REQUEST,создание исходящего запроса, файловые completion/delete/recovery требуют отдельной дальнейшей сверки. Отметки[~] внешнего чеклиста сохранены,отчёт туда не добавлялся. Windows/FreeBSD не проверялись. + +Аудит приёма REQUEST — 27.10.2026, base ef8e8f2c + +Продолжена сверка оставшихся операций chat_attachment:приём REQUEST и создание +исходящего запроса в ak_tick. В приёме подтверждён отдельный дефект границы commit. +ak_receive:578–595 использует SAVEPOINT attachment_request и RELEASE,затем отправляет +настоящий REQUEST_ACK и ATTACHMENT_KEYS_CHANGED. Внешняя транзакция не отклоняется; +RELEASE вложенного savepoint не фиксирует её. Локальный SELECT видит новый запрос, +а независимое readonly-соединение — ещё нет. Сетевое подтверждение уже не связано +с последующим commit/rollback внешнего владельца. + +Временный /tmp/attachment-request-audit.c включает текущий штатный +tests/test_encrypted_attachment.c с переименованным main. Все четыре ядра,SQLite, +публикация/скачивание контейнера,подписи мемберов,маршруты и E2E control настоящие. +Сборка идёт через tests/Makefile и дополнительный /tmp/attachment-request-audit.mk, +с текущей libutun и штатным test_clock. Исходники проекта не менялись. + +В outer-режиме wrapper sqlite3_exec один раз открывает внешнюю BEGIN IMMEDIATE +непосредственно перед первым SAVEPOINT входящего REQUEST на авторе A. +Wrapper отправки наблюдает первый настоящий REQUEST_ACK,читает writer/reader +и передаёт неизменённые байты в прежний штатный wrapper,затем в настоящий router. +Флаги SIGNED|ENCRYPTED,channel/message_id и адресат проверяются. После вызова +настоящего события внешний владелец выполняет ROLLBACK. Это штатные успешные SQL +BEGIN/ROLLBACK,без подмены кодов ошибок,ключей,подписей,маршрутов или доставки. +На первом ACK фактическим получателем стал C (M,index3). + +В точке ACK:autocommit0,writer_requests1,committed_requests0;router принимает ACK с rc0. +В точке события остаются те же значения. После ROLLBACK committed_requests0. +Получатель действительно принимает ACK через сеть:его state1 сохраняется собственной +проверенной транзакцией,REQUEST удаляется из outbox. Это не только факт вызова send: +следующее независимое чтение подтверждает committed состояние получателя. + +Через6 секунд тестового времени:author_requests0,recipient_state1,outbox0,key_bytes0, +оба направления маршрута живы,исходящий REQUEST был отправлен ровно один раз. +После настоящего restart A и ещё6 секунд значения те же:повтора нет,у автора нет +запроса для решения. Фикстура остаётся phase5,поскольку автор получил только второй +запрос,а первый потерял после ACK. Внешний reader во всех проверках открывается +отдельным readonly-соединением и закрывается после завершённого чтения. +Ускоренные часы — стандартный test_clock с реальным I/O;phase/timers не подменялись. + +Control использует тот же стенд без внешней транзакции:в ACK и событии autocommit1, +writer_requests1 и committed_requests1. Полный штатный сценарий достигает phase10, +включая уже исправленные отказы автора,его restart/повтор,отказ bind GRANT у получателя, +настоящий повтор GRANT,расшифровку,restart B и cache restore. +Control:exit0,ACK1,event1,defects0,allocations0→0. +Outer:ожидаемый exit1/phase5,BEGIN1,ACK1,event1,rollback1,два наблюдения до/после restart, +defects1,allocations0→0. Все подробные отрицательные логи прочитаны целиком. + +Сборка:/tmp/attachment-request-audit-build.log (предупреждения snprintf штатной фикстуры). +Control:/tmp/attachment-request-audit-control.log, + полный /tmp/utun_encrypted_attachment_Ea1Vr0/test.log,строки110–112 и238. +Outer:/tmp/attachment-request-audit-outer.log, + полный /tmp/utun_encrypted_attachment_Knf0qh/test.log:BEGIN/ACK/event/rollback иоба WATCH. + +Исправление должно дать приёму REQUEST собственную короткую транзакцию с отказом +внутри внешней транзакции без её изменения. Проверки допуска,вставки/чтения запроса, +повтора прежнего GRANT/DENY и завершения SQL должны предшествовать проверенному commit; +ACK/событие — после него. Нулевой INSERT при существующем запросе допустим для +дубликата,поэтому важно проверять сохранённые направление/состояние,а не требовать +одну новую строку при каждом повторе. Откат должен использовать общий ak_rollback +и принятый порядок quiesce/stop при незавершённой транзакции. Постоянные регрессии +должны проверить reader в ACK,отказ внешней транзакции,SQL-ошибки,дубликаты и повтор +после restart без потери запроса. Создание исходящего запроса этим не закрывается. + +Открыта задача в doc/tasks.md;в .h и encrypted_attachments.md описано ограничение. +Менялись только комментарии и документация. Прежние исправления подготовки,приёма +результатов и решения автора сохранены. Runtime/wire/схема/штатные тесты не менялись; +новые fullcheck/sanitizers/GUI/APK не запускались. Чеклист остаётся без новых отчётов, +частичные отметки attachment/chat[~] сохранены. По AGENTS.md:10 дальнейший аудит остановлен. diff --git a/doc/tasks.md b/doc/tasks.md index 577340e6..77bf61b0 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,6 +4,17 @@ ## Текущие задачи +[ ] **chat_attachment: подтверждать входящий REQUEST после собственного commit** — подтверждено27.10.2026. + ak_receive использует SAVEPOINT attachment_request;во внешней транзакции RELEASE не выполняет commit. + Реальные ACK/событие отправляются при writer request1/readonly request0;внешний rollback теряет запрос автора. + Получатель уже сохранил state1 и удалил REQUEST outbox;нет повторов,ключ отсутствует и после restart автора при живых маршрутах. + Текущая A–S–B/C-фикстура:control phase10 PASS,outer phase5 ожидаемо FAIL;allocations0->0 в обоих сценариях. + Требуется собственная транзакция приёма,отказ внутри внешней транзакции без её изменения,проверенные SQL-этапы, + ACK/событие после commit и общий безопасный rollback. Дубликаты обязаны сохранять прежнее решение/повтор ответа. + Нужны постоянные проверки независимого reader в точке ACK,внешней транзакции,SQL-отказов и реального повтора/restart. + Отчёт:[chat_audit_findings.txt](chat_audit_findings.txt),«Аудит приёма REQUEST»;/tmp/attachment-request-audit-*. + Runtime не изменён;дальнейший аудит остановлен по AGENTS.md:10,отметки attachment/chat остаются[~]. + [+] **chat_attachment: фиксировать решение автора вместе с исходящим ответом до успеха/UI** — исправлено27.10.2026. Собственная BEGIN IMMEDIATE/COMMIT включает проверку прав,state и outbox;внешняя транзакция остаётся нетронутой. ak_queue проверяет все SQL-этапы и одну строку,транзакцией владеет вызывающий;допуск автора проверяет finalize.