throughline 0.16.31 → 0.16.33
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 +49 -1
- package/README.ja.md +4 -2
- package/README.md +4 -2
- package/bin/throughline.mjs +5 -0
- package/docs/adr/0063-claude-handed-off-input-is-forwarded-to-successor.md +156 -0
- package/docs/adr/0064-claude-stopped-successor-is-woken-by-human-input.md +113 -0
- package/package.json +1 -1
- package/src/claude-auto-handoff.mjs +237 -6
- package/src/claude-auto-handoff.test.mjs +41 -14
- package/src/claude-forward-wait.mjs +145 -0
- package/src/claude-forward.mjs +382 -0
- package/src/claude-forward.test.mjs +536 -0
- package/src/claude-pre-tool-use.mjs +33 -15
- package/src/cli/auto-handoff.mjs +2 -2
- package/src/cli/install.mjs +34 -16
- package/src/prompt-submit.mjs +17 -0
- package/src/resume-context.mjs +8 -2
- package/src/resume-context.test.mjs +3 -1
- package/src/runtime-error-store.mjs +6 -0
- package/src/transcript-reader.mjs +22 -2
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,52 @@ shipped to npm but were not individually tagged on GitHub.
|
|
|
10
10
|
|
|
11
11
|
## [Unreleased]
|
|
12
12
|
|
|
13
|
+
## [0.16.33] — 2026-10-14
|
|
14
|
+
|
|
15
|
+
### 追加
|
|
16
|
+
|
|
17
|
+
- **Claude Codeの自動継続で、後継の会話が止まっている時に旧い会話へ人が文を打ったら、後継を起こしてその文を最初の入力として渡す**([ADR 0064](docs/adr/0064-claude-stopped-successor-is-woken-by-human-input.md))。0.16.32は、止まっている後継(`claude stop`・Claude Codeの片付け)を起こさず、入力は後継を開いて何か入力した時に届いた。
|
|
18
|
+
- 起こすのは、人が打った文の時だけ。完了通知とほかの会話からの文では起こさない(今までどおり置き場で待つ)。
|
|
19
|
+
- 起こすのは、止まっていると確かめられた時だけ。後継で待つhookが生きていない、`claude agents --json --all`の後継の項目に`pid`・`status`を持つ物が無く裏の項目の`state`が`done`か`stopped`、後継のtranscriptが在って5秒より前に書かれた、Claude Desktopへ移した後継でない、後継に引き継ぎが進んでいない、文が12,000字以下。どれか1つでも確かめられなければ、0.16.32と同じに置き場で待つ。
|
|
20
|
+
- 起こす命令は`claude --bg --resume <後継の会話ID> -- <文>`。optionは付けない(裏の会話は立てた時のoptionを持っていて、optionなしの時だけ同じ会話のまま起きる。モデル・effort・権限のmode・名前はそのまま)。文は利用者の発言として後継へ入る。旧い会話の会話ごとの環境変数は渡さない。
|
|
21
|
+
- 起こす番は1つだけ(後継の置き場の印`waking`。起こせた後も60秒残す)。その間に届いた入力は、起きた後継のhookが受け取る。
|
|
22
|
+
- 写しが立った時(確かめた後に後継が動き出した)は、写しをすぐ`claude stop`・`claude rm`で止めて消し、文は置き場へ戻す。起こす命令が失敗した時も置き場へ戻す。起きたか分からない時は入れ直さない。
|
|
23
|
+
- 旧い会話へ返す文: 起きた時は「後継の会話が止まっていたので、Throughlineが起こして、この入力を後継の最初の入力として渡しました」。起こしている所・動いていた・確かめられなかった・分からない時は、それぞれの文と後継を開く命令。
|
|
24
|
+
- 運んだ記録(`forward.jsonl`)に`woken`・`wake-skipped`・`wake-copy`・`wake-failed`・`wake-unknown`、止めた記録(`redirects.jsonl`)と判定の記録に`wake`を足した。本文は書かない。
|
|
25
|
+
- `THROUGHLINE_AUTO_HANDOFF_WAKE=off`で起こさない(0.16.32の動き)。
|
|
26
|
+
|
|
27
|
+
### 変わる動き
|
|
28
|
+
|
|
29
|
+
- 旧い会話へ人が打った文のhookが、後継が止まって見える時だけ`claude agents`と起こす命令を流す分、1〜2.5秒長くなる。
|
|
30
|
+
- 起きた後継は、Claude Codeが片付けるまで(手すきで61分)裏で動き、利用枠を使う。片付けられた後で旧い会話へ文を打つたびに、もう一度起きる。
|
|
31
|
+
- `claude rm`で一覧から消した後継と、12,000字を超える文では起こさない。
|
|
32
|
+
- 続けて打った2通めからは、起きた後継のhookの道(通知・文脈の形)で届く。その分は0.16.32と同じに、後継のモデルが従わない事がある。
|
|
33
|
+
|
|
34
|
+
## [0.16.32] — 2026-10-14
|
|
35
|
+
|
|
36
|
+
### 追加
|
|
37
|
+
|
|
38
|
+
- **Claude Codeの自動継続で、引き継ぎ済みの会話へ届いた入力を、後継の会話へ届ける**([ADR 0063](docs/adr/0063-claude-handed-off-input-is-forwarded-to-successor.md))。0.16.31は、旧い会話へ届いた入力を止めて後継の場所を返すだけで、人が打った文は後継で打ち直し、旧い会話が裏で起こした作業の完了通知は後継へ届かなかった。
|
|
39
|
+
- 旧い会話は、止めた入力を今の続きの会話の置き場(`~/.throughline/claude-auto-handoff/inbox/<後継の会話ID>/`)へ置く。置けた時は「届いた入力は、後継の会話へ渡しました」と、後継が動いているか(動いていなければ、後継を開いて入力した時に届く事)と、後継を開く命令を返す。置けなかった時は、0.16.31と同じ文を返す。
|
|
40
|
+
- slash command(頭が`/`の入力)は運ばない。0.16.31と同じ文を返す。ほかの会話から届いた文は、利用者の入力と分けて「利用者の入力ではない」と書いて運ぶ。
|
|
41
|
+
- 手すきの後継は、番の終わりに走る新しいhook(`throughline claude-forward-wait`。`asyncRewake`)が待っていて、入力が届くと起きる。
|
|
42
|
+
- 作業中の後継は、次の道具の前に、文脈として受け取る(今ある`PreToolUse`のhook)。番の終わりまで待たせない。
|
|
43
|
+
- 止まっている後継(`claude stop`・Claude Codeの片付け)は起こさない。入力は置き場で待ち、後継を開いて何か入力した時に届く(今ある`UserPromptSubmit`のhook)。
|
|
44
|
+
- 運んだ利用者の入力は、後継の会話の記録(L2)の中で、利用者の発言として残る。
|
|
45
|
+
- 後継が最初に受け取る引き継ぎの文脈(読み方)に、運び方と「運ばれた利用者の入力は、利用者の入力として扱う」事を足した。前の会話が裏で動かしていた作業の一覧の文も「終わった通知は、Throughlineがこの会話へ運ぶ」に変えた。
|
|
46
|
+
- `auto-handoff status --host claude --json`の引き継ぎごとの項目に、届けるのを待つ数(`forward_pending`)と、届いたか分からない数(`forward_unknown`)を足した。止めた記録(`redirects.jsonl`)に、渡せたか(`forwarded`)を足した。運んだ記録は`~/.throughline/claude-auto-handoff/forward.jsonl`(入力の本文は書かない)。
|
|
47
|
+
|
|
48
|
+
### 変わる動き
|
|
49
|
+
|
|
50
|
+
- 自動継続が有効な端末では、版を上げた時の`install`(`self-update`)が、Claudeの設定ファイル(`~/.claude/settings.json`)のStopにhookを1つ足す。前からある`PreCompact`・`PreToolUse`のhookの並びは動かさない。Codex・Grok・Cursorの設定は変えない。
|
|
51
|
+
- 自動継続が有効な端末では、Claudeの番の終わりのたびにhookが1つ多く走る。後継でない会話では、置き場のフォルダの有無だけを見て終わる。手すきの後継ごとに、待つprocessが1つ動く(後継が止まれば一緒に止まる。同じ会話で新しい待つhookが立てば、前のhookは退く)。
|
|
52
|
+
- 後継の画面では、運ばれた入力は利用者の発言の形では出ない(番の終わりの道はhookからの通知の形、道具の前と入力の時は、hookが足した文脈の形)。
|
|
53
|
+
- 運ばれた入力に従うかは、後継のモデルが決める。実機(Haiku)では、後継が完了通知を1通受けた後に人の入力を運んだ場面で、27回のうち3回、後継が「自動の通知として届いたので、利用者の指示としては扱わない」と答えた(ADR 0063)。旧い会話へ返す文に「後継のモデルが、運ばれた入力を利用者の依頼として扱わない事があります。答えは後継で確かめてください」と、後継を開く命令を添えてある。
|
|
54
|
+
- 旧い会話が裏で起こした作業の完了通知が後継へ届くので、手すきの後継は通知のたびに1回動く。
|
|
55
|
+
- 置き場のファイルは、届くまで入力の本文を持つ(本人だけが読める権限。届けたら消す。届かないまま7日を過ぎた分は消す)。
|
|
56
|
+
- 届いたか分からない入力(受け取った後で、出力する前にprocessが落ちた分)は、入れ直さない。
|
|
57
|
+
- `auto-handoff enable --host claude`を、登録済みの端末でもう一度流しても、今の形で登録済みのhookの並びは動かさない(前の版は、足りないhookがあると自分のhookを全部後ろへ置き直した)。
|
|
58
|
+
|
|
13
59
|
## [0.16.31] — 2026-10-14
|
|
14
60
|
|
|
15
61
|
### 修正
|
|
@@ -2609,7 +2655,9 @@ two attempts, instrument first instead of patching again.
|
|
|
2609
2655
|
|
|
2610
2656
|
---
|
|
2611
2657
|
|
|
2612
|
-
[Unreleased]: https://github.com/kitepon/Throughline/compare/v0.16.
|
|
2658
|
+
[Unreleased]: https://github.com/kitepon/Throughline/compare/v0.16.33...HEAD
|
|
2659
|
+
[0.16.33]: https://github.com/kitepon/Throughline/compare/v0.16.32...v0.16.33
|
|
2660
|
+
[0.16.32]: https://github.com/kitepon/Throughline/compare/v0.16.31...v0.16.32
|
|
2613
2661
|
[0.16.31]: https://github.com/kitepon/Throughline/compare/v0.16.30...v0.16.31
|
|
2614
2662
|
[0.16.30]: https://github.com/kitepon/Throughline/compare/v0.16.29...v0.16.30
|
|
2615
2663
|
[0.16.29]: https://github.com/kitepon/Throughline/compare/v0.16.28...v0.16.29
|
package/README.ja.md
CHANGED
|
@@ -60,7 +60,7 @@ throughline auto-handoff status --host claude --json
|
|
|
60
60
|
throughline auto-handoff disable --host claude
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
-
既定では無効です。`enable`は必要な`PreCompact
|
|
63
|
+
既定では無効です。`enable`は必要な`PreCompact`・`PreToolUse`・`Stop`のフックを登録し、`disable`が外します。`--project`を省略すると全projectを対象にします。Codexの設定とは別で、互いに影響しません。
|
|
64
64
|
|
|
65
65
|
自動圧縮を置き換えます。圧縮が走る前に旧い会話を止め、記憶を持った新しい会話で作業を続けます([ADR 0033](docs/adr/0033-claude-auto-handoff-new-session.md))。
|
|
66
66
|
|
|
@@ -77,7 +77,9 @@ throughline auto-handoff status --host claude --operation <handoff-id> --json
|
|
|
77
77
|
|
|
78
78
|
後継の立ち上げや配送に失敗した時は、固定の理由を記録して止まります。結果が不明な指示は再送しません。圧縮を止めた後にモデルが道具を呼ばずにターンを終えた時は、後継を立てません。印は残るので、1時間以内に開いた新しい会話が記憶を引き継ぎます。
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
引き継いだ後の旧い会話へ入力が届いた時は、モデルを動かさずに止めて、後継の会話へ届けます([ADR 0062](docs/adr/0062-claude-handed-off-conversation-blocks-input.md)、[ADR 0063](docs/adr/0063-claude-handed-off-input-is-forwarded-to-successor.md))。旧い会話へ打った文と、旧い会話が裏で起こした作業の完了通知が対象です。打った人には「届いた入力は、後継の会話へ渡しました」と後継を開く命令が返ります。手すきの後継はすぐ動き、作業中の後継は次の道具の前に読みます。後継が止まっている時(`claude stop`・Claude Codeの片付け)は、旧い会話へ人が打った文の時だけ、後継を起こしてその文を最初の入力として渡します([ADR 0064](docs/adr/0064-claude-stopped-successor-is-woken-by-human-input.md))。止まっていると確かめられない時と、完了通知の時は起こさず、後継を開いて何か入力した時に届きます。後継の画面では、運ばれた入力は利用者の発言の形ではなく、フックからの通知か文脈の形で出ます。届くまでの間、入力の本文は`~/.throughline/claude-auto-handoff/inbox/`に置かれます(本人だけが読める権限。届けたら消します)。
|
|
81
|
+
|
|
82
|
+
有効にした端末では、Claudeの道具の呼び出しのたびに`PreToolUse`フックが1回、番の終わりのたびに`Stop`フックが1回多く走ります(後継でない会話では、すぐ終わります)。Linux・macOS・Windowsの端末から始めた会話と、macOSのClaude Desktopの画面から始めた会話を実機確認済みです。Desktopでは、移動済みの会話の最初の後継への記憶注入と、最初からフォルダを選んだ会話の連続継承・作業完了を確認しました。[実測と検証範囲](https://github.com/kitepon/Throughline/blob/main/evidence/2026-10-05-claude-auto-handoff.md)を参照してください。
|
|
81
83
|
|
|
82
84
|
## 所有境界
|
|
83
85
|
|
package/README.md
CHANGED
|
@@ -59,7 +59,7 @@ throughline auto-handoff status --host claude --json
|
|
|
59
59
|
throughline auto-handoff disable --host claude
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
-
既定では無効です。`enable`は必要な`PreCompact
|
|
62
|
+
既定では無効です。`enable`は必要な`PreCompact`・`PreToolUse`・`Stop`のフックを登録し、`disable`が外します。`--project`を省略すると全projectを対象にします。Codexの設定とは別で、互いに影響しません。
|
|
63
63
|
|
|
64
64
|
自動圧縮を置き換えます。圧縮が走る前に旧い会話を止め、記憶を持った新しい会話で作業を続けます([ADR 0033](docs/adr/0033-claude-auto-handoff-new-session.md))。
|
|
65
65
|
|
|
@@ -84,7 +84,9 @@ throughline auto-handoff successor --host claude --thread <claude-session-id> --
|
|
|
84
84
|
|
|
85
85
|
後継の立ち上げや配送に失敗した時は、固定の理由を記録して止まります。結果が不明な指示は再送しません。圧縮を止めた後にモデルが道具を呼ばずにターンを終えた時は、後継を立てません。印は残るので、1時間以内に開いた新しい会話が記憶を引き継ぎます。
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
引き継いだ後の旧い会話へ入力が届いた時は、モデルを動かさずに止めて、後継の会話へ届けます([ADR 0062](docs/adr/0062-claude-handed-off-conversation-blocks-input.md)、[ADR 0063](docs/adr/0063-claude-handed-off-input-is-forwarded-to-successor.md))。旧い会話へ打った文と、旧い会話が裏で起こした作業の完了通知が対象です。打った人には「届いた入力は、後継の会話へ渡しました」と後継を開く命令が返ります。手すきの後継はすぐ動き、作業中の後継は次の道具の前に読みます。後継が止まっている時(`claude stop`・Claude Codeの片付け)は、旧い会話へ人が打った文の時だけ、後継を起こしてその文を最初の入力として渡します([ADR 0064](docs/adr/0064-claude-stopped-successor-is-woken-by-human-input.md))。止まっていると確かめられない時と、完了通知の時は起こさず、後継を開いて何か入力した時に届きます。後継の画面では、運ばれた入力は利用者の発言の形ではなく、フックからの通知か文脈の形で出ます。届くまでの間、入力の本文は`~/.throughline/claude-auto-handoff/inbox/`に置かれます(本人だけが読める権限。届けたら消します)。
|
|
88
|
+
|
|
89
|
+
有効にした端末では、Claudeの道具の呼び出しのたびに`PreToolUse`フックが1回、番の終わりのたびに`Stop`フックが1回多く走ります(後継でない会話では、すぐ終わります)。Linux・macOS・Windowsの端末から始めた会話と、macOSのClaude Desktopの画面から始めた会話を実機確認済みです。Desktopでは、移動済みの会話の最初の後継への記憶注入と、最初からフォルダを選んだ会話の連続継承・作業完了を確認しました。[実測と検証範囲](https://github.com/kitepon/Throughline/blob/main/evidence/2026-10-05-claude-auto-handoff.md)を参照してください。
|
|
88
90
|
|
|
89
91
|
## Ownership boundary
|
|
90
92
|
|
package/bin/throughline.mjs
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* throughline session-start # SessionStart hook (Claude Code から呼ばれる)
|
|
11
11
|
* throughline pre-compact # PreCompact hook (Claude Code から呼ばれる。自動継続: 自動圧縮を止める)
|
|
12
12
|
* throughline pre-tool-use # PreToolUse hook (Claude Code から呼ばれる。自動継続: 旧い会話を止める)
|
|
13
|
+
* throughline claude-forward-wait # Stop hook (Claude Code から呼ばれる。自動継続: 引き継ぎ前の会話へ届いた入力を後継へ届ける)
|
|
13
14
|
* throughline detail [<日付>T]<時刻> # L2+L3 詳細取得 (Claude が Bash 経由で呼ぶ想定)
|
|
14
15
|
* throughline recall --l2|--l1 # 注入案内から辿る pull 用 read-only 記憶取得
|
|
15
16
|
* throughline handoff-preview # Codex-facing throughline_handoff JSON preview
|
|
@@ -88,6 +89,9 @@ switch (cmd) {
|
|
|
88
89
|
case 'pre-tool-use':
|
|
89
90
|
await (await import('../src/claude-pre-tool-use.mjs')).run();
|
|
90
91
|
break;
|
|
92
|
+
case 'claude-forward-wait':
|
|
93
|
+
await (await import('../src/claude-forward-wait.mjs')).run();
|
|
94
|
+
break;
|
|
91
95
|
case 'monitor':
|
|
92
96
|
(await import('../src/token-monitor.mjs')).main();
|
|
93
97
|
break;
|
|
@@ -243,6 +247,7 @@ switch (cmd) {
|
|
|
243
247
|
'process-turn': 'HOOK_PROCESS_TURN_FAILED',
|
|
244
248
|
'pre-compact': 'HOOK_PRE_COMPACT_FAILED',
|
|
245
249
|
'pre-tool-use': 'HOOK_PRE_TOOL_USE_FAILED',
|
|
250
|
+
'claude-forward-wait': 'HOOK_CLAUDE_FORWARD_WAIT_FAILED',
|
|
246
251
|
}[cmd];
|
|
247
252
|
if (code) {
|
|
248
253
|
const { recordRuntimeErrorBestEffort } = await import('../src/runtime-error-store.mjs');
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# ADR 0063: 引き継ぎ済みの Claude の会話へ届いた入力は、後継の会話へ届ける
|
|
2
|
+
|
|
3
|
+
- Status: Accepted
|
|
4
|
+
- Date: 2026-10-14
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
ADR 0062 は、引き継ぎ済みの Claude の会話へ届いた入力を、モデルを動かさずに止めて、後継の場所を返す形にした。
|
|
9
|
+
止めた入力は後継へ渡らない。人が打った文は後継で打ち直しになり、旧い会話が裏で起こした作業の完了通知は、後継へ
|
|
10
|
+
届かないままになる。利用者の決め(2026-10-14)は「先に止める形を入れ、続けて、後継へ届ける形を作る」。この ADR は
|
|
11
|
+
後の分を決める。
|
|
12
|
+
|
|
13
|
+
Claude Code に、動いている別の会話へ外から文を入れる命令は無い(`claude --help` の一覧。2.1.296)。会話の受け口
|
|
14
|
+
(`messagingSocketPath`)は、権限のバイパス中の会話では、送り手を確かめられない文を利用者の承認まで止める。この止めは
|
|
15
|
+
回避しない(ADR 0033 の 4)。残る道は、後継自身の hook が文を受け取る形になる。
|
|
16
|
+
|
|
17
|
+
Claude Code 2.1.296 で、次を実機で確かめた(Linux・macOS・Windows の3つとも同じ結果。自分で立てた裏の会話、
|
|
18
|
+
Haiku。利用者の設定の hook を外し、試しの hook だけを付けた。試しの文は自分で決めた物)。
|
|
19
|
+
|
|
20
|
+
| 見た事 | 結果 |
|
|
21
|
+
|---|---|
|
|
22
|
+
| 手すきの会話。Stop の `asyncRewake: true` の hook が待っていて、後から stderr へ文を出して exit code 2 で終わる | 1 秒以内に会話が起きて、文に従った。届く行は `origin.kind: task-notification` の user 行で、`<summary>Stop hook feedback</summary>` と `<system-reminder>` に包まれる |
|
|
23
|
+
| 作業中の会話。番の途中に文を置き、番の終わりの Stop の hook がすぐ exit code 2 で終わる | 番が終わった直後に、次の番として届いた |
|
|
24
|
+
| 道具の前後。`PreToolUse`・`PostToolUse` の hook が `additionalContext` を返す | 番の途中で文脈に入り、モデルが従った(`PreToolUse` は、道具を順に出した会話で3つとも確認) |
|
|
25
|
+
| `additionalContext` の長さ | 10,000 字(UTF-16 の長さ)を超えると、頭の約 2,000 字と「全文は file にある」の案内に置き換わる。9,900 字までは、そのまま届く。日本語でも字数で決まる |
|
|
26
|
+
| Stop の hook の stderr の長さ | 23,000 字が、そのまま届いた |
|
|
27
|
+
| hook の `timeout`(秒)が切れた時 | hook は止められる(POSIX は SIGTERM)。会話は起きない。その後に文を置いても届かない |
|
|
28
|
+
| `timeout: 7200` の hook | 11 分待った後でも届けた(既定の 600 秒より長く待てる) |
|
|
29
|
+
| `claude stop` | 待っている hook も止まる |
|
|
30
|
+
| 待つ hook を持つ手すきの裏の会話を、Claude Code が片付ける時(`bg retire`) | hook が待っていても、61 分で片付けた(Linux)。hook の process は止められず、残った。片付けの後に hook が文を出して exit code 2 で終わっても、会話には何も届かなかった。hook の環境の `CLAUDE_PID` は、片付けられた会話の process の ID だった |
|
|
31
|
+
| hook が待っている間に、会話が別のきっかけ(自分の裏の作業の完了通知)で次の番へ進む | 前の hook は止められず、待ち続ける。次の番の終わりに、もう1つ hook が立つ |
|
|
32
|
+
| 前の番から待っている hook が、次の番の作業中に exit code 2 で終わる | Claude Code が文を順番待ちへ入れ(`attachment` の `queued_command`)、次の道具の合間に届けた。モデルは従った(Linux で確認) |
|
|
33
|
+
| 待つ hook を持つ会話へ `claude -p --resume` で入力する | hook が終わるまで命令が返らず、出力も出ない(hook が 20 秒で自分から終わる時は、22〜23 秒で返った)。この時の hook の環境は `CLAUDE_CODE_ENTRYPOINT=sdk-cli`(裏の会話は `cli`) |
|
|
34
|
+
|
|
35
|
+
## Decision
|
|
36
|
+
|
|
37
|
+
1. **置き場。** 後継ごとに、届けるのを待つ入力を1通1ファイルで置く
|
|
38
|
+
(`~/.throughline/claude-auto-handoff/inbox/<後継の会話 ID>/<時刻>-<連番>.json`)。中身は、届いた時刻・旧い会話の ID・
|
|
39
|
+
引き継ぎ ID・種類(`prompt` か `task-notification`)・本文。ファイルは本人だけが読める(0600)。届けたら消す。
|
|
40
|
+
2. **旧い会話の側。** ADR 0062 の止め方は変えない。止める時に、入力を今の続きの会話(後継の先まで引いた会話)の置き場へ
|
|
41
|
+
置く。置けた時は、返す文を「届いた入力は後継の会話へ渡しました」に替え、届く時機と後継を開く命令を添える。
|
|
42
|
+
後継で待つ hook の process が生きていれば「後継は動いています」、生きていなければ「後継は今、入力を待ち受けて
|
|
43
|
+
いません(止まっているか、この版より前に立った会話です)。後継を開いて何か入力した時に届きます」と書き分ける
|
|
44
|
+
(待つ hook は、置き場の印に自分の process の ID を書いている)。
|
|
45
|
+
後継の会話 ID を引けない時と、置き場へ書けなかった時は、0.16.31 と同じ文(後継で打ち直す)を返す。
|
|
46
|
+
止めた記録(`redirects.jsonl`)に、渡せたか(`forwarded`)を足す。本文は書かない。
|
|
47
|
+
- **slash command(頭が `/` の入力。`/tl`・`/clear` など)は運ばない。** その会話への命令で、後継へ文として運んでも
|
|
48
|
+
命令にならない。0.16.31 と同じ文を返す。頭が `/` で始まる普通の文(path など)も、見分けられないので運ばない。
|
|
49
|
+
- **ほかの会話から届いた文(`Another Claude session sent a message:` で始まる)は、利用者の入力と分けて運ぶ。**
|
|
50
|
+
届ける文に「ほかの Claude の会話が送った文で、利用者の入力ではない」と書く。旧い会話の受け口を通った後の文なので、
|
|
51
|
+
Claude Code が付けた注意書きは、そのまま付いて届く。
|
|
52
|
+
3. **後継の側。** 置き場の入力を、次の3か所で受け取る。先に受け取った所が届ける。
|
|
53
|
+
- **Stop の hook(新しく登録する。`throughline claude-forward-wait`、`asyncRewake: true`)。** 番の終わりに走り、置き場に
|
|
54
|
+
入力が在ればすぐ、無ければ届くまで待って、stderr へ出して exit code 2 で終わる。手すきの後継が、これで起きる。
|
|
55
|
+
- **`UserPromptSubmit`(今ある hook)。** 後継へ入力が来た時に、置き場の入力を文脈として足す。待つ hook が居ない後継
|
|
56
|
+
(期限で止められた・`claude stop` の後に開き直した・この版より前に立った)は、ここで受け取る。
|
|
57
|
+
- **`PreToolUse`(自動継続が今も登録している hook)。** 作業中の後継が、次の道具の前に、文脈として受け取る。
|
|
58
|
+
番の終わりまで待たせない。
|
|
59
|
+
4. **文脈として足す道(`UserPromptSubmit`・`PreToolUse`)は、9,000 字までの分だけを運ぶ。** 10,000 字を超えると Claude Code が
|
|
60
|
+
頭だけに切り詰めるので、収まらない入力は置き場に残し、Stop の道で届ける。Stop の道は、1通が 60,000 字を超える時だけ、
|
|
61
|
+
頭の 4,000 字と全文の file の場所を届ける。
|
|
62
|
+
5. **待つ hook が走る会話。** 自分の置き場のフォルダが在る会話だけが待つ。フォルダは、後継が継続の指示を受領した時と、
|
|
63
|
+
旧い会話が最初の入力を置いた時に出来る。フォルダが無い会話(後継でない会話。ほとんどの会話)では、hook はフォルダの
|
|
64
|
+
有無だけを見て終わる。
|
|
65
|
+
- script から起動した Claude(`CLAUDE_CODE_ENTRYPOINT` が `sdk-` で始まる。`claude -p`、Agent SDK)では待たない。
|
|
66
|
+
待つと、呼び出し元の命令が返らない。その時の入力は、`UserPromptSubmit` の道で届く。
|
|
67
|
+
- subagent の中では待たない。
|
|
68
|
+
- 待っている間に、自分の会話がさらに引き継がれて後継が立ったら、置き場に残った入力を今の続きの会話の置き場へ移して
|
|
69
|
+
終わる。旧い会話を起こさない。
|
|
70
|
+
- hook の `timeout` は 86,400 秒にする。期限が切れると、次に後継が動くまで(入力・番の終わり)届かない。
|
|
71
|
+
- 会話の process(hook の環境の `CLAUDE_PID`)が居なくなったら、受け取らずに終わる。Claude Code は、手すきの裏の会話を
|
|
72
|
+
片付ける時に、待っている hook を止めない。居ない会話へ出力すると、入力が届かないまま消える。
|
|
73
|
+
- **1つの会話で待つのは1つだけにする。** Claude Code は、会話が次の番へ進んでも前の hook を止めないので、そのままだと
|
|
74
|
+
番の終わりのたびに待つ process が1つ増える。新しい hook は置き場に自分の印(`waiter`)を書き、前の hook は印が
|
|
75
|
+
替わったのを見て退く。前の hook は、次の番が終わるまでは残る。その間に届いた入力は、前の hook が出して
|
|
76
|
+
Claude Code が道具の合間に届けるか、`PreToolUse` の道が先に受け取る。
|
|
77
|
+
6. **届いたか分からない入力は、入れ直さない。** 受け取る所は、入力のファイルを別のフォルダ(`claimed`)へ改名してから
|
|
78
|
+
出力し、出力した後で消す。改名の後で process が落ちると、その入力は届いたか分からないまま `claimed` に残る。
|
|
79
|
+
これを置き場へ戻さない(二重に届くより、1通落ちて跡が残る方を選ぶ。ADR 0039 の Codex と同じ考え)。
|
|
80
|
+
`auto-handoff status --host claude` に、届けるのを待つ数と、届いたか分からない数を出す。
|
|
81
|
+
7. **届ける文。** 頭に、Throughline が運んだ事・旧い会話の頭8字・種類ごとの数を書いた行を置く。人の入力は
|
|
82
|
+
「利用者がこの会話へ打った入力として扱う」、ほかの会話からの文は「利用者の入力ではない」、完了通知は
|
|
83
|
+
「引き継ぎ前の会話が裏で起こした作業の通知」と書く。
|
|
84
|
+
複数ある時は、届いた順に1つの文にまとめる。完了通知が続く時は、後継が動いている間に溜まった分が、次の1回で届く。
|
|
85
|
+
8. **記憶(L2)。** 運んだ人の入力は、後継の記録の中で、利用者の発言として読む。Stop の道で届いた行は、包みを外して
|
|
86
|
+
届けた文だけを残す。文脈として足した分と、前の hook が作業中に出して順番待ちから届いた分は、作業の途中で届いた入力
|
|
87
|
+
(ADR 0060)と同じに、そのターンの依頼へ足す。完了通知だけを運んだ分は、ターンの途中では足さない(ADR 0060 と同じ)。
|
|
88
|
+
入力の hook が stdout へ出した文脈は、記録では `hook_success`(`hookEvent: UserPromptSubmit`)の `content` に入る。
|
|
89
|
+
道具の前の hook が返した文脈は `hook_additional_context` に入る(実測)。
|
|
90
|
+
9. **片付け。** どの引き継ぎの記録からも後継として指されなくなった会話の置き場は、空なら消す。7日を過ぎた入力は、
|
|
91
|
+
届けずに消して、消した数を記録へ残す。
|
|
92
|
+
10. **登録。** `auto-handoff enable --host claude` が、今までの2つ(`PreCompact`・`PreToolUse`)に加えて Stop の hook を
|
|
93
|
+
登録し、`disable` が外す。有効な端末では、版を上げた時の `install` が足す(Claude の設定ファイルが1か所変わる)。
|
|
94
|
+
Codex・Grok・Cursor の設定は変えない。
|
|
95
|
+
|
|
96
|
+
## Consequences
|
|
97
|
+
|
|
98
|
+
- 旧い会話へ打った文は、打ち直さなくても後継へ届く。手すきの後継はすぐ動き、作業中の後継は次の道具の前に読む。
|
|
99
|
+
- 旧い会話が裏で起こした作業の完了通知が、後継へ届く。手すきの後継は、通知のたびに1回動く(今は同じ回数が、
|
|
100
|
+
文脈がほぼ一杯の旧い会話で止められている)。
|
|
101
|
+
- 後継の画面では、運ばれた入力は利用者の発言の形では出ない。Stop の道では hook からの通知の形、文脈の道では hook が
|
|
102
|
+
足した文脈の形になる。
|
|
103
|
+
- 運ばれた人の入力に従うかは、後継のモデルが決める。hook 経由の文は利用者の発言の形で届かないので、モデルが利用者の
|
|
104
|
+
指示として扱わない事がある(実測は下)。後継が最初に受け取る引き継ぎの文脈で、運び方を先に知らせる。旧い会話へ返す文に
|
|
105
|
+
「打ち直しは要らない」とは書かず、後継を開く命令を添える。
|
|
106
|
+
- 手すきの後継ごとに、待つ process が1つ動く(node。1 秒ごとにフォルダを見る)。後継が `claude stop` や片付けで止まれば、
|
|
107
|
+
一緒に止まる。
|
|
108
|
+
- 自動継続が有効な端末では、Claude の番の終わりのたびに hook が1つ多く走る。置き場のフォルダが無い会話では、
|
|
109
|
+
すぐ終わる。
|
|
110
|
+
- 後継が止まっている時(`claude stop`・Claude Code の片付け)は、起こさない。入力は置き場で待ち、後継を開いて
|
|
111
|
+
何か入力した時に届く。止まっている後継を自動で起こす形は、この ADR では決めない(動いている会話へ
|
|
112
|
+
`claude --bg --resume` を流すと写しが立つので、止まっている事を確かめる道を先に決める必要がある)。
|
|
113
|
+
- 置き場のファイルは、届くまで入力の本文を持つ。DB と会話の記録のほかに、本文が一時的に置かれる場所が増える。
|
|
114
|
+
- `claude -p --resume <後継>` の入力では、置き場の分は文脈として届き、待つ hook は走らない。
|
|
115
|
+
|
|
116
|
+
## 確かめた事・確かめていない事
|
|
117
|
+
|
|
118
|
+
- 確かめた事は、Context の表と、この版の試験(CHANGELOG の 0.16.32)。
|
|
119
|
+
- 直した版を、本物の Claude Code 2.1.296 の裏の会話(Haiku)へ通した。Linux・macOS・Windows の3つ。利用者の設定の hook を
|
|
120
|
+
外し、直した版を切り離した HOME で呼ぶ hook だけを付けた。旧い会話の役と後継の役を立て、引き継ぎの記録を切り離した
|
|
121
|
+
置き場へ置いた。後継の役の置き場は、最初の入力の hook で作った(本物では、継続の指示の受領が作る)。3つとも同じ結果だった。
|
|
122
|
+
|
|
123
|
+
| 見た事 | 結果 |
|
|
124
|
+
|---|---|
|
|
125
|
+
| 旧い会話が裏で起こした作業の完了通知 | 旧い会話では止まり、手すきの後継が起きて、通知の中身に答えた |
|
|
126
|
+
| 人の入力(`claude -p --resume <旧い会話>`) | 「届いた入力は、後継の会話へ渡しました」が返り、手すきの後継が起きて、入力に従った |
|
|
127
|
+
| 後継が止まっている時の人の入力 | 置き場で待った。後継を `claude -p --resume` で開いて入力すると、3〜5 秒で命令が返り、運んだ入力が文脈として届いていた |
|
|
128
|
+
| 作業中の後継への人の入力 | 次の道具の前に文脈として届き、後継はその番の答えで従った |
|
|
129
|
+
| 後継が自分の裏の作業の完了通知で次の番へ進んだ時 | 前の待つ hook は退き、待つ hook は1つだけ残った |
|
|
130
|
+
| 直した版の読み手で読んだ後継の記録 | 運んだ文が利用者の行に入り、Claude Code の通知の包みは入らない。文脈で届いた分は、作業の途中の入力として入る |
|
|
131
|
+
| 切り離した置き場の失敗の記録・届いたか分からない入力 | 無し・0 |
|
|
132
|
+
| 本物の置き場と判定の記録にある、試しの会話 | 0 |
|
|
133
|
+
|
|
134
|
+
- 運んだ人の入力に、後継のモデル(Haiku)が従ったかを、手すきの後継で数えた(3つの OS の合計)。hook 経由の文に従うかは
|
|
135
|
+
モデルが決めるので、従わない事は無くせない。従わなかった後継は「自動の通知として届いたので、利用者の指示としては
|
|
136
|
+
扱わない」と答えた。
|
|
137
|
+
|
|
138
|
+
| 場面と、運ぶ文の形 | 従った回数 |
|
|
139
|
+
|---|---|
|
|
140
|
+
| 後継の最初の番の後に、人の入力だけを運ぶ。見出しに「利用者がこの会話へ打った入力として扱ってください」と書く形 | 26 回のうち 26 回(知らせあり 13、なし 13) |
|
|
141
|
+
| 後継が完了通知を1通受けた後に、人の入力を運ぶ。同じ形。後継は、引き継ぎの文脈の知らせを受け取っていない | 21 回のうち 19 回 |
|
|
142
|
+
| 同じ場面・同じ形。後継は、引き継ぎの文脈(読み方)で運び方の知らせを受け取っている | 6 回のうち 5 回 |
|
|
143
|
+
| 同じ場面。見出しを「利用者が前の会話へ打った文です」と、出どころを述べるだけにした形。知らせなし | 18 回のうち 10 回 |
|
|
144
|
+
| 同じ場面。出どころを述べるだけの形。知らせあり | 18 回のうち 16 回 |
|
|
145
|
+
|
|
146
|
+
出どころを述べるだけの形は、知らせの無い後継で従わない回が増えたので、採らない。見出しに「利用者がこの会話へ打った
|
|
147
|
+
入力として扱ってください」と書く形にし、後継が最初に受け取る引き継ぎの文脈(読み方)でも運び方を知らせる。
|
|
148
|
+
試しの入力は「PROBE: …と答えてください」の形で、本物の作業の依頼より疑われやすい文だった。
|
|
149
|
+
- 確かめていない:
|
|
150
|
+
- 端末の画面・Claude Desktop・リモートコントロール(スマホ)で、運ばれた入力がどう見えるか。
|
|
151
|
+
- 86,400 秒の `timeout` が、そのとおりに待つか。7,200 秒の指定で 11 分より長く待てる所までを見た。
|
|
152
|
+
待つ hook が終わった理由と待った秒数を記録へ残すので、入れた後の追跡で読む。
|
|
153
|
+
- 片付けられた裏の会話の、直した版の待つ hook が、`CLAUDE_PID` を見て退く所(単体試験まで。実機は 61 分かかるので、
|
|
154
|
+
公開の後に読む)。
|
|
155
|
+
- macOS と Windows で、裏の会話が片付けられる時の hook の残り方(Linux だけで見た)。
|
|
156
|
+
- ほかの会話から届いた文(`SendMessage`)を運んだ時の、送り手の側の見え方。
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# ADR 0064: 止まっている後継の会話は、人が旧い会話へ打った文で起こして届ける
|
|
2
|
+
|
|
3
|
+
- Status: Accepted
|
|
4
|
+
- Date: 2026-10-14
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
ADR 0063 は、引き継ぎ済みの Claude の会話へ届いた入力を、後継の会話へ届ける形にした。後継が止まっている時
|
|
9
|
+
(`claude stop`、Claude Code が手すきの裏の会話を 61 分で片付けた時)は起こさず、入力は置き場で待ち、後継を開いて何か
|
|
10
|
+
入力した時に届く。後継が片付けられた後で旧い会話へ打った文は、利用者が後継を開くまで届かない。
|
|
11
|
+
|
|
12
|
+
利用者の決め(2026-10-14、「止まっている後継の会話へ届いた入力を、どう扱うか」)は「人が打った文の時だけ、止まっている
|
|
13
|
+
後継を自動で起こして届ける。完了通知では起こさない」。その時に示した条件は「動いている会話へ起こす命令を流すと写しが
|
|
14
|
+
立つので、止まっている事を確かめる道を 3 つの OS で確かめてから出す」。
|
|
15
|
+
|
|
16
|
+
Claude Code 2.1.296 で、次を実機で確かめた(Linux・macOS・Windows の3つとも同じ結果。自分で立てた裏の会話、Haiku。
|
|
17
|
+
利用者の設定の hook を外し、試しの hook だけを付けた。試しの文は自分で決めた物)。
|
|
18
|
+
|
|
19
|
+
| 見た事 | 結果 |
|
|
20
|
+
|---|---|
|
|
21
|
+
| `claude agents --json --all` の項目(手すきで動いている裏の会話) | `state: done`・`status: idle`・`pid` がある |
|
|
22
|
+
| 同(作業中) | `state: working`・`status: busy`・`pid` がある |
|
|
23
|
+
| 同(手すきの時に `claude stop` で止めた) | `state: done`。`status` と `pid` の鍵が無い |
|
|
24
|
+
| 同(作業の途中で `claude stop` で止めた) | `state: stopped`。`status` と `pid` の鍵が無い |
|
|
25
|
+
| 同(Claude Code が 61 分で片付けた) | `state: done`。`pid` の鍵が無い(Linux。macOS・Windows は公開の後に読む) |
|
|
26
|
+
| 同(コンテナごと止められた) | `state: done`。`status` と `pid` の鍵が無い(Linux) |
|
|
27
|
+
| 同(`claude rm` で消した) | 一覧に出ない。transcript は残る。立てた時の option の控え(`~/.claude/jobs/<頭8字>/state.json`)は消える |
|
|
28
|
+
| 同(止めた裏の会話を、端末の `claude --resume` で開いている・`claude -p --resume` が走っている) | 裏の項目(`pid` なし)とは別に、同じ会話 ID の `kind: interactive` の項目が `pid`・`status` 付きで出る |
|
|
29
|
+
| 同(無い会話 ID へ `--bg --resume` を流した直後) | その ID で新しい会話が立ち、8 秒後も `state: working` で `pid` がまだ無い |
|
|
30
|
+
| 止めた会話へ `claude --bg --resume <ID> "<文>"`(option なし) | 同じ会話 ID のまま起き、文が `origin.kind: human` の利用者の行として入り、モデルが答えた。出力は `note: woke session <頭8字> with its saved options (--name, --permission-mode, --model, …)`。モデル・権限の mode・名前は、立てた時の物のまま。0.6〜1.1 秒で返る |
|
|
31
|
+
| 同(option を付けて流す) | 止めた会話でも写しが立つ。出力は `the flags you passed started a copy as <頭8字>. Without flags, the same command continues <頭8字> itself.` |
|
|
32
|
+
| 動いている会話(手すき・作業中・端末で開いている・`claude -p --resume` が走っている)へ option なしで流す | 写しが立ち、写しが文に答えた。出力は `started a copy as <頭8字>`(`is already running in the background` か `is open in another Claude Code process`)。元の会話は変わらない |
|
|
33
|
+
| 止めた会話へ、起こす命令を同時に2つ流す | 2つとも「起こした」と返ったのに、利用者の行は1つだけ入った(もう1つは消えた)。fox では2つめが写しになった。1.5 秒後の3つめは写しになった |
|
|
34
|
+
| 起きた後継の最初の番 | 置き場で待っていた完了通知は、入力の hook の文脈として届いた。番の終わりに待つ hook が立った |
|
|
35
|
+
| 頭が `-` の文・改行・`"`・`%PATH%`・`$HOME`・`&`・`|`・`<>`・`^`・日本語を含む文を `--` の後に置いて流す | そのまま同じ文が届いた(Windows も) |
|
|
36
|
+
| 別のフォルダから流す | 同じ会話 ID のまま起きた |
|
|
37
|
+
| `claude rm` で消した会話へ、切り離す option を付けて流す | 同じ会話 ID で起きたが、名前は新しく付き直した |
|
|
38
|
+
|
|
39
|
+
## Decision
|
|
40
|
+
|
|
41
|
+
1. **起こすのは、人が旧い会話へ打った文の時だけ。** ADR 0063 で運ぶ入力のうち、種類が `prompt`(利用者の入力)の時だけ
|
|
42
|
+
起こす。完了通知(`task-notification`)とほかの会話からの文(`peer`)では起こさない(今までどおり置き場で待つ)。
|
|
43
|
+
slash command は今までどおり運ばない。
|
|
44
|
+
2. **起こすのは、止まっていると確かめられた時だけ。** 次を全部満たす時に限る。どれか1つでも確かめられなければ起こさず、
|
|
45
|
+
0.16.32 の動き(置き場で待つ)にする。
|
|
46
|
+
- 後継で待つ hook の process が生きていない(生きていれば、後継は動いている)。
|
|
47
|
+
- 引き継ぎの記録が、後継を Claude Desktop へ移した印(`desktop.state: opened`)を持っていない。
|
|
48
|
+
- 後継(今の続きの会話)に、Throughline の引き継ぎが進んでいない(予約・立ち上げ中・失敗の記録が無い)。
|
|
49
|
+
- 後継の transcript が在る(無い会話 ID へ流すと、その ID で新しい会話が立つ)。最後に書かれてから 5 秒より経っている。
|
|
50
|
+
- `claude agents --json --all` を読めて、後継の会話 ID の項目に、`pid` か `status` を持つ物が1つも無い。
|
|
51
|
+
`kind: background` の項目があり、その `state` が `done` か `stopped`。
|
|
52
|
+
- 文が 12,000 字以下で、NUL を含まない(Windows の命令行は全体で 32,767 字まで)。
|
|
53
|
+
3. **起こす命令。** `claude --bg --resume <後継の会話 ID> -- <文>` を、後継の project のフォルダで流す。option は付けない
|
|
54
|
+
(裏の会話は立てた時の option を持っていて、option なしの時だけ同じ会話のまま起きる)。文は `--` の後に置く。
|
|
55
|
+
旧い会話の会話ごとの環境変数(`CLAUDECODE`・`CLAUDE_CODE_ENTRYPOINT`・`CLAUDE_CODE_SESSION_ID`・`CLAUDE_PID`・
|
|
56
|
+
`CLAUDE_EFFORT` など)は渡さない。旧い会話の `UserPromptSubmit` の hook の中で、その場で流す(一覧 10 秒・起こす命令
|
|
57
|
+
15 秒で打ち切る。ふだんは合わせて 1〜2.5 秒)。結果が分かってから、打った人へ返す文を決める。
|
|
58
|
+
4. **起こす番は1つだけ。** 後継の置き場に印(`waking`)を排他で作れた hook だけが起こす。起こせた後も印は 60 秒残し、
|
|
59
|
+
その間に届いた入力は起こさずに置き場へ置く(起きた後継の hook が、次の道具の前か番の終わりに受け取る)。
|
|
60
|
+
5. **渡す文を二重に届けない。** 起こす命令で渡す文は、置き場の受け取り済み(`claimed`)として書いてから命令を流す。
|
|
61
|
+
起きた後継の入力の hook は、受け取り済みの文を文脈として渡さない。
|
|
62
|
+
- 起きた(出力の ID が後継の頭8字): 受け取り済みの文を消す。
|
|
63
|
+
- 写しが立った(出力に `started a copy as`、または出力の ID が後継と違う): 写しは渡した文で動き出すので、すぐ
|
|
64
|
+
`claude stop`・`claude rm` で止めて一覧から消す(写しの transcript は消さない)。文は置き場へ戻す。後継は動いているので、
|
|
65
|
+
後継の hook が受け取る。
|
|
66
|
+
- 失敗した(命令が無い・立ち上がる前に失敗した・exit code が 0 でなく ID も無い): 文を置き場へ戻す。
|
|
67
|
+
- 分からない(時間切れ・exit code 0 で ID が読めない など): 入れ直さない(ADR 0063 の 6 と同じ)。受け取り済みに残り、
|
|
68
|
+
`auto-handoff status --host claude` の届いたか分からない数に出る。
|
|
69
|
+
6. **打った人へ返す文。**
|
|
70
|
+
- 起きた: 「後継の会話が止まっていたので、Throughlineが起こして、この入力を後継の最初の入力として渡しました。後継は
|
|
71
|
+
裏で作業を続けます」と、後継を開く命令。
|
|
72
|
+
- 起こしている所だった: 「届いた入力は、後継の会話へ渡しました。後継は、先に届いた入力で起きている所です」と、従わない
|
|
73
|
+
事がある旨と、後継を開く命令。
|
|
74
|
+
- 動いていた(一覧で動いている・写しが立った・transcript が書かれたばかり): 0.16.32 の「後継は動いています」の文。
|
|
75
|
+
- 確かめられなかった・失敗した: 0.16.32 の「後継は今、入力を待ち受けていません」の文。
|
|
76
|
+
- 分からない: 「起こそうとしましたが、起きて入力を受け取ったか確かめられませんでした。二重に届かないよう、この入力は
|
|
77
|
+
入れ直していません。後継を開いて確かめてください」と、後継を開く命令。
|
|
78
|
+
7. **記録。** 運んだ記録(`forward.jsonl`)に `woken`・`wake-skipped`(理由)・`wake-copy`(写しの頭8字)・
|
|
79
|
+
`wake-failed`・`wake-unknown` を足す。止めた記録(`redirects.jsonl`)と判定の記録に、起こした結果(`wake`)を足す。
|
|
80
|
+
本文は書かない。
|
|
81
|
+
8. **止める上書き。** 環境変数 `THROUGHLINE_AUTO_HANDOFF_WAKE=off` の時は起こさない(0.16.32 の動き)。
|
|
82
|
+
|
|
83
|
+
## Consequences
|
|
84
|
+
|
|
85
|
+
- 後継が止まっている時も、旧い会話へ打った文は、打ち直さなくても後継へ届く。利用者の発言の形(`origin.kind: human` の
|
|
86
|
+
利用者の行)で届くので、ADR 0063 の「後継のモデルが、運ばれた入力を利用者の依頼として扱わない」が起きない。
|
|
87
|
+
- 起きた後継は、立てた時のモデル・effort・権限の mode・名前(・リモートコントロール)で動く。Claude Code が片付けるまで
|
|
88
|
+
(手すきで 61 分)裏で動き続け、利用枠を使う。片付けられた後で旧い会話へ文を打つたびに、もう一度起きる。
|
|
89
|
+
- 起きた後継の画面では、渡した文は利用者の発言として出る。旧い会話の画面には、止めた理由(「起こして渡しました」)と
|
|
90
|
+
元の文が出る。
|
|
91
|
+
- 旧い会話へ打った文の hook が、後継が止まって見える時だけ、`claude agents`(と起こす命令)を流す分、1〜2.5 秒長くなる。
|
|
92
|
+
- 確かめた後から起こすまでの間に後継が動き出すと、写しが立つ。写しはすぐ止めて消すが、止めるまでの約 1 秒は写しが
|
|
93
|
+
文で動く。
|
|
94
|
+
- `claude rm` で一覧から消した後継は、起こさない(立てた時の option の控えが消えていて、起こすと設定が変わる。端末で
|
|
95
|
+
開いているかも確かめられない)。0.16.32 と同じに置き場で待つ。
|
|
96
|
+
- 12,000 字を超える文は起こさずに置き場で待つ。
|
|
97
|
+
- 起こす命令を同時に2つ流さないので、続けて打った2通めからは、起きた後継の hook の道(通知・文脈の形)で届く。
|
|
98
|
+
その分は ADR 0063 と同じに、後継のモデルが従わない事がある。
|
|
99
|
+
|
|
100
|
+
## 確かめた事・確かめていない事
|
|
101
|
+
|
|
102
|
+
- 確かめた事は、Context の表と、この版の試験(CHANGELOG の 0.16.33)。
|
|
103
|
+
- 直した版を、本物の Claude Code 2.1.296 の裏の会話(Haiku)へ通した。Linux・macOS・Windows の3つ。利用者の設定の hook を
|
|
104
|
+
外し、直した版を切り離した HOME で呼ぶ hook だけを付けた(直した版が流す `claude` は、HOME を本物へ戻す shim を通した)。
|
|
105
|
+
結果は CHANGELOG と保守の記録に書く。
|
|
106
|
+
- 確かめていない:
|
|
107
|
+
- Claude Desktop の画面とリモートコントロール(スマホ)で、起きた後継がどう見えるか。リモートコントロール付きで立てた
|
|
108
|
+
後継が、起きた後もリモートコントロール付きか(立てた時の option の控えには入る)。
|
|
109
|
+
- Windows で `claude` が単体の `claude.exe` の時の、文の渡り方(確かめた fox の `claude` は npm の shim で、Throughline は
|
|
110
|
+
`claude.ps1` を PowerShell から呼ぶ。記号と改行を含む文は、この道でそのまま届いた)。
|
|
111
|
+
- 61 分で片付けられた会話へ起こす命令を流した時の動き。一覧の形は Linux で `state: done`・`pid` なし(止めた会話と同じ形)と
|
|
112
|
+
見たので、同じに起きる見込み。macOS・Windows の一覧の形も含めて、3つの OS で公開の後に読む。
|
|
113
|
+
- 本物の自動継続の後継での実地(入れた後の追跡で、`forward.jsonl` の `woken` を読む)。
|