<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>PRD on KnightLi的博客</title>
        <link>https://www.knightli.com/zh-tw/tags/prd/</link>
        <description>Recent content in PRD on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-tw</language>
        <lastBuildDate>Mon, 27 Apr 2026 08:08:55 +0800</lastBuildDate><atom:link href="https://www.knightli.com/zh-tw/tags/prd/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Ralph 是什麼：把 Claude Code 和 Amp 變成可循環執行的自主開發流程</title>
        <link>https://www.knightli.com/zh-tw/2026/04/27/ralph-autonomous-agent-loop-claude-code-amp/</link>
        <pubDate>Mon, 27 Apr 2026 08:08:55 +0800</pubDate>
        
        <guid>https://www.knightli.com/zh-tw/2026/04/27/ralph-autonomous-agent-loop-claude-code-amp/</guid>
        <description>&lt;p&gt;如果你最近在關注 coding agent 的長流程執行，&lt;code&gt;snarktank/ralph&lt;/code&gt; 是個很值得看一眼的小專案。它不是再做一個新的模型外殼，也不是再包一層聊天介面，而是把 &lt;code&gt;Claude Code&lt;/code&gt; 或 &lt;code&gt;Amp&lt;/code&gt; 組織成一個可以反覆運行的 autonomous loop，讓 AI 按 &lt;code&gt;PRD&lt;/code&gt; 裡的 story 一項一項往前做，直到全部完成。&lt;/p&gt;
&lt;p&gt;它的核心思路其實很直接：&lt;strong&gt;不要讓同一個 agent 在一個越來越長、越來越髒的上下文裡硬撐，而是每輪都重新啟動一個全新的 AI coding session。&lt;/strong&gt; 這樣做的好處是，上下文不會一路膨脹，任務邊界也更清楚。&lt;/p&gt;
&lt;h2 id=&#34;01-ralph-是什麼&#34;&gt;01 Ralph 是什麼
&lt;/h2&gt;&lt;p&gt;Ralph 的官方定位很明確：它是一個 autonomous AI agent loop，會反覆呼叫 AI coding tool，直到 &lt;code&gt;PRD&lt;/code&gt; 裡的項目都做完。&lt;/p&gt;
&lt;p&gt;目前倉庫支援兩種工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Amp CLI&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Claude Code&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每一輪迭代都會啟動一個 fresh instance。也就是說，它不依賴「同一個會話一直聊下去」，而是依賴這些外部狀態來保存記憶：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;git 歷史&lt;/li&gt;
&lt;li&gt;&lt;code&gt;progress.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prd.json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這點非常關鍵。很多人讓 agent 跑長任務時，最大的痛點不是模型不會寫，而是會話越跑越重，最後開始漏掉上下文、忘記要求、反覆返工。Ralph 的設計，基本就是衝著這個問題去的。&lt;/p&gt;
&lt;h2 id=&#34;02-它怎麼工作&#34;&gt;02 它怎麼工作
&lt;/h2&gt;&lt;p&gt;Ralph 的工作流分成三步：&lt;/p&gt;
&lt;h3 id=&#34;1-先寫-prd&#34;&gt;1. 先寫 PRD
&lt;/h3&gt;&lt;p&gt;README 建議先用配套的 &lt;code&gt;prd&lt;/code&gt; skill 生成需求文件，把功能拆成比較細的 story。&lt;/p&gt;
&lt;h3 id=&#34;2-再把-prd-轉成-prdjson&#34;&gt;2. 再把 PRD 轉成 &lt;code&gt;prd.json&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;然後用 &lt;code&gt;ralph&lt;/code&gt; skill，把 Markdown 版 PRD 轉成結構化的 &lt;code&gt;prd.json&lt;/code&gt;。這個檔案裡會保存 user stories，以及每一項是不是已經通過。&lt;/p&gt;
&lt;h3 id=&#34;3-執行循環腳本&#34;&gt;3. 執行循環腳本
&lt;/h3&gt;&lt;p&gt;真正執行的是 &lt;code&gt;ralph.sh&lt;/code&gt;。命令大致是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./scripts/ralph/ralph.sh &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;max_iterations&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./scripts/ralph/ralph.sh --tool claude &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;max_iterations&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;預設是 10 輪。每一輪大致會做這些事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;從 &lt;code&gt;branchName&lt;/code&gt; 建立分支&lt;/li&gt;
&lt;li&gt;選擇優先級最高、&lt;code&gt;passes: false&lt;/code&gt; 的 story&lt;/li&gt;
&lt;li&gt;只實作這一項&lt;/li&gt;
&lt;li&gt;跑品質檢查，比如 typecheck 和 tests&lt;/li&gt;
&lt;li&gt;檢查通過後提交程式碼&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;prd.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;把經驗追加到 &lt;code&gt;progress.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;繼續下一輪&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;也就是說，Ralph 並不追求「一口氣把整件事做完」，而是把任務壓縮成很多個能在單個上下文視窗裡完成的小閉環。&lt;/p&gt;
&lt;h2 id=&#34;03-ralph-最有意思的地方&#34;&gt;03 Ralph 最有意思的地方
&lt;/h2&gt;&lt;h3 id=&#34;1-每輪都是-fresh-context&#34;&gt;1. 每輪都是 fresh context
&lt;/h3&gt;&lt;p&gt;這是 Ralph 最核心的設計點。README 強調，每次迭代都是一個新的 AI instance，跨輪記憶只靠 git、&lt;code&gt;progress.txt&lt;/code&gt; 和 &lt;code&gt;prd.json&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;這和很多人平常直接在一個長對話裡讓 Claude Code 或其他工具連續工作很不一樣。後者在任務變大後，很容易被歷史訊息拖慢，還會逐漸失去焦點。Ralph 則是主動接受「單輪記不住全部」，然後把記憶放到外部檔案裡。&lt;/p&gt;
&lt;h3 id=&#34;2-強制把任務拆小&#34;&gt;2. 強制把任務拆小
&lt;/h3&gt;&lt;p&gt;倉庫文件特別強調，單個 PRD item 必須小到能在一個 context window 裡完成。像「加一個篩選器」「改一個 server action」「補一欄資料庫欄位」這種粒度比較合適；而「重構整個 API」「做完整 dashboard」這種就太大了。&lt;/p&gt;
&lt;p&gt;這個約束其實很現實。很多 autonomous agent 跑崩，不是 loop 本身有問題，而是任務切分太粗，讓模型一輪裡就背了過量目標。&lt;/p&gt;
&lt;h3 id=&#34;3-不只是程式碼連經驗也要沉澱&#34;&gt;3. 不只是程式碼，連經驗也要沉澱
&lt;/h3&gt;&lt;p&gt;除了 &lt;code&gt;progress.txt&lt;/code&gt;，README 還特別強調要更新 &lt;code&gt;AGENTS.md&lt;/code&gt;。原因也很實際：未來迭代和未來開發者都會讀這些說明，所以每輪發現的模式、坑點、約定，最好都落到專案文件裡。&lt;/p&gt;
&lt;p&gt;換句話說，Ralph 不只是讓 agent 連續寫程式，也想讓它連續累積對程式碼庫的工作記憶。&lt;/p&gt;
&lt;h2 id=&#34;04-它適合什麼場景&#34;&gt;04 它適合什麼場景
&lt;/h2&gt;&lt;p&gt;如果你的任務具備這些特徵，Ralph 會比較對路：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;已經能拆成一組明確的 user stories&lt;/li&gt;
&lt;li&gt;程式碼庫裡有比較可靠的回饋回路，比如測試、typecheck、CI&lt;/li&gt;
&lt;li&gt;你希望 agent 持續推進，但不想把所有事壓在單個長對話裡&lt;/li&gt;
&lt;li&gt;你接受它按迭代方式一點點完成，而不是一次性全做完&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;反過來說，如果你的需求還很模糊，或者任務本身高度依賴來回討論、頻繁改方向，那 Ralph 可能還不是第一選擇。它更適合「需求已經整理好，現在需要穩定推進執行」的階段。&lt;/p&gt;
&lt;h2 id=&#34;05-它和一般-claude-code-用法有什麼不同&#34;&gt;05 它和一般 Claude Code 用法有什麼不同
&lt;/h2&gt;&lt;p&gt;如果平常直接用 &lt;code&gt;Claude Code&lt;/code&gt;，常見模式是你開一個會話，讓它持續讀程式碼、改程式碼、跑命令。這個方式在中小任務上很好用，但在大任務上容易碰到兩個問題：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上下文越來越長&lt;/li&gt;
&lt;li&gt;中間決策不容易結構化沉澱&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ralph 的做法更像把 &lt;code&gt;Claude Code&lt;/code&gt; 或 &lt;code&gt;Amp&lt;/code&gt; 變成一個「批次執行器」：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;任務來源不是臨時聊天，而是 &lt;code&gt;prd.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;每輪只認一個 story&lt;/li&gt;
&lt;li&gt;完成狀態寫回檔案&lt;/li&gt;
&lt;li&gt;經驗寫進 &lt;code&gt;progress.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;程式碼提交進 git&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以它更像是「給 coding agent 加了一層迭代控制器」，而不是換了一個新的 AI assistant。&lt;/p&gt;
&lt;h2 id=&#34;06-一個值得注意的前提&#34;&gt;06 一個值得注意的前提
&lt;/h2&gt;&lt;p&gt;Ralph 能不能跑順，關鍵不在 loop 本身，而在回饋回路夠不夠好。README 寫得很直接：如果沒有 typecheck、tests、CI 這些機制，錯誤會在後續迭代裡不斷累積。&lt;/p&gt;
&lt;p&gt;對前端任務來說，倉庫甚至明確建議把「用瀏覽器驗證」寫進 acceptance criteria。因為如果沒有實際驗證，agent 很容易把「看起來寫完了」和「真的可用」混在一起。&lt;/p&gt;
&lt;p&gt;這點很重要。Ralph 不是 magical automation，它更像是把你現有的工程紀律放大。如果你的專案本來就有清晰任務拆分和可靠檢查，它會更有價值；如果這些基礎還沒有，loop 只會把混亂重複很多次。&lt;/p&gt;
&lt;h2 id=&#34;07-一句話總結&#34;&gt;07 一句話總結
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Ralph&lt;/code&gt; 最值得看的地方，不是它寫了多少新基礎設施，而是它把一個樸素但很有用的思路落成了現成流程：&lt;strong&gt;讓 &lt;code&gt;Claude Code&lt;/code&gt; 或 &lt;code&gt;Amp&lt;/code&gt; 每輪只做一個足夠小的 story，用 fresh context 保持專注，再靠 &lt;code&gt;git&lt;/code&gt;、&lt;code&gt;prd.json&lt;/code&gt; 和 &lt;code&gt;progress.txt&lt;/code&gt; 維持跨輪連續性。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你已經開始把 coding agent 用到真實專案裡，並且正被「長任務怎麼穩定推進」這個問題困住，Ralph 這套方法很值得參考。&lt;/p&gt;
&lt;h2 id=&#34;參考連結&#34;&gt;參考連結
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;GitHub 倉庫：&lt;a class=&#34;link&#34; href=&#34;https://github.com/snarktank/ralph&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/snarktank/ralph&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;互動式流程圖：&lt;a class=&#34;link&#34; href=&#34;https://snarktank.github.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://snarktank.github.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
