目录

上一篇跑通第一个功能,很快就会遇到下一个问题:每到一个阶段它就停下来等你点头,你还是得守在屏幕前。能不能让它自己一轮一轮往下跑,你去干别的? 能。但”让它自己跑”和”让它一步一回头地问你”,中间差的东西比看上去大。

那次跑的,根本就不是 loop

我在自己机器上跑过完整的 loop,很顺——一口气推完了 60 多个 PR,中间它没回头问过我一句。后来在另一台机器上再跑,我几乎立刻就觉得不对劲。

那次是让 AI 在同一个会话里“自己循环推进各个阶段”。它确实在往前走,但每走一步就回来找我一次:这个设计行不行?下一步要不要继续?要不要我接着做?

我当时说了句话,大意是:你这个 loop 怎么跟我之前用的不一样?正常的 loop 不会回头问这些废话,它会一直干到把活干完。

问题不在于它爱不爱问,而是它问的都是已经定好的事。PRD 定了,设计定了,测试怎么写也定了,它还回来确认一遍。这种确认只是把我拴在椅子上——我没法去干别的,因为不知道下次被叫回来是三分钟后还是三十分钟后。

表面上它在循环,实际上那是有人陪跑

这件事让我想明白了:假 loop 和真 loop 的分界线只有一条——循环的控制权在谁手里。

假 loop 与真 loop 的四点对比:循环写在会话里还是由代码驱动、每轮上下文是否干净、遇到问题问人还是按护栏处理、判停看模型感觉还是看磁盘状态

跟模型聪不聪明无关,也跟提示词里写没写”请自主完成不要打断我”无关。控制权在模型的意愿里,它就是假的;在一段代码里,它才是真的。

一个功能:一条命令就够

先说前置铁律:PRD 和设计必须人工把关完毕,设计定稿之后才允许进 loop。

循环加速的是 TDD → 实现 → 评审 这段收敛,它加速不了”想清楚要做什么”。这个功能要不要做、边界划在哪、拆成哪几块——都是判断题,没有任何一条命令能给出退出码。

把关完了,剩下那段一条命令的事:

/pdlc-loop-run F20260825-XXXXXX

它从这个功能当前停在的阶段出发,自动往下推 tdd → implement → review,直到评审完成或卡住停机。每个阶段派一个全新的 subagent 去干,干完回来读状态机,再决定推进、停、还是交还给人。默认最多 4 步。

前提是上一篇那份 test-commands.yml 已经配置好了。 判停靠的是真跑命令的退出码,没有那份文件就没有命令可跑——上一篇那步跳了,这一篇的东西全是空转。

它替你做掉的,正是我第一次手动试时做砸的那件事:把”还要不要再来一轮”这个决定,从模型手里拿走。 靠三个设计点撑着。

一轮循环的三拍:问下一步(输出过白名单)、干这一步(干净上下文)、读状态文件判停;插件内和外部脚本跑的是同一套节拍

第一,控制流是代码,不在模型脑子里。 每轮只问模型两件事:下一步该跑哪条命令,以及把这一步干完。前者的答案还得过一道白名单,只认那五个词,多一个字的解释都会被滤掉。模型说废话没用,因为下游根本不读废话。

第二,每个阶段都从干净的上下文开始。 上一阶段的犹豫、误解、被带偏的推理,不会跟进下一阶段。跨阶段的记忆全在磁盘那份状态机文件里——第 3 篇讲过的那个。会话可以死,状态不会丢。

第三,判停读文件,不读嘴。 每步干完,循环不问模型”你觉得过了吗”,而是去读 last_phase_result.ok——上一阶段真跑命令得到的落盘结果。第 3 篇那两个格子,判停用的就是只装真跑结果的那个

十来个功能:这才轮到外部脚本

/pdlc-loop-run 跑在插件内部,适合一个功能的短收敛。你也可以自己写 bash 循环——每轮起一个真正独立的进程,上下文隔离得更彻底,长跑更稳——但光这么跑一个功能点意义不大:它和 /pdlc-loop-run 干的是同一件事,只是换了个进程边界。

脚本真正的位置在外面一层。第 3 篇画过那个两级结构——把活拆成 N 个相对独立的功能点,外层给每个功能点各起一条循环,各跑各的 worktree。外层干的是起循环、收结果、排下一批,不替某一个功能推阶段。这一篇补上它怎么排:按依赖分批

我之前一个项目大概十来个功能点,分了三批:地基一批,被依赖的功能一批,剩下互不相干的独立功能一次全上。 每批内部并行,一批跑完人验一道,再启下一批,逐批把全部收敛掉。

十来个功能点按依赖分三批:地基一批、被依赖的功能一批、互不相干的独立功能一次全上,每批内部并行,批与批之间由人验一道

顺序不能反:地基没立起来,后面全是空中楼阁;被依赖的没做完,依赖它们的只能空等。最后那批谁也不等谁,同批全开最划算——功能编号用”日期+时分秒”本来就是为并行准备的,不会撞号。

得说清楚:这层批次调度是我自己排的,pdlc 没提供。 它给的是”一个功能点怎么自己跑完”,外加 /pdlc-relate 那张依赖图帮你看清谁依赖谁。怎么分批、每批放几个——仍然是判断题,仍然在循环外面。

四条护栏,每一条我都见它真正起作用

护栏这东西,写在文档里谁都会写。更值得看的是它们到底有没有真起过作用。

四条护栏各自的触发条件与真实触发记录:硬预算触发两次、fail-stop 日常兜底、blocked 升级触发一次、步数上限触发一次

① 硬预算:每轮 --max-budget-usd

给每一轮的进程设个上限,烧到就被进程级掐断,不跟你商量。这条是外部脚本形态的必配项。

这条我在一次跑里触发了两次。 我第一轮把上限设成 5,实现阶段跑到中途就被斩断;检查了一遍磁盘上的半成品,确认完整可续,把上限提到 8 再跑,又触顶;最后设到 12 才跑完。

被斩断那一刻最值得说的是:磁盘上的东西是完整的。 文档落了盘,状态机记了账,损失的只是”这一轮没跑完”,不是”全部重来”。落盘加记账,把一次粗暴的掐断变成了一次可以续跑的暂停。

预算掐断的一轮:进程被斩断,但磁盘上的文档和状态机是完整的,下一轮可以从原地续跑而不是重来

这里得交代一句,免得那几个数字被误读:5、8、12 是我给每轮设的上限,不是我实际掏了多少钱。 我用的是订阅模式、按周算量,各家 API 的单价也不一样。这三个数字当”我摸出来的量级”看就行——真要算成本,得看 token 消耗量,再按你用的那家官方定价去估。

② 和 ④:不 ok 就停,步数耗尽也停

fail-stop 兜的是最容易被忽略的一种烂账:一个失败的阶段被下一轮当成”已完成”踩过去——一旦踩过去,后面每轮都建立在假前提上,跑得越久错得越深,还全程绿灯。

步数上限防的是振荡:改坏了→修好了→又改坏了,每轮都像在干活,其实原地打转。默认 4 步 = 收敛段三步 + 一步容错余量,我保守设成 1 试过一次,如期停机。

③ blocked 升级:该停的时候真的停了

评审一旦发现需要产品决策的问题,就往状态机里写 blocked,停机,等人。

这条真响的那一次,才让我觉得这套东西可信。

评审时它发现,这轮新增的三个配置字段,后端没有任何一处消费它们。代码是对的,测试也是绿的,这不是 bug,是个产品级的缺口:字段该砍掉,还是链路没接完该补上?这个问题 AI 无权替我决定。

它没猜,也没顺手删掉字段让测试继续绿——写了 blocked,停机,把问题交回给我。我拍板保留字段、补上消费链路,让它接着跑。续跑复审时还有个意外收尾:它反手把这套补链路实现里的 2 个真 bug 也修掉了。

该停的停了,该查的也查了。我要的就是这个。

这一轮跑出来了什么

那次的活是一个控制台项目的三期迭代:4 个后端接口组、3 个前端页面,外加一套通知规则。TDD → 实现 → 评审 全程无人值守跑完,全量测试 301 项通过,覆盖率 87% 以上。

人工介入一共只有三回:两次预算续命时的核验决策,加上 blocked 那次的产品拍板。

一个下午的时间线:设计定稿之后进入 TDD、实现、评审三段无人值守,实现段被预算掐断两次,评审段停机等人拍板一次,终点是评审完成交回人工

这是一个下午的量,我不想说得比实际更神。但 loop 期间它对我完全静默——回来看到的不是一串”接下来要做那个吗”,而是一个终态。不是它跑得多快,是它不需要我在场。

人工与机器自动化的边界

判据从第 2 篇起就没变过:能自动发现错误的才敢交给循环。 照这条划下来,有两件事永远交不出去:

  • 想清楚要做什么(需要人工决策)。 PRD 和设计必须人工把关,这是进 loop 的前置条件,不是建议。
  • 发布。 循环的终态是评审完成,到这儿就停,交由人来决定要不要发。--autonomous 对发布和部署一律无效——发出去就收不回来。

这划的是”哪些活可以交出去”。还有一个跟它配套的问题:交出去之后,靠什么保证它不乱来?

第 1 篇讲提示词工程时,我给那一层写过一句天花板:它是软约束,模型未必完全听你指挥,你当场也未必看得出来。当时只是一句原则,这一趟碰上了它的实例。

“省着点花、注意控制消耗”这类话写进提示词很容易,但它属于提示词层——引导得了,保证不了。--max-budget-usd 属于进程层,它不看你写了什么,到点就掐。这一趟两次超支,两次都是被它掐停的,不是被那句话劝住的。

凡是”引导了但不保证”的东西,最终都得往上层挪。 这一次,它挪到了进程参数上。

下一篇

如果这篇只留一句话给你带走,我希望是这句:判断一个 loop 是真是假,只看一件事——控制流写在代码里,还是写在模型的意愿里。一个会回头问你的循环,不是循环。

下一篇聊质量:这条流水线跑得又快又不用人看着,那它产出的东西凭什么信得过?测试红灯门、评审闸门、覆盖率各自在挡什么,合起来又挡不住什么。


想自己试一下

curl -fsSL https://raw.githubusercontent.com/kanfu-panda/pdlc-skills/main/install.sh | bash -s -- --global

仓库在这里:https://github.com/kanfu-panda/pdlc-skills

觉得有用的话,给个 star 是对我最大的支持 ⭐


这四条护栏我是照着那次真跑的记录一条条写的,包括被掐断和被卡住的时候。如果它让你觉得”原来这东西是可以信的”,点个赞让我知道;要是你也跑过 loop——不管跑顺了还是跑歪了——评论区可以说说,一起讨论下。