pdlc-skills 如何实现无人值守(Loop 工程)?
目录
上一篇跑通第一个功能,很快就会遇到下一个问题:每到一个阶段它就停下来等你点头,你还是得守在屏幕前。能不能让它自己一轮一轮往下跑,你去干别的? 能。但”让它自己跑”和”让它一步一回头地问你”,中间差的东西比看上去大。
那次跑的,根本就不是 loop
我在自己机器上跑过完整的 loop,很顺——一口气推完了 60 多个 PR,中间它没回头问过我一句。后来在另一台机器上再跑,我几乎立刻就觉得不对劲。
那次是让 AI 在同一个会话里“自己循环推进各个阶段”。它确实在往前走,但每走一步就回来找我一次:这个设计行不行?下一步要不要继续?要不要我接着做?
我当时说了句话,大意是:你这个 loop 怎么跟我之前用的不一样?正常的 loop 不会回头问这些废话,它会一直干到把活干完。
问题不在于它爱不爱问,而是它问的都是已经定好的事。PRD 定了,设计定了,测试怎么写也定了,它还回来确认一遍。这种确认只是把我拴在椅子上——我没法去干别的,因为不知道下次被叫回来是三分钟后还是三十分钟后。
表面上它在循环,实际上那是有人陪跑。
这件事让我想明白了:假 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 那张依赖图帮你看清谁依赖谁。怎么分批、每批放几个——仍然是判断题,仍然在循环外面。
四条护栏,每一条我都见它真正起作用
护栏这东西,写在文档里谁都会写。更值得看的是它们到底有没有真起过作用。

① 硬预算:每轮 --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 那次的产品拍板。

这是一个下午的量,我不想说得比实际更神。但 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——不管跑顺了还是跑歪了——评论区可以说说,一起讨论下。
评论