feat(codex): SDD dispatch routing, fork hygiene, and final-review wave termination

Codex SDD runs at frontier tiers spin out: subagents inherit the
session's model and effort, review seats find real-but-endless defects
every round, and the final whole-branch review has no reachable
termination state. Field forensics across multiple real sessions traced
the mechanism: spawn_agent's fork_turns defaults to "all" (full-context
forks that also refuse model overrides), omitted model/effort params
inherit the frontier parent, and dispatch rules loaded at session start
do not survive context compaction — a compacted controller reverts to
inheritance exactly when the session is longest and most expensive.

Three coordinated changes:
- codex-tools.md: every SDD spawn sets fork_turns "none" plus explicit
  model/reasoning_effort when the schema supports them (Codex 0.145+),
  with an inheritance warning for older builds; reviewer tier never
  exceeds implementer tier and fix rounds never get effort bumps.
- task-brief/review-package print a dispatch tuple with their output
  (review-package grows --role for re-review/final-review), putting the
  routing values in front of the controller at the moment of dispatch —
  reprinted every round, so they survive compaction by construction.
- SKILL.md: the final-review wave closing is policy, not a verdict —
  one fix dispatch, one scoped re-review, residuals adjudicated to the
  ledger; one-off review procedures never become standing; Model
  Selection defers to platform role tables where one exists.

Validated live: a previously spun-out 14-task run (8h, 6 tasks, died
mid-loop) re-executed to completion under these changes — bounded fix
loops, single-cycle final review, ~20 consecutive correctly-routed
dispatches across two compactions. Reviewer-tier matrix (125 cells)
showed no calibration cost: clean-diff approvals and planted-defect
recall are identical across tiers. Eval scenarios to follow before any
upstream submission.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Drew Ritter
2026-07-21 22:57:28 -07:00
parent d123bde46e
commit c97988d8d1
3 changed files with 25 additions and 22 deletions

View File

@@ -20,6 +20,8 @@ if [ "${1:-}" = "--role" ]; then
shift 2 shift 2
fi fi
# Model/effort values are mirrored in using-superpowers/references/codex-tools.md
# (they track Codex's spawn_agent allowlist) — update both together.
case "$role" in case "$role" in
task-review) hint_role=task-reviewer; hint_effort=high ;; task-review) hint_role=task-reviewer; hint_effort=high ;;
re-review) hint_role=scoped-re-reviewer; hint_effort=medium ;; re-review) hint_role=scoped-re-reviewer; hint_effort=medium ;;

View File

@@ -42,4 +42,6 @@ echo "wrote ${out}: $(wc -l < "$out" | tr -d ' ') lines"
# The dispatch hint rides this output because the controller reads it # The dispatch hint rides this output because the controller reads it
# immediately before spawning the implementer; skill text loaded at session # immediately before spawning the implementer; skill text loaded at session
# start does not survive context compaction, but this line reprints per task. # start does not survive context compaction, but this line reprints per task.
# Model/effort values are mirrored in using-superpowers/references/codex-tools.md
# (they track Codex's spawn_agent allowlist) — update both together.
echo "dispatch (codex spawn_agent): role=implementer fork_turns=none model=gpt-5.6-terra reasoning_effort=high" echo "dispatch (codex spawn_agent): role=implementer fork_turns=none model=gpt-5.6-terra reasoning_effort=high"

View File

@@ -21,29 +21,28 @@ model and effort overrides. Never omit the parameter, and never pass
Before Task 1, check your `spawn_agent` tool schema for `model` and Before Task 1, check your `spawn_agent` tool schema for `model` and
`reasoning_effort` parameters (present on Codex 0.145+). `reasoning_effort` parameters (present on Codex 0.145+).
**If the parameters exist**, set both explicitly on every dispatch: **If the parameters exist**, set both explicitly on every dispatch. The
task-brief and review-package scripts print the exact values for each
dispatch as a `dispatch (codex spawn_agent):` line with their output —
copy that line's values onto the spawn_agent call verbatim, every time,
even late in a long session. The mapping they print: every SDD seat runs
`gpt-5.6-terra` — implementers and reviewers at `reasoning_effort: high`,
scoped re-reviews at `medium`. On Codex this mapping IS the Model
Selection section — including the final review, which stays on
terra/high rather than "most capable available." Never give a subagent
your session's model when you run a frontier config (sol at xhigh or
max): reviewer tier never exceeds implementer tier, and a fix round
never gets an effort bump. Rounds 4-5's "more capable model" means a
fresh implementer at the same tier; a task that genuinely needs more
than terra/high is a BLOCKED escalation to your human partner, not a
quiet tier climb. Inherited frontier-tier subagents are a measured cause
of SDD runs spinning out for hours: review seats that inherit a frontier
model at maximum effort find real-but-endless defects every round, and
fix diffs balloon instead of converging.
| Role | model | reasoning_effort | The model names here track Codex's `spawn_agent` allowlist (currently
|------|-------|------------------| `gpt-5.6-sol` and `gpt-5.6-terra`). When the allowlist changes, update
| Implementer (all rounds) | `gpt-5.6-terra` | `high` | this file and the hint lines in task-brief and review-package together.
| Task reviewer | `gpt-5.6-terra` | `high` |
| Scoped re-review | `gpt-5.6-terra` | `medium` |
| Final whole-branch review | `gpt-5.6-terra` | `high` |
On Codex this table IS the Model Selection mapping — including the final
review, which stays on terra/high rather than "most capable available."
The task-brief and review-package scripts reprint the applicable row as a
`dispatch (codex spawn_agent):` line with their output — copy those values
onto the spawn_agent call verbatim, every time, even late in a long session.
Never give a subagent your session's model when you run a frontier config
(sol at xhigh or max): reviewer tier never exceeds implementer tier, and
a fix round never gets an effort bump. Rounds 4-5's "more capable model"
means a fresh implementer at the same tier; a task that genuinely needs
more than terra/high is a BLOCKED escalation to your human partner, not
a quiet tier climb. Frontier-tier subagents at inherited effort are the
measured top driver of Codex SDD runs spinning out to 8+ hours
(PRI-2672): review seats that inherited sol found real-but-endless
defects every round, and fix diffs ballooned instead of converging.
**If the parameters do not exist** (Codex 0.144 and earlier), every child **If the parameters do not exist** (Codex 0.144 and earlier), every child
inherits your session's model and effort and no override is possible — inherits your session's model and effort and no override is possible —