@enderfga/claw-orchestrator 7.11.0 → 7.12.1

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.
@@ -90,7 +90,7 @@ failing with "Session not found".
90
90
  ## UX flow
91
91
 
92
92
  ```
93
- 1. autoloop_start { run_id, workspace } → Planner session ready (refuses if the workspace Git tree already has tracked, staged, untracked, or submodule changes — including when repository status configuration hides them, `status.showUntrackedFiles=no`, or the porcelain listing is too large to buffer; unexpected `git status` failures also refuse; untracked (`??`) or index-clean worktree modifications (` M`) under `tasks/<id>/` with a regular `tasks/<id>/goal.json` are ignored so a second start can proceed after a committed ledger is appended, including when workspace is a nested repo subdirectory after stripping a verified `show-prefix`; dirt outside the workspace still refuses; ignored paths and non-repo workspaces still start)
93
+ 1. autoloop_start { run_id, workspace } → Planner session ready (refuses if the workspace Git tree already has tracked, staged, untracked, or submodule changes — including when repository status configuration hides them, `status.showUntrackedFiles=no`, or the porcelain listing is too large to buffer; unexpected `git status` failures also refuse; untracked (`??`) or index-clean worktree modifications (` M`) under `tasks/<id>/` with a regular `tasks/<id>/goal.json` are ignored so a second start can proceed after a committed ledger is appended, including when workspace is a nested repo subdirectory after stripping a verified `show-prefix`; dirt outside the workspace still refuses; ignored paths and non-repo workspaces still start). On a Git workspace, after that dirty check passes, start creates `tasks/<runId>/.gitignore` with `*` as the first ledger file (accepting an existing exact `*`, `*\n`, or `*\r\n` without overwrite), proves the ledger is ignored via `git check-ignore`, and refuses with one fixed generic error when the ledger is tracked, the ignore file is partial/deceptive, or `tasks`/`tasks/<runId>` is not a real in-workspace directory (e.g. a committed `tasks` symlink). Failed proofs and later start failures retain the run-local dirs/`.gitignore` (never deleted). Does not write `info/exclude` or any repository-wide ignore. The same fresh-start boundary runs on the first boot of a workflow `autoloop` node (`visits === 1`); `autoloopResume` / `workflowResume` and later visits skip it. Non-Git starts are unchanged.
94
94
  2. autoloop_chat { run_id, "<your goal>" } → Planner reads workspace,
95
95
  drafts plan.md + goal.json,
96
96
  asks "ready to spawn?"
@@ -339,8 +339,9 @@ JSONL, one entry per line, ts-prefixed.
339
339
 
340
340
  ```
341
341
  <workspace>/tasks/<run_id>/
342
- ├── plan.md # Planner-authored, git-committed
343
- ├── goal.json # Planner-authored, git-committed
342
+ ├── .gitignore # run-local `*`; first file on Git start; keeps the ledger out of status/add
343
+ ├── plan.md # Planner-authored (workspace-root copies are what iters commit)
344
+ ├── goal.json # Planner-authored (workspace-root copies are what iters commit)
344
345
  ├── push_log.jsonl # every notify_user attempt + channel used
345
346
  ├── decisions.jsonl # runner / dispatcher audit trail (see above)
346
347
  ├── chat.jsonl # Planner-pane conversation, replayed by /chat_history
@@ -360,6 +361,11 @@ JSONL, one entry per line, ts-prefixed.
360
361
  └── coder_summary.txt
361
362
  ```
362
363
 
364
+ On a Git workspace, `autoloop_start` writes `.gitignore` before other ledger
365
+ files and fails closed unless `git check-ignore` confirms the ledger is
366
+ ignored. The run-local ignore is self-contained: it does not rely on
367
+ `.git/info/exclude` or a root `.gitignore` entry for `tasks/`.
368
+
363
369
  The orchestrator git-commits each iter automatically. Coder must NOT call
364
370
  `git commit` itself — that confuses the diff log. **If `git commit` fails
365
371
  inside an iter** (pre-commit hook reject, signing key missing, …) the
@@ -458,13 +464,27 @@ Resume is explicit. `POST /autoloop/<id>/resume` (or
458
464
  `SessionManager.autoloopResume()`) restarts a run from its stored spec.
459
465
  Custom-engine configs are the one thing the spec does not carry (they can hold
460
466
  secrets), so a resume must be given them again. Cancelling a run stops all three
461
- agents, the same as `autoloop_stop`. If the highest committed Coder iteration
467
+ agents, the same as `autoloop_stop`.
468
+
469
+ On a non-fresh boot (resume / revisit), before any Planner session or
470
+ checkpoint publish, the boot reads the run ledger once and restores typed
471
+ `iter` and `metric_history` from the contiguous valid closed prefix of
472
+ `iter/0..K` (each closed entry needs `directive.json` plus a parsed
473
+ `verdict.json` whose `iter` matches and whose `decision` is a supported
474
+ Reviewer decision). Finite verdict metrics are kept in order, capped at
475
+ `MAX_METRIC_HISTORY` (20). The stored checkpoint's `iter` / `metric_history`
476
+ are never progress authority. A fresh start skips that read. When there is no
477
+ valid closed prefix (including missing or open/malformed `iter/0` with a later
478
+ canonical directory present), the reader returns without restore or refusal —
479
+ same Planner-only resume as before. If the highest committed Coder iteration
462
480
  has ledger artifacts and no `verdict.json`, and `HEAD` still names that iter,
463
- resume starts and sends only the Reviewer: one `review_request` for that
464
- checkpoint, and the dispatcher persists `verdict.json`. It does not create or
465
- resume a Coder session, and a historical persisted Coder registry row is left
466
- unchanged. An in-flight send is still not retried, and there is no message
467
- outbox.
481
+ resume still starts and sends only the Reviewer: one `review_request` for that
482
+ iteration (with rebuilt `prior_metrics`), and the dispatcher persists
483
+ `verdict.json`. It does not create or resume a Coder session, and a historical
484
+ persisted Coder registry row is left unchanged. An in-flight send is still not
485
+ retried, and there is no message outbox. A gap or malformed closed tail after a
486
+ valid prefix refuses the resume with a fixed generic error before any new
487
+ session or effect; ledger text is never echoed into the error.
468
488
 
469
489
  ## Known limitations
470
490
 
@@ -483,6 +503,11 @@ outbox.
483
503
  process until it is resumed, and a send that was in flight is not retried.
484
504
  - **Multi-run / same workspace** races on `git index.lock`. Run separate
485
505
  workspaces (or git worktrees) for concurrent runs.
506
+ - **Closed-ledger restore does not rebuild streaks or status.** Only `iter` and
507
+ capped `metric_history` are restored from the closed prefix; `rejectStreak`,
508
+ `regressionStreak`, and run `status` fields are not reconstructed. Prefixless
509
+ corruption, path/symlink size hardening, and fresh `autoloop_start` reuse of a
510
+ retained ledger id remain out of scope.
486
511
 
487
512
  ## Related
488
513
 
@@ -2,12 +2,14 @@
2
2
 
3
3
  This document tracks which Claude Code CLI version Claw Orchestrator is currently synced to, and which features have been integrated. Recent rows also record the other engines' versions checked in the same sync.
4
4
 
5
- ## Currently tracked: **Claude Code CLI 2.1.296** (as of 2026-10-11, plugin v7.11.0)
5
+ ## Currently tracked: **Claude Code CLI 2.1.307** (as of 2026-10-22, plugin v7.12.1)
6
6
 
7
7
  ## Sync history
8
8
 
9
9
  | Plugin Version | Claude CLI Version | Date | Notable integrations |
10
10
  | ------------------- | ------------------ | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
11
+ | v7.12.1 | 2.1.307 | 2026-10-22 | CC 2.1.302→2.1.307, agy 1.4.0→1.4.4, grok 1.0.62→1.0.67; Codex 0.163.0 and OpenCode 1.19.3 unchanged. No flag the wrappers pass changed. grok 1.0.67 makes `grok-4.7` its default and only model: registered (same prices and 500K window as `grok-4.6`), the `grok` alias moved to it, and a session with no `model` is labelled with the model grok reports. grok read-only re-measured on 1.0.67 (direct and shell writes blocked; the subagent probe hit the free-tier limit). OpenCode 2 still beta-only, still refused. |
12
+ | v7.12.0 | 2.1.302 | 2026-10-17 | CC 2.1.296→2.1.302, Codex 0.162.1→0.163.0, agy 1.3.2→1.4.0, grok 1.0.50→1.0.62, OpenCode 1.19.0→1.19.3. No flag the wrappers pass changed. grok read-only re-measured on 1.0.62 (direct, shell and subagent writes blocked; the failed-sandbox warning unchanged). OpenCode 2 still beta-only, still refused. Codex 0.163.0 turns Daybreak (security programme, not a model) on for eligible accounts; billing follows the model codex reports. |
11
13
  | v7.11.0 | 2.1.296 | 2026-10-11 | CC 2.1.295→2.1.296, Codex 0.162.0→0.162.1, OpenCode 1.18.35→1.19.0; agy 1.3.2 and grok 1.0.50 unchanged. No flag the wrappers pass changed. OpenCode 1.19.0 offers `opencode upgrade --major` to OpenCode 2 (beta builds `0.0.0-beta-N`, replaces V1): measured on 0.0.0-beta-17823 it drops `step_finish` and `--variant`, and its free tier answers 403 to a custom agent, so the read-only agent is unverifiable — the OpenCode session now refuses a V2 binary at start. |
12
14
  | v7.10.0 | 2.1.295 | 2026-10-09 | CC 2.1.292→2.1.295, Codex 0.160.1→0.162.0, agy 1.3.1→1.3.2, grok 1.0.46→1.0.50; OpenCode 1.18.35 unchanged. No flag the wrappers pass changed. Integrated: Claude Haiku 5.5 registered and the `haiku` alias moved to it (`--model haiku` resolves to `claude-haiku-5-5` in 2.1.295); Sonnet 5.5's cache-hit price corrected to 0.05× input. Integrated: grok 1.0.50's `--sandbox read-only` backs Grok's `sandboxMode: 'read-only'`, measured against direct, shell, subagent, resumed-turn and out-of-project writes; a profile grok cannot apply only warns, so the session kills the process on that warning. |
13
15
  | v7.8.0 | 2.1.292 | 2026-10-07 | CC 2.1.291→2.1.292, agy 1.3.0→1.3.1, OpenCode 1.18.34→1.18.35; Codex 0.160.1 and grok 1.0.46 unchanged. No flag surface changed. Integrated: Codex image generation surfaced as `images` on the send result (`codex exec` from `$CODEX_HOME/generated_images/<thread>/`, `codex-app` from the `imageGeneration` item). Read, no change needed: CC 2.1.292 negotiates MCP protocol 2026-07-28 with local stdio servers by default — `clawo-mcp` answers with 2025-11-25 and connects with no delay (measured against `MCP_PROTOCOL_NEGOTIATION=legacy`). |
@@ -28,7 +28,7 @@ SessionManager
28
28
 
29
29
  ### Claude Code (`engine: 'claude'`)
30
30
 
31
- Default engine. Long-running subprocess with streaming JSON I/O. Tested with Claude Code CLI **2.1.296**.
31
+ Default engine. Long-running subprocess with streaming JSON I/O. Tested with Claude Code CLI **2.1.307**.
32
32
 
33
33
  - Persistent multi-turn conversations
34
34
  - Real-time streaming (text, tool_use, tool_result, system events)
@@ -62,7 +62,7 @@ await manager.startSession({
62
62
 
63
63
  ### OpenAI Codex (`engine: 'codex'`)
64
64
 
65
- Wraps the `codex exec` subcommand. Each `send()` spawns a new process. Tested with `codex` CLI **0.162.1**.
65
+ Wraps the `codex exec` subcommand. Each `send()` spawns a new process. Tested with `codex` CLI **0.163.0**.
66
66
 
67
67
  - Non-interactive execution via `codex exec --sandbox workspace-write --skip-git-repo-check --json`
68
68
  - Real `usage` from the `turn.completed` JSON event (input, output, cached, reasoning tokens). **These are cumulative over the thread, not per turn**, so they replace the session totals rather than being added to them; subtracting consecutive values gives one turn's prompt
@@ -133,7 +133,7 @@ await manager.startSession({
133
133
 
134
134
  Wraps Google's **Antigravity CLI** (`agy`) — the successor to Gemini CLI (consumer
135
135
  Gemini CLI tiers stopped serving 2026-06-18). Each `send()` spawns a new process
136
- in print mode. Tested with `agy` **1.3.2**.
136
+ in print mode. Tested with `agy` **1.4.4**.
137
137
 
138
138
  - One-shot execution per message (no persistent subprocess)
139
139
  - **Structured output and real usage** — `--output-format stream-json` emits an
@@ -218,12 +218,14 @@ await manager.startSession({
218
218
  ### Grok Build (`engine: 'grok'`)
219
219
 
220
220
  Wraps xAI's **Grok Build** CLI. Each `send()` spawns `grok -p <msg> --output-format json`, which
221
- prints a single JSON object and exits. Tested with `grok` **1.0.50**.
221
+ prints a single JSON object and exits. Tested with `grok` **1.0.67**.
222
222
 
223
223
  - **Cost comes from the engine, not from the price table.** The result object carries
224
224
  `total_cost_usd`, and the wrapper writes it straight into the session's spend, so the run ledger
225
225
  and the `maxBudgetUsd` gate both read what xAI charged. Other engines multiply tokens by a rate in
226
- `models.ts`. `grok-4.6` is still registered, for its context window and an indicative breakdown.
226
+ `models.ts`. `grok-4.7` (grok's default since 1.0.67) and `grok-4.6` are still registered, for
227
+ their context window and an indicative breakdown; with no `model` set, the session is labelled with
228
+ the model grok reports under `modelUsage`.
227
229
  - **Real conversation continuity**: the `sessionId` from turn 1 is replayed as `--resume <id>`.
228
230
  `--continue` is not used — it means "the most recent session for this cwd", which collides
229
231
  between concurrent sessions.
@@ -263,7 +265,7 @@ prints a single JSON object and exits. Tested with `grok` **1.0.50**.
263
265
  await manager.startSession({
264
266
  name: 'grok-task',
265
267
  engine: 'grok',
266
- model: 'grok-4.6',
268
+ model: 'grok-4.7',
267
269
  cwd: '/project',
268
270
  });
269
271
  ```
@@ -145,7 +145,7 @@ is unrecoverable and reads back as "not found".
145
145
  | `human_gate` | Parks the run until a person answers |
146
146
  | `router` | Picks the next node from declarative conditions; a backwards route is the loop |
147
147
  | `subflow` | Runs another workflow as a step and adopts its verdict |
148
- | `autoloop` | A long-lived Planner / Coder / Reviewer loop; its executor is injected |
148
+ | `autoloop` | A long-lived Planner / Coder / Reviewer loop; its executor is injected. On the node's first visit (`visits === 1`) the shared fresh-start boundary applies (dirty-worktree refusal + run-local `tasks/<config.runId>/.gitignore`); resume and later visits skip it. |
149
149
  | `ultraapp_*` | UltraApp's synth and deploy stages; their executors are injected too |
150
150
 
151
151
  Every node takes `retry: { max, backoffMs }`, `timeoutMs`, and