--- name: cleanup description: 交付期第 13 步,清理:每切片清一次不必留给下一切片的中间产物,如子代理工作树、分支、临时数据;一程交付后全盘清理,含临时目录下的汇报件,并出交付声明。切片收口完成、一程交付完毕,或人说「清理一下」时加载。切片进行中不加载。 --- # 清理 清理是交付的一部分。一程交付完毕的声明里有一句「清了什么」。 ## 只有一个判断 清理只做一个判断:这个东西还要不要。不要的直接删,用 `rm`、`git rm`、`git worktree remove`、`git branch -d`;要留的原地留。 一步就够,因为留痕已经有了:Git 历史记着删掉的每个字节,系统临时目录的汇报件记着过程,正式文档记着长期事实。打包、归档、复制备份是给没有留痕的东西准备的,这里的东西都有。判断完就删,删完在交付声明里写一句:汇报的是结果,所以动手之前不需要先汇报。文档只记事实,所以删之前文档照旧,删之后引用它的那一处(若有)改成新的去处。把文档改成「待删」「已删」再去删,是写一个马上就不存在的事实,还多出一处要同步的状态。 ## 两个尺度 | 时机 | 不要的,删 | 要的,原地留 | | --- | --- | --- | | 每个切片交付时 | 下一切片用不到的中间产物:子代理的工作树、工作分支、临时数据、本切片的探路件 | 下一切片要用的上下文包增量、已合回的代码、正式文档、汇报件 | | 一程完整交付后 | 本程全部子代理工作树与分支、系统临时目录下 `pqw-skills/<会话标识>/<一程标识>/` 整个子目录(含汇报件)、项目 tmp 里本程的过程材料(人看过的)、宿主里的定时任务 | 已进唯一源的正式文档、已合入的代码、变更记录 | ## 怎么判断 - 子代理的工作树与分支:已合回或已放弃,并且没有别的会话在用,才是不要的。树干净或分支已合并都不能证明可以强制删除;仍有执行者持有的树是要的。 - 过程材料(spec、plan、整程包):人看过了就是不要的,直接删;人还没看就是要的,原地留,交付声明写路径。两种情形都不打包。 - 汇报件:用完即弃。要长期留的事实在交付前写进正式文档,它从那一刻起就是正式文档的一部分,和汇报件无关。 - 验收要用的证据原件(命令输出、日志、测量结果):接受者在项目接入点「验收处」读证据(例如工单评论;没填就是本程目录)。证据的摘要与关键行已经贴到验收处,原件才是不要的;还没贴的先贴,再删。接受者读不到的证据等于没有,删了就只能重跑。 - 删除不可逆,所以判断在删之前做完。判断完的东西要么删掉要么留着,没有「待删」这个状态。 ## 脚本 [`scripts/cleanup.mjs`](scripts/cleanup.mjs) 做 Git 工作树、分支和临时目录三类,按名字前缀匹配本程的子代理产物。缺省只列不删,列出来是让你做「还要不要」的判断,`--apply` 才删。它自动跳过主工作树、当前分支、有未提交改动的工作树、没合进当前 HEAD 的分支,并写明原因。每条独立执行,中断不留半删状态。 ```sh node <技能目录>/scripts/cleanup.mjs --scope slice --prefix <前缀> # 切片级,只列 node <技能目录>/scripts/cleanup.mjs --scope slice --prefix <前缀> --apply # 切片级,删 node <技能目录>/scripts/cleanup.mjs --scope run --prefix <前缀> --project-tmp <目录> --apply # 一程级 ``` 项目专有的清理项从项目接入点取,脚本不管。宿主里的定时任务由主代理按 `one-lesson-rule` 自己删。 ## 待人验收 交付声明有一节「待人验收」,必填:每行一样交付的行为、人怎么上手验、预计要多久,没有要验的写「无」。代理做出来、人还没验过的东西是没验收的库存,看着是进度,其实是风险;这一节让人回来时知道先验什么、要多久。交付声明就是交回的东西,人回到设计会话收回时,先看它勾完没有;设计与交付分在两个会话时,它照跨会话协调的约定交回,例如在这一程的工单上评论,第一行写「## 交付声明」。一程的承诺、大小与交出收回归交接期,由设计会话做,人在场。做法加载技能 `pass-the-baton`。看到人这一侧的风险就说一次:提醒、依据、建议、选择。做法加载技能 `candid-friend`。 ## 产出 切片级:收口记录里一句「清了什么」,没有可清的就写没有。一程级:填[交付声明](checklist-template.md),贴进最后一份汇报件。