i-Willink
|Tech|✍️ i-Willink

Claude Code(Opus 4.8)の自走サイクルを、実プロダクトで回してみた

AI に「Issue を直してリリースまで」を任せる実験を、OSS プロダクト Agent Deck で試しました。実装と検証を別のエージェントに分け、人間がゲートを持つ「監査できる自走」をどう組んだか。そして実際に回した 1 周を、誇張せずに書きます。

🤖 3行でわかるポイント

  • 1Claude Code(Opus 4.8)の自走ループを実プロダクト Agent Deck に通し、Issue を 1 件直して v0.3.4 を自動でリリースした
  • 2実装役(Maker)と検証役(Checker)を別エージェントに分離。Checker は LLM の感想ではなく node --test の exit code など"実行できる合否"だけで判定する
  • 3すべての PR は公開、backlog の承認とリリースの引き金は人間の手。"AI が勝手に出荷"ではなく"監査できる自走"を目指す
Agent Deck 自走開発サイクル ヒーローイメージ
Agent Deck — autonomous improve → release loop (human-gated)
v0.3.4MITClaude Code / Opus 4.8Maker–Checker

ループの構成要素

Maker(実装)Checker(独立検証)node --test の exit codegit worktree 隔離GitHub Actions CI監査ログ

実際に起きたこと

  • Issue #9(同分発火のブランチ名衝突)を決定論的に修正
  • Maker → Checker の独立検証(6 ゲート・すべて exit code で判定)
  • CI 全 green(test×3 + smoke×3 + CodeQL×4)→ v0.3.4 を公開
  • 全 PR 公開・人間レビュー・監査ログに「1 サイクル 1 行」

v0.3.4 リリースノート

2026年6月14日

GitHubで見る

この記事で動いた成果物(v0.3.4)

自走サイクルが直した Issue は、すでに v0.3.4 として配布済みです。修正の中身は下記のとおり。

v0.3.4 のリリースを見る

AI コーディングエージェントに、「Issue を見つけて、直して、リリースする」までを任せたら、どこまで安全に回せるのか。それを実プロダクトで確かめた実験の記録です。

舞台は、私たちが OSS で公開している Agent Deck 。複数の AI CLI エージェントを並列で操るデスクトップアプリです。今回はその開発側を、Claude Code(Opus 4.8)の自走ループに通しました。

先に正直に言っておきます。これは「AI が勝手にプロダクトを育てる」話ではありません。 人間がゲートを握ったまま、Issue を 1 件、誰でも検証できる形で消化した——起きたのはそれだけです。でも、その「だけ」を地に足のついた形で回せるかどうかが、実は一番難しい。

🧭なぜ、実プロダクトで試したのか

この自走ループ自体は、いきなり生まれたものではありません。まず私たちは社内の開発ハーネス willink-claude-kit で「人間レビュー付きの自走サイクル」を先に実証してきました。

ただ、ハーネス(道具)自身を直すのと、実ユーザーがいるプロダクトを直すのとでは、緊張感がまるで違います。壊せば使っている人に届いてしまう。だからこそ、2 つ目の実証台として、 公開リポジトリで誰でも検証できる Agent Deck を選びました。「動いた」も「危なかった」も、全部 GitHub 上に残る形で。

⚙️仕組み — 実装役と検証役を分ける

このループの肝は、作る人と確かめる人を別にすることです。 自分の書いたコードを自分でレビューすると、どうしても甘くなる。人間でもそうですし、LLM ならなおさらです。 そこで、実装する Maker と検証する Checker を独立したエージェントに分けました。

🚦

ゲート(着手前)

人間が「やっていい」と印(loop:approved ラベル)を付けた Issue だけが対象。 同時に走る作業が増えすぎないよう未マージの PR 本数で頭打ちにし、 連続で失敗していたら止まります。backlog が空ならそもそも起動しません。

🧱

preflight(自己点検)

作業ディレクトリが git worktree で隔離されているか、ブランチ名がloop/issue-N か、安全フックが応答するか。前提が崩れていたら、コードに触れる前に中断します。

🛠️

Maker(実装)

worktree の中で Issue を 1 件だけ実装。コミットは変更したファイルをパス指定で束ねて行い、 ほかの作業が紛れ込むのを防ぎます。バージョンを上げたり、勝手にタグを打ったりはしません。

🔬

Checker(独立検証)

別エージェントが、Maker のテストをそのまま信用せずに検証。 判定の根拠は node --test の終了コード、変更ファイルの範囲、機密スキャンなど、機械が白黒つけられるものだけ。「良さそう」では通しません。

通れば Draft PR を起こし、1 サイクルを監査ログに 1 行残します (Issue・試行回数・preflight 結果・Checker のゲート・機密スキャン結果まで)。 あとから「いつ・何を・どう確かめて通したのか」を全部たどれるようにするためです。

🔁実際に回した 1 周(Issue #9)

今回直したのは、地味だけれど実害のあるバグでした。Agent Deck のスケジュール起動機能で、同じ分に発火する 2 つの予約(同じリポ・同じプリセット・ブランチ接頭辞なし)が、 まったく同じ名前のブランチを作ってしまう。結果、2 本目の git worktree addが失敗して、その予約は起動しない——という Issue #9 です。

🌿

Maker の直し方

ブランチ名は「分」までしか一意でなかったのが原因。そこで予約ごとの ID から決定論的な短いトークン(依存ゼロの FNV-1a ハッシュ)を足しました。乱数ではないので、 同じ予約は何度でも同じ名前——再現性を保ったまま衝突だけを消します。

Checker の確かめ方

Checker は自前のスニペットで独立に再現。別々の予約 A・B が本当に違うブランチになること、同じ予約なら同じになること(決定論)、既存の呼び出しは1 文字も変わらないこと(後方互換)を、すべて exit code で確認しました。

ユニットテストは node --test168 件すべて green。 PR を出すと CI が ubuntu / macOS / windows の 3 OS でテストとスモーク(実際にアプリを起動する検査)を回し、 CodeQL も含めて全チェック green。 そこで squash マージし、バージョンを上げてタグを打つと、Release ワークフローが 3 OS のインストーラを作って、v0.3.4 として公開されました。

🛡️安全装置と、正直な限界

ここが一番大事なところなので、はっきり書きます。これは「全自動」ではありません。

🙋

人間が握っているもの

どの Issue に着手していいかを決めるのは人間。リリースの引き金(タグ push)も人間の手です。 ループは PR を用意するところまで。最後にスイッチを入れるのは、いつも人。

🧯

止まる仕掛け

同じ Issue で3 回失敗したら自動で停止。 機密スキャンに引っかかれば即中断。さらに、惰性で回し続けないための見直し期日を設けています(コストの問題ではなく、統制のチェックポイントとして)。

誇張はしたくありません。起きたのは——人間がゲートを持った自走ループが、Issue を 1 件、監査できる形で消化し、リリースまで運んだ。それが全部です。 派手ではない。でも、「AI に任せて大丈夫か」を確かめるなら、派手さよりたどれることの方が、ずっと大事だと思っています。

🔄この実験を、道具に戻す

Agent Deck で効いたパターン——「実体ごとに決定論的な識別子を足す」「worktree のゲートを対象リポジトリで切り替えられるようにする」——は、 社内ハーネスの willink-claude-kit に汎用化して戻す前提で進めています。

1 つのプロダクトで証明する → 道具に落とす → 横に展開する。私たちが OSS でやりたいのは、まさにこの循環です。今回の自走サイクルも、その一歩。

📝v0.3.4 の内容

🐛Fixes

fix(schedule)
同じ分に発火する worktree 予約のブランチ名衝突を解消(予約 ID 由来の決定論的トークンを付与・#9)

修正は PR #11 で公開しています。Maker → Checker のやり取りも PR の説明に残してあるので、よければ覗いてみてください。

Agent Deck を試す

複数の AI CLI エージェントを並列で操るデスクトップアプリです。最新リリースをダウンロードして、ぜひ触ってみてください。

Agent Deck を見る(GitHub / ダウンロード)