throughline 0.10.2 → 0.10.5

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.
Files changed (68) hide show
  1. package/CHANGELOG.md +88 -27
  2. package/README.ja.md +83 -49
  3. package/README.md +106 -78
  4. package/bin/throughline.mjs +32 -13
  5. package/docs/00_overview.md +56 -42
  6. package/docs/01_l1_l2_l3_redesign.md +1 -1
  7. package/docs/02_clear_auto_handoff_plan.md +39 -333
  8. package/docs/04_public_release_plan.md +73 -190
  9. package/docs/05_codex_first_roadmap.md +4 -4
  10. package/docs/06_codex_trim_rollback_fix_plan.md +1 -1
  11. package/docs/08_codex_dual_support.md +1 -1
  12. package/docs/09_rollback_context_trim_insight.md +1 -1
  13. package/docs/12_desktop_clear_handoff_plan.md +6 -213
  14. package/docs/15_windows_ci_release_latency_plan.md +6 -87
  15. package/docs/16_readonly_handoff_context_plan.md +7 -38
  16. package/docs/adr/0005-observer-read-pagination.md +1 -1
  17. package/docs/adr/0014-two-phase-handoff-ghost-baton.md +1 -1
  18. package/docs/adr/0019-product-owned-database-migration-acceptance.md +1 -1
  19. package/docs/adr/0021-grok-host-capture.md +1 -1
  20. package/docs/adr/0022-cursor-host-capture.md +39 -0
  21. package/docs/archive/02_clear_auto_handoff_plan.md +350 -0
  22. package/docs/{03_inheritance_on_clear_only.md → archive/03_inheritance_on_clear_only.md} +22 -22
  23. package/docs/{07_codex_trim_implementation_plan.md → archive/07_codex_trim_implementation_plan.md} +8 -8
  24. package/docs/{10_transcript_injection_plan.md → archive/10_transcript_injection_plan.md} +12 -12
  25. package/docs/archive/12_desktop_clear_handoff_plan.md +218 -0
  26. package/docs/{14_observer_completed_turn_feed_plan.md → archive/14_observer_completed_turn_feed_plan.md} +7 -7
  27. package/docs/archive/15_windows_ci_release_latency_plan.md +89 -0
  28. package/docs/archive/16_readonly_handoff_context_plan.md +40 -0
  29. package/docs/archive/README.md +28 -15
  30. package/docs/archive/plan_grok-successor-launch.md +99 -0
  31. package/docs/archive/room-log_throughline_20260830-155052.md +285 -0
  32. package/docs/plan_grok-successor-launch.md +6 -97
  33. package/package.json +19 -11
  34. package/rag/INDEX.md +2 -2
  35. package/src/baton.mjs +11 -9
  36. package/src/cli/handoff-context.test.mjs +36 -0
  37. package/src/cli/help.test.mjs +5 -0
  38. package/src/cli/install.mjs +91 -0
  39. package/src/cli/install.test.mjs +57 -0
  40. package/src/cli/runtime-errors.mjs +9 -3
  41. package/src/cli/runtime-errors.test.mjs +13 -13
  42. package/src/cli/self-update.mjs +402 -0
  43. package/src/cli/self-update.test.mjs +525 -0
  44. package/src/db.mjs +1 -1
  45. package/src/docs-contract.test.mjs +153 -0
  46. package/src/hosts/claude.mjs +1 -0
  47. package/src/hosts/codex.mjs +1 -0
  48. package/src/hosts/cursor.mjs +128 -0
  49. package/src/hosts/cursor.test.mjs +104 -0
  50. package/src/hosts/grok.mjs +1 -0
  51. package/src/hosts/identity.mjs +19 -2
  52. package/src/hosts/identity.test.mjs +27 -4
  53. package/src/hosts/index.mjs +11 -2
  54. package/src/product-ci-contract.test.mjs +14 -0
  55. package/src/prompt-submit.mjs +8 -10
  56. package/src/resume-context.mjs +4 -4
  57. package/src/runtime-error-hook.test.mjs +4 -6
  58. package/src/runtime-error-store.mjs +40 -18
  59. package/src/runtime-error-store.test.mjs +53 -26
  60. package/src/session-merger.mjs +16 -7
  61. package/src/session-merger.test.mjs +27 -0
  62. package/src/session-start.mjs +24 -1
  63. package/src/spike-transcript-writer.mjs +1 -1
  64. package/src/transcript-reader-cursor.test.mjs +43 -0
  65. package/src/transcript-reader.mjs +14 -7
  66. /package/docs/{11_codex_monitor_implementation_plan.md → archive/11_codex_monitor_implementation_plan.md} +0 -0
  67. /package/docs/{13_native_factory_diagnostics_plan.md → archive/13_native_factory_diagnostics_plan.md} +0 -0
  68. /package/docs/{BUGHUB_RUNTIME_ERROR_STORE_PLAN.md → archive/BUGHUB_RUNTIME_ERROR_STORE_PLAN.md} +0 -0
@@ -0,0 +1,350 @@
1
+ # Throughline `/clear` 自動引継ぎ計画 (TODO 兼)
2
+
3
+ > **履歴:** v0.4系の実装計画と当時の検証記録。現行契約は
4
+ > [../02_clear_auto_handoff_plan.md](../02_clear_auto_handoff_plan.md) を参照する。
5
+
6
+ `/clear` をトリガーにした **自動かつ軽量な引継ぎ** を実現する計画。
7
+ 2026-05-08 セッションの議論と実機検証、外部仕様調査に基づく。
8
+ A 案 (= /clear で自動引継ぎ + /tl は逃げ道として残す + /tl-trim 廃止) **採択確定**。
9
+
10
+ > 過去の経緯 (なぜ `/tl` バトンを採用したか) は [03_inheritance_on_clear_only.md](03_inheritance_on_clear_only.md) を参照。
11
+ > 本書は **2026-05-08 時点の現状検証 + 新理想設計** を扱う。
12
+
13
+ > **2026-05-09 (v0.4.1) update**: 2 経路の優先順位を **入れ替えた**。
14
+ > baton path が **primary**、auto path は **fallback**。理由: typed `/clear`
15
+ > は UserPromptSubmit に届くので baton 書き込みで確定的に当該セッションを
16
+ > 指名できる。一方 VSCode 拡張のメニュー由来 `/clear` は UserPromptSubmit
17
+ > に届かない (= `findLatestClaudePredecessor` heuristic が誤った前任を選ぶ
18
+ > リスクあり) ため、auto path を残してフォールバック化した。typed `/clear`
19
+ > も UserPromptSubmit hook で baton を書く ([src/prompt-submit.mjs](../../src/prompt-submit.mjs))。
20
+ > `THROUGHLINE_DISABLE_AUTO_HANDOFF=1` は **fallback path のみに作用** する
21
+ > ようになった (typed `/clear` / `/tl` には効かない)。
22
+
23
+ > **2026-08-17 (ADR 0021 / v0.10.0)**: 本書は Claude `/clear`・`/tl` の現行仕様である。
24
+ > Grok は UserPromptSubmit stdout をモデルへ渡さない。Grok `/tl` の記憶再開は
25
+ > `throughline grok-continue` であり、本書の「次セッション初回プロンプトで注入」を
26
+ > Grok に適用しない。正本は [ADR 0021](../adr/0021-grok-host-capture.md) と
27
+ > [plan_grok-successor-launch.md](plan_grok-successor-launch.md)。
28
+
29
+ > **2026-07-18 (ADR 0016) update**: 注入の中身を push/pull 二段に再設計した。
30
+ > push (9,500 字) はヘッダ + 現在地アンカー + 案内セクション + **L2 をターン原子で
31
+ > 入るだけ全文**(L1 は注入しない)。窓 20 ターンの残りは `throughline recall --l2`、
32
+ > それより古い全ターンは `recall --l1`(要約 or 未要約明示)で pull する。範囲・境界
33
+ > (ISO ms)・件数・session は注入時に案内コマンドへ焼き込み、recall 側は窓を再計算
34
+ > しない。正典は [ADR 0016](../adr/0016-push-pull-recall-injection.md)。本書内の
35
+ > 「L1 + L2 を注入する」旧記述はこの update で読み替えること。
36
+
37
+ ---
38
+
39
+ ## 1. 確定した事実 (実機検証済み)
40
+
41
+ ### 1.1 `/clear` 後の SessionStart `source` は 2.1.128 で reliable
42
+
43
+ ```
44
+ inheritance-decision.log (2026-05-08 12:26 検証)
45
+ 12:26:08.481Z source="startup" session=05735717 ← 新 chat 開始
46
+ 12:26:52.257Z source="clear" session=b2addc4a ← /clear 後
47
+ ```
48
+
49
+ - Claude Code `2.1.128` (VSCode native extension, Linux/WSL2) で `/clear` 後の SessionStart は **確実に `source='clear'`** を payload に乗せる
50
+ - 過去の [GitHub issue #49937](https://github.com/anthropics/claude-code/issues/49937) (= VSCode 拡張で /clear 後も `source='startup'` になっていたバグ) は **解決済み**
51
+ - v2.1.105 (VSCode `/clear` not clearing conversation context fix) と v2.1.126 (Windows SessionStart hook env files apply) のリリースで段階的に修正された
52
+
53
+ ### 1.2 SessionStart `source` の 4 値 (公式 docs)
54
+
55
+ | 値 | 意味 |
56
+ |---|---|
57
+ | `startup` | 新 chat / VSCode 再起動 / 別 project / cold start |
58
+ | `resume` | `--resume` / `--continue` / `/resume` |
59
+ | `clear` | `/clear` 直後 |
60
+ | `compact` | 自動 / 手動 compaction 直後 |
61
+
62
+ source: [code.claude.com/docs/en/hooks](https://code.claude.com/docs/en/hooks)
63
+
64
+ ### 1.3 `/clear` 等価の user-defined slash command は **作れない**
65
+
66
+ 調査結果 (claude-code-guide Agent + bundled `claude-code` 検査):
67
+
68
+ - `.claude/commands/*.md` (skill markdown) は **prompt 拡張**であり、built-in `/clear` を programmatic に invoke できない
69
+ - "subcommand" や "exec built-in" 構文は無い
70
+ - `/clear` には built-in alias が存在しない
71
+ - CLI flag `claude clear` も無い
72
+ - cross-platform で「新ウィンドウ起動」する built-in も無い (`/branch` は full history copy で軽量化と矛盾、VSCode URL scheme は VSCode 専用)
73
+
74
+ → **「引継ぎたい /clear」と「reset したい /clear」を `source` 値で区別する手段は無い**
75
+
76
+ ### 1.4 `/rewind` は fork 動作 (caveat 記録済み)
77
+
78
+ - `/rewind` Continue 確認画面に "A new forked conversation will be created after rewinding" と明示
79
+ - 同 thread 内 rollback ではなく、新 fork session id を生成
80
+ - 詳細は caveat `claude-code/claude-code-rewind-fork-conversation-rollback-primitive` を参照
81
+ - 本計画では `/rewind` は **対象外**
82
+
83
+ ---
84
+
85
+ ## 2. 採用する理想設計
86
+
87
+ ### 2.1 引継ぎ発火条件 (2 経路 × 二相、ADR 0014 で二相化)
88
+
89
+ | 経路 | 条件 | 起動 |
90
+ |---|---|---|
91
+ | **baton path (primary)** | `handoff_batons` テーブルに「セッション誕生時刻基準で TTL (1 時間) 内」の baton あり (= ユーザーが `/tl` または `/clear` を打った) | `source` 値関係なく確定的に引継ぎ |
92
+ | **auto path (fallback)** | baton 不在 + `source='clear'` + env `THROUGHLINE_DISABLE_AUTO_HANDOFF` が `'1'` でない | SessionStart 時点で凍結した前任 (transcript 実在フィルタ付き heuristic) へ引継ぎ |
93
+
94
+ **二相化の理由 (ADR 0014)**: Claude Code は同一 project に短時間で複数の SessionStart を
95
+ 発火させることがあり、一部は transcript を生成しない幽霊になる。SessionStart 時点では
96
+ 実体と幽霊を判別できない (本物の transcript も hook より数百 ms 遅れて作られる) ため、
97
+ merge・注入は「実体の証明」= 最初の UserPromptSubmit まで遅延する。
98
+ 2026-07-17 に幽霊がバトンを先取りして実セッションが記憶ゼロで始まる incident が
99
+ 同日 2 回発生した (詳細・実測は [ADR 0014](../adr/0014-two-phase-handoff-ghost-baton.md))。
100
+
101
+ 判定ロジック (擬似コード):
102
+
103
+ ```
104
+ on UserPromptSubmit(prompt, session_id, project_path):
105
+ // ---- 第二相: 初回プロンプト = 実体の証明 ----
106
+ pending = consumePendingHandoff(session_id) // atomic、1 セッション 1 回
107
+ if pending:
108
+ baton = consumeBaton(project_path, bornAt = pending.created_at)
109
+ // age = bornAt - baton.created_at。0 ≤ age ≤ TTL のみ消費。
110
+ // age < 0 (自分の誕生後に書かれた baton) は本来の後継のため残置
111
+ if baton.sessionId:
112
+ merge + inject(budgeted_memory_from(baton.sessionId)) // baton path
113
+ elif pending.auto_predecessor_id:
114
+ merge + inject(budgeted_memory_from(pending.auto_predecessor_id)) // auto path
115
+ // ---- 従来のバトン書き込み (第二相の後) ----
116
+ if isBatonCommand(prompt) or isClearCommand(prompt):
117
+ writeBaton(project_path, session_id, now)
118
+
119
+ on SessionStart(source, session_id, project_path):
120
+ // ---- 第一相: intent 登録のみ。merge も注入もしない ----
121
+ auto_predecessor = null
122
+ if source == 'clear' and env.THROUGHLINE_DISABLE_AUTO_HANDOFF != '1':
123
+ auto_predecessor = findLatestClaudePredecessor(project_path, session_id)
124
+ // transcript 実在フィルタ付き: 幽霊 twin (transcript 無し) を前任に選ばない
125
+ registerPendingHandoff(session_id, project_path, source, auto_predecessor)
126
+ ```
127
+
128
+ baton 消費が auto 判定より先発なので「両方同時成立」は構造上発生しない。typed `/clear` も
129
+ UserPromptSubmit hook で baton を書くため、通常はほぼ常に baton path が走る。auto path は
130
+ VSCode 拡張のメニュー由来 `/clear` のように UserPromptSubmit に届かない経路のためのフォールバック。
131
+ 幽霊セッションはプロンプトを発火しないため第二相に到達できず、pending 行 (数百バイト) が
132
+ 無害に残るだけになる。TTL ベースの pending GC は置かない (長時間 idle 後の初回プロンプトから
133
+ 引継ぎを silent に奪う fallback になるため)。
134
+
135
+ ### 2.2 注入内容: 現在地アンカー + L1 + L2 + L3 refs (baton/auto どちらの経路でも同一)
136
+
137
+ 含める (順序):
138
+ - ヘッダ + Reading Contract framing (= Codex 側 `renderCodexRolloutMemoryPreview` の写像)
139
+ - **現在地アンカー** (v0.4.12+): 最新 user turn と最新 assistant turn の本文をヘッダ直下に再掲 (各 600 字で truncate)
140
+ - **L1 summaries** (古い turn の一行要約)
141
+ - **L2 bodies** (直近 20 turn の verbatim)
142
+ - **L3 references** (= `throughline detail <時刻>` の取り出しコマンド一覧、各 L1/L2 行末尾の inline suffix として集約)
143
+ - Continuation Instruction (= 「これは過去ログではなく現在進行中の作業」と明示)
144
+
145
+ **注入予算 (ADR 0014)**: hook stdout は約 10,000 字超で `<persisted-output>`
146
+ (ファイルパス + 先頭 2KB preview) に file 化され、モデル可視が先頭 2KB に劣化する
147
+ (実測: 9,501 字 inline 通過 / 15,286 字 file 化。v2.1.195 以降の 10k 超注入 12/12 が劣化)。
148
+ 注入は `buildBudgetedResumeContext` (上限 9,500 字) で行い、ヘッダ + アンカーは常に全文、
149
+ L1 → L2 の順に新しい側から予算まで詰める。省略行数は注入文内と decision log に明示する。
150
+
151
+ 含めない (= 削除):
152
+ - 中断直前の in-flight memo (memo セクション)
153
+ - 中断直前の thinking (extended thinking セクション)
154
+ - 既存の Claude 向け footer の冗長な使い方説明
155
+
156
+ 理由:
157
+ - L2 末尾アンカーだけだと、L2 が長いセッションで注意が前半 (= L2 内の最古ターン) に固着し、古い計画ターンを「現在の作業」と誤認するケースがあった (実観測あり)。最新ターンをヘッダ直下にも再掲して、最初に目に入る位置で文脈を固定する。
158
+ - L2 全文があれば最後の assistant turn 自体に「次に何をしようとしていたか」が含まれている。memo / thinking は redundant。
159
+
160
+ ### 2.3 `/tl` の役割: **残すが簡素化**
161
+
162
+ - `/tl` slash command 自体は **維持** (= 明示意思マーカー = baton path のトリガー)
163
+ - 簡素化:
164
+ - memo 4 項目入力要求を **削除** ([.claude/commands/tl.md](../../.claude/commands/tl.md) を「baton 立てるだけ」の最小実装に)
165
+ - `save-inflight` CLI を **削除** (memo を baton.memo_text に保存する役目だった)
166
+ - `handoff_batons.memo_text` 列を **drop** (schema v8 migration)
167
+ - `src/baton.mjs` の `updateBatonMemo` 関数を **削除** (memo_text 列が drop されるため)
168
+ - `prompt-submit.mjs` の baton 書き込み path は **維持** (`UserPromptSubmit` hook で `/tl` 検出 + writeBaton)
169
+ - v0.4.1 で `/clear` も同じ hook で baton を書くように拡張 ([src/prompt-submit.mjs](../../src/prompt-submit.mjs) `isClearCommand`)
170
+
171
+ ユーザーから見た `/tl` の使い方:
172
+ - typed `/clear` (デフォルト): `/clear` を打った時点で baton が書かれ、次セッションが確定的に引継ぐ。`/tl` を打つ必要なし
173
+ - VSCode メニュー `/clear` 経由: UserPromptSubmit に届かないので baton は書かれず、auto path (fallback) が `findLatestClaudePredecessor` で前任を選ぶ
174
+ - 非 `/clear` 境界 (新規 chat / VSCode 再起動): `/tl` で baton を立ててから新セッションを開く
175
+ - env で auto OFF: typed `/clear` / `/tl` は引き続き動く (env は fallback 専用)
176
+
177
+ ### 2.4 `/tl-trim` 廃止 (Codex 側を壊さない)
178
+
179
+ - 元機能: memo 入力 + dry-run preview 表示
180
+ - 新仕様で memo 廃止 + 軽量化方針 → 役割なし
181
+ - 削除対象:
182
+ - `.claude/commands/tl-trim.md` (deleted slash command)
183
+ - [src/cli/trim.mjs](../../src/cli/trim.mjs) の **Claude path 部分のみ** 削除 (`describeTrimHost('claude')` ブランチ、Claude 用 memory preview 経路など)
184
+ - 関連 test
185
+ - **維持** (Codex 側を壊さないため):
186
+ - [src/cli/trim.mjs](../../src/cli/trim.mjs) の Codex path (`--host codex`, `--codex-thread-id`, `--preflight`, `--execute`, etc.) はすべて維持
187
+ - [src/trim-model.mjs](../../src/trim-model.mjs) の `describeTrimHost('codex')` / `buildTrimPlan` の Codex 関連
188
+ - [src/codex-app-server.mjs](../../src/codex-app-server.mjs), [src/codex-rollout-memory.mjs](../../src/codex-rollout-memory.mjs), `codex-*` CLI 全般
189
+ - `bin/throughline.mjs` の `trim` dispatch (Codex 経路で必要)
190
+ - Codex skill ([codex/skills/throughline](../../codex/skills/throughline)) の trim 機能 (= 機能自体は無変更、SKILL.md 内の `/tl-trim` 言及があれば 4 TODO で update)
191
+
192
+ ### 2.5 `THROUGHLINE_DISABLE_AUTO_HANDOFF` env var
193
+
194
+ - 値が `'1'` のとき auto path を skip
195
+ - それ以外の値、または未設定 → auto path 有効 (= デフォルト ON)
196
+ - 判定箇所: [src/session-start.mjs](../../src/session-start.mjs)
197
+ - 設定方法: ユーザーが `.bashrc` / `.zshrc` / VSCode terminal env / `~/.claude/settings.json` の `env` セクションで設定
198
+
199
+ ### 2.6 トレードオフ (受容する)
200
+
201
+ - ⚠️ 「reset したい /clear」も auto path で引継ぎ発火する → 受容 (= 不要なら env で OFF)
202
+ - ⚠️ baton TTL は 1 時間 (= 既存仕様維持)
203
+
204
+ ---
205
+
206
+ ## 3. 確定した内部判断
207
+
208
+ ### 3.1 `/rewind` source 検証 — 不要
209
+
210
+ A 採択により本計画は `/rewind` を扱わない。`/rewind` 後の `source` 値は将来要件で再検討。
211
+
212
+ ### 3.2 `handoff_batons` テーブル — 残す + memo_text 列だけ drop
213
+
214
+ - table 自体は baton path で必要なので **維持**
215
+ - `memo_text TEXT` 列を schema v8 migration で drop
216
+ - 既存の memo データは廃棄 (受容)
217
+ - **SQLite DROP COLUMN 互換確認必須**: `ALTER TABLE ... DROP COLUMN` は SQLite 3.35.0+ で利用可。Node.js v22.5+ 同梱の SQLite バージョンで動作するか実装時に検証
218
+
219
+ ### 3.3 旧 `/tl` ユーザー移行 — `/tl` 自体は continue、memo 関連だけ breaking
220
+
221
+ - `/tl` slash command 自体は使い続けられる (簡素化されただけ)
222
+ - 廃止される機能: memo 4 項目入力、`save-inflight` CLI、`/tl-trim`
223
+ - breaking change として CHANGELOG に明示
224
+
225
+ ### 3.4 `source='compact'` 扱い — 引継ぎしない
226
+
227
+ auto-compaction は Claude Code 内部の context 圧縮で、conversation 連続性は host 側が担保している。Throughline 側で別途引継ぎを発火する必要なし。
228
+
229
+ ### 3.5 ログファイルの扱い
230
+
231
+ - `~/.throughline/logs/inflight-memo.log`: `save-inflight` CLI 削除で **新規書き込みなし**。既存ファイルは削除提案を README / CHANGELOG に書く (= 自動削除はしない、ユーザー手動)
232
+ - `~/.throughline/logs/inheritance-decision.log` 内の `baton_has_memo` フィールド: memo 廃止で意味を失うため、`logDecision()` から **削除**
233
+ - `~/.throughline/logs/baton-write.log`: 維持 (= `/tl` baton 書き込みログとして引き続き有用)
234
+
235
+ ---
236
+
237
+ ## 4. 実装 TODO (実装開始可)
238
+
239
+ 優先度順:
240
+
241
+ - [ ] **schema v8 migration** ([src/db.mjs](../../src/db.mjs)): `ALTER TABLE handoff_batons DROP COLUMN memo_text`
242
+ - SQLite 3.35.0+ サポート確認 (Node.js v22.5+ 同梱版)
243
+ - 動かない場合は `CREATE TABLE` + `INSERT SELECT` + `DROP` の rebuild migration に切り替え
244
+ - [ ] **`src/baton.mjs`**:
245
+ - `consumeBaton` 戻り値から `memoText` プロパティを削除
246
+ - `updateBatonMemo` 関数を **削除**
247
+ - `BATON_TTL_MS`, `writeBaton`, `consumeBaton` は維持
248
+ - [x] **`src/handoff-record.mjs`**: **維持** (Codex 側 codex-handoff.mjs / codex-resume / codex-handoff-smoke 等が `memory.inflightMemo` / `memory.latestThinking` を参照しているため、削除すると Codex を壊す)。Claude 側で「使わない」のは resume-context.mjs 側で実現済み
249
+ - [ ] **`src/resume-context.mjs`**: 注入テキストを新仕様に書き換え:
250
+ - memo セクション削除
251
+ - thinking セクション削除
252
+ - L3 references 一覧追加 (Codex `renderCodexRolloutMemoryPreview` 形式)
253
+ - footer 簡素化 (Continuation Instruction だけ残す)
254
+ - [ ] **`src/session-start.mjs`** を 2.1 のロジックに改修:
255
+ - `consumeBaton` 先発 → `baton.sessionId` あれば inject
256
+ - 無ければ `source==='clear'` かつ env が `'1'` でない場合に inject
257
+ - それ以外は何もしない
258
+ - `logDecision()` から `baton_has_memo` フィールド削除
259
+ - [ ] **`src/cli/save-inflight.mjs`** 削除
260
+ - [ ] **`bin/throughline.mjs`** の `save-inflight` dispatch 削除 (`trim` dispatch は **維持**)
261
+ - [ ] **`src/prompt-submit.mjs`**: 維持 (baton 書き込み + ensureMonitorTaskFile)
262
+ - [ ] **[.claude/commands/tl.md](../../.claude/commands/tl.md)**: memo 4 項目入力要求を削除、純粋に「baton 立てるだけ」の最小実装に書き換え
263
+ - [x] **`/tl-trim` 関連削除**:
264
+ - `.claude/commands/tl-trim.md` ファイル削除
265
+ - **`src/cli/trim.mjs` 自体は維持**: Codex 経路 (`--host codex`, `--preflight`, `--execute`, `--codex-app-server-bin` 等) と doctor `--trim --host claude` で使う `describeTrimHost('claude')` の dry-run 表示が依存しているため、コード削除はしない (= ユーザーが直接 `throughline trim --host claude --dry-run` を打つ余地は残す。実用は SessionStart 自動経路に置き換わる)
266
+ - [ ] **[src/cli/install.mjs](../../src/cli/install.mjs)**: Throughline 管理 slash commands の copy 対象リストから `tl-trim.md` を除外。`tl.md` は維持。`src/cli/install.test.mjs` の関連 test も update
267
+ - [ ] **[bin/throughline.mjs](../../bin/throughline.mjs) の `showHelp()` 文言 update**:
268
+ - `save-inflight` 関連 help 文言を削除
269
+ - `/tl-trim` / Claude trim 関連の help 文言を削除
270
+ - Codex trim 関連 (`trim --dry-run`, `--preflight`, `--execute --host codex` など) は **維持**
271
+ - `bin/throughline.mjs` の `save-inflight` dispatch case 削除 (上の TODO と重複するが help text だけ別作業)
272
+ - [ ] **[codex/skills/throughline/SKILL.md](../../codex/skills/throughline/SKILL.md)**: `/tl-trim` への言及があれば削除し、`throughline trim --execute --host codex` 直接呼び出しに統一。Codex 側 trim 案内自体は維持
273
+ - [ ] **[.codex-sidecar.yml](../../.codex-sidecar.yml)** 確認: `/tl-trim` / `save-inflight` 経路の参照があれば削除。無ければ no-op
274
+ - [ ] **テスト全部更新**:
275
+ - `src/baton.test.mjs` → memo 関連 test 削除、`updateBatonMemo` test 削除
276
+ - `src/session-merger.test.mjs` → source='clear' 自動経路の test 追加
277
+ - `src/resume-context.test.mjs` → memo/thinking 削除を反映
278
+ - `src/handoff-record.test.mjs` → projection 簡素化
279
+ - `src/hook-entrypoints.test.mjs` → save-inflight subprocess test ケース削除 (= 独立ファイルではなく本ファイル内の test)
280
+ - `src/turn-processor.test.mjs` → 既存維持
281
+ - `src/trim-cli.test.mjs` / `src/trim-model.test.mjs` → Claude path 関連テストのみ削除、Codex 経路テストは維持
282
+ - 新規: env var 判定 test、source='clear' auto path test
283
+ - [ ] **docs 更新**:
284
+ - [CLAUDE.md](https://github.com/kitepon/Throughline/blob/main/CLAUDE.md): 設計の核を書き換え (「`/tl` バトンのみ」→「`source='clear'` 自動 + `/tl` 逃げ道」)
285
+ - [README.md](../../README.md): 以下範囲を update:
286
+ - Quick Start: 「`/clear` で自動引継ぎ」中心に書き直し
287
+ - 「Explicit handoff via `/tl`」セクション: `save-inflight` / memo 4 項目要求の記述を削除、`/tl` は逃げ道として簡素な記述に
288
+ - Troubleshoot / How it compares 等の他セクション: `/tl-trim`, `save-inflight`, `inflight-memo.log` への言及をすべて削除
289
+ - `THROUGHLINE_DISABLE_AUTO_HANDOFF` env var 紹介を新規追加
290
+ - 既存 `inflight-memo.log` ファイルは新版で書き込み停止することを README で告知 (= 手動削除提案)
291
+ - [CHANGELOG.md](../../CHANGELOG.md): breaking change を明示 (memo 廃止、save-inflight 削除、/tl-trim 削除、`updateBatonMemo` 削除、baton_has_memo フィールド削除)
292
+ - [03_inheritance_on_clear_only.md](03_inheritance_on_clear_only.md): 「2026-04 段階の検証 → 2026-05 でバグ修正により案 A 成立、本書は履歴扱い」note 追加
293
+ - [04_public_release_plan.md](../04_public_release_plan.md): version bump + breaking change 反映
294
+ - [ ] **package.json**: **0.4.0** に bump (semver minor、pre-1.0 の breaking)
295
+ - [ ] **caveat 記録**: 「`/clear` SessionStart `source` は 2.1.128 で reliable、過去 #49937 は fix 済み」を public で記録
296
+
297
+ ---
298
+
299
+ ## 5. 削減できるコード規模 (見積もり)
300
+
301
+ 廃止対象:
302
+ - `src/cli/save-inflight.mjs` (~80 行) → 削除
303
+ - `src/cli/trim.mjs` の Claude path 部分 (~30 行) → 削除 (Codex path は維持)
304
+ - `.claude/commands/tl-trim.md` (~40 行) → 削除
305
+ - `src/baton.mjs` の `updateBatonMemo` 関数 (~10 行) → 削除
306
+ - `handoff_batons.memo_text` 列 (schema migration、コードへの影響は consumeBaton 戻り値変更のみ)
307
+ - `src/hook-entrypoints.test.mjs` 内 save-inflight test ケース (~30 行) → 削除
308
+ - `resume-context.mjs` の memo/thinking セクション (~30 行) → 削除
309
+ - `handoff-record.mjs` の memo/thinking projection (~50 行) → 削除
310
+ - [.claude/commands/tl.md](../../.claude/commands/tl.md) の memo 4 項目要求 (~20 行) → 削除
311
+
312
+ 代わりに追加:
313
+ - `session-start.mjs` の env / source 判定 (~15 行)
314
+ - `resume-context.mjs` の L3 refs framing (~30 行)
315
+
316
+ 純減 ~245 行。
317
+
318
+ ---
319
+
320
+ ## 6. Codex 側との整合 (壊さない)
321
+
322
+ Codex 側 v0.3.25 の以下は本計画で **完全に無変更**:
323
+
324
+ - `codex-capture` / `codex-summarize` / `codex-resume` (Codex primary L1/L2/L3 path)
325
+ - `codex-resume --format handoff` (新規 Codex thread 用 prompt)
326
+ - `trim --execute --host codex` / `--preflight --host codex` (app-server `thread/rollback` + `thread/inject_items`)
327
+ - Codex Stop hook 75% auto-refresh
328
+ - restore-safety / host primitive audit diagnostics
329
+ - Codex skill ([codex/skills/throughline](../../codex/skills/throughline)) の trim 機能 (= 機能自体は無変更、SKILL.md 内の `/tl-trim` 言及があれば 4 TODO で update)
330
+ - [src/codex-app-server.mjs](../../src/codex-app-server.mjs), [src/codex-rollout-memory.mjs](../../src/codex-rollout-memory.mjs)
331
+ - [src/trim-model.mjs](../../src/trim-model.mjs) の Codex 関連 (`describeTrimHost('codex')`, `buildTrimPlan` の Codex source path)
332
+
333
+ `codex-resume --memo-stdin` は引き続きユーザーが stdin で memo を流す経路。Throughline DB の baton.memo_text には依存していない (= 列削除の影響なし)。
334
+
335
+ `/tl-trim` 削除に伴って Codex 経由でも slash command としての `/tl-trim` は使えなくなる。Codex 用 trim は `throughline trim --execute --host codex` を **CLI 直接呼ぶ**運用に統一 (Codex skill SKILL.md がそれを案内する)。
336
+
337
+ ---
338
+
339
+ ## 7. 進め方
340
+
341
+ 1. **本計画 確定** (ユーザー A 採択済み、本書 update により方針固定)
342
+ 2. **実装** (上記 TODO 順)
343
+ 3. **テスト + 実機 smoke + commit**
344
+ 4. **publish** (npm 0.4.0 として release)
345
+
346
+ 実機 smoke 手順:
347
+ - 自動引継ぎ ON (デフォルト): /clear → 新セッションで curated memory 注入を確認
348
+ - 自動引継ぎ OFF: env を立てて /clear → 注入されないことを確認
349
+ - baton path: `/tl` を打って新 chat タブで開く → baton 経由で注入を確認
350
+ - Codex 側 regression: `npm test` で既存 Codex test がすべて pass することを確認、`throughline trim --execute --host codex` の CLI 動作も維持
@@ -13,7 +13,7 @@
13
13
  > メニュー由来 `/clear` のように UserPromptSubmit に届かない経路のための
14
14
  > fallback で、`THROUGHLINE_DISABLE_AUTO_HANDOFF=1` で OFF にできる (typed
15
15
  > `/clear` / `/tl` は env と無関係に引き続き発火する)。詳細は
16
- > [02_clear_auto_handoff_plan.md](02_clear_auto_handoff_plan.md)。
16
+ > [02_clear_auto_handoff_plan.md](../02_clear_auto_handoff_plan.md)。
17
17
  >
18
18
  > 本書は当時のバトン採用判断を残す履歴ドキュメント。「結局 baton primary に
19
19
  > 戻った」という結末は皮肉だが、当時の判断は VSCode 拡張側 source バグへの
@@ -29,7 +29,7 @@
29
29
  - **案 C 不成立**: SessionStart 発火時点で transcript ファイルは未作成
30
30
  - **案 D(時間差ヒューリスティック): 撤回**。誤爆の可能性を排除できず、ユーザー明示指名の方が決定論的で意図が明確
31
31
  - **採用: バトン方式(案 E)**: 旧セッションで `/tl` スラッシュコマンドを打つと UserPromptSubmit hook が `handoff_batons` テーブルに session_id を書き込み、次の新規セッションの SessionStart が TTL 1 時間以内のバトンを消費して merge する
32
- - 実装: [src/baton.mjs](../src/baton.mjs), [src/prompt-submit.mjs](../src/prompt-submit.mjs), [src/session-start.mjs](../src/session-start.mjs), [src/session-merger.mjs](../src/session-merger.mjs) (`mergeSpecificPredecessor`), [.claude/commands/tl.md](../.claude/commands/tl.md)
32
+ - 実装: [src/baton.mjs](../../src/baton.mjs), [src/prompt-submit.mjs](../../src/prompt-submit.mjs), [src/session-start.mjs](../../src/session-start.mjs), [src/session-merger.mjs](../../src/session-merger.mjs) (`mergeSpecificPredecessor`), [.claude/commands/tl.md](../../.claude/commands/tl.md)
33
33
  - Bash tool サブプロセスには `$CLAUDE_SESSION_ID` 相当の env が無いため、session_id は UserPromptSubmit hook payload から取得する
34
34
  - **GitHub issue**: [anthropics/claude-code#49937](https://github.com/anthropics/claude-code/issues/49937) 提出済み。修正されれば source ベースに戻す余地は残る
35
35
 
@@ -44,17 +44,17 @@ Throughline の SessionStart フックは現在 **同一 project_path の未合
44
44
 
45
45
  ## Findings (2026-04-17 時点)
46
46
 
47
- ### 現行実装 (根拠: [src/session-start.mjs](../src/session-start.mjs), [src/session-merger.mjs](../src/session-merger.mjs))
47
+ ### 現行実装 (根拠: [src/session-start.mjs](../../src/session-start.mjs), [src/session-merger.mjs](../../src/session-merger.mjs))
48
48
 
49
- - [src/session-start.mjs:33](../src/session-start.mjs#L33) で payload の `source` を **読み捨てている**
50
- - [src/session-start.mjs:48-51](../src/session-start.mjs#L48-L51) で無条件に `mergePredecessorInto` を呼ぶ
51
- - [src/session-merger.mjs:68-78](../src/session-merger.mjs#L68-L78) の前任選定は「同 project_path・未合流・自分より created_at が古い・最新 updated_at」のみで、source や時間窓は見ていない
49
+ - [src/session-start.mjs:33](../../src/session-start.mjs#L33) で payload の `source` を **読み捨てている**
50
+ - [src/session-start.mjs:48-51](../../src/session-start.mjs#L48-L51) で無条件に `mergePredecessorInto` を呼ぶ
51
+ - [src/session-merger.mjs:68-78](../../src/session-merger.mjs#L68-L78) の前任選定は「同 project_path・未合流・自分より created_at が古い・最新 updated_at」のみで、source や時間窓は見ていない
52
52
 
53
53
  ### 過去ログは参考扱い
54
54
 
55
55
  - `C:\Users\kite_\.throughline\spike\session-start.log` の 93 件は Opus 4.6 以前の採取で、モデル更新(現 4.7)と Claude Code バージョン更新を跨いでいる
56
56
  - 「startup 76 / resume 16 / clear 1」の分布はあくまで参考値で、現行環境の挙動として採用しない
57
- - コメント [src/session-start.mjs:7-10](../src/session-start.mjs#L7-L10) の「/clear 後も source='startup'」も当時の観察で、現行環境で再検証する
57
+ - コメント [src/session-start.mjs:7-10](../../src/session-start.mjs#L7-L10) の「/clear 後も source='startup'」も当時の観察で、現行環境で再検証する
58
58
 
59
59
  ### 確定したい前提
60
60
 
@@ -64,7 +64,7 @@ Throughline の SessionStart フックは現在 **同一 project_path の未合
64
64
 
65
65
  ### 案 A: `source === "clear"` のみ引き継ぐ(シンプル案)
66
66
 
67
- - [src/session-start.mjs](../src/session-start.mjs) で `source !== 'clear'` なら `mergePredecessorInto` を呼ばない
67
+ - [src/session-start.mjs](../../src/session-start.mjs) で `source !== 'clear'` なら `mergePredecessorInto` を呼ばない
68
68
  - 取りこぼし(startup で来る /clear)は許容
69
69
  - ユーザー視点: 「手動新規・VSC 再起動・一部の /clear」で真に新規、それ以外は引き継ぐ
70
70
 
@@ -92,7 +92,7 @@ Throughline の SessionStart フックは現在 **同一 project_path の未合
92
92
 
93
93
  ### 手順
94
94
 
95
- 1. **debug ロガーを [src/session-start.mjs](../src/session-start.mjs) に一時挿入**
95
+ 1. **debug ロガーを [src/session-start.mjs](../../src/session-start.mjs) に一時挿入**
96
96
  - payload を受け取った直後(L32 の JSON.parse 直後)に `{ ts, source, session_id, transcript_path, cwd }` を `C:\Users\kite_\.throughline\logs\sessionstart-probe.log` に追記
97
97
  - 既存のマージ処理には触れない(挙動を変えずに観測だけする)
98
98
  - 1 行 1 JSON (JSONL) 形式で append
@@ -107,29 +107,29 @@ Throughline の SessionStart フックは現在 **同一 project_path の未合
107
107
  - ケース 1 に `startup` が混じる / ケース 2 または 3 に `clear` が混じる → 案 B に切り替えて時間差閾値を設計
108
108
 
109
109
  4. **debug ロガー撤去**
110
- - 判定後は [src/session-start.mjs](../src/session-start.mjs) から削除(commit 分離)
110
+ - 判定後は [src/session-start.mjs](../../src/session-start.mjs) から削除(commit 分離)
111
111
 
112
112
  ## 実装ステップ(案 A 前提・Phase 0 通過後に実施)
113
113
 
114
- 1. **[src/session-start.mjs](../src/session-start.mjs) 修正**
114
+ 1. **[src/session-start.mjs](../../src/session-start.mjs) 修正**
115
115
  - L33: `const { session_id, source, cwd } = payload` に変更して `source` を取得
116
116
  - L7-10 のコメントを実機ログに合わせて更新(「source='clear' のときだけ引き継ぐ。startup で来る /clear は取りこぼす」仕様を明記)
117
117
  - L48 付近: `if (source === 'clear') { mergePredecessorInto(...) }` でガード
118
- - 引き継がない場合も [src/session-start.mjs:41-45](../src/session-start.mjs#L41-L45) の sessions INSERT は従来通り実行(DB には残す)
118
+ - 引き継がない場合も [src/session-start.mjs:41-45](../../src/session-start.mjs#L41-L45) の sessions INSERT は従来通り実行(DB には残す)
119
119
 
120
- 2. **[src/session-merger.test.mjs](../src/session-merger.test.mjs) にテスト追加**
120
+ 2. **[src/session-merger.test.mjs](../../src/session-merger.test.mjs) にテスト追加**
121
121
  - `resolveMergeTarget` / `mergePredecessorInto` は現状維持(判定は session-start 側に持たせる)
122
122
  - 代わりに session-start.mjs の条件分岐をユニット化する。テストは薄めの統合で:
123
123
  - source='clear' → `mergePredecessorInto` が呼ばれ合流する
124
124
  - source='startup' → 呼ばれず前任 sessions の merged_into が NULL のまま
125
125
  - source='resume' → 同上
126
- - 既存 [src/session-merger.test.mjs:121-151](../src/session-merger.test.mjs#L121-L151) の時系列単調性テストは引き続きパスする前提
126
+ - 既存 [src/session-merger.test.mjs:121-151](../../src/session-merger.test.mjs#L121-L151) の時系列単調性テストは引き続きパスする前提
127
127
 
128
- 3. **[src/resume-context.mjs](../src/resume-context.mjs) と注入ヘッダ**
128
+ 3. **[src/resume-context.mjs](../../src/resume-context.mjs) と注入ヘッダ**
129
129
  - 注入は session-start.mjs 側の `mergeResult.merged` 分岐で既に制御されているので修正不要
130
130
  - ただし「同一 session 継続(source='resume')での注入」が必要か要検討。現状の resume フックは本計画のスコープ外として deferred(別タスクで検討)
131
131
 
132
- 4. **[docs/01_l1_l2_l3_redesign.md](01_l1_l2_l3_redesign.md) / [CLAUDE.md](../CLAUDE.md) / [README.md](../README.md) の更新**
132
+ 4. **[docs/01_l1_l2_l3_redesign.md](../01_l1_l2_l3_redesign.md) / [CLAUDE.md](https://github.com/kitepon/Throughline/blob/main/CLAUDE.md) / [README.md](../../README.md) の更新**
133
133
  - 「記憶張り替えの発火条件は SessionStart source='clear' のみ」を明記
134
134
  - CLAUDE.md 冒頭「設計の核」の「`/clear` 後も SQLite はそのまま残る。`SessionStart` フックで前任セッションの全レコードを新 session_id に張り替える」の直後に引き継ぎ条件を追記
135
135
 
@@ -154,15 +154,15 @@ Throughline の SessionStart フックは現在 **同一 project_path の未合
154
154
 
155
155
  ## 重要ファイル一覧
156
156
 
157
- - [src/session-start.mjs](../src/session-start.mjs) — 主変更箇所
158
- - [src/session-merger.mjs](../src/session-merger.mjs) — 参照のみ(現状維持)
159
- - [src/session-merger.test.mjs](../src/session-merger.test.mjs) — テスト追加
160
- - [src/resume-context.mjs](../src/resume-context.mjs) — 参照のみ
161
- - [CLAUDE.md](../CLAUDE.md) / [docs/01_l1_l2_l3_redesign.md](01_l1_l2_l3_redesign.md) / [README.md](../README.md) — ドキュメント更新
157
+ - [src/session-start.mjs](../../src/session-start.mjs) — 主変更箇所
158
+ - [src/session-merger.mjs](../../src/session-merger.mjs) — 参照のみ(現状維持)
159
+ - [src/session-merger.test.mjs](../../src/session-merger.test.mjs) — テスト追加
160
+ - [src/resume-context.mjs](../../src/resume-context.mjs) — 参照のみ
161
+ - [CLAUDE.md](https://github.com/kitepon/Throughline/blob/main/CLAUDE.md) / [docs/01_l1_l2_l3_redesign.md](../01_l1_l2_l3_redesign.md) / [README.md](../../README.md) — ドキュメント更新
162
162
 
163
163
  ## Non-Goals (本計画では扱わない)
164
164
 
165
165
  - VSC 拡張側の source 送信挙動の調査・修正(Claude Code 本体のスコープ)
166
- - 並行セッション X-1 問題の解決([docs/archive/SESSION_LINKING_DESIGN.md:194](archive/SESSION_LINKING_DESIGN.md#L194) で受容済み)
166
+ - 並行セッション X-1 問題の解決([docs/archive/SESSION_LINKING_DESIGN.md:194](SESSION_LINKING_DESIGN.md#L194) で受容済み)
167
167
  - source='startup' で来る /clear の取りこぼし対策(案 B/C は fallback として deferred)
168
168
  - token-monitor / sc-detail 系 CLI への影響調査(本計画と独立)
@@ -5,20 +5,20 @@
5
5
  ## この文書の位置づけ
6
6
 
7
7
  この文書は **これまでの統合実装計画と実装履歴** です。
8
- 2026-05-06 以降の次フェーズ実装順、TODO、進捗チェックは [05_codex_first_roadmap.md](05_codex_first_roadmap.md) を正として扱う。
8
+ 2026-05-06 以降の次フェーズ実装順、TODO、進捗チェックは [05_codex_first_roadmap.md](../05_codex_first_roadmap.md) を正として扱う。
9
9
 
10
10
  元文書:
11
11
 
12
- - [08_codex_dual_support.md](08_codex_dual_support.md)
13
- - [09_rollback_context_trim_insight.md](09_rollback_context_trim_insight.md)
12
+ - [08_codex_dual_support.md](../08_codex_dual_support.md)
13
+ - [09_rollback_context_trim_insight.md](../09_rollback_context_trim_insight.md)
14
14
 
15
15
  関係性:
16
16
 
17
17
  | 文書 | この計画での扱い |
18
18
  |---|---|
19
- | [05_codex_first_roadmap.md](05_codex_first_roadmap.md) | 2026-05-06 以降の次フェーズ計画。Codex primary 実用化を先行し、Codex Rewind 互換を完成させてから Claude 側を詰める |
20
- | [08_codex_dual_support.md](08_codex_dual_support.md) | Claude / Codex 両対応の architecture brief。主に Phase 1-5 に対応 |
21
- | [09_rollback_context_trim_insight.md](09_rollback_context_trim_insight.md) | rollback trim の design insight。主に Phase 6-8 に対応 |
19
+ | [05_codex_first_roadmap.md](../05_codex_first_roadmap.md) | 2026-05-06 以降の次フェーズ計画。Codex primary 実用化を先行し、Codex Rewind 互換を完成させてから Claude 側を詰める |
20
+ | [08_codex_dual_support.md](../08_codex_dual_support.md) | Claude / Codex 両対応の architecture brief。主に Phase 1-5 に対応 |
21
+ | [09_rollback_context_trim_insight.md](../09_rollback_context_trim_insight.md) | rollback trim の design insight。主に Phase 6-8 に対応 |
22
22
 
23
23
  この計画は両者の合流点であり、Claude contract 固定を先行させる。rollback trim は実測 spike を通るまで本線実装にしない。
24
24
 
@@ -45,7 +45,7 @@ rollback trim は最終的な理想に近いが、host primitive の実測が必
45
45
  - Claude hooks、slash command、transcript parsing、handoff baton、SessionStart resume behavior を Codex 用に置き換えない。
46
46
  - Claude-facing field / command / DB semantics を rename しない。
47
47
  - Codex 対応は adapter / projection として足す。
48
- - `thread/rollback` / `thread/inject_items` は live host primitive として実測済み。2026-05-06 incident 後に Codex guarded execute / auto-refresh は一時停止したが、2026-05-08 の controlled rollback model-visible smoke が再現しなかったため、過剰 blocker は解除済み。現在は [06_codex_trim_rollback_fix_plan.md](06_codex_trim_rollback_fix_plan.md) を優先し、DB memory を必須にする。rollout/app-server turn-count mismatch は診断と app-server count 由来の rollback `numTurns` 補正に使う。Claude `/rewind` 自動化はまだ有効化しない。
48
+ - `thread/rollback` / `thread/inject_items` は live host primitive として実測済み。2026-05-06 incident 後に Codex guarded execute / auto-refresh は一時停止したが、2026-05-08 の controlled rollback model-visible smoke が再現しなかったため、過剰 blocker は解除済み。現在は [06_codex_trim_rollback_fix_plan.md](../06_codex_trim_rollback_fix_plan.md) を優先し、DB memory を必須にする。rollout/app-server turn-count mismatch は診断と app-server count 由来の rollback `numTurns` 補正に使う。Claude `/rewind` 自動化はまだ有効化しない。
49
49
  - fallback や silent recovery で失敗を隠さない。互換モードは条件と理由を明示する。
50
50
 
51
51
  ## 運用ルール
@@ -370,7 +370,7 @@ Phase 6 result (2026-05-06):
370
370
  - `thread/rollback` は persisted thread を直接対象にすると `thread not found` を返す。`thread/resume` で loaded thread にしてから呼ぶ必要がある。
371
371
  - 検証 thread `019dfaba-f87e-7f41-a144-d5ca7c6dd7f9` で、1 turn を `thread/rollback { numTurns: 1 }` し、`thread/read includeTurns:true` が 0 turns を返すことを確認した。
372
372
  - `thread/inject_items` に raw Responses API item `{ type: "message", role: "developer", content: [{ type: "input_text", text: "..." }] }` を渡し、次の `turn/start` で injected memory が model-visible になることを確認した。marker `TL_PHASE6_INJECT_OK` を正しく返した。
373
- - その後の Codex primary 実装で、`codex-resume` が描画する active-work developer message も実 Codex host で model-visible になることを確認した。marker `TL_CODEX_VISIBLE_REAL_20260506_C` が `item/agentMessage/delta` に出た。詳細な実測値は [05_codex_first_roadmap.md](05_codex_first_roadmap.md) の Phase 3 result を正とする。
373
+ - その後の Codex primary 実装で、`codex-resume` が描画する active-work developer message も実 Codex host で model-visible になることを確認した。marker `TL_CODEX_VISIBLE_REAL_20260506_C` が `item/agentMessage/delta` に出た。詳細な実測値は [05_codex_first_roadmap.md](../05_codex_first_roadmap.md) の Phase 3 result を正とする。
374
374
  - さらに `thread/inject_items` 後にもう一度 `thread/resume` してから `turn/start` を呼ぶ smoke も追加し、実 Codex host で marker `TL_CODEX_RESUME_AFTER_INJECT_REAL_20260506` が `item/agentMessage/delta` に出ることを確認した。
375
375
  - Codex host primitive は live app-server 上では実測済み。ただし restart-safe durability は未証明。現在は明示 `--codex-thread-id` または env thread identity と Throughline DB memory が live mutation の最低条件であり、rollout/app-server turn-count mismatch は診断と rollback `numTurns` 補正に使う。durable success は別分類で扱う。2026-05-06 incident 後はいったん Codex Stop hook 後の automatic refresh mutation を blocked としたが、2026-05-08 unblock 後は guarded rollback / inject を試行する。2026-05-09 以降は Codex native auto-compact より先に Throughline refresh を走らせるため、verified usage 75% 以上を既定閾値にする。
376
376
  - Claude `/rewind conversation only` は手動 UX として扱う。外部ツールからの自動化 surface は未確認。Claude host の automatic rollback / inject は `manual-only`。
@@ -81,10 +81,10 @@ Anthropic Messages API 公式 docs ([Working with Messages](https://platform.cla
81
81
 
82
82
  本計画の transcript inject は **Claude session** (= 非 `codex:*` の session_id) の `~/.claude/projects/<proj-slug>/<session-id>.jsonl` への append のみを扱う。Codex session (`codex:<thread_id>`) は対象外。理由:
83
83
 
84
- - Codex は SessionStart hook を持たない ([src/cli/install.mjs](../src/cli/install.mjs) の Codex hook 登録は `UserPromptSubmit` / `PostToolUse` / `Stop` のみ)。よって `/clear` 後の hook タイミングで append する経路自体が存在しない
84
+ - Codex は SessionStart hook を持たない ([src/cli/install.mjs](../../src/cli/install.mjs) の Codex hook 登録は `UserPromptSubmit` / `PostToolUse` / `Stop` のみ)。よって `/clear` 後の hook タイミングで append する経路自体が存在しない
85
85
  - Codex rollout JSONL の format は Anthropic Messages API 互換ではなく `event_msg` / `function_call` 系の独自構造で、user/assistant role 復元の対象として扱えない
86
86
  - Codex の context refresh は既に `trim --execute --host codex` の rollback + memory inject 経路で別解決されている (現行 v0.4.x の仕組みを維持)
87
- - Claude predecessor lookup は元から `session_id NOT LIKE 'codex:%'` で Codex を除外しているため ([src/session-start.mjs:53-67](../src/session-start.mjs#L53-L67))、Claude session と Codex session が相互に merge されることはない
87
+ - Claude predecessor lookup は元から `session_id NOT LIKE 'codex:%'` で Codex を除外しているため ([src/session-start.mjs:53-67](../../src/session-start.mjs#L53-L67))、Claude session と Codex session が相互に merge されることはない
88
88
 
89
89
  **ドキュメント反映**: Phase 3-1 で CHANGELOG / README に「v0.5.0 の transcript inject は Claude session 限定。Codex session の引き継ぎは v0.4.x と同じ rollout-based refresh を継続」を明示する。
90
90
 
@@ -114,7 +114,7 @@ Anthropic Messages API 公式 docs ([Working with Messages](https://platform.cla
114
114
  - [ ] Phase 0-2: `/clear` 直後 SessionStart hook タイミングでの append spike (本計画の根本条件)
115
115
  - [ ] 検証用の throwaway Throughline DB session 1 件を仕込む (user turn 1 件 + assistant turn 1 件)
116
116
  - [ ] Throughline session-start.mjs に spike モードの分岐を一時追加: 「stdout 注入の代わりに transcript_path へ user/assistant turn を append する」
117
- - [ ] **spike モードの起動方法**: 環境変数は使わない (Claude Code が VSCode 拡張から起動された場合、ユーザーシェルの env が hook プロセスに伝播しない既知の問題 — [src/cli/install.mjs](../src/cli/install.mjs) で PATH 解決に苦労した経緯と同根)。代わりに marker file `~/.throughline/spike-inject.flag` の存在で判定する (cwd / parent process と独立)
117
+ - [ ] **spike モードの起動方法**: 環境変数は使わない (Claude Code が VSCode 拡張から起動された場合、ユーザーシェルの env が hook プロセスに伝播しない既知の問題 — [src/cli/install.mjs](../../src/cli/install.mjs) で PATH 解決に苦労した経緯と同根)。代わりに marker file `~/.throughline/spike-inject.flag` の存在で判定する (cwd / parent process と独立)
118
118
  - [ ] 実 Claude Code セッションで marker file を作成し、その状態で **`/clear` を実行**、新セッションの SessionStart hook が走るタイミングで append される状態を作る
119
119
  - [ ] 新セッション開始直後に「続きよろしく」など短い prompt を送り、Claude が **append した前回 turn を自分の過去発話として認識する** か確認
120
120
  - [ ] (補助) throwaway session で「append → 同 session 内 user prompt」も比較として実行し、`/clear` 経路と挙動が一致するか比較する。**判定の主軸は `/clear` 経路の方**
@@ -139,11 +139,11 @@ Anthropic Messages API 公式 docs ([Working with Messages](https://platform.cla
139
139
  Phase 0 が go の場合のみ着手。
140
140
 
141
141
  - [ ] Phase 1-0: `HandoffRecord` の拡張 (前提タスク、Phase 1-1 より先)
142
- - [ ] 現行 [src/handoff-record.mjs](../src/handoff-record.mjs) の `references.l3` は `kind` / `toolName` / `sourceId` / `originSessionId` / `turnNumber` / `createdAt` / `detailCommand` のメタのみで、tool_use の `input` JSON / tool_result の出力テキスト / image base64 などの **payload 本体は含まれていない**
142
+ - [ ] 現行 [src/handoff-record.mjs](../../src/handoff-record.mjs) の `references.l3` は `kind` / `toolName` / `sourceId` / `originSessionId` / `turnNumber` / `createdAt` / `detailCommand` のメタのみで、tool_use の `input` JSON / tool_result の出力テキスト / image base64 などの **payload 本体は含まれていない**
143
143
  - [ ] L3 を transcript JSONL に復元するため、新フィールド `references.l3Payloads` (または `references.l3` 内に `inputText` / `outputText` を opt-in 追加) として projection を新設。`tool_use.id` ↔ `tool_result.tool_use_id` の対応関係 (= `source_id` の chain) も含める
144
144
  - [ ] `handoff-record.test.mjs` の既存テストを破壊しない範囲で拡張 (追加フィールドの opt-in)
145
145
  - [ ] payload を持つ projection は **transcript inject 経路でのみ使う**。Codex projection 等の他の利用先は既存 shape を維持する
146
- - [ ] **既存利用先の test 追加**: [src/codex-handoff.mjs:130, 259, 352](../src/codex-handoff.mjs) は `record.references.l3` を `groupL3ByTurn` / `toDetailReference` に渡しているため、`src/l3-summary.mjs` の `groupL3ByTurn` が新フィールドを無視することを `codex-handoff.test.mjs` または `l3-summary` の専用 test で固定する
146
+ - [ ] **既存利用先の test 追加**: [src/codex-handoff.mjs:130, 259, 352](../../src/codex-handoff.mjs) は `record.references.l3` を `groupL3ByTurn` / `toDetailReference` に渡しているため、`src/l3-summary.mjs` の `groupL3ByTurn` が新フィールドを無視することを `codex-handoff.test.mjs` または `l3-summary` の専用 test で固定する
147
147
  - [ ] Phase 1-1: `src/transcript-writer.mjs` 新規作成
148
148
  - [ ] 引数: `targetJsonlPath`, `record: HandoffRecord`, `newSessionId`, `cwd`, `version`, `gitBranch`
149
149
  - [ ] `HandoffRecord` の L2 (`recentBodies`) を user/assistant の JSONL 行に変換
@@ -154,7 +154,7 @@ Phase 0 が go の場合のみ着手。
154
154
  - [ ] **idempotency**: 既に同 `origin_session_id` の turn が target JSONL に存在すれば no-op (重複 inject 防止)
155
155
  - [ ] Phase 1-2: `src/session-start.mjs` の改修 (Phase 0-4 結果が go の場合のみ着手、純機能追加)
156
156
  - [ ] **Phase 0-4 が go (= hook が書いた行が Claude Code 側で保持され、chain 設計が成立) でない限り、Phase 1-2 には着手しない**。NG なら §4 撤退条件を発動し本計画 v0.5 は終了する
157
- - [ ] 現行 [src/session-start.mjs:91](../src/session-start.mjs) では `payload` から `transcript_path` を destructure していない。Phase 1-2 で取得を追加する
157
+ - [ ] 現行 [src/session-start.mjs:91](../../src/session-start.mjs) では `payload` から `transcript_path` を destructure していない。Phase 1-2 で取得を追加する
158
158
  - [ ] **実装順序の厳守** (現行 v0.4.12 体験を 100% 保証するため):
159
159
  1. 先に `process.stdout.write(text + '\n')` を**完全に**実行する (現行 v0.4.12 と完全同一の stdout 出力。L2 verbatim を含む全部)
160
160
  2. その**後**で `transcriptWriter.injectInto(transcript_path, record, session_id, ...)` を呼ぶ
@@ -215,12 +215,12 @@ Phase 0 が go の場合のみ着手。
215
215
 
216
216
  ## 5. 関連 docs
217
217
 
218
- - [docs/02_clear_auto_handoff_plan.md](02_clear_auto_handoff_plan.md) — v0.4 系の baton/auto path 現行仕様 (本計画で部分上書きされる)
219
- - [docs/01_l1_l2_l3_redesign.md](01_l1_l2_l3_redesign.md) — L1/L2/L3 記憶レイヤー設計 (本計画で SessionStart 注入の分担が変わる)
220
- - [docs/04_public_release_plan.md](04_public_release_plan.md) — §0 フォールバック禁止ルール、CLI 設計
221
- - [src/resume-context.mjs](../src/resume-context.mjs) — 現行の system 側注入 builder (**v0.5 で変更なし**)
222
- - [src/session-start.mjs](../src/session-start.mjs) — 注入の呼び出し元 (v0.5 で transcript writer 呼び出しを stdout 注入の直後に追加)
223
- - [src/handoff-record.mjs](../src/handoff-record.mjs) — 注入の中間表現 (v0.5 で L3 payload を opt-in 追加)
218
+ - [docs/02_clear_auto_handoff_plan.md](../02_clear_auto_handoff_plan.md) — v0.4 系の baton/auto path 現行仕様 (本計画で部分上書きされる)
219
+ - [docs/01_l1_l2_l3_redesign.md](../01_l1_l2_l3_redesign.md) — L1/L2/L3 記憶レイヤー設計 (本計画で SessionStart 注入の分担が変わる)
220
+ - [docs/04_public_release_plan.md](../04_public_release_plan.md) — §0 フォールバック禁止ルール、CLI 設計
221
+ - [src/resume-context.mjs](../../src/resume-context.mjs) — 現行の system 側注入 builder (**v0.5 で変更なし**)
222
+ - [src/session-start.mjs](../../src/session-start.mjs) — 注入の呼び出し元 (v0.5 で transcript writer 呼び出しを stdout 注入の直後に追加)
223
+ - [src/handoff-record.mjs](../../src/handoff-record.mjs) — 注入の中間表現 (v0.5 で L3 payload を opt-in 追加)
224
224
 
225
225
  ---
226
226