throughline 0.13.0 → 0.14.1

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.
package/CHANGELOG.md CHANGED
@@ -10,6 +10,49 @@ shipped to npm but were not individually tagged on GitHub.
10
10
 
11
11
  ## [Unreleased]
12
12
 
13
+ ## [0.14.1] — 2026-10-05
14
+
15
+ ### 修正
16
+
17
+ - Claude Codeの自動継続で、後継が完了済みの作業をやり直すことがあった不具合を直す。0.14.0は、止めたターンについて「止める直前の発言」1つしか後継へ渡していなかった。そのターンでそこまでにした発言と道具の呼び出しは、記憶に入っていなかった。macOSの実機(Haiku 4.5)で、後継2つが読み終えたファイルを最初から読み直した。
18
+ - Codexの自動継続と同じく、後継を立てる前に、止めたターンをDBへ取り込む。発言は全部をつないで本文(L2)に、道具の入出力は止めた道具の呼び出しまで詳細(L3)に入れる。後継は`throughline detail HH:MM:SS`で、止めたターンの入出力を取り出せる。0.14.0では、止めたターンの入出力はどこにも残らなかった。
19
+ - 後継へ渡す現在地に、次の2つを足す。
20
+ - **このターンでここまでにしたこと**: 発言と道具の呼び出しを古い順に並べる。作業フォルダの中のファイルは相対で書く。多い時は新しい側から2,400字まで載せ、残りは件数にする。
21
+ - **止める直前に呼ぼうとして、実行されなかった道具**: 圧縮を止めた後の応答が呼んだ道具。同じ応答に並んだ道具は全部ここに入る。
22
+ - 止めたターンは現在地にだけ載せ、直前の対話(L2)の一覧に重ねない。依頼の上限は4,000字から3,500字にする。
23
+
24
+ ### 追加
25
+
26
+ - `throughline auto-handoff status --host claude --json`の各引き継ぎに`in_flight_captured`を足す。止めたターンをDBへ取り込めた時に`true`。取り込めなくても引き継ぎは止めず、依頼とここまでにしたことは後継へ渡る。
27
+
28
+ ### 確認した範囲
29
+
30
+ - macOS 27.0のClaude Code。端末の会話(2.1.289)と、Claude Desktopが同梱する本体(2.1.286)を端末から起動した会話の両方から始めた。直した版で、Haiku 4.5は4回、Opus 5.5は7回、連続で引き継いで作業を完了した。読み直しも読み飛ばしも無く、どの会話でも自動圧縮は走っていない。
31
+ - Claude Desktopの画面から始めた会話、Windows、Fable、subagentが動いている最中の引き継ぎは確かめていない。
32
+
33
+ ## [0.14.0] — 2026-10-05
34
+
35
+ ### 変更
36
+
37
+ - Claude Codeの自動継続を作り直す([ADR 0033](docs/adr/0033-claude-auto-handoff-new-session.md))。0.13.0の方式(自動圧縮を通し、圧縮の直後に同じ会話へ記憶を注入する)は取り下げた。Throughlineは自動圧縮を置き換えるもので、圧縮が走る前に旧い会話を止め、記憶を持った新しい会話で作業を続ける。Codexの自動継続と同じ並びにした。
38
+ 1. 自動圧縮の直前に、`PreCompact`フックが圧縮を止め、`/tl`と同じ印を残す。
39
+ 2. `PreToolUse`フックが、旧い会話の次の道具を実行させずに止める。旧い会話は空にしない。
40
+ 3. 同じprojectに、`claude --bg`で指示を待つ新しい会話を立てる。モデル・推論強度・権限は旧い会話から引き継ぐ。
41
+ 4. 新しい会話の受け口へ、配送ライブラリ(`aiterm-steer-delivery` 0.1.13の`sendClaudeInbox`)で継続の指示を1通送る。届いた時に、止めた時点の依頼と直近の会話の原文を注入する。
42
+ - `throughline auto-handoff enable --host claude`が`PreCompact`と`PreToolUse`のフックを登録し、`disable`が外す。`throughline install`は登録しない。0.13.0の`install`が置いた`PreCompact`フックは、自動継続が無効な端末の`install`で外す。
43
+ - 続きは裏の会話で動く。`claude agents`の一覧と`claude attach <id>`で見られる。Claude Desktopの画面には出ず、後継のターンが終わって入力待ちになった後に開ける。
44
+ - 別の会話から届いた発言(`Another Claude session sent a message:`)は、Claude Codeが後ろに付ける定型の注意書きを落として保存する。
45
+ - 依存の`aiterm-steer-delivery`を0.1.9から0.1.13に上げる。
46
+
47
+ ### 0.13.0から変わらないもの
48
+
49
+ - 圧縮の要約行(`isCompactSummary`)をユーザー発言として保存しない修理は、そのまま有効。
50
+
51
+ ### 確認した範囲
52
+
53
+ - LinuxのClaude Code 2.1.289。対話画面の会話から始めて後継へ3回連続で引き継ぎ、最後の後継が作業を完了した。4つの会話のどれにも圧縮の記録は無く、止めた道具は実行されていなかった。
54
+ - macOS・Windows、Claude Desktopから始まる会話、subagentが動いている最中の引き継ぎは確かめていない。
55
+
13
56
  ## [0.13.0] — 2026-10-04
14
57
 
15
58
  ### 追加
@@ -1653,7 +1696,9 @@ two attempts, instrument first instead of patching again.
1653
1696
 
1654
1697
  ---
1655
1698
 
1656
- [Unreleased]: https://github.com/kitepon/Throughline/compare/v0.13.0...HEAD
1699
+ [Unreleased]: https://github.com/kitepon/Throughline/compare/v0.14.1...HEAD
1700
+ [0.14.1]: https://github.com/kitepon/Throughline/compare/v0.14.0...v0.14.1
1701
+ [0.14.0]: https://github.com/kitepon/Throughline/compare/v0.13.0...v0.14.0
1657
1702
  [0.13.0]: https://github.com/kitepon/Throughline/compare/v0.12.9...v0.13.0
1658
1703
  [0.12.9]: https://github.com/kitepon/Throughline/compare/v0.12.8...v0.12.9
1659
1704
  [0.12.8]: https://github.com/kitepon/Throughline/compare/v0.12.7...v0.12.8
package/README.ja.md CHANGED
@@ -52,17 +52,24 @@ throughline auto-handoff status --host claude --json
52
52
  throughline auto-handoff disable --host claude
53
53
  ```
54
54
 
55
- 既定では無効です。`--project`を省略すると全projectを対象にします。Codexの設定とは別で、互いに影響しません。
55
+ 既定では無効です。`enable`は必要な`PreCompact`と`PreToolUse`のフックを登録し、`disable`が外します。`--project`を省略すると全projectを対象にします。Codexの設定とは別で、互いに影響しません。
56
56
 
57
- Claude Codeは、自動圧縮の前にhookから作業を止めることも、新しい会話へ指示を送ることもできません。自動圧縮の後は、同じ会話で作業をそのまま続けます。Throughlineは会話を切り替えず、圧縮の直後に、圧縮前の記録を同じ会話へ注入します([ADR 0032](docs/adr/0032-claude-compact-continuation.md))。
57
+ 自動圧縮を置き換えます。圧縮が走る前に旧い会話を止め、記憶を持った新しい会話で作業を続けます([ADR 0033](docs/adr/0033-claude-auto-handoff-new-session.md))。
58
58
 
59
- - `PreCompact`フックが、自動圧縮の時だけ印を残します。圧縮は止めません。
60
- - 圧縮直後の`SessionStart`(`source: "compact"`)フックが、作業途中のユーザー依頼と圧縮直前の発言、直近の会話の原文を注入します。上限は9,500字で、入り切らない古いターンは`throughline recall`の案内になります。
61
- - モデルは追加の入力なしで作業を続けます。圧縮の要約と記録が食い違う時は、記録を正とするよう指示します。
59
+ 1. 自動圧縮の直前に、圧縮を止めます。`/tl`と同じ印を残します。
60
+ 2. 旧い会話の次の道具を、実行させずに止めます。旧い会話は止めるだけで、空にしません。
61
+ 3. 同じprojectに、新しいClaudeの会話を裏で立てます(`claude --bg`)。モデル・推論強度・権限は旧い会話から引き継ぎます。
62
+ 4. 新しい会話へ継続の指示を1通送ります。届いた時に、止めた時点の依頼、そのターンでここまでにしたこと(発言と道具の呼び出し)、実行されなかった道具、直近の会話の原文を注入します(上限9,500字)。止めたターンの道具の入出力は、後継が`throughline detail`で取り出せます。
62
63
 
63
- 手動`/compact`は対象に含めません。圧縮をまたいだターンは、元の依頼と最終回答の1ターンとして保存します(0.12.9以前は、圧縮の要約をユーザー発言として保存していました)。
64
+ 続きは裏の会話で動きます。`claude agents`の一覧と`claude attach <id>`で見られます。Claude Desktopの画面には出ず、後継のターンが終わって入力待ちになった後にDesktopで開けます。手動`/compact`、subagentの中の圧縮、`claude -p`などscriptから起動した会話は対象に含めません。
64
65
 
65
- LinuxのClaude Code 2.1.289(`claude -p`と対話画面)で実機確認済みです。macOS・Windows、VS Code拡張・Desktop、subagentの中の圧縮は未検証です。[実測と検証範囲](https://github.com/kitepon/Throughline/blob/main/evidence/2026-10-04-claude-compact-continuation.md)を参照してください。
66
+ ```bash
67
+ throughline auto-handoff status --host claude --operation <handoff-id> --json
68
+ ```
69
+
70
+ 後継の立ち上げや配送に失敗した時は、固定の理由を記録して止まります。結果が不明な指示は再送しません。圧縮を止めた後にモデルが道具を呼ばずにターンを終えた時は、後継を立てません。印は残るので、1時間以内に開いた新しい会話が記憶を引き継ぎます。
71
+
72
+ 有効にした端末では、Claudeの道具の呼び出しのたびに`PreToolUse`フックが1回走ります。LinuxとmacOSのClaude Code(2.1.289、Claude Desktop同梱の2.1.286)で実機確認済みです。Windowsと、Claude Desktopの画面から始めた会話は未検証です。[実測と検証範囲](https://github.com/kitepon/Throughline/blob/main/evidence/2026-10-05-claude-auto-handoff.md)を参照してください。
66
73
 
67
74
  ## 所有境界
68
75
 
package/README.md CHANGED
@@ -51,17 +51,24 @@ throughline auto-handoff status --host claude --json
51
51
  throughline auto-handoff disable --host claude
52
52
  ```
53
53
 
54
- 既定では無効です。`--project`を省略すると全projectを対象にします。Codexの設定とは別で、互いに影響しません。
54
+ 既定では無効です。`enable`は必要な`PreCompact`と`PreToolUse`のフックを登録し、`disable`が外します。`--project`を省略すると全projectを対象にします。Codexの設定とは別で、互いに影響しません。
55
55
 
56
- Claude Codeは、自動圧縮の前にhookから作業を止めることも、新しい会話へ指示を送ることもできません。自動圧縮の後は、同じ会話で作業をそのまま続けます。Throughlineは会話を切り替えず、圧縮の直後に、圧縮前の記録を同じ会話へ注入します([ADR 0032](docs/adr/0032-claude-compact-continuation.md))。
56
+ 自動圧縮を置き換えます。圧縮が走る前に旧い会話を止め、記憶を持った新しい会話で作業を続けます([ADR 0033](docs/adr/0033-claude-auto-handoff-new-session.md))。
57
57
 
58
- - `PreCompact`フックが、自動圧縮の時だけ印を残します。圧縮は止めません。
59
- - 圧縮直後の`SessionStart`(`source: "compact"`)フックが、作業途中のユーザー依頼と圧縮直前の発言、直近の会話の原文を注入します。上限は9,500字で、入り切らない古いターンは`throughline recall`の案内になります。
60
- - モデルは追加の入力なしで作業を続けます。圧縮の要約と記録が食い違う時は、記録を正とするよう指示します。
58
+ 1. 自動圧縮の直前に、圧縮を止めます。`/tl`と同じ印を残します。
59
+ 2. 旧い会話の次の道具を、実行させずに止めます。旧い会話は止めるだけで、空にしません。
60
+ 3. 同じprojectに、新しいClaudeの会話を裏で立てます(`claude --bg`)。モデル・推論強度・権限は旧い会話から引き継ぎます。
61
+ 4. 新しい会話へ継続の指示を1通送ります。届いた時に、止めた時点の依頼、そのターンでここまでにしたこと(発言と道具の呼び出し)、実行されなかった道具、直近の会話の原文を注入します(上限9,500字)。止めたターンの道具の入出力は、後継が`throughline detail`で取り出せます。
61
62
 
62
- 手動`/compact`は対象に含めません。圧縮をまたいだターンは、元の依頼と最終回答の1ターンとして保存します(0.12.9以前は、圧縮の要約をユーザー発言として保存していました)。
63
+ 続きは裏の会話で動きます。`claude agents`の一覧と`claude attach <id>`で見られます。Claude Desktopの画面には出ず、後継のターンが終わって入力待ちになった後にDesktopで開けます。手動`/compact`、subagentの中の圧縮、`claude -p`などscriptから起動した会話は対象に含めません。
63
64
 
64
- LinuxのClaude Code 2.1.289(`claude -p`と対話画面)で実機確認済みです。macOS・Windows、VS Code拡張・Desktop、subagentの中の圧縮は未検証です。[実測と検証範囲](https://github.com/kitepon/Throughline/blob/main/evidence/2026-10-04-claude-compact-continuation.md)を参照してください。
65
+ ```bash
66
+ throughline auto-handoff status --host claude --operation <handoff-id> --json
67
+ ```
68
+
69
+ 後継の立ち上げや配送に失敗した時は、固定の理由を記録して止まります。結果が不明な指示は再送しません。圧縮を止めた後にモデルが道具を呼ばずにターンを終えた時は、後継を立てません。印は残るので、1時間以内に開いた新しい会話が記憶を引き継ぎます。
70
+
71
+ 有効にした端末では、Claudeの道具の呼び出しのたびに`PreToolUse`フックが1回走ります。LinuxとmacOSのClaude Code(2.1.289、Claude Desktop同梱の2.1.286)で実機確認済みです。Windowsと、Claude Desktopの画面から始めた会話は未検証です。[実測と検証範囲](https://github.com/kitepon/Throughline/blob/main/evidence/2026-10-05-claude-auto-handoff.md)を参照してください。
65
72
 
66
73
  ## Ownership boundary
67
74
 
@@ -8,7 +8,8 @@
8
8
  * throughline uninstall # hook を削除
9
9
  * throughline process-turn # Stop hook (Claude Code から呼ばれる)
10
10
  * throughline session-start # SessionStart hook (Claude Code から呼ばれる)
11
- * throughline pre-compact # PreCompact hook (Claude Code から呼ばれる。自動継続の印)
11
+ * throughline pre-compact # PreCompact hook (Claude Code から呼ばれる。自動継続: 自動圧縮を止める)
12
+ * throughline pre-tool-use # PreToolUse hook (Claude Code から呼ばれる。自動継続: 旧い会話を止める)
12
13
  * throughline detail <時刻> # L2+L3 詳細取得 (Claude が Bash 経由で呼ぶ想定)
13
14
  * throughline recall --l2|--l1 # 注入案内から辿る pull 用 read-only 記憶取得
14
15
  * throughline handoff-preview # Codex-facing throughline_handoff JSON preview
@@ -84,6 +85,9 @@ switch (cmd) {
84
85
  case 'pre-compact':
85
86
  await (await import('../src/claude-pre-compact.mjs')).run();
86
87
  break;
88
+ case 'pre-tool-use':
89
+ await (await import('../src/claude-pre-tool-use.mjs')).run();
90
+ break;
87
91
  case 'monitor':
88
92
  (await import('../src/token-monitor.mjs')).main();
89
93
  break;
@@ -238,6 +242,7 @@ switch (cmd) {
238
242
  'prompt-submit': 'HOOK_PROMPT_SUBMIT_FAILED',
239
243
  'process-turn': 'HOOK_PROCESS_TURN_FAILED',
240
244
  'pre-compact': 'HOOK_PRE_COMPACT_FAILED',
245
+ 'pre-tool-use': 'HOOK_PRE_TOOL_USE_FAILED',
241
246
  }[cmd];
242
247
  if (code) {
243
248
  const { recordRuntimeErrorBestEffort } = await import('../src/runtime-error-store.mjs');
@@ -407,8 +412,8 @@ Usage:
407
412
  throughline auto-handoff detail --operation <id> --origin <session> --turn <n>
408
413
  凍結したL2/L3を取得
409
414
  throughline auto-handoff enable|disable|status --host claude [--project <path>] [--json]
410
- Claude Codeの自動継続(自動圧縮の直後に、同じ会話へ
411
- 圧縮前の記録を注入)を有効化・無効化・確認
415
+ Claude Codeの自動継続(自動圧縮を止め、記憶を持った
416
+ 新しい会話で続ける)を有効化・無効化・確認
412
417
  throughline doctor Check environment
413
418
  throughline doctor --trim Show trim host boundary diagnostics
414
419
  throughline doctor --codex Show Codex primary diagnostics
@@ -419,7 +424,8 @@ Hook subcommands (called by Claude Code / Codex):
419
424
  throughline session-start SessionStart hook
420
425
  throughline process-turn Stop hook
421
426
  throughline prompt-submit UserPromptSubmit hook (/tl & /clear baton writer)
422
- throughline pre-compact PreCompact hook (Claude自動圧縮の印。圧縮後に記憶を注入)
427
+ throughline pre-compact PreCompact hook (Claude自動継続: 自動圧縮を止めて印を残す)
428
+ throughline pre-tool-use PreToolUse hook (Claude自動継続: 旧い会話を止めて後継を立てる)
423
429
  throughline codex-hook user-prompt-submit Codex current-session refresh prompt hook
424
430
  throughline codex-hook post-tool-use Codex current-session refresh tool-loop hook
425
431
  throughline codex-hook stop Codex Stop hook
@@ -11,7 +11,7 @@
11
11
  | `/tl` | `UserPromptSubmit` が現在の session id を baton として保存する。次の実セッションがその前任を確定的に引き継ぐ |
12
12
  | VS Code の `/clear` | 組み込みコマンドは `UserPromptSubmit` に届かない。`SessionStart source='clear'` を使う auto path が、同じ project の直近前任を凍結して引き継ぐ |
13
13
  | Claude Desktop の `/clear` | `UserPromptSubmit` に届かず、`SessionStart source='clear'` も来ないため自動継承しない。続ける場合は `/clear` の前に `/tl` を実行する |
14
- | Claude Code の自動圧縮 | 会話は切り替わらない。`auto-handoff enable --host claude` で有効にした時だけ、`PreCompact`(`trigger: auto`)が印を残し、圧縮直後の `SessionStart source='compact'` が作業途中のターンと直近の会話を同じ会話へ注入する。既定は無効。手動 `/compact` は対象外。正本は [ADR 0032](adr/0032-claude-compact-continuation.md) |
14
+ | Claude Code の自動圧縮 | `auto-handoff enable --host claude` で有効にした時だけ、`PreCompact`(`trigger: auto`)が圧縮を止めて `/tl` と同じ印を残し、`PreToolUse` が旧い会話を止める。Throughline が `claude --bg` で新しい会話を立て、継続の指示を1通送る。その指示の `UserPromptSubmit` が印を消費して記憶を注入する。既定は無効。手動 `/compact` は対象外。正本は [ADR 0033](adr/0033-claude-auto-handoff-new-session.md) |
15
15
 
16
16
  `/clear` が `UserPromptSubmit` に届かないことは、VS Code と Desktop の対照実測で
17
17
  確定している。`prompt-submit` に残る `/clear` 分岐は host が将来その文字列を渡した場合の
@@ -44,7 +44,7 @@ baton path と auto path は同じ `buildBudgetedResumeContext` を使う。注
44
44
 
45
45
  ## host 別境界
46
46
 
47
- - Claude Code: VS Code `/clear` は auto path、Desktop `/clear` は `/tl` 併用。自動圧縮は、有効にした時だけ同じ会話へ注入する(ADR 0032)。
47
+ - Claude Code: VS Code `/clear` は auto path、Desktop `/clear` は `/tl` 併用。自動圧縮は、有効にした時だけ、圧縮を止めて新しい会話へ引き継ぐ(ADR 0033)。
48
48
  - Grok: `/tl` の baton 成功後に `throughline grok-continue --session <id>` で後継席を
49
49
  起動する。`/clear` では起動しない。正本は [ADR 0021](adr/0021-grok-host-capture.md)。
50
50
  - Cursor: `/tl` は baton を残すが後継会話を自動起動しない。次の会話が baton を消費する。
@@ -28,8 +28,9 @@
28
28
  最初の成立検証はCodex Desktopで行う。OSごとの仕組みと受入条件は共通にし、
29
29
  差分は既存の `src/os/` と配送ライブラリの環境適合へ閉じ込める。
30
30
  VS Code・CLIとClaude/Grok/Cursorの対応はhostごとに同じ条件で検証する。
31
- Claude Codeは圧縮前の停止と新しい会話への配送がhookからできないため、自動圧縮の直後に同じ会話へ記憶を注入する
32
- ([ADR 0032](adr/0032-claude-compact-continuation.md))。この節の処理順と進行状態はCodexだけに適用する。
31
+ Claude Codeは同じ並び(圧縮を止める、旧い会話を止める、新しい会話を立てる、継続の指示を1通送る)を、
32
+ Claude Codeの入口(hook、`claude --bg`、会話ごとの受け口)で行う([ADR 0033](adr/0033-claude-auto-handoff-new-session.md))。
33
+ この節の処理順と進行状態の細目はCodexだけに適用する。
33
34
  一つのhostの成功で他のhostも対応済みとはしない。
34
35
 
35
36
  ### 根拠と検証範囲
@@ -2,6 +2,8 @@
2
2
 
3
3
  日付: 2026-10-04
4
4
 
5
+ 状態: **決定1〜4・6〜8(同じ会話への注入)は [ADR 0033](0033-claude-auto-handoff-new-session.md) で置き換えた。** オーナーが却下した(自動圧縮が走った時点で負け)。決定5(圧縮の要約行の扱い)は有効。以下は 0.13.0 の時点の記録として残す。
6
+
5
7
  ## Context
6
8
 
7
9
  Codex Desktop の自動継続(0.11.0)は、自動圧縮の前に旧タスクを止め、記憶を注入した新しいタスクで
@@ -0,0 +1,104 @@
1
+ # ADR 0033: Claude Code の自動継続は、自動圧縮を止めて新しい会話へ引き継ぐ
2
+
3
+ 日付: 2026-10-05
4
+
5
+ ## Context
6
+
7
+ ADR 0032(0.13.0)は、Claude Code の自動圧縮を通し、圧縮の直後に同じ会話へ記憶を注入した。
8
+ オーナーはこの方式を却下した(2026-10-04)。Throughline は自動圧縮を置き換えるもので、
9
+ 自動圧縮が走った時点で負けである。Codex の自動継続(圧縮の前に止めて、新しいタスクへ引き継ぐ)と
10
+ 同じ並びを、Claude Code でも実現する。
11
+
12
+ Codex 版の各段に当たるものを、Claude Code 2.1.289 の公式文書と実機で1段ずつ確かめた。
13
+
14
+ | Codex 版の段 | Claude Code で当たるもの | 確認 |
15
+ |---|---|---|
16
+ | 圧縮の前に旧タスクを止める | `PreCompact` の exit code 2 で圧縮を止める。`PreToolUse` が `permissionDecision: "deny"` と `continue: false` を返すと、その道具は実行されずにターンが止まる | 実機 |
17
+ | 新しいタスクを作る | `claude --bg`。指示を付けずに起動すると、指示を待つ会話が立つ(`idle — send a prompt to start`) | 実機 |
18
+ | 止めたターンを取り込んでから記憶を作る | hook で止めたターンでは Stop hook が走らない。worker が、後継を立てる前に transcript から取り込む | 実機(0.14.1) |
19
+ | 記憶を入れる | 最初の指示の `UserPromptSubmit` hook の出力。`/tl` の印(baton)の引き継ぎと同じ | 実機 |
20
+ | 「続けて」を送る | 会話ごとの受け口(inbox socket)。配送ライブラリ `aiterm-steer-delivery` 0.1.13 の `sendClaudeInbox` | 実機 |
21
+
22
+ `PreCompact` の `continue` は捨てられるので、圧縮を止める hook と作業を止める hook は別になる。
23
+ `PreToolUse` が `continue: false` だけを返すと、その道具は実行されてから止まる。`deny` を一緒に返すと実行されない。
24
+
25
+ Claude Desktop の新しい会話は、画面を開いただけでは process が起動しない(最初の指示が送られた時に起動する)。
26
+ `claude://code/new` の `q` は入力欄への事前入力で、送信しない。受け口が無いので、Desktop の下書きへは配送できない
27
+ (配送ライブラリの持ち主も確認)。後継は Throughline が起動する会話にする(オーナーの判断、2026-10-04)。
28
+
29
+ ## Decision
30
+
31
+ 1. **圧縮を止める**: `PreCompact` hook(`throughline pre-compact`、matcher 無し)が、`trigger: "auto"` で自動継続が
32
+ 有効な project の時だけ、`/tl` と同じ印(baton)と引き継ぎの記録を残し、exit code 2 で圧縮を止める。
33
+ 手動の `/compact`、無効な project、subagent の中の圧縮(payload に `agent_id`)、script から起動した会話
34
+ (`CLAUDE_CODE_ENTRYPOINT` が `sdk-` で始まる)では止めない。
35
+ 2. **旧い会話を止める**: `PreToolUse` hook(`throughline pre-tool-use`、全ての道具)が、記録のある会話の次の道具を、
36
+ 実行させずに止める。旧い会話は止めるだけで、空にしない。同じ応答に並んだ道具も全て止め、後継の立ち上げは1回だけ行う。
37
+ 記録が無い会話では、記録のファイルの有無だけを見て終わる。subagent の中の道具は止めない。
38
+ 3. **新しい会話を立てる**: 切り離した worker が、止めた時点の依頼・モデル・推論強度・権限を記録へ写し、
39
+ 同じ project で `claude --bg` を指示なしで起動する。起動時に `--model`・`--effort`・`--permission-mode` を渡し、
40
+ `--settings '{"worktree":{"bgIsolation":"none"}}'` で同じ作業ツリーを編集させる。
41
+ 依頼と直前の発言は、止めた道具の呼び出しが transcript に書かれるのを待ってから読む(hook の時点では直前の発言が
42
+ まだ書かれていないことがある)。
43
+ 後継を立てる前に、**止めたターンを DB へ取り込む**(0.14.1。Codex の自動継続と同じ)。発言は全部をつないで
44
+ bodies の本文にし、道具の入出力は transcript の末尾(止めた道具の呼び出し)まで details に入れる。
45
+ 完了したターンは最後の本文だけを残すが、止めたターンには結論の発言が無いので、全部を残す。
46
+ 取り込めなくても引き継ぎは止めない。理由は worker のログに残り、状態の `in_flight_captured` が `false` になる。
47
+ 4. **継続の指示を1通送る**: 後継の `SessionStart` hook が、同じ project に立ち上げ中の引き継ぎがある時だけ、
48
+ 自分の受け口(`CLAUDE_CODE_MESSAGING_SOCKET` と token)を控える。worker はそれを読んで消し、
49
+ `sendClaudeInbox` で継続の指示を1通送る。配送は公開 API だけを使い、Throughline の中に送信の実装を持たない。
50
+ 届いた時の `UserPromptSubmit` が baton を消費して前任を合流させ、記憶を注入する。
51
+ 注入は ADR 0016 と同じ予算(9,500 字)で、ヘッダに作業ディレクトリ、現在地、案内、直近の L2 の順に載せる。
52
+ 宣言文は求めない。現在地は止めたターンで、次の順に載せる(0.14.1)。
53
+ - 止めた時点の依頼(3,500 字まで)。
54
+ - このターンでここまでにしたこと。発言と道具の呼び出し(名前と対象。失敗は印を付ける)を古い順に並べる。
55
+ 新しい側から 2,400 字まで載せ、載せなかった古い側は件数にする。記録には直近 80 件までを持つ。
56
+ - 止める直前の発言(1,500 字まで)。一覧に同じ文がそのまま載っている時は重ねない。
57
+ - 止める直前に呼ぼうとして、実行されなかった道具。圧縮を止めた後の応答が呼んだ道具は、どれも実行されていない。
58
+ hook は並んで走るので、同じ応答(`message.id`)の道具をまとめて扱う。
59
+ 止めたターンは現在地にだけ載せ、L2 の一覧には重ねない。そのターンの道具の入出力は `throughline detail` で取り出せる。
60
+ 5. **受領**: 継続の指示は引き継ぎ ID を含む。後継の最初の指示がその ID を含む時だけ、受領を記録する。
61
+ `sendClaudeInbox` の結果が `accepted` なら `sent`、`not_sent` なら `failed`、`unknown` なら `unknown` にする。
62
+ 結果が不明な時は再送しない。後継が作業を進めたことまでは確かめない(オーナーの判断: 不要)。
63
+ 6. **連続の引き継ぎ**: 後継も同じ hook で止まり、次の後継へ引き継ぐ。後継の最後の user 発言は前の引き継ぎの
64
+ 継続の指示なので、現在地には前の引き継ぎが運んだ元の依頼を引き続き載せる。
65
+ 7. **道具を呼ばずに終わったターン**: 圧縮を止めた後、モデルが道具を呼ばずにターンを終えたら、Stop hook が記録を取り下げる。
66
+ 印は残るので、1時間以内に開いた新しい会話が記憶を引き継ぐ。
67
+ 8. **引き継ぎ済みの会話**: 後継を立てた会話は、その後も圧縮と道具を止め、後継を案内する。同じ会話から2つ目の後継は立てない。
68
+ 立ち上げに失敗した記録(`failed`)は、次の道具でもう一度立ち上げる。
69
+ 9. **有効化**: 既定は無効。`throughline auto-handoff enable --host claude [--project <path>]` が設定を書き、
70
+ `PreCompact` と `PreToolUse` の hook を登録する。`disable` が2つの hook を外す。`install` は登録しない
71
+ (`PreToolUse` は道具の呼び出しのたびに走るので、使わない端末に置かない)。有効な端末の `install` は2つの hook を保ち、
72
+ 無効な端末の `install` は 0.13.0 が置いた `PreCompact` を外す。
73
+ 10. **状態**: `~/.throughline/claude-auto-handoff/` のファイルに持つ。schema は変えない(v12)。記録は旧い会話の
74
+ session id を鍵にし、24時間を過ぎたものは次の引き継ぎの時に掃除する。token は記録に残さない。
75
+ 11. **失敗**: hook 自身の失敗では圧縮も道具も止めない(exit code 1)。`HOOK_PRE_COMPACT_FAILED`・`HOOK_PRE_TOOL_USE_FAILED`
76
+ (どちらも `warn`)を記録する。worker の失敗は記録の `error_code` に固定の理由で残す。
77
+ 12. ADR 0032 の決定のうち、圧縮の要約行(`isCompactSummary`)の扱い(決定5)は有効。同じ会話への注入(決定1〜4、6〜8)は
78
+ この ADR で置き換える。
79
+
80
+ ## Consequences
81
+
82
+ - 有効な project では、Claude Code の自動圧縮は走らない。旧い会話は、止めた道具の hook の文を出して止まる。
83
+ - 続きは裏の会話(agent view)で動く。`claude agents` の一覧と `claude attach <id>` で見られる。Claude Desktop の画面には
84
+ 出ず、後継のターンが終わって入力待ちになった後に Desktop で開ける。
85
+ - `PreToolUse` hook は、有効な端末の全ての Claude の会話で、道具の呼び出しのたびに1回走る。
86
+ - 止めたターンは Stop hook を通らない。worker が取り込む(0.14.1)。発言が1つも無いまま止めたターンは、
87
+ user の行と道具の入出力だけが入る。完了の受領(Stop が出すもの)は、止めたターンには出さない。
88
+ - 0.14.0 は、止めたターンについて直前の発言1つだけを後継へ渡し、道具の入出力をどこにも残さなかった。
89
+ macOS の実機で、Haiku の後継が読み終えたファイルを最初から読み直した。Codex 版は止めたターンを取り込んでから
90
+ 記憶を作っており、その段を写していなかった。
91
+ - 圧縮が「文脈上限の error から回復するため」に起きた時は、止めると元の error でその要求が失敗する(公式文書)。
92
+ この場合の後継の立ち上げは、次の道具の呼び出しまで起きない。
93
+ - 別の会話から届いた発言(`Another Claude session sent a message:`)は、Claude Code が後ろに付ける定型の注意書きを
94
+ 落として保存する。
95
+ - 依存の `aiterm-steer-delivery` を 0.1.9 から 0.1.13 に上げる。Codex の配送の入口は変わらない。
96
+
97
+ ## 確認した範囲
98
+
99
+ - Linux の Claude Code 2.1.289。対話画面の会話から始めて、Haiku 4.5 で3回、Opus 5.5 で6回、連続で引き継ぎ、
100
+ 最後の後継が作業を完了した(0.14.0)。0.14.1 でも Haiku 4.5 で確認した。
101
+ - macOS 27.0。端末の会話(2.1.289)と、Claude Desktop が同梱する本体(2.1.286)を端末から起動した会話から始めた。
102
+ 0.14.1 で、Haiku 4.5 は4回、Opus 5.5 は7回、連続で引き継いで完了した。読み直しも読み飛ばしも無い。
103
+ - どの会話にも圧縮の記録は無く、止めた道具は実行されていなかった。
104
+ - Claude Desktop の画面から始めた会話、Windows、Fable、subagent が動いている最中の引き継ぎは確かめていない。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "throughline",
3
- "version": "0.13.0",
3
+ "version": "0.14.1",
4
4
  "type": "module",
5
5
  "description": "Persistent memory hooks for Claude Code, Codex, Grok, and Cursor (/clear-safe context compression)",
6
6
  "keywords": [
@@ -55,6 +55,6 @@
55
55
  "unified": "^11.0.5"
56
56
  },
57
57
  "dependencies": {
58
- "aiterm-steer-delivery": "0.1.9"
58
+ "aiterm-steer-delivery": "0.1.13"
59
59
  }
60
60
  }
@@ -1,7 +1,7 @@
1
1
  # Claude Code: 圧縮まわりの hook(一次ソース抜粋)
2
2
 
3
3
  取得: 2026-10-04、`https://code.claude.com/docs/en/hooks.md`・`context-window.md`・`deep-links.md`・`agent-view.md`・`env-vars.md`。
4
- 実機は Claude Code 2.1.289。設計は [ADR 0032](../../../docs/adr/0032-claude-compact-continuation.md)。
4
+ 実機は Claude Code 2.1.289。設計は [ADR 0033](../../../docs/adr/0033-claude-auto-handoff-new-session.md)(0.13.0 の時点は ADR 0032)。
5
5
 
6
6
  ## PreCompact
7
7
 
@@ -33,14 +33,39 @@
33
33
 
34
34
  > | `agent_id` | Unique identifier for the subagent. Present only when the hook fires inside a subagent call. Use this to distinguish subagent hook calls from main-thread calls. |
35
35
 
36
+ ## 作業を止める(PreToolUse)
37
+
38
+ - `PreCompact` の `continue` は捨てられるので、圧縮を止めた後の作業は別の hook で止める。
39
+ - 実機: `PreToolUse` が `{"continue": false, "stopReason": "…"}` だけを返すと、その道具は実行されてからターンが止まる
40
+ (transcript に `hook_stopped_continuation`)。`hookSpecificOutput.permissionDecision: "deny"` を一緒に返すと、
41
+ 道具は実行されずに止まる。同じ応答に並んだ道具には、それぞれ hook が走る。
42
+ - hook で止めたターンでは `Stop` hook は走らない。
43
+
36
44
  ## 新しい会話を始める口
37
45
 
38
46
  > A deep link never executes anything on its own. The link only chooses a directory and fills the prompt box.
39
47
 
40
48
  > When you dispatch a background session from agent view or start one with `claude --bg`, the session starts in your working directory. Before editing files, Claude moves the session into an isolated git worktree under `.claude/worktrees/`
41
49
 
42
- - `claude-cli://open?q=…` は入力欄へ下書きを入れるだけ。`claude --bg "<prompt>"` は別の background session。
43
- - → 対話中の会話を、記憶を入れた新しい会話へ入れ替えて続けさせる公開の口は無い。
50
+ - `claude-cli://open?q=…` と Claude Desktop の `claude://code/new?q=…&folder=…` は、入力欄へ下書きを入れるだけ。
51
+ Desktop の新しい会話は、最初の指示が送られるまで process が起動しない(実機: hook も受け口も現れない)。
52
+ - `claude --bg "<prompt>"` は別の background session を立てて、すぐ戻る。指示を付けずに起動すると
53
+ `backgrounded · <id> · <name> (idle — send a prompt to start)` と出て、指示を待つ会話が立つ(実機。SessionStart は走る)。
54
+ `--model`・`--effort`・`--permission-mode`・`--name`・`--settings` を受ける。`--session-id` は無視される
55
+ (短い ID は session id の先頭8桁)。別の background session の中から起動すると、出力の ID に色の制御文字が付く。
56
+ - 動いている background session は Desktop へ移せない(`claude --desktop --resume`)。ターンが終わった後は開ける。
57
+
58
+ ## 既存の会話へ外から送る口(inbox socket)
59
+
60
+ > Read this section when a session you expect isn't in the agent list, when you want a script or hook to post into a session, or when a sandboxed command can't reach the socket.
61
+
62
+ - 会話ごとに Unix domain socket(Windows は named pipe)。path は hook と Bash へ `CLAUDE_CODE_MESSAGING_SOCKET`、
63
+ 会話ごとの token は `CLAUDE_CODE_MESSAGING_TOKEN`。起動時に `--messaging-socket-path` でも指定できる。
64
+ - 送る形は Claude Code 本体の中の例: 1行の JSON `{"type":"user","message":{"role":"user","content":"…"}}`。
65
+ 先頭に `{"type":"auth","token":"…"}`(macOS・Linux は任意、Windows は必須)。
66
+ - 実機: 入力待ちの会話へ送るとターンが始まり、`UserPromptSubmit` hook が `prompt` にその文を持って走る。
67
+ transcript では `origin: {kind: "peer"}`、本文の前後に Claude Code が送り主の行と定型の注意書きを付ける。
68
+ - 製品の配送は `aiterm-steer-delivery` 0.1.13 の `sendClaudeInbox` を使う(受領の確認は呼び出し側の観測)。
44
69
 
45
70
  ## 自動圧縮の窓
46
71
 
package/rag/INDEX.md CHANGED
@@ -29,7 +29,7 @@ rag/
29
29
 
30
30
  ## Claude自動継続の根拠
31
31
 
32
- - [圧縮まわりのhookの一次ソース抜粋](01-hooks/raw/claude-compact-hooks-extract.md) — `PreCompact`は圧縮を止められるが作業は止められない。`SessionStart(source=compact)`の出力は圧縮後の文脈へ足される。新しい会話へ指示を送る公開の口は無い。[実測](https://github.com/kitepon/Throughline/blob/main/evidence/2026-10-04-claude-compact-continuation.md)で、自動圧縮の直後に注入が届き、入力なしで作業が続いた。Finding 6・第三仮説(PreCompactでの再投影)に対する現行の答えは[ADR 0032](../docs/adr/0032-claude-compact-continuation.md)。
32
+ - [圧縮・会話の起動・受け口の一次ソース抜粋](01-hooks/raw/claude-compact-hooks-extract.md) — `PreCompact`は圧縮を止められる(exit code 2)が`continue`は捨てられる。`PreToolUse`の`deny`+`continue:false`で道具を実行させずにターンを止められる。`claude --bg`は指示なしで起動すると指示待ちの会話が立つ。会話ごとの受け口(inbox socket)へ外から1通送ると、入力待ちの会話でターンが始まる。[実測](https://github.com/kitepon/Throughline/blob/main/evidence/2026-10-05-claude-auto-handoff.md)で、対話の会話から後継へ3回連続で引き継ぎ、圧縮は1回も走らなかった。Finding 6・第三仮説(PreCompactでの再投影)に対する現行の答えは[ADR 0033](../docs/adr/0033-claude-auto-handoff-new-session.md)。
33
33
 
34
34
  ## Question this RAG was built to answer
35
35