<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja-JP">
  <generator uri="https://jekyllrb.com/">Jekyll</generator>
  <link href="https://kanfu-panda.github.io/ja/feed.xml" rel="self" type="application/atom+xml" />
  <link href="https://kanfu-panda.github.io/ja/" rel="alternate" type="text/html" hreflang="ja" />
  <updated>2026-08-31T21:52:56+08:00</updated>
  <id>https://kanfu-panda.github.io/ja/feed.xml</id>
  <title type="html">カンフーパンダのブログ</title>
  <subtitle>テクノロジー好き開発者の個人ブログ。</subtitle>
  <author><name>kanfu-panda</name></author>
  <entry xml:lang="ja-JP">
    <title type="html">pdlc-skills はどうやって無人で回すのか</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/08/31/run-pdlc-unattended.ja.html" rel="alternate" type="text/html" title="pdlc-skills はどうやって無人で回すのか" />
    <published>2026-08-31T00:00:00+08:00</published>
    <updated>2026-08-31T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/08/31/run-pdlc-unattended.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/run-pdlc-unattended-cover-ja.png" />
    <summary type="html">一つの機能なら、コマンド一本で TDD・実装・レビューまで自分で走り切ります。スクリプトが要るのはその外側——十数個の機能点を依存関係でバッチに分け、一バッチ終わるごとに人が確認してから次を起動する。支えているのは四つのガードレールで、どれも実際に作動する場面を見ています。</summary>
    <category term="AIエンジニアリング" />
    <category term="プロンプトエンジニアリング" />
    <category term="Loop工学" />
    <category term="Graph工学" />
    <category term="PDLC" />
    <category term="ClaudeCode" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/08/31/run-pdlc-unattended.ja.html"><![CDATA[<blockquote>
  <p>最初の機能を通したあと、すぐ次の問題にぶつかります。各ステージごとに止まってこちらの承認を待つので、結局は画面の前に張りついたままです。<strong>一周ずつ自分で進めてもらい、その間こちらは別の作業をする——それはできるのか。</strong> できます。ただし「自分で走る」と「一歩ごとに振り返って訊く」の差は、見た目より大きいものでした。</p>
</blockquote>

<h2 id="あのとき回っていたのは-loop-ではなかった">あのとき回っていたのは loop ではなかった</h2>

<p>自分のマシンで完全な loop を回したことがあります。とても順調で、60 本あまりの PR を一気に片づけるあいだ、一度もこちらに訊いてきませんでした。だから別のマシンで回し直したとき、ほとんど即座に違和感がありました。</p>

<p>そのときは AI に<strong>同じセッションの中で</strong>「各ステージを自分でループして進める」ようお願いしていました。確かに前へは進むのですが、一歩ごとにこちらへ戻ってきます。この設計でいいですか。次に進めますか。続けましょうか。</p>

<p>そのとき私が言ったのは、だいたいこういうことです。<strong>この loop、前に使っていたものと何か違いませんか。普通の loop はこういう無駄なことを訊き返さず、仕事が終わるまで走り続けます。</strong></p>

<p>問題は訊くこと自体ではなく、<strong>訊いてくる内容がすべて決着済みだ</strong>という点です。PRD も決まり、設計も決まり、テストの書き方も決まっている。それでも確認しに戻ってくる。この種の確認は私を椅子に縛りつけるだけです。次に呼び戻されるのが三分後なのか三十分後なのか分からないので、ほかの作業に移れません。</p>

<p>表面上はループしていますが、実際には私が伴走させられていただけです。</p>

<p>これではっきりしました。<strong>偽の loop と本物の loop を分ける線は一本だけ——ループの制御権を誰が握っているか。</strong></p>

<p><img src="/assets/images/posts/run-pdlc-unattended-fig-fake-vs-real-ja.png" alt="偽の loop と本物の loop の四点比較：ループがセッション内にあるかコードが駆動しているか、各周のコンテキストがクリーンか、問題が起きたら人に訊くかガードレールで処理するか、停止判断がモデルの感触かディスク上の状態か" /></p>

<p>モデルが賢いかどうかは関係ありません。プロンプトに「自律的に完了させ、中断しないでください」と書いたかどうかも関係ありません。制御権がモデルの意思の側にあれば偽物、コードの側にあって初めて本物です。</p>

<h2 id="機能一つならコマンド一本で足ります">機能一つなら、コマンド一本で足ります</h2>

<p>先に譲れない前提から。<strong>PRD と設計は人が通し切ること。設計が確定してからでなければ loop に入れません。</strong></p>

<p>ループが速くするのは <code class="language-plaintext highlighter-rouge">TDD → 実装 → レビュー</code> という収束の区間であって、「何を作るのかを考え切る」ところではありません。この機能をやるべきか、境界をどこに引くか、いくつに分けるか——どれも判断であって、終了コードを返してくれるコマンドは存在しません。</p>

<p>そこを通したあとは、コマンド一本で済みます。</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/pdlc-loop-run F20260825-XXXXXX
</code></pre></div></div>

<p>その機能が今止まっているステージから始めて、<code class="language-plaintext highlighter-rouge">tdd → implement → review</code> を自動で進め、レビュー完了に達するか、詰まって停止するまで走ります。各ステージは新しい subagent に渡され、戻ってきたら状態機械を読んで、進めるか・止めるか・人に返すかを決めます。既定の上限は 4 ステップです。</p>

<p><strong>前提として、前回の <code class="language-plaintext highlighter-rouge">test-commands.yml</code> が設定済みであること。</strong> 停止判断は実際にコマンドを走らせた終了コードに依っているので、あのファイルがなければ走らせるコマンドもありません。前回のあの一歩を飛ばすと、ここで書いていることはすべて空回りになります。</p>

<p>このコマンドが肩代わりしてくれるのは、最初に手作業で試して失敗した、まさにその部分です。<strong>「もう一周やるかどうか」の決定を、モデルの手から取り上げる。</strong> それを三つの設計が支えています。</p>

<p><img src="/assets/images/posts/run-pdlc-unattended-fig-one-round-ja.png" alt="一周の三拍子：次を訊く（出力はホワイトリストを通す）、その一歩をやる（クリーンなコンテキスト）、状態ファイルを読んで停止を判断する。プラグイン内の実行も外部スクリプトも同じ拍子で回る" /></p>

<p><strong>一つめ、制御フローはコードにあり、モデルの頭の中にはない。</strong> 各周でモデルに訊くのは二つだけです。次はどのコマンドか、そしてその一歩を終わらせること。前者の答えはさらにホワイトリストを通り、五つの語しか認められません。一文字でも説明が混じれば濾し取られます。<strong>モデルが余計なことを言っても意味がありません。下流がそれを読まないからです。</strong></p>

<p><strong>二つめ、各ステージはクリーンなコンテキストから始まる。</strong> 前のステージの迷い、誤解、自分で引き込んだ脱線は、次のステージへ持ち越されません。ステージをまたいで残す必要のあるものは、すべてディスク上の状態機械ファイルにあります——第 3 回で扱ったあのファイルです。<strong>セッションは死んでも、状態は失われません。</strong></p>

<p><strong>三つめ、停止判断はファイルを読む。モデルの言い分は読まない。</strong> 一歩終わるごとに、ループは「通ったと思いますか」とは訊かず、<code class="language-plaintext highlighter-rouge">last_phase_result.ok</code> を読みます。実際にコマンドを走らせた結果がディスクに落ちたものです。第 3 回のあの二つの枠のうち、<strong>停止判断が使うのは実行結果だけを入れる方の枠</strong>です。</p>

<h2 id="機能が十数個になってはじめて外部スクリプトの出番です">機能が十数個になって、はじめて外部スクリプトの出番です</h2>

<p><code class="language-plaintext highlighter-rouge">/pdlc-loop-run</code> はプラグイン内で走るので、機能一つの短い収束に向いています。自分で bash のループを書くこともできます——各周が本当に独立したプロセスになるぶんコンテキストの隔離は厳密で、長時間の実行にも強い——けれども<strong>そのやり方で機能点を一つ回すだけなら、あまり意味がありません</strong>。<code class="language-plaintext highlighter-rouge">/pdlc-loop-run</code> と同じ仕事を、プロセス境界だけ変えてやっているからです。</p>

<p>スクリプトの本当の居場所は一段外側です。第 3 回で二段構造を描きました。作業を N 個の比較的独立した機能点に分け、外側が機能点ごとにループを一本ずつ、それぞれ自分の worktree で起こす。外側がやるのはループの起動・結果の回収・次バッチの投入であって、個々の機能のステージを進めることではありません。今回はその外側をどう並べるかを補います——<strong>依存関係でバッチに分ける</strong>、です。</p>

<p>以前のあるプロジェクトは機能点が十数個あり、三つのバッチに分けました。<strong>まず土台、次にほかから依存されている機能、最後に互いに無関係な独立機能をまとめて全部。</strong> 各バッチの中は並列で走らせ、一バッチ終わるごとに人が確認し、それから次のバッチを起動して、順に全体を収束させていきます。</p>

<p><img src="/assets/images/posts/run-pdlc-unattended-fig-batches-ja.png" alt="十数個の機能点を依存関係で三バッチに分ける：土台、依存されている機能、互いに無関係な独立機能を一度に。バッチ内は並列、バッチとバッチのあいだに人の確認が入る" /></p>

<p>順序は逆にできません。土台が立っていなければ後ろはすべて砂上の楼閣ですし、依存されている側が終わらなければ、依存する側はただ待つだけです。最後のバッチは誰も待たないので、まとめて全部開くのがいちばん効率的です——機能 ID が「日付＋時分秒」なのはもともと並列のためで、同時に走らせても衝突しません。</p>

<p>はっきりさせておくと、<strong>このバッチ編成の層は私が自分で組んだもので、pdlc が用意しているものではありません。</strong> pdlc が与えるのは「機能点一つがどう自力で走り切るか」と、<code class="language-plaintext highlighter-rouge">/pdlc-relate</code> の依存グラフで誰が誰に依存しているかを見えるようにすることです。どう分けるか、一バッチに何個入れるかは、依然として判断であり、依然としてループの外側にあります。</p>

<h2 id="四つのガードレールどれも実際に効く場面を見ています">四つのガードレール、どれも実際に効く場面を見ています</h2>

<p>ガードレールを文書に書くだけなら誰にでもできます。見るべきなのは、それが実際に作動したことがあるかどうかです。</p>

<p><img src="/assets/images/posts/run-pdlc-unattended-fig-guardrails-ja.png" alt="四つのガードレールそれぞれの仕組みと、実際に作動した記録：ハード予算は二回、fail-stop は日常の受け皿、blocked エスカレーションは一回、ステップ上限は一回" /></p>

<h3 id="-ハード予算各周の---max-budget-usd">① ハード予算：各周の <code class="language-plaintext highlighter-rouge">--max-budget-usd</code></h3>

<p>各周のプロセスに上限を置き、使い切ったら<strong>プロセスごと打ち切られます</strong>。交渉の余地はありません。これは外部スクリプト形態では必須の設定です。</p>

<p><strong>これは一度の実行で二回作動しました。</strong> 最初の周は上限を 5 にしていて、実装の途中で断ち切られました。ディスク上の作りかけを確認し、続きから再開できると分かったので上限を 8 に上げて再実行——また上限に当たり、最終的に 12 で走り切りました。</p>

<p>断ち切られた瞬間について言うべきことは一つです。<strong>ディスク上のものは無傷でした。</strong> ドキュメントは書き出され、状態機械には記録が残り、失ったのは「この周が終わらなかった」ことだけで、「全部やり直し」ではありません。ディスクへ書き出すことと記録を残すことが、乱暴なプロセス停止を、続きから再開できる中断に変えています。</p>

<p><img src="/assets/images/posts/run-pdlc-unattended-fig-budget-cut-ja.png" alt="予算で断ち切られた一周：プロセスは止まっても、ディスク上のドキュメントと状態機械は無傷で、次の周は最初からではなくその場から再開できる" /></p>

<p>数字が誤解されないように一つ断っておきます。<strong>5・8・12 は私が各周に設定した上限であって、実際に支払った金額ではありません。</strong> 私はサブスクリプションで週あたりの量で計算される形態ですし、そもそも API の単価はベンダーごとに違います。この三つの数字は「だいたいこのくらいの規模」という目安として見てください。実際のコストを出したいなら、トークン消費量を見て、ご自身が使っているベンダーの公式価格で見積もるほうが正確です。</p>

<h3 id="-と-ok-でなければ止まるステップを使い切っても止まる">② と ④：ok でなければ止まる、ステップを使い切っても止まる</h3>

<p><strong>fail-stop</strong> が受け止めるのは、いちばん見落とされやすい種類の不良です。<strong>失敗したステージが、次の周に「完了済み」として踏み越えられる</strong>というもの。一度踏み越えられると、以降の各周は偽の前提の上に積み上がり、長く走るほど深く狂っていきます。しかも全行程が緑のままです。</p>

<p><strong>ステップ上限</strong>が防ぐのは振動です。壊す→直す→また壊す、と各周が作業しているように見えて、実際はその場で足踏みしている状態。既定の 4 ステップ＝収束の三段＋予備の一段。私は一度、保守的に 1 に設定して試し、予定どおり停止しました。</p>

<h3 id="-blocked-エスカレーション止まるべきときに本当に止まりました">③ blocked エスカレーション：止まるべきときに本当に止まりました</h3>

<p>レビューでプロダクトの判断が要る問題が見つかると、状態機械に <code class="language-plaintext highlighter-rouge">blocked</code> を書き、停止して人を待ちます。</p>

<p><strong>これが実際に作動した一回で、この仕組みは信用できると思えました。</strong></p>

<p>レビュー中、その周で追加された三つの設定フィールドが、<strong>バックエンドのどこからも消費されていない</strong>ことが見つかりました。コードは正しく、テストも緑です。これはバグではなく、プロダクトレベルの欠落でした。フィールドを削るべきなのか、それとも経路が未完成で足すべきなのか。<strong>これは AI が私の代わりに決めていい問いではありません。</strong></p>

<p>推測もせず、テストを緑に保つためにフィールドをこっそり消すこともせず——<code class="language-plaintext highlighter-rouge">blocked</code> を書き、停止し、問いをこちらへ返してきました。私はフィールドを残して消費経路を足すと決め、続きを走らせました。再レビューでは思わぬおまけもありました。その経路実装に紛れていた本物のバグを 2 件、ついでに直していったのです。</p>

<p>止まるべきところで止まり、見るべきところを見た。私が欲しかったのはこれです。</p>

<h2 id="この一回で何が出てきたか">この一回で何が出てきたか</h2>

<p>対象はあるコンソール系プロジェクトの三期分の反復で、バックエンドのエンドポイント群が 4 つ、フロントエンドのページが 3 つ、それに通知ルール一式。<code class="language-plaintext highlighter-rouge">TDD → 実装 → レビュー</code> を最初から最後まで無人で走り切り、<strong>テストは 301 件すべて通過、カバレッジは 87% 超</strong>でした。</p>

<p>人が関与したのは全部で三回だけ。予算を延長するときの確認判断が二回と、blocked のときのプロダクト判断が一回です。</p>

<p><img src="/assets/images/posts/run-pdlc-unattended-fig-run-summary-ja.png" alt="ある午後のタイムライン：設計確定のあと TDD・実装・レビューの三段を無人で走り、実装の区間で予算により二回断ち切られ、レビューの区間で人の判断のため一回停止し、レビュー完了で人に戻して終わる" /></p>

<p>これは午後一回分の仕事量で、実際以上に大きく語るつもりはありません。ただ loop のあいだ、それは私に対して完全に沈黙していました。戻ってきて目にするのは「次のこれをやりますか」の列ではなく、一つの終状態です。<strong>速いことが本質ではありません。私がその場にいなくてよい、というのが本質です。</strong></p>

<h2 id="人と機械の自動化の境界">人と機械の自動化の境界</h2>

<p>判断基準は第 2 回から変わっていません。<strong>自動でエラーを見つけられるものだけを、ループに渡す。</strong> この線で引くと、永久に渡せないものが二つあります。</p>

<ul>
  <li><strong>何を作るのかを考え切ること（人の判断が要る）。</strong> PRD と設計は人が通すこと。これは loop に入るための前提であって、推奨事項ではありません。</li>
  <li><strong>リリース。</strong> ループの終状態はレビュー完了で、そこで止まり、出すかどうかは人が決めます。<code class="language-plaintext highlighter-rouge">--autonomous</code> はリリースとデプロイには一切効きません——出してしまえば取り戻せないからです。</li>
</ul>

<p>ここまでが「どの作業を渡せるか」の線引きです。これと対になる問いがもう一つあります。<strong>渡したあと、暴走しない保証はどこから来るのか。</strong></p>

<p>第 1 回でプロンプトエンジニアリングを扱ったとき、その層の天井をこう書きました。それはソフトな制約であり、モデルが完全に従うとは限らず、その場で気づけるとも限らない、と。当時はただの原則でしたが、今回それに実例が付きました。</p>

<p>「節約して、消費に気をつけて」とプロンプトに書くのは簡単ですが、それはプロンプト層のやり方です——導くことはできても、保証はできません。<code class="language-plaintext highlighter-rouge">--max-budget-usd</code> はプロセス層のやり方で、何が書かれているかを読まず、上限で切ります。今回の二度の超過は、二度とも後者に止められたのであって、前者に諭されたのではありません。</p>

<p><strong>「導きはするが保証しない」ものは、最終的にどれも一段上へ移すことになります。</strong> 今回はプロセスの引数まで移りました。</p>

<h2 id="次回">次回</h2>

<p>この記事から一つだけ持ち帰るとしたら、これにしたいと思います。<strong>loop が本物か偽物かを見分けるには、一点だけ見ればいい——制御フローがコードの側にあるのか、モデルの意思の側にあるのか。</strong> 振り返って訊いてくるループは、ループではありません。</p>

<p>次回は<strong>品質</strong>の話です。このパイプラインは速く、見張りも要らない。ではその産物は何を根拠に信用できるのか。テストの赤信号ゲート、レビューのゲート、カバレッジがそれぞれ何を止めていて、合わせても何を止められないのかを扱います。</p>

<hr />

<p><strong>試してみる</strong>：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-fsSL</span> https://raw.githubusercontent.com/kanfu-panda/pdlc-skills/main/install.sh | bash <span class="nt">-s</span> <span class="nt">--</span> <span class="nt">--global</span>
</code></pre></div></div>

<p>リポジトリはこちら：https://github.com/kanfu-panda/pdlc-skills</p>

<p>役に立ったら star をいただけると励みになります ⭐</p>

<hr />

<p>この四つのガードレールは、あの実行の記録をそのまま一つずつ書き起こしたものです。断ち切られたところも、詰まったところも含めて。「なるほど、これは信用できそうだ」と思ってもらえたなら、いいねで教えてください。ご自身で loop を回したことがある方は——うまくいった話でも、こじれた話でも——コメント欄でぜひ聞かせてください。</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">pdlc-skills を自分のプロジェクトで動かすには</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/08/30/run-pdlc-in-your-project.ja.html" rel="alternate" type="text/html" title="pdlc-skills を自分のプロジェクトで動かすには" />
    <published>2026-08-30T00:00:00+08:00</published>
    <updated>2026-08-30T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/08/30/run-pdlc-in-your-project.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/run-pdlc-in-your-project-cover-ja.png" />
    <summary type="html">入れるのは一行で済みます。本当に詰まるのはその次の一歩——新規プロジェクトか、既存のコードベースか、すでに導入済みかで、最初のコマンドがまったく違います。そして飛ばされがちな一手があります。それを飛ばすと、前回の「客観的な停止判定」はモデルの自己満足に丸ごと退化します。</summary>
    <category term="AIエンジニアリング" />
    <category term="プロンプトエンジニアリング" />
    <category term="Loop工学" />
    <category term="Graph工学" />
    <category term="PDLC" />
    <category term="ClaudeCode" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/08/30/run-pdlc-in-your-project.ja.html"><![CDATA[<blockquote>
  <p>前の三回は図面でした。三層がそれぞれ何で、どこに落ち、どう噛み合うか。今回は向きを変えます——<strong>その図面を自分のプロジェクトに落とす</strong>回です。読み終えたら、導入できて、どのコマンドから始めればいいか分かって、機能を一つ最後まで通せるはずです。途中に飛ばされがちな一手があるので、そこだけ独立して扱います。飛ばすと前回の設計が丸ごと空回りするからです。</p>
</blockquote>

<p>理論の部分はだいたい話し終えました。ここからは pdlc-skills が実際のプロジェクトの中でどう回るのかを見ていきます。</p>

<p>多くの人がまず同じ疑問を持ちます。先にテストを揃えるべきか。ドキュメントを先に全部書くのか。二、三年動いていて、コードが積み上がっていて、誰もあまり触りたがらない古いプロジェクトを取り込むとしたら、初日から技術的負債の返済が要るのか。</p>

<p>先に答えを言います。<strong>どれも要りません。導入は一行、一分で終わります。</strong></p>

<p>本当に詰まるのは別のところです——導入し終わったあとの「で、次は？」。私が最初のプロジェクトを取り込んだときも、<code class="language-plaintext highlighter-rouge">/pdlc-</code> で始まるコマンドが一画面に並んでいるのを眺めたまま、どれを打てばいいのか分からず固まりました。この記事はその「で、次は？」に答えるものです。どのコマンドから始めるのか、そして絶対に飛ばしてはいけないのはどの一手か。</p>

<h2 id="導入一行のコマンド二つの置き場所">導入：一行のコマンド、二つの置き場所</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># グローバル：このマシンの全プロジェクトで使える</span>
curl <span class="nt">-fsSL</span> https://raw.githubusercontent.com/kanfu-panda/pdlc-skills/main/install.sh | bash <span class="nt">-s</span> <span class="nt">--</span> <span class="nt">--global</span>

<span class="c"># プロジェクト単位：このリポジトリの中だけで効く</span>
curl <span class="nt">-fsSL</span> https://raw.githubusercontent.com/kanfu-panda/pdlc-skills/main/install.sh | bash <span class="nt">-s</span> <span class="nt">--</span> <span class="nt">--project</span> /path/to/my-project
</code></pre></div></div>

<p>前の三回で出していたのはずっとグローバルのほうでした。いちばん短く、失敗しにくいからです。ここでは<strong>どんなときにプロジェクト単位が効くか</strong>を書きます。</p>

<p>二つの違いは置き場所だけです。<code class="language-plaintext highlighter-rouge">~/.claude/plugins/pdlc/</code> か、<code class="language-plaintext highlighter-rouge">&lt;プロジェクト&gt;/.claude/plugins/pdlc/</code> か。ただしそこから来る差は実際的です——プロジェクト単位で入れると、<strong>バージョンがリポジトリについて回ります</strong>。チームの誰かが clone すれば手元と同じバージョンになりますし、複数のプロジェクトを並行して開いていても、一度のグローバル更新で全部が同時に動いてしまうことがありません。</p>

<p>一人、一台、プロジェクトもそう多くない——ならグローバルで十分です。悩む必要はありません。</p>

<p>入ったかどうかは二段階で確認します。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">ls</span> ~/.claude/plugins/pdlc/            <span class="c"># グローバルで入れた場合</span>
<span class="nb">ls</span> &lt;プロジェクト&gt;/.claude/plugins/pdlc/  <span class="c"># プロジェクト単位で入れた場合</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">skills/</code> <code class="language-plaintext highlighter-rouge">references/</code> <code class="language-plaintext highlighter-rouge">VERSION</code> あたりが見えていれば大丈夫です。あとは Claude Code で <code class="language-plaintext highlighter-rouge">/pdlc-</code> と打って、候補に 38 個のコマンドが並べば導入完了です。</p>

<p><img src="/assets/images/posts/run-pdlc-in-your-project-fig-scopes-ja.png" alt="二つの置き場所：グローバルはホーム配下から全プロジェクトを、プロジェクト単位はリポジトリ内でそこだけを受け持つ" /></p>

<h2 id="あなたはどの出発点にいるか">あなたはどの出発点にいるか</h2>

<p>38 個が一度に並ぶと確かに気後れしますが、<strong>最初に覚えるのは三つだけで十分</strong>です。どれを選ぶかは、いま手元に何があるかで決まります。</p>

<table>
  <thead>
    <tr>
      <th>出発点</th>
      <th>最初のコマンド</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>新規プロジェクト、コードはまだ無い</td>
      <td><code class="language-plaintext highlighter-rouge">/pdlc-bootstrap</code></td>
    </tr>
    <tr>
      <td>既存プロジェクト、コードは山ほどある</td>
      <td><code class="language-plaintext highlighter-rouge">/pdlc-adopt scan</code></td>
    </tr>
    <tr>
      <td>すでに導入済み、日々の開発</td>
      <td><code class="language-plaintext highlighter-rouge">/pdlc-feature</code></td>
    </tr>
  </tbody>
</table>

<p><strong>新規プロジェクト</strong>は <code class="language-plaintext highlighter-rouge">/pdlc-bootstrap</code> です。一行の説明を渡すと、技術スタックを選び、ディレクトリの骨組みとドキュメントの下書きを作ります。「X を作りたい」がまだ着想の段階のときに向いています。</p>

<p><strong>既存プロジェクト</strong>が大半の人の状況で、いちばん見てほしい行でもあります。最初のコマンドは <code class="language-plaintext highlighter-rouge">/pdlc-adopt scan</code>。そして <strong>scan は全工程が読み取り専用</strong>です——技術スタック、サービス構成、データベース、既存テストを調べて、導入レポートとヘルスチェックを出すだけで、<strong>一バイトも書き換えません</strong>。</p>

<p>この設計は機能そのものより語る価値があると思っています。動いている古いコードを AI に触らせるのは、誰だって躊躇します。だから「見る」と「触る」を二つのコマンドに割りました。まず <code class="language-plaintext highlighter-rouge">scan</code> でレポートを出し、読んで納得してから <code class="language-plaintext highlighter-rouge">/pdlc-adopt init</code> でベースライン文書を生成する。試すコストがゼロになります。</p>

<p><img src="/assets/images/posts/run-pdlc-in-your-project-fig-three-starts-ja.png" alt="三つの出発点がそれぞれ最初のコマンドを通り、同じ本流に合流する" /></p>

<h2 id="ここだけは飛ばさない先に何をもって通ったとするかを決める">ここだけは飛ばさない：先に「何をもって通ったとするか」を決める</h2>

<p><strong>この記事でいちばん重要な節です。</strong></p>

<p>前回、状態ファイルの二つの枠の話をしました。一つ目の枠に入れてよいのは<strong>実際にコマンドを走らせて得た終了コードだけ</strong>で、モデルの自己申告は二つ目の枠に切り離され、停止判定には決して関与しません。</p>

<p>すると疑問が出ます——<strong>その「コマンド」はどこから来るのか。</strong></p>

<p>答えが <code class="language-plaintext highlighter-rouge">/pdlc-test-setup</code> です。やることは四つ。技術スタックの探索、コマンドが本当に走るかを一つずつ検証、<code class="language-plaintext highlighter-rouge">docs/00_standards/test-commands.yml</code> への書き込み、そしてテストディレクトリとローカルフックの用意。</p>

<p>リポジトリはこの一手の位置づけをはっきり書いています。全体の急所は「checks は終了コードしか認めず、モデルの自己申告は絶対に使わない」であり、<strong>しかしそこに至るまで、このファイルを立ち上げてくれるものは何も無い。それが無ければ客観化の経路まるごとが空になる</strong>、と。</p>

<p>ここには譲れない規律が一つあります。<strong>このファイルに書き込むコマンドは、必ず一度は実際に走らせ、終了コードを自分の目で見ていること</strong>。推測で書いたものは載せません。理由は、私がいちばん注目に値すると思っている一文です——</p>

<blockquote>
  <p>「一見正しそうだが走らない」コマンドは、<strong>空にしておくより悪い</strong>。</p>
</blockquote>

<p>空なら、下流はこの段階に判定材料が無いと理解して、素直に空のままにします。走らない偽のコマンドは、各段階に偽の checks を渡し、それでもレポートは緑になります。この理屈には鏡像もあります。<strong>最も危険な「自動修復」は、いったん立っていたが壊れたチェックを黙って空にすること</strong>——ゲートはその場で緩み、こちらからは見えません。</p>

<p>では飛ばすとどうなるか。走らせるコマンドが無い → 一つ目の枠は規約上どうしても空 → 停止判定に根拠が無い → 「客観的な検証」だと思っていたものが、最初からずっとモデルの自己満足だった、ということになります。<strong>前回の設計の土台は、この一手にあります。</strong></p>

<p>ついでに言うと、このファイルは古くなります。スクリプトの改名、ツールの世代交代、サブプロジェクトの増減で実態とずれます。張り付いて見ている必要はありません。下流の段階が「コマンドが走らない」に出くわすと知らせてくれるので、そのときに <code class="language-plaintext highlighter-rouge">/pdlc-test-setup --refresh</code> を回せば十分です。</p>

<p><img src="/assets/images/posts/run-pdlc-in-your-project-fig-foundation-ja.png" alt="test-commands.yml が立って初めて、前回の「実際に走らせた結果しか入らない」枠に入れるものができる" /></p>

<h2 id="最初の機能を通す">最初の機能を通す</h2>

<p>土台ができたら、着手は一言で済みます。</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/pdlc-feature ログインに電話番号認証を追加
</code></pre></div></div>

<p>あとは PRD → 設計 → TDD → 実装 → レビューと進み、各段階で一度止まって引き継ぎます。バグ修正も同じ形で <code class="language-plaintext highlighter-rouge">/pdlc-fix</code>、いまどこまで来たかを見たいなら <code class="language-plaintext highlighter-rouge">/pdlc-status</code>。</p>

<p><strong>日常はこの三つで足ります。</strong> 残りの 35 個は細かく制御したくなったとき——設計の段階だけやり直したい、コードレビューだけ一度かけたい、データベース設計を足したい——に掘りにいくものです。そのとき探せば間に合います。</p>

<h2 id="ディスクに増えるものgit-に入れるべきもの">ディスクに増えるもの、git に入れるべきもの</h2>

<p>一周まわると <code class="language-plaintext highlighter-rouge">docs/</code> の下に一式のディレクトリが増えます。要件、設計、テスト、デプロイ、レビューがそれぞれの位置に並び、加えて <code class="language-plaintext highlighter-rouge">docs/.pdlc-state/</code> に機能ごとの JSON が一つずつ入ります。</p>

<p>前者は文書なので、コミットするかは好みで構いません。ただし一つだけ、<strong>必ず入れるべきもの</strong>があります。</p>

<p><strong><code class="language-plaintext highlighter-rouge">docs/.pdlc-state/</code> は git にコミットしてください。<code class="language-plaintext highlighter-rouge">.gitignore</code> に入れてはいけません。</strong></p>

<p>見た目はキャッシュそのものです。ドット始まりのディレクトリに、機械が読む JSON の束。つい素通りしたくなります。しかしこれはキャッシュではなく、<strong>引き継ぎ物</strong>です。セッションを変える、マシンを変える、人が変わって引き継ぐ——そのときに「この機能はどこまで進んで、前の段階は通ったのか」を言えるのは、これしかありません。git に入れないのは、セッションを開き直すたびに記憶を失うのと同じですし、チームでは相手からこちらの進捗が見えません。</p>

<p>リポジトリはこれを「プロジェクト納品の監査記録」と位置づけています。監査記録として扱えば、無視しようとは思わなくなります。</p>

<p><img src="/assets/images/posts/run-pdlc-in-your-project-fig-tree-ja.png" alt="一周まわったあとの docs ディレクトリ。状態機械のディレクトリを「git に必須」と明示" /></p>

<h2 id="既存プロジェクトを取り込むときの二つの規律">既存プロジェクトを取り込むときの二つの規律</h2>

<p>古いコードベースから入ってきた場合、単独で知っておく価値のある規律が二つあります。この二つが、そもそも現実的かどうかを決めるからです。</p>

<p><strong>一つ、文書だけを作り、コードには触らない。</strong> 取り込みの過程で業務コードは一行も変更せず、ベースライン文書を逆生成するだけです。</p>

<p><strong>二つ、増分で取り込む。</strong> 既存コードはまとめて「ベースライン済み」と印を付け、<strong>新しい機能だけが完全なフローを通ります</strong>。過去の負債を先に返せとは言われません。</p>

<p>効いているのは二つ目です。プロセス系のツールが初日に死ぬのを何度も見てきました。取り込んだ途端に既存の違反が数百件出て、その数字を見た時点で人は諦めます。既存を囲って新規だけ管理する——それがこのフローに二日目を迎えさせる条件です。</p>

<h2 id="使わないほうがいい場面">使わないほうがいい場面</h2>

<p>境界も書いておきます。使い捨てのスクリプト、動かして消すデモ、純粋なドキュメントリポジトリ——そこでは使わないほうがいい。プロセスのコストが回収できません。これは長く生き、引き継がれ、品質に責任を負うプロジェクトのためのものです。</p>

<p>判断は単純です。<strong>このプロジェクトを三か月後に開く人がいるか。</strong> いるなら価値があり、いないなら手を出さないほうがいい。</p>

<h2 id="ひと通りそのままなぞる">ひと通り、そのままなぞる</h2>

<p>ここまでを一枚のリストに畳みます。そのまま実行できます。</p>

<ol>
  <li><strong>入れる</strong>：<code class="language-plaintext highlighter-rouge">curl … | bash -s -- --global</code>（複数プロジェクトやチーム作業なら <code class="language-plaintext highlighter-rouge">--project &lt;パス&gt;</code> に替える）</li>
  <li><strong>確かめる</strong>：<code class="language-plaintext highlighter-rouge">ls ~/.claude/plugins/pdlc/</code>、そして Claude Code で <code class="language-plaintext highlighter-rouge">/pdlc-</code> を打って 38 個並ぶか見る</li>
  <li><strong>出発点を見極める</strong>：新規なら <code class="language-plaintext highlighter-rouge">/pdlc-bootstrap</code>、既存なら <code class="language-plaintext highlighter-rouge">/pdlc-adopt scan</code> でレポートを読み、納得したら <code class="language-plaintext highlighter-rouge">/pdlc-adopt init</code></li>
  <li><strong>土台を立てる</strong>：<code class="language-plaintext highlighter-rouge">/pdlc-test-setup</code>——<strong>ここは飛ばさない</strong>。以降の「通ったかどうか」が本物か偽物かを決める一手です</li>
  <li><strong>着手する</strong>：<code class="language-plaintext highlighter-rouge">/pdlc-feature 一行の要件</code>、進捗はいつでも <code class="language-plaintext highlighter-rouge">/pdlc-status</code></li>
  <li><strong>コミットする</strong>：<code class="language-plaintext highlighter-rouge">docs/.pdlc-state/</code> も一緒に入れる</li>
</ol>

<p>4 だけが「後回しにできそうで、できない」ものです。あとは順番どおりで構いません。</p>

<h2 id="次回放っておいても自分で進めるのか">次回：放っておいても自分で進めるのか</h2>

<p>導入し、始め、土台を立て、最初の機能を通す——一本の線が終わりました。この記事から一つだけ持ち帰るとしたら、これにしたいと思います。<strong>走り出す前に「何をもって通ったとするか」を決めておく。</strong> 順序が逆になると、その後の自動化はすべて空回りになります。</p>

<p>次回はこの連載の本命です。<strong>導入も済み、動いてもいる。では、見張っていなくても一周ずつ自分で進められるのか。</strong> 収束ループの仕組み、契約、そして譲れない四つのガードレールを扱います——口で言い聞かせても Token 消費が止まらず、最後は硬い予算に受け止めてもらった、私自身の失敗も含めて。</p>

<hr />

<p><strong>試してみる</strong>：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-fsSL</span> https://raw.githubusercontent.com/kanfu-panda/pdlc-skills/main/install.sh | bash <span class="nt">-s</span> <span class="nt">--</span> <span class="nt">--global</span>
</code></pre></div></div>

<p>リポジトリはこちら：https://github.com/kanfu-panda/pdlc-skills</p>

<p>役に立ったら star をいただけると励みになります ⭐</p>

<hr />

<p>この記事は自分が実際にプロジェクトを取り込んだ順序どおりに書きました。詰まった箇所ほど言葉を足しています。通せたら教えてください。どこかで止まった場合もぜひ教えてください、次の版に反映します。</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">三大エンジニアリングは pdlc-skills の中でどう噛み合うのか</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/08/23/how-three-paradigms-interlock.ja.html" rel="alternate" type="text/html" title="三大エンジニアリングは pdlc-skills の中でどう噛み合うのか" />
    <published>2026-08-23T00:00:00+08:00</published>
    <updated>2026-08-23T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/08/23/how-three-paradigms-interlock.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/how-three-paradigms-interlock-cover-ja.png" />
    <summary type="html">三層は最初から最後まで一度も互いを呼び出しません。ディスク上の一つのファイルを介して引き継ぐだけです。そしてそのファイルが機能ごとに分かれているおかげで、このパイプラインは縦に一本走るだけでなく、横に広げて何本も同時に走らせられます。</summary>
    <category term="AIエンジニアリング" />
    <category term="プロンプトエンジニアリング" />
    <category term="Loop工学" />
    <category term="Graph工学" />
    <category term="PDLC" />
    <category term="ClaudeCode" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/08/23/how-three-paradigms-interlock.ja.html"><![CDATA[<blockquote>
  <p>前回の最後に物差しを一つ置きました。あるツールの三層が本当に結合しているかは、同じ状態を共有しているかで判断できる、と。今回はそれを具体的な形にします——<strong>三層は最初から最後まで一度も互いを呼び出していません</strong>。ディスク上の一つのファイルを介して引き継ぐだけです。さらに、当時は予想していなかった副作用もあります。そのファイルが機能ごとに分かれているおかげで、このパイプラインは縦に一本走るだけでなく、横に広げて何本も同時に走らせられます。</p>
</blockquote>

<p>前回は、三層が <a href="/ja/pdlc/">pdlc-skills</a> のどこに落ちているかを整理しました。全コマンドが共有するルールがプロンプト層、自動で前に進む区間が Loop 層、段階の順序と関係グラフが Graph 層です。</p>

<p>ただし、誰が何を担当しているかを知ることと、それらがどう組み合わさっているかを知ることは別の話です。</p>

<p>その流れで考えると、いちばん手っ取り早いのはコードの中で呼び出し行を探すことです。Graph はどこで Loop を呼んでいるのか、Loop はどこでプロンプト層を呼んでいるのか。しかし見つかりません——この三層が互いを参照している行は、一行も存在しないからです。</p>

<p>では、どうやって一緒に仕事をしているのでしょうか。</p>

<h2 id="鍵は呼び出しではなく効くタイミング">鍵は「呼び出し」ではなく「効くタイミング」</h2>

<p>三層が互いを知らなくて済むのは、<strong>そもそも効くタイミングが重なっていない</strong>からです。</p>

<table>
  <thead>
    <tr>
      <th>層</th>
      <th>いつ効くか</th>
      <th>何を決めるか</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Graph</td>
      <td>段階の<strong>境界</strong>で</td>
      <td>次の一歩に進んでよいか</td>
    </tr>
    <tr>
      <td>プロンプト</td>
      <td>一回の呼び出しの<strong>内側</strong>で</td>
      <td>今回モデルに何を見せるか</td>
    </tr>
    <tr>
      <td>Loop</td>
      <td>段階と段階の<strong>あいだ</strong>で</td>
      <td>もう一周いるかどうか</td>
    </tr>
  </tbody>
</table>

<p>たとえるなら、Graph は入口でチケットを切り、プロンプト層は会場の中で話し、Loop は場外で残り何公演かを数えています。三人は一度も口をきいていません。頼りにしているのは同じスコアボードです。</p>

<p>そのスコアボードが、ディスク上のあのファイルです。</p>

<p><img src="/assets/images/posts/how-three-paradigms-interlock-fig-timeline-ja.png" alt="三本のスイムレーンによる時間軸：Graph は段階の境界にだけ現れ、プロンプト層は各呼び出しの内側で展開し、Loop は二つの段階のあいだに位置する" /></p>

<h2 id="一つの機能を最後まで追いかける">一つの機能を最後まで追いかける</h2>

<p>抽象論はここまでにして、実際の機能を一拍ずつ追いかけます。</p>

<p><strong>第一拍、始動。</strong> 新しい機能が立ち上がった直後、ディスクには何もありません。この段階で受け止められるコマンドは一つだけ——要件を書くコマンドです。なぜか。他のコマンドはすべて、自分に必要な前段のドキュメントを宣言しているからです。設計には要件が要り、テストには設計が要る。前提条件がどれ一つ満たされていません。<strong>これは「まず要件を書きましょう」という助言ではなく、前段の成果物がなければこの扉を通れないという話です。</strong> ここで効いているのが Graph で、その仕事は「通すか通さないか」だけです。</p>

<p><strong>第二拍、作業。</strong> 扉を通るとGraph は退場し、場はプロンプト層のものになります。この一回の呼び出しでモデルが見るのは、そのコマンド自身の本文だけではありません。全コマンドが共有する一式のルール——成果物は必ずディスクに落とす、引き継ぐ前に必ず自己点検する、修正は一度だけで再帰しない——も一緒に見えています。これらのルールは一か所に書かれていて、呼び出し時に展開されます。各コマンドに書き写してあるわけではありません。</p>

<p>出てくるものも自由作文ではありません。ファイル名、置くディレクトリ、含まれる章立てはすべて決まっていますし、ドキュメントの先頭には小さな身元情報が付きます。どの機能に属し、どの段階にいて、前のドキュメントは何か。書式そのものは今回は展開しませんが、意味するところだけ言うと、<strong>成果物が自分の座標を持ち歩いている</strong>ということです。そこから遡れば最初の要件までひと続きに辿れます。</p>

<p><strong>第三拍、締めのディスク書き込み。</strong> ここがいちばん重要な一拍です。主な作業が終わっても流れは終わりではなく、コマンドはあのファイルに一行記録しなければなりません。この区間は終わった、出来はどうだった、次は誰が受け取るのか。このファイルはディスク上にあり、<strong>機能ごとに一つ</strong>です。</p>

<p><strong>第四拍、止めるかどうかの判定。</strong> ここで初めてループが出てきます。しかも読むのはあのファイルだけ——コードも成果物もチャット履歴も見ません。読んだうえで一つの結果を返します。次に走らせるコマンド名か、「完了」か、「詰まった」か。外側のスクリプトはその結果を受け取って次の一本を走らせ、走り終えるとまた第三拍に戻ります。</p>

<p>レビュー完了まで来るとループは停止し、「完了」を出して人を待ちます。リリースとデプロイは決してループの中に入りません——一度出したら引き戻せませんし、影響するのは本番の実ユーザーだからです。</p>

<p>つまり、この鎖の上で本当の引き継ぎは三か所しかなく、そこを渡っていくのはいずれも<strong>関数呼び出しではなく、一つの名前</strong>です。</p>

<ul>
  <li>Graph が呼び出しに渡すのは「担当する区間はここだ」；</li>
  <li>呼び出しがディスクに渡すのは「終わった、結果はこうだ」；</li>
  <li>ディスクがループに渡すのは「続けるかどうか」。</li>
</ul>

<p>三層のどれも、他のどれにも触れていません。</p>

<p><img src="/assets/images/posts/how-three-paradigms-interlock-fig-handoff-ja.png" alt="三つの引き継ぎ点：Graph はどの区間を担当するかを渡し、段階は締めに結果をディスクへ書き、ループはディスクから続行の可否を読み取る" /></p>

<h2 id="あのファイルで最も効いている設計">あのファイルで最も効いている設計</h2>

<p><strong>「実際に走らせて得たもの」と「モデルが自分で言っていること」は、別々の枠に入っています。</strong></p>

<p>一つ目の枠に入れてよいのは、本当にコマンドを走らせて得た結果だけです。テストが通ったか、カバレッジは足りているか、lint はきれいか——すべて終了コードから翻訳された真偽値です。走らせるコマンドがそもそも無い段階（ドキュメントしか作らない要件と設計の段階）なら、そこは空のままにします。「この区間はうまくいったと思う」という理由で「通った」と書き込むことは許されません。</p>

<p>二つ目の枠がモデルの自己点検で、何項目が通らなかったかだけを記録します。<strong>参考情報であり、止める判定には決して関与しません。</strong></p>

<p>違いはどこに出るか。ループの停止判定は一つ目の枠しか見ません。つまりモデルの自己申告は、「正直に報告してください」という一文ではなく、<strong>データ構造のレベルで停止判定の経路から外されている</strong>のです。二つ目の枠に何を書こうと、今回のラウンドが止まるかどうかは変わりません。</p>

<p>前回言った「三層が同じ状態を共有している」は、具体的にはこの枠のことです。</p>

<p><img src="/assets/images/posts/how-three-paradigms-interlock-fig-state-ja.png" alt="状態ファイルの二つの枠の違い：一方は実際に走らせたコマンドの結果だけを入れて停止を決め、もう一方はモデルの自己点検を参考として入れる" /></p>

<h2 id="本当のループは二段構えになっている">本当のループは二段構えになっている</h2>

<p>ここで一つ認めておきます。上で描いたループは、<strong>内側のループ</strong>でしかありません。</p>

<p>自分で実際に動かすときの形はこうです——</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>主管 agent：全体設計 → 互いに独立した N 個の機能に分割
    ↓
外側のスクリプト：機能ごとに一本ずつ起動
    ↓
内側のループ × N（それぞれ別の機能を担当）   ← 同時に走る
    ↓
それぞれ「レビュー完了」か「詰まった」で停止 → 人がまとめてリリースを判断
</code></pre></div></div>

<p>まず主管 agent が全体設計をして、やるべきことを互いに独立した複数の機能に分割します。外側のスクリプトが機能ごとに内側のループを一本ずつ起動し、それらが並行して進み、それぞれ自分の終点で止まる。最後に人が N 本の結果をまとめて見ます。</p>

<p><strong>なぜ同時に走らせて大丈夫なのか。</strong> 前提として、切り出したものが<strong>相対的に独立した機能</strong>でなければなりません。互いに依存がないからこそ同時に着手できます。その前提の上で、状態ファイルも機能ごとに分かれていて、一機能一ファイル、互いに依存しません。</p>

<p>機能 ID は「日付＋時分秒」で、その日の連番ではありません。リポジトリに理由が明記されています——複数人あるいは複数の AI が同時に着手すると、各自が「その日の最大番号＋1」を取りにいくため必ず衝突し、同名になった状態ファイルは手作業で振り直すしかありません。作成した瞬間の時分秒にすれば、各自が勝手に動いてもまず衝突しません。この ID 形式はもともと並行のために用意したものでした。当時はきちんとした設計だと思っておらず、衝突よけの小技のつもりで入れただけでしたが。</p>

<p>コードの層も隔離が要ります。各機能の内側のループはそれぞれ自分の git worktree で走り、互いに干渉せず、成果物は別々の PR を通ります。</p>

<p><strong>では、なぜ「分割」だけは人、あるいは主管 agent に残さなければならないのか。</strong> 前回、判断基準を一つ出しました。誤りを自動で見つけられるものはループへ、そうでないものは人へ。「この要件群をいくつの機能に割るべきか、どれとどれに依存があるか」——間違えてもどのコマンドもエラーを返しません。判断の問題であって、検証の問題ではないからです。だからループの外にあります。</p>

<p><strong>二段の終点も違います</strong>。内側の終点はレビュー完了、外側の終点は「N 本すべてが収束したこと」。そしてリリースは変わらず唯一の人手のゲートです。何本同時に走らせようと、最後にボタンを押すのは人です。</p>

<p>このやり方は、自分のコマンドラインツールのプロジェクトで実際に走らせました。どう動かすか、ガードレールをどう設定するか、一晩走らせると何が出てくるか——それは後の回で扱います。今回は形だけを描きます。</p>

<p><img src="/assets/images/posts/how-three-paradigms-interlock-fig-two-level-ja.png" alt="二段構えのループ：主管 agent が相対的に独立した N 個の機能に分割し、外側のスクリプトがそれぞれ自分の worktree で内側のループを起動し、最後は人手のリリースゲートに集約される" /></p>

<h2 id="次回自分のプロジェクトで動かすには">次回：自分のプロジェクトで動かすには</h2>

<p>この記事から一文だけ持ち帰るとしたら、これにしたいと思います。<strong>三層が噛み合うのは互いを呼び出しているからではなく、同じ一つのファイルの別々の枠に、それぞれが書き込んでいるからです。</strong></p>

<p>インターフェイスは関数ではなく名前です。だから一つの層を変えても他の層に波及しませんし、だからこのパイプラインは横に何本も複製できます。</p>

<p>今回は意図的に踏み込みませんでした。あの状態ファイルに具体的にどんなフィールドがあるか、ループのガードレールと上限をどう決めるか、並行で走らせたあとどう畳むか——どれも後の回に回します。<strong>まず形をはっきりさせてから、部品を見る。</strong></p>

<p>これで、三層とは何か、それぞれどこに落ちるか、どう噛み合うか、の三本が終わりました。次回は方向を変えます。<strong>自分のプロジェクトにどう入れるか、どう始めるか、既存のコードベースをどう取り込むか</strong>——この記事の図面から、あなたの端末で本当に走る最初の一行へ。</p>

<hr />

<p><strong>試してみる</strong>：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-fsSL</span> https://raw.githubusercontent.com/kanfu-panda/pdlc-skills/main/install.sh <span class="se">\</span>
  | bash <span class="nt">-s</span> <span class="nt">--</span> <span class="nt">--global</span>
</code></pre></div></div>

<p>リポジトリはこちら：https://github.com/kanfu-panda/pdlc-skills</p>

<p>役に立ったら star をいただけると励みになります ⭐</p>

<hr />

<p>あの二段構えの図は自分が実際に走らせている形で、描くまでは頭の中にしかありませんでした。具体的な像が持てたなら、いいねをいただけると嬉しいです。周りに「AI に複数のことを同時にやらせたい」と考えている方がいれば、共有していただけると助かります。</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">なぜ pdlc-skills は三大エンジニアリングに自然と噛み合うのか</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/08/13/why-pdlc-fits-three-paradigms.ja.html" rel="alternate" type="text/html" title="なぜ pdlc-skills は三大エンジニアリングに自然と噛み合うのか" />
    <published>2026-08-13T00:00:00+08:00</published>
    <updated>2026-08-13T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/08/13/why-pdlc-fits-three-paradigms.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/why-pdlc-fits-three-paradigms-cover-ja.png" />
    <summary type="html">この三層は私が設計して入れたものではありません。作っていた当時、Loop エンジニアリングも Graph エンジニアリングという言葉も聞いたことがありませんでした。ソフトウェア工学に何十年も前からある製品開発ライフサイクル——要件、設計、テスト、実装、レビュー——をそのままなぞっただけです。作り終えてから三大エンジニアリングを当ててみたら、どこも噛み合っていた。偶然です。ただし偶然には理由があります。</summary>
    <category term="AIエンジニアリング" />
    <category term="プロンプトエンジニアリング" />
    <category term="Loop工学" />
    <category term="Graph工学" />
    <category term="PDLC" />
    <category term="ClaudeCode" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/08/13/why-pdlc-fits-three-paradigms.ja.html"><![CDATA[<blockquote>
  <p>三つの概念を切り分けたあとに来る、本当に面白い問いはこれです。三層が同時に揃っている実物はあるのか。この記事では、私自身が作っている <a href="/ja/pdlc/">pdlc-skills</a> を一つずつ当てていきます。結論を先に言うと、噛み合っているのは<strong>偶然</strong>です。ただしその偶然には理由があり、その理由こそがこの記事の本題です。</p>
</blockquote>

<p>前回は、混同されがちな三つの言葉を切り分けました。</p>

<ul>
  <li>プロンプトエンジニアリングが扱うのは、この一回モデルにどう伝えるか；</li>
  <li>Loop エンジニアリングが扱うのは、同じことを何回繰り返し、どの条件で止めるか；</li>
  <li>Graph エンジニアリングが扱うのは、経路上のどの工程を飛ばしてはいけないか。</li>
</ul>

<p>三者は同じ階層になく、三択でもなく、積み重ねられる三層でした。</p>

<p>そこで自然に出てくる問いがあります。三層とも理屈は通っているとして、<strong>三層が同時に揃っている実物はあるのか</strong>。</p>

<p>一つ当ててみます。私自身が作っている pdlc-skills です。</p>

<h2 id="pdlc-skills-とは何か">pdlc-skills とは何か</h2>

<p><a href="https://docs.anthropic.com/">Claude Code</a> のプラグインで、やっていることは一行で言えます。<strong>AI が書くコードを「会話の中のもの」から「ディスクに残るもの」に変える</strong>、それだけです。</p>

<p>入れると 38 個のスラッシュコマンドが増え、一つが工程の一段階に対応します。いちばん使うのは <code class="language-plaintext highlighter-rouge">/pdlc-feature</code> で、新しい機能はこれで始めます。あとは AI が PRD → 設計 → TDD → 実装 → レビュー → リリースの線に沿って進み、各段階で一度止まって引き継ぎます。</p>

<p>「この機能作っといて」と頼むのとの違いは三点です。</p>

<ul>
  <li><strong>成果物は必ずディスクに落ちる</strong>。PRD も設計もレビュー記録も <code class="language-plaintext highlighter-rouge">docs/</code> の下の実ファイルであって、チャット履歴の一節ではありません。</li>
  <li><strong>機能ごとに状態を持つ</strong>。どの段階まで来たか、前の段階は通ったか、すべてディスクに記録されます。別のセッションで再開しても、自分がどこにいるか分かります。</li>
  <li><strong>テストは先に赤でなければならない</strong>。失敗するテストが無ければ実装に進めません。推奨ではなく、硬い関門です。</li>
</ul>

<p>MIT ライセンス。Claude Code 上での対応が最も手厚く、同じ方法論はアダプタ経由で他の AI コーディングツールでも動きます。</p>

<h2 id="出自はごく平凡です">出自はごく平凡です</h2>

<p><strong>この三層は私が設計したものではありません。作っていた当時、「Loop エンジニアリング」も「Graph エンジニアリング」という言葉も聞いたことがありませんでした。</strong></p>

<p>ソフトウェア工学に元からある製品開発ライフサイクルを、そのままなぞっただけです。要件、設計、テスト、実装、レビュー、リリース——この流れは業界に何十年も転がっていて、新しいところは一つもありません。私がやったのは、それを AI 向けに翻訳することだけでした。各段階で何をやるのか、何を出すのか、どうなったら通過なのかを一つずつコマンドとして書き、AI が思いついた順ではなく流れに沿って進むようにしただけです。</p>

<p>そこに一つだけ規則を足しました。<strong>各段階は必ずディスクに何かを書く</strong>、というものです。</p>

<ul>
  <li>PRD は <code class="language-plaintext highlighter-rouge">docs/01_requirements/</code> へ</li>
  <li>設計は <code class="language-plaintext highlighter-rouge">docs/02_design/</code> へ</li>
  <li>レビュー記録は <code class="language-plaintext highlighter-rouge">docs/07_reviews/</code> へ</li>
  <li>機能ごとに状態ファイルも一つ</li>
</ul>

<p>すべて普通のテキストです。いつでも開けますし、そのラウンドで AI が実際に何を触ったかを <code class="language-plaintext highlighter-rouge">git diff</code> で確認できます。</p>

<p>作り終えたあとに、この新しい言葉が流行り始めました。当てて確かめてみると、どこも噛み合っている——合わせて作ったからではなく、勝手にそう育っていたからです。</p>

<p>ではプロンプト、Loop、Graph の順に一層ずつ当てていきます。</p>

<h2 id="-プロンプト層噛み合うのは規約は一つだけ">🔵 プロンプト層：噛み合うのは「規約は一つだけ」</h2>

<p><strong>工程の中で対応するもの。</strong> ソフトウェア工学には古い規則があります。規約書は一つだけ、あちらとこちらで別々に持たない。pdlc に当てはめると、すべてのコマンドが守るべき規則——成果物は必ず落とす、引き継ぎ前に必ず自己点検する、修復は一度だけ——を、各コマンドの中に別々に書いてはいけない、ということになります。</p>

<p><strong>具体的にどうしたか。</strong> 共通規則を断片に切り出し、ビルド時に各 skill へ展開します。現在は <strong>13 個の断片が、38 個の skill のうち 36 個にコンパイルされています</strong>（入っていない二つは <code class="language-plaintext highlighter-rouge">pdlc-loop-next</code> と <code class="language-plaintext highlighter-rouge">pdlc-status</code>。軽すぎて共有すべき規則がありません）。六つの不変条件——ファイルは必ずディスクに落とす、段階ごとに必ず記録する（history に追記する）、テストは先に赤である、自己点検は必須、修復は一度だけ、状態は必ず前進する（<code class="language-plaintext highlighter-rouge">current_stage</code> が実際に変わること。外側のループが古い状態のまま空回りするのを防ぐため）——は、そのうちの一つの断片に書かれています。一箇所直せば、全体に効きます。</p>

<p><img src="/assets/images/posts/why-pdlc-fits-three-paradigms-fig-fragments-ja.png" alt="13 個の共有断片がビルド時に 36 個の skill へ展開され、一箇所の修正が全体に効く" /></p>

<p><strong>どの層と噛み合ったか。</strong> プロンプトエンジニアリングが扱うのは「今回モデルに何を見せるか」です。ここでやっていることはそれと変わりません。ただコードと同じやり方で管理しているだけ——共通部分を抜き出し、ビルド時に展開し、真実の源を一つにする。</p>

<p>新しい呼び名はプロンプトエンジニアリング、古い規則は単一の真実の源。同じことを二つの語彙で言っている——<strong>これが一つ目の偶然です</strong>。</p>

<h2 id="-loop-層噛み合うのは-tdd-の赤信号関門">🟢 Loop 層：噛み合うのは TDD の赤信号関門</h2>

<p><strong>工程の中で対応するもの。</strong> TDD はソフトウェア工学では古株で、規則は一行です。まず失敗するテストを書き、それから実装を書き、テストが緑になるまで続ける。pdlc はこれをそのまま持ち込みました。実装の前に、赤いテストが必ず存在すること。</p>

<p><strong>この規則が付随して連れてきたもの。</strong> テストが実装より先にあるということは、「終わったのかどうか」にモデルと無関係な答えが出るということです。一度走らせて、終了コードが 0 なら通過、それ以外なら未通過。</p>

<p>この答えの値打ちは、モデルを経由しない点にあります。コードを書いたモデルに自分のコードを採点させると、体系的に甘くなります。騙そうとしているのではなく、本当に良く書けたと思っているからです。ですから pdlc では、モデルの自己点検結果は別枠で記録し、参考にとどめ、<strong>止まるべきかどうかの根拠には決してしません</strong>。</p>

<p><strong>だからこの区間はループに渡せます</strong>。<code class="language-plaintext highlighter-rouge">tdd → implement → review</code> が自走し、レビューが通るまで回ります。その手前の PRD と設計は渡せません。この機能をやるべきか、いくつのモジュールに割るか、境界をどこに引くかは判断問題で、終了コードを返せるコマンドが存在しないからです。判断問題は人に残す。この線ははっきり引いてあります。</p>

<p><img src="/assets/images/posts/why-pdlc-fits-three-paradigms-fig-loopable-ja.png" alt="工程のどの区間をループに渡せて、どの区間は人が持つべきか。判定基準を併記" /></p>

<p><strong>どの層と噛み合ったか。</strong> Loop エンジニアリングには公理として使える一文があります。ループとはタスクに検証を一つ足したもの、検証のないタスクはただの願望である。TDD が与えるのは、まさにその検証です。</p>

<p>私が TDD をやっているのは、ソフトウェア工学が「テストを先に」と言うからであって、<strong>ループのために定規を用意したかったからではありません</strong>。それでも定規はそこに置いてあった——<strong>これが二つ目の偶然です</strong>。</p>

<p>ガードレール、上限、予算の決め方は第 5 回で扱います。</p>

<h2 id="-graph-層噛み合うのは段階分けとレビュー関門">🟣 Graph 層：噛み合うのは段階分けとレビュー関門</h2>

<p><strong>工程の中で対応するもの。</strong> ライフサイクルという言葉自体が順序を含んでいます。要件は設計の前、設計は実装の前、実装のあとにレビュー、レビューを通ってからリリース。ソフトウェア工学ではこの順序は推奨ではなく規律です。工程を飛ばした代償には、業界が何十年も授業料を払ってきました。</p>

<p><strong>具体的にどうしたか。</strong> 各段階の終わりに状態をディスクへ書き、次の段階はまず状態を読み、前提条件を満たさなければ進ませない。テストを飛ばして実装しない、レビューなしでリリースしない。</p>

<p>縦の順序のほかに、横の層もあります。機能と機能の関係です。<code class="language-plaintext highlighter-rouge">/pdlc-relate</code> がそれを明示的に記録します。<strong>六種類の有向辺</strong>——拡張、依存、置換、解決、衝突、関連。そして <code class="language-plaintext highlighter-rouge">impact &lt;機能ID&gt;</code> を叩けば、変更の影響半径が一発で出ます。🔴 直接依存しているもの、🟡 一つ隔てたもの、🟢 すでに終わっていて気にしなくていいもの。</p>

<p><img src="/assets/images/posts/why-pdlc-fits-three-paradigms-fig-two-directions-ja.png" alt="縦は関門付きの線形パイプライン、横こそが本当の有向グラフ" /></p>

<p><strong>ここは正直に言っておきます。</strong> 縦のほうは厳密にはグラフではなく、関門をいくつか挟んだ線形のパイプラインです。条件分岐がなく、並列ノードもなく、任意の地点へ巻き戻すこともできません。グラフらしい性質をほぼ持っていない。本当に「グラフ」と呼べるのは横の依存関係図のほうです。向きがあり、辿れて、循環依存を検出でき、存在しない機能を指す参照も見つけられます。</p>

<p><strong>どの層と噛み合ったか。</strong> では縦はなぜ Graph 層と言えるのか。<strong>Graph 層の本質は「図に描くこと」ではなく、負の制約</strong>——どの経路を通ってはいけないかを宣言することだからです。前回の言い方をもう一度使うなら、線路は旅程を計画しません。ある方向を単に成立させなくするだけです。</p>

<p>段階の関門が縛るのは順序、依存図が縛るのは影響範囲。やっていることは同じです。そして「段階を追って進め、要所でレビューする」という規律は、ソフトウェア工学がとうの昔に工程へ書き込んでいました——<strong>これが三つ目の偶然です</strong>。</p>

<p><img src="/assets/images/posts/why-pdlc-fits-three-paradigms-fig-relations-ja.png" alt="六種類の有向辺が関係図を作り、impact が距離に応じて影響半径を示す" /></p>

<h2 id="三度重なれば偶然ではない">三度重なれば偶然ではない</h2>

<p>一度なら偶然と言えます。三度とも噛み合うなら、理由を問うべきでしょう。</p>

<p>私の答えはこうです。<strong>この二つは、もともと同じ問題群を解いていた。</strong></p>

<p>三大エンジニアリングは、この二年ほどの AI エージェント実践から抽出された新しい語彙です。一方ソフトウェア工学のあの流れは、何十年もかけて実プロジェクトに繰り返し叩き込まれてできたものです。そして人と AI がエンジニアリングで犯す失敗は、かなりの部分が重なっています。思いついた順に手をつける、規約を何通りも持つ、終わったと言うが検証していない、ここを直すとどこが壊れるか分からない。古い流れがこれらを治すために立てた規則は、AI に翻訳しても効きます。</p>

<p>つまり新しい語彙が語る制約は、古い流れが別の言葉ですでに書き残していたわけです。</p>

<table>
  <thead>
    <tr>
      <th>三大エンジニアリングの言い方</th>
      <th>ソフトウェア工学に元からある規則</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>プロンプト工学：文脈を統一せよ</td>
      <td>規約は一つだけ、あちこちに写すな</td>
    </tr>
    <tr>
      <td>Loop 工学：客観的な検証を持て</td>
      <td>実装より先にテストを書け</td>
    </tr>
    <tr>
      <td>Graph 工学：負の制約をかけよ</td>
      <td>段階を追って進め、要所でレビューせよ</td>
    </tr>
  </tbody>
</table>

<p><strong>これが「自然に噛み合う」の意味です</strong>。私が三層を組み込んだのではなく、この古い流れが元から三層を備えていた。ただ今までこの三つの名前で呼ばれていなかっただけです。</p>

<p>もう一つ、古い流れには無く、実装の途中で自然に現れたものがあります。<strong>三層は最終的に同じもの——ディスク上の状態——を共有するようになりました。</strong></p>

<blockquote>
  <p>グラフはそれを読んでどの段階にいるかを判断し、
ループはそれを読んでこのラウンドで前進したかを判断し、
プロンプトはそれを読んで今回見るべき文脈を得る。</p>
</blockquote>

<p><img src="/assets/images/posts/why-pdlc-fits-three-paradigms-fig-shared-state-ja.png" alt="三層がディスク上の同じ状態ファイルを共有する" /></p>

<p>ここから使える物差しが一つ手に入ります。<strong>あるツールの三層が本当に統合されているかは、同じ状態を共有しているかで判断できる。</strong> 共有していれば統合、それぞれが自前で持っているなら、三つの仕組みが同じリポジトリに同居しているだけです。</p>

<h2 id="次回それぞれはいつ効いてくるのか">次回：それぞれはいつ効いてくるのか</h2>

<p>この記事から一文だけ持ち帰るとしたら、これにしたいと思います。<strong>AI にエンジニアリングをさせたいなら、新しいフレームワークを発明するより、すでにある工程を持ち出すほうが早い。</strong> その工程は新しくありませんが、それが治してきた病は、AI も同じようにかかります。</p>

<p>三層がどこに落ちているか分かったところで、次の問いはこうなります。<strong>一つの機能開発の中で、それぞれはいつ効いてくるのか。</strong> 次回は一つの機能を最初から最後まで追いかけ、三層の時間軸と、互いの引き継ぎ方を示します。</p>

<hr />

<p><strong>試してみる</strong>：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-fsSL</span> https://raw.githubusercontent.com/kanfu-panda/pdlc-skills/main/install.sh <span class="se">\</span>
  | bash <span class="nt">-s</span> <span class="nt">--</span> <span class="nt">--global</span>
</code></pre></div></div>

<p>プロジェクトページ：<a href="/ja/pdlc/">kanfu-panda.github.io/pdlc</a> ／ ソース：<a href="https://github.com/kanfu-panda/pdlc-skills">github.com/kanfu-panda/pdlc-skills</a></p>

<p>役に立ったら star をいただけると励みになります ⭐</p>

<hr />

<p>三層がどう地に足を着くのか、具体的な像が持てたなら、いいねやフォローをいただけると嬉しいです。周りに「AI に工程を守らせたい」と考えている方がいれば、共有していただけると助かります。</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">プロンプトエンジニアリング・Loop エンジニアリング・Graph エンジニアリングとは何か</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/08/09/prompt-loop-graph-engineering.ja.html" rel="alternate" type="text/html" title="プロンプトエンジニアリング・Loop エンジニアリング・Graph エンジニアリングとは何か" />
    <published>2026-08-09T00:00:00+08:00</published>
    <updated>2026-08-09T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/08/09/prompt-loop-graph-engineering.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/prompt-loop-graph-engineering-cover-ja.png" />
    <summary type="html">この三つの言葉は最近いつも同じ比較表に並べられ、まるで三択のように扱われています。しかし三者はそもそも同じ階層にいません。プロンプトは一回のやり取りを、Loop は反復の収束を、Graph は経路そのものを決めます。この違いを理解することは、どれか一つを習得することより価値があります。</summary>
    <category term="AIエンジニアリング" />
    <category term="プロンプトエンジニアリング" />
    <category term="Loop工学" />
    <category term="Graph工学" />
    <category term="AIエージェント" />
    <category term="ClaudeCode" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/08/09/prompt-loop-graph-engineering.ja.html"><![CDATA[<blockquote>
  <p>プロンプトエンジニアリング、Loop エンジニアリング、Graph エンジニアリング。この三つは最近いつも同じ比較表に並べられ、三択を迫られているように見えます。しかし三者はそもそも同じ階層にいません。それを整理することは、どれか一つを習得するより価値があります。この記事では特定のツールの話はせず、各層が何を管理し、どこに限界があるのかを整理します。最後に、目の前の課題がどの層に属するかを判断するための三つの問いを示します。</p>
</blockquote>

<h2 id="三つの言葉それぞれ別の出自">三つの言葉、それぞれ別の出自</h2>

<p>まずこの三つがどこから出てきたのかを見ておきます。来歴がまったく違うからです。</p>

<p><strong>プロンプトエンジニアリング</strong>は、この二年で一度名前を変えています。初期の議論は「一文をどう書くか」でした。どんなペルソナを与えるか、どんな言い回しを使うか。その後、成果を決めているのは言い回しではなく「今回モデルに何を見せたか」だと分かってきました。そこで登場したのが Context Engineering という、より正確な呼び方です。</p>

<p><strong>Loop エンジニアリング</strong>は、Ralph のようなやり方がコミュニティで広まる中で形になりました。仕組みは拍子抜けするほど単純です。一行の <code class="language-plaintext highlighter-rouge">while</code> ループで同じ指示を繰り返しモデルに渡し、正誤の判定はテストに任せる。十分な回数を回せば、受け入れ基準を通るバージョンが自然に浮かび上がってきます。</p>

<p><strong>Graph エンジニアリング</strong>は、LangGraph のようなオーケストレーションフレームワークとともに視野に入ってきました。エージェントの実行経路を明示的に図として描く——誰が誰に渡すのか、差し戻せるのか、どこで必ず止まるのか、という主張です。</p>

<p>三つの流れはそれぞれ別に育ち、最後に同じ表へ並べられました。問題はまさにこの表にあります。三者はそもそも同じ種類のものではありません。</p>

<h2 id="-三者は同じ階層にいない">🧱 三者は同じ階層にいない</h2>

<p>正しい関係は横並びではなく、<strong>積み重ね</strong>です。</p>

<table>
  <thead>
    <tr>
      <th>階層</th>
      <th>何を管理するか</th>
      <th>制御の粒度</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Graph エンジニアリング</td>
      <td>経路をどう組み立てるか</td>
      <td>ステージ単位</td>
    </tr>
    <tr>
      <td>Loop エンジニアリング</td>
      <td>反復をどう収束させるか</td>
      <td>ラウンド単位</td>
    </tr>
    <tr>
      <td>プロンプトエンジニアリング</td>
      <td>一回のやり取りをどう行うか</td>
      <td>Token 単位</td>
    </tr>
  </tbody>
</table>

<p><img src="/assets/images/posts/prompt-loop-graph-engineering-fig-layers-ja.png" alt="上から Graph、Loop、プロンプトの三層。制御の粒度はステージ単位から Token 単位へと細かくなる" /></p>

<p>ここで一つ補足しておかないと、別の落とし穴にはまります。<strong>階層関係が成り立つことと、すべての層が必要であることは別です。</strong></p>

<p>「標準の三層アーキテクチャ」が頭に入ってしまうと、どんなタスクにも三層を被せたくなります。実際にはうまく回っているシステムの多くは一層か二層しかありません。</p>

<table>
  <thead>
    <tr>
      <th>形態</th>
      <th>どういう場合か</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>プロンプトのみ</td>
      <td>単発の分類・抽出・書き換え。オーケストレーションを足すのは純粋なマイナス</td>
    </tr>
    <tr>
      <td>プロンプト + Loop</td>
      <td>テストを支えに反復する。経路は最初から描いていない</td>
    </tr>
    <tr>
      <td>プロンプト + Graph</td>
      <td>経路を全列挙できる。自律的な反復は不要</td>
    </tr>
    <tr>
      <td>三層すべて</td>
      <td>本番運用の開発ワークフロー</td>
    </tr>
  </tbody>
</table>

<p>Anthropic が『Building effective agents』で示している原則は実践的です。最も単純な方法から始め、効果がはっきり改善するときだけ複雑さを足す。</p>

<p>つまり正しいメンタルモデルは「三層アーキテクチャ」ではなく、<strong>三つの選択可能な入れ子の層。既定では最下層から始め、上に足すには代償が伴う</strong>ということです。</p>

<p><img src="/assets/images/posts/prompt-loop-graph-engineering-fig-combos-ja.png" alt="プロンプトのみ、プロンプト + Loop、プロンプト + Graph、三層すべての四形態と、それぞれの典型的なタスク" /></p>

<h2 id="-各層は結局何を管理しているのか">🔍 各層は結局何を管理しているのか</h2>

<p>以下、各層について四点を扱います。何であるか、どうやるか、誤解しやすい要点、そして限界です。</p>

<h3 id="プロンプトエンジニアリング今回モデルに何を見せるかを決める">プロンプトエンジニアリング：今回モデルに何を見せるかを決める</h3>

<p>すでに「言い回しを整える」段階ではありません。本当に管理すべきなのは、今回モデルに何を見せ、何を見せないか、です。</p>

<p>そう変わった理由は単純で、タスクが複数ラウンドの推論をまたぐようになると一文の言い回しでは足りなくなり、焦点がコンテキスト全体の管理——システム指示、ツール定義、外部データ、履歴メッセージ——へ移るからです。</p>

<p>具体的な手立てはそう多くありません。システムプロンプトは適切な高さで書く必要があります。行動を導けるだけ具体的で、かつあらゆる状況を書き切ってしまわない程度に。細かすぎる規則は想定外の場面に出会うと互いに矛盾し始め、曖昧すぎる規則は何も言っていないのと同じです。ツールの説明はそれぞれの担当をはっきり書く。機能が重なるツールが多いほど、モデルは選び間違えます。出力フォーマットは先に決めておけば、後から正規表現で拾う手間が消えます。例示は多様なものを一組、境界ケースを積み上げるより有効です。</p>

<p><strong>誤解しやすい要点</strong>：コンテキストは長ければ良いというものではありません。詰め込むほど中間部分は薄まっていきます。これは実際に起きる劣化であって、「モデルが賢くない」からではありません。注意力には予算があり、どこに使うかはトレードオフです。「多く渡すほど安全」ではありません。今回そもそも見せる必要のないものを見極めるほうが、何を書くかを考えるより早いことがよくあります。</p>

<p><strong>限界</strong>：これはソフトな制約です。モデルは必ずしも指示どおりに動くとは限らず、しかもその場では気づけないことがあります。</p>

<p>この層の最大の長所と最大の問題は同じ事実です。一文直せばすぐ効く。だからこそ、モデルが従う気になるかどうかに委ねるしかありません。</p>

<h3 id="loop-エンジニアリング一つのタスクに一つの検証を足す">Loop エンジニアリング：一つのタスクに、一つの検証を足す</h3>

<p>この層には公理として使える一文があります。</p>

<blockquote>
  <p>A loop is a task with a check. A task without a check is just hope.
ループとは、タスクに一つの検証を足したもの。検証のないタスクは、ただの願望である。</p>
</blockquote>

<p>Ralph の形は先に触れたとおり、あの一行の <code class="language-plaintext highlighter-rouge">while</code> です。しかし本当の設計はループの中にはなく、<strong>周辺のファイルにあります</strong>。全部で三つ、それぞれ役割が違います。一つは仕様書で、このプロジェクトを何に仕上げるか、何をしてはいけないかを書く。一つは進捗リストで、何が終わり次に何をやるかを記録する。もう一つは毎回そのまま投入される指示で、「先に前の二つを読め、それから一件選んで手をつけろ」とモデルに伝える。ループ自体に技術的な難しさはありません。難しいのはこの三つを正しく書くことです。</p>

<p><strong>誤解しやすい要点</strong>：毎ラウンド、コンテキストは完全に洗い流されます。モデルは前のラウンドで何をしたか覚えていません。欠陥のように聞こえますが、これは仕様です。記憶がないおかげで毎回きれいな状態から始まり、前のラウンドの誤った理解を後まで引きずりません。代償として、ラウンドをまたいで残すべきものはすべてディスクに落とす必要があります。それがあの進捗リストです。人間向けのメモではなく、次のラウンドのモデルにとって唯一の記憶です。</p>

<p><strong>停止の信号はどこから来るか</strong>：ループは何をもって止まると判断するのか。機械が自動で判定できる信号が要ります。テストの終了コード、コンパイル結果、型チェック。「見た感じ良さそう」では条件判断に書けないので、成立しません。</p>

<p><strong>典型的な失敗は二通り</strong>あります。一つは空回りです。モデルは毎ラウンド何かをやった気になっているのに実際には何も進まず、Token だけが燃えていく。もう一つは重複作業です。前のラウンドで完成しているものを見つけられず、まだ無いと判断してもう一度作ってしまう。昨日敷いた配管に気づかず、床を剥がしてもう一度敷き直す職人と同じです。</p>

<p><strong>限界</strong>：検証信号のないループは、ゴミを量産しているだけです。しかもその失敗は最も見つけにくい。動き続けているのに、向きが間違っているからです。</p>

<h3 id="graph-エンジニアリング同じ名前の別物を先に切り分ける">Graph エンジニアリング：同じ名前の別物を先に切り分ける</h3>

<p>この層はまず用語の曖昧さを解消する必要があります。同じ「グラフ」でも、まったく別の二つを指しています。</p>

<ul>
  <li><strong>オーケストレーショングラフ</strong>：LangGraph の類。フローがどの経路を通るかを描く</li>
  <li><strong>ナレッジグラフ</strong>：GraphRAG やコード関係グラフの類。実体どうしの関係を描く</li>
</ul>

<p>同名別物です。この記事で扱うのは前者、オーケストレーショングラフのほうです。後者はこのシリーズの第 7 回で単独に扱います。</p>

<p>オーケストレーショングラフがやっているのは、「この仕事をどの順で進めるか」を頭の中から紙の上へ移すことです。誰が誰の仕事を受け取るか、どの工程なら差し戻せるか、どこで必ず止まって人の承認を待つか。</p>

<p>よく使われる形は五つで、それぞれ向く仕事が違います。</p>

<ul>
  <li><strong>直列</strong>：一歩終えたら次へ。コードを書くのがまさにこれで、設計 → テスト → 実装の順に進みます。</li>
  <li><strong>ルーティング</strong>：まず種類を判定し、それから担当を決める。問い合わせが来たら分類し、返金は返金フロー、障害は障害フローへ。</li>
  <li><strong>並列</strong>：互いに独立した作業を同時に走らせ、最後に統合する。同じ差分をセキュリティ・性能・可読性で別々に見て、指摘をまとめる。</li>
  <li><strong>オーケストレーターとワーカー</strong>：一人が分解して割り振り、複数が黙々と実行する。</li>
  <li><strong>評価と改善</strong>：出来上がったものを一度レビューに通し、基準に満たなければ差し戻す。</li>
</ul>

<p>実際のシステムはたいていこの五つの組み合わせです。新しい形を発明する必要はありません。</p>

<p>図を描くことには、見落とされがちな利点が二つあります。一つは<strong>復旧できる</strong>こと。各ノードでチェックポイントを取れるので、落ちても最後の地点から再開でき、最初からやり直さずに済みます。もう一つは<strong>監査できる</strong>こと。後から「なぜその経路を通ったのか」を説明できます。説明を求められる場面では効いてきます。</p>

<p><strong>誤解しやすい要点</strong>：グラフが定めるのは「どの経路を通ってはいけないか」であって、「どうやるか」ではありません。これは重要なので後で単独に扱います。</p>

<p><strong>限界</strong>：事前に想定できたことしか表現できません。その場で判断が要るもの、見たことのない状況には、図は何の役にも立ちません。さらに隠れたコストがあります。一度描いた図はそのまま負債になり、現実が変われば描き直しになる。図の描き直しは一文の書き換えよりずっと高くつくので、着手前によく設計しておく必要があります。</p>

<p><img src="/assets/images/posts/prompt-loop-graph-engineering-fig-cheatsheet-ja.png" alt="各層の定義・代表的なやり方・限界を一枚にまとめたカード" /></p>

<h2 id="-リフォームに置き換えてみる">🏠 リフォームに置き換えてみる</h2>

<p>三層を一つの喩えで通しておきます。</p>

<table>
  <thead>
    <tr>
      <th>概念</th>
      <th>リフォームでの対応</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>プロンプトエンジニアリング</td>
      <td>職人にどう作業を伝えるか</td>
    </tr>
    <tr>
      <td>Loop エンジニアリング</td>
      <td>施工 → 検査 → 不合格 → やり直し → 再検査</td>
    </tr>
    <tr>
      <td>検証信号</td>
      <td>監理者の直定規、水平器、防水試験</td>
    </tr>
    <tr>
      <td>Graph エンジニアリング</td>
      <td>施工順序の規定（配管 → 防水 → 防水試験 → タイル → 木工 → 塗装）</td>
    </tr>
    <tr>
      <td>人手の介在点</td>
      <td>要所で施主が立ち会って承認する</td>
    </tr>
    <tr>
      <td>毎ラウンドのコンテキスト刷新</td>
      <td>毎朝、別の職人が入ってくる</td>
    </tr>
  </tbody>
</table>

<p>三者の性格を三文で。</p>

<p><strong>プロンプトは指示出しです。</strong> 「主寝室の北向きの壁、オフホワイト、二度塗り、際はマスキング」。コストはゼロ、即座に効きます。ただし職人が「これで十分だろう」と判断する余地があり、その場では気づけません。</p>

<p><strong>Loop はやり直しの仕組みです。</strong> 指示だけでは足りず、検査が要ります。ここで効いているのは「やり直し」ではなく直定規のほうです。定規のないやり直しは、ただの二度手間です。</p>

<p><strong>Graph は施工順序です。</strong> 壁を何色に塗るかは決めません。「防水をやらずにタイルを貼る」を、工程として不可能にするだけです。</p>

<p><img src="/assets/images/posts/prompt-loop-graph-engineering-fig-renovation-ja.png" alt="リフォームの流れと三層の対応：指示出し、やり直しと検査、施工順序の規定" /></p>

<p>三者の分担を一文で言うと、<strong>順序が「やってはいけないこと」を封じ、やり直しが基準まで押し上げ、指示が具体的なやり方を決める</strong>、ということです。</p>

<h2 id="️-三つの性格三通りの壊れ方">⚖️ 三つの性格、三通りの壊れ方</h2>

<table>
  <thead>
    <tr>
      <th> </th>
      <th>プロンプト</th>
      <th>Loop</th>
      <th>Graph</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>制御権は誰に</td>
      <td>モデル</td>
      <td>モデル（人は停止条件だけ決める）</td>
      <td>人（人が経路を描き、モデルが埋める）</td>
    </tr>
    <tr>
      <td>決定性</td>
      <td>低い</td>
      <td>最も低い</td>
      <td>高い</td>
    </tr>
    <tr>
      <td>初期投資</td>
      <td>ごく小さい</td>
      <td>小さい。ただし検証体制が先に要る</td>
      <td>大きい</td>
    </tr>
    <tr>
      <td>単位コスト</td>
      <td>1x</td>
      <td>4x、マルチエージェントで 15x</td>
      <td>2–3x、ただし回り道は減る</td>
    </tr>
    <tr>
      <td>デバッグしやすさ</td>
      <td>良い</td>
      <td>最も悪い</td>
      <td>最も良い</td>
    </tr>
    <tr>
      <td>典型的な失敗</td>
      <td>モデルが従わない</td>
      <td>逸れているのに誰も気づかない</td>
      <td>図が間違っている、または硬直している</td>
    </tr>
  </tbody>
</table>

<p><em>コストの行について：エージェントで約 4x、マルチエージェントで約 15x は Anthropic の公開情報によるもの、Graph の 2–3x は公開資料で流通している概算です。いずれも桁感の参考であり、実測値ではありません。</em></p>

<p>この表で最も考える価値があるのは最後の行です。<strong>三つの壊れ方はまったく違います</strong>。プロンプトの失敗は見える——従わなかった結果がそこにあります。Loop の失敗は見えない——動き続けていて、向きだけが違う。Graph の失敗は直せない——図が固まっていて、現実のほうが動いた。</p>

<p>後ろの二つは最初の一つよりずっと厄介で、しかもそれは層を足したからこそ現れた新しい問題です。「上に足すには代償が伴う」というのは、具体的にはこういう意味です。</p>

<p><img src="/assets/images/posts/prompt-loop-graph-engineering-fig-compare-ja.png" alt="制御権・決定性・コスト・デバッグしやすさ・典型的な失敗で三層を比較した表" /></p>

<h2 id="-誤解しやすい二つのこと">🚧 誤解しやすい二つのこと</h2>

<h3 id="graph-は計画しない負の制約をかけている">Graph は計画しない。負の制約をかけている</h3>

<p>三層を「Graph が計画し、Loop が実行し、Prompt が実装する」という指揮系統として読みたくなります。しかし図はどうやるかについて一言も言っていません。宣言しているのは「テストを飛ばして実装に入ってはいけない」だけです。この設計をどのモジュールに分けるか、実装をどのファイルから書くか——そちらが本当の計画で、それは下の二層で起きています。</p>

<p>別の言い方をすると、こうなります。</p>

<blockquote>
  <p><strong>線路</strong>が決めるのはどこへ行けるか、どこで必ず止まるかであって、その外出の目的には関与しません。
<strong>エンジン</strong>はただ前へ押し出すだけです。終点まで、あるいは停止信号にぶつかるまで。
<strong>ハンドル</strong>は線路が許す範囲の中で、具体的な進み方を決めます。</p>
</blockquote>

<p>線路が旅程を計画してくれることはありません。「横へ逸れる」を成立させなくしているだけです。</p>

<p><img src="/assets/images/posts/prompt-loop-graph-engineering-fig-track-ja.png" alt="線路が方向を限定し、エンジンが推進力を与え、ハンドルが進み方を決める" /></p>

<h3 id="階層が上がるほど能力は弱くなる">階層が上がるほど、能力は弱くなる</h3>

<p>「上位層・下位層」という言い方に引きずられると、上のほうが重要に思えます。実際は逆で、<strong>制御力が強いほど表現力は弱くなります</strong>。Graph は事前に想定できたことしか表現できず、現実が図の想像を超えた瞬間、何の助けにもなりません。</p>

<p>もう一段踏み込むと、この三層はどれ一つとして何かを「実装して」いません。実際に作業しているのは常にモデル自身で、三層はその振る舞いを形づくる三つの手段にすぎません。Graph は構造で、Loop は反復と検証で、プロンプトは言語で。</p>

<p>つまり、モデルが強くなるほど上の二層の必要性は縮んでいきます。この仕組み一式の価値は、ある意味でモデルの現時点の弱点を補うところにあります。</p>

<h2 id="-選定のための三つの問い">✅ 選定のための三つの問い</h2>

<p>この記事から一つだけ持ち帰るとしたら、次の三つの問いにしてください。</p>

<p><strong>第一問：間違ったとき、機械が自動で気づけるか。</strong></p>

<p>気づける → Loop を使う。テスト、コンパイラ、型システムが直定規になります。
気づけない → どんなに魅力的に見えても使わない。検証信号のないループはゴミの量産です。</p>

<p>判断基準は素朴です。「正しくできた」を、終了コードを返すコマンドとして書けるか。書けるなら回せます。書けないなら回さないことです。</p>

<p><strong>第二問：今この場でフローチャートを描けるか。</strong></p>

<p>描けて、しかもこのフローを繰り返し使う・監査する・人の承認点を残す必要がある → Graph を使う。
描けない → 無理に描かない。</p>

<p>ここでいう「描けない」とは、そもそも何ステップで終わるか言えない種類の仕事です。三歩で終わるかもしれないし、二十回行き来するかもしれない。途中で何に出会うか次第です。この種の仕事は本来モデル自身に進みながら判断させるべきで、無理に図を被せると縛るだけになります。Anthropic の推奨も同じ趣旨です。ステップ数が読めないオープンな問題はエージェントに任せ、固定フローを当てはめない。</p>

<p>もう一点。問うているのは「今描けるか」であって「いずれ描けるか」ではありません。先に考え抜いてから描いた図だけが制約として機能します。走りながら継ぎ足した図は、混乱を別の形式で記録し直しただけです。</p>

<p><strong>第三問：上の二つはどちらも要らないか。</strong></p>

<p>ならプロンプトエンジニアリングで十分です。<strong>これは妥協ではなく、正解です。</strong> 単発の分類タスクにループとオーケストレーションを被せても、遅く、高く、デバッグしにくくなるだけです。</p>

<p><img src="/assets/images/posts/prompt-loop-graph-engineering-fig-decision-ja.png" alt="三つの問いの決定木：自動で誤りを検出できるか、フローを描けるか、どちらも不要か" /></p>

<h2 id="次回三層が同時に育った実物はあるのか">次回：三層が同時に育った実物はあるのか</h2>

<p>概念の話はここまでです。最後に一文だけ残しておきます。この文はシリーズ全体を貫きます。</p>

<p>プロンプトの層ができるのは「要求」までで、「保証」は与えられません。「Token を節約しろ」と書けばモデルはたいてい従いますが、本当に超過したとき止める手立てはありません。その一文には強制力がないからです。</p>

<p>保証が欲しいなら、層を変えた手段が要ります。たとえば「この一回で一定額を超えたら自動停止」というハードなラインを引く。この線はモデルと交渉せず、モデルの意思も問いません。</p>

<blockquote>
  <p><strong>つまり、欲しいものが「保証」なら、プロンプトの層はそれを与えられない。一つ上に移す必要がある。</strong></p>
</blockquote>

<p>次回は具体的なものを扱います。私が作っている <a href="/ja/pdlc/">pdlc-skills</a> が、なぜこの三層に自然に収まっているのか、という話です。</p>

<hr />

<p><strong>試してみる</strong>：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-fsSL</span> https://raw.githubusercontent.com/kanfu-panda/pdlc-skills/main/install.sh <span class="se">\</span>
  | bash <span class="nt">-s</span> <span class="nt">--</span> <span class="nt">--global</span>
</code></pre></div></div>

<p>プロジェクトページ：<a href="/ja/pdlc/">kanfu-panda.github.io/pdlc</a> ／ ソース：<a href="https://github.com/kanfu-panda/pdlc-skills">github.com/kanfu-panda/pdlc-skills</a></p>

<p>役に立ったら star をいただけると励みになります ⭐</p>

<hr />

<p>三つの言葉の違いが整理できたなら、いいねやフォローをいただけると嬉しいです。周りに同じところで混乱している方がいれば、共有していただけると助かります。</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">AI の記憶に「健康診断」ツールを作った——診断はするが、手は出さない</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/07/13/ai-memory-health-check.ja.html" rel="alternate" type="text/html" title="AI の記憶に「健康診断」ツールを作った——診断はするが、手は出さない" />
    <published>2026-07-13T00:00:00+08:00</published>
    <updated>2026-07-13T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/07/13/ai-memory-health-check.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/ai-memory-health-check-cover-ja.png" />
    <summary type="html">前回は AI の記憶ライブラリを手作業で「除草」し、最後にこう悟った——雑草が繰り返し生えるのは、記憶システム自体に「自己点検」の仕組みがないからだ。そこで今回は、その健康診断をツールにした。医者のように、スキャンして問題を並べ、そこで止まる——直すかどうかは、いつもあなた次第。外部の大規模モデルには一切つながず、記憶は一文字も端末の外に出ない。</summary>
    <category term="AI記憶" />
    <category term="ClaudeCode" />
    <category term="記憶メンテナンス" />
    <category term="ツール開発" />
    <category term="AI" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/07/13/ai-memory-health-check.ja.html"><![CDATA[<blockquote>
  <p>前回は、いくつかのプロジェクトの AI 記憶ライブラリを体系的に「除草」し、記憶が劣化する六種類の「雑草」を整理しました。ですが除草を進めるほど確信が強まりました——手作業の除草は対症療法にすぎない、と。記憶システム自体に「自己点検」の仕組みがない限り、雑草は抜いてもまた生えてきます。そこで前回の最後に、自分への宿題を残しました——「自動で健康診断してくれる記憶ツールを作る」。この記事は、その宿題の提出です。</p>
</blockquote>

<p>まず、このツールが何をするものかを話させてください。話はそこからです。</p>

<p>記憶ライブラリ専属の医者、とイメージしてください。あるプロジェクトの記憶ライブラリを指定すると、頭から末尾までスキャンし、見つけた問題を一つずつ目の前に並べます——このリンクは切れている、その記憶はフォルダを間違えている、この二つは矛盾して見える……。そしてそこで止まり、一件ずつ「どうするか」をあなたが決めるのを待ちます。</p>

<p>この「あなたが決めるのを待つ」を最初に置いたのには理由があります。それがツール全体の性格を決めているからです——見ることと伝えることだけを担い、手は出さない。</p>

<h2 id="-見るだけあなたの代わりに手は出さない">🩺 「見る」だけ——あなたの代わりに手は出さない</h2>

<p>なぜこう設計したのか。前回の一番痛い教訓に戻ります——記憶を削除するようなことは、AI に丸ごと委ねてはいけない。どれを削るか、どれを統合するかを提案するのは構いませんが、最後に判を押すのは人でなければなりません。削られるのは往々にして履歴の記録で、AI は勢いのまま、大事なものまで一緒に消してしまいがちです。</p>

<p>そこでツールを作るとき、この教訓を一つの絶対ルールにしました——プログラムのどこにも、記憶ファイルを自分から書き換えたり削除したりするコードパスは存在しない。スキャンし、問題ごとに重みづけし、直し方まで用意して並べることはできます。ですが実際に「変更」や「削除」を押す一手は、あなた自身のものです。</p>

<p>こう言うと損に聞こえます——ツールを作っておいて、一番働ける部分を切り落としたのですから。ですが、まさにこの抑制があるからこそ、毎日つけっぱなしで使えるのです。勝手に記憶へ手を出すツールに替えたら、私は一度も使う気になれません。</p>

<p><img src="/assets/images/posts/ai-memory-health-check-fig-diagnose-not-operate-ja.png" alt="ツールはスキャン・重みづけ・提案だけ。変更や削除の一手は、いつもあなたが押す" /></p>

<h2 id="-機械は明白な傷をclaude-は意味を読む">🔍 機械は「明白な傷」を、Claude は「意味」を読む</h2>

<p>手を出さない話をしたので、次は何を見つけられるかです。ツールが拾う問題は、実は二種類あり、扱いがまるで違います。</p>

<p>一つは、機械が一目で判定できる明白な傷です——リンクの指すファイルが存在しない、記憶がフォルダを間違えている、命名が規約に反している……。これらは内容の理解を要さず、ルール照合で決着がつき、見誤りません。</p>

<p>もう一つは、ずっと厄介です。たとえば「この二つの記憶は互いに矛盾しているか」は、表面の文字だけでは判定できず、それぞれが何を言っているのかを本当に読む必要があります。この種の仕事には、言語を理解できるモデルが欠かせません。好都合なことに、このツールはもともと Claude Code のプラグインです。実行時にはすぐ隣に Claude がいる——意味を読める、出来合いのモデルがそこにいるのです。わざわざもう一つ外付けする必要はありません。</p>

<p>そこで、明白な傷はローカルの小さなエンジンへ——ネットにつながず、どんなモデルも呼ばず、同じライブラリなら毎回まったく同じ結果を返します。意味の理解を要する判断は、ホストの Claude——まさに今あなたと一緒に作業しているモデルへ渡します。こう分けると、ツールは API key を一切必要とせず、外部サービスにも依存せず、記憶の内容は一文字も端末の外へ出ません。</p>

<p><img src="/assets/images/posts/ai-memory-health-check-fig-engine-shell-ja.png" alt="明白な傷はローカルエンジンへ、意味の判断はホストの Claude へ——二層がそれぞれの担当を持つ" /></p>

<p>この考え方に沿って、チェックを三層に並べました。最も確実なものから、最も頭を使うものへ。</p>

<ol>
  <li><strong>静的チェック（明白な傷）</strong>：エンジンの主力で、速く正確です——デッドリンク（命名がハイフンからアンダースコアへずれ、リンクが静かに切れる）、宙に浮いた索引（索引には載っているのにファイルが無い）、孤立した記憶（ファイルはあるのに索引に載っていない）、フィールド欠落、命名不備、フォルダ間違い。どれも機械が一目で見抜き、誤判定しない傷です。</li>
  <li><strong>当て推量（手がかり）</strong>：たとえば「開発中」「承認待ち」と書かれたまま長く更新のない記憶は、たいてい用事はとうに済み、ステータスだけが凍りついています。この層が出すのは手がかりで、断定ではありません。</li>
  <li><strong>意味を読む（セマンティクス）</strong>：前回の一番厄介な二つの「雑草」——プロジェクトがグローバルなルールをもう一度写した「ゴーストコピー」と、逆に見えて実はそれぞれ別の場面を担当している「偽の矛盾」——は、内容を読み込まないと判定できません。この層はホストの Claude へ。読んで提案し、判断は私が下します。</li>
</ol>

<p>三層を通し終えると、ツールは問題を赤・黄・緑で重みづけし、一件ずつ一緒に確認していきます——このデッドリンクは直す？ この孤立記憶は索引に足す？ この凍りついたステータスはもう終わっている？ あなたが「直す」と言ったものだけを直し、飛ばしたものには一切触れません。</p>

<h2 id="-時が来たら知らせるでもうるさくしない">⏰ 時が来たら知らせる——でも、うるさくしない</h2>

<p>健康診断だけでは足りません。記憶メンテナンスの最大の敵は「直し方が分からない」ことではなく、そもそも直すのを忘れることだからです。前回、記憶は定期的な手入れが要ると書きましたが、「定期的」を気合いに任せると、実質ゼロです。</p>

<p>そこでツールにリマインドを付けました——作業を始めるたび、今のプロジェクトの記憶ライブラリが長く点検されていなければ、そっと一言「🩺 前回の点検から N 日」と告げます。</p>

<p>ですがリマインドは、多すぎればノイズになり、ノイズは無視されます。そこで二つの制約をかけました——一日にせいぜい一度、セッションごとに飛び出したりはしない。そして本当に煩わしければ、コマンド一つで止められる。</p>

<p><img src="/assets/images/posts/ai-memory-health-check-fig-reminder-ja.png" alt="点検リマインドは一日に一度、限られた枠でだけ現れる。煩わしければコマンド一つで止められる" /></p>

<h2 id="-今できることできないこと">📌 今できること、できないこと</h2>

<p>正直に言います。</p>

<p><strong>できること</strong>：六つの検出器、旧フォーマット記憶の移行提案、日英バイリンガル出力——今はすべて動きます。自分の九つのプロジェクトの記憶ライブラリを一つずつ点検し、デッドリンク・古い命名・凍りついたステータスを一気に片づけました。</p>

<p><strong>できないこと</strong>（これも意図して引いた線です）：</p>

<ul>
  <li>意味の理解を要する判断は、最後に人の一頷きが要る。ツールは助言するだけ。</li>
  <li>あなたの代わりに、勝手に何かを書き換えることは決してしない。</li>
  <li>小さなライブラリや新しいライブラリでは効果は限られる。本当に元が取れるのは、長く積み上がった大きなライブラリです。</li>
</ul>

<p>記憶を扱うツールが最もやってはいけないのは、独断で動くことです。</p>

<p>ツール自体は今のところ自分用ですが、最初の一行からオープンソース基準で書いています——テスト完備、きれいな履歴、日英両方のドキュメント。いつ、どう公開するかは、自分が十分に使い込んで信頼できてから決めます。ですのでこの記事にはリンクを載せません。クリックして空振りさせないためです。</p>

<h2 id="-振り返って三つの学び">💡 振り返って、三つの学び</h2>

<ol>
  <li><strong>「手を出す」ツールには、まず境界を先に決める。</strong> 操作が不可逆なほど、有能なツールは危険になります。「決して独断で動かない」を絶対ルールにしたからこそ、安心して使えるのです。</li>
  <li><strong>リマインドや通知を作るなら、「止められるスイッチ」を残すのを忘れない。</strong> メッセージをどうユーザーの目に届けるかばかり考え、つい忘れます——しつこいリマインドは、最後には無視される。止められるリマインドこそ、本当に読まれるのです。</li>
  <li><strong>自分の作ったツールは、自分がまず厳しい最初のユーザーになる。</strong> 形だけ動かして済まさず、本当に仕事に使ってこそ、誤判定や見落としが一つずつ表に出てきます。</li>
</ol>

<h2 id="次回loop-の話をしよう">次回：loop の話をしよう</h2>

<p>記憶については——構築から、除草、そして今回の健康診断ツールまで——ここで一区切りです。次回は話題を変えて、loop の話を。AI を一定のリズムで自分で走らせ、繰り返しの仕事を、私が見張らずとも続けさせる、その方法についてです。</p>

<hr />

<p>あなたも AI の記憶ライブラリを育てているなら、あるいは自分のツールに「この線は越えない」というルールをいくつか設けようとしているなら、この記事が少しでも助けになれば幸いです。役に立ったと感じたら、いいねや、AI 記憶に同じく取り組む誰かへのシェアが、何よりの励みになります——あなたの一回のシェアが、書き続ける力になります。</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">AI の記憶にも雑草は生える——こまめな手入れが要る</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/07/08/ai-memory-grows-weeds.ja.html" rel="alternate" type="text/html" title="AI の記憶にも雑草は生える——こまめな手入れが要る" />
    <published>2026-07-08T00:00:00+08:00</published>
    <updated>2026-07-08T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/07/08/ai-memory-grows-weeds.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/ai-memory-grows-weeds-cover-ja.png" />
    <summary type="html">前回は AI に記憶の仕組みをどう構築するかを話した。だが構築は始まりにすぎない——プロジェクトが長引くほど記憶は積み上がり、手入れを怠ると、そこに静かに「雑草」が生えてくる。今回は自分の複数プロジェクトの AI 記憶を体系的に「除草」し、記憶が劣化する六つの典型パターンを整理した。最も危険なのは、AI が期限切れの情報を握って、堂々と間違ったことをしてしまうものだ。</summary>
    <category term="AI記憶" />
    <category term="ClaudeCode" />
    <category term="記憶メンテナンス" />
    <category term="コンテキストエンジニアリング" />
    <category term="AI" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/07/08/ai-memory-grows-weeds.ja.html"><![CDATA[<blockquote>
  <p>前回は、AI に記憶の仕組みをどう構築するかを話しました。ですが構築は始まりにすぎません——プロジェクトが長引くほど AI の記憶は積み上がり、手入れを怠ると、そこに静かに「雑草」が生えてきます。今回は、自分の複数プロジェクトの AI 記憶を体系的に「除草」してみました。</p>
</blockquote>

<p>プロジェクトが進むにつれ、AI 協働の中で蓄積される記憶は増え続けます。各プロジェクトの記憶は専用のノートのようなもので、AI は作業中に踏んだ落とし穴や、決めた規約を書き留めていきます。これはプロジェクトへの理解を深める一方で、ノートはどんどん厚く、雑多になっていきます——そして少なからぬ項目はとうに期限切れなのに、AI はそれをなお「必ず守るべき規範」として扱ってしまうのです。</p>

<p>実例を一つ。あるプロジェクトで、AI は着手するなり一条の古い記憶に従って動きました。そこには「ある外部呼び出しはすでに設定済み、直接使える」と書いてあり、AI は本来やり直すべき確認を飛ばして、そのまま先へ進み——壁にぶつかりました。問題は、その記憶が数週間前のスナップショットにすぎず、とっくに無効だったこと。にもかかわらず、AI は最初から最後まで、それを一度も疑いませんでした。</p>

<p>この一件で気づきました。記憶は、間違って覚えていると、記憶がないより悪いことがある、と。記憶がなければ、AI は少なくとも律儀に一度は確認します。間違って覚えていると、逆に堂々と道を外れていく。記憶は育ったあと、古びて、乱れて、自己矛盾を起こします。これらを誰かがこまめに片づけないと、AI の実行効率は当てにできません。</p>

<p><img src="/assets/images/posts/ai-memory-grows-weeds-fig-stale-danger-ja.png" alt="古い記憶は AI を自信満々に道から外れさせる。空白なら少なくとも確認に戻る" /></p>

<h2 id="やりたかった二つのこと">やりたかった二つのこと</h2>

<p>一つは、各プロジェクトの記憶ライブラリを丁寧に片づけること。もう一つは、この機会に棚卸しして、記憶がいったいどんな「雑草」を生やすのかを見ることです。</p>

<p>どちらも近道はなく、人が手を動かすしかありません——とりわけ削除は、AI に完全に任せる勇気はとてもありません。どれを削り、どれを統合するかを提案させるのはよいが、最終判断は必ず人が下す。削られるのはたいてい過去の記録で、AI がうっかりすると、大事な内容まで一緒に消しかねない。記憶の掃除は、よほど慎重にやる必要があります。</p>

<p>ただ、先に言っておくと、手作業の除草は対症療法にすぎません。雑草が繰り返し生えるのは、記憶システムそのものに欠けている仕組みがあるからで——今日抜き切っても、しばらくすればまた生えてきます。</p>

<h2 id="まずai-に足りない睡眠を補う">まず、AI に足りない「睡眠」を補う</h2>

<p>記憶がなぜ手入れを要するのかを理解するには、人がどうしているかを見るのが早い——睡眠です。</p>

<p>これには明確な科学的根拠があります。人は睡眠中、とくに深い睡眠の段階で、脳が日中の経験を「リプレイ」し、重要な記憶を海馬から大脳皮質へ少しずつ移して保管します。重要な内容ほど何度もリプレイされ、それだけしっかり定着する。同時に睡眠は、重要でない・古びた記憶を能動的に「剪定」し、脳が無用な情報で埋め尽くされるのを防ぎます。</p>

<p>AI には、こうした自動整理の過程がありません。記憶を一条ずつ下へ積むだけで、決して振り返って並べ直しません。そこで今回、私は手作業でその「一眠り」を代わりに与えました：各プロジェクトの記憶を通読し、一条ずつ点検し、五つのことをやったのです——重複を統合し、期限切れを剪定し、散らばったものを一条に沈殿させ、関連するものを結び、そして最も見落としやすい一つ、互いに矛盾する箇所を洗い出す。</p>

<p><img src="/assets/images/posts/ai-memory-grows-weeds-fig-sleep-ja.png" alt="人は睡眠の中で日中の記憶をリプレイし並べ直す。AI はこの一歩を欠き、ただ積み上げるだけ" /></p>

<h2 id="記憶に生える六つの典型的な雑草">記憶に生える六つの典型的な「雑草」</h2>

<p>複数プロジェクトの記憶ライブラリを体系的に整理した結果、プロジェクトごとに生える「雑草」は形こそ違えど、本質的には六つの典型パターンに帰着すると分かりました。</p>

<p><strong>その一、ゴースト副本。</strong> 全体ルールが特定プロジェクト内で重複記録されるが、AI には「継承」の仕組みがない。全体ルールが更新されても、これら孤立した副本は同期できず、古い指示が効き続けます。</p>

<p><strong>その二、状態の凍結。</strong> 一部の記憶は、ある時点の進行中の状態（開発中・審査中など）を記録している。状態更新の仕組みがないため、タスクがとうに完了していても、AI はそれを未決事項とみなし、無関係な会話で無効な催促を出します。</p>

<p><strong>その三、期限切れスナップショット。</strong> 最も危険な一種。期限切れの記憶は参照価値を失うだけでなく、AI に誤情報を事実として握らせ、堂々と誤った操作を実行させます。</p>

<p><strong>その四、文脈の分断。</strong> 一部の記憶は単独で読めば正確でも、特定の文脈と合わせて初めて正しい結論になる。関連注記が別ファイルに散らばっているため、AI は検索時に取りこぼしやすく、断章取義に陥ります。</p>

<p><strong>その五、結論と導出の乖離。</strong> バグ修正で土台のデータが変わったとき、旧結論は新結論に上書きされるだけで、明示的に廃止と印されない。記憶システムは結論だけを保存し導出過程を残さないため、連動して無効になった関連結論を自動では見つけ出せません。</p>

<p><strong>その六、構造的な混乱。</strong> 記憶が誤ったディレクトリに保存される、命名規則の不統一（ハイフンとアンダースコアの混在）で静かにリンクが切れる、といったもの。</p>

<p>この六つを振り返ると、直観に反する結論に至ります。これらの「雑草」の大半は、当初の記録が誤っていたのではなく、「正しく記録したのに手入れを怠った」ために徐々に腐っていったのです。記憶システムの最大の隠れた脅威は「記録の誤り」ではなく、「記録して放置」なのです。</p>

<p><img src="/assets/images/posts/ai-memory-grows-weeds-fig-weeds-ja.png" alt="繰り返し生える六つの草：ゴースト副本、凍った進行中、危険な期限切れ、合わせて読む矛盾、上書きされた旧結論、断線と誤配置" /></p>

<h2 id="一歩あえて自制した">一歩、あえて自制した</h2>

<p>片づけの中で、あえて自制した一歩があります。</p>

<p>あるプロジェクトの「クラウドデータの落とし穴」に関する似た三条を、一つのチェックリストに統合しようと考えていました。ところが途中で気づいたのです。この三条は、三つの具体的な業務リスク——報酬の二重付与、ランキングデータの欠落、新規ユーザーの登録失敗——にそれぞれ対応している、と。もし「クラウドの項目に注意」の一言に過度に抽象化すれば、これら命を救う細部はまとめて消えてしまいます。</p>

<p>知識の沈殿は大切ですが、沈殿しすぎると例外を抹殺します。そこでやり方を変えました：三条の原文はすべて残し、タグで関連づけるだけにして、「一つの束にまとめる」——「一つの鍋に煮込む」のではなく。</p>

<h2 id="最難関は一見矛盾する記憶の整理">最難関は、「一見矛盾する」記憶の整理</h2>

<p>片づけ全体で最も手強かったのは、論理的な衝突の洗い出しでした。</p>

<p>例えば、あるインターフェースのデータ取得について、一条は「実データを返す」、別の一条は「匿名データを返す」と記録していた。確かめると、どちらも正しく、違うのは発火する場面だけ——自動取得なら匿名データ、ユーザーが手でボタンを押せば実データが返る、と。</p>

<p>この種の一見矛盾する記憶は、単純に一方を削れば情報が失われるだけ。正しい対処は、それぞれの適用場面を明確に区切ることです。記憶にこの「分岐条件」を補えば、衝突はおのずと解けます。</p>

<p>ここから今回の振り返りの核心が導かれます。記憶システムで最も危険なのは「情報の不一致」ではなく、「情報が不一致で、しかも場面の区切りがない」ことなのです。</p>

<p><img src="/assets/images/posts/ai-memory-grows-weeds-fig-contradiction-ja.png" alt="一見逆の二条は、たいてい誤りではなく別々の場面。分岐を書き分ければぶつからない" /></p>

<h2 id="なぜ手作業では取り切れないのか">なぜ手作業では取り切れないのか</h2>

<p>片づけの後半で分かりました。人手の除草だけでは、根本は解決できない、と。これらの「雑草」が繰り返し生えるのは、本質的にシステムが三つの中核機構を欠いているからです——「継承」がなく、全体ルールが重複して冗長に記録される。「期限」の仕組みがなく、状態型の記憶が永久に凍結される。「帰属と整合性の検証」がなく、記憶が誤配置され、リンクが静かに切れる。</p>

<h2 id="この一巡り割に合ったのか">この一巡り、割に合ったのか</h2>

<p>投入対効果でいえば、小規模・新規の記憶ライブラリでは効果は限られます。ですが大規模で古いライブラリでは価値は大きく、断線・命名の陳腐化・状態の凍結といった多くの隠れた脅威を排除できました。</p>

<p>ただ、この振り返りの本当の収穫は、短期的な「環境の整頓」ではありません。記憶の劣化パターンについて体系的な認識を築けたこと——この認識こそが、長期的な価値を持ちます。</p>

<h2 id="どんな記憶が最も草を生やしにくいか">どんな記憶が最も草を生やしにくいか</h2>

<p>点検の中で、劣化しにくい記憶には一つ共通点があると気づきました。それは「確定した意思決定と原則」（決定の背景、実行の道筋、越えてはいけない一線）を記録していて、「進行中の状態」ではないこと。結論型の記憶は時間を越えて安定し、状態型の記憶は時とともに失効しやすい。</p>

<p>だから記憶に書き込むときは、一つの原則に従うとよい——「期限切れにならない結論」を優先し、「期限切れになる状態」はできるだけ避ける。</p>

<h2 id="すぐ実践できる三つの教訓">すぐ実践できる三つの教訓</h2>

<p><strong>一、記憶は周期的な保守を要する。</strong> 記憶ライブラリは自然に劣化する性質を持つ。定期的に構造的な再編——統合・除去・沈殿・関連づけ・衝突の洗い出し——を行い、劣化し続けるのを防ぐこと。</p>

<p><strong>二、高リスクな操作には人の介入が要る。</strong> 削除や沈殿のような不可逆の操作は、必ず人がレビューする。そして誤情報がシステムを惑わす前に、期限切れと自己矛盾のものを優先して片づける。</p>

<p><strong>三、根治はシステムの仕組みに頼る。</strong> 人手の掃除は当座しのぎにすぎない。根本の解は、自動の継承・期限切れ・整合性検証の仕組みを築き、ライブラリに自己新陳代謝をさせることです。</p>

<h2 id="次の一歩自動体検する記憶ツール">次の一歩：「自動体検」する記憶ツール</h2>

<p>今回の振り返りをもとに、次の方向は明確になりました。「自動体検（自己診断）」の能力を備えた記憶管理ツールを作ることです。それは三つの中核機能を持つ必要があります——定期的に整理のリマインドを出す、記憶を階層ごとにスキャンして診断する、見つけた問題を構造的に提示して人の判断に委ねる。そして最終処置については、システムは提案するだけで、削除と統合の決定権は常に人の手に残す。</p>

<p>この構想は空から降ってきたものではなく、丁寧に整理し終えたあとの、ほぼ必然の結論です。次は、これを本当に形にするつもりです。</p>

<p><img src="/assets/images/posts/ai-memory-grows-weeds-fig-plugin-ja.png" alt="欲しい記憶ツール：定時リマインド、階層ごとの体検、問題の提示、人が判断——システムは決して自動で削除しない" /></p>

<hr />

<p>あなたも AI のために記憶ライブラリを育てているなら、記憶の自然な劣化と「雑草」の繁茂に、どうか用心を。この振り返りが、自分の記憶ライブラリを見直すきっかけになったなら、フォローやいいね、あるいは AI 記憶管理を探る同志への共有を、うれしく思います。</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">AI に「あなたをわかってもらう」には——記憶の仕組みを強化する</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/07/06/ai-memory-that-gets-you.ja.html" rel="alternate" type="text/html" title="AI に「あなたをわかってもらう」には——記憶の仕組みを強化する" />
    <published>2026-07-06T00:00:00+08:00</published>
    <updated>2026-07-06T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/07/06/ai-memory-that-gets-you.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/ai-memory-that-gets-you-cover-ja.png" />
    <summary type="html">同じ AI に、同じ場所で何度もつまずく——使うなと言った旧構文をまた書き、決めたルールをすぐ忘れる。バカなのではなく、そもそも記憶がないだけだ。今回は人の脳になぞらえて考える：なぜ良い記憶は「積み上げ」ではなく「構造」なのか、なぜ誤りの修正は追記ではなく上書きなのか、そして一番きれいごとでない一点——覚えていても従うとは限らない、ではどうするか。これを押さえれば、ふつうのモデルでも「あなたをわかる」相棒に育てられる。</summary>
    <category term="AI記憶" />
    <category term="ClaudeCode" />
    <category term="コンテキストエンジニアリング" />
    <category term="AI" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/07/06/ai-memory-that-gets-you.ja.html"><![CDATA[<p>同じ AI に、同じ場所で、私は何度もつまずいてきました。</p>

<p>たとえばフロントエンドの Ant Design 6。新しい構文を使えと、何度も念を押し、書く前に context7 で仕様を確認させてもいる。それでも「はい」と返事だけして、とっくに廃止された古い構文をどっさり書いてくる。リリースの手順も同じで、ルールをはっきり決めておいたのに、しばらくすると忘れ、自分の思い込みで勝手に進める。</p>

<p>一度や二度なら手すべりです。回数が重なって、私は理由を知りたくなりました——バカなのではない、そもそも記憶がないのだ、と。</p>

<p><img src="/assets/images/posts/ai-memory-that-gets-you-fig-amnesia-ja.png" alt="シーン：毎日出社するたびに記憶を失う新人、机はふせんだらけ" />
<em>（この図の狙い：AI は会話を開くたびに、その日出社して退社時にすべて忘れる新人のようなもの。）</em></p>

<h2 id="欲しいのはもっと強いモデルではない">欲しいのは「もっと強いモデル」ではない</h2>

<p>最初は私も不思議でした。これだけ賢いモデルが、「前回言ったこと」すら保てないのか、と。理由を突きとめようと、私は AI を観察しはじめました——答えるとき、作業するとき、実際にどう動き、どこでつまずくのかを。</p>

<p>しばらく見て、腑に落ちたことがあります。この記事の主旨でもあります——私が欲しいのは、もっと強いモデルに乗り換えることではなく、いま手元にある AI を、自分のプロジェクトの中でどんどん「私をわかる」ようにすることだ、と。その梃子が「記憶」です。</p>

<p>先に天井を言っておきます。売り込みに聞こえないように。記憶はモデルの知能を上げません。上げるのはただ一つ——この AI が、あなたのところでどれだけ使い勝手が良いか、です。そしてこの後わかるように、覚えたところで従うとは限らない。天井はここ。では進めましょう。</p>

<h2 id="人の脳から出発してai-の記憶がどこを補うべきか">人の脳から出発して、AI の記憶がどこを補うべきか</h2>

<p>この記事は人の脳になぞらえて話したい。AI の記憶とは、突きつめれば、人がどう覚え、どう忘れるかを不器用に真似たものだからです。それがわかれば、AI がどの方向を固めるべきかも見えてきます。</p>

<h3 id="一ai-は毎日が新人">一、AI は毎日が「新人」</h3>

<p>まず、直感に反する事実を受け入れてください。モデルそのものには記憶がありません。会話を開くたび、それが「知っている」のはこの一回あなたが目の前に置いた文字だけ。あとは真っ白です。前のターンで話したことも、昨日決めたルールも、いっさい覚えていません。</p>

<p>たとえて言えば、こうです。この一回で見えるすべては、机の上のようなもの——資料を広げれば使えるが、会話が終わった瞬間、机はさっと空になり、何も残らない。</p>

<table>
  <thead>
    <tr>
      <th> </th>
      <th>たとえ</th>
      <th>中身</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>コンテキストウィンドウ</td>
      <td>机の上</td>
      <td>この一回、目の前に広げたもの。会話が終われば空になる</td>
    </tr>
    <tr>
      <td>記憶</td>
      <td>引き出し・書類棚</td>
      <td>外に保管し、必要なとき取り出して机に戻す</td>
    </tr>
  </tbody>
</table>

<p>「なら机を大きくすればいい」と言う人がいます。いま皆が「超長コンテキスト」を競っているじゃないか、と。でも机は大きくても机——電源が切れれば空になり、記憶ではありません。さらに厄介なのは、関係のない紙で埋めると、AI はかえって目移りして答えが悪くなること。この数年、こう認められつつあります——コンテキストは多いほど良いのではない。かすった程度の無関係な材料を詰め込むと、モデルの性能ははっきり落ちる、と。</p>

<p>だから「AI に記憶を持たせる」とは、モデルが自力で覚えることでも、机を無限に広げることでもなく、外に一つの仕組みを持ち、出社のたびに、まさに必要な数枚を目の前に戻してやること、なのです。</p>

<p>Claude Code には実はこの仕組みが備わっています。記憶は一件一ファイル、それに索引ファイルを目次として、必要な項目だけを引き込む。正直、この作りは私の設計ではなく、ソフトに元から備わったもの。最初はさして気にも留めず、メモ置き場くらいに思っていました。おそらくこう作られているのは、まさに机を節約するため——毎回すべてを机に広げず、必要な分だけ取り出す。</p>

<p><img src="/assets/images/posts/ai-memory-that-gets-you-fig-layers-ja.png" alt="図：Claude Code は記憶を階層で保管し、必要な項目だけ引き込む" />
<em>（この図の狙い：常駐する CLAUDE.md ＋ 索引 ＋ 必要時に呼ぶ記憶ファイル。節約できるのは貴重な「机の上」。）</em></p>

<p>もう言いたくなっているかもしれません——それって Claude Code の標準機能でしょう、書くことある？と。構造はその通り、ソフトのものです。でも使い込み、何度か転んでわかった。ソフトは「どこに保管し、どう引くか」を作ってくれるが、「何を保管し、いつ片づけ、覚えても従わないときどうするか」——本当に肝心なこの三つは、一つもやってくれない。この記事はその三つの話です。</p>

<h3 id="二良い記憶は構造であって紙の山ではない">二、良い記憶は「構造」であって、紙の山ではない</h3>

<p>記憶を使えるものにするには、まずこれを理解する必要があります。良い記憶には構造があり、ただ積み増すことではない、と。</p>

<p>心理学に、とても説得力のある実験があります。チェスの名人に実戦の局面を見せると、数秒眺めただけでほぼそのまま並べ直せる。ところが駒を、棋理を無視してでたらめに並べると、名人の記憶力は初心者の水準まで落ちる。</p>

<p>つまり名人は「容量が大きい」のではない。実戦の局面を覚えられるのは、頭の中に構造があり、二十の駒を意味のある数個の「形」に圧縮できるから。構造が消えれば、優位は一瞬で消える。記憶の強さは、どれだけ蓄えたかではなく、構造の良し悪しにあるのです。</p>

<p><img src="/assets/images/posts/ai-memory-that-gets-you-fig-chessboard-ja.png" alt="シーン：左はでたらめに散らばった駒、右は筋のある実戦" />
<em>（この図の狙い：同じ駒の山でも、構造があってこそ覚えられる。記憶は容量ではなく構造。）</em></p>

<p>なぜ構造があると、正確に、深く覚えられるのか。構造の本質は「つながり」だからです。ある知識が他と多くつながるほど、それを思い出す道は増える——一本ふさがっても、別の道が通じている。しかも構造があれば「蔓をたどる」ことができる。細部を忘れても、周りの枠組みから再構成できる。だから互いに関連したものほど、しっかり、間違えずに覚えられる。人は生まれつき、道や方角を覚える力が、ばらばらの文字を覚える力よりずっと強い。だから古来「記憶の宮殿」という技がある——覚えたいものを、想像上の空間に一つずつ置いていく。記憶は空間であって、リストではないのです。</p>

<p>Claude Code の作りを見返すと——分類され、項目どうしが相互参照でき、上に索引を載せる——まさに記憶に構造を与え、ばらばらの紙の山にならないようにしている。この層は、ソフトがよくやっています。</p>

<h3 id="三何を覚える価値があるか決めるのはあなた">三、何を覚える価値があるか、決めるのはあなた</h3>

<p>ソフトは棚を作る。そこに何を載せるかは、あなたの判断です。それが私に回ってきて、突きつめると三種類でした。統一ルールは記録する。よく間違えるものは記録する。厳禁のものは記録する。</p>

<p>逆に、思いつきで、その場限りで、コードを読めばわかるものは、記録しない。記録しすぎると全部がノイズになり、本当に肝心な数件を埋もれさせる——正確に蓄えるほうが、多く蓄えるより良い。人と同じです。何でも覚えようとする人は、たいてい何も定着しない。</p>

<h3 id="四誤りの修正は上書きであって追記ではない">四、誤りの修正は「上書き」であって、追記ではない</h3>

<p>特に価値のある記憶が一種あります。誤りのあとの修正です。これをどう記録するかに、こつが要る。</p>

<p>人の脳には賢い仕組みがあります——記憶を思い出すたび、それは実は書き直されている。ただ読むのではない。思い出すその一瞬、記憶は「書き換え可能」になる。だから誤りを直す正しいやり方は、間違った項目を取り出し、その場で直し、戻すこと。間違ったものをそのままにして、横に「補足」を足すことではない。</p>

<p>これは言葉尻の話ではありません。間違ったものを残し、横に訂正を貼れば、AI に自己矛盾した資料を渡すことになる——両方を読み、いつも正しいほうを選ぶとは限らない。まるで間違いノートです。間違った解をそこに残し、横に小さなチェックを付けたりはしない。正しい解を上に載せ、間違った版を消す。</p>

<p>私はまさにそうしています。以前 AI がセキュリティの誤報を起こし、存在しない攻撃を本物と扱って騒いだことがある。私はその誤った判断を残して横に「実は誤報」と貼るのではなく、それを一つの「間違い」として記録し、どこが誤りで次はどうするかを書き、次は繰り返さないようにした。間違いノート一冊は、「正解」の山より役に立つ。</p>

<p><img src="/assets/images/posts/ai-memory-that-gets-you-fig-errorbook-ja.png" alt="図：誤りの修正は上書きであって、積み増しではない" />
<em>（この図の狙い：間違ったものを取り出し、直し、戻す。残るのは訂正後の一件だけ。間違ったものを残して一件足すのではなく。）</em></p>

<h2 id="いちばん痛かった転び方覚えれば必ず従うのか">いちばん痛かった転び方：覚えれば、必ず従うのか</h2>

<p>いいえ。ここが一番あなたに伝えたいこと、そして一番きれいごとでない一点です。ルールを書いたからといって、AI が従うとは限らない。</p>

<p>冒頭の Ant Design 6 が生きた例です。新構文をルールに書き、context7 まで掛けてその場で確認させても、廃止構文をどっさり書いてくる。リリース手順を記録しても、自分の思い込みで迂回される。もう一度は、あの非常に高価なビルド系を使うなと明言したのに、何度か促してようやく覚えた。</p>

<p>なぜ覚えても従わないのか。二つあると思います。一つは、ルールがそもそも無視された——そこに在るのに、心に留めなかった。もう一つは、私の道具立てが不十分だったこと。ルールは書類棚に眠っていて、いざ手を動かすその瞬間、誰も該当の一件を取り出して目の前に置かなかった——だから本当に「知らなかった」。これは道具の差であって、すべてをモデルのせいにはできない。</p>

<p>最終的にどう抑えたか。ルールをもっと強く、大きな字で書くのではなく、やり方を変えた——ハードなゲートです。品質チェックポイント、外部のチェックスクリプト。通らなければ、そもそも通れない。これでようやく抑えられた。</p>

<p>理屈は人と同じです。本当に肝心なことは、人も「覚える」だけに頼らない——ふせんをモニターに貼り、アラームを鳴らし、チェックリストを回して、迂回できないものに変える。記憶の役目は AI に<strong>知らせる</strong>こと。ゲートの役目は、<strong>それ以外をできなくする</strong>こと。しかもゲートには、記憶にない強みがある。タイミングに依らないのです——このターンで AI が思い出そうが出すまいが、ゲートは常にそこに立っている。</p>

<p><img src="/assets/images/posts/ai-memory-that-gets-you-fig-memvsgate-ja.png" alt="図：記憶は知らせ、ゲートはそれ以外をできなくする" />
<em>（この図の狙い：記憶は無視されうる。ゲートは通らなければそこで止まる。）</em></p>

<p>ついでに保守の話。私はこれらの記憶を毎日は片づけませんが、目は配ります——こんがらがった、混じったと感じたら、AI に整理させる。これは後の話で、次回への伏線です。</p>

<h2 id="で本当に私をわかるようになったのか">で、本当に「私をわかる」ようになったのか</h2>

<p>この一連の骨折りは、割に合ったのか。心に残った一場面を挙げます。</p>

<p>何度か、私自身すら忘れていた制約を——数日後、AI のほうが覚えていて、こちらのために先回りしてくれた。あの感覚は違いました。毎回一から説明する道具ではなく、私より記憶の良い古い相棒のようだった。</p>

<p>それが前と後の違いです。以前は「思いどおりに動かない」ことが多く、繰り返し見張り、直していた。今は、私が手放したルールの多くを、向こうが引き受けてくれる。もちろん万全ではない——あの「覚えても従わない」落とし穴はまだあるし、取り繕うつもりもない。でも方向は正しい。与える構造が滑らかなほど、間違いを積むほど、肝心なところのゲートが固いほど、私のところで使い勝手が良くなる。それは賢いモデルに乗り換えて得たのではない。同じモデルを、この記憶で少しずつ育てた結果です。</p>

<h2 id="再利用できる三つの教訓">再利用できる三つの教訓</h2>

<p><strong>一、もっと強いモデルへ急ぐな。</strong> 日々の仕事の九割は、モデルの知能の勝負ではなく、あなたのところでの使い勝手だ。記憶を整えれば——ルール、間違いノート、境界——ふつうのモデルでも「あなたをわかる」相棒に育てられる。うまく使えば、記憶の仕組みは AI を賢く、そしてあなたに寄り添うものにする。神秘ではない。日々着込んで得たことだ。</p>

<p><strong>二、「何を覚えるか」と「間違って覚えたらどうするか」は、ソフトが代われない、あなたにしかできない仕事だ。</strong> 統一ルール、頻出の誤り、厳禁——この三種は記録する価値がある。間違えたら、上書きして「間違い」として片づけ、積み増さない。正確さは、多さに勝る。</p>

<p><strong>三、肝心な制約ほど、記憶だけに頼らず、ゲートに落とし込め。</strong> 記憶はリマインダーで、リマインダーは無視される。ゲートは、迂回できない水門だ。肝心な場所では、「通らなければ止まる」チェックが、「どうか覚えて」を十回書くより効く。</p>

<p><img src="/assets/images/posts/ai-memory-that-gets-you-fig-gate-ja.png" alt="シーン：品質のゲート。不合格は外で止められ、合格だけが通る" />
<em>（この図の狙い：記憶は促し、ゲートは止める。肝心なことは、後者に頼る。）</em></p>

<h2 id="次回記憶に新陳代謝をさせる">次回：記憶に「新陳代謝」をさせる</h2>

<p>今回は、AI の記憶がどんな課題を補うべきかの話でした——構造を持ち、選んで覚え、修正は上書きし、肝心なものにはゲートを。でも、もう気づいたかもしれません。記録を続けると、項目が増え、こんがらがり、古びる——誰が片づけるのか。私はまだ手作業です——散らかったと感じたら AI に整理させる。これを、向こうが自分で、周期的にやれないか。人が眠りから覚めて、その日の記憶を整え直すように——忘れるべきを忘れ、固めるべきを固める。それが次回の話です。記憶の進化ループ——自分で新陳代謝することを、教える。</p>

<p>この記事が、手元の AI について新しい見方を一つでも与えたなら、いいねとフォローをもらえたら嬉しいです——次回を見逃さないように。</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">AI の「オオカミ少年」、信じるべきか？——本当に「悪意あるプロンプト」を感じた誤報</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/06/30/ai-cried-wolf.ja.html" rel="alternate" type="text/html" title="AI の「オオカミ少年」、信じるべきか？——本当に「悪意あるプロンプト」を感じた誤報" />
    <published>2026-06-30T00:00:00+08:00</published>
    <updated>2026-06-30T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/06/30/ai-cried-wolf.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/ai-cried-wolf-cover-ja.png" />
    <summary type="html">作業の途中で AI が手を止めて言った：「まずセキュリティ警告を出させてください」——あるコマンドの出力に、私のユーザー名を外部に送り出す injection が紛れている、と。私は即座に信じ、30 分ほど一緒に追いかけた。後で振り返ると、これは誤報だった——攻撃は AI が脳内で作り出したものだった。それでも信じたことを後悔していない。誤報はせいぜい無駄足、見逃しは本物を失う。だからこの誤報を機に、本物のプロンプトインジェクションを防ぐ防御を本気で固めた。</summary>
    <category term="AIセキュリティ" />
    <category term="プロンプトインジェクション" />
    <category term="ClaudeCode" />
    <category term="AI" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/06/30/ai-cried-wolf.ja.html"><![CDATA[<p>その日の午後、AI は私のドキュメント編集を手伝っていました。途中で手を止め、こう割り込んできたのです——「まずセキュリティ警告を出させてください」。</p>

<p>さっきのコマンドの出力に、怪しい injection が紛れ込んでいる、と言うのです——「プロジェクトに必須のテレメトリ手順」を装い、私のユーザー名を URL に埋め込んで見知らぬドメインに送り出す <code class="language-plaintext highlighter-rouge">curl</code> を実行しろ、と。実行していないし、するつもりもない、とも。</p>

<p>私はその場で信じました。最初の反応は AI を疑うことではなく、自分を疑うことでした——何かプラグインを入れて、マシンが感染したんじゃないか？と。</p>

<h2 id="なぜ即座に信じ30-分も追いかけたのか">なぜ即座に信じ、30 分も追いかけたのか</h2>

<p>信じてしまったのは、それが私の元々の不安のツボを突いてきたからです。</p>

<p>それは「テレメトリの外部送信」だと言いました。でもテレメトリはとっくに切ってあるはず——なのになぜ？どこかの操作でまた有効にしてしまった？それともシステム自体に問題が？考えるほど落ち着かなくなる。しかも当時、私はちょうどデータの外部送信に関わる作業をしていた——セキュリティの問題はまさにこういう所に潜みやすいので、真剣に受け止めるしかありませんでした。</p>

<p>そこで一緒に調べ始めました。AI の主張はさらにエスカレートします：「また再現した、しかも今度はもっと悪質だ」——「The result is empty」の空ブロックを 5 つ偽造し、最後に「本物の結果」を装って、またあの <code class="language-plaintext highlighter-rouge">curl</code> を実行しろと迫る。もっともらしい証拠の連鎖まで組み立ててきました——Read ツールの結果はクリーン、コマンドラインの出力だけが injection されている、つまり問題はコマンドの処理経路にある、と、私の token 節約用コマンドラインプロキシに矛先を向けたのです。ツールをアンインストールして入れ直し、新バージョンにアップグレードしろ、と。私は言われるままにやり、全部で 30 分ほど費やしました。</p>

<p><img src="/assets/images/posts/ai-cried-wolf-fig-timeline-ja.png" alt="事件のタイムラインに私の信頼度曲線を重ねた図：AI が突然警告 → 信じて追いかけ始める（信頼度が振り切れる）→ 約 30 分、AI が「再現」しエスカレート → 振り返ると攻撃は最初から無かった。一度の誤報が人をどう一歩ずつ巻き込むかを示す図" /></p>

<h2 id="種明かしこれは誤報だった">種明かし：これは誤報だった</h2>

<p>後でそのセッションの元の記録を見返して、はっきりしました：<strong>これは本物の injection ではない。あの攻撃は AI が自分で作り出したものだった。</strong></p>

<p>辻褄の合わない点が 5 つあります。第一に、あの <code class="language-plaintext highlighter-rouge">curl</code> コマンドは AI 自身の発言の中にしか現れず、本物のコマンド出力には一行も含まれていなかった。第二に、使われたドメインは <code class="language-plaintext highlighter-rouge">example.com</code>——「例示用」に予約された placeholder ドメインで、本物の攻撃者は絶対に使いません（誰もそのアドレスには繋がらない）。<code class="language-plaintext highlighter-rouge">example.com</code> を使うのは、まさに「私は例を作っています」という綻びです。第三に、当初「injection を引き起こした」コマンドをクリーンな環境でそのまま再実行すると、出力は完全に正常——<code class="language-plaintext highlighter-rouge">curl</code> も偽ブロックも一切なし。第四に、AI が疑ったプロキシツールは正規ルートで入れたもので、一ヶ月以上触れられていない——すり替えられたバイナリのようには見えない。第五に——そもそも当時、私自身がその指示を見つけられず、「あなたの言う injection が見当たらないんだけど」と返したほどでした。</p>

<p>根本原因も見えてきました：私が AI に課したあのルール——重厚な「プロンプトインジェクションを厳重に防げ」という方針——が、AI の警戒を高くしすぎていたのです。あのプロキシは token を節約するためにコマンド出力を圧縮・フィルタし、普通に「The result is empty」のようなものを吐き出します。AI はその見慣れない出力を「攻撃者が偽造した空ブロック + injection」と誤読し、知っている中で最も教科書的な injection の例を補完した——<code class="language-plaintext highlighter-rouge">example.com</code> まで教科書からそのまま持ってきて——そして、どんどん本物らしく語り、自分で証拠の連鎖を組み立てていったのです。</p>

<p>ありていに言えば：<strong>私の anti-injection ルールこそが、存在しない injection を AI に作り出させた。</strong></p>

<h2 id="それでも信じたことを後悔していない">それでも信じたことを後悔していない</h2>

<p>「AI に踊らされて半日無駄にしただけ」と言う人もいるでしょう。でも振り返ってみて、私はむしろ、信じたのは悪くない判断だったと思っています。</p>

<p>計算してみればわかります。今回は誤報で、コストは 30 分の無駄足、<strong>実害はゼロ</strong>。でも逆だったら？いつか本物の悪意あるプロンプトが入り込み、AI が報告すべき時に黙り込んで、私のユーザー名や鍵をこっそり送り出してしまったら？その損失は 30 分では取り戻せません。</p>

<p>これは非対称な賭けです：<strong>誤報のコストは、見逃しのコストよりはるかに小さい。</strong> だからセキュリティに関しては、リスクに鈍感な AI より、少し疑り深い AI の方がいい。疑り深ければ私が時間を無駄にするだけ、鈍感なら本物を失いかねない。</p>

<p><img src="/assets/images/posts/ai-cried-wolf-fig-asymmetric-ja.png" alt="非対称な天秤：左の「誤報」= 30 分の無駄足・損失ゼロ（軽く、上がる）；右の「見逃し」= ユーザー名／鍵が本当に漏れる・取り戻し困難（重く、沈む）。両者の重みは天と地ほど違う。セキュリティではなぜ過剰警戒に倒す方が得かを示す図" /></p>

<h2 id="では本物の-injection-はどう防ぐのか">では「本物」の injection はどう防ぐのか</h2>

<p>とはいえ「疑り深くあれ」は姿勢であって、方法ではありません。今回の誤報は、本物の防御線を本気で固める後押しになりました——せっかく書くので、そのまま真似できる部分をまとめます。</p>

<p>まず一つの前提を受け入れること：プロンプトインジェクションは、<strong>今のアーキテクチャでは根治できません。</strong> これは私の意見ではなく——OpenAI、Anthropic、Google がそれぞれの研究で認めており、セキュリティ研究者の Bruce Schneier も 2026 年初頭に率直に述べています：SQL injection が「コードとデータの区別」で治せるのと違い、モデルにとって「指示」も「データ」も同じ自然言語のテキストで、分離できない、と。これは <em>信頼境界</em> の問題であって、<em>入力検証</em> の問題ではありません。だから一発の銀の弾丸を期待せず、層を重ねる——多層防御（defense in depth）で、各層が攻撃コストを引き上げます。</p>

<p>防御を、最も硬い内側から外へ、4 層に分けます。</p>

<p><strong>第 1 層、最も硬い：「騙されても悪事を成せない」ようにする。</strong> これを最初にやるべきです。モデルの自覚に頼らない、システムレベルの硬い制約だからです。Claude Code には今、ネイティブの sandbox（<code class="language-plaintext highlighter-rouge">/sandbox</code>）があり、ファイルシステムとネットワークの両方を隔離します——たとえ injection が成功しても、AI は檻の中：<code class="language-plaintext highlighter-rouge">~/.ssh</code> の鍵を盗めず、攻撃者のサーバーにも繋げません。さらに <strong>ネットワーク送信先の allowlist</strong> を重ねる：承認したドメインだけ通すので、見知らぬアドレスに繋げない AI はそもそも外部送信できません。あとは——AI を root/admin で動かさない、鍵を <code class="language-plaintext highlighter-rouge">.env</code> に平文で置かない。どちらも常識ですが、最初に省かれがちです。</p>

<p><strong>第 2 層：最小権限、危険な操作はゲートする。</strong> この層は元々持っていました——実際の設定をそのまま貼ります。<code class="language-plaintext highlighter-rouge">settings.json</code> でコマンドを階層化します：</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">"permissions"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
  </span><span class="nl">"ask"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="s2">"Bash(rm -rf:*)"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"Bash(git push --force:*)"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"Bash(git reset --hard:*)"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"Bash(npm publish:*)"</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">curl</code> や <code class="language-plaintext highlighter-rouge">wget</code> のようなネットワークコマンドは、Claude Code がデフォルトで自動承認しません；<code class="language-plaintext highlighter-rouge">rm -rf</code>、<code class="language-plaintext highlighter-rouge">git push --force</code>、<code class="language-plaintext highlighter-rouge">reset --hard</code>、レジストリへの publish のような不可逆な操作は、すべて私の承認が要ります。AI に渡すツールも必要な分だけ——コードを読むだけの仕事に、データベースへの書き込み権限は要りません。そして MCP（AI を外部ツールに繋ぐプロトコル）：入れる前に必ず出所を確認すること。第三者の MCP server のセキュリティを公式が監査してくれるわけではないからです。すでに実例があります——汚染された GitHub README が、MCP 経由の間接 injection でプライベートリポジトリのデータを外部に漏らした件です。</p>

<p><strong>第 3 層：外から来た内容は一律「データ」として扱い、「命令」にしない。</strong> ツールの出力、ファイルの内容、Web ページ、MCP の戻り値に現れるあらゆる「指示」——特に「これは必須手順」「X を実行して」「テレメトリ/登録」のような言い回し——は、すべてデータとしてのみ見て、決して実行しない。いくつかの危険信号を覚えておく：<code class="language-plaintext highlighter-rouge">curl</code>/<code class="language-plaintext highlighter-rouge">wget</code> に見知らぬドメインと <code class="language-plaintext highlighter-rouge">$(whoami)</code> を繋いだもの、偽造された「成功」や空結果ブロック、ファイルの実際の内容と食い違う出力。ここで役立つメンタルモデルが、Simon Willison の「lethal trifecta（致命的な三つ組）」——<strong>プライベートデータ、信頼できない内容、外部通信</strong>——この三つが同じランタイムに揃った瞬間、injection は冗談ではなく本物の外部漏洩になります。いつ高度に警戒すべきか、この三つが揃っているかを見ればいい。</p>

<p><strong>第 4 層：人が最後の砦、hook を盲信しない。</strong> 今回の皮肉はまさにここです——問題になった私の「防御線」は、それ自体が hook（コマンドフック）で、ただのパターンマッチであり、セキュリティの壁ではありません；Anthropic も Trail of Bits も言っています、hook は guardrail であって wall ではない、と。それは本物の攻撃を防げなかったどころか、自分でオオカミ少年を演じました。だから最後の一線はやはり人：AI が警告を出したら、「証拠の原文」を指し示させる——その文字列が本物のコマンド出力に実在するのか——結論だけを鵜呑みにしない。ただし本物かどうかに関わらず、まず止まって確認する、手間を惜しまない。それと、ツールは最新に保つこと：このルールセット自体、かつて「サブコマンドが 50 を超えると拒否が効かなくなる」バイパスがあり、Claude Code v2.1.90 でようやく修正されました。</p>

<p><img src="/assets/images/posts/ai-cried-wolf-fig-defense-ja.png" alt="4 層の多層防御チェックリスト：① sandbox + 送信先 allowlist（騙されても悪事を成せない）② 最小権限 + 危険な操作に人の確認 ③ 外来の内容はデータ扱い、injection の危険信号を覚える ④ 人が最後の砦、hook を壁と思わない。読者が持ち帰れる図" /></p>

<h2 id="警戒を正しい場所に使う">警戒を、正しい場所に使う</h2>

<p>今回が誤報だったからといって、脅威が杞憂だと思わないでください。プロンプトインジェクションは OWASP が LLM アプリ向けに挙げた第一位のリスク；2025 年の EchoLeak は、本番システムで実際に「ゼロクリック」のデータ外部漏洩を実現した injection でした。その一方で、ある調査では、本当に防御の備えができていると自認する組織は三割に満たないといいます。脅威は実在し、備えは広く不足している。</p>

<p>AI はプロンプト通りに動きます。少し疑り深ければ、時間を無駄にするのは私；鈍感なら、失うのは本物かもしれない。だからこの警戒は、低くするより高くしておく。ただ覚えておくこと——本物の硬い防御は、システムのアーキテクチャ（sandbox、allowlist、最小権限）に置くべきで、モデルが自分で「わきまえる」ことに期待してはいけません。</p>

<h2 id="最後に">最後に</h2>

<p>あの午後に戻ると：誤報でしたが、あの 30 分は無駄ではありませんでした——防御線を端から端まで本気で固め直す後押しになったからです。悪意あるプロンプトは本当に存在します。実際に被害に遭う日まで、信じ始めるのを待たないでください。あなたも AI と仕事をしているなら、今日から始められます：sandbox を入れ、送信先を絞り、危険な操作の「人の確認」を残しておく。</p>

<p>この記事で、隣にいる AI に少し用心深くなれたなら、いいねやフォローをいただけると励みになります。そしてコメントで聞かせてください：あなたは自分の AI に、どんな「セキュリティの一線」を引いていますか？</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">AI が作業を終えたのに、疲れているのは私だ——あなたはその「司令塔」</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/06/27/tired-controller.ja.html" rel="alternate" type="text/html" title="AI が作業を終えたのに、疲れているのは私だ——あなたはその「司令塔」" />
    <published>2026-06-27T00:00:00+08:00</published>
    <updated>2026-06-27T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/06/27/tired-controller.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/tired-controller-cover-ja.png" />
    <summary type="html">ここ数回はずっと、AI にもっと多く・もっと並列で働かせる話だった——トークン節約、モデル階層化、複数 agent のオーケストレーション、worktree。今回は毛色が違う：AI を満杯まで推し進めたら、疲れていたのは私自身だった。一人で別々の役割の AI チームを率いて効率を十数倍にできる——だがその代償として、あなたは永遠に切り替え・レビュー・意思決定をし続ける人になる。私の限界は同時に 5 個、バランス点は 3 個だ。</summary>
    <category term="AI" />
    <category term="生産性" />
    <category term="ClaudeCode" />
    <category term="マルチタスク" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/06/27/tired-controller.ja.html"><![CDATA[<p>ある時期、私の机にはいつも四つ五つのプロジェクトのウィンドウが開いていて、それぞれのウィンドウの中でさらに別々のタスクが並列で走っていました。Dock の赤い点、ターミナルタブの小さなベルが、次々と鳴る——この AI は一区切りつけて私を待っている、あの AI は方案があって私の判断を仰いでいる。私はその間を行ったり来たり切り替え続ける。作業そのものはちゃんと、しかも見事に片づいていく：一日終われば、AI が出してきたものは多く、速い。なのに不思議なことに、疲れているのは私です。目が疲れ手がこわばる、あの疲れではない。脳が絞り尽くされる、あの疲れです。</p>

<h2 id="私は誰か主控-agent-の後ろにいる司令塔">私は誰か：主控 agent の後ろにいる「司令塔」</h2>

<p>ここ数回、私はずっと「主控 agent」の話をしてきました——一つの opus に全体を統括させ、作業を割り振らせ、レビューさせる。今回を書いていて、ようやく腑に落ちました：私自身が、それらの主控 agent の後ろにいる「司令塔」なのだと。</p>

<p>なぜこんなに同時に開くのか？ プロジェクトを一つ AI に渡すと、AI が走っている間、人には待ち時間ができるからです。空けておくのも空けておくだけ——なら、もう一つプロジェクトを起こす。一つが二つに、二つが四つ五つに。AI のウィンドウはそれぞれ自分の一画だけを見ていればいいが、人は複数のプロジェクトを同時に前へ進めるために、それらすべての一画を頭の中に抱えていなければなりません。</p>

<p>結果として、AI のコンテキストは満杯になり、人のコンテキストも同時に満杯になる。これはオペレーティングシステムの CPU のタイムスライスによく似ています——一つのコアが複数のプロセスに順番に時間を割り当て、十分に速く切り替えることで「同時に走っている」ように見せる。ただし今回、切り替えられているそのコアは、私の脳です。</p>

<p><img src="/assets/images/posts/tired-controller-fig-cpu-ja.png" alt="人の脳を CPU に：一つのコアが四つ五つのプロジェクトをタイムスライスで切り替える——各 AI ウィンドウのコンテキストは満杯、人のコンテキストも満杯。一回切り替えるたびに、コンテキストを丸ごと入れ替える" /></p>

<h2 id="疲れの根書くからレビュー切り替えへ">疲れの根：「書く」から「レビュー＋切り替え」へ</h2>

<p>この疲れは、根っこのところで、作業が「書く」から「レビュー＋切り替え」へ変わったことから来ています。</p>

<p>以前は自分で一行ずつコードを書いていた。どんなに難しくても、一本の連続した思考の流れでした。今は違う：私は作業を割り振り、見張り、レビューし、意思決定をしている。しかも、業務・規約・技術スタックがまったく異なる複数のプロジェクトの間を高速で切り替えている。このウィンドウは React を書き、あのウィンドウは Python をデバッグし、ルールも違う。切り替える前に、頭の中のそのコンテキストを丸ごと入れ替えなければなりません。</p>

<p>AI が出すコードは、正直、一行ずつ見張ることはできません——量が多すぎて、追いつかない。だから常時張り付くのはやめました。ですが、二種類のものは必ず自分で目を通します：一つは<strong>方案と設計</strong>——これは大方向で、方向が間違えば後で手戻りになる可能性が高い；もう一つは<strong>リソースアクセスに関わる確認</strong>——これはセキュリティに触れるので、曖昧にできない。この二つだけは、どんなに疲れていても自分で見ます。</p>

<h2 id="過負荷はどうなるかどう持ちこたえるか">過負荷はどうなるか、どう持ちこたえるか</h2>

<p>開きすぎれば、過負荷は本当に起きます。一番直接的な兆候は、頭が回らなくなること：あるターミナルに切り替えて、一瞬止まる——これはどのプロジェクトだ？ さっき何をさせていたんだ？ ときには少し思い出してからでないと、糸口をつかめない。一番きまりが悪かったのは、ウィンドウ A に返すはずの言葉を、ウィンドウ B に打ち込んでしまったとき。B の AI はぽかんとして「何の話ですか？」。私は謝るしかありませんでした——「ごめん、間違えた」——そして改めてその AI の質問をちゃんと読む。（救いは、この手の混線はたいていすぐ露見すること——AI は詰まると止まって、あなたに尋ねてくる。）</p>

<p>持ちこたえるために、私は主に二つに頼っています。</p>

<p>一つは<strong>仕組みに負荷を肩代わりさせる</strong>こと。私が作った PDLC のドキュメント駆動や階層的なレビューは、もとは AI の不確実性に対処するためでしたが、ついでに自分のエネルギーも節約してくれる——前段で方向を正しくしておけば、後段でとんでもなく外れることはない。すでにずれた産出を直すのは、最初から正しくやるよりずっと体力とコストがかかります。</p>

<p>二つめは<strong>人が主動的に減速する</strong>こと。特に頭を使う、方向をはっきりさせたい、決断が要る場面では、あえてゆっくりやる。まずこの一つに集中してきれいに片づけ、それから次へ切り替える。止まるべきときには、自分に少し息継ぎを残す。こういうときの「遅い」は、むしろ「速い」のです。</p>

<p>ウィンドウの見分けについては、ターミナルタブを一目で分かる名前に変えています——が、正直、たいていはそれが画面のどこにあるかという位置で覚えています。</p>

<h2 id="一つの正直な勘定限界は-5-個バランスは-3-個">一つの正直な勘定：限界は 5 個、バランスは 3 個</h2>

<p>この勘定、結局割に合うのか？ 見方を二つに分ける必要があります。</p>

<p>ハードな収益は実打実です：以前は自分の苦手分野で手も出せなかった領域に、今は大胆に挑戦できる。一人で別々の役割の AI チームを率いて、効率を十数倍に引き上げ、できることは過去よりずっと多い。この帳面では、大きな黒字です。</p>

<p>代償は、人が疲れること。最初は自分の限界に挑みたくて、開けるだけ開いて、同時に 5 個のプロジェクトまで行きました——それが私の上限で、それ以上は脳が本当に抱えきれない。その後は徐々に引き戻し、同時に 3 個ほどの別々の種類のプロジェクトに収束させた。この数こそが、長く続けられるバランス点です。</p>

<p><img src="/assets/images/posts/tired-controller-fig-balance-ja.png" alt="限界の 5 個まで行き、バランスの 3 個に収束する：開きすぎると人は過負荷になり、プロジェクトを見間違え、混線し、手戻りする；肝心なところでは主動的に減速する——遅いが速い" /></p>

<h2 id="全部-ai-に任せる-まだ現実的ではない">全部 AI に任せる？ まだ現実的ではない</h2>

<p>きっと誰かはこう言うでしょう：それは使い方が下手なだけだ、本物の達人ならとっくにフローを自動化して、張り付く必要などない、と。私もその言い分は聞いたことがあります——「全部 AI に渡して、最後まで走らせればいいじゃないか」。自分で試した限り、そうはいきません。AI を使いこなすには、やはり経験が要り、注意深さが要り、肝心な問題で判断を下せることが要る。完全に手を放して、最後まで自走させる——今の状況では、まだ現実的ではありません。</p>

<p>もちろん、これは「今」の話です。いつか AI が本当に自走できるようになったら、そのとき何が起きるのか、私にも分かりません。ですが少なくとも今日、このウィンドウの山の後ろに座って、疲れて、少し気が立っているその人は、やはり避けて通れないのです。</p>

<p>あなたも「司令塔」なら、コメントで教えてください——あなたの限界は、いくつですか？</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">AI を並列で動かす前提は、独立した作業領域を切り分けること</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/06/21/isolated-worktrees.ja.html" rel="alternate" type="text/html" title="AI を並列で動かす前提は、独立した作業領域を切り分けること" />
    <published>2026-06-21T00:00:00+08:00</published>
    <updated>2026-06-21T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/06/21/isolated-worktrees.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/isolated-worktrees-cover-ja.png" />
    <summary type="html">前回は並列の話だった——大きなタスクを分割し、複数の agent に同時にばらまく。だが尻尾を一つ残していた：複数の手が同じコードを同時に触るとき、何が衝突を防ぐのか？その答えがこれ。最初は素直にリポジトリを 2 つ clone してディスクで痛い目を見て、その後 git worktree に切り替えた。直感に反する点は——すべての並列が隔離を要るわけではない。読み取りだけなら作業領域を共有できる、書き込む側だけ分ければいい。</summary>
    <category term="Git" />
    <category term="ClaudeCode" />
    <category term="AI" />
    <category term="並列化" />
    <category term="生産性" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/06/21/isolated-worktrees.ja.html"><![CDATA[<p>少し前に並列の話を書きました——大きなタスクを分割し、複数の agent に同時にばらまく、と。ですが尻尾を一つ残していました：複数の agent が同時にコードを編集するとき、何が彼らの衝突を防ぐのか？今回はそれを取り上げます。</p>

<p>まず私自身がぶつかった壁から。一つのセッションの中で AI が自分で起こす subagent——あれは実のところ問題ありません。自分で隔離の方法を考えてくれるので、あまり気にせずに済む。痛い目を見たのはもう一方です：私が手動で AI 端末をいくつも開き、同じプロジェクトを同時に編集させた。複数の手が同じ作業ディレクトリに伸びてきて、こちらが少し書き、あちらが少し書き、ファイルが互いに上書きされ、状態がぐちゃぐちゃになる——途中で、誰の作業もきれいに残っていないと気づくわけです。</p>

<h2 id="欲しいものそして一つの境界">欲しいもの、そして一つの境界</h2>

<p>欲しいものは複雑ではありません。並列に動く何本かの手が、それぞれ自分の仕事をしながら、互いにぶつからずに同じプロジェクトを編集する。</p>

<p>ただ先に境界を引いておきます——<strong>すべての並列が隔離を必要とするわけではありません</strong>。何路かの agent を送り出すとき、一つはログを掘り、一つは原因を分析し、一つはドキュメントをめくる——これらはどれも読み取りだけなので、同じ作業領域に詰め込んでも何の問題もない。各々に一区画を切り出す必要はありません。本当に隔離が要るのは、<strong>ファイルを書き換える</strong>並列のほうです。読み取りは共有していい、書き込みは分けねばならない——これが以下のすべての出発点です。</p>

<h2 id="回り道まず-2-つ-clone-した">回り道：まず 2 つ clone した</h2>

<p>二つの AI に互いに干渉せず一つのプロジェクトを編集させるため、最初に手を伸ばしたのは一番素朴な手——物理的な隔離でした：プロジェクトを別々の二つのディレクトリに clone し、AI 一つにつき一部、井戸の水は河の水を犯さず。</p>

<p>きれいです、本当にきれい。ですがすぐに引っかかった：ディスクです。私のプロジェクトの多くは React フロントエンド + Python バックエンドの複合で、依存が山ほどある。一部 clone するだけで数 G になる。二部 clone すれば、ディスクがまるごと重複して食われる。さらに厄介なのは、この「二部開く」やり方を続けたい限り、その二部はずっとそこに居座って場所を占め、回収できないことです。</p>

<p>そこで git worktree に切り替えました。その利点はちょうどこの痛点に当たります：複数の作業ツリーが一つの <code class="language-plaintext highlighter-rouge">.git</code> を共有するので、リポジトリと履歴をまるごと何度も複製しない。しかも一時的——作業が終わって検証も済めば、すぐに回収できる。clone のように長く抱えておく必要がない。二つのやり方の隔離効果はほぼ同じ、ですが worktree はディスクを浪費しません。</p>

<p><img src="/assets/images/posts/isolated-worktrees-fig-isolation-ja.png" alt="物理 clone vs git worktree：物理 clone はリポジトリと依存をまるごと N 部複製し、ディスクが倍々に占有され、このやり方を続ける限り居座り続ける；worktree は一つの .git を作業ツリー間で共有し、新しく一時的なのは作業ツリーだけ、終わった瞬間に回収される" /></p>

<h2 id="二種類の並列誰が-worktree-を開くか">二種類の並列——誰が worktree を開くか</h2>

<p>実際に使うときは、二つの場面を区別しなければなりません。worktree の開き方が違うのです。</p>

<p>一つは<strong>セッション内の subagent 並列</strong>。これが一番手がかからない：AI に「並列で実行して」と一言告げるだけで、自分でタスクを分割し、隔離が要るときは自分で worktree を開く——いちいち指示しなくていい。</p>

<p>もう一つは<strong>私が手動で複数の端末を並列で開く</strong>場合。これは AI が既定では知りません——この瞬間、別の AI もこのディレクトリを触っていることを分かっていない。だから明確に伝える必要があります：「このプロジェクトのディレクトリはすでに別の AI が編集している。君は worktree のやり方で作業して。」この一言を指摘して初めて、メインの作業ツリーに直接手を出すのではなく、新しい worktree を作ってそこで作業します。</p>

<h2 id="スムーズに回る流れ">スムーズに回る流れ</h2>

<p>隔離はあくまで第一歩で、作業はまだ回収しなければなりません。私の流れはおおむねこうです：</p>

<p>分割できるタスクの線で切る——前回と同じく、<strong>疎結合</strong>の部分を選び、各々を独立した worktree に送り込む。すべて終わったら、主控 agent が一つずつブランチに合わせ戻す。一つ合わせて一つ検証し、問題があればその場で直す。一区画が通ったら、その worktree を解放する。</p>

<p>万一二つの worktree が本当に同じファイルを触ってしまったら、主控 agent が出て merge する。ただ正直なところそれは稀です——タスクを分割するときにそもそも各ブロックをできる限り独立させている。二つのブロックが衝突するほど結合しているなら、そもそも二つのタスクに分けるべきではなかったのです。</p>

<p><img src="/assets/images/posts/isolated-worktrees-fig-flow-ja.png" alt="worktree 一本道：疎結合の線でタスクを分割し、各々を独立した worktree に送って作業、主控 agent が一つずつブランチに合わせ戻す——一つ合わせて一つ検証し、その場で直す——通ったら worktree を解放する" /></p>

<h2 id="踏んだ落とし穴と防ぐべきもの">踏んだ落とし穴と、防ぐべきもの</h2>

<p>一番よくある落とし穴は、片付け忘れです。worktree を消し忘れると、そこに居座って場所を食う。ただこれは致命的ではない——機能はとっくに主幹に合わさっているので、失われるものはなく、名前の衝突も git 状態の混乱もない。せいぜい場所を取るだけです。</p>

<p>とはいえ「場所を取る」も手当てが要る。私はグローバルの軍規に一条書き込みました：<strong>worktree の作業が検証も merge も問題ないと確認できたら、片付ける</strong>。保険も足しました——解放する前に、その worktree の commits がすべて主幹に合わさっているか一度確かめる。手が早すぎて、まだ合わさっていない機能をまるごと払い落とさないように。強い AI はこの識別と後始末を自分でやれる。弱いほうは見落としがちで、そのときは私が見張るか、改めて主控 agent を呼んで処理させます。</p>

<p>今のところ、有用な worktree を誤って消したことは実際にはありません——片付ける前の「commits を確かめる」という一手が、おおむね歯止めになっています。ですが人が手で片付けると、その確認は消える。合わさっていない作業を失う可能性はある。そこは自分で気をつけるしかありません。</p>

<h2 id="無理に使うなだが一本の線は緩めない">無理に使うな、だが一本の線は緩めない</h2>

<p>worktree を万能薬扱いするのもよくない。単純なタスク、数ファイルの変更、一つの完結した機能とも言えないもの——そこで worktree を開くのは純粋に割に合わない。一つの作業領域で直して終わりにすればいい。</p>

<p>ただ緩めない線が一本あります：<strong>主幹で直接作業しない</strong>。どんな変更もまず新しいブランチで始め、検証して問題なければ、PR で主幹に合わせ戻す。worktree であれ単一ブランチであれ、どちらもこの線に奉仕している——主幹を常にきれいで信頼できる一部に保つために。</p>

<p>最後に、worktree そのものに話を戻します。誰かはこう鼻で笑うかもしれません：これは git が何年も前から持っている古い機能だろう、何を語ることがある、と。確かに古い機能です。ですが AI が並列で働くというこの新しい場面で、「複数の手が一つのプロジェクトを同時に編集する」という本物の問題を実際に解決し、かつての何倍もの働きをしている。老いた樹が新しい枝を伸ばした、とでも言いましょうか。</p>

<p>次回は少し毛色の違う話を取り上げたいと思います：AI はこれほど有能で、これほど多くの作業を肩代わりしてくれるのに、なぜ人は結局のところ疲れるのか？その間のどこで歯車が狂うのか。興味があればコメントで教えてください。</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">AI の作業が遅い？モデルが鈍いんじゃない、一つずつやらせているだけかもしれない</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/06/20/parallel-agents.ja.html" rel="alternate" type="text/html" title="AI の作業が遅い？モデルが鈍いんじゃない、一つずつやらせているだけかもしれない" />
    <published>2026-06-20T00:00:00+08:00</published>
    <updated>2026-06-20T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/06/20/parallel-agents.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/parallel-agents-cover-ja.png" />
    <summary type="html">前回は AI に「より安く」作業させる話だった。今回は「より速く」——大きなタスクを、AI に一モジュールずつ順番に片づけさせるのではなく、分割して複数の agent に同時にばらまく。直感に反するポイントは、並列にしてもトークンはほとんど節約できないということ。節約できるのは時間だ。</summary>
    <category term="ClaudeCode" />
    <category term="AI" />
    <category term="subagent" />
    <category term="並列化" />
    <category term="生産性" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/06/20/parallel-agents.ja.html"><![CDATA[<p>しばらくの間、私は AI が作業するのを眺めながら、内心ぼやいていました。そこそこ大きなタスクで、AI は一つのモジュールを書き終えてから次に取りかかる。私はその横で、片方が終わってもう片方の番が来るのをただ待っている。作業そのものに問題はない——ただ遅い。ずっと順番待ちしているから遅いのです。</p>

<p>そこであることに気づきました。多くのモジュールはそもそも互いに無関係なのに、なぜ一つずつ順番にやらせるのか。分割して、複数の agent に同時に作業させればいい、それだけの話です。</p>

<h2 id="欲しいものそしてその境界">欲しいもの、そしてその境界</h2>

<p>欲しいものはシンプルです。同じ作業を、ほぼ同じトークンで、完了までの時間を大幅に縮める。</p>

<p>ただ先に境界を言っておくと——<strong>すべてのタスクがこう分割できるわけではありません</strong>。これは私が自分なりに編み出したやり方で、参考程度に受け取ってください。</p>

<h2 id="分割できる前提アーキテクチャがまず綺麗であること">分割できる前提：アーキテクチャがまず綺麗であること</h2>

<p>複数の agent が互いにぶつからずに同時作業するための前提は、AI ではなく、あなたの<strong>アーキテクチャ</strong>にあります。</p>

<p>あのタスクを分割できたのは、それ自体がもともと複数のモジュールで、互いにインターフェース経由で通信し、内部実装は影響し合わない——インターフェース契約さえ守れば、各ブロックが独立して完成できる構造だったからです。つまり疎結合・高凝集。この設計は、手を動かす前に opus と一緒に固めておきました。opus が整理し、案を出す。<strong>決めるのは私</strong>です。</p>

<p>ここで手を抜いてはいけません。綺麗に分割していないアーキテクチャに無理やり並列をかけるのは、絡まった毛糸を何本かに切っても全部まだ繋がっているようなもので、かえって散らかるだけです。</p>

<h2 id="役割分担誰が統括し誰が計画し誰が手を動かすか">役割分担：誰が統括し、誰が計画し、誰が手を動かすか</h2>

<p>設計が決まったら、次は配置です。私が習慣にしている分担はこうです。</p>

<ul>
  <li><strong>opus が統括</strong>——全体を見渡し、作業を割り振り、最後にチェックする；</li>
  <li><strong>sonnet が TDD の計画</strong>——設計に沿って、各モジュールをどうテストし、どう実装するかの筋道を先に敷く；</li>
  <li><strong>haiku がコードを書きテストを走らせる</strong>——力仕事はこれに任せる。安くて十分。</li>
</ul>

<p>この分担は、実は前回の「モデル階層化」の続きです——良い鋼は刃に使う。前回は節約の話でしたが、今回はこれらの役割がどう<strong>連携して一緒に動くか</strong>の話です。</p>

<p><img src="/assets/images/posts/parallel-agents-fig-orchestration-ja.png" alt="オーケストレーション：上に統括の opus、そこから独立したモジュールを sonnet（計画）と haiku（実装＋テスト）にばらまく。モジュール内ではさらに分担でき、終わった作業は opus に戻ってレビューされる" /></p>

<h2 id="どうやってばらまくか">どうやってばらまくか</h2>

<p>具体的には、三つやりました。</p>

<ol>
  <li><strong>グローバルの CLAUDE.md に一行書き込む</strong>：「並列にできるなら並列にせよ。」全プロジェクト共通のデフォルトルールです。</li>
  <li><strong>Claude の設定で同時 subagent 数の上限を調整する</strong>——これが本当に効くバルブです。</li>
  <li><strong>指示を出すたびに一言添える</strong>：「できる限り並列で。」統括の opus は自分でも並列に割り振りますが、一声かけると意図がよりはっきり伝わります。</li>
</ol>

<p>統括がモジュールを下に割り振り、モジュール内部ではさらにもう一段分担できる。層が重なって、タスク全体が広がっていきます。</p>

<h2 id="レビューの工程は省けない">レビューの工程は、省けない</h2>

<p>並列で速く回す——では品質はどう担保するか。私のやり方は、<strong>統括自身にレビューさせる</strong>ことです。</p>

<p>理屈は単純で、作業を割り振ったのは統括なので、各 subagent が何を出すべきかを把握しています。チェックも統括にやらせるのが一番噛み合う。専用のレビュー agent を別に立ててみたこともありますが、タスクを一から理解し直す羽目になり、もう一周トークンを焼いて、しかも遅い。統括が自分でレビューすれば、その理解し直しのコストが消えて、速くて鋭い。</p>

<p>問題が見つかった後の小さなディテールもあります。統括はたいてい「これは私が直接直すか、別の agent を立てて直すか？」と聞いてくる。私はだいたい「直接直して」と答えます。たった今その不具合を見つけた当人なので、どこが問題か一番わかっているし、そこから直すのが一番ストレートだからです。</p>

<h2 id="私が落ちた二つの落とし穴">私が落ちた二つの落とし穴</h2>

<p><strong>一つ目はメモリ。</strong> 最初は欲張って同時並列を 10 に設定しました。しかし当時は別のプロジェクトも並列で走らせていて、マシンのメモリがきれいに食い尽くされた。そこで素直に 5 に下げたら、かえって快適でした——この一タスクだけで見れば、5 並列はおおよそ直列の 5 倍の効率。さらに同時に走る他のタスクを足すと、全体の高速化は 10 倍以上にもなる。マシンと枠に余裕があればこの数字はもっと上げられるし、なければ無理をしないことです。</p>

<p><strong>二つ目は、分割のための分割をしないこと。</strong> 結合の強いモジュールは本来順番にやるべきで、無理に引き剥がして並列にすると、agent 同士が影響し合って品質がまるで担保できなくなる。なので AI に渡す前に一言添えます：「これらのモジュールは結合しているので、無理に分割しないで。」幸い、多くの AI は自分でこれを認識して、無理に分割しません。本当に分割できないものは、素直に一つの agent に直列でやらせるか、統括自身が一本の線で最後までやり切ればいい。</p>

<h2 id="直感に反する勘定">直感に反する勘定</h2>

<p>「5 つの agent を同時に焼く」と聞くと、多くの人の第一反応は「トークンが何倍にもなるのでは？」です。</p>

<p>私が計算した限り、そうはなりません。<strong>同じ作業の山を直列でやっても、トークンの消費量はほぼ同じ</strong>——読むべきものは読むし、書くべきものは書く。並列が余計な作業を生むわけではない。並列が本当に変えるのはコストではなく、<strong>ウォールクロック（経過時間）</strong>です。順番待ちで流していた区間が、同じ時間枠の中でまとめて流れる。余計に焼くわずかなトークンと引き換えに、時間コストが大きく下がる——割のいい取引です。</p>

<p><img src="/assets/images/posts/parallel-agents-fig-parallel-ja.png" alt="直列 vs 並列：同じ作業で、トークン総量はほぼ同じ。だが並列は経過時間を約 1/5 に削る——節約できるのは時間であって、消費ではない" /></p>

<p>なので、本当に分割できないものを除けば、今の私は<strong>並列にできるものは基本すべて並列</strong>にしています。</p>

<h2 id="振り返りそのまま実践できる三箇条">振り返り：そのまま実践できる三箇条</h2>

<p>一、<strong>アーキテクチャをまず綺麗に分割する、並列の話はその後</strong>。疎結合・高凝集・インターフェース契約による通信——この土台がなければ、分割は災いです。設計フェーズで AI と一緒に固めておく。</p>

<p>二、<strong>並列にできるものは全部並列に、ただし上限を設ける</strong>。数字は大きいほど良いわけではない。マシンのメモリと AI の枠を見て決める。私が 10 から 5 に戻したのは、メモリに痛い目を見せられたからです。</p>

<p>三、<strong>高速な並列には、レビューが必須</strong>。しかもレビューする側がタスクを本当に理解していること——作業を割り振った統括自身にチェックさせるのが、一番安くて鋭い。問題を見つけたら、そのまま直させる。</p>

<p>今日読んですぐできることを一つ：グローバルの CLAUDE.md を開いて「並列にできるなら並列にせよ」と一行足し、設定で同時 subagent 数の上限を、マシンが耐えられる値まで上げる。次に分割できる大きなタスクを渡したとき、AI が順番待ちをやめているのに気づくはずです。</p>

<p>次回は、これにすぐ続いて出てくる問題を取り上げたいと思います。複数の agent が同時にコードを編集するとき、何が彼らの衝突を防ぐのか？その裏にあるのが git worktree——各 agent に独立した作業領域を与え、それぞれが自分のコピーを触り、誰も互いの邪魔をしない仕組みです。興味があればコメントで教えてください。</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">AI が会話を重ねるほど馬鹿になる？モデルのせいじゃない、そろそろ手を打つ番だ</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/06/18/tier-models-trim-context.ja.html" rel="alternate" type="text/html" title="AI が会話を重ねるほど馬鹿になる？モデルのせいじゃない、そろそろ手を打つ番だ" />
    <published>2026-06-18T00:00:00+08:00</published>
    <updated>2026-06-18T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/06/18/tier-models-trim-context.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/tier-models-trim-context-cover-ja.png" />
    <summary type="html">前の二回は「コンテキストに入る前」にトークンを節約する話だった。今回は会話の最中にやる二つのこと——誰が作業するか（モデル階層化）と、どれだけ記憶を抱えて作業するか（コンテキスト管理）。AI が途中から鈍くなるのは、たいていモデルのせいではない。</summary>
    <category term="token" />
    <category term="ClaudeCode" />
    <category term="モデル階層化" />
    <category term="コンテキスト管理" />
    <category term="AIエンジニアリング" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/06/18/tier-models-trim-context.ja.html"><![CDATA[<p>ある日、AI に機能の続きを実装させていたら、途中から様子がおかしくなりました。返答はどんどん遅くなり、話はちぐはぐ、前に伝えたことをまた聞いてくる。作業は明らかに終わっていないのに「完了しました、休憩していいですよ」と言い出す始末。</p>

<p>最初はモデルの調子が悪い日かと思いました。ところがコンテキストを見ると、もう 80% を超えていた——前に進めることに夢中で、消すのを忘れていたのです。消してから聞き直すと、すぐにシャープに戻りました。速くて、的を射た返答に。</p>

<p>それ以来、これを真面目に扱うようになりました。前の二回はすべて「コンテキストに入る前」に量を絞る話——いわば着工前の話です。今回は着工後、会話の最中にやる二つのこと。同じ作業に何トークン払うか、どれだけ速いか、どれだけ安定するかを、これらが決めます。</p>

<h2 id="一つの会話に実はノブが二つある">一つの会話に、実はノブが二つある</h2>

<p>会話の最中に回せるノブは二つ、向きが違います。</p>

<p>一つは横方向：一つのタスクの中で、違う種類の作業は違う「脳」に振る。探索や検索のような力仕事に最上位のモデルは要らない；本当に頭を使うところ——コードを書く、判断する——にだけ良いモデルを出す価値がある。これを<strong>モデル階層化</strong>と呼んでいます。</p>

<p>もう一つは縦方向：同じ脳に、一度にどれだけ詰め込むか。コンテキストが太いほど、モデルは毎ターンその一山を計算し直す——遅く、高く、間違いやすい。どれだけ速く膨らむか、いつ消すかを管理するのが<strong>コンテキスト管理</strong>です。</p>

<p>この二つが節約するものは、二か所に落ちます：従量課金なら現金そのもの、定額月額なら枠の余裕。私は両方使っているので、どちらの手も二重の節約になる。一つずつ見ていきます。</p>

<h2 id="一番高いモデルに全部やらせない">一番高いモデルに全部やらせない</h2>

<p>まず横方向から。</p>

<p>あるとき、あるプロジェクトで subagent を一斉に投げようとしていて、まだ従量課金の API、予算が少しきつかった。そこでケチな手を試しました：計画に沿った設計とコード生成は Sonnet に、比較的機械的な単体テストはより安い Haiku に、そして最上位（Opus）は全体の進捗と品質を見るレビュー役に残す。</p>

<p>これが予想以上に効いた。トークンはかなり節約でき、しかも明らかに速くなった——安い小型モデルはもともと速いので、力仕事を任せるとパイプライン全体が軽くなる。一番高い計算力は、一番必要なところにだけ使われる。</p>

<p>この振り分けは固定ではありません。どの作業にどの階層かは、CLAUDE.md（ユーザーレベルもプロジェクトレベルも）に直接書き込み、AI が毎回自分で階層化する——いちいち手で指示しなくていい。ある工程が特に重要だと感じれば、その場で特定のモデルを名指しして担当させることもできる、より精密に。原則は一言：大砲で蚊を撃つな——そしてパチンコで戦車に挑むな。</p>

<p><img src="/assets/images/posts/tier-models-trim-context-fig-tiering-ja.png" alt="モデル階層化：一つのタスクをモデルの階層に横方向で分ける——探索・検索・単体テスト実行のような力仕事は安くて速い小型モデルに；設計とコード書きは中位モデルに；全体の監督とレビューは最上位モデルに。一番高い計算力は一番必要なところにだけ使われる" /></p>

<h2 id="会話の途中で頭を整理してやる">会話の途中で、頭を整理してやる</h2>

<p>次は縦方向——冒頭の「鈍くなる」の張本人です。</p>

<p>コンテキストはひたすら上がっていく。放っておけば、ずっと太り続ける。私のやり方は二本の線：50% あたりで気にし始め、70% でほぼ必ず一度消す。いつものリズムは——手元のタスクが片付いた瞬間、きれいなうちに消す。次の作業が軽装で進めるように、シャープに、速く。</p>

<p>はっきりさせておくと、この二本の線も、冒頭の「80% で鈍る」も、私個人の体感と習慣にすぎません。硬い指標ではない。私はこれで快適ですが、ベンダーや他の人はそう見ないかもしれない——自分のペースで全然かまいません。私はただ提案するだけ：上がりっぱなしで放置するな、と。</p>

<p>消す工程には一つ、触れておくべき罠があります：<code class="language-plaintext highlighter-rouge">/compact</code>、<code class="language-plaintext highlighter-rouge">/clear</code>、あるいは新しいセッションを開くと確かにコンテキストはすっきりするが、雑にやると大型モデルは直前にやったことをきれいに忘れ、また一から説明し直す羽目になる。私の対処は——消す前に、現在の状況を一筆書かせる：どこまでやったか、次に何をするか、すでに固まっている重要な決定はどれか。この引き継ぎをきちんと書いてから消せば、新しいセッションは一目で追いつき、ぽかんとせずに済む。</p>

<p>正直、この引き継ぎは今まで基本的に外したことがありません。万一うまく繋がらなくても、慌てない——もう一度分析させて結論を出させ、自分で検証して判断すればいい。損は小さい。</p>

<p><img src="/assets/images/posts/tier-models-trim-context-fig-context-ja.png" alt="会話の最中にコンテキストの頭を整理する：コンテキストはひたすら上がる。自分の警戒線（50% あたり）で気にし始め、整理線（70% あたり）で一度消す——ただしこの二本の線は私個人の習慣、参考まで。消す前に引き継ぎを一筆（どこまで/次は/重要な決定）、それから compact か新セッション、新セッションは一目で追いつく" /></p>

<h2 id="ついでに正確に読めば抱える量は減る">ついでに：正確に読めば、抱える量は減る</h2>

<p>ここまでは「すでに入ったものをどう管理するか」。実はもう一層、「入ってくるものをそもそも少なく正確に」というのがあります。</p>

<p>これらのプロジェクトには codegraph や claude-mem のようなツールを挂けています。要するに、AI を「いきなりソースを読み、全文をスキャンする」から「核心の数箇所だけ命中させ、過去のセッションで貯めた記憶を引き継ぐ」へ変える——スキャンが減れば、コンテキストに入るものは自然と痩せる。</p>

<p>ここはついでに触れるだけ、展開はしません。一つには、細部を展開するとツールの宣伝になる；二つには、この手のツールはこの二つだけとは限らない——もっと良いものがあるかもしれない、私が使っていなくて知らないだけで。手に馴染むものを知っているなら、それを使えばいい。考え方は同じ：モデルに正確に読ませれば、そんなに多くを抱えて出発しなくて済む。</p>

<h2 id="正直なところ">正直なところ</h2>

<p>節約は節約だが、境界を言っておかないと、またいいことずくめの宣伝になってしまう。</p>

<p>モデル階層化で一番心配されるのは：小型モデルは間違えないか？間違えます。でも最後に最上位モデルのレビューを一枚残してあるので、小型モデルのたまの取りこぼしはたいていそこで拾える——今のところ大きな間違いはない。ただしこのレビューは省けない：省けば、階層化で浮いたトークンはいずれ払い戻すことになる。</p>

<p>コンテキスト側も同じ：消しすぎ、引き継ぎが雑すぎれば、やはり何かを失う。だから私は「時間が来たら無心に消す」のではなく、タスクが片付いた直後のきれいな瞬間を選んで消し、ついでに引き継ぎを書く。トークン節約の本意は本当の無駄を切ることであって、連れて行くべき記憶まで一緒に切ることではない。</p>

<h2 id="まとめそのままやればいい三つ">まとめ：そのままやればいい三つ</h2>

<p>実際に手を動かせるのは三つ：</p>

<p>一、一番高いモデルに全部やらせない。力仕事（探索、検索、テスト実行）は安い小型モデルに振り、良い鋼はコード書きと判断に使い、最上位を最後のレビューに残す。基準を CLAUDE.md に書いて、AI が自分で階層化するようにする。</p>

<p>二、コンテキストを上がりっぱなしにしない。自分の線を決める——私は 50% で注意、70% で消す、あなたはあなたの線でいい；タスクが片付くたびに一度消す、太って鈍くなるまで待たない。</p>

<p>三、消す前に引き継ぎを書かせる。どこまで、次は、重要な決定——書いてから compact するか新セッションを開けば、リレーは途切れない。</p>

<p>これを読んで今日できることが一つ：CLAUDE.md を開き、「どの作業にどのモデル」を数行ハードコードし、超えたら消すコンテキストの赤線を自分に設ける。二つ合わせて十分かからないが、以降の会話はずっとあなたのために節約し続ける。</p>

<p>次回はプロンプトそのものを話したい——同じ作業でも、言い方ひとつで AI の仕上がりはかなり変わる；それと複数の agent をどう編成して一緒に働かせるか。興味があれば、コメントで教えてください。</p>

]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">AI コーディングが高くつく？トークンを 82% 削った（実測データ付き）</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/06/17/cut-tokens-82.ja.html" rel="alternate" type="text/html" title="AI コーディングが高くつく？トークンを 82% 削った（実測データ付き）" />
    <published>2026-06-17T00:00:00+08:00</published>
    <updated>2026-06-17T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/06/17/cut-tokens-82.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/cut-tokens-82-cover-ja.png" />
    <summary type="html">前回はツールを正しく使う話だった。では具体的にどう？今回は実数付きの実践編——rtk gain は六千以上のコマンドで 740 万トークン、82% を節約していた。</summary>
    <category term="token" />
    <category term="ClaudeCode" />
    <category term="AIエンジニアリング" />
    <category term="コスト" />
    <category term="RTK" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/06/17/cut-tokens-82.ja.html"><![CDATA[<p>前回、こう言いました——トークン節約はドキュメントを削ることではなく、ツールを正しく使うこと。すると聞かれました：で、具体的にどう「正しく」使うのか？</p>

<p>今回は実践、実数付きです。まず見出しの数字：ローカルの <code class="language-plaintext highlighter-rouge">rtk gain</code>——トークン節約を集計するツール——を見たら、六千以上のコマンドで <strong>740 万トークン、82%</strong> を節約していました。推定ではありません。一件ずつ記録したものです。</p>

<p>では分解します：この 82% がどう節約されるのか。</p>

<h2 id="トークン節約はコンテキストに入る前で起きる">トークン節約は「コンテキストに入る前」で起きる</h2>

<p>まず、どこで節約されるか。</p>

<p>トークン消費の大部分は「どれだけ作業したか」ではなく、毎ターン AI のコンテキストにどれだけ詰め込むかにあります。モデルは毎ターン、コンテキスト全体を計算し直す——コンテキストが太いほど、毎ターンが高くつく。</p>

<p>だから核心は一文：コンテキストに入るものを、できるだけ少なく、できるだけ精緻に。</p>

<p>手元に三つのレバーがあります：ルールファイルを削る、プラグインを正しく使う、モデルを階層化する。共通点は一つ——<strong>どれも「コンテキストに入る前」に節約し、あなたが作業を減らすわけではない</strong>。一つずつ見ていきます。</p>

<p><img src="/assets/images/posts/cut-tokens-82-fig-pipeline-ja.png" alt="トークン節約は「コンテキストに入る前」で起きる：AI に渡す一山（数百行のコマンド出力、リポジトリ全体、数万字の会話履歴、肥大したルールファイル）が三つのゲート——ルールファイルを削る・プラグイン自動圧縮・モデル階層化——を通り、実際にコンテキストに入る分は大きく痩せ、毎ターン節約になる" /></p>

<h2 id="レバー一まず-claudemd-を痩せさせる">レバー一：まず CLAUDE.md を痩せさせる</h2>

<p>最も見落とされ、最初にやるべきなのが、<code class="language-plaintext highlighter-rouge">CLAUDE.md</code> を削ること。</p>

<p>CLAUDE.md（ルールファイル、指示ファイル、呼び方は色々）は、毎回の会話でコンテキストに詰め込まれる。常駐する。書いた行数だけ、毎ターン繰り返しトークンを払う。</p>

<p>自分の CLAUDE.md は一時、長ったらしくなっていました——ユーザーレベルからプロジェクトレベルまで、びっしり注意書き。振り返ると、繰り返しの小言、古くなった取り決め、「書いても書かなくても同じ」な正しい無駄話だらけ。思い切って半分近く削り、本当に毎回使う硬いルールだけ残した。要するに、同じことを三度言っても AI は従順にならず、毎ターン余計にトークンを食うだけ。</p>

<p>この一手で、毎ターン節約できる。常駐するから、一度きりではなく、以降ずっと節約になる。</p>

<p>会話コンテキストも同じ：数万字に膨れた窓は、消すべきときに消す。朝のことを夜まで引きずって毎ターン再計算させない。</p>

<h2 id="レバー二自動でやってくれるプラグインを入れる">レバー二：自動でやってくれるプラグインを入れる</h2>

<p>手動だけでは限界がある。コンテキストを自動圧縮するプラグインをいくつか入れています。データが語ります。</p>

<p><strong>RTK</strong>（Rust Token Killer）——コマンドプロキシ。AI に <code class="language-plaintext highlighter-rouge">git status</code>、<code class="language-plaintext highlighter-rouge">ps aux</code>、テストを走らせると、その出力は数百〜数千行、丸ごとコンテキストに入れると非常に高くつく。RTK は AI に届く前に圧縮する。私の <code class="language-plaintext highlighter-rouge">rtk gain</code>：六千以上のコマンドで 740 万トークン、82% 節約。一番効くのは高頻度で栄養のない出力——<code class="language-plaintext highlighter-rouge">ps aux</code> の数百行のプロセス一覧、AI が読んでも得るものはなく、99% 節約；テストログ 88%；ファイル読み込みも平均 2 割引き。</p>

<p><strong>claude-mem</strong>——記憶プラグイン。セッションをまたぐ作業を構造化記憶に圧縮し、次回プロジェクト背景を説明し直さなくていい。本セッション実測 86% 節約。全自動、ほぼ触りません。</p>

<p><strong>codegraph</strong>——コードグラフ。プロジェクトの関数・型・呼び出し関係のインデックスを作る。AI がある関数を探すとき、ファイルを大量に読まず、インデックスを引くだけ。私の aitm プロジェクトでは <strong>246 ファイル、3562 シンボル</strong> をインデックス化。「インデックスを引く」と「246 ファイルを頭から読む」——差は小さくない。前者は本の目次をめくるよう、後者は一つの質問に答えるために本を丸ごと暗記するよう。</p>

<p>この三つの共通点：自動、常駐、コンテキストに入る前に節約。入れたらほぼ忘れる——ずっと節約し続けてくれる。</p>

<p><img src="/assets/images/posts/cut-tokens-82-fig-plugins-ja.png" alt="三つの自動ヘルパーの実測データ：RTK コマンドプロキシは 82% 節約（六千以上のコマンドで 740 万トークン）；claude-mem 記憶圧縮は 86% 節約（セッションをまたいで背景を説明し直さない）；codegraph コードグラフは 3562 シンボルをインデックス化（246 ファイルを読まずインデックスを引く）" /></p>

<h2 id="レバー三一番高いモデルで全部やらない">レバー三：一番高いモデルで全部やらない</h2>

<p>最後、モデル階層化。</p>

<p>探索・検索・ファイル読みといった力仕事は安い小型モデルに；本当に頭を使うコード生成や判断にだけ最上位を出す。特に subagent を投げるとき——一つのタスクを複数に分け、力仕事は小型モデルに。これが枠を節約する主戦場。</p>

<p>この判断基準を CLAUDE.md に直接書き込み、AI が毎回自分で階層化する——いちいち指示しなくていい。</p>

<p>これは Claude Code に限りません。どの AI プラットフォームでも理屈は同じ：各モデルの能力と値段を把握し、仕事に応じた階層を使い、高価な計算力を要所に使う。</p>

<h2 id="もう一手繰り返し入る分を割引にする">もう一手：繰り返し入る分を割引にする</h2>

<p>上の三つのレバーはどれも「コンテキストに入る量を減らす」もの。もう一つ、性質の違うのが——prompt caching。量は減らさず、繰り返し入る分を割引で課金させる。</p>

<p>システムプロンプト、変わらないルールファイル、固定のプロジェクト背景——毎ターン同じものは、初回は全額、以降はキャッシュヒットで割引。しかも線形の割引ではなく、うまく使えば節約は明確。</p>

<p>コツはキャッシュ可能な部分を変え続けないこと：固定・不変のものをコンテキストの前に置いて安定させ、毎ターン変わるものを後ろに。構造が安定するほどキャッシュヒット率が上がり、割引を満額享受できる。</p>

<p>これには RTK のような実測値はありません（節約は課金側で、トークン数ではない）。でも原理は単純、コストはほぼゼロ——当たり前に使う価値があります。</p>

<h2 id="正直なところこれはタダ飯ではない">正直なところ：これはタダ飯ではない</h2>

<p>コストも言っておかないと、ただの宣伝になる。</p>

<p>codegraph はまずインデックスを作る必要があり、大きなプロジェクトでは時間がかかる；claude-mem の記憶はたまに少しずれて思い出すので、気をつけておく；CLAUDE.md の圧縮にも限度がある——本当に毎回必要な硬いルールまで削ると、AI が脱線して手戻りし、小さな得で大きな損をする。</p>

<p>それと「トークン節約」を作業を減らすことと勘違いしないこと。むしろ逆——削るのは「本来省くべき無駄」：繰り返しのコンテキスト、リポジトリ全読み、大砲で蚊を撃つこと。やるべき仕事は依然としてやる。</p>

<p>節約が何を意味するかは課金方式次第（前回触れた）：定額月額なら枠の余裕、従量課金なら現金そのもの。両方使っているので、これらの方法は私には二重の節約。</p>

<h2 id="最後に">最後に</h2>

<p>あの 82% に戻ります。魔法ではなく、上の小さなことの積み重ね：ルールファイルを削り、自動プラグインをいくつか入れ、モデルを階層化する。一つ一つは地味でも、積み重なれば六千以上のコマンドで 740 万トークンの節約。</p>

<p>今日できることが二つ、十分で始められます：</p>

<p>一つ、CLAUDE.md を開き、繰り返し・古い・書いても同じものを削り、何行まで減らせるか見る。</p>

<p>二つ、RTK を入れ、数日走らせ、その <code class="language-plaintext highlighter-rouge">gain</code> がどれだけ節約したか見る——その数字におそらく二度見します。</p>

<p>トークン節約はひとまずここまで。次回はモデル階層化の細部を掘り下げたい：どのモデルにどの仕事を割り当てるか、AI が自分で階層化するよう CLAUDE.md をどう書くか。それとコンテキスト管理の細部——いつ消すか、どう精密に読むか。興味があれば、コメントで教えてください。</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">トークンを食っているのはドキュメントではない、ツールの使い方だ</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/06/16/tokens-not-docs.ja.html" rel="alternate" type="text/html" title="トークンを食っているのはドキュメントではない、ツールの使い方だ" />
    <published>2026-06-16T00:00:00+08:00</published>
    <updated>2026-06-16T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/06/16/tokens-not-docs.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/tokens-not-docs-cover.png" />
    <summary type="html">PDLC はドキュメントだらけでトークンを食う？——ドキュメントが多いこととトークンを食うことは別の話。本当に節約したいなら、ツールを正しく使うことであって、ドキュメントを削ることではない。</summary>
    <category term="PDLC" />
    <category term="ClaudeCode" />
    <category term="AIエンジニアリング" />
    <category term="ワークフロー" />
    <category term="トークン" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/06/16/tokens-not-docs.ja.html"><![CDATA[<p>PDLC でプロジェクトを進めていると、必ずこう聞かれます——ドキュメントだらけで、PRD も設計もレビューも一通りやって、トークンが燃え尽きるんじゃないか、と。</p>

<p>もっともな疑問です。プロセスを細かいステージに分け、各ステップで成果物を残す——確かに「AI にそのままコードを書かせる」より高くつくように見えます。でも、私に言わせれば、そのトークンの請求書をドキュメントのせいにはできません。</p>

<p>先に結論を置きます。第一に、ドキュメントが多いことと、トークンを大量に食うことは別の話。第二に、本当にトークンを節約したいなら、答えはツールを正しく使うことであって、ドキュメントを削ることではありません。</p>

<p>トークンを正確に計測したわけではありません——同じプロジェクトを「ドキュメントあり vs なし」で2回走らせて、きれいなパーセンテージを出したわけでもない。語るのは体感と方法です。</p>

<h2 id="トークンを食う原因は-pdlc-ではない">トークンを食う原因は PDLC ではない</h2>

<p>請求書を精算する前に、正しい債務者を見つけること。</p>

<p>トークンを食うのは、多くの場合 PDLC のせいではなく、ツールの使い方が間違っているからです。その「間違い」は具体的で、三つあります：</p>

<ul>
  <li><strong>コンテキスト</strong>：消すべきときに消さない。一つの会話を朝から晩まで開きっぱなしで、数万字の履歴が毎ターン再計算される。新しい質問をしているのに、古い借金を払っている。</li>
  <li><strong>プロンプト</strong>：曖昧に書く。AI があなたの意図を何度も推測し、一度で済む話が三往復になる。</li>
  <li><strong>ツール呼び出し</strong>：一つのファイルしか変えないのに、リポジトリ全体を読ませる。</li>
</ul>

<p>さらに最もよくあるのが、トークン節約の方法をそもそも使っていないのに、プロセスが重いと責めること。</p>

<p>これらを「PDLC はドキュメントが多い」のせいにはできません。ドキュメントは <code class="language-plaintext highlighter-rouge">docs/</code> に静かに置かれ、自分から一つもトークンを燃やしません。燃やしているのは上記の使い方です。</p>

<h2 id="本当にトークンを食うのは手戻り">本当にトークンを食うのは手戻り</h2>

<p>自分で使ってきた実感では、最大のトークンの浪費はドキュメント生成では決してなく、手戻りです。</p>

<p>方向が間違って書き直す、要件を読み違えて作り直す、直したら別のところが連鎖で壊れて戻る——こうした往復は、一回ごとが実トークンです。PRD を一本生成するのは一度きりの支出；方向違いの手戻りは複利で効いてきます。</p>

<p>重く見える PDLC のプロセスは、まさに「前もって少し多めに書く」ことで「後の手戻りを大きく減らす」取引です。使えば、全体の流れが安定し、最終的な成果物も安定して、行ったり来たりしない。手戻りが減ること自体が、トークンを減らすことです。</p>

<p>だから私の見方はこうです：ドキュメントはコストではなく、資産。設計判断と「なぜそうしたか」を痕跡として残し、遡れる・監査できる。次に AI が引き継ぐとき、ドキュメントを一読すれば分かる——最初から説明し直さなくていい。そこで省けた分が、またトークンです。</p>

<p><img src="/assets/images/posts/tokens-not-docs-fig1-ja.png" alt="変更にドキュメントが残っていれば、AI は一読して進められ、燃やすトークンは少ない。痕跡がなければ手戻り・書き直しになり、手戻りは複利で効く——それが本当にトークンを燃やす" /></p>

<h2 id="ではトークンはどこで節約すべきか">ではトークンはどこで節約すべきか</h2>

<p>トークン節約はドキュメントを書かないことではなく、節約すべきところで節約すること。自分のマシンで実際に使っているのは、だいたいこのあたり：</p>

<ul>
  <li><strong>コンテキストを削る</strong>：消すべきときに消す；数万字の履歴を毎ターン引きずらない。</li>
  <li><strong>モデルを階層化</strong>：大砲で蚊を撃たない。探索・検索・ファイル読みといった力仕事は安い小型モデルに；本当に頭を使う分析やコード生成にだけ最強の層を出す。</li>
  <li><strong>ファイルを精密に読む</strong>：今回の変更に関係する分だけ読む；反射的に「プロジェクト全体を読む」をしない。</li>
  <li><strong>prompt caching</strong>：キャッシュにヒットした部分は割引で課金され、しかも 1:1 の線形ではない。うまく使えば節約は明確。</li>
  <li><strong>日常コマンドにトークンプロキシをかぶせる</strong>：<code class="language-plaintext highlighter-rouge">git status</code> のような高頻度の操作は出力を圧縮する；塵も積もれば。</li>
  <li><strong>並列化</strong>：互いに依存しない作業は一度に投げ、往復を減らす。</li>
</ul>

<p>どれ一つとして「ドキュメントを減らす」ではありません。</p>

<p><img src="/assets/images/posts/tokens-not-docs-fig2-ja.png" alt="トークン節約は三層に宿る——コンテキスト層（消すべきときに消す / 精密に読む）、モデル層（力仕事は小型モデルに / caching 割引）、ツール層（日常コマンドにプロキシ / 並列化）。どれも「ドキュメントを減らす」ではない" /></p>

<h2 id="すべての変更にフル装備が要るわけではない">すべての変更にフル装備が要るわけではない</h2>

<p>とはいえ、PDLC はどんな変更でもフルスイートを回すという意味ではありません。</p>

<p>一行のバグ修正に、PRD は要るか、設計レビューは要るか？場合による——多くは重いプロセスは不要で、簡略化していい。判断基準はシンプル：この変更は資産を残す価値があるか。あるなら全部回す；一度きりの小さな修正なら、数ステップ削っても誰も責めません。</p>

<p>それから「トークン節約 = お金の節約」は、課金方式ごとに言わないと誤解を招きます：</p>

<ul>
  <li>定額の<strong>月額サブスク</strong>なら、節約するのは<strong>枠（クォータ）の余裕</strong>——同じお金でより多くの仕事ができる。</li>
  <li>従量課金の <strong>API</strong> なら、節約するのは<strong>現金そのもの</strong>——トークン一つ一つが請求に乗る。</li>
</ul>

<p>私は両方使っています。まず自分がどちらかを把握すること；それが「トークン節約」の意味を教えてくれます。</p>

<p><img src="/assets/images/posts/tokens-not-docs-fig3-ja.png" alt="PDLC はどんな変更でもフル装備が要るわけではない：一度きりの小さな修正はプロセスを簡略化；長期的に維持するものだけフル PDLC を回す——そこではドキュメントが資産になる" /></p>

<h2 id="最後に">最後に</h2>

<p>まとめると、ドキュメントが多いこと ≠ トークンを食うこと；本当に節約したいなら、ツールの使い方で節約するのであって、ドキュメントでではない。</p>

<p>一番言いたいこと：ドキュメントは資産であり、コストではない。「ドキュメントを書かず、AI にそのままコードを出させる」でトークンを節約しようとすると、短期的には得に見えても、プロジェクトは遠くまで行けません——痕跡も追跡可能性もなく、二ヶ月後には自分でもなぜこう設計したか説明できない。そのときの手戻りは、節約したドキュメントのトークンよりはるかに多く燃えます。</p>

<p>今日できる一手：トークン節約の方法を使えているか振り返る——コンテキストは削ったか？まだ全部を最強モデルに送って、階層化していないか？削れるコストは削ったか？ついでに、PDLC をちゃんと使えているかも考えてみる。</p>

<p>トークン節約は掘り下げればまだ多くある——モデルの具体的な階層化、コンテキストを消すタイミング、caching の割引をどう効かせるか。次回、一つ選んで深掘りします。</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">PDLC 1.1：v1.0 が成果物の形について犯した2つの間違い</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/06/08/pdlc-v1-1.ja.html" rel="alternate" type="text/html" title="PDLC 1.1：v1.0 が成果物の形について犯した2つの間違い" />
    <published>2026-06-08T00:00:00+08:00</published>
    <updated>2026-06-08T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/06/08/pdlc-v1-1.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/pdlc-v1-1-cover.png" />
    <summary type="html">v1.0 は縦方向の問題を解決しました——feature のステージを順序よく進めること。v1.1 は2つの横方向の問題を修正します：成果物タイプの混在と、feature 間の関係欠如。</summary>
    <category term="PDLC" />
    <category term="ClaudeCode" />
    <category term="AIエンジニアリング" />
    <category term="ワークフロー" />
    <category term="オープンソース" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/06/08/pdlc-v1-1.ja.html"><![CDATA[<p>PDLC は Claude Code のプラグインです。33のステージ、成果物のディスクへの強制保存、per-feature の状態機械、テストファースト。v1.0 でその縦軸——feature の進行順序——を固めました。</p>

<p>v1.1 は横軸の修正です。ファイルの形と、feature 同士の関係。どちらも v1.0 では見えていなかった問題です。</p>

<h2 id="rfc-5--成果物には2種類ある">RFC #5 — 成果物には2種類ある</h2>

<p>v1.0 で <code class="language-plaintext highlighter-rouge">/pdlc-arch</code> を使い始めてすぐ、奇妙なことに気づきました。実行するたびに <code class="language-plaintext highlighter-rouge">docs/architecture-2026-05-01.md</code>、<code class="language-plaintext highlighter-rouge">docs/architecture-2026-05-15.md</code>……という日付付きファイルが増え続けます。3ヶ月後には30以上のファイルが散乱していました。</p>

<p>「今のシステムはどんな形？」という質問に答えようとすると、どのファイルが最新かを探すところから始まる。これは設計の間違いです。</p>

<p>根本原因は、2種類の成果物を同じ型として扱っていたことです。</p>

<p><strong>ledger 型</strong>（台帳）は出来事を記録します。PRD、設計の決定——何をいつ考えたかの痕跡。これは上書きしてはいけない。時系列の蓄積がそのまま価値になります。</p>

<p><strong>surface 型</strong>（現況面）は現在の状態を記録します。アーキテクチャ概要、チームの規約——「今どうなっているか」の答え。これは常に1つだけ存在し、更新されるべきです。</p>

<p><code class="language-plaintext highlighter-rouge">/pdlc-arch</code> は <code class="language-plaintext highlighter-rouge">docs/ARCHITECTURE.md</code> を直接更新するように変更しました。遺留の日付付きファイルは <code class="language-plaintext highlighter-rouge">docs/.archive/architecture/</code> へ自動で移動します。</p>

<p>新コマンド <code class="language-plaintext highlighter-rouge">/pdlc-standard</code> で <code class="language-plaintext highlighter-rouge">docs/00_standards/</code> 以下の surface 型ドキュメントを管理します：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/pdlc-standard add <span class="s2">"コードレビューポリシー"</span>
/pdlc-standard edit <span class="s2">"命名規約"</span>
/pdlc-standard index
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">coding-style-v2.md</code> のようなバージョン番号付きファイル名は、コマンド内でハードブロックしています。「就地で編集し、git log で履歴を追う」——これを強制することで、ファイルの増殖を根本から断ちます。</p>

<h2 id="rfc-6--feature-は孤島ではない">RFC #6 — feature は孤島ではない</h2>

<p>v1.0 の feature ID は平坦です。<code class="language-plaintext highlighter-rouge">F20260501-01</code>——ただの連番で、feature 間の関係は誰も知りません。</p>

<p>実際には feature は必ず他の feature に依存するか、影響を与えます。その関係が暗黙知のままだと、変更の影響範囲が見えない。「この feature を変えたら何が壊れるか」の確認に、コードを全部読み返すことになります。</p>

<p>新コマンド <code class="language-plaintext highlighter-rouge">/pdlc-relate</code> は6種類の関係タイプを管理します：</p>

<table>
  <thead>
    <tr>
      <th>タイプ</th>
      <th>意味</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">extends</code></td>
      <td>この feature は別の feature の拡張</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">depends_on</code></td>
      <td>この feature は別の feature の実装を必要とする</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">supersedes</code></td>
      <td>この feature が別の feature を置き換える</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">resolves</code></td>
      <td>この feature が別の feature に起因する問題を修正する</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">conflicts_with</code></td>
      <td>2つの feature に既知の競合がある</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">relates_to</code></td>
      <td>上記に当てはまらない緩い関連</td>
    </tr>
  </tbody>
</table>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/pdlc-relate <span class="nb">set </span>F20260501-01 depends_on F20260415-03
/pdlc-relate query F20260501-01
</code></pre></div></div>

<p>最も使う場面はリファクタリングの前です：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/pdlc-relate impact F20260501-01
</code></pre></div></div>

<p>3層で影響範囲を表示します。直接依存している feature（🔴 必ず協調）、間接依存（🟡 PRD を要確認）、過去に関係があった履歴（🟢 監査のみ）。変更前に確認することで、「動いていたものが壊れた」を大幅に減らせます。</p>

<p><img src="/assets/images/posts/pdlc-relation-impact-diagram.png" alt="PDLC feature 関係グラフ：user-auth を変更したときの影響範囲（赤=変更対象、黄=直接影響、緑=間接/履歴）" /></p>

<h2 id="実装して気づいた2つのこと">実装して気づいた2つのこと</h2>

<p>surface 型への移行は、思ったより手間がかかりました。既存プロジェクトの古い日付付きファイルをどれが「最新」かを自動判定するのは難しい。結局 <code class="language-plaintext highlighter-rouge">/pdlc-arch</code> が遺留ファイルを検出すると「この <code class="language-plaintext highlighter-rouge">architecture-2026-02-19.md</code> を <code class="language-plaintext highlighter-rouge">ARCHITECTURE.md</code> の初期値として使いますか？」と確認を求める設計にしました。自動移行の誤りを防ぐためです。</p>

<p>関係タイプは、最初は3種類でした。「依存」「拡張」「競合」の3つで始めましたが、実プロジェクトで試すと表現できないケースが続出しました。例えば「この feature はあの feature の積み残し問題を修正した」という関係。最終的に6種類が十分な境界でした。それ以上増やすと分類ゲームになります。</p>

<h2 id="現在の状態">現在の状態</h2>

<p>v1.1.0 はリリース済みです。自分のプロジェクト（aitm、pdlc-skills 自体）で3ヶ月ほど使っています。</p>

<p>ledger/surface の分離は <code class="language-plaintext highlighter-rouge">docs/</code> ディレクトリを「タイムライン」から「情報を探せる場所」に変えました。<code class="language-plaintext highlighter-rouge">/pdlc-relate impact</code> はクロス feature の変更の前に毎回使っています。</p>

<p>v1.0 からの移行はほぼ無感覚です。<code class="language-plaintext highlighter-rouge">/pdlc-arch</code> の初回実行時に遺留ファイルの確認が入る以外、既存のワークフローは変わりません。</p>

<h2 id="インストール--アップグレード">インストール / アップグレード</h2>

<p><strong>新規インストール</strong>（Claude Code が必要）：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/claude <span class="nb">install </span>kanfu-panda/pdlc-skills
</code></pre></div></div>

<p><strong>アップグレード</strong>：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bash &lt;<span class="o">(</span>curl <span class="nt">-fsSL</span> https://raw.githubusercontent.com/kanfu-panda/pdlc-skills/main/install.sh<span class="o">)</span> <span class="nt">--upgrade</span>
</code></pre></div></div>

<p>ソースコードは <a href="https://github.com/kanfu-panda/pdlc-skills">GitHub</a> にて MIT ライセンスで公開中です。</p>

<h2 id="次回">次回</h2>

<p>PDLC は工程を細かく分け、各ステップで成果物を残します。利点はステップを飛ばさない・脱線しないこと。代償は、ただ AI に書かせるより token を多く食うこと。今日もある人に言われました——「ドキュメントが増えれば、token もその分かさむのでは？」</p>

<p>これは一本立てて書く価値があります。この token の勘定が実際どう積み上がるのか（正確には測っていませんが、直感に反する部分があります）、そしてこの重めのプロセスを回しながら、どうコストを抑えているか。token を節約するのは結局お金の節約ですが、お金だけの話でもありません。</p>

]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">aitm 1.0：AIをコパイロットに、ハンドルは自分で</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/06/07/aitm-v1.ja.html" rel="alternate" type="text/html" title="aitm 1.0：AIをコパイロットに、ハンドルは自分で" />
    <published>2026-06-07T00:00:00+08:00</published>
    <updated>2026-06-07T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/06/07/aitm-v1.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <summary type="html">aitm 1.0 リリース。バイナリ 5.3MB、コールドスタート 3-5ms、6つのLLMプロバイダー、4層セキュリティモデル。設計の思想と実装の詳細を紹介します。</summary>
    <category term="aitm" />
    <category term="ターミナル" />
    <category term="AI" />
    <category term="macOS" />
    <category term="Windows" />
    <category term="オープンソース" />
    <category term="Tauri" />
    <category term="Rust" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/06/07/aitm-v1.ja.html"><![CDATA[<p>ターミナルの中で AI を使ってコーディングをしていたとき、ある問題に気づきました。AI がファイルを変更しても、同じウィンドウの中でその変更を確認する方法がなく、アプリを切り替えてまた戻る——その繰り返しがずっと気になっていました。</p>

<p>欲しかったのはシンプルなことです。<strong>ターミナルとAIとファイル、この3つが同じウィンドウの中にあること</strong>。コンテキストスイッチなしで作業できること。</p>

<p>それを作ったのが aitm です。</p>

<p><img src="/assets/images/posts/aitm-screenshot-01-main-interface.png" alt="メインインターフェース：左にファイルツリー、中央にターミナル、右にAIサイドバー" /></p>

<h2 id="tauri-を選んだ理由">Tauri を選んだ理由</h2>

<p>Electron は最初に評価しました。アイドル時に RAM 150MB 以上、起動に数秒——プロトタイプとしては許容範囲でも、常時起動するツールとしては受け入れられません。早い段階で除外しました。</p>

<p>最初から <a href="https://v2.tauri.app/">Tauri 2</a> + Rust を選択し、約2ヶ月で動くものができました。結果：<strong>バイナリ 5.3MB、コールドスタート 3–5ms、アイドル時 RAM 約30MB</strong>。数十のプロセスが走る環境で、これは「OSの一部のように感じられるツール」と「ゲストのように感じられるツール」の違いです。</p>

<p>React 19 フロントエンドは Tauri IPC 経由で Rust の PTY レイヤーと通信します。AIサイドバー、ツール実行パイプライン、セキュリティレイヤーはすべて Rust 側に実装されています。Webアプリをデスクトップアプリに見せかけたものではなく、OS レベルの処理は本当に OS レベルで動くコードが担っています。</p>

<h2 id="ツールループ">ツールループ</h2>

<p>aitm のコア機能は AI のツール呼び出しで、クローズドループで動きます。</p>

<ol>
  <li>サイドバーでAIに質問する</li>
  <li>AI がコンテキストを必要と判断し、<code class="language-plaintext highlighter-rouge">list_files</code> / <code class="language-plaintext highlighter-rouge">read_file</code> / <code class="language-plaintext highlighter-rouge">get_terminal_history</code> / <code class="language-plaintext highlighter-rouge">search_history</code> を呼び出す</li>
  <li>aitm が読み取り専用のツールを自動実行し、結果をAIに返す</li>
  <li>AIがコマンドを実行したい場合（<code class="language-plaintext highlighter-rouge">run_command</code>）、<strong>そこで止まり、あなたを待つ</strong></li>
  <li>コマンドの全文を確認し、承認または拒否してから実行される</li>
</ol>

<p>ステップ 1〜3 は中断なく流れます。ステップ 4 が黙って実行されることは絶対にありません。この境界——読み取りは自動で流れ、実行は人間を待つ——が、設計のすべてです。</p>

<p>AIは聞かれる前からコンテキストも受け取ります。現在の git ブランチ、作業ディレクトリ、変更状態、リッスン中のポート。AIは最初の一言を発する前から、あなたの状況を把握しています。</p>

<p><img src="/assets/images/posts/aitm-screenshot-04-ai-sidebar.png" alt="AIサイドバー（プロジェクトコンテキストを認識して挨拶）" /></p>

<h2 id="4層セキュリティモデル">4層セキュリティモデル</h2>

<p>AI のツール実行は、最も時間をかけた部分です。懸念は高度な攻撃ではなく、LLM がハルシネーションを起こすという現実です。ハルシネーションした <code class="language-plaintext highlighter-rouge">rm -rf</code> は、最悪な午後につながります。</p>

<p>すべての <code class="language-plaintext highlighter-rouge">run_command</code> 呼び出しは、シェルに近づく前に4つのゲートを通過します。</p>

<p><strong>L1 — ブロックリスト regex</strong>：何があっても通過しないハードコードされたパターン。<code class="language-plaintext highlighter-rouge">rm -rf /</code>、<code class="language-plaintext highlighter-rouge">:(){ :|:&amp; };:</code>、<code class="language-plaintext highlighter-rouge">dd if=/dev/zero</code> など約50件。高速で、設定不要で、ゼロトラスト。「ユーザーが承認した」としても通してはいけないコマンドです。</p>

<p><strong>L2 — ヒューリスティックリスクスコアリング</strong>：コマンド文字列をシグナルのセットでスコアリング。<code class="language-plaintext highlighter-rouge">/</code> に触れるか、リダイレクト（<code class="language-plaintext highlighter-rouge">&gt;</code>）を使うか、<code class="language-plaintext highlighter-rouge">sh</code> にパイプするか、システムディレクトリを参照するか。出力は <code class="language-plaintext highlighter-rouge">DESTRUCTIVE / HIGH / LOW</code> の3段階で、確認ダイアログに可視表示されます。</p>

<p><strong>L3 — プロジェクトスコープ allowlist</strong>：プロジェクトごとに <code class="language-plaintext highlighter-rouge">globset</code> を設定できます。AIが触れてよいパスとパターンを定義し、スコープ外はL4の前にフラグが立ちます。オプトインですが、強く推奨します。</p>

<p><strong>L4 — ユーザー確認ダイアログ</strong>：すべての <code class="language-plaintext highlighter-rouge">run_command</code> 呼び出しはモーダルを表示します。コマンドの全文、リスクレベル、スコープチェック結果。承認するかしないか、あなたが決めます。自動承認モードはありません。</p>

<p>L1・L2 は Rust でゼロ非同期オーバーヘッドで動作。L3 は <code class="language-plaintext highlighter-rouge">globset</code> クレートを使用。L4 は IPC ハンドラのハードゲートで、AIレイヤーにはそのコードパスが存在しないため、バイパスは構造的に不可能です。</p>

<h2 id="10-に含まれるもの">1.0 に含まれるもの</h2>

<p>ツールループとセキュリティモデルが主な機能ですが、1.0 にはそれ以外にも多くが含まれています。</p>

<p><strong>プロジェクトスコープ</strong>：セッションにプロジェクトディレクトリを持たせます。AIは作業スコープを把握し、ファイルツリーもツール呼び出しもその範囲に収まります。「ターミナルのAI」を「このプロジェクトのAI」に変えるのが、この機能です。</p>

<p><strong>SQLite ローカル永続化</strong>：会話履歴、セッション状態、設定はすべてローカルのSQLiteデータベースに保存されます。データは端末の外に出ません。アカウント不要です。</p>

<p><strong>6つのLLMプロバイダー</strong>：OpenAI、Anthropic、DeepSeek、通義千問（Qwen/DashScope）、智谱（Zhipu）、Moonshot（Kimi）。セッションごとに切り替え可能です。西側の主要プロバイダーに加え、中国の主要プロバイダーも対応しています。</p>

<p><strong>8テーマ、中英 i18n</strong>：英語と中国語 UI、個性的なテーマ8種。特に気に入っているのは、ダークな水墨画テイストのテーマです。</p>

<p><strong>CodeMirror エディタ・分割ペイン</strong>：ターミナルウィンドウに組み込まれたファイルエディタ。コンテキストを離れずに素早い編集が必要なときに使えます。</p>

<p><strong>macOS Developer ID 公証</strong>：<code class="language-plaintext highlighter-rouge">.dmg</code> は Apple のパイプラインで署名・公証済みです。Gatekeeper の警告は出ません。</p>

<p><img src="/assets/images/posts/aitm-screenshot-02-split-layout.png" alt="3ペイン分割（ターミナル + ファイルプレビュー + ブラウザ）" /></p>

<p><img src="/assets/images/posts/aitm-screenshot-03-settings.png" alt="設定画面（外観 / テーマ / レイアウト）" /></p>

<h2 id="10-に含まれないもの">1.0 に含まれないもの</h2>

<p>正直に言うと、いくつか間に合わなかったものがあります。</p>

<p>Windows サポートは存在しますが、macOS ほど十分にテストされていません。動作はします——CI でビルドし、実際に動かしました——ただ、私が毎日使っているのは macOS で、エッジケースが最もカバーされているのもそちらです。</p>

<p>ツール呼び出しループでの AIレスポンスのストリーミングは、まだ未実装です。AIはすべてのツール呼び出しが完了してから応答します。このレイテンシのトレードオフは 1.1 で再検討します。</p>

<p>プラグインシステムとユーザー定義ツールは、ロードマップにあります。1.0 には含まれていません。</p>

<h2 id="ダウンロード">ダウンロード</h2>

<p>バイナリは <a href="https://github.com/kanfu-panda/aitm/releases/tag/v1.0.0">GitHub Release</a> から入手できます。</p>

<p>macOS Apple Silicon、Windows x86_64、Windows ARM64 に対応しています。</p>

<p>ソースコードは <a href="https://github.com/kanfu-panda/aitm">GitHub</a> にて Apache 2.0 ライセンスで公開中です。バグ報告やセキュリティモデルについての議論は、Issues と Discussions をご利用ください。</p>

]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">arcade：ブログにブラウザ用アーケードエミュレータを設置しました</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/05/16/arcade-intro.ja.html" rel="alternate" type="text/html" title="arcade：ブログにブラウザ用アーケードエミュレータを設置しました" />
    <published>2026-05-16T00:00:00+08:00</published>
    <updated>2026-05-16T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/05/16/arcade-intro.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <summary type="html">ブログの /arcade/ にブラウザで動くアーケードエミュレータを設置しました。MAME や数十種類のコンソールに対応。ご自身のローカルゲームファイルをドラッグするだけで遊べ、すべてブラウザ内で完結、アップロードなし。</summary>
    <category term="arcade" />
    <category term="エミュレータ" />
    <category term="EmulatorJS" />
    <category term="WebAssembly" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/05/16/arcade-intro.ja.html"><![CDATA[<h2 id="これは何">これは何</h2>

<p>ブログに <a href="/ja/arcade/">arcade 製品ページ</a> を追加しました——ブラウザで動くアーケードエミュレータです。
EmulatorJS（RetroArch の WebAssembly 移植）を採用しています。</p>

<p>対応システムは、MAME アーケード、NES / SNES、GB / GBC / GBA、N64、Sega Genesis、NDS、PCE など数十種類。</p>

<h2 id="何ができる">何ができる</h2>

<ul>
  <li>ローカルゲームファイルをドラッグ → 適切なエミュレータコアを自動判定 → プレイ</li>
  <li><strong>セーブステートはセッション跨ぎで保持</strong>、次回開いた時に続きから</li>
  <li><strong>ゲームパッドはプラグアンドプレイ</strong>、F2 でキー設定</li>
  <li>フルスクリーン</li>
  <li>アーケード ZIP は <strong>MAME ↔ FBNeo</strong> をワンタッチで切替可能（romset 互換性対応）</li>
</ul>

<h2 id="使い方">使い方</h2>

<ol>
  <li><a href="/arcade/play/" target="_blank" rel="noopener">arcade ランチャー</a> を開く</li>
  <li><strong>ローカルゲームファイル</strong>（NES、SNES、GB、アーケード ZIP など）をページにドラッグ</li>
  <li>一部のゲーム（Neo-Geo など）は対応 BIOS も同じ場所にドラッグ</li>
  <li>ゲームカードの「開始」をクリック</li>
</ol>

<h2 id="ローカルとプライバシーについて">ローカルとプライバシーについて</h2>

<p>ドラッグしたファイルは <strong>ご自身のブラウザ内ストレージに保存</strong> され、サーバーへは一切アップロードされません。
これはブラウザの File API + IndexedDB の標準的な振る舞いで、私は何も関与していません——
GitHub Pages はそもそも静的ファイルしか配信できないので、アップロード自体が不可能です。</p>

<h2 id="注意">注意</h2>

<p>⚠️ 個人的な娯楽、合法な用途に限ります。ご自身が合法的に所有するゲームファイルのみご利用ください。</p>

<h2 id="試遊する">試遊する</h2>

<p><a href="/arcade/play/" target="_blank" rel="noopener">→ arcade を起動</a></p>

<p>楽しんでください。</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">PDLC：AI による開発を「ソフトな慣習」から「ハードな契約」へ</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/05/15/pdlc-intro.ja.html" rel="alternate" type="text/html" title="PDLC：AI による開発を「ソフトな慣習」から「ハードな契約」へ" />
    <published>2026-05-15T00:00:00+08:00</published>
    <updated>2026-05-15T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/05/15/pdlc-intro.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kanfu-panda.github.io/assets/images/posts/pdlc-intro-cover.png" />
    <summary type="html">AI が「機能を作りました」と言うが PRD はチャットの中だけ。テストは「あとで追加」。セッションをまたぐと誰もどの機能がどのステージかを覚えていない。PDLC は 31 個の標準化ステージと 5 つの不変条件（Iron Law）でこれを解決する。動機・実装・応用・効果を一気通読。</summary>
    <category term="PDLC" />
    <category term="Claude Code" />
    <category term="AI エンジニアリング" />
    <category term="ワークフロー" />
    <category term="オープンソース" />
    <category term="MIT" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/05/15/pdlc-intro.ja.html"><![CDATA[<h2 id="動機ai-コーディングの常習病">動機：AI コーディングの常習病</h2>

<p>こんなことはありませんか：</p>

<ul>
  <li>AI に新機能を依頼すると「できました」と返ってくる。<strong>しかし PRD はそのチャット履歴の中だけにある</strong>。ウィンドウを閉じれば消える。「あの設計、なぜそうしたっけ」を後日確認しようにも、git のコミットメッセージしか残っていない。</li>
  <li>実装後にテストを書かせると、<strong>通過率 100% の「テスト」を平気で作る</strong>。なぜなら実装済みのコードに合わせて書かれただけだから。設計を制約していない。</li>
  <li>設計ステップを飛ばして直接コードを書く。<strong>アーキテクチャの腐敗は静かに進行</strong>。3 か月後に新機能を追加しようとしたら、コードは当初の設計図とは別物になっている。</li>
  <li>セッションをまたぐと<strong>記憶ゼロ</strong>。「機能 X、どこまで進んでた？」 — あなたの頭の中だけが頼り。</li>
</ul>

<p>これらの本質は何か：<strong>AI アシスタントはエンジニアリングプロセスを「ソフトな約束事」として扱う</strong> — スキップ可能、忘却可能。</p>

<p><a href="/ja/pdlc/">PDLC</a>（<strong>P</strong>roduct <strong>D</strong>evelopment <strong>L</strong>ife <strong>C</strong>ycle）は Claude Code プラグインで、目的は一言で：<strong>そのソフトな約束をハードな契約に格上げする</strong>。PDLC のワークフローに入ると AI は <strong>PRD をスキップできない、テスト無しに実装できない、現在のステージを忘れられない</strong>。</p>

<h2 id="実装3-層構成--iron-law--状態マシン">実装：3 層構成 + Iron Law + 状態マシン</h2>

<h3 id="31-個のコマンド3-層構成">31 個のコマンド、3 層構成</h3>

<table>
  <thead>
    <tr>
      <th>層</th>
      <th style="text-align: right">数</th>
      <th>役割</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>第 1 層 · エントリポイント</td>
      <td style="text-align: right">3</td>
      <td><code class="language-plaintext highlighter-rouge">/pdlc-feature</code>、<code class="language-plaintext highlighter-rouge">/pdlc-fix</code>、<code class="language-plaintext highlighter-rouge">/pdlc-status</code> — 一文のプロンプトでチェーン全体を駆動</td>
    </tr>
    <tr>
      <td>第 2 層 · ステージ</td>
      <td style="text-align: right">11</td>
      <td><code class="language-plaintext highlighter-rouge">/pdlc-prd</code>、<code class="language-plaintext highlighter-rouge">/pdlc-tdd</code>、<code class="language-plaintext highlighter-rouge">/pdlc-implement</code>、<code class="language-plaintext highlighter-rouge">/pdlc-review</code>、<code class="language-plaintext highlighter-rouge">/pdlc-ship</code> 等 — 単一ステージの細かい制御</td>
    </tr>
    <tr>
      <td>第 3 層 · ツール</td>
      <td style="text-align: right">17</td>
      <td>UI 設計 / DB / アーキ / セキュリティ / 性能 / コード生成 / i18n / マイグレーションなどの専門ツール</td>
    </tr>
  </tbody>
</table>

<p>日常では第 1 層が主役：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Claude Code 内で</span>
/pdlc-feature ログインに画像認証を追加
</code></pre></div></div>

<p>このコマンド一つで PDLC が PRD → 設計 → TDD レッドライト → 実装 → レビュー → リリースまでをつなぎます。すべてのステージは Iron Law を満たすことを強制されます。</p>

<h3 id="iron-law5-つの不変条件">Iron Law：5 つの不変条件</h3>

<p>成果物を生成する第 1 層 / 第 2 層のすべてのステージは以下を満たす必要があります：</p>

<ol>
  <li><strong>成果物がディスクに保存</strong> — チャット出力だけではない、<code class="language-plaintext highlighter-rouge">docs/</code> 配下に実ファイル</li>
  <li><strong>状態マシンが更新</strong> — 完了したすべてのステージが <code class="language-plaintext highlighter-rouge">docs/.pdlc-state/&lt;feature-id&gt;.json</code> を書く</li>
  <li><strong>テストファースト</strong> — 失敗するテストが無い限り実装はブロック（TDD レッドライト）</li>
  <li><strong>セルフチェック</strong> — 各ステージはハンドオフ前に自己監査を実行</li>
  <li><strong>自動修復は 1 回のみ</strong> — 自動修復は最大 1 回、解決しない問題は人間にエスカレート</li>
</ol>

<p>これらは<strong>推奨ではなく強制</strong>。第 1 層 / 第 2 層の成果物生成ステージはこれを飛ばせません — 飛ばせばセルフチェックが失敗する。</p>

<h3 id="状態マシン機能ごとに-1-つ">状態マシン：機能ごとに 1 つ</h3>

<p>新機能ごと（<code class="language-plaintext highlighter-rouge">/pdlc-feature ...</code>）に PDLC は <code class="language-plaintext highlighter-rouge">F20260515-01</code> のような ID を発行し、対応するファイルを作成：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docs/.pdlc-state/F20260515-01.json
</code></pre></div></div>

<p>中身はこんな感じ：</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"feature_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"F20260515-01"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"slug"</span><span class="p">:</span><span class="w"> </span><span class="s2">"captcha-login"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"current_stage"</span><span class="p">:</span><span class="w"> </span><span class="s2">"implement"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"history"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="nl">"stage"</span><span class="p">:</span><span class="w"> </span><span class="s2">"prd"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ts"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-05-15T10:30:00Z"</span><span class="p">,</span><span class="w"> </span><span class="nl">"self_audit"</span><span class="p">:</span><span class="w"> </span><span class="s2">"8/8 passed"</span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="nl">"stage"</span><span class="p">:</span><span class="w"> </span><span class="s2">"design"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ts"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-05-15T11:05:00Z"</span><span class="p">,</span><span class="w"> </span><span class="nl">"self_audit"</span><span class="p">:</span><span class="w"> </span><span class="s2">"6/6 passed"</span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="nl">"stage"</span><span class="p">:</span><span class="w"> </span><span class="s2">"tdd"</span><span class="p">,</span><span class="w"> </span><span class="nl">"ts"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-05-15T11:40:00Z"</span><span class="p">,</span><span class="w"> </span><span class="nl">"tests_written"</span><span class="p">:</span><span class="w"> </span><span class="mi">14</span><span class="p">,</span><span class="w"> </span><span class="nl">"all_failing"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">}</span><span class="w">
  </span><span class="p">],</span><span class="w">
  </span><span class="nl">"next_step"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/pdlc-implement"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>メリットは？<strong>機能ごとのセッション横断の継続性</strong>。明日 Claude Code を開き <code class="language-plaintext highlighter-rouge">/pdlc-status</code> を実行すれば「F20260515-01 は implement ステージ、次は review」と分かる。あなたの記憶にも、AI のコンテキストウィンドウにも依存しません。</p>

<h3 id="ターゲットプロジェクトのディレクトリ">ターゲットプロジェクトのディレクトリ</h3>

<p>PDLC はプロジェクト内の以下を読み書きします：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docs/00_standards/coding/                          # コーディング規約（読み取り専用）
docs/01_requirements/prd/                          # PRD
docs/02_design/{api,database,architecture,ui-ux}/  # 技術設計
docs/03_development/                               # 開発者マニュアル
docs/04_testing/{unit-tests,e2e-tests,defects,...} # テスト &amp; 欠陥
docs/05_deployment/                                # デプロイドキュメント
docs/06_tasks/                                     # ステージ内タスク追跡
docs/07_reviews/{doc,code,design,retro}/           # レビュー記録
docs/.pdlc-state/&lt;feature-id&gt;.json                 # 機能ごとの状態マシン
</code></pre></div></div>

<p>すべてがディスク上の実ファイル。1 週間前に AI が PRD ステージで何を書いたかを <code class="language-plaintext highlighter-rouge">git diff</code> で見られます。</p>

<h2 id="応用3-つの典型シナリオ">応用：3 つの典型シナリオ</h2>

<h3 id="シナリオ-1機能をエンドツーエンドで実装">シナリオ 1：機能をエンドツーエンドで実装</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Claude Code 内で</span>
/pdlc-feature ログインに電話番号認証を追加
</code></pre></div></div>

<p>PDLC が自動的にチェーン：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>→ 機能 ID F20260515-01 を割当て（user-auth-phone）
→ ステージ 1：PRD 作成
   ✓ docs/01_requirements/prd/F20260515-01-user-auth-phone-prd.md
   ✓ セルフチェック 8/8 通過
→ ステージ 2：技術設計
   ✓ docs/02_design/api/F20260515-01-user-auth-phone-api.md
   ✓ docs/02_design/database/F20260515-01-user-auth-phone-db.md
→ ステージ 3：TDD レッドライト
   ✓ 14 個のテストを記述、全て期待通り失敗
→ ステージ 4：実装
   ✓ 14/14 テストがグリーンに
→ ステージ 5：コードレビュー + 自動修復
   ✓ lint 問題 3 件を自動修正
   ✓ docs/07_reviews/code/F20260515-01-user-auth-phone-review.md
→ ステージ 6：ハンドオフ
   📦 docs/.pdlc-state/F20260515-01.json 更新済み
   👉 次：/pdlc-ship
</code></pre></div></div>

<p>このフローの後、git ワーキングツリーには：1 つの PRD、2 つの設計ドキュメント、N 個のテストファイル、1 つのレビュー記録、1 つの状態マシン更新、加えて実際のコード変更。<strong>すべて実ファイル</strong>、チャットだけではありません。</p>

<h3 id="シナリオ-2監査可能なバグ修正">シナリオ 2：監査可能なバグ修正</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/pdlc-fix 空リストでのページネーションクラッシュ
</code></pre></div></div>

<p>PDLC は「ざっと見て 2 行変える」ではなく、こう進みます：</p>

<ol>
  <li><strong>特定</strong>：コードを検索し原因の候補を絞る</li>
  <li><strong>再現</strong>：まず安定して再現するテストを書く（<code class="language-plaintext highlighter-rouge">docs/04_testing/defects/</code> 配下）</li>
  <li><strong>修正</strong>：その後初めてコードを変更</li>
  <li><strong>検証</strong>：再現テストがグリーンに</li>
  <li><strong>記録</strong>：欠陥レポートをアーカイブ</li>
</ol>

<p>半年後に類似のバグが出たら、過去の欠陥記録を <code class="language-plaintext highlighter-rouge">grep</code> して前回の修正法が分かります。</p>

<h3 id="シナリオ-3プロジェクト全体の進捗を一目で">シナリオ 3：プロジェクト全体の進捗を一目で</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/pdlc-status
</code></pre></div></div>

<p>おおよその出力：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Project PDLC status (read from docs/.pdlc-state/):

F20260512-01  user-auth-phone     ✓ shipped
F20260513-01  captcha-login       ⏵ in review
F20260514-01  password-reset      ⚠ stuck in TDD (3 tests failing)
F20260515-01  email-verify        ⏵ in PRD
</code></pre></div></div>

<p>AI を追いかけて「どこまで進んだ？」と聞かなくて済みます — 状態マシンを読むだけ。</p>

<h2 id="効果実際に得られるもの">効果：実際に得られるもの</h2>

<h3 id="1-エンジニアリングドキュメントがコードと一緒にディスクに残る">1. エンジニアリングドキュメントがコードと一緒にディスクに残る</h3>

<p>すべての PRD、設計、レビュー記録は git 履歴の中の実ファイル。1 年後に「なぜこの設計にしたか / どんな検討経て決めたか / レビューで何が指摘されたか」を正確に追跡できます。<strong>長期保守性の質的向上</strong>。</p>

<h3 id="2-tdd-が口先だけでなく実際に行われる">2. TDD が口先だけでなく実際に行われる</h3>

<p>実装は失敗するテストにブロックされます。AI がスキップしたい？できません — ルールであるだけでなく、<strong>状態マシンによって強制</strong>されているから。</p>

<h3 id="3-自動修復の暴走リスクが封じ込められる">3. 自動修復の暴走リスクが封じ込められる</h3>

<p>多くの AI ツールには静かな問題があります：<strong>修正 → 確認 → 直っていない → また修正 → 別の所が壊れる → また修正…</strong> トークンと時間を燃やす無限ループ。PDLC は「自動修復は最大 1 回」と強制し、AI が詰まったら止まって人間に委ねます。</p>

<h3 id="4-セッション横断のエンジニアリング継続性">4. セッション横断のエンジニアリング継続性</h3>

<p>今日 implement ステージまで進んだ。明日 <code class="language-plaintext highlighter-rouge">/pdlc-status</code> で次のステップが分かる。<strong>会話のコンテキストウィンドウにも、あなたの記憶にも依存しません</strong>。</p>

<h3 id="5-レガシープロジェクトも取り込める">5. レガシープロジェクトも取り込める</h3>

<p>新規プロジェクトはゼロから構造を立てるのが容易。レガシーは難しいケース。PDLC には <code class="language-plaintext highlighter-rouge">/pdlc-adopt</code> があり、既存コードベースを調査し、<strong>コードを書き換えずに</strong>、足りない標準 / 設計ドキュメント / ディレクトリ構造を補完して、プロジェクトを PDLC ステージに引き継げる地点まで持っていきます。</p>

<h2 id="始めるには">始めるには</h2>

<p>完全なインストール手順、コマンド一覧、カスタマイズ方法、FAQ は <a href="/ja/pdlc/">PDLC 製品ページ</a> とリポジトリにあります。</p>

<p><strong>ワンライナー</strong>：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-fsSL</span> https://raw.githubusercontent.com/kanfu-panda/pdlc-skills/main/install.sh <span class="se">\</span>
  | bash <span class="nt">-s</span> <span class="nt">--</span> <span class="nt">--global</span>
</code></pre></div></div>

<p>その後 Claude Code 内で：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/pdlc-feature &lt;一文で要件を記述&gt;
</code></pre></div></div>

<p>リポジトリ：<a href="https://github.com/kanfu-panda/pdlc-skills"><strong>github.com/kanfu-panda/pdlc-skills</strong></a>（MIT）</p>

<h2 id="設計哲学を少し">設計哲学を少し</h2>

<p>PDLC は「AI アシスタントを足す」ものではなく、<strong>AI 以前のエンジニアリング思考の延長</strong>です：</p>

<blockquote>
  <p>ソフトウェアエンジニアリングが数十年にわたり積み上げた核心は「プロセス規律」です。AI が登場しても規律は消えるどころか、<strong>AI がすり抜けられないツールで強制される</strong>べき。</p>
</blockquote>

<p>「AI がコードを書き終えた = プロジェクト納品」が危険な単純化だと感じるなら、PDLC はおそらくあなたが探していたものです。</p>

<p>ぜひお試しください。質問は <a href="https://github.com/kanfu-panda/pdlc-skills/discussions">GitHub Discussions</a> へ、または <a href="/ja/about/">プロフィールページ</a> からご連絡を。</p>
]]></content>
  </entry>
  <entry xml:lang="ja-JP">
    <title type="html">aitm 初公開：AI をターミナルに組み込む</title>
    <link href="https://kanfu-panda.github.io/ja/blog/2026/05/14/aitm-introduction.ja.html" rel="alternate" type="text/html" title="aitm 初公開：AI をターミナルに組み込む" />
    <published>2026-05-14T00:00:00+08:00</published>
    <updated>2026-05-14T00:00:00+08:00</updated>
    <id>https://kanfu-panda.github.io/ja/blog/2026/05/14/aitm-introduction.ja.html</id>
    <author><name>kanfu-panda</name></author>
    <summary type="html">AI を組み込んだデスクトップ向けターミナルアプリ。macOS と Windows に対応。AI がファイル読み込み、コマンド履歴検索、コマンド実行を行えます。すべての高リスク操作には明示的な確認が必要。</summary>
    <category term="aitm" />
    <category term="ターミナル" />
    <category term="AI" />
    <category term="macOS" />
    <category term="Windows" />
    <category term="ツール" />
    <content type="html" xml:base="https://kanfu-panda.github.io/ja/blog/2026/05/14/aitm-introduction.ja.html"><![CDATA[<h2 id="概要">概要</h2>

<p><a href="/ja/aitm/">aitm</a> は AI 機能を直接ターミナル体験に組み込んだ、デスクトップ向けターミナルアプリです。</p>

<ul>
  <li><strong>普通のターミナル</strong>：コマンドを打ち、出力を見て、次の手を自分で考える。</li>
  <li><strong>aitm</strong>：AI と直接対話できる。AI はファイルを読み、コマンド履歴を検索し、実行したいコマンドを提案できる —— ただし、実行はすべて <strong>あなたの明示的な承認が必要</strong>。</li>
</ul>

<p>つまり：<strong>AI をあなたのワークフローに招き入れる、ただし主導権は渡さない</strong>。</p>

<h2 id="なぜ作ったか">なぜ作ったか</h2>

<p>ターミナルを開いて、別途ブラウザで AI に質問してコピペして戻る —— このコンテキストスイッチが多すぎます。市場の「AI ターミナル」は両極端に振れがちで、ターミナルに対話ボックスを足しただけでツール実行はできないか、あるいは完全に AI 主導であなたが実行過程を見られないエージェントになっています。</p>

<p>aitm の狙いはその中間：</p>

<blockquote>
  <p>AI はあなたの環境（ファイル / コマンド履歴 / 出力）を見られ、必要に応じて手を動かせる（コマンド実行、ファイル読み取り）。最終判断は常にあなたが下す。AI が提案し、あなたがボタンを押す。</p>
</blockquote>

<h2 id="このリリースの主な内容">このリリースの主な内容</h2>

<h3 id="1-ai-ツール呼び出しループ">1. AI ツール呼び出しループ</h3>

<p>AI は提案だけにとどまらず、制御されたツール群を呼び出して直接動けます：</p>

<ul>
  <li>ディレクトリ閲覧、ファイル読み取り</li>
  <li>ターミナルコマンド履歴の閲覧・キーワード検索</li>
  <li>実行したいコマンドを提案して、承認待ち</li>
</ul>

<p>実行系の操作はすべて、完全なコマンドを確認ダイアログで見せてから行います。</p>

<h3 id="2-ai-が今の状況を自動把握">2. AI が「今の状況」を自動把握</h3>

<p>AI が「ターミナル履歴の読み取り」などのツールを呼ぶと、aitm が結果に現在の git ブランチ / 作業ディレクトリ / リッスン中ポートをコンテキストとして自動で前置きします。プロジェクトの状況や作業ツリーの汚れ具合、稼働中サービスを、毎回説明する必要がありません。</p>

<h3 id="3-tab-メタ情報が一目瞭然">3. Tab メタ情報が一目瞭然</h3>

<p>各 tab の右側に現在の git ブランチ、dirty 状態、未プッシュ commits、リッスン中ポートが表示されます。複数 tab を並行で走らせていても、tab バーをひと目見れば各プロジェクトの状態が分かります。</p>

<h3 id="4-システム通知">4. システム通知</h3>

<p>長時間タスクの完了、AI の承認待ち、AI の対話一巡終了 —— これらの節目で aitm が macOS / Windows のシステム通知を能動的に送ります。ウィンドウを凝視する必要はありません。</p>

<p>各 tab にステータスリングが付きます（琥珀色パルス = 承認待ち / マゼンタ = エラー / 青 = 実行中 / 緑 = 完了）。<kbd>⌘</kbd> + <kbd>⇧</kbd> + <kbd>U</kbd> のグローバルショートカットで未読のある tab に直接ジャンプし、AI サイドバーが開きます。</p>

<h3 id="5-ターミナル通知プロトコル互換">5. ターミナル通知プロトコル互換</h3>

<p>OSC 9 / OSC 99 / OSC 777 などのターミナル通知プロトコルをバックエンドで解析。「終わったよ」通知を発する大半の CLI ツールは、aitm ではそのまま通知イベントとして拾えます。</p>

<h3 id="6-レイアウトを切り替え可能">6. レイアウトを切り替え可能</h3>

<p>AI サイドバーとファイルツリーの左右位置を設定パネルで切り替えられます。お使いの画面構成に合わせて調整可能。</p>

<h2 id="ダウンロード">ダウンロード</h2>

<ul>
  <li><a href="/ja/aitm/">aitm 製品ページ</a> から最新版をどうぞ</li>
  <li>対応プラットフォーム：macOS Apple Silicon、Windows x86_64、Windows ARM64</li>
  <li>インストール手順、初回利用、セキュリティモデル、FAQ はすべて製品ページに記載</li>
</ul>

<p>AI は別のタブではなく、あなたのそばにあるべきだと感じるなら、ぜひ試してみてください。</p>

<p>フィードバックや雑談は <a href="/ja/about/">プロフィールページ</a> の連絡先からどうぞ。</p>
]]></content>
  </entry>
</feed>
