Steven
Steven5 мин четене

Защо твоят AI notetaker спира записа по средата на срещата

Собственото ни приложение прекрати две от нашите срещи, докато отсрещната страна беше по средата на изречение. Криминалистичната следа отведе до добронамерен idle таймер, който не чуваше никого освен теб — и до втори бъг, който можеше да заключи целия ти десктоп. И двата поправени в GeekBye v2.0.9.

Надеждност
Срещи
Инженерство
GeekBye издания
Защо твоят AI notetaker спира записа по средата на срещата

На 2 юли GeekBye прекрати запис на среща сам. Редът в базата данни казва всичко: ended_reason = 'idle', продължителност 519 секунди, 99 транскрипт записа — последният записан две секунди преди приложението да реши, че там няма никого.

Другият участник беше по средата на обяснение. Последният ред на транскрипта е буквално фрагмент от изречение: "...executes it or turns it on or so—".

Не беше първият път. Вечерта преди това друга сесия приключи по същия начин. Две срещи, убити от собствената ни функция за надеждност. Ето диагнозата и фиксът, който излезе в GeekBye v2.0.9 — плюс втори, по-страшен бъг, който поправихме в същото издание.

Добронамерен таймер, който можеше да чува само теб

Idle авто-затварянето съществува с основателна причина. Хората забравят записи да вървят цяла нощ; оставен отворен таб със среща продължава да капе аудио вечно. Затова GeekBye следи за неактивност: след 60 секунди без гласова активност показва малък prompt "Still recording?" („Още ли записваш?"), а 30 секунди по-късно, останал без отговор, прекратява сесията — запазвайки всичко, учтиво.

Недостатъкът беше в една дума: гласова. Часовникът за активност броеше само устойчива енергия от микрофона. Това беше съзнателно дизайнерско решение, и то не глупаво — броенето на сурова енергия от системното аудио би позволило на заглушен, но шумен таб да поддържа мъртва сесия жива до безкрай, а точно този провал функцията съществува да предотврати. Срещите, в които предимно слушаш, трябваше да бъдат покрити от детекцията на прозорци на срещи.

Само че детекцията на срещи не може да види всяка среща. Браузър табове, необичайни клиенти, презентация, която гледаш — недетектирани. И в недетектирана среща, в която слушаш 90 секунди — напълно нормално нещо, докато някой обяснява своя Databricks pipeline — за idle часовника ти си неразличим от празна стая.

Виж времевата линия на убитата сесия: последният транскрипт от нашия микрофон дойде 68 секунди преди края. После 60 секунди говорене на другия човек (транскрибирано перфектно, игнорирано от часовника), незабелязаният prompt, 30-секундното отброяване и убийството — 2 секунди след последните му думи.

Фиксът: транскриптът е доказателство за живот

Корекцията е почти неудобна със задна дата: входящ транскрипт е най-силното възможно доказателство, че сесията не е неактивна. Няма значение кой е говорил. Речевият модел току-що е разпознал думи — това е срещата.

Затова v2.0.9 подпечатва часовника за активност при всеки транскрипт, който пристига, от която и да е страна. Суровата енергия от системното аудио все така не се брои — музика, тонове на изчакване и бръмченето на климатика все така не могат да обезсмъртят мъртва сесия, а твърдият лимит на записа все така подсигурява всичко. Само разпозната реч поддържа сесията жива, което е точно правилната граница.

Един детайл от code review, който си струва да предам: първата версия на фикса подпечатваше часовника вътре в пътя за приписване на говорител — който подмножество от транскриптите може легитимно да пропусне. Ревюто хвана, че бъдеща промяна би могла тихо да върне бъга точно за транскриптите, които имат значение (тези на другия говорещ). Печатът вече е безусловен, преди всякакво разклонение, с тест, който се проваля, ако някой го премести.

Същото издание поправи нещо по-страшно

Докато тествахме тези фиксове, ударихме друг бъг по трудния начин: crash в интерфейсния процес остави целия десктоп некликаем.

Overlay-ят на GeekBye е прозрачен, always-on-top прозорец, покриващ екрана ти. По подразбиране е click-through; интерфейсът го превключва на интерактивен, когато използваш панел. Тези превключвания идват от интерфейсния процес — така че когато този процес crash-на при отворен панел, невидимият прозорец остана в интерактивен режим без жив UI зад него. Всеки клик по десктопа ти попадаше върху мъртво, невидимо стъкло. Единственият изход беше насилствено затваряне на приложението.

Crash handler-ът на v2.0.9 вече възстановява click-through незабавно и презарежда интерфейса — с лимит от три презареждания в минута, за да не може crash-loop да се върти вечно (след лимита приложението се отказва от презареждането, но десктопът ти остава използваем, а точно това е частта, която има значение). Code review изостри и този фикс: възстановяването е ограничено конкретно до overlay прозореца, защото сляпото прилагане на click-through върху crash-нал нормален прозорец — да речем, диалога за обновяване — би създало обратното заключване.

Можеш да провериш този фикс сам, брутално: отвори GeekBye панел, насилствено убий процеса "GeekBye Helper (Renderer)" в Activity Monitor и гледай как приложението възстановява десктопа ти в рамките на секунда.

Какво ни научи тази двойка бъгове

  1. Всяко приближение на „тук ли е потребителят?" се проваля някъде. Микрофонната енергия се проваля при слушащите. Детекцията на прозорци се проваля при браузърите. Разпознатите транскрипти се провалят при... нищо, което сме открили досега, защото те не са приближение — те са самият продукт.
  2. Всичко, задвижвано от renderer-а, има нужда от crash история. Ако мъртъв UI процес може да остави след себе си състояние на ниво операционна система (mouse capture, always-on-top, content protection), main процесът трябва да притежава ресета.
  3. Да си собственият си най-тежък потребител е стратегия за откриване на бъгове. И двата бъга ни удариха в реални срещи, преди повече от шепа клиенти да забележат. Колоната ended_reason, която бяхме добавили за наблюдаемост месеци по-рано, е това, което превърна диагнозата в заявка към базата данни вместо в догадка.

И двата фикса минаха от диагноза до пуснато, нотаризирано издание в рамките на ден, всеки носен от ревюирано PR с регресионни тестове. Ако си на GeekBye v2, ги имаш от v2.0.9 насам чрез auto-update.

За останалата част от историята на това издание виж съседа от поредицата защо AI транскрипцията греши техническите термини (v2.0.11), основите на надеждността в защо твоят AI notetaker спира при лош Wi-Fi и как overlay-ят остава невидим по време на споделяне на екран, без да краде кликовете ти.

Свързани статии

Защо AI транскрипцията греши техническите термини (и как го поправихме)
Steven
Steven6 мин четене

Защо AI транскрипцията греши техническите термини (и как го поправихме)

Сесия на живо чу "what is the pointer in C++" като "what is the point in life". Ето криминалистичната следа от този транскрипт до GeekBye v2.0.11 — keyterm biasing, състезание по време, което прекъсваше връзката, и денят, в който собственият ни фикс даде обратен ефект.

Транскрипция
Надеждност
Инженерство
От срещи към агенти: превърнете разговорите в работа, която вашият AI може да изпълни
Chris
Chris6 мин четене

От срещи към агенти: превърнете разговорите в работа, която вашият AI може да изпълни

Тясното място не е моделът — а вкарването на реален контекст в агентите ви. Ето практическия начин да станете по-добри с агентните инструменти и как да подадете решеното на дадена среща право в Claude Code, Codex или който и да е агент.

AI агенти
Агентни процеси
Бележки от срещи
Claude Code срещу Codex: истинското умение е агентна грамотност
Chris
Chris9 мин четене

Claude Code срещу Codex: истинското умение е агентна грамотност

Всички питат кой е по-добрият. Това е грешният въпрос. Ето в какво ви прави по-добри всеки инструмент — и умението за 2026, което наистина има значение: да направлявате, да възлагате и да проверявате агенти.

AI агенти за код
Claude Code
Codex