WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-412 · Задача · — · web

[WEB370-N] Полная ship-dark репетиция и evidence pack

Закрыт P1 · важно ведёт: — эпик: WEB-395
Суть
Источник: WEB370PLAN2. Зависимости: WEB370-E,H,I,J,K,L,M. Оценка: 1.5 дня. Обязательный gate; без production cutover.
Чем закрывается (приёмка)
Две изолированные DR rehearsals alert→canary ≤12m; restore ≤3m; evidence pack содержит hashes/timestamps/ports/lease/fence/backup age и не содержит secrets.
Доказательства
[2026-08-27 19:45Z] web412n стартовала на A1 (luna xhigh): полная ship-dark репетиция по runbook WEB409K, evidence против RTO 15м, gap-лист = вход WEB370-O. Owner GO 07:57 («действуйте, что мы ждём»).

[2026-08-27 ~07:40Z web412n DONE] Ship-dark репетиция: WEB412N_REHEARSAL=PASS_WITH_GAPS, PRODUCTION_CUTOVER=NO-GO (честно). Локальная механика ВСЯ прошла: preflight, синтетический Ed25519 lease (negative: конкурирующий grant отклонён), лейны app/Signal/TG/SIP/audio/PG, readiness barrier T+29s, rollback T+29s, clean T+30s — против RTO 900s. Прод не мутировался. ГЛАВНЫЕ GAPS для WEB370-O: A1 storage gate WEB402D (24.7GB vs 85.9GB) + state-permissions; нет verified Pi backup c A1 (сети нет); WEB400B snapshotctl/signed manifest/reverse-delta отсутствуют; production lease/fence/observation window не доказаны; TG/Signal/SIP только mock/loopback. Evidence: A1:/home/ubuntu/waves/WEB412N-evidence/ (81-file sha256 manifest, gaps.tsv + gap-list-expanded.tsv). Волна аудита диска a1storage поставлена в очередь (план до 90GiB, без удалений).

[2026-08-27 ~07:40Z web412n DONE] Ship-dark репетиция: WEB412N_REHEARSAL=PASS_WITH_GAPS, PRODUCTION_CUTOVER=NO-GO (честно). Локальная механика ВСЯ прошла: preflight, синтетический Ed25519 lease (negative: конкурирующий grant отклонён), лейны app/Signal/TG/SIP/audio/PG, readiness barrier T+29s, rollback T+29s, clean T+30s — против RTO 900s. Прод не мутировался. ГЛАВНЫЕ GAPS для WEB370-O: A1 storage gate WEB402D (24.7GB vs 85.9GB) + state-permissions; нет verified Pi backup c A1 (сети нет); WEB400B snapshotctl/signed manifest/reverse-delta отсутствуют; production lease/fence/observation window не доказаны; TG/Signal/SIP только mock/loopback. Evidence: A1:/home/ubuntu/waves/WEB412N-evidence/ (81-file sha256 manifest, gaps.tsv + gap-list-expanded.tsv). Волна аудита диска a1storage поставлена в очередь (план до 90GiB, без удалений).

[2026-08-27 09:01Z a1clean ФАЗА 1 — storage gate WEB402D частично] Освобождено +42.57 GiB (df available 22.67GB -> 63.68 GiB, диск 89%->68%) удалением ТОЛЬКО корневых .next/.next-off в 25 worktree; node_modules/кэши/бандлы/исходники не тронуты, git gc/prune/clean не запускались, сборок не было. Protocol соблюдён перед каждым удалением (ps+CWD-скан /proc+tmux ls); активные волны и все wt-l59* исключены ДО формирования кандидатов; совпадений не было. Gate 90 GiB НЕ достигнут: не хватает 26.32 GiB. Предложенная автором фаза 2 (fanb-restore ~1.1GB + dead-souls ~1.07GB) закрывает лишь ~2 GiB — недостаточно. ДИСПАТЧНУТА a1clean2: удалять ЦЕЛЫЕ worktree, чей HEAD уже ПРЕДОК l59 (2c6c2276) по bare-референсу из /tmp/l59-2c6c2276.bundle И дерево чистое (включая untracked) — история при этом сохранена в бандле (копии на A1/M4/laptop); всё, что не проходит критерий, бандлится в /home/ubuntu/bundles и ждёт вывоза на M4Ext. Отчёт A1:A1CLEAN-REPORT.md.

[2026-08-27 09:31Z a1clean2 — фаза 2] Инвентаризировано 167 worktree: 68 удалено (только через git worktree remove, по одному, с повторной protocol-проверкой HEAD/status/ancestor-l59/CWD/args/open-fd/tmux перед каждым; блокировок 0), 93 оставлено и ЗАБАНДЛЕНО (bundle verify пройден), 5 неприкосновенны. df available 76.04 GiB; gate 90 GiB НЕ достигнут, дефицит 19.18 GiB. Бандлы занимают 13.23 GiB — координатор запустил ВЫВОЗ A1->laptop->M4Ext (/Volumes/M4Ext/ops/a1storage-20260827, 3.8 ТБ свободно) со сверкой sha256 на приёмнике; после вывоза и удаления бандлов ожидается ~89 GiB, остаток закрывается fanb-restore+dead-souls (~2 GiB).

[2026-08-27 ~11:15Z STORAGE GATE ПРАКТИЧЕСКИ ЗАКРЫТ] A1 available: 23.08 GiB (утро) -> 88.85 GiB (сейчас), диск 96% -> 54%; норматив WEB402D 90 GiB, остаток 1.15 GiB. Как получено БЕЗ потери истории: (1) 98 бандлов вывезены A1->laptop->M4Ext конвейером «скачал-отправил-удалил» (транзит переполнял ноут — первая попытка упала с No space left), sha256 сверены НА ПРИЁМНИКЕ 98/98 OK, только потом удалены с A1; (2) доукомплектовано ещё 13 (dead-souls 10 + свежие бандлы fanb6/7/8) — сверено 13/13; (3) удалено воспроизводимое: prod-dump.dump 1.2 ГБ (лишняя копия боевых данных на A1), l34-next-saved 5.6 ГБ (чистый build output), r13pack/pnpm-store-repro 2.2 ГБ, b2sidecar/src-tree 2.5 ГБ + b3pack/src-tree 0.5 ГБ (полные копии исходников, восстановимы из бандла l59). Итого на M4Ext /Volumes/M4Ext/ops/a1storage-20260827/: 111 бандлов, 16 ГБ, все со сверенными контрольными суммами.

[2026-08-28 05:13Z tickacc6] ВЕРДИКТ: частично доказано
Что проверил: прочитал WEB412N-REPORT.md, rehearsal.log, timeline.tsv, all-health-readiness-green.txt, clean-state.txt, gaps.tsv, lease/overlap-negative.txt и lease/checker-after-release.txt; выполнил sha256sum -c WEB412N-evidence/ship-dark-20260827T072813Z/evidence-sha256.txt и sha256sum -c input-report-hashes.sha256; сверил timeline и текущие A1 markers/listeners.
Что увидел: evidence manifest даёт 81/81 OK. Исторический run достиг simultaneous readiness на T+29 s, rollback T+29 s и clean-state T+30 s; lanes явно mock/loopback/fixture, provider_egress=not_invoked, postgres=restored_fixture. Overlap negative и checker-after-release дают ожидаемый failure rc=1. Сам rehearsal.log содержит WEB412N_REHEARSAL=PASS_WITH_GAPS и PRODUCTION_CUTOVER=NO-GO. Input manifest даёт 12 OK, но WEB409K-RUNBOOK.md имеет FAILED checksum; текущий файл sha256=3ed529a5ab42a761ec658a2cfeaafc8a367d1929a17e90ddca97a2c12dd175af.
Отрицательный тест: проверил overlap-negative: M1 arbiter DENY и EXPECTED_FAILURE_PASS rc=1; проверил checker-after-release: DENY при отсутствии ACTIVE marker и rc=1; на текущем A1 5060/5061 также refused. Production fence/provider/restore negative не выполнял: это потребовало бы недоступных M1/Pi и/или запрещённой мутации/внешнего прогона.
Свежесть: rehearsal начат 2026-08-27T07:28:13Z, до заявленной посадки l63 2026-08-27T225328Z. Локальная целостность пакета доказана, но production current l63 не доказан; содержимое пакета само ограничивает результат NO-GO.
Чего не хватает: новый пакет после l63 с release/commit/label; доступная verified Pi backup и реальный disposable production restore; A1 storage/state-permissions gate; production M1 lease/key/renew и Pi power/network fence; production app/release/readiness; actual Signal fork/tunnel/store, Telegram inventory/source/state/replay, SIP gateway/provider route; разрешённые authenticated canaries/receipts и observation window. Input manifest также надо переснять после стабилизации WEB409K-RUNBOOK.md. До этого статус должен быть in_progress.

[записал координатор: волна tickacc6 не смогла дописать сама — с A1 НЕТ сетевого доступа к M1 (ssh timeout), выводы перенесены вручную]

---
## 2026-08-29 09:50Z — сценарий репетиции готов; репетицию НЕ проводим до починки тумблера
WEB412SHIP сдан (NOCOMMIT — документ, не код): пошаговый сценарий, evidence pack и главное — объективная проверка «голосовое окно свободно». Источники active voice в схеме l67: VoiceSession (active/completing), MeetingLeg (pending/active), MeetingRoom (active/ending); TelephonyEventLog — append-only audit, НЕ authoritative. /api/health отсутствие звонков НЕ доказывает.
Требуются ЧЕТЫРЕ независимых класса наблюдений перед стартом: счётчики в БД, счётчики каналов/звонков Asterisk, состояние systemd/cgroup/слушателей, read-only статус маршрутов/edge. Lease beacons из WEB405F дополняют, но отсутствие отдельного metrics endpoint = ABORT, а не предположение о нулевой нагрузке. Это ровно ответ на условие owner-а «в момент, когда другие не работают с голосом».
⚠️ РЕПЕТИЦИЮ НЕ ПРОВОДИМ: тумблер (WEB-409) не принят — ACC409I NO-GO (путь к PASS через неаутентифицированные default sidecar-файлы: влияют на вердикт, но не попадают в подпись и InputSeal). Идёт круг 9 (WEB409I, опус). Порядок: посадка l68 → починка тумблера → репетиция в проверенное окно.

[29.08 БЛОКЕР СНЯТ: тумблер принят] ACC409L_VERDICT=GO, коммит c6b8bde3 (одиннадцатый круг). Прежняя запись «репетицию не проводим, тумблер не принят» больше не действует.
⚠️ НО: принятый тумблер ЕЩЁ НЕ НА ПРОДЕ — он кандидат в линию после l69. Репетиция возможна только на сборке, где он есть. Порядок: посадка l69 -> следующая линия с тумблером и остальными принятыми работами -> репетиция в проверенное окно -> переключение по решению владельца.
Заряжена WEB412READY (очередь 496): подготовить репетицию так, чтобы она прошла с первой попытки — определение окна «никто не работает с голосом» (отсутствие метрик = ABORT, а не предположение о нулевой нагрузке), готовые команды по шагам, список стоперов с проверкой каждого одной командой, состав пакета доказательств, откат с любого шага. Прогон делает координатор осознанно, волна против прода и Oracle ничего не запускает.


[BOARDTRIAGE] 29.08: ACC409L GO снял блокер тумблера, но он ещё не в проде; WEB412READY готовит две проверяемые репетиции с abort при отсутствии метрик. Cutover не запускать.
Лента
2026-09-02T08:00:40.916Z · Fable
[02.09 08:10Z Фабл] Волна 1156-web370n поставлена (Luna xhigh, база l89): полная ship-dark репетиция цепочки слайсов на loopback/high-портах + evidence pack /home/ubuntu/waves/WEB370N-EVIDENCE + чек-лист для O (cutover) с откатом и 60-мин наблюдением. Живые стеки/identities не трогаются. Owner 02.09 07:58Z: дефолтный GO на закрытие хвостов эпика.
2026-09-02T08:01:38.241Z · Fable
[02.09 08:15Z Фабл] Поправка: слайс N уже пройден 30.08 20:26Z (волна wave/web370n, wt-854-n, база a9ddd25f): WEB370N=PASS, SHIP_DARK_REHEARSAL=PASS, PRODUCTION_ACTIVATION=NO-GO (synthetic receipts ≠ доказательство production). Отчёт A1 /home/ubuntu/waves/WEB370N-REPORT.md (пины: L coordinator 0b38fba6…, M1 authority 298ebbe2…, lease checker a35642df…, Pi fence cd6ba59e…, B4 backup/restore ee1a9916…), ранбук WEB409K-RUNBOOK.md 76e7756b…, маркер WEB370N_DONE.20260830. Дублирующую волну 1156 снял. Закрываю слайс N как выполненный gate; переход к O — по чек-листу из отчёта после провенанса C (WEB-401).
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-412","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-02T08:01:38.264Z