Skip to content
Agent Orchestration
Skill

/opencode-lane

Claude Lane OpenCode half. How to add OpenCode behavior, diagnose a writer run, and what stays in lane-ctl. Use when user says opencode-lane, делай диагноз, OpenCode plugin, sticky contract, winnow on OpenCode, Jev effort, writer session plugin, or any new OpenCode feature in

BOOST
From plugin
claude-lane-stack
12464 skills24 agents5 commands12 hooks
+1
Install
$ npx -y skills add VKirill/claude-lane-stack --skill opencode-lane --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/opencode-lane

Context preview

The summary Claude sees to decide when to auto-load this skill.

Claude Lane OpenCode half. How to add OpenCode behavior, diagnose a writer run, and what stays in lane-ctl. Use when user says opencode-lane, делай диагноз, OpenCode plugin, sticky contract, winnow on OpenCode, Jev effort, writer session plugin, or any new OpenCode feature in

SKILL.md

opencode-lane.SKILL.md
name: opencode-lane
description: Claude Lane OpenCode half. How to add OpenCode behavior, diagnose a writer run, and what stays in lane-ctl. Use when user says opencode-lane, делай диагноз, OpenCode plugin, sticky contract, winnow on OpenCode, Jev effort, writer session plugin, or any new OpenCode feature in claude-lane-stack. SKIP: product task YAML (lane-contract); run DAG (orchestrator-lanes); third-party OpenCode plugins (agentmemory, gemini-auth, open-cursor).
argument-hint: "[info]"

opencode-lane

Info (print and stop)

If `$ARGUMENTS` is `info`, or the user says `info` / `справка` / `как запускать` this skill: print the block below **verbatim** (Russian), then **stop**. Do not edit the plugin.

opencode-lane — OpenCode-половина Claude Lane

Роли
- Claude Code = PM: run-init, run-supervisor, lane-ctl owns/verify/accept.
- OpenCode = писатели (Grok и любой другой model через lane-session).
- Этот плагин = единственное НАШЕ нововведение внутри OpenCode-сессии.

Куда класть код
- Вход: profiles/opencode/opencode-lane.ts (только re-export).
- Код:  profiles/opencode/opencode-lane/<mod>.ts + проводка в index.ts.
- Живое: ~/.config/opencode/plugins/opencode-lane.ts (вход) + ~/.config/opencode/opencode-lane/ (модули, НЕ в plugins/: v2 грузит каждую папку там как плагин).
- Гейт v2: агент lane-* (общий сервис, env сервиса не тредовый). v1: LANE_* маркеры процесса.
- Не второй plugin-файл. Не новое имя в opencode.json.

Конвейер
- lane-session без --pure (плагин должен грузиться).
- Env: LANE_TASK_FILE, LANE_PROMPT_FILE, LANE_STACK_ROOT, TYPESAFE_API_KEY.
- Выкл Jev extra: LANE_OPENCODE_JEV=0. Выкл effort: LANE_JEV_EFFORT=0.
- Fail-open: Jev/winnow упал → сессия как без плагина, строка в jsonl.

Нельзя
- owns / verify / accept / retry — не сюда (lane-ctl, lane-session).
- Глотать чужие плагины (agentmemory-capture, gemini-auth, open-cursor).
- Второй планировщик на Jev. Jev = System One, не coding LLM.

Как открыть шпаргалку
- Claude Code: /lane-stack:opencode-lane info
- OpenCode TUI: /opencode-lane  (файл ~/.config/opencode/commands/opencode-lane.md)
- Не /lane-stack:… в палитре OpenCode — это namespace Claude-плагина, там его нет.

Диагноз прогона
- Сказать «делай диагноз».
- Лог: сосед LANE_PROMPT_FILE → opencode-lane.jsonl
  при read-only .agents → ~/.config/opencode/opencode-lane.jsonl
- Запуск/инструменты/stderr: provider.events.jsonl рядом с provider.out.
- Связь: task + session + call/message ID; log_origin указывает попытку.

Canonical files: `profiles/opencode/opencode-lane.ts`, `profiles/opencode/opencode-lane/index.ts`, `bin/lane-session` (`attach_lane_contract_env`, opencode argv). Skills **lane-contract** (YAML) and **orchestrator-lanes** (DAG) stay separate.

Load **typesafe-ai** when adding a Jev question. Keep known rules in code; Jev only supplies a typed judgment.

---

Split (do not blur)

| Layer | Owner | Lives in | |-------|--------|----------| | Task YAML, owns, acceptance | PM | `.agents/runs/` + **lane-contract** | | Dispatch, retry, session id | Controller | `bin/lane-session`, `lane-ctl` | | L1 verify / accept | Controller | `lane-ctl` — never the plugin | | Sticky YAML contract | Plugin | `sticky.ts` | | Winnow large tool output | Plugin | `index.ts` → sidecar `:47311` | | Effort route | Plugin | `chat.params` + `jev-route-core.ts` | | History compaction | OpenCode | No extra plugin compaction; message transforms preserve tool history | | Diagnose a failed tool | Plugin | `diagnose.ts` (hint only) | | Write-skill hint | Plugin | `skill-hint.ts` | | Acceptance vs last tool | Plugin | `evidence.ts` | | Failure telemetry | Plugin | `log.ts` → `opencode-lane.jsonl` | | All-tool progress | Plugin | `budget.ts` + `telemetry.ts`: full input/output fingerprints, call-ID deduplication, advisory repeat hints |

A judgment that **changes accept/retry/merge** belongs in `lane-ctl`, not here. The plugin may only append a `[opencode-lane …]` note and a jsonl row. The writer still decides; the controller still gates.

---

Add an OpenCode change

1. One module under `profiles/opencode/opencode-lane/`. One hook concern. 2. Wire it in `index.ts`. Re-export from `opencode-lane.ts` only if tests or agents import the symbol. 3. Fail-open: catch, `laneLog({ mod, ok: false, err })`, keep the session. 4. Brand every user-visible string `[opencode-lane <mod>]`. 5. `install.sh` already copies `opencode-lane.ts` + the folder. Do not add a second `plugin` list entry. 6. Copy live: `~/.config/opencode/plugins/opencode-lane.ts` and `plugins/opencode-lane/*.ts`. A checkout-only fix is not shipped. 7. One smallest test in `tests/test_jev_route.py` (string wire or a node `--experimental-strip-types` check). No extra harness.

OpenCode hooks this plugin uses:

  • `chat.message` — remember prompt, skill-hint
  • `chat.params` — Jev effort
  • `tool.execute.before` — block `write` over an existing file and `git checkout`/`restore`/`reset`/`switch`
  • `tool.execute.after` — winnow, diagnose
  • All tool events, including glob/MCP/edit/write/errors, feed progress diagnostics;

Winnow still filters only read/grep/bash/shell. Novel output is evidence to inspect, not proof of task completion. `first_edit_callback_ms` measures a callback, not a verified file change.

  • `experimental.chat.messages.transform` — evidence, sticky; no extra history compaction

If OpenCode grows a new hook, handle it in `index.ts`, not a sibling plugin.

---

Diagnose a writer run

User said **«делай диагноз»** — do this, then stop unless they said «чини».

1. Read the jsonl (newest last):

f="${LANE_PROMPT_FILE%/*}/opencode-lane.jsonl"
[ -f "$f" ] || f="$HOME/.config/opencode/opencode-lane.jsonl"
tail -n 40 "$f"

2. Filter by `task`, `session`, and `log_origin` (the fallback is shared). Classify rows by `mod`: `startup` `telemetry` `jev` `route` `winnow` `sticky` `diagnose` `skill-hint` `evidence` `budget`. `ok: false` is an error or retry. `telemetry` records

Read more
Ships withclaude-lane-stack

Claude Lane Stack is a self-hosted toolkit for coordinating coding agents through CLI processes, task contracts, Git workspaces, and verification receipts (bin/run-controller:117-159, schemas/task-v2.schema.json:1-60).

Get the whole plugin

Other skills on claude-lane-stack.