METRの調査では、開発者はAIによって20%速くなったと感じていた。実測では19%遅くなっていた。自分自身の使い方についてのデータが欲しかったので、ローカルで動く生産性計測ツールを作った。

aideダッシュボードの概要

これは何か

aideはClaude CodeとCodexのセッションログ(JSONL)をSQLiteへ取り込み、プロジェクト横断で何が起きているかを表示する。コスト、トークン使用量、セッションの傾向、生産性の推移、レビュー待ちの一覧、繰り返し起きるワークフローの摩擦。

さらに、繰り返し現れた発見をプロジェクト知識の提案に変える。提案された成果物はレビューして承認したうえで、ランブックや今後の人間・エージェント作業のためのセッション開始ブリーフになる。

LLM呼び出しはゼロ。実行コストはゼロ。データはすべてローカルに残る。

~/.claude/projects/**/*.jsonl → Claude parser → SQLite → aide
~/.codex/sessions/**/*.jsonl  → Codex parser  → SQLite → aide

課題

Claude CodeとCodexは詳細なローカルログを生成する。メッセージ、ツール呼び出し、トークン数、タイムスタンプ、コマンド、メタデータ。ファイルは~/.claude/projects/~/.codex/sessions/の下にある。誰も見ていない。

AIコーディングツールに価値があるかどうかについて、誰もが意見を持っている。誰もデータを持っていない。自分は時間とともに効率化しているのか。どのプロジェクトが最もトークンを食うのか。セッションはどこで繰り返し失敗するのか。指示やランブックを改善したことで、実際に摩擦は減ったのか。

役に立つのは全セッションを通した個人の傾向であり、加えて繰り返しの失敗をより良い将来のコンテキストに変えるフィードバックループだ。単一のセッション記録ではどちらも見えない。

仕組み

データパイプライン

  1. 発見 - 設定済みのClaudeおよびCodexのJSONLソースを探す
  2. 解析 - プロバイダ固有のイベントを単一のセッションモデルへ正規化する
  3. ワークブロック - 各セッションを30分のアイドル間隔で連続した作業期間に分割する
  4. 取り込み - ファイルのmtimeを追跡し、増分でSQLiteへupsertする
  5. レビューループ - 疑わしいセッションを順位付けし、繰り返す原因をまとめ、レビュー可能な成果物を提案する

コスト推定

コストはすべて現在のAPI料金で推定する。サブスクリプション利用者(Pro/Max)向けには、金額の代わりにトークンベースの指標を表示する切り替えがある。

主な機能

概要ダッシュボード

サマリーカード、生産性指標(キャッシュヒット率、編集比率、コンパクション率、エラー率)、推移グラフ、週あたりのワークブロック数。

生産性指標と推移グラフのある概要ページ

生産性

プロジェクト別・プロバイダ別の集計で、直近30日と前の30日を比較する。セッションあたりの平均コスト、実作業時間、レビュー待ち率、編集の帰属、ツールエラー率。

アクションのサマリーは、編集なしの作業、プロジェクト帰属の弱さ、プレフィックス規則の欠落、編集帰属の欠けといった繰り返しの調査シグナルをまとめる。各アクションは、それを引き起こしたセッションへリンクしている。

セッション詳細

任意のセッションを掘り下げる。トークンの内訳、ツール使用状況、読み取り/編集/書き込み回数つきの触れたファイル、ワークブロックのタイムライン、エラーの分類。

トークン、ツール、ファイルを表示するセッション詳細

インサイト

最初のプロンプトの有効性、コストの集中、時間帯のパターン、モデル使用状況、ツールの連続、思考ブロックの分析、権限による摩擦、調査アクション。

最初のプロンプト分析と時間帯パターンのあるインサイトページ

その他

  • セッション解剖 - aide autopsy <session-id>はセッションごとの診断レポートを生成する。コストの内訳、コンテキストウィンドウの分析、コンパクションの検出、プロジェクト指示の改善提案。
  • 成果物レビュー - 繰り返し現れた発見は、意味的な成果物の提案になる。承認された成果物はランブックやタスクブリーフに反映される。
  • サブスクリプションモード - Pro/Max加入者向けに、APIコスト表示とトークンベース指標を切り替える。
  • CLI統計 - aide statsはブラウザを開かずにターミナルへ簡易サマリーを出力する。

技術的な詳細

ワークブロック

JSONLの「セッション」は、単にターミナルのウィンドウが開いたままだったという意味にすぎない。月曜から水曜にまたがり途中で睡眠を挟んだセッションは48時間のセッションとして読まれ、「所要時間」は無意味になる。

メッセージ間の間隔の分布は二峰性だ。ほとんどの間隔は5分未満(作業中)で、小さな塊が30分超(離席)にある。30分のしきい値は、この2つのモードをきれいに分ける。

各セッションは連続した作業期間であるワークブロックに分割される。「35セッションにまたがる119ワークブロック」は、「35セッション」よりも多くを語る。

エラーの分類

ツールエラーは自動で分類される。テスト(pytest、jest)、Lint(ruff、eslint)、ビルド(pip、npm)、Git、編集の不一致、ファイルアクセス。ほとんどの「エラー」は通常の反復(編集・テスト・修正のサイクル中のテスト失敗)だ。ダッシュボードは反復と実際のミスを分けて示す。

生産性指標

  • キャッシュヒット率 - 入力コンテキストのうちキャッシュから供給された割合(高いほど再利用が良い)
  • 編集比率 - ツール呼び出しのうちファイル編集の割合(高いほど生産的)
  • コンパクション率 - コンテキスト上限に達したセッションの割合
  • 読み取り対編集比 - 編集1回あたりの読み取り回数(低いほど探索が少ない)
  • 反復率 - 同じファイルを3回以上編集したセッションの割合
  • レビュー率 - 直近セッションのうち手動レビューに値する割合
  • 編集の帰属 - 編集/書き込み呼び出しのうちファイルパスに紐づいた割合

AIコーディングのログは金鉱だ。 ツール呼び出し、トークン数、タイムスタンプ、コマンドの形がすべて残っている。難しかったのは、どの指標が本当に重要かを決めることだった。

ワークブロックがすべてを変えた。 生のセッション所要時間は、どのグラフでも誤解を招いた。アイドル間隔で分割したことでデータが正直になった。凝った可視化よりデータのクリーニングが重要だ。

LLM呼び出しゼロは正しい制約だった。 すべての指標はヒューリスティックだ。API呼び出しがなく、追加コストもない。何度でも再取り込みして作り直せる。

技術スタック

  • Python 3.12+(Click製CLI)
  • Flask + Jinja2テンプレート
  • インタラクティブなグラフにChart.js(CDN)
  • スタイリングにTailwind CSS(CDN)
  • 保存にSQLite(標準ライブラリ)
  • パッケージ管理にuv