throughline 0.3.24 → 0.4.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 (116) hide show
  1. package/.claude/commands/tl.md +6 -21
  2. package/.codex-sidecar.yml +62 -0
  3. package/CHANGELOG.md +632 -0
  4. package/README.ja.md +71 -46
  5. package/README.md +420 -76
  6. package/bin/throughline.mjs +169 -7
  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 +159 -0
  10. package/docs/L1_L2_L3_REDESIGN.md +415 -0
  11. package/docs/PUBLIC_RELEASE_PLAN.md +185 -0
  12. package/docs/THROUGHLINE_CLEAR_AUTO_HANDOFF_PLAN.md +286 -0
  13. package/docs/THROUGHLINE_CODEX_DUAL_SUPPORT.md +249 -0
  14. package/docs/THROUGHLINE_CODEX_FIRST_ROADMAP.md +555 -0
  15. package/docs/THROUGHLINE_CODEX_MONITOR_IMPLEMENTATION_PLAN.md +220 -0
  16. package/docs/THROUGHLINE_CODEX_TRIM_IMPLEMENTATION_PLAN.md +528 -0
  17. package/docs/THROUGHLINE_CODEX_TRIM_ROLLBACK_FIX_PLAN.md +672 -0
  18. package/docs/archive/CONCEPT.md +476 -0
  19. package/docs/archive/EXPERIMENT.md +371 -0
  20. package/docs/archive/README.md +22 -0
  21. package/docs/archive/SESSION_LINKING_DESIGN.md +231 -0
  22. package/docs/archive/THROUGHLINE_NEXT_STEPS.md +134 -0
  23. package/docs/throughline-codex-trim-rollback-incident-report.md +306 -0
  24. package/docs/throughline-handoff-context.example.json +57 -0
  25. package/docs/throughline-rollback-context-trim-insight.md +455 -0
  26. package/package.json +6 -2
  27. package/src/baton.mjs +17 -45
  28. package/src/baton.test.mjs +4 -41
  29. package/src/cli/codex-capture.mjs +95 -0
  30. package/src/cli/codex-handoff-model-smoke.mjs +292 -0
  31. package/src/cli/codex-handoff-model-smoke.test.mjs +262 -0
  32. package/src/cli/codex-handoff-smoke.mjs +163 -0
  33. package/src/cli/codex-handoff-smoke.test.mjs +149 -0
  34. package/src/cli/codex-handoff-start.mjs +291 -0
  35. package/src/cli/codex-handoff-start.test.mjs +194 -0
  36. package/src/cli/codex-hook.mjs +276 -0
  37. package/src/cli/codex-hook.test.mjs +293 -0
  38. package/src/cli/codex-host-primitive-audit.mjs +110 -0
  39. package/src/cli/codex-host-primitive-audit.test.mjs +75 -0
  40. package/src/cli/codex-restore-smoke.mjs +357 -0
  41. package/src/cli/codex-restore-source-audit.mjs +304 -0
  42. package/src/cli/codex-resume.mjs +138 -0
  43. package/src/cli/codex-rollback-model-visible-smoke.mjs +373 -0
  44. package/src/cli/codex-rollback-model-visible-smoke.test.mjs +255 -0
  45. package/src/cli/codex-sidecar-diagnostics.mjs +48 -0
  46. package/src/cli/codex-sidecar-dry-run.mjs +85 -0
  47. package/src/cli/codex-summarize.mjs +224 -0
  48. package/src/cli/codex-threads.mjs +89 -0
  49. package/src/cli/codex-visibility-smoke.mjs +196 -0
  50. package/src/cli/codex-vscode-restore-smoke.mjs +226 -0
  51. package/src/cli/codex-vscode-rollback-smoke.mjs +114 -0
  52. package/src/cli/doctor.mjs +503 -1
  53. package/src/cli/doctor.test.mjs +542 -3
  54. package/src/cli/handoff-preview.mjs +78 -0
  55. package/src/cli/help.test.mjs +64 -0
  56. package/src/cli/install.mjs +226 -3
  57. package/src/cli/install.test.mjs +205 -4
  58. package/src/cli/trim.mjs +564 -0
  59. package/src/codex-app-server.mjs +1816 -0
  60. package/src/codex-app-server.test.mjs +512 -0
  61. package/src/codex-auto-refresh.mjs +194 -0
  62. package/src/codex-auto-refresh.test.mjs +182 -0
  63. package/src/codex-capture.mjs +235 -0
  64. package/src/codex-capture.test.mjs +393 -0
  65. package/src/codex-handoff-model-smoke.mjs +114 -0
  66. package/src/codex-handoff-model-smoke.test.mjs +89 -0
  67. package/src/codex-handoff-smoke.mjs +124 -0
  68. package/src/codex-handoff-smoke.test.mjs +103 -0
  69. package/src/codex-handoff.mjs +331 -0
  70. package/src/codex-handoff.test.mjs +220 -0
  71. package/src/codex-host-primitive-audit.mjs +374 -0
  72. package/src/codex-host-primitive-audit.test.mjs +208 -0
  73. package/src/codex-restore-smoke.test.mjs +639 -0
  74. package/src/codex-restore-source-audit.mjs +1348 -0
  75. package/src/codex-restore-source-audit.test.mjs +623 -0
  76. package/src/codex-resume.test.mjs +242 -0
  77. package/src/codex-rollout-memory.mjs +711 -0
  78. package/src/codex-rollout-memory.test.mjs +610 -0
  79. package/src/codex-sidecar-cli.test.mjs +75 -0
  80. package/src/codex-sidecar.mjs +246 -0
  81. package/src/codex-sidecar.test.mjs +172 -0
  82. package/src/codex-summarize.test.mjs +143 -0
  83. package/src/codex-thread-identity.mjs +23 -0
  84. package/src/codex-thread-index.mjs +173 -0
  85. package/src/codex-thread-index.test.mjs +164 -0
  86. package/src/codex-usage.mjs +110 -0
  87. package/src/codex-usage.test.mjs +140 -0
  88. package/src/codex-visibility-smoke.test.mjs +222 -0
  89. package/src/codex-vscode-restore-smoke.mjs +206 -0
  90. package/src/codex-vscode-restore-smoke.test.mjs +325 -0
  91. package/src/codex-vscode-rollback-smoke.mjs +90 -0
  92. package/src/codex-vscode-rollback-smoke.test.mjs +290 -0
  93. package/src/db-schema.test.mjs +96 -0
  94. package/src/db.mjs +14 -1
  95. package/src/haiku-summarizer.mjs +267 -26
  96. package/src/haiku-summarizer.test.mjs +282 -0
  97. package/src/handoff-preview.test.mjs +108 -0
  98. package/src/handoff-record.mjs +294 -0
  99. package/src/handoff-record.test.mjs +226 -0
  100. package/src/hook-entrypoints.test.mjs +286 -0
  101. package/src/package-files.test.mjs +19 -0
  102. package/src/prompt-submit.mjs +9 -6
  103. package/src/resume-context.mjs +58 -171
  104. package/src/resume-context.test.mjs +177 -0
  105. package/src/session-start.mjs +85 -26
  106. package/src/state-file.mjs +50 -6
  107. package/src/state-file.test.mjs +50 -0
  108. package/src/token-monitor.mjs +14 -10
  109. package/src/token-monitor.test.mjs +27 -0
  110. package/src/trim-cli.test.mjs +1584 -0
  111. package/src/trim-model.mjs +584 -0
  112. package/src/trim-model.test.mjs +568 -0
  113. package/src/turn-processor.mjs +17 -10
  114. package/src/vscode-task.mjs +33 -10
  115. package/src/vscode-task.test.mjs +19 -9
  116. package/src/cli/save-inflight.mjs +0 -81
package/CHANGELOG.md ADDED
@@ -0,0 +1,632 @@
1
+ # Changelog
2
+
3
+ All notable changes to Throughline are documented here. The format is based on
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
5
+ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ Pre-`0.3.18` iteration history is preserved as a rollup section near the bottom
8
+ since most of those releases were rapid-fire monitor render bug fixes that
9
+ shipped to npm but were not individually tagged on GitHub.
10
+
11
+ ## [Unreleased]
12
+
13
+ ## [0.4.0] — 2026-05-08
14
+
15
+ ### Breaking changes
16
+
17
+ - **`/clear` で自動引継ぎがデフォルト ON** に変更。Claude Code 2.1.128 で
18
+ SessionStart hook の `source='clear'` が reliable になったため、`/clear` 後の
19
+ 新セッションは自動的に前セッションの memory を merge + 注入する。
20
+ ([GitHub issue #49937](https://github.com/anthropics/claude-code/issues/49937)
21
+ は解決済み)
22
+ - **`THROUGHLINE_DISABLE_AUTO_HANDOFF=1`** env var で auto path を OFF にできる。
23
+ - **`/tl` の役割を明示意思マーカーに簡素化**。memo 4 項目入力の指示を削除し、
24
+ baton を立てるだけの slash command に。`/tl` は env で auto OFF にしている
25
+ ユーザー、または `/clear` を経由しない引継ぎに使う逃げ道。
26
+ - **`/tl-trim` slash command 廃止**。memo 入力 + dry-run preview の役割を持って
27
+ いたが、memo 廃止と軽量化方針で役割なしに。Codex 経路の `throughline trim`
28
+ CLI は維持 (`--host codex` での guarded execute / preflight など)。
29
+ - **`throughline save-inflight` CLI 削除**。memo 廃止に伴う除去。
30
+ - **`updateBatonMemo` 関数削除**。`src/baton.mjs` の export から外した。
31
+ - **schema v8 migration**: `handoff_batons.memo_text` 列を drop。
32
+ - **注入内容を L1 + L2 + L3 references のみに簡素化**。memo セクション、
33
+ 中断直前 thinking セクション、Claude 向け footer の使い方説明を削除。L2 全文
34
+ に「次に何をしようとしていたか」が含まれているため redundant。
35
+
36
+ ### Added
37
+
38
+ - `src/db.mjs`: schema v8 migration (handoff_batons.memo_text 列 drop)。
39
+ - `src/session-start.mjs`: 引継ぎ判定の 2 経路ロジック:
40
+ 1. baton path: `consumeBaton` 先発で baton ありなら merge + 注入
41
+ 2. auto path: baton 無し + `source='clear'` + env disable 無し で同 project の
42
+ 最新 Claude unmerged session を自動 predecessor に merge + 注入
43
+ - `inheritance-decision.log` に `triggered_path` / `auto_handoff_disabled`
44
+ フィールドを追加。`baton_has_memo` フィールドは削除。
45
+ - `src/resume-context.mjs`: L3 references 一覧を注入テキストに追加
46
+ (Codex `renderCodexRolloutMemoryPreview` 形式の `- ${kind}:
47
+ \`throughline detail <time>\``)。Reading Contract / Continuation Instruction
48
+ も Codex 風 framing に揃えた。
49
+
50
+ ### Notes
51
+
52
+ - `src/handoff-record.mjs` の memo / thinking projection は **維持**: Codex 側
53
+ (`codex-handoff.mjs`, `codex-resume.mjs`, `codex-handoff-smoke.mjs` など) が
54
+ `memory.inflightMemo` / `memory.latestThinking` を参照しているため。Claude
55
+ 側は resume-context.mjs で「使わない」だけ。
56
+ - `src/cli/trim.mjs` は **維持**: Codex 経路 (`--host codex`) と doctor
57
+ (`--trim --host claude`) で使う `describeTrimHost('claude')` の dry-run 表示
58
+ が依存しているため。`/tl-trim` slash command が無くなっても CLI は残る。
59
+ - 既存 `~/.throughline/logs/inflight-memo.log` ファイルは新版で書き込まれない。
60
+ ユーザー側で手動削除可能。
61
+
62
+ ## [0.3.25] — 2026-05-08
63
+
64
+ ### Added
65
+ - Claude-primary / Codex-sidecar groundwork:
66
+ `HandoffRecord` projection, `throughline handoff-preview`,
67
+ `throughline_handoff` example context, and `codex-sidecar-diagnostics` /
68
+ `codex-sidecar-dry-run` command surfaces.
69
+ - Optional `codex-sidecar` L2→L1 summarization path. When the sidecar is
70
+ configured for the `summarize-l1` preset, Throughline uses it for the only
71
+ subagent-like external model call; disabled/unavailable/run-failed sidecar
72
+ states keep the existing Claude Haiku route.
73
+ - `/tl-trim` dry-run surface:
74
+ `throughline trim --dry-run`, `--host`, `--keep-recent`, `--all`,
75
+ `--memo-stdin`, `--codex-thread-id`, and `throughline doctor --trim`.
76
+ - Codex app-server protocol helpers for the verified trim flow: newline JSON
77
+ framing, initialize / resume / rollback / inject / turn-start request
78
+ builders, and parser coverage.
79
+ - Codex rollout-backed trim source for explicit `--codex-thread-id` plans.
80
+ This lets Codex dry-run / preflight / guarded execute use the active rollout
81
+ even when the Throughline DB has no Codex `bodies` rows.
82
+ - `throughline codex-capture`, which captures explicit Codex rollout active
83
+ turns into a namespaced `codex:<thread_id>` Throughline DB session. Re-capture
84
+ rebuilds that session so rolled-back tail turns do not survive as current L2.
85
+ - Codex capture now stores rollout function-call L3 details as well as L2
86
+ bodies: `function_call` becomes `details.kind = tool_input`, and
87
+ `function_call_output` becomes `details.kind = tool_output`.
88
+ - Host-mode L2→L1 backend selection. Claude-primary keeps the existing
89
+ `codex-sidecar` / Claude Haiku compatibility route, while Codex-primary uses
90
+ the Codex CLI backend and reports failure explicitly instead of falling back.
91
+ - `throughline codex-summarize`, which writes L1 skeletons for captured
92
+ `codex:<thread_id>` sessions through the Codex CLI backend once the captured
93
+ body count exceeds the L2 window.
94
+ - `throughline codex-resume`, which renders captured `codex:<thread_id>` memory
95
+ as Codex active-work context. `--format handoff` emits a concise fresh-thread
96
+ handoff prompt for safe continuation without mutating the current Codex
97
+ thread; the handoff view caps recent L2 entries, long body text, and detail
98
+ references while preserving the full context in the normal text renderer.
99
+ `--format item-json` emits a Codex developer message item so hosts can
100
+ inject the memory as current-task context instead of a passive archive.
101
+ `--memo-stdin` prepends a Codex-primary in-flight memo without touching Claude
102
+ `/tl` batons.
103
+ - `throughline codex-handoff-smoke`, a read-only validator for the
104
+ `codex-resume --format handoff` prompt. It checks fresh-thread header /
105
+ current-task contract / source session / start instruction / mutation
106
+ boundary / prompt size / detail-command deduplication before a user starts a
107
+ new Codex thread with that prompt.
108
+ - `throughline codex-handoff-model-smoke`, an explicit opt-in model smoke for
109
+ the same handoff prompt. It first requires the structural handoff smoke to be
110
+ ready, then runs `codex exec --ephemeral --ignore-user-config --ignore-rules
111
+ --sandbox read-only` with a marker prompt. `--dry-run` inspects the exact
112
+ readiness / command boundary without starting Codex exec, and
113
+ `--print-prompt` can include the combined prompt for audit. Live model smoke
114
+ requires `THROUGHLINE_EXPERIMENTAL_CODEX_HANDOFF_MODEL_SMOKE=1` and does not
115
+ mutate the current Codex thread.
116
+ - `throughline codex-handoff-start`, a guided read-only fresh-thread start plan
117
+ for Codex handoff. It reports the structural smoke command, model-smoke dry-run
118
+ boundary, handoff render command, optional live model smoke command, and can
119
+ include the handoff prompt with `--print-prompt`. When `--memo-stdin` is used,
120
+ the replay commands include `--memo-stdin` and the output reminds callers to
121
+ pipe the same memo.
122
+ - `throughline doctor --codex`, a read-only Codex-primary diagnostic that shows
123
+ current thread env identity, rollout candidates for the cwd, captured
124
+ `codex:<thread_id>` DB sessions, context refresh blockage, new-thread
125
+ handoff readiness, and the next capture/resume commands.
126
+ - Global `throughline install` now also registers the Codex Stop hook in
127
+ `~/.codex/hooks.json` with absolute node + installed `bin/throughline.mjs`,
128
+ `async: false`, and `timeoutSec: 300`, and enables
129
+ `[features].codex_hooks = true` in `~/.codex/config.toml`. Existing non-
130
+ Throughline Codex hooks, including Caveat / Spotter hooks, are preserved.
131
+ - Global install now also installs a `$throughline` Codex skill under
132
+ `~/.codex/skills/throughline`, giving Codex a natural-language entrypoint for
133
+ Throughline status, resume, summarize, dry-run, preflight, and explicit
134
+ execute workflows. The rollback / inject execute path is enabled again after
135
+ controlled rollback model-visible smokes failed to reproduce rollback marker
136
+ resurrection.
137
+ - A bare `$throughline` Codex skill invocation now runs the safe inspection
138
+ shape: `doctor --codex`, guarded dry-run, and preflight. Explicit
139
+ `trim --execute --host codex --all` mutates the current Codex thread when the
140
+ user asks for it and the guard checks pass.
141
+ - Codex Stop hook automatic refresh now attempts guarded rollback + Throughline
142
+ DB memory injection at the 90% verified-usage threshold. Estimate-only usage
143
+ still never triggers mutation.
144
+ - `throughline codex-visibility-smoke`, an experimental opt-in Codex app-server
145
+ smoke that injects the Codex active-work developer message and starts a
146
+ marker-check model turn. It requires
147
+ `THROUGHLINE_EXPERIMENTAL_CODEX_MODEL_VISIBLE_SMOKE=1` and supports explicit
148
+ model-turn timeouts with `--request-timeout-ms` / `--timeout-ms`; it also
149
+ accepts the same `--memo-stdin` active-work memo surface as `codex-resume`.
150
+ `--resume-after-inject` re-runs `thread/resume` after injection before
151
+ starting the marker turn, so resume persistence can be checked explicitly.
152
+ - Codex-first roadmap docs that set the next implementation order: Codex
153
+ primary support with a Codex CLI L2→L1 backend, then Codex rewind-compatible
154
+ trim, then Claude rewind finalization.
155
+
156
+ ### Changed
157
+ - Resume context now frames recent L2 as an active work thread with explicit
158
+ reading/continuation instructions at both the top and bottom of injected
159
+ memory. Older L2 entries may be superseded by later entries and are not
160
+ blindly treated as still-current truth.
161
+ - Hook entry modules are import-safe and expose `run()` so subprocess tests can
162
+ cover the Claude path without touching the user's real database.
163
+ - VSCode task tests suppress Claude-facing `<system-reminder>` notices by
164
+ default and opt in only for notice assertions, keeping test output from
165
+ looking like fresh user-facing instructions.
166
+ - `codex-sidecar` subprocess calls now shell-wrap on Windows so npm global
167
+ `.cmd` shims resolve consistently, matching the existing Claude CLI handling.
168
+ - L2→L1 sidecar summarization accepts the stable `SidecarResult` JSON shape
169
+ (`summary` without `status: "ok"`) as well as the older test fixture shape.
170
+ - `codex-sidecar-dry-run --turn-timeout-ms` now forwards the timeout into the
171
+ normalized sidecar request instead of only changing the local subprocess
172
+ timeout.
173
+ - `.codex-sidecar.yml` no longer denies every path containing `token`, so
174
+ legitimate source files such as `src/token-monitor.mjs` remain reviewable.
175
+ - `.codex-sidecar.yml` allows release docs and Claude slash commands, so
176
+ review/risk-check sidecars can inspect the same contract surfaces that are
177
+ shipped in the npm tarball.
178
+ - `.codex-sidecar/logs/` is ignored as a runtime artifact from real sidecar
179
+ smoke runs.
180
+ - Codex trim host status now distinguishes verified app-server rollback/inject
181
+ primitives from guarded execution requirements. Codex Stop hook automatic
182
+ refresh is enabled only at the 90% verified-usage threshold and still uses the
183
+ same explicit thread identity, injectable DB memory, and rollout/app-server
184
+ turn-count guards.
185
+ - Trim dry-run now carries an explicit Codex thread identity separately from
186
+ the Claude/Throughline `session_id`, avoiding latest-rollout guessing.
187
+ - Codex trim can now use `THROUGHLINE_CODEX_THREAD_ID` or `CODEX_THREAD_ID` as
188
+ a current-thread identity signal when `--codex-thread-id` is omitted; the CLI
189
+ flag remains authoritative and Throughline still does not guess from the
190
+ latest rollout.
191
+ - `throughline doctor --trim --host codex` now reports whether a current Codex
192
+ thread id is available from env and adjusts its dry-run example accordingly.
193
+ - `throughline doctor --trim --host codex` now also reports the read-only host
194
+ primitive audit status as diagnostic evidence rather than an execute blocker.
195
+ - `throughline trim --preflight --host codex --codex-thread-id <id>` now
196
+ performs a guarded Codex app-server initialize/read/resume check and stops
197
+ before sending rollback or inject. When the plan source is `codex-rollout`,
198
+ preflight compares rollout active turns with app-server read/resume turns and
199
+ refuses the plan if they differ.
200
+ - Codex rollout-backed trim source now excludes the current in-flight turn from
201
+ rollback planning, including the latest post-rollback assistant continuation.
202
+ This keeps preflight aligned with app-server `thread/read` / `thread/resume`,
203
+ which only report completed host-visible turns during an ongoing Codex turn.
204
+ - `throughline trim --execute --host codex --codex-thread-id <id>` no longer
205
+ requires `THROUGHLINE_EXPERIMENTAL_CODEX_TRIM_EXECUTE=1` and no longer treats
206
+ host primitive audit or restore-safety diagnostics as mutation blockers.
207
+ Execute still refuses before mutation when Codex thread identity, injectable
208
+ Throughline DB memory, or rollout/app-server turn-count agreement is missing.
209
+ - Codex guarded execute now polls post-inject `thread/read` until the injected
210
+ memory item is visible when the app-server reports an injected turn count, and
211
+ reports `postInjectVisibilityCheck` so stale immediate app-server reads are
212
+ explicit. If `thread/inject_items` returns no turn list, developer memory is
213
+ treated as item-level injection and the expected post-inject turn count remains
214
+ the rollback result turn count.
215
+ - Codex guarded execute status now separates live mutation from durable
216
+ success: a visible app-server mutation reports `execute-sent-live-only` with
217
+ `durableVerification.durableVerified: false` and exits non-zero; post-inject
218
+ visibility timeout reports `execute-unverified`.
219
+ - Codex guarded execute can now report `execute-durable-verified` only when the
220
+ rollout records a new `thread_rolled_back` event, records the injected
221
+ `## Throughline: Active Work Context` memory, and restore-safety diagnostics
222
+ remain `ok`.
223
+ - Added `throughline codex-restore-smoke`, a read-only diagnostic that starts
224
+ fresh Codex app-server processes and compares `thread/read`,
225
+ `thread/resume`, and paginated `thread/turns/list` turn counts against the
226
+ rollout active turn count. Its proof scope is
227
+ `app_server_process_restart_only`, and it always reports `restartSafe: false`
228
+ because it is not VS Code restart / reconnect proof. If the required
229
+ read-only app-server request fails, the CLI returns structured
230
+ `app-server-restore-smoke-error` JSON instead of a stack trace.
231
+ - `codex-restore-smoke --inspect-risky-rollout` can now inspect a risky rollout
232
+ read-only and search app-server responses for retained rollback text. If
233
+ retained text appears in direct turn text or `replacement_history`, the smoke
234
+ reports `app-server-restore-text-retained` instead of a success-like stable
235
+ status, even when read/resume/list turn counts are stable. If retained text
236
+ appears only in quoted/tool-output fields such as `aggregatedOutput`, it
237
+ reports `app-server-restore-text-quoted`. Match reports include sample JSON
238
+ paths, location kinds, risk classes, and blocking-candidate summaries.
239
+ - `codex-vscode-rollback-smoke` text output now includes retained rollback text
240
+ count, resurrected user message count, and restore-safety risk type summary so
241
+ incident audits do not require opening the full JSON payload.
242
+ - `codex-restore-source-audit` now inventories SQLite-backed VS Code storage
243
+ candidates (`.vscdb`, `.sqlite`, `.sqlite3`, `.db`) read-only and reports
244
+ table / searchable column / needle match summaries alongside raw byte matches.
245
+ - `codex-restore-source-audit` now classifies VS Code log evidence into thread
246
+ id hits, retained rollback text hits, patch-apply failures, thread stream
247
+ broadcasts, and `replacement_history` signals, including a first/last
248
+ timestamp window for patch-apply failures when log timestamps are present.
249
+ - `codex-restore-source-audit` now reports explicit VS Code extension
250
+ rollback non-resurrection projection candidates, such as
251
+ `replacement_history` filter / tombstone paths, separately from deletion-based
252
+ repair primitives.
253
+ - `codex-restore-smoke --inspect-risky-rollout` now separates blocking retained
254
+ text candidates from quoted/tool-output matches. Direct turn text and
255
+ `replacement_history` keep the `app-server-restore-text-retained` status;
256
+ matches found only in fields such as `aggregatedOutput` report
257
+ `app-server-restore-text-quoted` with `blocking-candidates=no`.
258
+ - Added `throughline codex-rollback-model-visible-smoke`, a controlled
259
+ two-phase smoke for the unresolved rollback question. `--prepare` starts a
260
+ unique marker user turn and rolls it back; `--verify` later starts a model
261
+ turn that contains only the marker prefix, not the full marker. A returned
262
+ full marker reports `reproduced`; an explicit not-visible answer reports
263
+ `not-reproduced`. The command is gated by
264
+ `THROUGHLINE_EXPERIMENTAL_CODEX_ROLLBACK_MODEL_VISIBLE_SMOKE=1`. Live runs can
265
+ use `--marker-file` so the full marker is not printed into the same thread
266
+ being tested; marker-file prepares also use a unique per-trial prefix. Verify
267
+ output reports `rolledBackMarkerModelVisible` and `modelReportedNotVisible`
268
+ separately from `restartSafe`.
269
+ - Real controlled current-thread smoke on 2026-05-08 returned
270
+ `not-reproduced` both before and after a VS Code reload/reconnect command,
271
+ with `promptIncludesMarker: false` and no observed full marker. This weakens
272
+ the rollback-resurrection hypothesis for the controlled marker path enough to
273
+ remove the overbroad automatic Codex trim blocker. Retained compacted history
274
+ and same-thread host primitive audit remain diagnostics.
275
+ - Added `throughline codex-restore-source-audit`, a read-only local inventory of
276
+ Codex rollout, `session_index.jsonl`, `state_*.sqlite`, and VS Code
277
+ globalStorage / workspaceStorage candidates for an explicit Codex thread. It
278
+ now also scans VS Code `settings.json`, VS Code logs, and installed
279
+ OpenAI/Codex VS Code extension bundles for restore-path signals such as
280
+ `thread/read`, `thread/resume`, `thread/turns/list`, reconnect
281
+ `needs_resume`, persisted webview atoms, and follow-up queue signals.
282
+ Its proof scope is `local_restore_source_inventory_only`, and it does not
283
+ prove VS Code restart safety.
284
+ - Added `throughline codex-vscode-restore-smoke`, a manual two-phase VS Code
285
+ reload/reconnect proof protocol. `--prepare` injects a hidden active-work
286
+ marker memory behind `THROUGHLINE_EXPERIMENTAL_CODEX_VSCODE_RESTORE_SMOKE=1`;
287
+ `--verify` scans the rollout for a marker-free smoke prompt followed by an
288
+ assistant marker-only answer after prepare, and rejects marker leaks in the
289
+ user prompt. It reports `restartSafe: true` only with an explicit
290
+ `--after-vscode-restart` acknowledgement and marker proof.
291
+ - Real VS Code reload/reconnect marker proof passed for thread
292
+ `019dfddb-8288-7392-a461-bf3ebc5da409` with marker
293
+ `TL_CODEX_VSCODE_RESTORE_46888202`. This proves hidden developer memory
294
+ visibility across reconnect, not rollback-target non-resurrection.
295
+ - Tightened the VS Code restore smoke verifier after a false-positive hazard:
296
+ assistant marker mentions in normal progress text no longer count. The proof
297
+ now requires the marker-free smoke prompt and an assistant marker-only answer.
298
+ - Added `throughline codex-vscode-rollback-smoke`, a read-only rollback
299
+ non-resurrection verifier. It requires a rollback event, rolled-back user
300
+ text, a later user turn, restore-safety `ok`, and explicit
301
+ `--after-vscode-restart` before reporting `restartSafe: true`.
302
+ - Added `throughline codex-host-primitive-audit`, a read-only audit that
303
+ generates the installed Codex app-server JSON schema and checks whether a
304
+ same-thread rollback non-resurrection primitive exists. The primitive may
305
+ delete/rewrite retained rollback sources, or isolate/project them away from
306
+ model-visible input. It now also reports a host-agnostic same-thread repair
307
+ contract requiring a rollback non-resurrection guarantee, memory reinjection,
308
+ post-repair host reads, and restart/reconnect non-resurrection proof; VS Code
309
+ diagnostics can provide evidence but do not satisfy the contract. On
310
+ `codex-cli 0.128.0-alpha.1`, the audit reports
311
+ `diagnostic-only`: rollback/inject/new-thread primitives exist, but no
312
+ current-thread rollback non-resurrection primitive is exposed, and
313
+ `thread/resume(history)` is marked unstable/do-not-use with `thread_id`
314
+ ignored.
315
+ - Real incident-shaped live rollback run for thread
316
+ `019dfddb-8288-7392-a461-bf3ebc5da409` remains a `restoreSafety: risk`
317
+ incident: rollout recorded `thread_rolled_back` and injected active-work
318
+ memory, while `compacted.replacement_history` retained rollback-targeted user
319
+ text and read-only diagnostics later observed matching text after rollback.
320
+ Later app-server restore inspection separated direct user-message candidates
321
+ from quoted/tool-output matches; the current thread's retained app-server
322
+ matches are `aggregatedOutput` only, and the controlled model-visible smoke
323
+ did not reproduce marker resurrection. Automatic Codex trim is enabled again
324
+ with DB memory and turn-count guards.
325
+ - Codex trim dry-run plans and `doctor --trim --host codex` now expose the safe
326
+ continuation path as `new-thread-handoff-only`: use the guided entrypoint
327
+ `throughline codex-handoff-start --session codex:<thread-id>`, or validate the
328
+ handoff with `throughline codex-handoff-smoke --session codex:<thread-id>`, optionally
329
+ inspect the model-smoke boundary with
330
+ `throughline codex-handoff-model-smoke --session codex:<thread-id> --dry-run --json`,
331
+ render a fresh-thread handoff with
332
+ `throughline codex-resume --session codex:<thread-id> --format handoff`, and
333
+ start a new Codex thread, without mutating the current risky thread.
334
+ - Human-readable trim dry-run reports now truncate the inline curated memory
335
+ preview for scanability while leaving full `memoryPreview.text` intact in JSON
336
+ and in the Codex `codex-resume` safe-continuation command.
337
+ - `parseCodexRolloutFile` now exposes `userMessagesAfterRollback`,
338
+ `latestRollbackAt`, and `restoreSafety.rolledBackTexts` so rollback smoke
339
+ results carry enough audit evidence instead of only pass/fail status.
340
+ - Guarded execute now still checks rollout durability evidence when post-inject
341
+ live read visibility times out, so reports can include observed rollback
342
+ markers, observed injected memory, and post-execute restore-safety risk.
343
+ - Codex trim preflight / execute now reports planned restore-safety diagnostics:
344
+ if the planned rollback would remove user text that already appears in
345
+ `compacted.replacement_history`, Throughline reports
346
+ `planned_restore_safety_risk` as diagnostic evidence but does not refuse
347
+ solely for that reason.
348
+ - `codex-restore-source-audit` no longer uses very short retained rollback texts
349
+ as VS Code storage needles, avoiding false positives from generic prompts such
350
+ as `go`.
351
+ - Codex guarded execute no longer uses the old
352
+ `THROUGHLINE_EXPERIMENTAL_CODEX_TRIM=1` gate or the later
353
+ `THROUGHLINE_EXPERIMENTAL_CODEX_TRIM_EXECUTE=1` blocker. It now requires only
354
+ explicit `--execute`, Codex thread identity, injectable Throughline DB memory,
355
+ and rollout/app-server turn-count checks before mutation.
356
+ - Codex app-server helpers now report spawn failures explicitly instead of
357
+ waiting for a request timeout.
358
+ - Codex app-server stderr in diagnostics is now capped after warning
359
+ compaction, so external plugin/OAuth warnings cannot make smoke JSON
360
+ excessively large.
361
+ - `throughline codex-threads` lists read-only Codex rollout/thread candidates
362
+ for the current project so users can pass an explicit `--codex-thread-id`
363
+ without Throughline guessing the active thread.
364
+ - `throughline codex-threads` now sorts candidates by rollout file mtime, not
365
+ stale `session_index.jsonl` timestamps, so actively written threads appear
366
+ before old probe threads.
367
+ - Codex trim memory previews now apply `thread_rolled_back` rollout events
368
+ before building the active work thread, so rolled-back tail turns are not
369
+ reintroduced as current memory.
370
+ - Codex trim dry-run now reports a heuristic context reduction estimate when
371
+ rollout text is available: rollback-candidate estimated tokens, injected
372
+ memory estimated tokens, net estimated reduction, and reduction percentage.
373
+ This is intentionally labeled as `chars / 4`, not an exact host tokenizer
374
+ measurement.
375
+ - Codex rollout parsing now mirrors app-server turn counts for injected
376
+ active-work developer messages and for the latest post-rollback assistant
377
+ continuation turn. This keeps guarded trim preflight aligned after a real
378
+ rollback/inject cycle.
379
+ - Codex guarded trim now uses rollout/app-server data for rollback planning and
380
+ turn-count guards, but uses Throughline DB memory for injection when
381
+ available: older turns as L1 summaries, the latest 20 turns as full L2 bodies,
382
+ and L3 as references only; L3 bodies / tool payloads are not injected.
383
+ Execute refuses before mutation when only a rollout preview is available.
384
+ - `throughline doctor --codex` now reports context-refresh readiness, including
385
+ rollback source, inject memory source, the L1/L2/L3 memory contract, current
386
+ memory counts, and heuristic reduction estimate when available.
387
+ - `throughline doctor --codex` now reports the host primitive audit status and
388
+ prints `throughline codex-host-primitive-audit` as the next read-only command
389
+ for diagnostic detail.
390
+ - `throughline doctor --codex` labels context refresh as `ready` when the
391
+ executable guard inputs are present, even if restore-safety diagnostics are
392
+ risky. Those diagnostics are reported separately.
393
+ - `throughline doctor --codex` now reports the VS Code monitor task status and
394
+ prints the Reload Window note there too, because Codex Stop hook stdout is not
395
+ guaranteed to appear in the chat.
396
+ - `throughline doctor --codex` and human-readable guarded trim reports now label
397
+ L3 as references-only and explicitly say L3 bodies are not injected.
398
+ - Guarded Codex execute now performs the same rollout/app-server turn-count
399
+ check before rollback; mismatch or unavailable app-server counts refuse
400
+ execution before any rollback or inject request is sent.
401
+ - Codex app-server stderr in trim preflight / guarded execute now compacts
402
+ repeated unknown-turn item warnings while preserving the first occurrence and
403
+ unrelated diagnostics.
404
+ - Codex visibility smoke now waits for app-server notification events
405
+ (`item/agentMessage/delta` or `turn/completed`) after `turn/start`, so it does
406
+ not mistake an accepted model turn for completed model visibility.
407
+ - Codex visibility smoke can now verify the `inject -> resume -> turn/start`
408
+ path. Real-host smoke confirmed marker
409
+ `TL_CODEX_RESUME_AFTER_INJECT_REAL_20260506` after a post-inject resume.
410
+ - Codex CLI L1 summarization now uses the `codex exec` option set supported by
411
+ local `codex-cli 0.128.0-alpha.1`; the removed `--ask-for-approval` flag is
412
+ no longer passed. The subprocess also passes `--ignore-user-config` so
413
+ user-level Codex plugins/hooks are not loaded during the summarization call.
414
+ - Codex CLI summarization errors now include compacted stderr in JSON output,
415
+ preserving actionable `ERROR:` lines without dumping enormous HTML challenge
416
+ pages verbatim.
417
+ - `throughline monitor` is now host-aware for Claude and Codex state files.
418
+ Codex Stop hook writes `codex:<thread_id>` monitor state with `rolloutPath`,
419
+ snapshots verified rollout `token_count` usage when present, and marks
420
+ rollout-text estimates with `estimated: true` / `est` when no token-count
421
+ event is available. State filenames are URL-encoded so `codex:` session ids
422
+ remain portable. The compact row now displays used tokens over the model
423
+ context window, instead of percent plus remaining tokens.
424
+
425
+ ### Documentation
426
+ - Added integrated implementation/TODO plan and cross-links for the Codex dual
427
+ support and rollback trim design docs.
428
+ - README now documents Claude-primary behavior, optional Codex sidecar usage,
429
+ and the current dry-run-only state of context trim.
430
+ - npm packaging now includes `docs/` and `CHANGELOG.md`, so README-linked
431
+ design docs and the `throughline_handoff` example context are present in the
432
+ tarball.
433
+ - npm packaging also includes `.codex-sidecar.yml`, keeping the documented
434
+ sidecar diagnostics / dry-run examples reproducible from the package source.
435
+ - `npm test` now includes nested `src/cli/*.test.mjs` coverage in addition to
436
+ the top-level `src/*.test.mjs` tests.
437
+ - Recorded the 2026-05-06 Codex app-server rollback/inject spike: `thread/read`
438
+ can read persisted threads, `thread/rollback` requires a loaded thread via
439
+ `thread/resume`, and injected developer items are visible to the next turn.
440
+ - Recorded the 2026-05-06 real Codex-primary active-work smoke: injected
441
+ `codex-resume` developer context produced marker `TL_CODEX_VISIBLE_REAL_20260506_C`
442
+ in `item/agentMessage/delta`, confirming the rendered memory is model-visible
443
+ as current work in a real Codex host.
444
+ - Documented the current Codex-primary setup flow. Global install manages only
445
+ the Throughline Codex Stop hook / skill and preserves existing
446
+ non-Throughline hooks; users can verify natural capture with `doctor --codex`,
447
+ then summarize, render, or inject active-work memory through the `$throughline`
448
+ skill or the explicit Codex CLI surfaces.
449
+ - Recorded the 2026-05-06 final Codex Stop hook smoke: after the absolute-path
450
+ hook shape was installed, a newly started VSCode-origin Codex thread
451
+ `019dfd62-9a9d-7211-bf91-89d8e3fc908e` naturally advanced the latest DB
452
+ session to `codex:019dfd62-9a9d-7211-bf91-89d8e3fc908e` as reported by
453
+ `doctor --codex`.
454
+ - Added and completed the Codex monitor implementation plan, documenting the
455
+ host-aware state contract, Codex `rolloutPath`, verified `token_count`
456
+ usage, and explicit estimate labeling.
457
+
458
+ ## [0.3.24] — 2026-05-02
459
+
460
+ ### Added
461
+ - `shouldRecommendGitignore` in [src/vscode-task.mjs](src/vscode-task.mjs):
462
+ when `ensureMonitorTaskFile` transitions to `created` / `merged` / `repaired`
463
+ inside a git repository whose `.gitignore` lacks a `.vscode/tasks.json`-
464
+ matching entry, emit a one-time `<system-reminder>` to stdout recommending
465
+ `.gitignore` registration. Suppressed by a `.throughline-gitignore-noted`
466
+ marker so it does not repeat. Negation patterns (`!.vscode/tasks.json`) are
467
+ treated as explicit-track intent and still trigger the recommendation.
468
+
469
+ ### Why
470
+ - `.vscode/tasks.json` always contains environment-specific absolute paths
471
+ (`process.execPath`, the install location of `throughline.mjs`). Even though
472
+ v0.3.23 auto-repairs stale paths after the fact, the right answer is to not
473
+ commit it in the first place. The published npm tarball was already clean of
474
+ absolute paths (`files` field excludes `.vscode/`, no hardcoded paths in
475
+ source); this release strengthens runtime advice for the consumer side.
476
+
477
+ ## [0.3.23] — 2026-05-02
478
+
479
+ ### Added
480
+ - Cross-environment `.vscode/tasks.json` repair: when an existing Monitor task
481
+ references absolute paths that don't exist on the current machine
482
+ (e.g. a Windows path on a WSL2 clone), `ensureMonitorTaskFile` now rewrites
483
+ just `command` / `args` while preserving any `label` / `presentation` /
484
+ `isBackground` customization. New helpers `findMonitorTaskIndex` and
485
+ `isMonitorTaskBroken` (absolute-path + non-existent test) drive the new
486
+ `action: 'repaired'` branch, and `buildSetupNotice('repaired')` returns a
487
+ one-time `Reload Window` notice.
488
+ - `resolveThroughlineOnPath` in [src/cli/install.mjs](src/cli/install.mjs):
489
+ after `throughline install` completes, walk PATH to confirm `throughline`
490
+ resolves. If not, print a stderr fix recipe (`npm prefix -g` → add to
491
+ `~/.bashrc` → re-run `doctor`). Catches the silent-fail case where
492
+ `~/.npm-global/bin` is exported in `~/.profile` but not `~/.bashrc` (VSCode's
493
+ interactive non-login bash skips `.profile`).
494
+
495
+ ### Documentation
496
+ - README Troubleshooting now covers PATH resolution, WSL2 ↔ Windows PATH
497
+ crossover, cross-OS DB separation (each `os.homedir()` is its own DB), and
498
+ the auto-repair behavior for stale tasks.
499
+
500
+ ## [0.3.22] — 2026-04-19
501
+
502
+ ### Changed
503
+ - Register the `Stop` hook with `"async": true` so `throughline process-turn`
504
+ runs in the background and no longer blocks the user-visible turn completion
505
+ on the Haiku L1-summarization subprocess (which can take seconds to tens of
506
+ seconds). L1 summaries are only needed for the *next* `SessionStart`
507
+ injection, so there is no reason to make the current turn wait for them.
508
+ `SessionStart` and `UserPromptSubmit` remain synchronous because their work
509
+ must complete before the next turn begins.
510
+
511
+ ### Migration
512
+ - Existing installs need `throughline uninstall && throughline install` to
513
+ pick up the new `async` flag. The install dedup compares the `command`
514
+ string, so a re-install without uninstalling first will skip the already-
515
+ registered (but still synchronous) entry.
516
+
517
+ ## [0.3.21] — 2026-04-19
518
+
519
+ ### Changed
520
+ - `throughline install` now writes the `/tl` and `/sc-detail` slash command
521
+ definitions to `~/.claude/commands/*.md` (user scope) instead of relying on
522
+ per-project `.claude/commands/`. New projects no longer need to copy the
523
+ slash command files manually.
524
+
525
+ ## [0.3.20] — 2026-04-19
526
+
527
+ ### Changed
528
+ - Monitor's context-exhaustion warning now recommends `/tl` instead of
529
+ `/clear`, so the suggested action does not break the handoff baton path.
530
+
531
+ ## [0.3.19] — 2026-04-18
532
+
533
+ ### Added
534
+ - `ensureMonitorTaskFile` now emits a one-time `<system-reminder>` to stdout
535
+ the moment it creates or merges a `.vscode/tasks.json`, so Claude can tell
536
+ the user a **Developer: Reload Window** is needed to activate the
537
+ `folderOpen` task. The notice is silent on the `already_present` path so it
538
+ fires at most once per project.
539
+
540
+ ## [0.3.18] — 2026-04-18
541
+
542
+ ### Added
543
+ - Fan-out of `ensureMonitorTaskFile` to **all three hooks** (`SessionStart`,
544
+ `UserPromptSubmit`, `Stop`) so `.vscode/tasks.json` is provisioned by
545
+ whichever hook fires first in a given environment. Previously only `Stop`
546
+ invoked it, which meant projects where `Stop` did not fire on the first
547
+ session never got the monitor task. The provisioning logic is idempotent,
548
+ so the redundant calls are no-ops once the task exists.
549
+
550
+ ## [0.3.0] — 2026-04-18
551
+
552
+ This is the first release line that supports the schema v7 / `/tl` baton
553
+ handoff with in-flight memo and L3 thinking storage. `0.3.1` through `0.3.17`
554
+ were rapid-fire monitor render-bug iterations published to npm but not tagged
555
+ on GitHub; they are summarized in the rollup section below for completeness.
556
+
557
+ ### Added
558
+ - **In-flight memo via `/tl`** (schema v7). When `/tl` fires, the
559
+ `UserPromptSubmit` hook writes a baton row, then Claude itself pipes a
560
+ Markdown memo (next planned move, current hypothesis, open questions,
561
+ in-progress TODOs) into `throughline save-inflight`, which attaches it to
562
+ `handoff_batons.memo_text`. The next `SessionStart` injects the memo at the
563
+ top of the resume context so the new Claude picks up mid-thought.
564
+ - **Extended thinking captured at L3.** Assistant `thinking` blocks are
565
+ persisted in `details` with `kind='thinking'`. The most recent turn's
566
+ thinking is injected inline above the L2 history on `SessionStart`; older
567
+ thinking remains retrievable via `throughline detail <time>`.
568
+ - **Resume reframing.** The injected context is presented as "resuming an
569
+ interrupted task" rather than "reading past logs", so the new session
570
+ behaves like a continuation rather than a recap.
571
+
572
+ ## [0.2.0] — 2026-04-18
573
+
574
+ ### Added
575
+ - **Explicit `/tl` baton handoff** (schema v6). Replaces the auto-inheritance
576
+ heuristics. The previous session writes a baton, the next session consumes
577
+ it within a 1-hour TTL, and merge happens via deterministic
578
+ `UPDATE session_id = ?` inside a `BEGIN IMMEDIATE` transaction. Sessions
579
+ without a baton start clean — no false-positive carryover.
580
+
581
+ ## [0.1.0] — 2026-04-17
582
+
583
+ ### Added
584
+ - Initial public release on npm. Schema v5 (L1/L2/L3 with `kind` and
585
+ `source_id` columns on `details`).
586
+ - CLI: `install`, `uninstall`, `doctor`, `status`, `monitor`, `detail`.
587
+ - Hook entry points: `session-start`, `process-turn`, `prompt-submit`.
588
+ - Multi-session token monitor reading real `message.usage` from the
589
+ Claude Code transcript JSONL (no `length / 4` heuristics) with 1M-context
590
+ detection.
591
+ - Zero runtime dependencies; uses Node 22.5+ built-in `node:sqlite`.
592
+
593
+ ---
594
+
595
+ ## Unreleased pre-0.3.18 iterations (npm-only, not tagged on GitHub)
596
+
597
+ These versions shipped to npm in rapid succession on 2026-04-18 while
598
+ debugging a single class of monitor render bugs (rows stacking instead of
599
+ redrawing in place inside Windows ConPTY + VS Code task terminals). They are
600
+ rolled up here because individually they are not interesting consumption
601
+ units — the user-visible result is "the monitor finally renders correctly
602
+ across PTY, ConPTY, VS Code task terminal, and panel resize".
603
+
604
+ | Version | Theme |
605
+ | ------- | ----- |
606
+ | `0.3.1`–`0.3.2` | Monitor crash resilience, accurate 1M-context detection, color-blind-safe markers. |
607
+ | `0.3.3` | `.vscode/tasks.json` auto-provisioning (two-stage merge, JSONC detection). |
608
+ | `0.3.4`–`0.3.5` | Stop-hook `state.usage` snapshot, `doctor --session` diagnostic, `(Nm ago)` per-row stamp, columns polling. |
609
+ | `0.3.6`–`0.3.12` | Successive guesses at the "rows stacking" render bug (columns fallback, `isTTY` branching, `clearScreen`, alt screen, `type:shell`). All later confirmed off-target by the `--diag` instrumentation added in `0.3.11`. |
610
+ | `0.3.13` | Root-cause fix: removed the `>= 40` columns floor in `resolveColumns` that was misclassifying real 30-cell panels as "insane" and falling back to 200, which then wrapped output and undercounted CUU on redraw. |
611
+ | `0.3.14`–`0.3.15` | Diagnostic surfacing (startup header, per-frame columns) confirming that `process.stdout.columns` does not track panel resize on Windows ConPTY + VS Code tasks. |
612
+ | `0.3.16` | New module `src/terminal-size.mjs`: query the terminal directly via OSC 18t (`\x1b[18t`) and parse the `\x1b[8;rows;cols t` reply on stdin in raw mode. Resize now follows panel width even when Node's `columns` is frozen. |
613
+ | `0.3.17` | Force a full `clearScreen` (`\x1b[2J\x1b[3J\x1b[H`) on every resize-triggered redraw so the previous, wrongly-sized frame can no longer stack beneath the new one. |
614
+
615
+ ### Lessons preserved as memory
616
+
617
+ The seven-version stretch of `0.3.6`–`0.3.12` was guesswork without
618
+ measurement; once `--diag` (`0.3.11`) and `terminal-size.mjs` (`0.3.16`) were
619
+ added, the real cause was found in two more versions. This is recorded as a
620
+ working-discipline note: when a terminal- or platform-specific bug resists
621
+ two attempts, instrument first instead of patching again.
622
+
623
+ ---
624
+
625
+ [0.3.22]: https://github.com/kitepon-rgb/Throughline/releases/tag/v0.3.22
626
+ [0.3.21]: https://github.com/kitepon-rgb/Throughline/compare/v0.3.19...v0.3.21
627
+ [0.3.20]: https://github.com/kitepon-rgb/Throughline/compare/v0.3.19...v0.3.20
628
+ [0.3.19]: https://github.com/kitepon-rgb/Throughline/releases/tag/v0.3.19
629
+ [0.3.18]: https://github.com/kitepon-rgb/Throughline/releases/tag/v0.3.18
630
+ [0.3.0]: https://github.com/kitepon-rgb/Throughline/releases/tag/v0.3.0
631
+ [0.2.0]: https://github.com/kitepon-rgb/Throughline/releases/tag/v0.2.0
632
+ [0.1.0]: https://github.com/kitepon-rgb/Throughline/compare/v0.1.0