系统提示词:跨厂商规律分析 & 提示词设计原理 从 100+ 份泄露/公开系统提示词中提炼固定模式,并以 Claude Code (Opus 4.8) 为案例,拆解 Prompt / Context / Harness / Loop 四层工程
§0摘要 & 量化锚点
系统提示词远非自由写作,而是高度模板化的工程产物。规律呈三层:通用骨架 → 厂商方言 → 编码 Agent 趋同。
You are 开头
94含 Current date
92含 knowledge cutoff
150含 IMPORTANT
149含 markdown 规则
60created by Anthropic
下面这些共性并非平级——它们分属四个工程层。读完 §五后,🔗 化石层一节会用带日期的引用证明:把这些提示词按年代排开,横向共性会自己长成纵向的四层演化。
一、通用骨架:所有聊天类提示词共享的固定序列
[身份声明] → [时间/知识截止] → [能力与工具] → [语气/格式/长度契约] → [安全/拒绝规则] → [场景特例/策略]
身份句是最硬的固定模式:"X by Y"
| 厂商 | 身份句 | 出处 |
|---|---|---|
| OpenAI | You are ChatGPT, a large language model trained by OpenAI. | gpt-5.5-thinking.md:3 |
You are Gemini. You are a helpful assistant. | gemini-3.1-pro.md:1 | |
| xAI | You are Grok, built by xAI. | grok-4.3-beta.md:1 |
| Mistral | … built by Mistral and power a chatbot named Le Chat. | le-chat.md:1 |
| Meta | You are Meta AI. You are powered by Muse Spark … | meta-ai.md:4 |
| Cursor | You are an AI coding assistant, powered by {model_name}. | cursor.md:1 |
| Anthropic | 唯一用第三人称 "Claude",不用 "You are" | 见 §2 |
全库统计:"X by Y" 句式反复出现——created by Anthropic 60 次、trained by OpenAI 26 次、built by xAI 5 次。"You are <名字>, <动词> by <公司>" 是跨厂商通用身份模板。
知识截止字段:位置固定,但维护策略暴露工程习惯
Knowledge cutoff 长期冻结在 2024-06——全库 OpenAI 目录中出现 22 次,直到近期才迁移到 2025-08(6 次)。同一字段跨大量版本不更新,说明是硬编码常量;而 Anthropic 每版本都换新,并配固定模板句 "…answers the way a highly informed individual … would"(claude-opus-4.8.md:213)。
<system-reminder> 在静态正文之前注入(前缀可缓存);而 gpt-4o:3、gemini-3.1-pro:3-4、le-chat:1 都把日期/位置写在绝对开头(每天变一次就击穿整段缓存),Grok 则干脆不放。同一个"当前日期"字段,六家六种放法——完整对照见 §5 审计的日期光谱表。这条把"字段维护习惯"的观察,深化成了一条缓存感知的跨厂商设计分歧。
二、厂商"方言签名":一眼认出是谁写的
| 厂商 | 人称 | 标志性写法 |
|---|---|---|
| Anthropic | 第三人称 "Claude" | 全篇 XML 标签分块:<refusal_handling> <user_wellbeing> <evenhandedness> <knowledge_cutoff>(各 37 次),<example> 265 次;用大写 IMPORTANT 提权 |
| OpenAI | 第二人称 "You are" | 固定三行头 + TypeScript 式工具声明 type search = (_:{…}) => any;;区分 analysis / commentary 通道;5.1 起模块化人格插件(§5 证实为 OpenAI 独有:三个人格文件逐字同构、正文留 {{personality}} 占位符;Claude 全文无人格模块,用条件式 <preferences_info> 替代) |
| "You are Gemini" | 极简身份 + 运行时注入 Current time+地理位置;倾向 JSON widget 富组件 | |
| xAI | "built by xAI" | 4.2 给 AI 安排"队友名字"(Harper/Benjamin/Lucas);X 平台专用搜索工具;明确放开成人内容 |
引用格式:各成一派(反证未互相复制)
| 厂商 | 引用格式 |
|---|---|
| Perplexity | 内联 markdown 链接,自然嵌入正文 |
| Meta | 【url_id†L{line}】 / 【post-{id}】 |
| Grok | render_inline_citation 富组件 |
| Mistral | web_search/news_search + 禁 "latest" 要求明确日期区间 |
三、编码 Agent 的"行业趋同"(最强规律)
Claude Code、Codex、Cursor、Gemini CLI、Copilot CLI、Amp、Warp 在核心行为契约上近乎逐字一致——指向共同设计谱系与相互借鉴:
git reset --hard or git checkout -- unless the user has clearly asked for that operationgit reset --hard or git checkout -- unless specifically requested or approved by the usergit reset --hard / git checkout -- 列为需显式授权。这种巧合概率极低。
其他近乎逐字收敛的条目:
- 持续到完成:
Persist until the task is fully handled end-to-end…(amp-code.md:58, 251, 341;Codex 同) - 先读后改:
You MUST use the Read tool at least once before editing.(cursor.md:42)/You must Read the file … before editing(claude-code-opus-4.8.md:471) - 不主动提交:
Commit or push only when the user asks.(claude-code-opus-4.8.md:434)/Do not stage or commit changes unless specifically requested(gemini-cli.md:7) - 完成前必须验证、并行工具调用、注释极简(只解释非显然意图)、
file:line引用
① 有真分歧(同机制、相反姿态):
Hook 输出的信任级别——Claude Code 提到"用户级反馈"(:127),Gemini CLI 却降级为只读、"与系统指令冲突时以系统指令为准"(:128-133);完成验证门——Gemini CLI "验证是完成的唯一路径"(:147),Warp 却把 lint/test 设为可选(:95)。可见 Harness 设计是各家的选择,不是铁板一块的标准。② 有新趋同(本报告首次并列):上下文压缩三厂同构——Claude Code “don't need to wrap up early”(
:177)/Codex “Do not restart from scratch”(:92)/Amp “continue from the summary; don't restart”(:237)。→ 详见 §5 矩阵
四、差异点:安全立场的分化
Grok 明确放开成人内容(仅对未成年内容坚决拒绝,:14);而 Anthropic / OpenAI / Meta / Google 立场更严——Meta 细分"创作/学术 vs 操作性伤害",Google 设"绝对覆盖"的安全拒绝层。自我保护条款(不泄露系统提示)广泛存在——Anthropic 用专门的 <respond_without_citing_system_prompt>(claude-opus-4.8.md:81)。
五、随版本演化的规律(3.7 → 4.x → 5)
- 膨胀:Anthropic 4.5+ 新增数百行
<memory_system>;OpenAI 工具命名空间从 4o 约 6 个增至 5.5 的 14+ - 人格模块化:OpenAI 5.1 起把人格拆成独立文件(friendly/cynical/nerdy…),结构统一
- 安全细化:儿童安全、双用途能力等块越写越长、越结构化
- 上下文/循环机制从无到有:记忆系统、延迟加载、压缩、自我调度依次进入提示词——这不是零散的"膨胀",而是 Prompt→Context→Harness→Loop 四层在文本里按地层顺序沉积(下一节 🔗 化石层用带日期的引用坐实这条箭头)
🔗 承上启下 · 这个仓库就是四层进化的"化石层"
第一部分是横切面(一个时刻、几十家厂商的共性),接下来的第二部分是纵切线(单一谱系的四层演化箭头)。两者看似两张皮——但只要把仓库里带日期的提示词按年代排开,横切面自己就长成了纵切线。这一节用仓库自身的编年证据把二者缝合,所有引用均经独立核验。
把 Anthropic/Official/ 按文件名日期排开,箭头自己浮现:2024-07-12-claude-haiku-3.md(756 字节、13 行,纯身份声明+含蓄的自我披露边界)是 Prompt 层的标本;到 claude-opus-4.6.md 长出 <memory_system> 块(:182)与 tool_search 延迟加载(:87),静态知识截止变成运行时上下文,这是 Context 层;claude-code-opus-4.8.md:126"Tools run behind a user-selected permission mode… don't retry verbatim"把执行权从 Model 交给 Harness,这是 Harness 层;loop.md:9"self-pace… via ScheduleWakeup — no cron"与 deferred-tools.md:592 的 <<autonomous-loop-dynamic>> 哨兵让人退出循环,这是 Loop 层。关键是叠加而非替代:4.8 的身份声明仍是 haiku-3 那一句的直系后代,记忆与权限只是往其上加了新地层。
四层地层剖面(标志化石 · 经核验引用)
| 地层(年代) | 该层"标志化石" | 经核验的实证引用 | 核验 |
|---|---|---|---|
| ① Prompt 2024-07 |
身份 + 能力 + 含蓄边界;13 行 / 756 字节;无记忆/工具/循环 | Official/2024-07-12-claude-haiku-3.md:13 — "It does not mention this information about itself unless … directly pertinent to the human's query" | partial |
| ② Context 2025-05→2026-01 |
<memory_system> 块 + tool_search 延迟加载 schema;知识截止变运行时上下文 |
claude-opus-4.6.md:182(memory_system)·:87(tool_search JIT)·claude-opus-4.8.md:203 "The visible tool list is partial; many tools … are deferred and loaded via tool_search" ·对照基线 2024-07-12-claude-opus-3.md 仅有静态知识截止散文 | solid |
| ③ Harness 2026 |
权限模式 + hooks 拦截 + 提交门;执行权归 Harness | claude-code-opus-4.8.md:126(permission mode)·:127(hooks 注入)·:434(commit gate) | solid |
| ④ Loop 2026 |
自我调度 + 事件驱动唤醒 + 预算/熔断 + maker/verifier | loop.md:9"self-pace … — no cron"·:14(Monitor 事件唤醒)·deferred-tools.md:592(<<autonomous-loop-dynamic>> 哨兵)·code-opus-4.8.md:833-841(loop-until-budget)·:865-871(对抗式验证多数决) |
solid |
Harness 层最能证明这点:同一时期,四个厂商各自独立长出"破坏性 git 需显式授权"的相同约束——Cursor/cursor.md:310「NEVER run destructive/irreversible git commands unless explicitly requested. NEVER skip hooks」·Google/gemini-cli.md:218「NEVER stage or commit … unless explicitly instructed;"Wrap up this PR" → do not commit」·OpenAI/Codex/gpt-5.5.md:69「Never use destructive commands like git reset --hard … ask for approval first」。同层同构 ⇒ 是被同一组约束逼出来的收敛解,不是互相抄的风格。这正好把第一部分 §三 的"编码 Agent 趋同"接到了纵切线上。
标志化石的"层位首现"(0 → 全现)
把几个标准化机制当作地层学里的"标志化石",在最早(2024)与最新(2026)提示词里做在场检测——它们整齐地缺席于早期、齐现于晚期,且出现顺序正对应四层:
| 标志化石(机制) | 归属层 | 2024 早期提示词 | 2026 最新提示词 |
|---|---|---|---|
memory_system / knowledge_cutoff 块 | ② Context | 缺席 | 出现 |
permission mode / sandbox | ③ Harness | 缺席 | 出现 |
Workflow / subagent / run_in_background | ④ Loop | 缺席 | 出现 |
检测方式:grep -il 在 2024-07-12-claude-sonnet-3.5、gpt-4o.md 等早期文件 vs claude-opus-4.8.md、claude-code-opus-4.8.md。七个机制词早期命中数全为 0、最新全为正。
我用一个多智能体工作流专门去证伪这条化石链,它确实抓出了四处该说清的边界——不藏起来,因为承认接缝正是"融合"与"拼凑"的区别:
- Prompt 层证据最弱(判定 partial):Anthropic 的
haiku-3标本很干净(纯身份+边界),但我拿 OpenAIgpt-5.1人格文件做对照时反噬了——它们第 1 行的人设里已内嵌输出规则("DO NOT automatically write … artifacts"),与"Prompt 层=最纯最简"的整齐叙事矛盾。这一层的干净叙事被削弱。 - 时间上不是严格串行的地质层:Context(4.6)与 Harness/Loop(code-4.8)日期高度接近甚至并行——是叠覆沉积而非纯顺序沉积,"一层层"有交叠区。
- 跨厂商年代锚点不对等:Anthropic 侧有严格日期文件名,OpenAI 侧(gpt-5.1)缺精确日期,横切面的年代对齐部分是推断而非直接证据。
- 完整四箭头主要靠 Anthropic 单一目录支撑:其余三家只在 Harness/Loop 两层提供了共性证据,尚缺它们各自的 Prompt→Context 早期切片来独立复现全部四层。
结论:化石链"大体成立"(mostly)——Context/Harness/Loop 三层证据扎实,Prompt 层与跨厂商全复现是弱项。带着这份边界感往下读第二部分,才不至于把一个有用的框架当成铁律。
下面第二部分,就沿着这条已被实证的箭头,钻进最新地层(Loop 层)的一份完整标本——Claude Code (Opus 4.8)——看四层在一份真实提示词里如何咬合。
§1深度案例:为何选 Claude Code (Opus 4.8)
要讲"提示词设计原理",最好的样本是一份把四个工程层面都显式写进文本的提示词。Claude Code 正是如此——它不只是"人格设定",而是一台用自然语言编程的智能体运行时。
大多数聊天提示词只覆盖"身份 + 语气 + 安全"。而 Claude Code 的提示词额外包含:一套持久化记忆系统、一个延迟加载的工具目录、权限/钩子协议、子智能体编排、以及自我调度与后台循环。这让它成为观察下面四层的完美切片。
You are Claude Code, Anthropic's official CLI for Claude.(claude-code-opus-4.8.md:119)——切换到第二人称。人称本身就是一个工程选择:Agent 语境下"你就是执行者"比"Claude 会做…"更能压实指令。
§2四层工程模型
把一个 LLM 变成可靠产品,需要围绕模型搭四层同心壳。它们的边界常被混为一谈,但职责截然不同:
① Prompt Engineering
如何措辞单条指令,让模型稳定照做:人称、正/负约束、给出理由、优先级标记、"原则 > 枚举"。
② Context Engineering
决定哪些信息进入上下文窗口、以什么结构、何时进出:记忆、延迟加载、压缩、信息信道分层、缓存前缀稳定性。
③ Harness Engineering
模型之外的运行时脚手架:工具集、权限模式、钩子、沙箱、子智能体——把"能做什么"约束成安全操作。
④ Loop Engineering
控制多轮智能体循环:何时停、何时继续、后台/恢复、自我调度、确定性编排、预算与熔断。
本报告独立得出的四层模型,与业界一篇综述的主线完全重合——该文把 AI 开发范式的演进概括为一条"进化史":
并给出一个关键判断:四者不是替代,而是层层向外包裹的嵌套结构——
Prompt 定义单指令的理解基础;Context 供给该指令所需的动态信息;Harness 是每步执行的系统围栏;Loop 在最外层调度 Harness、驱动状态机不断迁移。该文用三句话点题,宣告"人类从 Agent 循环的内部走向外部,从执行者变成设计者":
I really like the term 'context engineering' over prompt engineering.Tobi Lütke, Shopify CEO
You shouldn't be prompting coding agents anymore. You should be designing loops that prompt your agents.Peter Steinberger, OpenClaw
I don't prompt Claude anymore. I have loops running. My job is to write loops.Boris Cherny, Claude Code
下面在每一层补入该文的具体机制,并对照 Claude Code 提示词里的落地证据——理论与实现互为印证。
①Prompt Engineering — 措辞的工程
这一层管的是单条指令怎么写才稳。Claude Code 里有几个可直接复用的手法:
1. 负约束 + 内嵌理由,而非裸命令
没有只写"不要重试",而是先解释语义(拒绝=用户主动否决),再给行为(调整而非原样重试)。模型对"带因果的指令"泛化得更好——它能推广到提示里没枚举的相似情形。
2. 原则 > 枚举清单
与其列"用 2 空格、驼峰命名、行宽 80…",不如给一条可自适应任何代码库的元原则。这也是所有编码 Agent 都写 follow existing conventions 而非硬编码风格的原因(§0.三)。
3. 忠实报告——对抗谄媚与幻觉
这条同时压制两种失败模式:过度乐观(谎称成功)和过度对冲(该肯定时含糊)。它把"诚实"操作化成可执行的三个具体动作,而不是抽象美德。
4. 优先级信号:IMPORTANT / BLOCKING / NEVER
Transformer 对显式的强度词与大写敏感。全库 150 个文件用 IMPORTANT 绝非偶然——它是一种廉价的注意力再分配手段。但用多了会通胀失效,所以 Claude Code 只在少数真正不可让步处使用。
「先读后改(否则编辑会失败,因为 old_string 需精确匹配当前磁盘内容)」——理由让模型自己推断出你没写的边界。
综述强调:正确的 Prompt Engineering 不是凭手感换词,而是一套方法论——定义问题 → demonstration set → 候选 prompt → 实测准确率 → 成本/精度权衡 → 迭代;与之相对的是缺乏测试、对原理一知半解的 Blind Prompting(盲提示)。
更进一步,DSPy / APE 等声明式框架让开发者不再手写指令字符串,而是声明输入输出签名,交给优化器自动搜索最优 Prompt + Few-shot 组合——Prompt 第一次从"人工手写"变成"可编译、可学习的程序"。换底座模型(GPT-4→Llama)只需一键重编译。
为什么必须往上走一层:纯 Prompt 的天花板是——窗口装不下海量上下文、无记忆/工具无法多步、容错极低需人工纠错,以及最致命的"技术债":规模稍大就要维护成百上千条模板,模型一升级就集体失效甚至反向退化。这正是范式滑向 Context 层的直接动因。
②Context Engineering — 上下文窗口的工程
上下文窗口是稀缺、且注意力不均匀的资源。这一层的全部艺术是:只让该在的信息在,且放在模型看得见的位置。Claude Code 有四招教科书级操作。
1. 信息信道分层:<system-reminder> 是独立信任级
<system-reminder> tags in messages and tool results are injected by the harness, not the user. Hooks may intercept tool calls; treat hook output as user feedback.同一段文本流里,模型被教会区分三种来源:用户说的、harness 注入的、钩子返回的。这解决了 prompt injection 的一个核心难题——让模型知道哪些"指令"其实不是用户的意图。记忆召回也走这个信道,并明确标注"是背景、非用户指令"。
2. 外部化状态:文件系统即长期记忆
MEMORY.md … the index loaded into context each session — one line per memory.上下文窗口装不下一切,于是把长期知识搬到窗口之外的磁盘,只在窗口里常驻一个轻量索引(MEMORY.md 每条一行)。需要时再按需读全文。这是典型的分级存储思想(窗口=L1 缓存,磁盘=主存)。
Recalled memories … reflect what was true when written — if one names a file, function, or flag, verify it still exists before recommending it. 记忆是"曾经为真"的快照,提示词显式要求用前先验证,避免把过期事实当现状。
3. 延迟加载工具:ToolSearch —— 最精妙的一招
Claude Code 可用工具有几十上百个(本会话就有 CronCreate、computer-use、pdf、chrome 等一大批)。若把所有工具的完整 JSON Schema 都塞进系统提示,将吃掉巨量 token 且淹没注意力。解法:默认只放工具名清单,schema 按需通过 ToolSearch 拉取。
// 系统提示里只有名字(几乎零成本):
CronCreate WebFetch mcp__claude-in-chrome__navigate …
// 真要用时才加载 schema:
ToolSearch("select:WebFetch") → 返回完整参数定义 → 之后即可调用
这把"工具目录规模"与"上下文成本"解耦——工具再多,常驻开销也只随名字数线性增长。是大型 Agent 能挂载海量工具的关键前提。
4. 压缩即一等公民:Context management
长对话必然溢出窗口。与其让模型"感到时间紧迫而草草收尾",不如明确告知压缩机制存在,从而解除它的"结束焦虑"。这是把一个 harness 事实(自动摘要)写进提示,用来校准模型的行为预期。
综述把"信息怎么喂"拆成三套方法论,和我们上面讲的招数一一对应:
- MVC 轻量装配(Minimum Viable Context):只组合最必需的目标+检索+当前工具定义,严控体积。
- GraphRAG:用实体关系网络取代纯向量相似度,把"段落检索"升级为"语义关联",解决多跳推理与可解释性。
- Just-in-Time 检索:初期只留轻量引用(路径/ID),运行时才按需加载——↔ 正是我们讲的 ToolSearch 延迟加载 + Anthropic Skills "先暴露名称、按需展开"
装配不当会陷入三种典型故障:信息匮乏(Starvation→幻觉)/信息过载(Overflow→稀释注意力)/上下文腐烂(Rot→越填越满、质量反向退化)。
这背后是提示词缓存(KV Cache):模型缓存已算完的上下文前缀,下次请求前缀完全一致就能跳过最耗时的 Prefill,命中缓存——成本约降 90%、延迟最高降 85%。
但它遵循前缀匹配不变性的铁律:缓存按字节从头哈希,前缀里哪怕改一个空格,该位置往后的缓存全部瞬间失效,退回全额计费的冷启动。于是必须"从静到动"分层排列:
这带来一个反直觉设计:"当前日期""当前用户"这类动态变量,绝不能塞进开头的 system prompt(否则击穿整段缓存),必须作为普通消息挂在对话流的最末尾。
理论如此,实现果然如此:本会话的 # currentDate(今天日期)不是写死在冻结的系统提示里,而是通过 <system-reminder> 作为对话流里的一条消息注入,还附一句 "this context may or may not be relevant"。Claude Code 把日期/环境等易变量全部走 reminder 信道——正是为了不污染可缓存的前缀。文章的理论 × Claude Code 的实现,严丝合缝。
⚠ 但这只对吃透缓存经济学的团队成立——§5 实证审计发现 OpenAI/Gemini/Mistral 恰恰把日期写在提示开头(违反此规则),Grok 干脆不放。文章把这条可缓存设计当成了普遍规范,其实是各家分歧的光谱。
缓存经济学:参考阿里云百炼隐式缓存计费——首次建缓存按输入价 100%,此后命中每次仅 20%。只要同一前缀被复用第 2 次(N>3)即产生净收益。高频 Agent 能以极低边际成本日夜运转,底气全在"前缀稳定 + 反复命中"。↔ 这条经济学正是 §④ 里 ScheduleWakeup"缓存 TTL 感知调度"的成本依据
③Harness Engineering — 运行时脚手架的工程
Harness 是模型之外的一切:工具、权限、钩子、沙箱、子智能体。提示词在这里的作用,是把"运行时能力"翻译成模型能安全使用的操作契约。
1. 权限模式 + 钩子:人类留在回路里
模型不能无条件执行任何工具——每次调用都经过权限层与可能的钩子拦截。提示词教模型把这些外部信号当作一等反馈,而非报错噪音。对"难以逆转/对外发布"的动作,还要求先确认(:131)。
2. 工具生态设计:把正确用法写进工具描述
cat, head, tail, sed, awk … Instead, use the appropriate dedicated tool.与其让模型用万能的 Bash 干一切,不如提供专用工具(Read/Grep/Glob/Edit)并在描述里主动劝退危险或低质的用法。专用工具能返回结构化结果、走权限 UI、被 harness 追踪状态——这些都是裸 shell 给不了的。
3. 状态不变量由 harness 强制,而非靠模型自觉
"先读后改"不是道德劝诫,而是硬约束:没读就编辑会直接失败。反过来,harness 追踪文件状态,于是提示词又劝阻多余的"改完再读一遍验证"——省 token。规则与运行时能力严丝合缝。
4. 子智能体:上下文隔离即架构手段
把"读 20 个文件找答案"派给子智能体,主线程只回收结论,不被文件原文污染。isolation:"worktree" 还能让并行改文件的 agent 互不冲突(:248)。这是用 harness 结构解决 Context 问题的典范——三层之间是协同的。
综述给出这一阶段的核心公式——Agent = Model + Harness,并断言:"如果你不是在做底层模型,你就是在做 Harness。"生产级 Harness 由四支柱构成:环境资产与工具集(Tools/Skills/MCP/文件系统/沙箱/无头浏览器)、控制与编排(子 Agent 派发、状态接力、模型路由)、规则中间件 Hooks(压缩、Lint、提交网关)、可观测性(Trace/Token/延迟计量)。
信任边界是层层防御:物理基础设施 → 安全沙箱 → Agent Harness → 运行时 → 模型。模型处在最核心也最不可信的位置,每个高风险动作都要经外围规则解析 + 沙箱隔离,最终受制于基础设施红线。↔ Claude Code:权限模式 + 钩子 + 沙箱(dangerouslyDisableSandbox 才越权)+ "难逆转动作先确认"
研发环境缺沙箱隔离、底层 AWS 未开删除保护,AI 编码工具机械执行了人类盲目授权的 terraform destroy。几秒内生产数据库、集群、备份被物理抹除,两届学生近 200 万行核心数据清零。文章的反思很关键:这不是"失控的 AI",而是 Harness 之failure——缺危险操作二次确认、缺基础设施刚性红线、缺 Human-in-the-Loop。
由此沉淀出八条"非妥协原则",多条能在 Claude Code 提示词里找到对应:
- Model proposes — Harness executes(模型只提议,Harness 才有执行权)
- Risk changes the process(按风险动态匹配 只读/草稿/外部写入 三档权限);Draft 与 Commit 分离(危险操作需人类显式确认)
- Long tasks have budgets(步数/时间/Token/成本四维卡死预算)↔ Workflow 的 budget 硬天花板
- Skills & Connectors 渐进式披露(先暴露名称、按需加载)↔ ToolSearch 延迟加载;Recurring failures become Harness features(偶发错误要沉淀为 Hook/校验器)
落到自动化 Code Review,就是 CodeRabbit 的由硬到软漏斗:Semgrep 确定性规则 → OPA 策略网关 → AI 审查 → 人类终审——约 80% 低级错误在最便宜的硬规则层拦下,15% 复杂逻辑给 AI,人类只审最核心的 5%。
当 Agent 线上表现不佳,第一反应不该是怪模型,而是排查 Harness 代码。Terminal Bench 2.0 证明:同一款原生模型、权重不变,仅改写 Harness 约束,Benchmark 排名就从第 30 名跃升至前五。换言之——模型"能做的事"与生产环境里"做成的事"之间的差距,几乎全由团队的 Harness 水平决定。
④Loop Engineering — 智能体循环的工程
一次 LLM 调用只是"一拍"。真正的 Agent 是多拍循环:思考→调工具→观察→再思考…直到收敛。这一层决定循环何时继续、何时停、如何跨轮存活。Claude Code 在这层的设计尤其惊艳。
1. 事件驱动 > 轮询:别浪费"一拍"
run_in_background runs the command detached: it keeps running across turns and re-invokes you when it exits. No & needed.后台任务完成会自动唤醒模型,所以提示词明令禁止"定时轮询"这种浪费 token 的反模式。循环的推进由事件触发,而非空转检查。
2. 缓存感知的自我调度——把成本模型写进提示
3. 确定性编排:Workflow 把控制流移出模型的"直觉"
当逻辑是"对 30 个文件各跑 3 阶段、多数票通过才保留"这类确定性控制流时,靠模型逐轮即兴既慢又易漂。Claude Code 提供一套可编程的编排原语,把 loop 从模型的自由发挥变成代码:
pipeline(items, stage1, stage2) // 每个 item 独立流水,阶段间无栅栏(默认)
parallel(thunks) // 栅栏:全部完成才返回(仅当需要汇总时)
// 内建控制流模式:
while (bugs.length < 10) { … } // loop-until-count
while (budget.remaining() > 50_000) { … } // loop-until-budget(硬预算天花板)
while (dry < 2) { …find→dedup→judge… } // loop-until-dry(连续 K 轮无新发现才停)
并且给出反模式判据(何时用栅栏、何时不用)与"对抗式验证/多视角评审/完备性批评"等高阶质量模式(:865–883)。这是把软件工程的并发/收敛思维直接编码进提示词。
4. 循环恢复与缓存复用
resumeFromRunId — the longest unchanged prefix of agent() calls returns cached results instantly … Same script + same args → 100% cache hit.长流程可中断/改脚本/续跑,未变的前缀秒回缓存。为此还约束脚本不得用 Date.now()/Math.random()(会破坏可复现的缓存键)——纯函数式的确定性要求,直接写进了提示。
5. 终止条件:主动防"兔子洞"
健康的循环必须有失败熔断。提示词给出具体阈值(2–3 次)和退出动作(停下、说明、问用户),防止模型在死路上无限打转。
综述把循环工程浓缩成一个公式——Loop = Cron + 决策器,并遵循"机制与策略分离":底层平台(Harness)提供定时器/工作区隔离等机制,架构师按业务配置触发时机/子 Agent 数量等策略,从而真正抽离于执行循环之外。文章的多处细节与我们上面对 Claude Code 的拆解直接呼应:
三档成熟度:Open Loop(模型自报 done,仅 Demo)→ Closed Loop(每轮强制过测试/Lint/Review,生产级)→ Review Loop(后台常驻异步审查 Agent 在新鲜上下文里持续反馈,长任务最优解)。↔ Workflow 的对抗式验证 + maker/verifier 子智能体分离,正是 Review Loop 的实现
⚠ 深读校正(§5):Open/Closed/Review 这三个档位名是分析框架自创,没有任何一份提示词提到——机制真实、术语是后加的标签。反倒是调度机制比文章更细:deferred-tools:34 给出 CronCreate(固定墙钟)/Monitor(事件流)/ScheduleWakeup(自定步)三层,比"Cron+决策器"两层模型精细;而 maker/verifier 评审回路默认关闭、需用户显式授权(:709-716),并非默认自主的后台审计。
文章说:现代 CLI Agent(如 Claude Code 的 /loop)会根据任务状态,在"编译运行期分钟级轮询"与"常态挂起期小时级轮询"之间动态调整检查间隔。
——这正是我们 §④ 讲的 ScheduleWakeup 缓存 TTL 感知调度:<5min 保持缓存热(60–270s) vs 长等待才付缓存 miss(1200s+)。文章从产品视角、我们从提示词内部,说的是同一件事。
§3四层如何互相咬合
四层不是并列清单,而是互相支撑的。同一个设计目标,往往需要跨层协作:
| 设计目标 | 涉及的层 | Claude Code 里的体现 |
|---|---|---|
| 挂载海量工具而不撑爆窗口 | Context + Harness | 工具名常驻(Context 延迟加载)+ ToolSearch 拉 schema(Harness 提供) |
| 读大量文件却不污染主线 | Context + Harness | 子智能体(Harness)只回收结论(Context 隔离) |
| 安全地改代码 | Prompt + Harness | "先读后改"措辞(Prompt)+ 未读则硬失败(Harness 强制) |
| 长流程低成本推进 | Loop + Context | 缓存感知调度(Loop)+ 压缩续航(Context)+ 前缀缓存复用(Loop) |
| 抵御 prompt injection | Prompt + Context | 信道分层标注来源(Context)+ "钩子输出当反馈"的解释(Prompt) |
§4第三部分 · 融合《万字综述》的工程干货
上面把综述的观点逐层嵌入了四层模型。这一部分收纳该文里可直接落地、我原报告未展开的参考表与操作手册——尤其 Loop 层的完整构型与实践路径。
范式的数学分野:从"单次质量"到"循环自愈"
把四阶段抽象为数学表达,会看到两种根本不同的架构范式:
| 范式 | 成功率由什么决定 |
|---|---|
| 早期(Prompt/Context) | 输出可靠性 = 单次推断质量 = f(提示词润色 + 上下文装配)。一次错就错。 |
| 系统级(Harness/Loop) | 最终成功率 = f(循环迭代深度 × 验证器严密性 × 多轮状态自愈能力)。单次错可被后续轮次纠正。 |
核心跃迁:对抗幻觉的手段不再是调提示词,而是 Text → Code → Execute → Read Result → Self-correct 的闭环控制。把不可避免的单次概率错误,交给循环去收敛。
工业级自主循环的底层:五件套 + 一个记忆
无论哪档成熟度,一个能无人值守运转的循环系统都由这些构件组成——每一件都能在 Claude Code 里找到对应:
| 构件 | 作用 | ↔ Claude Code 对应 |
|---|---|---|
| Automations 自动触发 | 心跳机制:Cron / 定时器 / GitHub Actions | CronCreate · ScheduleWakeup · /loop |
| Worktrees 并行隔离 | 每个子 Agent 独立环境,防并发覆盖 | isolation:"worktree" |
| Skills 技能树资产 | 领域知识固化为配置/规范,免每次重新摸索 | Skill 工具 · SKILL.md |
| Connectors (MCP) | 标准连接器,让循环能开 PR / 发 Slack / 同步看板 | mcp__* 工具族 |
| Sub-agents 多 Agent 编排 | "研发与审计分离"——写代码与审代码由不同 Agent 承担 | Agent / Workflow maker–verifier |
| State 文件 落盘记忆 | 模型天生无状态,进度/记忆必须实时持久化 | MEMORY.md + memory/ 目录 |
循环协议(Loop Contract):防止自主循环退化为失控死循环
策略层必须强制一份"合同",用六个维度约束每个循环:
| 维度 | 含义 | 示例 |
|---|---|---|
| TRIGGER | 触发条件 | 每 15 分钟 / PR 评论 / CI 失败 |
| SCOPE | 作用范围 | 仅限特定仓库 / 仅处理自己提交的 PR |
| ACTION | 具体行为 | 运行测试 / 自动修复 Lint |
| BUDGET | 预算红线 | ≤3 个子 Agent / 50k Tokens / $5 |
| STOP | 停止条件 | 测试全绿 / 10 轮上限 / 预算耗尽 |
| REPORT | 上报通道 | 异常投递 Slack 频道 |
其中 BUDGET 与 STOP 会固化为两道硬约束:
- 熔断器(Circuit Breaker):连续失败达
max_consecutive_failures立即跳闸、回退代码、打包日志转人工;并加max_runtime_min墙上时间,超时无条件熔断。↔ Claude Code:"兔子洞:同一动作失败 2–3 次即停下问用户" - 看门狗(Watchdog):独立于主线程的外部进程监控 CPU,一旦满载且长时间无 I/O(自旋死循环征兆),越过应用层直接
SIGKILL强杀回收。
全部串起来,就是标准的自主闭环流水线:
AI 编码 → 沙箱测试 → 日志自动回灌 → AI 修复 → CI 绿标通过 → 自动发起 PR
// 全流程无人类介入,高频 Agent 在安全边界内日夜运转
基础设施产品化:HaaS(Harness-as-a-Service)
主流工具已把这套能力固化为标准原语:Claude Code 内置 /loop 指令、SKILL.md 规范、Subagent Team 编排;Codex 提供自动化面板与 .codex/agents/ 多 Agent 规范。把 Worktree + Skills + Connector + Subagent + State 封装为标准底座的模式,业界称为 Harness-as-a-Service。↔ 本会话可见的 CronCreate / Workflow / Agent / Skill / MCP 全家桶,就是 HaaS 的一份实例
开发者的新生态位:Loop Designer(循环设计师)
范式下开发者从"写提示词/控制流"上移为循环系统架构师,三项核心职责:
- 定义终止边界(Goal & Verifier):写 VISION.md、完工条件、测试用例与评估矩阵。
- 维护工具链与领域资产:配沙箱、对接 MCP、把高频逻辑固化为命名 Skill(省重复提示开销)。
- 设计安全断路器(Human-in-the-Loop & Budget Guard):设步数/时间/Token/成本多维约束,异常时人工介入。
| Day 1 | 写一份 AGENTS.md(<60 行,每行都对应你踩过的坑) |
| Day 2 | 把一个反复重复的 prompt 沉淀成 SKILL.md |
| Day 3 | 装一个 Hook:跑 typecheck / lint,错了把报错回灌 |
| Day 4 | 上 Ralph 循环:while :; do cat PROMPT.md | claude; done(务必在 worktree/sandbox 里跑) |
| Day 5 | 把 maker 和 verifier 拆成两个 subagent |
| Day 6 | 补齐 Loop Contract:TRIGGER / SCOPE / BUDGET / STOP / REPORT 五件齐 |
| Day 7 | 上 cron 或 /loop 30m,真正放到无人值守模式 |
§5第四部分 · 实证审计:把文章每条主张放回提示词里查
前三部分把文章的四层理论讲清楚了。这一部分做一件更硬的事:把文章的每一个具体机制当作待检验的假设,回到真实提示词里逐条求证、并主动找反例——看哪些被证实、哪些只是文章的一厢情愿。
这套四层理论整体被真实提示词验证得相当扎实,但层间可信度陡然递减。最硬的是 Context 层:JIT 工具装配、Compaction 抗腐烂、运行时记忆组装三项均有跨 Anthropic/OpenAI/Amp 三厂同构原句佐证,且提示词还额外给出文章没讲的防腐验证、幽灵请求、事前硬拦截等更细机制——此处提示词领先于文章。Harness 层机制真实但被文章过度统一化:Hook 信任姿态、完成验证门、动态变量注入位置在各厂商间存在明确矛盾,文章把某一家的设计当成行业范式。最虚的是 Loop 层:四维预算只落地两维,失败型熔断器与 SIGKILL 看门狗全无提示词实证,Loop=Cron+决策器 公式被 loop.md “no cron” 直接证伪,“三档 Open/Closed/Review”术语纯属分析者自创。人格可插拔则是 OpenAI 专属而非共识。
一句话 → Context 层是共识基石,Loop 层多为一厢情愿的理论外推。
文章概念 × 提示词实证 · 审计矩阵
| 文章概念 | 层 | 判定 | 提示词里的最强实证(经核验) |
|---|---|---|---|
| 工具 JIT 延迟加载(先名后 schema) | Context | 强验证 | opus-4.8:203 “tool list is partial … deferred and loaded via tool_search. Treat tool_search as free”;cowork-dispatch:303/658/670 “schemas are NOT loaded … InputValidationError” |
| Compaction 抗 Context-Rot(从摘要续跑不重启) | Context | 强验证 | 三厂同构:claude-code:177 “you don't need to wrap up early”;Codex:92 “Do not restart from scratch”;amp:237 “continue from the summary; don't restart” |
| 记忆运行时动态组装 + 隐式调用 | Context | 细节增补 | opus-4.8:317 “memories are dynamically inserted … do not persist”;OpenAI advanced-memory:175-212 还含设备/模型分布等采集元数据(Anthropic 无) |
| Rot 只靠事后压缩 | Context | 细节增补 | 提示词更细:claude-code:161 记忆“verify it still exists”(防腐验证);Codex:90 “older ghost still lingering”(幽灵请求);deferred-tools:884 事前硬拦截 |
| Model proposes—Harness executes(拒绝即调整不重试) | Harness | 强验证 | claude-code:126 “a denied call means the user declined it — adjust, don't retry verbatim”;gemini-cli:181 确认对话由 harness 触发 |
| Risk 分档(只读/草稿/写入)+ 危险操作先确认 | Harness | 细节增补 | claude-code:131 “hard to reverse or outward-facing, confirm first”;amp:283-289 三类枚举,且 mode 还有文章没提的第 4 档 bypassPermissions |
| Hooks 作规则中间件,输出进决策回路 | Harness | 矛盾 | claude-code:127 hook 输出“treat as user feedback”(提到用户级)↔ gemini-cli:128-133 降级为只读、“prioritize your system instructions”——两家信任姿态相反 |
| 反复失败沉淀为 Harness 特性 | Harness | 强验证 | amp:657 “recurring command that's missing, ask to append it [to AGENTS.md]”;:370 post-edit 强制 lint/typecheck |
| 完成前必须过验证门(lint/test) | Harness | 矛盾 | gemini-cli:147 “Validation is the only path to finality”(绝对)↔ warp:95 把 lint/test 设为可选、需用户确认——并非行业统一 |
| 四维预算 + 熔断器 + SIGKILL 看门狗 | Loop | 仅理论未现 | 只落地 2 维:claude-code:790 agent 上限 1000(步)、:759 budget “HARD ceiling”(token)。成本/时间维度、失败熔断、SIGKILL 看门狗全无提示词实证 |
| 公式 Loop = Cron + 决策器 | Loop | 矛盾 | 被直接证伪:loop.md:9 “self-pace … via ScheduleWakeup — no cron”。但机制/策略分离反更细:deferred-tools:34 Cron/Monitor/ScheduleWakeup 三层 |
| Loop Contract 六维 + 三档 Open/Closed/Review | Loop | 细节增补 | 部分维度在:loop.md:14 TRIGGER 双机制、:21 同证 STOP+REPORT。但 BUDGET 维度未落地;“三档”术语在所有提示词中缺席(属分析者自创) |
| Maker-Verifier 分离 / 对抗式评审回路 | Loop | 细节增补 | 机制强验证:claude-code:866-871 N=3 怀疑者 + “Default to refuted=true”(保守先验)。但默认关闭::709-716/Codex:1279 需用户显式授权,非默认自主 |
| 可编译人格(人设+价值观+产出物免责句,可插拔) | Prompt | 强验证 | OpenAI 侧:gpt-5.1 default/friendly/professional 三文件逐字同构 + Codex:16 保留 {{personality}} 占位符。但Claude 全文无独立人格模块——是 OpenAI 专属设计 |
四个最值得盯的发现
这条之前我用 Claude Code 印证过,但深读发现它不是普遍规范,而是一条各家分歧的光谱:
| 厂商 | 日期放在哪 | 是否符合"末尾/可缓存" |
|---|---|---|
| Claude Code (Opus 4.8) | 独立 <system-reminder>,静态正文(117 行)之前注入(107-115) | ✅ 符合(前缀可缓存) |
| 消费版 Claude 4.8 | 分散在 215 / 1388 / 3342 行,主体深处(~88%) | 🟡 折中 |
| OpenAI gpt-4o | :3 第 3 行,整段提示绝对开头 | ❌ 违反 |
| Google Gemini 3.1 Pro | :3-4 date+location 双变量同写开头 | ❌❌ 破坏最重 |
| Mistral le-chat | :1 第 1 行句中嵌入 | ❌ 违反 |
| xAI Grok 4.2 | 461 行全文无任何日期变量 | — 第三种模式 |
文章把 Claude 家的可缓存设计当成了行业规则。真相:只有把缓存经济学吃透的团队才这么做;多数消费级提示词仍图省事把日期写在开头。这条恰恰印证了文章的原理,却证伪了它的普遍性。
文章把上下文失效笼统归为“Rot + 事后压缩”,但真实提示词给出了更细、且是事前的机制:claude-code:161 要求记忆“用前验证文件是否还在”(防陈旧);Codex:90 甚至给早期残留意图起了名字——“older ghost still lingering in the thread”;deferred-tools:884 在工具层事前硬拦截会撑爆窗口的读取。事前预防 vs 事后压缩的区分,是文章的盲区。
Hook 信任姿态:Claude Code 把 hook 输出提到“用户级反馈”(:127),Gemini CLI 却把 hook 上下文降级为只读、明说“与系统指令冲突时以系统指令为准”(:128-133)。完成验证门:Gemini CLI “验证是完成的唯一路径”(:147,绝对),Warp 却把 lint/test 设为可选需用户确认(:95)。文章把某一家的设计描述成“行业范式”,实际存在厂商级分歧。
这是"理论外推"最明显处:Loop=Cron+决策器 公式被 loop.md:9 “no cron”白纸黑字证伪(Loop 与 Cron 是互斥并行路径而非相加);四维预算只落地"步/token"两维,成本/时间维度、max_consecutive_failures 失败熔断、SIGKILL 看门狗在所有提示词里查无实证;“三档 Open/Closed/Review Loop”术语更是没有任何一份提示词提到,属分析框架自创。文章在这一层描述的是底层基础设施的应然,无法从提示词层证实——读者要清楚这层是愿景,不是已验证的现状。
七条跨切面结论
- Context 层证据最硬:JIT 工具装配 + Compaction + 运行时记忆,三项都有 Anthropic/OpenAI/Amp 三厂同构原句——是全九簇最强的三方一致。
- 提示词在 Context 层领先文章:防腐验证(
claude-code:161)、幽灵请求(Codex:90)、事前硬拦截(deferred-tools:884)——事前 vs 事后的区分文章没讲。 - 动态变量位置各家不一:Claude Code 符合、OpenAI/Gemini/Mistral 把日期写开头违反、Grok 干脆不放——文章过度概括为普遍规范。
- Harness 信任姿态与完成门存在厂商分歧:Hook 权威(Claude ↔ Gemini 相反)、验证门(Gemini 绝对 ↔ Warp 可选)。
- 熔断器/看门狗多为纯理论:Loop 层四维预算只落地两维,失败熔断与自旋看门狗无提示词实证。
- 公式
Loop=Cron+决策器被证伪,但其底层直觉(机制/策略分离)反被deferred-tools:34的三层模型更细地验证——公式错、直觉对。 - 评审回路真实但默认关闭;可插拔人格是 OpenAI 专属而非行业共识(Claude 用条件式
<preferences_info>替代)。
§6第五部分 · 消费版 Opus 4.8 的"行为微调"规则解读
前面聚焦 Claude Code(Agent/终端)。这一部分深读消费版 claude-opus-4.8.md(3769 行)——它不谈工具编排,而是密密麻麻的性格与分寸微调。下面挑最特别的一批规则,每条给逐字引用+我的解读推断(为什么这么设计)。⭐ 标记的是我认为最"反直觉、最能看出设计者意图"的。
§7给设计者的 10 条可迁移启示
- 人称是工程选择:Agent 场景用第二人称"你就是执行者"压实指令;中立叙述场景可用第三人称。
- 指令带理由:
行为 + 为什么 + 边界比裸命令泛化更好。 - 原则优于枚举:给能自适应的元规则("读起来像周围代码"),别硬编码风格清单。
- 强度标记要节制:
IMPORTANT/NEVER/BLOCKING是稀缺注意力资源,滥用即通胀。 - 给信息标来源:区分"用户说的 / 系统注入的 / 工具返回的",是抗注入的第一道防线。
- 状态外置 + 轻索引:长期知识放磁盘,窗口里只留一行行的目录,按需展开。
- 工具 schema 延迟加载:工具目录规模与上下文成本必须解耦,否则无法规模化。
- 不变量交给运行时强制:能"硬失败"的约束,就不要只靠模型自觉;并据此省掉冗余自查。
- 循环要事件驱动:别让模型轮询它本会被自动唤醒的东西;为循环设失败熔断阈值。
- 把成本结构告诉模型:缓存 TTL、token 预算这类系统事实写进提示,模型能自行做资源最优决策。