throughline 0.3.24 → 0.3.25

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 (111) hide show
  1. package/.claude/commands/tl-trim.md +42 -0
  2. package/.codex-sidecar.yml +62 -0
  3. package/CHANGELOG.md +583 -0
  4. package/README.ja.md +42 -5
  5. package/README.md +383 -23
  6. package/bin/throughline.mjs +168 -4
  7. package/codex/skills/throughline/SKILL.md +157 -0
  8. package/codex/skills/throughline/agents/openai.yaml +7 -0
  9. package/docs/INHERITANCE_ON_CLEAR_ONLY.md +146 -0
  10. package/docs/L1_L2_L3_REDESIGN.md +415 -0
  11. package/docs/PUBLIC_RELEASE_PLAN.md +184 -0
  12. package/docs/THROUGHLINE_CODEX_DUAL_SUPPORT.md +249 -0
  13. package/docs/THROUGHLINE_CODEX_FIRST_ROADMAP.md +555 -0
  14. package/docs/THROUGHLINE_CODEX_MONITOR_IMPLEMENTATION_PLAN.md +220 -0
  15. package/docs/THROUGHLINE_CODEX_TRIM_IMPLEMENTATION_PLAN.md +528 -0
  16. package/docs/THROUGHLINE_CODEX_TRIM_ROLLBACK_FIX_PLAN.md +672 -0
  17. package/docs/archive/CONCEPT.md +476 -0
  18. package/docs/archive/EXPERIMENT.md +371 -0
  19. package/docs/archive/README.md +22 -0
  20. package/docs/archive/SESSION_LINKING_DESIGN.md +231 -0
  21. package/docs/archive/THROUGHLINE_NEXT_STEPS.md +134 -0
  22. package/docs/throughline-codex-trim-rollback-incident-report.md +306 -0
  23. package/docs/throughline-handoff-context.example.json +57 -0
  24. package/docs/throughline-rollback-context-trim-insight.md +455 -0
  25. package/package.json +6 -2
  26. package/src/cli/codex-capture.mjs +95 -0
  27. package/src/cli/codex-handoff-model-smoke.mjs +292 -0
  28. package/src/cli/codex-handoff-model-smoke.test.mjs +262 -0
  29. package/src/cli/codex-handoff-smoke.mjs +163 -0
  30. package/src/cli/codex-handoff-smoke.test.mjs +149 -0
  31. package/src/cli/codex-handoff-start.mjs +291 -0
  32. package/src/cli/codex-handoff-start.test.mjs +194 -0
  33. package/src/cli/codex-hook.mjs +276 -0
  34. package/src/cli/codex-hook.test.mjs +293 -0
  35. package/src/cli/codex-host-primitive-audit.mjs +110 -0
  36. package/src/cli/codex-host-primitive-audit.test.mjs +75 -0
  37. package/src/cli/codex-restore-smoke.mjs +357 -0
  38. package/src/cli/codex-restore-source-audit.mjs +304 -0
  39. package/src/cli/codex-resume.mjs +138 -0
  40. package/src/cli/codex-rollback-model-visible-smoke.mjs +373 -0
  41. package/src/cli/codex-rollback-model-visible-smoke.test.mjs +255 -0
  42. package/src/cli/codex-sidecar-diagnostics.mjs +48 -0
  43. package/src/cli/codex-sidecar-dry-run.mjs +85 -0
  44. package/src/cli/codex-summarize.mjs +224 -0
  45. package/src/cli/codex-threads.mjs +89 -0
  46. package/src/cli/codex-visibility-smoke.mjs +196 -0
  47. package/src/cli/codex-vscode-restore-smoke.mjs +226 -0
  48. package/src/cli/codex-vscode-rollback-smoke.mjs +114 -0
  49. package/src/cli/doctor.mjs +503 -1
  50. package/src/cli/doctor.test.mjs +542 -3
  51. package/src/cli/handoff-preview.mjs +78 -0
  52. package/src/cli/help.test.mjs +64 -0
  53. package/src/cli/install.mjs +227 -4
  54. package/src/cli/install.test.mjs +207 -4
  55. package/src/cli/trim.mjs +564 -0
  56. package/src/codex-app-server.mjs +1816 -0
  57. package/src/codex-app-server.test.mjs +512 -0
  58. package/src/codex-auto-refresh.mjs +194 -0
  59. package/src/codex-auto-refresh.test.mjs +182 -0
  60. package/src/codex-capture.mjs +235 -0
  61. package/src/codex-capture.test.mjs +393 -0
  62. package/src/codex-handoff-model-smoke.mjs +114 -0
  63. package/src/codex-handoff-model-smoke.test.mjs +89 -0
  64. package/src/codex-handoff-smoke.mjs +124 -0
  65. package/src/codex-handoff-smoke.test.mjs +103 -0
  66. package/src/codex-handoff.mjs +331 -0
  67. package/src/codex-handoff.test.mjs +220 -0
  68. package/src/codex-host-primitive-audit.mjs +374 -0
  69. package/src/codex-host-primitive-audit.test.mjs +208 -0
  70. package/src/codex-restore-smoke.test.mjs +639 -0
  71. package/src/codex-restore-source-audit.mjs +1348 -0
  72. package/src/codex-restore-source-audit.test.mjs +623 -0
  73. package/src/codex-resume.test.mjs +242 -0
  74. package/src/codex-rollout-memory.mjs +711 -0
  75. package/src/codex-rollout-memory.test.mjs +610 -0
  76. package/src/codex-sidecar-cli.test.mjs +75 -0
  77. package/src/codex-sidecar.mjs +246 -0
  78. package/src/codex-sidecar.test.mjs +172 -0
  79. package/src/codex-summarize.test.mjs +143 -0
  80. package/src/codex-thread-identity.mjs +23 -0
  81. package/src/codex-thread-index.mjs +173 -0
  82. package/src/codex-thread-index.test.mjs +164 -0
  83. package/src/codex-usage.mjs +110 -0
  84. package/src/codex-usage.test.mjs +140 -0
  85. package/src/codex-visibility-smoke.test.mjs +222 -0
  86. package/src/codex-vscode-restore-smoke.mjs +206 -0
  87. package/src/codex-vscode-restore-smoke.test.mjs +325 -0
  88. package/src/codex-vscode-rollback-smoke.mjs +90 -0
  89. package/src/codex-vscode-rollback-smoke.test.mjs +290 -0
  90. package/src/db-schema.test.mjs +97 -0
  91. package/src/haiku-summarizer.mjs +267 -26
  92. package/src/haiku-summarizer.test.mjs +282 -0
  93. package/src/handoff-preview.test.mjs +108 -0
  94. package/src/handoff-record.mjs +294 -0
  95. package/src/handoff-record.test.mjs +226 -0
  96. package/src/hook-entrypoints.test.mjs +326 -0
  97. package/src/package-files.test.mjs +19 -0
  98. package/src/prompt-submit.mjs +9 -6
  99. package/src/resume-context.mjs +44 -140
  100. package/src/resume-context.test.mjs +172 -0
  101. package/src/session-start.mjs +8 -5
  102. package/src/state-file.mjs +50 -6
  103. package/src/state-file.test.mjs +50 -0
  104. package/src/token-monitor.mjs +14 -10
  105. package/src/token-monitor.test.mjs +27 -0
  106. package/src/trim-cli.test.mjs +1584 -0
  107. package/src/trim-model.mjs +584 -0
  108. package/src/trim-model.test.mjs +568 -0
  109. package/src/turn-processor.mjs +17 -10
  110. package/src/vscode-task.mjs +33 -10
  111. package/src/vscode-task.test.mjs +19 -9
@@ -0,0 +1,249 @@
1
+ # Throughline: Claude / Codex 両対応計画
2
+
3
+ この文書は Throughline repository に貼り付けるための実装ブリーフです。目的は、Throughline を Claude Code と Codex の両方から安全に使える形へ育てることです。
4
+
5
+ ## この文書の位置づけ
6
+
7
+ この文書は **Claude / Codex 両対応の architecture brief** です。
8
+
9
+ 関連文書:
10
+
11
+ | 文書 | 役割 |
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」と見る設計メモ |
17
+
18
+ この文書は Codex adapter / sidecar integration の方針を定義する。今後の実装順は [THROUGHLINE_CODEX_FIRST_ROADMAP.md](THROUGHLINE_CODEX_FIRST_ROADMAP.md) を優先する。
19
+
20
+ ## 目標
21
+
22
+ Throughline は agent-neutral な handoff / context compression infrastructure になるべきです。
23
+
24
+ Claude Code transcript と handoff behavior は守りつつ、Codex primary bridge と `codex-sidecar` 経由の compact context も生成できるようにします。現行の `HandoffRecord` は安定した中間表現だが、保存元はまだ Claude transcript 由来であり、Codex capture を実装して初めて source adapter が Codex 由来になる。
25
+
26
+ 目指す形:
27
+
28
+ - Throughline core は特定 agent に依存しない。
29
+ - Claude transcript support は first-class かつ stable のまま維持する。
30
+ - Codex support は `throughline_handoff` context block、Codex primary entrypoint、Codex CLI backend、`codex-sidecar` integration として追加する。
31
+ - 既存の Claude handoff behavior を壊さない。
32
+
33
+ ## 優先順位
34
+
35
+ 1. Throughline を Codex primary で使えるようにする。Codex primary の L2 -> L1 backend は Codex CLI を本線にする。
36
+ 2. Codex で Claude Rewind 相当の context trim を完成させる。2026-05-08 時点では Codex current-thread trim execute / auto-refresh は再有効化済みで、DB memory と turn-count guard を必須にする。
37
+ 3. そのあと Claude 側の `/rewind` UX / 自動化 surface を詰める。
38
+
39
+ Claude transcript handling の置き換えから始めないでください。Codex 対応は adapter / bridge / Codex primary entrypoint として追加します。
40
+
41
+ Claude primary で `codex-sidecar` が使えない場合は、現在の Claude subagent behavior をそのまま維持します。Codex 向け adapter / bridge が存在するからといって、既存の Claude path を削ったり劣化させたりしないでください。Codex primary の可用性は Codex CLI / app-server / rollout の実測で別に判定します。
42
+
43
+ ## Architecture 方針
44
+
45
+ 概念上、次の layer に分けます。
46
+
47
+ | Layer | Responsibility |
48
+ |---|---|
49
+ | Agent-neutral core | handoff record、compression output、reference、persistence、validation |
50
+ | Claude adapter | Claude Code transcript parsing、tool I/O assumption、Claude handoff command |
51
+ | Codex adapter | `throughline_handoff` context block、`codex-sidecar` request shaping、result capture |
52
+ | Shared fixtures | Claude / Codex adapter の両方で使う handoff example と expected output |
53
+
54
+ Codex path が Claude internals を parse するのは、それが明示的に adapter の責務である場合だけにしてください。core は stable handoff object を扱うべきです。
55
+
56
+ ## Codex Sidecar Integration
57
+
58
+ この節は `codex-sidecar` integration の設計です。Codex primary の capture / L2 -> L1 backend は [THROUGHLINE_CODEX_FIRST_ROADMAP.md](THROUGHLINE_CODEX_FIRST_ROADMAP.md) を優先します。
59
+
60
+ Sidecar 向けには、Throughline が `codex-sidecar` contract に合う plain JSON context block を生成します。
61
+
62
+ ```json
63
+ {
64
+ "kind": "throughline_handoff",
65
+ "source": "throughline",
66
+ "trust": "local",
67
+ "summary": "In-flight handoff: Next: continue",
68
+ "data": {
69
+ "throughlineHandoffSchemaVersion": 1,
70
+ "handoffRecordVersion": 1,
71
+ "sessionId": "session-id",
72
+ "projectPath": "/repo",
73
+ "sourceAgent": "claude",
74
+ "hostMode": "claude-primary",
75
+ "intent": "continue implementation",
76
+ "constraints": ["preserve Claude transcript contract"],
77
+ "originSessionIds": ["old-session"],
78
+ "stats": {},
79
+ "memory": {},
80
+ "detailReferences": [
81
+ {
82
+ "type": "throughline_detail",
83
+ "label": "tool_input:Bash",
84
+ "command": "throughline detail 12:00:01",
85
+ "sourceId": "toolu_1",
86
+ "detailKind": "tool_input",
87
+ "originSessionId": "old-session",
88
+ "turnNumber": 2
89
+ }
90
+ ]
91
+ }
92
+ }
93
+ ```
94
+
95
+ `codex-sidecar` の top-level `references` は `path` 必須です。Throughline の DB /
96
+ `throughline detail <時刻>` 参照は `data.detailReferences` に置きます。file path /
97
+ line reference は既知の場合だけ top-level `references` に足し、必須にはしません。
98
+ `SidecarContextBlock` は top-level `schemaVersion` を保持しないため、Throughline 側の
99
+ schema version は `data.throughlineHandoffSchemaVersion` に入れます。
100
+ `hostMode` は `claude-primary` / `codex-primary` / `unknown` を明示指定します。自動 host-agent detection は初期実装に入れません。
101
+
102
+ Codex-facing workflow では、この context block を次の用途に使います。
103
+
104
+ - `codex_explore`: previous handoff context を使って repo question に答える。
105
+ - `codex_review`: last handoff を intent として current changes を review する。
106
+ - `codex_opinion`: handoff に含まれる plan を challenge する。
107
+ - `codex_risk_check`: handoff が触れている risky area を確認する。
108
+ - `codex_work`: isolated worktree で小さな scoped task を続行する。
109
+
110
+ ## Claude Behavior を守る
111
+
112
+ コード変更の前に、現在の Claude contract を特定して文書化してください。
113
+
114
+ - transcript file shape
115
+ - tool input / output parsing assumption
116
+ - compaction format
117
+ - handoff markdown / JSON schema
118
+ - command name と argument
119
+ - resume behavior
120
+ - Claude session がまだ動くことを示す test / fixture
121
+
122
+ Codex のために既存の Claude-facing field を rename しないでください。必要なら Codex adapter projection を追加します。
123
+
124
+ ## Background Subagent Shift
125
+
126
+ 現行 Throughline で subagent 的に外部 model call しているのは、Stop hook の
127
+ L2 → L1 要約だけです。具体的には [src/haiku-summarizer.mjs](../src/haiku-summarizer.mjs)
128
+ が `claude -p --model claude-haiku-4-5-*` を呼びます。
129
+
130
+ 移行方針:
131
+
132
+ - Claude primary では、`codex-sidecar diagnostics --project <repo> --preset summarize-l1` が成功する環境では、L2 → L1 要約に `codex-sidecar` を使う。
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 とする。
135
+ - `/tl` の in-flight memo は [.claude/commands/tl.md](../.claude/commands/tl.md) が現行メイン Claude に書かせる handoff memo であり、subagent ではない。これは Codex sidecar へ移さない。
136
+
137
+ handoff review、continuity check、risk analysis などは現行 `src/` 実装には存在しません。
138
+ 後続で追加する場合だけ、`throughline_handoff` context block と read-only sidecar workflow
139
+ として扱います。
140
+
141
+ ## 懸念: Codex が Codex を呼ぶ場合
142
+
143
+ ユーザーが Claude から Throughline を使っている場合、この形には価値があります。
144
+
145
+ ```text
146
+ Claude primary -> Throughline -> codex-sidecar -> Codex second opinion
147
+ ```
148
+
149
+ 一方、ユーザーが Codex から Throughline を使っている場合、次の形を無条件で行わないでください。
150
+
151
+ ```text
152
+ Codex primary -> Throughline -> codex-sidecar -> Codex again
153
+ ```
154
+
155
+ Codex-on-Codex が有効なのは、sidecar に別の境界がある場合だけです。
156
+
157
+ - isolated worktree から実行される。
158
+ - durable `SidecarResult` を生成する。
159
+ - diagnosis 用の raw App Server log を書く。
160
+ - critic / reviewer / risk-analyst など prompt role が明確に違う。
161
+ - independent second pass として明示的に要求されている。
162
+
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 です。
165
+
166
+ Recommended policy:
167
+
168
+ | Host agent | Sidecar choice |
169
+ |---|---|
170
+ | Claude | independent review、risk、exploration、scoped continuation には Codex sidecar を優先 |
171
+ | Codex | isolation、structured result capture、explicit second-pass review がある場合のみ Codex sidecar を使う |
172
+ | Unknown / automation | implicit recursion ではなく明示 config を要求 |
173
+
174
+ Sidecar availability policy:
175
+
176
+ この表は `codex-sidecar` の availability を表す。Codex primary の L2 → L1 backend availability ではない。
177
+
178
+ | Codex sidecar availability | Behavior |
179
+ |---|---|
180
+ | `unavailable` | `codex-sidecar` が存在しない、実行不能、この repo 向けに未設定、または diagnostics 失敗。既存の Claude subagent path を維持 |
181
+ | `configured` | `codex-sidecar diagnostics --project <repo>` が成功。request shaping、dry-run、docs、planned read-only integration は使ってよい |
182
+ | `operational` | `codex_explore` など read-only smoke が成功。approved review、explore、opinion、risk-check sidecar task に使ってよい |
183
+ | `work-capable` | `codex_work` smoke が成功し、allowed paths が設定済み。worktree-backed scoped edit に使ってよい |
184
+ | explicitly disabled | 既存の Claude subagent path を維持 |
185
+
186
+ これは hidden fallback ではありません。Claude primary の互換モードです。Codex sidecar が使えない環境では、現在の Claude-backed behavior を baseline とします。
187
+
188
+ 「Codex sidecar が使える」の最小実用定義は、単に `codex` binary があることではありません。`codex-sidecar` が存在し、対象 repository で diagnostics を成功させられることです。`codex-sidecar` がない場合、Throughline は sidecar unavailable と扱ってください。Codex primary 自体の可用性は、Codex CLI と app-server / rollout の実測で別に判定します。
189
+
190
+ Preferred health check:
191
+
192
+ ```bash
193
+ codex-sidecar diagnostics --project <repo> --preset review
194
+ ```
195
+
196
+ Development-path health check:
197
+
198
+ ```bash
199
+ node /home/kite/projects/codex-sidecar/packages/cli/dist/index.js diagnostics \
200
+ --project <repo> \
201
+ --preset review
202
+ ```
203
+
204
+ Dry-run checks:
205
+
206
+ ```bash
207
+ throughline codex-sidecar-dry-run \
208
+ --project <repo> \
209
+ --preset review \
210
+ --context-file docs/throughline-handoff-context.example.json \
211
+ "Review Throughline dual support request shape only."
212
+
213
+ throughline codex-sidecar-dry-run \
214
+ --project <repo> \
215
+ --preset risk-check \
216
+ --context-file docs/throughline-handoff-context.example.json \
217
+ "Risk-check Throughline dual support request shape only."
218
+ ```
219
+
220
+ Structured result policy:
221
+
222
+ - Dry-run output is diagnostic evidence only; it is not persisted in Throughline memory.
223
+ - Real read-only sidecar runs return structured JSON on stdout. If the result contains `rawEventLogRef`, treat that as the canonical durable link to the App Server event log.
224
+ - Do not mix sidecar result JSON into L1/L2/L3 memory tables. If Throughline later needs durable indexing, add a separate `sidecar_runs` style record keyed by project / workflow / preset / status / `rawEventLogRef`.
225
+
226
+ ## Implementation Checklist
227
+
228
+ - [x] 既存の Claude transcript / handoff contract を audit する。
229
+ - [x] adapter 変更前に、現在の Claude behavior を固定する test を追加する。
230
+ - [x] stable handoff object がまだない場合は追加する。
231
+ - [x] `throughline_handoff` 用の Throughline-to-`SidecarContextBlock` conversion path を追加する。
232
+ - [x] Codex context block の fixture snapshot を追加する。
233
+ - [x] Claude primary / Codex primary mode の docs を追加する。
234
+ - [x] Codex-on-Codex recursion を避ける explicit `hostMode` config を追加する。自動 detection は未実装。
235
+ - [x] background Claude subagent task を移す前に Codex sidecar availability check を入れる。sidecar absent または diagnostics failure は explicit `unavailable`。
236
+ - [x] sample handoff を使った read-only `codex-sidecar` smoke を追加する。2026-05-06 に `throughline_handoff` fixture + `codex-sidecar explore` で成功済み。
237
+ - [x] `review` / `risk-check` dry-run を追加する。2026-05-06 に `throughline_handoff` fixture + `throughline codex-sidecar-dry-run` で成功済み。
238
+ - [x] sidecar structured result は stdout JSON + `rawEventLogRef` link として扱い、Throughline memory tables には混ぜない方針を明文化する。
239
+
240
+ ## Done Definition
241
+
242
+ Throughline が dual-supported になったと言える条件:
243
+
244
+ - 既存の Claude transcript / handoff behavior が通る。
245
+ - Codex が `throughline_handoff` context block を受け取れる。
246
+ - Throughline が Codex の structured result を保存または link できる。
247
+ - Codex primary mode が実質的な境界なしに recursive delegation しない。
248
+ - Codex-unavailable environment では既存の Claude subagent behavior を維持する。
249
+ - Claude、current Codex、Codex sidecar の使い分けが docs に説明されている。