Steven
Steven1 分で読める

ミーティングをちゃんとまた見つけられるように: タイムラインリリース

GeekBye v1.7.3はミーティングのドロップダウンを本物のタイムラインに置き換えました — 人間らしい日付、検索、いま自分がどのミーティングにいるのかを教えてくれるパンくず。その下に潜んでいたのは: 自動選択のレースコンディション、自分のミーティングより先に生まれたスクリーンショット、そして28分間で五つのWindows修正です。

エンジニアリング
UX
デスクトップ
GeekByeリリース
ミーティングをちゃんとまた見つけられるように: タイムラインリリース

2026年1月の時点で、GeekByeのユーザーには履歴の問題がありました。アプリはミーティングを問題なく録音・分析していました — そしてそれをドロップダウンに放り込んでいたのです。項目が三つならドロップダウンで十分です。しかし15件目のミーティングともなると、「先週火曜のあの面接」を探すのは、見分けのつかない行の山を掘り進む発掘調査になっていました。v1.7.3 — 12月中旬から1月16日までの64コミット — は、ミーティングが「ちゃんとまた見つけられるもの」になったリリースです。

(帳簿上の注記をひとつ。バージョン番号が正直でないときでも、gitの履歴は正直だからです: v1.7.2のリリースタグは存在しません。バージョン自体は上げられたものの、次に出荷されたタグはv1.7.3だったため、v1.7.2時代のWindows修正はこのリリースに相乗りしています。)

ドロップダウンからタイムラインへ

目玉の変更はひとつのプルリクエストです: 12ファイル、+640行、その大半が新しい381行のMeetingsTimelineコンポーネントです。ドロップダウンは、ミーティングカードが並ぶスクロール可能なタイムラインになりました。カードは四つのバケット — Today、Yesterday、This Week、Older(今日、昨日、今週、それ以前) — にグループ化され、日付は人間が口にするとおりに表示されます: Today, 2:30 PMYesterday, 2:30 PM、今週ならMon, 2:30 PM、それより前はJan 5, 2:30 PM。Cmd/Ctrl+Kで検索ボックスにフォーカスが移り、タイトルで絞り込めます。ミーティング詳細ビューは本物のナビゲーションページになったので、ナビバーの戻る/進むボタンがようやく意味を持ち、パンくずは「Meetings / Meeting」ではなく「Meetings / Interview with John」と表示するようになりました(省略記号で切り詰めます。小説のようなタイトルを付ける人は必ずいるからです)。

小さな使い勝手の改善も二つ、一緒に出荷されました: ミーティングビュー内の削除ボタン(削除後は行き止まりのページに置き去りにせず、タイムラインへ戻してくれます)、そして自動ナビゲーション — リスニングセッションが実際のトランスクリプトを残して終了すると、ダッシュボードがそのミーティングの詳細ページを直接開きます。通話を終えれば、ミーティングが見える。空のまま終わったセッションは、タイムラインを散らかす代わりに静かに削除されます。

ナビゲーションを改善することで自ら生み出す競合

ここからが、変更履歴には書かれていない部分です。旧ミーティングリストにはある癖がありました: ロードのたびに、最新のセッションを自動選択するのです。リストがめったに触らないドロップダウンだった頃は無害でした。ミーティングがナビゲートするページになった瞬間、致命傷になります: ミーティング#5をクリックすると、バックグラウンドの再取得が完了し、リストが親切にも最新のミーティングを選択します — あなたが2秒前に行った選択を上書きして。修正は、より賢いガードではありませんでした。自動選択を丸ごと削除することでした。ユーザーの代わりに何かを選択するリストは、いずれユーザーと戦うことになります。

これを取り除くと、第二の競合が露出しました。自動ナビゲーションは、セッションが終わった_その瞬間に_ミーティングへ飛びます — それは、そのセッションがローカルのSQLiteデータベースへの書き込みを終える前かもしれません。速く遷移しすぎると、まだ存在しないミーティングに到着してしまいます。出荷された修正は、詳細ビューに到着したときにセッションを読み込む前の500ミリ秒のディレイで、ナビゲーションハンドラ自身も自前の保険を抱えています — ダッシュボードが作られた直後ならウィンドウのdid-finish-loadを待ってさらに100ms、すでに開いていたなら50ms。私たちの読みはこうです: セッション終了時のナビゲーションは三つのタイミング領域 — データベース書き込み、ウィンドウのロード、Reactのマウント — をまたいでおり、それぞれが自分用の小さなディレイをもらった、と。動いてはいます。そして、マジックナンバーの積み重ねは勝利ではなく、正直に認めるべき負債だと、はっきり言っておきます。

自分のミーティングより先に生まれたスクリーンショット

このリリースでは、もうひとつの前提も死にました: 「スクリーンショットは、セッション中に撮られた場合に、かつその場合に限り、そのセッションに属する」。完璧に論理的。そして間違い。実際のユーザーは、求人票に、アジェンダに、これから話すコードに対してCmd+Hを押します — Start(開始)を押す前に。Reportタブはスクリーンショットをセッションの時間範囲に厳密に照合していたので、そうした準備段階のスクリーンショットは、まさにそのために撮られたはずのレポートから消えていました。修正は、照合ウィンドウをセッション開始の60秒前まで広げることでした。(時間範囲の仕組み自体はもっと古く、v1.6.15で静かに出荷されています。v1.7.3の貢献は、ミーティングは始まる少し前に始まるのだと、その仕組みに教えたことです。)

28分間で五つの修正

このリリースの武勇伝はタイムラインの中にはまったくありません — Windowsのオンボーディングオーバーレイの中にあり、それは教科書どおりの「修正を修正する」連鎖です: 同じ朝の10:50–11:18の間に五つのコミット。

GeekByeのメインウィンドウはマウスのパススルーを使っています — マウスが動くたびにElectronのsetIgnoreMouseEventsを切り替え、透明な領域ではクリックが下へ抜けるようにするフックです。Windowsのオンボーディング中、このフックはチュートリアルのオーバーレイと衝突し、ダッシュボードウィンドウが現れるステップでアプリがフリーズしました。修正その一: オンボーディング中はフックに何もさせない。武装解除による平和、というわけです。

ところが今度は、オンボーディングのボタンが反応しなくなりました。イベント転送が、クリックをオーバーレイの_下にある_ダッシュボードウィンドウへ送り届けていたからです。修正その二とその三は、ウィザードごとにforward: falseをいじり回しました。そして、本当の根本原因を見つけたコミットが来ます: ダッシュボードウィンドウが開くとき、_その_ドラッグハンドラがメインウィンドウをクリック透過モードにリセットする — そして最初の修正がパススルーのフックを受け身にしていたため、その干渉を正せるものが何も残っていなかったのです。本物の修正は戦略を反転させました: フックはオンボーディング中、マウスが動くたびにsetIgnoreMouseEvents(false)を能動的に主張し直します。外部のコードがいつでもそれをリセットしうるからこそ、です。あわせて、先に入れたウィザードごとのワークアラウンド75行も削除されました。

それでも五つ目のコミットが必要でした。入力の戦争に勝つことは、zオーダーの戦争に勝つことではないからです: オーバーレイとダッシュボードは同じ常時最前面レベルに座っており、Windowsはフォーカスを得た方のウィンドウを持ち上げます。オーバーレイはより高いウィンドウレベルへ移動し、ダッシュボードが現れた後にディレイをはさんで自分を持ち上げ直すようになりました。この一連の流れは覚えておく価値があります: 唯一の守り手を武装解除する受け身の修正は、元の戦いよりもたちが悪いのです。

このリリースが教えてくれた三つのこと

  1. ナビゲーションの強化は状態のバグをあぶり出す。 自動選択の競合はv1.7.3以前から存在していました。ドロップダウンでは、それを体感する機会がなかっただけです。ミーティングが意図を持ってナビゲートするページになった瞬間、あなたの_代わりに_何かを選択するコードはすべてバグになりました。
  2. ユーザーの意図を囲む時間境界には遊びが要る。 セッション、録音、レポート — ユーザーは機械の公式なウィンドウより少し前、そして少し後に行動します。スクリーンショットの60秒バッファは、人が実際にどう振る舞うかを反映した一行です。
  3. 是正のためのコードを受け身にしてはいけない。 Windowsのフリーズに五つの修正が要ったのは、修正その一が、外部からの干渉に対抗できる唯一の仕組みをオフにしてしまったからです。他のコードがあなたの不変条件をいつでも壊せるのなら、あなたの仕事はそれを継続的に主張し直すことであって、退くことではありません。

v1の物語の前の章 — この一つのコードベースから二つのブランド付きアプリを作る話 — については、一つのコードベース、二つのアプリ: フォークせずにホワイトラベル化する方法(v1.7.1)を; そして弧の全体については、ソフトウェアを完璧に出荷することの解剖学をご覧ください。

関連記事

26時間で4リリース: 言語設定の配管と「ブリッジリリース」
Steven
Steven1 分で読める

26時間で4リリース: 言語設定の配管と「ブリッジリリース」

GeekBye v1.7.6からv1.8.1まで: ラップトップから一度も出たことのなかった言語設定、本当のキーバインドを表示するCmd+/オーバーレイ、コード変更ゼロのバージョン — そして自動アップデートフィード移行の鶏と卵問題。

エンジニアリング
リリース
デスクトップ
ログインページこそがデモである
Steven
Steven1 分で読める

ログインページこそがデモである

GeekBye v1.7.5はログインページにプロダクトのスクリーンショットを追加し、同じ日に削除しました — 代わりに本物のコンポーネントとして作り直したのです。さらに: OCRより速かったユーザーの話と、一日に25件のstyleコミットが実際に何を意味するのか。

エンジニアリング
デザイン
UX
接続が切れただけでアプリ全体が落ちてはいけない — でも私たちのは落ちた
Steven
Steven1 分で読める

接続が切れただけでアプリ全体が落ちてはいけない — でも私たちのは落ちた

バックエンドが会議の途中でオフラインになったとき、それは文字起こしを止めただけではありませんでした — アプリ全体をクラッシュさせたのです。原因はたった一つの処理されないイベント、修正は十行でした。これは、GeekByeがかつて自分を殺していた事態を通り抜けても、サインインを保ち、接続を保つようにしたリリース群の物語です。

エンジニアリング
信頼性
Electron