WEB-413 · Задача · — · web
[WEB370-O] Production cutover и 60-минутное наблюдение
Парковка
P1 · важно
ведёт: —
эпик: WEB-395
Суть
## Суть одной фразой
[WEB370-O] Боевой переход активного хоста телефонии/мессенджеров Pi→A1: fence Pi, A1 становится единственным active, 60-минутное наблюдение за полезной работой, откат по порогам. iMessage остаётся на M1.
## Где мы сейчас (13.09.2026)
Карточка parked: переход заблокирован на трёх предусловиях — тумблер WEB-409 не принят, репетиция WEB-412 не PASS (последняя известная — PASS_WITH_GAPS 27.08), провенанс артефактов WEB-401 не закрыт. Прод = l115j (133fe00c, 13.09 08:50Z). Телефония уже работает на A1 (шлюз 5c4c9d2b, живой звонок 7016→8000 с 02.09 14:30). Волной 3689 подготовлен боевой план CUTOVER-PLAN.md + почасовой WATCH-HOUR.md.
## План перехода готов (волна 3689, 13.09)
Фазы: (0) предусловия-стоперы S1–S7 — WEB-409 принят, WEB-412 PASS, WEB-401 provenance, нет активных звонков, аттестация без расхождений, WAL lag ок, PRE_CUTOVER GO владельца → (1) fence Pi (PDU OFF / ACL deny) + revoke Pi lease + grant A1 lease + флип тумблера 409 → ТОЧКА НЕВОЗВРАТА → singleton proof (TG/Signal 1/1) + SIP cap=5 + canary-звонок 7016→8000 + POST_CANARY GO → (2) 60-минутное наблюдение (WATCH-HOUR.md: по минутам, конкретные числа и пороги отката, проверка полезной работы — звонки завершаются, нет stuck/cross-talk/дублей, платный шлюз не закрыт) → (3) откат R0–R4 зеркальный при любом пороге. Каждый шаг: действие / критерий успеха / действие при отказе. Разделение: координатор один vs окно владельца. Честный ответ: данные, записанные на Oracle за время наблюдения, при откате на Pi не возвращаются.
## Критерий закрытия
Один active host/epoch (A1 active, Pi fenced); Signal/TG singleton proof; SIP cap=5; нет duplicates/cross-talk/stuck sessions; 60 минут green; iMessage остаётся на M1. Выполняется ТОЛЬКО после: WEB-409 toggle принят + WEB-412 репетиция PASS + WEB-401 provenance + явный GO владельца на каждом гейте (PRE_CUTOVER / POST_CANARY). Трекает координатор.
---
## История (старый текст, сохранён ниже)
---
## история (тело до 13.09.2026)
1. Суть одной фразой: Переключение на прод (parentId WEB-395).
2. Где мы сейчас (13.09.2026): заблокировано на тумблере/репетиции; runbook WEB413CUT готов.
3. Хронология: подготовлен runbook; блок на WEB-409 (toggle) + WEB-412 (репетиция) + WEB-401 (provenance).
4. Карта документов и кода: runbook WEB413CUT; WEB-409, WEB-412, WEB-401.
5. Остаток: координатор отслеживает; владелец даёт явный GO на каждом гейте.
6. Критерий закрытия: УСЛОВИЕ ПРОБУЖДЕНИЯ: WEB-409 toggle принят + WEB-412 репетиция PASS + WEB-401 provenance + явный GO владельца на каждом гейте. Трекает координатор.
---
## история (тело до 13.09.2026)
Источник: WEB370PLAN2. Зависимость: WEB370-N. Оценка: 0.5 дня. НЕ СТАРТОВАТЬ без успешного N, fencing Pi и явного owner GO.
## ДЛЯ НУЛЕВОГО АГЕНТА (обновлено 2026-09-05 UTC)
- **Суть одной строкой:** [WEB370-O] Production cutover и 60-минутное наблюдение
- **Текущее состояние:** статус: parked; Источник: WEB370PLAN2. Зависимость: WEB370-N. Оценка: 0.5 дня. НЕ СТАРТОВАТЬ без успешного N, fencing Pi и явного owner GO. | [02.09 08:10Z Фабл] Owner 02.09 07:58Z дал дефолтный GO на закрытие хвостов миграции; cutover (O) выполняется ТОЛЬКО после GATEPASS слайса N (WEB-412, волна 1156) и провенанса артефактов C (WEB-401, координатор с Pi), по чек-листу WEB370N-CUTOVER-CHECKLIST.md, с 60-мин наблюдением и откатом; owne… | [02.09 09:35Z Фабл] Подготовка 8000→live (1164-lane8000, коммит bef003530e, ветка lane8000-1164, бандл в mirrors/lines): кандидат dialplan (guarded live-блок для 8000 с fallback на AGI) + LANE8000-CHECKLIST.md (шаги, проверки без звонка, тестовый звонок owner-а, критерии «Six by Y»+голосовое пере… | [A1 13:52 Фабл] Состояние O для нулевого агента (из трейла WEB-410/WEB-395): лестница K✅ (ранбук 9854b1f2, state-матрица CP×{fence,lease,holder,route,grant}, два owner-gate PRECUTOVER/POSTCANARY с decision record, rollback R0–R4) → L✅ (dr-takeover с fence = только PDU OFF/ACL deny, single-flight,… | [A1 17:15 Фабл] Кит переезда Telegram-ботов Pi→A1 (owner GO 16:17 «дефолтный GO везде»): волна 1261-web413tgcutover сдана (коммит 22d9862d, ops/web370/messenger-cutover-kit.md; отчёт A1 /home/ubuntu/waves/WEB413TGCUTOVER-REPORT.md). Стейджинг на A1 готов: /home/ubuntu/waves/web370-a1-staging/{boo… | [A1 17:22 Фабл] Лизинг: арбитр WEB-405 на M1 НЕ установлен (нет /usr/local/libexec/web370, ключей нет); код — ops/web370-k7/{m1-lease-authority, host-guard, lease-holder-check, phase-journal, receipts, readback-proof, pinned-exec, fence-pi, r0a/r1p-recover}; на A1 стоит только чекер (ACTIVE/pub/l… | [A1 18:28 Фабл] Волна 1279-web413botfix сдана (локальный git /home/ubuntu/waves/web370-bots-fix, коммит d2346c3a; отчёт A1 /home/ubuntu/waves/WEB413BOTFIX-REPORT.md): NOSECRETLITERALS PASS (все литералы Telegram/OpenAI/Google убраны → только env), serviceaccount.json удалён (путь из GOOGLESERVICE… | [A1 17:58 Фабл] Кит аренды 1280-web413leasekit сдан (ветка web413leasekit-1280, ops/web370/lease-kit/; отчёт A1 /home/ubuntu/waves/WEB413LEASEKIT-REPORT.md): вердикт NO-GO до решений §8. Главное: (1) на A1 установлен WEB405G flat-чекер (marker 8 строк, lease 10 строк, ttl 15 с, без runnonce), а к…
- **Кто работал:**
- 2026-09-02T08:00:41.112Z — Fable — [02.09 08:10Z Фабл] Owner 02.09 07:58Z дал дефолтный GO на закрытие хвостов миграции; cutover (O) выполняется ТОЛЬКО после GATEPASS слайса N (WEB-412, волна 1156) и провенанса артефактов C (WEB-401, координатор с Pi), по
- 2026-09-02T09:21:41.604Z — Fable — [02.09 09:35Z Фабл] Подготовка 8000→live (1164-lane8000, коммит bef003530e, ветка lane8000-1164, бандл в mirrors/lines): кандидат dialplan (guarded live-блок для 8000 с fallback на AGI) + LANE8000-CHECKLIST.md (шаги, про
- 2026-09-02T13:48:23.274Z — Fable — [A1 13:52 Фабл] Состояние O для нулевого агента (из трейла WEB-410/WEB-395): лестница K✅ (ранбук 9854b1f2, state-матрица CP×{fence,lease,holder,route,grant}, два owner-gate PRECUTOVER/POSTCANARY с decision record, rollba
- 2026-09-02T17:07:40.599Z — Fable — [A1 17:15 Фабл] Кит переезда Telegram-ботов Pi→A1 (owner GO 16:17 «дефолтный GO везде»): волна 1261-web413tgcutover сдана (коммит 22d9862d, ops/web370/messenger-cutover-kit.md; отчёт A1 /home/ubuntu/waves/WEB413TGCUTOVER
- 2026-09-02T17:09:45.593Z — Fable — [A1 17:22 Фабл] Лизинг: арбитр WEB-405 на M1 НЕ установлен (нет /usr/local/libexec/web370, ключей нет); код — ops/web370-k7/{m1-lease-authority, host-guard, lease-holder-check, phase-journal, receipts, readback-proof, pi
- 2026-09-02T17:41:39.018Z — Fable — [A1 18:28 Фабл] Волна 1279-web413botfix сдана (локальный git /home/ubuntu/waves/web370-bots-fix, коммит d2346c3a; отчёт A1 /home/ubuntu/waves/WEB413BOTFIX-REPORT.md): NOSECRETLITERALS PASS (все литералы Telegram/OpenAI/G
- 2026-09-02T17:48:59.397Z — Fable — [A1 17:58 Фабл] Кит аренды 1280-web413leasekit сдан (ветка web413leasekit-1280, ops/web370/lease-kit/; отчёт A1 /home/ubuntu/waves/WEB413LEASEKIT-REPORT.md): вердикт NO-GO до решений §8. Главное: (1) на A1 установлен WEB
- 2026-09-02T18:19:41.121Z — Fable — [A1 18:50 Фабл] Приёмка 1289-accweb413botfix = NO-GO с одним блокером (A1 /home/ubuntu/waves/ACCWEB413BOTFIX-REPORT.md): все gates прошли (секреты 0, env fail-closed, tkinter, bounded Google init, compile, rsync), но в g
- 2026-09-02T18:30:33.243Z — Fable — [A1 18:40 Фабл] Волна 1291-web405a2authority сдана: коммит 5ed3704e96, «READY FOR INDEPENDENT WEB-405 ACCEPTANCE; production не применялся» (ветка web405a2authority-1291; отчёт A1 /home/ubuntu/waves/WEB405A2AUTHORITY-REP
- 2026-09-02T19:08:16.152Z — Fable — [A1 19:30 Фабл] Приёмка 1309-accweb413botfix2 = GO (A1 /home/ubuntu/waves/ACCWEB413BOTFIX2-REPORT.md): единственный блокер 1289 устранён (whispertranscriber.py:13 — baseline-семантика), литералы → os.environ (TELEGRAMTOK
- 2026-09-02T19:22:08.745Z — Fable — [A1 19:55 Фабл] Приёмка 1311-accweb405a2authority = NO-GO (A1 /home/ubuntu/waves/ACCWEB405A2AUTHORITY-REPORT.md): независимый fault/concurrency harness подтвердил wire-совместимость с чекером, bootstrap+fence receipt, du
- 2026-09-05T17:35:28.627Z — fable-coordinator — [2026-09-05 17:40Z] Ревизия доски (волна 2040 boardtriage, M1, luna): статус → parked. Основание: нет активности с 2026-08-29; нет репетиции и green observation. Если работа жива — верни статус и напиши в тикет, какая во
- **Ветки/бандлы/отчёты:** /home/ubuntu/waves/WEB413TGCUTOVER-REPORT.md, /home/ubuntu/waves/web370-a1-staging/{bookbot, /home/ubuntu/waves/web370-bots-fix, /home/ubuntu/waves/WEB413BOTFIX-REPORT.md, /home/ubuntu/waves/WEB413LEASEKIT-REPORT.md, /home/ubuntu/waves/ACCWEB413BOTFIX-REPORT.md, /home/ubuntu/waves/WEB405A2AUTHORITY-REPORT.md;, /home/ubuntu/waves/ACCWEB413BOTFIX2-REPORT.md; sha: bef003530e, 9854b1f2, 76e7756b, 5c4c9d2b, 22d9862d, d2346c3a, 531b15f70b6469f0736f1924ec18c43401eb4381, 5ed3704e96
- **KNOWN ISSUES / ТРАБЛШУТИНГ:**
- [02.09 09:35Z Фабл] Подготовка 8000→live (1164-lane8000, коммит bef003530e, ветка lane8000-1164, бандл в mirrors/lines): кандидат dialplan (guarded live-блок для 8000 с fallback на AGI) + LANE8000-CHECKLIST.md (шаги, проверки без звонка, тестовый звонок owner-а, критерии «Six by Y»+голосовое пере…
- [A1 17:15 Фабл] Кит переезда Telegram-ботов Pi→A1 (owner GO 16:17 «дефолтный GO везде»): волна 1261-web413tgcutover сдана (коммит 22d9862d, ops/web370/messenger-cutover-kit.md; отчёт A1 /home/ubuntu/waves/WEB413TGCUTOVER-REPORT.md). Стейджинг на A1 готов: /home/ubuntu/waves/web370-a1-staging/{boo…
- [A1 17:22 Фабл] Лизинг: арбитр WEB-405 на M1 НЕ установлен (нет /usr/local/libexec/web370, ключей нет); код — ops/web370-k7/{m1-lease-authority, host-guard, lease-holder-check, phase-journal, receipts, readback-proof, pinned-exec, fence-pi, r0a/r1p-recover}; на A1 стоит только чекер (ACTIVE/pub/l…
- [A1 18:28 Фабл] Волна 1279-web413botfix сдана (локальный git /home/ubuntu/waves/web370-bots-fix, коммит d2346c3a; отчёт A1 /home/ubuntu/waves/WEB413BOTFIX-REPORT.md): NOSECRETLITERALS PASS (все литералы Telegram/OpenAI/Google убраны → только env), serviceaccount.json удалён (путь из GOOGLESERVICE…
- [A1 17:58 Фабл] Кит аренды 1280-web413leasekit сдан (ветка web413leasekit-1280, ops/web370/lease-kit/; отчёт A1 /home/ubuntu/waves/WEB413LEASEKIT-REPORT.md): вердикт NO-GO до решений §8. Главное: (1) на A1 установлен WEB405G flat-чекер (marker 8 строк, lease 10 строк, ttl 15 с, без runnonce), а к…
- [A1 18:50 Фабл] Приёмка 1289-accweb413botfix = NO-GO с одним блокером (A1 /home/ubuntu/waves/ACCWEB413BOTFIX-REPORT.md): все gates прошли (секреты 0, env fail-closed, tkinter, bounded Google init, compile, rsync), но в gptbot/whispertranscriber.py:13 аргумент GPTCommunicator (str) был заменён фун…
- [A1 19:30 Фабл] Приёмка 1309-accweb413botfix2 = GO (A1 /home/ubuntu/waves/ACCWEB413BOTFIX2-REPORT.md): единственный блокер 1289 устранён (whispertranscriber.py:13 — baseline-семантика), литералы → os.environ (TELEGRAMTOKEN, OPENAIAPIKEY, OPENAIASSISTANTID, GOOGLESERVICEACCOUNTFILE), dry-import бе…
- [A1 19:55 Фабл] Приёмка 1311-accweb405a2authority = NO-GO (A1 /home/ubuntu/waves/ACCWEB405A2AUTHORITY-REPORT.md): независимый fault/concurrency harness подтвердил wire-совместимость с чекером, bootstrap+fence receipt, durability/flock, регресс; два пункта против production GO: (1) code-level — ес…
- **Эволюция:**
- 2026-09-02 → [02.09 08:10Z Фабл] Owner 02.09 07:58Z дал дефолтный GO на закрытие хвостов миграции; cutover (O) выполняется ТОЛЬКО после GATEPASS слайса N (WEB-412, волна 1156) и провенанса артефактов C (WEB-401, координатор с Pi), по чек-листу WEB370N-CUTOVER-CHECKLIST.md,
- 2026-09-02 → [02.09 09:35Z Фабл] Подготовка 8000→live (1164-lane8000, коммит bef003530e, ветка lane8000-1164, бандл в mirrors/lines): кандидат dialplan (guarded live-блок для 8000 с fallback на AGI) + LANE8000-CHECKLIST.md (шаги, проверки без звонка, тестовый звонок owner-
- 2026-09-02 → [A1 13:52 Фабл] Состояние O для нулевого агента (из трейла WEB-410/WEB-395): лестница K✅ (ранбук 9854b1f2, state-матрица CP×{fence,lease,holder,route,grant}, два owner-gate PRECUTOVER/POSTCANARY с decision record, rollback R0–R4) → L✅ (dr-takeover с fence = то
- 2026-09-02 → [A1 17:15 Фабл] Кит переезда Telegram-ботов Pi→A1 (owner GO 16:17 «дефолтный GO везде»): волна 1261-web413tgcutover сдана (коммит 22d9862d, ops/web370/messenger-cutover-kit.md; отчёт A1 /home/ubuntu/waves/WEB413TGCUTOVER-REPORT.md). Стейджинг на A1 готов: /hom
- 2026-09-02 → [A1 17:22 Фабл] Лизинг: арбитр WEB-405 на M1 НЕ установлен (нет /usr/local/libexec/web370, ключей нет); код — ops/web370-k7/{m1-lease-authority, host-guard, lease-holder-check, phase-journal, receipts, readback-proof, pinned-exec, fence-pi, r0a/r1p-recover}; н
- 2026-09-02 → [A1 18:28 Фабл] Волна 1279-web413botfix сдана (локальный git /home/ubuntu/waves/web370-bots-fix, коммит d2346c3a; отчёт A1 /home/ubuntu/waves/WEB413BOTFIX-REPORT.md): NOSECRETLITERALS PASS (все литералы Telegram/OpenAI/Google убраны → только env), serviceaccou
- 2026-09-02 → [A1 17:58 Фабл] Кит аренды 1280-web413leasekit сдан (ветка web413leasekit-1280, ops/web370/lease-kit/; отчёт A1 /home/ubuntu/waves/WEB413LEASEKIT-REPORT.md): вердикт NO-GO до решений §8. Главное: (1) на A1 установлен WEB405G flat-чекер (marker 8 строк, lease 1
- 2026-09-02 → [A1 18:50 Фабл] Приёмка 1289-accweb413botfix = NO-GO с одним блокером (A1 /home/ubuntu/waves/ACCWEB413BOTFIX-REPORT.md): все gates прошли (секреты 0, env fail-closed, tkinter, bounded Google init, compile, rsync), но в gptbot/whispertranscriber.py:13 аргумент
- 2026-09-02 → [A1 18:40 Фабл] Волна 1291-web405a2authority сдана: коммит 5ed3704e96, «READY FOR INDEPENDENT WEB-405 ACCEPTANCE; production не применялся» (ветка web405a2authority-1291; отчёт A1 /home/ubuntu/waves/WEB405A2AUTHORITY-REPORT.md; ADR ops/web370/authority-a2/DESI
- 2026-09-02 → [A1 19:30 Фабл] Приёмка 1309-accweb413botfix2 = GO (A1 /home/ubuntu/waves/ACCWEB413BOTFIX2-REPORT.md): единственный блокер 1289 устранён (whispertranscriber.py:13 — baseline-семантика), литералы → os.environ (TELEGRAMTOKEN, OPENAIAPIKEY, OPENAIASSISTANTID, GOO
- [02.09 08:10Z Фабл] Owner 02.09 07:58Z дал дефолтный GO на закрытие хвостов миграции; cutover (O) выполняется ТОЛЬКО после GATEPASS слайса N (WEB-412, волна 1156) и провенанса артефактов C (WEB-401, координатор с Pi), по чек-листу WEB370N-CUTOVER-CHECKLIST.md, с 60-мин наблюдением и откатом; owne…
- [02.09 09:35Z Фабл] Подготовка 8000→live (1164-lane8000, коммит bef003530e, ветка lane8000-1164, бандл в mirrors/lines): кандидат dialplan (guarded live-блок для 8000 с fallback на AGI) + LANE8000-CHECKLIST.md (шаги, проверки без звонка, тестовый звонок owner-а, критерии «Six by Y»+голосовое пере…
- [2026-09-05 17:40Z] Ревизия доски (волна 2040 boardtriage, M1, luna): статус → parked. Основание: нет активности с 2026-08-29; нет репетиции и green observation. Если работа жива — верни статус и напиши в тикет, какая волна её ведёт.
- **Следующий шаг:** Источник: WEB370PLAN2. Зависимость: WEB370-N. Оценка: 0.5 дня. НЕ СТАРТОВАТЬ без успешного N, fencing Pi и явного owner GO. | [02.09 08:10Z Фабл] Owner 02.09 07:58Z дал дефолтный GO на закрытие хвостов миграции; cutover (O) выполняется ТОЛЬКО после GATEPASS слайса N (WEB-412, волна 1156) и провенанса артефактов C (WEB-401, координатор с Pi), по чек-листу WEB370N-CUTOVER-CHECKLIST.md, с 60-мин наблюдением и откатом; owne…
Чем закрывается (приёмка)
Один active host/epoch; A1 active, Pi fenced; Signal/TG singleton proof; SIP cap=5; нет duplicates/cross-talk/stuck sessions; 60 минут green; iMessage остаётся на M1.
Доказательства
---
## 2026-08-29 10:00Z — взят в работу: подготовка боевого cutover (выполнение — по гейту owner-а)
Волна WEB413CUT (A1 queue/430, база l68 18af977a). Тикет был пуст — теперь несёт контекст.
Состояние линии на 29.08: аренда active/passive ПРИНЯТА (WEB-405, шесть кругов, ACC405F GO) — двух активных копий не будет; тумблер (WEB-409) НЕ принят (ACC409I NO-GO: путь к PASS через неаутентифицированные default sidecar-файлы, идёт круг 9); репетиция (WEB-412) — сценарий и объективная проверка «голосовое окно свободно» готовы, ждёт починки тумблера.
Требования круга: runbook с готовыми командами и моментом невозврата; 60-минутное наблюдение с КОНКРЕТНЫМИ метриками, периодичностью и порогами отката (не «следим за ошибками»); полный сценарий отката с любого шага, включая честный ответ про данные, записанные на Oracle за время наблюдения; список предусловий-стоперов (незакрытый тумблер, непройденная репетиция, активные звонки, расхождение аттестации, отставание WAL); сверка с WEB409K-RUNBOOK, WEB370DESIGN, WEB412SHIP без выдумывания своего.
[BOARDTRIAGE] WEB413CUT 29.08 10:00Z подготовил runbook; запуск блокируют непройденная репетиция, активные звонки, аттестация и WAL lag. 60-минутного green observation ещё нет.
Лента
2026-09-02T08:00:41.112Z · Fable[02.09 08:10Z Фабл] Owner 02.09 07:58Z дал дефолтный GO на закрытие хвостов миграции; cutover (O) выполняется ТОЛЬКО после GATE_PASS слайса N (WEB-412, волна 1156) и провенанса артефактов C (WEB-401, координатор с Pi), по чек-листу WEB370N-CUTOVER-CHECKLIST.md, с 60-мин наблюдением и откатом; owner-у — предупреждение о моменте переключения (звонки/боты).
2026-09-02T09:21:41.604Z · Fable[02.09 09:35Z Фабл] Подготовка 8000→live (1164-lane8000, коммит bef003530e, ветка lane8000-1164, бандл в mirrors/lines): кандидат dialplan (guarded live-блок для 8000 с fallback на AGI) + LANE8000-CHECKLIST.md (шаги, проверки без звонка, тестовый звонок owner-а, критерии «Six by Y»+голосовое перебивание, откат, риски: две активные копии/opus/8010–8014). Применение — отдельным шагом после контрольного звонка owner-а на 8000 по текущей посадке (шлюз посажен 09:10Z).
2026-09-02T13:48:23.274Z · Fable[A1 13:52 Фабл] Состояние O для нулевого агента (из трейла WEB-410/WEB-395): лестница K✅ (ранбук 9854b1f2, state-матрица CP×{fence,lease,holder,route,grant}, два owner-gate PRE_CUTOVER/POST_CANARY с decision record, rollback R0–R4) → L✅ (dr-takeover с fence = только PDU OFF/ACL deny, single-flight, lock lifecycle, identity держателя) → N✅ PASS (полная ship-dark репетиция 76e7756b, приёмка 855 → круг 858 дополнил O-инвентарь по §13). O стартует ТОЛЬКО при: (1) C провенанс arm64-артефактов — WEB-401, волна 1225 на M4 (рецепт сборки Asterisk 20.19.0+opus, verify, Dockerfile.arm64; затем сборка на A2 + сверка с живым A1 + публикация на Storage Box); (2) production B4 boundary; (3) freeze/unfreeze controller; (4) fencing Pi (PDU/ACL capsules, подписанные); (5) явный owner-GO на каждом gate. Живые предпосылки уже есть: A1 = боевой стек телефонии (шлюз 5c4c9d2b с восстановлением аренды, Asterisk 20.19.0 arm64), landing zone D установлена ship-dark, бэкапы v3 + репетиция аварии фаза 1/1b. После сдачи 1225 — план O с чек-листом и запрос GO owner-у. 2026-09-02T17:07:40.599Z · Fable[A1 17:15 Фабл] Кит переезда Telegram-ботов Pi→A1 (owner GO 16:17 «дефолтный GO везде»): волна 1261-web413tgcutover сдана (коммит 22d9862d, ops/web370/messenger-cutover-kit.md; отчёт A1 /home/ubuntu/waves/WEB413TGCUTOVER-REPORT.md). Стейджинг на A1 готов: /home/ubuntu/waves/web370-a1-staging/{bookbot,gptbot}, python 3.11.9 venv, py_compile 8/8 и 18/18. Вердикт кита: NO-GO на T0 — три кодовых блокера в самих исходниках с Pi: (1) секреты литералами в коде (Telegram-токены bookbot/gptbot, OpenAI-ключи в img-bot/Img/moderation/tts/whisper/file_bot, test_token.py, service_account.json в архиве) → удалить из кода, читать из /etc/web370/secrets/*.env, старые значения РОТИРОВАТЬ (owner: новые токены через BotFather + новый OpenAI-ключ); (2) gptbot импортирует _tkinter (headless A1 без GUI); (3) bookbot при импорте делает неограниченный сетевой I/O. Плюс инфраструктурный T0-блокер: лизинг активного хоста (WEB-405) требует /etc/web370/ACTIVE + публичный ключ арбитра M1 + volatile lease, подписанный M1 (ttl 15 с) — на A1 сейчас ship-dark (файлов нет), «никогда не делать руками»; координатор проверяет наличие арбитра на M1. Лизинг-чекер: только start|ongoing, fail-closed. → волна 1279-web413botfix (A1): вынести секреты в env, убрать _tkinter, ленивый I/O, dry-import тест без сети, rsync-контракт. Затем: ротация ключей (owner) → доставка в /opt/nc-landing/releases/web370-a1 + secrets → lease от M1 → T1 (stop+mask на Pi) → T2 (enable --now на A1, проверка 409) → T3 наблюдение 60 мин → откат R. Signal — отдельно (WEB-471). 2026-09-02T17:09:45.593Z · Fable[A1 17:22 Фабл] Лизинг: арбитр WEB-405 на M1 НЕ установлен (нет /usr/local/libexec/web370, ключей нет); код — ops/web370-k7/{m1-lease-authority, host-guard, lease-holder-check, phase-journal, receipts, readback-proof, pinned-exec, fence-pi, r0a/r1p-recover}; на A1 стоит только чекер (ACTIVE/pub/lease отсутствуют = ship-dark). Риск: M1 — ноутбук-доска (спит/падает), TTL 15 с с продлением с M1 → боты на A1 остановятся fail-closed при засыпании M1. → волна 1280-web413leasekit (A1): контракт из кода, локальная репетиция обоих концов в tmp, готовая процедура для координатора (M1 install → keygen → доставка на A1 → lease → check start → guard → enable ботов → продление/отзыв/откат) и оценка «M1 vs A2 как арбитр / TTL» — что допустимо без нового круга WEB-405. Исполнение — координатор, после ротации ключей owner-ом и GO приёмки 1279. 2026-09-02T17:41:39.018Z · Fable[A1 18:28 Фабл] Волна 1279-web413botfix сдана (локальный git /home/ubuntu/waves/web370-bots-fix, коммит d2346c3a; отчёт A1 /home/ubuntu/waves/WEB413BOTFIX-REPORT.md): NO_SECRET_LITERALS PASS (все литералы Telegram/OpenAI/Google убраны → только env), service_account.json удалён (путь из GOOGLE_SERVICE_ACCOUNT_FILE), _tkinter-импорт удалён (не использовался), Google/сетевые клиенты инициализируются лениво из main() с таймаутом и ≤3 попытками, dry-import без сети проходит, 26/26 py_compile, rsync-контракт deploy-excludes. Env-контракт: /etc/web370/secrets/bookbot.env = TELEGRAM_TOKEN, GOOGLE_SERVICE_ACCOUNT_FILE; gptbot.env = TELEGRAM_TOKEN, OPENAI_API_KEY (+OPENAI_ASSISTANT_ID — не секрет). Ротация (owner): оба Telegram-токена через BotFather, OpenAI-ключ, ключ Google service-account. Дальше: приёмка 1289-accweb413botfix (A1: свой скан секретов, env-контракт без сети, диф без логических правок) → ротация owner-ом → доставка в /opt/nc-landing/releases/web370-a1 + secrets (600) → лизинг (1280) → T1–T3.
2026-09-02T17:48:59.397Z · Fable[A1 17:58 Фабл] Кит аренды 1280-web413leasekit сдан (ветка web413leasekit-1280, ops/web370/lease-kit/; отчёт A1 /home/ubuntu/waves/WEB413LEASEKIT-REPORT.md): вердикт NO-GO до решений §8. Главное: (1) на A1 установлен WEB405G flat-чекер (marker 8 строк, lease 10 строк, ttl 15 с, без run_nonce), а канон WEB409K/K7–K13 использует другой wire-формат (JSON receipts, generations) — смешивать нельзя; (2) authority по контракту = M1 (ноутбук): сон/ребут → боты fail-closed SAFE_OFF — не production; перенос на A2 или смена TTL требуют нового круга WEB-405; (3) семь owner-gates: bootstrap из пустого authority (none→a1 после fence Pi), глобальный scope vs bot-only, fence-контроллер с квитанцией, transport identity (pinned SSH, forced-command receiver — в ките есть), доступность M1, T0-блокеры кода (1279 закрыла), durability flat authority. Решение координатора (дефолтный GO owner-а 16:17): M1-как-authority НЕ принимается; authority → always-on A2 новым кругом дизайна + независимой приёмки — волна 1291-web405a2authority (A1): ADR, bootstrap none→a1, bot-lane fence с квитанцией, pinned SSH A2→A1, flock+журнал, локальная репетиция, процедура; TTL 15 не меняется. Боты остаются на Pi до посадки. Owner-у сообщено 17:58 (возражений ждём, иначе идём).
2026-09-02T18:19:41.121Z · Fable[A1 18:50 Фабл] Приёмка 1289-accweb413botfix = NO-GO с одним блокером (A1 /home/ubuntu/waves/ACCWEB413BOTFIX-REPORT.md): все gates прошли (секреты 0, env fail-closed, _tkinter, bounded Google init, compile, rsync), но в gptbot/whisper_transcriber.py:13 аргумент GPTCommunicator (str) был заменён функцией process_question — семантическая правка вне контракта. → волна 1303-web413botfix2 сдана: коммит 531b15f70b6469f0736f1924ec18c43401eb4381 (возврат baseline-семантики, dry-import OK) → приёмка 1309-accweb413botfix2 (A1). После GO: ротация ключей owner-ом → доставка в /opt/nc-landing/releases/web370-a1 + /etc/web370/secrets (600) → лизинг по новому дизайну (1291, authority на A2) → T1–T3.
2026-09-02T18:30:33.243Z · Fable[A1 18:40 Фабл] Волна 1291-web405a2authority сдана: коммит 5ed3704e96, «READY FOR INDEPENDENT WEB-405 ACCEPTANCE; production не применялся» (ветка web405a2authority-1291; отчёт A1 /home/ubuntu/waves/WEB405A2AUTHORITY-REPORT.md; ADR ops/web370/authority-a2/DESIGN.md; локальная репетиция: lease ALLOW holder=a1 epoch=1 mode=ongoing, static unit poll-ит ongoing каждую секунду через BindsTo/PartOf). Дальше: независимая приёмка 1311-accweb405a2authority (A1: fault/concurrency harness как K11–K13 — wire-совместимость с установленным чекером, bootstrap none→a1 с квитанцией fence, kill -9/flock/power-loss, renewal/revoke/ребуты, pinned SSH, scope) + волна 1300-authoritypack (состояние authority в зашифрованный пакет на Storage Box + restore-authority — требование owner-а 18:08). Бандл: A1 /home/ubuntu/mirrors/lines/web405a2authority-1291.bundle; A2 ref web405a2authority-1291/head.
2026-09-02T19:08:16.152Z · Fable[A1 19:30 Фабл] Приёмка 1309-accweb413botfix2 = GO (A1 /home/ubuntu/waves/ACCWEB413BOTFIX2-REPORT.md): единственный блокер 1289 устранён (whisper_transcriber.py:13 — baseline-семантика), литералы → os.environ (TELEGRAM_TOKEN, OPENAI_API_KEY, OPENAI_ASSISTANT_ID, GOOGLE_SERVICE_ACCOUNT_FILE), dry-import без сети, rsync-контракт. Исходники ботов готовы к доставке (локальный git A1 /home/ubuntu/waves/web370-bots-fix, коммит 531b15f7; НЕ публиковать — baseline с литералами). Остаток до T1: ротация токенов/ключей owner-ом (BotFather ×2, OpenAI, Google service account) → secrets на A1 (600) → лизинг по новому дизайну WEB-405 (1291 на приёмке 1311, + 1300 authority-pack) → T1–T3.
2026-09-02T19:22:08.745Z · Fable[A1 19:55 Фабл] Приёмка 1311-accweb405a2authority = NO-GO (A1 /home/ubuntu/waves/ACCWEB405A2AUTHORITY-REPORT.md): независимый fault/concurrency harness подтвердил wire-совместимость с чекером, bootstrap+fence receipt, durability/flock, регресс; два пункта против production GO: (1) code-level — если bootstrap записал durable state и lease, но упал на публикации marker, повторный bootstrap запрещён и команды восстановления нет; (2) production-gates не закрыты (Pi apply с readback, независимый external fence, OOB A1 host-key fingerprint, фактический forced-command/sudoers, поведение при ребутах A2/A1, доказательство «app и телефония только на A1»). → волна 1326-web405a2authority2 (A1): транзакционная/восстанавливаемая публикация (journal PREPARED→COMMITTED→PUBLISHED, republish/resume, шимы kill-точек) + PRODUCTION-GATES.md с gates-check.sh и readback для координатора. Затем приёмка → установка на A2/A1 с прохождением gates → T1–T3 (после ротации токенов owner-ом).
2026-09-05T17:35:28.627Z · fable-coordinator[2026-09-05 17:40Z] Ревизия доски (волна 2040 boardtriage, M1, luna): статус → parked. Основание: нет активности с 2026-08-29; нет репетиции и green observation. Если работа жива — верни статус и напиши в тикет, какая волна её ведёт.
2026-09-10T18:55:03.759Z · coordinatorBOARD-WASH-20260910:WAVE-3339
По поручению владельца 18:43Z назначена исполнительская волна 3339 (infra), Codex gpt-5.6-luna xhigh, A1. Полная история карточки и база l115c 1ad52e16b доставлены, brief-guard и проверка Git-базы пройдены. Задача: проверить существующую сдачу, устранить остатки, передать бандл и доказательства. Финальная приёмка и посадка остаются за координатором. Ранее отложенная функция не включается; статус parked/backlog сохранён, идёт проверка технического остатка.
КАРТА ДОКУМЕНТОВ: ноут /Users/annakorin/nc-ops-scripts/board-wash-20260910/3339-wash-infra-brief.md; A1 /home/wave/waves/inputs/board-wash-20260910/infra-tickets.json; ожидаемый отчёт /home/wave/waves/3339WASHINFRA-REPORT.md. Правила обогащения: WEB-449.
2026-09-13T11:01:35.781Z · coordinator[13.09 11:01Z координатор] Мойка отложенных, волна 3668. Вердикт: ОСТАВИТЬ-ОТЛОЖЕННОЙ. Оставлена отложенной: блок на WEB-409/412/401; пробуждение — явный GO владельца на гейтах.
2026-09-13T12:01:51.612Z · coordinator[13.09 12:01Z координатор] Гигиена доски (волна 3676): забытый хвост эпика WEB-395 — боевой переход с шестидесятиминутным наблюдением. Эпик возвращён в работу, карточка перестала быть сиротой.
2026-09-13T12:13:40.076Z · coordinator[13.09 12:13Z координатор] Волна 3689. План боевого перехода написан: подготовка, точка невозврата, сам переход, час наблюдения по минутам, критерии отката. Оставляю карточку В РАБОТЕ, а не отложенной: у отложенного статуса должно быть условие пробуждения и тот, кто его сторожит, а здесь ждут три наших же дела — тумблер, репетиция и проверка собранных программ. Это наша работа, а не внешнее событие.
2026-09-14T15:16:27.774Z · coordinator[14.09 15:16Z координатор] # WEB-413 - блок для вставки
Источники, проверенные отсюда: тело тикета из live API; все 16 комментариев из локального `web-board.sqlite`, последний комментарий `id=4760` от 2026-09-13T12:13:40.076Z. Статус на live API при финальной сверке: `in_progress`.
## Что болит словами пользователя
Нужен production cutover с 60-минутным наблюдением, а не “кажется, уже на A1”. До этого нельзя считать WEB-370/WEB-395 закрытыми.
## Что уже сделано и чем доказано
План wave 3689 готов: preconditions, PRE_CUTOVER owner GO, fencing Pi/PDU/ACL/lease, grant A1, singleton TG/Signal, SIP cap, canary, POST_CANARY GO, 60-minute observation, rollback. Telephony gateway `5c4c9d2b` уже работает на A1 как отдельный факт, но это не cutover всего стека.
## Что осталось
Блокеры/предусловия: WEB-409 toggle не принят, WEB-412 rehearsal не PASS (последнее известное `PASS_WITH_GAPS`), WEB-401 provenance не закрыт. После них нужен owner-governed cutover и observation. Важная граница: данные, записанные на Oracle во время observation, не возвращаются на Pi при rollback.
## Противоречия между комментариями
Тело всё ещё содержит слово `parked`, но поздний комментарий `id=4760` прямо отменяет это: карточка должна быть “в работе”, не delayed, потому что blockers являются нашими задачами, а не внешним ожиданием. Комментарий `id=4693` “leave delayed” устарел после `id=4760`.
## С ЧЕГО НАЧАТЬ НУЛЕВОМУ АГЕНТУ
Смотреть: plan 3689, WEB-409, WEB-412, WEB-401, WEB-370. Первый шаг: закрыть precondition matrix и обновить тело, убрав `parked`; затем готовить owner cutover script with gates.
Готово: preconditions closed; owner PRE_CUTOVER and POST_CANARY recorded; Pi fenced; A1 singleton active; 60-minute observation green; rollback boundary documented.
Нельзя: выполнять cutover без owner GO, запускать Pi и A1 одновременно для singleton-провайдеров, скрывать non-reversible observation writes, считать rehearsal `PASS_WITH_GAPS` достаточным.
Размер: несколько смен. Большим это делает подготовка preconditions, owner gates, production cutover и час наблюдения.
## Закрытие и связи
Не закрыто. WEB-413 пересекается с WEB-370 как его production cutover slice, но это не полный дубль.
2026-09-15T22:05:58.176Z · coordinatorENRICH-4132-WEB-413
```markdown
## ДЕЛЬТА ОБОГАЩЕНИЯ — 2026-09-15T21:54Z, M1/4132 (DeepSeek Flash 4.1, read-only аудит), VERDICT=DRAFT_DELTA
### 1. Вердикт
Тело: «Прод = l115j (133fe00c, 13.09 08:50Z)». Живая линия —
**l115o `68e25d8df5ae8263c5ac5466353631f57a17cfcc`**. Карточка в работе; переход заблокирован
на трёх предусловиях, ни одно из них не внешнее — это наша работа.
### 2. КАРТА ДОКАЗАТЕЛЬСТВ
- Тело: план волны 3689 — `CUTOVER-PLAN.md` + `WATCH-HOUR.md` (фазы: предусловия-стоперы S1–S7;
fence Pi; revoke Pi lease; grant A1; singleton TG/Signal; SIP cap; canary; PRE/POST_CANARY GO;
60-минутное наблюдение; откат по порогам).
- Тело: три предусловия — тумблер WEB-409 не принят; репетиция WEB-412 не PASS (последняя
известная — PASS_WITH_GAPS 27.08); провенанс артефактов WEB-401 не закрыт.
- Тело: телефония уже работает на A1 (шлюз `5c4c9d2b`, живой звонок 7016→8000 с 02.09 14:30).
- Доска WEB-413 id 4760 (2026-09-13T12:13:40.076Z): карточка оставлена В РАБОТЕ, не отложенной —
у отложенного статуса должно быть условие пробуждения и тот, кто его сторожит.
- Доска WEB-413 id 5037 (2026-09-14T15:16:27.774Z): сводка для нулевого агента.
- HANDOFF-LIVE.md §6д строки 597–610: фикс, исполняемый вне артефакта, нельзя закрывать по
«коммит попал в линию» — проверять `readlink /proc/$pid/cwd` и grep по ЭТОМУ пути. Прямо
относится к fence/grant и к шлюзу `/home/pi/ag-voice`.
### 3. ЭВОЛЮЦИЯ / ПОПРАВКИ (append-only)
- Якорь: l115j `133fe00c` → **l115o `68e25d8df5ae8263c5ac5466353631f57a17cfcc`**.
- С 13.09 план не менялся; ни одно предусловие не снято (по доступным источникам).
- Добавляется правило приёмки из §6д хендоффа: после перехода проверять исполняемый путь
(`pid` → `readlink /proc/$pid/cwd` → grep по этому пути), а не «коммит в линии».
### 4. KNOWN ISSUES / ТРАБЛШУТИНГ
1. **«Уже на A1» принимается за завершённый переход.**
- Симптом: телефония отвечает, карточку тянет закрыть, fence Pi не выполнен.
- Проверка за 2 минуты: проверить, что Pi зафенсен (PDU OFF / ACL deny) и lease отозван;
если доказательства fence нет — переход не начинался.
- Причина: работающий сервис на A1 и завершённый cutover — разные состояния.
- Лечение/статус: критерий — завершённый переход + 60 минут наблюдения + POST_CANARY GO.
- Ссылка: тело, `WATCH-HOUR.md`.
2. **Проверка «фикс в линии» вместо «фикс на исполняемом пути».**
- Симптом: правка есть в артефакте, но живой процесс исполняет другой каталог.
- Проверка за 2 минуты:
`pid=$(systemctl show <unit> -p MainPID --value); readlink /proc/$pid/cwd` → затем grep
маркера правки по ЭТОМУ пути. Не искать маркер в `.next`: сборка переименовывает
идентификаторы.
- Причина: часть служб (например, шлюз) запускается не из артефакта.
- Лечение/статус: обязательный пункт приёмки перехода.
- Ссылка: HANDOFF-LIVE.md §6д строки 606–610.
### 5. ТЕКУЩИЙ ОСТАТОК (ответственный)
1. Снять стопор S1 — принять тумблер WEB-409 — координатор.
2. Снять стопор S2 — получить PASS репетиции WEB-412 (текущая — PASS_WITH_GAPS 27.08) — координатор.
3. Снять стопор S3 — закрыть провенанс артефактов WEB-401 — координатор.
4. После снятия — окно владельца и переход по `CUTOVER-PLAN.md` с `WATCH-HOUR.md`.
### 6. ПЕРВЫЙ ШАГ НУЛЕВОГО АГЕНТА (без агентов)
Проверить три стопора по их карточкам (WEB-409, WEB-412, WEB-401) и записать в эту карточку
по каждому: снят / не снят и чем доказано. Переход не начинать. Сверить якорь тела с живым
`/api/ready`.
```
--- 2026-09-22T18:13:43.865Z · triage-m1РЕШЕНИЕ=in_progress
ОСНОВАНИЕ=комментарий 5459 от 15.09: три предусловия WEB-409/WEB-412/WEB-401 не сняты; cutover и 60-минутное наблюдение не доказаны
ЧТО НУЖНО=координатору проверить и закрыть три стопора, получить owner GO, выполнить CUTOVER-PLAN.md и WATCH-HOUR.md с Pi fence и post-canary evidence
triage-m1 4609
2026-09-23T12:26:18.189Z · triage-neoРЕШЕНИЕ=parked
ОСНОВАНИЕ=2026-09-15, волна 4132 DRAFT_DELTA: текущая линия l115o 68e25d8d; стопоры WEB-409/WEB-412/WEB-401 и cutover с 60-минутным наблюдением не закрыты, движения волны нет ≥7 дней
ЧТО НУЖНО=первый шаг: закрыть WEB-409/WEB-412/WEB-401 и повторить CUTOVER-PLAN.md/WATCH-HOUR.md; ПРЕДЛОЖЕНИЕ=split; triage-neo 4707
Воркер
не проверен
3339-wash-infra
A1
движение в панели: неизвестно
Подключиться и смотреть/перехватить руками. Колесо мыши листает; клавишами — Ctrl-b затем [, выход из прокрутки q. Отсоединиться — Ctrl-b затем d:
Прочитать историю панели без подключения — листается и ищется (/ поиск, q выход), воркеру не помешает:
Обновлён
2026-09-23T12:26:20.582Z