Skip to content
Merged
25 changes: 25 additions & 0 deletions .changelogs/v3.35.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Release v3.35.0

Released: 2026-08-27

## Highlights

- **`~effort=<level>` now actually reaches codex and agy — before this, it silently killed them.** Reasoning effort was passed to every reviewer as `--effort <level>`, a flag only `claude` and `grok` accept. codex and agy both reject it and exit non-zero *before the review starts*, so the reviewer's slot in the merge gate held a launch failure rather than a verdict. Each reviewer now gets the carrier its own CLI accepts.
- **The effort dispatch fails closed.** The old shape assigned `--effort` generically and then overrode it per agent, so any CLI without an explicit branch inherited the wrong flag — which is exactly how codex and agy broke. An unrecognized reviewer now gets no flag at all and keeps prompt-advisory effort, because a wrong flag isn't a weaker review, it's a non-zero exit.
- **`/do:release` verifies that main actually reached release before reporting success**, and recovers cleanly when a release is interrupted partway.

## Reasoning-effort carriers

- **codex** has no `--effort` flag at any level — not top-level, not on `review`, not on `exec`. It exits 2 with `unexpected argument '--effort' found`. Effort is a config value there, so it now goes through the top-level `-c model_reasoning_effort=<level>` override.
- **agy** treats `--effort` as mutually exclusive with `--model`, and the loop always pins `--model` for agy. Since the built-in default model is itself an effort variant, `agy~effort=` failed 100% of the time — at every level, including ones agy offers. agy encodes effort as a *model variant*, so it is now resolved by picking from the `agy models` roster at run time. Nothing is hardcoded: the roster and level names change between agy releases, and a level agy doesn't offer resolves to the closest one it does.
- A **new effort-carrier table** in the local-agent loop is now the single statement of the rule, replacing the same fact restated across six places. The per-agent "Flag rationale" bullets keep the verified evidence behind each.
- A reviewer with no effort control — or no matching level — degrades to prompt-advisory effort instead of failing the pass.

## Release promotion

- `/do:release` now confirms the source branch actually promoted to the target on the remote before it reports success, instead of trusting an exit status.
- Release preparation is recoverable: interrupted runs preserve their state across retries, checkpoint handoff is idempotent, and the retry edge cases around an already-prepared release are closed.

## Full Changelog

**Full Diff**: https://github.com/atomantic/slashdo/compare/v3.34.0...v3.35.0
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ Reviewers run **in the order listed**, and whatever you list is exactly what run

**Per-reviewer iteration caps** (`~max=<n>` suffix): caps how many **review → fix → re-review cycles** that one reviewer runs. It is the per-entry form of `--review-iterations`, and unlike that flag it reaches every reviewer type — including `codex`/`agy`/`claude`/`grok`/`cursor` and `ollama`, whose caps are otherwise fixed at 3 — so a single run can budget each reviewer separately: `--review-with claude~max=2,ollama~max=1,codex~max=3`. `<n>` is a non-negative integer; `0` means "loop until clean", bounded by a 10-iteration safety guardrail. A reviewer that stops because it spent a cap *you* set reports `capped`, which counts as clean for the merge gate — as opposed to `guardrail`, which is what a *built-in* cap reports when it cuts off a reviewer that was still finding real problems, and which blocks the merge.

**Per-reviewer reasoning effort** (`~effort=<level>` suffix): specifies the reasoning effort level (`low`, `medium`, `high`, `xhigh`, `max`) for that reviewer: `--review-with codex[gpt-5.6-luna]~effort=max~opt`, `--review-with claude~effort=high~max=2`, `--review-with cursor[gpt-5]~effort=max`. For Cursor the suffix is folded into `--model` as `[effort=<level>]` (the CLI has no `--effort` flag); pair it with a `cursor[<model>]` bracket or a saved `--review-models cursor=…` default so there is a model to attach the variant to.
**Per-reviewer reasoning effort** (`~effort=<level>` suffix): specifies the reasoning effort level (`low`, `medium`, `high`, `xhigh`, `max`) for that reviewer: `--review-with codex[gpt-5.6-luna]~effort=max~opt`, `--review-with claude~effort=high~max=2`, `--review-with cursor[gpt-5]~effort=max`. Each reviewer receives it in the form its own CLI accepts — `--effort` is **not** universal. `claude` and `grok` take the flag; **codex** takes `-c model_reasoning_effort=<level>`; **Cursor** folds it into `--model` as `[effort=<level>]`, so pair that one with a `cursor[<model>]` bracket or a saved `--review-models cursor=…` default; and **agy** picks the matching model variant from whatever `agy models` lists. Where a reviewer offers no such control — or no level matching what you asked — the effort falls back to prompt guidance rather than failing the review.

`~max` applies in `series` mode (the default). In `--review-mode parallel` each reviewer runs a single review-only pass and the orchestrator applies the union once, so there are no per-reviewer cycles to cap — `~max` is ignored there with a warning.

Expand Down
Loading