The lab drives a specific OpenCode V2 runtime version and records which one it used in every report. Compatibility is stated per version, and only a run makes it verified.
| Version | Where | Result |
|---|---|---|
| 2.0.21 | the pinned baseline, committed manifests, the historical evidence | verified: real opencode serve runtime, plugin loading, tool registration, model-request path |
| 2.0.32 (latest stable at the time of writing) | separate evaluation build (OPENCODE_VERSION=2.0.32), not the pinned default |
verified: 76 pass / 0 fail / 5 skip, identical to 2.0.21, image sha256:ea5017747b2a… |
The historical three-plugin run (reports/historical/gitdamnit-2026-10-17/)
was performed on OpenCode v2.0.21 and Node v22.23.3.
The 2.0.32 evaluation is committed at
reports/v1.0.0/opencode-2.0.32/test-report.json.
None currently recorded. A version is either verified by a run, or listed here as projected with the reason it has not been run.
make build OPENCODE_VERSION=<x>
make suite
make report # the report records the exact runtime version usedThe lab never follows latest automatically: a manifest pins a version,
OPENCODE_VERSION overrides it for one build, and the installed version is baked
into the report.
-
make build OPENCODE_VERSION=<x>(network needed for the base image and npm). -
make suite; inspect## Plugins under testand the runtime version in the report header. -
If a break appears, it is in one of these surfaces, all of which the lab isolates:
- CLI/server:
opencode serve,GET /api/info,GET /api/plugin. - Plugin SDK:
@opencode/pluginresolution andPlugin.define. - Tool domain:
ctx.tool.transform/hook. - Session/model domain: the offline mock-provider request path.
The failing suite names the surface; the fix is confined to the harness (
harness/lib/opencode.mjs,harness/inspector/index.ts) or the plugin being tested, never to the plugins this lab merely observes. - CLI/server:
OpenCode V2 ships frequently (2.0.21 → 2.0.3x within weeks of the baseline).
The lab is designed so that following it is a deliberate, recorded action rather
than silent drift. No breaking change was found between 2.0.21 and 2.0.32: the
full generic suite passes on both (76 pass / 0 fail / 5 skip).