Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .compound-engineering/config.example.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,8 @@
# `fable` or a full id such as `claude-opus-5` for claude; `gpt-*` for codex,
# optionally namespace-qualified such as `openai.gpt-5.6-sol` when the codex CLI
# routes through a non-default `model_provider`).
# Effort levels: claude low|medium|high|xhigh|max, codex minimal|low|medium|
# high|xhigh, grok low|medium|high; cursor/composer routes take none. A value
# Effort levels: claude low|medium|high|xhigh|max, codex none|minimal|low|
# medium|high|xhigh|max, grok low|medium|high; cursor/composer routes take none. A value
# the peer cannot honor skips the pass with a stated reason -- never substituted.

# cross_model_review_mode: off # auto | off (default: auto)
Expand Down
2 changes: 1 addition & 1 deletion docs/guides/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ All settings are optional. Commented examples are documentation, not active valu
| [`ce-work`](./ce-work.md), [`lfg`](./lfg.md) | `work_engine_mode`, `work_engine_preferences` | Ordered implementation-author preferences. Mode is `off`, `prefer`, or `require`; each entry has a `harness` and optional `model`. See [Implementation routing](#implementation-routing). |
| [`ce-code-review`](./ce-code-review.md), [`ce-doc-review`](./ce-doc-review.md) | `cross_model_review_mode` | Whether the automatic cross-model pass may send review content to a second provider: `auto` (default, current behavior) or `off`. `off` is evaluated before any peer or route is resolved, keeps every local reviewer and the local adversarial fallback, and is reported as "disabled by checkout config" rather than as an unavailable route. A direct conversation request for a peer overrides `off` for that run; a conversation prohibition overrides `auto`. |
| [`ce-code-review`](./ce-code-review.md), [`ce-doc-review`](./ce-doc-review.md) | `cross_model_peer` | Preferred cross-model review target: `codex`, `claude`, `grok`, `cursor`, `composer`, or `opencode`. `grok` binds the native grok CLI when it is installed, and falls back to Grok through Cursor only when that CLI is absent and Cursor is a sanctioned recipient. The review skills still apply host-independence and route-availability gates. |
Comment thread
khsaurabh marked this conversation as resolved.
| [`ce-code-review`](./ce-code-review.md), [`ce-doc-review`](./ce-doc-review.md) | `cross_model_model`, `cross_model_effort` | Pin the resolved peer target's model (an alias such as `fable` or a full id such as `claude-opus-5`, same family as the target; a codex id may carry its serving provider's namespace, such as `openai.gpt-5.6-sol`, when the CLI routes through a non-default `model_provider`) and reasoning effort (claude `low`..`max`, codex `minimal`..`xhigh`, grok `low`..`high`; cursor-agent routes accept none). Unset keeps the skills' editorial mapping. A value the peer cannot honor skips the pass with a stated reason rather than substituting; a conversation request overrides both. |
| [`ce-code-review`](./ce-code-review.md), [`ce-doc-review`](./ce-doc-review.md) | `cross_model_model`, `cross_model_effort` | Pin the resolved peer target's model (an alias such as `fable` or a full id such as `claude-opus-5`, same family as the target; a codex id may carry its serving provider's namespace, such as `openai.gpt-5.6-sol`, when the CLI routes through a non-default `model_provider`) and reasoning effort (claude `low`..`max`, codex `none`..`max`, grok `low`..`high`; cursor-agent routes accept none). Unset keeps the skills' editorial mapping. A value the peer cannot honor skips the pass with a stated reason rather than substituting; a conversation request overrides both. |
| [`ce-commit-push-pr`](./ce-commit-push-pr.md) | `pr_teaching_section`, `pr_teaching_archive`, `auto_babysit` | Toggle PR concept teaching, opt into explainer archival, or opt out of the default babysit handoff. Defaults: `true`, `false`, and `true`. `auto_babysit` governs the standing watch handed off after a PR is opened or pushed to -- the open-ended one that spends tokens until you merge. It does not govern [`lfg`](./lfg.md)'s in-pipeline babysit, which is bounded (3 fix rounds, ~30-45 min), ends on its own, and is how that pipeline reaches its "CI decided" completion. |
| [`ce-product-pulse`](./ce-product-pulse.md) | `pulse_product_name`, `pulse_lookback_default`, `pulse_primary_event`, `pulse_value_event`, `pulse_completion_events` | Product identity, reporting window, and the events that represent engagement, value, and completion. The setup interview writes these values. |
| [`ce-product-pulse`](./ce-product-pulse.md) | `pulse_quality_scoring`, `pulse_quality_dimension`, `pulse_analytics_source`, `pulse_tracing_source`, `pulse_payments_source`, `pulse_db_enabled` | Optional quality scoring and read-only data-source routing. |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -330,15 +330,15 @@ validate_model_override() {

# Accept an effort override only where the route exposes an effort flag and the
# value is one that CLI documents (claude: low|medium|high|xhigh|max; codex
# model_reasoning_effort: minimal|low|medium|high|xhigh; grok: low|medium|high).
# model_reasoning_effort: none|minimal|low|medium|high|xhigh|max; grok: low|medium|high).
# cursor-agent routes imply effort in the model id, so any override there is
# invalid for the route rather than silently dropped. Empty means "no override".
validate_effort_override() {
local route="$1" effort="${CROSS_MODEL_EFFORT_OVERRIDE:-}"
[ -n "$effort" ] || return 0
case "$route:$effort" in
claude:low|claude:medium|claude:high|claude:xhigh|claude:max) ;;
codex:minimal|codex:low|codex:medium|codex:high|codex:xhigh) ;;
codex:none|codex:minimal|codex:low|codex:medium|codex:high|codex:xhigh|codex:max) ;;
Comment thread
khsaurabh marked this conversation as resolved.
grok-cli:low|grok-cli:medium|grok-cli:high) ;;
opencode:none|opencode:minimal|opencode:low|opencode:medium|opencode:high|opencode:xhigh|opencode:max|opencode:default) ;;
*) return 1 ;;
Expand Down
4 changes: 2 additions & 2 deletions skills/ce-doc-review/scripts/cross-model-doc-review.sh
Original file line number Diff line number Diff line change
Expand Up @@ -320,15 +320,15 @@ validate_model_override() {

# Accept an effort override only where the route exposes an effort flag and the
# value is one that CLI documents (claude: low|medium|high|xhigh|max; codex
# model_reasoning_effort: minimal|low|medium|high|xhigh; grok: low|medium|high).
# model_reasoning_effort: none|minimal|low|medium|high|xhigh|max; grok: low|medium|high).
# cursor-agent routes imply effort in the model id, so any override there is
# invalid for the route rather than silently dropped. Empty means "no override".
validate_effort_override() {
local route="$1" effort="${CROSS_MODEL_EFFORT_OVERRIDE:-}"
[ -n "$effort" ] || return 0
case "$route:$effort" in
claude:low|claude:medium|claude:high|claude:xhigh|claude:max) ;;
codex:minimal|codex:low|codex:medium|codex:high|codex:xhigh) ;;
codex:none|codex:minimal|codex:low|codex:medium|codex:high|codex:xhigh|codex:max) ;;
grok-cli:low|grok-cli:medium|grok-cli:high) ;;
opencode:none|opencode:minimal|opencode:low|opencode:medium|opencode:high|opencode:xhigh|opencode:max|opencode:default) ;;
*) return 1 ;;
Expand Down
4 changes: 2 additions & 2 deletions skills/ce-setup/references/config-template.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,8 @@
# `fable` or a full id such as `claude-opus-5` for claude; `gpt-*` for codex,
# optionally namespace-qualified such as `openai.gpt-5.6-sol` when the codex CLI
# routes through a non-default `model_provider`).
# Effort levels: claude low|medium|high|xhigh|max, codex minimal|low|medium|
# high|xhigh, grok low|medium|high; cursor/composer routes take none. A value
# Effort levels: claude low|medium|high|xhigh|max, codex none|minimal|low|
# medium|high|xhigh|max, grok low|medium|high; cursor/composer routes take none. A value
# the peer cannot honor skips the pass with a stated reason -- never substituted.

# cross_model_review_mode: off # auto | off (default: auto)
Expand Down
35 changes: 34 additions & 1 deletion tests/skills/ce-code-review-cross-model-routes.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1937,10 +1937,21 @@ describe("cross-model provider kernel parity (code-review vs doc-review)", () =>
}
})

test("codex effort override accepts none and max from the Codex CLI enum", () => {
for (const script of [SCRIPT, DOC_SCRIPT]) {
expect(emitAdapter("codex", script, { CROSS_MODEL_EFFORT_OVERRIDE: "none" })).toContain(
'model_reasoning_effort="none"',
)
expect(emitAdapter("codex", script, { CROSS_MODEL_EFFORT_OVERRIDE: "max" })).toContain(
'model_reasoning_effort="max"',
)
}
})

test("an effort override the route cannot honor fails closed in both skills", () => {
const cases: Array<[string, string]> = [
["claude", "minimal"], // not a claude CLI level
["codex", "max"], // not a codex reasoning level
["codex", "ultra"], // not a Codex CLI reasoning level
["grok-cli", "xhigh"], // not a grok level
["grok-cursor", "high"], // cursor-agent routes imply effort in the model id
["composer", "high"],
Expand All @@ -1962,6 +1973,28 @@ describe("cross-model provider kernel parity (code-review vs doc-review)", () =>
expect(blockBetween(SCRIPT, "validate_effort_override()")).toBe(blockBetween(DOC_SCRIPT, "validate_effort_override()"))
})

test("codex effort enum is pinned across validators, comments, and docs", () => {
const caseArm =
"codex:none|codex:minimal|codex:low|codex:medium|codex:high|codex:xhigh|codex:max"
const commentList = "model_reasoning_effort: none|minimal|low|medium|high|xhigh|max"
for (const script of [SCRIPT, DOC_SCRIPT]) {
const src = readFileSync(script, "utf8")
expect(src).toContain(caseArm)
expect(src).toContain(commentList)
}
const repoRoot = path.join(__dirname, "../..")
expect(readFileSync(path.join(repoRoot, "docs/guides/configuration.md"), "utf8")).toContain(
"codex `none`..`max`",
)
const yamlNeedle = "codex none|minimal|low|\n# medium|high|xhigh|max"
expect(readFileSync(path.join(repoRoot, ".compound-engineering/config.example.yaml"), "utf8")).toContain(
yamlNeedle,
)
expect(
readFileSync(path.join(repoRoot, "skills/ce-setup/references/config-template.yaml"), "utf8"),
).toContain(yamlNeedle)
})

test("NEVER flags are absent from both skills' adapters", () => {
for (const script of [SCRIPT, DOC_SCRIPT]) {
for (const route of ROUTES) {
Expand Down
Loading