diff --git a/doc/tasks.md b/doc/tasks.md index 5a8c38a4..56313627 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -95,27 +95,32 @@ Добавить диагностику длины/результатов I/O и при подтверждении публиковать файл атомарно после закрытия. Критерии JOIN не ослаблять. Логи /tmp/dm-load-fix-{full-check-first,join-first,join-repeat}.log; production JOIN и штатный test_chat_join_e2e в исправлении DM не менялись. -[ ] **db_sync: отказ проверки/битый дубликат удаляют корректную сохранённую историю** — обнаружено 26.10.2026. - db_verify_author_sig объединяет отсутствие ключа, BAD_FORMAT, AUTH_FAILED и CRYPTO в -1; - db_record_insert при любом отказе DELETE по timestamp/signature до проверки дубликата. - Публичные API, настоящий core/chat_service и две SQLite :memory: таблицы: - нормальный повтор ret1/строк1; VerifyInit=0 ret-2/строк0 при исходной корректной подписи. - Испорченная входящая копия также стирает корректную строку с тем же ключом; другой канал цел. - Удаление самих сохранённых данных с неверной подписью или битым форматом4001 — положительные контроли PASS. - Контракт пользователя: DELETE при доказанной неверной подписи/формате проверенной строки; - ошибки операций/недостающий ключ не удаляют, неверная входящая копия не доказывает порчу сохранённой. - Нужны раздельные результаты проверки и проверка удаляемых байтов во вставке/выдаче с корректным recalc. - Стенд /tmp/db-sync-audit-verify-failure.c/.mk; build PASS, лог /tmp/db-sync-audit-verify-failure.log,exit2: - 2/2 FAIL сохранения, положительные контроли удаления PASS, tracked allocations восстановлены. - Runtime не менялся; аудит остановлен по AGENTS.md:10. STUN исключён пользователем из работы. - Подробности: [member_merkle_audit_findings.txt](member_merkle_audit_findings.txt), раздел10. -[ ] **db_sync: UPDATE счётчика доставки использует отсутствующую колонку author** — найдено при том же аудите. - si_delivery_update читает node_id, но обновляет по author; новая схема содержит только node_id. - Подготовка EXPLAIN UPDATE на реальной таблице стенда: SQLITE_ERROR/no such column: author. - delivered_peers/delivery_chain этой ветвью не обновляются; prepare-ошибка молча пропускается. - Требуются согласование ключа записи с INSERT/ACK и диагностика SQL-отказов; сетевой PUSH/ACK не запускался. - Подробности: [member_merkle_audit_findings.txt](member_merkle_audit_findings.txt), раздел10. +[ ] **db_sync: финальная сверка принимает разные хеши при равном count** — замечено при исправлении26.10.2026. + db_handle_sync_done явно выставляет synced и вызывает done даже при chain_hash mismatch. + Нужно определить корректный повтор/поиск расхождения, проверить старые пакеты после reset; + wire не содержит ID раунда. Отдельно остаётся аудит TTL (единицы времени и recalc) и callbacks. + Нового runtime-воспроизведения этих случаев нет; текущие исправления удаления/доставки ниже завершены. + Расширение остановлено по AGENTS.md; [member_merkle_audit_findings.txt](member_merkle_audit_findings.txt), раздел11. + +[+] **db_sync: отказ проверки/битый дубликат удаляли корректную историю** — исправлено26.10.2026 после rebase на03b05094. + VALID/BAD_SIGNATURE/BAD_FORMAT/DEFERRED/ERROR разделены; перед DELETE проверяется сама сохранённая копия. + SQL/OpenSSL/NOMEM/неизвестный ключ сохраняют данные; доказанная порча удаляется в транзакции. + Recalc сохраняет pending при отказах; после COMMIT удаления сбрасываются позиции пиров и цепочка строится с0. + Прежний стенд сохранения2/2 PASS; новый test_db_sync_integrity:10 введённых отказов, реальные SQL-триггеры, + формат0/1/63/65/255/4001, два канала, откат удаления/COMMIT/next_id, несколько батчей, allocations восстановлены. + check.sh203/203 PASS,0 failed/0 skipped; proxy9/9,burst1/1,load8/8,exit0,195с. + STUN по новому запросу пользователя PASS отдельно и в общем наборе; прежний bind assert не воспроизведён, + первый падающий коммит/причина не установлены. ASAN/UBSan/LSan8/8 PASS с detect_leaks=1. + Логи /tmp/db-sync-full-final-check.log, /tmp/db-sync-integrity-final.log, /tmp/db-sync-asan-results.log. + Подробности: [member_merkle_audit_findings.txt](member_merkle_audit_findings.txt), раздел11. + +[+] **db_sync: неверный SQL и неоднозначная идентичность ACK доставки** — исправлено26.10.2026. + ACK_PUSH содержит message_id[32]; один идемпотентный UPDATE адресует только конкретную запись. + Счётчик отражает ACK, а не очередь отправки; WAS_SENT — только для локального автора. Все SQL-отказы логируются. + Две записи одного автора с одним timestamp проверены отдельно и через настоящие PUSH/ACK; + повтор ACK не увеличивает счётчик. Общий и sanitizer прогоны выше PASS, совместимость старого wire не нужна. + Подробности: [member_merkle_audit_findings.txt](member_merkle_audit_findings.txt), раздел11. [+] **feedback: исключение и отложенное удостоверение не блокируют запуск чата** — исправлено 26.10.2026. Исключённые/ожидающие авторы скрываются из результатов, Merkle и выдачи; записи, ver и отмены сохраняются. diff --git a/src/chat/db_sync_arch.md b/src/chat/db_sync_arch.md index 922922d6..1b8e13aa 100644 --- a/src/chat/db_sync_arch.md +++ b/src/chat/db_sync_arch.md @@ -347,12 +347,12 @@ tp=10 → entry[0]: pos=9 (tp - 1) - `id` — идентификатор записи (uint64, host byte order) - `ts` — timestamp в мс (uint64, host byte order) - `author` — node_id автора (uint64, host byte order) -- `dlen` — длина JSON-данных (uint32, network byte order) +- `dlen` — длина данных от1 до4000 байт (uint32, host byte order) - `data` — JSON-данные (dlen байт) - `sig_len` — длина подписи, всегда 64 (uint8) - `sig` — Ed25519-подпись: `Ed25519(ts[8] || data[dlen])`, 64 байта -**Note:** поля `id`, `ts`, `author` в host byte order (LE на x86), а `dlen` в network byte order (BE). +**Note:** поля `id`, `ts`, `author`, `dlen` в host byte order (LE на x86). ### 3.6 DB_MSG_PUSH (0x05) @@ -363,10 +363,10 @@ tp=10 → entry[0]: pos=9 (tp - 1) ``` ┌──────┬───────┬───────┬──────────┬──────────┬────────────┬──────────┬──────────┐ -│ 0x05 │ id(8) │ ts(8) │ author(8)│ dlen(4BE)│ data(dlen) │ sig_len │ sig(64) │ +│ 0x05 │ id(8) │ ts(8) │ author(8)│ dlen(4) │ data(dlen) │ sig_len │ sig(64) │ │ │ │ │ │ │ │ =64 (1) │ │ └──────┴───────┴───────┴──────────┴──────────┴────────────┴──────────┴──────────┘ - минимальный размер: 29 + 1 + 64 = 94 bytes (при dlen=0) + минимальный размер: 1 + 28 + 1 + 1 + 64 = 95 bytes (при dlen=1) ``` ### 3.7 DB_MSG_ACK_PUSH (0x06)