{"data":{"post":{"title":"打造你的第一个 7x24 Agent 循环","subtitle":"","isPublished":true,"createdTime":"2025-09-25T00:00:00.000Z","lastModifiedTime":null,"license":null,"tags":["AI","Agent"],"category":"Programming","file":{"childMdx":{"excerpt":"小趣闻：  2025 年 9 月，我在 Claude Code 上的用量飙到了  3000 美元 。 原因很简单：我把 Claude Code 放进了一个  7x24 agent…","code":{"body":"function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nconst layoutProps = {};\nreturn class MDXContent extends React.Component {\n  constructor(props) {\n    super(props);\n    this.layout = null;\n  }\n\n  render() {\n    const _this$props = this.props,\n          {\n      components\n    } = _this$props,\n          props = _objectWithoutProperties(_this$props, [\"components\"]);\n\n    return React.createElement(MDXTag, {\n      name: \"wrapper\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"em\",\n      components: components,\n      parentName: \"p\"\n    }, `小趣闻：`), ` 2025 年 9 月，我在 Claude Code 上的用量飙到了 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `3000 美元`), `。`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"figure\",\n      components: components,\n      parentName: \"p\"\n    }, `\n    `, React.createElement(MDXTag, {\n      name: \"a\",\n      components: components,\n      parentName: \"figure\",\n      props: {\n        \"href\": \"/static/d6ed59e7cfb2799b677a6e5d3be9ea00/4520d/3k-usd-usage-of-claude-code.webp\"\n      }\n    }, React.createElement(MDXTag, {\n      name: \"picture\",\n      components: components,\n      parentName: \"a\"\n    }, `\n  `, React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/d6ed59e7cfb2799b677a6e5d3be9ea00/4ae7e/3k-usd-usage-of-claude-code.jpg\",\n        \"srcSet\": [\"/static/d6ed59e7cfb2799b677a6e5d3be9ea00/aeae1/3k-usd-usage-of-claude-code.jpg 178w\", \"/static/d6ed59e7cfb2799b677a6e5d3be9ea00/3465b/3k-usd-usage-of-claude-code.jpg 356w\", \"/static/d6ed59e7cfb2799b677a6e5d3be9ea00/4ae7e/3k-usd-usage-of-claude-code.jpg 712w\", \"/static/d6ed59e7cfb2799b677a6e5d3be9ea00/01d22/3k-usd-usage-of-claude-code.jpg 1068w\", \"/static/d6ed59e7cfb2799b677a6e5d3be9ea00/d7775/3k-usd-usage-of-claude-code.jpg 1309w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/d6ed59e7cfb2799b677a6e5d3be9ea00/943f6/3k-usd-usage-of-claude-code.webp\",\n        \"srcSet\": [\"/static/d6ed59e7cfb2799b677a6e5d3be9ea00/b1d2a/3k-usd-usage-of-claude-code.webp 178w\", \"/static/d6ed59e7cfb2799b677a6e5d3be9ea00/c91cd/3k-usd-usage-of-claude-code.webp 356w\", \"/static/d6ed59e7cfb2799b677a6e5d3be9ea00/943f6/3k-usd-usage-of-claude-code.webp 712w\", \"/static/d6ed59e7cfb2799b677a6e5d3be9ea00/8a6dd/3k-usd-usage-of-claude-code.webp 1068w\", \"/static/d6ed59e7cfb2799b677a6e5d3be9ea00/4520d/3k-usd-usage-of-claude-code.webp 1309w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), `\n  `, React.createElement(MDXTag, {\n      name: \"img\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/d6ed59e7cfb2799b677a6e5d3be9ea00/4520d/3k-usd-usage-of-claude-code.webp\",\n        \"alt\": \"3000 美元 Claude Code 用量\",\n        \"title\": \"3000 美元 Claude Code 用量\",\n        \"width\": 712,\n        \"height\": 821,\n        \"loading\": \"lazy\"\n      }\n    }))), `\n    `, React.createElement(MDXTag, {\n      name: \"figcaption\",\n      components: components,\n      parentName: \"figure\"\n    }, `\n        `, React.createElement(MDXTag, {\n      name: \"span\",\n      components: components,\n      parentName: \"figcaption\"\n    }, `\n            3000 美元 Claude Code 用量\n        `), `\n    `))), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `原因很简单：我把 Claude Code 放进了一个 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `7x24 agent 循环`), ` 里帮我打理业余项目。我睡着时，循环会评估现场、派生 subagents、让事情持续推进。等我醒来，进度已经悄悄向前走了一截。`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `但这种魔法并不是 Claude 独有；只要你理解了配置的精髓，就能把这个魔法复刻到任何实现了相同要件的模型与 agent runtime 上。`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `下面就带你从头搭建。`), React.createElement(MDXTag, {\n      name: \"h2\",\n      components: components\n    }, `幕后的秘密`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `事实是：最新的 Claude 4、GPT-5 这类大模型已经在 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `agent 任务`), ` 上被反复训练。它们“知道”如何评估、如何规划、如何调用工具，以及如何把控制权交还。你无需庞大的框架，只需要协议和循环。`), React.createElement(MDXTag, {\n      name: \"h2\",\n      components: components\n    }, `Agent 循环的本质`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `为了把「协议 + 循环」具体化，先看这张最小化流程图：evaluator 决定下一步动作，派生 executor 去执行 tool，executor 回报结果，然后控制权回到 evaluator，直到目标完成。`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"figure\",\n      components: components,\n      parentName: \"p\"\n    }, `\n    `, React.createElement(MDXTag, {\n      name: \"a\",\n      components: components,\n      parentName: \"figure\",\n      props: {\n        \"href\": \"/static/1d214e7e58132e0713973d5e031c7e02/4aad0/basic-agentic-loop.webp\"\n      }\n    }, React.createElement(MDXTag, {\n      name: \"picture\",\n      components: components,\n      parentName: \"a\"\n    }, `\n  `, React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/1d214e7e58132e0713973d5e031c7e02/0cc25/basic-agentic-loop.png\",\n        \"srcSet\": [\"/static/1d214e7e58132e0713973d5e031c7e02/5116e/basic-agentic-loop.png 178w\", \"/static/1d214e7e58132e0713973d5e031c7e02/92f55/basic-agentic-loop.png 356w\", \"/static/1d214e7e58132e0713973d5e031c7e02/0cc25/basic-agentic-loop.png 712w\", \"/static/1d214e7e58132e0713973d5e031c7e02/7ae06/basic-agentic-loop.png 1068w\", \"/static/1d214e7e58132e0713973d5e031c7e02/eee47/basic-agentic-loop.png 1424w\", \"/static/1d214e7e58132e0713973d5e031c7e02/38407/basic-agentic-loop.png 2136w\", \"/static/1d214e7e58132e0713973d5e031c7e02/3361d/basic-agentic-loop.png 2893w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/1d214e7e58132e0713973d5e031c7e02/690c8/basic-agentic-loop.webp\",\n        \"srcSet\": [\"/static/1d214e7e58132e0713973d5e031c7e02/25c8a/basic-agentic-loop.webp 178w\", \"/static/1d214e7e58132e0713973d5e031c7e02/60698/basic-agentic-loop.webp 356w\", \"/static/1d214e7e58132e0713973d5e031c7e02/690c8/basic-agentic-loop.webp 712w\", \"/static/1d214e7e58132e0713973d5e031c7e02/d7e52/basic-agentic-loop.webp 1068w\", \"/static/1d214e7e58132e0713973d5e031c7e02/456ef/basic-agentic-loop.webp 1424w\", \"/static/1d214e7e58132e0713973d5e031c7e02/2a654/basic-agentic-loop.webp 2136w\", \"/static/1d214e7e58132e0713973d5e031c7e02/4aad0/basic-agentic-loop.webp 2893w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), `\n  `, React.createElement(MDXTag, {\n      name: \"img\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/1d214e7e58132e0713973d5e031c7e02/4aad0/basic-agentic-loop.webp\",\n        \"alt\": \"一张标题为“Main Loop”的示意图，展示了 evaluator 与 executor 在五步循环中反复互动：evaluator 请求触发 executor，executor 请求任务细节，回应再触发 executor\",\n        \"title\": \"基础 Agent 循环\",\n        \"width\": 712,\n        \"height\": 586,\n        \"loading\": \"lazy\"\n      }\n    }))), `\n    `, React.createElement(MDXTag, {\n      name: \"figcaption\",\n      components: components,\n      parentName: \"figure\"\n    }, `\n        `, React.createElement(MDXTag, {\n      name: \"span\",\n      components: components,\n      parentName: \"figcaption\"\n    }, `\n            基础 Agent 循环\n        `), `\n    `))), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `不过，要让这套流程变成可运行的系统，需要三个组件协同工作：合适的 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `模型`), `、能够落实协议的 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `提示词`), `，以及专为工具调用设计的 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `agent runtime`), `：`), React.createElement(MDXTag, {\n      name: \"ol\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"li\",\n      components: components,\n      parentName: \"ol\"\n    }, React.createElement(MDXTag, {\n      name: \"p\",\n      components: components,\n      parentName: \"li\"\n    }, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `挑选合适的模型`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components,\n      parentName: \"li\"\n    }, `在提示词压力下仍旧严格遵守 JSON 格式；`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components,\n      parentName: \"li\"\n    }, `对角色、动作保持高度自律；`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components,\n      parentName: \"li\"\n    }, `在进行工具调用时保持理性推理，不胡乱臆测。`)), React.createElement(MDXTag, {\n      name: \"li\",\n      components: components,\n      parentName: \"ol\"\n    }, React.createElement(MDXTag, {\n      name: \"p\",\n      components: components,\n      parentName: \"li\"\n    }, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `围绕协议写提示词`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components,\n      parentName: \"li\"\n    }, `循环的骨干是固定格式的 schema。每个 evaluator 与 executor 都必须在这份结构下作答，把原本自由的 LLM 对话收束成可预测、可解析的沟通。`)), React.createElement(MDXTag, {\n      name: \"li\",\n      components: components,\n      parentName: \"ol\"\n    }, React.createElement(MDXTag, {\n      name: \"p\",\n      components: components,\n      parentName: \"li\"\n    }, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `支持工具调用`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components,\n      parentName: \"li\"\n    }, `没有工具调用，循环只是在自言自语；有了 CLI 命令，它就能跑测试、抓数据、修补代码或监控系统。甚至不需要内建 subagent，只要通过 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `bash`), ` tool 拉起外部 agent 实例，也能维持 evaluator 与 executor 的心跳。`))), React.createElement(MDXTag, {\n      name: \"h2\",\n      components: components\n    }, `写下你的第一份协议驱动提示词`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `角色和循环已经清楚，现在我们用 Claude Code 的 subagent 和 custom command，搭出一个清理仓库里 TODO/FIXME 的循环`, React.createElement(MDXTag, {\n      name: \"sup\",\n      components: components,\n      parentName: \"p\",\n      props: {\n        \"id\": \"fnref-1\"\n      }\n    }, React.createElement(MDXTag, {\n      name: \"a\",\n      components: components,\n      parentName: \"sup\",\n      props: {\n        \"href\": \"#fn-1\",\n        \"className\": \"footnote-ref\"\n      }\n    }, `1`)), `。无需额外的 Schema 文件——协议就在提示词里。Claude 4 非常适合承担 7x24 agent 循环。`), React.createElement(MDXTag, {\n      name: \"h3\",\n      components: components\n    }, `循环结构`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `循环包含三部分：`), React.createElement(MDXTag, {\n      name: \"ul\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"li\",\n      components: components,\n      parentName: \"ul\"\n    }, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"li\"\n    }, `cleanup`), ` 命令`), React.createElement(MDXTag, {\n      name: \"li\",\n      components: components,\n      parentName: \"ul\"\n    }, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"li\"\n    }, `cleanup-evaluator`), ` subagent`), React.createElement(MDXTag, {\n      name: \"li\",\n      components: components,\n      parentName: \"ul\"\n    }, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"li\"\n    }, `cleanup-executor`), ` subagent`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"figure\",\n      components: components,\n      parentName: \"p\"\n    }, `\n    `, React.createElement(MDXTag, {\n      name: \"a\",\n      components: components,\n      parentName: \"figure\",\n      props: {\n        \"href\": \"/static/2a2c9e8362277703d35423ccdbc66fbf/32770/the-todo-fixme-loop.webp\"\n      }\n    }, React.createElement(MDXTag, {\n      name: \"picture\",\n      components: components,\n      parentName: \"a\"\n    }, `\n  `, React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/2a2c9e8362277703d35423ccdbc66fbf/0cc25/the-todo-fixme-loop.png\",\n        \"srcSet\": [\"/static/2a2c9e8362277703d35423ccdbc66fbf/5116e/the-todo-fixme-loop.png 178w\", \"/static/2a2c9e8362277703d35423ccdbc66fbf/92f55/the-todo-fixme-loop.png 356w\", \"/static/2a2c9e8362277703d35423ccdbc66fbf/0cc25/the-todo-fixme-loop.png 712w\", \"/static/2a2c9e8362277703d35423ccdbc66fbf/7ae06/the-todo-fixme-loop.png 1068w\", \"/static/2a2c9e8362277703d35423ccdbc66fbf/eee47/the-todo-fixme-loop.png 1424w\", \"/static/2a2c9e8362277703d35423ccdbc66fbf/38407/the-todo-fixme-loop.png 2136w\", \"/static/2a2c9e8362277703d35423ccdbc66fbf/3504a/the-todo-fixme-loop.png 3929w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/2a2c9e8362277703d35423ccdbc66fbf/690c8/the-todo-fixme-loop.webp\",\n        \"srcSet\": [\"/static/2a2c9e8362277703d35423ccdbc66fbf/25c8a/the-todo-fixme-loop.webp 178w\", \"/static/2a2c9e8362277703d35423ccdbc66fbf/60698/the-todo-fixme-loop.webp 356w\", \"/static/2a2c9e8362277703d35423ccdbc66fbf/690c8/the-todo-fixme-loop.webp 712w\", \"/static/2a2c9e8362277703d35423ccdbc66fbf/d7e52/the-todo-fixme-loop.webp 1068w\", \"/static/2a2c9e8362277703d35423ccdbc66fbf/456ef/the-todo-fixme-loop.webp 1424w\", \"/static/2a2c9e8362277703d35423ccdbc66fbf/2a654/the-todo-fixme-loop.webp 2136w\", \"/static/2a2c9e8362277703d35423ccdbc66fbf/32770/the-todo-fixme-loop.webp 3929w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), `\n  `, React.createElement(MDXTag, {\n      name: \"img\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/2a2c9e8362277703d35423ccdbc66fbf/32770/the-todo-fixme-loop.webp\",\n        \"alt\": \"一个标题为\",\n        \"cleanup\": \"\",\n        \"loop\\\"的图表，展示了\": \"\",\n        \"todo\": \"\",\n        \"fixme\": \"\",\n        \"项目如何被收集、由\": \"\",\n        \"cleanup-evaluator\": \"\",\n        \"重新组织、由\": \"\",\n        \"cleanup-executor\": \"\",\n        \"执行，并通过五个重复步骤循环回到清理过程中。\\\"\": \"\",\n        \"title\": \"TODO/FIXME 循环\",\n        \"width\": 712,\n        \"height\": 463,\n        \"loading\": \"lazy\"\n      }\n    }))), `\n    `, React.createElement(MDXTag, {\n      name: \"figcaption\",\n      components: components,\n      parentName: \"figure\"\n    }, `\n        `, React.createElement(MDXTag, {\n      name: \"span\",\n      components: components,\n      parentName: \"figcaption\"\n    }, `\n            TODO/FIXME 循环\n        `), `\n    `))), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup`), ` 命令是循环的入口，也是 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `main agent`), ` 所在。它会扫描仓库里的 TODO/FIXME，整理出一份工作清单，再把清单交给 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup-evaluator`), ` subagent。`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup-evaluator`), ` subagent 负责分拣并重排清单，然后把整理后的清单以及 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `spawn(cleanup-executor)`), ` 这个下一步动作反馈给 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `main agent`), `。`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `main agent`), ` 会按 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup-evaluator`), ` 的指示，拉起 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup-executor`), ` subagent，并把重排后的清单转交过去。`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup-executor`), ` subagent 会从清单中取出第一条 TODO/FIXME，执行完成后更新清单，再把更新后的清单和 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `spawn(cleanup-evaluator)`), ` 这一下一步动作回应给 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `main agent`), `。`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `main agent`), ` 再次依据 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup-executor`), ` 的回复拉起 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup-evaluator`), ` subagent，把最新的清单交给它，于是循环回到开头。`), React.createElement(MDXTag, {\n      name: \"h3\",\n      components: components\n    }, `协议长什么样`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `让循环持续运转的关键，是确保 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `main agent`), ` 与所有 subagent 都遵守协议。好消息是，这份协议很直观。在这个例子里，每个 subagent 会收到来自 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `main agent`), ` 的 JSON 对象，格式如下：`), React.createElement(MDXTag, {\n      name: \"pre\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"code\",\n      components: components,\n      parentName: \"pre\",\n      props: {\n        \"className\": \"language-json\"\n      }\n    }, `{\n  \"incomplete_items\": [incomplete_item_list],\n  \"completed_items\": [completed_item_list],\n  \"postponed_items\": [postponed_item_list]\n}\n`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `Subagent 回给 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `main agent`), ` 时，使用的 JSON 结构是：`), React.createElement(MDXTag, {\n      name: \"pre\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"code\",\n      components: components,\n      parentName: \"pre\",\n      props: {\n        \"className\": \"language-json\"\n      }\n    }, `{\n  \"incomplete_items\": [reordered_incomplete_item_list],\n  \"completed_items\": [completed_item_list],\n  \"postponed_items\": [postponed_item_list],\n  \"next_action\": \"spawn(cleanup-executor)|spawn(cleanup-evaluator)|mission_complete\"\n}\n`)), React.createElement(MDXTag, {\n      name: \"h3\",\n      components: components\n    }, `通过工具收集 TODO/FIXME`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `你也许好奇 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `[incomplete_item_list]`), ` 是什么。你可以把它视作提示词里的“变量”：它们来自工具调用。在 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup`), ` 命令开头的提示词，会触发如下指令：`), React.createElement(MDXTag, {\n      name: \"pre\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"code\",\n      components: components,\n      parentName: \"pre\",\n      props: {\n        \"className\": \"language-markdown\",\n        \"metastring\": \"path=cleanup.md\",\n        \"path\": \"cleanup.md\"\n      }\n    }, `## MANDATORY: 1. FIND DOCUMENTED TODOs and FIXMEs\n\nYou SHALL use the \\`grep\\` tool piped with \\`head\\` to find the first \\`10\\` documented TODOs and FIXMEs in the repository.\n\nCommand: grep -r -n -E \"TODO|FIXME\" . | head -n 10\n`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `不过原始输出不能直接拿来用。我们必须告诉 agent 期望的格式，并要求它把结果整理成符合协议的 JSON 对象。`), React.createElement(MDXTag, {\n      name: \"pre\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"code\",\n      components: components,\n      parentName: \"pre\",\n      props: {\n        \"className\": \"language-markdown\",\n        \"metastring\": \"path=cleanup.md\",\n        \"path\": \"cleanup.md\"\n      }\n    }, `The outputs are in the following format.\n\n\\`\\`\\`shell\n[file]:[line]:[content]\n\\`\\`\\`\n\nYou SHALL READ around each [line] in [file] and EXTRACT the [content] from all the found TODOs and FIXMEs, filtering out the ones cannot be applied apply with the restrictions of the platform, operating system, and required tools, then convert into a JSON object of the following format, using [incomplete_item_list] as the mnemonic:\n\n\\`\\`\\`json\n[\n  {\n    \"type\": \"todo\",\n    \"id\": \"TODO_1\",\n    \"file\": [todo_1_file],\n    \"line\": [todo_1_line],\n    \"content\": [todo_1_content]\n  },\n  {\n    \"type\": \"todo\",\n    \"id\": \"TODO_2\",\n    \"file\": [todo_2_file],\n    \"line\": [todo_2_line],\n    \"content\": [todo_2_content]\n  },\n  {\n    \"type\": \"fixme\",\n    \"id\": \"FIXME_1\",\n    \"file\": [fixme_1_file],\n    \"line\": [fixme_1_line],\n    \"content\": [fixme_1_content]\n  },\n  {\n    \"type\": \"fixme\",\n    \"id\": \"FIXME_2\",\n    \"file\": [fixme_2_file],\n    \"line\": [fixme_2_line],\n    \"content\": [fixme_2_content]\n  }\n]\n\\`\\`\\`\n\nYou SHALL NOTE a JSON object with and empty \"items\" array as [completed_item_list]:\n\n\\`\\`\\`json\n[]\n\\`\\`\\`\n\nYou SHALL NOTE a JSON object with and empty \"items\" array as [postponed_item_list]:\n\n\\`\\`\\`json\n[]\n\\`\\`\\`\n`)), React.createElement(MDXTag, {\n      name: \"h3\",\n      components: components\n    }, `用提示词强制贯彻协议`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `这里的协议直接写在提示词里——没有任何隐藏技巧，而是用清晰的命令一遍遍强调，直到模型完全照做。`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `下面这段展示了 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `main agent`), ` 如何在循环开始时拉起 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup-evaluator`), `：`), React.createElement(MDXTag, {\n      name: \"pre\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"code\",\n      components: components,\n      parentName: \"pre\",\n      props: {\n        \"className\": \"language-markdown\",\n        \"metastring\": \"path=cleanup.md\",\n        \"path\": \"cleanup.md\"\n      }\n    }, `## MANDATORY: 2. SPAWN A CLEANUP-EVALUATOR TO EVALUATE INCOMPLETE TODOs and FIXMEs\n\nYou MUST spawn a cleanup-evaluator subagent to evaluate the gap between the incomplete TODOs and FIXMEs and the existing situation.\n\nYou SHALL ALWAYS send the cleanup-evaluator with a JSON object of the following format:\n\n\\`\\`\\`json\n{\n  \"incomplete_items\": [incomplete_item_list],\n  \"completed_items\": [completed_item_list],\n  \"postponed_items\": [postponed_item_list]\n}\n\\`\\`\\`\n`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup-evaluator`), ` 一侧也必须执行协议：`), React.createElement(MDXTag, {\n      name: \"pre\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"code\",\n      components: components,\n      parentName: \"pre\",\n      props: {\n        \"className\": \"language-markdown\",\n        \"metastring\": \"path=cleanup-evaluator.md\",\n        \"path\": \"cleanup-evaluator.md\"\n      }\n    }, `## MANDATORY: PARSE THE RECEIVED JSON OBJECT\n\nYOU WILL RECEIVE a JSON object of the following format:\n\n\\`\\`\\`json\n{\n  \"incomplete_items\": [incomplete_item_list],\n  \"completed_items\": [completed_item_list],\n  \"postponed_items\": [postponed_item_list]\n}\n\\`\\`\\`\n`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `当 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup-evaluator`), ` 完成评估后，它会按照协议准备回给 main agent 的响应。这个例子里，`, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `next_action`), ` 只有两种：拉起 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup-executor`), `，或者宣布 \"mission complete\"。`), React.createElement(MDXTag, {\n      name: \"pre\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"code\",\n      components: components,\n      parentName: \"pre\",\n      props: {\n        \"className\": \"language-markdown\",\n        \"metastring\": \"path=cleanup-evaluator.md\",\n        \"path\": \"cleanup-evaluator.md\"\n      }\n    }, `## MANDATORY: RESPOND TO THE MAIN AGENT\n\nYou SHALL RESPOND with the [reordered_incomplete_item_list], [completed_item_list], [postponed_item_list] to the main agent with the JSON object of the following format:\n\n\\`\\`\\`json\n{\n  \"incomplete_items\": [reordered_incomplete_item_list],\n  \"completed_items\": [completed_item_list],\n  \"postponed_items\": [postponed_item_list],\n  \"next_action\": \"spawn(cleanup-executor)|mission_complete\"\n}\n\\`\\`\\`\n\nThe \\`next_action\\` field SHALL BE \\`mission_complete\\` when NO ITEMS ARE LEFT in [reordered_incomplete_item_list].\n\nOtherwise, the \\`next_action\\` field SHALL BE \\`spawn(cleanup-executor)\\`.\n`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `回到 main agent，它会依据 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup-evaluator`), ` 的反馈拉起 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup-executor`), ` subagent，并把三个列表传过去：`), React.createElement(MDXTag, {\n      name: \"pre\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"code\",\n      components: components,\n      parentName: \"pre\",\n      props: {\n        \"className\": \"language-markdown\",\n        \"metastring\": \"path=cleanup.md\",\n        \"path\": \"cleanup.md\"\n      }\n    }, `## MANDATORY: 3. UNDERSTAND THE CLEANUP-EVALUATOR'S RESPONSE\n\nThe cleanup-evaluator subagent is ALWAYS the core of the workflow.\n\nYOU MUST OBEY THE DECISION OF THE CLEANUP-EVALUATOR IN [next_action].\nYou SHALL NEVER CHANGE THE DECISION OF THE CLEANUP-EVALUATOR in [next_action].\n\nThe [next_action] COULD BE: \\`spawn(cleanup-executor)\\` | \\`mission_complete\\`:\n\nThe [next_action_details] COULD BE:\n\n\\`\\`\\`json\n{\n  \"type\": \"todo|fixme\",\n  \"id\": [next_item_id],\n  \"file\": [next_item_file],\n  \"line\": [next_item_line],\n  \"content\": [next_item_content]\n}\n\\`\\`\\`\n\nOR\n\n\\`\\`\\`json\n{\n  \"type\": \"mission_complete\"\n}\n\\`\\`\\`\n\nThe cleanup-evaluator subagent SHALL NEVER know if it is the last time to evaluate until the [next_action] of a spawned cleanup-evaluator turns out to be \\`mission_complete\\`.\n\n### MANDATORY: ALWAYS TRANSFER [incomplete_items], [completed_items], [postponed_items] FROM THE CLEANUP-EVALUATOR'S RESPONSE TO THE NEXT SUBAGENT\n\nYOU MUST transfer the [incomplete_items], [completed_items], [postponed_items] from the cleanup-evaluator's response to the next subagent with the JSON object of the following format:\n\n\\`\\`\\`json\n{\n  \"incomplete_items\": [incomplete_item_list],\n  \"completed_items\": [completed_item_list],\n  \"postponed_items\": [postponed_item_list],\n}\n\\`\\`\\`\n`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `此时协议允许 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `main agent`), ` 拉起 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup-executor`), ` 来执行下一条 TODO/FIXME。不过我们还需要告诉 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `main agent`), ` 如何处理 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `cleanup-evaluator`), ` 之外的 subagent 的反馈：`), React.createElement(MDXTag, {\n      name: \"pre\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"code\",\n      components: components,\n      parentName: \"pre\",\n      props: {\n        \"className\": \"language-markdown\",\n        \"metastring\": \"path=cleanup.md\",\n        \"path\": \"cleanup.md\"\n      }\n    }, `## MANDATORY: 4. UNDERSTAND THE RESPONSE FROM OTHER SUBAGENTS\n\nAll the subagents other than the cleanup-evaluator subagent SHALL ALWAYS respond with a JSON object of the following format:\n\n\\`\\`\\`json\n{\n  \"incomplete_items\": [next_incomplete_item_list],\n  \"completed_items\": [next_completed_item_list],\n  \"postponed_items\": [next_postponed_item_list],\n  \"next_action\": \"spawn(cleanup-evaluator)\",\n}\n\\`\\`\\`\n\n### MANDATORY: ALWAYS READ Subagent’s Response to Decide Next Action\n\nThe [next_action] is ALWAYS to spawn a cleanup-evaluator subagent.\n\nYou MUST SEND the cleanup-evaluator a JSON object of the following format:\n\n\\`\\`\\`json\n{\n  \"incomplete_items\": [next_incomplete_item_list],\n  \"completed_items\": [next_completed_item_list],\n  \"postponed_items\": [next_postponed_item_list],\n}\n\\`\\`\\`\n`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `最后，让 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `main agent`), ` 知道何时应该收尾：`), React.createElement(MDXTag, {\n      name: \"pre\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"code\",\n      components: components,\n      parentName: \"pre\",\n      props: {\n        \"className\": \"language-markdown\",\n        \"metastring\": \"path=cleanup.md\",\n        \"path\": \"cleanup.md\"\n      }\n    }, `## MANDATORY: 5. HANDLING MISSION COMPLETE\n\nIf \\`next_action\\` in the response from the cleanup-evaluator subagent is \\`mission_complete\\`, then the mission is completed.\n\nYou SHALL STOP ALL THE SUBAGENTS AND EXIT THE WORKFLOW.\n`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `到这里，我们已经用整套协议驱动的提示词搭好了第一个 agent 循环。`), React.createElement(MDXTag, {\n      name: \"h2\",\n      components: components\n    }, `试一试`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `当你把这个循环跑在 llama.cpp 项目上时，会发生以下情况：循环会精确处理 10 条 TODO 和 FIXME 后结束——无需宏大目标，只需一次专注的清理循环，就能让核心机制完整跑通。`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"figure\",\n      components: components,\n      parentName: \"p\"\n    }, `\n    `, React.createElement(MDXTag, {\n      name: \"a\",\n      components: components,\n      parentName: \"figure\",\n      props: {\n        \"href\": \"/static/7299c9ce23f6adc2afc97b25a740b51f/0a362/try-with-claude-code.webp\"\n      }\n    }, React.createElement(MDXTag, {\n      name: \"picture\",\n      components: components,\n      parentName: \"a\"\n    }, `\n  `, React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/7299c9ce23f6adc2afc97b25a740b51f/0cc25/try-with-claude-code.png\",\n        \"srcSet\": [\"/static/7299c9ce23f6adc2afc97b25a740b51f/5116e/try-with-claude-code.png 178w\", \"/static/7299c9ce23f6adc2afc97b25a740b51f/92f55/try-with-claude-code.png 356w\", \"/static/7299c9ce23f6adc2afc97b25a740b51f/0cc25/try-with-claude-code.png 712w\", \"/static/7299c9ce23f6adc2afc97b25a740b51f/7ae06/try-with-claude-code.png 1068w\", \"/static/7299c9ce23f6adc2afc97b25a740b51f/eee47/try-with-claude-code.png 1424w\", \"/static/7299c9ce23f6adc2afc97b25a740b51f/38407/try-with-claude-code.png 2136w\", \"/static/7299c9ce23f6adc2afc97b25a740b51f/82750/try-with-claude-code.png 2566w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), React.createElement(MDXTag, {\n      name: \"source\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/7299c9ce23f6adc2afc97b25a740b51f/690c8/try-with-claude-code.webp\",\n        \"srcSet\": [\"/static/7299c9ce23f6adc2afc97b25a740b51f/25c8a/try-with-claude-code.webp 178w\", \"/static/7299c9ce23f6adc2afc97b25a740b51f/60698/try-with-claude-code.webp 356w\", \"/static/7299c9ce23f6adc2afc97b25a740b51f/690c8/try-with-claude-code.webp 712w\", \"/static/7299c9ce23f6adc2afc97b25a740b51f/d7e52/try-with-claude-code.webp 1068w\", \"/static/7299c9ce23f6adc2afc97b25a740b51f/456ef/try-with-claude-code.webp 1424w\", \"/static/7299c9ce23f6adc2afc97b25a740b51f/2a654/try-with-claude-code.webp 2136w\", \"/static/7299c9ce23f6adc2afc97b25a740b51f/0a362/try-with-claude-code.webp 2566w\"],\n        \"sizes\": \"(max-width: 712px) 100vw, 712px\"\n      }\n    }), `\n  `, React.createElement(MDXTag, {\n      name: \"img\",\n      components: components,\n      parentName: \"picture\",\n      props: {\n        \"src\": \"/static/7299c9ce23f6adc2afc97b25a740b51f/0a362/try-with-claude-code.webp\",\n        \"alt\": \"试一试\",\n        \"title\": \"试一试\",\n        \"width\": 712,\n        \"height\": 787,\n        \"loading\": \"lazy\"\n      }\n    }))), `\n    `, React.createElement(MDXTag, {\n      name: \"figcaption\",\n      components: components,\n      parentName: \"figure\"\n    }, `\n        `, React.createElement(MDXTag, {\n      name: \"span\",\n      components: components,\n      parentName: \"figcaption\"\n    }, `\n            试一试\n        `), `\n    `))), React.createElement(MDXTag, {\n      name: \"h2\",\n      components: components\n    }, `让循环 7x24 运作`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `要让循环全天候运行，重点是持续供给“饲料”，而不仅仅是持续时间。循环靠把 A 持续变成 B 活下去：把一种产出不断转换成另一种。假如 A 是点子、B 是程序（或修复、测试、发布），那么想要 7x24 地运转，就需要源源不断的点子。`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `现实里，我们不可能拥有无限点子。更实际的做法是：让循环承担足够大、值得托付的工作，为你腾出思考时间。当 agent 在完成 A→B（例如编译、测试、打包、部署）时，你就能利用空档决定下一个 A。像 TODO/FIXME 扫描器或 issue 跟踪器这样的“饲料器”可以提供候选项，但无法代替你的判断。循环负责落实有意义的任务，你负责策展输入，这就是维持 7x24 节奏的正确姿势。`), React.createElement(MDXTag, {\n      name: \"h2\",\n      components: components\n    }, `不止 Claude Code`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `你也许会问：如果我不用 Claude Code，而是用 Codex 呢？答案很简单：流程不变。这个循环和 agent 厂商无关，它只靠三样东西：协议、循环、agent runtime。换句话说，evaluator 决定下一步，executor 负责执行，main agent 负责路由和护栏，其余都是实现细节。`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `Claude Code 的优势在于提供了两个顺手的原语：`), React.createElement(MDXTag, {\n      name: \"ul\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"li\",\n      components: components,\n      parentName: \"ul\"\n    }, `Subagent：带有提示词和角色的轻量 agent 实例。`), React.createElement(MDXTag, {\n      name: \"li\",\n      components: components,\n      parentName: \"ul\"\n    }, `Custom command：触手可及的携带提示词和工具调用的命令块。`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `但它们都不是必需的。你可以替换成：`), React.createElement(MDXTag, {\n      name: \"ul\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"li\",\n      components: components,\n      parentName: \"ul\"\n    }, `用工具调用拉起其他 AI agent 用取代 subagent（例如执行 CLI，启动新的 agent 并返回结构化结果）；`), React.createElement(MDXTag, {\n      name: \"li\",\n      components: components,\n      parentName: \"ul\"\n    }, `用 shell 脚本向 AI agent 发送自定义提示词，取代 custom command。`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `只要协议和循环仍在，执行机制就能自由互换。Main agent 负责路由、约束模式，并让循环持续运转，直到 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `next_action`), ` 变成 `, React.createElement(MDXTag, {\n      name: \"inlineCode\",\n      components: components,\n      parentName: \"p\"\n    }, `mission_complete`), `。`), React.createElement(MDXTag, {\n      name: \"h2\",\n      components: components\n    }, `对比 LangChain 与 LangGraph`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `你可能还在想：为什么不用 LangChain 或 LangGraph？下面这张表能更清楚地说明取舍。`), React.createElement(MDXTag, {\n      name: \"table\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"thead\",\n      components: components,\n      parentName: \"table\"\n    }, React.createElement(MDXTag, {\n      name: \"tr\",\n      components: components,\n      parentName: \"thead\"\n    }, React.createElement(MDXTag, {\n      name: \"th\",\n      components: components,\n      parentName: \"tr\",\n      props: {\n        \"align\": null\n      }\n    }, `考虑点`), React.createElement(MDXTag, {\n      name: \"th\",\n      components: components,\n      parentName: \"tr\",\n      props: {\n        \"align\": null\n      }\n    }, `Agent Runtime`), React.createElement(MDXTag, {\n      name: \"th\",\n      components: components,\n      parentName: \"tr\",\n      props: {\n        \"align\": null\n      }\n    }, `LangChain 或者 LangGraph`))), React.createElement(MDXTag, {\n      name: \"tbody\",\n      components: components,\n      parentName: \"table\"\n    }, React.createElement(MDXTag, {\n      name: \"tr\",\n      components: components,\n      parentName: \"tbody\"\n    }, React.createElement(MDXTag, {\n      name: \"td\",\n      components: components,\n      parentName: \"tr\",\n      props: {\n        \"align\": null\n      }\n    }, `要求`), React.createElement(MDXTag, {\n      name: \"td\",\n      components: components,\n      parentName: \"tr\",\n      props: {\n        \"align\": null\n      }\n    }, `合适的模型`), React.createElement(MDXTag, {\n      name: \"td\",\n      components: components,\n      parentName: \"tr\",\n      props: {\n        \"align\": null\n      }\n    }, `SDK + 工具 + 记忆抽象层`)), React.createElement(MDXTag, {\n      name: \"tr\",\n      components: components,\n      parentName: \"tbody\"\n    }, React.createElement(MDXTag, {\n      name: \"td\",\n      components: components,\n      parentName: \"tr\",\n      props: {\n        \"align\": null\n      }\n    }, `配置`), React.createElement(MDXTag, {\n      name: \"td\",\n      components: components,\n      parentName: \"tr\",\n      props: {\n        \"align\": null\n      }\n    }, `提示词`), React.createElement(MDXTag, {\n      name: \"td\",\n      components: components,\n      parentName: \"tr\",\n      props: {\n        \"align\": null\n      }\n    }, `链或者图`)), React.createElement(MDXTag, {\n      name: \"tr\",\n      components: components,\n      parentName: \"tbody\"\n    }, React.createElement(MDXTag, {\n      name: \"td\",\n      components: components,\n      parentName: \"tr\",\n      props: {\n        \"align\": null\n      }\n    }, `工具调用`), React.createElement(MDXTag, {\n      name: \"td\",\n      components: components,\n      parentName: \"tr\",\n      props: {\n        \"align\": null\n      }\n    }, `通过提示词调用`), React.createElement(MDXTag, {\n      name: \"td\",\n      components: components,\n      parentName: \"tr\",\n      props: {\n        \"align\": null\n      }\n    }, `通过提示词及系统级适配层`)))), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `这张对比表呈现了本文所述 `, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `agent runtime`), ` 路线，与 LangChain 或 LangGraph 框架之间的差异：搭建循环需要什么、如何搭建、以及如何进行工具调用。`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `从表格可见，`, React.createElement(MDXTag, {\n      name: \"strong\",\n      components: components,\n      parentName: \"p\"\n    }, `agent runtime`), ` 这条路线更轻量，依靠原生工具就能融入任意技术栈，同时保持对 agent 厂商的中立，让人掌控输入，而循环本身则可以 7x24 地产出成果。`), React.createElement(MDXTag, {\n      name: \"h2\",\n      components: components\n    }, `总结`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `要打造一个 7x24 的循环，你并不需要 LangChain 或 LangGraph。真正需要的是：`), React.createElement(MDXTag, {\n      name: \"ul\",\n      components: components\n    }, React.createElement(MDXTag, {\n      name: \"li\",\n      components: components,\n      parentName: \"ul\"\n    }, `一个在 agent 任务上经过训练的模型；`), React.createElement(MDXTag, {\n      name: \"li\",\n      components: components,\n      parentName: \"ul\"\n    }, `由提示词严格执行的协议；`), React.createElement(MDXTag, {\n      name: \"li\",\n      components: components,\n      parentName: \"ul\"\n    }, `支持工具调用的 agent runtime。`)), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `具备这些条件，就能让 Claude Code（或 Codex）在循环里持续工作，即便你已经入睡。`), React.createElement(MDXTag, {\n      name: \"p\",\n      components: components\n    }, `今晚就动手试试看吧。明早醒来，也许成果已经在等你。`), React.createElement(MDXTag, {\n      name: \"div\",\n      components: components,\n      props: {\n        \"className\": \"footnotes\"\n      }\n    }, React.createElement(MDXTag, {\n      name: \"hr\",\n      components: components,\n      parentName: \"div\"\n    }), React.createElement(MDXTag, {\n      name: \"ol\",\n      components: components,\n      parentName: \"div\"\n    }, React.createElement(MDXTag, {\n      name: \"li\",\n      components: components,\n      parentName: \"ol\",\n      props: {\n        \"id\": \"fn-1\"\n      }\n    }, React.createElement(MDXTag, {\n      name: \"a\",\n      components: components,\n      parentName: \"li\",\n      props: {\n        \"href\": \"https://github.com/WeZZard/agentic-loop-playground.git\"\n      }\n    }, `https://github.com/WeZZard/agentic-loop-playground`), React.createElement(MDXTag, {\n      name: \"a\",\n      components: components,\n      parentName: \"li\",\n      props: {\n        \"href\": \"#fnref-1\",\n        \"className\": \"footnote-backref\"\n      }\n    }, `↩`)))));\n  }\n\n}\nMDXContent.isMDXComponent = true;","scope":""},"headings":[{"value":"幕后的秘密","depth":2},{"value":"Agent 循环的本质","depth":2},{"value":"写下你的第一份协议驱动提示词","depth":2},{"value":"循环结构","depth":3},{"value":"协议长什么样","depth":3},{"value":"通过工具收集 TODO/FIXME","depth":3},{"value":"用提示词强制贯彻协议","depth":3},{"value":"试一试","depth":2},{"value":"让循环 7x24 运作","depth":2},{"value":"不止 Claude Code","depth":2},{"value":"对比 LangChain 与 LangGraph","depth":2},{"value":"总结","depth":2}]}}},"earlierPostExcerpt":{"slug":"/post/2025/03/when-the-swift-compiler-deleted-code-in-stdlib-9067","title":"当 Swift 编译器删除了标准库中的代码 - 记修复 Swift 6 中的冗余 Load 指令消除优化器","subtitle":"","createdTime":"2025-03-09T00:00:00.000Z","tags":["Swift","Compiler"],"category":"Programming","file":{"childMdx":{"excerpt":"最新更新：苹果已接受该问题的修复。最终解决方案在相关代码所有者 review 后进行了调整。 蛇年春节假期前，一位同事向我展示了一个由 use-after-free（释放后使用）错误导致的神秘崩溃。最近，我有时间深入研究这个问题，并发现崩溃是由 Swift 编译器的错误编译引起的。下面是最小复现代码，必须使用  -Osize  优化级别编译。我们可以通过在编译过程中启用地址检查器（address sanitizer）来检测 use-after-free 问题。 有趣的是，将  AutoreleasingUnsafeMutablePointer…"}}},"laterPostExcerpt":null},"pageContext":{"postId":"fc91b6bc-17af-54a8-9f29-dc69f93daae6","earlierPostId":"46abd102-d678-5362-9d51-00ffd4a02f90","laterPostId":null}}