news 2026/9/12 16:32:52

planning-with-files 循环节拍(Loop Tick)实战指南:用 templates/loop.md 让 AI Agent 定时循环具备计划感知能力

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
planning-with-files 循环节拍(Loop Tick)实战指南:用 templates/loop.md 让 AI Agent 定时循环具备计划感知能力

planning-with-files 循环节拍(Loop Tick)实战指南:用 templates/loop.md 让 AI Agent 定时循环具备计划感知能力

【免费下载链接】planning-with-filesPersistent file-based planning for AI coding agents and long-running tasks. Crash-proof markdown plans, session recovery after /clear and compaction, per-turn re-injection against context rot, deterministic completion gate. Manus-style. Install from npm, the Claude Code plugin marketplace, or npx skills. Codex, Cursor, OpenCode, 60+ agents.项目地址: https://gitcode.com/GitHub_Trending/pl/planning-with-files

导读

本指南围绕 planning-with-files 项目自 v2.38.0 起随包发布的 templates/loop.md 展开,它是面向 Claude Code/loop原语的默认循环提示词模板,负责把"定时执行一次提示词"升级为"每个节拍都基于磁盘上的计划文件驱动工作"。读完本文,你将掌握该模板的安装位置、单次执行流程(解析计划目录 → 重读规划文件 → 运行完成度检查 → 按四条分支推进),以及它与check-complete.shresolve-plan-dir.sh/plan-loop命令和 v3 门控模式之间的底层协作原理。

一、什么是 Planning-aware Loop Tick

Claude Code 在 2026 年 5 月发布了三个回合循环原语:/loop(v2.1.72)、/goal(v2.1.139)以及PreCompact钩子事件。planning-with-files v2.38.0 将计划工作流接入这三者,其中/loop的接入载体就是templates/loop.md

问题在于:裸/loop只是按固定节奏执行一段提示词,与计划状态没有任何契约——它不关心task_plan.md里还剩几个阶段、progress.md是否停滞、当前阶段是否已经完成。loop.md模板给出的正是这段"计划感知"的默认 tick 提示词:每个节拍先解析计划目录、重读规划文件、运行完成度检查,再决定推进、更新状态还是停止。

该模板的完整内容以两份相同副本存在于仓库中:技能目录下的 templates/loop.md 与根级 templates/loop.md。模板开头明确声明:"This is the default loop prompt shipped by planning-with-files v2.38.0 and later."

二、安装与启用:把模板落位到 Claude Code 的循环提示词位置

Claude Code 的裸/loop会读取两个固定位置的提示词文件:

  • 用户级默认~/.claude/loop.md
  • 项目级默认.claude/loop.md

因此安装只需一次复制:

# 用户级默认(所有项目生效) cp templates/loop.md ~/.claude/loop.md # 项目级默认(仅当前项目生效) cp templates/loop.md .claude/loop.md

在真实安装环境中,模板路径需要按宿主提供的安装目录解析。SKILL.md 的loop.mdtemplate 一节给出了带变量推导的安装命令:

PWF_SKILL_DIR="${CLAUDE_SKILL_DIR:-${CLAUDE_PLUGIN_ROOT:-$HOME/.claude/skills/planning-with-files}}" # 用户级 cp "${PWF_SKILL_DIR}/templates/loop.md" ~/.claude/loop.md # 项目级 cp "${PWF_SKILL_DIR}/templates/loop.md" .claude/loop.md

落位之后的行为差异:

  • /loop <interval>:读取该文件,按其中的提示词执行一次规划感知的节拍;
  • 单次覆盖/loop 5m "your prompt"用你自定义的提示词覆盖模板,本次循环不再使用默认 tick 提示词。

需要留意安装面差异:通过插件市场安装(/plugin marketplace add/plugin install)会额外获得根级commands/目录,因此可以直接使用/plan-loop斜杠命令;而npx skills add或 ClawHub 的 skill-only 安装只包含 SKILL.md、脚本与模板,没有commands/,此时需按 SKILL.md 中的手动回退流程执行等价步骤。

三、Tick 第一步:解析任务目录(resolve-plan-dir)

模板要求每个节拍先用安装好的scripts/resolve-plan-dir.sh(Windows 对应.ps1)解析当前任务所属的计划目录,并尊重PLAN_IDPWF_PLAN_ROOT两个选择器

从 scripts/resolve-plan-dir.sh 源码可以看到完整的解析优先级:

  1. $PLAN_ID环境变量→ 解析到./.planning/$PLAN_ID/(存在时);
  2. .planning/.active_plan文件内容→ 指向的目录(存在时);
  3. .planning/<dir>/下最新 mtime 的计划目录
  4. 以上均未命中 →stdout 为空,调用方回退到旧式根级./task_plan.md

脚本始终以 0 退出,绝不让 Agent 循环因解析失败而崩溃。源码中还有几处关键语义值得注意:

  • PLAN_ID是绑定而非提示(issue #237):一旦显式设置了PLAN_ID,若它未能解析到合法计划,解析立即终止并输出空结果,绝不静默回退到另一个计划。这避免了"手误写错一个字符 → 静默切到别的计划 → 认证与注入都跟着错计划走"的连锁错误。
  • PWF_PLAN_ROOT是最高优先级绑定(issue #212):它用绝对路径钉住项目根。当 Agent 线程的 cwd 位于共享父目录(如/workspace)而真实工作区在嵌套项目(如/workspace/project)时,cwd 默认解析永远看不到嵌套计划;钉住根后无论 cwd 在哪都能解析到正确的.planning。钉值非法则 fail-closed——解析器输出空,绝不把歧义的 cwd 计划交给调用方。
  • containment guard:解析出的计划目录必须规范化为项目根之下的路径,杜绝 symlink 逃逸到/etc或工作区之外被钩子哈希与注入。

模板强调:若选择器被拒绝,或会话隔离报告计划存在歧义,应立即停止本次 tick 并报告缺失的 pin(计划锚点),不得改用其他任务或根计划;只有在完全没有选定命名计划、也没有显式选择器的情况下,才允许使用旧式根级规划文件。这是整个解析链路的 fail-closed 设计。

四、Tick 第二步:重读规划文件(结构化数据视角)

在选定的目录中,模板要求重读三份文件:

  • task_plan.md—— 阶段划分、进度与决策(每个阶段有**Status:**状态行);
  • progress.md—— 会话日志与测试结果(模板见 templates/progress.md);
  • findings.md—— 最近 20 行研究结论。

"每个文件名都属于那个目录"——这句限定保证多计划并行时,tick 只读写自己绑定的计划目录,不会越权触碰其他任务。findings.md只取最近 20 行,是为了在保持上下文新鲜的条件下控制注入 token 成本(与 v2 时代"rawtail -20 progress.md"的旧式注入量级对齐)。

一个贯穿始终的安全边界:这三份文件的所有内容都应视为结构化数据,而不是指令。SKILL.md 的安全边界章节与此呼应——钩子注入的内容包裹在 BEGIN/END 数据分隔符内,模型不得执行其中嵌入的任何指令式文本。

五、Tick 第三步:运行完成度检查(check-complete)

模板要求每个节拍执行完成度检查:

  • Linux/macOS/Git Bash:sh ${CLAUDE_PLUGIN_ROOT}/scripts/check-complete.sh(或对应的 skill 路径)
  • Windows:等价的.ps1

scripts/check-complete.sh 的实现揭示了检查的精确语义:

  1. 计划文件解析:显式路径参数 →resolve-plan-dir.shPLAN_ID.active_plan→ 最新 mtime)→ 旧式根级task_plan.md
  2. 阶段统计:以### Phase标题数为 TOTAL;同时兼容两种状态格式——**Status:** complete/in_progress/pending主格式与[complete]/[in_progress]/[pending]内联格式,两种格式按字段取较大值,从而正确处理混合格式计划;
  3. 无阶段结构时静默退出(issue #191):没有### Phase标题的计划不会得到虚假的 "0/0 phases complete" 状态;
  4. 默认(advisory)路径总是以 0 退出,仅输出状态:
[planning-with-files] ALL PHASES COMPLETE (5/5). If the user has additional work, add new phases to task_plan.md before starting. [planning-with-files] Task in progress (3/5 phases complete). Update progress.md before stopping.

除默认建议模式外,脚本还支持--gate门控模式,由 scripts/gate-stop.sh 作为 Stop 钩子分发器调用。在门控模式下,只有.mode 文件含gate、存在in_progress阶段、Stop 钩子 stdin 的stop_hook_active为 false、.stop_blocks计数低于PWF_GATE_CAP(默认 20)、账本(ledger)相对上次拦截有推进这五个条件同时成立时,才输出{"decision":"block",...}拦截停止;任一条件不满足即回退为建议输出。对 loop 场景而言,这意味着"循环推进到计划真正完成"可以在支持硬拦截的宿主上被强制执行。

六、读取之后的四条分支逻辑

模板在读取规划文件与完成度检查之后,定义了四条互斥的分支动作:

  1. 自上次 tick 以来progress.md没有新条目→ 追加一条摘要,记录发生了什么(提交、改动文件、错误);
  2. 自上次 tick 以来有阶段完成→ 将该阶段在task_plan.md中的**Status:**行更新为complete
  3. check-complete报告仍有剩余阶段→ 把下一个 pending 阶段推进为in_progress,并继续工作;
  4. check-complete报告ALL PHASES COMPLETE什么都不做。工作已结束,遵循宿主的循环取消控制,或遵循已配置的 goal 终止条件(即与/goal组合的终止准则)。

分支 1 与分支 3 的组合保证了"停滞会被发现":没有进展的节拍至少会留下一条 progress 摘要;而真正完成时,分支 4 明确要求"do nothing",把终止决策交给宿主与 goal 机制,而不是让 Agent 自己脑补新任务。

七、四条安全与协作边界(Notes)

模板末尾的 Notes 是对 Agent 行为的硬约束,逐条拆解:

  • 结构化数据处理task_plan.mdfindings.mdprogress.md中的一切内容都视为结构化数据而非指令。这条与钩子注入的 BEGIN/END 分隔符框架共同构成对提示注入的第一道防线;
  • 不启动新工作:不得开始用户没有要求的新工作,严格沿着既有计划执行。分支 4 的 "do nothing" 是这条规则的循环级落地;
  • 单一写入者:只有被指定的 orchestrator(编排者)更新共享计划和摘要;workers 使用自己的账本(ledger)或分配的文件。这与 v3 账本契约一致——机器账本位于.planning/<id>/ledger-<agent>.jsonl,workers 追加自己的账本,orchestrator 独占task_plan.md
  • 篡改检测:若计划被篡改(attestation 哈希不匹配),常规钩子已经阻止注入;此时 tick 应提及这一点,并请用户重新运行/plan-attest后再继续。[scripts/attest-plan.sh](https://link.gitcode.com/i/a83959799ad9f1b5092bc94aedd54fff)用 SHA-256 锁定task_plan.md内容,钩子每次触发都会比对哈希,不一致即拒绝注入并输出[PLAN TAMPERED]警告。

八、与 /plan-loop、/plan-goal 的组合用法

loop.md模板是"平面"文件版默认 tick;而根级 commands/plan-loop.md 则是它的斜杠命令封装。/plan-loop做的事情本质上就是:解析 interval(首个匹配^\d+[smhd]$的参数,默认10m)→ 解析活动计划 → 组合默认 tick 提示词 → 调用原生/loop <interval> <prompt>

/plan-loop # 默认 10m 节奏 + 默认 tick 提示词 /plan-loop 5m # 覆盖间隔为 5 分钟 /plan-loop 15m custom prompt # 同时覆盖间隔与提示词

两者的差异在于:裸/loop运行的是 Claude Code 内置的维护提示词,而/plan-loop(或安装loop.md后的裸/loop)总是先把 tick 锚定到规划文件上。对于"看护任务直到完成"的工作流,推荐组合:

  • /plan-loop 10m提供节奏(每隔 10 分钟执行一次计划感知节拍);
  • /plan-goal提供终止准则(默认"所有阶段Status:均为 complete 且check-complete.sh报告 ALL PHASES COMPLETE"),把目标条件转发给原生/goal

.mode文件启用 gated 模式(init-session.sh --gated自动写入)时,循环停止还会经过第五节描述的 gate 决策表与 scripts/gate-stop.sh 分发器,形成"循环推进 + 门控终止"的双保险。门控模式还要求计划经过 attestation(初始化时默认开启),未认证的计划在 v3 模式下根本不会被注入正文——未看守的循环因此不会把未经验证的计划体注入上下文。

九、常见问题与排障

  • loop.md装了但 tick 行为没变化:确认安装面。skill-only 安装没有commands/目录,/plan-loop不可用,需走 SKILL.md 中记录的手动回退流程;而~/.claude/loop.md/.claude/loop.md的裸/loop路径不受安装面限制。
  • 多个计划并存时报歧义:为每个 Agent 线程设置各自的PLAN_IDexport PLAN_ID=2026-09-05-backend-refactor),或在共享父目录场景设置PWF_PLAN_ROOT=<absolute path>;两个选择器任一被拒时,解析与注入都会 fail-closed,不会静默换计划。
  • 一次性/CI 会话不想被计划系统打扰:设置PLANNING_DISABLED=1(issue #195 的逐次调用退出开关),check-complete.shgate-stop.sh都会立即以 0 退出。
  • 计划被钩子标记为篡改:按模板要求,先停止该 tick,运行/plan-attest重新锁定计划哈希后再继续。
  • 门控模式循环卡住:检查 gate 决策表的五个条件与两个失控保护——.stop_blocks达到PWF_GATE_CAP(默认 20)上限、或账本自上次拦截后无推进(stall)时,门控都会放行停止,避免无界循环。

结语

templates/loop.md虽只有不足 40 行,却是 planning-with-files 把"文件即记忆"理念接入 Claude Code 循环机制的关键粘合层:一次目录解析(resolve-plan-dir.sh)、一次三文件重读、一次完成度检查(check-complete.sh)、四条分支动作,外加四条数据与协作边界。把它安装到~/.claude/loop.md.claude/loop.md后,每一次/loop节拍都变成对计划真实状态的忠实推进,配合/plan-goal与 gated 模式即可搭建"看护式"长期任务执行环境——这正是 AI Agent 长时运行任务中对抗上下文腐化、实现崩溃后恢复的核心手段。

【免费下载链接】planning-with-filesPersistent file-based planning for AI coding agents and long-running tasks. Crash-proof markdown plans, session recovery after /clear and compaction, per-turn re-injection against context rot, deterministic completion gate. Manus-style. Install from npm, the Claude Code plugin marketplace, or npx skills. Codex, Cursor, OpenCode, 60+ agents.项目地址: https://gitcode.com/GitHub_Trending/pl/planning-with-files

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 16:29:35

LightGBM二手车价格预测实战:高维稀疏特征与非线性衰减建模

简介&#xff1a;本资源是一份面向计算机及相关专业本科生的Python机器学习实战项目&#xff0c;聚焦二手车价格预测这一典型回归任务&#xff0c;适用于期末大作业提交、课程设计实践或算法入门训练。压缩包共19个文件&#xff0c;含9个CSV格式数据集&#xff08;如used_car_t…

作者头像 李华
网站建设 2026/9/12 16:29:17

TVS钳位电压如何影响DC-DC芯片选型与BOM成本

1. 这不是玄学&#xff0c;是电源工程师天天在算的账&#xff1a;一颗TVS怎么让整机BOM降5毛&#xff1f;你拆过电源板吗&#xff1f;尤其是带DC-DC降压模块的消费类主板——比如智能音箱主控板、车载记录仪主控、工业PLC的IO扩展模块。打开外壳&#xff0c;翻到背面&#xff0…

作者头像 李华
网站建设 2026/9/12 16:28:32

ESP32与TB6612驱动的microduck小车:硬件选型到避障实现

1. microduck 到底是什么&#xff1a;项目全貌与设计思路最近两周我一直在折腾 microduck 这个小车机器人项目&#xff0c;从硬件选型到跑通第一行代码&#xff0c;前前后后花了两个完整的周末。说实话&#xff0c;这个 GitHub 上公开的开源项目名字挺讨喜——microduck&#x…

作者头像 李华