1. 什么是 Loop Engineering?它不是新工具,而是一套可复用的工程化思维
“Loop Engineering”这个词最近在开发者社区里高频出现,但翻遍主流技术文档、官方手册甚至 GitHub 仓库,你都找不到一个叫“Loop Engineering”的独立开源项目或商业产品。它既不是某个新发布的 IDE 插件,也不是某家大厂推出的 AI 编程平台。我第一次听到这个词,是在和三位不同公司的前端架构师吃饭时——他们不约而同提到:“我们团队现在做需求,已经不写 PRD 了,直接跑 Loop。”当时我还以为是内部黑话,后来连续两周跟踪了 5 个真实项目(含电商中台、IoT 设备管理后台、SaaS 客户数据平台),才彻底理清:Loop Engineering 是一套以“小闭环验证”为内核、以 AI 编程工具链为载体、面向交付质量与迭代效率双重目标的工程实践方法论。它的核心不在“Loop”这个名词本身,而在“Engineering”——即把过去靠经验、靠人盯、靠试错完成的软件交付过程,变成可定义、可拆解、可度量、可回滚的标准化工程动作。
为什么它突然火了?因为传统开发流程正在集体失灵。举个典型场景:一个中型 SaaS 公司要上线“客户标签自动推荐”功能。按老路子,产品经理写 20 页 PRD → UI 出 3 套高保真稿 → 后端建表+接口+权限 → 前端拉取数据+渲染+交互 → 测试覆盖边界 case → 上线后发现推荐逻辑和业务预期偏差 47% → 回滚+重训模型+改前端展示逻辑 → 整个周期 11 天。而采用 Loop Engineering 的团队怎么做?他们第一天就用 Cursor + Codex 搭出一个最小可运行闭环:输入客户基础信息(姓名、行业、最近一次下单时间)→ 调用本地轻量模型(如 Ollama 运行的 tiny-llama)生成 3 个标签草稿 → 前端用 React 快速渲染成卡片 → 用户点击“采纳/否决”按钮 → 日志实时记录反馈 → 第二天晨会基于这 86 条真实反馈调整 prompt 和规则权重。整个闭环从启动到可交互,耗时 4 小时 17 分钟,且所有代码、配置、日志、prompt 版本全部纳入 Git 管理。这不是炫技,而是把“需求理解偏差”这个最大风险点,从发布后前置到了第 1 小时。
关键词“Loop Engineering”“Codex”“Cursor”高频共现,并非偶然。它们共同指向一个事实:当 AI 编程工具从“代码补全助手”进化为“需求翻译器+原型生成器+反馈收集器”三位一体角色时,工程方法论必须同步升级。Codex 不再只是帮你写函数,它能根据一句“给订单列表加个按复购率排序的筛选项”,自动生成 SQL 查询、API 接口定义、React 组件、单元测试桩;Cursor 也不再只做语法高亮,它能把你在注释里写的“这里要兼容 IE11”自动转成 polyfill 配置并插入 webpack.config.js。真正的 Loop,是人在“意图输入 → 工具执行 → 结果验证 → 意图修正”之间形成的高速反馈环。我见过最极致的案例:一位独立开发者用这套方法,3 天内完成了原本需要 2 周的微信小程序“社区团购团长分润计算器”MVP,关键不是他多快,而是上线当天就收到 17 条团长自发提交的“这个公式漏算了跨月返佣”的修正建议——这些反馈被他直接转成 Codex 的 prompt 示例,第二天新版本就上线了。这才是 Loop Engineering 的本质:让业务方真正成为开发流程的参与者,而非验收环节的旁观者。
2. Loop Engineering 的底层结构:三个不可拆解的“硬环”
很多人误以为 Loop Engineering 就是“多用几次 AI 工具”,这是最大的认知陷阱。我带过 12 个落地团队,凡是把 Loop 当成“AI 工具使用技巧合集”的,90% 在第二周就放弃。真正起作用的,是三个物理上独立、逻辑上咬合的“硬环”。它们像自行车的前轮、后轮和链条,缺一不可,且必须按特定顺序装配。下面我用一个真实项目——为某连锁药店搭建“慢病用药提醒”微信服务号功能——来逐层拆解。
2.1 第一环:意图锚定环(Intent Anchoring Loop)
这是 Loop 的起点,也是最容易被跳过的致命环节。很多团队一上来就打开 Cursor 写代码,结果写到一半发现“医生端要看到患者用药依从性趋势图”和“患者端只要收到文字提醒”根本不是一回事。意图锚定环要解决的,是把模糊的业务语言,转化为 AI 工具可解析、可执行、可验证的原子指令。它包含三个强制步骤:
双列对照表生成:用 Codex 的
/explain指令,把原始需求(如“患者用药快到期时发微信提醒”)拆解为左列“业务侧描述”和右列“系统侧动作”。例如:- 左列:“患者上次取药是 30 天前,药品有效期 90 天,剩余 7 天时触发”
- 右列:“查询 patient_medications 表,where last_taken_date + 60 days < now() and expiry_date - now() <= 7 days”
上下文快照固化:在 Cursor 中新建一个
.loop-context.md文件,用 YAML 格式记录当前 Loop 的约束条件。必须包含target_env: wechat_service、data_source: mysql_v5.7、compliance_rules: [GDPR_article_32]等字段。我要求团队每次执行 Loop 前,先git add .loop-context.md && git commit -m "loop-001 context snapshot"。这个文件不是文档,而是 Codex 执行时的“环境变量”。Prompt 卡片制作:把右列的动作,封装成带版本号的 Prompt 卡片。例如
prompt-v1.3-medication-reminder-trigger.yaml,内容包含input_schema(明确输入字段名、类型、示例值)、output_schema(JSON 结构定义)、failure_examples(3 个 Codex 曾经出错的 case)。这个卡片要放进项目根目录的/prompts文件夹,和代码一样接受 Git 版本控制。
提示:这个环的成败,取决于你是否愿意花 20 分钟把“提醒患者”这种日常用语,掰开揉碎成数据库字段名和时间计算逻辑。我见过太多团队在这里偷懒,结果 Codex 生成的 SQL 把
last_taken_date错写成last_purchase_date,导致上线后提醒全乱套。记住:AI 不会替你思考业务,它只会放大你思考的精度。
2.2 第二环:闭环验证环(Closed-Loop Validation Loop)
这是 Loop 的心脏,决定了你能否在 1 小时内知道“这条路走对了没有”。它不是简单的“跑一下看报错”,而是构建一个微型沙盒,让代码、数据、UI、反馈全部在同一个可控环境中流转。以药店项目为例,我们搭建的验证环包含四个物理组件:
Mock 数据引擎:用 Python 脚本
generate_mock_data.py自动生成符合业务规则的测试数据。它不读真实数据库,而是根据.loop-context.md中的data_source规则,生成 1000 条模拟患者记录,每条都带last_taken_date、expiry_date、wechat_openid字段,并确保其中 127 条满足“剩余 ≤7 天”的触发条件。轻量服务容器:不用部署完整后端,而是用 Codex 生成一个 Flask 微服务(
app.py),只暴露/check-reminders接口。这个接口接收 Mock 数据引擎输出的 JSON,执行提示词中定义的 SQL 逻辑(实际是 Python 列表推导式模拟),返回触发提醒的患者 ID 列表。前端验证面板:用 Cursor 一键生成一个 HTML 页面(
verify-panel.html),它通过 fetch 调用本地 Flask 服务,把返回的患者 ID 渲染成表格,并提供“发送模拟微信”按钮(点击后调用企业微信 API 模拟发送,不真实触达用户)。反馈钩子:在
verify-panel.html底部嵌入一段 JS,当用户点击“发送模拟微信”时,自动记录timestamp、patient_id、trigger_reason(如“expiry_date - now() = 6.2 days”)到本地feedback.log。这个日志文件就是下一轮 Loop 的输入源。
这个环的关键在于“闭环”二字:所有组件必须能脱离生产环境独立运行,且任意环节的输出,必须是下一个环节的明确输入。比如 Mock 引擎的输出格式,必须和 Flask 接口的输入格式完全一致;Flask 的返回 JSON 结构,必须和前端面板的渲染逻辑严格匹配。我要求团队每次新增一个 Loop,必须先手写这四个组件的接口契约(用 OpenAPI 3.0 格式写在api-contract.yaml里),再让 Codex 基于契约生成代码。这样做的好处是,当第三天业务方说“提醒要提前到 10 天”,你只需要改api-contract.yaml里的trigger_days: 10,然后重新运行 Codex,四个组件代码全部自动更新,无需人工修改一行。
2.3 第三环:演进归档环(Evolution Archiving Loop)
这是 Loop 的记忆系统,防止团队陷入“重复造轮子”的泥潭。很多团队做了 20 个 Loop,却无法复用任何一个。问题出在没有建立“可检索、可组合、可审计”的归档机制。我们的做法是:每个 Loop 结束后,必须生成三个归档物,并存入项目根目录的/loops子文件夹。
Loop 摘要卡片(
loop-summary.md):用固定模板撰写,包含Loop ID(如 L-2024-08-15-001)、业务目标(一句话)、核心变更(Git diff 的摘要,如“新增 medication_reminder_trigger.py,修改 app.py 的 /check-reminders 路由”)、验证结果(截图或日志片段)、后续依赖(如“需等运营团队确认提醒文案”)。这个文件是给产品经理和测试看的,必须用业务语言,不能出现代码术语。Prompt 版本包(
prompt-bundle-vX.Y.zip):打包该 Loop 使用的所有 Prompt 卡片、上下文快照、失败案例。命名规则强制包含vX.Y,版本号遵循语义化规则:功能新增为 Y+1,逻辑修正为 X+1。例如prompt-bundle-v2.1.zip表示在 v2.0 基础上优化了触发条件计算精度。可复用模块(
reusable-module/目录):把 Loop 中产生的、具备通用性的代码片段,提取为独立模块。比如药店项目中,我们把日期计算逻辑抽成date_utils.py,把微信消息模板渲染抽成wechat_template.py。这些模块必须附带完整的单元测试(由 Codex 生成),且测试用例必须覆盖loop-summary.md中记录的所有验证结果。
注意:这个环的常见错误是“过度归档”。我见过团队把每个 Loop 都存 50 个文件,结果半年后没人能看懂。我们的铁律是:如果一个 Loop 的产物,不能被另一个团队在 10 分钟内理解并复用,那它就不算完成归档。为此,我们强制要求每个
reusable-module目录下必须有USAGE.md,用三句话说明“它解决什么问题”、“怎么集成到你的项目”、“有哪些已知限制”。
3. 实战:用 Loop Engineering 三天上线“药店慢病用药提醒”功能
现在,让我们把前面讲的三个硬环,放进一个真实战场。这不是理论推演,而是我亲自参与的项目复盘。客户是一家拥有 327 家门店的连锁药店,他们的核心诉求很朴素:“让糖尿病患者别忘了吃药,减少因漏服导致的复诊”。传统方案要排期、要评审、要联调,而我们用 Loop Engineering,在 72 小时内完成了从零到上线的全过程。下面我按时间线,还原每一个关键决策点和实操细节。
3.1 Day 1 上午:完成第一个可验证 Loop(L-2024-08-15-001)
目标不是写完所有代码,而是让业务方在中午前,亲手点击按钮,看到一条模拟微信提醒发到自己的手机上。这需要打通意图锚定、闭环验证、演进归档三个环。
第一步,意图锚定。我和药店的慢病管理主管面对面沟通 47 分钟,把她的口头描述“患者药快没了就提醒”拆解。她举了个例子:“张阿姨,65 岁,二甲双胍,上次取药是 7 月 10 日,药瓶上写着‘90 天有效’,那 8 月 28 日就该提醒她了。” 我立刻用 Codex 的/explain指令,生成双列对照表。关键发现是:业务方说的“药快没了”,其实隐含两个条件——一是药品本身有有效期(expiry_date),二是患者有规律的用药周期(dose_interval_days)。这直接修正了我们最初的假设。
第二步,搭建验证环。我让 Codex 基于双列表生成mock_data_generator.py。它输出的 1000 条数据中,有 127 条满足“now() > last_taken_date + dose_interval_days * 0.8且now() < expiry_date”。接着,用 Cursor 新建 Flask 项目,Codex 生成app.py,核心逻辑是:
@app.route('/check-reminders', methods=['POST']) def check_reminders(): patients = request.json # Codex 生成的逻辑:遍历 patients,计算 next_dose_date = last_taken_date + dose_interval_days # 如果 now() >= next_dose_date * 0.8 且 now() < expiry_date,则加入提醒列表 return jsonify(reminder_list)前端验证面板verify-panel.html由 Cursor 一键生成,它调用本地http://localhost:5000/check-reminders,把返回的患者 ID 渲染成表格。最关键的是“发送模拟微信”按钮,我让它调用企业微信的测试 API(https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx),但 key 是测试用的,不会真实发送。主管点击后,她的手机真的收到了一条带“【XX药店】张阿姨,您的二甲双胍即将用完,请及时续方!”的微信——这就是 Loop 的第一次心跳。
第三步,归档。生成loop-summary.md,重点记录:“业务方确认‘80% 用药周期’作为提醒阈值合理”;打包prompt-bundle-v1.0.zip;把日期计算逻辑抽成date_utils.py,写好单元测试。整个过程,从开始到主管收到第一条模拟微信,耗时 3 小时 42 分钟。
3.2 Day 1 下午:用反馈驱动第二个 Loop(L-2024-08-15-002)
主管收到模拟微信后,立刻提出三点反馈:1)提醒里要显示下次取药日期,不是“即将用完”;2)对刚确诊的患者,要加一句“首次用药请遵医嘱”;3)微信模板里药店 logo 要换成新设计的。这三条,就是第二个 Loop 的全部输入。
我们没改任何一行现有代码,而是启动新的意图锚定环。针对第一条,Codex 生成的新 Prompt 卡片prompt-v1.1-next-dose-date.yaml明确要求输出字段增加next_pickup_date,计算逻辑是last_taken_date + dose_interval_days * 2(因为药店规定复诊周期是用药周期的两倍)。针对第二条,我们在wechat_template.py里新增一个is_first_time_user字段判断逻辑,并让 Codex 生成对应的单元测试用例。第三条,直接替换verify-panel.html里的图片链接。
验证环的升级更简单:mock_data_generator.py新增一个is_first_time_user: bool字段;Flask 的/check-reminders接口返回 JSON 增加next_pickup_date和is_first_time_user;前端面板自动渲染新字段。下午 4 点,主管再次点击“发送模拟微信”,这次收到的提醒是:“【XX药店】张阿姨,您的二甲双胍将于 9 月 12 日用完,请及时续方!(首次用药请遵医嘱)”。她当场拍板:“这个可以给区域经理看了。”
3.3 Day 2:规模化与集成(L-2024-08-16-001 至 L-2024-08-16-003)
上午,我把前两个 Loop 的产物,打包成一个“慢病提醒 Starter Kit”,发给药店的技术负责人。他用 20 分钟就把 Starter Kit 集成到他们现有的 Spring Boot 后端里——因为date_utils.py的逻辑被他直接翻译成 Java,wechat_template.py的模板被他塞进 Thymeleaf。这证明了 Loop Engineering 的核心价值:它产出的不是黑盒,而是可理解、可翻译、可嵌入的工程资产。
下午,我们启动三个并行 Loop:
- L-001:对接真实微信服务号 API(替换模拟 key)
- L-002:增加“患者自主关闭提醒”功能(需要新增数据库字段和前端开关)
- L-003:为店员端添加“批量查看今日待提醒患者”页面
每个 Loop 都复用prompt-bundle-v1.0.zip里的基础 Prompt,只修改特定字段。比如 L-002 的 Prompt 卡片,继承 v1.0 的所有逻辑,只新增一条:“如果 patient.preference.reminder_enabled == false,则跳过该患者”。Codex 生成的代码,90% 和之前一致,只有新增字段的处理逻辑是新的。这极大降低了认知负荷。
3.4 Day 3:上线与监控(L-2024-08-17-001)
上线不是终点,而是新 Loop 的起点。我们部署的不是“最终版”,而是“Loop-Ready 版”。它包含一个隐藏的/loop-feedback接口,任何患者点击微信里的“不感兴趣”按钮,都会触发这个接口,把patient_id、feedback_type: 'opt_out'、timestamp记录到feedback.log。这个日志,就是明天第一个 Loop 的输入源。
上线前,我让 Codex 生成一份《Loop Engineering 上线检查清单》,包含 12 项硬性指标,例如:
feedback.log文件权限为 644,且所在目录磁盘剩余空间 > 2GB/loop-feedback接口响应时间 P95 < 200ms(用 Locust 压测脚本验证)- 所有 Prompt 卡片的
version字段,与loop-summary.md中记录的完全一致
上午 10 点,系统上线。下午 2 点,我们收到第一条真实反馈日志。晚上 8 点,基于这条反馈,第三个 Loop 的prompt-bundle-v1.2.zip已经生成,准备明天晨会评审。整个项目,没有开过一次需求评审会,没有写过一行 PRD,没有出现一次线上 bug。它不是魔法,而是把工程活动,变成了可切割、可验证、可积累的标准化动作。
4. 工具链深度解析:Codex、Cursor 与本地化部署的关键抉择
Loop Engineering 的威力,80% 来自方法论,20% 来自工具链的精准匹配。很多人以为装上 Cursor 和 Codex 就万事大吉,结果发现 Codex 总是“理解错意思”,Cursor 的中文回复像机器人念稿。问题不在工具,而在你是否理解它们的底层设计哲学和适用边界。下面我结合三年来的 47 个项目经验,拆解这三个关键词的真实定位。
4.1 Codex:不是“AI 编程助手”,而是“领域知识编译器”
Codex 的官方介绍常强调“理解自然语言生成代码”,但这严重误导了使用者。我做过一个实验:让 Codex 解析同一句“给用户列表加个按注册时间倒序排列的筛选”,在三种上下文下生成代码:
- 无上下文:生成一个带
ORDER BY created_at DESC的 SQL,但表名是users - 上下文含
schema: {table: 'customer_profiles', fields: ['id', 'reg_time']}:生成SELECT * FROM customer_profiles ORDER BY reg_time DESC - 上下文含
schema+business_rules: {time_zone: 'Asia/Shanghai', date_format: 'YYYY-MM-DD HH:mm:ss'}:生成的 SQL 增加了CONVERT_TZ(reg_time, '+00:00', '+08:00')
这个实验揭示了 Codex 的本质:它不是一个通用语言模型,而是一个上下文敏感的“领域知识编译器”。它的输入不是孤立的句子,而是“业务规则 + 数据契约 + 环境约束”的三元组。所以,所谓“Codex 无法加载组织设置”,根本原因不是网络问题,而是你没给它提供足够精确的上下文快照。
解决方案非常具体:
- 在项目根目录创建
/codex-context文件夹,里面放三个强制文件:schema.yaml:用 OpenAPI 3.0 描述你的数据模型,字段名、类型、约束、示例值一个都不能少。rules.md:用 Markdown 列出所有业务规则,如“所有时间字段必须转换为北京时间”、“手机号必须带国家代码+86”。env.json:记录当前环境信息,如"database": "mysql_5.7", "framework": "spring_boot_3.2", "compliance": ["GDPR"]。
每次调用 Codex 前,先用命令cat codex-context/schema.yaml codex-context/rules.md | codex --context注入上下文。我测试过,这样做后,Codex 对复杂业务逻辑的生成准确率,从 58% 提升到 89%。那些抱怨“Codex 不好用”的团队,90% 都没做过这一步。
实操心得:不要试图让 Codex “学会”你的业务,而是把它当成一个需要你喂食精确饲料的精密仪器。你给的上下文越像一份法律合同,它生成的代码就越像一份可执行的判决书。
4.2 Cursor:不是“高级 VS Code”,而是“意图-代码双向翻译器”
Cursor 最被低估的能力,是它的“双向翻译”特性。大多数人只用它写代码,却忽略了它强大的反向能力:把现有代码,翻译成可编辑的自然语言意图。这正是 Loop Engineering 中“意图锚定环”的技术支撑。
举个例子,药店项目上线后,运营同事发现“提醒文案太生硬”。传统做法是让开发改代码,再提 PR,再测试。而我们用 Cursor 的/explain功能,选中wechat_template.py里的render_message()函数,右键选择 “Explain with Cursor”,它立刻生成一段中文描述:“此函数接收 patient 对象,根据其 is_first_time_user 字段决定是否添加‘首次用药’提示语,然后将 next_pickup_date 格式化为 YYYY 年 MM 月 DD 日,并拼接到固定模板中。” 运营同事直接在这段描述上修改:“把‘首次用药’改成‘首次使用本药’,日期格式改为‘8月12日’”。保存后,Cursor 自动把修改后的描述,翻译回 Python 代码,连单元测试都一并更新了。
这个能力之所以强大,是因为它打破了“业务语言”和“代码语言”之间的巴别塔。Cursor 的底层原理,是把代码 AST(抽象语法树)和自然语言 embedding 做了对齐映射。所以,它不是在“猜”代码意思,而是在“读取”代码的结构化语义。这也是为什么 Cursor 的中文支持比其他工具好——它的训练数据里,有大量中英双语的代码注释对。
注意:Cursor 的中文回复质量,取决于你是否开启了“Deep Context”模式。在设置里找到
cursor.deepContext,设为true。它会让 Cursor 在解释代码时,自动关联当前文件夹下的schema.yaml和rules.md,生成的描述会包含“根据 schema.yaml 第 12 行定义的 next_pickup_date 字段”这样的精准引用,而不是泛泛而谈。
4.3 本地化部署:为什么“Codex 国内能用吗”是个伪命题
网络上充斥着“Codex 国内能用吗”“Codex 安装包下载”的搜索,这暴露了一个根本误解:Codex 从来就不是一个需要“下载安装”的客户端软件。它是 OpenAI 提供的一个 API 服务,就像 AWS 的 S3 一样,你用不用它,取决于你的网络能否访问https://api.openai.com。那些所谓的“Codex 安装包”,要么是第三方封装的桌面客户端(本质还是调 API),要么是混淆概念的本地模型(如 Ollama 的 codex-like 模型)。
真正的本地化,不是“把 Codex 下载到本地”,而是“把 Codex 的能力,安全、可控、合规地集成到你的开发流中”。我们团队的标准方案是:
- API 层代理:在公司内网部署一个轻量 Node.js 服务(
codex-proxy),它接收开发机发来的请求,添加统一的Authorization头和X-Project-ID头,再转发给 OpenAI。所有请求日志、token 消耗、错误码,都在这个代理层集中审计。 - Prompt 安全网关:在
codex-proxy里嵌入一个规则引擎,自动过滤掉包含system prompt、jailbreak、ignore previous instructions等高危关键词的请求。同时,对所有输出做敏感词扫描(如手机号、身份证号),发现即脱敏。 - 离线缓存层:用 Redis 缓存高频 Prompt 的响应。比如“生成 MySQL 创建表语句”这个指令,我们统计发现 73% 的请求参数高度相似,缓存命中后,响应时间从 1200ms 降到 87ms。
这套方案,让我们在完全不改变开发习惯的前提下,实现了 100% 的 API 调用可审计、0% 的敏感数据泄露、92% 的高频请求毫秒级响应。它不解决“能不能用”,而是解决“怎么用得安全、高效、合规”。那些纠结“Codex 国内能用吗”的团队,真正该问的是:“我的开发流程,是否具备了接入任何云 AI 服务的安全基座?”
5. 常见问题与避坑指南:来自 47 个项目的血泪总结
Loop Engineering 听起来很美,但落地时踩的坑,往往比代码 bug 更致命。下面是我从 47 个项目中提炼出的 7 个最高频、最隐蔽、最易被忽视的问题,每个都配有一个真实案例和可立即执行的解决方案。这些问题,90% 的教程都不会提,但它们恰恰决定了你的 Loop 是飞轮,还是枷锁。
5.1 问题一:Loop 越跑越慢,最后卡死在“验证”环节
现象:团队初期很兴奋,一天能跑 5 个 Loop,但到第二周,每个 Loop 耗时从 1 小时涨到 4 小时,验证面板加载越来越慢,最后干脆打不开。
根因分析:这不是性能问题,而是“验证环污染”。随着 Loop 增多,mock_data_generator.py生成的数据量指数级增长(从 1000 条到 50000 条),Flask服务的内存占用飙升,verify-panel.html加载的 JS 脚本越来越多,形成恶性循环。
真实案例:某金融 SaaS 项目,第 12 个 Loop 后,验证面板打开要 47 秒。排查发现,mock_data_generator.py为了“更真实”,加入了 17 个嵌套的随机生成逻辑,单次生成耗时 32 秒;verify-panel.html里累积了 8 个不同 Loop 的 JS 模块,总大小 2.3MB。
解决方案:实施“验证环瘦身协议”,强制三条红线:
mock_data_generator.py的输出数据量,必须小于1000 + (Loop_ID * 100)条。第 1 个 Loop 是 1000 条,第 10 个 Loop 是 2000 条,永远不超过 5000 条。verify-panel.html必须是单页应用(SPA),所有 JS 模块通过动态 import() 加载,且每个模块加载后,必须调用window.gc()(如果可用)或手动清理 DOM 事件监听器。- 每个 Loop 的验证,必须在独立的浏览器无痕窗口中进行,禁止复用旧标签页。我们用 Puppeteer 脚本自动化这个过程:
npx puppeteer test-loop.js --loop-id L-2024-08-15-001。
实操心得:验证环的使命是“快速证伪”,不是“全面仿真”。它应该像手术刀一样精准,而不是像挖掘机一样粗暴。当你觉得验证变慢了,第一反应不是升级服务器,而是删掉上一个 Loop 里多余的 mock 数据字段。
5.2 问题二:业务方反馈“看不懂 Loop 总结”,拒绝签字确认
现象:团队辛苦做了 10 个 Loop,生成了 10 份loop-summary.md,但业务方说“全是技术术语,不知道干了啥”,不肯在上线确认单上签字。
根因分析:loop-summary.md的撰写,违背了 Loop Engineering 的第一原则——它不是给工程师看的,而是给业务方看的“验收凭证”。很多团队把它写成了技术日报。
真实案例:某教育科技公司,loop-summary.md里写着:“重构了student_progress_calculator.py,将时间复杂度从 O(n²) 优化至 O(n log n),引入了 Fenwick Tree 数据结构”。业务方的反馈是:“学生进度计算?哪个功能?优化了啥?对我有什么影响?”
解决方案:制定《Loop 总结黄金三句话》模板,强制所有loop-summary.md必须用以下结构:
- 第一句(业务价值):“本次 Loop 让家长在 App 里,能实时看到孩子本周数学作业的完成率(从‘已提交’升级为‘已批改且正确率>80%’)。”
- 第二句(用户可见变化):“App 首页新增一个‘学习健康度’卡片,点击后展开详细报告,包含错题分布图和老师评语。”
- 第三句(风险与依赖):“依赖教务系统在今晚 12 点前,完成 API 权限配置,否则卡片数据为空。”
这个模板,把技术动作全部翻译成业务结果。我们要求,业务方签字前,必须能用自己的话,把这三句话复述一遍。复述不对,就退回重写。
5.3 问题三:多个 Loop 并行时,Prompt 版本混乱,代码互相覆盖
现象:团队同时跑三个 Loop,A Loop 用prompt-v1.2,B Loop 用prompt-v1.3,C Loop 用prompt-v1.2,结果 Codex 生成的代码,一部分用了新逻辑,一部分用了旧逻辑,系统行为不可预测。
根因分析:Prompt 版本管理,被当成了 Git 分支管理。但 Prompt 不是代码,它的版本冲突,不是“谁的修改保留”,而是“哪个上下文生效”。
真实案例:某电商项目,支付 Loop 和物流 Loop 并行。支付 Loop 的prompt-v2.1要求“金额四舍五入到分”,物流 Loop 的prompt-v1.5要求“运费保留两位小数但不四舍五入”。Codex 在生成订单汇总逻辑时,随机混合了两种规则,导致账单金额误差 0.01 元。
解决方案:推行“Prompt 原子化 + 环境隔离”策略:
- 每个 Prompt 卡片,必须声明
scope: payment或scope: logistics,且 scope 名称必须和项目中的模块名完全一致。 - 在
codex-proxy里实现 scope 路由:当请求头包含X-Loop-Scope: payment时,只加载/prompts/payment/目录下的卡片;X-Loop-Scope: logistics时,只加载/prompts/logistics/目录。 - 所有 Loop 的启动脚本,必须显式指定
--scope参数。例如./run-loop.sh --id L-2024-08-15-001 --scope payment。
这样,即使两个 Loop 同时运行,它们的 Prompt 环境也完全隔离,互不影响。
5.4 问题四:Loop 归档后无人查阅,变成“数字坟墓”
现象:团队认真做了 30 个 Loop 的归档,/loops目录下有 30 个loop-summary.md,但半年后,新成员入职,没人去看,所有知识都锁在老员工脑子里。
根因分析:归档不是目的,可发现、可复用才是。没有设计“发现路径”,归档就是无效劳动。
真实案例:某医疗 AI 公司,/loops目录下有 42 个归档,但新来的算法工程师,花了 3 天时间,才从 Slack 历史记录里,找到一个关于“如何处理缺失影像数据”的 Loop。而那个 Loop 的loop-summary.md里,就写着解决方案。
解决方案:构建三层“Loop