どうもこんにちは、Tadash です。前回、Bob で落ち物パズル「ぽとくり」を作りました。その最後に、こんな宿題を自分に残しています。
セッションが記録される(self-documenting)って言うけど、その記録、いったいどこに、どんな形で残ってるの?
今日はそれを確かめます。題材は前回の「ぽとくり」。あのやり取りが、どこかにちゃんと残っているはず。開けにいきましょう。
記録は作業フォルダには無い。~/.bob の下にいた
まず、ぽとくりを作った作業フォルダ(potokuri)の中を見ても、あるのは game.py だけ。記録はそこにはありません。
記録は、ホームの ~/.bob の下に、プロジェクトごとにまとまっていました。Windows なら %USERPROFILE%\.bob、つまり C:\Users\<あなた>\.bob です。
~/.bob/
└─ tmp/
└─ 8b9d036e…(プロジェクトごとのハッシュ)/
├─ logs.json … 依頼の一覧(軽い)
└─ chats/
└─ session-2026-07-12T06-00-….json … 会話まるごと(今回は約125KB)
作業フォルダごとにハッシュのフォルダができて、その下の chats/ に、セッション1回ぶんの JSON がまるっと1ファイル。ぽとくりの回は、これが約125KB ありました。落ち物ゲーム1本のやり取りで、それだけの記録が残っている。
開けてみると、想像よりずっと細かい
session-*.json を開くと、messages という配列に、やり取りが1つずつ入っています。ぽとくりのときは3つ(依頼 → Bob の応答 → 完了報告)。依頼のところから実際に抜き出すと、こんな中身でした。僕の個人情報とローカル PC の情報は、文字数はそのままに * でマスクしています。見やすさのため整形していますが、値は実データです。
{
"sessionId": "********-****-****-****-************",
"projectHash": "****************************************************************",
"startTime": "2026-07-12T06:01:19.321Z",
"lastUpdated": "2026-07-12T06:05:59Z",
"messages": [
{
"id": 0,
"timestamp": "2026-07-12T06:01:19.321Z",
"type": "user",
"content": "Python の tkinter だけ(追加インストールなし)で動く、落ち物パズルを作ってください。
【ゲーム名】ぽとくり(ウィンドウのタイトルにも表示)
【盤面】8 列 × 15 行、1マス 32px
【ピース】テトリスのテトロミノ(4マス)は使わない。
1・2・3・5マスの自前のかたちを十数種類定義し、そこからランダムに落とす。
4マスの形は1つも入れないこと(見た目と操作感を意図的に別物にするため)。
【色】自前のパステル系パレットからランダムに割り当てる
【操作】←→=移動、↓=ソフトドロップ、Space=ハードドロップ、↑=回転、P=一時停止、R=リスタート
【消える条件】横1列がすべて埋まったら、その列を消してスコア加算(複数列の同時消しはボーナス)
【終了】一番上まで積み上がったらゲームオーバー
【表示】いまのスコアと「次のピース」を画面に出す
【制約】外部ライブラリ禁止。tkinter・random など標準ライブラリだけ。1ファイル game.py にまとめる。コメントは日本語で。
まず全体設計を3〜5行で説明してから、コードを書いてください。実行コマンドは python game.py。"
},
{
"id": 1,
"timestamp": "2026-07-12T06:02:28Z",
"type": "bob-shell",
"model": "premium",
"tokens": { "input": 8691, "output": 6401, "cached": 0, "total": 15092 },
"content": "<thinking>
タスク分析: tkinterで落ち物パズル「ぽとくり」を作成
要件を整理:
- Python標準ライブラリ(tkinter)のみ使用
- 8列×15行、1マス32px
- テトロミノ(4マス)は使わず、1・2・3・5マスの独自ピースを十数種類
- パステル系カラーパレット
- 操作: ←→移動、↓ソフトドロップ、Spaceハードドロップ、↑回転、P一時停止、Rリスタート
- 横1列揃ったら消去&スコア加算
- スコアと次のピース表示 / ゲームオーバー判定
- 1ファイル game.py、日本語コメント
まず設計を簡潔に説明してから、コードを実装する。
</thinking>
## 全体設計
1. ピース定義: 1・2・3・5マスを合計15種類程度定義し、4マスは意図的に除外
2. ゲームロジック: 8×15のグリッド管理、衝突判定、回転処理、ライン消去とスコア計算
3. 描画とUI: tkinter.Canvasで盤面と次のピース表示を分離、キーバインドで操作
4. ゲームループ: after()で自動落下タイマー、一時停止・リスタート
それではコードを作成します:",
"toolCalls": [
{
"id": "tool-1",
"name": "write_to_file",
"displayName": "WriteFile",
"args": {
"file_path": "C:\Users\******\bob\potokuri\game.py",
"content": "#!/usr/bin/env python3
# -*- coding: utf-8 -*-
\"\"\"
ぽとくり - オリジナル落ち物パズルゲーム
tkinter標準ライブラリのみで動作
\"\"\"
(…以下 game.py が丸ごと記録されている。長いのでここでは省略…)"
},
"result": { "functionResponse": {} },
"status": "success",
"timestamp": "2026-07-12T06:02:41Z"
}
]
},
{ "id": 2, "type": "bob-shell", "content": "(…完了報告 attempt_completion。省略…)" }
]
}
messages の1件ずつに、こういう項目がぶら下がっています(1行=1項目)。
| フィールド | 中身(ぽとくりの実データ) |
|---|---|
sessionId |
セッションの識別子(UUID) |
projectHash |
作業フォルダを表すハッシュ |
startTime / lastUpdated
|
セッションの開始・最終更新の時刻 |
type |
メッセージの種別(user=僕の依頼/bob-shell=Bob の応答) |
content(依頼) |
貼ったプロンプト全文 |
content(応答) |
<thinking>(モデルの思考)+設計の説明 |
model |
使ったモデルの区分(premium) |
tokens |
トークン内訳(input 8,691/output 6,401/total 15,092) |
timestamp |
メッセージ・ツールごとの時刻 |
toolCalls[].name |
実行したツール名(write_to_file) |
toolCalls[].args.file_path |
書き込み先のパス |
toolCalls[].args.content |
書き込んだ game.py の中身そのもの |
toolCalls[].status |
成否(success) |
toolCalls[].result |
実行の結果 |
注目してほしいのは、僕の依頼(プロンプト全文)と、Bob が実際に書いたコード(game.py まるごと)が、どちらもそのまま入っていること。さらに <thinking> にモデルの思考、tokens に消費トークン、model に使ったモデルの区分まで。前回の完了画面に出ていた「Cost 0.08」の内訳が、ここに全部あるわけです。
「要は詳細なログでしょ?」——はい。ただし3つ違う
ここまで読んで、こう思った方。「それ、要は詳細なログだよね?」——はい、そのとおりです。ただ、ターミナルのスクロールバックとは、3つ違います。
- 残る … ターミナルは閉じれば消える。これはファイルとして残る。
-
構造化されている … ただのテキストではなく JSON。依頼・コード・トークン・時刻がフィールドで分かれている。だから
grepもできるし、差分も取れる。 - 完全 … 入力・思考・出力・実行・結果・コストまで、途中を端折らずに。
「self-documenting」と聞くと大層な機能を想像しますが、蓋を開ければ、勝手に・細かく・構造化して残してくれる詳細ログでした。派手さはありません。でも、必要になったときに開いて見返せる——たったそれだけのことが、後になってものを言います。
これが「説明できる」の正体
前回の「なぜ Bob?」で、堅い現場は「あとで説明できること」を求める、と書きました。この JSON が、まさにその実体です。
誰が(依頼)・何を考えて(thoughts)・どのモデルで・何を実行して(書いたコード)・どうなったか(成否)。全部たどれる。「AI が勝手にやりました、経緯は不明です」の、ちょうど逆です。
ただし、過信はしない(正直なところ)
1つ、正直に。この記録、置き場所が ~/.bob/tmp/ の下です。名前のとおり tmp。いまのところ前日ぶんのセッションも残っていましたが、「tmp だから永久に残る」とは考えないほうがいい。
保持期間はどうなのか。手元の設定ファイル(~/.bob/settings.json)と、公式の設定ドキュメント(Configuring | IBM Bob Docs)を見たかぎり、記録を何日で片づけるといった保持期間の設定は見当たりませんでした(2026-07-12 時点、Bob Shell 1.0.6)。参考までに、同じ CLI 型の Claude Code には、履歴を何日残すかを決める cleanupPeriodDays(既定 30 日)という設定があります。Bob も今後こうした設定が増えるかもしれませんが、いまは「tmp に置かれていて、期間を決める設定は見当たらない」。だから、恒久保存は当てにしないのが実際的です。
ちゃんとした監査ログが要る現場では、これに頼り切らず、組織側の仕組み(前回ふれた管理コンソール側)で担保する話になります。手元の ~/.bob は、あくまで「自分がさっき何を頼んだか、すぐ見返せる」ためのもの、と捉えておくのが安全です。
自分のセッションを見る手順(Windows)
難しくありません。
- エクスプローラのアドレスバーに
%USERPROFILE%\.bob\tmpと打つ - ハッシュのフォルダ(プロジェクトごと)を開く。最近さわったものは、更新日時で分かる
-
chats\の中のsession-*.jsonを、VS Code なりメモ帳なりで開く - 大きいので、
messagesを探す。そこにやり取りが並んでいる
ざっと眺めるだけなら、隣の logs.json(依頼の一覧)のほうが読みやすいです。
ただ、生の JSON を毎回のぞくのは、正直ちょっと面倒です。そこで発想を変える。その JSON を読むビューアを、Bob 自身に作らせる手があります。「%USERPROFILE%\.bob\tmp の下の session-*.json を一覧して、依頼・使ったモデル・トークン・実行したツールを表にして見せる Python を書いて」——これだけ頼めば、前回のぽとくりと同じ要領で、ちょっとしたログビューアができあがります。困りごとは、そのままエージェントに渡す。記録を読む道具すら、記録を残している本人(Bob)に作らせればいい。これも AI エージェントの、ふつうの使い方です。
まとめ
- self-documenting の実物は
~/.bob/tmp/<プロジェクト>/chats/session-*.json。 - 中身は、依頼・思考・モデル・トークン・書いたコード・成否・時刻まで入った、構造化された詳細ログ。
- 「あとで説明できる」の実体はこれ。ただし
tmp配下なので、恒久保証はしない前提で付き合う。
自分の手元で、AI が何をやったかをその場で開いて確かめられる。これが、ローカルで動く Bob Shell の地味に良いところです。
※投稿内容は個人の見解であり、必ずしも私の所属団体・企業における立場、戦略、意見を代表するものではありません。ファイルの配置や記録の形式は 2026-07-12 時点で手元を確認したもので、製品のバージョンや設定で変わる可能性があります。
