@ask-llm/plugin 0.17.0 → 0.19.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 (41) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.cursor-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +36 -0
  4. package/README.md +8 -8
  5. package/agents/brainstorm-coordinator.md +17 -16
  6. package/agents/codex-reviewer.md +1 -1
  7. package/agents/sol-reviewer.md +5 -5
  8. package/codex-pair-defaults.json +1 -1
  9. package/dist/brainstorm-panel.d.ts +1 -1
  10. package/dist/brainstorm-panel.d.ts.map +1 -1
  11. package/dist/brainstorm-panel.js +8 -8
  12. package/dist/brainstorm-panel.js.map +1 -1
  13. package/dist/brainstorm-run.js +1 -1
  14. package/dist/brainstorm-run.js.map +1 -1
  15. package/package.json +11 -10
  16. package/pi/extensions/codex-pair.ts +2 -1
  17. package/pi/extensions/provider-tools.ts +1 -1
  18. package/scripts/codex-pair-debounce-worker.mjs +60 -88
  19. package/scripts/codex-pair-prompt-drain.mjs +50 -64
  20. package/scripts/codex-pair-session.mjs +129 -168
  21. package/scripts/codex-pair-stop-gate.mjs +183 -233
  22. package/scripts/codex-pair-watch.mjs +1018 -1371
  23. package/scripts/lib/broker-lifecycle.mjs +677 -0
  24. package/scripts/lib/broker-rpc.mjs +173 -0
  25. package/scripts/lib/broker-transport.mjs +327 -0
  26. package/scripts/lib/broker.mjs +327 -0
  27. package/scripts/lib/debounce-state.mjs +206 -0
  28. package/scripts/lib/frontmatter.mjs +57 -0
  29. package/scripts/lib/parser.mjs +229 -0
  30. package/scripts/lib/process.mjs +56 -0
  31. package/scripts/lib/prompt.mjs +32 -0
  32. package/scripts/lib/session-registry.mjs +161 -0
  33. package/scripts/lib/state.mjs +720 -0
  34. package/scripts/lib/stop-gate.mjs +134 -0
  35. package/scripts/sol-review-transport.mjs +1 -1
  36. package/skills/brainstorm/SKILL.md +9 -9
  37. package/skills/codex-image/SKILL.md +2 -2
  38. package/skills/codex-pair/SKILL.md +5 -4
  39. package/skills/codex-review/SKILL.md +1 -1
  40. package/skills/grok-pair/SKILL.md +3 -3
  41. package/skills/sol-review/SKILL.md +5 -5
@@ -0,0 +1,134 @@
1
+ // scripts/lib/stop-gate.mjs
2
+ // Pure, I/O-free gate logic for the codex-pair Stop hook (#142, ADR-118).
3
+ // No workspace imports — the hook ships without node_modules.
4
+
5
+ import { isAbsolute, join, relative } from "node:path";
6
+ import { hashConcernBody } from "./state.mjs";
7
+
8
+ // Parse `git status --porcelain=v1 -z` into a Set of ABSOLUTE paths that are
9
+ // modified or untracked relative to HEAD. repoRoot = `git rev-parse
10
+ // --show-toplevel`. NUL mode disables git's C-style path quoting and reverses
11
+ // rename fields: the first record is the destination path, followed by a second
12
+ // source-path record. Only the destination is dirty on disk.
13
+ export function parseGitPorcelain(stdout, repoRoot) {
14
+ const dirty = new Set();
15
+ const records = stdout.split("\0");
16
+ for (let i = 0; i < records.length; i++) {
17
+ const record = records[i];
18
+ if (record.length < 4) continue;
19
+ const status = record.slice(0, 2);
20
+ const path = record.slice(3);
21
+ dirty.add(isAbsolute(path) ? path : join(repoRoot, path));
22
+ // In -z mode, rename/copy source paths are the next bare NUL record.
23
+ if (status.includes("R") || status.includes("C")) i++;
24
+ }
25
+ return dirty;
26
+ }
27
+
28
+ // Verdicts that don't carry a trustworthy final-state review. `skipped`/`error`
29
+ // carry a `file` field, so they can be a file's latest entry → [C] fail-opens on
30
+ // them. `retried`/`broker_fallback` are logged WITHOUT a `file` (transient
31
+ // per-attempt markers), so selectLatestEntries already excludes them and the
32
+ // file's true latest review (concerns/none/cached) is used — they're listed here
33
+ // for completeness/future-proofing, not because they're currently reachable.
34
+ const INDETERMINATE = new Set(["skipped", "error", "retried", "broker_fallback"]);
35
+
36
+ // Reconcile latest-per-file entries against present reality, returning the
37
+ // unacked HIGH findings that should block turn-end.
38
+ // entries Map<file, latestEntry> (from selectLatestEntries)
39
+ // acks { [hash]: {reason, ts} } (from readAcks)
40
+ // existsFn (absFile) => boolean (injected fs.existsSync)
41
+ // gitDirty Set<absPath> | null (null = no git filter)
42
+ // markerDir project root for relPath ack identity
43
+ export function collectBlockingHighs({ entries, acks, existsFn, gitDirty, markerDir }) {
44
+ const blocking = [];
45
+ for (const [file, entry] of entries) {
46
+ if (!existsFn(file)) continue; // [A] deleted/renamed
47
+ if (INDETERMINATE.has(entry.verdict)) continue; // [C] indeterminate latest → fail-open
48
+ if (gitDirty && !gitDirty.has(file)) continue; // [B] clean vs HEAD
49
+ const highs = Array.isArray(entry.concerns?.high) ? entry.concerns.high : [];
50
+ for (const text of highs) {
51
+ const hash = hashConcernBody(`${relative(markerDir, file)}:${text}`); // [E] file-scoped
52
+ if (!acks[hash]) blocking.push({ file, text, hash });
53
+ }
54
+ }
55
+ return blocking;
56
+ }
57
+
58
+ // Build the Stop-hook block reason. Short hashes (first 6) are the ack ids.
59
+ export function formatBlockMessage(blocking, markerDir) {
60
+ const lines = blocking.map((b) => {
61
+ const rel = relative(markerDir, b.file);
62
+ return ` [${b.hash}] ${rel}\n ${b.text}`;
63
+ });
64
+ return (
65
+ `🚫 codex-pair: ${blocking.length} unaddressed HIGH finding(s) (blockOn: HIGH). ` +
66
+ `Fix them, or defer each with /codex-pair-ack.\n\n` +
67
+ `${lines.join("\n")}\n\n` +
68
+ `To defer a finding (stale / pre-existing / out-of-scope), run /codex-pair-ack with its [hash] from the list above — e.g.:\n` +
69
+ ` /codex-pair-ack ${blocking[0].hash} "<reason>"\n` +
70
+ `(If you fixed a finding by editing a DIFFERENT file, make a real edit to the ` +
71
+ `flagged file so it gets re-reviewed — an identical re-touch hits the review cache.)`
72
+ );
73
+ }
74
+
75
+ // In-flight review detection (2026-07-02 seamless-pairing design). A turn can
76
+ // end while a debounce worker is still settling (record.reviewedGen <
77
+ // record.generation) or a codex call is mid-review (fresh inflight lock) —
78
+ // the log-based gate would pass and the verdict would land after "done".
79
+ // Pure over pre-read inputs; the script does the I/O.
80
+ // records parsed debounce-record JSONs (malformed entries tolerated)
81
+ // lockMtimes mtimeMs of files under state/inflight/
82
+ // now clock
83
+ // freshMs lock age beyond which a lock is crash junk, not a live review
84
+ // staleMs burst age beyond which an unconsumed record is a crashed
85
+ // worker's orphan (sweepStaleDebounce fodder), not a live settle
86
+ export function collectInFlight({ records, lockMtimes, now, freshMs, staleMs = 600_000 }) {
87
+ const settling = [];
88
+ for (const r of records) {
89
+ if (!r || typeof r !== "object" || typeof r.file !== "string") continue;
90
+ if (!(typeof r.generation === "number" && typeof r.reviewedGen === "number")) continue;
91
+ if (r.reviewedGen >= r.generation) continue;
92
+ if (Number.isFinite(r.burstStartedAt) && now - r.burstStartedAt > staleMs) continue;
93
+ settling.push(r.file);
94
+ }
95
+ const reviewing = lockMtimes.filter((m) => Number.isFinite(m) && now - m < freshMs).length;
96
+ return { settling, reviewing, any: settling.length > 0 || reviewing > 0 };
97
+ }
98
+
99
+ // Block reason for the in-flight case: tell Claude HOW to wait productively
100
+ // instead of just refusing the stop.
101
+ const MAX_SETTLING_LISTED = 5;
102
+ export function formatInFlightMessage({ settling, reviewing }, markerDir) {
103
+ const parts = [];
104
+ if (settling.length > 0) {
105
+ const listed = settling.slice(0, MAX_SETTLING_LISTED).map((f) => relative(markerDir, f));
106
+ const extra = settling.length > MAX_SETTLING_LISTED ? ` (+${settling.length - MAX_SETTLING_LISTED} more)` : "";
107
+ parts.push(`${settling.length} edited file(s) awaiting review: ${listed.join(", ")}${extra}`);
108
+ }
109
+ if (reviewing > 0) parts.push(`${reviewing} review(s) running`);
110
+ return (
111
+ `⏳ codex-pair: review(s) still in flight — ${parts.join("; ")}. ` +
112
+ `Verdicts land in ${join(markerDir, ".codex-pair", "log.jsonl")}. ` +
113
+ `Wait for them (e.g. \`sleep 45\`), read the newest entries for the files you edited, ` +
114
+ `address any HIGH findings, then end the turn.`
115
+ );
116
+ }
117
+
118
+ // Parse log.jsonl text → Map<file, latestEntry>. Last write per file wins
119
+ // (the log is append-only; the final entry is the file's latest review).
120
+ export function selectLatestEntries(logText) {
121
+ const latest = new Map();
122
+ for (const line of logText.split("\n")) {
123
+ const t = line.trim();
124
+ if (!t) continue;
125
+ let entry;
126
+ try {
127
+ entry = JSON.parse(t);
128
+ } catch {
129
+ continue;
130
+ }
131
+ if (entry && typeof entry.file === "string") latest.set(entry.file, entry);
132
+ }
133
+ return latest;
134
+ }
@@ -10,7 +10,7 @@ export const ASK_CODEX_TOOL = "ask-codex";
10
10
  export const ASK_LLM_PACKAGE = "@ask-llm/mcp";
11
11
  export const ASK_LLM_TOOL = "ask-llm";
12
12
  export const UNIFIED_CODEX_OPTION_KEYS = ["reasoningEffort", "includeDirs", "preferred", "sandbox"];
13
- export const SOL_MODEL = "gpt-5.6-sol";
13
+ export const SOL_MODEL = "gpt-6-sol";
14
14
  export const TERRA_MODEL = "gpt-5.6-terra";
15
15
 
16
16
  const MISSING_REGISTRATION_REMEDIATION =
@@ -6,7 +6,7 @@ description: Send a topic to an explicit multi-model panel, then synthesize find
6
6
  <!-- PORTABLE-CONTRACT:START -->
7
7
  ## Portable contract
8
8
 
9
- For the standard workflow, the current host model records an independent analysis before seeing external answers, then sends the same bounded topic and Context Brief concurrently to the selected providers. For the exact Grok + GPT-5.6 Sol workflow, the host is a non-voting evidence verifier/synthesizer: the brainstorming panel has exactly those two requested participants. Cross-check source where possible and synthesize consensus, unique insights, contradictions, rejected false positives, failures, and confidence. Keep provider, harness, requested model ID, independently observed served model ID, and Cursor's reported display label separate. Only direct xAI API / Grok CLI routes can report a served ID, and only when the provider/CLI payload actually carries one; a disclosed same-product alias/snapshot resolution (for example `grok-4.6` or `grok-4-latest` served as a dated `grok-4-<snapshot>`) stays eligible, while a different model is a mismatch and ineligible. A direct route whose payload omits the model stays selected-only. Cursor Agent and Codex CLI echo the requested ID, so that attribution is selected-only and unverifiable—never call a requested or selected ID the actual model. Never select Cursor Auto, infer a requested ID from a display label, silently change a model, or pivot to another harness/provider.
9
+ For the standard workflow, the current host model records an independent analysis before seeing external answers, then sends the same bounded topic and Context Brief concurrently to the selected providers. For the exact Grok + GPT-6 Sol workflow, the host is a non-voting evidence verifier/synthesizer: the brainstorming panel has exactly those two requested participants. Cross-check source where possible and synthesize consensus, unique insights, contradictions, rejected false positives, failures, and confidence. Keep provider, harness, requested model ID, independently observed served model ID, and Cursor's reported display label separate. Only direct xAI API / Grok CLI routes can report a served ID, and only when the provider/CLI payload actually carries one; a disclosed same-product alias/snapshot resolution (for example `grok-4.7` served as a dated `grok-4.7-<snapshot>`, or `grok-4-latest` served as `grok-4-<snapshot>`) stays eligible, while a different model is a mismatch and ineligible. A direct route whose payload omits the model stays selected-only. Cursor Agent and Codex CLI echo the requested ID, so that attribution is selected-only and unverifiable—never call a requested or selected ID the actual model. Never select Cursor Auto, infer a requested ID from a display label, silently change a model, or pivot to another harness/provider.
10
10
  <!-- PORTABLE-CONTRACT:END -->
11
11
 
12
12
  ## Host adapters
@@ -15,8 +15,8 @@ For the standard workflow, the current host model records an independent analysi
15
15
 
16
16
  The current Pi host model completes its independent evidence memo first. Standard provider lists use native `ask-multi`. A routed participant uses the matching native tool instead: `provider@cursor-agent:model` calls `ask-cursor-agent` with separate `provider` and exact `model`; direct Grok calls `ask-grok` with the explicit `harness` and exact model. A participant list mixing routed `provider@harness:exact-model-id` entries with bare provider names is refused before any tool call; nothing is dispatched or substituted. For the exact Grok + Sol panel, issue only these two consultations (concurrently when the host supports it):
17
17
 
18
- - `ask-cursor-agent({ provider: "grok", model: "cursor-grok-4.6-high", prompt })`
19
- - `ask-cursor-agent({ provider: "codex", model: "gpt-5.6-sol-high", prompt })`
18
+ - `ask-cursor-agent({ provider: "grok", model: "grok-4.7-high", prompt })`
19
+ - `ask-cursor-agent({ provider: "codex", model: "gpt-6-sol-high", prompt })`
20
20
 
21
21
  Do not call `ask-multi` for that panel because it cannot express Cursor harness identity, and do not call Gemini. Treat the host memo as non-voting verification evidence, not a third panel answer. If either participant fails, label the run partial and do not claim two-model consensus.
22
22
 
@@ -38,19 +38,19 @@ Consult an explicitly selected panel on a topic, then synthesize the responses a
38
38
  - Bare `grok` retains the existing direct canonical runner and its explicit `ASK_GROK_HARNESS` selection (`xai-api` default or `grok-cli`) for compatibility. That direct route never falls back.
39
39
  - Preferred explicit syntax is `provider@harness:exact-model-id`. Supported routed participants are:
40
40
  - `grok@cursor-agent:<exact ID from agent --list-models>` (preferred Grok route)
41
- - `codex@cursor-agent:<exact GPT-5.6 Sol ID from agent --list-models>`
41
+ - `codex@cursor-agent:<exact GPT-6 Sol ID from agent --list-models>`
42
42
  - `grok@grok-cli:<exact ID from grok models>` (explicit Grok Build alternative)
43
43
  - `grok@xai-api:<exact ID from GET /v1/models>`
44
- - `codex@codex-cli:gpt-5.6-sol` (explicit direct Codex alternative; any reported fallback makes the exact panel partial)
44
+ - `codex@codex-cli:gpt-6-sol` (explicit direct Codex alternative; any reported fallback makes the exact panel partial)
45
45
  - Never accept `Auto`, map a display label to an ID, or substitute a route. A missing registration/harness, unavailable model, auth failure, or unsupported provider/harness pair is a participant failure with its actionable error preserved.
46
- - A participant list must be either all bare provider names or all routed `provider@harness:exact-model-id` specs. A mixed list (for example `grok@cursor-agent:cursor-grok-4.6-high,antigravity`) is refused before any dispatch with the "Mixed brainstorm participant lists are not supported" error; no participant is rerouted to a bare runner, substituted, or dispatched. Generalized mixed panels are deferred to a future ADR.
46
+ - A participant list must be either all bare provider names or all routed `provider@harness:exact-model-id` specs. A mixed list (for example `grok@cursor-agent:grok-4.7-high,antigravity`) is refused before any dispatch with the "Mixed brainstorm participant lists are not supported" error; no participant is rerouted to a bare runner, substituted, or dispatched. Generalized mixed panels are deferred to a future ADR.
47
47
  - Everything after the participant list is the topic.
48
48
  - In standard mode, Claude Opus remains a participant. In the exact Grok + Sol mode below, Claude is only the non-voting evidence verifier/synthesizer so the panel has exactly two participants.
49
49
 
50
- **Architect workflow — exactly Grok + GPT-5.6 Sol, no Gemini:**
50
+ **Architect workflow — exactly Grok + GPT-6 Sol, no Gemini:**
51
51
 
52
52
  ```text
53
- /brainstorm grok@cursor-agent:cursor-grok-4.6-high,codex@cursor-agent:gpt-5.6-sol-high "review this architecture"
53
+ /brainstorm grok@cursor-agent:grok-4.7-high,codex@cursor-agent:gpt-6-sol-high "review this architecture"
54
54
  ```
55
55
 
56
56
  These IDs are exact catalog examples verified for this workflow; account catalogs can change, so use `agent --list-models` and replace an unavailable ID explicitly. The coordinator must not call Gemini, the direct Grok runner, xAI API, Grok Build, or Codex CLI for this invocation.
@@ -58,7 +58,7 @@ These IDs are exact catalog examples verified for this workflow; account catalog
58
58
  **Explicit Grok Build alternative (still no Gemini):**
59
59
 
60
60
  ```text
61
- /brainstorm grok@grok-cli:grok-build,codex@cursor-agent:gpt-5.6-sol-high "review this architecture"
61
+ /brainstorm grok@grok-cli:grok-4.7,codex@cursor-agent:gpt-6-sol-high "review this architecture"
62
62
  ```
63
63
 
64
64
  This route is valid only when the installed Grok Build contract supports Ask LLM's headless JSON/read-only flags. Failure is terminal for the Grok participant; do not pivot to Cursor or xAI.
@@ -82,7 +82,7 @@ After saving, confirm the absolute path of the created file and its byte size in
82
82
 
83
83
  **Sandbox:** pass `sandbox: "workspace-write"` on this `ask-codex` or fully pinned `ask-llm({ provider: "codex", ... })` call. Codex defaults to the read-only review sandbox (ADR-136), under which it cannot write the PNG to disk; image generation is the sanctioned exception that needs Codex to write the output file itself. The unified server will not silently strip `sandbox`; an older `@ask-llm/mcp` that cannot honor it must fail closed.
84
84
 
85
- **Default model:** let `ask-codex` use its default (`gpt-5.6-sol`). The image_generation tool is invoked by the model regardless of which Codex chat model is selected — model selection here is about the orchestrating agent, not the image model itself.
85
+ **Default model:** let `ask-codex` use its default (`gpt-6-astra`). The image_generation tool is invoked by the model regardless of which Codex chat model is selected — model selection here is about the orchestrating agent, not the image model itself.
86
86
 
87
87
  **Wall time expectation:** with gpt-image-2, simple images typically render in **under a minute** end-to-end; complex prompts or high-resolution (up to 4K) renders can take a **few minutes** because gpt-image-2's thinking mode plans layout and self-checks before generating. This is normal; do not retry assuming a hang. The first call in a session is slowest because the image_generation tool definitions aren't cached yet; subsequent calls in the same session are faster (Codex CLI prompt-caches aggressively).
88
88
 
@@ -113,7 +113,7 @@ Phase 3 — `ask-codex` is called with the prompt template above.
113
113
 
114
114
  Phase 4 — `ls -la /tmp/codex-images/2026-04-24/cat-reading-a-book.png` shows a 248KB file. Skill returns:
115
115
 
116
- > Generated **/tmp/codex-images/2026-04-24/cat-reading-a-book.png** (248 KB) via gpt-image-2. Used Codex (gpt-5.6-sol) as orchestrator. Refined prompt: *minimalist illustration of a cat reading a book, flat vector style, two-tone palette, no human figures, square framing, transparent background*. Reading inline below.
116
+ > Generated **/tmp/codex-images/2026-04-24/cat-reading-a-book.png** (248 KB) via gpt-image-2. Used Codex (gpt-6-sol) as orchestrator. Refined prompt: *minimalist illustration of a cat reading a book, flat vector style, two-tone palette, no human figures, square framing, transparent background*. Reading inline below.
117
117
 
118
118
  [image renders]
119
119
 
@@ -24,7 +24,7 @@ Cursor discovers this `SKILL.md` through its supported Agent Skills surface; `/c
24
24
  {"mcpServers":{"ask-llm":{"command":"npx","args":["-y","@ask-llm/mcp"]}}}
25
25
  ```
26
26
  Save that as project `.cursor/mcp.json` or user `~/.cursor/mcp.json`, ensure `codex` is authenticated, reload the server from Cursor Settings → Tools & MCP or restart Cursor Agent, and invoke `/codex-pair` again. A split `codex` entry using `@ask-llm/codex-mcp` is an explicit user-installed alternative when only the `ask-codex` leaf is desired; keep one registration per server (the plugin already provides `ask-llm`, so do not add a second `ask-llm` entry merely to duplicate it).
27
- 2. Require both `model=<exact ID>` and `effort=low|medium|high|xhigh|max`; parse optional `include=dir1,dir2`. If model or effort is omitted, ask the user to choose it and stop before reading extra context, requesting consent, or calling a provider. Do not infer either value from the Cursor host environment: the MCP server may resolve different `ASK_CODEX_MODEL` or `ASK_CODEX_REASONING_EFFORT` values. Reject absolute, `..`, and `~` include paths; cap at 32. Build a bounded context manifest (20 KB/file, 100 KB/request) from task requirements, relevant project instructions, changed files, and tests. Do not send secrets or unrelated files.
27
+ 2. Require both `model=<exact ID>` and `effort=low|medium|high|xhigh|max|ultra`; parse optional `include=dir1,dir2`. If model or effort is omitted, ask the user to confirm the pair defaults `model=gpt-6-sol` and `effort=medium`, then stop before reading extra context, requesting consent, or calling a provider. Do not infer either value from the Cursor host environment: the MCP server may resolve different `ASK_CODEX_MODEL` or `ASK_CODEX_REASONING_EFFORT` values. Reject absolute, `..`, and `~` include paths; cap at 32. Build a bounded context manifest (20 KB/file, 100 KB/request) from task requirements, relevant project instructions, changed files, and tests. Do not send secrets or unrelated files.
28
28
  3. Before the first provider call, show host=`Cursor Agent`, reviewer provider=`codex`, selected transport=`ask-codex` or unified `ask-llm`, exact user-supplied model, exact user-supplied reasoning effort, include directories, read-only behavior, data/quota boundary, and fresh persisted-session intent. Ask for explicit confirmation using Cursor's normal conversational approval surface. Refusal ends `cancelled` with no provider call.
29
29
  4. First call exactly one of these protocol shapes, substituting the already disclosed explicit choices:
30
30
  ```json
@@ -196,7 +196,8 @@ Render a status table:
196
196
  codex-pair status — <MARKER_DIR>
197
197
 
198
198
  State: ACTIVE ✓
199
- Marker model: <model from frontmatter of context.md, or "default (gpt-5.6-sol)">
199
+ Marker model: <model from frontmatter of context.md, or "default (gpt-6-sol)">
200
+ Reasoning effort: medium (override with ASK_CODEX_REASONING_EFFORT)
200
201
  Surface threshold: <surfaceThreshold from frontmatter, or "med">
201
202
  Cost/review: varies by Codex plan and workload / ~13–50s wall-clock
202
203
 
@@ -303,7 +304,7 @@ Claude edits src/billing/charge.ts
303
304
 
304
305
  ## Cost characteristics
305
306
 
306
- - Usage varies by Codex plan and workload (`gpt-5.6-sol` with reasoning tokens)
307
+ - Usage varies by Codex plan and workload (`gpt-6-sol` with reasoning tokens)
307
308
  - ~13–50s per file wall-clock
308
309
  - Files >20 KB skipped (override with `CODEX_PAIR_MAX_FILE_BYTES`)
309
310
  - node_modules, dist, lockfiles, images skipped automatically
@@ -332,7 +333,7 @@ Use integer minor units such as `priceCents: z.number().int().nonnegative()`.
332
333
  |---|---|---|
333
334
  | `CODEX_PAIR_DISABLED` | unset | Set to `1` to bypass the hook entirely (kill switch) |
334
335
  | `CODEX_PAIR_MAX_FILE_BYTES` | `20000` | Skip files larger than this many bytes |
335
- | `ASK_CODEX_TIMEOUT_MS` | `800000` | Per-call codex timeout (inherited from @ask-llm/codex-mcp, ADR-074) |
336
+ | `ASK_CODEX_TIMEOUT_MS` | `800000` | See [Codex Pair configuration](https://lykhoyda.github.io/ask-llm/plugin/codex-pair#configuration-knobs) for the broker and direct review budgets. |
336
337
  | `ASK_CODEX_REASONING_EFFORT` | `medium` | Codex reasoning effort for continuous per-edit reviews; `/codex-review` and `/brainstorm` default to `high` instead. |
337
338
  | `ASK_CODEX_DEBOUNCE_MS` | `15000` | Settle window: a burst of edits to one file within this window is collapsed into a single review of the settled state (ADR-112). Set to `0` to disable debounce and review every edit synchronously. |
338
339
  | `ASK_CODEX_DEBOUNCE_MAX_MS` | `60000` | Hard cap from the first edit of a burst — forces a review even under a continuous edit stream. |
@@ -47,6 +47,6 @@ For **recall-first** review on hot-path code (money handling, security paths, sp
47
47
 
48
48
  2. If the diff is empty, inform the user there are no changes to review.
49
49
 
50
- 3. Launch the `codex-reviewer` agent with the diff content. The agent handles the Codex prompt structure and output formatting, using GPT-5.6 Sol at `high` reasoning effort with automatic Terra fallback.
50
+ 3. Launch the `codex-reviewer` agent with the diff content. The agent handles the Codex prompt structure and output formatting, using GPT-6 Astra at `high` reasoning effort with automatic Terra fallback.
51
51
 
52
52
  <!-- HOST-ADAPTER:CLAUDE-CODE:END -->
@@ -35,9 +35,9 @@ Run an iterative pair-programming session in which Claude remains the sole edito
35
35
  Accept optional command text in this form (ask for any missing choice):
36
36
 
37
37
  ```text
38
- /grok-pair route=cursor-agent model=cursor-grok-4.6-high include=packages/api,packages/shared <task>
39
- /grok-pair route=xai-api model=grok-4.6 effort=xhigh <task>
40
- /grok-pair route=grok-cli model=grok-build effort=high <task>
38
+ /grok-pair route=cursor-agent model=grok-4.7-high include=packages/api,packages/shared <task>
39
+ /grok-pair route=xai-api model=grok-4.7 effort=xhigh <task>
40
+ /grok-pair route=grok-cli model=grok-4.7 effort=high <task>
41
41
  ```
42
42
 
43
43
  Supported routes:
@@ -1,19 +1,19 @@
1
1
  ---
2
2
  name: sol-review
3
- description: Review the current code changes specifically with OpenAI GPT-5.6 Sol. Use when the user asks for a Sol review, says "review with Sol", wants a model-pinned Codex review, or invokes /sol-review.
3
+ description: Review the current code changes specifically with OpenAI GPT-6 Sol. Use when the user asks for a Sol review, says "review with Sol", wants a model-pinned Codex review, or invokes /sol-review.
4
4
  ---
5
5
 
6
6
  <!-- PORTABLE-CONTRACT:START -->
7
7
  ## Portable contract
8
8
 
9
- Gather a bounded diff and context brief, request a read-only Codex review explicitly pinned to `gpt-5.6-sol` with `reasoningEffort: "high"`, verify findings against source, and disclose any model or transport fallback. Do not silently substitute another provider.
9
+ Gather a bounded diff and context brief, request a read-only Codex review explicitly pinned to `gpt-6-sol` with `reasoningEffort: "high"`, verify findings against source, and disclose any model or transport fallback. Do not silently substitute another provider.
10
10
  <!-- PORTABLE-CONTRACT:END -->
11
11
 
12
12
  ## Host adapters
13
13
 
14
14
  ### Pi adapter
15
15
 
16
- Call `ask-codex` with `model: "gpt-5.6-sol"`, `reasoningEffort: "high"`, and `sandbox: "read-only"`; apply only the portable contract in `../../agents/sol-reviewer.md` and disclose fallback metadata.
16
+ Call `ask-codex` with `model: "gpt-6-sol"`, `reasoningEffort: "high"`, and `sandbox: "read-only"`; apply only the portable contract in `../../agents/sol-reviewer.md` and disclose fallback metadata.
17
17
 
18
18
  <!-- HOST-ADAPTER:CLAUDE-CODE:START -->
19
19
  ### Claude Code adapter
@@ -24,7 +24,7 @@ The existing detailed workflow below is the Claude Code adapter. Its Agent, MCP,
24
24
 
25
25
  # Sol Code Review
26
26
 
27
- Run a read-only, precision-first review explicitly pinned to GPT-5.6 Sol at high reasoning effort.
27
+ Run a read-only, precision-first review explicitly pinned to GPT-6 Sol at high reasoning effort.
28
28
 
29
29
  ## Workflow
30
30
 
@@ -40,6 +40,6 @@ Run a read-only, precision-first review explicitly pinned to GPT-5.6 Sol at high
40
40
  6. Launch the `sol-reviewer` agent with the diff and a compact context brief containing the changed files, applicable conventions, referenced ADRs, the user's requested review focus, and the complete preflight result.
41
41
  7. Return the agent's validated findings without adding unverified issues.
42
42
 
43
- The reviewer must call `ask-codex` with `model: "gpt-5.6-sol"`, `reasoningEffort: "high"`, and `sandbox: "read-only"`, or the unified `ask-llm` equivalent with `provider: "codex"` and those same fields, or use the shipped CLI fallback runner when no usable MCP tool is available, its schema cannot honor those options, or its invocation fails at the transport/service boundary. That runner executes the sanctioned `codex exec -m gpt-5.6-sol -c model_reasoning_effort="high" -s read-only --ignore-user-config --ignore-rules --skip-git-repo-check` contract and relays its result unchanged. This explicit pin distinguishes `/sol-review` from `/codex-review`, which follows the configured Codex default. Both fallback kinds must be disclosed in the report: a Terra quota fallback means the requested Sol review did not complete on Sol, and a CLI transport fallback must report missing registration, registered-service unavailability, an unsupported unified schema, or an unreadable inventory without claiming a state that could not be determined.
43
+ The reviewer must call `ask-codex` with `model: "gpt-6-sol"`, `reasoningEffort: "high"`, and `sandbox: "read-only"`, or the unified `ask-llm` equivalent with `provider: "codex"` and those same fields, or use the shipped CLI fallback runner when no usable MCP tool is available, its schema cannot honor those options, or its invocation fails at the transport/service boundary. That runner executes the sanctioned `codex exec -m gpt-6-sol -c model_reasoning_effort="high" -s read-only --ignore-user-config --ignore-rules --skip-git-repo-check` contract and relays its result unchanged. This explicit pin distinguishes `/sol-review` from `/codex-review`, which follows the configured Codex default. Both fallback kinds must be disclosed in the report: a Terra quota fallback means the requested Sol review did not complete on Sol, and a CLI transport fallback must report missing registration, registered-service unavailability, an unsupported unified schema, or an unreadable inventory without claiming a state that could not be determined.
44
44
 
45
45
  <!-- HOST-ADAPTER:CLAUDE-CODE:END -->