<?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/tags/loop-engineering/</link>
        <description>Recent content in Loop Engineering on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Tue, 16 Jun 2026 22:17:02 +0800</lastBuildDate><atom:link href="https://knightli.com/tags/loop-engineering/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>AI 写代码总是不稳定？Loop Engineering 可能是下一步解法</title>
        <link>https://knightli.com/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/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>
