opencode-era record. Superseded where moot by the pi migration (ADR-0055). Retained as historical context.
Date: 2026-07-27
Accepted
References ADR-0031 (prior rebalance + footer rename — the precedent this extends), ADR-0030 (DESIGN tier), ADR-0013 (variant env var), ADR-0010 (footer/issue-ref convention). Does not supersede any ADR.
The operator acquired a ChatGPT Plus subscription, giving access to GPT-5.6 Sol
(OpenAI's flagship reasoning/coding model) through opencode's first-class
ChatGPT-Plus/Pro OAuth provider — a path OpenAI explicitly permits for
third-party developer tooling (unlike Anthropic, which prohibits the
equivalent). opencode authenticates via /connect → OpenAI → "ChatGPT
Plus/Pro"; no API key, no per-token billing. The binding economic constraint is
therefore the ChatGPT Plus weekly window (surfaced by the
@slkiser/opencode-quota plugin), not pay-per-token cost.
This is the first harness tier backed by a subscription-OAuth auth model
rather than an API key. It also creates a footer-attribution gap: ADR-0031 §4
sourced Authored-by: from agent.plan.model (PLANNER) on the rationale that
the creation pipeline (design → plan → build) was "all GLM". Once PLANNER moves
to Sol while PRIMARY (build/tdd) stays on GLM, that rationale breaks — a
@tdd-authored commit would carry Authored-by: gpt-5.6-sol, mislabelling
GLM-authored code. The @architect review flagged this as its leading
condition.
Two governing principles:
- Maximize quality-per-quota on high-leverage thinking — DESIGN/PLANNER are low/medium-frequency, high-leverage tiers; Sol earns its place there.
- Attribute every model in the pipeline — add an
Implemented-by:footer sourced from PRIMARY so Sol (plan), GLM (code), and DeepSeek (review) are each represented, resolving the ADR-0031 §4 drift.
| Tier | Model | Variant | Agents |
|---|---|---|---|
| PRIMARY | zai-coding-plan/glm-5.2 |
max |
build, tdd, debug, resolve-merge-conflicts, general |
| PLANNER | openai/gpt-5.6-sol |
xhigh |
plan, from-issue, architect, consult |
| DESIGN | openai/gpt-5.6-sol |
xhigh |
design |
| JUDGE | deepseek/deepseek-v4-pro |
medium |
code-review, standards-review, spec-review, test-audit, judge, explore |
| UTILITY | deepseek/deepseek-v4-flash |
medium |
compaction, title, summary, docs-writer, semgrep |
Only setup.json values change. The {env:VAR} indirection (ADR-0012/0022)
means no opencode.jsonc, .envrc, or agent-tier-membership edit. No agent
moves tier (unlike ADR-0031's 7-agent reassignment).
Tier placement is decided by call frequency × downstream leverage, not
per-token price. PRIMARY (highest frequency: every build turn, every @tdd
iteration) is excluded as the burn risk; Sol stays reachable ad-hoc via
/models. DESIGN (once per brainstorm) and PLANNER (once per feature) are the
defensible fit — high leverage, low window consumption. PRIMARY stays on
high-capacity flat-rate GLM (~166M tokens/week, ~41% utilized per ADR-0031),
which never hits the wall.
opencode's built-in OpenAI variants top at xhigh
(none · minimal · low · medium · high · xhigh); the API exposes a higher
max that opencode does not ship built-in. We choose the built-in xhigh for
zero-config reliability over the absolute peak. Per ADR-0031's "variant values
are provider-relative" principle, this is not a downgrade of intent: both GLM
max (ExtraHigh) and OpenAI xhigh are their provider's opencode-native
reasoning ceiling among shipped variants. The absolute-ceiling path (custom
max variant) is the documented fallback (spec §2.1 option B).
JUDGE stays DeepSeek. Post-change the generators span two providers (OpenAI on DESIGN/PLANNER, GLM on PRIMARY) and the reviewer is a third (DeepSeek), so DeepSeek now cross-reviews both OpenAI- and GLM-authored work. Moving JUDGE to Sol would collapse the cross-model property into a self-review.
When the weekly window runs low, the operator switches DESIGN/PLANNER sessions
back to GLM via /models for the remainder of the window. The
@slkiser/opencode-quota toast/sidebar surfaces the window. No auto-fallback
is engineered (YAGNI — opencode exposes no hook for it; two low-frequency
tiers don't justify one).
Add a fourth required trailer sourced from the PRIMARY tier:
| Footer | Tier source | Resolves to | Stage |
|---|---|---|---|
Authored-by: |
PLANNER (agent.plan.model) |
gpt-5.6-sol |
design/plan |
Implemented-by: |
PRIMARY (agent.tdd.model / agent.build.model inherit {env:OPENCODE_MODEL_PRIMARY}) |
glm-5.2 |
code |
Tested-by: |
JUDGE (agent.code-review.model) |
deepseek-v4-pro |
review |
Signed-off-by: |
user (resolve-identity.sh) |
kyau <git@kyaulabs.com> |
human |
Pipeline order: Refs:/Fixes: → Authored-by: → Implemented-by: →
Tested-by: → Signed-off-by:. The commitlint trailers-exist rule is
extended to require Implemented-by:; the issue-ref-convention rule
(Refs/Fixes before Authored-by) is unchanged. Like the existing footers,
Implemented-by: is a fixed-source trailer applied uniformly regardless of
which agent authors the commit (dynamic per-author re-sourcing is explicitly
out of scope). This extends ADR-0031's footer-rename lineage and leaves
ADR-0010's ordering rule unaffected.
Positive:
- The strongest available model drives the two tiers where a single turn shapes the most downstream work (specs, plans).
- All three models in the pipeline are attributed in commit metadata (Sol/GLM/DeepSeek) — one footer per stage.
- The ADR-0031 §4
Authored-by:semantic drift is resolved (not merely documented) by theImplemented-by:addition. - Cross-model review is enriched (DeepSeek reviews two generator providers).
- The change is mechanically minimal: 2
setup.jsonvalues flow through existing{env:VAR}indirection; no structural edit.
Negative:
- The Plus weekly window is a qualitative budget (not a published token count);
exhaustion during heavy DESIGN/PLANNER use requires manual
/modelsfallback. Implemented-by:(like the existing footers) is mechanically sourced from PRIMARY regardless of authoring agent, so a design-agent docs commit carriesImplemented-by: glm-5.2even though no code was implemented — the same fixed-source imprecision the harness already accepts forAuthored-by/Tested-byon docs commits.- The
commit-msg_test.shfooter-fixture ripple (13 fixtures) adds test maintenance surface, though breakage is detection-easy (commitlint rejects 3-trailer messages noisily).
Neutral:
- PRIMARY, JUDGE, and UTILITY tiers are unchanged.
- The OpenAI API-key billing path is unused (irrelevant under ChatGPT-Plus auth).
- ADR-0031 is referenced, not superseded.
- Put Sol on PRIMARY (the highest-volume tier): Rejected. PRIMARY is the
burn risk on a weekly window; defaulting it to Sol would exhaust the window
during heavy
@tddsprints. Sol remains reachable ad-hoc via/models. - Put Sol on all thinking + coding tiers (DESIGN+PLANNER+PRIMARY): Rejected. Same burn-risk problem, amplified.
- Move JUDGE to Sol: Rejected. Collapses the cross-model review property into a self-review.
- Custom
maxvariant over built-inxhigh: Rejected as the default. Preserves the literalmaxstring and hits Sol's absolute ceiling, but adds a config block and depends on the AI SDK passingreasoningEffort:"max"through (unverified). Kept as the documented fallback. - Document the
Authored-by:drift as a known limitation (the architect's fallback): Rejected in favour of the active fix. AddingImplemented-by:resolves the drift; mere documentation would leave commit metadata inaccurate. - Dynamic per-commit footer re-sourcing (footer = actual authoring agent's model): Rejected. A different model from the harness's fixed-source footer convention; retained fixed-source for consistency.
- ADR-0031 (referenced — prior rebalance + footer rename; the precedent extended)
- ADR-0030 (referenced — DESIGN tier independent-configurability rationale, exercised here)
- ADR-0013 (not contradicted — variant env-var mechanism preserved)
- ADR-0012 (not contradicted —
{env:VAR}pattern preserved) - ADR-0022 (not contradicted — agent config in
opencode.jsoncpreserved) - ADR-0029 (not contradicted —
setup.jsonstructure preserved) - ADR-0010 (not contradicted — issue-ref-before-Authored-by ordering preserved)
- Spec:
docs/specs/2026-07-27-gpt-5-6-sol-design-planner-tiers-spec.md - Plan:
docs/plans/2026-07-27-gpt-5-6-sol-design-planner-tiers.md