Steven
Steven5 min čtení

Proč váš AI zapisovatel přestane nahrávat uprostřed meetingu

Naše vlastní aplikace ukončila dvě naše schůzky, zatímco druhá strana byla v půlce věty. Forenzní stopa vedla k dobře míněnému idle timeru, který neslyšel nikoho kromě vás — a k druhému bugu, který mohl zamknout celou vaši plochu. Obojí opraveno v GeekBye v2.0.9.

Spolehlivost
Meetingy
Engineering
Vydání GeekBye
Proč váš AI zapisovatel přestane nahrávat uprostřed meetingu

Dne 2. července ukončil GeekBye nahrávání meetingu sám od sebe. Řádek v databázi říká vše: ended_reason = 'idle', délka 519 sekund, 99 přepisových záznamů — ten poslední zapsaný dvě sekundy předtím, než aplikace usoudila, že tam nikdo není.

Druhý účastník byl uprostřed vysvětlování. Poslední řádek přepisu je doslova útržek věty: "...executes it or turns it on or so—".

Nebylo to poprvé. Večer předtím skončila stejným způsobem jiná session. Dva meetingy, zabité naší vlastní funkcí pro spolehlivost. Tady je diagnóza a oprava, která vyšla v GeekBye v2.0.9 — plus druhý, děsivější bug, který jsme opravili ve stejném vydání.

Dobře míněný timer, který slyšel jen vás

Idle auto-close existuje z dobrého důvodu. Lidé zapomínají nahrávání běžet přes noc; otevřený tab s meetingem donekonečna cedí audio. GeekBye proto hlídá nečinnost: po 60 sekundách bez hlasové aktivity zobrazí malou výzvu "Still recording?" (česky: „Ještě nahráváte?") a o 30 sekund později, bez odpovědi, session ukončí — vše uloží, zdvořile.

Chyba byla v jednom slově: hlasové. Hodiny aktivity počítaly pouze setrvalou energii mikrofonu. Bylo to záměrné designové rozhodnutí, a ne hloupé — počítat surovou energii systémového audia by nechalo ztlumený, ale hlučný tab udržovat mrtvou session naživu donekonečna, což je přesně to selhání, kterému má funkce bránit. Meetingy, kde hlavně posloucháte, měla pokrýt detekce okna s meetingem.

Jenže detekce meetingů nevidí každý meeting. Taby v prohlížeči, neobvyklí klienti, prezentace, kterou sledujete — nedetekováno. A v nedetekovaném meetingu, kde 90 sekund posloucháte — naprosto normální věc, když vám někdo vysvětluje svou Databricks pipeline — jste pro idle hodiny k nerozeznání od prázdné místnosti.

Podívejte se na časovou osu zabité session: poslední přepis z našeho mikrofonu přišel 68 sekund před koncem. Pak 60 sekund mluvení druhé osoby (přepsáno bezchybně, hodinami ignorováno), nepovšimnutá výzva, 30sekundové odpočítávání a zabití — 2 sekundy po jejích posledních slovech.

Oprava: přepis je důkaz života

Náprava je zpětně skoro trapná: příchozí přepis je nejsilnější možný důkaz, že session není nečinná. Nezáleží na tom, kdo mluvil. Řečový model právě rozpoznal slova — to je ten meeting.

v2.0.9 proto razítkuje hodiny aktivity při každém přepisu, který dorazí, z kterékoli strany. Surová energie systémového audia se pořád nepočítá — hudba, tóny čekání na lince ani hučení klimatizace mrtvou session pořád zvěčnit nedokážou a tvrdý limit délky nahrávání pořád všechno jistí. Session drží naživu jen rozpoznaná řeč, což je přesně ta správná hranice.

Jeden detail z code review, který stojí za předání dál: první verze opravy razítkovala hodiny uvnitř cesty přiřazování mluvčích — kterou podmnožina přepisů může legitimně přeskočit. Review zachytilo, že budoucí změna by mohla bug tiše znovu zavést přesně pro ty přepisy, na kterých záleží (přepisy druhého mluvčího). Razítko je teď bezpodmínečné, před jakýmkoli větvením, s testem, který selže, pokud ho kdokoli přesune.

Stejné vydání opravilo něco děsivějšího

Při testování těchto oprav jsme natvrdo narazili na jiný bug: pád procesu rozhraní nechal celou plochu neklikatelnou.

Overlay GeekBye je průhledné, vždy-navrchu okno pokrývající vaši obrazovku. Ve výchozím stavu propouští kliknutí skrz; rozhraní ho přepíná na interaktivní, když používáte nějaký panel. Ty přepínače přicházejí z procesu rozhraní — takže když ten proces spadl s otevřeným panelem, neviditelné okno zůstalo v interaktivním režimu bez živého UI za sebou. Každé kliknutí na plochu skončilo na mrtvé, neviditelné tabuli. Jediným únikem bylo vynucené ukončení aplikace.

Crash handler ve v2.0.9 teď okamžitě obnoví propouštění kliknutí a znovu načte rozhraní — s limitem tří reloadů za minutu, aby se crash-loop nemohl točit donekonečna (za limitem se aplikace reloadů vzdá, ale vaše plocha zůstane použitelná, což je ta část, na které záleží). Code review přiostřilo i tohle: obnova je omezená konkrétně na overlay okno, protože plošné nasazení propouštění kliknutí na spadlé normální okno — třeba dialog aktualizace — by vytvořilo přesně opačné zamknutí.

Tuhle opravu si můžete ověřit sami, brutálně: otevřete panel GeekBye, v Activity Monitoru natvrdo zabijte proces "GeekBye Helper (Renderer)" a sledujte, jak aplikace do sekundy obnoví vaši plochu.

Co nás tahle dvojice bugů naučila

  1. Každá aproximace otázky „je uživatel tady?" někde selže. Energie mikrofonu selhává u posluchačů. Detekce oken selhává u prohlížečů. Rozpoznané přepisy selhávají u... zatím jsme nic nenašli, protože nejsou aproximace — jsou samotný produkt.
  2. Cokoli řízené rendererem potřebuje příběh pro případ pádu. Pokud mrtvý UI proces může nechat za sebou stav na úrovni OS (zachytávání myši, vždy-navrchu, ochrana obsahu), reset musí vlastnit hlavní proces.
  3. Být svým vlastním nejtěžším uživatelem je strategie hledání bugů. Oba bugy nás zasáhly na skutečných meetinzích dřív, než si jich všimla víc než hrstka zákazníků. Sloupec ended_reason, který jsme kvůli observabilitě přidali před měsíci, udělal z diagnózy databázový dotaz místo hádání.

Obě opravy prošly od diagnózy k vydanému, notarizovanému release během jednoho dne, každá nesená zrevidovaným PR s regresními testy. Pokud jste na GeekBye v2, máte je od v2.0.9 přes auto-update.

Pro zbytek příběhu tohoto vydání viz sousední díl série proč AI přepis komolí technické termíny (v2.0.11), spolehlivostní základy v proč se váš AI notetaker zastaví na špatné Wi-Fi a jak overlay zůstává neviditelný při sdílení obrazovky, aniž by vám kradl kliknutí.