エージェントの過去セッションを横断検索できるようにした — ctx 導入記録
この記事について
コーディングエージェントを複数マシンで使っていると、「あの判断、どのセッションでやったか」が誰にも分からなくなる。ログは各マシンのホームディレクトリに JSONL で残っているが、機械横断で検索する手段が標準では無い。
ctx(ctx.rs、Rust製)はこれを解決するローカル専用ツールで、各エージェントの履歴を SQLite にインデックスして横断検索する。2026-07-20 に3台へ導入し、以降そのまま運用している。
| 項目 | 内容 |
|---|---|
| バージョン | ctx 0.25.0 |
| 動作 | 完全ローカル(外部送信なし) |
| データ配置 | ~/.ctx/work.sqlite |
| 導入日 | 2026-07-20 |
| 対応プロバイダ | claude / codex / warp / hermes ほか(検出できたものだけ有効化) |
トークン削減の実測は別記事(AI利用コスト実測レポート #03)で扱う。こちらは導入手順と、踏んだ罠の記録である。
何が入ったか
導入時点の3台の規模は以下のとおり。
| 役割 | セッション数 | イベント数 | 取り込んだソース |
|---|---|---|---|
| 作業機 | 約288 | 約87,000 | claude / codex / antigravity / warp / hermes |
| 常時起動サーバ | 35 | 1,620 | 3ソース |
| 3台目 | 1 | 27 | antigravity のみ |
作業機は本日時点で 87,980 アイテム・320 ソースまで伸びている。日常の使い方は3つに集約された。
ctx search "クエリ" # 横断検索
ctx show event <id> --window 10 # 当たりの前後を開く
ctx status # インデックスの健康状態
インデックスは同期しない
3台に入れたが、インデックスはマシン単位で独立させ、同期していない。
| 案 | 利点 | 採らなかった理由 |
|---|---|---|
| 1本に集約 | どこからでも全履歴を引ける | 履歴は9万件近いイベント。同期の失敗・競合の面倒が、得られる利便を上回る |
| マシン単位で独立(採用) | 壊れても1台分。設定がほぼゼロ | 他機の履歴は引けない |
実際に困っていないのは、探したい経緯はたいてい「その作業をしたマシン」に残っているからだ。常時起動サーバで回している定期ジョブの経緯はそのサーバに、記事制作の判断は作業機にある。横断したくなった時点で考え直せばよく、先に集約基盤を作るのは早すぎる最適化だった。
既定パスにログが無い
一番の罠がこれで、ctx sources を見ると今も残っている。
antigravity ~/.gemini/antigravity-ide/brain empty
claude ~/.claude/projects available
codex ~/.codex/sessions available
empty は「そのエージェントを使っていない」ではなく「既定パスを見に行ったが実体は別の場所にある」だった。実際の履歴は ~/.gemini/antigravity/brain(-ide が付かない)にある。
ctx import --provider antigravity --path ~/.gemini/antigravity/brain
available / empty / missing の3状態のうち、empty を見たら「使っていない」と結論せず、実パスを自分で確認する。ここで取りこぼすと、そのエージェントの履歴だけが永久に検索に出てこない。気づく機会が無いタイプの欠落なので、導入直後に ctx sources を1回眺めておく価値がある。
インストーラを使わなかった
配布されているインストールスクリプトは実行しなかった。エージェント環境の分類器にブロックされるためで、代わりに GitHub Releases からバイナリを直接取得し、SHA256 を検証して配置した。
| 手順 | 内容 |
|---|---|
| 1 | Releases から対象プラットフォームのバイナリを取得 |
| 2 | 公開されているチェックサムと SHA256 を突合 |
| 3 | ~/.local/bin/ に配置してパスを通す |
| 4 | ctx setup でストレージ作成+初回インデックス |
回避策として始めたが、結果的にこちらの方が良かった。何が入るのかが手順として全部見えているので、3台目に入れるときも同じ4行をなぞるだけで済んだ。任意のスクリプトを取得して実行する形は、無人で回っているマシンに入れる道具としては筋が悪い。
エージェント側に配線する
人間が思い出したときに叩くだけでは、道具はすぐ忘れられる。エージェントが自発的に過去履歴を引けるように、各エージェントへスキルとして登録した。
| 登録先 | 状態 |
|---|---|
| Claude Code(各機) | 導入済み |
| Codex | 導入済み |
| Antigravity / Antigravity CLI | 導入済み |
これで「なぜこうなっているのか分からない」場面で、エージェントが自分で履歴を検索してから答えるようになる。人間が「ctx で調べて」と言う必要がなくなった時点で、導入が完了したと見なしている。
インデックスの更新は常駐プロセスではなく、ctx コマンド実行時に自動でメンテナンスが走る方式にした。常駐を1本増やすと、それ自体の生死を監視する仕事が増える。手動で回したいときは以下で足りる。
ctx daemon run --once
限界
- 今の状態は分からない。ctx が持つのは過去の会話であって、現在のコードや設定ではない。現行の条文を聞くとそれらしい過去の議論を返してくるので、「今どうなっているか」は現物を読むこと
- 検索結果は答えではなく入口。上位数件を超えると急速にノイズになる。当たりを引いたら
ctx showで前後を開く - 履歴が残っていない範囲は存在しないのと同じ。ログの保持期間より前の判断は、どのみち掘れない
導入して効いたのは検索速度そのものより、「あのとき何を考えていたか」を口頭の記憶に頼らなくなったことだった。同じ失敗を2回踏んでから気づく、という経路がひとつ減っている。