Part of the OpenCode enhancement-parity track (see #113 for the baseline + progressive-enhancement model).
OpenCode declares no [shadow] preflight today, so a logical eval skill present in a live discovery source contaminates the with/without comparison with no build-time warning.
Verified discovery surface (opencode skills doc, v1.18.3)
OpenCode discovers skills from six roots — more than any other built-in harness:
- Project (walked up from cwd to the git worktree):
.opencode/skills/<name>/SKILL.md, .claude/skills/<name>/SKILL.md, .agents/skills/<name>/SKILL.md
- Global:
~/.config/opencode/skills/<name>/SKILL.md (honor OPENCODE_CONFIG_DIR), ~/.claude/skills/<name>/SKILL.md, ~/.agents/skills/<name>/SKILL.md
The .claude / .agents roots are a genuine cross-harness contamination vector: a skill staged or installed for Claude Code or Codex is visible to OpenCode sessions by default (and vice versa). Note: OPENCODE_DISABLE_CLAUDE_CODE_SKILLS exists, but dispatch should not set it — parity with a real user session matters, and the shadow report is the mechanism for surfacing the risk.
Work
- New
ShadowPreflight::OpencodeSkills variant in src/adapters/capabilities.rs + src/adapters/opencode/skill_shadow.rs, modeled on src/adapters/codex/skill_shadow.rs (frontmatter name: parsing, best-effort scan, no hard failure on unreadable sources).
- Reuse the harness-neutral
PluginShadowReport from src/adapters/skill_shadow.rs and the shared banner/validity-warning rendering (the claude path shows the shared renderers).
- Add
opencode-skills to the shadow-preflight enum in schema/harness-descriptor.schema.json; declare [shadow] preflight = "opencode-skills" in harnesses/opencode.toml.
Acceptance
Part of the OpenCode enhancement-parity track (see #113 for the baseline + progressive-enhancement model).
OpenCode declares no
[shadow]preflight today, so a logical eval skill present in a live discovery source contaminates the with/without comparison with no build-time warning.Verified discovery surface (opencode skills doc, v1.18.3)
OpenCode discovers skills from six roots — more than any other built-in harness:
.opencode/skills/<name>/SKILL.md,.claude/skills/<name>/SKILL.md,.agents/skills/<name>/SKILL.md~/.config/opencode/skills/<name>/SKILL.md(honorOPENCODE_CONFIG_DIR),~/.claude/skills/<name>/SKILL.md,~/.agents/skills/<name>/SKILL.mdThe
.claude/.agentsroots are a genuine cross-harness contamination vector: a skill staged or installed for Claude Code or Codex is visible to OpenCode sessions by default (and vice versa). Note:OPENCODE_DISABLE_CLAUDE_CODE_SKILLSexists, but dispatch should not set it — parity with a real user session matters, and the shadow report is the mechanism for surfacing the risk.Work
ShadowPreflight::OpencodeSkillsvariant insrc/adapters/capabilities.rs+src/adapters/opencode/skill_shadow.rs, modeled onsrc/adapters/codex/skill_shadow.rs(frontmattername:parsing, best-effort scan, no hard failure on unreadable sources).PluginShadowReportfromsrc/adapters/skill_shadow.rsand the shared banner/validity-warning rendering (the claude path shows the shared renderers).opencode-skillsto the shadow-preflight enum inschema/harness-descriptor.schema.json; declare[shadow] preflight = "opencode-skills"inharnesses/opencode.toml.Acceptance
run --harness opencodewith a colliding skill in any of the six roots emits the shadow banner +plugin-shadow.json, folded intobenchmark.jsonvalidity warnings byaggregateOPENCODE_CONFIG_DIRhonoreddocs/opencode-notes.mdupdated (code map + what's wired); README support table flips Shadow preflight to ✅; capability added todocs/byoh.mdand the harness-descriptor PR template listscargo test,cargo clippy --all-targets -- -D warnings,cargo fmt --checkgreen