<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Loop Engineering on KnightLi的博客</title>
        <link>https://knightli.com/zh-tw/tags/loop-engineering/</link>
        <description>Recent content in Loop Engineering on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-tw</language>
        <lastBuildDate>Tue, 16 Jun 2026 22:17:02 +0800</lastBuildDate><atom:link href="https://knightli.com/zh-tw/tags/loop-engineering/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>AI 寫程式總是不穩定？Loop Engineering 可能是下一步解法</title>
        <link>https://knightli.com/zh-tw/2026/06/16/loop-engineering-ai-coding-kubernetes-control-loop/</link>
        <pubDate>Tue, 16 Jun 2026 22:17:02 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/06/16/loop-engineering-ai-coding-kubernetes-control-loop/</guid>
        <description>&lt;p&gt;最近圍繞 OpenClaw 作者引發的「Loop Engineering」討論，表面上是在談 AI Coding 的新玩法，實際上更像是在重新發現 Kubernetes 社群十幾年前已經走過的一條路：用持續回饋的控制循環，讓系統不斷逼近期望狀態。&lt;/p&gt;
&lt;p&gt;如果把過去兩年 AI 編程工具的發展串起來，可以看到一條清楚的遷移路徑：從 Prompt Engineering，到 Context Engineering，再到 Loop Engineering。最初大家關心如何寫好 prompt，後來發現真正影響 Agent 表現的是上下文、工具、記憶和環境。再往後，問題又變成了：即使上下文足夠，Agent 仍然不穩定，怎麼辦？&lt;/p&gt;
&lt;p&gt;答案不是讓模型一次「想對」，而是讓它在觀察、行動、驗證、修正的循環裡逐步收斂。&lt;/p&gt;
&lt;p&gt;這正是 Kubernetes 的基本世界觀。&lt;/p&gt;
&lt;h2 id=&#34;從一次呼叫到持續循環&#34;&gt;從一次呼叫到持續循環
&lt;/h2&gt;&lt;p&gt;真實的軟體開發從來不是一次推理。它通常是這樣發生的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;讀程式碼。&lt;/li&gt;
&lt;li&gt;理解目標。&lt;/li&gt;
&lt;li&gt;修改實作。&lt;/li&gt;
&lt;li&gt;編譯或執行測試。&lt;/li&gt;
&lt;li&gt;發現偏差。&lt;/li&gt;
&lt;li&gt;繼續修正。&lt;/li&gt;
&lt;li&gt;Review。&lt;/li&gt;
&lt;li&gt;再修復。&lt;/li&gt;
&lt;li&gt;直到達到可接受狀態。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這不是「prompt -&amp;gt; answer」，而是「goal -&amp;gt; loop -&amp;gt; evaluation -&amp;gt; feedback」。Loop Engineering 的價值就在這裡：它不再把 AI Coding 理解成自動生成程式碼，而是理解成自動逼近目標。&lt;/p&gt;
&lt;p&gt;早期的一些實踐已經很接近這個方向。比如用一個循環不斷喚起 Claude Code，讓它從倉庫、計畫文件和 Git 狀態裡重新讀取現狀，再推進一個小任務。這裡有一個很關鍵的經驗：Agent 會忘，倉庫不會忘。對話歷史是不可靠的，落盤狀態才是下一輪循環可以依賴的事實。&lt;/p&gt;
&lt;h2 id=&#34;kubernetes-已經證明過這套模式&#34;&gt;Kubernetes 已經證明過這套模式
&lt;/h2&gt;&lt;p&gt;很多人把 Kubernetes 理解成容器編排平台，但它更深層的貢獻，是把控制論帶進了軟體工程。&lt;/p&gt;
&lt;p&gt;Kubernetes controller 做的事情可以概括成四步：&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;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Desired State
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Observe
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Compare
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Act
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Repeat
&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;也就是 Reconciliation Loop。Controller 反覆檢查實際狀態是否等於期望狀態。如果不一致，就繼續調節。&lt;/p&gt;
&lt;p&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;/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-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;replicas&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;w&#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;你並不告訴 Kubernetes「啟動第一個 Pod、再啟動第二個 Pod、再啟動第三個 Pod」。你只是聲明期望狀態。至於當前有幾個副本、哪些 Pod 死了、是否需要補齊，都是 controller 自己在循環中處理。&lt;/p&gt;
&lt;p&gt;AI Coding 正在形成類似結構。你不再一步步命令 Agent 打開某個文件、修改某個函式、加入某個測試，而是聲明一個目標：修復這個並發問題，並確保測試通過。Agent 負責觀察倉庫、修改程式碼、執行驗證、讀取回饋，再繼續下一輪。&lt;/p&gt;
&lt;p&gt;Prompt 正在變成 Spec。&lt;/p&gt;
&lt;h2 id=&#34;loop-engineering-的元件&#34;&gt;Loop Engineering 的元件
&lt;/h2&gt;&lt;p&gt;一個可用的 Loop Engineering 系統，通常會包含幾類東西：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自動觸發：定時器、cron、webhook、GitHub Actions，讓循環不依賴人工按鈕。&lt;/li&gt;
&lt;li&gt;隔離工作區：透過 Git worktree 等方式，讓多個 Agent 並行工作而不互相踩踏。&lt;/li&gt;
&lt;li&gt;專案知識：用 &lt;code&gt;SKILL.md&lt;/code&gt;、&lt;code&gt;AGENTS.md&lt;/code&gt;、規範文件和任務文件，把經驗固化成可重複讀取的上下文。&lt;/li&gt;
&lt;li&gt;工具連接：透過 MCP、外掛、CI/CD、Issue 系統和資料庫，讓 Agent 能觀察真實環境。&lt;/li&gt;
&lt;li&gt;子 Agent：把 maker、checker、reviewer 拆開，避免模型自己給自己打分。&lt;/li&gt;
&lt;li&gt;外部狀態：用 Markdown、Issue、Git 提交或任務板記錄進度，讓循環可以被殺死、重啟和接續。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這些元件合在一起，很像 AI 時代的控制平面。模型只是執行器，真正決定系統能力的是循環如何組織、狀態如何保存、回饋如何進入下一輪。&lt;/p&gt;
&lt;h2 id=&#34;相似之外差異更重要&#34;&gt;相似之外，差異更重要
&lt;/h2&gt;&lt;p&gt;Loop Engineering 和 Kubernetes controller 結構相似，但二者並不等價。最關鍵的差異在於：Kubernetes 控制的是相對確定的系統，而 LLM 循環控制的是機率系統。&lt;/p&gt;
&lt;p&gt;Kubernetes 建立一個 Pod，動作結果通常是可預測、可觀測、可重試的。LLM 接到同一句「修復支付系統並發問題」，今天可能這樣改，明天可能那樣改；Claude 和 GPT 也可能給出完全不同的方案。&lt;/p&gt;
&lt;p&gt;這帶來幾個難題：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;執行器不確定：同一輸入不保證同一輸出。&lt;/li&gt;
&lt;li&gt;收斂不可證明：循環可能反覆修改、原地打轉，甚至把已經修好的東西改壞。&lt;/li&gt;
&lt;li&gt;完成判斷不可靠：模型說「任務完成」，不代表真的完成。&lt;/li&gt;
&lt;li&gt;目標常常模糊：「優化支付系統」到底是優化效能、穩定性、安全性，還是可維護性？&lt;/li&gt;
&lt;li&gt;驗證成本很高：測試通過不等於沒有效能退化、安全漏洞或架構債務。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以 AI Coding 比 Kubernetes Operator 更難。它不只需要 reconcile，還需要更強的 goal definition 和 evaluation system。&lt;/p&gt;
&lt;h2 id=&#34;maker-checker-像-admission-controller&#34;&gt;Maker-Checker 像 Admission Controller
&lt;/h2&gt;&lt;p&gt;為什麼現在越來越多 Agent 系統要拆成 maker 和 checker？原因很簡單：不能完全相信執行器。&lt;/p&gt;
&lt;p&gt;寫程式碼的 Agent 可能會自我確認。它會說「已經修復」，但測試沒跑全；它會說「方案更簡潔」，但實際引入了新風險。於是需要另一個獨立角色來審查它：執行測試、檢查 diff、做安全掃描、讀日誌、判斷是否真的滿足目標。&lt;/p&gt;
&lt;p&gt;這和 Kubernetes 裡的 Admission Controller、Validating Webhook 有相似的工程直覺：不要讓執行動作直接進入系統，要先經過策略、驗證和約束。&lt;/p&gt;
&lt;p&gt;未來的 Agent 系統大概率會越來越多層：&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;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Maker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Checker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Reviewer
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Policy Engine
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Human
&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;這不是把流程複雜化，而是在機率執行器外面補控制系統。&lt;/p&gt;
&lt;h2 id=&#34;真正的上限在-goal-與-evaluation&#34;&gt;真正的上限在 Goal 與 Evaluation
&lt;/h2&gt;&lt;p&gt;Loop Engineering 的核心不只是設計循環。更深一層看，它真正要解決的是 Goal 和 Evaluation。&lt;/p&gt;
&lt;p&gt;Kubernetes 之所以能穩定工作，是因為 Desired State 被形式化了。&lt;code&gt;replicas: 3&lt;/code&gt; 的完成條件非常清楚：實際副本數等於 3。這裡沒有審美判斷，也沒有「差不多完成」。&lt;/p&gt;
&lt;p&gt;AI Coding 最大的問題恰好在這裡。很多目標是模糊的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「幫我優化這個系統。」&lt;/li&gt;
&lt;li&gt;「重構使用者模組。」&lt;/li&gt;
&lt;li&gt;「修復線上穩定性問題。」&lt;/li&gt;
&lt;li&gt;「讓這段程式碼更好維護。」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這些目標如果不被拆成可觀察、可驗證、可停止的條件，循環就很難收斂。Agent 不知道什麼時候該繼續，也不知道什麼時候該停。&lt;/p&gt;
&lt;p&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;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&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-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;goal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;修復支付系統的並發問題&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metrics&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;correctness&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unit_test_pass_rate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;100%&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;integration_test_pass_rate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;100%&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;performance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;latency_p99&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;lt; 100ms&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;throughput&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;gt;= 1000 tps&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;safety&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;critical_vulnerability&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;data_race&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#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;&lt;span class=&#34;nt&#34;&gt;evaluation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;layers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;unit_test&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;integration_test&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;e2e_test&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;benchmark&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;static_analysis&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;security_scan&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;judge&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;independent-checker&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;threshold&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;all_layers_pass&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#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;&lt;span class=&#34;nt&#34;&gt;loop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;max_iterations&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;w&#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;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;strategy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;exponential_backoff&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#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;到了這一步，大家寫的就不再是 prompt，而更像 Agent CRD。真正重要的欄位也不是選 Claude 還是 GPT，而是 &lt;code&gt;goal.metrics&lt;/code&gt; 和 &lt;code&gt;evaluation.layers&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;軟體工程師會更像控制系統工程師&#34;&gt;軟體工程師會更像控制系統工程師
&lt;/h2&gt;&lt;p&gt;這場變化不一定意味著 AI 會直接替代工程師。更可能發生的是，工程師的工作重心發生遷移。&lt;/p&gt;
&lt;p&gt;過去，工程師主要寫程式碼。未來，工程師會更多設計目標、驗證、狀態和回饋：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把模糊業務意圖翻譯成可收斂的目標。&lt;/li&gt;
&lt;li&gt;設計多層 Evaluation Pipeline。&lt;/li&gt;
&lt;li&gt;把 Agent 的記憶從對話裡移到倉庫、任務板和持久化狀態裡。&lt;/li&gt;
&lt;li&gt;設計 maker、checker、reviewer 的邊界。&lt;/li&gt;
&lt;li&gt;定義終止條件和失敗重試策略。&lt;/li&gt;
&lt;li&gt;判斷什麼必須交給人類最終確認。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Prompt Engineer 可能會逐漸退場，不是因為 prompt 沒用，而是因為寫 prompt 這件事本身會被系統化。更稀缺的能力會變成 Goal Engineering 和 Evaluation Engineering。&lt;/p&gt;
&lt;h2 id=&#34;結語&#34;&gt;結語
&lt;/h2&gt;&lt;p&gt;Loop Engineering 並不是憑空出現的新概念。它更像控制論、狀態機、回饋系統、Kubernetes controller 和 Operator Pattern 在 AI Coding 時代的一次復活。&lt;/p&gt;
&lt;p&gt;理解這場變化，可以分成四層：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;結構相似：Loop 類似 Operator。&lt;/li&gt;
&lt;li&gt;實現相似：Agent 類似 Controller。&lt;/li&gt;
&lt;li&gt;本質相似：Goal 類似 Spec，Evaluation 類似 Status。&lt;/li&gt;
&lt;li&gt;最重要的一層：AI Coding 不是自動化寫程式碼，而是自動化逼近目標。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一切自動化逼近目標的系統，最終都會回到控制論：目標是否清楚，狀態是否可觀察，回饋是否準確。&lt;/p&gt;
&lt;p&gt;所以，未來十年 AI Native 軟體工程最值得研究的問題，可能不是「哪個模型更強」，而是：當軟體開始自己修改自己時，我們該如何設計那個約束它、驗證它、糾正它，並最終決定是否信任它的控制循環？&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
