Repository navigation
Promote Pi and OpenCode from preview to core harness tier — with live release evidence, then docs #21
Description
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 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 doctorreports 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.pyparity). - Session export — the harness's transcript exporter lands rows in
sessions.dbwith the correctsource(pi,opencode), andsession-export --<h>-onlyworks (agent_session_toolsexporters + 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 underdocs/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 globalstudy-plan-architectagent; confirm pi).
Then, and only then
- Move
piandopencodeintoCORE_HARNESSES; setproduction=True;RELEASE_HARNESSESunchanged. - 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, andopenspec/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 inpackages/agent-session-tools/tests/test_docs_semantic_layer_contract.pyto copy).
Definition of done
- For
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. - Docs/spec/installer language updated in the same change; a contract test pins docs ↔ code.
- Full suite green;
just lint;just typecheck. - Council review (GPT Astra, Grok 4.6, + one best-for-purpose seat) of the evidence before the tier flip is merged.
Notes
- Do not flip the tier first and "fix docs later" — the preview label is currently the honest state, and the congruence review's finding was precisely that docs must not outrun evidence.
- Blocked by nothing; independent of the plan-integration programme (Integrate Study Plans across Now, Web architect, and MCP #7–Plan integration 8: Reconcile release contract and verify #15, PR Plan integration: PlanApplication seam, Bugs A/B closed (Phases 0–1) [in progress] #20). Can run in parallel.
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)
- Replace the
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/). - Re-run
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. - One live acceptance run with a completed model reply (a provider with quota), evidence bundle committed.
- Then, and only then:
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 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"._
Activity
build(security): trufflehog pre-commit hook with redacted output; ful…
test(acceptance): seed memory.default_scope so a scratch HOME can sta…
fix(acceptance): scrub inherited STUDYLOOP_* pointers from the scratc…
feat(acceptance): opt-in real-harness-auth mode + recorded harness-ev…
fix(session): only pre-trust the session dir in Claude settings for a…
fix(acceptance): give the live lane a module timeout that clears its …
feat(adapters): pre-trust the session dir in Grok Build's trusted_fol…
docs(receipts): harness release evidence for pi, OpenCode and Grok Bu…
feat(harnesses): promote pi to the core tier; pin the documented spli…
docs(closeout): feat/clean-start deleted locally — its tip is the arc…
merge: feat/harness-tier-promotion into fix/plan-integration-bugs — i…
fix(verify): advance the late protected-files base to the harness mer…
NetDevAutomate commentedon Sep 19, 2026
Status, 2026-09-19 — posted from the committed record (
docs/architecture/plan-integration/receipts/harness-evidence-2026-09-16.md, council recordcouncil/harness-tier-review-2026-09-16.md), both onmainata03fc9bd. Left open on purpose: the definition of done names OpenCode in the core tuple, and that is not met.Where each harness stands
mainsource='pi'row, live check with a real Socratic reply (Bedrockclaude-opus-4-6, $0.139), plan-architect mode resolves the personaCORE_HARNESSES = ("kiro", "codex", "claude", "pi")(harnesses.py:27)piresolved to Homebrew 0.65.0).~/.local/share/opencode/opencode.db(SQLitesession/message/part), whichOpenCodeExporterdoes not read — the fixture passes, the live export does not; and the live run captured no model reply (0-token assistant rows, provider quota). To go green: teach the exporteropencode.dbwith a live-schema test, not another fixture; re-run with a provider that has quota;just testacc opencodewithSTUDYLOOP_ACC_REAL_AUTH=1.child_env.py), so "core" would advertise transport parity Grok cannot deliver on this configuration. Council: HOLD ×3. The trust pre-write the run needed is opt-in (STUDYLOOP_GROK_TRUST_SESSION_DIR=1), default off.Docs for the split are pinned by
tests/test_docs_harness_tier_contract.py(parses each document's own statement of the tiers).What this issue still tracks
opencode.dbexporter (live-schema test) and a live run with a completed reply → then the tier flip with the docs contract test, per the DoD's "do not flip the tier first".A related, standing rule from the owner (2026-09-18): nothing in the planning/architect flow may be kiro-cli specific — every process and steering surface applies across all supported harnesses. The one owner-side receipt still due from that rule is a per-harness reachability check of the architect's tools on a real install (one row per harness: what the architect can call, what prompts); it belongs beside the harness evidence here.
NetDevAutomate commentedon Sep 23, 2026
Re-scoped on 2026-09-23 to pi's two boxes only, under this issue's own definition of done ("or the OpenCode boxes moved to their own issue with this one closed on pi's two"). The OpenCode boxes now live in #37 on milestone 0.6.0.
What closes this issue:
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 (agent work).just testacc piwithSTUDYLOOP_ACC_REAL_AUTH=1on pi 0.73.1 and commit the evidence bundle under the receipt directory (owner-gated: needs your pi auth; Homebrew'spiresolves to 0.65.0 today).Stays on 0.5.x as MVP work: pi is already core, so these discharge the council's recorded conditions rather than promote anything.