WEB-595 · Задача · — · web
P1 [телефония]: живой шлюз на A1 разошёлся с репозиторием — правила для всех агентов по телефонии
Закрыт
P1 · важно
ведёт: —
Суть
<!-- BLOCK35-40-STATUS-L114X-UNKNOWN7-WEB595-20260910 -->
## ДЛЯ ТИКЕТА — audit WEB-515, связь с текущим WEB-595
По распоряжению координатора WEB-595 становится текущей точкой координации installed-vs-repo телефонии. Lead получил title/status этого тикета; при чтении body и comments отсутствовали. Полный измеренный manifest ещё не принят через доступный API/inbox, поэтому его цифры/hash здесь не реконструируются.
Связанные установленные по worker reports условия:
1. WEB-591 / SEC-047,3241/B36-06: exactS5701c436097e10240a2b8cdd5d87a786b1014def, VoiceToolExecutor.ts:56-63 подавляет async rejection, caller groundedAnswer.ts:1129-1145. Это app/module proof, не доказательство поведения active gateway. Raw artifacts и runtime mapping pending.
2. WEB-578 +3242/B37-01: диагностика импортирует diagnosticsPrivacy.js, source gateway manifest содержит35из36файлов, actual source gate даёт2отказа. Gate предотвращает неполный candidate; отсутствие файла на живом gateway этим не установлено. Исторический installed drift WEB-578 сохраняется отдельной записью.
3. Блок31/SEC-014: current redaction/читатели/старые копии должны связываться с installed gateway hashes и receiver policy, а не только app release SHA. Scopes3242/3243/3244/3246 используют этот manifest для source-vs-installed применимости.
Current app по сообщению: l114x1ee8deb775e5d8da168be8bb47090b3cacd34539; новая расписка pending, Vисторическая. AppSHAне определяетверсиюnativegateway. Нужен coordinator-owned host/timestamp/file-hash/mode/repo-base manifest и accepted runtime contract. Пока нет этой привязки, sourcefix нельзя автоматически считать current hostfix.
## KNOWN ISSUES / ТРАБЛШУТИНГ
ИсториюWEB-578непереписываем и незакрываем; новыйduplicatefindingнет. Слепойsync/заменаgateway/рестарт/deployнеразрешены этимобзором. Новыеphone-related proofs/reports ссылаютсянаWEB-595 плюс собственный узкийтикет. Это deltaсуществующихработ, неноваяволна; product/hostactions0.
---
## Диагноз получен 10.09 10:10Z — причина расхождения найдена
Посадка шлюза из репозитория уронила телефонию:
```
Error: Cannot find module '../../../config/telephony-security-policy.json'
```
**Корень:** шлюз в репозитории требует файлы ЗА пределами своего каталога — `config/telephony-security-policy.json`, `src/lib/realtime/assistantSpeechEpoch`, `src/lib/temporal/futureDatedNews`, `shared/googleAiKeyResolver.cjs`, `../../roomAudioReadyPayload`. На боевой машине развёрнут ТОЛЬКО каталог шлюза, без `src/` и `shared/`.
**Как живой шлюз с этим справляется:** у него есть собственный `gateway/vendor/` с локальными копиями (`assistantSpeechEpoch.js`, `futureDatedNews.js`, `roomAudioReadyPayload.js`, `telephony-security-policy.json`) и импорты вида `require('./vendor/…')`. **Боевой шлюз самодостаточен, репозиторный — нет.**
**Хронология попытки:** снимок живого шлюза `/home/ubuntu/gateway-snapshots/20260910T091529Z` → `land-lane8000.sh baseline` → `stage` (rsync прошёл, синтаксис ок, но скрипт упал на чтении `ari-password.txt` — env не тронут) → `restart` → служба не поднялась → попытка положить недостающий config → та же ошибка → `rollback` → телефония `active`, готовность `ready`, все шесть портов, главный файл снова 14 796 строк.
**Волна 3285** должна сделать одну кодовую базу работоспособной и в репозитории, и на голой боевой машине, перечислить ВСЕ внешние импорты и написать проверку, ловящую это ДО посадки.
Лента
2026-09-10T10:06:44.191Z · astra-securityBLOCK35-40-STATUS-L114X-UNKNOWN7-WEB595-20260910 — 2026-09-10T10:06:44.189996+00:00 / IST=2026-09-10T15:36:44.190081+05:30
## ДЛЯ ТИКЕТА — audit WEB-515, связь с текущим WEB-595
По распоряжению координатора WEB-595 становится текущей точкой координации installed-vs-repo телефонии. Lead получил title/status этого тикета; при чтении body и comments отсутствовали. Полный измеренный manifest ещё не принят через доступный API/inbox, поэтому его цифры/hash здесь не реконструируются.
Связанные установленные по worker reports условия:
1. WEB-591 / SEC-047,3241/B36-06: exactS5701c436097e10240a2b8cdd5d87a786b1014def, VoiceToolExecutor.ts:56-63 подавляет async rejection, caller groundedAnswer.ts:1129-1145. Это app/module proof, не доказательство поведения active gateway. Raw artifacts и runtime mapping pending.
2. WEB-578 +3242/B37-01: диагностика импортирует diagnosticsPrivacy.js, source gateway manifest содержит35из36файлов, actual source gate даёт2отказа. Gate предотвращает неполный candidate; отсутствие файла на живом gateway этим не установлено. Исторический installed drift WEB-578 сохраняется отдельной записью.
3. Блок31/SEC-014: current redaction/читатели/старые копии должны связываться с installed gateway hashes и receiver policy, а не только app release SHA. Scopes3242/3243/3244/3246 используют этот manifest для source-vs-installed применимости.
Current app по сообщению: l114x1ee8deb775e5d8da168be8bb47090b3cacd34539; новая расписка pending, Vисторическая. AppSHAне определяетверсиюnativegateway. Нужен coordinator-owned host/timestamp/file-hash/mode/repo-base manifest и accepted runtime contract. Пока нет этой привязки, sourcefix нельзя автоматически считать current hostfix.
## KNOWN ISSUES / ТРАБЛШУТИНГ
ИсториюWEB-578непереписываем и незакрываем; новыйduplicatefindingнет. Слепойsync/заменаgateway/рестарт/deployнеразрешены этимобзором. Новыеphone-related proofs/reports ссылаютсянаWEB-595 плюс собственный узкийтикет. Это deltaсуществующихработ, неноваяволна; product/hostactions0.
2026-09-10T13:15:29.103Z · coordinatorЭВОЛЮЦИЯ 10.09 — тикет наполнен материалом: сегодня расхождение шлюза сработало ДВАЖДЫ за один день.
Случай 1 (утро). Посадка шлюза убила телефонию:
`Cannot find module '../../../config/telephony-security-policy.json'`.
Шлюз в репозитории требует файлов ВНЕ своего дерева; живой шлюз самодостаточен через gateway/vendor/.
Откат вернул телефонию. Вывод: нужен инструмент, который ловит незамкнутые импорты ДО посадки.
Случай 2 (12:20-12:45Z). Инструмент сделали и посадили (l114y, 637c3f39b). Он дал PASS.
Посадка всё равно сломала звонок: 403 origin_boundary_rejected на /sessions/start и /lease.
Полный разбор — в WEB-578.
ПРАВИЛА ДЛЯ ЛЮБОГО АГЕНТА, КОТОРЫЙ ТРОГАЕТ ТЕЛЕФОНИЮ (итог дня):
1. Живой шлюз 8000 на A1 (/home/pi/ag-voice/infra/sip/gateway) — ИСТОЧНИК ИСТИНЫ, не репозиторий.
Расхождение ~6700 строк в обе стороны. Волны по шлюзу ставить от снимка gateway-live-*.
2. Кандидат = живой шлюз + вендоринг недостающего. НИКОГДА не дерево репозитория целиком.
3. Обязательный шаг перед рестартом: diff -rq бэкапа и живого. >2-3 файлов = стоп.
4. Обязательный шаг после рестарта: gateway.out должен показать «Greeting pre-warmed ✓».
Это единственное доказательство, что шлюз умеет открыть сессию в приложении.
readiness=ready и telephonySecurity=configured этого НЕ показывают — оба были зелёные при сломанном звонке.
5. Владельца звать звонить ТОЛЬКО после пункта 4.
6. Откат всегда готов: land-lane8000.sh <cand> rollback, бэкап делается на шаге stage автоматически.
7. Ловушка в самом land-lane8000.sh: шаг stage падает на `cat ari-password.txt` (файла нет).
Это происходит ПОСЛЕ rsync — код уже стоит. Env трогать не нужно: нужные переменные живут
в /home/pi/ag-voice/.env и .env.local, а в ag-sip-native.env их НОЛЬ строк.
8. Предполёт (правильный вызов): --dependency-root /home/pi/ag-voice (там node_modules с ws,
socket.io-client, @prisma/client), плюс ЧЕТЫРЕ --env-file: .env, .env.local,
infra/sip/ag-sip-native.env, /etc/ag-sip/ari.env. Иначе даёт ложный FAIL.
2026-09-10T17:11:13.213Z · astra-securityBACKLOG64-TRIAGE-20260910-WEB-595 — 2026-09-10T17:11:13.212336+00:00 / IST=2026-09-10T22:41:13.212344+05:30
## ДЛЯ ТИКЕТА — доставка старых отчётов и backlog64
R44: настоящая находка. Source gateway manifest completeness gate; установленный gateway отдельно. Existing evolved record.
/Users/poolpooly/audit/inbox/b37-01-B37-01-REPORT.md
SHA256 82716cbf2ad16ec591b985bc7832669793907449feef13a3490de04e62f3aeed
Статус workflow не менялся. Историческая база не переписана наl115a; duplicateSEC/повторныйfixне создан. Current app по координатору: **l115a `8d598d69a663cfa8977816d96bb20303e9a9650c`**; migration set `b3d4e83d37d07ffcffa4ba027c8f5381c8f471fa39776bc1207643e5a17267f0`,198миграций. Это не замена tested SHA в отчётах. Native gateway изменён10.09 16:02Z правкой WEB-597 (`stasisSnoopIngressSpike.js`, `bargeInPlayback.js`) поверх живого снимка; полное равенство репозиторию не заявлено. Правила installed-vs-repo остаютсяWEB-595. Самостоятельных prod/host действий lead не выполнял.
2026-09-10T18:55:03.564Z · coordinatorBOARD-WASH-20260910:WAVE-3334
По поручению владельца 18:43Z назначена исполнительская волна 3334 (sip), Codex gpt-5.6-luna xhigh, A1. Полная история карточки и база l115c 1ad52e16b доставлены, brief-guard и проверка Git-базы пройдены. Задача: проверить существующую сдачу, устранить остатки, передать бандл и доказательства. Финальная приёмка и посадка остаются за координатором. Запуск группы подтверждён в журнале диспетчера.
КАРТА ДОКУМЕНТОВ: ноут /Users/annakorin/nc-ops-scripts/board-wash-20260910/3334-wash-sip-brief.md; A1 /home/wave/waves/inputs/board-wash-20260910/sip-tickets.json; ожидаемый отчёт /home/wave/waves/3334WASHSIP-REPORT.md. Правила обогащения: WEB-449.
2026-09-12T22:17:55.109Z · coordinator[12.09 22:17Z координатор] МОЙКА 12.09 (3567-wash-g2-telephony-billing): правила для агентов записаны (8 пунктов, 10.09) и это постоянная карточка-референс — не закрывать. Не хватает только полного измеренного manifest живого шлюза (хэши) — его ещё не передали. Статус не менять.
Остаток: Полный измеренный manifest (хэши живого шлюза) ещё не передан lead — цифры не реконструируются.; Карточка-референс правил: держать, обновлять по новым случаям (устарело: ничего, правила свежие 10.09).
Отчёт: /Users/milamarty/waves/3567WASH*-REPORT.md (M4), копия nc-ops-scripts/shift-20260912-resume/wash-20260912/collected/. Проверка по исходнику прода l115g (9c8a9762).
2026-09-13T07:37:30.932Z · coordinator[13.09 07:37Z координатор] РАЗБОР 13.09 (волна 3621, DeepSeek): Это карточка-памятка с правилами для всех, кто трогает телефон. Правила уже записаны и свежие: живой шлюз — главный; кандидата строить от снимка, а не от репозитория; перед перезапуском сравнить файлы (больше двух-трёх изменённых — стоп); после перезапуска искать в логе «Greeting pre-warmed ✓»; откат всегда под рукой. Не хватает одной вещи — точного измеренного списка файлов живой машины с хэшами (кто, когда, какой хэш, какие права, от какой базы). Без этого списка нельзя честно сказать: «вот этот код в репозитории точно лежит и на машине». Готовы команды, как такой список снять — их надо просто выполнить на машине. Карточку не закрывать, это справочник.
Остаток: Полный измеренный manifest живого шлюза (хэши) ещё не передан lead — цифры живого шлюза не реконструируются.; Карточка-референс правил: держать и обновлять по новым случаям; правила свежие (10.09), устарело ничего.
Предложение: Оставить карточку постоянным справочником правил телефонии (не закрывать). Закрыть единственный пробел: доставить полный измеренный manifest живого шлюза. В RESULT.md §2 шаг 0 даны готовые read-only команды для координатора — они производят ровно тот формат, что требует карточка (host / timestamp / file-hash / mode / repo-base) плюс отдельные списки vendor/ и лишних артефактов (.bak/.vitest.js). П
Ссылки: WEB-578; WEB-508; WEB-515; WEB-387
Материалы волны: shift-20260912-resume/colM|colP/ (RESULT.md + спецификации). Статус не меняю — применяю по мере прогона.
2026-09-13T07:43:26.674Z · coordinator[13.09 07:43Z координатор] Координатор 13.09 07:42Z: снят ИЗМЕРЕННЫЙ снимок живого шлюза с A1 (read-only, без рестарта, служба ag-sip-native active): /home/ubuntu/gateway-snapshots/gateway-live-20260913T074233Z.{tar.gz,manifest,manifest.vendor,files,manifest.meta} — 40 файлов с sha256 и правами + 7 vendor. Это ровно тот шаг 0, которого не хватало плану волны 3621. Поставлена волна 3628: разложить снимок против репозитория по трём корзинам (только в шлюзе / только в репо / разное), свести в ветке и дать процедуру установки обратно по одному файлу со снимком и откатом. Живой шлюз волна не трогает.
2026-09-13T09:50:49.422Z · coordinator[13.09 09:50Z координатор] Волна 3641 (Claude sonnet, A1) — GO: пофайловый план ВОЗВРАТА сведённого кода на живой шлюз готов (refs/waves/3641 = 90ebb15f). 30 шагов, отсортированы по риску: сначала то, что процесс даже не загружает (тесты и метаданные — заодно проверяем сами скрипты, ничем не рискуя), потом два маленьких понятых фикса живых багов (заголовок, которого требовало приложение, и правило подписи для lane-claim), потом уборка утечек секретов в логах (поведение звонка не меняется), и в самом конце — файлы, через которые реально идёт голос: по одному, с проверкой после каждого.
Два скрипта для координатора в ветке: infra/sip/gateway-apply-one.sh (снимок → копирование → проверка → откат при неуспехе) и infra/sip/gateway-verify.sh (быстрая проверка живости без реального звонка, с честной пометкой, чего она НЕ подтверждает).
НОВАЯ НАХОДКА, которой не мог увидеть разбор 3628: один файл (выбор голосового движка Google/OpenAI на входящий звонок) в новой версии перестал экспортировать функцию, которую использует другой файл — а его мы в этот раз сознательно не трогаем, потому что не решено, чья версия правильнее. Поставили бы первый без второго — шлюз падал бы «функция не найдена» ровно в момент звонка. Файл убран из списка «ставим сейчас».
По четырём спорным файлам даны рекомендации с обоснованием, а не «пусть решает человек»; один (архитектура диалога после перебивания) явно НЕ рекомендуется выбирать без реального тестового звонка.
Следующий шаг: ставлю первые безрисковые шаги сам и проверяю скрипты на них.
2026-09-13T11:24:37.853Z · coordinator[13.09 11:24Z координатор] Начал ставить план на живой шлюз сам, безопасными шагами. Сделано 11 файлов из 30: метаданные (тир 0) и все тесты (тир 1). Ни один из них не читается работающим процессом, поэтому перезапуска не требовалось ни разу.
Как шло: перед каждой установкой предварительная проверка, атомарная подмена с резервной копией, после каждой — проверка шлюза. Все проверки чистые: ноль отказов на каждом шаге, ни одной известной сигнатуры регрессии в журнале (отказ границы источника, отказ подписи полосы, пропавший модуль, неопределённый экспорт).
Побочный и самый полезный результат: установленные тесты стали линейкой расхождения. Прогон на ЖИВОМ коде шлюза — 129 успехов и 15 отказов в десяти наборах. Расходятся четыре:
- предстартовая проверка аренды активный-пассивный: 0 из 1;
- защита от перебивания: 15 успехов, 3 отказа (порог минимальных кадров в репозитории ужесточён с 5 до 10, на шлюзе старый);
- носитель комнаты совещаний: 6 успехов, 1 отказ;
- вычистка персональных данных в телефонии: 4 успеха, 10 отказов — тест переехал на новый программный интерфейс, которого на шлюзе ещё нет.
Шесть наборов зелёные полностью. Это и есть точный список того, что должны починить тиры 2-5, и одновременно доказательство, что расхождение измеримо, а не на глаз.
Следующие тиры трогают рантайм и требуют перезапуска голосовой службы — делаю их отдельным шагом, не в один присест с этим.
2026-09-13T12:01:42.757Z · coordinator[13.09 12:01Z координатор] Гигиена доски (волна 3676): эта карточка и WEB-578 описывают одно и то же — живой шлюз на A1 разошёлся с репозиторием. Веду работу в WEB-578, там же лежат измерения расхождения и ход установки плана. Эту закрываю как дубликат; если понадобится, вернуть в работу можно одним движением, вся история сохранена.
Воркер
не проверен
3334-wash-sip
A1
движение в панели: неизвестно
Подключиться и смотреть/перехватить руками. Колесо мыши листает; клавишами — Ctrl-b затем [, выход из прокрутки q. Отсоединиться — Ctrl-b затем d:
Прочитать историю панели без подключения — листается и ищется (/ поиск, q выход), воркеру не помешает:
Обновлён
2026-09-13T12:01:43.195Z