番外二 · 幕后设计哲学
前面的章节讲的是"怎么实现",这篇番外讲的是"为什么这样设计"。本章汇集了从源码中提炼出的设计决策、安全哲学和工程直觉——系统提示词中每句话的用意、反蒸馏的多层防线、Bash 安全检查的 23 种攻击向量,以及上下文压缩如何在保真度和成本之间走钢丝。
A2.1 系统提示词的设计思路
每句话都在解决一个真实问题
系统提示词不是一份"指导方针",而是一份"问题清单的解决方案"。每条指令背后都有一个真实的行为问题:
"Avoid using this tool to run find, grep, cat..."
→ 问题:LLM 训练数据中大量命令行操作通过 shell 完成, 模型天然倾向于 cat file.txt 而非使用 Read 工具。但 Bash 调用无法触发 Claude Code 的专用工具 UI(差异对比、语法高亮、逐步审批)。
"If an approach fails, diagnose why before switching tactics"
→ 问题:模型在遇到第一次失败后倾向于完全切换策略("那我试另一种方法"),而不是分析错误原因。这导致了大量无效的策略跳转。
"Don't add features, refactor code, or make 'improvements' beyond what was asked"
→ 问题:模型的"有帮助"倾向会导致过度设计——用户要求修一个 bug,模型顺手重构了周围的代码、添加了类型注解、补了文档。
"Three similar lines of code is better than a premature abstraction"
→ 问题:模型在看到重复代码时几乎无法抑制创建 helper 函数的冲动。但在很多场景下,三行重复代码比一个不成熟的抽象更好维护。
针对不同用户群体的差异化
系统提示词通过 process.env.USER_TYPE 在编译时分叉,为不同用户群体提供差异化指令。最典型的例子是"输出风格":
外部用户看到的是简洁的 # Output efficiency:
Go straight to the point. Try the simplest approach first. Be extra concise.
内部用户看到的是专业的 # Communicating with the user,包含"倒金字塔结构"、"语义不回溯"等写作技巧指导——约 300 字,比外部版本详细 5 倍。
这种差异化说明:Prompt 内容可以像代码一样做 A/B 测试和渐进式发布。
指令位置的权重效应
Claude Code 的 Prompt 设计体现了对指令位置的深刻理解:
- NO_TOOLS_PREAMBLE 放在 Compact Prompt 的最开头:
CRITICAL: Respond with TEXT ONLY. Do NOT call any tools.开头的指令比末尾的更难被后续内容稀释。 - "Writing the prompt" 放在 AgentTool 描述内部:不是放在系统提示词末尾"提一句",而是作为工具描述的完整章节,确保模型每次使用 AgentTool 时都能"重温"。
- Git Safety Protocol 放在 BashTool 的 prompt.ts 中:不是放在通用的"安全注意事项"里,而是紧贴 Bash 工具的使用说明——离使用场景越近,效果越好。
A2.2 反蒸馏机制
什么是反蒸馏
"蒸馏"(distillation)是指通过观察一个大模型的输出来训练一个小模型模仿其行为。对于 Claude Code 来说,风险有两个层面:
- 模型身份泄露:内部模型代号(如动物代号)出现在公开的 commit 消息或 PR 中
- 系统提示词泄露:完整的系统提示词被用户提取并用于竞品
卧底模式(Undercover System)
src/utils/undercover.ts 实现了一套精密的身份保护系统:
/**
* Activation:
* - CLAUDE_CODE_UNDERCOVER=1 — force ON
* - Otherwise AUTO: active UNLESS the repo remote matches the internal allowlist
* - There is NO force-OFF. This guards against model codename leaks.
*/
export function isUndercover(): boolean {
if (process.env.USER_TYPE === 'ant') {
if (isEnvTruthy(process.env.CLAUDE_CODE_UNDERCOVER)) return true
return getRepoClassCached() !== 'internal'
}
return false
}
关键设计:没有强制关闭选项。即使开发者设置了环境变量,如果无法确认当前仓库在内部白名单中,卧底模式始终保持开启。这是"安全默认 ON"的极端体现。
当卧底模式激活时,系统提示词中注入了一段措辞极为严厉的指令:
## UNDERCOVER MODE — CRITICAL
You are operating UNDERCOVER in a PUBLIC/OPEN-SOURCE repository.
NEVER include in commit messages or PR descriptions:
- Internal model codenames (animal names like Capybara, Tengu, etc.)
- Unreleased model version numbers
- Internal repo or project names
- The phrase "Claude Code" or any mention that you are an AI
- Co-Authored-By lines or any other attribution
Write commit messages as a human developer would.
编译时死代码消除
所有内部代码路径都通过 process.env.USER_TYPE === 'ant' 守卫。由于 USER_TYPE 是编译时常量(--define),Bun 的打包器会在编译期进行常量折叠和死代码消除(DCE):
// 编译前
if (process.env.USER_TYPE === 'ant') {
return getUndercoverInstructions() // 包含内部代号
}
// 编译后(外部构建)
// 整个 if 块和 getUndercoverInstructions 函数被完全移除
这意味着外部发布的二进制文件中不包含任何内部模型代号字符串——即使反编译也找不到。
署名消毒
src/utils/attribution.ts 中的 sanitizeModelName() 将内部模型变体映射到公开名称,未知模型回退到通用名 'claude'。getAttributionTexts() 在卧底模式下返回空字符串,完全剥离 Co-Authored-By 行。