WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-284 · Эпик · factcheck · web

ЭПИК: фактчек V2M — релизный гейт R6-R10 (lossless proposition ledger)

Закрыт P0 · горит ведёт: —
Суть
Карта эпика: board/specs/FACTCHECK-V2M-EPIC.md. Кратко: R6-R8 закрыли роль-байндинг и первую волну союзов; R9 (16.08) NO-GO — обход жив через запятую/тире/скобки/юникод (38/54 формулировок supported/1.0), корни: перечисление союзов + парсер платежа глотает хвост .*$. R10 в работе: волна r10ledger на M4/sol — леджер пропозиций (непотреблённый остаток → typed veto → unknown), матрица ≥54 через compiled post-judge, затем полный pnpm test/lint. Крипто-ось зелёная (пломба, бандл, Ed25519 owner, манифест 13075/13075). Долги упаковки к R10: свежие gate-states в конверте, readback финального бандла, полный внутренний SHA256SUMS.

## 20.08 ~18:20 координатор: R21 = GO, эпик у развилки
Хроника доведена в спеке (R16-R24). Кратко: R21 (20.08) — ⭐ПЕРВЫЙ GO ревизора: финальный скан pass/0, подпись nc-team-release с честной custody-моделью. R22 закрыла 7 неблокирующих findings. R24 (пакет sha 11bbe8aa…, отправлен 20.08) закрыл миноры: R20-AUD-003 счётный прокси → покрытие по именам (негативно доказано), кейс графа улик 21/21.
СЛЕДУЮЩИЕ ЭТАПЫ (owner-gated по правилам эпика): (1) прод-активация verdict-pipeline (env-флип, ship-dark в байтах); (2) живая платная батарея на проде — правило «не гнать до вердикта» снято GO, нужен owner-кап; (3) интеграция unified FC+DR = RESEARCHFC-0378. Инженерный хвост: R21-AUD-006 (сюита читает файл, а не прогон) — не блокирует.

## 20.08 ~22:20 R24 = GO (аудит: 77/77, detector 6167/0 unsafe, подпись PASS). Три LOW (в т.ч. моё письмо отстало от пакета — 21/21 vs 22/22). Линия ревизора зелёная целиком. Аудит-бандл в леджере M4Ext, sha 1c62d1d0 сверена. Дальше: WEB-058 посадка → WEB-061 батарея.

## 22.08 12:04 UTC — R24 full release-evidence package returned to owner Downloads
Delivered path: /Users/annakorin/Downloads/FACTCHECK-V2M-R24-PACKAGE-20260820/FACTCHECK-V2M-R24-PACKAGE-20260820.zip. Exact size 2181383200 bytes; SHA256 11bbe8aa0443fb1f67b6aad2aeba5ccaed6b13033ae07e660930511802563f03; unzip -t PASS. Five transport parts independently hashed: aa 9e40bfb2…, ab 917ebe32…, ac fe43062c…, ad 0b2a889c…, ae e1006176…. This is the already independently accepted R24 release-evidence package (77/77 package tests), not evidence that the separate 22.08 live battery is complete. Live battery boundary remains 44/54, ten hard-cap stops, and simple-source controls still unresolved.

## 23.08 — ВЕРДИКТ ревизора по фактчек-R24: GO WITH FINDINGS (0 блокеров, 1 MEDIUM + 3 LOW)
- Отчёт: ~/Downloads/FACTCHECK-V2M-R24-INDEPENDENT-REAUDIT-R2-REPORT-RU-20260823.md (sha 1009698b…597e).
- Пакет подлинен и совпал с каноном (11bbe8aa…); все независимые проверки PASS (SHA256SUMS 169/169, inventory 170/170, scanner findings 0, Ed25519, git fsck, scripts↔HEAD 37/37, suite 77/77, run1↔run2 byte-identical, OCI 10/10). GO по линии СОХРАНЁН, для эксплуатации блокеров нет.
- Findings для чистого закрытия (не блокеры):
  - R24-AUD-004 MEDIUM: в ПОДПИСАННОЙ no-install.receipt.json текстовые поля устарели (5/5, «27») хотя числовые верны (44=7+22+13+2); генератор rebuild-source-test-receipt.cjs хардкодит 5/5 и 27, statusMeaning/countProvenance вне проверок.
  - R24-AUD-001 LOW: cover letter говорит 21/21 и 76 тестов, факт 22/22 и 77/77.
  - R24-AUD-002 LOW: package-consistency-scan.json хранит SHA первого прохода (5c2f6922…), после reseal реальный d0dcbbaf… — маркировка, не целостность.
  - R24-AUD-003 LOW/KNOWN: gate R21-AUD-006 помечен CLOSED-VERIFIED, а описание начинается «NOT fixed in this round».
- Для полного закрытия миноров нужен ОДИН корректирующий repack+re-sign: генерить statusMeaning/countProvenance из фактических полей, включить в семантические проверки, негативы на подмену чисел, cover → 22/22 и 77/77, пересоздать receipts/envelope/manifests/SHA256SUMS, переподписать. R25-линия. НЕ срочно (R24 остаётся принятым).

## 2026-08-23 13:50 UTC �� R25 запущен (owner дал добро, «инфра позволяет»)
Волна r25 на M4 (Terra high, работа в /Volumes/M4Ext/ops/r25-workspace). Скоуп = обязательная секция R2-аудита: AUD-004 (деривация statusMeaning/whyNot29 из machine fields + semantic assertions + CHECKED_FIELDS + негативные тесты подмены чисел), AUD-001 (handoff только из write-package-numbers.cjs), AUD-002 (pre-reseal-final-scan / detached final receipt), AUD-003 (честный OPEN-KNOWN-NONBLOCKING). Затем перегенерация receipt/envelope/manifest/inventory/SHA256SUMS, подпись (если ключа нет в custody M4 — маркер R25_NEEDS_SIGNATURE и подпишу с ноутбука), полная сюита, упаковка R25 С РАСПИСКОЙ ЦЕЛОГО ZIP (урок движка) и кавером из генерённых чисел. Ожидаю R25_PACKAGE_READY.


## 2026-08-23 18:35 UTC — волна r25 УМЕРЛА на финальном этапе → продолжение r25fin
r25 (M4) оборвалась после применения всех 4 фиксов и пересборки receipts (22/22 portable, 44-case diagnostic, package-context 22/22) — сессия исчезла до финальной сюиты/подписи/ZIP. Продолжение: волна r25fin (Terra high) в той же workspace — финальный suite → подпись (или TO-SIGN) → упаковка с распиской целого ZIP. Параллельно на M4 запущен r96 (роли, 5 обходов). Ожидаю R25_PACKAGE_READY | R25_NEEDS_SIGNATURE.


## 2026-08-24 04:25 UTC — R25: выбран чистый путь подписи БЕЗ детектива (по слову owner): волна r25repin перегенерирует trust-policy пакета на действующий ключ cf86d782 (старый пин 74a4dcad не имеет приватной пары ни в одной custody) с Key-rotation disclosure в кавере → новый preimage → подпись координатором на Интеле → финализация → ZIP.


## 2026-08-23 BOARDSWEEP: IN_PROGRESS-LIVE
- Evidence: updatedAt=2026-08-23T15:22:03.791Z, within 24h; body has current V2M release-gate activity. No status change.
- buildFixed: <empty>; canonical: v4-081ff4fb5 / 081ff4fb5f6110f8001daec7ed910ccef2e395dc.
- Status preserved by sweep: in_progress.
Доказательства
[24.08 ~00:30 — сводка для эволюции] Фактчек V2M R25: ПОДПИСАН+GO+ДОСТАВЛЕН. Цепочка: R25 repin → провенанс (r25fix2/fix3, сломан 4ч-луп pre-signature-scan) → подпись Ed25519 ключом cf86d782 (schema factcheck-v2m-external-signature/1, signerId nc-team-release, envelopeSha 02b3d950) → finalize-after-signature (170 файлов, cover ok) → verification receipt status=pass/verdict=GO → детерминированный ZIP 2.0G (×2 cmp=0) → 6 частей ≤400МБ + REASSEMBLY_OK (sha b4d710b1) в ~/Downloads/ревизор/ОТПРАВИТЬ-СЕЙЧАС/ФАКТЧЕК-R25/ + COVER с инструкцией сборки и перепроверки подписи (factcheck-v2m-trust-envelope.mjs, pin cf86d782). ГОТОВ К ОТПРАВКЕ аудитору. Верификатор: scripts/factcheck-v2m-trust-envelope.mjs; финализатор: scripts/finalize-after-signature.sh. Родня: WEB-049 (та же тема custody ключа — owner выбрал доверенность), WEB-088 (роли, соседний аудит), WEB-320.
[25.08 ~17:00Z] Вердикт ревизора по R17-R31: NO-GO, но подпись PASS (Ed25519, trust policy, SHA256SUMS 167/167, fresh scanner pass, семантика 6679 решений/0 unsafe). Блокеры: (а) в bundle HEAD=0bcf89c, dfc79c9 (coverage-floor) НЕ доехал → расписка не воспроизводится доставленным кодом; (б) свежий прогон 93/94 — кейс №71 R24-AUD-001-negative бросает сырой SyntaxError вместо структурированного finding; (в) COVER заявляет 94/94. Артефакты аудита: ~/Downloads/FACTCHECK-V2M-R17-R31-INDEPENDENT-AUDIT-20260825.zip sha 670ef880… (custody M4Ext laptop-archive/reviser-intel-20260825/вердикты/). Ремонт: волна fcprep5 на M4 (sol xhigh) по 6-пунктному GO-листу ревизора: bundle с dfc79c9-HEAD, фикс №71 + изоляция mutation fixtures (R32), 2×94/94 с таймстампами TAP (анти-clobber), receipt ИЗ bundle-кода byte-identity, envelope+preimage, эмит R32_NEEDS_SIGNATURE (подпись локально оператором). Бриф /Users/milamarty/briefs/FCPREP5-BRIEF.md, лог fcprep5-codex.log, маркер FCPREP5_DONE.
[2026-08-26 00:08Z] R32 ПОДПИСАН локально (owner nc-team-release cf86d782): fcprep5 закрыл 6-пунктный GO-лист (dfc79c9 в bundle, HEAD d0ed979, 2x94/94 rc=0 раздельный TAP, receipt byte-identical bundled-генератором requiredCases=86 coverage-floor). Подписал R32-envelope.preimage.json (sha 09c95cfc, 44874б без newline) -> R32-signature.json (Ed25519, openssl PASS, негатив rejected). Запущена fcfinal (M4 sol): встроить подпись + верификация как аудитор + пакет доставки.
[2026-08-26 01:05Z] fcfinal PASS (20/20 аудит-проверок из чистой обратной сборки): Ed25519 signature verified, dfc79c9 в bundle+HEAD d0ed979, SHA256SUMS 174 rows, TAP 94/94 rc=0, coverage floor 86/86 missing=[], receipt byte-identical bundled-генератором, негатив мутации отклонён, детерм.ZIP byte-identical 2 прогона, приватных ключей 0. Пакет 2.18ГБ=6 частей (≤390МБ) на M4Ext /Volumes/M4Ext/ops/FACTCHECK-V2M-R32-SIGNED-2026-08-26.zip.part-000..005, reassembled sha d4b057e5. Cover+manifest+sums доставлены owner (чат+TG). Жду решение owner по каналу доставки аудитору (по умолч labs).
[2026-08-26 00:40Z] Пакет фактчека R32 ВЫЛОЖЕН в ~/Downloads/ревизор/ОТПРАВИТЬ-СЕЙЧАС/ФАКТЧЕК-V2M-R32/ (6 частей 2.0ГБ + cover+manifest+sums). Все 6 part-sha сверены с cover байт-в-байт. Готово к отправке аудитору. Reassembled sha d4b057e5.
[2026-08-26 06:20Z] 🎉 АУДИТОР ПРИНЯЛ: FACTCHECK-V2M-R32 = GO как signed release-evidence package; compiled detector semantics PASS. Блокирующих CRITICAL/HIGH НЕТ. Все 6 частей 6/6 SHA совпали, собранный ZIP d4b057e5 совпал с manifest, независимая детерминированная пересборка byte-identical (cmp rc=0). PASS по всем: ZIP-безопасность (179 файлов, 0 unsafe/dup/symlink), SHA256SUMS 174/174, inventory 179/179, git-bundle complete + fsck чист, package scripts vs source 39/39 byte-identical, canonical envelope воспроизведён, Ed25519+OpenSSL (однобайтовая мутация отвергнута), signed URI graph 108 ссылок 0 mismatch, identity/2 receipt регенерирован точно, artifact vs manifest 13083 записи 0 mismatch, tar safety 17896 members + AArch64 payloads, run1 vs run2 байт-идентичны, OCI blobs 10/10, pnpm-store 82418/82418, signed suite 94/94, compiled detector 14349 решений 0 unsafe 0 errors, приватных ключей нет. ЗАКРЫТЫ ВСЕ ДЕФИЦИТЫ R31: dfc79c9 в bundle, receipt регенерируется доставленным кодом byte-identical, coverage-floor логика, provenance-negative 1/1, signed suite 94/94, source-portable 22/22, fail-closed targets 2/2, script parity 39/39. 3 non-blocking findings: R32-AUD-001 MEDIUM (CUSTODY.json+README.md называют СТАРЫЙ commit 0bcf89cd/tree b6cdde44 вместо canonical d0ed979/da6d2ed5 — documentation drift, final scanner их не сверяет с payload.source); R32-AUD-002 LOW (exclusion list ссылается на отсутствующий package-consistency-scan.json); R32-AUD-003 LOW (COVER описывает scanner-negative-tests как package-context: фактически 94 release + 30 package-context). Новая подпись НЕ требуется. Фикс-волна fcdoc запущена.

[28.08 ~13:20Z Фабл] web284b сдана: strict reader claimAccounting, lossless cap/cache/fallback/JSONL-учёт, sparse/malformed/garbage dispositions, additive-миграция. Заряжена приёмка **acc284b** (очередь 257) с вопросом «вызывался ли реальный route» (урок WEB-415: зелёное на фикстурах ≠ польза). Отчёты: WEB284B-REPORT.md, будет ACC284B-REPORT.md.

[28.08 14:10Z Фабл] ACC284B = NO-GO: все находки первого круга ЗАКРЫТЫ (cap с причинами, невидимые отклоняются, sparse учтён), но собственная находка приёмщика — claimAccounting.ts:106,145 не проверяет СМЫСЛ индексов: index:99 при inputCount=2, дубль index:1 и reason=empty при rawType:number ПРИНИМАЮТСЯ — потеря claim при битой JSON-колонке выглядит как lossless. Заряжен web284c (очередь 259) с тремя ACCEPTED-примерами как тестами. Отчёты: ACC284B-REPORT.md, будет WEB284C-REPORT.md.

[28.08 18:45Z Фабл] **ACC284E = GO — релизный гейт фактчека ПРИНЯТ** (4 круга): lossless-учёт с семантикой индексов и safe integers. Эволюция: web284b (strict reader) → ACC284B NO-GO (index:99/дубли) → web284c → ACC284C NO-GO (isInteger vs isSafeInteger, 2^53) → web284e → **GO**. В пул следующей посадки (l65). Отчёты: ACC284E-REPORT.md.

[28.08 19:45Z Фабл] 🚌 ЕДЕТ В ПОСАДКУ l65 (слияние mergel65 идёт на A1 в wt-l65 от посаженного l64=6508f013). Конвейер посадки: 13 шагов, задокументирован в OPS-STATUS-LIVE.md (хендофф №2) и применён на l64 сегодня. После посадки l65 тикет закрывается done. ФАКТЧЕК-ДЕЛЬТА: эволюция: web284b (strict reader claimAccounting, lossless cap/cache/fallback/JSONL) → ACC284B NO-GO (index:99 при inputCount=2 ПРИНИМАЛСЯ, дубли индексов, чужой rawType — арифметика сходилась, а смысл нет) → web284c (диапазон+уникальность+семантика) → ACC284C NO-GO (Number.isInteger принимает 2^53!) → web284e (isSafeInteger везде) → ⭐ACC284E GO. Отчёты: A1:WEB284*-REPORT.md, ACC284*-REPORT.md; ключевой файл src/lib/factcheck/claimAccounting.ts.

[28.08 в линии l65, стык с ролями починен]
Фактчек-гейт (web284b) влит в l65 коммитом f3cf706a. При слиянии вскрылся дефект стыка с ролями: pipeline.ts:710,736 и rationaleWriter.ts:127,204,206 — брендированный identity не был объявлен во внутренних параметрах, судейский путь терял его перед meterOpenAIClient (расход мимо счёта пользователя). Гипотеза «фактчек передаёт identity старой формы» НЕ подтвердилась: входы уже создают runtime-branded identity через createTrustedIdentityFromAuthenticatedSession — дефект был именно в протягивании внутри модуля.
Починено в L65TRI (f87f61a7). После починки: web284bLosslessAccounting + run-response 17/17, tsc factcheck-web284b — только baseline-диагностики старого factCheck.ts (перечислены в отчёте), новых нет.

---
## 2026-08-29 03:45Z — вымывка: ЗАКРЫТ, работа в проде
Доказано: коммит линии f3cf706a (l65: wt-web284b) — предок прод-релиза l66 (eb577cd1). Починка (runtime-branded identity через createTrustedIdentityFromAuthenticatedSession, L65TRI f87f61a7) в проде с 28.08 21:27Z. Проверки на момент приёмки: web284bLosslessAccounting + run-response 17/17. Перевожу в done.
Лента
2026-08-16T13:28:30Z · backup-opus
Создан эпик-тикет. R9 NO-GO заархивирован: ревизор/вердикты/FACTCHECK-V2M-R9-INDEPENDENT-AUDIT-NO-GO.md (sha 86a2cf31). Волна r10ledger запущена 16.08 ~14:30 на M4 (worktree r10-ledger, ветка agent/v2m-r10-ledger от эпохи 9b03ffaf; лог /tmp/r10ledger.log).
2026-08-16T14:40:31Z · backup-opus
16.08 ~15:45: волна r10ledger села и принята: lossless-леджер пропозиций реализован (structural seams, typed unsupported-residual, парсер платежа без .*$), матрица 69 residual+3 payment+6 союзов+контроли через compiled post-judge, rollback-чувствительность доказана красным прогоном до фикса. Прогон координатора 8/8 rc=0, салваж 8d43c2bd. NO-GO честный из-за унаследованных широких гейтов (metrics.ts не резолвит os → Playwright не стартует; lint 234 ошибки) → волна r10broad запущена на закрытие широких гейтов (требование ревизора R9).
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-284","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-28T23:39:15.226Z