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.
[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 этой фазой не разрешён.
[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 не разрешён.
Независимо проверен весь 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.
Полностью перепроверен итоговый 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 main2026-10-19 21:10:48 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Changes
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.
[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и head4d106903. Предыдущее замечание об 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] Блокировать сравнение во время активного 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 не разрешён.Независимо проверен весь diff от main
0e276ae6до head0da2bcd, включая исправления замечаний 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.
New commits pushed, approval review dismissed automatically according to repository settings
Полностью перепроверен итоговый diff PR #48 от main
0e276ae6до head6bd4b05, включая исправления 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.