InquirerAngara visits South Cotabato’s Banga school a day after deadly shootingESPN DeportesLa Novena: Dodgers lustran su dinastía: 24 títulos divisionales y dominio históricoCNN TürkKasapoğlu: İzmir'de nadir hastalıklar ve otizm için uluslararası bir merkez hedefliyoruzESPNYanks' Boone 'not going to predict anything' as Judge (calf) returns to ILPunchVIDEO: Kanayo O. Kanayo pays tribute to Olu Jacobs, recalls his impact on NollywoodRTP DesportoSporting quer regressar às vitórias diante do Aroucaוואלהגבר בן 24 נפצע באירוע אלימות בטייבהThe Jerusalem Post'Zoti': Fun vibe in Tel Aviv - restaurant reviewComplete SportsEuromatch NPFL: Plateau Govt Buys Free Match Tickets For Supporters Ahead Of Shooting Stars ShowdownBBC عربيصبي كان لا يملك صوتاً، أصبح يساعد الآخرين على إيجاد أصواتهمTVN24Rolnik w środku miastaسكاي نيوز عربيةبمليارات الدولارات.. صفقة أميركية لحماية سماء أوكرانيا
The Daily Newsstand · Free, Always
Saturday, September 19, 2026

Локальный ассистент для зумов, часть 6: полчаса тишины, которых не было в протоколе

Translate

Встреча 15 сентября, 65 минут. Канал собеседников умирал четыре раза, сторож поднимал его заново. В стенограмме семь окон по две минуты и больше, где нет ни одной реплики, всего 33 минуты из 65. Самое большое с 15:46 до 16:01. Протокол получился на шесть разделов, с решениями и поручениями, и ни слова о том, что половины встречи в нём нет. Дальше я зову этот протокол минутками, как он называется в коде.

Что случилось

Системный звук на Маке идёт через ScreenCaptureKit. Поток перестаёт отдавать кадры, сторож через полминуты перезапускает его, к шестидесятой секунде перезапуск виснет, вторая попытка, в логе device unplugged. Потом канал возвращается сам, и через десять минут всё повторяется. Крики демона в 15:18, 15:27, 15:35, 15:45, и каждый стоит рядом с дырой в стенограмме.

Строка статуса в окне про это сказала. Уведомление тоже. Оба живут, пока идёт встреча.

А дальше живут документы. Минутки: темы, решения, поручения, открытые вопросы, риски, снятое ревизией. Разбор встречи, который делает локальная модель. Облачная ревизия, которая читает стенограмму целиком. Никто из троих не написал, что в стенограмме дыры на полчаса.

Модель здесь не ошиблась. Правило минуток: бери только то, что прозвучало. Ничего не прозвучало, нечего брать, протокол короткий и чистый. Тишина пропавшего канала для модели неотличима от тишины людей, которые слушали и не возражали.

Замер

За пять дней, с 14 по 18 сентября, 36 стартов записи. У 12 потери системного звука. Строк потери на одну запись от 2 до 42: канал умирает, сторож поднимает, канал умирает снова, до 21 цикла за встречу. Строк возврата в логах ноль, потому что возврат никто не логировал.

Часть потерь это конец звонка при не остановленной записи: окно созвона закрылось, поток закрылся с ним, а запись ещё идёт. Но 15 сентября две встречи подряд, в 14:01 и в 15:07, теряли канал посреди разговора: пять и четыре двойных крика, 10 и 33 минуты дыр. Я открыл все двенадцать протоколов. Ни в одном ни слова.

След в документах

Первый слой, след в документах, появился 18 сентября, через три дня после той встречи. У хаба, общего узла звука между захватом и всеми потребителями, одна точка, где переход состояния канала становится событием: пропал, вернулся, пробел после тихого перезапуска, не вернулся до конца. Границей события считается последний кадр канала. Крик демона опаздывает на порог сторожа и попытки перезапуска, от 66 до 96 секунд, и по нему границу не ставят. Причина в событии машинная, из фиксированного списка.

Событие ложится в сайдкар встречи, служебный JSON рядом со стенограммой, отдельным ключом, слиянием, каждое сразу. Строкой в хвост стенограммы, туда же, где живут тезисы модели по ходу встречи. Строкой в нить встречи, ленту на экране. Потолок — шесть эпизодов на канал, дальше в документы идёт только итог при остановке. Для той встречи он выглядел бы так:

📋 запись неполная: без собеседников 15:18–15:20, 15:27–15:31, 15:35–15:37, 15:46–16:01 (эпизодов 4, всего 23 мин)

Этого хватило, чтобы мне на следующий день отличить дыру от паузы в разговоре. Моделям этого не хватило. Итог писал демон на стопе. Демон убит сторожом, строки нет, события в сайдкаре все. И даже когда строка есть, в промпт минуток она не попадала.

Куда девалась строка

У минуток четыре писателя. Черновик по ходу встречи каждые 150 секунд. Кнопка Протокол. Пересборка после стопа по финальной стенограмме. И инструмент для внешнего агента. Разбор встречи и ретро-обход старых встреч стенограмму тоже читают, но минутки не пишут.

Каждый готовил вход модели по-своему. Длинную стенограмму сворачивают в сводки частей, потому что 8192 токена контекста — это около 20 тысяч знаков, а часовая встреча больше. Черновик при стенограмме длиннее 18 тысяч знаков берёт первые 3 тысячи и последние 14. Разбор берёт голову и хвост. Инструмент читал файл целиком.

Строка о записи лежала в хвосте файла. Три писателя хвост отрезали как заметки модели. Четвёртый отдавал его модели как речь, и след канала читался как чья-то реплика. Внутри стенограммы строка либо уезжала в сводку части, либо отбрасывалась с серединой.

Речь и факт о записи

Два внешних ревьюера читали постановку до первой строки кода, и оба сошлись на одном: файла как входа не существует. Есть то, что владелец отдал как речь, и то, что он же пометил как факт о записи. Это два разных входа.

Теперь у производной, любого документа, собранного из стенограммы, один источник. Речь: без заголовка и без хвоста. Её режут свёртки и окна, по ней сверяют цитаты. Оговорка о записи: та же строка итога, собранная из событий сайдкара. Она идёт в промпт отдельным блоком, снаружи тега стенограммы и после всех обрезок, по-русски, по-английски и по-китайски, с одним правилом: это факт о записи, не речь участников, не цитируй как сказанное, молчание пропавшего канала не толкуй как согласие или отсутствие возражений.

В документ строка попадает без участия модели. Проверить, что модель отметила пропуск в рисках и не исказила минуты, нечем. Строку дописывает код, в конец документа, один раз. Если модель пересказала оговорку своими словами с тем же значком 📋, каноническая строка всё равно встанет рядом.

Паспорт

У каждой производной с недавних пор паспорт в сайдкаре: хеш байтов последней машинной версии документа и хеш источника. По паспорту решается, звать ли модель заново или файл правили руками и его трогать нельзя.

Источник теперь хешируется вместе с оговоркой. Появилась оговорка, паспорт не сошёлся, минутки устарели один раз и пересобрались с ней. Платят за это только встречи, записанные после релиза, у которых канал пропадал: события старых встреч живут только в логе захвата, в сайдкар они не переносятся, и старые протоколы оговорку не получат. Цена одной пересборки минуток около 13 секунд на 10 тысяч знаков местной моделью, разбор пересобирается отдельно.

Альтернативу я отклонил: хешировать только речь, а строку дописывать без перегенерации. Оговорка меняет, чему в документе можно верить: решения из такого протокола описывают не всю встречу, и модель должна собирать его, зная об этом.

Пересборка восстанавливает след

Если демона добил сторож, итога в хвосте нет. Пересборка читает события из сайдкара, рендерит ту же строку тем же кодом и дописывает в хвост тем же кодом, который хвост пишет. Нет секции, создаст. Второй прогон дубля не даёт. Извлечение узлов графа, карты тем и людей прошлых встреч, получает содержание без строк следа. Факт о записи в граф не идёт: это не тема встречи.

Три круга, один дефект в первом

Правку читали два внешних ревьюера, DeepSeek и GLM, каждый на чистом клоне. Первый круг: у одного Critical, у другого два, и один общий.

Ретро-обход старых встреч читал сайдкар по посекундному штампу записи. После наката темы файл встречи переименовывается, сайдкар переезжает вместе с ним, и под старым именем его нет. Ретро видел пустоту и считал хеш без оговорки. Живой путь считал с ней. Один ключ паспорта, два значения, и названная встреча с потерями звука пересобиралась бы на каждом прогоне заново.

Тесты были зелёные, две тысячи сто десять штук. Во всех фикстурах этой правки встречи назывались штампом без темы, где старое и новое имя сайдкара совпадают. Воспроизведение заняло восемь строк: файл с темой, события в сайдкар, два вызова, разные хеши.

Второй круг после правок. DeepSeek нашёл, что минутки приклеиваются к промпту извлечения уже после фильтра, который должен был убрать строку итога, и она возвращается в граф темой встречи. Поправлено одним хелпером: минутки в оба промпта идут через него, без строк следа и с потолком. Третий круг без Critical: два Important про бюджет промпта разбора и слишком широкий классификатор строк следа, оба вошли в тот же PR. Итого 32 теста на механизм и 2132 в репозитории.

Отклонено

Хешировать JSON событий вместо строки, чтобы смена формулировки не старила паспорта: паспорт говорит, по какому тексту собран документ, и формулировку я менять не собираюсь. Отклонил и паспорт источника у минуток по кнопке Протокол: они собираются по живой стенограмме с безымянными метками, и пересборка обязана собрать их заново по финальной.

Что осталось. Строка статуса в окне до сих пор классифицируется по подстрокам, это следующая карточка. Признак неполной записи у узла встречи в графе, булев, не текст: думаю. Слепок голоса владельца остаётся в очереди.

Протокол встречи 15 сентября так и останется без строки: событий в её сайдкаре нет, лог захвата в сайдкар не переносится. Следующая встреча с умирающим каналом получит её первой.

Код и релизы: github.com/charoiteai/Charoite_audio, Apache 2.0. Девлог по-английски: charoiteai.github.io/Charoite_audio. Первая часть — про устройство и запись, вторая — про граф встреч как память, третья — про диаризацию и три ложных диагноза, четвёртая — про ревизию после кнопки Стоп, пятая — про облако и что уходит наружу.

View the original on Хабр

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.