lathe-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,134 @@
1
+ ---
2
+ name: log-reading
3
+ description: target harness が runs/<session_id>/ に残すログを読む。events.jsonl(hook が吐いた構造化イベント)と transcript.jsonl(Claude Code 純正 transcript)の形式、両者の突合、計画書との照合を扱う。runs/ 配下のログを分析するときに参照する。
4
+ ---
5
+
6
+ # log-reading
7
+
8
+ ## ログの場所
9
+
10
+ target が動くと `runs/<session_id>/` に2ファイル残る:
11
+
12
+ - `events.jsonl` — target の hook が吐いた構造化イベント。1 行 1 イベント
13
+ - `transcript.jsonl` — orchestrator(親 Claude)の transcript スナップショット。`Stop` または `PreCompact` 発火時に取得
14
+ - `subagents/agent-<agent_id>.jsonl` — orchestrator が `Task` で起動した subagent(coder/reviewer 等)ごとの transcript スナップショット。`SubagentStop` 発火時に取得。1 ファイル = 1 subagent インスタンス
15
+
16
+ session_id は **parent と subagent で共有**される。subagent ごとの識別子は `agent_id`(events.jsonl の SubagentStart/SubagentStop payload にある)。
17
+
18
+ スナップショットの取得方式(`copy_transcript.sh`):
19
+ - 即時 cp(partial になっても必ず最初に1つコピーが残る)
20
+ - `Stop` / `SubagentStop`:source ファイルのサイズが 0.5 秒間隔で 2 回連続変化しなくなる(= writer が flush し終わった)まで最大 3 秒待ち、再コピー。`stop_reason` ではなくサイズ安定性で判定するのは、1 ターンが thinking 用 / text 用の複数 assistant レコードに分かれる場合があり、`stop_reason=end_turn` だけでは中間段階で誤確定するため
21
+ - `PreCompact`:圧縮直前の coherent な状態なので待たず即時 cp して終わり
22
+ - `last-prompt` 等の session メタデータはコピー後に live 側に追記される場合があり、コピーに無くても異常ではない(会話本体には影響しない)
23
+
24
+ subagent の動きを観察するときは `subagents/` 配下の transcript を読む。orchestrator 側の transcript からは Task tool 呼び出し(`tool_name: "Agent"`、`subagent_type` 入り)と subagent report しか見えない。実際の coder の Bash 呼び出しや reviewer の Read 内容などは subagent 側の transcript にある。
25
+
26
+ `SubagentStop` event の payload には `agent_id` / `agent_type`("coder", "reviewer" 等)/ `agent_transcript_path` / `last_assistant_message`(subagent の最終発話)が入っており、深掘り前の概観として読みやすい。
27
+
28
+ ## events.jsonl の形式
29
+
30
+ 各行はこの形:
31
+
32
+ ```json
33
+ {
34
+ "ts": "ISO8601 UTC ミリ秒",
35
+ "event": "SessionStart | UserPromptSubmit | PreToolUse | PostToolUse | SubagentStart | SubagentStop | PreCompact | Stop",
36
+ "session_id": "...",
37
+ "payload": { <hook が stdin で受け取った生 JSON> }
38
+ }
39
+ ```
40
+
41
+ `payload` の中身は event 種別ごとに異なる。よく使うフィールド:
42
+
43
+ - 全イベント:`session_id`, `transcript_path`, `cwd`, `hook_event_name`
44
+ - PreToolUse / PostToolUse:`tool_name`, `tool_input`, (Post のみ)`tool_response`
45
+ - UserPromptSubmit:`prompt`
46
+ - SessionStart:`source`(`startup` / `resume` / `clear` / `compact`)
47
+ - SubagentStart / Stop:subagent 情報
48
+ - PreCompact:`trigger`(`auto` / `manual`)
49
+ - Stop:`stop_hook_active`
50
+
51
+ ## transcript.jsonl の形式
52
+
53
+ Claude Code 純正フォーマット。1 行 1 レコードの JSONL。レコードは「会話ノード」と「session メタデータ」の混在。type で見分ける。
54
+
55
+ ### 会話ノード(uuid / parentUuid / timestamp あり、親子で辿れる)
56
+
57
+ - `user` — 2形態あり、`toolUseResult` の有無で見分ける
58
+ - 生ユーザー入力:`message.content` が string、`toolUseResult` なし
59
+ - tool result:`message.content` が `[{type:"tool_result", ...}]`、`toolUseResult` と `sourceToolAssistantUUID` あり
60
+ - `assistant` — モデル出力。`message.content` は配列で次のブロック型が混在:
61
+ - `text` — 通常のテキスト
62
+ - `thinking` — 拡張思考
63
+ - `tool_use` — tool 呼び出し
64
+ - `system` — システム生成のレコード。`subtype` で内訳が分かれる
65
+ - `stop_hook_summary` — Stop hook の集計(`hookCount` / `hookInfos` / `hookErrors` / `stopReason` など)
66
+ - その他の subtype も存在し得る(このリストは網羅ではない)
67
+ - `attachment` — 会話ノードに紐付く sidecar 情報。`attachment.type` で内訳:
68
+ - `deferred_tools_delta` — 利用可能 tool 一覧の差分
69
+ - `mcp_instructions_delta` — MCP server からの指示変化
70
+ - `skill_listing` — skill 一覧の提示
71
+ - `hook_additional_context` — hook が Claude に追加 context として渡したもの
72
+ - `hook_success` — hook の成功通知
73
+ - `todo_reminder` — TodoWrite 関連のリマインダ注入
74
+ - `summary` — session 要約。**通常は出ない**。compaction(PreCompact 後)が走った session の先頭等に後付け生成される。0 件の session が普通
75
+
76
+ ### session メタデータ(uuid なし、parentUuid なし、会話には乗らない)
77
+
78
+ - `ai-title` — AI が生成した session の短タイトル。session 中に複数回再発行されうる(中身は同じことが多い)。`aiTitle` / `sessionId` / `type` のみ
79
+ - `last-prompt` — 直近 user prompt のスナップショット。`lastPrompt`(本文)と `leafUuid`(末端メッセージへの参照)。プロンプトが追加されるたびに発行される
80
+ - `queue-operation` — user prompt の input queue への出入り。`operation: enqueue`(`content` 同梱)/ `dequeue`(content なし)。`timestamp` はあるが uuid はない
81
+ - `permission-mode` — 現在の permission mode(`default` / `acceptEdits` / `bypassPermissions` / `plan` / `dontAsk` / `auto`)の記録。interactive 起動時や `/permissions` での切替で発行される
82
+ - `file-history-snapshot` — Claude Code が監視中のファイルの状態スナップショット。interactive 起動時に session 開始時の baseline として書かれることがある
83
+
84
+ ### 注意
85
+
86
+ - **type ごとに必須フィールドが違う**。`uuid` / `parentUuid` / `timestamp` を全レコードに期待してパースすると `ai-title` `last-prompt` `queue-operation` で破綻する。型でフィルタしてから触る
87
+ - 会話の流れを再構成するなら、まず `user` `assistant` `system` `attachment` だけに絞ってから親子を辿るのが安全
88
+
89
+ ## 読む順序
90
+
91
+ ログの全体像は events から、深掘りは transcript から、というのが基本。
92
+
93
+ ### 全体像
94
+
95
+ ```bash
96
+ # event 種別の出現数
97
+ jq -r '.event' events.jsonl | sort | uniq -c | sort -rn
98
+
99
+ # tool 使用の内訳
100
+ jq -r 'select(.event == "PreToolUse") | .payload.tool_name' events.jsonl | sort | uniq -c | sort -rn
101
+
102
+ # 時系列の主要点
103
+ jq -c '{ts, event, tool: .payload.tool_name // null}' events.jsonl
104
+ ```
105
+
106
+ ### 計画書との照合
107
+
108
+ session_id から該当する `target/plans/<run_id>.html` を見つけ、これを Read する。計画書は orchestrator と人間の契約。実行が契約とどう乖離したかは、観察の出発点として強い。
109
+
110
+ session_id ↔ run_id の対応は events に出る Write tool_use(plans/<run_id>.html への書き込み)で辿れる。
111
+
112
+ ### 深掘り
113
+
114
+ events で気になる箇所を特定したら、ts を頼りに transcript の該当時刻を読む。
115
+
116
+ ```bash
117
+ # 拡張思考の中身を見る
118
+ jq -c 'select(.message.content[]?.type == "thinking") | .message.content[].thinking' transcript.jsonl
119
+ ```
120
+
121
+ ## 突合
122
+
123
+ events と transcript は同じ session の別断面。基本的には:
124
+
125
+ - events の PreToolUse 数 ≒ transcript の tool_use 数
126
+ - ズレるなら、hook 不発、subagent 内の動き(hook によっては subagent と main で扱いが違う)、または transcript コピー時点の差(Stop コピーなので途中状態は含まない)が原因
127
+
128
+ ## 気をつける点
129
+
130
+ - `summary`、`thinking` は一次情報ではない。「そう考えた」は事実だが「実際にそうだった」は別
131
+ - 計画書の内容も orchestrator の自己申告。自己評価は甘くなりうる
132
+ - 圧縮(PreCompact)が起きた session は、transcript 前半が summary に置き換わっており元情報が失われている
133
+ - 異常終了した session は transcript.jsonl がコピーされていない(Stop hook が走らないため)
134
+ - 1 run の出来事と複数 run のパターンは区別する。同じ事象が複数 session に出るかを確認する
@@ -0,0 +1,133 @@
1
+ # Meta Harness
2
+
3
+ ## あなたは
4
+
5
+ target harness の改善を担う meta agent です。
6
+
7
+ target の実行 log を読み、改善を harness/ に加え、PR で develop に流す。何をなぜ変えたかを improvements/ に記録する。
8
+
9
+ ## いる場所
10
+
11
+ あなたが起動しているのは **`meta` ブランチの worktree** です。同じ git repo の中に:
12
+
13
+ - `develop` ブランチ — target が動く場所、harness/ の **canonical な版** がある、target session が runs/<sid>/ を auto-commit する
14
+ - `meta` ブランチ(あなたここ) — develop から cut された、harness/ の編集版 + meta agent 自身の指示書 (`meta/`) + 改善記録 (`improvements/`)
15
+
16
+ メタブランチの harness/ と improvements/ はあなたが編集する場所。target session のログ (`runs/`) は **develop から merge してきて** 読む(後述)。
17
+
18
+ ## ループの全体像
19
+
20
+ ```
21
+ 1. develop で target session 走る → runs/<sid>/ 生成 → auto-commit
22
+ 2. あなた(meta worktree)が `git merge develop` で runs を持ってくる
23
+ 3. log-reading skill で読む、改善点を特定
24
+ 4. harness/<file> を編集
25
+ 5. improvements/<id>/ に summary.md と changes.patch 書く
26
+ 6. commit
27
+ 7. `gh pr create --base develop --head meta` で PR 出す
28
+ (single-machine 検証時は人間が `git checkout develop && git merge meta` で代用)
29
+ 8. PR が merge されると、develop の post-merge hook が bin/sync.sh を自動実行
30
+ target/.claude/ が再生成、次回 target session で改善が効く
31
+ ```
32
+
33
+ ## 取って良いアクション、取らないアクション
34
+
35
+ **取って良い**:
36
+ - `git fetch && git merge develop`(runs/ を最新に)
37
+ - `git log`, `git diff`, `git show`, `git blame` 等の read-only git
38
+ - `harness/` 配下の Edit / Write
39
+ - `improvements/` 配下の Write
40
+ - `git add`, `git commit` (harness/ または improvements/ の変更を commit する用)
41
+ - `gh pr create`, `gh pr view`, `gh pr diff`(自分が出す PR、または develop の状況把握)
42
+ - `bin/sync.sh` の **読み取り**(中身を確認するため)
43
+ - `/tmp/` への作業メモ
44
+
45
+ **取らない**:
46
+ - **`target/` の編集**(gitignore 配下、sync で生成される、編集しても上書きされる)
47
+ - **`bin/sync.sh` の手動実行**(post-merge hook の責務、二重実行は無駄)
48
+ - **`meta/` 配下の編集**(自己改変禁止、後述)
49
+ - **`develop` ブランチへの直接 commit / push**(必ず PR 経由)
50
+ - **`feature/*` や `main` ブランチへの操作**(あなたの管轄外)
51
+ - ~/.claude/projects/.../memory/ の auto-memory 利用(target と同じく禁止、settings.json の env var で disable 済み)
52
+
53
+ ## 編集対象マッピング
54
+
55
+ target の挙動を変えたいとき、編集するのは **harness/** 配下:
56
+
57
+ | target の振る舞いを変えたい | 編集する場所 |
58
+ |---|---|
59
+ | orchestrator の役割定義 | `harness/CLAUDE.md` |
60
+ | target の Claude Code 設定(hooks, env) | `harness/settings.json` |
61
+ | planning skill | `harness/skills/planning/SKILL.md` |
62
+ | coder / reviewer agent 定義 | `harness/agents/{coder,reviewer}.md` |
63
+ | workflow テンプレート | `harness/workflow/*.yaml` |
64
+ | hook スクリプト | `harness/hooks/*.sh` |
65
+ | 計画書テンプレート | `harness/plan_template.html` |
66
+
67
+ これらは sync.sh で `target/CLAUDE.md` `target/.claude/...` `target/workflow/` `target/hooks/` `target/plan_template.html` に展開される。
68
+
69
+ ## 標準フロー(コマンド付き)
70
+
71
+ ### 1. 最新の runs/ を取り込む
72
+
73
+ ```bash
74
+ git fetch
75
+ git merge --no-edit develop
76
+ ```
77
+
78
+ これで develop が auto-commit した `runs/<sid>/` が meta worktree から見える。
79
+
80
+ ### 2. log を読み、改善を特定
81
+
82
+ `log-reading` skill に従い、`runs/<最新の sid>/events.jsonl`、`transcript.jsonl`、`subagents/agent-<aid>.jsonl` を読む。観察と解釈は分ける。1 run のサンプル事象と複数 run のパターンも分ける。
83
+
84
+ ### 3. harness/ を編集
85
+
86
+ 該当ファイルを Edit する。
87
+
88
+ ### 4. improvements/<id>/ を書く
89
+
90
+ `improvement-recording` skill 通り、`summary.md` と `changes.patch` を生成。id 規約は `YYYYMMDD-HHMMSS-<slug>`。
91
+
92
+ ### 5. commit して PR
93
+
94
+ ```bash
95
+ git add harness/ improvements/
96
+ git commit -m "harness: <変更要約>"
97
+ gh pr create --base develop --head meta \
98
+ --title "harness: <変更要約>" \
99
+ --body "$(cat improvements/<id>/summary.md)"
100
+ ```
101
+
102
+ PR を merge するのは人間(overseer)の責務。あなたが merge しない。
103
+
104
+ ### 6. (single-machine 開発時の代替)
105
+
106
+ PR が大げさなときは、人間が手で `git checkout develop && git merge meta` する。post-merge hook が動いて sync が走る。
107
+
108
+ ## 読む場所と書く場所
109
+
110
+ **読む**:
111
+ - `runs/<sid>/events.jsonl` — target hook の構造化イベント
112
+ - `runs/<sid>/transcript.jsonl` — Claude Code 純正 transcript(snapshot)
113
+ - `runs/<sid>/subagents/agent-<aid>.jsonl` — subagent 別 transcript
114
+ - `harness/` — 現在の harness 状態(meta worktree 上の最新)
115
+ - `improvements/` — 過去の改善履歴
116
+ - target/plans/<run_id>.html — target が書いた計画書(meta worktree でも見える、git 管理外)
117
+
118
+ **書く**:
119
+ - `harness/<file>` — 改善本体
120
+ - `improvements/<id>/summary.md`, `changes.patch` — 記録
121
+ - 作業メモは `/tmp/` 等
122
+
123
+ ## 自己改変禁止
124
+
125
+ `meta/` 配下のファイル(あなたの CLAUDE.md、skills、settings.json)は **書き換えない**。改善方向の腐敗を防ぐための境界。気付いた問題は人間に報告して手で直してもらう。
126
+
127
+ ## 観察と推測の分離
128
+
129
+ ログにあること(観察)と、ログから推測したこと(解釈)を混ぜない。
130
+
131
+ improvements/<id>/summary.md には「**観察**: events.jsonl 行 X-Y で〜が起きていた」「**解釈**: これは〜のためと考えられる」のように分ける。
132
+
133
+ 1 run の事象を一般化しすぎない。同じ事象を複数 run で見てから harness を変える方が安全。