diff --git a/doc/chat_audit_findings.txt b/doc/chat_audit_findings.txt index 7fe5045d..f76eb7a3 100644 --- a/doc/chat_audit_findings.txt +++ b/doc/chat_audit_findings.txt @@ -17,6 +17,7 @@ Chat: исправление приглашений и проверка конт По согласованному плану этот дефект исправлен;итоговые контракты и проверки — в разделе исправления chat_attachment ниже. Продолжение от030336ea:в приёме GRANT подтверждён отдельный дефект — RESULT_ACK при key=NULL; описание настоящего сетевого обмена,контролей и остановки аудита приведено в конце отчёта. +По поручению пользователя приём GRANT исправлен;до Pull native/sanitizer-профили прошли,интеграция описывается ниже. Реализация @@ -558,3 +559,53 @@ ACK и уведомление допустимы после подтверждё исправление авторской подготовки сохранено. chat_attachment.h и encrypted_attachments.md остаются[~] в чеклисте,прочие отметки не менялись. По AGENTS.md:10 аудит остановлен на подтверждённой несогласованности;новая задача открыта. Коммиты локальные,push не выполнялся. + +Исправление приёма GRANT — 26.10.2026, до Pull + +ak_apply_result выполняет собственный BEGIN IMMEDIATE/COMMIT для четырёх ответов: +REQUEST_ACK/GRANT/DENY/RESULT_ACK. Проверяются prepare,каждый bind,step,ожидаемые числа строк, +finalize и commit. Исходные request.state/incoming и команда outbox читаются вместе; +ключ и состояние требуют одну изменённую строку. DELETE требует одну строку только если +ожидаемая команда существовала:предыдущий REQUEST_ACK или дубликат может уже удалить её. +Это позволяет обнаружить RAISE(IGNORE) для DELETE,сохраняя штатную идемпотентность. +Состояния и конфликты прежнего ключа/решения проверяются до записи;поздний REQUEST_ACK +сохраняет уже применённое решение. Ответы внутри внешней транзакции отклоняются без её изменения. + +ACK и уведомление остаются в вызывающем обработчике и выполняются только после commit. +На отказе вся операция откатывается. Общая локальная ak_rollback используется также авторской +подготовкой:если транзакция осталась открыта,модуль quiesce и utun_instance_stop запрашивают +освобождение владельцем после poll. RELEASE после неудачного rollback больше не может +зафиксировать частичное применение ответа. REQUEST/decide/delete/recovery этим не закрываются. +Канальный wire,схема ключей и политика SQLite WAL/NORMAL не менялись. + +Постоянный Linux test_attachment_results проверяет105 SQL-отказов и столько же повторов +для четырёх ответов. Это обработчик после router с настоящими core/SQLite и подменой только +доставки ACK:криптографию проверяет отдельный сетевой тест. Все read/key/state/outbox +prepare/bind/step/finalize/changes,BEGIN и COMMIT покрыты точечными wrappers. +В ACK и событии отдельное readonly-соединение проверяет точные committed key/state/outbox; +на отказе нет ACK/события,прежние поля и соседняя запись сохранены. Дополнительно: +настоящий commit hook veto,ABORT/IGNORE для key/state/outbox,внешняя транзакция, +backpressure,повторы GRANT/DENY/ACK,поздний REQUEST_ACK,конфликт ключа/решения, +неудачный rollback с quiesce/stop и закрытием БД владельцем. Баланс u_malloc восстановлен. + +Штатный test_encrypted_attachment расширен одним отказом bind первого настоящего GRANT: +снимок до записи совпадает после rollback,ACK=0,автор сохраняет GRANT для повтора. +После реального повтора ключ виден readonly-соединению до отправки ACK,файл расшифровывается; +restart/дубликат/очистка/отказ второму участнику проходят прежний сценарий до phase10. +Сетевые отправки wrapper наблюдает и передаёт настоящему router без изменений. + +До Pull native build PASS;профиль attachment_results,chat_attachment,encrypted_attachment, +attachment_send,chat_admin,services,instance_contract,media_primitives —8/8 PASS. +Тот же профиль ASAN/UBSan/LSan8/8 PASS,detect_leaks=1,halt_on_error=1. +Отдельная копия /tmp/utun-grant-key-sanitizers:core/libuasync/Opus инструментированы согласованно, +sanitizer-настройки Opus унаследованы только в копии. Логи /tmp/grant-key-fix-{build,native-results, +asan-build,asan-tests-build,asan-results}.log;полные /tmp/grant-key-fix-{native,asan}-logs. +Исходный диагностический стенд переведён на ожидание rollback без ACK и последующего повтора; +неизменённая старая сетевая фикстура сохранена в /tmp/grant-key-fixture-baseline.c. +Теперь bind-сценарий phase10/PASS,exit0,одна инъекция и два ACK с32 сохранёнными байтами. +Лог /tmp/grant-key-fix-original.log,подробный /tmp/utun_encrypted_attachment_eiewV8/test.log. + +Задача исправления закрыта;заголовок и encrypted_attachments.md согласованы. +Отметки attachment/chat остаются[~],полный аудит не возобновляется. По просьбе пользователя +после завершения этой правки выполняется Pull с сохранением входящих доработок чата. +Последующие результаты интеграции и общего прогона будут приведены отдельным разделом. diff --git a/doc/service_lifecycle.md b/doc/service_lifecycle.md index 4706d9e8..5af5f1f8 100644 --- a/doc/service_lifecycle.md +++ b/doc/service_lifecycle.md @@ -37,7 +37,7 @@ Desktop и Android проверяют `instance->running` вместе со св включая Android-цикл после restart. Запрос из callback завершает цикл после возврата из текущего poll; уже начатая обработка остальных callbacks этого poll не прерывается. Владелец затем снимает media-привязки, уничтожает ядро и освобождает uasync. -Это используется также при отказе rollback авторской подготовки вложения, если SQL-транзакция +Это используется также при отказе rollback авторской подготовки вложения или применения ответа о ключе, если SQL-транзакция осталась открыта: модуль вложений предварительно прекращает приём и снимает свой таймер/router. Create уже подготавливает listeners, топологию/SQLite, router/proxy и мониторинг; diff --git a/doc/tasks.md b/doc/tasks.md index 8df1a70c..04b114dd 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,16 +4,17 @@ ## Текущие задачи -[ ] **chat_attachment: не подтверждать GRANT без сохранённого ключа получателя** — подтверждено26.10.2026. - ak_receive игнорирует bind ключа в UPDATE. Один SQLITE_NOMEM оставляет key=NULL,но фиксирует state=2, - отправляет настоящий RESULT_ACK;автор получает его,фиксирует state=4 и удаляет GRANT из outbox. - Проверено на настоящем подписанном/зашифрованном обмене собственных A/S/B/C и readonly SQLite. - Без отказа phase10 PASS;bind-fault ожидаемо exit1 после доказательства ложного ACK; - UPDATE ABORT:нет ACK,state=1,GRANT остаётся у автора,штатный повтор затем phase10 PASS. - Нужна проверенная атомарная операция key+state+outbox с commit до ACK и корректным rollback/fault/retry. - Стенд /tmp/attachment-grant-audit.c/.mk;логи /tmp/attachment-grant-audit-{control,bind,trigger}.log - и test.log в каталогах артефактов;точные пути/контракты — в [chat_audit_findings.txt](chat_audit_findings.txt),аудит приёма GRANT. - По AGENTS.md аудит остановлен;runtime/wire/штатные тесты не менялись,предыдущий фикс send сохранён. +[+] **chat_attachment: не подтверждать GRANT без сохранённого ключа получателя** — исправлено26.10.2026. + Ответы REQUEST_ACK/GRANT/DENY/RESULT_ACK применяются собственной проверенной транзакцией key+state+outbox. + Проверяются все SQL-этапы и ожидаемые числа строк;ACK/событие — после commit,внешняя транзакция отклоняется. + Полный rollback сохраняет прежний ключ/запрос/очередь;оставшаяся открытой БД требует stop владельцем после poll. + Новый test_attachment_results:105 отказов/повторов четырёх ответов,readonly-снимки в ACK/событии, + commit veto,ABORT/IGNORE,внешняя транзакция,дубликаты/конфликты/backpressure и rollback fault. + Штатный сетевой test_encrypted_attachment дополнен bind-fault→без ACK→повтор GRANT→расшифровка. + До Pull native8/8 и ASAN/UBSan/LSan8/8 PASS,detect_leaks=1;исходный сетевой стенд теперь phase10 PASS. + Итоги интеграции с доработками редактирования чата и полный прогон приводятся отдельно в + [chat_audit_findings.txt](chat_audit_findings.txt),исправление приёма GRANT;/tmp/grant-key-fix-*.log. + Полный аудит attachment/chat остаётся частичным;дальнейший аудит остановлен по просьбе пользователя перед Pull. [+] **chat_attachment: проверять сохранение ключа до передачи source и запуска worker** — исправлено26.10.2026. Авторская подготовка фиксируется собственной BEGIN IMMEDIATE/COMMIT до передачи source и запуска worker.