LINE アプリ開発に携わっている Hiraki と申します。普段は、LINE アプリにおけるアーキテクチャの統一を推進するプロジェクトのリードや、AI ネイティブな 開発スタイルを業務に組み込むための研究開発に取り組んでいます。
この記事では、AI エージェントの普及とともに増え続ける「作業状態の管理負荷」に着目し、その負荷を軽減するために GTD という手法を AI エージェントで自動化してみた、という検証の話を紹介します。
増え続ける作業状態の管理負荷
ここ最近、AI エージェントの利用機会が増え、開発のあり方そのものが変わりつつあります。
- 開発速度が上がって PR(Pull Request)の数が増え、レビューすべき対象も増える
- 複数の作業を同時に進める並行作業が当たり前になり、作業の中断と再開の回数も増える
この変化は、扱うタスクの数を増やすだけでなく、「進行中」「対応待ち」といった把握しておくべき仕事の状態を増やします。一言でいうと、作業状態を管理する負荷が増えているということです。
私自身、それをまさに実感しています。複数の PR について「どれが自分の番で、どれが相手の対応待ちなのか」を頭の中で覚えておいたり、レビューした内容が反映されたかを何度も確認しにいったり、中断のたびに「何をどこまでやっていたか」を思い出したりするのは、ひとつひとつは小さくても、積み重なると地味に大きな負担です。
では、この負荷が増えると何が問題なのでしょうか。
管理負荷が増えることの問題
作業状態を管理する負荷が増えると、認知的な負担も大きくなります。その結果、必要なことを思い出すのに時間がかかったり、本来やるべきことを忘れてしまったりします。先ほど挙げた私の負担も、根性や注意力で乗り切る話ではなく、この認知的な負担の表れだと捉えると、対策の方向性が見えてきます。
この「思い出すのに時間がかかる」「やるべきことを忘れる」という2種類の症状は、認知科学でいう別々の認知機能への負荷として捉えられます。ここで負荷がかかっているのは、主に次の2つの認知機能だと考えられます。
- ワーキングメモリー(短期記憶):頭の中で情報を一時的に保持しながら、それを使って考えたり作業したりする能力
- 負荷がかかると、やるべき作業を思い出すのに時間がかかったり、作業の精度が落ちたりしやすくなる
- 展望記憶:将来やるべきことを覚えておき、適切なタイミングで思い出して実行する能力
- 負荷がかかると、待ち状態のタスクの対応漏れが起きやすくなる
※用語の定義は、脳科学辞典「ワーキングメモリー」と『高次脳機能研究』39巻3号の総説「展望記憶のリハビリテーションとトピック」(PDF)を参考にしています。
したがって、この2つの負荷を軽減する仕組みがあればよさそうです。
認知負荷をどう軽減するか
この認知負荷を軽減する仕組みのひとつとして、私は GTD(Getting Things Done)に着目しました。
GTD とは
GTD は、ひとことで言うと個人単位でのタスク管理手法です。David Allen 氏の著書『Getting Things Done: The Art of Stress-Free Productivity』(2001年)で提唱されました。
やり方はシンプルで、タスクを時系列上の状態ごとのリストに分けます。本記事では、作業状態の管理という観点から特に関係の深い次の4つのリストを取り上げます。
- Inbox:これから振り分けるタスクを、ひとまず書き留めておく場所
- NextAction:いま着手すべきタスク(例:レビュー依頼が来た PR、MTG のアジェンダ準備)
- Waiting:自分の手を離れ、相手の対応を待っているタスク(例:レビュー済みの PR の修正反映待ち)
- Someday:いますぐ着手はしないが、いつかやりたいタスク
なお、GTD のリストには、ほかにも複数のタスクから構成される Projects や、日時指定の予定を置く Calendar など、さまざまなバリエーションがあります。
GTD によって、タスク一覧やその状態を、脳内の記憶から外部のリストに移すことができます。よって、先ほど挙げた2つの認知負荷の軽減に役立てることができます。
- ワーキングメモリーの負荷を軽減:いま何をやるべきかを、外部に記憶できる
- 展望記憶の負荷を軽減:相手待ちのタスクが可視化され、対応漏れを防ぎやすくなる
GTD の限界 ― 運用コストとのトレードオフ
ただ、GTD は万能ではありません。リストの運用には、それ自体に手間がかかります。
- リストは人間が手で管理しなければならない(例:PR レビューや研修受講といったタスクを自分で追加する)
- 待ち状態が解除されたかどうかを定期的に自分で確認しなければならない(例:PR レビューの指摘が反映されたか、メールやチャットの返信が来たか)
このリストの管理作業自体もまた、認知負荷になりえます。すなわち、GTD が軽減してくれる負荷と、GTD を運用するための管理負荷との間にトレードオフがあるわけです。
運用のための管理負荷が、GTD が軽減してくれる負荷に見合わない場合、GTD を運用する価値はありません。「GTD を試したけど続かなかった」という方がいるかもしれませんが、このトレードオフが原因のひとつではないでしょうか。
GTD の管理負荷をどう減らすか
では、その GTD の管理負荷をどう減らすかを考 えてみましょう。基本的な方針は、GTD のリスト管理をなるべく自動化することです。
私が GTD で管理しているタスクは、次の3つに大別できます。
- 繰り返しタスク:定例 MTG のアジェンダ準備など、定期的に繰り返す必要のあるタスク
- 依頼タスク:PR レビューや研修受講など、依頼をトリガーとするタスク
- 計画済みタスク:あらかじめ登録されている機能開発やバグ対応など
この3つは、自動化でどれだけ管理負荷を減らせるかが異なります。次章では、まず何を検証したいかを整理したうえで、どの分類に取り組むかを見極めます。
MVP による検証
検証したいことは2つです。
- 検証1:技術的に、ローカルの AI エージェントから Google ToDo リストを操作できるか
- 検証2:自動の GTD リスト管理に本当に価値があるか
これらを手早く検証するため、MVP(Minimum Viable Product:検証に必要な最小限の実装)を作成します。3分類を「自動化でどれだけ管理負荷を減らせそうか」という観点で見比べると、今回どこに取り組むべきかが見えてきます。
なお、GTD のリスト管理には Google ToDo リスト(英語版の名称は Google Tasks)を使う前提とします。タスク管理に特化したサービスで、GTD に対応づけやすいリストという概念があり、後述のとおりAPI 経由で操作できるためです。
| 分類 | 自動化の余地 |
|---|---|
| 繰り返しタスク | 小さい(Google ToDo リストの標準機能で足りる) |
| 依頼タスク | 大きい(外部の動きを監視して自動で振り分けられる) |
| 計画済みタスク | 小さい(着手の判断が人に依存する) |
繰り返しタスクは Google ToDo リストの繰り返し機能でそのまま代替できるため、わざわざ仕組みを作る必要がありません。計画済みタスクは「今すぐやるか」の判断が人に依存し、自動化しても効果は限定的です。一方、依頼タスクは PR やメールといった外部の動きをトリガーに自動で振り分けられ、3分類の中では自動化の効果が最も大きいと考えました。
そこで今回は、依頼タスクにスコープを絞り、その情報源として PR とメールを扱います。具体的には、PR のレビュー状態に応じて NextAction に足したり Waiting に移したりすることと、メールから対応すべき依頼を拾って NextAction に積むことを、最小構成で検証します。
なお、同じ「依頼タスク」でも、PR とメールではタスクの作り方が異なります。PR は、レビュー状態や CI の結果から決定的なルールで NextAction / Waiting を振り分けられます。一方メールは、どれが対応すべき依頼なのかを機械的なルールで一律に判定するのが難しく、AI エージェントの判断に頼ることになります。この違いは、後述のシステム構成にも関わってきます。
参考までに、PR の振り分けルールの主なものを抜粋すると、次のようになります。
| 自分の役割 | PR の状態 | 振り分け先 |
|---|---|---|
| レビュアー | レビュー依頼が来て、まだレビューしていない | NextAction |
| レビュアー | レビュー済みで、相手の修正を待っている | Waiting |
| レビュアー | 指摘のあと相手が新たに push した(再レビュー) | NextAction |
| 作成者 | レビューで修正を求められた、または CI が失敗した | NextAction |
| 作成者 | 承認されてマージ待ち | NextAction |
| 作成者 | レビューや CI の結果を待っている | Waiting |
| どちらでも | マージまたはクローズされた | (自動で完了) |
どの行も GitHub の状態から機械的に判定でき、同じ状態なら必ず同じ結果になります。
システム構成
全体のシステム構成は次のとおりです。
ローカルの AI エージェントが GitHub の PR とメールを集めて分類し、その結果を GAS(Google Apps Script)の Web アプリ経由で Google ToDo リストに反映します。AI エージェントには、ターミナル上で対話しながら開発を進める CLI 型のコーディングエージェントを使い、この仕組みはそのスキル(エージェントに手順や知識を追加する拡張機能)として実装しています。
役割分担としては、
- AI エージェント = 判断:PR とメールから情報を集め、どのタスクをどのリスト(NextAction か Waiting か)に入れるかを確定する
- GAS = 副作用:確定した指示を受けて、実際に Google ToDo リスト内のタスクを操作する(誤操作を防ぐガードもここに置きます)
という形です。
ここで、先ほど触れた PR とメールの違いが効いてきます。PR は決定的なルールで振り分けられるので、その分類はプログラムで処理できます。一方メールは、どれが対応すべき依頼かの候補の洗い出しを AI エージェントに委ねます。ただし、AI エージェントが挙げた候補がそのままリストに入るわけではありません。その中から実際に登録するものは、私が明示的に指定します。メールの判断には PR のような機械的な正解がないからこそ、最後の確定は人が行う形にしています。いずれの場合も、最終的に「どのリストに何を入れるか」が確定した指示として GAS に渡る、という点は変わりません。つまり、ここでいう AI エージェントは、すべての判断を AI で行う仕組みではなく、ルール・AI・人の判断を束ねて確定した指示を作る、進行役という位置づけです。
この「判断」と「副作用」を分けたのには理由があります。AI エージェントの出力は確率的で、同じ入力でも結果が揺れたり、ときには誤った判断をすることがあります。タスクの追加・移動・完了といった実際にデータを書き換える操作まで AI エージェントに直接やらせると、その揺らぎがそのまま Google ToDo リスト上の事故(重複登録や誤削除)につながりかねません。
そこで、書き換え操作は GAS 側に閉じ込め、「どのリストに何を入れてよいか」のルールやガードを GAS 側で固定しました。AI エージェントには「分類を判断する」役割だけを任せ、確定した指示だけを GAS に渡す形にすることで、判断の揺らぎが副作用に波及しにくい構成にしています。
なぜ GAS を経由するのか
前節で述べた「副作用を閉じ込める」という方針を、実装としてどう実現するか。ここで選んだのが、GAS の Web アプリを一種のプロキシとして使う構成です。
仮に AI エージェントから Google ToDo リストの REST API を直接呼び出す構成にすると、タスクの追加・移動・完了といった書き換え操作(副作用)が、AI エージェント側に散らばってしまいます。副作用が散らばると、「どのリストに何を入れてよいか」のルールやガードもエージェント側に持たざるをえず、判断と副作用を分けたかった意図が崩れてしまいます。
そこで、書き換え操作をすべて GAS の Web アプリの向こう側に閉じ込めました。AI エージェントは GAS に確定した指示を HTTP で渡すだけで、実際の API 呼び出しは GAS 側が行います。こうすることで、副作用とそのガードを GAS という1か所に集約でき、エージェント側は「分類を判断する」役割に専念できます。
なお、GAS には Google Workspace の各種サービスを呼び出す仕組みが標準で備わっているため、今回の MVP では、個別に GCP プロジェクトを作成して OAuth クライアントを設定するような準備をせずに Google ToDo リストを操作できた、という副次的な利点もありました。