From 795f930dd69ff860be8aa8f925b9cdeae5e7d5b5 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 27 Oct 2026 03:22:19 +0100 Subject: [PATCH] Record attachment index recovery and immutable settings verification --- doc/chat_audit_findings.txt | 83 +++++++++++++++++++++++++++++++++++++ doc/tasks.md | 16 +++++++ 2 files changed, 99 insertions(+) diff --git a/doc/chat_audit_findings.txt b/doc/chat_audit_findings.txt index b0b6c2c20..3575e4ceb 100644 --- a/doc/chat_audit_findings.txt +++ b/doc/chat_audit_findings.txt @@ -1032,3 +1032,86 @@ Desktop vibechat и Android assembleDebug PASS;GUI/Android host11/11 PASS,вкл Три задачи закрыты. Полный аудит chat/attachment остаётся частичным:привязка message_id/hash,наблюдение manifest,запрос загрузки,очередь отправки и восстановление требуют оставшейся сверки. Внешний checklist сохраняет[~],отчёты туда не добавляются. + +Идентичность и восстановление локального индекса — 27.10.2026,продолжение от6803369a + +Авторская привязка message_id/hash теперь неизменяема:собственная транзакция, +проверенные7bind/step/changes/finalize/commit,точный повтор разрешён. Подтверждённый +старый bind NOMEM возвращал ложный0:/tmp/attachment-binding-negative.log. +UUID-префикс принимает только канонический base64url;15 aliases завершающих битов, +ошибки padding и NULL отвергаются с сохранением выходного массива. + +Observe собственной транзакцией сверяет полную идентичность channel/UUID/message/ +author/hash. Точный дубликат не перезаписывает ключ,метаданные и состояние. Отказы +SQL/OOM возвращают-1 для повтора,неверный manifest/коллизия — -2 без повтора. +Wanted атомарно сохраняет намерение/сброс ошибки и ready отсутствующего cache; +downloaded сохраняет наличие и policy wanted. Новая проверенная передача очищает +ошибку,обнаружение прежнего cache сохраняет её;неизменный повтор не посылает событие. +Все эти операции отклоняют внешнюю транзакцию и уведомляют только после commit. + +Отказ производного индекса не отменяет MSG_RECEIVED уже сохранённой истории. +Backfill перечитывает подписанные сообщения,отделяет текущий batch перед работой, +повторяет SQL-ошибки через2с. Лимит16 каналов и полный scan при переполнении проверены +17 настоящими каналами. Startup включён до первичного backfill;manual download +восстанавливает индекс перед wanted. История не содержит и не восстанавливает ключ. +Настоящий сетевой A/S/B/C сценарий проверяет отказ первого observe наB,событие при +reader_history1/index0 и восстановленную точную запись перед первым REQUEST. + +Предположение об усечении достижимого manual manifest на4096байтах было неверным: +db_sync ограничивает весь подписанный JSON4000байтами. Лишнее динамическое выделение +убрано;обработчики используют DB_SYNC_MESSAGE_MAX. Постоянный тест передаёт3845байт +тела с23 настоящими подписанными блоками до порта загрузки;превышение общего лимита +отклоняется до публикации с точным сообщением. Диагностика повторной активной +передачи относится к media и явно сохраняет существующую задачу. + +Outbox отдельно фиксирует retry_at=now+5 до сети,проверяя чтение,команду и одну +обновлённую строку. Tick10с,до16 команд.12 инъекций,ABORT/IGNORE/veto и rollback +проверяют отсутствие отправки до commit,точную прежнюю дату и успешный повтор. +Idle scan освобождает транзакцию через ROLLBACK,не вызывает commit hook. +Первый профиль6/7 выявил лишний idle commit при настоящем veto;исправлен runtime, +исходное ожидание теста сохранено. Итог7/7:/tmp/attachment-pump-idle-profile.log. + +Recovery при открытой транзакции теперь откладывается до её завершения:непроверенное +удаление истории не даёт права удалять опубликованные файлы. Init также отклоняет +внешнюю транзакцию до изменения таблиц/таймера/router. Постоянная регрессия удаляет +историю внутри BEGIN,проверяет прежние файлы/readonly record и открытую транзакцию +после destroy,затем rollback/restart сохраняют тот же снимок. +Первые два запуска этой новой фикстуры остановились ДО операции из-за моей ошибки +sizeof(content)-1 вместо фактически записанных sizeof(content);это не отрицательные +доказательства runtime-дефекта. Фикстура исправлена,итог PASS: +/tmp/attachment-recovery-fixed.log. Подтверждение исходного риска здесь основано на +чтении recovery,а не на этих падениях фикстуры. + +Дополнены test_chat_attachment:13 SQL-отказов binding,25 observe,60 wanted/downloaded, +полные readonly-снимки до событий,ABORT/IGNORE/veto/rollback/foreign transaction, +recovery/startup/17-channel overflow/manual manifest. test_attachment_requests +сохраняет прежние247 входящих и52 исходящих инъекции,добавляет12 outbox. + +Настройки и локальные события — 27.10.2026 + +chat_setting_get_state писал в const state через общий int_buf и затирал предыдущее +числовое представление при следующем getter. Теперь int_text хранится по индексу, +обновляется только setter;чтение не меняет ни байта и не выделяет память. NULL-имя +безопасно,integer getter для строкового типа возвращает def. Валидация выполняется +до lazy init,ошибка не меняет нулевое/заполненное состояние. Пустой путь разрешён. +Сохранение state отделено от runtime apply;пустой общий apply удалён. LAN failure +возвращает-3,желание сохранено,идентичный повтор повторяет apply. Контракт уточнён +в chat_setting.h;существующие потребители читают настройки при обращении/старте. +test_chat_setting:const snapshot,ссылки двух чисел,копирование состояния,NULL/type +defaults,ошибки/переполнение,255байт/очистка пути,отказ LAN и повтор. Native PASS, +ASAN/UBSan/LSan PASS. Это дополнительная штатная цель,общее число стало213. + +chat_local.c полностью сверен с header:доставка ссылки не запускает JOIN,permissions +проверяются в callback,nonce/подпись обновляют адреса только offline-узла во всех +группах,desktop/mobile lifecycle uasync. Уточнены lifetime/события/apply в header. +chat_event дополнил отсутствовавшие диагностические имена48–54/58/60/65–67 и fallback +для незанятого ID;preparation отвергает NULL target/UUID,header уточняет dm: prefix +и запрет дампа LOCAL_INVITE. Полная сверка всех event payload ещё продолжается. + +Проверки этого блока до общей проверки: +Native7/7:/tmp/attachment-pump-idle-profile.log;settings/attachment2/2: +/tmp/chat-settings-profile.log. ASAN/UBSan/LSan17/17,detect_leaks=1,halt_on_error=1: +/tmp/chat-index-recovery-asan-results.log,/tmp/chat-index-recovery-asan-logs; +изолированная согласованная копия на40ae7827. Последующая правка имён событий0995a1ea +в этот sanitizer-профиль не входит. Полный check/desktop/Android запущены отдельно, +их результат не подразумевается этим промежуточным отчётом. Аудит остальных chat/ продолжается. diff --git a/doc/tasks.md b/doc/tasks.md index 7483e72cf..68bf3d14b 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,6 +4,22 @@ ## Текущие задачи +[+] **chat_attachment: неизменяемая привязка, атомарный локальный индекс и восстановление из подписанной истории** — 27.10.2026. + bind проверяет собственный commit и запрещает замену message_id/hash; observe сохраняет прежний ключ/флаги точного дубликата. + wanted/downloaded обновляются своей транзакцией, события идут после commit; повторное обнаружение cache не сбрасывает error. + Отказ производного индекса не скрывает сохранённое сообщение: backfill восстанавливает запись, включая startup/manual download; + очередь16 каналов имеет полный scan при переполнении. Ключ из истории не восстанавливается. + Outbox фиксирует retry_at до сети; idle scan не вызывает commit hook. Recovery при открытой транзакции сохраняет файлы. + Native профиль7/7 и последующие settings/attachment2/2 PASS;ASAN/UBSan/LSan17/17 PASS,detect_leaks=1. + Подробности:[chat_audit_findings.txt](chat_audit_findings.txt),«Идентичность и восстановление локального индекса». + +[+] **chat_setting: чтение const без изменения буфера, атомарный отказ валидации и повтор применения LAN** — 27.10.2026. + Числовые строки хранятся отдельно по настройке и обновляются setter; NULL/строковый тип дают default. + Неудачный set не инициализирует/не меняет state;пути можно очистить. Ошибка apply LAN возвращает -3, + сохраняя желаемое значение;идентичный повтор повторяет применение. Удалён пустой общий apply. + Новый test_chat_setting проверяет неизменность всех байтов,независимые копии,границы/ошибки и apply retry; + native и ASAN/UBSan/LSan PASS. Общая проверка новых изменений записывается отдельным итогом аудита. + [+] **chat_attachment: исходящий REQUEST и outbox фиксируются вместе до уведомления/отправки** — 27.10.2026. Собственная транзакция повторно проверяет состояние файла,создаёт ровно один запрос и очередь. Внешняя транзакция откладывает весь tick;неудачный rollback не перезапускает таймер после quiesce/stop.