cueline 0.1.6 → 0.2.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 (188) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +50 -0
  4. package/README.ja.md +77 -30
  5. package/README.ko.md +77 -30
  6. package/README.md +71 -29
  7. package/README.zh-CN.md +77 -30
  8. package/README.zh-TW.md +74 -29
  9. package/config/routing.schema.json +3 -0
  10. package/dist/src/api-caller-work.js +58 -14
  11. package/dist/src/api-caller-work.js.map +1 -1
  12. package/dist/src/api-contracts.d.ts +56 -0
  13. package/dist/src/api-controller-handoff.d.ts +5 -1
  14. package/dist/src/api-controller-handoff.js +178 -38
  15. package/dist/src/api-controller-handoff.js.map +1 -1
  16. package/dist/src/api-run-verification.d.ts +3 -0
  17. package/dist/src/api-run-verification.js +174 -0
  18. package/dist/src/api-run-verification.js.map +1 -0
  19. package/dist/src/api-runtime-lifecycle.d.ts +6 -1
  20. package/dist/src/api-runtime-lifecycle.js +97 -8
  21. package/dist/src/api-runtime-lifecycle.js.map +1 -1
  22. package/dist/src/api.d.ts +26 -4
  23. package/dist/src/api.js +111 -40
  24. package/dist/src/api.js.map +1 -1
  25. package/dist/src/browser/browser-adapter.d.ts +41 -0
  26. package/dist/src/browser/codex-iab/bootstrap.d.ts +21 -0
  27. package/dist/src/browser/codex-iab/bootstrap.js +174 -9
  28. package/dist/src/browser/codex-iab/bootstrap.js.map +1 -1
  29. package/dist/src/browser/codex-iab/chatgpt-client.d.ts +3 -0
  30. package/dist/src/browser/codex-iab/chatgpt-client.js +216 -70
  31. package/dist/src/browser/codex-iab/chatgpt-client.js.map +1 -1
  32. package/dist/src/browser/codex-iab/probe.d.ts +36 -0
  33. package/dist/src/browser/codex-iab/probe.js +217 -0
  34. package/dist/src/browser/codex-iab/probe.js.map +1 -0
  35. package/dist/src/browser/codex-iab/recovery-evidence.d.ts +1 -1
  36. package/dist/src/browser/codex-iab/recovery-evidence.js +7 -10
  37. package/dist/src/browser/codex-iab/recovery-evidence.js.map +1 -1
  38. package/dist/src/browser/codex-iab/selectors.d.ts +1 -0
  39. package/dist/src/browser/codex-iab/selectors.js +1 -0
  40. package/dist/src/browser/codex-iab/selectors.js.map +1 -1
  41. package/dist/src/browser/codex-iab/send-button.d.ts +5 -0
  42. package/dist/src/browser/codex-iab/send-button.js +62 -0
  43. package/dist/src/browser/codex-iab/send-button.js.map +1 -0
  44. package/dist/src/browser/codex-iab/submission-url.js +6 -15
  45. package/dist/src/browser/codex-iab/submission-url.js.map +1 -1
  46. package/dist/src/browser/codex-iab/tab-discovery.js +45 -12
  47. package/dist/src/browser/codex-iab/tab-discovery.js.map +1 -1
  48. package/dist/src/browser/codex-iab/timing-options.d.ts +1 -0
  49. package/dist/src/browser/codex-iab/timing-options.js +5 -0
  50. package/dist/src/browser/codex-iab/timing-options.js.map +1 -0
  51. package/dist/src/cli/health-commands.d.ts +2 -0
  52. package/dist/src/cli/health-commands.js +265 -0
  53. package/dist/src/cli/health-commands.js.map +1 -0
  54. package/dist/src/cli/io.d.ts +4 -0
  55. package/dist/src/cli/io.js +2 -0
  56. package/dist/src/cli/io.js.map +1 -0
  57. package/dist/src/cli/main.d.ts +1 -5
  58. package/dist/src/cli/main.js +187 -84
  59. package/dist/src/cli/main.js.map +1 -1
  60. package/dist/src/cli/observation-commands.d.ts +2 -0
  61. package/dist/src/cli/observation-commands.js +350 -0
  62. package/dist/src/cli/observation-commands.js.map +1 -0
  63. package/dist/src/cli/run-status-view.d.ts +87 -0
  64. package/dist/src/cli/run-status-view.js +121 -0
  65. package/dist/src/cli/run-status-view.js.map +1 -0
  66. package/dist/src/core/controller-command-execution.d.ts +2 -2
  67. package/dist/src/core/controller-command-execution.js +82 -16
  68. package/dist/src/core/controller-command-execution.js.map +1 -1
  69. package/dist/src/core/controller-conversation-archive.d.ts +11 -0
  70. package/dist/src/core/controller-conversation-archive.js +109 -0
  71. package/dist/src/core/controller-conversation-archive.js.map +1 -0
  72. package/dist/src/core/controller-loop.d.ts +7 -1
  73. package/dist/src/core/controller-loop.js +136 -23
  74. package/dist/src/core/controller-loop.js.map +1 -1
  75. package/dist/src/core/controller-turn.d.ts +21 -3
  76. package/dist/src/core/controller-turn.js +182 -41
  77. package/dist/src/core/controller-turn.js.map +1 -1
  78. package/dist/src/core/controller-types.d.ts +2 -0
  79. package/dist/src/core/conversation-url.d.ts +3 -0
  80. package/dist/src/core/conversation-url.js +34 -0
  81. package/dist/src/core/conversation-url.js.map +1 -0
  82. package/dist/src/core/run-status.d.ts +17 -2
  83. package/dist/src/core/run-status.js +64 -25
  84. package/dist/src/core/run-status.js.map +1 -1
  85. package/dist/src/core/state-machine.d.ts +36 -1
  86. package/dist/src/core/state-machine.js +242 -13
  87. package/dist/src/core/state-machine.js.map +1 -1
  88. package/dist/src/core/timing.d.ts +9 -0
  89. package/dist/src/core/timing.js +22 -0
  90. package/dist/src/core/timing.js.map +1 -0
  91. package/dist/src/diagnostics/run-doctor.d.ts +22 -0
  92. package/dist/src/diagnostics/run-doctor.js +197 -0
  93. package/dist/src/diagnostics/run-doctor.js.map +1 -0
  94. package/dist/src/jobs/status.d.ts +5 -2
  95. package/dist/src/jobs/status.js +172 -12
  96. package/dist/src/jobs/status.js.map +1 -1
  97. package/dist/src/jobs/supervisor.js +57 -8
  98. package/dist/src/jobs/supervisor.js.map +1 -1
  99. package/dist/src/observation/run-diff.d.ts +39 -0
  100. package/dist/src/observation/run-diff.js +67 -0
  101. package/dist/src/observation/run-diff.js.map +1 -0
  102. package/dist/src/observation/run-graph.d.ts +17 -0
  103. package/dist/src/observation/run-graph.js +77 -0
  104. package/dist/src/observation/run-graph.js.map +1 -0
  105. package/dist/src/observation/run-handoff.d.ts +86 -0
  106. package/dist/src/observation/run-handoff.js +309 -0
  107. package/dist/src/observation/run-handoff.js.map +1 -0
  108. package/dist/src/observation/run-status-at.d.ts +41 -0
  109. package/dist/src/observation/run-status-at.js +65 -0
  110. package/dist/src/observation/run-status-at.js.map +1 -0
  111. package/dist/src/observation/run-timeline.d.ts +32 -0
  112. package/dist/src/observation/run-timeline.js +279 -0
  113. package/dist/src/observation/run-timeline.js.map +1 -0
  114. package/dist/src/observation/run-watch.d.ts +15 -0
  115. package/dist/src/observation/run-watch.js +82 -0
  116. package/dist/src/observation/run-watch.js.map +1 -0
  117. package/dist/src/protocol/limits.d.ts +3 -0
  118. package/dist/src/protocol/limits.js +4 -0
  119. package/dist/src/protocol/limits.js.map +1 -0
  120. package/dist/src/protocol/lint-command.d.ts +24 -0
  121. package/dist/src/protocol/lint-command.js +210 -0
  122. package/dist/src/protocol/lint-command.js.map +1 -0
  123. package/dist/src/protocol/parse-command.js +4 -0
  124. package/dist/src/protocol/parse-command.js.map +1 -1
  125. package/dist/src/protocol/types.d.ts +12 -0
  126. package/dist/src/protocol/validate-command.js +76 -3
  127. package/dist/src/protocol/validate-command.js.map +1 -1
  128. package/dist/src/router/config-loader.js +23 -2
  129. package/dist/src/router/config-loader.js.map +1 -1
  130. package/dist/src/router/explain.d.ts +28 -0
  131. package/dist/src/router/explain.js +86 -0
  132. package/dist/src/router/explain.js.map +1 -0
  133. package/dist/src/router/resolver.d.ts +2 -1
  134. package/dist/src/router/resolver.js +11 -6
  135. package/dist/src/router/resolver.js.map +1 -1
  136. package/dist/src/runners/process-runner.js +55 -12
  137. package/dist/src/runners/process-runner.js.map +1 -1
  138. package/dist/src/runners/runner-adapter.d.ts +2 -0
  139. package/dist/src/runners/runner-adapter.js.map +1 -1
  140. package/dist/src/state/atomic-write.d.ts +6 -0
  141. package/dist/src/state/atomic-write.js +43 -2
  142. package/dist/src/state/atomic-write.js.map +1 -1
  143. package/dist/src/state/cancellation.js +38 -4
  144. package/dist/src/state/cancellation.js.map +1 -1
  145. package/dist/src/state/event-log.js +5 -4
  146. package/dist/src/state/event-log.js.map +1 -1
  147. package/dist/src/state/private-directory.d.ts +5 -0
  148. package/dist/src/state/private-directory.js +37 -0
  149. package/dist/src/state/private-directory.js.map +1 -0
  150. package/dist/src/state/runtime-lease.js +19 -39
  151. package/dist/src/state/runtime-lease.js.map +1 -1
  152. package/dist/src/state/runtime-record-validation.d.ts +6 -0
  153. package/dist/src/state/runtime-record-validation.js +44 -0
  154. package/dist/src/state/runtime-record-validation.js.map +1 -0
  155. package/dist/src/state/runtime-retirement.js +58 -18
  156. package/dist/src/state/runtime-retirement.js.map +1 -1
  157. package/dist/src/state/runtime-takeover-intent.js +2 -2
  158. package/dist/src/state/runtime-takeover-intent.js.map +1 -1
  159. package/dist/src/state/store.d.ts +1 -0
  160. package/dist/src/state/store.js +12 -6
  161. package/dist/src/state/store.js.map +1 -1
  162. package/dist/src/version.d.ts +1 -1
  163. package/dist/src/version.js +1 -1
  164. package/docs/architecture.md +4 -4
  165. package/docs/assets/README.md +3 -1
  166. package/docs/assets/cueline-architecture-en.svg +63 -0
  167. package/docs/assets/cueline-architecture-ja.svg +63 -0
  168. package/docs/assets/cueline-architecture-ko.svg +63 -0
  169. package/docs/assets/cueline-architecture-zh-CN.svg +63 -0
  170. package/docs/assets/cueline-architecture-zh-TW.svg +63 -0
  171. package/docs/assets/cueline-states-en.svg +50 -0
  172. package/docs/assets/cueline-states-ja.svg +48 -0
  173. package/docs/assets/cueline-states-ko.svg +48 -0
  174. package/docs/assets/cueline-states-zh-CN.svg +48 -0
  175. package/docs/assets/cueline-states-zh-TW.svg +48 -0
  176. package/docs/compatibility.md +1 -1
  177. package/docs/controller-protocol.md +44 -7
  178. package/docs/experiments/protocol-lint.md +40 -0
  179. package/docs/experiments/run-doctor.md +39 -0
  180. package/docs/experiments/run-handoff.md +39 -0
  181. package/docs/experiments/run-timeline.md +35 -0
  182. package/docs/experiments/run-watch.md +31 -0
  183. package/docs/multi-model-routing.md +256 -0
  184. package/docs/runner-contract.md +4 -3
  185. package/docs/state-and-recovery.md +45 -5
  186. package/package.json +1 -1
  187. package/schemas/controller-command.schema.json +89 -4
  188. package/skills/cueline/SKILL.md +13 -7
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cueline",
3
- "version": "0.1.6",
3
+ "version": "0.2.0",
4
4
  "description": "Use a ChatGPT web conversation as the text controller for durable local advice or explicitly claimed work executed by the current Codex.",
5
5
  "author": {
6
6
  "name": "CueLine contributors"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cueline",
3
- "version": "0.1.6",
3
+ "version": "0.2.0",
4
4
  "description": "Use a ChatGPT web conversation as the text controller for durable local advice or explicitly claimed work executed by the current Codex.",
5
5
  "author": {
6
6
  "name": "CueLine contributors"
package/CHANGELOG.md CHANGED
@@ -1,5 +1,55 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.0 - 2026-07-16
4
+
5
+ ### Added
6
+
7
+ - Add `cueline run status-at <run-id> --sequence <n>` to reconstruct a
8
+ sanitized, event-derived historical run state without mutating durable data.
9
+ - Add `cueline run diff <left-run-id> <right-run-id>` to compare safe run
10
+ projections without exposing prompts, tasks, outputs, or conversation data.
11
+ - Add `cueline run graph <run-id>` to render a bounded Mermaid control-flow
12
+ graph from sanitized timeline entries and exact safe correlations.
13
+ - Add `cueline routing explain [lane]` to report pre-spawn runner selection,
14
+ availability, fallback, and rejection reasons without exposing runner argv.
15
+
16
+ ### Fixed
17
+
18
+ - Add append-only recovery for an operator-confirmed unsent ambiguous controller request. `cueline run reconcile ... --not-sent-confirmed` validates the exact run, conversation, round, request, prompt hash, and Pro evidence; abandons the old identity; permits one same-prompt retry under a new deterministic request ID; and remains idempotent across command repetition or restart.
19
+ - Strengthen browser submission checkpoints with run/round/request/prompt identity, a user-message baseline, composer and click-attempt state, a bounded click error, and post-click DOM evidence. Late discovery of the abandoned message or response, prompt drift, extra pending turns, or identity/model/conversation mismatch now freezes the run for manual review instead of risking duplicate controller dispatch.
20
+
21
+ ### Verification
22
+
23
+ - Verified 479/479 tests, TypeScript typecheck, plugin validation, build, and package-content checks.
24
+ - Verified the real built CLI for `run status-at`, `run diff`, `run graph`, and `routing explain`; confirmed `run reconcile` usage still exposes both `--manual-send-confirmed` and `--not-sent-confirmed`.
25
+
26
+ ## 0.1.7 - 2026-07-16
27
+
28
+ ### Added
29
+
30
+ - Add read-only operational surfaces for safe handoff and diagnosis: sanitized `runs`, causal `run doctor`, bounded `run watch`, metadata-only `run timeline`, explicit `run handoff`, durable-evidence `run verify`, controller-response `protocol lint`, machine-readable doctor/routing reports, and a non-mutating built-in-browser probe. These surfaces are strict allowlists and do not expose controller prompts, conversation URLs, job tasks/output, caller identities, task hashes, workdirs, runtime owner IDs, or untrusted exception text.
31
+ - Add deterministic pagination for `inspect(job_ids)` evidence. Pro can request the next exact slice using a content hash and character offset without rerunning a job or allowing one job to consume every later evidence window.
32
+ - Add opt-in `archiveControllerConversationOnComplete`. After a durable `complete`, CueLine may archive only the exact bound ChatGPT conversation while Pro is idle. The browser writes a durable checkpoint immediately before one Archive click; proven pre-click failures remain retryable, while a timeout, restart, missing checkpoint, navigation race, or missing proof becomes `ambiguous` and is never clicked again. `blocked` and `cancelled` runs are never archived.
33
+
34
+ ### Fixed
35
+
36
+ - Require visible, actionable send and stop controls. Hidden, disabled, inert, ancestor-hidden, zero-geometry, localized, or residual controls no longer prove that a prompt can be sent or that Pro is still answering.
37
+ - Refuse ambiguous ChatGPT tab discovery instead of selecting the first match. Exact conversation matching now canonicalizes only benign browser decoration and rejects lookalike hosts, credentials, nested paths, duplicate physical tabs, and navigation races.
38
+ - Accept a fast completed response as post-click proof after a send timeout, while preserving the one-click rule whenever completion cannot be proven. Browser timing options and all Node timer values are validated before they can schedule a spin, overflow, or unsafe delay.
39
+ - Preflight continuation, manual reconciliation, caller-result timestamps, runtime options, routing configuration, process workdirs, and controller commands before any durable mutation or browser/process action. Unknown fields, inherited object properties, invalid lanes/runners, unknown job targets, and action-incompatible fields now fail atomically.
40
+ - Bound controller envelopes, dispatch size, job references, process stdout/stderr, controller event evidence, and accumulated notices. Truncation is explicit and deterministic; full local job evidence remains in the private job status store.
41
+ - Make job status transitions durably atomic and terminally fenced. Concurrent, stale, status-first, event-first, and late-conflicting writers cannot regress or overwrite the first authoritative terminal result; process progress writes are coalesced without losing the final update.
42
+ - Strictly validate persisted job status, runtime lease, retirement, takeover, and cancellation records, including identity, chronology, filenames, unknown fields, canonical timestamps, and authoritative run-event agreement. Corrupt optional evidence degrades diagnosis instead of becoming trusted state.
43
+ - Keep CueLine state directories owner-only and refuse symlink/file substitutions. Caller work claims pin the canonical workdir identity; process jobs bind an absolute workdir before registration, so recovery cannot silently execute in another checkout.
44
+ - Normalize multiline recovery evidence without erasing meaningful indentation, and validate conversation identity consistently across submission, observation, manual reconciliation, and archive recovery.
45
+ - Fence runtime and lane-concurrency option records against caller mutation, and prevent unsafe process fallback or implicit route changes after a job has started.
46
+ - Correct terminal status reporting: a completed, blocked, or cancelled run now reports `continueAllowed: false`; a pending post-completion archive has its own explicit `controller_archive_pending` / `settle_controller_archive` state.
47
+
48
+ ### Verification
49
+
50
+ - Integrated 42 independently developed branches one at a time, running adversarial review and the full suite after every merge. Final integration passes 454/454 tests, TypeScript typecheck, plugin validation, fake smoke tests, and package-content checks.
51
+ - Verified a disposable real ChatGPT Web Pro run without interruption or `Answer now`: one prompt, exact `complete` delivery `LIVE_CONTROLLER_ARCHIVE_ACCEPTANCE_PASS`, one durable archive-start event, one archived event, zero ambiguous/failed archive events, and the pre-existing user conversation remained open.
52
+
3
53
  ## 0.1.6 - 2026-07-15
4
54
 
5
55
  ### Added
package/README.ja.md CHANGED
@@ -5,6 +5,9 @@
5
5
 
6
6
  <p align="center">
7
7
  <a href="https://github.com/Seraphim0916/cueline/actions/workflows/ci.yml"><img alt="ci" src="https://github.com/Seraphim0916/cueline/actions/workflows/ci.yml/badge.svg"></a>
8
+ <a href="https://www.npmjs.com/package/cueline"><img alt="npm" src="https://img.shields.io/npm/v/cueline"></a>
9
+ <a href="package.json"><img alt="node" src="https://img.shields.io/node/v/cueline"></a>
10
+ <a href="LICENSE"><img alt="license" src="https://img.shields.io/npm/l/cueline"></a>
8
11
  </p>
9
12
 
10
13
  <p align="center">
@@ -13,16 +16,30 @@
13
16
 
14
17
  **CueLine は、開いている ChatGPT のウェブ会話に判断を任せます。会話側はテキストコマンドを出し、CueLine が検証し、現在の Codex が許可されたローカル作業を実行します。**
15
18
 
16
- ウェブページにローカルツールはありません。既定の `caller` 実行では、`advise` は協調用の引き渡し、`work` は永続 claim と start が必要です。登録済みワーカーを起動する process executor には二重の明示的承認が必要です。
19
+ ウェブページはあなたのマシンに触れず、ローカルツールもありません。1 ラウンドに出すのはテキストコマンド 1 つだけです。既定の `caller` 実行では、`advise` は協調用の引き渡し、`work` は永続 claim と start が必要です。登録済みワーカーを起動する process executor には二重の明示的承認が必要です。
20
+
21
+ <img alt="CueLine のアーキテクチャ:ChatGPT ウェブ会話が 1 ラウンドに 1 つのテキストコマンドを出し、CueLine が検証・記録し、現在の Codex が許可されたローカル作業を実行する。" src="docs/assets/cueline-architecture-ja.svg" width="100%">
17
22
 
18
23
  CueLine は独立した実装で、**ランタイムの npm 依存はゼロ**です。Omnilane や GPT Relay のラッパーではありません。
19
24
 
25
+ ## 最新リリース:0.2.0
26
+
27
+ - 4 つの読み取り専用オブザーバビリティコマンドを追加し、「未送信確認」による送信復旧を強化しました。出力は fail-closed で秘匿化され、ルーティング説明はプロセス起動前だけを対象にします。
28
+ - 安全な run 一覧、doctor、watch、timeline、handoff、整合性検証、protocol lint、ブラウザー診断、inspect 証拠ページングを追加しました。
29
+ - タブ/ボタン証拠、コマンドとルーティング上限、原子的な job 状態、非公開の永続データ、workdir ID、runtime/cancel 記録、CLI の秘匿化を強化しました。
30
+ - 永続 `complete` 後に正確な会話だけをアーカイブする opt-in 機能を追加しました。クリック前 fence、Pro 再開/遷移チェック、曖昧後の再クリック禁止を備えます。
31
+ - 479/479 テストと使い捨ての実 ChatGPT Web Pro run を検証し、自然完了後に一度だけアーカイブし、既存のユーザー会話には触れませんでした。
32
+
33
+ 詳細は [changelog](CHANGELOG.md#020---2026-07-16) またはバージョン指定の [v0.2.0 release](https://github.com/Seraphim0916/cueline/releases/tag/v0.2.0) を参照してください。
34
+
20
35
  ## 1 回の実行は実際にどう進むか
21
36
 
22
37
  <img alt="Caller-first CueLine:ChatGPT がテキストコマンドを出し、現在の Codex がローカル助言を実行し、CueLine が完了まで有界な証拠を返す。" src="docs/assets/cueline-loop-ja.svg" width="100%">
23
38
 
24
39
  各ラウンドで CueLine は観測を送り、後で `<CueLineControl>` エンベロープを**ちょうど 1 つだけ**読み戻します。コントローラーは `dispatch`、`wait`、`inspect`、`complete`、`blocked` のいずれかを選びます。ループは 1 回の永続的な送信後に `awaiting_controller` で一時停止し、caller への引き渡し、`complete`、`blocked`、またはラウンド上限(既定 12 回)でも停止します。
25
40
 
41
+ コントローラーコマンドには fail-closed なリソース上限もあります:エンベロープあたり 131,072 文字、dispatch あたり最大 64 ジョブ、wait / inspect あたり最大 256 個の明示 job ID。これらの検査はジョブ登録やプロセス起動の前に行われます。
42
+
26
43
  既定値以外の `maxRounds` は run 作成時に固定され、owner 不在の一時停止をまたいでコントローラーの総ラウンド数を数えます。後の続行では通常省略して永続値を再利用し、異なる値を渡すと予算を暗黙にリセットまたは拡張せず拒否します。
27
44
 
28
45
  `startCueLineRun` と `runCueLine` の既定は `caller` です。送信後は `awaiting_controller` を返して lease を解放し、続行は 1 回の読み取り専用観測だけを行い、再送しません。`advise` は `awaiting_caller`、`work` は `awaiting_caller_work` を返します。work は現在の Codex が `claimCueLineCallerJob` と `startCueLineCallerJob` を成功させるまで開始されません。claim は run、job、task hash、絶対 workdir、caller identity、fencing token に結び付けられ、開始済み work は自動再試行されず、期限切れなら `ambiguous` になります。Pro はテキスト命令を提案・審査するだけで、ローカルツールは使いません。
@@ -33,6 +50,12 @@ Process モードは `executor: "process"` と `allowProcessExecution: true` の
33
50
 
34
51
  これは許可リスト(allow-list)であって、サンドボックスではありません。登録されたワーカーは CueLine プロセス自身と同じ権限で動きます。`advise` は Codex の読み取り専用サンドボックスに、`work` は `workspace-write` に対応しますが、登録したものが、そのまま許可したものになります。
35
52
 
53
+ ## run の状態
54
+
55
+ <img alt="CueLine の run 状態:ready、awaiting_controller、awaiting_caller、awaiting_caller_work、complete、blocked、cancelled と、それぞれの意味。" src="docs/assets/cueline-states-ja.svg" width="100%">
56
+
57
+ `cueline run status <run-id> --json` は永続状態と `safeNextAction` を報告し、`cueline run doctor <run-id> --json` は同じスナップショットを安定した finding コードと安全な次の一手に変換します。曖昧なもの——送信されたかもしれないクリック、期限切れの開始済み claim、手動の添付送信——に対して、CueLine は再送せず停止し、明示的な reconcile を求めます。復旧の完全な契約は [state and recovery](docs/state-and-recovery.md) を参照してください。
58
+
36
59
  ## コントローラーは Pro モデルでなければならない
37
60
 
38
61
  コンポーザーのモデルセレクターが `Pro` を示していないかぎり、CueLine は送信を拒否します。会話が別のモデルにある場合、CueLine はまずコンポーザーを `Pro` に切り替えます——それが唯一許されたモデル切り替えです。検証済みのライブ実行では、Instant を Pro に切り替え、応答は `gpt-5-6-pro` として返りました。
@@ -48,15 +71,15 @@ ChatGPT Pro のサブスクリプションと、選択された Pro モデルは
48
71
  npm レジストリからインストールします。
49
72
 
50
73
  ```bash
51
- npm install -g cueline@0.1.6
74
+ npm install -g cueline@0.2.0
52
75
  cueline install
53
76
  cueline doctor
54
77
  ```
55
78
 
56
- フォールバックとして、[v0.1.6 リリース](https://github.com/Seraphim0916/cueline/releases/tag/v0.1.6) のパッケージ済み tarball をインストールすることもできます。同じリリースに `.sha256` チェックサムも置いてあります。
79
+ フォールバックとして、[v0.2.0 リリース](https://github.com/Seraphim0916/cueline/releases/tag/v0.2.0) のパッケージ済み tarball をインストールすることもできます。同じリリースに `.sha256` チェックサムも置いてあります。
57
80
 
58
81
  ```bash
59
- npm install -g https://github.com/Seraphim0916/cueline/releases/download/v0.1.6/cueline-0.1.6.tgz
82
+ npm install -g https://github.com/Seraphim0916/cueline/releases/download/v0.2.0/cueline-0.2.0.tgz
60
83
  cueline install
61
84
  cueline doctor
62
85
  ```
@@ -79,7 +102,7 @@ cueline doctor
79
102
  次に、Codex で:
80
103
 
81
104
  1. Codex の組み込みブラウザーで `https://chatgpt.com` を開き、サインインします。
82
- 2. 主導させたい会話を選択したままにします。そのページがコントローラーです。そのコンポーザーは `Pro` モデルでなければなりません。そうでない場合、CueLine が `Pro` を選び、選べなければ送信を拒否します。
105
+ 2. 主導させたい会話を選択したままにします。そのページがコントローラーです。選択中のタブがなく、一致する ChatGPT タブが複数ある場合、CueLine は先頭を勝手に選ばず `IAB_CHATGPT_TAB_AMBIGUOUS` を返します。そのコンポーザーは `Pro` モデルでなければなりません。そうでない場合、CueLine が `Pro` を選び、選べなければ送信を拒否します。
83
106
  3. Codex にこう頼みます:*「CueLine を使って、開いている ChatGPT Pro の会話にこのタスクを指揮させて。」*
84
107
  4. 返ってきた `runId` を控えておきます。中断した実行を再開する手がかりになります。
85
108
 
@@ -101,6 +124,7 @@ import {
101
124
  let result = await runCueLine({
102
125
  request: "Inspect the repository, delegate an implementation plan, and report the evidence.",
103
126
  browser: createCodexIabAdapter({ browser: globalThis.browser }),
127
+ // opt-in:archiveControllerConversationOnComplete: true,
104
128
  // 任意:conversationUrl、routingConfig / routingConfigPath、home、cwd、
105
129
  // runTimeoutMs、signal、ジョブごと/既定の期限。
106
130
  }); // 既定は executor: "caller"
@@ -122,7 +146,7 @@ while (["awaiting_controller", "awaiting_caller", "awaiting_caller_work"].includ
122
146
  const claim = await claimCueLineCallerJob(result.runId, job.jobId, { callerId: "stable-codex-task-identity" });
123
147
  const proof = { claimId: claim.claimId, callerId: claim.callerId, fencingToken: claim.fencingToken };
124
148
  await startCueLineCallerJob(result.runId, job.jobId, proof);
125
- const stdout = await executeExactLocalWork(job.spec.task, claim.workdir, {
149
+ const stdout = await executeExactLocalWork(job.spec.task, claim.resolvedWorkdir, {
126
150
  heartbeat: () => heartbeatCueLineCallerJob(result.runId, job.jobId, proof),
127
151
  });
128
152
  await submitCueLineCallerJobResult(result.runId, job.jobId, { status: "succeeded", stdout }, { claim: proof });
@@ -136,22 +160,31 @@ if (result.status === "complete") {
136
160
  }
137
161
  ```
138
162
 
163
+ `archiveControllerConversationOnComplete` の既定は `false` で、run 作成時に固定されます。有効にすると、CueLine はまず `complete` を永続化し、その後 Pro がアイドルのあいだに、正確に結び付けられた会話だけをアーカイブします。永続クリックのチェックポイント前に証明された失敗は再試行できますが、その後のタイムアウト、再起動、遷移レース、証拠欠落はすべて `ambiguous` となり、CueLine が Archive を再クリックすることは二度とありません。`blocked` と `cancelled` の run は開いたまま残します。
164
+
139
165
  `awaiting_controller` は再送なしの読み取り専用観測、`awaiting_caller` は advise の引き渡し、`awaiting_caller_work` は claim、start、実行、heartbeat、claim proof 付き提出の順です。Pro はローカルツールを直接使いません。
140
166
 
167
+ `listCueLineRuns()` は永続化された run ID を見つけるための、読み取り専用でサニタイズ済みの一覧です。コントローラー本文、会話 URL、job のタスク、worker 出力は含まれません。
168
+
169
+ `verifyCueLineRun(runId)` は作成 marker、イベント replay と authority fence、任意の snapshot、runtime lease、job status 証拠を対象とする読み取り専用の整合性検査です。永続 run の内容は返さず、安定した finding だけを返します。
170
+
141
171
  Codex のランタイムでは、`cueline api path` が出力する絶対パスのモジュールを import します。それがインストールしたパッケージのビルド済み API です。
142
172
 
143
- `startCueLineRun` は永続 run を作成して `ready` を返すだけです。`runCueLine` は作成後、永続 controller 観測待ち、caller 引き渡し、または終端まで進めます。owner 不在の `controller_response_pending` で通常送信済みターンが一つだけあり、`safeNextAction: observe` が示される場合、同じ Pro 応答を読み取り専用で観測する待機です。少し待って続行し、再送しません。`safeNextAction: reconcile` は曖昧、手動送信、または複数の保留ターンに使います。owner 不在の `caller_jobs_pending` は正常なローカル引き渡しであり、orphan や ChatGPT 待ちではありません。
173
+ `startCueLineRun` は永続 run を作成して `ready` を返すだけです。`runCueLine` は作成後、永続 controller 観測待ち、caller 引き渡し、または終端まで進めます。owner 不在の `controller_response_pending` で通常送信済みターンが一つだけあり、`safeNextAction: observe` が示される場合、同じ Pro 応答を読み取り専用で観測する待機です。少し待って続行し、再送しません。`safeNextAction: reconcile` は曖昧、手動送信、または複数の保留ターンに使います。owner 不在の `caller_jobs_pending` は正常なローカル引き渡しであり、orphan や ChatGPT 待ちではありません。CLI の `run status` は引き渡しに必要な metadata だけを出力し、task 本文、caller identity、task hash、workdir、runtime owner ID を含めません。正式な claim 後にだけ、API が正確な task と workdir を認可された caller に返します。
144
174
 
145
175
  ## CLI
146
176
 
147
- CLI はブラウザーを駆動しません。`doctor`、`routing`、`jobs`、`run status`、`api path`、`config path` は読み取り専用です。`install`/`uninstall` はパッケージ所有のスキルリンクだけを変更します。`run reconcile`、`run takeover`、`run reconcile-runtime`、`run cancel`/`run stop`、`job cancel` は監査証拠を追記するか、永続 run/job 状態を変更します。状態を書き込むコマンドの前に `cueline help` で完全な引数を確認してください。
177
+ CLI はブラウザーを駆動しません。状態を書き込むコマンドの前に `cueline help` で完全な引数を確認してください。
148
178
 
149
- ```console
150
- $ cueline install
151
- CueLine skill installed: /Users/you/.codex/skills/cueline
179
+ | グループ | コマンド | 効果 |
180
+ | --- | --- | --- |
181
+ | 参照 | `doctor` · `routing` · `jobs` · `runs` · `run status` · `run doctor` · `run watch` · `run timeline` · `run verify` · `run handoff` · `protocol lint` · `api path` · `config path` | 読み取り専用 |
182
+ | インストール | `install` · `uninstall` | パッケージ所有のスキルリンクだけを作成・削除 |
183
+ | 復旧 | `run reconcile` · `run takeover` · `run reconcile-runtime` · `run cancel` / `run stop` · `job cancel` | 監査証拠の追記、または永続 run/job 状態の変更 |
152
184
 
185
+ ```console
153
186
  $ cueline doctor
154
- CueLine 0.1.6
187
+ CueLine 0.2.0
155
188
  status ok
156
189
  node 22.14.0 ok
157
190
  config /usr/local/lib/node_modules/cueline/config/routing.default.json valid
@@ -160,40 +193,41 @@ caller_ready yes
160
193
  caller_lanes 1
161
194
  process_available_lanes 1
162
195
 
163
- $ cueline api path
164
- /usr/local/lib/node_modules/cueline/dist/src/api.js
165
-
166
196
  $ cueline routing
167
197
  default codex-default available
168
198
 
169
- $ cueline jobs
170
- No jobs.
171
-
172
199
  $ cueline run status run_... --json
173
200
  {"status":"running","executor":"caller","phase":"caller_jobs_pending","runtime":{"ownership":"missing"},...}
174
201
 
175
- $ cueline run takeover stale_run_... --json
176
- {"runId":"stale_run_...","outcome":"taken_over","next":"continue",...}
202
+ $ cueline run doctor run_... --json
203
+ {"outcome":"action_required","phase":"caller_jobs_pending","nextAction":"execute_caller_jobs",...}
204
+
205
+ $ cueline run reconcile run_... --request-id msg_... --manual-send-confirmed --conversation-url https://chatgpt.com/c/...
206
+ run_...\tmsg_...\tconfirmed
177
207
 
178
208
  $ cueline run cancel run_...
179
209
  run_... requested affected_jobs=0
180
-
181
- $ cueline config path
182
- /usr/local/lib/node_modules/cueline/config/routing.default.json
183
-
184
- $ cueline uninstall
185
- CueLine skill removed: /Users/you/.codex/skills/cueline
186
210
  ```
187
211
 
188
212
  Node が古すぎる場合、または有効な caller レーンが一つもない場合、`cueline doctor` は非ゼロで終了します。`process_available_lanes` が 0 でも caller モードは劣化しません。process executor を明示的に選ぶ前だけ `cueline routing` で process の可用性を確認してください。`cueline api path` が出すのはスキルが import するモジュールなので、パッケージ導入ならリポジトリの取得は不要です。`cueline help` は `--json` と手動 reconcile の必須確認フラグを含む各コマンドの正確な構文を一覧します。
189
213
 
214
+ 実験的な診断コマンドには、それぞれ専用のドキュメントがあります:
215
+
216
+ | コマンド | 役割 | ドキュメント |
217
+ | --- | --- | --- |
218
+ | `run doctor` | run スナップショットを安定した finding コード、有界な証拠、安全な次の一手に変換(状態は書き込まない) | [run-doctor](docs/experiments/run-doctor.md) |
219
+ | `run watch` | 永続イベント連番をカーソルにした、有界で lease を取らない観測 | [run-watch](docs/experiments/run-watch.md) |
220
+ | `protocol lint` | Pro エンベロープをオフラインで検証し、既知の契約修正を一括報告 | [protocol-lint](docs/experiments/protocol-lint.md) |
221
+ | `run handoff` | 正確な identity と絶対パスを備えた安全な再開パケットを生成 | [run-handoff](docs/experiments/run-handoff.md) |
222
+ | `run timeline` | 生イベントを含まない、サニタイズ済みカーソルページングの監査ビュー | [run-timeline](docs/experiments/run-timeline.md) |
223
+
190
224
  `run takeover` は `run status` が exact stale owner を示す場合だけ使います。新しい active heartbeat は拒否されます。返された `next: continue` または `next: reconcile_runtime` に従い、推測で進めないでください。
191
225
 
192
226
  ## 設定
193
227
 
194
228
  `CUELINE_CONFIG` はルーティング設定ファイルを選び、`CUELINE_HOME` はローカル状態の置き場所を移します(既定は `~/.cueline`)。
195
229
 
196
- Caller はプロセスを起動しません。`executor: "process"` と `allowProcessExecution: true` を同時に指定した場合だけ、`default` レーンの `codex-default` が隔離された `codex exec --ignore-user-config` を実行します。独立した `advise` の既定同時実行数は全体/レーンごとに 2、`work` を含むバッチは直列です。
230
+ Caller はプロセスを起動しません。`executor: "process"` と `allowProcessExecution: true` を同時に指定した場合だけ、`default` レーンの `codex-default` が隔離された `codex exec --ignore-user-config` を実行します。独立した `advise` の既定同時実行数は全体/レーンごとに 2、`work` を含むバッチは直列です。別の process worker を登録するには、[`config/routing.default.json`](config/routing.default.json) をコピーして候補を追加し、`CUELINE_CONFIG` をそこへ向けます。
197
231
 
198
232
  状態は `CUELINE_HOME` の下に置かれます:
199
233
 
@@ -209,7 +243,11 @@ jobs/<job-id>.json ジョブごとの実行証拠
209
243
 
210
244
  記録そのものはイベントログです。コントローラーのターンは送信する前に書かれ、ジョブはプロセスが起動する前に登録されます。だからこそ、意図と副作用のあいだで中断が起きても痕跡が残ります。壊れたスナップショットは信用されず、無視されてイベント 1 番から再構築されます。
211
245
 
212
- 復帰は完全に同じ会話 URL にだけ接続します。ChatGPT が長文を添付に自動変換した場合は `attachment_ready` として認識し、送信クリックは最大 1 回です。曖昧なクリックは `possibly_sent` となり再送しません。手動送信後は `cueline run reconcile RUN_ID --request-id REQUEST_ID --manual-send-confirmed` で正式に確認し、同一 conversation、Pro 証拠、protocol/run/round/request identity をすべて検証します。コントローラー証拠は成功時の非空 stdout を優先し、全体 12,000 文字に制限します。完全な stdout/stderr はローカルに保持します。
246
+ 復帰は完全に同じ会話 URL にだけ接続します。ChatGPT が長文を添付に自動変換した場合は `attachment_ready` として認識し、送信クリックは最大 1 回です。曖昧なクリックは `possibly_sent` となり再送しません。実際に見えて有効かつ操作可能な Stop コントロールがあるあいだだけ、応答は進行中とみなされます。隠れた残存ボタンが完了済みの Pro 応答を抑え込むことはありません。手動送信後は `cueline run reconcile RUN_ID --request-id REQUEST_ID --manual-send-confirmed` で正式に確認し、同一 conversation、Pro 証拠、protocol/run/round/request identity をすべて検証します。
247
+
248
+ Pro が回答しているあいだは、決して中断せず、`Answer now`、`Respond now`、`Stop` などの加速コントロールも使わないでください。Pro にはローカルツールがなく、リポジトリ構成やローカルパスの既定知識もありません。Caller の証拠には正確なコード/エラー識別子、関連コードの抜粋、絶対ローカルパスを含め、さらにローカル証拠が必要か Pro に明示的に尋ねてください。
249
+
250
+ コントローラー証拠は成功時の非空 stdout を優先し、全体 12,000 文字に制限します。完全な stdout/stderr はローカルに保持します。Pro が `inspect(job_ids)` を受理した場合、次のターンでは指定 job の証拠予算を先に確保してから無関係な証拠を扱います。
213
251
 
214
252
  ## 検証
215
253
 
@@ -226,13 +264,22 @@ npm pack --dry-run
226
264
 
227
265
  ## 0.1 の制限
228
266
 
229
- テキストコマンドのみ。長文の自動添付変換は対応しますが、意図的なファイルアップロード、画像、Deep Research、Projects、Apps は非対応です。Caller work は明示的な claim/startprocess 実行は二重承認が必要です。曖昧な送信や開始済みジョブを自動再試行しません。
267
+ テキストコマンドのみ。1 回の run につき会話は 1 つです。`Pro` の選択が CueLine が行う唯一のモデル切り替えです。長文の自動添付変換は対応しますが、意図的なファイルアップロード、画像、Deep Research、Projects、Apps は非対応です。Caller work は明示的な claim/start と、長時間作業では heartbeat が必要です。process 実行は二重承認が必要です。曖昧な送信や開始済みジョブを自動再試行しません。macOS が主要デスクトップターゲット、Linux が CI ターゲットで、Windows は未検証です。アダプターは現行の ChatGPT ウェブ UI に依存するため、UI 変更は捏造された回答ではなく明示的なエラーとして表面化します。
230
268
 
231
269
  完全な対応表は [compatibility](docs/compatibility.md) を参照してください。
232
270
 
233
271
  ## ドキュメント
234
272
 
235
- [architecture](docs/architecture.md) · [controller protocol](docs/controller-protocol.md) · [runner contract](docs/runner-contract.md) · [state and recovery](docs/state-and-recovery.md) · [compatibility](docs/compatibility.md) · [provenance](docs/provenance.md)(いずれも英語)
273
+ | ドキュメント | 内容 |
274
+ | --- | --- |
275
+ | [architecture](docs/architecture.md) | 各コンポーネントの構成と信頼境界の位置 |
276
+ | [controller protocol](docs/controller-protocol.md) | `<CueLineControl>` エンベロープ、5 つの動作、修正ルール |
277
+ | [runner contract](docs/runner-contract.md) | 登録済み process worker がすべきこと・してはならないこと |
278
+ | [state and recovery](docs/state-and-recovery.md) | 永続状態のレイアウト、ownership、すべての復旧経路 |
279
+ | [compatibility](docs/compatibility.md) | 対応プラットフォーム、ランタイム、UI 前提 |
280
+ | [provenance](docs/provenance.md) | 設計の由来と、CueLine が何でないか |
281
+
282
+ (いずれも英語)
236
283
 
237
284
  ## 開発
238
285
 
package/README.ko.md CHANGED
@@ -5,6 +5,9 @@
5
5
 
6
6
  <p align="center">
7
7
  <a href="https://github.com/Seraphim0916/cueline/actions/workflows/ci.yml"><img alt="ci" src="https://github.com/Seraphim0916/cueline/actions/workflows/ci.yml/badge.svg"></a>
8
+ <a href="https://www.npmjs.com/package/cueline"><img alt="npm" src="https://img.shields.io/npm/v/cueline"></a>
9
+ <a href="package.json"><img alt="node" src="https://img.shields.io/node/v/cueline"></a>
10
+ <a href="LICENSE"><img alt="license" src="https://img.shields.io/npm/l/cueline"></a>
8
11
  </p>
9
12
 
10
13
  <p align="center">
@@ -13,16 +16,30 @@
13
16
 
14
17
  **CueLine은 열린 ChatGPT 웹 대화에 판단을 맡깁니다. 대화는 텍스트 명령을 내리고, CueLine이 검증하며, 현재 Codex가 허용된 로컬 작업을 수행합니다.**
15
18
 
16
- 페이지에는 로컬 도구가 없습니다. 기본 `caller` 실행에서 `advise`는 조정용 인계이며, `work`는 지속 claim과 start가 필요합니다. 등록된 워커를 띄우는 process executor는 이중 명시 승인이 필요합니다.
19
+ 페이지는 당신의 머신에 닿을 수 없고 로컬 도구도 없습니다. 라운드마다 텍스트 명령 하나만 내보냅니다. 기본 `caller` 실행에서 `advise`는 조정용 인계이며, `work`는 지속 claim과 start가 필요합니다. 등록된 워커를 띄우는 process executor는 이중 명시 승인이 필요합니다.
20
+
21
+ <img alt="CueLine 아키텍처: ChatGPT 웹 대화가 라운드마다 텍스트 명령 하나를 내리고, CueLine이 검증·기록하며, 현재 Codex가 허용된 로컬 작업을 수행합니다." src="docs/assets/cueline-architecture-ko.svg" width="100%">
17
22
 
18
23
  CueLine은 독립적인 구현이며 **런타임 npm 의존성이 전혀 없습니다**. Omnilane이나 GPT Relay를 감싼 래퍼가 아닙니다.
19
24
 
25
+ ## 최신 릴리스: 0.2.0
26
+
27
+ - 읽기 전용 관측 명령 4개를 추가하고 '전송되지 않음 확인' 제출 복구를 강화했습니다. 출력은 fail-closed 방식으로 비식별화되며 라우팅 설명은 프로세스 시작 전 상태만 다룹니다.
28
+ - 안전한 run 목록, doctor, watch, timeline, handoff, 무결성 검증, protocol lint, 브라우저 진단, inspect 증거 페이지 기능을 추가했습니다.
29
+ - 탭/버튼 증거, 명령과 라우팅 한도, 원자적 job 상태, 비공개 영속 데이터, workdir ID, runtime/cancel 레코드, CLI 비식별화를 강화했습니다.
30
+ - 영속 `complete` 뒤 정확한 대화만 보관하는 opt-in 기능을 추가했습니다. 클릭 전 fence, Pro 재개/탐색 검사, 모호해진 뒤 재클릭 금지를 적용합니다.
31
+ - 479/479 테스트와 일회용 실제 ChatGPT Web Pro run을 검증했으며, 자연 완료 뒤 한 번만 보관하고 기존 사용자 대화는 건드리지 않았습니다.
32
+
33
+ 전체 내용은 [changelog](CHANGELOG.md#020---2026-07-16) 또는 버전이 지정된 [v0.2.0 release](https://github.com/Seraphim0916/cueline/releases/tag/v0.2.0)에서 확인할 수 있습니다.
34
+
20
35
  ## 실행 한 번은 실제로 이렇게 흘러갑니다
21
36
 
22
37
  <img alt="Caller-first CueLine: ChatGPT가 텍스트 명령을 내리고 현재 Codex가 로컬 조언 작업을 수행하며 CueLine이 완료까지 제한된 증거를 반환합니다." src="docs/assets/cueline-loop-ko.svg" width="100%">
23
38
 
24
39
  매 라운드마다 CueLine은 관측 하나를 보내고 나중에 `<CueLineControl>` 엔벨로프를 **정확히 하나만** 읽습니다. 컨트롤러는 `dispatch`, `wait`, `inspect`, `complete`, `blocked` 중 하나를 고릅니다. 루프는 한 번의 영속적인 전송 뒤 `awaiting_controller`에서 일시 중지하며 caller 인계, `complete`, `blocked`, 또는 라운드 상한(기본 12회)에서도 멈춥니다.
25
40
 
41
+ 컨트롤러 명령에는 fail-closed 자원 한도도 있습니다: 엔벨로프당 131,072자, dispatch당 최대 64개 작업, wait/inspect당 최대 256개의 명시적 job ID. 이 검사는 작업 등록이나 프로세스 시작 전에 수행됩니다.
42
+
26
43
  기본값이 아닌 `maxRounds`는 run 생성 시 고정되며 owner가 없는 일시 중지를 가로질러 컨트롤러 총 라운드 수를 셉니다. 이후 계속하기에서는 보통 생략해 지속 값을 재사용하고, 다른 값을 전달하면 예산을 몰래 재설정하거나 늘리지 않고 거부합니다.
27
44
 
28
45
  `startCueLineRun`과 `runCueLine`의 기본값은 `caller`입니다. 전송 뒤 `awaiting_controller`를 반환하고 lease를 해제하며, 계속하기는 재전송 없이 읽기 전용 관측 한 번만 수행합니다. `advise`는 `awaiting_caller`, `work`는 `awaiting_caller_work`를 반환합니다. work는 현재 Codex가 `claimCueLineCallerJob`과 `startCueLineCallerJob`을 성공시키기 전에는 시작되지 않습니다. claim은 run, job, task hash, 절대 workdir, caller identity, fencing token에 묶이며 시작된 work는 자동 재시도되지 않고 만료 시 `ambiguous`가 됩니다. Pro는 텍스트 명령을 제안하고 검토할 뿐 로컬 도구를 쓰지 않습니다.
@@ -33,6 +50,12 @@ Process 모드는 `executor: "process"`와 `allowProcessExecution: true`가 모
33
50
 
34
51
  이것은 허용 목록(allow-list)이지 샌드박스가 아닙니다. 등록된 워커는 CueLine 프로세스 자신과 동일한 권한으로 실행됩니다. `advise`는 Codex의 읽기 전용 샌드박스에, `work`는 `workspace-write`에 대응하지만, 당신이 등록한 것이 곧 당신이 승인한 것입니다.
35
52
 
53
+ ## run 상태
54
+
55
+ <img alt="CueLine run 상태: ready, awaiting_controller, awaiting_caller, awaiting_caller_work, complete, blocked, cancelled — 각 상태의 의미." src="docs/assets/cueline-states-ko.svg" width="100%">
56
+
57
+ `cueline run status <run-id> --json`은 지속 상태와 `safeNextAction`을 보고하고, `cueline run doctor <run-id> --json`은 같은 스냅샷을 안정적인 finding 코드와 안전한 다음 한 걸음으로 바꿔 줍니다. 모호한 것 — 보냈을 수도 있는 클릭, 만료된 시작 claim, 수동 첨부 전송 — 앞에서 CueLine은 재전송 대신 멈추고 명시적 reconcile을 요구합니다. 복구 계약 전문은 [state and recovery](docs/state-and-recovery.md)를 보세요.
58
+
36
59
  ## 컨트롤러는 반드시 Pro 모델이어야 합니다
37
60
 
38
61
  컴포저의 모델 선택기가 `Pro`를 가리키지 않으면 CueLine은 전송을 거부합니다. 대화가 다른 모델에 머물러 있으면 CueLine이 먼저 컴포저를 `Pro`로 전환합니다 — 이것이 CueLine에게 허용된 유일한 모델 전환입니다. 검증된 실제 실행에서 CueLine은 Instant를 Pro로 전환했고, 응답은 `gpt-5-6-pro`로 돌아왔습니다.
@@ -48,15 +71,15 @@ ChatGPT Pro 구독과 선택된 Pro 모델은 서로 다른 것입니다. 계정
48
71
  npm 레지스트리에서 설치합니다:
49
72
 
50
73
  ```bash
51
- npm install -g cueline@0.1.6
74
+ npm install -g cueline@0.2.0
52
75
  cueline install
53
76
  cueline doctor
54
77
  ```
55
78
 
56
- 대안으로, [v0.1.6 릴리스](https://github.com/Seraphim0916/cueline/releases/tag/v0.1.6)의 패키지 tarball을 설치할 수도 있습니다. 같은 릴리스에 `.sha256` 체크섬도 함께 있습니다.
79
+ 대안으로, [v0.2.0 릴리스](https://github.com/Seraphim0916/cueline/releases/tag/v0.2.0)의 패키지 tarball을 설치할 수도 있습니다. 같은 릴리스에 `.sha256` 체크섬도 함께 있습니다.
57
80
 
58
81
  ```bash
59
- npm install -g https://github.com/Seraphim0916/cueline/releases/download/v0.1.6/cueline-0.1.6.tgz
82
+ npm install -g https://github.com/Seraphim0916/cueline/releases/download/v0.2.0/cueline-0.2.0.tgz
60
83
  cueline install
61
84
  cueline doctor
62
85
  ```
@@ -79,7 +102,7 @@ cueline doctor
79
102
  그다음 Codex에서:
80
103
 
81
104
  1. Codex의 내장 브라우저로 `https://chatgpt.com`을 열고 로그인합니다.
82
- 2. 지휘를 맡길 대화를 선택한 상태로 둡니다. 그 페이지가 컨트롤러입니다. 그 컴포저는 반드시 `Pro` 모델이어야 하며, 그렇지 않으면 CueLine이 `Pro`를 대신 선택하고, 선택하지 못하면 전송을 거부합니다.
105
+ 2. 지휘를 맡길 대화를 선택한 상태로 둡니다. 그 페이지가 컨트롤러입니다. 선택된 탭이 없고 일치하는 ChatGPT 탭이 여러 개면, CueLine은 첫 번째 탭을 마음대로 고르는 대신 `IAB_CHATGPT_TAB_AMBIGUOUS`를 반환합니다. 그 컴포저는 반드시 `Pro` 모델이어야 하며, 그렇지 않으면 CueLine이 `Pro`를 대신 선택하고, 선택하지 못하면 전송을 거부합니다.
83
106
  3. Codex에게 CueLine으로 처리해 달라고 요청합니다: *"CueLine을 써서, 열려 있는 ChatGPT Pro 대화가 이 작업을 지휘하게 해 줘."*
84
107
  4. 반환된 `runId`를 보관하세요. 중단된 실행을 이어서 진행하는 열쇠입니다.
85
108
 
@@ -101,6 +124,7 @@ import {
101
124
  let result = await runCueLine({
102
125
  request: "Inspect the repository, delegate an implementation plan, and report the evidence.",
103
126
  browser: createCodexIabAdapter({ browser: globalThis.browser }),
127
+ // opt-in: archiveControllerConversationOnComplete: true,
104
128
  // 선택: conversationUrl, routingConfig / routingConfigPath, home, cwd,
105
129
  // runTimeoutMs, signal, 작업별/기본 제한 시간.
106
130
  }); // 기본 executor: "caller"
@@ -122,7 +146,7 @@ while (["awaiting_controller", "awaiting_caller", "awaiting_caller_work"].includ
122
146
  const claim = await claimCueLineCallerJob(result.runId, job.jobId, { callerId: "stable-codex-task-identity" });
123
147
  const proof = { claimId: claim.claimId, callerId: claim.callerId, fencingToken: claim.fencingToken };
124
148
  await startCueLineCallerJob(result.runId, job.jobId, proof);
125
- const stdout = await executeExactLocalWork(job.spec.task, claim.workdir, {
149
+ const stdout = await executeExactLocalWork(job.spec.task, claim.resolvedWorkdir, {
126
150
  heartbeat: () => heartbeatCueLineCallerJob(result.runId, job.jobId, proof),
127
151
  });
128
152
  await submitCueLineCallerJobResult(result.runId, job.jobId, { status: "succeeded", stdout }, { claim: proof });
@@ -136,22 +160,31 @@ if (result.status === "complete") {
136
160
  }
137
161
  ```
138
162
 
163
+ `archiveControllerConversationOnComplete`의 기본값은 `false`이며 run 생성 시 고정됩니다. 활성화하면 CueLine은 먼저 `complete`를 영속화한 뒤 Pro가 유휴 상태일 때 정확히 바인딩된 그 대화만 보관합니다. 지속 클릭 체크포인트 전에 증명된 실패는 재시도할 수 있지만, 그 이후의 타임아웃·재시작·탐색 경합·증거 누락은 모두 `ambiguous`가 되며 CueLine은 Archive를 다시 클릭하지 않습니다. `blocked`와 `cancelled` run은 열린 채로 둡니다.
164
+
139
165
  `awaiting_controller`는 재전송 없는 읽기 전용 관측, `awaiting_caller`는 advise 인계, `awaiting_caller_work`는 claim, start, 실행, heartbeat, claim proof 제출 순서입니다. Pro는 로컬 도구를 직접 쓰지 않습니다.
140
166
 
167
+ `listCueLineRuns()`는 영속화된 run ID를 찾기 위한 읽기 전용·비식별화 목록입니다. 컨트롤러 텍스트, 대화 URL, job task, worker 출력은 포함하지 않습니다.
168
+
169
+ `verifyCueLineRun(runId)`는 생성 marker, 이벤트 replay와 authority fence, 선택적 snapshot, runtime lease, job status 증거를 검사하는 읽기 전용 무결성 검사입니다. 지속 run 내용은 반환하지 않고 안정적인 finding만 반환합니다.
170
+
141
171
  Codex 런타임에서는 `cueline api path`가 출력하는 절대 경로 모듈을 import하세요. 그것이 설치한 패키지의 빌드된 API입니다.
142
172
 
143
- `startCueLineRun`은 지속 run을 만들고 `ready`만 반환합니다. `runCueLine`은 생성 후 지속 controller 관측 대기, caller 인계 또는 종료 상태까지 진행합니다. owner가 없는 `controller_response_pending`에 정상 전송된 턴이 정확히 하나이고 `safeNextAction: observe`가 표시되면 같은 Pro 응답을 읽기 전용으로 관측하기 위한 대기입니다. 잠시 뒤 계속하고 재전송하지 마세요. `safeNextAction: reconcile`은 모호하거나 수동 전송되었거나 보류 턴이 여러 개인 경우에 사용합니다. owner가 없는 `caller_jobs_pending`은 정상적인 로컬 인계이며 orphan이나 ChatGPT 대기가 아닙니다.
173
+ `startCueLineRun`은 지속 run을 만들고 `ready`만 반환합니다. `runCueLine`은 생성 후 지속 controller 관측 대기, caller 인계 또는 종료 상태까지 진행합니다. owner가 없는 `controller_response_pending`에 정상 전송된 턴이 정확히 하나이고 `safeNextAction: observe`가 표시되면 같은 Pro 응답을 읽기 전용으로 관측하기 위한 대기입니다. 잠시 뒤 계속하고 재전송하지 마세요. `safeNextAction: reconcile`은 모호하거나 수동 전송되었거나 보류 턴이 여러 개인 경우에 사용합니다. owner가 없는 `caller_jobs_pending`은 정상적인 로컬 인계이며 orphan이나 ChatGPT 대기가 아닙니다. CLI의 `run status`는 인계에 필요한 metadata만 출력하며 task 본문, caller identity, task hash, workdir, runtime owner ID를 포함하지 않습니다. 정식 claim 뒤에만 API가 정확한 task와 workdir를 승인된 caller에게 반환합니다.
144
174
 
145
175
  ## CLI
146
176
 
147
- CLI는 브라우저를 구동하지 않습니다. `doctor`, `routing`, `jobs`, `run status`, `api path`, `config path`는 읽기 전용입니다. `install`/`uninstall`은 패키지가 소유한 스킬 링크만 변경합니다. `run reconcile`, `run takeover`, `run reconcile-runtime`, `run cancel`/`run stop`, `job cancel`은 감사 증거를 추가하거나 지속 run/job 상태를 변경합니다. 상태를 쓰는 명령 전에는 `cueline help`로 전체 인수를 확인하세요.
177
+ CLI는 브라우저를 구동하지 않습니다. 상태를 쓰는 명령 전에는 `cueline help`로 전체 인수를 확인하세요.
148
178
 
149
- ```console
150
- $ cueline install
151
- CueLine skill installed: /Users/you/.codex/skills/cueline
179
+ | 그룹 | 명령 | 효과 |
180
+ | --- | --- | --- |
181
+ | 조회 | `doctor` · `routing` · `jobs` · `runs` · `run status` · `run doctor` · `run watch` · `run timeline` · `run verify` · `run handoff` · `protocol lint` · `api path` · `config path` | 읽기 전용 |
182
+ | 설치 | `install` · `uninstall` | 패키지가 소유한 스킬 링크만 생성·제거 |
183
+ | 복구 | `run reconcile` · `run takeover` · `run reconcile-runtime` · `run cancel` / `run stop` · `job cancel` | 감사 증거 추가 또는 지속 run/job 상태 변경 |
152
184
 
185
+ ```console
153
186
  $ cueline doctor
154
- CueLine 0.1.6
187
+ CueLine 0.2.0
155
188
  status ok
156
189
  node 22.14.0 ok
157
190
  config /usr/local/lib/node_modules/cueline/config/routing.default.json valid
@@ -160,40 +193,41 @@ caller_ready yes
160
193
  caller_lanes 1
161
194
  process_available_lanes 1
162
195
 
163
- $ cueline api path
164
- /usr/local/lib/node_modules/cueline/dist/src/api.js
165
-
166
196
  $ cueline routing
167
197
  default codex-default available
168
198
 
169
- $ cueline jobs
170
- No jobs.
171
-
172
199
  $ cueline run status run_... --json
173
200
  {"status":"running","executor":"caller","phase":"caller_jobs_pending","runtime":{"ownership":"missing"},...}
174
201
 
175
- $ cueline run takeover stale_run_... --json
176
- {"runId":"stale_run_...","outcome":"taken_over","next":"continue",...}
202
+ $ cueline run doctor run_... --json
203
+ {"outcome":"action_required","phase":"caller_jobs_pending","nextAction":"execute_caller_jobs",...}
204
+
205
+ $ cueline run reconcile run_... --request-id msg_... --manual-send-confirmed --conversation-url https://chatgpt.com/c/...
206
+ run_...\tmsg_...\tconfirmed
177
207
 
178
208
  $ cueline run cancel run_...
179
209
  run_... requested affected_jobs=0
180
-
181
- $ cueline config path
182
- /usr/local/lib/node_modules/cueline/config/routing.default.json
183
-
184
- $ cueline uninstall
185
- CueLine skill removed: /Users/you/.codex/skills/cueline
186
210
  ```
187
211
 
188
212
  Node 버전이 너무 낮거나 활성화된 caller 레인이 하나도 없으면 `cueline doctor`는 0이 아닌 코드로 종료합니다. `process_available_lanes`가 0이어도 caller 모드는 저하되지 않습니다. process executor를 명시적으로 선택하기 전에만 `cueline routing`으로 process 가용성을 확인하세요. `cueline api path`가 출력하는 것이 곧 스킬이 import하는 모듈이므로, 패키지로 설치했다면 저장소를 받을 필요가 없습니다. `cueline help`는 `--json`과 수동 reconcile 필수 확인 플래그를 포함한 각 명령의 정확한 구문을 나열합니다.
189
213
 
214
+ 실험적 진단 명령에는 각각 전용 문서가 있습니다:
215
+
216
+ | 명령 | 역할 | 문서 |
217
+ | --- | --- | --- |
218
+ | `run doctor` | run 스냅샷을 안정적 finding 코드, 제한된 증거, 안전한 다음 행동으로 변환(상태를 쓰지 않음) | [run-doctor](docs/experiments/run-doctor.md) |
219
+ | `run watch` | 지속 이벤트 순번을 커서로 삼는, 제한적이고 lease를 잡지 않는 관측 | [run-watch](docs/experiments/run-watch.md) |
220
+ | `protocol lint` | Pro 엔벨로프를 오프라인 검증하고 알려진 계약 수정 사항을 한 번에 보고 | [protocol-lint](docs/experiments/protocol-lint.md) |
221
+ | `run handoff` | 정확한 identity와 절대 경로를 갖춘 안전한 재시작 패킷 생성 | [run-handoff](docs/experiments/run-handoff.md) |
222
+ | `run timeline` | 원본 이벤트를 담지 않는, 비식별화·커서 페이지네이션 감사 뷰 | [run-timeline](docs/experiments/run-timeline.md) |
223
+
190
224
  `run takeover`는 `run status`가 exact stale owner를 표시할 때만 사용합니다. 새로운 active heartbeat는 거부됩니다. 반환된 `next: continue` 또는 `next: reconcile_runtime`을 따르고 추측해서 진행하지 마세요.
191
225
 
192
226
  ## 설정
193
227
 
194
228
  `CUELINE_CONFIG`는 라우팅 설정 파일을 고르고, `CUELINE_HOME`은 로컬 상태의 위치를 옮깁니다(기본값 `~/.cueline`).
195
229
 
196
- Caller는 프로세스를 띄우지 않습니다. `executor: "process"`와 `allowProcessExecution: true`를 함께 지정한 경우에만 `default` 레인의 `codex-default`가 격리된 `codex exec --ignore-user-config`를 실행합니다. 독립 `advise`의 기본 동시 실행 상한은 전체/레인당 2이고, `work`가 포함된 배치는 직렬입니다.
230
+ Caller는 프로세스를 띄우지 않습니다. `executor: "process"`와 `allowProcessExecution: true`를 함께 지정한 경우에만 `default` 레인의 `codex-default`가 격리된 `codex exec --ignore-user-config`를 실행합니다. 독립 `advise`의 기본 동시 실행 상한은 전체/레인당 2이고, `work`가 포함된 배치는 직렬입니다. 다른 process worker를 등록하려면 [`config/routing.default.json`](config/routing.default.json)을 복사해 후보를 추가하고 `CUELINE_CONFIG`를 그쪽으로 지정하세요.
197
231
 
198
232
  상태는 `CUELINE_HOME` 아래에 놓입니다:
199
233
 
@@ -209,7 +243,11 @@ jobs/<job-id>.json 작업별 실행 증거
209
243
 
210
244
  기록 그 자체는 이벤트 로그입니다. 컨트롤러의 턴은 보내기 전에 기록되고, 작업은 프로세스가 시작되기 전에 등록됩니다. 그래서 의도와 부작용 사이에서 중단이 일어나도 흔적이 남습니다. 손상된 스냅샷은 신뢰되지 않고, 무시된 뒤 이벤트 1번부터 다시 만들어집니다.
211
245
 
212
- 복구는 완전히 같은 대화 URL에만 연결합니다. ChatGPT가 긴 텍스트를 첨부로 자동 변환하면 `attachment_ready`로 인식하며 전송 클릭은 최대 한 번입니다. 모호한 클릭은 `possibly_sent`가 되고 재전송하지 않습니다. 수동 전송 뒤에는 `cueline run reconcile RUN_ID --request-id REQUEST_ID --manual-send-confirmed`로 정식 확인하고 동일 conversation, Pro 증거, protocol/run/round/request identity를 모두 검증합니다. 컨트롤러 증거는 성공한 비어 있지 않은 stdout을 우선하며 전체 12,000자로 제한하고, 전체 stdout/stderr는 로컬에 보존합니다.
246
+ 복구는 완전히 같은 대화 URL에만 연결합니다. ChatGPT가 긴 텍스트를 첨부로 자동 변환하면 `attachment_ready`로 인식하며 전송 클릭은 최대 한 번입니다. 모호한 클릭은 `possibly_sent`가 되고 재전송하지 않습니다. 실제로 보이고 활성화되어 조작 가능한 Stop 컨트롤이 있는 동안에만 응답이 진행 중으로 간주됩니다. 숨은 잔여 버튼이 완료된 Pro 응답을 가리는 일은 없습니다. 수동 전송 뒤에는 `cueline run reconcile RUN_ID --request-id REQUEST_ID --manual-send-confirmed`로 정식 확인하고 동일 conversation, Pro 증거, protocol/run/round/request identity를 모두 검증합니다.
247
+
248
+ Pro가 답하는 동안에는 절대 중단하지 말고, `Answer now`, `Respond now`, `Stop` 또는 그에 준하는 가속 컨트롤도 쓰지 마세요. Pro에는 로컬 도구가 없고 저장소 구조나 로컬 경로에 대한 기본 지식도 없습니다. Caller 증거에는 정확한 코드/오류 식별자, 관련 코드 발췌, 절대 로컬 경로를 담고, Pro에게 로컬 증거가 더 필요한지 명시적으로 물어보세요.
249
+
250
+ 컨트롤러 증거는 성공한 비어 있지 않은 stdout을 우선하며 전체 12,000자로 제한하고, 전체 stdout/stderr는 로컬에 보존합니다. Pro가 `inspect(job_ids)`를 수락하면 다음 턴은 지정된 job의 증거 예산을 먼저 확보한 뒤 무관한 증거를 다룹니다.
213
251
 
214
252
  ## 검증
215
253
 
@@ -226,13 +264,22 @@ npm pack --dry-run
226
264
 
227
265
  ## 0.1의 한계
228
266
 
229
- 텍스트 명령 전용입니다. 긴 텍스트의 자동 첨부 변환은 지원하지만 의도적 파일 업로드, 이미지, Deep Research, Projects, Apps는 지원하지 않습니다. Caller work는 명시적 claim/start, process 실행은 이중 승인이 필요합니다. 모호한 전송이나 이미 시작된 작업은 자동 재시도하지 않습니다.
267
+ 텍스트 명령 전용입니다. run 하나당 대화는 하나입니다. `Pro` 선택이 CueLine이 하는 유일한 모델 전환입니다. 긴 텍스트의 자동 첨부 변환은 지원하지만 의도적 파일 업로드, 이미지, Deep Research, Projects, Apps는 지원하지 않습니다. Caller work는 명시적 claim/start와, 긴 작업에는 heartbeat가 필요합니다. process 실행은 이중 승인이 필요합니다. 모호한 전송이나 이미 시작된 작업은 자동 재시도하지 않습니다. macOS가 주 데스크톱 대상이고 Linux가 CI 대상이며 Windows는 검증되지 않았습니다. 어댑터는 현재 ChatGPT 웹 UI에 의존하므로, UI 변경은 지어낸 답이 아니라 명시적 오류로 드러납니다.
230
268
 
231
269
  전체 표는 [compatibility](docs/compatibility.md)를 보세요.
232
270
 
233
271
  ## 문서
234
272
 
235
- [architecture](docs/architecture.md) · [controller protocol](docs/controller-protocol.md) · [runner contract](docs/runner-contract.md) · [state and recovery](docs/state-and-recovery.md) · [compatibility](docs/compatibility.md) · [provenance](docs/provenance.md) (모두 영어)
273
+ | 문서 | 내용 |
274
+ | --- | --- |
275
+ | [architecture](docs/architecture.md) | 구성 요소의 결합 방식과 신뢰 경계의 위치 |
276
+ | [controller protocol](docs/controller-protocol.md) | `<CueLineControl>` 엔벨로프, 다섯 동작, 수정 규칙 |
277
+ | [runner contract](docs/runner-contract.md) | 등록된 process worker가 해야 할 일과 해서는 안 될 일 |
278
+ | [state and recovery](docs/state-and-recovery.md) | 지속 상태 레이아웃, ownership, 모든 복구 경로 |
279
+ | [compatibility](docs/compatibility.md) | 지원 플랫폼, 런타임, UI 전제 |
280
+ | [provenance](docs/provenance.md) | 설계의 유래와 CueLine이 아닌 것 |
281
+
282
+ (모두 영어)
236
283
 
237
284
  ## 개발
238
285