<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Pi on j1nn0 lab</title>
    <link>https://j1nn0.com/tags/pi/</link>
    <description>Recent content in Pi on j1nn0 lab</description>
    <generator>Hugo -- 0.164.0</generator>
    <language>ja-JP</language>
    <lastBuildDate>Wed, 12 Aug 2026 00:00:00 +0900</lastBuildDate>
    <atom:link href="https://j1nn0.com/tags/pi/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>委譲先は CLI でなく役割で固定する。OMP と Codex を pi に置き換えた</title>
      <link>https://j1nn0.com/posts/agent-orchestration-pi/</link>
      <pubDate>Wed, 12 Aug 2026 00:00:00 +0900</pubDate>
      <guid>https://j1nn0.com/posts/agent-orchestration-pi/</guid>
      <description>agent-orchestration スキルの調査役 OMP と実装役 Codex を、どちらも pi に置き換えた。モデルと役割はそのまま、委譲先の CLI を1本に寄せた理由と、動作確認で見つかった3つの問題と対処を書く。</description>
      <content:encoded><![CDATA[<p>前回の記事で、調査と実装だけを委譲する <a href="https://github.com/j1nn0/skills" target="_blank" rel="noopener"><code>agent-orchestration</code></a>
 スキルを作った(<a href="https://j1nn0.com/posts/agent-orchestration-skill/">前回の記事</a>
)。その委譲先、OMP(oh-my-pi)と Codex を、どちらも pi に置き換えた。</p>
<p>役割もモデルも同じままだ。変わったのは動かす CLI だけ。理由は単純で、委譲先が重かったからだ。</p>
<h2 id="重さの正体は3つ">重さの正体は3つ</h2>
<h3 id="omp-は-pi-のフォークで機能過多">OMP は pi のフォークで機能過多</h3>
<p>OMP は Mario Zechner の <a href="https://github.com/earendil-works/pi" target="_blank" rel="noopener">pi</a>
 を <a href="https://github.com/can1357/oh-my-pi" target="_blank" rel="noopener">can1357</a>
 がフォークしたもので、IDE 連携、LSP、ブラウザ、デバッガ、サブエージェントなどを足した「全部入り」だ。</p>
<p>調査と実装の委譲先に、これらの機能は要らない。むしろ、設定と拡張の管理コストだけが増える。base の pi で足りる。</p>
<h3 id="設定権限状態が-cli-ごとに別々">設定・権限・状態が CLI ごとに別々</h3>
<p>OMP と Codex は別の CLI なので、設定ファイルも権限システムもセッション管理も2本立てになる。旧スキルは「モデルと思考レベルの割り当てを CLI の設定ファイルに頼るな」と明記し、起動時のフラグで固定していた。</p>
<p>そのフラグ自体が CLI ごとに違う体系だった。OMP は <code>--thinking xhigh</code>、Codex は <code>-c model_reasoning_effort=max</code>。同じ「最上位の思考」を、別の名前と別のフラグで指定していた。</p>
<h3 id="動かすとノイズが出る">動かすとノイズが出る</h3>
<p>委譲先を起動すると、拡張の再インストールが走り、警告が並び、権限の確認ダイアログが出る。詳しくは後述の動作確認で触れるが、起動のたびにこれが付きまとうのは地味に重い。</p>
<p>一方、モデルは最初から pi から使えた。<code>opencode-go/deepseek-v4-flash</code> は pi のモデルカタログにあり、<code>gpt-5.6-luna</code> も <code>openai-codex</code> プロバイダ経由で同じものが使える。</p>
<p>つまり重かったのはモデルではなく、CLI の側だった。</p>
<h2 id="cli-でなく役割で固定する">CLI でなく役割で固定する</h2>
<p>置き換え後の構成はこうなった。オーケストレーターの固定もやめた。初版のスキルは Claude Code と Opus 5 を前提に書いていたが、今は「現在のエージェント」とだけ書く。固定するのは役割とモデルだけだ。</p>
<table>
	<thead>
			<tr>
					<th>役割</th>
					<th>変更前</th>
					<th>変更後</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>判断とレビュー</td>
					<td>Claude Code(Opus 5)</td>
					<td>現在のエージェント(固定しない)</td>
			</tr>
			<tr>
					<td>調査と研究(読み取り専用)</td>
					<td>OMP(kind <code>omp</code>)</td>
					<td>pi <code>explorer</code></td>
			</tr>
			<tr>
					<td>実装</td>
					<td>Codex(kind <code>codex</code>)</td>
					<td>pi <code>fixer</code></td>
			</tr>
	</tbody>
</table>
<p>起動コマンドは、こう変わった。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 変更前</span>
</span></span><span class="line"><span class="cl">herdr agent start omp --kind omp --pane &lt;pane-id&gt; -- <span class="se">\
</span></span></span><span class="line"><span class="cl">  --model opencode-go/deepseek-v4-flash <span class="se">\
</span></span></span><span class="line"><span class="cl">  --thinking xhigh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">herdr agent start codex --kind codex --pane &lt;pane-id&gt; -- <span class="se">\
</span></span></span><span class="line"><span class="cl">  --model gpt-5.6-luna <span class="se">\
</span></span></span><span class="line"><span class="cl">  -c <span class="nv">model_reasoning_effort</span><span class="o">=</span>max
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 変更後</span>
</span></span><span class="line"><span class="cl">herdr agent start explorer --kind pi --pane &lt;pane-id&gt; -- <span class="se">\
</span></span></span><span class="line"><span class="cl">  --model opencode-go/deepseek-v4-flash <span class="se">\
</span></span></span><span class="line"><span class="cl">  --thinking max <span class="se">\
</span></span></span><span class="line"><span class="cl">  --no-autoformat <span class="se">\
</span></span></span><span class="line"><span class="cl">  --no-autofix
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">herdr agent start fixer --kind pi --pane &lt;pane-id&gt; -- <span class="se">\
</span></span></span><span class="line"><span class="cl">  --model openai-codex/gpt-5.6-luna <span class="se">\
</span></span></span><span class="line"><span class="cl">  --thinking max <span class="se">\
</span></span></span><span class="line"><span class="cl">  --no-autoformat <span class="se">\
</span></span></span><span class="line"><span class="cl">  --no-autofix
</span></span></code></pre></div><p>ここで1つ注意したいのが、<code>xhigh</code> と <code>max</code> の関係だ。OMP の <code>xhigh</code> は DeepSeek の <code>reasoning_effort=max</code> にマップされる値で、pi の <code>max</code> も同じ値を指す(<a href="https://api-docs.deepseek.com/guides/thinking_mode" target="_blank" rel="noopener">DeepSeek API の互換マッピング</a>
)。思考レベルが一段上がったわけではない。名前の体系が pi に揃っただけだ。</p>
<h3 id="見送った案-ツールの-allowlist-による読み取り専用の強制">見送った案: ツールの allowlist による読み取り専用の強制</h3>
<p>pi には <code>--tools read,grep,find,ls</code> のように、使えるツールを制限する仕組みがある。調査役の読み取り専用を、プロンプトの指示でなく構造で強制できる。最初はこれを入れるつもりだった。</p>
<p>やめた理由は、allowlist のメンテナンスだ。新しいスキルやツールを追加するたびに、explorer 側にも同じリストを足さないといけなくなる。役割の分離は、引き続きプロンプトの指示で行うことにした。スキルには「explorer は読み取り専用。ファイルの変更は fixer だけ」とだけ書いてある。</p>
<h2 id="動作確認で見つかった3つの問題">動作確認で見つかった3つの問題</h2>
<p>切り替えて実際に調査と実装を委譲してみて、3つの問題が見つかった。どれも最終版の構成で解消した。</p>
<h3 id="1-拡張の起動ごと再インストール">1. 拡張の起動ごと再インストール</h3>
<p>最初の版は、委譲先に専用の拡張構成を指定していた。すると起動のたびに拡張のインストールが走り、136パッケージを9秒かけて入れ直すログと、<code>allow-scripts</code> の警告が並んだ。スキル定義の衝突表示も出た。</p>
<p>対処は、委譲先も通常の pi 構成にすることだ。拡張とスキルの自動ロードに任せ、コマンドから拡張指定を外した。スキルには「委譲先は通常の pi の拡張・スキル・ツールを使う」とだけ書く。これで再インストールも警告も消えた。</p>
<h3 id="2-権限の確認ダイアログ">2. 権限の確認ダイアログ</h3>
<p>pi は本体には権限ダイアログを持たず、<a href="https://github.com/gotgenes/pi-packages/tree/main/packages/pi-permission-system" target="_blank" rel="noopener">pi-permission-system</a>
 という拡張が <code>allow / ask / deny</code> の判定と確認UIを足している。委譲先でも <code>ask</code> 判定のたびにダイアログが出て、往復が増えた。</p>
<p>これをスキルで回避しようとすると、スキルが肥大化する。設定で解決した。<code>yoloMode: true</code> にして、<code>ask</code> だけ自動承認にする。<code>rm -rf</code> や <code>sudo</code> などの <code>deny</code> ルールは残るので、危険操作の拒否は維持される。</p>
<h3 id="3-herdr-agent-read-に-thinking-が混ざる">3. herdr agent read に thinking が混ざる</h3>
<p>これがいちばん効いた気づきだ。pi は思考ログを端末に書くので、<code>herdr agent read</code> が推論をそのまま拾う。長い調査だと、報告本文の前に思考が混ざり、最終回答の切り出しに注意が要る。</p>
<p>対処として、委譲先の報告を必ず専用ブロックで終わらせるルールをスキルに足した。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">&lt;HERDR_RESULT&gt;
</span></span><span class="line"><span class="cl">結論と根拠
</span></span><span class="line"><span class="cl">&lt;/HERDR_RESULT&gt;
</span></span></code></pre></div><p>読み手は最後の完全な <code>HERDR_RESULT</code> ブロックだけを引き継ぎ結果として扱い、前の thinking や進行ログは無視する。ブロックが見えない場合は、作業をやり直させず最終回答だけを再出力させる。長すぎる調査報告も、調査の再実行ではなく短いブロックの再出力で対応する。</p>
<h2 id="残る制約">残る制約</h2>
<p>切り替え後、このスキルを前提にした <a href="https://github.com/j1nn0/skills/blob/main/skills/continuous-improvement-loop/SKILL.md" target="_blank" rel="noopener">continuous-improvement-loop</a>
 を作り、laravel-encrypted-s3 を <a href="https://packagist.org/packages/j1nn0/laravel-encrypted-s3" target="_blank" rel="noopener">v1.0.0-RC3</a>
 まで改善した。</p>
<p>調査と実装の委譲は、その自律改善ループの中で実際に回っている。</p>
<p>ただ、切り替えてからまだ1日だ。この記事で報告できるのは、動作確認で見つけた3つの問題と対処までで、長期運用の実績はまだない。</p>
<p>thinking の混入はブロック規約で回避しているが、オーケストレーターが読み取るコスト自体は残る。前回の記事で書いた「ハブ&amp;スポークのボトルネック」と「実装の待機時間」も、そのままだ。</p>
<h2 id="委譲先を選ぶときの基準">委譲先を選ぶときの基準</h2>
<p>スキルは <a href="https://github.com/j1nn0/skills" target="_blank" rel="noopener"><code>j1nn0/skills</code></a>
 で公開している。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">npx skills@latest add j1nn0/skills -s agent-orchestration
</span></span></code></pre></div><p>今回の変更で得た基準は一つ。「委譲先は、CLI の機能の多さで選ばない。役割とモデルを固定できるかで選ぶ」。調査と実装に必要なのは、モデルの指定と思考レベルの指定が確実に効くことだけだ。その2つが固定できるなら、CLI はオーケストレーターと同じ1本でいい。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
