DEEPDIVE / [LAB] · CLAUDE DESKTOP BUDDY № 02 ← № 01 价值篇
v1 · 2026
PROTOCOL ARCHAEOLOGY / 协议考古

Buddy
协议深潜

从 BLE 比特流看
agent 硬件通信协议的未来

一份关于 claude-desktop-buddy 协议的逐层拆解,外加一个关于 agent-hardware 通信协议会怎么演进的预测。先解构现实,再推演未来。

PARTS
4
比特流 → 未来
协议层
17
sections / 决策表
Anthropic 协议
6
MCP → Buddy
未来提案
3
should exist
姊妹篇

产品角度的姐妹篇:价值篇 — Buddy 对开发者意味着什么。这篇深潜是技术角度的全量拆解,从 BLE 物理层到协议未来一条龙。

TL;DR / 30 秒

Buddy 是 Anthropic 的第六份对外协议——也是其中唯一的物理近场协议,第一次给 agent ↔ 实体硬件之间的接口划线。

反共识洞察:协议表面是 maker 玩具,本质是 Anthropic 把"agent 的物理在场感"作为产品维度的押注——值得读不是因为它现在能做什么,是因为它定住了一个此前没有协议的位置。

PROLOGUE

这篇文章想做什么

Buddy 协议表面是一个 maker 玩具的接口规范。往下挖会发现三件值得讨论的事:

  1. 01 它是 Anthropic 的第六份对外协议——前五份分别是 MCP、Skills、Hooks、Permissions、Remote Control。每份对应 agent 工作流的一层。
  2. 02 它是其中唯一的物理近场协议。其他五份都是软件接口或网络协议;Buddy 是这家公司第一次划定 agent 与"实体硬件"之间的合约。
  3. 03 它的设计选择反映了一个尚未公开声明的判断:agent 的"物理在场感"是一个产品维度,值得用一份独立协议去支持。

这篇文章分四部分:

PART I

比特流层

协议从 BLE 物理层到 JSON 应用语义的逐层拆解

PART II

设计分析

6 个关键决策、4 处聪明、5 个缺口、威胁模型

PART III

协议栈定位

Anthropic 6 份协议横向对比、Buddy 占哪一格

PART IV

未来

5 个演化方向 + 3 个应该存在的协议提案

写给:协议设计者、做 agent 工具链的工程师、想做硬件接 AI 的 maker、对 protocol-as-product 感兴趣的产品人。

§ 01 / WHAT

这是什么

claude-desktop-buddy 是 Anthropic 开源的一个参考实现,包括两件东西:

你不需要这个仓库里的任何代码就能接入这个 API——只要一块能广播 Nordic UART Service 的开发板和这份协议文档。仓库的存在是给 Maker 社区一个可以直接 fork 和刷机的起点。

REPO ARCHAEOLOGY / 仓库考古

1.6k Stars,218 Forks,Contributors 只有一位Felix Rieseberg(Electron 核心维护者,前 Slack 桌面客户端主作者)。全仓库只有 2 个 commit。这不是有机生长的开源项目——是某个内部项目清理后开源的清白版本。这个细节在 § 17 谈策略时再回来。

M5StickC Plus running buddy firmware
FIG / 01 M5StickC Plus running buddy firmware — 协议的参考目标
§ 02 / DOES

能做什么

连接后,硬件实时获取 Claude 的工作状态——会话数、运行/等待数、token 累计、当前权限请求。状态映射到设备上的 7 种动画(详见 价值篇 № 01 状态表)。

关键交互是审批流程:Claude 执行 Bash 命令、文件操作等需要用户确认的工具调用时,设备屏幕显示 approve: Bash 附具体命令预览。按 A 批准、按 B 拒绝。整个过程不需要看电脑屏幕。

这解决一个真实痛点:Claude Code 跑长任务时偶尔会停下等审批,你需要切回电脑窗口点击。有了这块设备,你可以继续做别的事,等宠物不耐烦了再瞥一眼按键。

这件小事的产品意义在 № 01 价值篇讲过。这篇文章关心的是:这件小事用什么协议实现,为什么这么实现。

PART I — 协议形态
比特流
§ 03 / STACK

协议栈结构

Buddy 协议有四层。每一层都有故事。从下往上看。
应用语义层 JSON 消息(heartbeat / permission / turn / status / char_*)
▲ ▼
帧层 UTF-8、\n 分隔的行(line-buffered)
▲ ▼
传输层 Nordic UART Service (NUS) over BLE GATT
▲ ▼
物理层 Bluetooth Low Energy 4.2+ / 5.0
§ 04 / TRANSPORT

物理 + 传输层

4.1 / 为什么是 BLE 而不是 WiFi / USB / UWB

候选方案对比:

候选
距离
配对
功耗
调试
成本
BLE
~10m
一次
极低
$
WiFi
~30m
路由
$
USB
接触
即插
总线
$
UWB
~10m
复杂
$$
5G
全球
SIM
$$$

Buddy 选 BLE 的理由可以反推:

USB 也是合理候选,但要求设备线连主机;BLE 让设备自由放置——这个自由度对 ambient device 很重要。

4.2 / Nordic UART Service —— 为什么不发明新 GATT

NUS 是事实标准,三个 GATT 特征:

Service:  6e400001-b5a3-f393-e0a9-e50e24dcca9e
RX (W):   6e400002-b5a3-f393-e0a9-e50e24dcca9e   // 主机→设备 Write
TX (N):   6e400003-b5a3-f393-e0a9-e50e24dcca9e   // 设备→主机 Notify

为什么用 NUS 而不是设计 Buddy-specific 的 GATT profile?

和 MCP 的 JSON-RPC 2.0 over stdio/SSE 一致——都是复用现有标准当传输底座,把新意全部投入应用语义层

4.3 / 广播命名前缀:Claude*

设备广播名字必须以 Claude 开头。这是个简单约定,代替了几种更复杂方案:

副作用:任何人都可以广播 Claude_xxx 假冒设备。但这在 BLE 范围内本来就要靠加密层防护(§ 11),不是命名约定该解决的。用对工具

4.4 / MTU 限制 —— 协议层不感知 MTU

BLE 4.0 ATT_MTU 默认 23 字节,扣头后 Notify 一次只能发 20 字节。BLE 5.0 协商后可到 247 字节。但你不能假设客户端协商了大 MTU。

Buddy 的处理方式很聪明:协议层不感知 MTU

// 发送方
将 JSON 序列化成 UTF-8 → 逐字节写入 NUS RX/TX → 自然分包

// 接收方
缓冲所有收到的字节 → 遇到 \n 就解析一行

这意味着:

抗 MTU 漂移 + 抗传输替换。下层任何变化都不需要改协议。这是值钱的设计冗余。

§ 05 / FRAMING

帧层 — 为什么 \n 分隔的 JSON

候选方案:

框架方式
优点
缺点
\n 分隔行
易调试、零开销、telnet 都能验
payload 不能含 \n
长度前缀
严格、二进制安全
需解析器,调试要工具
LTV
多类型分发清晰
复杂度高
WebSocket frame
已成熟
头部开销

Buddy 选 \n。这要求 JSON 序列化时不产生原始换行——所有 JSON 是单行(minified)。

收益
  • · 调试无敌——bluetoothctl 直接读到 JSON
  • · 流处理简单——任何语言 readline()
  • · 错误恢复——一行解析失败不影响下一行
代价
  • · 二进制必须 base64(每 chunk +33%)
  • · 没有原生消息边界保证

这是调试性优先于带宽的选择。Buddy 吞吐需求很低(心跳 10s 一次、状态推送几秒一次),调试性的收益远超带宽损失。

§ 06 / MESSAGES

应用语义层 — 五种消息

Buddy 协议在应用层只有 5 种消息族。一一拆解。

6.1 / 心跳快照(设备 ← 桌面)

{
  "total": 3,
  "running": 1,
  "waiting": 1,
  "msg": "approve: Bash",
  "entries": ["10:42 git push", "10:41 yarn test", "10:39 reading file..."],
  "tokens": 184502,
  "tokens_today": 31200,
  "prompt": {
    "id": "req_abc123",
    "tool": "Bash",
    "hint": "rm -rf /tmp/foo"
  }
}

关键合约

频率合约

状态变化时发,最长 10 秒一次保活。30 秒收不到当连接断。设备必须做"30s 没数据"超时逻辑,不能依赖 BLE 链路状态

幂等合约

每次心跳是完整快照,不是增量。设备可以丢弃旧心跳,只看最新一条。极大简化了状态机——不需要 reconcile,直接覆盖。

预聚合合约

entries 已是字符串、不是结构化日志;tokens 已累加;prompt.hint 已截断。所有聚合在桌面端做,设备只显示。把复杂度推给主机端,设备只做"哑终端"。

6.2 / 权限审批(设备 → 桌面)

{"cmd":"permission","id":"req_abc123","decision":"once"}
{"cmd":"permission","id":"req_abc123","decision":"deny"}

合约:

最后一点是关键。Claude Code 桌面端本身有"始终允许"模式,Buddy 故意不让设备触发。

设计意图

物理摩擦是 feature,不是 bug。如果允许"在 Buddy 上点一次永久允许 git push",设备就从"审批员"退化成"麻木盖章机"。Buddy 的产品价值在于每次审批的"瞥一眼 + 按一次"轻摩擦——这个摩擦本身在阻止一类错误。一旦允许 always,整个产品价值就垮了。

这种"协议刻意不暴露能力"的克制设计很少见。多数协议设计者会想"提供给客户端,让客户端选要不要用"——Buddy 反过来:禁止客户端拥有这个选择。这是产品决策固化在协议里的例子。

6.3 / Turn 事件(设备 ← 桌面,异步)

{
  "evt": "turn",
  "role": "assistant",
  "content": [{"type": "text", "text": "..."}]
}

每个 Claude 回复完成后触发一次。content 数组是 SDK 原生格式(text / tool_use / tool_result)。超过 4 KB 的事件被丢弃

为什么 4 KB?工程约束驱动:

设计意图:Turn 不是为了让设备完整复制对话,是为了触发"Claude 说话了"动画。如果想要完整记录,应该用别的传输(USB 直连、WiFi)。Buddy 在 BLE 上的角色是"状态指示器",不是"日志同步器"。

6.4 / 状态上报 ack(桌面 ← 设备)

{
  "ack": "status",
  "ok": true,
  "data": {
    "name": "Clawd",
    "sec": true,
    "bat": {"pct": 87, "mV": 4012, "mA": -120, "usb": true},
    "sys": {"up": 8412, "heap": 84200},
    "stats": {"appr": 42, "deny": 3, "vel": 8, "nap": 12, "lvl": 5}
  }
}

桌面 poll,设备答。协议里最弱合约的部分——每个字段都是可选,设备不支持就不填。

stats.lvl 是设备自己跟踪的"等级"(每 5 万 token 升一级),上报给桌面。这个状态桌面不维护——设备的 NVS 是单一真相源。又一个克制设计:让设备拥有它显示的状态,桌面只是消费方。

6.5 / Folder Push — 流式角色包传输

协议里最复杂的部分。Hardware Buddy 窗口的 drop target 收到一个文件夹后触发:

桌面: {"cmd":"char_begin","name":"bufo","total":184320}
设备: {"ack":"char_begin","ok":true}
— 每个文件 —
桌面: {"cmd":"file","path":"manifest.json","size":412}
设备: {"ack":"file","ok":true}
桌面: {"cmd":"chunk","d":"<base64>"}
设备: {"ack":"chunk","ok":true,"n":4096}
… 重复 chunk 直到 size 字节传完 …
桌面: {"cmd":"file_end"}
设备: {"ack":"file_end","ok":true,"n":412}
— 包结束 —
桌面: {"cmd":"char_end"}
设备: {"ack":"char_end","ok":true}

设计要点

CHUNK 级 ACK = 流控

桌面不发下个 chunk 直到拿到上个 ack——应用层 stop-and-wait。BLE 链路层有 ACK,但应用层这一层让协议感知"设备 flash 写慢了"——设备只要拖延 ack,桌面自然降速。

n 字段 = 进度

返回累积字节数,给桌面提供 progress bar 数据源——不用单独算。

PATH 校验 = 接收方责任

协议规范要求接收方拒绝 .. 和绝对路径。防御纵深做成协议合规——桌面被攻破往设备发恶意 path 时,设备自身仍要拒绝。

内容无关 = 协议复用

GIF、配置、固件镜像都行。意味着协议未来可以在不修改 wire format 的情况下扩展支持新内容类型——OTA、wallpaper、sound pack。协议 = 抽象,不是具体功能。

6.6 / 角色包 manifest 格式

Folder Push 传输的内容里,manifest.json 的 schema:

{
  "name": "bufo",
  "colors": {
    "body": "#6B8E23",
    "bg": "#000000",
    "text": "#FFFFFF",
    "textDim": "#808080",
    "ink": "#000000"
  },
  "states": {
    "sleep": "sleep.gif",
    "idle": ["idle_0.gif", "idle_1.gif", "idle_2.gif"],
    "busy": "busy.gif",
    "attention": "attention.gif",
    "celebrate": "celebrate.gif",
    "dizzy": "dizzy.gif",
    "heart": "heart.gif"
  }
}

这个 manifest 是 Buddy 协议里唯一一处具体内容格式的强约束。其他所有 wire format 都是结构(消息族),manifest 是数据(资产)。把内容格式独立成一份小 schema 的好处:协议不变,资产可以独立演化——v2 加 sound 字段挂音效文件,老设备读到忽略,新设备启用。

§ 07 / HARDWARE

硬件参考实现

协议规范是抽象的。Anthropic 提供了一份具体硬件参考实现:M5StickC Plus。

7.1 / M5StickC Plus 按键映射

按键
普通
宠物页
审批页
A 正面
切换屏幕
切换屏幕
批准 ✓
B 侧面
滚动对话
翻页
拒绝 ✗
长按 A
进入菜单
进入菜单
进入菜单
电源短按
关屏
电源长按 6s
硬关机
晃动
触发眩晕
倒扣
休眠回血

屏幕 30 秒无操作自动关闭,有审批待处理时保持常亮

注意"按键含义随状态变化"——同一个按钮在不同 page 下意思完全不同。这是协议设计上让设备自己决定按键语义的体现:协议只规定"设备发 once/deny",不规定"哪个按键发哪个"。设备开发者完全自由。

7.2 / 刷机方法

# 安装 PlatformIO Core,然后:
pio run -t upload

# 从全新设备开始先清除:
pio run -t erase && pio run -t upload

仓库 platformio.ini 已经把 board、partitions、文件系统都配好。uploadfs target 单独写文件系统(用于角色包热更新)。

7.3 / 适配其他硬件

固件核心 ble_bridge.cpp 只依赖 Nordic UART Service,与硬件无关。M5StickCPlus 特定代码集中在 buddy.cpp 和显示驱动层。

需要换
  • · 显示驱动
  • · 按键 GPIO 映射
  • · IMU 接口(可选)
不用动
  • · BLE 层
  • · JSON 协议解析
  • · 状态机
备选硬件
  • · nRF52 系列
  • · ESP32-S3
  • · 树莓派 + BLE
  • · PC + USB BLE dongle

任何能广播 Nordic UART Service 的设备都能接入。协议的硬件无关性是设计的核心承诺——这也是为什么 NUS 选择如此重要(§ 4.2)。

PART II
设计分析
§ 08 / DECISIONS

六个关键决策

#
决策
替代方案
为什么选这个
代价
1
NUS over BLE
自定义 GATT
生态、调试、姿态
2
JSON
CBOR / MsgPack
调试、可读、任意语言
带宽 + base64
3
行分隔
长度前缀 / LTV
文本可读、零解析器
payload 不能含 \n
4
单次决策
once/always/whitelist
保护审批的物理摩擦
设备无法 cache 规则
5
无版本字段
v: "1.0"
现在简单
未来 schema 演化痛苦
6
4 KB Turn 上限
大帧分片传输
防滥用、保 BLE 带宽
长回复无法完整传
SYNTHESIS / 综合判断

每个决策单看都合理。串起来读会发现一个模式:Buddy 在"现在简单"和"未来灵活"之间,反复倒向"现在简单"。这是早期产品的合理选择——但它意味着 v2 必然要做破坏性升级。设计者对此显然心知肚明(仓库 2 commits、文档明确说"还没有版本协商")。

§ 09 / DESIGN

四个值得注意的设计

9.1

协议层不感知 MTU

通过 \n 分隔 + 字节流写入,把 BLE MTU、分包、重组推给两端缓冲。让协议在传输层升级时零修改

9.2

Path 校验责任放接收端

不是简单的"双端都校验"——是明确把校验责任写进协议规范。任何接 Buddy 的设备必须实现,否则"协议合规"不成立。

9.3

Chunk-by-Chunk ACK 天然流控

应用层 ack/n 既是确认、又是 progress 数据源、又是流控信号。一个字段三种用途。比拆成 ack + progress + flow_control 干净得多。

9.4

主机预聚合 + 设备哑显示

entries 是字符串、tokens 是累加值——设备拿到的就是"最终展示形态",零计算开销。设备固件可以很小,evolution 路径主要在主机侧。

§ 10 / GAPS

五个明显缺口

公平起见,把缺口也列清楚。

  1. 10.1

    没有版本协商

    协议没有 version 字段。schema 加新字段还能容忍(JSON 容忍未知 key),但语义变化(如 decision: "once" 改名)会直接挂掉,无告警。

    修复路径:在 status ack 加 proto: "1.0.0",桌面据此降级。

  2. 10.2

    单决策权限模型缺规则引擎接口

    协议禁止 always 是合理设计(§ 6.2),但意味着无法在协议层做规则引擎——比如"读操作自动批 / 写操作要人工"。要做这个必须在桌面外加中间代理。

    这是有意的——Buddy 强调"人在回路"。但规则引擎用例应该有另一份协议覆盖,Buddy 不该做。

  3. 10.3

    无工具调用进度事件

    设备只看到"有 N 个 running",看不到具体执行到哪一步。Bash 命令跑 3 分钟,设备无法显示"已执行 1m20s"。

    修复路径:加 evt: "tool_progress" 事件流,每 5s 推一次。

  4. 10.4

    不能区分多会话

    设备看到聚合后的 total / running / waiting。如果同时开 5 个 Claude Code 会话、3 个要审批,无法精确点到具体会话。单设备单用户 OK,团队场景废。

    修复路径:心跳里加 sessions: [...] 数组。

  5. 10.5

    单向(设备不能 push 内容回去)

    设备只能:① 回审批决策、② 上报状态。不能 push prompt、不能评论 Claude 回复、不能触发模式切换。基于 Buddy 协议你做不出"按 B 让 Claude 总结当前会话"。

    这是当前定位决定——是"指示器+开关",不是"输入设备"。Anthropic 现在不放是合理的克制,§ 15 会展开。

§ 11 / SECURITY

威胁模型 +
LE Secure Connections 的取舍

攻击面

Buddy 协议传输:

未加密的 BLE 链路在 ~10m 范围内可被廉价 nRF 嗅探器(< $30)实时记录。文档明确建议实现 LE Secure Connections bonding,但没有强制

为什么不强制加密?

  1. 1. Maker 友好:很多 maker 用的开发板默认不开 BLE 加密。强制会大幅提高接入门槛
  2. 2. 配对 UX 痛:BLE bonding 需要用户输入 6 位 passkey 或 yes/no——没屏幕的设备很麻烦
  3. 3. 威胁模型现实主义:能物理接近你工位的人,多半已经能看到屏幕——加密 BLE 不能阻止 over-the-shoulder

我的判断:对个人 dev 桌面 OK,对企业环境完全不 OK。Anthropic 想推 Buddy 进 SOC2/HIPAA 合规环境,bonding 必须强制。这就需要协议层加 sec: required 字段。

防御层级

实现 production-grade 的 Buddy 设备应该:

必须
  • 1. 实现 path traversal 校验
  • 2. prompt.id 严格匹配(拒 echo 旧 id)
建议
  • 3. LE Secure Connections + DisplayOnly + 6-digit passkey
  • 4. NUS Char + TX CCCD 标 encrypt-only
  • 5. 广播只在用户按按钮后开启 60 秒
可选 — 但有意思

6. 在 device 上加 deny 黑名单——某些 tool name(比如 Bash 含 rm -rf /)即使用户按 A 也拒绝执行。让设备拥有否决权而不只是批准权。这超出了协议明文规定,但合规——协议允许设备 deny,没规定 deny 依据必须是用户按键。

PART III
协议栈定位
§ 12 / ECOSYSTEM

Anthropic 的六份协议

到 2026 年,Anthropic 已经有六份对外、面向开发者的协议规范。它们一起构成围绕 Claude agent 的开放接口表面。

协议
范围
传输
序列化
主导方
推出
MCP
agent ↔ 外部数据/工具
stdio · SSE · HTTP
JSON-RPC 2.0
第三方工具方
'24-11
Skills
agent ↔ 用户脚本
文件系统约定
MD + YAML frontmatter
用户/插件作者
'25
Hooks
agent ↔ 用户钩子
stdin / HTTP / MCP
JSON
用户
'25
Permissions
agent ↔ 安全策略
配置文件
JSON DSL
用户/管理员
'24-25
Remote Ctrl
agent ↔ 远程人类
HTTPS over 云
(未公开)
Anthropic
'26-02
Buddy BLE
agent ↔ 物理近场
NUS / BLE
JSON · line
任意 maker
'26

每份协议覆盖 agent 工作流的不同切面:

                ┌─ 工具发现/调用       MCP
                ├─ 用户编排/playbook   Skills
agent 工作流  ←──┼─ 事件/钩子           Hooks
                ├─ 边界/策略           Permissions
                ├─ 远程控制           Remote Control
                └─ 物理近场指示       Buddy BLE  ← Buddy 占的格
§ 13 / NICHE

Buddy 唯一覆盖的层
—— 物理近场

前五份协议都是软件接口或网络协议——你用代码、配置、HTTPS 跟 agent 交互。Buddy 是第一份明确把"物理近场设备"作为协议合作方的规范。

为什么这层值得独立协议?软件接口(MCP、Hooks)可以在 agent 运行时注入工具或钩子,但解决不了"agent 在后台跑你怎么知道"的问题——你得切窗口去看。物理近场设备正好补这个缺口:不夺焦点地让 agent 状态可被感知

永远在视线内

不需要打开窗口

动态吸引余光

人眼对动态比静态敏感得多

物理交互摩擦

按一下硬件按钮 ≠ 点击 OK

Buddy 是为这三件事设计的。它不能替代屏幕,但补充屏幕——专门服务"agent 状态需要被余光感知"这个特定场景。

这是一个新的 surface area。Anthropic 用一份小协议占住它,让 maker 社区先填内容。等三年后这个 surface 被验证有产品价值,他们再决定要不要发自己的官方硬件。

§ 14 / DIFF

横向对比深度

vs MCP — 都是 JSON 但目标受众相反

维度
MCP
Buddy
调用模式
RPC(请求-响应)
event stream + 单点回应
谁主动
agent 主动调工具
桌面主动推状态
实现方
工具开发者
硬件 maker
接入门槛
写一个 npm/pip 包
烧一段固件
编程范式
服务端
嵌入式

虽然都用 JSON、都被 Anthropic 设计、传输层都可能是 stdio/socket——面向的人和场景天差地别。把它们合并是错误——协议设计要适配读者,不是追求统一。

vs Remote Control — 同样的问题,相反的解

Remote Control(2026-02 推出)和 Buddy 都解决"如何不在主机前操作 agent"。但解法相反:

维度
Remote Control
Buddy
网络拓扑
客户端 → 云 ← 主机
设备 ↔ 主机(直连)
传输
HTTPS over TLS
BLE NUS
范围
全球
~10m
认证
claude.ai 账号
BLE 配对
数据流
经过云
完全本地
适用场景
出差、跨机器
桌面、ambient、低延迟

这两个协议互补,不是竞争。Remote Control 解决"我不在电脑前但需要继续 agent 工作",Buddy 解决"我在电脑前但不想被弹窗打断"。

Anthropic 同时有这两条协议——一条云中转、一条本地直连。不同问题用不同物理拓扑解,互补,不竞争。

vs Computer Use — 方向相反的可见性

Computer Use 让 agent 看到屏幕、操作鼠标——agent 看见桌面。Buddy 让桌面看到 agent 的内部状态——桌面看见 agent。

Computer Use:    agent ──观察 / 操作──→ desktop   // agent 是主动方
Buddy:           desktop ──状态 / 决策──→ agent     // 人/物理设备是主动方

两者都是 agent 与物理世界的接口,但方向相反。组合起来——agent 看屏幕调试代码、人在 ambient 设备上批准 git push——是 2026 年 agent 工作流的完整形态。

vs Hooks — 协议形态对比

Hooks 是 in-process 的事件钩子——PreToolUse / PostToolUse / PermissionRequest 在 agent 执行流里同步触发。Buddy 在概念上类似 PermissionRequest 钩子的"硬件实现版"。

维度
Hooks
Buddy
部署
用户配置文件
物理设备
延迟
< 100 ms
100 ms – 2 s
信任
同主机进程
BLE 链路(需加密)
写在哪
shell / Python / HTTP
C++ 固件

Anthropic 没把 Buddy 合并进 Hooks 是对的——Hooks 给开发者写代码,Buddy 给 maker 接硬件。两类受众的协议形态需要不同。

PART IV
未来
§ 15 / EVOLUTION

五个演化方向

未来 5 年,agent ↔ hardware 通信协议会朝哪几个方向演化?

  1. 15.1

    双向意图

    当前 Buddy 是"主机推 + 设备回审批"的单向偏向。下一步是让设备能主动 push 给 agent

    • · 桌上一个语音按钮,按住说话 → 转 prompt → push 到当前 Claude 会话
    • · 一个温湿度传感器,每小时把环境数据 push 给 agent 当上下文
    • · 一个 NFC 卡贴在文件夹上,刷一下让 agent 读取那个文件夹

    需要在协议里加 cmd: "user_input" 通道。安全模型变得复杂——需加 push 频率限制、内容长度限制、主机端 user-confirm 弹窗。

  2. 15.2

    本地优先 / 无中介

    Buddy 已经本地直连。Remote Control 是云中转。未来会有第三种:本地多台设备组网,不需要任何一台访问云。

    具体形态:一台 Mac + 一个 iPad + 一个桌面 ambient + 一个手腕震动器,全部 BLE 互联,agent 状态在四个 surface 上同步、任何一个的决策被另外三个看到。

    技术底座:Matter / Thread / BLE Mesh / UWB。这些标准已成熟,缺的是"agent 状态"的语义层标准化——Buddy 协议就是这个 schema 的雏形。

  3. 15.3

    多设备 fan-out

    一个 agent 状态推给多个 ambient peripheral。1:1 → 1:N

    • · 一台 Mac → buddy + LED 灯条 + e-ink 仪表盘 + 手腕震动器
    • · 不同 surface 显示不同抽象层级

    需要协议加订阅/过滤机制——设备告诉主机"我只关心 attention 事件",主机就只对它推这类事件。

  4. 15.4

    能力协商

    未来必须加握手阶段

    device → host: {"hello":{"proto":"1.2","caps":["nus","char_push","voice_in"]}}
    host → device: {"hello_ack":{"proto":"1.2","negotiated":["nus","char_push"]}}

    HTTP/SMTP/TLS 都解决过。Buddy 现在简单是因为只有一个参考实现;一旦 maker 社区做出 100 种设备,capability negotiation 就是必需。

  5. 15.5

    分级信任传输

    不同决策权重应该走不同物理通道:

    决策类型
    推荐传输
    信任根
    看状态(只读)
    BLE / WiFi / 云
    任意
    批准只读工具
    BLE 配对设备
    一次配对
    批准写文件
    BLE + 设备 PIN
    配对 + 本地认证
    批准 prod 部署
    USB + 物理键 + 第二人
    接触 + 多方
    批准转账/删数据
    NFC + 生物识别
    物理 token + 生物

    不同操作的 blast radius 不同,认证强度应该成比例。当前 Buddy 把所有 permission 当一类——是早期合理简化,未来必然要拆分。

§ 16 / PROPOSALS

三个应该存在的协议

这一节是个人意见。基于上面的分析,我觉得有三个 agent-hardware 协议值得存在但还没人做。

PROPOSAL / 01 VOICE / GESTURE ~$30

Agent Wake

给 agent 一个物理唤醒入口

问题:现在调起 Claude 必须开电脑、打开窗口、敲字符。如果只想说一句"帮我查下今天天气",全套流程过重。

协议:BLE 设备广播 Wake_*,主机连上后接收 PCM 音频流({cmd:"audio", d:"<base64>"})。设备有按键、麦克风、可能小屏。按住说话,松开就把整段音频 push 给 agent。

对比 Echo:Echo 是云路由——你说"Alexa..."全程在 AWS。Wake 协议要求音频本地处理,只在 BLE 范围内传输。

实现门槛:~30 美元(ESP32 + I2S 麦 + 按键 + 3D 打印外壳)。

PROPOSAL / 02 QUORUM FINSEC

Distributed Approval

多设备投票

问题:高风险操作(删数据库、prod 部署、大额转账)只让一个人在一个设备上批不够。但要求"两个人到一个房间双人确认"又太重。

协议:高风险操作发出后,主机把审批请求广播到一组绑定的设备。N 中 M 个设备批准(如 3 中 2)才执行。每个设备独立运行 Buddy 协议,主机做投票聚合。

协议增量:在 prompt 字段加 quorum: {n: 3, m: 2},主机收到任一设备 decision: "once" 时计数,达到 m 就执行。

适用场景:金融机构、医疗系统、生产部署。Yubikey 的 agent 形态。

PROPOSAL / 03 PEER-TO-PEER A2A

Agent-to-Agent BLE

邻近 agent 协作

问题:你的 Mac 跑 Claude Code、你同事的 Mac 也跑——两个 agent 之间没有任何协作通道(除了让人在 Slack 转贴)。

协议:两台 Mac 上的 Claude 互相广播 ClaudePeer_*,配对后建立反向 NUS 桥。每个 agent 可 query 对方的 session list、push prompt 到对方会话、订阅对方的 turn 事件。形成一个桌面级 agent 局域网

为什么 BLE 而不是 WiFi/IP:物理半径就是信任半径。BLE 范围内的是同一个房间的人,本身就是粗粒度访问控制。WiFi/IP 可让任何同 LAN 的攻击者扫描到你的 agent。

适用场景:pair programming(双方 Claude 共享上下文)、code review(让对方 agent 检查你的 PR)、家庭多用户共享 agent。

§ 17 / STYLE

Anthropic 的协议风格

回看 § 12 那张协议表,这六份协议没有一份是完整的产品级 SDK。都是最小化规范:

规律很明显:先定接口、不做工具链、让社区填实现。Buddy 是这个模式的最新一例——接口位置定住了,官方固件只是个参考起点。

对开发者来说,这意味着两件实际的事:

1. 别等 Anthropic 出完整工具链——他们的协议是接口规范,不是平台,生态建设要自己来

2. 早做早有优势——每份协议的早期生态都缺好的实现,这个窗口不会一直开着

CODA

这些限制不是疏漏,是设计决策——审批有摩擦、协议足够简单能 fork、设备不能绕过人。

值得读这份协议的原因不是它现在能做什么,是它定住了一个此前没有协议的位置:agent 与物理近场硬件之间的接口。这个位置现在是空的,官方实现也只是个起点。

CLAUDE DESKTOP BUDDY · 二部曲
FIELD NOTE / № 01 — 产品视角

价值篇

为什么 Buddy 重要、它指向什么 UX 趋势 · 状态表 + 一天叙事 + 行动梯度

▢ 已发布
DEEP DIVE / № 01 — 技术视角

协议深潜

协议拆解 + 设计分析 + 协议栈定位 + 未来预测 · BLE 到 agent-hardware 通信的全貌

▣ 阅读中