From 6803369a1320ce2cf054ece4b80b87a2b55d74d7 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 27 Oct 2026 02:05:25 +0100 Subject: [PATCH] Record verified outgoing, completion and channel deletion fixes --- doc/chat_audit_findings.txt | 87 +++++++++++++++++++++++++++++++++++++ doc/tasks.md | 31 +++++++++++++ 2 files changed, 118 insertions(+) diff --git a/doc/chat_audit_findings.txt b/doc/chat_audit_findings.txt index 2351a74f..b0b6c2c2 100644 --- a/doc/chat_audit_findings.txt +++ b/doc/chat_audit_findings.txt @@ -945,3 +945,90 @@ PASS:/tmp/attachment-outgoing-profile.log и /tmp/attachment-outgoing-profile-lo и документация DM сохранены без конфликтов;native runtime в upstream не менялся. После merge Android assembleDebug PASS:/tmp/attachment-request-fix-merge-android-build.log. Merge и проверенный REQUEST fix отправлены в origin обычным push8a0654e5. + +Завершение файлов — 27.10.2026, runtime4d19de7c/b71c3040 + +Захват расшифровки теперь проверяет prepare/три bind/step/changes1/finalize и commit +до worker. Файл принадлежит списку instance до окончания записи результата; +лимит16 включает workers и завершения,ожидающие SQLite. Completion владеет своей +транзакцией,различает отсутствующую запись и ошибку lookup,проверяет все SQL-этапы +метаданных/ready либо error. На SQL-отказе задача остаётся в списке до следующего tick, +криптография не повторяется. Внешняя транзакция остаётся нетронутой. Событие/публикация +следуют после commit. При stop после media_async_destroy освобождаются также ожидающие +завершения;delete отменяет их по отсутствию строки,rollback fault запрашивает stop. +Секреты очищаются при окончательном освобождении. Wire не менялся. + +test_chat_attachment:9 SQL-отказов claim,15 успешного completion,8 записи ошибки +настоящего worker с недоступным контейнером;ABORT/IGNORE,настоящий commit veto, +внешняя транзакция,удаление канала/stop/restart с ожидающим результатом,rollback fault. +Readonly reader проверяет точные key/info/type/ready/decrypting/error до worker и +в событии. Повтор completion сохраняет один worker;plaintext сверяется побайтно. +16 авторских workers действительно шифруют файлы,их завершения задерживаются отказом +lookup. Семнадцатая отправка не принимается и сохраняет source;снятие отказа публикует +все16 ровно по одному разу. Баланс выделений восстановлен. + +Отдельный отрицательный стенд собран со старой согласованной sanitizer-libutun и +headers из /tmp/utun-grant-key-sanitizers до обновления этой копии. Настоящая публикация +и расшифровка,один bind NOMEM при записи info. Reader в событии увидел ready1, +decrypting0,error0,info_bytes0,key_bytes32,autocommit1:подтверждён ложный успех. +Ожидаемый exit1,defects1,баланс выделений восстановлен,ASAN/UBSan/LSan ошибок нет. +Бинарник:/tmp/attachment-jobs-negative,исходник/.mk рядом;полный короткий лог: +/tmp/attachment-jobs-negative.log,сборка:/tmp/attachment-jobs-negative-build.log. +Рабочая копия для отрицательного запуска не менялась. Профиль native7/7 PASS: +/tmp/attachment-jobs-profile.log и /tmp/attachment-jobs-profile-logs. + +Первый расширенный sanitizer-профиль7/8 обнаружил ошибку самой фикстуры:после restart +отказ COMMIT/ROLLBACK мог попасть в фоновый hash commit db_sync вместо completion. +Лог:/tmp/attachment-jobs-asan-logs/test_chat_attachment.log. Транзакции completion +помечены SQL-комментарием назначения,инъекции привязаны к ним;commit veto также +относится только к нужному callback. Повторный итоговый профиль16/16 PASS ниже. + +Удаление канала — 27.10.2026, runtimecd6ca238/6a6f8db2/c3ac2059 + +До исправления chat_core_delete_channel удалял ключи,plaintext и ciphertext раньше +метаданных канала. Постоянная регрессия с настоящим BEFORE DELETE channels ABORT +показала reader_keys2 вместо3,plaintext_bytes-1,event0 при сохранённом канале. +Ожидаемый assert:/tmp/attachment-delete-negative.log;это отдельный подтверждённый +дефект удаления,не падение штатного сценария. Сетевые ресурсы уже были отменены. + +Модуль устанавливает attachment_channel_delete AFTER DELETE channels:ключи,запросы +и outbox удаляются той же SQLite-транзакцией. Проверка полного каскада отклоняет +также RAISE(IGNORE),не позволяя сохранить часть локальных записей. Низкоуровневое +удаление проверяет finalize и отсутствие channels/Merkle после DELETE;savepoint +откатывает в том числе DROP TABLE. Внешняя транзакция у этого низкого API сохраняется, +но chat_core_delete_channel отклоняет её до отмены ресурсов. Неуспешный rollback +с открытой БД отключает attachment и запрашивает stop/закрытие владельцем после poll. +NULL instance не разыменовывается. Новые форматы сети не вводились,БД получила trigger. + +После commit выполняются media_index cleanup и очистка собственных канонических +decrypted/channel/UUID.file. Другие имена,подкаталоги и temp сохраняются. I/O-отказ +логируется и допускает повтор очистки;он не возвращает канал после commit. +SQL-отказ сохраняет записи и файлы,но сетевые ресурсы уже могут быть отменены — +повтор команды завершает удаление. Completion активного worker сам убирает свой +результат,увидев отсутствие строки. Утверждение об общей транзакции ФС/БД не вводится. + +test_chat_attachment:14 отказов — ABORT/IGNORE channels/keys/requests/outbox/Merkle +и prepare/bind/step/finalize DELETE channels. Дополнительно настоящий commit veto, +внешняя транзакция с сохранением маркера и rollback fault с остановкой/закрытием БД. +Reader на отказе видит точные key/info/type/request/state/created/command/retry и +историю/производный Merkle namespace. Файлы сохраняются. В единственном событии +CHANNEL_DELETED reader уже видит отсутствие всех шести объектов. Соседние ключи +сохраняются,повтор успешен,баланс выделений восстановлен. Native профиль9/9 PASS: +/tmp/attachment-delete-profile.log,/tmp/attachment-delete-profile-logs. + +Общая проверка последующих исправлений — HEAD618f6ca0 + +./build.sh --no-gui PASS;./check.sh212/212 PASS,0 skipped,proxy9/9,burst1/1,load8/8, +134217728байт,177с. Изолированный netns с IPv6 loopback,настройки хоста не менялись. +ASAN/UBSan/LSan16/16 PASS,detect_leaks=1,halt_on_error=1;core/libuasync/Opus +согласованно инструментированы в отдельной копии. Профиль:requests/decisions/results/ +chat_attachment/encrypted_attachment/attachment_send/chat_admin/services/instance_contract/ +media_primitives/db_sync/db_sync_integrity/db_sync_schema/chat_feedback/dm_history/android_replies. +Desktop vibechat и Android assembleDebug PASS;GUI/Android host11/11 PASS,включая6 +вариантов audio lifecycle с core stop/restart. Логи и полные каталоги: +/tmp/chat-attachment-followup-{build,full-check,asan-results,desktop-build,android-build,gui-results}.log, +/tmp/chat-attachment-followup-full-logs,/tmp/chat-attachment-followup-asan-logs. + +Три задачи закрыты. Полный аудит chat/attachment остаётся частичным:привязка +message_id/hash,наблюдение manifest,запрос загрузки,очередь отправки и восстановление +требуют оставшейся сверки. Внешний checklist сохраняет[~],отчёты туда не добавляются. diff --git a/doc/tasks.md b/doc/tasks.md index b1c94d3f..7483e72c 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,6 +4,37 @@ ## Текущие задачи +[+] **chat_attachment: исходящий REQUEST и outbox фиксируются вместе до уведомления/отправки** — 27.10.2026. + Собственная транзакция повторно проверяет состояние файла,создаёт ровно один запрос и очередь. + Внешняя транзакция откладывает весь tick;неудачный rollback не перезапускает таймер после quiesce/stop. + test_attachment_requests:52 SQL-отказа/повтора с пустой/существующей очередью,ABORT/IGNORE,commit veto, + внешняя транзакция до создания/отправки,readonly reader перед событием/REQUEST,реальный restart + при отсутствии маршрута/backpressure/send failure с сохранением даты. Старый код ожидаемо FAIL новой регрессии. + Общая проверка ниже:212/212 native,16/16 sanitizers,11/11 GUI/Android host,desktop/APK build PASS. + Отчёт:[chat_audit_findings.txt](chat_audit_findings.txt),«Исходящий REQUEST»;/tmp/attachment-outgoing-*. + +[+] **chat_attachment: захват расшифровки до worker и владение completion до commit результата** — 27.10.2026. + decrypting=1 фиксируется собственной проверенной транзакцией;completion отличает SQL-отказ от удаления. + Готовая задача остаётся у модуля до commit;таймер повторяет только SQL,ключ/файл не теряются и второй worker не создаётся. + Лимит16 включает workers/завершения;quiesce останавливает повторы,destroy после workers освобождает остаток. + test_chat_attachment:9 отказов claim,15 успешного результата,8 записи ошибки worker,ABORT/IGNORE/veto, + внешняя транзакция,delete/stop/restart,rollback failure и16 задержанных авторских задач с сохранением17-го source. + Старый sanitizer-runtime подтвердил ready1/infoNULL после bind NOMEM;новый профиль и баланс выделений PASS. + Общая проверка:check.sh212/212,0 skipped,proxy9/9,burst1/1,load8/8,177с; + ASAN/UBSan/LSan16/16 detect_leaks=1,desktop/APK build,GUI/Android host11/11 PASS. + Отчёт:[chat_audit_findings.txt](chat_audit_findings.txt),«Завершение файлов»;/tmp/attachment-jobs-*. + +[+] **chat: удалять attachment-записи атомарно с каналом,файлы — после commit** — 27.10.2026. + SQLite-trigger каскадно удаляет ключи/запросы/outbox и проверяет полный результат;topo deletion проверяет finalize + и отсутствие канала/Merkle-хешей. Ошибка SQL сохраняет данные/файлы;внешняя транзакция запрещена до отмены ресурсов. + Файлы удаляются после commit,незавершённый rollback требует stop/закрытия владельцем;NULL instance безопасен. + test_chat_attachment:14 отказов с точным readonly-снимком,ABORT/IGNORE всех таблиц и Merkle,commit veto, + внешняя транзакция и rollback fault;до фикса подтверждены reader_keys2 вместо3 и потерянный plaintext при живом канале. + Native build/check.sh212/212 PASS,proxy9/9,burst1/1,load8/8 (134217728байт),177с; + ASAN/UBSan/LSan16/16 detect_leaks=1,GUI/Android host11/11,desktop/APK build PASS. + Логи:/tmp/chat-attachment-followup-{build,full-check,asan-results,desktop-build,android-build,gui-results}.log. + Отчёт:[chat_audit_findings.txt](chat_audit_findings.txt),«Удаление канала»;полный аудит chat/attachment остаётся[~]. + [+] **chat_attachment: подтверждать входящий REQUEST после собственного commit** — исправлено27.10.2026. Собственная BEGIN IMMEDIATE/COMMIT включает identity,права,чтение/создание запроса и повтор прежнего ответа. Внешняя транзакция отклоняется без изменений;дубликаты incoming1/state0,2,3,4 сохраняют решение и created_at.