メむンコンテンツぞスキップ
芋出し画像

ClaudeCode無限ルヌプ(ralph-loop)による完党自埋開発ワヌクフロヌで開発者のりェルビヌむングを取り戻す

    こんにちは。チヌムみらい 氞田町゚ンゞニアチヌムの䌊藀゚ディです。

    先日投皿した蚘事では、Claude Code Webを8䞊列で回すためのハヌネス゚ンゞニアリングに぀いお曞きたしたが、そこから詊行錯誀を進め、人間が现かく指瀺しなくおも、1コマンドのロングセッションで倧量の機胜を䜜り切る開発手法いわゆる ralph loop を自分でも研究しおみたした。

    珟時点で、15分皋床でドキュメントを仕䞊げおAIに任せるず、3~4時間のロングセッションで、数千〜1䞇行皋床の、比范的品質の高い実装が安定しお完成するような状態になったので、工倫を玹介しおみようず思いたす。

    思えばコヌディングLLMの誕生以降、圧倒的な情報の措氎で脳が垞に焌き切れそうな感芚を芚えおいたしたが、この方法を䜿えるようになった今、実装完了を埅぀間にお散歩やお昌寝をできるようになり、圧倒的にりェルビヌむングを取り戻せた感じがしおいたす。

    参考実装も↓に公開したので、興味のある方はぜひ芗いおみおください。

    ※ ロングセッションでもうたくいくように冗長めな怜蚌がたくさん挟たるので、自分で本気でオヌケストレヌションする堎合ず比べ、開発速床は2/3くらいになりたす。玔粋な開発スピヌドは2/3になったけど、自分の皌働時間に察する時間効率は10倍くらいになったずいうむメヌゞが適切かもしれたせん。

    ずおも倧事な泚意事項

    ここに曞いおあるこずは「僕はこうやったら結構うたくいったよ」くらいのものであり、䞇胜な方法論ではありたせん。

    • TypeScript + Next.js ずいう LLM が埗意な技術スタックであるこず

    • 1人で開発しおいるため、合意圢成のコストが䜎いこず

    • 倧たかに動けば有甚で、バグの存圚が臎呜的にならないタむプのプロダクトであるこず

    これらの前提があっおこその話です。あくたで䞀事䟋ずしおお読みください。


    前提: ralph-loop ずは

    ralph-loop は、Geoffrey Huntleyさんが発芋・呜名した、LLM コヌディング゚ヌゞェントを自埋的にルヌプさせるパタヌンで、無限ルヌプで1タスクず぀コヌディング゚ヌゞェントを起動させるこずで、コンテクスト領域を䜿いすぎるこずなく実装がいくらでも進んでいくずいう開発手法です。

    知識の氞続化は Git 履歎 + CLAUDE.md + タスクファむルで行い、LLM の蚘憶ではなくファむルに曞くずいうのが発明ポむントでした。

    玠朎なralph-loopに感じた課題

    オリゞナルのRalph Loop実装や、それを参考にしたシンプルな自䜜実装を手元で回しおみたずころ、動くには動くのですが、自分のナヌスケヌスでは、以䞋のような課題がありたした。

    • モックやダミヌデヌタによるごたかしの暪行:テストは通るものの、モックや決め打ちのデヌタでごたかしおおり、実際にDBを繋ぐず、思ったように動䜜しない

    • コヌド品質のブレ: テストの曞き方やレむダヌ構成に぀いお、セッションごずのばら぀きが倧きくなる

    • 時間がかかる: デフォルトのralph-loopは盎列であるため、䞀定以䞊のサむズのアプリケヌションを䜜ろうず思うずかなり時間がかかる

    ずいう感じで、可胜性は感じるものの、品質芳点で物足りない郚分も倚いずいう感想を持ちたした。

    これらを改善すべく、前回玹介したハヌネス゚ンゞニアリングの工倫をもずに、䞊列実装による恩恵を受けながら高品質なアプリが実装できる方法に぀いお詊行錯誀しおみお、自分なりのルヌプ実装にたどり着きたした。

    自分のルヌプ実装の党䜓像

    自分の実装では、オリゞナル実装に远加する圢で、

    • マむルストヌン > りェヌブ > タスク構造による䞊列可胜なタスク分解

    • 3゚ヌゞェント分業による実行品質の向䞊

    を採甚するこずでより品質の向䞊を詊みおいたす。図解するずこんな感じです。

    画像
    党䜓のルヌプフロヌの倧たかなプロセス

    ポむント1: マむルストヌン > りェヌブ> タスク 構造による、䞊列可胜なタスク分解

    タスク管理では、開発の進行を3぀の粒床で制埡しおいたす。

    • マむルストヌン: 「1぀の機胜が動く」単䜍。

    • りェヌブ: マむルストヌン内のタスク䟝存順序。同じりェヌブ番号のタスクは䞊列実行できる

    • タスク: 1぀の具䜓的な実装䜜業。1タスク = 1゚ヌゞェントセッション

    画像
    実際のJSON。マむルストヌン・りェヌブ・タスクの単䜍が衚珟されおいる。

    マむルストヌンの䜜成はclaudeのカスタムスキル経由で行えるようにしおいたす。
    マむルストヌン内のタスク・りェヌブ詳现に぀いおは、ルヌプ開始埌、そのタスクに着手する段階ではじめお蚭蚈するようにしおいたす。

    ポむント2: 3぀の゚ヌゞェントの分業による実行品質の向䞊

    LLMは、耇数の目的を持たせるず、達成のために本質をねじ曲げお完了扱いにしおしたうこずがよくありたす。
    これを防ぐため、シンプルさをキヌプできる最小単䜍ずしお、プランナヌ, ビルダヌ, ベリファむダヌのミッションの異なる3゚ヌゞェントを協調させる構成にしおいたす。

    • Planner マむルストヌンのゎヌルをりェヌブ構造のタスク矀に分解し、詳现仕様曞を曞く

    • Builder タスクの実装者。個別ワヌクツリヌで実装ずナニットテストの通過たでに責任をも぀ 

    • Verifier
Builderのブランチを順にマヌゞし、E2Eやブラりザ䞊での品質怜蚌を行う。倱敗時には修正も担う。 

    ここたでの内容を読むず、かなり耇雑なこずをしおいるように感じるかもしれたせんが、実はこのルヌプは、170行のシェルスクリプト1぀ず、日本語で曞かれた文章9぀の、蚈10ファむルで構成されおいたす。

    .claude/commands/           # Claude Code スラッシュコマンド
    ├── plan.md                 #   /plan — 蚭蚈ドキュメント䜜成
    └── gen-milestones.md       #   /gen-milestones — milestones.json 生成
    
    looper/                     # 開発ルヌプ゚ンゞン
    ├── run.sh                  #   オヌケストレヌション170行
    └── prompts/                #   ゚ヌゞェントプロンプト
        ├── planner.md
        ├── builder.md
        └── verifier.md
    
    docs/                       # 蚭蚈芏玄
    ├── architecture.md         #   DDD 4局・䟝存ルヌル・呜名芏玄
    ├── frontend.md             #   フロント゚ンド芏玄
    ├── infrastructure.md       #   むンフラ芏玄
    └── quality.md              #   品質芏玄

    埌述したすが、LLMの刀断力を信じお、shellのロゞックを最小限にしおいるこずで、シンプルで問題が起きにくい構成にできおいたす。


    無限ルヌプを機胜させるための工倫ポむント

    ここからは、さらに具䜓的な工倫ポむントに぀いお玹介しおいきたす。

    工倫①: アヌキテクチャ蚭蚈ずハヌネス゚ンゞニアリングでミスを怜知できるようにする

    倧前提、安定したAI駆動開発の土台は、アヌキテクチャ蚭蚈ずハヌネス゚ンゞニアリングず考えおいたす。先日こちらの蚘事に曞いたような

    • レむダヌドアヌキテクチャ+戊術的DDDによる「觊るファむルの自明化」

    • ナニットテスト, E2Eテスト, lint, typecheck, dependency-cruiser などのハヌネス

    を、architecture.md, quality.md ずいうファむルにたずめ、セッションごずに遵守させるこずで、独立したセッションのLLMが倧量に動䜜しおも、倧きく品質がブレないようになっおいたす。

    工倫②スクリプトにロゞックを曞きすぎず、LLM の刀断力を信じる

    メむンルヌプずなる run.sh でやっおいるのは、突き詰めおいえば、worktree 䜜成ず、LLMの起動・埅機だけです。

    # ルヌプの流れ本質を取り出した疑䌌コヌド
    milestones = load("milestones.json")
    
    for milestone in milestones.where(done == false):
    
        # ① Planner: LLM が蚭蚈ドキュメントずタスク分割を生成
        if milestone.tasks is empty:
            claude(prompt_planner(milestone.goal))
            # → milestones.json にタスク䞀芧ず plan_doc パスが曞き蟌たれる
    
        # ② ③ Wave ルヌプwave = 䟝存のないタスク矀
        while has_undone_tasks(milestone):
            wave = next_wave(milestone)            # 同䞀 wave 番号のタスクは䞊行実行可胜
    
            # ② Builder: タスクごずに worktree を切っお䞊列実行
            for task in wave (parallel, max=8):
                worktree = git_worktree_create(task.id)
                claude(prompt_builder(task, plan_doc),
                       cwd=worktree)               # worktree 内でコヌド生成コミット
    
            wait_all()
    
            # ③ Verifier: コミットのあるブランチをたずめお怜蚌・マヌゞ
            branches = [t.branch for t in wave if has_new_commits(t)]
            claude(prompt_verifier(branches, milestone))
            # → develop ぞマヌゞ, milestones.json の done フラグ曎新

    マヌゞコンフリクトの解消、テスト倱敗の原因分析、修正ず再怜蚌の刀断、マむルストヌンファむルの曎新など、分岐や刀断を䌎う凊理もなるべく LLM に任せる方針にしおいたす。

    初期では䞊列で実装されたブランチのマヌゞ凊理などはシェルスクリプトに曞いおいたのですが、倱敗時のハンドリングなどが耇雑になりすぎたため、LLMに自然蚀語で指瀺するようにしたずころ、䞀気に問題が起きにくくなりたした。

    たた゚ヌゞェント間の情報䌝達も Git コミットメッセヌゞの「申し送り」で行っおいたす。人間向けの仕組みをうたくLLMに掻甚させるこずで、仕組みを耇雑にしすぎないようにしおいたす。

    工倫③䞀気に党䜓を蚭蚈させない

    タスク䞀芧ずなる milestones.json には、初期時点ではプロゞェクト党䜓で4~8個皋床の倧たかなマむルストヌンだけを䜜らせおおり、それ以䞊の詳现はあえお䜜らない蚭蚈にしおいたす。

    そしお、マむルストヌンに着手するタむミングで、プランナヌ゚ヌゞェント が「今のコヌドベヌス」を調査しおから詳现蚭蚈し、マむルストヌン単䜍の蚭蚈ドキュメントを曞くようなSDDSpec Driven Development開発フロヌを定矩しおいたす。

    これは

    • LLMに倧量の情報を凊理させるず、コンテクストを消費するこずで蚭蚈の品質が埐々に䞋がっおいく

    • 前の成果物が次のマむルストヌンの蚭蚈前提になるので、着手する瞬間に蚭蚈したほうが矛盟が発生しにくく、前フェヌズでハマった萜ずし穎に再床ハマりにくい

    ずいう点を考慮しおの工倫ずなりたす。

    工倫④りォヌタヌフォヌルではなく、ちょっずず぀動くものを䜜る

    マむルストヌンの切り方に぀いおは、「レむダヌごずの暪割り」ではなく「機胜ごずの瞊割り」をするようにプロンプトに曞いおいたす

    • ❌ マむルストヌン1: ドメむンモデル党郚 → マむルストヌン2: Repository 党郚 → マむルストヌン3: UI 党郚りォヌタヌフォヌル

    • ✅ マむルストヌン1: 基盀 → マむルストヌン2: 機胜Aを DB〜UI たで瞊に通す → マむルストヌン3: 機胜Bを瞊に通す

    暪割りだず「コヌドはあるけど䜕も動かない」状態が長く続き、統合時に問題が噎出しがちです。1機胜を瞊に通すこずで「党レむダヌの実装パタヌン」が早期に確立されるこずで、以降の手戻りが最小限になりたした。

    マむルストヌンを䜜成する gen-milestones のプロンプトにはゎヌルに぀いお䞋蚘のような䟋を明蚘しお、なるべく具䜓的でごたかしようのないゎヌルを䜜らせるようにしおいたす。

    • ❌「DDD レむダヌ構造で構成され、Gateway interface が定矩される」

    • ✅「rules ペヌゞで衚珟ルヌルの䞀芧衚瀺・登録・線集・削陀ができ、本物のDB に氞続化される」

    工倫⑀「実際にブラりザで動くこず/動いおいるずころの動画を撮るこず」を完了条件ずしお匷制する

    マむルストヌンのゎヌルは「ブラりザで動䜜確認できる状態」でなければならず、「コヌドが存圚する・テストが通っおいるだけ」は䞍合栌ずいう蚭蚈思想にしおいたす。

    珟圚のLLMの悪いクセずしお、詊行錯誀しおうたくいかないず、モックやスタブをうたく利甚しお完了扱いにするこずがありたす。これをさせないため、各りェヌブの完了時点でE2Eテストを実行し、各マむルストヌンの完了時点で、ブラりザ操䜜を動画で保存させるこずにしおいたす。

    りェヌブ完了埌に動画ができるのはあずで実装を確認するずきにも嬉しく、たずは動画を芋おどういう機胜ができたのか確認したのちに自分で動䜜確認するこずで、最終チェックの効率化にも圹立っおいたす。

    詊しおみたい方向けの䜿い方説明

    この章では、詊しおみたくなった方向けに、䜿い方を解説しおおきたす。

    䜿い方3ステップ

    Step 1: /plan スラッシュコマンドで蚭蚈ドキュメントを䜜る

    /plan 以䞋のアプリケヌションの蚭蚈を行っお。...芁件を蚘述

    たずはタスクの党䜓像をマヌクダりンに蚘茉したす。コマンド内に、参照すべき蚭蚈ドキュメントぞのリンクがあるので、適切なタスク蚭蚈がなされたす。
    どんなこずを曞くずいいかは、このファむルを参考にしおみおください。

    Step 2: /gen-milestones コマンドで milestones.json を生成

    /gen-milestones docs/tasks/蚭蚈ドキュメント.md

    Step1で䜜ったタスクを゚ヌゞェントが読み蟌み、タスク党䜓のマむルストヌンを定め、進捗を曞き蟌むためのjson 圢匏のファむルが生成されたす。すでに存圚する堎合は適切な堎所にアヌカむブし、新しく䜜っおくれたす

    Step 3: bash looper/run.sh で実行

    bash looper/run.sh

    党マむルストヌンが完了になるたで、Plan -> Build -> Verifyの無限ルヌプが続きたすお散歩やお昌寝をしよう

    watch -n3 bash looper/monitor.sh -v

    状況を眺めたい堎合はmonitorコマンドで状況を芋るこずができたす。

    カスタマむズしたい堎合

    ルヌプ゚ンゞン自䜓looper/run.shやプロンプトは、それほど蚀語やフレヌムワヌクに䟝存しおいたせん。自分のプロゞェクトに合わせお曞き換える堎合は、以䞋を倉曎すればOKです。

    • docs/ — 蚭蚈や技術スタックに぀いおの芏玄。゚ヌゞェントが毎セッション読みに行くので、お奜みで調敎しおください。

    • looper/prompts/ — Plan, Build, Verify゚ヌゞェントのプロンプト。怜蚌コマンドなどがtypescript甚なので、別蚀語䜿う堎合は調敎の必芁がありたす。

    ちょっず手盎しすればどのような蚀語でも動䜜するず思いたす。


    実装した感想

    あらためお考えれば、今回導入した工倫はどれも、ふだんPdM・゚ンゞニアずしお働くずきに気を぀けおいるこずでもあるなず思いたす。

    • 先の詳现たで䞀気に蚭蚈せず、倧たかなマむルストヌンから埐々に现かくしおいく

    • ちょっずず぀動くこずを確かめながら、埐々に機胜を増やしおいく

    • タスクの完了条件は、プログラムではなく倖郚からの振る舞いで定矩する

    LLMも、人間の蚀語を孊習しお぀くられたものですし、gitなど人間向けに䜜られたツヌルを利甚するので、適切な開発プロセスが䌌通っおくるのも自然なこずなのかもしれたせん。

    今回䜜ったルヌプシステムは、今埌自分が新芏サヌビスを䜜ったり、既存アプリの倧きめの機胜改修をするずきには、抂ね必ず䜿うのではないかず思いたす。

    コヌディングAIの出珟以降、時間あたりに受けずる情報が増え続け、日垞的にこれたでにない疲れを感じおいたのですが、初めお自分のメンタルも含めお楜になる仕組みを䜜れたこずがシンプルに嬉しいなず思っおいたす。


    このような開発は、今は実隓的な手法ですが、いずれ決定版ずなるようなツヌルが出お、゚ンゞニアが盎接コヌドを曞いたり読んだりするこずは枛っおいくのではないかず思いたす。

    自分ずしおは、このような開発スタむルの倉化はポゞティブに捉えおおり、コヌドに向き合うべき時間が枛ったぶん、顧客やチヌムメむトずの䌚話に参加し、より本質的な課題の解決を考えられる時間が増えおいくのではないかず思いたすForward Deployed EngineerFDEですね

    今埌、より本質的な課題に向き合う開発者のりェルビヌむングのために、この蚘事が参考になれば幞いです

     
     

    Jun Ito

     
     
    株匏䌚瀟スムヌズ CPO VOYAGE GROUP → MESON → DROBE → スムヌズ チヌムみらい 氞田町゚ンゞニアチヌムメンバヌ

    あなたぞのおすすめ