Revert "feat(models): move the implementer to opus/high"
This reverts commitcdbc2d0. The bump was a judgment call without evidence, and the planner design intent argues the other way: the plan Iron Law is "EVERY STEP THAT CHANGES CODE INCLUDES THE CODE" and tasks are sized so a subagent executes one "without judgement calls outside its remit" (planner/SKILL.md) — the planner exists precisely to remove design latitude from the implementer, which points at sonnet, not opus. opus is only justified to the degree real plans leave slack (RED-step invention, tree reconciliation, review repair), and that slack is measurable, not felt. Restore sonnet/high; a future bump should be grounded in the loop metrics (spec re-loop count, quality changes_requested rate, end-verify BLOCKED rate) via postmortem, not a gut call. The four fable gates (b591e75) are untouched.
This commit is contained in:
@@ -43,10 +43,7 @@
|
||||
// session-model inherit (which could route to an unintended tier, e.g. fable —
|
||||
// reserved for the four ratified frontmatter gates, never for workflow stages;
|
||||
// agent-template § model rule 1). Both phases here are mechanical
|
||||
// (compiler-enumerated propagation, build/suite re-run), so both run sonnet —
|
||||
// including the implementer agentType: its opus frontmatter tier is for plan
|
||||
// execution, not compiler-enumerated propagation (agent-template § model
|
||||
// rule 3), so this arm pins sonnet explicitly.
|
||||
// (compiler-enumerated propagation, build/suite re-run), so both run sonnet.
|
||||
// Effort policy mirrors it: every call pins an explicit effort — the edit
|
||||
// (real code work) runs high, the build/suite verify (schema-bound check)
|
||||
// runs medium. See docs/agent-template.md § effort.
|
||||
|
||||
@@ -82,9 +82,7 @@
|
||||
// session-model inherit (which could route to an unintended tier, e.g.
|
||||
// fable — reserved for the four ratified frontmatter gates, never for
|
||||
// workflow stages; agent-template § model rule 1). Mechanical and
|
||||
// in-loop check steps run sonnet; the implementer runs opus/high
|
||||
// (owner-ratified 2026-07-20: judgment model for code authorship, kept at
|
||||
// the in-loop effort tier); the quality gate runs opus by default (last
|
||||
// in-loop steps run sonnet; the quality gate runs opus by default (last
|
||||
// correctness review before the end-verify), TIERED to sonnet/high for a
|
||||
// small (<= 25 changed lines), non-contract diff as measured
|
||||
// independently by the spec-reviewer (issue #30) — the end-verify /
|
||||
@@ -794,7 +792,7 @@ async function runTask(task) {
|
||||
'inner-loop discipline — add the failing test inline even if the task text forgot to script it). ' +
|
||||
'Build and test must be green before you report DONE. Leave all edits UNSTAGED; never commit.\n\n' +
|
||||
`mode: ${mode}\niter_id: ${iter_id}\n\nTASK ${task.id} — ${task.title}\n${task.text}`,
|
||||
{ agentType: 'implementer', model: 'opus', effort: 'high', label: `impl:${task.id}`, phase: 'Per-task loop', schema: IMPL_SCHEMA },
|
||||
{ agentType: 'implementer', model: 'sonnet', effort: 'high', label: `impl:${task.id}`, phase: 'Per-task loop', schema: IMPL_SCHEMA },
|
||||
)
|
||||
if (!impl) return { id: task.id, title: task.title, outcome: 'BLOCKED', reason: 'implementer agent did not return' }
|
||||
if (impl.status === 'BLOCKED') return { id: task.id, title: task.title, outcome: 'BLOCKED', reason: impl.reason || 'worker-blocked' }
|
||||
@@ -835,7 +833,7 @@ async function runTask(task) {
|
||||
`${STANDING}${ANCHOR}\n\nRepair task ${task.id} to satisfy the spec-compliance review. Address EACH finding; ` +
|
||||
'do not widen scope. Keep build + tests green; leave edits unstaged.\n\n' +
|
||||
`TASK ${task.id} — ${task.title}\n${task.text}\n\nFINDINGS:\n- ${(spec?.findings || ['(none reported)']).join('\n- ')}`,
|
||||
{ agentType: 'implementer', model: 'opus', effort: 'high', label: `impl-fix-spec:${task.id}`, phase: 'Per-task loop', schema: IMPL_SCHEMA },
|
||||
{ agentType: 'implementer', model: 'sonnet', effort: 'high', label: `impl-fix-spec:${task.id}`, phase: 'Per-task loop', schema: IMPL_SCHEMA },
|
||||
)
|
||||
if (specFix && specFix.applied_changes === true) wroteAnyFile = true
|
||||
}
|
||||
@@ -953,7 +951,7 @@ async function runTask(task) {
|
||||
'into a deviation the next review flags.\n\n' +
|
||||
`TASK ${task.id} — ${task.title}\n${task.text}\n\nISSUES:\n- ` +
|
||||
(qual?.issues?.length ? qual.issues.map((i) => `[${i.severity}] ${i.text}`) : ['(none reported)']).join('\n- '),
|
||||
{ agentType: 'implementer', model: 'opus', effort: 'high', label: `impl-fix-qual:${task.id}`, phase: 'Per-task loop', schema: IMPL_SCHEMA },
|
||||
{ agentType: 'implementer', model: 'sonnet', effort: 'high', label: `impl-fix-qual:${task.id}`, phase: 'Per-task loop', schema: IMPL_SCHEMA },
|
||||
)
|
||||
if (fix && fix.applied_changes === true) wroteAnyFile = true
|
||||
if (fix && (fix.status === 'BLOCKED' || fix.status === 'NEEDS_CONTEXT')) {
|
||||
|
||||
Reference in New Issue
Block a user