# Step 63: 源码对照②

一句话导读:Phase 6 不再加功能,而是把权限、沙箱、分类器、缓存、设置、遥测放回真实源码里检查:方向对了,差距在生产纵深。


# 一、这一步做了什么(What)

step63 是 Phase 6 的复盘篇。它对照真实 Claude Code 的 utils/permissions/、utils/sandbox/、services/analytics/ 等目录,检查 step57-62 是否抓住了真实机制的形状。

结论很清楚:规则优先级、两段式 Bash 分类、应用层 vs 内核沙箱、分层设置、prompt caching、遥测隐私边界,这些方向都对;主要缺口在 symlink、阴影规则、采样、远程策略、内核隔离等生产细节。

# 二、面试官视角:为什么要做?(Why)

面试题:既然教学版功能已经跑通,为什么还要专门做源码对照?

因为“能跑”不等于“方向对”。教学版最容易犯的错是把玩具实现误当成真实设计。源码对照的价值是校准抽象:哪些是故意简化,哪些是根本没做对。

对照前 对照后
只知道自己实现了 allow/deny 知道真实还有 shadowed rule、denial tracking
以为路径 relative 足够 发现 symlink 绕过是安全短板
以为遥测就是日志 明白 PII 边界才是核心

# 三、原理:它是怎么工作的(How)

step63 的 README 按模块做映射:

step57 权限规则        → utils/permissions/
step59 Bash 分类器     → dangerousPatterns + yoloClassifier
step58 沙箱            → sandbox-runtime / sandboxTypes
step60 Prompt Caching  → prompt caching usage / TTL
step61 分层设置        → SETTING_SOURCES / permissionsLoader
step62 遥测            → services/analytics/
1
2
3
4
5
6

最关键发现是路径校验。教学版 checkPath 用 path.relative(root, target) 判断是否逃出 cwd,但真实源码会解析 symlink:

proj/evil -> /etc
write proj/evil/passwd
  relative 判断仍在 proj 内
  realpath 后变成 /etc/passwd,必须拒绝
1
2
3
4

这说明安全校验不能只看字符串路径,必须看文件系统真实指向。

Phase 6 总对照:

规则语法:抄对 exact / prefix / wildcard
权限路径:少 realpath / symlink 防护
Bash 分类:抄对 heuristic + LLM 两段式
沙箱:抄对配置模型,缺系统调用级拦截
设置:抄对层级顺序,缺 drop-in/远程策略/热重载
遥测:抄对隐私边界,缺采样和远程 sink
1
2
3
4
5
6

# 四、深入追问(面试常见 follow-up)

Q:这次对照里最有价值的发现是什么?
A:路径校验不解析 symlink。它不是功能缺口,而是真安全缺口:字符串看似在项目内,真实文件可能指向项目外。

Q:为什么说差距在“纵深”而不是“方向”?
A:教学版的规则语法、优先级、两段分类、分层合并、遥测边界都和真实一致;缺的是更多边界和生产设施。

Q:源码对照应该逐字复刻吗?
A:不应该。教学版要保留最小可运行内核,关键是知道真实系统在哪些地方更深,而不是把 9000 行搬回来。

Q:为什么 Phase 6 要放一次对照?
A:安全、成本、遥测都是底层能力,错了会影响整个 agent runtime。阶段末尾做对照能及时校准风险。

# 五、踩坑 / 设计权衡

源码对照不是“找差距打击自己”,而是给简化版贴标签:哪些是教学取舍,哪些未来必须补。比如应用层沙箱可以教学,但必须明确真实 Claude Code 靠内核级 sandbox-runtime。

# 六、与真实源码的对照

我们的实现 Claude Code 源码
allow/deny + glob/prefix/exact permission parser + shellRuleMatching
relative() 路径校验 realpath + symlink + deny-within-allow
启发式 + LLM Bash 分类 dangerousPatterns + yoloClassifier 子系统
本地 Telemetry JSONL analytics sink、采样、PII 分列
五层设置合并 drop-in、远程策略、schema、热重载

# 七、一句话总结

step63 证明 Phase 6 的教学实现“形状对了”:真实差距不在主方向,而在 symlink、采样、热重载、内核沙箱这类生产纵深。

# 下一节预告

下一篇进入 Phase 7:step64 手写最小终端渲染引擎,理解 Ink 的虚拟节点树和 diff 刷屏。