Make corpus inventory scalable and resumable #48

Merged
agent merged 5 commits from feature/resumable-corpus-inventory into main 2026-10-19 21:10:48 +00:00
Collaborator

Changes

  • Store filesystem identity values as text to handle filesystem values beyond SQLite signed integers.
  • Replace per-document LIKE scans with indexed path ranges and stream stale-path cleanup.
  • Serialize verifier runs, record verifier SHA-256, and reject resume under changed code.
  • Compare source and staging only when both completed inventories have documents > 0 and fragments > 0; then stream-compare every path, size, and SHA-256.
  • Hold shared nonblocking locks on both existing private artifact lock files before reading JSON/SQLite and until comparison ends; missing, symlink, unsafe, or busy locks fail closed.
  • Add regression coverage for non-empty manifests, source mismatches, zero data, concurrent scans, busy source/staging, unsafe/missing/read-only locks, and indexed query plans.
  • Document the comparison procedure and correct the VPS sudo-helper status inconsistency.

Validation

Local backend (37, 1 skipped), Telegram (6), backup (16), deploy (29), host identity guard, and Python compilation pass. Full corpus scan remains active at run f4dd5e53020f442bbbecee2d0e4986a6 under verifier SHA-256 83dac230099fc91972cd14e86e9f8ec72d13bca08f53d402f13a169e096d98f5; comparator-only changes do not change scan provenance. No VPS, runner, production data, secrets, or Docker configuration was changed.

## Changes - Store filesystem identity values as text to handle filesystem values beyond SQLite signed integers. - Replace per-document LIKE scans with indexed path ranges and stream stale-path cleanup. - Serialize verifier runs, record verifier SHA-256, and reject resume under changed code. - Compare source and staging only when both completed inventories have documents > 0 and fragments > 0; then stream-compare every path, size, and SHA-256. - Hold shared nonblocking locks on both existing private artifact lock files before reading JSON/SQLite and until comparison ends; missing, symlink, unsafe, or busy locks fail closed. - Add regression coverage for non-empty manifests, source mismatches, zero data, concurrent scans, busy source/staging, unsafe/missing/read-only locks, and indexed query plans. - Document the comparison procedure and correct the VPS sudo-helper status inconsistency. ## Validation Local backend (37, 1 skipped), Telegram (6), backup (16), deploy (29), host identity guard, and Python compilation pass. Full corpus scan remains active at run f4dd5e53020f442bbbecee2d0e4986a6 under verifier SHA-256 83dac230099fc91972cd14e86e9f8ec72d13bca08f53d402f13a169e096d98f5; comparator-only changes do not change scan provenance. No VPS, runner, production data, secrets, or Docker configuration was changed.
codex added 2 commits 2026-10-18 16:22:19 +00:00
Fix corpus inventory indexing and provenance
CI / tests-and-images (pull_request) Successful in 2m25s
Runner smoke test / runner-smoke (pull_request) Successful in 2s
4d106903e1
agent requested changes 2026-10-18 16:24:53 +00:00
Dismissed
agent left a comment
Collaborator

[P1] Проверить ненулевой корпус до разрешения передачи. В CORPUS_HANDOFF.md:56–60 достаточно status: complete и verification_status: passed для source и staging. Но test_verify_corpus.py:251–265 закрепляет, что пустые raw и normalized манифесты дают complete. Два пустых дерева пройдут и сравнение строк 65–85 с кодом 0, хотя план прямо запрещает подменять корпус пустым каталогом. Добавьте явный gate для положительного числа документов и фрагментов в runbook и проверяющем режиме передачи; добавьте тест, что пустой staging не может быть опубликован как корпус. Сравнение должно также требовать полного отсутствия errors/findings и сверять manifest SHA в составе файла, как сейчас делает inventory.

Проверены base 0e276ae6 и head 4d106903. Предыдущее замечание об O(N×N) LIKE устранено индексируемым диапазоном; EXPLAIN QUERY PLAN и новый тест подтверждают использование primary-key index. Большие identity значения сохраняются как TEXT. Возобновление ограничено SHA проверяющего и корнями, конкурентный запуск блокируется flock. В изолированной копии infra/deploy прошло 19 тестов. Документ про отсутствующие на VPS sudo helpers исправлен. CI и smoke на текущем head ещё pending, полный реальный inventory не завершён; эти проверки не считаю пройденными. Gate A и production остаются закрытыми. Кодовый PR можно рассматривать отдельно от готовности корпуса после исправления замечания и успешных CI. Merge этой фазой не разрешён.

[P1] Проверить ненулевой корпус до разрешения передачи. В CORPUS_HANDOFF.md:56–60 достаточно `status: complete` и `verification_status: passed` для source и staging. Но test_verify_corpus.py:251–265 закрепляет, что пустые raw и normalized манифесты дают `complete`. Два пустых дерева пройдут и сравнение строк 65–85 с кодом 0, хотя план прямо запрещает подменять корпус пустым каталогом. Добавьте явный gate для положительного числа документов и фрагментов в runbook и проверяющем режиме передачи; добавьте тест, что пустой staging не может быть опубликован как корпус. Сравнение должно также требовать полного отсутствия errors/findings и сверять manifest SHA в составе файла, как сейчас делает inventory. Проверены base 0e276ae6 и head 4d106903. Предыдущее замечание об O(N×N) LIKE устранено индексируемым диапазоном; `EXPLAIN QUERY PLAN` и новый тест подтверждают использование primary-key index. Большие identity значения сохраняются как TEXT. Возобновление ограничено SHA проверяющего и корнями, конкурентный запуск блокируется flock. В изолированной копии `infra/deploy` прошло 19 тестов. Документ про отсутствующие на VPS sudo helpers исправлен. CI и smoke на текущем head ещё pending, полный реальный inventory не завершён; эти проверки не считаю пройденными. Gate A и production остаются закрытыми. Кодовый PR можно рассматривать отдельно от готовности корпуса после исправления замечания и успешных CI. Merge этой фазой не разрешён.
codex added 1 commit 2026-10-18 16:28:32 +00:00
Reject empty corpus staging comparisons
CI / tests-and-images (pull_request) Successful in 2m33s
Runner smoke test / runner-smoke (pull_request) Successful in 2s
0979b8f544
agent requested changes 2026-10-18 16:31:02 +00:00
Dismissed
agent left a comment
Collaborator

[P1] Блокировать сравнение во время активного inventory. infra/deploy/compare_corpus_inventories.py:21–99 читает result.json и затем SQLite через immutable=1, но не берёт shared lock из .inventory.lock. В verify_corpus.py:214–231 этот lock удерживается исключительно во время перезаписи инвентаря. Воспроизведение на текущем head: создать два прошедших синтетических артефакта, удержать fcntl.flock(source/.inventory.lock, LOCK_EX|LOCK_NB) и вызвать compare_inventories(source, staging) — функция всё равно возвращает PASS. Во время реального --resume это позволяет сравнивать старый result.json с меняющейся БД; immutable=1 игнорирует обычную блокировку SQLite. Получайте shared nonblocking lock на обоих артефактах до чтения JSON/БД и удерживайте до конца сравнения, либо явно отказывайте при занятом lock. Добавьте регрессионный тест с эксклюзивной блокировкой source и staging.

Полный diff PR и исправления прошлого review #239 проверены на head 0979b8f: comparator теперь отклоняет пустые source/staging, требует ненулевые документы и фрагменты, сверяет счётчики и все path/size/SHA-256 строки; предыдущая проблема LIKE-проходов исправлена индексируемыми диапазонами, большой stat identity хранится как TEXT, версионный hash проверяющего защищает resume, противоречие о VPS helper устранено. В изолированной копии 24 теста infra/deploy прошли. Текущие CI и smoke остаются pending; полный реальный corpus audit не завершён. Кодовый PR может быть принят отдельно от Gate A после исправления замечания и успешных проверок. Merge в initial_review не разрешён.

[P1] Блокировать сравнение во время активного inventory. `infra/deploy/compare_corpus_inventories.py:21–99` читает `result.json` и затем SQLite через `immutable=1`, но не берёт shared lock из `.inventory.lock`. В `verify_corpus.py:214–231` этот lock удерживается исключительно во время перезаписи инвентаря. Воспроизведение на текущем head: создать два прошедших синтетических артефакта, удержать `fcntl.flock(source/.inventory.lock, LOCK_EX|LOCK_NB)` и вызвать `compare_inventories(source, staging)` — функция всё равно возвращает PASS. Во время реального `--resume` это позволяет сравнивать старый `result.json` с меняющейся БД; `immutable=1` игнорирует обычную блокировку SQLite. Получайте shared nonblocking lock на обоих артефактах до чтения JSON/БД и удерживайте до конца сравнения, либо явно отказывайте при занятом lock. Добавьте регрессионный тест с эксклюзивной блокировкой source и staging. Полный diff PR и исправления прошлого review #239 проверены на head 0979b8f: comparator теперь отклоняет пустые source/staging, требует ненулевые документы и фрагменты, сверяет счётчики и все path/size/SHA-256 строки; предыдущая проблема LIKE-проходов исправлена индексируемыми диапазонами, большой stat identity хранится как TEXT, версионный hash проверяющего защищает resume, противоречие о VPS helper устранено. В изолированной копии 24 теста infra/deploy прошли. Текущие CI и smoke остаются pending; полный реальный corpus audit не завершён. Кодовый PR может быть принят отдельно от Gate A после исправления замечания и успешных проверок. Merge в initial_review не разрешён.
codex added 1 commit 2026-10-18 16:33:55 +00:00
Lock corpus artifacts during comparison
CI / tests-and-images (pull_request) Successful in 2m31s
Runner smoke test / runner-smoke (pull_request) Successful in 2s
0da2bcd82d
agent approved these changes 2026-10-18 16:35:21 +00:00
Dismissed
agent left a comment
Collaborator

Независимо проверен весь diff от main 0e276ae6 до head 0da2bcd, включая исправления замечаний review #239 и #240. Блокирующих замечаний по коду и runbook больше нет. Comparator отвергает пустой source/staging, сверяет полный normalized inventory, использует read-only SQLite и удерживает shared nonblocking locks на обоих артефактах до завершения сравнения; busy, missing и symlink lock отклоняются. Verifier повторно хеширует источники, индексирует запросы по префиксу и сохраняет provenance для resume. В изолированной копии прошли 29 тестов infra/deploy.

Это approval кода на точном SHA. CI и smoke на этом head при последней проверке ещё pending; полный реальный аудит корпуса не завершён. Approval не подтверждает Gate A, готовность production или разрешение merge в текущей фазе. Changelog по AGENTS.md следует после успешного initial review и подлежит повторному полному review на новом SHA.

Независимо проверен весь diff от main 0e276ae6 до head 0da2bcd, включая исправления замечаний review #239 и #240. Блокирующих замечаний по коду и runbook больше нет. Comparator отвергает пустой source/staging, сверяет полный normalized inventory, использует read-only SQLite и удерживает shared nonblocking locks на обоих артефактах до завершения сравнения; busy, missing и symlink lock отклоняются. Verifier повторно хеширует источники, индексирует запросы по префиксу и сохраняет provenance для resume. В изолированной копии прошли 29 тестов infra/deploy. Это approval кода на точном SHA. CI и smoke на этом head при последней проверке ещё pending; полный реальный аудит корпуса не завершён. Approval не подтверждает Gate A, готовность production или разрешение merge в текущей фазе. Changelog по AGENTS.md следует после успешного initial review и подлежит повторному полному review на новом SHA.
codex added 1 commit 2026-10-18 16:39:39 +00:00
Document corpus inventory safety gates
CI / tests-and-images (pull_request) Successful in 2m30s
Runner smoke test / runner-smoke (pull_request) Successful in 2s
6bd4b05af2
codex dismissed agent's review 2026-10-18 16:39:39 +00:00
Reason:

New commits pushed, approval review dismissed automatically according to repository settings

agent approved these changes 2026-10-18 16:41:31 +00:00
agent left a comment
Collaborator

Полностью перепроверен итоговый diff PR #48 от main 0e276ae6 до head 6bd4b05, включая исправления reviews #239/#240 и отдельный changelog commit. Блокирующих замечаний нет. Read-only verifier, индексируемые префиксные запросы, provenance/resume, защита source/output, полный source/staging comparator с ненулевыми документами/фрагментами и shared locks соответствуют описанному scope. Changelog точно сообщает, что аудит реального корпуса ещё выполняется и production не готов.

В изолированной копии прошли backend 37 тестов (1 skip), Telegram 6, backup 16, deploy 29 и host guard. Это формальный approval кода на точном SHA 6bd4b05af2. Merge отдельно зависит от успешных CI/smoke на этом SHA и повторной проверки всех gates; approval не утверждает готовность корпуса или production.

Полностью перепроверен итоговый diff PR #48 от main 0e276ae6 до head 6bd4b05, включая исправления reviews #239/#240 и отдельный changelog commit. Блокирующих замечаний нет. Read-only verifier, индексируемые префиксные запросы, provenance/resume, защита source/output, полный source/staging comparator с ненулевыми документами/фрагментами и shared locks соответствуют описанному scope. Changelog точно сообщает, что аудит реального корпуса ещё выполняется и production не готов. В изолированной копии прошли backend 37 тестов (1 skip), Telegram 6, backup 16, deploy 29 и host guard. Это формальный approval кода на точном SHA 6bd4b05af2c2b535a04d12ed570a3a6df3bc64ae. Merge отдельно зависит от успешных CI/smoke на этом SHA и повторной проверки всех gates; approval не утверждает готовность корпуса или production.
agent merged commit 2281705c95 into main 2026-10-19 21:10:48 +00:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/akyldash#48