Steven
Steven5 min čítania

Prečo váš AI zapisovač prestane nahrávať uprostred stretnutia

Naša vlastná aplikácia ukončila dve naše stretnutia, kým bola druhá strana uprostred vety. Forenzná stopa viedla k dobre mienenému časovaču nečinnosti, ktorý nepočul nikoho okrem vás — a k druhému bugu, ktorý dokázal zamknúť celú vašu plochu. Oboje opravené v GeekBye v2.0.9.

Spoľahlivosť
Stretnutia
Inžinierstvo
Vydania GeekBye
Prečo váš AI zapisovač prestane nahrávať uprostred stretnutia

Druhého júla GeekBye sám ukončil nahrávanie stretnutia. Riadok v databáze hovorí všetko: ended_reason = 'idle', trvanie 519 sekúnd, 99 záznamov prepisu — posledný zapísaný dve sekundy predtým, než sa aplikácia rozhodla, že tu nikto nie je.

Druhý účastník bol uprostred vysvetľovania. Posledný riadok prepisu je doslova útržok vety: "...executes it or turns it on or so—".

Nebolo to prvýkrát. Večer predtým sa rovnako skončila iná relácia. Dve stretnutia, zabité našou vlastnou funkciou spoľahlivosti. Tu je diagnóza a oprava, ktorá vyšla v GeekBye v2.0.9 — plus druhý, desivejší bug, ktorý sme opravili v tom istom vydaní.

Dobre mienený časovač, ktorý počul iba vás

Automatické zatváranie nečinných relácií existuje z dobrého dôvodu. Ľudia zabúdajú nahrávanie zapnuté cez noc; otvorená karta so stretnutím dokáže donekonečna púšťať zvuk. GeekBye preto stráži nečinnosť: po 60 sekundách bez hlasovej aktivity zobrazí malú výzvu "Still recording?" (stále nahrávame?) a o 30 sekúnd neskôr, bez odpovede, reláciu ukončí — všetko slušne uloží.

Chyba bola v jednom slove: hlasovej. Hodiny aktivity počítali iba trvalú energiu z mikrofónu. Bolo to zámerné dizajnové rozhodnutie a nie hlúpe — počítanie surovej energie systémového zvuku by stlmenej, ale hlučnej karte dovolilo držať mŕtvu reláciu nažive donekonečna, čo je presne to zlyhanie, ktorému má funkcia brániť. Stretnutia, kde väčšinou počúvate, mala pokrývať detekcia okien stretnutí.

Lenže detekcia stretnutí nevidí každé stretnutie. Karty prehliadača, nezvyčajní klienti, prezentácia, ktorú sledujete — nedetegované. A na nedetegovanom stretnutí, kde 90 sekúnd počúvate — úplne normálna vec, kým vám niekto vysvetľuje svoju Databricks pipeline — ste pre hodiny nečinnosti nerozoznateľní od prázdnej miestnosti.

Pozrite si časovú os zabitej relácie: posledný prepis z nášho mikrofónu prišiel 68 sekúnd pred koncom. Potom 60 sekúnd hovoril ten druhý (prepísané dokonale, hodinami ignorované), nepovšimnutá výzva, 30-sekundové odpočítavanie a zabitie — 2 sekundy po jeho posledných slovách.

Oprava: prepis je dôkaz života

Náprava je pri spätnom pohľade až trápna: prichádzajúci prepis je najsilnejší možný dôkaz, že relácia nie je nečinná. Nezáleží na tom, kto hovoril. Rečový model práve rozpoznal slová — to je to stretnutie.

v2.0.9 preto aktualizuje hodiny aktivity pri každom prepise, ktorý príde, z ktorejkoľvek strany. Surová energia systémového zvuku sa stále nepočíta — hudba, tóny čakania na linke ani hukot klimatizácie stále nedokážu zvečniť mŕtvu reláciu a tvrdý limit dĺžky nahrávania naďalej všetko istí. Reláciu drží nažive iba rozpoznaná reč, čo je presne tá správna hranica.

Jeden detail z code review, ktorý stojí za odovzdanie: prvá verzia opravy aktualizovala hodiny vnútri vetvy priraďovania hovoriaceho — ktorú časť prepisov môže legitímne preskočiť. Review zachytilo, že budúca zmena by mohla bug potichu vrátiť presne pre tie prepisy, na ktorých záleží (prepisy toho druhého). Aktualizácia je teraz bezpodmienečná, pred akýmkoľvek vetvením, s testom, ktorý zlyhá, ak ju niekto presunie.

To isté vydanie opravilo niečo desivejšie

Pri testovaní týchto opráv sme na iný bug narazili tou tvrdšou cestou: pád procesu rozhrania nechal celú plochu neklikateľnú.

Overlay GeekBye je priehľadné okno vždy navrchu, pokrývajúce obrazovku. Predvolene prepúšťa kliknutia; rozhranie ho prepína do interaktívneho režimu, keď používate panel. Tie prepnutia prichádzajú z procesu rozhrania — takže keď ten proces spadol s otvoreným panelom, neviditeľné okno zostalo v interaktívnom režime bez živého UI za sebou. Každé kliknutie na ploche pristálo na mŕtvej, neviditeľnej tabuli. Jediným únikom bolo vynútené ukončenie aplikácie.

Obslužný kód pádov vo v2.0.9 teraz okamžite obnoví prepúšťanie kliknutí a znovu načíta rozhranie — s limitom troch znovunačítaní za minútu, aby sa slučka pádov nemohla točiť donekonečna (za limitom to aplikácia so znovunačítavaním vzdá, ale plocha zostane použiteľná, čo je tá časť, na ktorej záleží). Code review vybrúsilo aj túto opravu: obnova je obmedzená konkrétne na okno overlaya, pretože plošné zapnutie prepúšťania kliknutí na spadnutom normálnom okne — povedzme dialógu aktualizácie — by vytvorilo opačné zamknutie.

Túto opravu si môžete overiť sami, brutálne: otvorte panel GeekBye, v Monitore aktivity násilne zabite proces "GeekBye Helper (Renderer)" a sledujte, ako aplikácia do sekundy obnoví vašu plochu.

Čo nás táto dvojica bugov naučila

  1. Každá náhrada za otázku "je používateľ tu?" niekde zlyhá. Energia mikrofónu zlyháva pri počúvajúcich. Detekcia okien zlyháva pri prehliadačoch. Rozpoznané prepisy zlyhávajú pri... ničom, čo sme zatiaľ našli, pretože nie sú náhradou — sú samotným produktom.
  2. Všetko riadené rendererom potrebuje scenár pre prípad pádu. Ak mŕtvy UI proces môže po sebe nechať stav na úrovni OS (zachytávanie myši, vždy navrchu, ochranu obsahu), reset musí vlastniť hlavný proces.
  3. Byť svojím vlastným najťažším používateľom je stratégia hľadania bugov. Oba bugy nás zasiahli na skutočných stretnutiach skôr, než si ich všimla viac než hŕstka zákazníkov. Stĺpec ended_reason, ktorý sme pre observabilitu pridali mesiace predtým, urobil z diagnózy databázový dotaz namiesto hádania.

Obe opravy prešli od diagnózy k vydanému, notarizovanému vydaniu do jedného dňa, každá v zrevidovanom PR s regresnými testami. Ak ste na GeekBye v2, máte ich od v2.0.9 cez automatickú aktualizáciu.

Zvyšok príbehu tohto vydania nájdete v susednom článku série prečo AI transkripcia komolí technické termíny (v2.0.11), v základoch spoľahlivosti v článku prečo sa váš AI zapisovač zastavuje na zlej Wi-Fi a v tom, ako overlay zostáva neviditeľný počas zdieľania obrazovky bez toho, aby vám kradol kliknutia.