throughline 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/.codex-sidecar.yml +5 -0
  2. package/CHANGELOG.md +47 -2
  3. package/README.ja.md +37 -21
  4. package/README.md +47 -26
  5. package/docs/00_overview.md +34 -0
  6. package/docs/{L1_L2_L3_REDESIGN.md → 01_l1_l2_l3_redesign.md} +3 -3
  7. package/docs/{THROUGHLINE_CLEAR_AUTO_HANDOFF_PLAN.md → 02_clear_auto_handoff_plan.md} +6 -6
  8. package/docs/{INHERITANCE_ON_CLEAR_ONLY.md → 03_inheritance_on_clear_only.md} +3 -3
  9. package/docs/{PUBLIC_RELEASE_PLAN.md → 04_public_release_plan.md} +3 -3
  10. package/docs/{THROUGHLINE_CODEX_FIRST_ROADMAP.md → 05_codex_first_roadmap.md} +9 -9
  11. package/docs/{THROUGHLINE_CODEX_TRIM_ROLLBACK_FIX_PLAN.md → 06_codex_trim_rollback_fix_plan.md} +6 -6
  12. package/docs/{THROUGHLINE_CODEX_TRIM_IMPLEMENTATION_PLAN.md → 07_codex_trim_implementation_plan.md} +10 -10
  13. package/docs/{THROUGHLINE_CODEX_DUAL_SUPPORT.md → 08_codex_dual_support.md} +8 -8
  14. package/docs/{throughline-rollback-context-trim-insight.md → 09_rollback_context_trim_insight.md} +5 -5
  15. package/docs/{THROUGHLINE_TRANSCRIPT_INJECTION_PLAN.md → 10_transcript_injection_plan.md} +6 -6
  16. package/docs/{THROUGHLINE_CODEX_MONITOR_IMPLEMENTATION_PLAN.md → 11_codex_monitor_implementation_plan.md} +1 -1
  17. package/docs/12_desktop_clear_handoff_plan.md +215 -0
  18. package/docs/adr/0001-claude-primary-codex-adapter.md +22 -0
  19. package/docs/archive/README.md +3 -3
  20. package/docs/archive/THROUGHLINE_NEXT_STEPS.md +3 -3
  21. package/package.json +2 -1
  22. package/rag/01-hooks/raw/session-end-reasons.md +21 -0
  23. package/{docs/RAG → rag}/INDEX.md +20 -16
  24. package/src/baton.mjs +2 -2
  25. package/src/db.mjs +2 -2
  26. package/src/hook-entrypoints.test.mjs +102 -0
  27. package/src/package-files.test.mjs +1 -0
  28. package/src/prompt-submit.mjs +2 -2
  29. package/src/resume-context.mjs +1 -1
  30. package/src/session-merger.mjs +1 -1
  31. package/src/session-start.mjs +62 -3
  32. package/src/spike-transcript-writer.mjs +1 -1
  33. package/src/state-file.mjs +1 -1
  34. package/src/token-monitor.mjs +1 -1
  35. package/src/transcript-reader.mjs +71 -0
  36. package/src/turn-backfill.mjs +131 -0
  37. package/src/turn-backfill.test.mjs +213 -0
  38. package/src/turn-processor.mjs +28 -40
  39. /package/docs/{throughline-codex-trim-rollback-incident-report.md → audit-2026-05/codex-trim-rollback-incident-report.md} +0 -0
  40. /package/{docs/RAG/_raw/01-hooks → rag/01-hooks/raw}/hooks-reference-extract.md +0 -0
  41. /package/{docs/RAG/_raw/02-messages-api → rag/02-messages-api/raw}/messages-api-extract.md +0 -0
  42. /package/{docs/RAG/_raw/03-settings → rag/03-settings/raw}/sessions-extract.md +0 -0
  43. /package/{docs/RAG/_raw/04-skills → rag/04-skills/raw}/initialUserMessage-investigation.md +0 -0
@@ -5,20 +5,20 @@
5
5
  ## この文書の位置づけ
6
6
 
7
7
  この文書は **これまでの統合実装計画と実装履歴** です。
8
- 2026-05-06 以降の次フェーズ実装順、TODO、進捗チェックは [THROUGHLINE_CODEX_FIRST_ROADMAP.md](THROUGHLINE_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
- - [THROUGHLINE_CODEX_DUAL_SUPPORT.md](THROUGHLINE_CODEX_DUAL_SUPPORT.md)
13
- - [throughline-rollback-context-trim-insight.md](throughline-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
- | [THROUGHLINE_CODEX_FIRST_ROADMAP.md](THROUGHLINE_CODEX_FIRST_ROADMAP.md) | 2026-05-06 以降の次フェーズ計画。Codex primary 実用化を先行し、Codex Rewind 互換を完成させてから Claude 側を詰める |
20
- | [THROUGHLINE_CODEX_DUAL_SUPPORT.md](THROUGHLINE_CODEX_DUAL_SUPPORT.md) | Claude / Codex 両対応の architecture brief。主に Phase 1-5 に対応 |
21
- | [throughline-rollback-context-trim-insight.md](throughline-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 は解除済み。現在は [THROUGHLINE_CODEX_TRIM_ROLLBACK_FIX_PLAN.md](THROUGHLINE_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` に出た。詳細な実測値は [THROUGHLINE_CODEX_FIRST_ROADMAP.md](THROUGHLINE_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`。
@@ -451,7 +451,7 @@ Phase 8 partial implementation result (2026-05-06):
451
451
  - `throughline codex-threads [--json] [--all-projects] [--limit N]` を追加した。これは `~/.codex/session_index.jsonl` と `~/.codex/sessions/**/rollout-*.jsonl` を read-only に読み、現在 project の Codex thread id 候補を表示する。候補を出すだけで、自動 trim の対象 thread として採用しない。
452
452
  - `--host codex --codex-thread-id <id>` の計画作成では、明示 thread id と現在 project に一致する rollout JSONL があれば `codex-rollout` を trim source として使う。これにより Throughline DB の `bodies` が 0 件でも、Codex 側の active turns から rollback candidate と memory preview を作れる。
453
453
  - `codex-rollout` source は `event_msg:task_started` を turn として扱い、`event_msg:thread_rolled_back` を適用して active turns を再構成する。rollback 済み tail は current memory preview に戻さない。
454
- - Claude slash command [.claude/commands/tl-trim.md](../.claude/commands/tl-trim.md) を追加し、現行 Claude が current-work memo を書いてから `throughline trim --dry-run --host claude --memo-stdin` を呼ぶ dry-run UX にした。
454
+ - Claude slash command `.claude/commands/tl-trim.md` を追加し、現行 Claude が current-work memo を書いてから `throughline trim --dry-run --host claude --memo-stdin` を呼ぶ dry-run UX にした。
455
455
  - `throughline install` / `uninstall` は `/tl-trim` も配布 / 削除する。
456
456
  - `throughline doctor --trim --host claude|codex|unknown` を追加し、default keep-recent、automatic rollback / inject 可否、manual procedure を表示する。Codex host では `THROUGHLINE_CODEX_THREAD_ID` / `CODEX_THREAD_ID` の検出結果も表示する。
457
457
  - `resume-context` の L2 section を「直近のターン履歴」から「現在進行中の作業履歴 (active work thread)」へ寄せ、読み方の契約を追加した。L2 全体を現在真実とみなすのではなく、古い順の active context として読み、後続行が前の仮説を上書きし得ることを明示する。
@@ -484,7 +484,7 @@ TODO:
484
484
 
485
485
  - [x] README に Claude primary / Codex sidecar / rollback trim の関係を書く。
486
486
  - [x] `CLAUDE.md` の実装済みファイル一覧を更新する。
487
- - [x] `PUBLIC_RELEASE_PLAN.md` に status を反映する。
487
+ - [x] `04_public_release_plan.md` に status を反映する。
488
488
  - [x] CHANGELOG を更新する。
489
489
  - [x] 推奨 test command を通す。
490
490
  - [x] Codex sidecar が無い環境の動作確認を行う。
@@ -10,12 +10,12 @@
10
10
 
11
11
  | 文書 | 役割 |
12
12
  |---|---|
13
- | [THROUGHLINE_CODEX_FIRST_ROADMAP.md](THROUGHLINE_CODEX_FIRST_ROADMAP.md) | 2026-05-06 以降の次フェーズ計画。Codex primary 実用化を先行する |
14
- | [THROUGHLINE_CODEX_TRIM_ROLLBACK_FIX_PLAN.md](THROUGHLINE_CODEX_TRIM_ROLLBACK_FIX_PLAN.md) | 2026-05-06 incident 後の修正計画。2026-05-08 の controlled smoke 後、過剰な Codex trim blocker は解除し、restore-safety / host primitive audit は diagnostics として扱う |
15
- | [THROUGHLINE_CODEX_TRIM_IMPLEMENTATION_PLAN.md](THROUGHLINE_CODEX_TRIM_IMPLEMENTATION_PLAN.md) | この文書と rollback trim の気づきを統合した旧計画と実装履歴。完了済み根拠として参照する |
16
- | [throughline-rollback-context-trim-insight.md](throughline-rollback-context-trim-insight.md) | conversation-only rollback を「model-visible context の delete primitive」と見る設計メモ |
13
+ | [05_codex_first_roadmap.md](05_codex_first_roadmap.md) | 2026-05-06 以降の次フェーズ計画。Codex primary 実用化を先行する |
14
+ | [06_codex_trim_rollback_fix_plan.md](06_codex_trim_rollback_fix_plan.md) | 2026-05-06 incident 後の修正計画。2026-05-08 の controlled smoke 後、過剰な Codex trim blocker は解除し、restore-safety / host primitive audit は diagnostics として扱う |
15
+ | [07_codex_trim_implementation_plan.md](07_codex_trim_implementation_plan.md) | この文書と rollback trim の気づきを統合した旧計画と実装履歴。完了済み根拠として参照する |
16
+ | [09_rollback_context_trim_insight.md](09_rollback_context_trim_insight.md) | conversation-only rollback を「model-visible context の delete primitive」と見る設計メモ |
17
17
 
18
- この文書は Codex adapter / sidecar integration の方針を定義する。今後の実装順は [THROUGHLINE_CODEX_FIRST_ROADMAP.md](THROUGHLINE_CODEX_FIRST_ROADMAP.md) を優先する。
18
+ この文書は Codex adapter / sidecar integration の方針を定義する。今後の実装順は [05_codex_first_roadmap.md](05_codex_first_roadmap.md) を優先する。
19
19
 
20
20
  ## 目標
21
21
 
@@ -55,7 +55,7 @@ Codex path が Claude internals を parse するのは、それが明示的に a
55
55
 
56
56
  ## Codex Sidecar Integration
57
57
 
58
- この節は `codex-sidecar` integration の設計です。Codex primary の capture / L2 -> L1 backend は [THROUGHLINE_CODEX_FIRST_ROADMAP.md](THROUGHLINE_CODEX_FIRST_ROADMAP.md) を優先します。
58
+ この節は `codex-sidecar` integration の設計です。Codex primary の capture / L2 -> L1 backend は [05_codex_first_roadmap.md](05_codex_first_roadmap.md) を優先します。
59
59
 
60
60
  Sidecar 向けには、Throughline が `codex-sidecar` contract に合う plain JSON context block を生成します。
61
61
 
@@ -131,7 +131,7 @@ L2 → L1 要約だけです。具体的には [src/haiku-summarizer.mjs](../src
131
131
 
132
132
  - Claude primary では、`codex-sidecar diagnostics --project <repo> --preset summarize-l1` が成功する環境では、L2 → L1 要約に `codex-sidecar` を使う。
133
133
  - Claude primary では、`codex-sidecar` が disabled / unavailable / diagnostics failure / run failure の環境では、現行の Claude Haiku 要約を維持する。
134
- - Codex primary では、次フェーズ計画 [THROUGHLINE_CODEX_FIRST_ROADMAP.md](THROUGHLINE_CODEX_FIRST_ROADMAP.md) に従い、L2 → L1 要約 backend は Codex CLI を本線にする。Codex CLI が使えない場合は silent fallback せず明示 error とする。
134
+ - Codex primary では、次フェーズ計画 [05_codex_first_roadmap.md](05_codex_first_roadmap.md) に従い、L2 → L1 要約 backend は Codex CLI を本線にする。Codex CLI が使えない場合は silent fallback せず明示 error とする。
135
135
  - `/tl` の in-flight memo は [.claude/commands/tl.md](../.claude/commands/tl.md) が現行メイン Claude に書かせる handoff memo であり、subagent ではない。これは Codex sidecar へ移さない。
136
136
 
137
137
  handoff review、continuity check、risk analysis などは現行 `src/` 実装には存在しません。
@@ -161,7 +161,7 @@ Codex-on-Codex が有効なのは、sidecar に別の境界がある場合だけ
161
161
  - independent second pass として明示的に要求されている。
162
162
 
163
163
  別の境界がないなら、Throughline は別の Codex に委譲せず、現在の Codex session に handoff を直接 consume させてください。
164
- Throughline 自体を Codex primary から使う場合は、まず [THROUGHLINE_CODEX_FIRST_ROADMAP.md](THROUGHLINE_CODEX_FIRST_ROADMAP.md) の Codex primary capture / Codex active-work resume renderer / Codex CLI L2→L1 backend を本線にします。`throughline codex-capture` と `throughline codex-resume` が Codex primary の入口であり、`throughline codex-sidecar-diagnostics`、`throughline codex-sidecar-dry-run` などは sidecar を使う review / risk-check / second opinion の診断 surface です。
164
+ Throughline 自体を Codex primary から使う場合は、まず [05_codex_first_roadmap.md](05_codex_first_roadmap.md) の Codex primary capture / Codex active-work resume renderer / Codex CLI L2→L1 backend を本線にします。`throughline codex-capture` と `throughline codex-resume` が Codex primary の入口であり、`throughline codex-sidecar-diagnostics`、`throughline codex-sidecar-dry-run` などは sidecar を使う review / risk-check / second opinion の診断 surface です。
165
165
 
166
166
  Recommended policy:
167
167
 
@@ -8,12 +8,12 @@
8
8
 
9
9
  | 文書 | 役割 |
10
10
  |---|---|
11
- | [THROUGHLINE_CODEX_FIRST_ROADMAP.md](THROUGHLINE_CODEX_FIRST_ROADMAP.md) | 2026-05-06 以降の次フェーズ計画。Codex primary と Codex Rewind 互換を先行する |
12
- | [THROUGHLINE_CODEX_TRIM_ROLLBACK_FIX_PLAN.md](THROUGHLINE_CODEX_TRIM_ROLLBACK_FIX_PLAN.md) | 2026-05-06 incident 後の修正計画。2026-05-10 の live token_count 実験後、Codex automatic current-thread mutation は無効化し、通常 `$throughline` は新スレッド handoff に戻す |
13
- | [THROUGHLINE_CODEX_TRIM_IMPLEMENTATION_PLAN.md](THROUGHLINE_CODEX_TRIM_IMPLEMENTATION_PLAN.md) | この気づきと Claude / Codex 両対応計画を統合した旧計画と実装履歴。完了済み根拠として参照する |
14
- | [THROUGHLINE_CODEX_DUAL_SUPPORT.md](THROUGHLINE_CODEX_DUAL_SUPPORT.md) | Throughline を Claude primary のまま Codex adapter / sidecar に対応させる architecture brief |
11
+ | [05_codex_first_roadmap.md](05_codex_first_roadmap.md) | 2026-05-06 以降の次フェーズ計画。Codex primary と Codex Rewind 互換を先行する |
12
+ | [06_codex_trim_rollback_fix_plan.md](06_codex_trim_rollback_fix_plan.md) | 2026-05-06 incident 後の修正計画。2026-05-10 の live token_count 実験後、Codex automatic current-thread mutation は無効化し、通常 `$throughline` は新スレッド handoff に戻す |
13
+ | [07_codex_trim_implementation_plan.md](07_codex_trim_implementation_plan.md) | この気づきと Claude / Codex 両対応計画を統合した旧計画と実装履歴。完了済み根拠として参照する |
14
+ | [08_codex_dual_support.md](08_codex_dual_support.md) | Throughline を Claude primary のまま Codex adapter / sidecar に対応させる architecture brief |
15
15
 
16
- この文書は「rollback は欠けていた delete primitive かもしれない」という洞察を残すもの。実装時は、未検証の host primitive を本線仕様にせず、次フェーズ計画 [THROUGHLINE_CODEX_FIRST_ROADMAP.md](THROUGHLINE_CODEX_FIRST_ROADMAP.md) の Codex Rewind 互換 Phase で実測してから本線 UX に進む。
16
+ この文書は「rollback は欠けていた delete primitive かもしれない」という洞察を残すもの。実装時は、未検証の host primitive を本線仕様にせず、次フェーズ計画 [05_codex_first_roadmap.md](05_codex_first_roadmap.md) の Codex Rewind 互換 Phase で実測してから本線 UX に進む。
17
17
 
18
18
  2026-05-06 update: Codex app-server の `thread/rollback` / `thread/inject_items` は live host primitive として実測済み。Throughline CLI には明示 `--codex-thread-id` または `THROUGHLINE_CODEX_THREAD_ID` / `CODEX_THREAD_ID` による current-thread identity、rollout/app-server turn count diagnostics、guarded execute が入った。
19
19
 
@@ -46,7 +46,7 @@ Anthropic Messages API 公式 docs ([Working with Messages](https://platform.cla
46
46
 
47
47
  これは v0.5 の本質が「**role の不在を解消する**」ことであって「**サイズ最適化**」や「**出力形式の刷新**」ではないため。
48
48
 
49
- **二重出力を許容する理由**: transcript JSONL append が何らかの理由で Claude に届かない環境 (Claude Code minor update での format 変更、Cursor 等の Claude Code 互換層、サードパーティ wrapper) でも、現行 v0.4.12 と同等以上の体験を保証する。`docs/PUBLIC_RELEASE_PLAN.md` §0 の「フォールバック禁止」は「エラー隠蔽 / silent fallback」を禁ずるもので、**情報を 2 経路で届ける純機能追加は対象外**。
49
+ **二重出力を許容する理由**: transcript JSONL append が何らかの理由で Claude に届かない環境 (Claude Code minor update での format 変更、Cursor 等の Claude Code 互換層、サードパーティ wrapper) でも、現行 v0.4.12 と同等以上の体験を保証する。`docs/04_public_release_plan.md` §0 の「フォールバック禁止」は「エラー隠蔽 / silent fallback」を禁ずるもので、**情報を 2 経路で届ける純機能追加は対象外**。
50
50
 
51
51
  ### 1.3 追加の阻害要因
52
52
 
@@ -187,8 +187,8 @@ Phase 0 が go の場合のみ着手。
187
187
  - [ ] README の `npm install -g throughline` 後に `throughline install` の再実行が必要であることを upgrade 文脈で 1 度明示 (現行は初回 install のみの表現)
188
188
  - [ ] Phase 3-2: 依存 docs 同期
189
189
  - [ ] CLAUDE.md の「設計の核」を v0.5 仕様に書き直す
190
- - [ ] `docs/THROUGHLINE_CLEAR_AUTO_HANDOFF_PLAN.md` の現行仕様セクションに「v0.5 で transcript inject に移行」と追記
191
- - [ ] `docs/L1_L2_L3_REDESIGN.md` の「SessionStart 注入内容」記述を v0.5 仕様に同期
190
+ - [ ] `docs/02_clear_auto_handoff_plan.md` の現行仕様セクションに「v0.5 で transcript inject に移行」と追記
191
+ - [ ] `docs/01_l1_l2_l3_redesign.md` の「SessionStart 注入内容」記述を v0.5 仕様に同期
192
192
  - [ ] Phase 3-3: bump & publish
193
193
  - [ ] `package.json` を `0.5.0` に bump
194
194
  - [ ] `npm test` 全 green
@@ -215,9 +215,9 @@ Phase 0 が go の場合のみ着手。
215
215
 
216
216
  ## 5. 関連 docs
217
217
 
218
- - [docs/THROUGHLINE_CLEAR_AUTO_HANDOFF_PLAN.md](THROUGHLINE_CLEAR_AUTO_HANDOFF_PLAN.md) — v0.4 系の baton/auto path 現行仕様 (本計画で部分上書きされる)
219
- - [docs/L1_L2_L3_REDESIGN.md](L1_L2_L3_REDESIGN.md) — L1/L2/L3 記憶レイヤー設計 (本計画で SessionStart 注入の分担が変わる)
220
- - [docs/PUBLIC_RELEASE_PLAN.md](PUBLIC_RELEASE_PLAN.md) — §0 フォールバック禁止ルール、CLI 設計
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
221
  - [src/resume-context.mjs](../src/resume-context.mjs) — 現行の system 側注入 builder (**v0.5 で変更なし**)
222
222
  - [src/session-start.mjs](../src/session-start.mjs) — 注入の呼び出し元 (v0.5 で transcript writer 呼び出しを stdout 注入の直後に追加)
223
223
  - [src/handoff-record.mjs](../src/handoff-record.mjs) — 注入の中間表現 (v0.5 で L3 payload を opt-in 追加)
@@ -206,7 +206,7 @@ Codex Stop hook でも、Claude hooks と同じく
206
206
  - [x] install tests で Caveat / Spotter hook preservation が壊れていないことを維持する。
207
207
  - [x] `README.md` に Claude/Codex monitor support を追記する。
208
208
  - [x] `CLAUDE.md` に Codex monitor adapter contract を追記する。
209
- - [x] 実装完了後、`docs/THROUGHLINE_CODEX_FIRST_ROADMAP.md` に結果を記録する。
209
+ - [x] 実装完了後、`docs/05_codex_first_roadmap.md` に結果を記録する。
210
210
  - [x] `CHANGELOG.md` を更新する。
211
211
  - [x] focused tests を実行する:
212
212
  `rtk node --test src/state-file.test.mjs src/token-monitor.test.mjs src/codex-usage.test.mjs src/cli/codex-hook.test.mjs`
@@ -0,0 +1,215 @@
1
+ # 12 — Desktop /clear 引き継ぎ + L2 捕捉完全性 改良プラン
2
+
3
+ <!-- 前提: Fable級統括/実装は codex_work・composer 委譲主体(2026-07 時点) -->
4
+
5
+ status: **承認済み・実装中**(2026-07-11 オーナー承認。本文書が正本=チェックボックスが TODO を兼ねる)
6
+
7
+ ## 統括の型(orchestrate スキル準拠。配置は 02_models.md 決定表の引用必須 — 2026-07-11 オーナー裁定の書式)
8
+
9
+ 配置宣言は正典 dotagents/docs/02_models.md を開いて該当行を写す。引用なしの配置は書かない。本プランの根拠行(引用・2026-07-11 時点):
10
+
11
+ - **実装物量**(02_models.md:40):「中位=`gpt-5.6-terra`×medium・codex_work」+「`grok-composer-2.5-fast`=並ぶ第一選択(仕様固定+検証コマンド必須の委譲契約を厳守)」
12
+ → 波の割当: 既存ファイル編集を含む波(install/doctor/bin 配線、既存テスト更新)= codex_work(隔離 worktree)。独立新規ファイル生成の波(session-end.mjs 本体・spike ロガー・新規テストファイル)= composer も第一選択、統括が波ごとに選び理由を残す。
13
+ - **監査・発見**(02_models.md:36):「`sonnet`×low・Workflow で明示」「中位=`gpt-5.6-terra`×medium・codex_auditor/explore」「`grok-4.5`・grok_agent / `grok -p`(並列 finder に好適)」
14
+ → B-2 の保存構造棚卸しは grok 並列 finder + codex_explore の多角スイープ。
15
+ - **反証・検証**(02_models.md:37):「主 継承×high・refuter」→ B-1 着手前 refuter・A 設計の追加反証に適用(model 省略=主継承が許されるのは検証・反証・裁定系のみ)。
16
+ - **裁定・契約クリティカル**(02_models.md:35):「主 直轄(F)」→ schema v9・バトン上書き規則・捕捉契約変更・settings.json 操作・最終レビュー・コミット。着手前 refuter 1 回(ガードレール常時ON)。
17
+ - **オーナー実機操作 = H**(Desktop/VSCode での /clear 操作・最小再現)。
18
+
19
+ 委譲は orchestrate スキル references/delegation-contract.md の 8 点セット(file:line 仕様・罠リスト・検証コマンド・合格条件・報告フォーマット・前提再検証義務)。委譲物は統括が diff レビュー + ゲート再実行してから採用。各 Workstream は独立に revert 可能な単位で刻み、波ごとに pathspec 明示コミット。エージェントに branch 切替・commit をさせない。
20
+
21
+ ## Context
22
+
23
+ 発端は「Claude Code Desktop の `/clear` で自動引き継ぎが発火しない」引き継ぎ書(Caveat: `claude-code-desktop-clear-sessionstart-source-startup-throughline`)。調査の過程で、発火しても**注入の中身が欠ける**別問題(L2 捕捉欠落)をオーナーの実機テストが炙り出した。オーナー裁定により両方を本スコープとする(2026-07-11)。
24
+
25
+ - **A: Desktop /clear 引き継ぎ発火** — Desktop は `source:"clear"` を送らない(VSCode 2.1.207 は送る。クライアント実装差で確定、バージョン交絡は棄却済み)。SessionEnd(reason='clear') バトン方式で解決する。
26
+ - **B: L2 捕捉の完全性** — 完了済み論理ターンの L2 欠落率: Desktop 27%・VSCode 41%(実会話の欠落例を目視確認済み)。二系統に分解:
27
+ - **B-1(Throughline 側で直せる)**: transcript に本文はあるのに bodies に無い欠落。原因は turn-processor が各 Stop で「最後の 1 ペア」しか保存しない設計([src/turn-processor.mjs](../src/turn-processor.mjs) の `getLastTurnPair` 単発保存)=Stop 不発/空振りが永久穴になる。→ 全ターンスキャン・バックフィル型に再設計。
28
+ - **B-2(原因未特定・CC/Desktop 側の可能性)**: Desktop で assistant 本文が transcript にそもそも書かれない/大幅遅延する。バグか仕様か未確定。最小再現で条件特定 → upstream 報告はその後に判断(オーナー承認制)。
29
+
30
+ ## 調査で確定した事実(2026-07-11 実測・反証済み)
31
+
32
+ ### 1. `/clear` はどのクライアントでも UserPromptSubmit hook に届かない
33
+
34
+ commit 75d79d7(2026-05-08「/clear writes baton」)は実運用ゼロ発火。決定的証拠は同一セッション内 /tl 対照実験 ×2:
35
+
36
+ - 2026-06-28 Novel(VSCode 2.1.195): `/tl` 06:15:38 バトン書込 → 27 秒後 `/clear`。届いていれば trigger:"clear" で上書きされるはずが、後継が消費したバトンは `baton_age_ms:26777` = /tl 時点のまま。
37
+ - 2026-07-11 Caveat(Desktop 2.1.205): `/tl` 11:51:21 → `/clear` → 後継 65a01d22 の消費バトンは `baton_age_ms:35591` =同型。
38
+ - 2026-07-11 Throughline(VSCode **2.1.207**): `/clear` 3 連発(13:15:46 / 13:16:18 / 13:16:54)でも baton-write.log に trigger:"clear" ゼロ(/tl の 1 件のみ)。最新版でも変わらず。
39
+
40
+ docs 整合: ビルトインコマンドは UserPromptSubmit(prompt 送信時)にも UserPromptExpansion(skill / custom command / mcp_prompt 展開時)にも乗らない。prompt-submit.mjs の /clear 分岐は無害な保険として残置。
41
+
42
+ ### 2. VSCode と Desktop の /clear 挙動差(クライアント実装差で確定)
43
+
44
+ | クライアント | 実測バージョン | /clear の SessionStart | 検証方法 |
45
+ |---|---|---|---|
46
+ | VSCode (`entrypoint: claude-vscode`) | 2.1.195 / 2.1.199 / **2.1.207** | `source:"clear"` → auto path 発火・merged:true | inheritance-decision.log の source:"clear" 11+3 件、残存 transcript 8 件の entrypoint 実測 |
47
+ | Desktop (`entrypoint: claude-desktop`) | 2.1.205 | `source:"startup"`。旧/新どちらの transcript にも /clear 痕跡なし。**後継セッションは /clear 時でなく初回プロンプト送信時に生成**(65a01d22: SessionStart 11:51:56.968 → 初 user prompt 11:51:57.035、/clear はその 16 秒以上前) | 2026-07-11 の Desktop 実測ペア + 当日全 Desktop セッション |
48
+
49
+ バージョン交絡(2.1.200+ リグレッション説)は VSCode 2.1.207 実測で棄却。クライアント判別は hook から env `CLAUDE_CODE_ENTRYPOINT`(`claude-desktop` / `claude-vscode`)で可能。
50
+
51
+ ### 3. 案A(startup 時間窓フォールバック)不採用の根拠
52
+
53
+ - 幽霊セッション: 2026-07-11 だけで project_path=/Users/kite の startup が **182 件**(03:02〜12:56、最短間隔 0.001 秒、全て bodies=0)。haiku-workdir に 207 件=headless `claude -p` も SessionStart hook を発火する。
54
+ - 幽霊がチェーンに入ると MAX_CHAIN_DEPTH=10([src/session-merger.mjs](../src/session-merger.mjs):14)へ数時間で到達し resolveMergeTarget throw → ターン捕捉が恒久停止=ここで記憶が本当に失われる。
55
+ - source='startup' は「/clear の後継」と「並行して開いた別窓」を原理的に区別できず、稼働中セッションのレコードを relabel して記憶を split する。「bodies>0 の前任だけ選ぶ」は前任側フィルタなので無効(refuter 検証済み)。
56
+
57
+ ### 4. SessionEnd hook 仕様(公式 docs live fetch 2026-07-11)
58
+
59
+ - SessionEnd は実在し、matcher が `reason` でフィルタ可能。reason enum: **`clear` / `resume` / `logout` / `prompt_input_exit` / `bypass_permissions_disabled` / `other`**。
60
+ - SessionStart source enum: `startup` / `resume` / `clear` / `compact`。
61
+ - **SessionEnd hook のデフォルト timeout は 1.5 秒**(/clear にも適用)→ per-hook timeout 明示が必須(サイレント kill によるバトン喪失対策)。
62
+ - Desktop が /clear 時に SessionEnd(reason='clear') を実際に発火するかは**未検証**(source を誤ラベルするクライアントなので要実測)→ A Phase 1 spike。
63
+
64
+ ### 5. オーナーの 4 セッション連続 /clear テスト(2026-07-11 13:15-13:17, VSCode 2.1.207)
65
+
66
+ チェーン 4ef0d886 → c3e4e5d8 → ea60a1c9 → 9e74467d。マージは 3 回全部成功(auto ×2 + baton ×1)だが、**テスト全体で捕捉された L2 は 1 ターンのみ**(書込 13:16:45)。clear #1 (13:15:46)・#2 (13:16:18) の注入時点で DB は空 → 空の記憶を注入 → 体感「引き継げてない」で正解。3 回目の成功は /tl ではなく捕捉が追いついたため。state ファイルの 299 bytes(usage 無し=[src/turn-processor.mjs](../src/turn-processor.mjs) の `!assistantTurn` 早期離脱痕跡)vs 397 bytes(フル実行)が Stop 空振りの証拠。
67
+
68
+ ### 6. L2 捕捉欠落の全域調査(論理ターン単位・完了ターンのみ・haiku-workdir 除外)
69
+
70
+ | クライアント | セッション | 完了論理ターン | 未捕捉 | 率 |
71
+ |---|---|---|---|---|
72
+ | claude-desktop (2.1.205) | 13 | 133 | 36 | **27.1%** |
73
+ | claude-vscode (2.1.199-206) | 6 | 155 | 63 | **40.6%** |
74
+
75
+ - 論理ターン=「user テキスト → 後続 assistant 断片群の最後の断片」。捕捉判定は bodies の (origin_session_id, turn_number=最終断片 index, role='assistant') 存在。
76
+ - VSCode 側の欠落は **transcript に本文が現存する**(調査自体が transcript から読めている)= Throughline 側の捕捉漏れ → B-1 で修正可能。
77
+ - 実在確認済みの欠落例: f1ad5b6f (WebAICoding) の実会話ターン #1/#3/#6 等。
78
+ - 注意: queued メッセージ(連続 user テキスト)が論理ターンを水増しする可能性は残る=率は上限値の目安。
79
+
80
+ ### 7. Desktop transcript の assistant 本文欠落(B-2・unconfirmed)
81
+
82
+ 本調査セッション自身(d7650b10, Desktop 2.1.205)の実測: assistant エントリ 93 件の内訳 thinking 48 / tool_use 36 / **text 9**。12:44〜13:15 の長いターンには本文断片が約 8 個あったが、transcript に着地したのは 1 個だけ、しかも発話から**約 16 分遅れ**(13:12:48)。残りは transcript・プロジェクトディレクトリ・~/.claude 全域・Desktop の local-agent-mode-sessions のどこにも grep ヒットせず=ローカル永久欠落。短いターン(13:17 以降)の本文は着地している。バグか仕様か(正本がサーバ/アプリ側にある可能性)は未確定。
83
+
84
+ ---
85
+
86
+ ## Phase 0 — 同期・安全網・正本化(憲法1/2)
87
+
88
+ - [x] git 同期状態の確認(origin/main と 0/0・stash なし・untracked `.agents/` は端末ローカル残置がオーナー裁定済み=触らない)
89
+ - [x] ベースラインゲート green 確認: `npm test` 549 pass / 0 fail(2026-07-11)
90
+ - [x] 本プランを docs/12 として正本化(本文書)
91
+ - [x] rag/01-hooks に SessionEnd reason enum を還流([session-end-reasons.md](../rag/01-hooks/raw/session-end-reasons.md))、rag/INDEX.md に Finding 8 追記
92
+ - [x] 今日の調査を caveat に記録: public `claude-code-clear-userpromptsubmit-hook`(confirmed)/ private `claude-code-desktop-assistant-transcript-jsonl`(tentative・B-2 で更新)
93
+ - [x] 実稼働デプロイ(2026-07-12): `npm i -g /Users/kite/Developer/Throughline`(symlink 化=リポ変更が即時反映。リリース時は registry 版へ戻す)
94
+
95
+ ## Workstream B-1 — 捕捉のバックフィル化(先行。A の E2E 品質の前提。挙動修正レーン=挙動差を明文化して個別承認)
96
+
97
+ - [x] **B-1 設計の着手前 refuter**: 判定「目的は正当・原設計のままでは採用不可」。修正 7 件を採用: ①群レベル dedup 必須(部分捕捉済み群への再挿入は同一発話の重複ペアを 110 件量産——実在確認: d7650b10 turn14/15。割り込みは tool_result 内に埋まり user 境界として不可視のため 1 群複数 Stop が日常)②前任 transcript path は project_path から決定的導出(state は Stop 不発前任で存在しない)③junk 代表除外(session limit 通知等)④INSERT を 1 トランザクション ⑤created_at は transcript timestamp(now は一括回収で同一 ms に潰れ L2 窓・現在地アンカーの順序が tie で不定化)⑥readTranscript に isSidechain 防御 ⑦resume 直後 transcript の実測 1 回を検証項目に追加。棄却された懸念: 注入肥大化(20 ターンキャップで構造上起きない)・SessionStart レイテンシ(58MB transcript でも 155ms)
98
+ - [x] **turn-processor 再設計**: [src/turn-backfill.mjs](../src/turn-backfill.mjs) 新設(全論理ターン群走査 + 群レベル dedup + junk 除外 + timestamp created_at + 単一トランザクション)、turn-processor は毎 Stop でこれを呼ぶ。回収実績は `~/.throughline/logs/backfill.log`。機能検証済み: 実 transcript × 隔離 DB で回収 12 群・冪等(2 回目 0 挿入)・部分捕捉群の重複ガード・junk 0 行・created_at 順 = 会話順 【F: 統括直轄】
99
+ - [x] queued メッセージの扱いを明文化: 群 = 「user テキスト → 後続 assistant 断片群」なので、応答前に積まれた先行 queued user は断片 0 の群となり捕捉されない(現行 getLastTurnPair と同等の非対応。将来課題)
100
+ - [x] session-start のマージ直後にも同じバックフィルを前任 transcript に対して実行(project path からの決定的導出を優先し、state file は Stop 不発前任のため補助)→ 「/clear 直前ターンの取りこぼし」を注入前に回収。失敗は stderr + `backfill.log` に明示し、注入は継続
101
+ - [x] 診断ログ: バックフィルで回収したターン数を stderr ではなく `~/.throughline/logs/backfill.log` に記録(Stop / session-start 共通)
102
+ - [x] テスト: 全ターンスキャンの単体(群レベル dedup、冪等性、junk、timestamp、sidechain、path munging)と hook subprocess(multi-turn / state 無し前任)の特性化を追加。`npm test`: 559 pass / 0 fail(2026-07-12)
103
+ - [ ] 検証: 欠落率調査スクリプト(付録)を再実行し、新規セッションで欠落 0% を確認
104
+
105
+ ## Workstream A — Desktop /clear 引き継ぎ発火(SessionEnd バトン方式)
106
+
107
+ ### A Phase 1 — spike 実測(Desktop の SessionEnd 白黒判定)
108
+
109
+ - [x] spike ロガー hook(`spike/session-end-logger.mjs`): stdin 全 payload + `CLAUDE_CODE_ENTRYPOINT` + 受信時刻を記録 【A → codex_work `gpt-5.6-terra`×medium で実装、統括が検証 3 本再実行済み。sidecar 側 PROTOCOL_ERROR(報告 envelope の schema 不一致)が出たが成果物は worktree から採用】
110
+ - [x] `~/.claude/settings.json` に SessionEnd を一時登録(絶対パス node + 絶対パス spike・timeout 10 明示。バックアップ: `~/.claude-settings-backup-20260711-235419.tar.gz`。撤去 = SessionEnd ブロック削除 + spike ファイル削除)【F: 統括直轄】
111
+ - [x] 実測プロトコル 【H: オーナー操作 2026-07-12 15:00-15:10 UTC】: ①Desktop /clear(③はアプリ終了の代わりにセッション削除で実施)②放置 ③削除 ④VSCode /clear。結果:
112
+
113
+ | 操作 | SessionEnd 発火 | reason | 備考 |
114
+ |---|---|---|---|
115
+ | Desktop `/clear`(d93b0d5f) | **即時**(返答 15:05:52 → 15:05:59) | **`other`** | payload は session_id/prompt_id/reason/cwd/transcript_path のみ・判別子なし |
116
+ | Desktop 放置(a8ece26f) | 発火せず | — | |
117
+ | Desktop セッション削除(675493fb) | 発火(12 秒後) | **`other`** | payload 構造は /clear と完全同一 |
118
+ | VSCode `/clear`(fa43271f) | 即時 | **`clear`** | 42ms 後に後継 SessionStart(source=clear)→auto merge。仕組み自体は健全 |
119
+
120
+ 副次発見: Desktop の幽霊セッション(/Users/kite)も SessionEnd(other) を高頻度で発火する。
121
+ - [x] 判定: **NO-GO**。Desktop は /clear で SessionEnd を即時発火するが reason を `other` にラベルし、**セッション削除(明示的破棄)と区別不能**。reason=other でバトンを書くと削除セッションの記憶が次セッションに蘇る誤注入 + 幽霊バトン汚染。reason 不問の退行案は不採用(計画どおり)。→ A Phase 2 は実装せず停止、fallback 裁定へ
122
+ - [x] spike 撤去: settings.json から SessionEnd 登録を削除(JSON 検証済み)、spike ファイル削除(git 履歴に残存)。実測ログ `~/.throughline/logs/session-end-spike.log` は証拠として保全
123
+
124
+ ### A Phase 2 — 本実装(GO の場合のみ。refuter で出た穴 4 件の対策込み)
125
+
126
+ > **2026-07-12 NO-GO につき凍結**。Desktop が SessionEnd reason を正しくラベルする(または SessionStart source='clear' を送る)ようになった時点で解凍可。fallback は Phase 1 実測表とともにオーナー裁定: 案C(明文化 + /tl 運用)+ upstream 報告(証拠は二重: SessionStart source=startup 誤ラベル + SessionEnd reason=other 誤ラベル、VSCode 対照つき)。オーナー裁定 (2026-07-12): fallback 案C 採用・upstream 報告提出済み https://github.com/anthropics/claude-code/issues/76704 (修正が入れば auto path がそのまま Desktop で復活する)。
127
+
128
+ - [ ] schema v9: `handoff_batons.origin` 列(`'tl' | 'clear-prompt' | 'clear-session-end'`)【F: 統括直轄】
129
+ - [ ] バトン上書き規則: 明示 /tl は TTL 内なら自動バトンに上書きされない(明示意思 > 自動)。consumeBaton は origin を返し inheritance-decision.log に `baton_origin` 記録 【F: 統括直轄】
130
+ - [ ] `src/session-end.mjs` 新設: reason==='clear' かつ `THROUGHLINE_DISABLE_AUTO_HANDOFF !== '1'` で writeBaton。全イベントを session-end.log に記録。import-safe run() 型 【A: 実装物量 → 02_models.md:40】
131
+ - [ ] bin dispatch / install.mjs SC_HOOKS 追加(**per-hook timeout 明示** — 既定 1.5 秒 kill 対策)/ uninstall / doctor 表示 【A: 実装物量 → 02_models.md:40】
132
+ - [ ] テスト: baton origin 規則・session-end subprocess・db-schema v9・install 冪等 【A: 実装物量 → 02_models.md:40 → 統括 diff レビュー + ゲート再実行】
133
+ - [ ] TTL は /tl と同じ 1 時間(一貫性優先。短縮代替案: clear 由来のみ 5〜10 分に絞る案があったが、Desktop は後継生成が初回プロンプト時なので取りこぼしリスクと引き換え=不採用の記録)
134
+
135
+ ### A Phase 3 — E2E・後始末
136
+
137
+ - [x] spike hook 撤去(settings.json 復元確認)
138
+ - [x] E2E(2026-07-12 実機・緑): Desktop `/tl`(前任 6c58be18)→ `/clear` → 後継 e8bb5bd3 が `triggered_path:"baton"`・merged:true。`backfill.log` に `hook:"session-start" origin:6c58be18`。後継 bodies に前任の全ターン(turn 1/3/5/8、`/tl` 直前の turn 5 含む)。後継モデルが「前のセッションから記憶を引き継いだ」と自覚。→ 0.6.0 リリースへ
139
+ - [x] `npm test` 全緑、CLAUDE.md / README / docs 更新、caveat_update で `claude-code-desktop-clear-sessionstart-source-startup-throughline` の resolution 更新(2026-07-12 更新済み)
140
+
141
+ ## Workstream B-2 — Desktop transcript 本文欠落の条件特定(調査のみ。実装なし)
142
+
143
+ - 2026-07-12 追試 — 本調査セッション自身で欠落が継続再現(15:20 以降の本文 ~8 個中 5 個のみ着地・中間分析テキストが欠落)。短ターン(オーナーのテストセッション 4 本)は全て着地 → 「長い tool 連発ターンで欠ける」仮説と整合。保存構造棚卸しは Claude レーンで実行中(会話実データを外部枠に流さないプライバシー優先の逸脱 — 02_models.md:36 の既定から明示逸脱)。
144
+ - [x] 最小再現・条件特定(2026-07-12): 短ターン(1 往復)は本文が必ず着地(オーナーのテストセッション 4 本 + 過去実績)。欠落は**長い tool 連発ターンの中間テキスト**で発生し、同一セッションで 2 回ライブ再現(12:44-13:15 は本文 8 個中 1 個のみ・16 分遅延着地/15:20-15:35 は ~8 個中 5 個)。厳密な断片選択規則は Desktop 内部実装依存で外部から特定不能と判断
145
+ - [x] 保存構造の read-only 棚卸し(Claude レーン Explore agent。会話実データを外部枠に流さないプライバシー優先の逸脱): **Desktop の App Support ストア(LevelDB / IndexedDB / SQLite / session JSON)は会話本文を一切保持しない**。3 エンコーディング全域走査で、JSONL に実在する対照プローブすら 0 件。session JSON はメタデータのみ。→ `~/.claude/projects/*.jsonl` が唯一のローカル本文ストアで、**書かれなかった本文はサーバ側のみ=ローカル回収経路なし**(確度: 高)
146
+ - [x] 結論を caveat(`claude-code-desktop-assistant-transcript-jsonl`、confidence: reproduced へ更新)と本文書に記録
147
+ - [x] **upstream 報告 #2 提出済み**(2026-07-12・オーナー承認済み): [anthropics/claude-code#76706](https://github.com/anthropics/claude-code/issues/76706)(長い tool 連発ターンで assistant text ブロックが transcript JSONL に永久欠落・ローカル回収経路なし・VS Code は正常)
148
+
149
+ ## 実装しないこと
150
+
151
+ - 案A startup 時間窓フォールバック / reason 不問バトン / prompt-submit の /clear 分岐削除(無害残置)
152
+ - B-2 の「修正」実装(原因が CC 側なら Throughline では直せない。B-1 のバックフィルが Throughline 側でできる最大限)
153
+
154
+ ## 検証コマンド
155
+
156
+ ```bash
157
+ npm test
158
+ node bin/throughline.mjs doctor
159
+ tail -f ~/.throughline/logs/session-end-spike.log # A Phase 1
160
+ tail -f ~/.throughline/logs/inheritance-decision.log # A Phase 3 (baton_origin)
161
+ ```
162
+
163
+ ## 付録 — 欠落率調査スクリプト(B-1 検証用・read-only)
164
+
165
+ ```javascript
166
+ // node --input-type=module < この内容 (リポジトリルートで実行)
167
+ import { getDb } from './src/db.mjs';
168
+ import { readTranscript } from './src/transcript-reader.mjs';
169
+ import { existsSync, readFileSync } from 'node:fs';
170
+ import { join } from 'node:path';
171
+ import { homedir } from 'node:os';
172
+
173
+ const db = getDb();
174
+ const sessions = db.prepare(`
175
+ SELECT session_id, project_path FROM sessions
176
+ WHERE merged_into IS NULL AND session_id NOT LIKE 'codex:%'
177
+ ORDER BY updated_at DESC LIMIT 300
178
+ `).all();
179
+ const projRoot = join(homedir(), '.claude', 'projects');
180
+ const tPath = (p, sid) => {
181
+ const f = join(projRoot, p.replace(/[\/.]/g, '-').replace(/^-?/, '-'), sid + '.jsonl');
182
+ return existsSync(f) ? f : null;
183
+ };
184
+ const logicalTurns = (turns) => {
185
+ const r = []; let cur = null;
186
+ for (let i = 0; i < turns.length; i++) {
187
+ if (turns[i].role === 'user') { if (cur) r.push(cur); cur = { lastAsstIdx: -1 }; }
188
+ else if (turns[i].role === 'assistant' && cur) cur.lastAsstIdx = i;
189
+ }
190
+ if (cur) r.push(cur);
191
+ return r.filter(lt => lt.lastAsstIdx >= 0);
192
+ };
193
+ const byClient = {};
194
+ for (const s of sessions) {
195
+ if (s.project_path.includes('haiku-workdir')) continue; // 再帰ガードで捕捉しない設計
196
+ const tp = tPath(s.project_path, s.session_id);
197
+ if (!tp) continue;
198
+ const lts = logicalTurns(readTranscript(tp));
199
+ if (lts.length < 2) continue;
200
+ let ep = null;
201
+ for (const line of readFileSync(tp, 'utf8').split('\n')) {
202
+ try { const e = JSON.parse(line); if (e.entrypoint) { ep = e.entrypoint; break; } } catch {}
203
+ }
204
+ if (!ep) continue;
205
+ const cap = new Set(db.prepare(
206
+ `SELECT turn_number FROM bodies WHERE origin_session_id = ? AND role = 'assistant'`
207
+ ).all(s.session_id).map(r => r.turn_number));
208
+ const scanned = lts.slice(0, -1); // 最終ターンは進行中の可能性 → 除外
209
+ const miss = scanned.filter(lt => !cap.has(lt.lastAsstIdx)).length;
210
+ byClient[ep] ??= { sessions: 0, turns: 0, missing: 0 };
211
+ byClient[ep].sessions++; byClient[ep].turns += scanned.length; byClient[ep].missing += miss;
212
+ }
213
+ for (const [k, v] of Object.entries(byClient))
214
+ console.log(k, v, `${(100 * v.missing / v.turns).toFixed(1)}%`);
215
+ ```
@@ -0,0 +1,22 @@
1
+ # ADR 0001: Keep Claude Primary, Add Codex as Adapter
2
+
3
+ Date: 2026-07-04
4
+
5
+ ## Status
6
+
7
+ Accepted
8
+
9
+ ## Context
10
+
11
+ Throughline grew as a Claude Code hooks plugin. Its core behavior depends on Claude-facing hooks, slash commands, transcript parsing, and `/clear` / `/tl` handoff semantics. Codex support is valuable, but replacing Claude contracts would break the existing product boundary and historical guarantees.
12
+
13
+ ## Decision
14
+
15
+ Keep Claude Code behavior first-class. Add Codex support through adapter/projection layers such as `throughline_handoff`, Codex rollout capture, Codex CLI summarization, and explicit diagnostic trim surfaces. Do not rename, remove, or implicitly replace Claude-facing fields, command names, hook shapes, transcript contracts, or handoff semantics for Codex support.
16
+
17
+ ## Consequences
18
+
19
+ - Claude hooks and slash commands remain the compatibility baseline.
20
+ - Codex support must fail explicitly when required host primitives or captured DB memory are unavailable.
21
+ - Agent-neutral core may grow only behind stable Claude-compatible projections.
22
+ - Future docs should update the numbered canonical docs before changing README-facing behavior.
@@ -2,7 +2,7 @@
2
2
 
3
3
  このフォルダの内容は **歴史的資料**。現行実装を説明していない。
4
4
 
5
- 現行の設計仕様は一つ上のディレクトリの [L1_L2_L3_REDESIGN.md](../L1_L2_L3_REDESIGN.md) を参照。
5
+ 現行の設計仕様は一つ上のディレクトリの [01_l1_l2_l3_redesign.md](../01_l1_l2_l3_redesign.md) を参照。
6
6
 
7
7
  ## このフォルダにあるもの
8
8
 
@@ -11,7 +11,7 @@
11
11
  | CONCEPT.md | Throughline の初期コンセプト文書。L2 = 判断 (judgment) 抽出という構造化方式を想定していた | schema v4 で judgments テーブル廃止、L2 は「会話本文そのまま」に再定義。本文書の L2 節以降は実装と乖離している |
12
12
  | EXPERIMENT.md | `/clear` 跨ぎで旧/新 session_id を紐づけるための命題 A〜X と実機検証の記録 | 結論として記憶張り替え方式 (merged_into + origin_session_id) が採用され、本実験結果は歴史記録としてのみ価値がある |
13
13
  | SESSION_LINKING_DESIGN.md | 命題 X(ファイルベース紐付け)の実装設計書。時間窓+ state ファイル方式 | 同上。最終的に記憶張り替え方式に置き換えられ、spike コードも破棄済み |
14
- | THROUGHLINE_NEXT_STEPS.md | 2026-04-17、npm publish 直前の優先順位メモ(publish 済ませろ / awesome-claude-code 登録 / HN 投稿)| npm publish は v0.1.0 〜 v0.3.x まで複数回実施、awesome-claude-code は未提出。現在の未完タスクは [../PUBLIC_RELEASE_PLAN.md](../PUBLIC_RELEASE_PLAN.md) に集約 |
14
+ | THROUGHLINE_NEXT_STEPS.md | 2026-04-17、npm publish 直前の優先順位メモ(publish 済ませろ / awesome-claude-code 登録 / HN 投稿)| npm publish は v0.1.0 〜 v0.3.x まで複数回実施、awesome-claude-code は未提出。現在の未完タスクは [../04_public_release_plan.md](../04_public_release_plan.md) に集約 |
15
15
 
16
16
  ## なぜアーカイブするか
17
17
 
@@ -19,4 +19,4 @@
19
19
  - 具体的なスキーマ、層の中身、フック構成はすべて実装中に改訂された
20
20
  - 最新の正と歴史が同じフォルダに並ぶと読み手が混乱する
21
21
 
22
- 新規に仕様を読む場合は必ず [../L1_L2_L3_REDESIGN.md](../L1_L2_L3_REDESIGN.md) から始めること。
22
+ 新規に仕様を読む場合は必ず [../01_l1_l2_l3_redesign.md](../01_l1_l2_l3_redesign.md) から始めること。
@@ -47,7 +47,7 @@ README に `npm install -g throughline` と書いてあるが、現時点で npm
47
47
 
48
48
  - `package.json` の `version` が `0.1.0`。最初の publish はこれでOK。以降は semver 守って上げる
49
49
  - publish した瞬間に取り消せない (unpublish には制約あり)。dry-run は真剣にやる
50
- - docs/PUBLIC_RELEASE_PLAN.md §0 の「フォールバック禁止」原則に従い、install 失敗時は silent 処理しない
50
+ - docs/04_public_release_plan.md §0 の「フォールバック禁止」原則に従い、install 失敗時は silent 処理しない
51
51
 
52
52
  ### 🟡 中優先 — awesome-claude-code に登録申請
53
53
 
@@ -104,8 +104,8 @@ codeburn / ccburn などの類似ツールがここに載ってる。Throughline
104
104
  ## 作業指針
105
105
 
106
106
  1. **手を動かす前に READ しろ**
107
- - `docs/L1_L2_L3_REDESIGN.md` (認証の設計書)
108
- - `docs/PUBLIC_RELEASE_PLAN.md` (§0 ルールと未完タスクの定義)
107
+ - `docs/01_l1_l2_l3_redesign.md` (認証の設計書)
108
+ - `docs/04_public_release_plan.md` (§0 ルールと未完タスクの定義)
109
109
  - `CLAUDE.md` (作業上の規律)
110
110
  2. **§0 ルールを厳守**
111
111
  - silent try/catch 禁止
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "throughline",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "description": "Claude Code hooks plugin for structured context compression (/clear-safe persistent memory)",
6
6
  "keywords": [
@@ -25,6 +25,7 @@
25
25
  ".claude/commands/",
26
26
  ".codex-sidecar.yml",
27
27
  "docs/",
28
+ "rag/",
28
29
  "CHANGELOG.md",
29
30
  "README.md",
30
31
  "LICENSE"
@@ -0,0 +1,21 @@
1
+ # Claude Code Hooks — SessionEnd reason enum (Extract)
2
+
3
+ Source: <https://code.claude.com/docs/en/hooks> (fetched 2026-07-11)
4
+ 確度: 公式 docs verbatim(Matcher patterns テーブルより)。実機検証は Throughline docs/12 A Phase 1 spike で実施予定。
5
+
6
+ ## SessionEnd
7
+
8
+ - SessionEnd イベントの matcher は「why the session ended」でフィルタする。
9
+ - **reason enum**: `clear` / `resume` / `logout` / `prompt_input_exit` / `bypass_permissions_disabled` / `other`
10
+ - `clear` = "Session cleared with /clear command"
11
+ - **デフォルト timeout は 1.5 秒**で /clear にも適用される(hook が 1.5 秒を超えるとサイレント kill)→ 登録時は per-hook timeout を明示すること。
12
+
13
+ ## SessionStart source(同 fetch での再確認)
14
+
15
+ - `source` enum: `"startup"`(新規)/ `"resume"` / `"clear"`(/clear 後)/ `"compact"`
16
+
17
+ ## Throughline 的含意(実測とセット)
18
+
19
+ - VSCode(2.1.195〜2.1.207 実測)は /clear で `source:"clear"` を送る。Desktop(2.1.205 実測)は `source:"startup"` を送る=クライアント実装差(docs/12 §2)。
20
+ - ビルトイン /clear は UserPromptSubmit / UserPromptExpansion のどちらにも乗らない(UserPromptExpansion の対象は skill / custom command / mcp_prompt のみ)= /clear 検知は SessionEnd(reason='clear') が唯一の hook 経路候補。
21
+ - Desktop が SessionEnd(reason='clear') を実際に発火するかは未検証(2026-07-11 時点)。