Close history integrity fixes and record remaining sync audit scope

This commit is contained in:
evgeny committed 2026-10-26 18:27:26 +01:00
1 parent 143788cdcd
commit 5ae5fd066d
2 files changed
+29 -24

No files matched your search

+25 -20
View File
@@ -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 и отмены сохраняются.
+4 -4
View File
@@ -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)