diff --git a/doc/chat_audit_findings.txt b/doc/chat_audit_findings.txt index 143f7f723..0159e442e 100644 --- a/doc/chat_audit_findings.txt +++ b/doc/chat_audit_findings.txt @@ -718,3 +718,72 @@ Outer:/tmp/attachment-decision-audit-outer.log, и документация;runtime,wire,схема и штатные тесты не менялись. Новые fullcheck/sanitizers/ GUI/APK не запускались. Отметки attachment/chat остаются[~],чеклист не дополнялся отчётом. По AGENTS.md:10 дальнейший аудит остановлен на подтверждённой несогласованности. + +Исправление решения автора — 27.10.2026, runtime8a7f4469 + +chat_attachment_decide проверяет аргументы/инициализацию и autocommit до обращения +к правам;внешняя транзакция отклоняется без её commit/rollback или изменения данных. +Собственная BEGIN IMMEDIATE включает проверку подписанного мембера,авторства/ключа, +переход ровно одного incoming=1/state=0 и запись GRANT/DENY в outbox. Проверяются +prepare,каждый bind,step,changes=1,finalize и COMMIT. Уже принятое решение не меняется. +ak_queue остаётся общей операцией записи с проверкой всех SQL-этапов/одной строки; +границей транзакции управляет вызывающий. ak_authorized также проверяет все bind/finalize. +Сохранены повторные проверки допуска при входящем REQUEST и перед отправкой GRANT. + +При отказе finalize закрывает statement и общий ak_rollback отменяет всю собственную +транзакцию. Если она осталась открыта,применяется прежний порядок quiesce/stop и +освобождения владельцем после poll. Ошибки содержат channel/peer/command/stage/rc; +успех логирует committed state/command и короткий message_id,секреты не выводятся. +Возврат0 и одно событие изменения следуют после commit. Trampoline при отказе +передаёт существующее событие success=0;успешное событие из decide не дублируется. +Формат сети/БД/API не менялся,SQLite synchronous остаётся установленным ядром. + +Новый Linux test_attachment_decisions использует настоящие core/SQLite и подписанного +участника:корректные join и invitation,проверка доверенного Ed25519,история создана +через chat_core_submit_message. Строка локального вложения создаётся самой фикстурой; +это проверка решения/транзакции,а реальная публикация и доставка покрываются сетевым тестом. +116 SQL-отказов/повторов:approve/deny × отсутствующая/существующая outbox ×29 точек: +BEGIN/COMMIT,member lookup prepare/bind/step/finalize,author lookup prepare/четыре bind/ +step/finalize,state и outbox prepare/четыре bind/step/finalize/changes. +Отдельный readonly reader в событии проверяет key/error/incoming/state/command/retry_at/ +created_at и независимый соседний ключ. Отказы не дают события и сохраняют точные поля. +Дополнительно настоящий commit hook veto,ABORT/IGNORE для состояния и INSERT/UPDATE +outbox,внешняя транзакция с сохранением её собственных записей,прямой вызов и trampoline, +ровно одно успешное GUI-событие,удалённый мембер,неверное направление,повтор того же +и противоположного решения,неверные аргументы. Отказ rollback оставляет прежние данные +видимыми reader,снимает router callback и останавливает ядро;закрытие БД владельцем +отменяет незавершённое решение. Баланс u_malloc восстановлен. + +Штатный test_encrypted_attachment дополнен двумя исходными сценариями автора: +RAISE(IGNORE) вставки GRANT и внешняя транзакция теперь дают-1,pending2,outbox0,event0. +После настоящего restart автора повтор решения успешен;readonly reader в событии +видит state2/GRANT1. Далее тот же тест проверяет отказ первого bind GRANT у B,полный +rollback без ACK,настоящий повтор,расшифровку,перезапуск B,дубликат,cache restore и +удаление канала до phase10 PASS. Новых подмен маршрутов/подписей/доставки не добавлено. +Первый подробный лог:/tmp/utun_encrypted_attachment_QkrW0q/test.log,строки135–176. + +Native build PASS;первичный профиль decisions/results/encrypted_attachment3/3 PASS. +Полный ./check.sh211/211 PASS,0 failed/0 skipped,proxy9/9,burst1/1,load8/8, +134217728байт,exit0,177с. Отдельный netns имеет IPv4/IPv6 loopback,сеть хоста не менялась. +Итог:/tmp/attachment-decision-fix-full-check.log,полные /tmp/attachment-decision-fix-full-logs. + +ASAN/UBSan/LSan15/15 PASS,detect_leaks=1,halt_on_error=1: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. +Копия /tmp/utun-grant-key-sanitizers содержит тот же runtime и тесты;core/libuasync/Opus +собраны согласованно с address,undefined. Настройка Opus изменена только в копии. +Первый configure был заблокирован sandbox при запуске проверочного бинарника; +повтор вне sandbox и обе сборки завершились успешно. Итоги и полные логи: +/tmp/attachment-decision-fix-asan-results.log,/tmp/attachment-decision-fix-asan-logs; +сборки:/tmp/attachment-decision-fix-asan-{build,tests-build}.log. + +Desktop vibechat и Android APK assembleDebug PASS. GUI/Android host11/11 PASS: +group_edits,dm_deletion,message_events,channel_replies,utun_node и6 сценариев +android_audio_lifecycle,включая core_stop/restart_core_stop. Логи: +/tmp/attachment-decision-fix-{build,core-build,tests-build,desktop-build,android-build, +gui-results,native-initial}.log;новая одиночная регрессия:/tmp/attachment-decision-fix-decisions.log. + +Задача закрыта;контракт .h,encrypted_attachments.md и service_lifecycle.md согласованы. +Полный аудит attachment/chat остаётся частичным:REQUEST,создание исходящего запроса, +файловые completion/delete/recovery требуют отдельной дальнейшей сверки. Отметки[~] +внешнего чеклиста сохранены,отчёт туда не добавлялся. Windows/FreeBSD не проверялись. diff --git a/doc/tasks.md b/doc/tasks.md index 098376ff4..577340e66 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,16 +4,19 @@ ## Текущие задачи -[ ] **chat_attachment: фиксировать решение автора вместе с исходящим ответом до успеха/UI** — подтверждено26.10.2026. - chat_attachment_decide использует SAVEPOINT и ak_queue без проверки числа записанных строк outbox. - Пропуск INSERT GRANT через временный RAISE(IGNORE) даёт0/событие,state2 без очереди;получатель ждёт ключ бессрочно. - Во внешней транзакции0/событие приходят до commit;последующий rollback отменяет решение и очередь. - Оба сценария подтверждены на текущей A–S–B/C-фикстуре,readonly-снимками и restart автора;allocations0->0. - Требуется собственная проверенная транзакция state+outbox,отказ внутри внешней транзакции, - prepare/bind/step/changes/finalize/commit и полный rollback;успех/событие только после commit. - Нужны постоянные регрессии обоих отказов и настоящего повтора решения с доставкой. - Отчёт:[chat_audit_findings.txt](chat_audit_findings.txt),«Аудит решения автора»;/tmp/attachment-decision-audit-*. - Runtime не изменён;аудит остановлен по AGENTS.md:10,chat_attachment и encrypted_attachments остаются[~]. +[+] **chat_attachment: фиксировать решение автора вместе с исходящим ответом до успеха/UI** — исправлено27.10.2026. + Собственная BEGIN IMMEDIATE/COMMIT включает проверку прав,state и outbox;внешняя транзакция остаётся нетронутой. + ak_queue проверяет все SQL-этапы и одну строку,транзакцией владеет вызывающий;допуск автора проверяет finalize. + Успех/одно событие — после commit,ошибка сохраняет прежние строки;открытая после rollback БД требует stop владельцем. + Trampoline сообщает только ошибку команды,не дублируя успешное обновление. Новых API/форматов нет. + test_attachment_decisions:116 отказов/повторов выдачи/отказа с пустой/существующей очередью, + настоящий commit veto,ABORT/IGNORE,внешняя транзакция,мембер/направление/повтор,GUI и rollback fault. + Readonly-снимки в событии проверяют точные committed key/state/outbox/retry/created и соседний ключ;allocations0->0. + Сетевой тест:оба отказа автора→pending без события/очереди→restart→повтор→commit→GRANT→расшифровка phase10 PASS. + Build/check.sh211/211 PASS,0 skipped,proxy9/9,burst1/1,load8/8 (134217728байт),177с. + ASAN/UBSan/LSan15/15 PASS,detect_leaks=1;desktop/APK build PASS,GUI/Android host11/11 PASS. + Отчёт:[chat_audit_findings.txt](chat_audit_findings.txt),«Исправление решения автора»;/tmp/attachment-decision-fix-*. + Полный аудит attachment/chat остаётся частичным;отметки chat_attachment и encrypted_attachments остаются[~]. [+] **chat_attachment: не подтверждать GRANT без сохранённого ключа получателя** — исправлено26.10.2026. Ответы REQUEST_ACK/GRANT/DENY/RESULT_ACK применяются собственной проверенной транзакцией key+state+outbox.