Skip to content
frontmatter
キー値
specdojo.idsysd-opencode-agent-settings
specdojo.typearchitecture
specdojo.statusdraft
specdojo.rulebookspecdojo:sysd-rulebook
specdojo.part_ofsysd-agent-settings
specdojo.based_ontsd-ollama-opencode

OpenCode エージェント設定(Ollama) ​

SpecDojo CLI と OpenCode を組み合わせ、Ollama のローカルLLMでマルチエージェント実行を行うための設定・構成を定義する。

1. 設計方針 ​

共通の責務分担、実行フロー、割り当て、失敗処理、worktree は エージェント共通設定 に従う。本書では OpenCode と Ollama 固有の設定だけを定義する。

本設計では OpenCode の provider を ollama-local に限定する。API key と外部クラウドLLMを必要としない一方、ホスト側 Ollama の稼働状態、モデルロード時間、メモリ容量が制約になる。

OpenCode は Qwen 3.8 と Gemma 4 を用途別 agent として使い分ける。ただし全 agent は同じ opencode provider を使い、max_concurrency: 1 により同時実行を1件へ制限して、異なるモデルの同時ロードを防ぐ。

コンテキスト長は 64k とする。fully-guided の磨き込みタスクは rulebook / recipe と depends_on 成果物、対象成果物をまとめて読み込むため、32k では作業セットが収まらず agent がツール呼び出しに至らないまま終了(result 未記入のまま exit 0)する事象が確認された。64k にして作業セットに余裕を持たせる。ただし KV キャッシュは 32k 比でおおよそ倍のメモリを消費するため、ホスト側 Ollama の空きメモリを前提として確認する。

  • 非対話実行は opencode run: TUI を起動せず、SpecDojo が生成した plan を標準入力で渡す。
  • provider とモデル一覧は opencode.json: 実際に利用可能なローカルモデルをプロジェクト設定として共有する。
  • agent 定義は .opencode/agents/*.md: 役割ごとの primary / subagent、permission、最小限の実行契約を定義する。モデルは member の model を起動時の --model へ渡し、タスク固有の指示は edit / review plan を正本とする。
  • 共通ルールは project root の AGENTS.md を基本とする: .opencode/AGENTS.md を使う場合は opencode.json の instructions に明示する。
  • permission を安全境界とする: edit agent は必要な編集操作を許可し、review agent は result ファイル以外の編集を禁止する。
  • モデルと役割を分離する: Qwen は汎用・コード寄り、Gemma は文書作成・レビュー寄りに使うが、モデルは実体 member で選び、agent 定義は役割で選ぶ。通常 agent は reasoningEffort: none、expert agent は reasoningEffort: high とし、thinking 用の派生タグは作らない。
  • limit 情報は provider 非依存に共通化しない: OpenCode 自身の session limit を前提にせず、失敗要因は Ollama のロード待ち、メモリ不足、接続タイムアウトを主として扱う。

2. 責務分担 ​

3層の共通責務は親設計に従う。OpenCode agent は、OpenCode 固有の permission、モデル、agent 定義を使用して plan を処理する。Ollama はモデルのロード、推論、OpenAI 互換 API の提供だけを担い、タスク管理やファイル編集は行わない。

3. 全体フロー ​

text
specdojo exec run
   → providers.opencode の command template から解決した opencode run --agent <role> --model <model> を起動
   → plan を標準入力で渡す
   → OpenCode agent が成果物または result を編集
   → OpenCode CLI の終了状態を共通フローへ返す

edit / review の選択と終了後の状態遷移は親設計に従う。

4. ディレクトリ構成 ​

text
repo-root/
├─ opencode.json                       # provider・モデル・プロジェクト設定
├─ AGENTS.md                           # OpenCodeを含む共通プロジェクトルール(推奨)
├─ .opencode/
│  ├─ AGENTS.md                        # instructions で明示して使うOpenCode固有ルール
│  └─ agents/
│     ├─ opencode-executor.md          # pipeline executor(edit)
│     ├─ opencode-review-executor.md   # pipeline executor(review)
│     ├─ opencode-reporter.md          # pipeline reporter
│     └─ opencode-*.md                 # expert・grade・translator の役割定義

OpenCode の設定は複数箇所からマージされる。主な優先順は remote config、global config、OPENCODE_CONFIG、project root の opencode.json、.opencode/、OPENCODE_CONFIG_CONTENT の順で、後の設定が競合キーを上書きする。

SpecDojo の project management 配下と worktree の共通構成は親設計を参照する。

5. opencode.json 設定 ​

5.1. 現在の実設定 ​

プロジェクト直下の opencode.json を provider、利用モデル、グローバルデフォルトモデルの正本とする。本書には設定値の意図だけを記載し、JSON 全文は重複させない。

実際のファイル: opencode.json

5.2. provider 設計 ​

項目設定値意図
providerollama-local外部 provider と区別するプロジェクト内識別子
npm@ai-sdk/openai-compatibleOllama の OpenAI互換 API を利用
baseURLhttp://host.docker.internal:11434/v1devcontainer からホスト側 Ollama に接続
apiKeynot-neededSDKの必須項目を満たすダミー値
modelollama-local/qwen3.8:27b-mlx-work-64kagent 未指定時のデフォルト

ホスト外や Linux ホストで実行する場合は、host.docker.internal の名前解決と Ollama の listen address を別途確認する。

5.3. 使用モデル ​

opencode.json には Qwen 3.8 と Gemma 4 のモデルを定義し、.specdojo/agent-members.yaml の実体 member が各モデルを明示的に選ぶ。provider 単位の同時実行上限は1である。

モデルID用途member 例注意点
qwen3.8:27b-mlx-work-64k汎用作業・コード寄りタスクqwen-*expert は thinking を有効化する
gemma4:31b-mlx-work-64k文書作成・編集・レビューgemma-*expert は thinking を有効化する
gemma4:e4b-mlx軽作業(短い要約・分類・整形)-選択肢。軽量だが用途を限定する

5.4. 追加設定方針 ​

利用可能 provider をローカル Ollama に限定する場合は、opencode.json の enabled_providers に ollama-local を指定する。共有無効化、更新通知、追加 instruction ファイルの読込も同ファイルで管理する。

.opencode/AGENTS.md は自動読込対象ではないため、使用する場合は instructions に明示する。現在は project root の AGENTS.md を共通ルールの正本とする。

6. 共通指示の設計 ​

OpenCode は project root から上位方向に AGENTS.md を探索する。project root に AGENTS.md がある場合は、それをプロジェクト共通ルールの正本とする。

OpenCode 固有ルールを .opencode/AGENTS.md に分離する場合は、opencode.json の instructions で明示的に読み込む。instructions で指定したファイルは AGENTS.md と結合される。

共通指示は次の内容に限定する。

  • 言語、命名、Markdown frontmatter の規則
  • 変更前に読むべき設計書と既存パターン
  • 渡された plan だけを実行する SpecDojo ワークフロー
  • result ファイルへの done criteria 記録
  • .env、secrets、破壊的操作、git push の禁止

モデルは agent member、permission は agent 定義、SpecDojo exec の具体的な処理手順は edit / review plan に置く。AGENTS.md や agent 定義へタスク固有の手順を重複記載しない。

7. .opencode/agents/ エージェント定義 ​

OpenCode の project agent は .opencode/agents/<name>.md に定義する。ファイル名が --agent で指定する agent 名になる。YAML frontmatter に agent 設定、本文にシステムプロンプトを記述する。

本文は、標準入力で渡された plan に従うこと、agent 自身で claim / complete / reopen / block を行わないこと、事実を捏造しないことだけを定める。対象成果物、owner 観点、result の記入方法、検証、正常・異常終了条件は plan に記載する。

7.1. frontmatter フィールド ​

フィールド必須説明
description○agent の用途と選択条件
mode-primary / subagent / all。SpecDojo 直接起動では primary
model-pipeline の役割定義では指定しない。agent member の model を CLI の --model で渡す
temperature-出力のランダム性
permission-allow / ask / deny またはコマンド別パターン
steps-agent の最大ステップ数

tools は非推奨のため、新規設定では permission を使用する。

member は全員 stage_role(executor / reporter)を持つ pipeline 構成とし、単体で edit/review を完結する legacy 構成は使わない。

7.2. 役割別 executor ​

pipeline executor(edit)は executor plan に従って成果物の編集と検証だけを行い、result は更新しない。docs/ja/projects/**/execution/exec/results/** は明示的に deny する。変更ファイルと検証結果は runner が evidence として収集できるよう、ツール出力と最終応答へ残す。

実際のファイル: .opencode/agents/opencode-executor.md、.opencode/agents/opencode-expert-executor.md、.opencode/agents/opencode-grade-executor.md。

主な安全境界は次のとおり。

  • .env と secrets の読み取りを禁止する。
  • Edit ツールは文書成果物の docs/**、実装成果物の src/**、自動テストの tests/** だけを許可し、docs/ja/projects/**/execution/exec/results/** は deny する。
  • git push、git reset --hard、git clean、rm を禁止する。
  • Web 検索と検索結果の参照を許可し、外部ディレクトリとsubagentの利用を禁止する。
  • agent 自身による claim、complete、reopen、block を禁止する。

7.3. 役割別 review executor ​

pipeline executor(review)は review plan の各観点に従って成果物を多観点でレビューするが、成果物・result のいずれにも書き込まない(edit を全面 deny する)。レビュー結果はツール出力と最終応答へ残し、reporter が evidence として引き継ぐ。

実際のファイル: .opencode/agents/opencode-review-executor.md、.opencode/agents/opencode-expert-review-executor.md。

主な安全境界は次のとおり。

  • edit を全面禁止する(成果物・result のいずれも変更しない)。
  • bash は Git の参照系コマンド、Markdown lint、specdojo exec validate だけを許可する。
  • .env と secrets の読み取りを禁止する。Web 検索と検索結果の参照を許可し、外部ディレクトリとsubagentの利用を禁止する。
  • 全基準を確認できない場合は pass または approve と判定しない。

7.4. reporter ​

pipeline reporter は標準入力で渡された plan、executor evidence、出力スキーマだけから構造化結果を返す。read / glob / grep / list / bash / edit / Web / subagent をすべて deny とし、成果物や result を直接変更できないようにする。応答には指定スキーマ外の説明やコードフェンスを加えない。edit/review どちらの executor の後段にも使う。

実際のファイル: .opencode/agents/opencode-reporter.md。

対話型オーケストレーターは pipeline role と別の .opencode/agents/specdojo-orchestrator.md を使うため、permission.edit と permission.bash を分離する。利用者の承認後に .specdojo/ や package.json なども変更できるよう、orchestrator の edit はリポジトリ全体で allow する。executor・review executor は読み取りを含む全 gh を deny するが、オーケストレーターは gh pr view・gh pr list・gh run list・gh run view・gh release view などの読み取りだけを allow する。git push、gh api、PR・release・repository などの書き込みサブコマンドは明示 deny し、未列挙の gh は deny 基点の許可リストにより拒否する。

7.5. エージェント一覧 ​

ファイル名--agent 指定名modeモデル指定用途
opencode-executor.mdopencode-executorprimaryCLI通常 executor(edit)
opencode-expert-executor.mdopencode-expert-executorprimaryCLIexpert executor(edit)
opencode-grade-executor.mdopencode-grade-executorprimaryCLIgrade 用 executor
opencode-review-executor.mdopencode-review-executorprimaryCLI通常 executor(review)
opencode-expert-review-executor.mdopencode-expert-review-executorprimaryCLIexpert executor(review)
opencode-reporter.mdopencode-reporterprimaryCLIreporter
gemma26-translator.mdgemma26-translatorprimaryfrontmattergrade finding の翻訳
qwen-orchestrator.mdqwen-orchestratorprimaryfrontmatterQwen 対話型オーケストレーター
gemma-orchestrator.mdgemma-orchestratorprimaryfrontmatterGemma 対話型オーケストレーター

8. エージェント割り当て設定 ​

8.1. .specdojo/agent-members.yaml ​

起動コマンドは親設計の 起動コマンドの解決 に従い、.specdojo/exec-defaults.yaml の providers.opencode.command_template で定義する。{agent} は command_params から役割ファイルを選び、{model} は実体 member のモデルを渡すため、member の nickname と agent 定義のファイル名は一致させない。

yaml
providers:
  opencode:
    command_template: "opencode run --agent {agent} --model {model}"
    command_params:
      by_mode:
        edit: { agent: opencode-executor }
        review: { agent: opencode-review-executor }
        report: { agent: opencode-reporter }
      by_proficiency:
        expert: { agent: opencode-expert-executor }
      by_nickname:
        qwen-expert-review-executor: { agent: opencode-expert-review-executor }
        gemma-expert-review-executor: { agent: opencode-expert-review-executor }
        ornith-expert-executor: { agent: opencode-grade-executor }
        qwen36-expert-executor: { agent: opencode-grade-executor }

同じ変数は by_nickname が最優先なので、edit の expert、review の expert、grade、translator のように mode と proficiency だけでは一意に決まらない役割を明示できる。実体・別名への移行時は、新しい実体 nickname に合わせて by_nickname のキーも更新する。

.specdojo/agent-members.yaml の member は選択属性だけを持ち、command を書かない。

yaml
members:
  - nickname: opencode-executor
    type: agent
    provider: opencode
    mode: edit
    stage_role: executor
    proficiency: normal
    priority: 1
    capabilities: [web_search]
    scheduler_strategy: critical-first

  - nickname: opencode-review-executor
    type: agent
    provider: opencode
    mode: review
    stage_role: executor
    proficiency: normal
    priority: 1
    capabilities: [web_search]
    scheduler_strategy: fifo

  - nickname: opencode-reporter
    type: agent
    provider: opencode
    stage_role: reporter
    proficiency: normal
    priority: 1
    capabilities: []
    scheduler_strategy: fifo

OpenCode の executor(edit / review)は websearch と webfetch を利用できるため、capabilities: [web_search] とする。reporter は渡された evidence だけを扱うため capability を持たせない。normal taskでは、Web検索の要否にかかわらず priority: 1 によりOpenCodeを最初の候補とする。各 OpenCode member のモデルは実体 member の model で選ぶ。

8.2. sch-strategy-<track>.yaml ​

phase の共通契約は親設計に従う。外部Web検索が必要なphaseは capabilities: [web_search] とし、OpenCode agentも候補に含める。proficiency は役割を、実体 member の model はモデルを選ぶため、同じ役割定義を異なるモデルで使用できる。

8.3. .specdojo/exec-defaults.yaml ​

共通の retry / fallback / block 方針とグローバル既定 / provider 別上書きの2層構造は親設計に従う。Ollama では API rate limit より、モデルロード待ち、メモリ不足、接続タイムアウトが主な失敗要因になるため、OpenCode 固有の検出条件とポリシーを providers.opencode に置き、.specdojo/agent-members.yaml で provider: opencode の member に適用する。

yaml
providers:
  opencode:
    rate_limit_detection:
      exit_codes: [] # ローカル実行では exit 1 は実失敗。stderr で判定する
      stderr_patterns:
        - "timeout"
        - "connection refused"
        - "out of memory"
        - "model is loading"
    rate_limit_policy:
      on_non_critical:
        action: skip
      on_critical:
        action: try_next
        retry:
          max_attempts: 3
          initial_wait_seconds: 120 # モデル再ロード/メモリ解放に時間がかかるため長め
          backoff_multiplier: 2
          max_wait_seconds: 600
        on_exhausted: block

同一ホスト・単一モデルを共有するため、別 opencode member への try_next では復旧しない。復旧手段は wait+backoff の再試行であり、初回待機をモデル再ロード/メモリ解放にかかる時間に合わせて長めに取る。グローバルの rate limit / 429 パターンは Ollama の主たる失敗要因と一致しないため、上書きで OpenCode 固有のシグナルに置き換える。誤検出範囲を確認してから stderr pattern を追加・調整する。

ローカル Ollama を provider とする本構成では、アカウントベースの limit という考え方が他 provider と根本的に異なる。クラウド provider のような rate limit(秒〜分で回復)、session limit(5時間枠など)、quota(週次・月次の利用枠)は存在しない。失敗要因はローカル資源で、すべて reset horizon が秒〜分の transient_failure として wait+retry で扱う。共通モデルへの写像は親設計の limit 表に従う。

失敗要因概要provider_signal.kind扱い
モデルロード待ち初回ロードやアンロード後の再ロードtimeouttransient_failure。wait+retry
メモリ不足KV キャッシュ等でホストの空きメモリが不足oomtransient_failure。wait+retry
接続タイムアウトホスト側 Ollama への接続不可・応答遅延timeouttransient_failure。wait+retry
コンテキスト長超過作業セットが設定コンテキスト長を超えるfatal_failurerun 内回復不可。block して設計を見直す

OpenCode は provider 抽象化層であるため、quota 残量、session limit、reset 時刻のような利用枠情報を OpenCode 共通仕様として前提にしない。必要なら OpenCode 自体の event 出力とは別に、接続先 provider 固有の診断方法を採用する。

実際のファイル: .specdojo/exec-defaults.yaml

8.4. 実行コマンド ​

共通の実行コマンドは親設計を参照する。OpenCode agent を明示する場合は、モデル系統と役割を表す実体 nickname または互換用の別名を使用する。--agent に渡す役割ファイル名は command template が解決する。

9. 非対話実行とセッション ​

opencode run [message..] は非対話実行用コマンドである。--agent で primary agent、--model で一時的なモデル、--format json で raw JSON event 出力を指定できる。

opencode stats と session list --format json により、利用済み token や cost、session 一覧の観測はできる。ただしこれらは履歴統計であり、次のリクエストで利用できる残量や rate limit reset を保証する API ではない。

bash
opencode run \
  --agent opencode-executor \
  --model ollama-local/qwen3.8:27b-mlx-work-64k \
  --format json \
  "SpecDojo plan を実行してください"

--dangerously-skip-permissions は明示的に deny していない permission を自動承認するため、SpecDojo の通常運用では使用しない。必要な操作は agent 定義の permission で allow / deny を明確にする。

10. opencode serve 常駐モード ​

opencode run は実行ごとにローカル backend と MCP server を起動する。起動コストを削減する場合は opencode serve を常駐させ、opencode run --attach で接続する。

bash
export OPENCODE_SERVER_PASSWORD='<secret>'
opencode serve --hostname 127.0.0.1 --port 4096

opencode run \
  --attach http://127.0.0.1:4096 \
  --username opencode \
  --password "${OPENCODE_SERVER_PASSWORD}" \
  --agent opencode-executor \
  --model ollama-local/qwen3.8:27b-mlx-work-64k \
  "SpecDojo plan を実行してください"

常駐 server は loopback に限定し、共有環境では OPENCODE_SERVER_PASSWORD を設定する。モデル本体の保持・アンロードは Ollama 側の設定にも依存する。

11. worktree 分離セットアップ ​

worktree のライフサイクル、配置、ブランチ名、イベントファイル名は親設計に従う。OpenCode の edit agent を並列実行する場合は worktree を使用し、成果物を変更しない review agent では不要とする。

12. 現状差分と導入順序 ​

項目現状対応
opencode.jsonprovider・3モデル・デフォルトモデルを定義済み必要に応じて instructions と provider 制限を追加
AGENTS.mdproject root に共通ルールを定義済みOpenCode 固有指示を追加する場合だけ別ファイルを参照
.opencode/agents/*.md役割ごとの agent を定義済みopencode debug agent <name> で認識を確認
.specdojo/agent-members.yaml旧 nickname の1段名簿PJR-8MPY で実体・別名の2段構成へ移行
exec-defaults.yaml{nickname} を --agent に渡す旧テンプレートPJR-8MPY で {agent} と --model {model} へ切り替える

導入確認は agent 認識確認、exec-defaults.yaml の command template 更新、単一タスク実行、並列実行の順で行う。

13. 公式仕様参照 ​