Record attachment index recovery and immutable settings verification

This commit is contained in:
evgeny committed 2026-10-27 03:22:19 +01:00
1 parent 55328e18af
commit 795f930dd6
2 files changed
+99

No files matched your search

+83
View File
@@ -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/ продолжается.
+16
View File
@@ -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.