mirror of
https://github.com/obra/superpowers.git
synced 2026-07-23 10:44:01 +08:00
Run-2 dispatch-4 autopsy: after compaction, the codex-tools role table fell out of context and the controller reasoned itself into an inherited sol@max reviewer — the harness's own 'inherited parent model is preferred' plus SKILL.md's 'most capable model' outvoted the compaction summary's distilled 'terra/high' line. Its introspection named the only artifact it actually consults at the moment of dispatch: the review-package output. So the role tuple now rides the script output, reprinted fresh every round, immune to compaction by construction: - task-brief prints role=implementer terra/high fork_turns=none - review-package prints per role via a new leading --role flag (task-review default | re-review | final-review), and SKILL.md call sites pass the flag at the re-review and final-review sites - SKILL.md Model Selection now defers to platform role tables and the printed dispatch hints, closing the 'most capable model' loophole - codex-tools.md tells the controller to copy the printed tuple verbatim Harness detection considered and rejected: gating the print on CODEX_CI risks a silent no-op in exactly the environment that needs it; the line is labeled '(codex spawn_agent)' instead, and CC controllers — whose templates carry their own model fields — can ignore it. Experiment branch for PRI-2672 validation; not for merge without eval evidence. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
66 lines
2.4 KiB
Bash
Executable File
66 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Generate a review package: commit list, stat summary, and the net
|
|
# diff with extended context, written to a file the reviewer reads in one
|
|
# call. Using the recorded per-task BASE (not HEAD~1) keeps multi-commit
|
|
# tasks intact.
|
|
#
|
|
# Usage: review-package [--role task-review|re-review|final-review] PLAN_FILE BASE HEAD [OUTFILE]
|
|
# Default OUTFILE: <repo-root>/.superpowers/sdd/<plan-basename>/review-<base7>..<head7>.diff
|
|
# (named per range, so a re-review after fixes gets a distinct fresh file).
|
|
#
|
|
# The trailing dispatch hint rides this output because the controller reads it
|
|
# immediately before spawning the reviewer; skill text loaded at session start
|
|
# does not survive context compaction, but this line is reprinted every round.
|
|
set -euo pipefail
|
|
|
|
role=task-review
|
|
if [ "${1:-}" = "--role" ]; then
|
|
[ $# -ge 2 ] || { echo "usage: review-package [--role task-review|re-review|final-review] PLAN_FILE BASE HEAD [OUTFILE]" >&2; exit 2; }
|
|
role=$2
|
|
shift 2
|
|
fi
|
|
|
|
case "$role" in
|
|
task-review) hint_role=task-reviewer; hint_effort=high ;;
|
|
re-review) hint_role=scoped-re-reviewer; hint_effort=medium ;;
|
|
final-review) hint_role=final-reviewer; hint_effort=high ;;
|
|
*) echo "bad --role: ${role} (task-review|re-review|final-review)" >&2; exit 2 ;;
|
|
esac
|
|
|
|
if [ $# -lt 3 ] || [ $# -gt 4 ]; then
|
|
echo "usage: review-package [--role task-review|re-review|final-review] PLAN_FILE BASE HEAD [OUTFILE]" >&2
|
|
exit 2
|
|
fi
|
|
|
|
plan=$1
|
|
base=$2
|
|
head=$3
|
|
[ -f "$plan" ] || { echo "no such plan file: $plan" >&2; exit 2; }
|
|
|
|
git rev-parse --verify --quiet "$base" >/dev/null || { echo "bad BASE: $base" >&2; exit 2; }
|
|
git rev-parse --verify --quiet "$head" >/dev/null || { echo "bad HEAD: $head" >&2; exit 2; }
|
|
|
|
if [ $# -eq 4 ]; then
|
|
out=$4
|
|
else
|
|
dir=$("$(cd "$(dirname "$0")" && pwd)/sdd-workspace" "$plan")
|
|
out="$dir/review-$(git rev-parse --short "$base")..$(git rev-parse --short "$head").diff"
|
|
fi
|
|
|
|
{
|
|
echo "# Review package: ${base}..${head}"
|
|
echo
|
|
echo "## Commits"
|
|
git log --oneline "${base}..${head}"
|
|
echo
|
|
echo "## Files changed"
|
|
git diff --stat "${base}..${head}"
|
|
echo
|
|
echo "## Diff"
|
|
git diff -U10 "${base}..${head}"
|
|
} > "$out"
|
|
|
|
commits=$(git rev-list --count "${base}..${head}")
|
|
echo "wrote ${out}: ${commits} commit(s), $(wc -c < "$out" | tr -d ' ') bytes"
|
|
echo "dispatch (codex spawn_agent): role=${hint_role} fork_turns=none model=gpt-5.6-terra reasoning_effort=${hint_effort}"
|