feat: step the balanced tier down to effort medium (2.5.13) - #612
Conversation
The balanced tier - the two review-only agents (architecture-reviewer, product-lead) - now pins medium reasoning effort on every harness instead of inheriting the session's effort. Field data from a 12-unit intent showed reviews under high session effort spending most of their wall-clock in time-to-first-token on the large contexts reviews carry (~36 of 39 minutes on one restarted nfr-design review at ~140k context), while 11 of 12 verdicts returned READY either way: since 2.3.5 the review contract is checklist- and evidence-grounded, exactly the bounded work shape that does not benefit from maximum-effort deliberation. The same field engagement applied the medium pin to its installed reviewer agents and verified the frontmatter pin overrides the session value, with no observed verdict-quality regression. Per harness: Claude Code agent .md gains `effort: medium`; Codex role TOMLs gain `model_reasoning_effort = "medium"`; opencode subagents gain `variant: medium`. Kiro is unaffected - since awslabs#601/awslabs#606 no tier pins a Kiro model, so there is no `chat.modelDefaults` entry to carry a tier effort; Kiro's reviewer agents already inherit the session model and effort. Models unchanged; judgment agents untouched - the "never silently downgrade the session" contract still holds where output cascades downstream. The escape hatch stays the documented installed-copy edit: delete the projected effort key to give a reviewer the session effort back. Repins t220/t148 to the new policy; docs updated (agent-system, claude-features, agents guide/README, kiro-cli guide, customization, adding-an-agent); dist regenerated via bun scripts/package.ts (--check passes). Rebased onto v2 (2.5.11); re-bumped to 2.5.13 (the original 2.5.1 slot was consumed upstream) and resolved the Kiro-model-pin conflict against awslabs#606, which removed all Kiro model pins after this branch was authored. References awslabs#607.
0862f01 to
97870c4
Compare
|
Rebased onto current `v2` (now at 2.5.11). Re-bumped to 2.5.13 since the original 2.5.1 slot was consumed upstream (per the coordination note, this number was pre-assigned to avoid colliding with sibling PRs rebasing in parallel). Beyond the mechanical version/changelog/README bookkeeping, this rebase also had to reconcile the tier-projection feature itself against #606 (merged after this branch was authored), which removed all Kiro model pins so every tier now inherits the session model on Kiro. Resolution: the balanced-tier medium-effort pin still applies to Claude Code, Codex, and opencode as designed; on Kiro it's inert (no model surface left to carry it), matching the now-dormant `KIRO_TIER_EFFORT`/`kiroModelDefaults()` state. Updated the affected docs and tests (`05-agent-system.md`, `14-claude-features.md`, `agents/README.md`, `kiro-cli.md`, `13-customization.md`, `03-adding-an-agent.md`, `t220`, `t148`) to match. Verified green: `bun scripts/package.ts --check` (dist drift), `bun tests/gen-coverage-registry.ts --check`, `bun run check` (package drift + typecheck + lint), and `bash tests/run-tests.sh --smoke --unit` (178 files, 4396 assertions, 0 failures). No reviewer findings to address — this was a clean rebase plus the upstream-conflict reconciliation above. |
|
Thanks for the thoughtful proposal and the field data behind it. However, we want to preserve the tier contract established in #546: Pinning I'm closing this PR, feel free to reopen if needed. |
|
@leandrodamascena Thank you for engaging with this and for the clear rationale. You asked for data demonstrating a tangible improvement — I went back to the field engagement where this pin ran for a month and extracted the timing evidence from the AI-DLC audit ledgers plus the harness's own per-subagent records ( The measured improvementCleanest cut first: the same model on both sides of the config change, so the only variable is effort. The architecture reviewer ran on sonnet-5 throughout; on Jul 8 the field install added
~10× at the median; p90 collapsed from 103 to 15 minutes. Engagement-wide: 52 inherited-effort reviews consumed 47.2 reviewer-hours (54 min mean); 158 medium reviews consumed 15.6 hours (5.9 min mean). One concrete worst case that motivated the change: a restarted nfr-design review spent ~36 of its 39 minutes on time-to-first-token alone, at 140k context under xhigh. A Claude Code bug (anthropics/claude-code#81995) accidentally gave us the model-vs-effort control: some reviewer dispatches resolved to the session model (Fable 5 / Opus) instead of the pinned sonnet while the Review value held: NOT-READY rate 22% before (5/23) vs 28% after (28/100), verdict length stable (~2k output tokens both periods), and the medium reviewers kept catching real blockers (e.g. an On the two contract objections"Pinning balanced would override the user's selected session effort." For the 9 "balanced and templated become operationally equivalent on these harnesses." Agreed that's a real cost of the PR as written — and it points at the better shape below. Proposal: a fourth tier for reviewer-shaped work, instead of repinning
|
Closes #607.
What
Steps the
balancedtier — the two review-only agents (aidlc-architecture-reviewer-agent,aidlc-product-lead-agent) — down to medium reasoning effort on every harness, instead of inheriting the session's effort. Models are unchanged (Sonnet-class everywhere).model: sonnet, noeffort:line (session effort)model: sonnet+effort: mediummodel = "openai.gpt-5.4", no effort keymodel_reasoning_effort = "medium"variant:variant: mediumchat.modelDefaultssonnet-4.5 →highmedium(the balanced/templated collapse becomes a no-op — both tiers now pin medium)Why
Field data from a 12-unit intent (2.2.17, Claude Code, xhigh session): a restarted nfr-design review spent ~36 of 39 minutes in time-to-first-token at ~140k context, and 11/12 nfr-requirements reviews returned READY — session-level effort was buying latency, not verdicts, on work the tier itself defines as "novel input judged against explicit criteria". Since 2.3.5 the review contract is checklist- and evidence-grounded, exactly the shape that does not benefit from maximum-effort deliberation. Full rationale and data in #607.
The
judgmenttier is untouched — the "never silently downgrade the session" contract still holds where output cascades downstream.Why keep
balancedas a tier at all, when it now projects identically totemplated? The tier names classify the WORK, not the dial (aidlc-tiers.tsstates this as a design rule):templatedis pattern-following output whose methodology already lives in knowledge (delivery plans, CI/CD YAML, runbooks), whilebalancedis reviewer-shaped work — novel input judged against explicit criteria. Re-tiering the reviewers totemplatedwould make the dials coincide by making the vocabulary lie, and a future contributor adding a review-only agent should be able to writetier: balancedwithout knowing today's model lineup. Two tiers coinciding in projection is already a designed-for state — balanced and templated have collapsed onto the same model on Kiro since 2.3.1 (the documented collapse rule); after this PR they coincide on every harness. Keeping the classification correct preserves the tuning seam: if a later lineup wants reviewer work on a different dial (a mid-size model at high effort, say), it's a one-line table edit rather than a re-tiering plus roster-doc rewrite.Escape hatch (documented in
docs/reference/05-agent-system.md): a user who wants session effort back on reviews deletes the projectedeffort:line in the installed.claude/agents/aidlc-*-agent.md(or the harness equivalent).Changes
core/tools/aidlc-tiers.ts—TIER_PROJECTIONS.balancedeffort/variant pins;KIRO_TIER_EFFORT.balancedhigh → medium; header rationale + Kiro collapse comments rewritten.harness/codex/emit.ts— stale comment fix.t216(balanced effort pinned),t220(EXPECTED.balanced all flavors, kiroModelDefaults, codex shipped-bytes now asserts the effort key present),t148(cli.json pin).docs/reference/05-agent-system.md,14-claude-features.md,docs/guide/06-agents.md,13-customization.md,docs/guide/harnesses/kiro-cli.md,docs/harness-engineering/03-adding-an-agent.md,docs/reference/agents/README.md.Testing
bun scripts/package.ts --checkclean;bun run typecheckandbun run lintexit 0.