
Γιατί ο AI notetaker σου σταματά την ηχογράφηση στη μέση της σύσκεψης
Η ίδια μας η εφαρμογή τερμάτισε δύο από τις συσκέψεις μας ενώ η άλλη πλευρά ήταν στη μέση της πρότασης. Το ιχνηλατικό ίχνος οδήγησε σε ένα καλοπροαίρετο idle timer που δεν μπορούσε να ακούσει κανέναν εκτός από σένα — και σε ένα δεύτερο bug που μπορούσε να κλειδώσει ολόκληρο το desktop σου. Και τα δύο διορθωμένα στο GeekBye v2.0.9.
Στις 2 Ιουλίου, το GeekBye τερμάτισε μια ηχογράφηση σύσκεψης από μόνο του. Η γραμμή στη βάση δεδομένων τα λέει όλα: ended_reason = 'idle', διάρκεια 519 δευτερόλεπτα, 99 εγγραφές transcript — με την τελευταία γραμμένη δύο δευτερόλεπτα πριν η εφαρμογή αποφασίσει ότι δεν ήταν κανείς εκεί.
Ο άλλος συμμετέχων ήταν στη μέση μιας εξήγησης. Η τελευταία γραμμή του transcript είναι κυριολεκτικά ένα μισοτελειωμένο κομμάτι πρότασης: "...executes it or turns it on or so—".
Δεν ήταν η πρώτη φορά. Το προηγούμενο βράδυ, μια άλλη συνεδρία έληξε με τον ίδιο τρόπο. Δύο συσκέψεις, σκοτωμένες από το ίδιο μας το feature αξιοπιστίας. Ιδού η διάγνωση και το fix που κυκλοφόρησε στο GeekBye v2.0.9 — συν ένα δεύτερο, πιο τρομακτικό bug που διορθώσαμε στην ίδια έκδοση.
Ένας καλοπροαίρετος χρονομετρητής που μπορούσε να ακούσει μόνο εσένα
Το idle auto-close υπάρχει για καλό λόγο. Ο κόσμος ξεχνάει ηχογραφήσεις να τρέχουν όλη νύχτα· ένα ξεχασμένο ανοιχτό tab σύσκεψης συνεχίζει να στάζει ήχο για πάντα. Έτσι το GeekBye παρακολουθεί για αδράνεια: μετά από 60 δευτερόλεπτα χωρίς φωνητική δραστηριότητα εμφανίζει ένα μικρό prompt "Still recording?" («Ηχογραφείς ακόμα;»), και 30 δευτερόλεπτα αργότερα, αν μείνει αναπάντητο, τερματίζει τη συνεδρία — αποθηκεύοντας τα πάντα, ευγενικά.
Το ελάττωμα βρισκόταν σε μία λέξη: φωνητική. Το ρολόι δραστηριότητας μετρούσε μόνο τη διαρκή ενέργεια του μικροφώνου. Αυτή ήταν συνειδητή σχεδιαστική απόφαση, και όχι χαζή — αν μετρούσε την ακατέργαστη ενέργεια του system audio, ένα σε σίγαση αλλά θορυβώδες tab θα κρατούσε μια νεκρή συνεδρία ζωντανή επ' αόριστον, που είναι ακριβώς η αστοχία που το feature υπάρχει για να αποτρέψει. Οι συσκέψεις όπου κυρίως ακούς υποτίθεται ότι καλύπτονταν από την ανίχνευση παραθύρου σύσκεψης.
Μόνο που η ανίχνευση συσκέψεων δεν μπορεί να δει κάθε σύσκεψη. Tabs του browser, ασυνήθιστοι clients, μια παρουσίαση που παρακολουθείς — όλα μη ανιχνεύσιμα. Και σε μια μη ανιχνευμένη σύσκεψη όπου ακούς για 90 δευτερόλεπτα — κάτι εντελώς φυσιολογικό όσο κάποιος εξηγεί το Databricks pipeline του — είσαι, για το ρολόι αδράνειας, δυσδιάκριτος από ένα άδειο δωμάτιο.
Δες το χρονολόγιο της σκοτωμένης συνεδρίας: το τελευταίο transcript από το δικό μας μικρόφωνο ήρθε 68 δευτερόλεπτα πριν από το τέλος. Μετά, 60 δευτερόλεπτα με τον άλλο άνθρωπο να μιλάει (μεταγραμμένα άψογα, αγνοημένα από το ρολόι), το prompt που πέρασε απαρατήρητο, η αντίστροφη μέτρηση των 30 δευτερολέπτων, και ο τερματισμός — 2 δευτερόλεπτα μετά τις τελευταίες του λέξεις.
Το fix: ένα transcript είναι απόδειξη ζωής
Η διόρθωση είναι σχεδόν ντροπιαστική εκ των υστέρων: ένα εισερχόμενο transcript είναι η ισχυρότερη δυνατή απόδειξη ότι η συνεδρία δεν είναι αδρανής. Δεν έχει σημασία ποιος μίλησε. Το μοντέλο ομιλίας μόλις αναγνώρισε λέξεις — αυτό είναι η σύσκεψη.
Έτσι το v2.0.9 σφραγίζει το ρολόι δραστηριότητας σε κάθε transcript που φτάνει, από οποιαδήποτε πλευρά. Η ακατέργαστη ενέργεια του system audio εξακολουθεί να μη μετράει — η μουσική, οι τόνοι αναμονής και το βουητό του κλιματισμού εξακολουθούν να μην μπορούν να απαθανατίσουν μια νεκρή συνεδρία, και το σκληρό όριο ηχογράφησης εξακολουθεί να λειτουργεί ως δίχτυ ασφαλείας για όλα. Μόνο η αναγνωρισμένη ομιλία κρατά μια συνεδρία ζωντανή, που είναι ακριβώς το σωστό όριο.
Μια λεπτομέρεια από το code review που αξίζει να μεταφερθεί: η πρώτη εκδοχή του fix σφράγιζε το ρολόι μέσα στη διαδρομή απόδοσης ομιλητή — την οποία ένα υποσύνολο των transcripts μπορεί νομίμως να παρακάμψει. Το review έπιασε ότι μια μελλοντική αλλαγή θα μπορούσε να επαναφέρει σιωπηλά το bug ακριβώς για τα transcripts που μετράνε (του άλλου ομιλητή). Η σφραγίδα μπαίνει πλέον άνευ όρων, πριν από κάθε διακλάδωση, με ένα test που αποτυγχάνει αν κάποιος τη μετακινήσει.
Η ίδια έκδοση διόρθωσε κάτι πιο τρομακτικό
Δοκιμάζοντας αυτά τα fixes, πέσαμε πάνω σε ένα διαφορετικό bug με τον δύσκολο τρόπο: ένα crash στη διεργασία του interface άφησε ολόκληρο το desktop ανίκανο να δεχτεί κλικ.
Το overlay του GeekBye είναι ένα διαφανές, always-on-top παράθυρο που καλύπτει την οθόνη σου. Είναι click-through από προεπιλογή· το interface το κάνει διαδραστικό όταν χρησιμοποιείς κάποιο panel. Αυτές οι εναλλαγές έρχονται από τη διεργασία του interface — οπότε όταν εκείνη η διεργασία κράσαρε ενώ ένα panel ήταν ανοιχτό, το αόρατο παράθυρο έμεινε σε διαδραστική λειτουργία χωρίς ζωντανό UI από πίσω. Κάθε κλικ στο desktop σου προσγειωνόταν σε ένα νεκρό, αόρατο τζάμι. Η μόνη διαφυγή ήταν το force-quit της εφαρμογής.
Ο crash handler του v2.0.9 αποκαθιστά πλέον το click-through αμέσως και ξαναφορτώνει το interface — με όριο τριών επαναφορτώσεων ανά λεπτό, ώστε ένα crash-loop να μην μπορεί να γυρίζει για πάντα (πέρα από το όριο, η εφαρμογή παρατάει τις επαναφορτώσεις, αλλά το desktop σου μένει λειτουργικό, που είναι το κομμάτι που μετράει). Το code review όξυνε κι αυτό το fix: η ανάκτηση περιορίζεται συγκεκριμένα στο παράθυρο του overlay, γιατί το να εφαρμόσεις αδιακρίτως click-through σε ένα κρασαρισμένο κανονικό παράθυρο — ας πούμε, τον διάλογο ενημέρωσης — θα δημιουργούσε το αντίστροφο κλείδωμα.
Μπορείς να επαληθεύσεις αυτό το fix μόνος σου, με ωμό τρόπο: άνοιξε ένα panel του GeekBye, σκότωσε βίαια τη διεργασία "GeekBye Helper (Renderer)" στο Activity Monitor, και δες την εφαρμογή να ανακτά το desktop σου μέσα σε ένα δευτερόλεπτο.
Τι μας έμαθε αυτό το ζευγάρι bugs
- Κάθε proxy για το «είναι ο χρήστης εδώ;» αποτυγχάνει κάπου. Η ενέργεια του μικροφώνου αποτυγχάνει για όσους ακούν. Η ανίχνευση παραθύρου αποτυγχάνει για browsers. Τα αναγνωρισμένα transcripts αποτυγχάνουν για... τίποτα που να έχουμε βρει ακόμα, γιατί δεν είναι proxy — είναι το ίδιο το προϊόν.
- Οτιδήποτε οδηγείται από τον renderer χρειάζεται μια ιστορία για το crash. Αν μια νεκρή διεργασία UI μπορεί να αφήσει πίσω της κατάσταση σε επίπεδο λειτουργικού (δέσμευση ποντικιού, always-on-top, προστασία περιεχομένου), η κύρια διεργασία πρέπει να έχει την ευθύνη του reset.
- Το να είσαι ο βαρύτερος χρήστης του εαυτού σου είναι στρατηγική εύρεσης bugs. Και τα δύο bugs μάς χτύπησαν σε πραγματικές συσκέψεις πριν τα προσέξουν περισσότεροι από μια χούφτα πελάτες. Η στήλη
ended_reasonπου είχαμε προσθέσει για observability μήνες νωρίτερα είναι αυτό που έκανε τη διάγνωση ένα database query αντί για μια εικασία.
Και τα δύο fixes πήγαν από τη διάγνωση σε δημοσιευμένη, notarized έκδοση μέσα σε μία μέρα, το καθένα μέσα από reviewed PR με regression tests. Αν είσαι στο GeekBye v2, τα έχεις από το v2.0.9 μέσω auto-update.
Για την υπόλοιπη ιστορία αυτής της έκδοσης, δες το γειτονικό άρθρο της σειράς γιατί η μεταγραφή με AI παρακούει τους τεχνικούς όρους (v2.0.11), τα θεμέλια αξιοπιστίας στο γιατί ο AI notetaker σου σταματά σε κακό Wi-Fi, και πώς το overlay μένει αόρατο κατά το screen sharing χωρίς να κλέβει τα κλικ σου.


