Origin
Split from #21 on 2026-09-23 under that issue's own definition of done ("or the OpenCode boxes moved to their own issue with this one closed on pi's two"). The original text and the 2026-09-20 re-scope stay on #21. Not an MVP blocker: the preview label is the honest state today and docs/agent-install.md already says so.
What exists today (from #21's 2026-09-20 re-scope, read from main)
CORE_HARNESSES = ("kiro", "codex", "claude", "pi"), PREVIEW_HARNESSES = ("opencode", "grok") (packages/studyloop/src/studyloop/harnesses.py). OpenCode's items 3 (session export) and 4 (live release check) fail live.
Boxes
Definition of done
All three boxes ticked; full suite green; just lint; just typecheck. Do not flip the tier first and fix docs later.
Origin
Split from #21 on 2026-09-23 under that issue's own definition of done ("or the OpenCode boxes moved to their own issue with this one closed on pi's two"). The original text and the 2026-09-20 re-scope stay on #21. Not an MVP blocker: the preview label is the honest state today and
docs/agent-install.mdalready says so.What exists today (from #21's 2026-09-20 re-scope, read from
main)CORE_HARNESSES = ("kiro", "codex", "claude", "pi"),PREVIEW_HARNESSES = ("opencode", "grok")(packages/studyloop/src/studyloop/harnesses.py). OpenCode's items 3 (session export) and 4 (live release check) fail live.Boxes
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.Definition of done
All three boxes ticked; full suite green;
just lint;just typecheck. Do not flip the tier first and fix docs later.