1
00:00:00,100 --> 00:00:06,432
本内容改编自小山学堂《学 AI 产品，从入门到精通》，为二次演绎配音版。

2
00:00:06,382 --> 00:00:08,966
这是 Grok Build 系列的收尾课。

3
00:00:08,966 --> 00:00:15,204
前几集我们一直在往下钻，看 crate 怎么分，字段叫什么，默认值是多少。

4
00:00:15,204 --> 00:00:21,237
这一集反过来，问一个更基础的问题，你凭什么相信自己写下的这句话。

5
00:00:21,237 --> 00:00:23,725
为什么值得单独花一集。

6
00:00:23,725 --> 00:00:27,307
Coding Agent 这个领域信息噪声特别大。

7
00:00:27,307 --> 00:00:35,048
同一个产品，有人说它内部用了什么架构，有人说它体验最好，有人说它生态最强。

8
00:00:35,048 --> 00:00:40,492
这些话里一部分是事实，一部分是推断，还有一部分是口碑。

9
00:00:40,492 --> 00:00:46,586
拿这些话去做选型、做设计、写汇报，分不清三者的代价很实在。

10
00:00:46,586 --> 00:00:48,774
这一集解决两个问题。

11
00:00:48,774 --> 00:00:57,139
一是当你同时面对一个开源实现和一个闭源产品，怎么做出可复核的能力对照，而不是拍脑袋的优劣表。

12
00:00:57,139 --> 00:01:04,170
二是读完一份源码之后，怎么同时说清楚它强在哪里，以及它的说明力到哪里为止。

13
00:01:04,170 --> 00:01:05,697
三块内容。

14
00:01:05,697 --> 00:01:25,172
先讲四类证据来源怎么分；再讲证据化对照怎么读，以及两句源码为什么比十句评论有分量；然后做工程复盘，优点从类型、状态机和测试里找证据，限制从 README、贡献政策、生成流程和快照条件里找；最后落到九维设计工作台。

15
00:01:25,172 --> 00:01:26,890
一句话先放这儿。

16
00:01:26,890 --> 00:01:31,710
证据等级清楚之后，架构取舍才有可复核的基础。

17
00:01:31,850 --> 00:01:35,682
先看证据怎么分级，这门课用了四类来源。

18
00:01:35,632 --> 00:01:42,891
第一类源码证据，从 Rust 源码直接读到的实现，结构体定义、枚举、断言、错误分支。

19
00:01:42,891 --> 00:01:46,473
分辨率最高，能告诉你机制是什么。

20
00:01:46,473 --> 00:01:52,927
第二类仓库文档证据，README、CONTRIBUTING，以及仓库对构建和目录的说明。

21
00:01:52,927 --> 00:01:57,711
它告诉你的是发布方式和维护政策，不是运行时行为。

22
00:01:57,711 --> 00:02:05,103
第三类官方公开产品文档，主要给闭源一侧用，描述用户可见行为，不描述内部实现。

23
00:02:05,103 --> 00:02:11,125
第四类本地快照观察，你在本地目录里扫到了什么、没扫到什么。

24
00:02:11,125 --> 00:02:14,370
这一类最弱，只对本次快照成立。

25
00:02:14,370 --> 00:02:17,543
这里有个做法比证据本身更重要。

26
00:02:17,543 --> 00:02:28,060
两列证据的分辨率本来就不同，Grok 一侧能下钻源码，Claude 一侧只记录官方公开行为，所以空白项保留空白，不用推测补齐。

27
00:02:28,060 --> 00:02:34,502
看到一份处处填满的对照表反而要警惕，填得越满，编的成分可能越多。

28
00:02:34,502 --> 00:02:37,831
证据索引上，Grok 一侧能指到文件。

29
00:02:37,831 --> 00:03:04,425
README 和 CONTRIBUTING 对应仓库治理，acp_session.rs 和 summary.rs 对应会话与并发，capability.rs 和 tool_index.rs 对应工具能力，compaction 目录和 xai-grok-memory 对应上下文与记忆，xai-grok-hooks、xai-grok-mcp 和 mcp_dispatcher.rs 对应钩子与外部连接，fork、worktree、plugins、persistence 和 telemetry 对应分支、插件与恢复。

30
00:03:04,425 --> 00:03:12,791
Claude 一侧是官方文档的页面名，Overview、Hooks reference、MCP、Memory、Subagents、Permissions、Plugins。

31
00:03:12,791 --> 00:03:16,084
一边能追到行，一边只能追到页。

32
00:03:16,084 --> 00:03:20,651
把这个差异写在明面上，比假装两边对等诚实得多。

33
00:03:20,651 --> 00:03:27,779
最终要留下的能力，是把实现事实、产品行为、推断和未知项分成四堆。

34
00:03:27,910 --> 00:03:31,838
进对照表，不逐项念，挑几行讲读法。

35
00:03:31,788 --> 00:03:33,507
实现与分发。

36
00:03:33,507 --> 00:03:39,925
Grok Build 是 Rust 的 Cargo workspace，功能拆成多个 crate，README 给出源码构建入口。

37
00:03:39,925 --> 00:03:48,567
Claude Code 官方提供终端命令行、IDE、桌面端和 Web 四种入口，内部语言与模块边界不在本课结论范围内。

38
00:03:48,567 --> 00:03:52,641
注意后半句不是回避，是声明这一列没有证据。

39
00:03:52,641 --> 00:03:54,216
状态与并发。

40
00:03:54,216 --> 00:04:02,665
Grok 一侧 SessionActor 持有会话历史和工具上下文，运行在 Tokio 的 LocalSet 上，后台任务可独立回传消息。

41
00:04:02,665 --> 00:04:12,040
Claude 一侧公开文档描述会话、后台任务、subagent 和 agent teams 的用户行为，课程明确不据此推断内部并发模型。

42
00:04:12,040 --> 00:04:17,365
左边说机制，右边说体验，两者不能互换位置去比强弱。

43
00:04:17,365 --> 00:04:18,807
工具合约。

44
00:04:18,807 --> 00:04:27,221
Grok 是 ToolKind 枚举进入 capability 过滤，新增 variant 有编译期同步断言，MCP 工具映射成 Other 这一类。

45
00:04:27,221 --> 00:04:35,658
Claude 按 Read、Edit、Write、Bash、WebFetch、MCP 这些工具名和参数模式控制 allow、ask、deny。

46
00:04:35,658 --> 00:04:37,040
工具发现。

47
00:04:37,040 --> 00:04:47,677
Grok 的内建工具启动即注册，MCP 工具元数据进快照和 BM25 索引，靠 search_tool 和 use_tool 做延迟发现。

48
00:04:47,677 --> 00:04:55,057
Claude 官方文档说明 Tool Search 可按需加载 MCP 工具，支持延迟连接等待与失败信息反馈。

49
00:04:55,057 --> 00:05:03,675
共同点是两边都撞上同一个问题，工具一多模型的工具列表就不稳定，解法都是把发现推迟到运行时。

50
00:05:03,675 --> 00:05:10,898
对照表的价值在这里，不是比谁强，而是看两个团队面对同一约束各自怎么解。

51
00:05:11,040 --> 00:05:12,708
上下文压缩。

52
00:05:12,658 --> 00:05:21,120
Grok 源码里有 compaction 配置、分段、two-pass、full-replace 和 recap 辅助路径，可测试自动压缩与恢复。

53
00:05:21,120 --> 00:05:28,584
Claude 一侧公开行为包括自动压缩、compact 命令和 compact instructions，课程不描述内部算法。

54
00:05:28,584 --> 00:05:35,086
一边能说路径和算法名，一边只能说用户能触发什么，证据强度差着一档。

55
00:05:35,086 --> 00:05:36,601
长期记忆。

56
00:05:36,601 --> 00:05:45,651
xai-grok-memory 实现 SQLite 存储、全文检索、embedding、MMR 和 Dream 整理流程，由 session memory state 集成进会话。

57
00:05:45,651 --> 00:05:49,437
Claude 一侧是分层 CLAUDE.md 指令与 auto memory。

58
00:05:49,437 --> 00:05:51,997
Hooks 是最该记住的一行。

59
00:05:51,997 --> 00:06:00,915
Grok 源码枚举十五个事件，PreToolUse 可阻断；明确 deny 会阻断，而 Hook 崩溃、超时和失败输出走 fail-open。

60
00:06:00,915 --> 00:06:08,500
Claude 官方 Hooks reference 公开多类事件、matcher、if 条件与多种处理器，PreToolUse 可返回拒绝。

61
00:06:08,500 --> 00:06:19,846
fail-open 的意思是钩子出问题时系统选择放行，减少误阻断，代价是强制安全规则不能只靠 Hook 承担，后面复盘还会回来讲它。

62
00:06:19,846 --> 00:06:21,492
权限与沙箱。

63
00:06:21,492 --> 00:06:32,202
Grok 是 capability 过滤、权限提示、平台沙箱三层叠加；Claude 公开 allow、ask、deny 规则、managed settings、sandboxed Bash 与网络隔离配置。

64
00:06:32,202 --> 00:06:39,089
安全是分层的，所以 Hook 走 fail-open 不是疏忽，前提是权限层和沙箱层还在。

65
00:06:39,089 --> 00:06:53,079
MCP 这一行，Grok 源码确认客户端角色，支持 stdio 与 Streamable HTTP、OAuth、server 加双下划线加 tool、动态能力刷新与重启，但通用的 MCP Server 入口被标为未确认。

66
00:06:53,079 --> 00:06:59,750
Claude 官方文档公开远程 HTTP、本地 stdio、WebSocket、OAuth 与 Tool Search。

67
00:06:59,750 --> 00:07:04,040
未确认这三个字，比一个猜出来的答案有用得多。

68
00:07:04,040 --> 00:07:05,915
Subagent 与插件。

69
00:07:05,915 --> 00:07:16,853
Grok 源码含 fork、任务、工作树池和 worktree snapshot 配置，Marketplace 支持索引回退，运行时按 scope、enabled 和 plugin-root trust 控制组件。

70
00:07:16,853 --> 00:07:22,839
Claude 官方 subagents 有独立上下文与权限，可按配置使用 worktree isolation。

71
00:07:22,839 --> 00:07:24,605
恢复与可观测。

72
00:07:24,605 --> 00:07:40,315
Grok 有会话持久化、MCP 状态通知、五十毫秒事件合并、重启退避与结构化事件；Claude 可见行为包含 session resume、verbose 与 debug、Hooks 状态与 MCP 面板，内部持久化拓扑不作推断。

73
00:07:40,315 --> 00:07:41,817
源码与治理。

74
00:07:41,817 --> 00:07:50,290
Grok 仓库公开源码，README 说明定期从 monorepo 同步，根 Cargo.toml 由生成流程产出，外部贡献不接收。

75
00:07:50,290 --> 00:07:56,252
Claude 这一列依据官方公开产品文档，不把不可见内部实现当作事实。

76
00:07:56,252 --> 00:08:02,105
规律是，有源码的一侧描述机制，只有文档的一侧描述行为。

77
00:08:02,260 --> 00:08:06,308
看两句真实源码，感受什么叫可以复核的证据。

78
00:08:06,258 --> 00:08:08,325
第一句是编译期断言。

79
00:08:08,325 --> 00:08:23,109
常量断言检查 ALL_TOOL_KINDS 的长度等于 ToolKind 的 VARIANT_COUNT，不同步就编译失败，提示 ALL_TOOL_KINDS is out of sync，位置在 xai-grok-workspace 的 capability.rs。

80
00:08:23,109 --> 00:08:31,595
它把一件靠自觉的事变成了编译期约束，新增工具类别时维护者必须重新作出保留还是过滤的决策。

81
00:08:31,595 --> 00:08:38,289
代码评审里说这里建议加个检查那是建议，而这句断言是已经发生的事实。

82
00:08:38,289 --> 00:08:40,801
第二句是失败默认值。

83
00:08:40,801 --> 00:08:53,313
处理插件根目录信任时，代码用 dunce 的 canonicalize 解析路径，成功就拿规范化后的路径比对信任列表，失败直接返回 false，位置在 xai-grok-agent 的 plugins 下 trust.rs。

84
00:08:53,313 --> 00:08:57,568
它把无法判断这个状态明确映射成了不信任。

85
00:08:57,568 --> 00:09:03,482
很多系统的默认值是宽松的，路径读不出来就先放行，这里反过来了。

86
00:09:03,482 --> 00:09:06,234
两句源码给了复盘一个方法论。

87
00:09:06,234 --> 00:09:13,506
证明一个系统好，别去说它生态大、社区强、体验最好，这些都无法由当前材料证明。

88
00:09:13,506 --> 00:09:21,715
要找三个东西，一条源码路径、一个关键分支、一条相关测试，三条凑齐结论才站得住。

89
00:09:21,715 --> 00:09:31,931
反过来说明限制时，要分清属于产品、仓库、构建还是本地快照边界，分类清楚了别人才知道这个限制能不能被绕过。

90
00:09:32,090 --> 00:09:36,511
复盘，先说五条优点，每条带源码落点。

91
00:09:36,461 --> 00:09:38,877
一，类型引导策略。

92
00:09:38,877 --> 00:09:48,456
ToolKind 的完整列表有编译期数量断言，capability filter 使用穷尽匹配，新增工具类别必须重新决策保留或过滤。

93
00:09:48,456 --> 00:09:51,461
落点 capability.rs 和 tool.rs。

94
00:09:51,461 --> 00:09:53,889
二，失败即状态。

95
00:09:53,889 --> 00:10:03,925
MCP dispatcher 合并高频状态，移除客户端前核对 client_id，旧连接的迟到断线不会把替换后的健康客户端误删。

96
00:10:03,925 --> 00:10:09,237
落点 mcp_dispatcher.rs 和 mcp_restart.rs。

97
00:10:09,237 --> 00:10:11,352
三，信任边界。

98
00:10:11,352 --> 00:10:23,816
插件的发现与执行被拆开，项目插件按 canonical root 授权，未信任插件可提供元数据，但 hooks、MCP servers 和 scripts 被阻断，路径解析失败默认未信任。

99
00:10:23,816 --> 00:10:26,869
落点 trust.rs 和 discovery.rs。

100
00:10:26,869 --> 00:10:29,225
四，可恢复的记忆。

101
00:10:29,225 --> 00:10:39,153
xai-grok-memory 把 schema、storage、全文检索、embedding、MMR、Dream 和 lock 拆成明确模块，会话侧通过独立 memory state 接入。

102
00:10:39,153 --> 00:10:41,413
五，多入口覆盖。

103
00:10:41,413 --> 00:10:47,446
README 列出全屏 TUI、headless scripting 与 CI、ACP 编辑器嵌入三种用法。

104
00:10:47,446 --> 00:10:49,273
限制同样五条。

105
00:10:49,273 --> 00:10:59,562
镜像边界，README 写明定期从 SpaceXAI 的 monorepo 同步，当前树可用于源码透明和本地构建，不能代表内部主干即时状态。

106
00:10:59,562 --> 00:11:07,446
贡献边界，CONTRIBUTING 明确不接收外部 pull request 或 unsolicited patch，贡献通道由发布政策约束。

107
00:11:07,446 --> 00:11:15,307
生成根，根 Cargo.toml 标为 generated 和 read-only，脱离生成源直接改根配置可能被同步覆盖。

108
00:11:15,307 --> 00:11:22,494
构建主机，macOS 和 Linux 是受支持主机，Windows 属 best-effort 且当前未从此源码树测试。

109
00:11:22,494 --> 00:11:31,929
策略取舍，Hook 崩溃、超时和坏输出采用 fail-open，代价是强制安全规则要靠权限层或沙箱共同承担。

110
00:11:31,929 --> 00:11:39,165
本次快照还有四条适用边界，周期同步、无外部贡献、根 Cargo 生成、缺少 Git 元数据。

111
00:11:39,165 --> 00:11:45,619
第四条是说本地快照没带 .git 目录，无法核对 commit、tag、blame 与提交时间线。

112
00:11:45,619 --> 00:11:51,052
前三条有仓库文档支持，第四条是本地文件观察。

113
00:11:51,190 --> 00:11:54,938
最后一块，把对照表变成你自己的设计。

114
00:11:54,888 --> 00:12:07,436
九维工作台的九个维度是运行入口、状态与并发、模型流、工具合约、上下文与记忆、安全、持久化与恢复、可观测与隐私、扩展生态。

115
00:12:07,436 --> 00:12:13,770
每个维度回答四件事，架构决定、故障路径、验证方式、可提交成果。

116
00:12:13,770 --> 00:12:15,356
硬约束五条。

117
00:12:15,356 --> 00:12:24,563
默认最小权限，每个外部动作可追踪，崩溃后可解释恢复，敏感数据有明确落点，扩展代码有信任边界。

118
00:12:24,563 --> 00:12:34,106
评分是边界与 ADR 二十分、合约与状态机二十分、安全与恢复二十五分、测试与可观测二十分、演示与证据十五分。

119
00:12:34,106 --> 00:12:38,638
安全与恢复占比最高，这个权重本身就是态度。

120
00:12:38,638 --> 00:12:41,582
真正要看的是四条否决项。

121
00:12:41,582 --> 00:12:54,695
未说明敏感数据落点，否决；高风险工具缺少权限路径，否决；崩溃后声称可恢复但没有测试，否决；引用源码时无法给出文件路径，否决。

122
00:12:54,695 --> 00:13:02,436
第四条不是形式主义，引用实现却给不出路径，读者没法判断那句话是事实还是想象。

123
00:13:02,436 --> 00:13:05,428
收尾，四条可以带走的原则。

124
00:13:05,428 --> 00:13:08,493
一，先分证据，再做取舍。

125
00:13:08,493 --> 00:13:18,734
拿到对照材料先问证据是源码、仓库文档、官方公开文档还是本地快照，分不清来源的结论写进设计文档就是风险。

126
00:13:18,734 --> 00:13:21,955
二，空白项比填满的表格更可信。

127
00:13:21,955 --> 00:13:29,936
看到空白是作者在告诉你这里没有证据，看到处处填满的表先怀疑它有没有用推测补齐。

128
00:13:29,936 --> 00:13:32,736
三，写明失败默认值。

129
00:13:32,736 --> 00:13:40,873
无法读取策略时停不停，无法解析工具结果时降不降级，无法恢复检查点时请求不请求用户。

130
00:13:40,873 --> 00:13:45,921
源码里那句路径解析失败就返回 false 就是这个原则的样本。

131
00:13:45,921 --> 00:13:48,986
四，把好改写成可检查的约束。

132
00:13:48,986 --> 00:13:59,419
不要写这个更安全、更先进、生态更强，改写成新增工具类别时编译期强制决策、旧连接迟到断线不误删健康客户端。

133
00:13:59,419 --> 00:14:03,217
改完之后别人能去复核，你也能去复核。

134
00:14:03,217 --> 00:14:05,921
这四条背后是同一件事。

135
00:14:05,921 --> 00:14:11,955
工程判断的价值不在于结论多肯定，而在于结论能被多便宜地验证。

136
00:14:11,955 --> 00:14:14,058
这一集就到这里。

