diff --git a/doc/chat_audit_findings.txt b/doc/chat_audit_findings.txt index 8665139f..189dbf79 100644 --- a/doc/chat_audit_findings.txt +++ b/doc/chat_audit_findings.txt @@ -856,3 +856,56 @@ ACK/событие — после него. Нулевой INSERT при сущ результатов и решения автора сохранены. Runtime/wire/схема/штатные тесты не менялись; новые fullcheck/sanitizers/GUI/APK не запускались. Чеклист остаётся без новых отчётов, частичные отметки attachment/chat[~] сохранены. По AGENTS.md:10 дальнейший аудит остановлен. + +Исправление приёма REQUEST — 27.10.2026, runtime760398b9 + +ak_accept_request владеет BEGIN IMMEDIATE/COMMIT и отклоняет внешнюю транзакцию +до чтения/записи без её изменения. Проверки identity,подписанного членства и авторства +выполняются внутри транзакции. Сначала читается существующий запрос:при отсутствии +вставляется ровно одна строка;дубликат incoming1/state0,2,3,4 сохраняет created_at +и решение. State2/4 повторно ставит GRANT,state3 DENY,state0 ждёт решения. +Другие состояния/направление отклоняются. Проверяются prepare,все bind,step,finalize, +число записанных строк и commit. ak_body также проверяет SQL-этапы и размеры identity/key. +ACK и событие отправляются только после commit;отказ ACK не удаляет сохранённый запрос. +Ошибки содержат channel/peer/command/stage/rc,успех — duplicate/state/queued без секретов. +Общий ak_rollback отменяет операцию;если транзакция осталась открыта,модуль снимает +callback и запрашивает stop,владелец закрывает БД после poll. Wire/схема/API не менялись. + +Новый Linux test_attachment_requests использует настоящие core/SQLite,подписанного +мембера и историю через chat_core_submit_message. Локальная строка вложения — фикстура; +публикация/криптография/сетевая доставка дополнительно проверяются полным E2E-сценарием. +247 SQL-отказов с успешным повтором и дубликатом:новый запрос/state0/2/3/4,пустая или +существующая outbox,BEGIN/COMMIT,identity/member/author/request lookup,insert/outbox, +каждый prepare/bind/step/finalize/changes. Дополнительно настоящий commit veto, +ABORT/IGNORE вставки запроса и вставки/обновления очереди,внешняя транзакция с собственным +маркером,неверные state/direction/hash/flags,удалённый мембер,нет маршрута/backpressure/ +ошибка send. Readonly reader непосредственно в ACK и событии проверяет точные +key/error/request/state/created_at/outbox/command/retry и соседнюю запись. +Rollback fault не даёт ACK/события,снимает callback и запрашивает stop;destroy владельцем +откатывает открытую транзакцию. Баланс выделений восстановлен. + +test_encrypted_attachment получает первый настоящий REQUEST через проверенный router, +открывает внешнюю транзакцию перед сервисным callback и проверяет отказ без ACK/события +и без изменения внешнего маркера. Внешний владелец откатывает маркер и перезапускает +автора отдельным таймером вне callback сервиса. У B остаются state0 и REQUEST outbox1; +через штатные5 секунд повтор действительно проходит сеть. Перед настоящим REQUEST_ACK +независимый reader уже видит incoming1/state0 и autocommit1. Далее прежние проверки +решения автора,GRANT fault/retry,расшифровки,restart B,cache restore и удаления канала +завершаются phase10 PASS. Подписи/криптография/доставка не подменяются. +Первый лог:/tmp/utun_encrypted_attachment_ky1Lm2/test.log. + +Сборка native и первичный профиль4/4 PASS. Полный ./check.sh212/212 PASS,0 skipped, +proxy9/9,burst1/1,load8/8,134217728байт,173с. Прогон в частном netns с IPv6 loopback, +настройки сети хоста не менялись. Логи:/tmp/attachment-request-fix-full-check.log, +/tmp/attachment-request-fix-full-logs. ASAN/UBSan/LSan16/16 PASS,detect_leaks=1, +halt_on_error=1,core/libuasync/Opus инструментированы согласованно в отдельной копии. +Логи:/tmp/attachment-request-fix-asan-results.log,/tmp/attachment-request-fix-asan-logs. +Desktop vibechat и Android assembleDebug PASS;GUI/Android host11/11 PASS,включая +utun_node,редактирование/удаление/события/ответы и6 вариантов audio lifecycle. +Сборки и профиль:/tmp/attachment-request-fix-{build,desktop-build,android-build,gui-results}.log. + +Задача закрыта,заголовок и encrypted_attachments/service_lifecycle согласованы. +Полный аудит attachment/chat остаётся частичным. Продолжается сверка исходящего +создания запроса,файловых completion,удаления и восстановления;отметки[~] сохранены. +По новой инструкции пользователя дефекты исправляются и проверяются по мере аудита, +с последующим обновлением текстов,без остановки на обнаружении дефекта. diff --git a/doc/tasks.md b/doc/tasks.md index 77bf61b0..b1c94d3f 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,16 +4,18 @@ ## Текущие задачи -[ ] **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: подтверждать входящий REQUEST после собственного commit** — исправлено27.10.2026. + Собственная BEGIN IMMEDIATE/COMMIT включает identity,права,чтение/создание запроса и повтор прежнего ответа. + Внешняя транзакция отклоняется без изменений;дубликаты incoming1/state0,2,3,4 сохраняют решение и created_at. + Проверены все SQL-этапы;новая строка/очередь требуют changes1,ACK/событие следуют после commit. + Общий rollback сохраняет прежние данные;открытая транзакция требует quiesce/stop и закрытия владельцем после poll. + test_attachment_requests:247 SQL-отказов/повторов,commit veto,ABORT/IGNORE,внешняя транзакция, + неверные состояния/права,независимые reader в ACK/событии,backpressure/send fault и rollback fault. + Сеть:первый REQUEST без ACK→очередь B сохранена→restart автора→настоящий повтор→committed ACK→phase10 PASS. + Native build/check.sh212/212 PASS,0 skipped,proxy9/9,burst1/1,load8/8 (134217728байт),173с. + ASAN/UBSan/LSan16/16 PASS,detect_leaks=1;desktop/APK build PASS,GUI/Android host11/11 PASS. + Отчёт:[chat_audit_findings.txt](chat_audit_findings.txt),«Исправление приёма REQUEST»;/tmp/attachment-request-fix-*. + Полный аудит attachment/chat остаётся частичным;исходящие запросы и файловые completion/recovery проверяются далее. [+] **chat_attachment: фиксировать решение автора вместе с исходящим ответом до успеха/UI** — исправлено27.10.2026. Собственная BEGIN IMMEDIATE/COMMIT включает проверку прав,state и outbox;внешняя транзакция остаётся нетронутой.