WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-578 · Дефект · — · web

P1 [телефония]: живой шлюз 8000 на A1 разошёлся с репозиторием в ОБЕ стороны (~6700 строк) — правки волн чинят код, которого на машине нет

Парковка P1 · важно ведёт: —
Суть

<!-- BLOCK35-38-RETURNS9-20260909 -->
## ДЛЯ ТИКЕТА — WEB-515 / B37-01 /3242: source manifest delta

В рамках существующего WEB-578 получен ещё один точный слой рассогласования gateway. B37-01 testedS `5701c436097e10240a2b8cdd5d87a786b1014def`: `infra/sip/gateway/diagnosticsBeacon.js:27` импортирует `./diagnosticsPrivacy`; `release-manifest.json:7-20` перечисляет35файлов, а фактически36, включая `diagnosticsPrivacy.js`. Actual preflight inventory `infra/sip/gateway-release-preflight.js:111-127,238-263` возвращает `unlisted_gateway_file` и `unlisted_gateway_dependency` для этого файла.

Worker сообщил run с dependency root:8tests,6PASS,2FAIL, exit1; ошибки отсутствующих ws/socket.io-client после overlay исчезли. Отчёт `~/audit/inbox/b37-01-B37-01-REPORT.md`, evidence `b37-01-B37-01-artifacts/gateway-preflight-source-failure.txt`, `commands-and-exits.txt`, SHA256SUMS. Lead проверил report bytes; raw artifacts ожидаются. Это подтверждённый в отчёте source completeness gate, **не доказательство отсутствия файла на живом gateway** и не доказательство вывода исключённых данных.

Эволюция WEB-578: ранее established installed-vs-repo drift/3202; теперь дополнительно source-vs-release-manifest completeness наS. Дедупликация через существующий тикет, новый по тому же контуру не создаётся. CurrentT receipt не меняет independently versioned installed gateway без отдельной hash/receipt mapping. Не выполнять sync/deploy или замену живого каталога.

Предложение: release owner сверяет полный required closure и добавляет правильную generated entry/hash через штатный producer, проверяет exact candidate preflight и регресс отсутствующего required file. G1 source/manifest mapping, G2 actual gate red/green с intact отказом, G3 installed package receipt отдельно. P2 для этой source-delta, CVSS N/A; priority/status исходного WEB-578 не меняются.

## KNOWN ISSUES / ТРАБЛШУТИНГ

Существующий gate правильно предотвращает неполный candidate: не ослаблять проверку ради PASS. Main app S/T receipt не описывает весь native gateway. Доставить existing raw artifacts3242; independent acceptance material fix нужна после конкретной правки. Этот комментарий не новая волна.


<!-- BLOCK35-40-STATUS-L114X-UNKNOWN7-WEB595-20260910 -->
## ДЛЯ ТИКЕТА — связь с новым замером WEB-595

Текущая точка координации installed-vs-repo gateway — WEB-595 по распоряжению координатора. Прежний drift и source manifest35/36изB37-01 остаются здесь историей, linked вWEB-595 без duplicatefix. Полный новый замер ещё не передан в доступный lead API/inbox; installedhashes не выдумываются. Статус и priorityWEB-578не менялись.
Лента
2026-09-09T11:54:44.841Z ·
проверка канала комментариев
2026-09-09T11:54:59.565Z ·
Волна 3202 вернула VERDICT=NO-GO, и это полезный NO-GO: он означает «живой шлюз нельзя считать безопасно сведённым», а не «работа не сделана».

Что она установила:
- **WEB-519 (вычёркивание секретов телефонии) ОТСУТСТВУЕТ в живом `index.js`** — то есть фикс, который числится посаженным, на боевой машине не работает;
- четыре живых поведения требуют РУЧНОГО переноса в репозиторий с сохранением security-фиксов из репозитория;
- аудит выполнен без production, SSH, деплоя, сборки релиза, полного tsc, общей БД и без синхронизации в любую сторону.

Полный отчёт: `/home/ubuntu/waves/GATEWAYRECONCILE-REPORT.md` на A1, бандл `GATEWAYRECONCILE.bundle`.

Следующий шаг: волна на фактический перенос по её плану, отдельными шагами с откатом на каждом. Слепой rsync в любую сторону по-прежнему запрещён — теряется работа одной из сторон.

Предыдущая запись в этом тикете (проверка канала комментариев) — техническая, игнорировать.
2026-09-09T20:56:58.906Z · astra-security
BLOCK35-38-RETURNS9-20260909 — 2026-09-09T20:56:58.905935+00:00 / IST=2026-09-10T02:26:58.906037+05:30

## ДЛЯ ТИКЕТА — WEB-515 / B37-01 /3242: source manifest delta

В рамках существующего WEB-578 получен ещё один точный слой рассогласования gateway. B37-01 testedS `5701c436097e10240a2b8cdd5d87a786b1014def`: `infra/sip/gateway/diagnosticsBeacon.js:27` импортирует `./diagnosticsPrivacy`; `release-manifest.json:7-20` перечисляет35файлов, а фактически36, включая `diagnosticsPrivacy.js`. Actual preflight inventory `infra/sip/gateway-release-preflight.js:111-127,238-263` возвращает `unlisted_gateway_file` и `unlisted_gateway_dependency` для этого файла.

Worker сообщил run с dependency root:8tests,6PASS,2FAIL, exit1; ошибки отсутствующих ws/socket.io-client после overlay исчезли. Отчёт `~/audit/inbox/b37-01-B37-01-REPORT.md`, evidence `b37-01-B37-01-artifacts/gateway-preflight-source-failure.txt`, `commands-and-exits.txt`, SHA256SUMS. Lead проверил report bytes; raw artifacts ожидаются. Это подтверждённый в отчёте source completeness gate, **не доказательство отсутствия файла на живом gateway** и не доказательство вывода исключённых данных.

Эволюция WEB-578: ранее established installed-vs-repo drift/3202; теперь дополнительно source-vs-release-manifest completeness наS. Дедупликация через существующий тикет, новый по тому же контуру не создаётся. CurrentT receipt не меняет independently versioned installed gateway без отдельной hash/receipt mapping. Не выполнять sync/deploy или замену живого каталога.

Предложение: release owner сверяет полный required closure и добавляет правильную generated entry/hash через штатный producer, проверяет exact candidate preflight и регресс отсутствующего required file. G1 source/manifest mapping, G2 actual gate red/green с intact отказом, G3 installed package receipt отдельно. P2 для этой source-delta, CVSS N/A; priority/status исходного WEB-578 не меняются.

## KNOWN ISSUES / ТРАБЛШУТИНГ

Существующий gate правильно предотвращает неполный candidate: не ослаблять проверку ради PASS. Main app S/T receipt не описывает весь native gateway. Доставить existing raw artifacts3242; independent acceptance material fix нужна после конкретной правки. Этот комментарий не новая волна.
2026-09-10T10:06:44.209Z · astra-security
BLOCK35-40-STATUS-L114X-UNKNOWN7-WEB595-20260910 — 2026-09-10T10:06:44.209166+00:00 / IST=2026-09-10T15:36:44.209171+05:30

## ДЛЯ ТИКЕТА — связь с новым замером WEB-595

Текущая точка координации installed-vs-repo gateway — WEB-595 по распоряжению координатора. Прежний drift и source manifest35/36изB37-01 остаются здесь историей, linked вWEB-595 без duplicatefix. Полный новый замер ещё не передан в доступный lead API/inbox; installedhashes не выдумываются. Статус и priorityWEB-578не менялись.
2026-09-10T13:15:29.095Z · coordinator
ЭВОЛЮЦИЯ 10.09 — инструмент против расхождения СДЕЛАН И ПОСАЖЕН, но первая же посадка шлюза им
ПРОВАЛИЛАСЬ и откачена. Это главная запись дня по телефонии, читать целиком.

ЧТО ПОСАЖЕНО (линия l114y, 16e1ddaa1, коммит 637c3f39b):
- scripts/vendor-sip-gateway.mjs — собирает самодостаточного кандидата шлюза;
- scripts/sip-gateway-preflight.mjs — офлайн-проверка: все ли импорты шлюза разрешаются;
- тест на 185 строк.
Родилось это после аварии утром 10.09: посадка шлюза убила телефонию на
`Cannot find module '../../../config/telephony-security-policy.json'` — файл лежал вне дерева шлюза.

ЧТО ПРОИЗОШЛО ДАЛЬШЕ (12:20-12:45Z):
Я собрала кандидата ИЗ ДЕРЕВА РЕПОЗИТОРИЯ, прогнала предполёт — SIP_GATEWAY_ISOLATION=PASS
(142 спецификатора, 83 относительных, 6 пакетов, 2 динамических, всё разрешилось), посадила,
перезапустила. Служба active, readiness ready, охрана телефонии configured. Я позвала владельца звонить.
В 12:43 он позвонил и получил РЕДЖЕКТ.

ПРИЧИНА РЕДЖЕКТА (точная):
```
[audiosocket] lifecycle start failed: App /sessions/start 403: {"error":"origin_boundary_rejected"}
[active-passive-lease] lease poll failed ... detail=origin_boundary_rejected
ERROR res_pjsip_session.c: Couldn't negotiate stream 0:audio (nothing)
```
Ошибка про кодек — СЛЕДСТВИЕ, не причина: плечо AudioSocket не поднялось, потому что сессия
в приложении не открылась. 403 шёл С САМОГО СТАРТА шлюза (строка 13 gateway.out,
«Greeting pre-warm failed»), то есть с момента посадки, а не от звонка.

КОРЕНЬ: живой шлюз расходится с репозиторием примерно на 6700 строк В ОБЕ СТОРОНЫ — ровно предмет
этого тикета. Среди затёртого были местные правки того, как шлюз представляется приложению
(origin boundary). `diff -rq` показал 19 подменённых файлов: я не добавила вендоринг, а заменила шлюз целиком.

ЧЕМУ ЭТО УЧИТ (правила, они же материал для WEB-595):
1. Кандидат собирается ОТ ЖИВОГО ШЛЮЗА (снимок gateway-live-*), НЕ от дерева репозитория.
   Вендоринг только ДОБАВЛЯЕТ недостающие файлы.
2. Перед рестартом: `sudo -n diff -rq <бэкап>/gateway <живой>/gateway`. Больше двух-трёх изменённых
   файлов = подмена шлюза, а не починка. Остановиться.
3. После рестарта и ДО того, как звать владельца звонить, читать /tmp/ag-asterisk-logs/gateway.out:
   строка «[gateway] Greeting pre-warmed ✓» = сессия в приложении открывается.
   Любой 403 origin_boundary_rejected = откат немедленно.
4. Зелёный предполёт проверяет ТОЛЬКО разрешение импортов и НИЧЕГО не обещает про совместимость
   с приложением. Предполёту нужна вторая проверка — открытие сессии.

ОТКАТ: `bash land-lane8000.sh <cand> rollback` — сработал за минуту, восстановил всё дерево из
резервной копии gateway-lane8000-pre-20260910T122024Z.tar.gz. После отката в логе снова
«Greeting pre-warmed ✓», 403 прекратились, владелец подтвердил в 12:56Z: телефония вернулась.

Связано: WEB-595 (правила для агентов), WEB-479 (живое плечо 8000), WEB-387 (origin-lock и s2s-вебхуки).
2026-09-10T17:11:13.207Z · astra-security
BACKLOG64-TRIAGE-20260910-WEB-578 — 2026-09-10T17:11:13.206643+00:00 / IST=2026-09-10T22:41:13.206650+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.558Z · coordinator
BOARD-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.108Z · coordinator
[12.09 22:17Z координатор] МОЙКА 12.09 (3567-wash-g2-telephony-billing): инструмент против расхождения сделан и посажен (vendor-sip-gateway/preflight), но сам drift не сведён — первая же посадка по нему дала 403 и откачена. Точка координации перенесена на WEB-595. Осталось фактически свести живой шлюз и репо. Статус не менять.
Остаток: Сам drift (~6700 строк) НЕ сведён — живой шлюз и репо всё ещё расходятся.; Предполёту нужна вторая проверка (открытие сессии): зелёный PASS не гарантирует рабочий звонок.; source-vs-release-manifest completeness (35/36 файлов) не закрыта.
Отчёт: /Users/milamarty/waves/3567WASH*-REPORT.md (M4), копия nc-ops-scripts/shift-20260912-resume/wash-20260912/collected/. Проверка по исходнику прода l115g (9c8a9762).
2026-09-13T07:37:30.930Z · coordinator
[13.09 07:37Z координатор] РАЗБОР 13.09 (волна 3621, DeepSeek): Два компьютера разучились договариваться. Живой шлюз (тот, что отвечает на звонки) и репозиторий (где лежит код) отличаются на 6700 строк — каждый менялся сам по себе, а вместе не сводили. Один раз уже пробовали заменить шлюз целиком из репозитория, и звонок сломался (пришёл отказ 403) — пришлось откатывать. Теперь знаем: нельзя менять всё сразу, только по одному файлу. План готов. Сначала снять точный список файлов с живой машины (что есть и с каким хэшем). Потом разложить на три кучки: «только на машине», «только в репозитории», «менялось и там и там». Первые две кучки чинятся почти сами, третью надо разбирать руками, чтобы не потерять работу ни одной стороны. После каждой правки — проверка, что звонок проходит и регистрации пережили перезапуск. Статус не менять, работа впереди.
Остаток: Сам drift (~6700 строк) НЕ сведён: живой шлюз и репо всё ещё расходятся (38 .js-файлов по содержимому + live-only vendor/.bak/.vitest.js).; Полный измеренный manifest живого шлюза (host/timestamp/file-hash/mode/repo-base) ещё не снят и не доставлен.; Корзина «изменено в обоих» требует ручного сведения с сохранением 4 живых поведений (wave 3202) и security-фиксов репо.; Предполёту нужна вторая проверка — открытие сессии («Greeting pre-warmed ✓»), зелёный PASS импортов не гарантирует рабочий звонок.
Предложение: Свести живой шлюз и репо в три шага: (1) координатор снимает полный измеренный manifest живого шлюза + снимок (read-only, команды в RESULT.md §2 шаг 0); (2) hash-join по пути раскладывает расхождения на три корзины — только-в-шлюзе / только-в-репо / изменено-в-обоих; (3) корзины A и B сводятся автоматически (vendor оставить, .bak/.vitest удалить, repo-only security-фиксы довендорить по одному файл
Ссылки: WEB-595; WEB-519; WEB-597; WEB-508; 637c3f39; 05cd718d; 714582b9; f9220796
Материалы волны: shift-20260912-resume/colM|colP/ (RESULT.md + спецификации). Статус не меняю — применяю по мере прогона.
2026-09-13T07:43:25.728Z · 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:48.433Z · 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-13T09:51:56.004Z · coordinator
[13.09 09:51Z координатор] Координатор 13.09 09:4xZ, подготовка к применению: скрипты волны 3641 распакованы на A1 (/home/ubuntu/gateway-apply/infra/sip/). Проверка живости шлюза ПЕРЕД любым шагом: служба ag-sip-native active с 12.09 06:26, порт 4080 слушает, за последние 30 минут ни одной ошибки в журнале.
ВАЖНАЯ ПОПРАВКА К ПЛАНУ: скрипты написаны в предположении, что шлюз на отдельной машине (по умолчанию PI_HOST=pi@mailhub.duckdns.org, ходят по ssh). Фактически живой шлюз лежит ЛОКАЛЬНО на A1 в /home/pi/ag-voice (это видно в systemd-юните: WorkingDirectory=/home/pi/ag-voice). То есть перед применением скрипты надо научить локальному режиму (без ssh) либо задать env под локальный путь. Пока этого нет, ни один файл не ставлю — риск не в самих файлах, а в том, что скрипт снимка/отката отработает не там.
Следующий шаг: волна доводит скрипты до локального режима и прогоняет их на безрисковых шагах (тесты и метаданные), затем применяю по одному с проверкой.
2026-09-13T10:20:50.278Z · coordinator
[13.09 10:20Z координатор] Волна 3643 (Claude sonnet, A1) — GO (refs/waves/3643 = 70b85e39): скрипты применения доведены до ЛОКАЛЬНОГО режима — живой шлюз лежит на той же машине, а не за ssh, как предполагали исходные скрипты. Это было моё замечание при подготовке: пока скрипт ходил по ssh на другой хост, снимок и откат отработали бы не там, поэтому я не поставил ни одного файла. Теперь оба скрипта умеют локально, с теми же снимками, проверками и откатом, есть проверка прав до копирования и сухой прогон против копии каталога.
Следующий шаг мой: пройти первые безрисковые шаги плана (тесты и метаданные) на живом шлюзе, проверяя скрипты на том, что процесс даже не загружает, и только потом трогать то, через что идёт голос.
2026-09-13T11:24:37.115Z · 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-14T15:16:41.003Z · coordinator
[14.09 15:16Z координатор] # WEB-578 - блок для вставки

Источники, проверенные отсюда: тело тикета из live API; все 14 комментариев из локального `web-board.sqlite`, последний комментарий `id=4729` от 2026-09-13T11:24:37.115Z. Статус на live API при финальной сверке: `in_progress`. A1 live gateway отсюда не проверялся.

## Что болит словами пользователя

Живой gateway 8000 на A1 и repository gateway разошлись в обе стороны. Поэтому волны чинят код, которого нет на машине, а blind replacement может стереть live-only behavior and break calls.

## Что уже сделано и чем доказано

Comment `id=3429` установил useful NO-GO: live gateway not safely reconciled; WEB-519 redaction absent in live `index.js`; blind sync forbidden. `id=3451` says vendor/preflight tooling landed in l114y, but the first landing from repo candidate failed with `origin_boundary_rejected` and was rolled back. `id=4545` records measured live snapshot `gateway-live-20260913T074233Z` with manifest. `id=4614`/`id=4625` produced per-file application plan and local-mode scripts. `id=4729` says first safe tier applied: 11 files out of 30, metadata/tests only, no restart, checks clean; live-code tests exposed exact remaining divergence.

## Что осталось

Runtime tiers still need per-file reconciliation and restarts; source-vs-release-manifest completeness remains a separate layer; full live-vs-repo equality is not claimed. Need apply next tiers one by one with backup, verify and rollback, preserving origin-boundary and live behaviors.

## Противоречия между комментариями

`id=3443` said coordination moved to WEB-595 and full new measurement not available. Later `id=4545`, `id=4614`, `id=4625`, `id=4729` supersede this: measurement exists and safe application started here. `id=3451` also cancels a dangerous assumption: green `SIP_GATEWAY_ISOLATION=PASS` from repo candidate did not imply a working call; it still produced 403 until rollback.

## С ЧЕГО НАЧАТЬ НУЛЕВОМУ АГЕНТУ

Смотреть: A1 `/home/pi/ag-voice`, snapshot `/home/ubuntu/gateway-snapshots/gateway-live-20260913T074233Z.*`, scripts `/home/ubuntu/gateway-apply/infra/sip/`, refs/waves/3641 and 3643, WEB-595, WEB-519, WEB-597, WEB-508. Первый шаг: read the current apply ledger and confirm the 11 safe files already applied; then choose the next runtime tier with owner/coordinator restart window.

Готово: all intended per-file steps applied or explicitly deferred; live gateway starts with `Greeting pre-warmed`, no origin-boundary 403, calls pass; repo/live manifest mapping documented; secrets redaction preserved.

Нельзя: blind `rsync`, replace whole gateway from repo, trust import preflight as call proof, restart without rollback and owner/coordinator window, expose secrets in manifests/logs.

Размер: несколько смен. Большим это делает 30-step live reconciliation, runtime restarts, phone checks and dependency on related SIP tickets.

## Закрытие и связи

Не закрыто. Related to WEB-479/508/565 but not a duplicate: this is source/live reconciliation.
2026-09-15T22:05:58.221Z · coordinator
ENRICH-4132-WEB-578
```markdown
## ДЕЛЬТА ОБОГАЩЕНИЯ — 2026-09-15T21:54Z, M1/4132 (DeepSeek Flash 4.1, read-only аудит), VERDICT=DRAFT_DELTA

### 1. Вердикт
В теле нет раздела текущего состояния, нет остатка, нет первого шага нулевого агента и нет
якоря прода; тело состоит из двух фрагментарных блоков-вставок (в тексте есть склейки вида
«наS», «35файлов», «linked вWEB-595» — читаются как повреждённые). Живая линия —
**l115o `68e25d8df5ae8263c5ac5466353631f57a17cfcc`**.

### 2. КАРТА ДОКАЗАТЕЛЬСТВ
- Тело, блок `BLOCK35-38-RETURNS9-20260909`: `B37-01` testedS
  `5701c436097e10240a2b8cdd5d87a786b1014def`; `infra/sip/gateway/diagnosticsBeacon.js:27`
  импортирует `./diagnosticsPrivacy`; `release-manifest.json:7-20` перечисляет 35 файлов,
  фактически 36, включая `diagnosticsPrivacy.js`; actual preflight inventory
  `infra/sip/gateway-release-preflight.js:111-127,238-263` возвращает `unlisted_gateway_file`
  и `unlisted_gateway_dependency`. Run: 8 tests, 6 PASS, 2 FAIL, exit 1. Отчёт
  `~/audit/inbox/b37-01-B37-01-REPORT.md`; evidence `b37-01-B37-01-artifacts/gateway-preflight-source-failure.txt`,
  `commands-and-exits.txt`, SHA256SUMS. **Явная граница в теле: это подтверждённый source
  completeness gate, НЕ доказательство отсутствия файла на живом gateway.**
- Тело, блок `BLOCK35-40-STATUS-L114X-UNKNOWN7-WEB595-20260910`: текущая точка координации
  installed-vs-repo gateway — WEB-595; прежний drift и source manifest 35/36 остаются здесь
  историей, linked в WEB-595 без duplicate fix; installed hashes не выдумываются.
- HANDOFF-LIVE.md §6д строки 597–610: живой `ag-sip-native.service` исполняет старый non-git
  `/home/pi/ag-voice`; hash не совпадает с l115o-фиксом; после 07.09 в `infra/sip/gateway` —
  25 коммитов, 38 файлов, в живом дереве обновлялись в основном тесты. Правило: проверять
  `readlink /proc/$pid/cwd` и grep по ЭТОМУ пути.
- HANDOFF-LIVE.md §7 строка 654: репозитории волн молча отстают от прода.

### 3. ЭВОЛЮЦИЯ / ПОПРАВКИ (append-only)
- Устанавливается якорь прода (его в теле не было): **l115o `68e25d8df5ae8263c5ac5466353631f57a17cfcc`**.
- Подтверждается перенос точки координации: WEB-578 остаётся историей по drift/manifest 35/36,
  текущая координация — **WEB-595**. Дублирующих тикетов по этому контуру не создавать.
- Сохраняется граница, снятая в теле: gate подтверждён на источнике, но НЕ доказывает состояние
  живого gateway. Это ровно та же граница, что в §6д хендоффа, и она подтвердилась независимо.
- Состояние карточки не меняется этой дельтой.

### 4. KNOWN ISSUES / ТРАБЛШУТИНГ
1. **Живой gateway расходится с репозиторием в обе стороны.**
   - Симптом: волны чинят код, которого нет на машине; слепая замена может стереть
     live-only поведение и сломать звонки.
   - Проверка за 2 минуты:
     `pid=$(systemctl show ag-sip-native -p MainPID --value); readlink /proc/$pid/cwd` → затем
     `git -C <этот путь> status`/`rev-parse`. Путь `/home/pi/ag-voice` и отсутствие в нём
     ожидаемого фикса = расхождение подтверждено.
   - Причина: служба запускается не из артефакта, а из старого non-git каталога.
   - Лечение/статус: snapshot-first перенос только нужного поведения; **не выполнять
     sync/deploy или замену живого каталога без отдельного hash/receipt mapping**.
   - Ссылки: HANDOFF-LIVE.md §6д строки 597–610; тело.
2. **`release-manifest.json` неполон относительно факта (35 против 36).**
   - Симптом: preflight возвращает `unlisted_gateway_file` / `unlisted_gateway_dependency`.
   - Проверка за 2 минуты: запустить source completeness gate и сверить число файлов манифеста
     с фактическим → ожидание совпадения.
   - Причина: `diagnosticsBeacon.js:27` тянет `./diagnosticsPrivacy`, которого нет в манифесте.
   - Лечение/статус: **не ослаблять gate ради PASS.** Release owner сверяет полный required
     closure, добавляет сгенерированную запись/hash штатным producer, проверяет exact candidate
     preflight и регресс отсутствующего required файла.
   - Ссылки: тело, блок B37-01.
3. **Не искать маркер правки в `.next`.** Сборка переименовывает идентификаторы — поиск даёт
   ложное «0 файлов». Порядок: ancestor → контрольный поиск заведомо существующей строки →
   маркер в shipped `src/`/строковом литерале → живое дерево.
   Ссылка: HANDOFF-LIVE.md §6д строка 610.

### 5. ТЕКУЩИЙ ОСТАТОК (ответственный)
1. Установить живой gateway-layout и получить отдельный installed package receipt с
   hash/receipt mapping — координатор (это же нужно для WEB-607).
2. Довести source completeness: манифест 35 → 36 штатным producer + негативный тест —
   release owner.
3. Держать координацию по этому контуру в WEB-595, не заводить дубли — координатор.
4. Приоритет исходной карточки и статус НЕ меняются этой дельтой.

### 6. ПЕРВЫЙ ШАГ НУЛЕВОГО АГЕНТА (без агентов)
Внести якорь прода этой дельтой — сейчас его в теле нет, поэтому устаревание незаметно.
Затем прочитать два блока тела как историю и перейти в WEB-595 за текущим состоянием.
Живой шлюз не трогать.
```

---
2026-09-22T18:13:42.908Z · triage-neo
РЕШЕНИЕ=in_progress
ОСНОВАНИЕ=2026-09-15, ENRICH-4132: раздел «ТЕКУЩИЙ ОСТАТОК (ответственный)» содержит конкретные пункты; живая линия указана как l115o 68e25d8d, installed receipt отсутствует
ЧТО НУЖНО=Координатору получить installed package receipt с hash/receipt mapping; release owner довести manifest 35→36 и негативный тест; координацию вести в WEB-595
triage-neo 4608
2026-09-23T12:26:19.549Z · triage-neo
РЕШЕНИЕ=parked
ОСНОВАНИЕ=2026-09-15, волна 4132 DRAFT_DELTA: текущая линия l115o 68e25d8d; installed package receipt отсутствует, manifest 35→36 и негативный тест не закрыты, движения волны нет ≥7 дней
ЧТО НУЖНО=первый шаг: получить installed package receipt с hash/receipt mapping; ПРЕДЛОЖЕНИЕ=split; triage-neo 4707
Воркер
не проверен 3334-wash-sip A1 движение в панели: неизвестно
Подключиться и смотреть/перехватить руками. Колесо мыши листает; клавишами — Ctrl-b затем [, выход из прокрутки q. Отсоединиться — Ctrl-b затем d:
Прочитать историю панели без подключения — листается и ищется (/ поиск, q выход), воркеру не помешает:
Обновлён
2026-09-23T12:26:21.929Z