WEB board

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

Мультирум: ассистент как участник комнаты — инвентарь возможностей и план (эпик WEB-395, ветка «обвязка»)

Закрыт P2 ведёт: —
Суть

--- 30.08 ~20:00Z (Фабл): ЖИВАЯ ПРОБА МУЛЬТИРУМА на l73 (браузер, комната MR-001 cmtfzo16t): лобби ПОЛНОСТЬЮ живое — личность Эхо с режимами («слушает мягко/пишет краткое/помнит решения», Тюнить), «2 канала живы» (Signal+Telegram), история решений; вход в комнату ок, honest-статусы плеч (signal_live_call_not_started). НАХОДКА: Start Browser Realtime → «assistant.speech_state participant is not the room assistant» + transport unavailable + ASSISTANT unknown — identity-бинд ассистента не сходится для браузер-участника (похоже, durable speech projection гейт multiroom2 отвергает честно, но ассистент не публикуется под правильной identity). Волна 817-roomassistfix летит (починить бинд, НЕ ослабляя fail-closed). Скрины в сессии координатора.

--- 30.08 ~20:50Z (Фабл): фикс ГОТОВ автором (f54bcbda, wave/roomassistfix): корень подтверждён — в live-комнате создавался ТОЛЬКО owner-participant, браузер-сессия проваливалась в него как speech identity, durable-гейт честно отвергал (role≠assistant). Фикс биндит настоящего assistant-participant при старте; гейт НЕ ослаблен. Приёмка 822 в очереди (главный негатив: чужой participant по-прежнему отвергается + рестарт-живучесть бинда). После GO — живой ре-тест комнаты браузером.

--- 30.08 ~21:50Z (Фабл): ACCROOMASSISTFIX = УСЛОВНЫЙ GO: проверки пройдены, финальный GO после посадки (l75) + живого ре-теста комнаты координатором браузером. Кандидат l75 = f54bcbda. Тех-помарка: отчёт в дереве wt-roomassistfix (не /waves).

--- 31.08 ~02:30 IST (Фабл): ЖИВОЙ РЕ-ТЕСТ КОМНАТЫ на l75 (браузер): ✅ лобби живое (Утренний синк, история решений, «Эхо помнит 14 решений»), ✅ личность Эхо на месте (тёплый·медовый, слушает мягко), ✅ «2 канала живы», ✅ комната открывается, ROOM BIND payload-ready; ❌ Start Browser Realtime: транспорт поднимается и рвётся «transport close» — журнал Pi: shapeguard3 realtime_auth_boundary_failed TrustedIdentityError «authenticated session is missing» на /api/realtime, хотя сессия браузера жива. Страж не видит сессию на realtime-типе запроса (класс границы, как в Совете). Волна 863-roomrealtimeauth (чинить канал identity, страж не ослаблять, негатив unauth→401 обязателен). Signal-плечо честно «не подключено» (live call не начат — норма). Финальный GO мультирума — после этого фикса.

--- 31.08 ~03:20 IST (Фабл): 📚 ВОССТАНОВЛЕНИЕ ГЛУБИНЫ ТИКЕТА (owner поймал пробел — механика «бейджей» здесь не была записана; исправляю кумулятивно из ROOMASSISTFIX-REPORT.md, wave/roomassistfix f54bcbda, принят условным GO):

=== МЕХАНИКА «БЕЙДЖЕЙ ДЛЯ ОХРАННИКА» (identity-модель комнаты) ===
• Каждый участник комнаты = MeetingParticipant с ролью; «бейдж» ассистента = ОТДЕЛЬНЫЙ participant с role='assistant' (его participantId + optional legId = ключ леджера AssistantSpeechGenerationLedger roomId|participantId|legId).
• Охранник = fail-closed gate: оба speech-state POST-роута требуют participant.role==='assistant' ДО provider-работы (генератор отказа был в .../assistant/speech-state/generation/route.ts; строгий гейт вынесен в src/lib/meetingRooms/assistantIdentity.ts и переиспользован обоими роутами).
• Корень инцидента «ассистент не признавался жильцом»: createRoom создавал ТОЛЬКО owner-participant; браузер использовал его и как control, и как fallback speech identity → в комнате физически не было бейджа assistant → честный отказ 'assistant.speech_state participant is not the room assistant', ASSISTANT=unknown.
• Фикс f54bcbda: канонический assistant-participant создаётся; owner/browser participant = ТОЛЬКО control identity (транспорт/VoiceSession/MeetingLeg), НЕ переименовывается в assistant и НЕ публикует assistant-маркер; MeetingRoomRuntimeState.audioSourceParticipantId при speaking указывает на канонического ассистента.
• Защита от чужой речи НЕ ослаблена: gate остался fail-closed, просто бейдж теперь реально выдаётся.
Связка с текущей волной 863-roomrealtimeauth: транспортный отказ TrustedIdentityError на /api/realtime — СОСЕДНЯЯ дверь (session-страж транспорта, shapeguard3), не сам speech-gate; волна обязана чинить предъявление identity транспортом, не трогая speech-gate. Документы: ROOMASSISTFIX-REPORT.md + ACCROOMASSISTFIX-REPORT.md (A1 /home/ubuntu/waves/).

--- 31.08 ~04:20 IST (Фабл): roomrealtimeauth ГОТОВ (75869858): корень — browser realtime bootstrap не был привязан к Auth.js-сессии запроса (сам сокет credentials слал); фикс делает bootstrap request-bound, SHAPEGUARD3 fail-closed сохранён. Приёмка 871 (негативы стража + доказательство что speech-gate/бейджи не тронуты). После GO → l76 → живой ре-тест комнаты с голосовым стартом.

--- 31.08 ~04:50 IST (Фабл): ✅ ПРИЁМКА 871 = GO, кандидат l76: все 5 ворот пройдены, production-диff НЕ трогает speech-gate/бейджи — только request-bound transport auth + cookie в Google bootstrap. Линия транспорта комнаты закрыта. После посадки l76: живой ре-тест Start Browser Realtime + бинд Эхо = финальный GO мультирума.

📖 Правила обогащения этого тикета: WEB-449 (канон для любого агента).

--- 31.08 ~01:30 IST (Фабл): ЖИВОЙ ТЕСТ КОМНАТЫ на l76 (браузер): ✅ лобби/Эхо/каналы/открытие комнаты/запись — живые; ✅ ПРОГРЕСС фикса 75869858: серверный TrustedIdentityError (shapeguard3 realtime_auth_boundary_failed) БОЛЬШЕ НЕ ВОЗНИКАЕТ — журнал Pi за окно теста чист, сессия доезжает. ❌ НО Start Browser Realtime по-прежнему: transport close (клиентский browser_room_audio_transport_failure), transport not connected, ASSISTANT unknown. Рвётся на ДРУГОМ этапе (без серверного отказа): гипотезы — websocket upgrade через прокси Pi, join/ack namespace, отсутствие микрофона в headless-браузере координатора (тогда нужен graceful путь), несовпадение бейджа. Волна 915-roomtransport2: диагностика причины close с обеих сторон + фикс + тест «транспорт держится ≥30с без микрофона». Голосовой бинд Эхо пока НЕ подтверждён.

--- 31.08 ~11:55 IST (Фабл): roomtransport2 ГОТОВ: корень разрыва найден в КЛИЕНТСКОМ lifecycle (серверный TrustedIdentityError круга 1 не воспроизводится — фикс 75869858 держит). Приёмка 920 с ключевым тестом «транспорт держится ≥30с БЕЗ микрофона» (именно так рвалось у координатора в headless) + стражи не ослаблены.

--- 31.08 ~12:35 IST (Фабл): приёмка 920 = NO-GO по ОДНОМУ пункту диагностики: серверный realtime_room_audio_socket_close даёт code/reason/wasClean = null (клиент заполнен; доп. transport-лог code=4001 reason=acceptance_edge_reset, wasClean=null) — полный набор с обеих сторон не зафиксирован. Функциональный фикс lifecycle НЕ оспорен. Круг 924: честный wasClean на сервере + слить два серверных лога в один + тест «нет null'ов».

--- 31.08 ~17:20 IST (Фабл): ✅ roomtransport3 = GO (c4c44619): полный close-набор (code/reason/wasClean) с обеих сторон, два серверных лога сведены, lifecycle-фикс круга 2 и стражи сохранены, worktree чист, check-report-vs-diff проходит. Кандидат l78. После посадки — живой голосовой ре-тест комнаты (Start Browser Realtime + бинд Эхо).

--- 31.08 12:45Z — ЖИВАЯ ПРОВЕРКА КОМНАТЫ В БРАУЗЕРЕ на проде l78 (координатор, Chrome через расширение, комната cmtgi27em00omibefudboxmgs)
Что сделано глазами, а не по логам: открыл комнату, нажал «Start Browser Realtime».
РЕЗУЛЬТАТ: голос НЕ поднимается. Панель: «transport not connected» → «Meeting room audio transport disconnected: transport close».
СНЯТЫЕ ФАКТЫ:
1. Консоль браузера: [browser-room-audio] socket close code=1006 reason="websocket connection closed" wasClean=false socketReason="transport close" observable=browser_room_audio_socket_close, следом browser_room_audio_transport_failure. Те же записи есть за 01:28 и 04:41 (релиз l77) ⇒ болезнь НЕ регрессия посадки l78.
2. Сервер в этот момент не записал НИЧЕГО: journalctl note-clone-3010 за 12:45:30–12:46:20 пуст. Молчаливое закрытие сокета — отдельный дефект наблюдаемости.
3. Труба цела: curl с апгрейдом на /api/realtime/socket/?EIO=4&transport=websocket по HTTP/1.1 даёт 101 и через nginx, и прямо в приложение (127.0.0.1:3010). По HTTP/2 тот же запрос даёт 400 — это нормальное поведение (апгрейд по HTTP/2 так не делается), ложный след зафиксирован в брифе, чтобы волна по нему не пошла.
4. Сессия живая и админская: /api/auth/session → _@wool2.online, isAdmin true, emailVerified true, expires 2026-09-30.
5. Панель: PARTICIPANT cmtgi27f, ROOM BIND payload-ready (транспортная привязка после волны roomtransport3 работает), LISTENING no, ASSISTANT unknown, SPEECH LATENCY not measured. Отдельно «Signal-плечо: не подключено (signal_live_call_not_started)» — другое плечо, не путать.
6. TrustedIdentityError «authenticated session is missing» в 12:38 — следы прогона батареи ролей (ходит без пользовательской сессии), не моего клика.
ГИПОТЕЗА, требующая проверки: в браузере координатора нет разрешения на микрофон; если сокет рвётся именно поэтому, интерфейс обязан говорить «нет доступа к микрофону», а не «транспорт закрыт» — это тоже дефект, но другой.
ВОЛНА 972-roomws запущена (sol xhigh) с полным набором фактов, обязательным серверным логированием причины закрытия, негативными тестами (без сессии; с сессией, но без прав на комнату) и прямым запретом чинить надпись в интерфейсе, не установив причину.
--- 31.08 13:00-13:20Z — ЧЕТЫРЕ КОРНЯ НАЙДЕНЫ И ЗАКРЫТЫ (волны sol xhigh от l78 @7377c212)
1. СОВЕТ (969-councilidem, коммит в wave/councilidem). Мой продовый диагноз подтверждён, но МЕСТО оказалось раньше по цепочке, чем я думал: spendGuard корректно возвращал idempotency_conflict, а конфликт создавался в requestIdentity → meterVendorCall → spendReservation. У одной логической операции Совета были ДВЕ несовместимые формы дочерней идентичности: все стадии наследовали один operationId, но fingerprint/feature родителя строился из канала ТЕКУЩЕЙ стадии (council_stage1, council_stage2…) — поэт������му неизменяемая строка SpendOperation воспринимала следующую стадию как дрейф той же операции. Лечение общее, не Council-specific: feature родителя отделён от feature стадии (для проверенного прогона родитель web_rag_chat), те же поля идентичности проведены через общий meterVendorCall, managed LLM billing и metered OpenAI client. Полный Совет в режиме thinking (со стадией revisions) завершился ok при MAX_PROVIDER_ATTEMPTS_PER_OPERATION=3 и MAX_FALLBACK_PROVIDERS_PER_OPERATION=1. Отдельный gateway-тест доказывает общий случай fan-out: две разные нагрузки одного многостадийного родителя дают ordinals [1,2] БЕЗ Council-специфичных ключей — то есть podcast/video/factcheck вылечены тем же. Тесты биллинга: 1006 passed / 30 failed против baseline 1001 / 32 — новых падений нет, два прежних gateway-падения устранены попутно (устаревшая фикстура gpt54-mini → gpt54-nano).
2. КОМНАТА (972-roomws). Причина 101→1006 УСТАНОВЛЕНА: конфликт двух обработчиков апгрейда — провод обрывался ДО ответа namespace 40{...}, клиент видел unclean 1006 до Socket.IO connect. Микрофон НЕ причина (room Socket.IO стартует независимо), origin НЕ причина. Добавлены handshake-логи и обязательные внятные причины отказа, добавлен restart-тест. Отдельно закрыт найденный access-gap: браузер мог отправить room-audio:ready ДО проверки доступа к комнате.
3. РОЛИ C2/C3 (970-rolesc2c3). C3 ломался НЕ из-за неверной классификации: роль research распознавалась (roleId=research), политика и расширенный поиск отрабатывали, но квитанцию СТИРАЛ страж, требовавший временнóе доказательство исполнения от ЛЮБОЙ роли — условие детерминированно выбрасывало все квитанции research. Теперь временнóе доказательство обязательно только внутри Timeline-ветки; остальные роли строят квитанцию из плана поиска, фактически доставленных фрагментов, финальных цитат и финального текста. C2 (источники вне временного окна) закрыт там же.
4. ПОИСК ПО БОЛЬШОМУ ДОКУМЕНТУ (974-bigdocfind2). Замер в реальном Chromium на настоящей «Войне и мире» (tests/enginematrix/fixtures/war-and-peace.txt, sha256 0535a0…bf678d, теперь ЗАКОММИЧЕН в дерево): Наташа 847, Пьер 2321, Безухов 127 — сходятся с независимым полнотекстовым проходом. Первый и финальный счётчики измерены, переход к последнему совпадению работает, ведётся промежуточный «N+» counter. Добавлен контракт границы слова (нет ложного «Робеспьера» для «Пьер»), видимый предел с продолжением вместо молчаливой обрезки, бенчмарки памяти вкладки и процесса, документация Exact-семантики.
ПРИЁМКИ ПОСТАВЛЕНЫ: 977-accroomws, 978-acccouncilidem, 979-accrolesc2c3, 980-accbigdocfind2 — каждая с требованием воспроизвести ИСХОДНЫЙ дефект до фикса, негативными тестами и проверкой границы процесса.

## 2026-08-31 19:15Z — roomws3 (одноразовые обработчики апгрейда): автор завершил, приёмка в полёте
Авторский круг roomws3 завершён (ветка wave/roomws3, HEAD 1de915d1, ROOMWS3-REPORT.md, targeted ESLint exit 0). Независимая приёмка **accroomws3** (бриф 1013, база = HEAD автора) запущена 19:08Z: воспроизведение своим кодом, негативный тест двойной регистрации, три вопроса границы процесса, матрица мусора рукопожатия, проверка реального route.

## 2026-08-31 19:32Z — accroomws3: ПРИНЯТО ДА, кандидат l80 ✅
Одноразовые обработчики апгрейда приняты независимой приёмкой (воспроизведение своим кодом, негативный тест двойной регистрации, граница процесса, матрица мусора рукопожатия, реальный route подтверждён). Отчёт: A1:/home/ubuntu/waves/ACCROOMWS3-REPORT.md, ветка acc/roomws3. Линия обработчиков ЗАКРЫТА; остаётся e5realtime3 (жизненный цикл подписки/присутствия) — в полёте.

[01.09 15:15Z] АУДИТ по запросу owner + живая проба на l83: комнатные линии сданы до l81; голосовой канал комнаты был SHIP-DARK (MEETING_ROOMS_MROOM1_MULTICHANNEL_ENABLED нигде не включён, ни на Pi ни на A1). ВКЛЮЧЁН на проде (shared/.env.local, бэкап .bak-mroom-20260901), paid=200. Браузерная проба: room_audio_disabled ИСЧЕЗ, старый identity-отказ roomassistfix ИСЧЕЗ, сервер принимает транспорт (handshake→open_received→pending_registered→ready_sent, socket CaZ3QS9M, комната cmtisiee9). Предел автоматизации: нет микрофона — финальный голосовой круг попрошен у owner (id=16124). Остаток: WEB-393 мосты (review), Signal-плечо к живому звонку.

[01.09 15:20Z] ГОЛОСОВОЙ КРУГ КОМНАТЫ ЗАКРЫТ живой пробой owner (см. WEB-15 done, латентность 818ms). Мелкий残 дефект teardown (не блокер): после выхода из комнаты клиент шлёт hang-report «assistant.speech_state event does not belong to this room» (roomId:null, sequence 38-40) + один TrustedIdentityError на /api/realtime в момент disconnect — события догоняют отвязанный клиент. Кандидат в мелкую волну полировки. Остаток эпика: WEB-393 мосты (review), Signal-плечо live-звонка, telspend (в полёте).

[01.09 17:35Z] Нить «8000 не знает название тетради» (owner): identity верная (его учётка), инвентарь отдаёт 70 источников (sourceVisibility filtered=0), механика notebook-упоминаний в коде есть (loadNotebookNamedScope — открытие тетради ПО имени). Похоже, нет обратного инструмента «перечислить МОИ тетради по именам» в голосовом пути — вопрос-гэп, не поломка. Перепроверить после l85 (денежный отказ мог оборвать нормальный ответ); если подтвердится — завести фичу «notebook inventory tool в телефонии».

## ДЛЯ НУЛЕВОГО АГЕНТА (обновлено 2026-09-05 UTC)
- **Суть одной строкой:** Мультирум: ассистент как участник комнаты — инвентарь возможностей и план (эпик WEB-395, ветка «обвязка»)
- **Текущее состояние:** статус: done; --- 30.08 ~20:00Z (Фабл): ЖИВАЯ ПРОБА МУЛЬТИРУМА на l73 (браузер, комната MR-001 cmtfzo16t): лобби ПОЛНОСТЬЮ живое — личность Эхо с режимами («слушает мягко/пишет краткое/помнит решения», Тюнить), «2 канала живы» (Signal+Telegram), история решений; вход в комнату ок, honest-статусы плеч (signalli… | --- 30.08 ~20:50Z (Фабл): фикс ГОТОВ автором (f54bcbda, wave/roomassistfix): корень подтверждён — в live-комнате создавался ТОЛЬКО owner-participant, браузер-сессия проваливалась в него как speech identity, durable-гейт честно отвергал (role≠assistant). Фикс биндит настоящего assistant-participan… | --- 30.08 ~21:50Z (Фабл): ACCROOMASSISTFIX = УСЛОВНЫЙ GO: проверки пройдены, финальный GO после посадки (l75) + живого ре-теста комнаты координатором браузером. Кандидат l75 = f54bcbda. Тех-помарка: отчёт в дереве wt-roomassistfix (не /waves). | --- 31.08 ~02:30 IST (Фабл): ЖИВОЙ РЕ-ТЕСТ КОМНАТЫ на l75 (браузер): ✅ лобби живое (Утренний синк, история решений, «Эхо помнит 14 решений»), ✅ личность Эхо на месте (тёплый·медовый, слушает мягко), ✅ «2 канала живы», ✅ комната открывается, ROOM BIND payload-ready; ❌ Start Browser Realtime: транс… | --- 31.08 ~03:20 IST (Фабл): 📚 ВОССТАНОВЛЕНИЕ ГЛУБИНЫ ТИКЕТА (owner поймал пробел — механика «бейджей» здесь не была записана; исправляю кумулятивно из ROOMASSISTFIX-REPORT.md, wave/roomassistfix f54bcbda, принят условным GO): | === МЕХАНИКА «БЕЙДЖЕЙ ДЛЯ ОХРАННИКА» (identity-модель комнаты) === | Связка с текущей волной 863-roomrealtimeauth: транспортный отказ TrustedIdentityError на /api/realtime — СОСЕДНЯЯ дверь (session-страж транспорта, shapeguard3), не сам speech-gate; волна обязана чинить предъявление identity транспортом, не трогая speech-gate. Документы: ROOMASSISTFIX-REPORT.md + … | --- 31.08 ~04:20 IST (Фабл): roomrealtimeauth ГОТОВ (75869858): корень — browser realtime bootstrap не был привязан к Auth.js-сессии запроса (сам сокет credentials слал); фикс делает bootstrap request-bound, SHAPEGUARD3 fail-closed сохранён. Приёмка 871 (негативы стража + доказательство что speec…
- **Кто работал:**
- 2026-09-02T00:38:11.303Z — Fable — [02.09 00:50Z Фабл] Owner напомнил про «потерянную доводку митинг-рума». Сверка: мультирум-ассистент (ACCMULTIROOM2 GO 16a38e13) и ROOMSIM-стенд (8d2f590e, 8/8 локально) ПОСАЖЕНЫ в l71+; недоделан живой прогон на проде (
- 2026-09-02T08:00:41.280Z — Fable — [02.09 08:10Z Фабл] Статус: упирается в owner-а — для живого прогона митинг-рума нужны реальные участники Signal и Telegram (его учётки/пиры). Запрошено в TG 02.09 (сводка по трём эпикам, id 16417). Технически: код приня
- 2026-09-02T08:01:38.292Z — Fable — [02.09 08:15Z Фабл] Owner 02.09 08:00Z дал контакт Signal для живого прогона (хранится в закрытом файле координатора, в тикет не пишется). План живого прогона: после посадки живого SIP-шлюза (1154 → ре-приёмка → посадка)
- 2026-09-02T08:06:36.762Z — Fable — [02.09 08:25Z Фабл] Зависимость: Signal-канал на Pi мёртв (WEB-471, перерегистрация у owner-а), Telegram-воркер требует reauth (owner). До этого живой прогон митинг-рума возможен только браузер + SIP-звонок + ИИ; полный 
- 2026-09-02T08:57:32.733Z — Fable — [02.09 09:10Z Фабл] Ревизия архива митинг-рума (1163-meetingroomarchive, отчёт A1 /home/ubuntu/waves/MEETINGROOMARCHIVE-REPORT.md): вердикт по цели эпика WEB-77 — NO-GO/не доказано. В l89 вошли roomws/972, roomws2/987, r
- 2026-09-02T10:09:50.022Z — Fable — [02.09 11:20Z Фабл] Фикс лимита каналов митинг-рума (3→4 legs, 5de3f756ee) cherry-pick в l90-candidate = de3b6eff (A2), зеркало A1 обновлено. Env-diff l89→l90 по process.env: новых серверных ключей нет (только тестовый C
- 2026-09-02T11:03:00.287Z — Fable — [A1 11:05Z Фабл] ПОСАЖЕН l90 на A1: commit 26da36faba, артефакт me2-standalone-linux-arm64-26da36fa-20260902T105621Z (sha dffb8a17…), run /home/ubuntu/prod/shared/run/l90-26da36fa, /api/ready TRUE (boot-env: 1 warning), 
- 2026-09-05T17:35:28.661Z — fable-coordinator — [2026-09-05 17:40Z] Ревизия доски (волна 2040 boardtriage, M1, luna): статус → done. Основание: есть подтверждение посадки в l71; живой прогон продолжается после l72. Если работа жива — верни статус и напиши в тикет, как
- **Ветки/бандлы/отчёты:** /home/ubuntu/waves/ACCROOMWS3-REPORT.md, /home/ubuntu/waves/MEETINGROOMARCHIVE-REPORT.md; sha: f54bcbda, 75869858, c4c44619, 7377c212, 1de915d1, 20260901, 16a38e13, 8d2f590e
- **KNOWN ISSUES / ТРАБЛШУТИНГ:**
- --- 30.08 ~20:00Z (Фабл): ЖИВАЯ ПРОБА МУЛЬТИРУМА на l73 (браузер, комната MR-001 cmtfzo16t): лобби ПОЛНОСТЬЮ живое — личность Эхо с режимами («слушает мягко/пишет краткое/помнит решения», Тюнить), «2 канала живы» (Signal+Telegram), история решений; вход в комнату ок, honest-статусы плеч (signalli…
- --- 30.08 ~20:50Z (Фабл): фикс ГОТОВ автором (f54bcbda, wave/roomassistfix): корень подтверждён — в live-комнате создавался ТОЛЬКО owner-participant, браузер-сессия проваливалась в него как speech identity, durable-гейт честно отвергал (role≠assistant). Фикс биндит настоящего assistant-participan…
- --- 30.08 ~21:50Z (Фабл): ACCROOMASSISTFIX = УСЛОВНЫЙ GO: проверки пройдены, финальный GO после посадки (l75) + живого ре-теста комнаты координатором браузером. Кандидат l75 = f54bcbda. Тех-помарка: отчёт в дереве wt-roomassistfix (не /waves).
- --- 31.08 ~02:30 IST (Фабл): ЖИВОЙ РЕ-ТЕСТ КОМНАТЫ на l75 (браузер): ✅ лобби живое (Утренний синк, история решений, «Эхо помнит 14 решений»), ✅ личность Эхо на месте (тёплый·медовый, слушает мягко), ✅ «2 канала живы», ✅ комната открывается, ROOM BIND payload-ready; ❌ Start Browser Realtime: транс…
- --- 31.08 ~03:20 IST (Фабл): 📚 ВОССТАНОВЛЕНИЕ ГЛУБИНЫ ТИКЕТА (owner поймал пробел — механика «бейджей» здесь не была записана; исправляю кумулятивно из ROOMASSISTFIX-REPORT.md, wave/roomassistfix f54bcbda, принят условным GO):
- • Охранник = fail-closed gate: оба speech-state POST-роута требуют participant.role==='assistant' ДО provider-работы (генератор отказа был в .../assistant/speech-state/generation/route.ts; строгий гейт вынесен в src/lib/meetingRooms/assistantIdentity.ts и переиспользован обоими роутами).
- • Корень инцидента «ассистент не признавался жильцом»: createRoom создавал ТОЛЬКО owner-participant; браузер использовал его и как control, и как fallback speech identity → в комнате физически не было бейджа assistant → честный отказ 'assistant.speechstate participant is not the room assistant', …
- • Фикс f54bcbda: канонический assistant-participant создаётся; owner/browser participant = ТОЛЬКО control identity (транспорт/VoiceSession/MeetingLeg), НЕ переименовывается в assistant и НЕ публикует assistant-маркер; MeetingRoomRuntimeState.audioSourceParticipantId при speaking указывает на кано…
- **Эволюция:**
- 2026-09-02 → [02.09 00:50Z Фабл] Owner напомнил про «потерянную доводку митинг-рума». Сверка: мультирум-ассистент (ACCMULTIROOM2 GO 16a38e13) и ROOMSIM-стенд (8d2f590e, 8/8 локально) ПОСАЖЕНЫ в l71+; недоделан живой прогон на проде (веб+Signal+TG+ИИ в одной комнате, вопрос
- 2026-09-02 → [02.09 08:10Z Фабл] Статус: упирается в owner-а — для живого прогона митинг-рума нужны реальные участники Signal и Telegram (его учётки/пиры). Запрошено в TG 02.09 (сводка по трём эпикам, id 16417). Технически: код принят ранее, кандидат живого SIP-шлюза (b540
- 2026-09-02 → [02.09 08:15Z Фабл] Owner 02.09 08:00Z дал контакт Signal для живого прогона (хранится в закрытом файле координатора, в тикет не пишется). План живого прогона: после посадки живого SIP-шлюза (1154 → ре-приёмка → посадка) — комната: браузер + SIP-звонок на 8010
- 2026-09-02 → [02.09 08:25Z Фабл] Зависимость: Signal-канал на Pi мёртв (WEB-471, перерегистрация у owner-а), Telegram-воркер требует reauth (owner). До этого живой прогон митинг-рума возможен только браузер + SIP-звонок + ИИ; полный (с Signal/Telegram) — после owner-действ
- 2026-09-02 → [02.09 09:10Z Фабл] Ревизия архива митинг-рума (1163-meetingroomarchive, отчёт A1 /home/ubuntu/waves/MEETINGROOMARCHIVE-REPORT.md): вердикт по цели эпика WEB-77 — NO-GO/не доказано. В l89 вошли roomws/972, roomws2/987, roomws3/1008, roomtransport2/915, roomtra
- 2026-09-02 → [02.09 11:20Z Фабл] Фикс лимита каналов митинг-рума (3→4 legs, 5de3f756ee) cherry-pick в l90-candidate = de3b6eff (A2), зеркало A1 обновлено. Env-diff l89→l90 по process.env: новых серверных ключей нет (только тестовый C09JOINTESTDATABASEURL).
- 2026-09-02 → [A1 11:05Z Фабл] ПОСАЖЕН l90 на A1: commit 26da36faba, артефакт me2-standalone-linux-arm64-26da36fa-20260902T105621Z (sha dffb8a17…), run /home/ubuntu/prod/shared/run/l90-26da36fa, /api/ready TRUE (boot-env: 1 warning), paid true, воркер индексации на l90. Env
- 2026-09-05 → [2026-09-05 17:40Z] Ревизия доски (волна 2040 boardtriage, M1, luna): статус → done. Основание: есть подтверждение посадки в l71; живой прогон продолжается после l72. Если работа жива — верни статус и напиши в тикет, какая волна её ведёт.
- --- 30.08 ~20:00Z (Фабл): ЖИВАЯ ПРОБА МУЛЬТИРУМА на l73 (браузер, комната MR-001 cmtfzo16t): лобби ПОЛНОСТЬЮ живое — личность Эхо с режимами («слушает мягко/пишет краткое/помнит решения», Тюнить), «2 канала живы» (Signal+Telegram), история решений; вход в комнату ок, honest-статусы плеч (signalli…
- --- 30.08 ~20:50Z (Фабл): фикс ГОТОВ автором (f54bcbda, wave/roomassistfix): корень подтверждён — в live-комнате создавался ТОЛЬКО owner-participant, браузер-сессия проваливалась в него как speech identity, durable-гейт честно отвергал (role≠assistant). Фикс биндит настоящего assistant-participan…
- --- 30.08 ~21:50Z (Фабл): ACCROOMASSISTFIX = УСЛОВНЫЙ GO: проверки пройдены, финальный GO после посадки (l75) + живого ре-теста комнаты координатором браузером. Кандидат l75 = f54bcbda. Тех-помарка: отчёт в дереве wt-roomassistfix (не /waves).
- --- 31.08 ~02:30 IST (Фабл): ЖИВОЙ РЕ-ТЕСТ КОМНАТЫ на l75 (браузер): ✅ лобби живое (Утренний синк, история решений, «Эхо помнит 14 решений»), ✅ личность Эхо на месте (тёплый·медовый, слушает мягко), ✅ «2 канала живы», ✅ комната открывается, ROOM BIND payload-ready; ❌ Start Browser Realtime: транс…
- --- 31.08 ~03:20 IST (Фабл): 📚 ВОССТАНОВЛЕНИЕ ГЛУБИНЫ ТИКЕТА (owner поймал пробел — механика «бейджей» здесь не была записана; исправляю кумулятивно из ROOMASSISTFIX-REPORT.md, wave/roomassistfix f54bcbda, принят условным GO):
- --- 31.08 ~04:20 IST (Фабл): roomrealtimeauth ГОТОВ (75869858): корень — browser realtime bootstrap не был привязан к Auth.js-сессии запроса (сам сокет credentials слал); фикс делает bootstrap request-bound, SHAPEGUARD3 fail-closed сохранён. Приёмка 871 (негативы стража + доказательство что speec…
- **Следующий шаг:** --- 30.08 ~20:00Z (Фабл): ЖИВАЯ ПРОБА МУЛЬТИРУМА на l73 (браузер, комната MR-001 cmtfzo16t): лобби ПОЛНОСТЬЮ живое — личность Эхо с режимами («слушает мягко/пишет краткое/помнит решения», Тюнить), «2 канала живы» (Signal+Telegram), история решений; вход в комнату ок, honest-статусы плеч (signalli… | --- 30.08 ~20:50Z (Фабл): фикс ГОТОВ автором (f54bcbda, wave/roomassistfix): корень подтверждён — в live-комнате создавался ТОЛЬКО owner-participant, браузер-сессия проваливалась в него как speech identity, durable-гейт честно отвергал (role≠assistant). Фикс биндит настоящего assistant-participan…
Доказательства
Заведён 29.08 по прямому вопросу owner-а («где про ассистента в комнате, и почему ждём посадку?»). Owner прав: ждать посадку незачем — работа по инвентарю не пересекается с l67, A1 свободен.

КОНТЕКСТ ЛИНИИ (для нулевого агента):
- ПРИНЯТО и посажено в l66: встреча звука браузер+SIP+сигнал (WEB-77, коммиты 3c532155+01e6aecf), качество обратного звука (WEB-396), защита от «новостей из будущего» (WEB-45/46).
- ПРИНЯТО, едет в l67: индикация «ассистент говорит/слушает» (WEB-15, коммит 12704970, ACC15H GO).
- В РАБОТЕ: предстартовая проверка комнаты (WEB-48) — 4-й круг, ACC48D нашла 7 мест тихих отказов, идёт WEB48E.
- НЕ НАЧАТО (этот тикет): участие ассистента в комнате как продукт — что он умеет делать в живой комнате, чем это подключено, чего не хватает.

ЗАДАЧА ПЕРВОГО КРУГА (инвентарь, БЕЗ правок продукта): по коду выяснить и описать — какие возможности ассистента в комнате реально существуют (маршруты, runtime, где решается «ассистент отвечает»), что из этого включено флагами, что мертво; отдельно — чего требует эпик WEB-395 и чего нет в коде. Результат: карта «есть / включено / мертво / отсутствует» с файлами:строками, и предложение порядка работ.

Связано: WEB-395 (эпик телефония+мультирум), WEB-99 (роли-агенты по-настоящему), WEB-48, WEB-15.
Ограничение owner-а 28.08: телефонная зона распаркована, берём сами.

---
## 2026-08-29 04:00Z — MROOMINV: карта возможностей ассистента в комнате готова
Отчёт: /home/ubuntu/waves/MROOMINV-REPORT.md (правок кода нет, NOCOMMIT). Суть:
- РАБОТАЕТ: создание комнаты, browser voice; общий PCM16 mixer, VAD, последовательная очередь реплик, механизм barge-in (прерывание).
- ЗА ФЛАГОМ: SIP передаёт media и turns в общий runtime — только за MROOM1.
- ЧАСТИЧНО: Signal открывает room media socket; Telegram и WhatsApp в основном лишь пишут binding в БД (полноценного медиа-участия нет).
- ГЛАВНЫЙ ПРОБЕЛ: ассистент отвечает обычным ТЕКСТОВЫМ grounded-вызовом, а не единым realtime-голосом комнаты.
- ОТСУТСТВУЕТ: live dispatcher для комнатных инструментов/агентов (политики описаны, исполнителя нет); автоматический transcript из общего аудио и summary встречи (сохраняются только финальные voice turns).
Следующий шаг (предложение): круг 1 — единый realtime-голос ассистента в комнате (закрывает главный пробел); круг 2 — live dispatcher инструментов; круг 3 — transcript+summary. Порядок по «видно пользователю».

---
## 2026-08-29 04:15Z — три круга по карте заряжены (ночная цель: мультирум весь остаток, кроме телеги)
- MROOMVOICE (queue/360): ассистент отвечает ГОЛОСОМ комнаты через общий mixer/очередь/VAD с barge-in; одна точка решения «ассистент говорит»; платный путь со стабильным requestId+TrustedIdentity; три вопроса границы; негативы (перебивание, отказ провайдера посреди реплики, отсутствие identity).
- MROOMDISP (queue/361): живой запуск инструментов/агентов (политики есть, исполнителя нет) — проверка политики → вызов → результат в очередь реплик; отказ так же наблюдаем, как результат; деньги через тот же контур.
- MROOMTRANS (queue/362): transcript общего аудио с привязкой к участнику и времени + summary встречи; пробел в расшифровке фиксируется явно, не пропускается; приватность — transcript принадлежит владельцу комнаты, проверить адверсариально (на линии видео уже была утечка между владельцами, WEB-047).
Телеграм-канал сознательно НЕ берём: ждём материалы owner-а.

---
## 2026-08-29 07:10Z — обе приёмки мультирума: NO-GO, круги заряжены
**ACCMROOMTRANS: NO-GO — ⚠️ УТЕЧКА owner-only данных участнику комнаты.** Доказано: (1) getRoom() возвращает принятому участнику полный MeetingRoomRecord вместе с summary/summaryStatus/summaryRequestId и полями ошибки (service.ts:271-278), а обычный GET без include=state сериализует объект целиком (rooms/[roomId]/route.ts:16-17) → участник, которому transcript запрещён, читает owner-only summary; (2) fetchTranscript() проверяет transcriptVisibility, но затем отдаёт summary-поля (service.ts:922-943) и ВСЕ artifacts, включая visibility: owner_only (:955-961). Класс тот же, что WEB-047.
Круг MROOMTRANS2 (queue/376): проекция записи комнаты ПО РОЛИ зрителя в одной точке, фильтр артефактов по visibility там же, аудит всех мест сериализации MeetingRoomRecord, адверсариальные тесты участник/посторонний/владелец.
**ACCMROOMVOICE: NO-GO** — для GO не хватает: наблюдаемого отказа/учёта незавершённой реплики при РЕАЛЬНОМ рестарте процесса и ЕДИНОЙ exact-frame проверки на callback ingress. Круг MROOMVOICE2 (queue/377): durable состояние реплики + одна функция проверки кадра для всех входов.

---
## 2026-08-29 08:15Z — оба круга мультирума сданы, приёмки заряжены
- MROOMVOICE2 (a41f9515): учёт незавершённой реплики при рестарте + единая exact-frame проверка на ingress → ACCMROOMVOICE2 (queue/385). В брифе отдельно: если разрыв смоделирован в памяти, а не настоящим рестартом — NO-GO.
- MROOMTRANS2 (08602e4f): проекция записи комнаты по роли зрителя + фильтр артефактов по visibility → ACCMROOMTRANS2 (queue/386). Бриф требует матрицу {владелец, участник, посторонний, гость} × {transcriptVisibility} × {summary/artifacts} и проверку соседних полей (summaryRequestId, поля ошибки), которые автор мог забыть.

---
## 2026-08-29 08:50Z — ✅ ГОЛОС АССИСТЕНТА В КОМНАТЕ ПРИНЯТ (ACCMROOMVOICE2 GO)
Принят коммит a41f9515: реплика ассистента идёт через общий mixer/очередь с VAD и barge-in, учёт незавершённой реплики переживает реальный рестарт процесса, единая exact-frame проверка на всех ingress-путях, деньги через стабильный requestId + TrustedIdentity. Главный пробел карты MROOMINV («ассистент отвечает текстом, а не голосом комнаты») закрыт. Кандидат следующей посадки.
## Протокол встречи — круг 3
ACCMROOMTRANS2: NO-GO, но утечка сузилась: основные projection-пути исправлены (текст summary участнику не виден), остались служебные метаданные — summaryRequestId и поля ошибки доезжают до принятого non-owner участника, включая роль модератора. Круг MROOMTRANS3 (queue/391) с требованием БЕЛОГО СПИСКА полей по ролям (а не вычёркивания текста) и матрицы {владелец, модератор, участник, посторонний, гость} × {summary есть / в процессе / ошибка}.

---
## 2026-08-29 09:30Z — ✅ ПРОТОКОЛ ВСТРЕЧИ ПРИНЯТ (ACCMROOMTRANS3 GO)
Принят коммит b0d004b6: проекция записи комнаты по роли зрителя построена БЕЛЫМ СПИСКОМ полей, служебные метаданные (summaryRequestId, коды и тексты ошибок) — только владельцу; артефакты фильтруются по visibility; роль модератора закрыта. Три круга ушло на класс «утечка между владельцами» — теперь новое поле не утечёт по умолчанию.
Итог по мультируму: голос ассистента ПРИНЯТ (a41f9515), протокол встречи ПРИНЯТ (b0d004b6), живой запуск инструментов (MROOMDISP) — на очереди. Кандидаты следующей посадки.

---
## 2026-08-29 13:20Z — последняя часть мультирума сдана
MROOMDISP2 (f67ec2c4, база l67): живой запуск инструментов/агентов в комнате — политика → вызов → результат в очередь реплик. Приёмка ACCMROOMDISP2 заряжена (queue/415) с двумя уроками этой ночи в требованиях: (1) модель ТОЛЬКО из реестра каналов, зашитая = NO-GO (урок WEB-428); (2) результат инструмента отдаётся по роли зрителя через существующую проекцию, участник не видит owner-only (урок MROOMTRANS2). Плюс границы процесса и сохранность принятых частей (голос, протокол).
Состояние мультирума: голос ПРИНЯТ, протокол ПРИНЯТ, индикация ПОСАЖЕНА (в l67), инструменты — на приёмке. Телеграм-канал ждёт материалов owner-а.

---
## 2026-08-29 13:35Z — ACCMROOMDISP2: NO-GO. Диспетчер есть, но штатный ассистент его не зовёт
Принято: политика и предохранители — 24/24 targeted (запрет send_* → tool_requires_owner_approval + маячок ROOM_INVOCATION; разрешённый get_room_status → tool_completed и результат в reply path; агент вне allowlist отклонён; рестарт → dispatch_interrupted_by_restart; мусорный результат → invalid_tool_result; owner-only transcript не уходит гостю; нет fan-out приватного результата на другие legs). Проекция по роли через projectMeetingRoomForViewer(). В новом коде нет зашитых моделей, allowlist не расширен.
ЧЕТЫРЕ БЛОКЕРА: (1) живого подключения нет — штатный createGroundedRoomAssistantAdapter (roomMultichannelEntrypoints.ts:555-583) возвращает только {responseId, text}, toolRequest не создаёт, значит в production диспетчер не получает запросов; тесты доказывают лишь инъекционный путь; (2) деньги end-to-end: фактический provider-request берёт модель через getConfig('EMBEDDING_MODEL') в src/lib/rag/embeddings.ts:122,145, а реестр используется только для billing descriptor — config/env override уводит модель за пределы реестра; (3) межпроцессная гонка: два экземпляра с общим журналом дали два completed вместо одного победителя; (4) регрессия — удалён принятый набор MROOMTRANS.
Круг MROOMDISP3 (queue/417) со всеми четырьмя требованиями.

---
## 2026-08-29 14:35Z — ACCMROOMDISP3: NO-GO по одному пункту; деньги при этом ЗАЩИЩЕНЫ
Принято 4 из 5 групп: (1) ⭐ ШТАТНЫЙ путь доказан — обычный ассистент комнаты порождает toolRequest, диспетчер получает его без инъекции (это был главный блокер круга 2); (2) межпроцессная гонка закрыта; (3) набор MROOMTRANS восстановлен; (4) 24/24 предохранителя целы.
БЛОКЕР и его природа: приёмка подменила SDK, задала EMBEDDING_MODEL=provider-model-outside-registry и вызвала generateEmbeddings() — к провайдеру ушла ПРАВИЛЬНАЯ модель text-embedding-3-small (деньги защищены, реестр применяется), но override игнорируется МОЛЧА, без отказа и следа. Это нарушение правила «тихая подмена запрещена»: оператор задаёт настройку, она не действует, а при разборе инцидента он будет уверен в обратном.
Круг MROOMDISP4 (queue/421): расхождение «настройка vs реестр» сделать наблюдаемым (маячок + обе модели в записи), выбрать и обосновать отказ на старте либо громкое предупреждение, распространить правило на остальные каналы с возможным env-override (таблица «канал → override возможен? → поведение»).

---
## 2026-08-29 09:40Z — ЭВОЛЮЦИЯ ЛИНИИ МУЛЬТИРУМА (для нулевого агента)
Отправная точка: карта возможностей /home/ubuntu/waves/MROOMINV-REPORT.md (28.08, без правок кода) — показала, что комната создаётся, browser voice есть, работают mixer/VAD/очередь/barge-in, но ассистент отвечает ТЕКСТОМ, инструменты не запускаются, протокола встречи нет.
Четыре части и их путь:
1. ГОЛОС АССИСТЕНТА: MROOMVOICE (6305c662) → ACCMROOMVOICE NO-GO (нет учёта незавершённой реплики при реальном рестарте; проверка кадра не единая) → MROOMVOICE2 (a41f9515) → ⭐ACCMROOMVOICE2 GO. Отчёты: MROOMVOICE*-REPORT.md, ACCMROOMVOICE*-REPORT.md.
2. ПРОТОКОЛ ВСТРЕЧИ: MROOMTRANS (ad7858bd) → ACCMROOMTRANS NO-GO (⚠️ утечка: участник читал owner-only summary и артефакты; service.ts:271-278, route.ts:16-17, service.ts:922-961) → MROOMTRANS2 (08602e4f) → ACCMROOMTRANS2 NO-GO (остались служебные поля summaryRequestId и ошибки, видны модератору) → MROOMTRANS3 (b0d004b6) → ⭐ACCMROOMTRANS3 GO (белый список полей по роли).
3. ИНСТРУМЕНТЫ В КОМНАТЕ: MROOMDISP (отчёта не оставила) → MROOMDISP2 (f67ec2c4) → ACCMROOMDISP2 NO-GO (4 блокера: штатный ассистент не порождал toolRequest — тесты доказывали лишь инъекцию; модель бралась мимо реестра через getConfig; межпроцессная гонка; удалён принятый набор MROOMTRANS) → MROOMDISP3 → ACCMROOMDISP3 NO-GO (деньги защищены, но override модели игнорировался МОЛЧА) → MROOMDISP4 (02f8cfc6) → приёмка ACCMROOMDISP4 идёт.
4. ИНДИКАЦИЯ «ассистент говорит»: WEB-15, коммит 12704970, ACC15H GO — ПОСАЖЕНА в l67.
В l68 едут: голос (a41f9515) и протокол (b0d004b6). Телеграм-канал в комнате сознательно НЕ брали — ждём материалы owner-а.
Уроки линии: «утечка между владельцами» повторилась трижды → перешли на белый список полей; «тесты доказывают инъекционный путь, а не штатный» — теперь требуем доказательство без инъекции.

---
## 2026-08-29 10:15Z — ✅ ACCMROOMDISP4: GO. МУЛЬТИРУМ ЗАКРЫТ ЦЕЛИКОМ
Принят коммит 02f8cfc6: расхождение «внешняя настройка модели vs реестр каналов» стало наблюдаемым (путь src/lib/rag/embeddings.ts получает значение через getConfig, но расхождение с реестром теперь фиксируется), деньги защищены, allowlist не расширен.
ИТОГ ЛИНИИ (четыре части, все приняты): голос ассистента в комнате (a41f9515) · протокол встречи с белым списком полей по роли (b0d004b6) · живой запуск инструментов и агентов (02f8cfc6) · индикация «ассистент говорит» (12704970, уже на проде в l67).
Осталось по эпику: телеграм-канал в комнате — ждём материалы owner-а (он сам сказал, что нужно что-то сгенерить).
Первые три едут в l68 (голос и протокол уже влиты; инструменты — кандидат следующей сборки, приняты после слияния).

[29.08 ОТВЕТ НА ВОПРОС ВЛАДЕЛЬЦА «инструменты в комнате готовы?»]
Готовы и приняты приёмкой, но НА ПРОДЕ ИХ ЕЩЁ НЕТ. Коммит 02f8cfc6 (живой запуск инструментов и агентов) проверен против прода: НЕ является предком l68 (18af977a) — значит в текущей сборке его нет. Включён в кандидаты линии l69.
Уже на проде (проверено merge-base против 18af977a): голос ассистента в комнате a41f9515 · протокол встречи с белым списком полей по роли b0d004b6 · индикация «ассистент говорит» 12704970.
Остаток эпика по мультируму — только телеграм-канал в комнате, он ждёт материалов владельца (владелец 29.08 сам вывел телегу из ночного объёма: «мультирум весь остаток кроме телеги»). Значит после посадки l69 и живой проверки мультирум закрыт целиком.


[BOARDTRIAGE] 29.08 10:15Z: четыре части мультирума приняты, но commit 02f8cfc6 не является предком l68; Telegram-канал ждёт материалы owner. После l69 нужен живой room check.

[29.08 20:45Z — поправка owner-а (голос 19:09)] Owner опровергает запись «телега ждёт материалов owner»: ничего не выводил, материалы давать не будет, /call в телеге НЕ работает «как и всегда» (при этом watchdog MTProto показывает healthy — «нет ошибок» ≠ жива, нужен сквозной прогон). НОВОЕ ТРЕБОВАНИЕ: доказательство комнаты/мультирума БЕЗ участия owner-а — имитация звонков синтетическими участниками с заготовленными записями. → волна ROOMSIM (queue/676): SIP-скрипт+браузер+существующие серверные сессии телеги/сигнала, машинные PASS/FAIL, живой прогон на Pi — координатор по runbook. Прежняя зависимость от материалов owner-а СНЯТА.

[29.08 21:00Z] ЧЕТВЁРТАЯ находка класса — живой звонок owner-а (телега /call 19:19Z): приветствие → «перехожу к делу» → вечное молчание. Логи: [shapeguard3][realtime_auth_boundary_failed] TrustedIdentityError authenticated session is missing (/api/realtime) + флуд [WEB-243] outline той же ошибкой. Класс поднят в эпик WEB-445 (служебная identity), волна SVCIDENT (queue/677). Этот тикет закроется тем же устройством.

[29.08 20:00Z] ROOMSIM сдан (8d2f590e): локальная синтетика 8/8 PASS (SIP+браузер, машинные вердикты, артефакты в ROOMSIM-ARTIFACTS). Живой прогон на Pi — координатор ПОСЛЕ посадки l71+SVCIDENT (сейчас мозг звонка падает на auth-границе — известный WEB-445, прогон задокументирует известный отказ). ACCMULTIROOM2 GO (16a38e13) — правки приёмщика подтверждены, мультирум закрыт полностью.

[29.08 21:05Z] Уточнение owner-а к живому прогону после l71: сценарий = веб+Signal+Telegram+ИИ в одной комнате, вопросы ИИ, проверка РЕЖИМОВ личности комнаты из настроек (тон/поведение). Discord/WhatsApp — заглушки, не проверять. В ROOMSIM-сценарий добавить шаг смены режима личности. Скрин owner-а: Browser Realtime transport unavailable на текущем l70 — ожидаемо (WEB-445), проверка после посадки с паспортом.

[30.08 07:00Z] 🛬 ПОСАЖЕН В l71 (артефакт ad094b26, commit 4a6b7ae5, посадка 30.08 00:53Z, обе службы, paidReady enforce_ready). Полный журнал посадки с 5 находками стражей — WEB-320 [30.08]. Живой прогон комнаты (веб+сигнал+телега+ИИ, режимы Эхо) — после посадки l72 (паспорт нужен звонковому мозгу; ROOMSIM harness готов, 8/8 локально).
Лента
2026-09-02T00:38:11.303Z · Fable
[02.09 00:50Z Фабл] Owner напомнил про «потерянную доводку митинг-рума». Сверка: мультирум-ассистент (ACCMULTIROOM2 GO 16a38e13) и ROOMSIM-стенд (8d2f590e, 8/8 локально) ПОСАЖЕНЫ в l71+; недоделан живой прогон на проде (веб+Signal+TG+ИИ в одной комнате, вопросы ИИ, смена режима личности) — раньше упирался в WEB-445 (закрыт), сейчас в WEB-461 (paid 503). План: прогон координатором сразу после посадки l85b. Дополнительно в A1 /home/ubuntu/waves-archive лежат незакоммиченные патчи приёмок комнаты: wt-l59-accmroom2-uncommitted.patch (15 файлов: realtime session-start/turn/end, roomAudioBridge, roomMultichannel*, roomTurnQueue + тесты) и wt-accmroomvoice-uncommitted.patch (acceptance-тест) — разобрать: что из этого приёмочные правки, а что доводка, и не потеряно ли содержимое в l71.
2026-09-02T08:00:41.280Z · Fable
[02.09 08:10Z Фабл] Статус: упирается в owner-а — для живого прогона митинг-рума нужны реальные участники Signal и Telegram (его учётки/пиры). Запрошено в TG 02.09 (сводка по трём эпикам, id 16417). Технически: код принят ранее, кандидат живого SIP-шлюза (b540c15d20) содержит room/PIN carrier; посадка шлюза после фикса 1154.
2026-09-02T08:01:38.292Z · Fable
[02.09 08:15Z Фабл] Owner 02.09 08:00Z дал контакт Signal для живого прогона (хранится в закрытом файле координатора, в тикет не пишется). План живого прогона: после посадки живого SIP-шлюза (1154 → ре-приёмка → посадка) — комната: браузер + SIP-звонок на 8010/8000 + Signal-участник (owner) + Telegram-участник (owner) + ИИ; перед звонком предупредить owner-а в TG. Осталось от owner-а: быть у телефона в согласованное окно.
2026-09-02T08:06:36.762Z · Fable
[02.09 08:25Z Фабл] Зависимость: Signal-канал на Pi мёртв (WEB-471, перерегистрация у owner-а), Telegram-воркер требует reauth (owner). До этого живой прогон митинг-рума возможен только браузер + SIP-звонок + ИИ; полный (с Signal/Telegram) — после owner-действий.
2026-09-02T08:57:32.733Z · Fable
[02.09 09:10Z Фабл] Ревизия архива митинг-рума (1163-meetingroomarchive, отчёт A1 /home/ubuntu/waves/MEETINGROOMARCHIVE-REPORT.md): вердикт по цели эпика WEB-77 — NO-GO/не доказано. В l89 вошли roomws/972, roomws2/987, roomws3/1008, roomtransport2/915, roomtransport3/924, media bridge MROOM3 (PCM16 bridge/runtime, browser+SIP entrypoints, durable transcript, Signal/TG room-binding контракты). НЕ найден Telegram release 20260707T122135Z-meetingroom1148 в refs репо (живёт только на Pi в telegram-call-native/releases — провенанс WEB-401 уже снят). P0-блокер в коде: лимит runtime = 3 внешних leg → сценарий из 4 каналов (браузер+SIP+Signal+Telegram) был невозможен; поднят до 4, отказ на 5-й (единственный фикс, коммит 5de3f756ee, 6 файлов). LOST_WORK_ITEMS=8 (таблица в отчёте). Зависимости живого прогона: WEB-471 (Signal регистрация — owner), Telegram reauth (owner), посадка SIP-шлюза (1171). Фикс пойдёт в l90 после приёмки.
2026-09-02T10:09:50.022Z · Fable
[02.09 11:20Z Фабл] Фикс лимита каналов митинг-рума (3→4 legs, 5de3f756ee) cherry-pick в l90-candidate = de3b6eff (A2), зеркало A1 обновлено. Env-diff l89→l90 по process.env: новых серверных ключей нет (только тестовый C09JOIN_TEST_DATABASE_URL).
2026-09-02T11:03:00.287Z · Fable
[A1 11:05Z Фабл] ПОСАЖЕН l90 на A1: commit 26da36faba, артефакт me2-standalone-linux-arm64-26da36fa-20260902T105621Z (sha dffb8a17…), run /home/ubuntu/prod/shared/run/l90-26da36fa, /api/ready TRUE (boot-env: 1 warning), paid true, воркер индексации на l90. Env: убраны BLUEBUBBLES_SERVER_PASSWORD и SOCIAL_ENCRYPTION_KEY_PREVIOUS, добавлен SYNC_PAGINATION_ENABLED=1 (P15 SAFE_NOW). Откат: nc-a1.service.bak-l89 + l89 целы.
2026-09-05T17:35:28.661Z · fable-coordinator
[2026-09-05 17:40Z] Ревизия доски (волна 2040 boardtriage, M1, luna): статус → done. Основание: есть подтверждение посадки в l71; живой прогон продолжается после l72. Если работа жива — верни статус и напиши в тикет, какая волна её ведёт.
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-427","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-05T21:05:36.530Z