
Porady, ktoré sa dajú znova nájsť: vydanie s časovou osou
GeekBye v1.7.3 nahradil dropdown porád skutočnou časovou osou — ľudské dátumy, vyhľadávanie, breadcrumb, ktorý hovorí, v ktorej porade si. A pod povrchom: race condition auto-výberu, screenshot starší než jeho vlastná porada a päť opráv pre Windows za dvadsaťosem minút.
Do januára 2026 mali používatelia GeekBye problém s históriou. Aplikácia ich porady nahrávala a analyzovala bez problémov — a potom ich zakladala do dropdownu. Dropdown je fajn pre tri položky. Pri pätnástej porade sa „ten pohovor z minulého utorka" stával archeologickou expedíciou cez identicky vyzerajúce riadky. v1.7.3 — 64 commitov medzi polovicou decembra a 16. januárom — je vydanie, v ktorom sa porady stali niečím, čo sa dá znova nájsť.
(Jedna účtovnícka poznámka, pretože história gitu je poctivá aj vtedy, keď čísla verzií nie sú: tag vydania v1.7.2 neexistuje. Verzia sa zdvihla, ale ďalším expedovaným tagom bol v1.7.3, takže opravy pre Windows z éry v1.7.2 sa odviezli v tomto vydaní.)
Z dropdownu na časovú os
Hlavná zmena je jeden pull request: 12 súborov, +640 riadkov, väčšinou nový 381-riadkový komponent MeetingsTimeline. Dropdown sa stal rolovateľnou časovou osou kariet porád, zoskupených do štyroch košov — Today, Yesterday, This Week, Older (Dnes, Včera, Tento týždeň, Staršie) — s dátumami vykreslenými tak, ako by ich povedal človek: Today, 2:30 PM, Yesterday, 2:30 PM, Mon, 2:30 PM pre tento týždeň a Jan 5, 2:30 PM ďalej. Cmd/Ctrl+K nastaví fokus na vyhľadávacie pole filtrujúce podľa názvu. Detail porady sa stal skutočnou navigačnou stránkou, takže tlačidlá späť a dopredu v navbare konečne niečo znamenajú, a breadcrumb prestal ukazovať „Meetings / Meeting" a začal ukazovať „Meetings / Interview with John" (skrátené trojbodkou, pretože niekto vždy pomenuje poradu ako román).
Spolu s tým prišli dve drobné vylepšenia komfortu: tlačidlo mazania vnútri detailu porady (ktoré ťa po zmazaní vráti na časovú os, namiesto toho, aby ťa nechalo trčať na mŕtvej stránke), a auto-navigácia — keď sa počúvacie sedenie skončí so skutočným obsahom prepisu, dashboard sa otvorí priamo na detailnej stránke danej porady. Ukončíš hovor, vidíš poradu. Sedenia, ktoré skončia prázdne, sa potichu zmažú, namiesto toho, aby zapratávali časovú os.
Race condition, ktorý si vyrobíš zlepšením navigácie
A tu je časť, ktorú ti changelog nepovie. Starý zoznam porád mal zvyk: pri každom načítaní auto-vybral najnovšie sedenie. Neškodné, kým bol zoznam dropdownom, ktorého si sa zriedka dotýkal. Smrteľné v okamihu, keď sa porady stali stránkou, po ktorej naviguješ: klikneš na poradu #5, na pozadí dobehne refetch a zoznam ochotne vyberie najnovšiu poradu — čím prepíše voľbu, ktorú si urobil pred dvoma sekundami. Opravou nebol šikovnejší guard; bolo ňou úplné odstránenie auto-výberu. Každý zoznam, ktorý vyberá veci v mene používateľa, s ním skôr či neskôr začne bojovať.
Jeho odstránenie odhalilo druhý race condition. Auto-navigácia skáče do porady v okamihu, keď sa jej sedenie skončí — čo môže byť skôr, než to sedenie dokončí zápis do lokálnej databázy SQLite. Naviguj príliš rýchlo a dorazíš do porady, ktorá ešte neexistuje. Expedovaná oprava je 500-milisekundové oneskorenie pred načítaním sedení pri príchode do detailu a navigačný handler nesie vlastné poistky — počkať na did-finish-load okna plus 100ms, ak bol dashboard práve vytvorený, 50ms, ak už bol otvorený. Naše čítanie: navigácia po skončení sedenia pretína tri časové domény — zápis do databázy, načítanie okna a mount Reactu — a každá dostala vlastné malé oneskorenie. Funguje to a povieme na rovinu: kopa magických čísel je poctivý dlh, nie víťazstvo.
Screenshot starší než jeho vlastná porada
V tomto vydaní zomrel ešte jeden predpoklad: „screenshoty patria sedeniu vtedy a len vtedy, keď boli urobené počas neho." Dokonale logické. Nesprávne. Skutoční používatelia stlačia Cmd+H na pracovnom inzeráte, agende, kóde, o ktorom sa chystajú diskutovať — pred stlačením Start. Záložka Report párovala screenshoty s časovým rozsahom sedenia striktne, takže tieto prípravné screenshoty mizli z reportu, pre ktorý boli urobené. Oprava rozšírila párovacie okno o 60 sekúnd pred štartom sedenia. (Samotná mašinéria časových rozsahov je staršia — potichu vyšla vo v1.6.15; príspevkom v1.7.3 je naučiť ju, že porady sa začínajú o chlp skôr, než sa začnú.)
Päť opráv za dvadsaťosem minút
Vojnová historka tohto vydania vôbec nie je v časovej osi — je v onboardingovom overlayi na Windows a je to učebnicová reťaz „oprav opravu": päť commitov medzi 10:50 a 11:18 toho istého rána.
Hlavné okno GeekBye používa prepúšťanie myši — hook, ktorý pri každom pohybe myši prepína Electronové setIgnoreMouseEvents, aby kliky prepadávali cez priehľadné oblasti. Počas onboardingu na Windows tento hook bojoval s overlayom tutoriálu a na kroku, kde sa objaví okno dashboardu, aplikácia zamrzla. Oprava číslo jeden: nech hook nerobí nič, kým je onboarding aktívny. Mier cez odzbrojenie.
Ibaže teraz onboardingové tlačidlá nereagovali, pretože forwardovanie udalostí posielalo kliky oknu dashboardu pod overlayom. Opravy dva a tri sa hrabali vo forward: false pre každého sprievodcu zvlášť. Potom prišiel commit, ktorý našiel skutočnú prvotnú príčinu: keď sa otvorí okno dashboardu, jeho drag handler resetuje hlavné okno do click-through režimu — a prvá oprava spravila hook prepúšťania pasívnym, čo znamenalo, že nezostalo nič, čo by mohlo zasahovanie napraviť. Skutočná oprava obrátila stratégiu: hook teraz počas onboardingu aktívne znovu presadzuje setIgnoreMouseEvents(false) pri každom pohybe myši, presne preto, že externý kód ho môže kedykoľvek resetovať. Zmazala aj 75 riadkov skorších obchádzok robených pre každého sprievodcu zvlášť.
A aj tak prišiel piaty commit, pretože vyhrať vojnu o vstup neznamená vyhrať vojnu o z-order: overlay aj dashboard sedeli na rovnakej úrovni always-on-top a Windows zdvihne to okno, ktoré dostane fokus. Overlay sa presunul na vyššiu úroveň okna a po objavení dashboardu sa s oneskorením znova vynesie navrch. Ten oblúk stojí za zapamätanie: pasívna oprava, ktorá odzbrojí tvojho jediného obrancu, je horšia než pôvodný boj.
Tri veci, ktoré nás toto vydanie naučilo
- Vylepšenia navigácie vyplavia bugy stavu. Race condition auto-výberu existoval pred v1.7.3; dropdown ti ho len nikdy nedal pocítiť. V okamihu, keď sa porady stali stránkou, po ktorej vedome naviguješ, každý kus kódu, ktorý vyberal veci za teba, sa stal bugom.
- Časové hranice okolo zámeru používateľa potrebujú vôľu. Sedenia, nahrávky, reporty — používatelia konajú o chlp skôr a o chlp neskôr než oficiálne okno stroja. 60-sekundový buffer pre screenshoty je jeden riadok, ktorý odráža, ako sa ľudia naozaj správajú.
- Nikdy nesprav svoj nápravný kód pasívnym. Zamrznutie na Windows si vyžiadalo päť opráv, pretože oprava číslo jeden vypla jediný mechanizmus, ktorý mohol pôsobiť proti vonkajšiemu zasahovaniu. Ak nejaký iný kód môže tvoj invariant kedykoľvek porušiť, tvojou úlohou je presadzovať ho nepretržite, nie ustúpiť.
Pre predchádzajúcu kapitolu príbehu v1 — stavanie dvoch brandovaných aplikácií z tejto jednej kódovej základne — pozri jedna kódová základňa, dve aplikácie: ako spraviť white-label bez forku (v1.7.1); a pre celý oblúk, anatómiu dodávania softvéru do dokonalosti.