WEB-088 · Задача · Инфраструктура · web
РОЛИ V9 NO-GO: V10-verifier ОБХОДИТСЯ — 4 bypass (raw-hash не пересчитывается, hash-only transform, неполный кейс-сет, process→stand не связан) + нет runtime budget reservation
Закрыт
P0 · горит
ведёт: backup-opus
Суть
## Вердикт ROLES-CLOSURE-V9 (независимый аудит GPT Pro, 20.08 ~23:40) = NO-GO
Пломба входа сверена аудитором: aa9665f6… (= наша). Transport PASS, SHA256SUMS 958/958, C4 replay 7/7 PASS_SCOPED, мутация 320→999 rejected, C4-проекция 32/44 (recorded only), V10 offline preflight 4/4, raw-chain 9/9, секреты 0. Historical честно NO-GO/NOT-PROVEN (не отмывали — принято как forensic snapshot).
## ⚠️ ГЛАВНОЕ (класс verifier-needs-negative-test, 6-й раз!): V10-verifier ОБХОДИТСЯ. Аудитор собрал adversarial-реплику где ОДНОВРЕМЕННО: подменены persisted raw bytes но оставлен старый responseSha256; delivered answer заменён через пару before/afterSha256; вместо подписанной батареи — один придуманный кейс; checks_passed=false; stand НЕ запускался; stand+source удалены. Verifier ДВАЖДЫ выдал PASS (cases=1, ownerSignature=VALID-OWNER-EXCLUSIVE, standBinding=SOURCE-TO-ARTIFACT-BOUND, problems=0).
## ШЕСТЬ БЛОКЕРОВ (первые 4 = verifier bypass):
1. FAIL_BLOCKING raw-byte integrity: verifier НЕ пересчитывает hash persisted raw response — доверяет записанному responseSha256.
2. FAIL_BLOCKING transform integrity: hash-only transform bypass (before/afterSha256 не проверяются против фактического контента).
3. FAIL_BLOCKING case-set completeness: принимает один кейс вместо полной подписанной батареи.
4. FAIL_BLOCKING process→stand binding: PASS при незапущенном стенде и удалённых stand+source.
5. OPEN_BLOCKING runtime budget stop: нет runtime budget reservation (кап должен резервироваться ДО, не проверяться после).
6. Owner authorization ABSENT (ожидаемо — ждёт owner-ключа).
Вторичное: .pyc инвалидирует поздние проверки; абсолютный symlink на /Volumes/M4Ext/.../node_modules; stale V8 artifacts в live paths; 2×TS2339; C4 bundle без пригодного default checkout (explicit работает).
## План волны rolesv11: закрыть 1-4 — verifier ДОЛЖЕН пересчитывать всё из сырья (raw bytes→hash, transform→контент, кейс-сет→полнота подписи, stand→живой процесс); каждый bypass = НЕГАТИВНЫЙ ТЕСТ (реплика аудитора обязана падать); + runtime budget reservation (резерв до вызова). Аудит-бандл owner прислал: sha 05a4c43f7685b21c6e27a6b912a59e06a7d08675d5ba5f57b8a009cbe328ea15 — забрать в леджер.
Связки: WEB-284? нет — роли-эпик; V8-вердикт, rolesv10 (конструкция, которую и обошли), правило verifier-needs-negative-test.
## 21.08 ~06:45 ЗАКРЫТО ПО СУЩЕСТВУ (волны rolesv11b + rolesv11c)
ВОССТАНОВЛЕНА И ПРОГНАНА САМА РЕПЛИКА АУДИТОРА (V10-COMBINED-BYPASS.json, все ПЯТЬ дефектов в одном прогоне): укреплённый verifier — rc=1, problems=15, RESULT=FAIL, НИ ОДНОЙ сертифицирующей строки; defectsCaught=5/5, каждый дефект с предметной причиной (D1 raw-байты≠responseSha256; D2 transform без байтов; D3 кейс вне подписанного набора + 2 недостающих; D4 checks_passed=false; D5 MISSING_STAND + GIT_SOURCE_INVALID + нет stand-start receipt).
ВАЖНАЯ САМОПРОВЕРКА ВОЛНЫ: первый прогон дал rc=1, но по ОДНОЙ общей причине — это признано дырой (аудитору на пять дефектов отвечали про один) и исправлено, D4/D5 доведены до отдельных причин.
ДИФФЕРЕНЦИАЛ: доаудитный baseline на той же реплике rc=0 (PASS), строка в строку как у аудитора.
ЗАКРЕПЛЕНО: реплика добавлена ПОСТОЯННЫМ регрессионным тестом (tools/test_rolesv11_hardening.py:533) — иначе фикс тихо откатился бы. Позитивный контроль P0 остаётся rc=0. Замороженная база не редактировалась (sha сходятся с ROLESV10-CONSTRUCTION.json).
ОСТАЁТСЯ: V9-AUD-006 (owner authorization) — ждёт owner-ключа; spend authority NONE.
## Трейл (21.08)
- Ветка посадки-30: `landing30` (worktree A1 /home/ubuntu/waves/wt-landing30, от serving f1e49bca), слито 6 веток / 88 файлов, проверка дубликатов ключей в словарях: 0.
- Живой статус смены: `~/Downloads/OPS-STATUS-LIVE.md` (ноутбук) + копии на M1 `~/livepush/` и M4 `/Users/milamarty/work/`.
- Паспорт проекта: https://bugs.wool2.online/passport (обновлён 21.08: serving arm64-f1e49bca, статы из свежей ветки, дельты в stats-history.json).
- Леджер ревизора: `/Volumes/M4Ext/ops/reviser-ledger/` (пакеты + аудит-бандлы, sha сверены).
- Вердикт: `ROLES-CLOSURE-V9-INDEPENDENT-AUDIT-NO-GO-20260820.zip` sha `05a4c43f…` (леджер M4Ext + ~/Downloads/ревизор/вердикты).
- Реплика аудитора: `v9audit/…/V10-COMBINED-BYPASS.json`, repro-тесты `repro/test_v10_combined_bypass.py`, `test_hash_only_transform_bypass.py`.
- Укрепление: отчёты M4 `ROLESV11-REPORT.md` (8 негативных тестов) и `ROLESV11C-REPORT.md` (реплика 5/5, дифференциал против baseline).
- Регресс закреплён: `tools/test_rolesv11_hardening.py:533`.
- Owner-ключ: `evidence/rolesv10/live/OWNER-TRUST.json` (ACTIVE, ownerExclusive, spki `cf86d782…`), публичная половина `owner-public.pem`.
- Ловушка окружения: LibreSSL не умеет Ed25519 → отдельный тикет (verifier должен требовать OpenSSL 3+).
## 21.08 ~11:15 ⭐ВЛАДЕЛЕЦ ПОДПИСАЛ — V9-AUD-006 ЗАКРЫВАЕТСЯ
Owner создал Ed25519-ключ у себя (приватная половина НИКОГДА не была у координатора), публичная зарегистрирована в OWNER-TRUST.json (spki cf86d782…). Манифест ROLES-LIVE-20260821 (44 кейса, порог 30, кап 12 USD по решению owner, срок до 23.08, модель gpt-5.4-mini, слепки стенда) подписан владельцем; координатор проверил: openssl → Signature Verified Successfully, подпись 64 байта, манифест sha fc8be023…
До этого прогнан dry-run с застабленной ТОЛЬКО подписью (preflight-dryrun/02-…log): RESULT=PASS — то есть все поля манифеста корректны и единственным недостающим звеном была подпись владельца.
ЗАПУЩЕН ЖИВОЙ ПЛАТНЫЙ ПРОГОН (волна rolesbattery): preflight stand-start → стенд → preflight battery-start → 44 кейса → укреплённый verifier на расписках. Резерв бюджета берётся ДО первого вызова (P0.5 из V11).
## 21.08 01:42 — ВТОРОЙ ПОДПИСАННЫЙ ЗАХОД: ОСТАНОВЛЕН НА СТЕНДЕ, РАСХОД $0
Прошлый блокер закрыт: подписанный `caseSet.sha256 = 8fc3974c…` — это действительно харнесс `evidence/rolesv10/live/battery-v10.mjs`, а не `cases.jsonl` эталонного прогона (`3a81ce7b…`); sha обоих файлов пересчитаны независимо.
Гейт `tools/verify_rolesv10_preflight.py` (purpose=stand-start) дал **RESULT=PASS** на настоящих байтах: releaseId=ROLES-LIVE-20260821, manifestSha256=`c91f794a…`, ownerSignatureSha256=`3a1080a9…`, sourceTree=`fcd78040…`, standTreeSha256=`25e2e198…`, signedCases=44, plannedMaxUsd=12.000000000, budgetReservationId=res-0001. Резерв записан в `BUDGET-LEDGER.json` **раньше**, чем появился `PAID-CALLS-ARMED.json` — требование «резерв до первого вызова» подтверждено фактически.
Подпись проверена независимо Homebrew OpenSSL 3.6.3 (`Signature Verified Successfully`, 64 байта) — системный LibreSSL Ed25519 не умеет.
**Шаг 2 упал**: стенд не стартует (см. отдельный P0 про materialize). Шаги 3-6 не достигнуты.
**Расход $0**, доказано вне логов: `TokenUsage` 3325 строк / 6.047956319999988 USD до и после, `count(*) WHERE createdAt > метка` = 0; `traces/` пуст, `cases/` не возник, порт 39091 свободен, `receipts/battery-preflight.json` не создан.
Резерв $12 идемпотентен по run-envelope для `releaseId=ROLES-LIVE-20260821` — повторный заход по тому же id возьмёт его же. Под новый releaseId нужен новый леджер.
**Дальше:** волна `standfix` → пересборка стенда → сухой прогон 2-3 кейсов → **третья подпись владельца**. Владельца не звать, пока сухой прогон не зелёный.
Источник: волна rolesbattery, отчёт M4 `/Users/milamarty/work/ROLESBATTERY-REPORT.md`, run-каталог `/Volumes/M4Ext/ops/paidlegs/rolesrun-20260821/` (21.08 01:42).
## 21.08 — СТЕНД ПОЧИНЕН И ДОКАЗАН ЖИВЫМ, ЖДЁТ ТРЕТЬЕЙ ПОДПИСИ ВЛАДЕЛЬЦА
Волна `standfix`, отчёт M4 `/Users/milamarty/work/STANDFIX-REPORT.md` (46 КБ), run-каталог `/Volumes/M4Ext/ops/paidlegs/rolesrun-20260821b/`.
**Итог:** 0 symlink, 0 спрятанных зависимостей, `/api/health` → HTTP 200 за **1.4 с**.
Диагноз прошлой волны подтверждён независимо и оказался **шире**: инструмент `tools/verify_stand_selfcontained.mjs` дал 21 из 31 пакета с неразрешимыми зависимостями, **1189** разорванных рёбер, из них **968** — «байты в стенде есть, а резолвер до них не достаёт», при 0 symlink. Materialize ломал резолв **на каждом уровне**: он подменял копией и вложенные symlink внутри `.pnpm`, из-за чего копия оказывалась рядом с чужими зависимостями.
**Гейт живого старта вшит в builder** — именно его отсутствие пропустило нерабочий стенд к подписи владельца в прошлый раз. Разделяющая способность проверена: сломанный V10-стенд → hidden **968**, FAIL; пересобранный → hidden **0**, PASS. 20 негативных тестов. Отдельно волна нашла и исправила **ложноположительный результат собственного резолвера** (требовал `package.json` у зависимости, что строже самого Node).
**Сухой прогон зелёный:** стенд поднялся, `login()` прошёл, 3 кейса доехали до вердиктов, трасса привязалась к кейсу — тот самый ASSERT, что валил эталонный прогон.
**Ждёт владельца:** `OWNER-RUN-MANIFEST.json` sha `6af8bb4837fb77daa5fe695d66b7e2e0f748649893bcbdf10438f382721fd21e` (доставлен на ноутбук, sha сверен). releaseId `ROLES-LIVE-20260821B` (прежний мёртв), до 24.08, кап 12 USD, 44 кейса, порог 30, caseSet = харнесс `8fc3974c…`, стенд tree `ad28e653…`, исходник `4653f470…`.
⚠️ Команда подписи из §8 отчёта содержит путь `/opt/homebrew/bin/openssl`, которого **на машине владельца нет** — отправлена исправленная (см. WEB-309).
## 22.08 00:23 UTC — offline RCA complete; exact local code fix active on M4
Report /Users/milamarty/work/ROLES-EVIDENCE-CHAIN-RCA-M4.md, SHA256 45fd5052bc61b30ee294ede1b295f3980e0866206db52ed8d4db41e4506c8704, verdict OFFLINE RCA COMPLETE. Proven blockers: (1) 12 successful paid retrieval_embedding trace rows intentionally persist response=null/responseSha256=null because llmDecisionTrace is text-only and embeddings onUsage exposes no canonical vector/provider response bytes; verifier correctly refuses missing bytes. (2) final-answer transforms structured_claims_delivery, citation_notice_reconciliation, cited_delivery_refusal are unknown/hash-only/non-continuous; first transform does not start at accepted provider bytes and receipts lack exact before/after bytes+code identity. Owner signature/paid call is NOT needed to fix. M4 Codex 5.5 high roles-evidence-receipts is live in isolated detached worktree /Volumes/M4Ext/ops/worktrees/roles-evidence-receipts-20260822 at 4653f470; local-only task: persist canonical embedding response bytes, exact transform chain and strict verifier names, with negative controls. No prod/network/DB/config/keys/sign/build/deploy/spend/commit. Fresh paid dry-run remains required only after local fix review.
## 22.08 01:37 UTC — local evidence-receipts implementation complete; independent review active
Implementation report M4 /Users/milamarty/work/ROLES-EVIDENCE-RECEIPTS-FIX-M4.md SHA256 1555b0d47d4e9e4c5f8787216c6803b938b3725056368272d668c6708512f51d, READY FOR COORDINATOR REVIEW. Product diff: chat-global route/runtime test, llmDecisionTrace, embeddings, new embeddingEvidence helper and two tests. Package-source diff: closure-v5-final/tools/verify_run_evidence_chain.py + test_verify_run_evidence_chain.py. Verifier fixtures 8/8 pass, Python compile rc=0, diff-check rc=0. Old dry packet remains expected FAIL (12 missing embedding evidence + three hash-only transform chains); it cannot retroactively prove new bytes. Product runtime tests NOT-RUN in isolated worktree because node_modules absent and install forbidden, so no GO/paid/sign request. Fresh paid dry-run is required only after local code review and runnable local proof. Independent Codex 5.5 high session roles-evidence-review is active, read-only/adversarial, checking canonical bytes, base64/UTF-8/float semantics, accepted-response chain origin, strict transform allowlist, Rule-10 and exact two-part shipping boundary.
## 22.08 01:56 UTC — evidence receipts R2 complete; independent re-review active
R2 report /Users/milamarty/work/ROLES-EVIDENCE-RECEIPTS-R2-M4.md SHA256 bbbae563c4088472583e223bdeb72af7ba7bd9a87bb4d0d122fe644e4f54f272, READY FOR INDEPENDENT RE-REVIEW. R2 closes the six prior review items in source: exact canonical embedding JSON, embedded providerRequestId binding, consecutive provider-order indices, finite reviewed transform source identity with packaged-source hash check, Rule-10 fail-closed evidence sinks, and explicit UTF-8 byte lengths. Python verifier suite 27/27, py_compile rc=0, diff-check rc=0; old dry packet remains expected FAIL with 18 problems. Product tests remain NOT-RUN because exact checkout has no node_modules and installs are forbidden. Shipping boundary remains seven product files plus two verifier package-source files; three product files are untracked and must be included. Independent Codex 5.5 high session roles-evidence-r2-review is now active and reproducing every former unexpected PASS with its own mutation harness. No paid run, signature, build, deploy, prod, DB or config access.
## 22.08 02:01 IST — R2 independent review found residual fail-open source-root gap
Independent Codex re-review produced a fresh fixture where ROLES_PRODUCT_SOURCE_ROOT is explicitly set to an existing directory that lacks src/app/api/chat-global/route.ts. The current verifier returned PASS with problems=[] instead of failing closed. Therefore the finite TRANSFORM_CODE_MANIFEST hash is enforced only when the reviewed source file happens to be found; an explicitly supplied incomplete package/source root silently skips packaged-source recomputation. This is a real residual from prior finding 4. Verdict remains REVISION REQUIRED pending a negative control and implementation fix. Stock verifier tests still 27/27; old dry packet remains expected FAIL with 18 problems. Product TS tests remain NOT-RUN (exact checkout has no node_modules). Owner notified message_id=12726. No paid run/sign/deploy/prod/DB/config mutation.
## 22.08 02:05 IST — R2 independent verdict final; R3 fix active
Final independent R2 verdict /Users/milamarty/work/ROLES-EVIDENCE-RECEIPTS-R2-INDEPENDENT-VERDICT.md SHA256 add4b7ff274e828590542d1fa4e100b6f16646ee99595d5f39df1305d200c863: REVISION REQUIRED. One High survives: an explicitly configured ROLES_PRODUCT_SOURCE_ROOT missing reviewed src/app/api/chat-global/route.ts returns PASS/problems=[] instead of fail-closed. All other independent mutation/linkage controls passed; stock suite 27/27; old dry packet FAIL with 18 expected legacy problems; product tests NOT-RUN due no exact-checkout dependencies. M4 Codex session roles-evidence-r3 now edits only verify_run_evidence_chain.py and test_verify_run_evidence_chain.py, with missing/nonregular/wrong-byte explicit-root negatives plus reverse control. No product mutation, paid/live, signature, deploy, prod, DB or config access.
## 22.08 02:14 IST — R3 implementation ready; independent adversarial review active
R3 report /Users/milamarty/work/ROLES-EVIDENCE-RECEIPTS-R3-M4.md SHA256 bf4472467cf579577931e124e0678fb439d19e52479bd33817f4a2d4539a3481, READY FOR INDEPENDENT R3 REVIEW. Exact verifier-only boundary: verify_run_evidence_chain.py SHA d0932572…c0b0 and test_verify_run_evidence_chain.py SHA 33c63bb5…da33. py_compile rc=0; suite 31/31; old dry packet remains expected FAIL with 18 legacy problems; missing explicit-root harness flipped PASS→FAIL; reverse control made the new negative fail and post-restore passed. Product files were not changed; no paid/live/sign/deploy/prod/DB/config access. Independent Codex roles-evidence-r3-review now attacks empty/whitespace/path-list roots, symlink escape, multiple roots, old controls, and reverse-control validity. Status remains in_progress until independent GO.
## 22.08 02:20 IST — independent R3 REVISION REQUIRED; R4 active
Independent adversarial verdict /Users/milamarty/work/ROLES-EVIDENCE-RECEIPTS-R3-INDEPENDENT-VERDICT.md SHA256 6d0ab4977c85709f0fa42cbed4970477bd514e36f6e374a7c61deae5d3e9a537: REVISION REQUIRED. Three High bypasses reproduced: explicit empty ROLES_PRODUCT_SOURCE_ROOT enters legacy no-root PASS; leading/trailing empty path-list entries are filtered and a valid neighbor masks them; os.stat/open follows reviewed-module symlinks, including an escape outside the explicit package root. Existing 31/31 suite and old dry packet FAIL=18 stayed intact; reverse control exercised the real verify() transform path. Owner notified message_id=12729. M4 Codex roles-evidence-r4 now edits only the two verifier package-source files and must add empty/whitespace/separator/path-list/symlink-parent/escape negative and reverse controls. No paid/live/sign/deploy/prod/DB/config access.
## 22.08 02:28 IST — R4 implementation ready; independent R4 audit active
R4 report /Users/milamarty/work/ROLES-EVIDENCE-RECEIPTS-R4-M4.md SHA256 3044acd83e218cac645959353abc77fd16bafe76d112a12f88aef7a6ddb1a4c6, READY FOR INDEPENDENT R4 REVIEW. Exact verifier-only hashes: verify_run_evidence_chain.py f4e9d8ed04c23aaa28815f9a2d151fba06d7f230a6c0374f5659eab856ee0f2c; tests 828fe45d4807dc224e5cec89c640f5fce0f2d37155400c903cb0b2818da941d5. py_compile rc=0; full suite 40/40 twice; old dry packet expected FAIL with exactly 18 legacy problems; reverse-control restored R3 parser/stat behavior and all new empty/path-list/symlink guards failed as intended (10 failures), then restored suite green. Product source unchanged and outside shipping boundary. Independent Codex roles-evidence-r4-review now attacks root symlinks, relative/dotdot/prefix-collision/duplicate roots, multi-root masking, TOCTOU feasibility and prior evidence-chain controls. No paid/live/sign/deploy/prod/DB/config access. Status remains in_progress until independent verdict.
## 22.08 02:33 IST — independent R4 deterministic TOCTOU blocker reproduced
Independent R4 audit reproduced two deterministic path-swap bypasses at the real verifier hash call: (1) a checked regular reviewed module was replaced by an outside symlink before sha256_file/open; (2) an explicit root symlink was retargeted before open. Both returned PASS/problems=0 while opened_realpath was outside/retargeted. Static R4 controls and stock 40/40 remain green, proving they do not close the lstat/realpath-to-open race. Verdict file is still being written; status remains in_progress/REVISION REQUIRED pending exact report SHA. Required direction: hash through a no-follow file descriptor anchored to the verified root/module and bind fstat identity, with a negative race control. No paid/live/sign/deploy/prod/DB/config access.
## 22.08 10:55 UTC — R5 fd/no-follow implementation ready; independent R5 judge active
R4 independent verdict finalized REVISION REQUIRED, SHA 48fa30a3e8570a047a55772c754454c52544d2d70b373c29effa5ee1e0b799d4: deterministic path-swap TOCTOU let checked source be replaced/retargeted before pathname open while verifier PASSed.
M4 Codex R5 report /Users/milamarty/work/ROLES-EVIDENCE-RECEIPTS-R5-M4.md SHA fa6be6f6601dda2577bfe69fba634f103c62cdfbfb206076aa7dbcd04d4def0c, READY FOR INDEPENDENT R5 REVIEW. Two-file verifier boundary only. It walks from trusted root fd with dir_fd/O_NOFOLLOW, hashes final already-open fd, fstat-binds dev/inode and closes descriptors. py_compile rc=0; suite 49/49; old packet still expected FAIL problems=18; four race tests pass, reverse pathname-hash copy makes exactly four fail. Independent read-only Codex roles-evidence-r5-review is active; no paid/live/sign/deploy/prod/DB/config access.
## 22.08 11:04 UTC — independent R5 GO; deterministic R6 packet active
Independent verdict /Users/milamarty/work/ROLES-EVIDENCE-RECEIPTS-R5-INDEPENDENT-VERDICT.md SHA f832661357967b977d2f6b4d84149ebcdb748c0d54afa4c4d1b2b8f12953ffce, GO. Full suite 49/49; old packet fail-closed with exactly 18 expected problems; four deterministic races pass; reverse pathname-hash copy fails all four. Product worktree unchanged by audit. One report command form using absolute path with python -m unittest was non-reproducible, but both valid suite forms pass. M4 Codex roles-evidence-r6-pack now creates a deterministic single source-candidate archive with exact seven product + two verifier files and negative verifier controls; no paid/live/sign/deploy/prod/DB/config access.
## 22.08 12:02 UTC — R6 single source-candidate delivered after independent GO
Archive /Volumes/M4Ext/ops/paidlegs/ROLES-V10-EVIDENCE-R6-SOURCE-CANDIDATE-20260822.tar, size 624640, SHA ad3e9095a88d6d8dde88e1f46edbdfadfbd7b4038bd9e303bb97397a445b9487. Independent verdict /Users/milamarty/work/ROLES-EVIDENCE-RECEIPTS-R6-INDEPENDENT-VERDICT.md SHA 176e1db1546dfb2dfe3572c757801304ccef3992d995c3bdf50a7d768bb01865 = GO. Exact 26-member boundary; seven product dirty files including all three untracked bytes; two verifier sources; R5 report+GO; tracked+untracked patch; generated COVER/SHA256SUMS. Archive and directory verifier PASS; deterministic rebuild cmp rc=0; 49/49 verifier tests; 37 independent negatives all fail closed. Local delivery /Users/annakorin/Downloads/ROLES-V10-EVIDENCE-R6-SOURCE-CANDIDATE-20260822/ verified same SHA and 26 tar members. Product runtime tests remain honestly NOT-RUN.
## 22.08 15:58Z — R8 independent REVISION REQUIRED; auditor package not ready
- Author route-fix `cbb13b91`: runtime suite 14/14, evidence 7/7, negative controls green.
- Independent verdict: `/Users/milamarty/work/ROLES-V10-R8-ROUTE-FIX-INDEPENDENT-VERDICT.md`, SHA-256 `3308a2b1bb73592b4df33d8fa2e8f5a697f949f38e39a3ea11efc75097f6eb3d`, marker `ROLES_R8_ROUTE_FIX_INDEPENDENT_REVISION_REQUIRED`.
- Exact rejection: one R7 assertion was weakened from exact `callsTo('openrouter:chat') === 2` to `>= 1`, so it no longer rejects unexpected extra provider calls. No R8 package was built or sealed.
- M4 bounded Codex wave `roles-r8-assertion-r1` is active to restore exact call-count behavior, preserve request-id evidence, and prove an extra-call mutation fails. A new independent review and seal are required before auditor delivery.
- Owner notification: Telegram message_id `12811`.
## 22.08 — ROLES_R8_ASSERTION_R1_AUTHOR_READY_20260822
Узкая assertion revision завершена:
- branch `roles-r8-routefix-r1`;
- commit `42881f311613ca1ef14a3d67a36fa69c86cb25a8`;
- tree `d0472e38cb4d0ab89344e158b988093327c5d803`;
- report `/Users/milamarty/work/ROLES-V10-R8-ASSERTION-R1-M4.md`;
- marker `ROLES_R8_ASSERTION_R1_READY`.
Точный фактический OpenRouter ledger = три calls: `answer`, `marker_attachment_judge`, `claim_split_judge`. Route suite 14/14, evidence 7/7; negative extra-call mutation корректно падает `4 != 3`. M4 уже выполняет отдельный independent review в fresh copy. R8 package не строится до independent GO.
## 22.08 16:49 UTC — assertion R1 independently accepted; final seal запущен
- Independent verdict: `/Users/milamarty/work/ROLES-V10-R8-ASSERTION-R1-INDEPENDENT-VERDICT.md`.
- SHA-256 `9ba3ba9b97f2055952f682a760144e3d7f33e376d6dcb2046f61543921f9248d`; marker `ROLES_R8_ASSERTION_R1_INDEPENDENT_GO`.
- Fresh source: route runtime `14/14`, evidence `7/7`, post-mutation restore `14/14`; negative extra OpenRouter call rejected JSON and SSE with `4 !== 3`, rc `1`.
- Exact accepted ledger is three passes: `answer`, `marker_attachment_judge`, `claim_split_judge`; lower-bound assertion больше не принимается.
- Scoped tsc baseline остаётся red `99`, но diagnostics-only diff против route-fix baseline `0`; full-tree green не заявляется.
- Свободный M4 слот сразу занят `roles-r8-final-seal-r2`: deterministic offline package на M4Ext, без paid 44-case, owner-key, prod/deploy. До final seal marker пакет аудитору не выдаётся.
## 22.08 17:07Z — Roles R8 final seal действительно активен, READY ещё нет
M4 wave `roles-r8-final-seal-r2` активна и лог растёт. Сейчас строится package-builder с binding accepted commit `42881f31` / tree `d0472e38`, upstream report hashes/markers, source inventory, raw receipts, R7 lineage, deterministic numbers, file modes/SHA и package-local verifier. Tar, 6 негативных контролей и byte-identical rebuild ещё не завершены; финального report marker нет. Owner-signed 44-case battery не запускалась: имеющийся manifest привязан к старому source `4653f470`, не к принятому R8.
## 22.08 17:40Z — Roles R8 stand/unsigned manifest строятся на принятом source
Offline seal уже READY: package 939530240 bytes, SHA `38ee9260…06afc`, deterministic rebuild identical, route 14/14, evidence 7/7, 6/6 negative controls. Следующая bounded M4 wave `roles-r8-runnable-stand-manifest` активна: canonical Roles V10/V11 runner перепривязывается со старого source `4653f470` на accepted `42881f31`, новый source bundle `roles-src-42881f31-r8-20260822.bundle` и отдельный run root на M4Ext. Финального stand report/unsigned manifest ещё нет; owner-key, подпись и 44-case paid run не использовались.
## 22.08 18:07Z — Roles R8 runnable stand/manifest всё ещё строится, paid run не начат
M4 Codex лог вырос до 2,691,785 bytes и показывает пятую bounded build-attempt: теперь materialize обоих physical dependency roots (root и standalone) перед canonical prepare; текущий этап — `next build`. Финального `ROLES-V10-R8-RUNNABLE-STAND-MANIFEST-M4.md` пока нет. Offline seal остаётся READY (SHA `38ee9260…06afc`), но unsigned owner manifest ещё не выдан; owner-key/signing/44-case paid battery не использовались.
## 23.08 ~00:40 IST — внешний ревизор: NO-GO по ROLES-R9-R1-INDEPENDENT-GO-ARCHIVE.zip
- Аудит: ~/Downloads/AUDIT-REPORT-RU(20260822-220958).md; пакет аудита SHA 802b136ccf5afefc25307907f629e4be73d12670ba762e2f71c291ac576404bc (ZIP ещё не скачан локально, запрошен у owner).
- 6 блокирующих обходов: R9R1-AUD-001 forged preflight gate via ROLESV10_PREFLIGHT_GATE env (CRITICAL); 002 stand certified without exec/bind/serve proof (CRITICAL); 003 transform receipts не воспроизводятся (CRITICAL); 004 priced error-calls выпадают из cost.tsv (CRITICAL); 005 budget reservation reuse $0.60 против $0.50 (CRITICAL); 006 signed case plan не сравнивается с точным executable set (HIGH).
- Плюс: prearchive GO в архиве противоречит REVISION_REQUIRED там же; имя архива с GO без live-результата; stale inventory self-hash.
- Действия: owner-подпись R9.2 получена 23:33 UTC (Signature Verified Successfully, custody /Volumes/M4Ext/ops/worktrees/roles-r9-r2-preflight/artifacts/), но платная батарея ОСТАНОВЛЕНА до фиксов (owner уведомлён: 12869, 12870).
- Запущена фикс-волна R9.3 на M4 (tmux gui r9r3fix, codex gpt-5.5 xhigh): бриф ~/work/ROLES-R9-R3-VERIFIER-FIX-M4-BRIEF.md — фикс всех 6 + негативный реплей каждого обхода обязан падать. Далее: независимый суд -> новый preflight -> НОВЫЙ манифест и новая подпись.
## 23.08 00:42 IST — пакет аудита NO-GO доставлен
- Owner скачал ZIP; SHA 802b136ccf5afefc25307907f629e4be73d12670ba762e2f71c291ac576404bc сверен на ноутбуке и M4.
- Распакован в /Volumes/M4Ext/ops/roles-audit-nogo-20260822/ (REPRODUCE-ADVERSARIAL.py + VERDICT.json + evidence).
- Аддендум для фикс-волны и суда: ~/work/ROLES-R9-R3-ADDENDUM-AUDIT-PACKAGE.md — негативные тесты обязаны включать прогон REPRODUCE-ADVERSARIAL.py против исправленного кандидата (6/6 обходов должны перестать проходить); суд гоняет скрипт сам.
## 23.08 — R9.3 фикс-волна сдала: все 6 обходов закрыты с негативными контролями
- Отчёт: M4 ~/work/ROLES-R9-R3-VERIFIER-FIX-REPORT.md, маркер ROLES_R9_R3_VERIFIER_FIX_READY_FOR_INDEPENDENT_REVIEW; entrypoint RESULT=PASS.
- По каждой находке R9R1-AUD-001..006 — фикс + негативный реплей (например AUD-005: второй прогон об одну reservation → ASSERT-FAIL: RESERVATION_REFUSED).
- Новый source bundle roles-src-r9-r3-c598379.bundle (SHA 2c429e95…7f2, инвентарь 11322 строк).
- Честные границы: провайдеры/подпись/прод не тронуты; GO-архивы не собирались (упаковщик теперь ОТКАЗЫВАЕТСЯ от GO-имён без live-результата).
- ЗАПУЩЕН независимый суд r9r3court на M4 (Terra high): обязан прогнать REPRODUCE-ADVERSARIAL.py аудитора против кандидата — все 6 обходов должны падать.
## 23.08 — R9.3 суд: REVISION_REQUIRED (3 из 6 закрыты, 3 обходятся ДРУГИМ путём)
- Закрыты по exact-replay аудитора: AUD-001 (forged gate → PREFLIGHT_GATE_ENV_OVERRIDE_FORBIDDEN), AUD-003 (transform), AUD-004 (priced error accounting).
- Всё ещё проходят в скрипте аудитора (RESULT=PASS): AUD-002 (stand never ran, samePid=false обходит), AUD-005 (reservation reuse через второй preflight, агрегат $0.6>$0.5), AUD-006 (case-plan ID mutation, сравнение не на том слое). Независимые негативы суда для 002/005 отбились — значит R9.3 закрыл ОДИН путь, скрипт обходит другим.
- Вердикт: M4 ~/work/ROLES-R9-R3-COURT-VERDICT.md, маркер ROLES_R9_R3_COURT_REVISION_REQUIRED.
- Запущена R9.4 (Terra high, M4): закрыть путь скрипта для 002/005/006 с негативом, воспроизводящим ИМЕННО путь аудитора.
## 23.08 08:05 UTC — R9.4 сдала (READY_FOR_INDEPENDENT_REVIEW), суд запущен
- Bundle roles-src-r9-r4-7c662c9 (SHA d17322b0…5bc0), ветка agent/roles-r9-r4. Заявлено: закрыт путь СКРИПТА аудитора для AUD-002 (стенд обслужил 200), AUD-005 (reservation single-use на preflight), AUD-006 (exactIdSetEqual).
- Независимый суд r9r4court (M4 Terra) запущен: обязан прогнать REPRODUCE-ADVERSARIAL.py — все 6 обходов должны падать; проверить, что 001/003/004 не сломаны.
## 23.08 08:50 UTC — R9.4 суд: 5/6 закрыто, остался AUD-002 → R9.5
- Закрыты 001/003/004/005/006 (006 теперь CASE_PLAN_EXACT_ORDERED_ID_MISMATCH, 005 RESERVATION_REFUSED на preflight). Независимые негативы суда для всех трёх падают.
- Остался ТОЛЬКО AUD-002: exact-скрипт аудитора даёт RESULT=PASS при samePid=false/declared processless (receiptPid≠auditPid, samePidAfterExecExpected=false обходит). Наш негатив ловит, скрипт — нет.
- R9.5 запущена (M4 Terra xhigh): стенд-сертификация обязана требовать listener-PID существует + exec от подписанного artifact + обслужил запрос + samePid=true (никакого processless). Bundle базы roles-src-r9-r4-7c662c9.
## 23.08 10:05 UTC — 🎉 РОЛИ R9.5 СУД GO: все 6 обходов ревизора ОТБИТЫ
- Вердикт ROLES_R9_R5_COURT_GO (A1 /home/ubuntu/waves/R9R5-COURT-VERDICT.md). Скрипт аудитора REPRODUCE-ADVERSARIAL.py: все 6 FAIL_OR_REFUSED; независимый court-runner (свои мутации): PASS, 6/6 FAIL; honest-run PASS.
- Закрыты: AUD-001 (forged gate rc=79), AUD-002 (processless samePid=false → verifier FAIL: нет live PID/listener/served-request), AUD-003 (fabricated output FAIL), AUD-004 (priced error absent cost.tsv FAIL), AUD-005 (reservation reuse RESERVATION_REFUSED), AUD-006 (case-plan ID reorder CASE_PLAN_EXACT_ORDERED_ID_MISMATCH).
- Линия проверялок ролей ЗАКРЫТА. Bundle roles-src-r9-r5-f79581a (HEAD f79581a).
- Запущена сборка self-contained пакета (M4 r9r5pkg, Terra) → координатор нарежет ревизору. Платная батарея по-прежнему заморожена до нового манифеста+owner-подписи (это ОТДЕЛЬНО от verifier-линии).
## 23.08 10:20 UTC — пакет R9.5 GO READY, доставка ревизору
- ROLES_R9_R5_PACKAGE_READY: ZIP /Volumes/M4Ext/ops/roles-r9-r5-package/ROLES-R9-R5-SELF-CONTAINED.zip, 537,870,848 bytes, SHA 3ca7772244b3d62e2756a5a8064a4a281ef3a3cd05cfb9640e567bbdf943aa5d. Source bundle eb8a883e…b153. Детерминированная пересборка + 6 негативов в пакете.
- Тянется на Интел → нарежу части ≤400МБ + кавер → в ОТПРАВИТЬ-СЕЙЧАС/роли.
## 23.08 10:32 UTC — пакет R9.5 нарезан, ГОТОВ к отправке
- ~/Downloads/ревизор/ОТПРАВИТЬ-СЕЙЧАС/роли-R9-R5/: 2 части ≤400МБ + кавер (честно: закрытие 6 обходов после NO-GO, суд GO, платная батарея отдельно). Склейка сверена байт-в-байт. Канон в M4Ext reviser-ledger/roles-r9-r5-ready-20260823/. Ждёт owner-отправки.
## 2026-08-23 11:12 UTC — пакет R9-R5 ОТПРАВЛЕН ревизору, Intel-копии удалены
Owner отправил роли-R9-R5 (2 части + кавер + SHA256SUMS-PARTS) 23.08 ~11:10Z. Целый ZIP в леджере сверен: shasum -c OK (3ca7772244b3d62e2756a5a8064a4a281ef3a3cd05cfb9640e567bbdf943aa5d, 537,870,848 B) — /Volumes/M4Ext/ops/reviser-ledger/roles-r9-r5-ready-20260823/. Intel-папка удалена после сверки (освобождено ~540МБ, диск Интела был 94%). Ждём независимый вердикт по линии проверялок R9.5 (суд наш = GO). NB для доставки: урок движка — расписка целого ZIP уже В пакете частей? Проверить по вердикту; если ревизор запросит — она в леджере.
## 2026-08-23 16:25 UTC — ВЕРДИКТ R9.5: NO-GO (частичный прогресс), 5 НОВЫХ блокирующих обходов → R9.6
ПРИНЯТО: транспорт+пломбы PASS (в т.ч. наша превентивная detached-расписка целого ZIP — сработала, 3ca77722… совпал); source bundle + git fsck PASS; ШЕСТЬ обходов R9.1 закрыты 6/6; honest positive control PASS.
NO-GO из-за 5 НОВЫХ обходов verifier (каждый дважды получил ложный PASS):
1. Разрешённый transform → произвольный неподкреплённый ответ (replay_transform() не воспроизводит семантику всех 14 классов TRANSFORM_STEPS).
2. Один served request сертифицирует больший подписанный набор кейсов (нет 1 case ↔ 1 authenticated served request).
3. Произвольный исполняемый файл с именем `node` принимается как подписанный stand (runtime executable не закреплён path/digest).
4. Owner cap обходится сплитом reservations по двум ledger-файлам (2×$0.30 при cap $0.50; tools/verify_rolesv10_preflight.py:305, rolesv11_budget.py:118-158) — нет общего monotonic authority.
5. Ledger переписывается после preflight (post-run verifier не сверяет текущий ledger с preflight-hash).
Плюс FAIL_EVIDENCE: заявленная byte-identical пересборка ZIP не воспроизводится. Отдельно: HONEST_RUN зовёт verify-clean-stand-run.py (dry enumeration, providerCalls=0) — сам живой positive аудитор воспроизводил отдельно.
Продукт: батарея NOT-RUN, нового score нет, платная авторизация НЕ представлена (как и заявляли).
Аудит в леджере: reviser-ledger/ROLES-R9-R5-INDEPENDENT-AUDIT-NO-GO-20260823.zip (sha 0fc66934…) + AUDIT-REPORT-RU.
ПЛАН R9.6: фикс-волна по 5 обходам (каждый с негативом «сломай вход → verifier обязан упасть»), + честная семантика HONEST_RUN, + воспроизводимая пересборка ZIP; свой суд REPRODUCE-ADVERSARIAL; новый пакет с расписками. Очередь: первый освободившийся слот (M4 после r25 либо A1 после web087).
## 2026-08-23 18:35 UTC — R9.6 волна ЗАПУЩЕНА (M4 r96, Luna xhigh) по застейдженному брифу: 5 обходов + детерминизм ZIP + честный HONEST_RUN, каждый с негативом. Ожидаю R96_FIXES_READY, затем суд.
## 2026-08-23 20:35 UTC — R9.6 ФИКСЫ СДАНЫ (R96_FIXES_READY) → независимый СУД запущен
Волна r96 (ветка agent/roles-r9-r6 от f79581a): все 5 обходов закрыты ОТДЕЛЬНЫМИ коммитами с адверсариальными негативами (701cb79 transform fail-closed; e72b866 криптопривязка requestId/sha 1↔1; e2b6f67 signed path+sha executable по фактическому PID; d6311c4 owner-подписанный canonical ledger; 076cc87 preflight hash-chain + append-only post-run). REPRODUCE-ADVERSARIAL --only AUD-R5-001..005: все driverRc=0/verifierRc=1 (обходы отбиты). Evidence-хвост: zip -X детерминизм (byte_identical=1 дважды, sha 70835b39…), HONEST_RUN помечен MODE=DRY_STATIC_CONTROL + синтетический позитив. Сюиты 55/55, 6/6, 21/21.
СУД: r96court (M4, Luna xhigh, свежий worktree): реплики 5 обходов ПО АУДИТУ (не по тестам исполнителя), полный REPRODUCE-ADVERSARIAL включая старые R9R1-001..006 (анти-регресс), двойная пересборка ZIP, +3 собственные мутации. Ожидаю ROLES_R96_COURT_GO → упаковка → ZIP owner'у.
## 2026-08-23 22:15 UTC — 🎉 СУД: ROLES_R96_COURT_GO → упаковка запущена
Независимый судья (r96court, Luna xhigh, свежий detached checkout 219ccfcd): САМ пересобрал 5 реплик по тексту аудита — все отбиты (fabricated transform ASSERT-FAIL; 1 request ≠ 2 cases; decoy node отвергнут по signed path; split-леджеры оба BUDGET_LEDGER_PATH_MISMATCH; переписанный ledger = не append-only от preflight hash-chain head). Штатный REPRODUCE-ADVERSARIAL: result=PASS, AUD-R5-001..005 + СТАРЫЕ R9R1-001..006 все FAIL_OR_REFUSED (анти-регресс чист). Нюанс: краткий вызов без --output даёт rc=2 (argparse) — дефект удобства CLI, не вердикта.
Упаковка r96pkg (M4): ZIP + ДЕТЕРМИНИЗМ дважды + detached расписка целого ZIP В ДОСТАВКЕ + части ≤400МБ + кавер с машинными числами. Ожидаю R96_PACKAGE_READY → связка на Интел → owner шлёт ревизору.
## 2026-08-23 23:35 UTC — ПАКЕТ R9.6 ГОТОВ (R96_PACKAGE_READY), едет на Интел
ZIP ROLES-R9-R6-SELF-CONTAINED.zip: 537 928 518 B, SHA ade6965612b8ede7804571d434ac0c47ef2ed75ac931cda795ffb6f22e10a207; детерминизм — две независимые сборки байт-в-байт (cmp rc=0 + штатный тест PASS). Внутри: source bundle 219ccfcd (git fsck clean, полная история, 61e97130…), verifier-инструменты, сырые вердикты суда (adversarial JSON a8260d73…), internal SHA256SUMS 6db01664…. ДОСТАВКА: 2 части (3a2707ee… / 5dac366e…) + SHA256SUMS-PARTS + detached расписка ЦЕЛОГО ZIP (в доставке!) + КАВЕР-ЛЕТТЕР-РОЛИ-R9-R6.md. Копии: реестр M4Ext roles-r9-r6-ready-20260823 + ~/work/r96-send → тянется в ~/Downloads/ревизор/ОТПРАВИТЬ-СЕЙЧАС/роли-R9-R6/ (сверка целого SHA на Интеле перед отдачей owner).
## 2026-08-23 23:45 UTC — связка НА ИНТЕЛЕ, пломба целого ZIP сверена (ade69656… OK из частей). Owner уведомлён — можно слать (12976).
## 2026-08-24 04:50 UTC — ВЕРДИКТ R9.6: NO-GO (6 НОВЫХ фундаментальных обходов) → R9.7
Пакет чист по транспорту/пломбам/source (part-aa 3a2707ee, целый ZIP ade69656 совпали; git 81 commit fsck OK; package verifier PASS; старые 11 регрессий FAIL_OR_REFUSED). НО 6 новых обходов, каждый = verifier печатает ложный PASS:
1. доверяет producer-authored semantic PASS (checks_passed/final_gate.pass) без переисполнения источник→утверждение;
2. negation-удаление (did not→did) проходит token-set transform-replay;
3. servedRequests сочиняются producer'ом (0 реальных запросов, выдуманные IDs/hashes приняты как LIVE-PID-SERVED);
4. неподписанный NODE_OPTIONS=--require меняет ответ подписанного stand — всё равно сертифицирован (runtime не в подписанной identity);
5. preflight/reservation/ledger сочинены задним числом — приняты как RESERVATION-BEFORE-FIRST-CALL (нет monotonic/timestamp/append-only);
6. самоназначенный owner-ключ + {"ownerExclusive":true} принят (нет внешнего пина owner-fingerprint).
+evidence: ZIP-детерминизм не переносим между Python/zlib (rebuilt 4236ee4e ≠ ade69656); суд-suite содержит абсолютные пути /Volumes/M4Ext и требует non-root.
⚠️ САМОКРИТИКА: наш r96court эти 6 ПРОПУСТИЛ — судил по producer-данным, не переисполнял. R9.7 чинит модель доверия (переисполнение + внешние якоря) И усиливает суд классом EXTRA-ADVERSARIAL с producer-forged данными.
Аудит в леджере: reviser-ledger/ROLES-R9-R6-INDEPENDENT-AUDIT-NO-GO-20260823.zip (sha 2dd73b53…) + r96-audit-unpacked/. Волна r97 (M4, Luna xhigh) запущена по 6 репликам-эталонам.
Продукт: батарея NOT-RUN, платная авторизация не запрашивалась (как заявляли).
## 2026-08-23 16:21 UTC — R9.7 сдан (r97 на M4): 6 фундаментальных обходов R9.6 закрыты + суд усилен
База 219ccfcd, ветка agent/roles-r9-r7, HEAD 795b44d9. Шесть обходов: AUD-R6-001 semantic-pass-trust (verifier ПЕРЕИСПОЛНЯЕТ citation→source по owner-hashed source-evidence.jsonl, не верит checks_passed), 002 negation-transform (полярность отрицаний, не token-set), 003 forged-servedRequests (подписанный внешним server key receipt с nonce, ключи pin-ятся вне producer-пакета), 004 unsigned NODE_OPTIONS (verifier читает PID environment, отвергает sensitive modifiers), 005 backdated-ledger (внешняя Ed25519 attestation, recordedAt>=reservedAt), 006 self-asserted-owner (обязателен reviewer --expected-owner-spki-sha256). Суд: REPRODUCE-ADVERSARIAL 17/17 FAIL_OR_REFUSED (6 новых + 11 регресс), точный R9.6-драйвер отвергает все 6 реплик (verifierRc=2). Детерминированный ZIP byte-identical, суд без mounted-volume/root-fallback. Marker R97_FIXES_READY. Дальше: НЕЗАВИСИМЫЙ финальный суд (отдельная волна) → пакет ревьюеру. Извлечён урок: наш прошлый суд пропускал producer-authored доверие — теперь внешние якоря обязательны.
## 2026-08-23 BOARDSWEEP: IN_PROGRESS-LIVE
- Evidence: updatedAt=2026-08-23T16:21:53.430Z, within 24h; body has active rolesv11/rolesbattery trail. No status change.
- buildFixed: <empty>; canonical: v4-081ff4fb5 / 081ff4fb5f6110f8001daec7ed910ccef2e395dc.
- Status preserved by sweep: in_progress.
Доказательства
[24.08 ~00:28] R9.11 ГОТОВ + НЕЗАВИСИМО ПРИНЯТ (GO). ЭВОЛЮЦИЯ полностью: R9.7 (суд:5 дыр) → R9.8 (суд:3) → R9.9 (суд:3) → R9.10 системный fail-closed рефактор → ВНЕШНИЙ независимый аудит NO-GO (7 blocking findings, 3 CRITICAL) → R9.11 закрыл все 7. Волна r911 (worktree /Volumes/M4Ext/ops/worktrees/roles-r9-r7, ветка agent/roles-r9-r11): AUD-001 root-архив теперь раскрывается; AUD-002 magic-byte детект контейнеров; AUD-003 пре-инвентарь TAR + reject дублей/линков; AUD-004 канонизация DSN (scheme case + percent-decode до fingerprint); AUD-005 streaming cap до extraction (commit c2ced5d); AUD-006 census до output, FIFO/output-under-root reject (c2ced5d); AUD-007 package-r911-audit.sh как обязательный self-contained гейт (ee1043f). ПРУФ независимой приёмки R911VERIFY (свежий взгляд, не доверяя отчёту r911): оригинальный REPRODUCE-скрипт аудитора → 8/8 обходов FAIL_OR_REFUSED, blockerCount=0; clone из bundle → HEAD/tree/parent сходятся; 7 parent-dependent тестов rc=0; 3 CRITICAL перепроверены руками своими кейсами; regression зелёный. Маркеры: R911_FIXES_READY, R911_VERIFY_GO. Отчёты: M4 ~/work/{R911-REPORT.md, R911VERIFY-REPORT.md}. Пакет: ~/work/R911-WEB-088-self-contained/ (bundle+source+tests+verification+CUSTODY+SHA256SUMS) → упаковка r911pkg → /Volumes/M4Ext/ops/roles-r911-auditor-pkg/. Файлы аудита: ~/Downloads/{AUDIT-EVIDENCE,FINDINGS,INDEPENDENT-ADVERSARIAL-RUN1}.json + M4 ~/work/r911-audit/. Родня: WEB-049 (подпись-доверенность для custody), WEB-320.
[24.08 01:12] r911pkg ГОТОВ (маркер R911PKG_READY): детерминированный ZIP (SOURCE_DATE_EPOCH, zip -X -0), 2.4ГБ → 6 частей ≤400МБ + COVER.md + SHA256SUMS(-PARTS). Проверки M4: shasum -c OK, обратная сборка cmp OK, unzip -tq OK. Проверка НА НОУТЕ после переноса: все 6 частей OK, обратная сборка sha 355144a9…f123 = эталон, unzip чисто. Лежит: ~/Downloads/ревизор/ОТПРАВИТЬ-СЕЙЧАС/РОЛИ-R911/. COVER предупреждает аудитора: REPRODUCE-ADVERSARIAL.py кумулятивный, вердикт R911VERIFY сверять по ID независимого отчёта. Ждём owner: куда слать (tg 13128).
[24.08 19:40] R9.11 ПАКЕТ → NO-GO (owner доставил独立 audit). ПРОГРЕСС реальный: source identity PASS (bundle полный, parent/HEAD/tree/patch согласованы), 8/8 обходов R9.10 закрыты, 116/116 unit, 16/16 regression, 17/17+17/17 реплеи, транспорт/детерминизм ZIP PASS. НО 6 НОВЫХ блокеров в fail-closed сканере/билдере:
- R911-AUD-001 CRIT: TOCTOU secure_archive.py:165-183,244-262 (census!=extract, подмена 6/6).
- R911-AUD-002 CRIT: TOCTOU deterministic_zip.py:38-80,99-121 (census→read_bytes по пути, symlink наружу 2/2).
- R911-AUD-003 CRIT: физ.extent не сканируется — SFX-префикс/ZIP+TAR/concat-gzip прячут секрет (3 кейса PASS).
- R911-AUD-004 HIGH: канонизация roles-r8-credential-scan.cjs:147-205 (UTF-16LE DSN мимо; Latin-1 чтение → utf8!=percent-encoded fingerprint).
- R911-AUD-005 HIGH: билдер допускает A.txt+a.txt и NFD/NFC коллизии (deterministic_zip.py:38-80).
- R911-AUD-006 EVIDENCE: дословный COVER replay сломан (drivers под tests/tools ищут tools/... от root); package gate не гоняет REPLAY_PATHS.
- R911-AUD-007 MED (не блокер): харнесс негерметичен к NODE_PATH/CA/PATH.
КЛЮЧЕВОЙ УРОК: наша приёмка r911verify дала GO 8/8 — но реплеила СТАРЫЕ находки, НЕ искала новые классы (TOCTOU/мультистрим/кодировки). Верификатор без НОВЫХ негативных проб бесполезен. R9.12 запущена (M4, agent/roles-r9-r12): все 6 фиксов + негативный тест на КАЖДУЮ пробу аудитора; зелёное не ломать; затем НЕЗАВИСИМАЯ приёмка новыми пробами до сборки. Доказательства: ~/work/r912-audit/. Родня: WEB-320.
[2026-08-25 ~10:05] Новый аудит R9-R18 NO-GO касался ТОЛЬКО чистоты архива-аттестации (productRuntime NOT-RUN). Волна rolesv12 ЗАКРЫЛА ВСЕ 7 находок (base f79581a→head 599bc7a локально; 7/7 негатив-регрессий; capped=0). Уточнение границы: 4 из 'B' — external-delivery (краденый файл прячет credential от внешнего ревизора без владения build-боксом), не internal-adversary → закрыли все. Добавлено strict sidecar schema + SHA256SUMS binding + 7 machine acceptance-receipts + харденинг git-hook/TAR/UTF-32/Brotli/output-TOCTOU. Для финального GO: свежий пакет + независимая ВНЕШНЯЯ переподпись (owner-key + ревизор). Дерево r9r5-court, ROLESV12-DETERMINATION.md.
[25.08 ~12:55] Для финального GO: court-main 0895412 (= rolesv12 все 7 + WEB-302 gates + WEB-090 OpenSSL3-гейт — ревизор на macOS больше не получит ложный «bad key»). Запущена волна rolespack13 (sol xhigh): СВЕЖИЙ пакет со свежими прогонами suite + 7 негатив-регрессий, SHA256SUMS, unsigned слоты под внешнюю переподпись owner-key+ревизор. Маркер ROLESPACK13_DONE → передам в папку ревизора.
[25.08 ~13:05] rolespack13 PASS: свежий unsigned-пакет ROLES-R918-FRESH-0895412-20260825.zip (292659б, sha 0c65111cc517…, SHA256SUMS 94/94, byte-identical rebuild). Свежие прогоны: rolesv10 7/7, rolesv11 17/17, R918 AUD-001..007 расписки 7/7 PASS capped=0, WEB-090 focused PASS, reproduce-guard PASS. Слоты owner-key/reviewer ПУСТЫЕ. Доставлен owner-у: ~/Downloads/ревизор/РОЛИ-СВЕЖИЙ-ПАКЕТ/ (sha сверен на ноуте, 94/94 OK). Ждём: подпись owner-key + независимая внешняя переподпись ревизора → финальный GO. Отчёт: A1 /home/ubuntu/waves/ROLESPACK13-REPORT.md. TG 13467.
[25.08 ~13:20] Owner спросил как подписывать — подписано ops по его общему ГО: слот OWNER-KEY заполнен (detached ed25519 над байтами MANIFEST.json, ключ nc-team-release pin cf86d782, честная расписка OWNER-KEY-SIGNATURE.json что ключ shared, не owner-exclusive — WEB-309). SHA256SUMS пересобран штатным rolesv12_evidence.py (97/97 OK), zip пересобран deterministic_zip.py (macOS-ловушка: /tmp симлинк — собирать в /private/tmp). Итог: ROLES-R918-FRESH-0895412-20260825-OWNERSIGNED.zip sha 5d27e65b… в папке owner-а. Осталось: передача ревизору, его подпись в слот REVIEWER → финальный GO.
[25.08 ~13:50] Owner ОТПРАВИЛ пакет ревизору (вместе со старыми PART-00/01 старой линии — отправил всё из папки). Досыл-сопроводиловка написана и передана owner-у для пересылки (TG 13478 + файл РОЛИ-R918/СОПРОВОД-ДОСЫЛ-ЧТО-АКТУАЛЬНО.md): актуальны ТОЛЬКО OWNERSIGNED.zip (sha 5d27e65b…) + README-COVER.md; PART-00/01/PARTS-SHA/СОПРОВОД — отменённая NO-GO линия, игнорировать. Ждём: подпись ревизора в слот REVIEWER → финальный GO.
📎 Трейл-финал: unsigned-пакет A1 /home/ubuntu/waves/rolespack13-out/ + отчёт ROLESPACK13-REPORT.md; ПОДПИСАННЫЙ пакет и сопроводы: M4Ext /Volumes/M4Ext/ops/rolespack13-signed/ (zip sha 5d27e65b, custody после чистки ноута); ревизору отправлен owner-ом 25.08 (TG 13474-13479). Дерево court-main@0895412 (A1 r9r5-court).
[25.08 ~17:45Z] ВЕРДИКТ РЕВИЗОРА по OWNERSIGNED-пакету: NO-GO, но УЗКИЙ. ПРИНЯТО: transport PASS (sha 5d27e65b сошёлся), SHA256SUMS 97/97, 13/13 receipts, R918 isolated 7/7 PASS_SCOPED (сам перегнал test_rolesv12_hardening: Ran 7 OK), ed25519 математически верна, HEAD 0895412 подтверждён. БЛОКЕРЫ (класс: машина состояний подписи — ошибка НАША, моего шага подписания): (1) подпись легла на манифест, объявляющий unsigned=true/слот пуст/census 94≠97; (2) расписка о ГО (OWNER-KEY-SIGNATURE.json) НЕ покрыта подписью — криптографически доказано только «держатель cf86d782 подписал байты unsigned-манифеста»; (3) нет канонического post-sign состояния и пакетного verifier-а. ТРЕБОВАНИЕ: конверт OWNER_SIGNED_REVIEWER_PENDING (hash исходного манифеста + hash подписи + key pin + allow-list + post-sign census + reviewer state), подписывать ЕГО. ФИКС ПОШЁЛ: волна rolespack14 (luna, A1) строит машину состояний + verify_signed_state.py (7 проверок ревизора) + когерентный README; подпись конверта — оператором локально по маркеру NEEDS_SIGNATURE. 📎 Аудит-материалы: ~/Downloads/AUDIT-REPORT-RU(20260825-140041).md + VERDICT+EVIDENCE json; custody zip: M4Ext ops/rolespack13-signed/ (sha b2dfc8ee сверен); копия отчёта для волны: A1 ROLES-AUDIT-NOGO-POSTSIGN.md.
[25.08 ~20:50Z] КОНВЕРТ ПОДПИСАН И ДОСТАВЛЕН owner-у: rolespack14b устранил обе циркулярности (подписные байты value+sha256 вне preimage; SIGNATURES/** = control-класс вне census), 5/5 тестов вкл. сквозные фазы на ephemeral-ключах. Оператор исполнил фазу 1 по рецепту: подпись байтов SIGNED-STATE.PREIMAGE.json release-ключом → сайдкар → переход OWNER_SIGNED_REVIEWER_PENDING → verify PASS (с криптопроверкой pubkey), и повторно PASS из пересобранного детерминированного zip. Доставлено: ~/Downloads/ревизор/ОТПРАВИТЬ-СЕЙЧАС/РОЛИ-КОНВЕРТ/ (zip sha 2e552910… + README-COVER). Custody: M4Ext rolespack13-signed/. Ревизору: verify одной командой → его подпись во 2-й слот → FINAL. 📎 A1 ROLESPACK14-REPORT.md (секция 14b), TG 13510.
[25.08 ~16:45Z] Owner ПЕРЕСЛАЛ конверт ревизору (подтвердил в чате): ОТПРАВИТЬ-СЕЙЧАС/РОЛИ-КОНВЕРТ/ROLES-R918-POSTSIGN-0895412-OWNERSIGNED-PENDING.zip (sha 2e552910…) + README-COVER.md. Ждём verify ревизора + подпись 2-го слота → FINAL GO. Больших ревизий больше не будет (7/7 находок уже приняты).
[25.08 ~18:15Z] Вердикт ревизора по конверту: NO-GO. ВАЖНО: ревизор проверял НЕ наш канон, а Finder-дубль «ROLES-R918-...PENDING 2.zip» (sha a6f9bfed, 409651б, +122 __MACOSX/._*, +README-COVER(2)/OPS-STATUS) — отсюда его #1 (census boundary), 2/5 тестов, README-COVER(2). Наш КАНОН (sha 2e552910, 314016б, в ОТПРАВИТЬ-СЕЙЧАС) проходит собственный верификатор 8/8 rc=0, без macOS-мусора. Я воспроизвёл атаки ревизора на КАНОНЕ: #2 (мутация payload) НЕ проходит — E1/E3 держат (owner-preimage пинит sha256sumsSha256=eb0bd2da). НО ПОДТВЕРЖДЕНЫ реальными и на канонце: #3 reviewer-identity = литерал PENDING_REVIEWER_KEY_PIN → произвольный --reviewer-key-pin даёт PASS rc=0 (owner-подпись НЕ авторизует конкретного ревизора); #4 README-COVER говорит «UNSIGNED_CANDIDATE, подписи нет», а state=OWNER_SIGNED_REVIEWER_PENDING с owner-подписью (README не обновлён при owner-транзишене). Корень #3/#4: при локальной owner-подписи фазы 1 не заменили reviewer-pin реальным и не пересобрали README под pending. Пересборка: rolespack15 (баке реального reviewer SPKI-пина ДО owner-подписи, README под pending-state, отклонять литерал-плейсхолдер в верификаторе, TOCTOU-упрочнение census-биндинга, детерминированный zip без __MACOSX). ЗАВИСИМОСТЬ: нужен public-key SPKI-пин независимого ревизора (запрошен у owner). Аудит-zip 651bf357 в custody. Прошлые 7/7 находок остаются приняты.
[25.08 ~18:10Z] rolespack15 НЕ ПРИНЯТ координатором (маркер NEEDS_SIGNATURE был, но проверка выявила поломку): собственный tools/test_verify_signed_state.py падает 4/11 на E6_POSTSIGN_CENSUS_FAIL «ordinary/control file boundary changed». Причина: README-COVER.md объявлен state-derived control и исключён из census, но доставленное дерево/SHA256SUMS с этим рассогласованы → кандидат НЕ верифицирует сам себя (в т.ч. test_candidate_passes_pending, test_full_two_phase_ephemeral). НЕ подписан. Урок [[report-delivery-not-progress-verify-final-artifact]]: маркер ≠ готово, приёмка по факту. Доводка: rolespack15b с гейтом «весь tools/test_*.py зелёный, особенно verify_signed_state 11/11, кандидат верифицируется сам».
[25.08 ~18:30Z] rolespack15b ПОДТВЕРЖДЁН координатором (прогнаны его же тесты): tools/test_verify_signed_state.py 11/11 OK (вкл. test_candidate_passes_pending, test_full_two_phase_ephemeral_ed25519_pass, test_owner_pending_placeholder_pin_is_rejected, test_stale_readme_after_owner_transition_is_caught), весь tools/test_*.py зелёный, zip чистый 0 __MACOSX (317840б), state UNSIGNED_CANDIDATE. Дефекты закрыты: E7_REVIEWER_PIN_UNSET отклоняет литерал/короткий pin; E8_README_STATE_FAIL ловит stale README (README генерится finalize_readme.py из state); TOCTOU — owner-preimage пинит весь postSignCensus+sha256sumsSha256, census-boundary согласована во всех 5 точках (было рассогласование в rolespack15, координатор завернул). ГОТОВ к owner-подписи фазы 1 ЛОКАЛЬНО, но ЖДЁТ реальный reviewer SPKI-пин (prepare_owner_preimage.py подставит 64-hex ДО подписи). Блокер: пин ревизора (owner передаёт ему команды генерации ed25519, TG 13542). Как придёт пин → подставить+подписать+finalize_readme+deterministic zip → отдать owner одним чистым файлом.
[25.08 ~18:35Z] КОНВЕРТ ПОДПИСАН ФАЗОЙ 1 и отдан owner. Reviewer-пин ef45698a… получен от ревизора (проверен: SPKI DER SHA-256 из его pubkey совпал). Процесс: prepare_owner_preimage (баке пина, PREIMAGE==OWNER-PREIMAGE) → owner-подпись SIGNED-STATE.OWNER-PREIMAGE.json ключом nc-team-release (cf86d782, честно помечен shared release, не owner-exclusive) → transition OWNER_SIGNED_REVIEWER_PENDING → finalize_readme. Верификация СОБРАННОГО артефакта из чистой распаковки: PASS 10/10 (E1-E8 вкл. E2_EXTERNAL_KEY_PIN_PASS, E7_REVIEWER_PIN_PASS, E8_README_STATE_PASS), state OWNER_SIGNED_REVIEWER_PENDING pending=true; openssl независимо «Signature Verified Successfully». НЕГАТИВЫ на артефакте: произвольный reviewer-пин → E2_EXTERNAL_KEY_PIN_FAIL (дыра #3 закрыта), README = OWNER_SIGNED_REVIEWER_PENDING (#4 закрыта). Приватных ключей в пакете НЕТ (проверено grep). Ловушка процесса: мой импорт verifier создал tools/__pycache__ → E6 ловил; убрал, пересобрал с PYTHONDONTWRITEBYTECODE=1. Deliverable: ОТПРАВИТЬ-СЕЙЧАС/РОЛИ-КОНВЕРТ/ROLES-R918-POSTSIGN-0895412-OWNERSIGNED-PENDING-v15.zip (sha ab6c7fd5, 320267б, чистый 0 __MACOSX) + owner-public.pem + ДЛЯ-РЕВИЗОРА-ФАЗА-2.md. Custody M4Ext/rolespack15-signed. Ждём: owner пересылает ОДИН файл ревизору → ревизор verify+подпись фазы 2 (SIGNED-STATE.REVIEWER-PREIMAGE.json своим ef45698a-ключом) → FINAL.
[2026-08-25 20:20Z] ФАЗА 2 NO-GO ревизора по v15 (sha ab6c7fd5): подпись/пины/детерминизм/payload-immutability PASS, но ОДИН реальный блокер R918-V15-AUD-001 — public-key TOCTOU в verify_signed_state.py: путь ключа открывается дважды (public_key_pin ~стр177 + verify_ed25519 ~стр225), между ними атомарная подмена (inotify IN_CLOSE_NOWRITE) даёт fingerprint key A + verify key B → rc=0 PASS. Воспроизведено ревизором на наших точных байтах. Та же функция проверяет reviewer-ключ → подпись фазы 2 поверх обхода НЕЛЬЗЯ. Плюс AUD-002: полный suite 5/11. Запущена rolespack16 (A1 sol xhigh): фикс по 7 пунктам (единое чтение O_NOFOLLOW, verify по тем же байтам, post-inode-check, atomic-replacement регресс для owner+reviewer, зелёный suite), пересборка UNSIGNED пакета → маркер ROLESPACK16_NEEDS_SIGNATURE → подпишу локально nc-team-release → передоставка ревизору. Отчёт A1:ROLESPACK16-REPORT.md.
[2026-08-25 21:00Z] rolespack16 ГОТОВ (luna, после OpenAI-cyber-фильтра): TOCTOU закрыт по всем 7 пунктам ревизора — единое O_NOFOLLOW чтение, fingerprint+verify по in-memory snapshot (stdin/own-mkdtemp-0600, внешний path повторно НЕ открывается), post-op lstat identity-check→E2_KEY_IMMUTABILITY_FAIL, inotify atomic-replacement регресс для owner И reviewer (control PASS+race fail-closed). Suite 104/104 (было 5/11). UNSIGNED_CANDIDATE-v16.zip sha 2cf7208d, детерм.пересборка byte-identical, приватных ключей нет. Подписываю owner-фазу1 локально → передоставка ревизору фаза2.
[2026-08-25 21:50Z] КОНВЕРТ v16 ПОДПИСАН owner-фаза1 ЛОКАЛЬНО (nc-team-release cf86d782, PYTHONDONTWRITEBYTECODE=1, pyc почищен): state OWNER_SIGNED_REVIEWER_PENDING, signedAt 21:49:30Z. Верификация СОБРАННОГО артефакта из чистой распаковки: result=PASS 10/10, pending=true; openssl owner-sig OK; негатив чужой reviewer-pin→E2_FAIL; приватных ключей НЕТ. zip sha ea203d1a976148cc237c2770941b3c40dd0379d78207a33db8bdc3f890752bc3. Доставлен owner (3 файла отдельно, TG 13606+чат). Custody: ~/Downloads/ревизор/ОТПРАВИТЬ-СЕЙЧАС/РОЛИ-КОНВЕРТ-v16/. ЖДЁМ: owner→ревизор→фаза2 подпись→FINAL.
[2026-08-26 00:08Z] РЕВИЗОР проверил v16: технически PASS (TOCTOU-фикс работает — 104/104, E2_KEY_IMMUTABILITY_FAIL на гонке, permission-модуль 54/54 non-root, приватных ключей нет). Reviewer-подпись НЕ создана: ревизор ПОТЕРЯЛ приватный ключ старого pin ef45698a, сгенерировал НОВЫЙ постоянный pin aabdca8acf6182bef1b081a38763b68f7fbe6c171c1c3b6cc4799cf766bfc29c (приватный сохранил 600), старый ОТОЗВАН. Код валиден — RE-KEY owner-фазы под новый pin. Запущена rolespack17 (re-key без смены кода) → подпишу v17 локально → передоставка.
[2026-08-26 00:15Z] КОНВЕРТ v17 ПОДПИСАН owner-фаза1 локально (re-key под новый reviewer pin aabdca8a): rolespack17 сменил только pin (ef45698a->aabdca8a, код/payload идентичны v16), подписал nc-team-release (PYTHONDONTWRITEBYTECODE=1, pyc чистый), state OWNER_SIGNED_REVIEWER_PENDING signedAt 23:13:27Z. Верификация собранного из чистой распаковки: PASS 10/10, pending=true, openssl owner-sig OK, СТАРЫЙ отозванный pin ef45698a->E2_FAIL, приватных ключей нет. zip sha d871a00a2ee363b37631c1945ac47978f44c37e666248407d8590d735d672433. Доставлен owner 3 файла отдельно (чат + TG 13613). Custody ~/Downloads/ревизор/ОТПРАВИТЬ-СЕЙЧАС/РОЛИ-КОНВЕРТ-v17/. ЖДЁМ: owner->ревизор->фаза2 подпись новым ключом->FINAL.
[2026-08-26 00:45Z] OWNER РЕШЕНИЕ: reviewer-подпись = формальность (ревизор теряет ключи из веб-интерфейса, уже 3-й). ПРИНЯТО ЗНАЧИТ ПРИНЯТО — v16/v17 технически PASS (10/10, 104/104, TOCTOU закрыт) = приёмка засчитана НА НАШЕЙ СТОРОНЕ. re-key петля ОСТАНОВЛЕНА (rolespack18 убрана). WEB-088 (крипто-конверт) СЧИТАЕМ ЗАКРЫТЫМ по owner-решению. Остаток по ролям — ПРОДУКТ: UX, тесты, качество (WEB-149 enforcement, WEB-108 blind, WEB-99 эпик, WEB-293 способность).
Лента
2026-08-25T07:13:07.085Z · fable-opsЭВОЛЮЦИЯ->R9.18 (доставлено owner, ждём внешнего аудитора). Цепочка: R9.11 (наша приёмка дала ложный GO 8/8 — реплеила старые находки) -> независимый аудитор NO-GO с 7 находками (AUD-001..007: post-sign state, sidecar namespace, pubkey TOCTOU, coverage lie, false refs, patch-note, bundle-swap+no-write) -> R9.18 закрыл ВСЕ 7 + verifier PASS дважды идемпотентно И REJECTED без подписи. Независимая приёмка своим кодом реплеем всех 7 атак (вкл. inotify key-swap и bundle-dir-swap) -> GO. Пакет собран (sha 4805fd7d), пересборка проверена на машине owner, лежит в ~/Downloads/ревизор/ОТПРАВИТЬ-СЕЙЧАС/РОЛИ-R918/. ОСТАЁТСЯ: owner отправляет R9.18 внешнему аудитору; закрытие тикета — после его GO. Урок закреплён: приёмка не должна реюзать тот же дефектный верификатор.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-088","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-26T00:45:10.780Z