Problem
A docs-vs-code congruence review (2026-09-14) found that OpenCode, pi and Grok Build are not confirmed as production-supported. The code agrees and is honest about it:
packages/studyloop/src/studyloop/harnesses.py:23-25 — CORE_HARNESSES = ("kiro", "codex", "claude"), PREVIEW_HARNESSES = ("opencode", "pi", "grok"); the Harness(...) records for opencode/pi/grok carry production=False (lines 40–44).
docs/agent-install.md:13 — "complete integrations for OpenCode, pi, and Grok Build … shown as preview harnesses until their live release checks pass on the target environment."
The owner's target state is five core harnesses — Kiro CLI, Claude Code, Codex, Pi and OpenCode — fully wired in and documented as such. Grok Build stays preview until separately evidenced.
What "fully wired in" must mean (checkable, per harness)
For each of pi and opencode, produce the same evidence the three core harnesses already have:
- Install path —
studyloop install agents --tool <h> writes the persona/agent definition and registers both MCP servers (session-db, studyloop) in the harness's own config schema; studyloop doctor reports the harness healthy.
- Session launch —
studyloop study --agent <h> (PTY) and, where the harness supports it, the ACP path start a session, deliver the canonical persona, and the one-session authority / reconnect / cleanup behaviour matches the core three (tests/test_web_session_start_pty.py, ..._acp.py parity).
- Session export — the harness's transcript exporter lands rows in
sessions.db with the correct source (pi, opencode), and session-export --<h>-only works (agent_session_tools exporters + tests).
- Live release check — the harness-matrix live lane (
tests/acceptance/, wave 2a B2) passes for the harness on a real install, and the receipt is committed under docs/architecture/plan-integration/receipts/ or the acceptance evidence bundle (wave 2b B4).
- Study-plan-architect mode —
studyloop study --mode plan-architect --agent <h> resolves the persona (OpenCode already has a global study-plan-architect agent; confirm pi).
Then, and only then
- Move
pi and opencode into CORE_HARNESSES; set production=True; RELEASE_HARNESSES unchanged.
- Update
docs/agent-install.md §"Supported in the initial pre-release" (five core; Grok Build remains preview), the capability matrix, AGENTS.md's harness sentence, the installer's printed language, and openspec/specs/agent-adapters/spec.md + harness-session-memory/spec.md.
- Pin with a test that the documented core list equals
CORE_HARNESSES (there is a docs-contract test pattern in packages/agent-session-tools/tests/test_docs_semantic_layer_contract.py to copy).
Definition of done
Notes
Re-scope 2026-09-20 (milestone 0.5.x) — the original text above is kept as written
State on main (a03fc9bd): CORE_HARNESSES = ("kiro", "codex", "claude", "pi"), PREVIEW_HARNESSES = ("opencode", "grok") (harnesses.py:27-28). pi's items 1–5 are evidenced in docs/architecture/plan-integration/receipts/harness-evidence-2026-09-16.md; the promotion merged with the council's two conditions recorded as a checklist and not yet discharged. OpenCode's items 3 and 4 fail live. Grok stays preview and is out of this issue's scope (open a separate ticket if the transport-parity constraint changes).
What remains — each box is a single, checkable piece of work:
pi (already core; conditions from the 2026-09-16 harness-tier council)
OpenCode (preview → core)
Definition of done for this issue: all five boxes ticked, or the OpenCode boxes moved to their own issue with this one closed on pi's two. Not part of the 0.5.0 line — 0.5.0 ships the tiers exactly as main states them today.
_Milestone renamed 0.6.0 → 0.5.x on 2026-09-21 (owner rule): follow-on work ships as 0.5.N patch releases until every issue outstanding at v0.5.0 is resolved. Where the linked receipt says "0.6.0", read "the follow-on milestone"._
Problem
A docs-vs-code congruence review (2026-09-14) found that OpenCode, pi and Grok Build are not confirmed as production-supported. The code agrees and is honest about it:
packages/studyloop/src/studyloop/harnesses.py:23-25—CORE_HARNESSES = ("kiro", "codex", "claude"),PREVIEW_HARNESSES = ("opencode", "pi", "grok"); theHarness(...)records for opencode/pi/grok carryproduction=False(lines 40–44).docs/agent-install.md:13— "complete integrations for OpenCode, pi, and Grok Build … shown as preview harnesses until their live release checks pass on the target environment."The owner's target state is five core harnesses — Kiro CLI, Claude Code, Codex, Pi and OpenCode — fully wired in and documented as such. Grok Build stays preview until separately evidenced.
What "fully wired in" must mean (checkable, per harness)
For each of
piandopencode, produce the same evidence the three core harnesses already have:studyloop install agents --tool <h>writes the persona/agent definition and registers both MCP servers (session-db,studyloop) in the harness's own config schema;studyloop doctorreports the harness healthy.studyloop study --agent <h>(PTY) and, where the harness supports it, the ACP path start a session, deliver the canonical persona, and the one-session authority / reconnect / cleanup behaviour matches the core three (tests/test_web_session_start_pty.py,..._acp.pyparity).sessions.dbwith the correctsource(pi,opencode), andsession-export --<h>-onlyworks (agent_session_toolsexporters + tests).tests/acceptance/, wave 2a B2) passes for the harness on a real install, and the receipt is committed underdocs/architecture/plan-integration/receipts/or the acceptance evidence bundle (wave 2b B4).studyloop study --mode plan-architect --agent <h>resolves the persona (OpenCode already has a globalstudy-plan-architectagent; confirm pi).Then, and only then
piandopencodeintoCORE_HARNESSES; setproduction=True;RELEASE_HARNESSESunchanged.docs/agent-install.md§"Supported in the initial pre-release" (five core; Grok Build remains preview), the capability matrix,AGENTS.md's harness sentence, the installer's printed language, andopenspec/specs/agent-adapters/spec.md+harness-session-memory/spec.md.CORE_HARNESSES(there is a docs-contract test pattern inpackages/agent-session-tools/tests/test_docs_semantic_layer_contract.pyto copy).Definition of done
piandopencode: items 1–5 above each have a passing test id or a committed receipt named in this issue.harnesses.pycore tuple =("kiro", "codex", "claude", "pi", "opencode");grokremains preview.just lint;just typecheck.Notes
Re-scope 2026-09-20 (milestone 0.5.x) — the original text above is kept as written
State on
main(a03fc9bd):CORE_HARNESSES = ("kiro", "codex", "claude", "pi"),PREVIEW_HARNESSES = ("opencode", "grok")(harnesses.py:27-28). pi's items 1–5 are evidenced indocs/architecture/plan-integration/receipts/harness-evidence-2026-09-16.md; the promotion merged with the council's two conditions recorded as a checklist and not yet discharged. OpenCode's items 3 and 4 fail live. Grok stays preview and is out of this issue's scope (open a separate ticket if the transport-parity constraint changes).What remains — each box is a single, checkable piece of work:
pi (already core; conditions from the 2026-09-16 harness-tier council)
PaneDriver"prompt echo counts as a reply" heuristic with a programmatic completed-reply assertion in the acceptance lane, with a test that fails on an echo-only pane (packages/studyloop/tests/acceptance/).just testacc piwithSTUDYLOOP_ACC_REAL_AUTH=1on pi 0.73.1 (the mise/npm build; Homebrew's 0.65.0 is whatpiresolves to today) and commit the run's evidence bundle under the receipt directory.OpenCode (preview → core)
OpenCodeExporterreads~/.local/share/opencode/opencode.db(SQLitesession/message/part), pinned by a live-schema test, not another fixture;session-export --opencode-onlylandssource='opencode'rows from a real install.CORE_HARNESSESgains"opencode",production=True, docs/spec/installer language in the same change,tests/test_docs_harness_tier_contract.pyextended to pin it; council review of the evidence before the flip merges (per the DoD above).Definition of done for this issue: all five boxes ticked, or the OpenCode boxes moved to their own issue with this one closed on pi's two. Not part of the 0.5.0 line — 0.5.0 ships the tiers exactly as
mainstates them today._Milestone renamed 0.6.0 → 0.5.x on 2026-09-21 (owner rule): follow-on work ships as 0.5.N patch releases until every issue outstanding at v0.5.0 is resolved. Where the linked receipt says "0.6.0", read "the follow-on milestone"._