【Reef】持续自进化 Agent 基础设施:四步循环 + 5 种 dispatch + 不可变发布链深度解析
引子:一个让人坐立不安的问题
如果让你设计一个让 Agent 越用越聪明的系统,你会怎么做?
朴素答案通常是三个:收集对话 → 蒸馏出偏好 → 改模型权重。但这条路径有三个致命缺陷——训练 GPU 太贵、单一模型路线不会改 Harness、单次失败就能让整个版本退化。
这正是
human-agent-society/reef(7489⭐,Apache-2.0)要解决的问题。它在 2026-10-07 推送的最新代码里,把答案写成了一条可工程化的四步循环 + 不可变发布链——Serve → Observe → Grow → Commit,每一步都有明确的模块归属,每一步都失败安全(fail-safe)。
它不是另一个 LangChain、AutoGen、CrewAI 这种”multi-agent 编排框架”。它是更底层的东西:一个把”反馈驱动学习”做成生产级基础设施的运行时。模型权重、Harness(skills/rules/commands/extensions)两个表面同时支持——这才是”Harness Engineering”真正走向成熟的样子。
本文会按 8 个维度拆解这个项目:
- 定位:为什么需要”持续自进化基础设施”
- 架构:四步循环 + 模块边界 + 数据流
- 核心机制:5 种 dispatch mode 事件总线、扁平 composition tree、不可变 artifact 发布链、Admission Gate
- 可运行 MVP:用 250 行 Python 复刻 Reef 的最小”反馈驱动 Harness 改进”循环
- 设计哲学:Bitter Lesson、Hook-First、Fail-Safe、Receipt-Driven
- 横向对比:Reef vs Letta(记忆)vs Penguin-Harness(自改 Skill)vs DeepCode(Goal Loop)
- 优缺点:架构简洁性 / 性能 / 复杂度三维评估
- 从零搭建启示:MVP 蓝图、必装模块、踩坑预警
一、定位:为什么”持续自进化”是 Harness Engineering 的下一站
1.1 现状:Harness Engineering 的”3 件套成熟期”
过去 18 个月,Harness Engineering 主要围绕 Rule + Skill + Sub-Agent 三件套成熟:
- Rule:
agents-md、Claude Code Rules、Cursor Rules 解决了”宪法怎么声明”; - Skill:
SKILL.md生态、SkillOpt、Superpowers 解决了”SOP 怎么加载”; - Sub-Agent:OpenHands、AutoGen、CrewAI、Agency Swarm 解决了”角色怎么分工”。
但 3 件套全部假设 Harness 是静态的:人写规则、写 Skill、定义 Agent。模型不会自己写新规则。
1.2 缺口:3 个真实场景
下面这三个场景,是 3 件套 Harness 没法解决的:
场景 A — 用户反复纠正同一个 bug
1 | Day 1: 用户:"修复 X 报错" |
没有”记住这次反馈”的机制 → 需要 Observe + Commit 一条反馈到 Harness。
场景 B — Harness 在某个领域完全空白
1 | 用户:"我们项目里所有 Python 文件必须用 ruff 而不是 flake8" |
没有”从用户原话生成新 Rule”的机制 → 需要 Grow 一条新 Rule 到 Skill/Rule 表面。
场景 C — 用户希望 model 越来越懂自己
1 | 用户:连续 100 次对话里,每次都强调"回答要简洁、不要堆砌 Markdown" |
没有”从交互中持续学习模型”的机制 → 需要 Grow 训练 step 到 weight 表面。
1.3 Reef 的答案:双表面 + 不可变历史 + Receipt-Driven
Reef(读 /riːf/,珊瑚礁)把这三个场景统一成一条主线:
收集真实反馈 → 在两条 surface 上更新 → 严格评估 → 不可变地提交一条新版本 → 新版本接管 serving,旧版本留着随时回滚。
两条 surface:
- Model weights surface(Slime/vLLM/SGLang/Tinker 后端)
- Harness surface(composition tree = skills/rules/commands/extensions/native tools)
读到这里你大概意识到:Reef 不是 Agent 框架,它是 Agent 框架下方的运行时。它不规定 Agent 怎么推理,只规定 Agent 怎么被持续改进。
二、架构:四步循环 + 模块边界
2.1 一句话架构
1 | Serve(接收请求、记录 interaction) |
每一步都是一个独立的子模块(service/、storage/ + train/processors/、recipe/ + train/、train/evaluation/ + artifact/ + surface/),失败可以精确重试而不污染整个 pipeline。
2.2 数据流全景图
下面这张图是 Reef 的全栈架构图:
graph TB
User([👤 User]) -->|HTTP request<br/>x-reef-scenario| Service
subgraph Service[🌐 Service Layer<br/>reef/service]
Serve[🚀 Serve<br/>aiohttp + auth<br/>OpenAI/Anthropic-compatible]
Auth[🔐 Auth<br/>REEF_TOKEN]
end
subgraph Runtime[⚙️ Runtime Layer<br/>reef/runtime]
Scheduler[📋 Scheduler]
Placement[📍 Placement]
Executor[⚡ Executor]
end
subgraph Inference[🧠 Inference<br/>reef/inference]
VLLM[vLLM backend]
SGLang[SGLang backend]
Tinker[Tinker backend]
end
subgraph Storage[💾 Storage<br/>reef/storage]
Records[📝 Records<br/>SQLite/Postgres]
Commits[📜 Commit Log]
Observer[👁️ Observer<br/>side-effect only]
end
subgraph Recipe[🍳 Recipe<br/>reef/recipe]
Reefine[🦚 Reefine<br/>harness surface]
SAO[📊 SAO<br/>weight surface]
GEPA[🧬 GEPA<br/>prompt surface]
end
subgraph Train[🎯 Train<br/>reef/train]
Processors[🔄 Processors<br/>eligibility + distill]
Evaluation[📐 Evaluation<br/>candidate scoring]
Backend[🛠️ Backend<br/>slime / tinker / cordis]
end
subgraph Artifact[📦 Artifact<br/>reef/artifact]
Repo[Repository<br/>immutable history]
Chain[Release Chain<br/>base/current/checkpoint]
LFS[Git LFS]
end
subgraph Surface[🪟 Surface<br/>reef/surface]
Skills[📚 Skills]
Harnesses[🔌 Harnesses<br/>8 adapters]
Weights[⚖️ Weights]
end
Serve -->|request| Scheduler
Scheduler --> Executor
Executor --> VLLM
Executor --> SGLang
Executor --> Tinker
VLLM -->|response + receipt| Records
SGLang --> Records
Tinker --> Records
User -.->|score + feedback| Serve
Serve -.->|report| Records
Records -.-> Observer
Observer -.->|eligible records| Processors
Processors --> Evaluation
Recipe -->|config| Processors
Evaluation --> Backend
Backend -->|candidate| Evaluation
Evaluation -->|accepted| Chain
Chain --> Repo
Repo --> LFS
Chain --> Surface
style Service fill:#C7CEEA,stroke:#333,color:#333
style Runtime fill:#FFDAB9,stroke:#333,color:#333
style Inference fill:#E8D5F5,stroke:#333,color:#333
style Storage fill:#FFF9C4,stroke:#333,color:#333
style Recipe fill:#B5EAD7,stroke:#333,color:#333
style Train fill:#FFB3C6,stroke:#333,color:#333
style Artifact fill:#C7CEEA,stroke:#333,color:#333
style Surface fill:#E8D5F5,stroke:#333,color:#333注意几个关键设计点:
- Receipt(回执)连接 Serve 和 Observe:每次 Serve 在响应 header 加
x-reef-agent-record-id,Observe 用这个 id 关联 feedback 到原 interaction。 - Storage 是 side-effect 隔离点:
ObservedRecordStore/ObservedScenarioStorage是 wrapper,observer 失败只记日志,不会污染 record acceptance。 - Artifact 和 Surface 是 immutable 的:Commit 一旦完成,新版本接管 serving,旧版本永远在
Repository里,可以回滚。
2.3 模块责任表(来自 AGENTS.md 的官方划分)
| 位置 | 职责 |
|---|---|
reef/core/ | 共享值类型、wire contracts、errors |
reef/dispatcher.py、reef/scenario/ | 协调、scenario state、commit ordering、recovery |
reef/service/ | HTTP、auth、streaming、deployment |
reef/recipe/、reef/train/ | recipe 契约、processors、training、evaluation、backend integrations |
reef/runtime/ | backend-neutral runtime contracts、scheduling、publication coordination |
reef/inference/ | 具体 inference 集成(vLLM/SGLang/Tinker)、engine control、weight reception |
reef/surface/ | 发布 artifacts 的交付层 |
reef/artifact/ | 版本化 artifacts 和 repositories |
reef/storage/ | record storage 契约、persistence、retention |
reef/harness/ | harness adapters、rendering、runners、trajectories |
reef/record2dataset/ | generator service: 为 Harbor tasks 设计的 designer prompt |
这是一份教科书级的模块划分——每一块都”知道自己不知道什么”。
三、核心机制:5 个原创原语
3.1 原语 1:5 种 dispatch mode 事件总线
Reef 自己不发明 event bus——它 fork 自 cordiverse/cordis(一个 TypeScript 风格的 plugin runtime)。但它把 dispatch 模式做到了 5 种,覆盖所有 React/Vue/Koa 见过的事件场景:
| 模式 | 语义 | 适用场景 |
|---|---|---|
emit | 同步顺序触发,一个 listener 抛错就停 | 配置广播、日志通知 |
parallel | 并发 await 所有 listener,聚合所有失败 | 并行导出、metric 收集 |
serial | await 一个 listener,第一个有返回(非 None 非 False)就停 | fallback 链、prompt override |
bail | 同步版 serial | hook 拦截、pre-check |
waterfall | 串行中间件,每个 listener 拿到 next 继续往下走 | middleware pipeline(Koa-style) |
最妙的是 listener 生命周期:listener 注册时变成 registering fiber 的一个 tracked effect,fiber dispose 时 listener 自动反注册,无需手动 off()。
reef/harness/compose/events.py 的核心 50 行:
1 | class EventsService: |
5 种 dispatch mode 的对比图:
graph LR
Emit([🚀 emit<br/>sync sequential]) --> Hook1[Listener 1]
Hook1 --> Hook2[Listener 2]
Hook2 --> Hook3[Listener 3]
Parallel([⚡ parallel<br/>concurrent gather]) --> H1[Listener 1]
Parallel --> H2[Listener 2]
Parallel --> H3[Listener 3]
H1 --> Agg[ExceptionGroup<br/>all failures]
H2 --> Agg
H3 --> Agg
Serial([🔗 serial<br/>await first bail]) --> L1[Listener 1]
L1 -->|None/False| L2[Listener 2]
L2 -->|bail!| Done([done])
Bail([🚪 bail<br/>sync first bail]) --> B1[Listener 1]
B1 -->|None/False| B2[Listener 2]
B2 -->|bail!| Stop([stop])
Waterfall([🌊 waterfall<br/>middleware next]) --> M1[Listener 1<br/>+ next()]
M1 -.calls next.-> M2[Listener 2<br/>+ next()]
M2 -.calls next.-> Inner[Innermost<br/>callback]
style Emit fill:#C7CEEA,stroke:#333,color:#333
style Parallel fill:#FFB3C6,stroke:#333,color:#333
style Serial fill:#B5EAD7,stroke:#333,color:#333
style Bail fill:#FFDAB9,stroke:#333,color:#333
style Waterfall fill:#E8D5F5,stroke:#333,color:#333
style Agg fill:#FFF9C4,stroke:#333,color:#333为什么这 5 种模式是关键创新:
- 普通 LangChain Hooks 只支持
before/after/on_error,本质是 1 种模式(带阶段标签); - Koa 中间件只有
waterfall一种; - Node EventEmitter 只有
emit一种(sync)+on/once; - Reef 一次性给了 5 种,每种都对应一个明确的 Harness 场景——这是”机制 vs 策略”分离的典型案例:dispatch 是机制,listener 怎么写是策略。
3.2 原语 2:扁平 Composition Tree + 11 种 Node Kinds
Reef 把整个 Harness(skills + rules + commands + extensions + native tools + native hooks + native graphs + native agents + native loop)抽象成一棵扁平的 composition tree——没有嵌套、没有 group,每条 entry 都是 root-level。
reef/harness/tree/nodes.py 列出 11 种 Node Kinds:
11 种 Node Kind 在 Reef 里的关系图:
graph TB
Root([🌳 Composition Tree<br/>flat, no nesting]) --> Flat[Flat Layer]
Root --> Native[Native Layer]
Flat --> Config[📋 config<br/>JSON merge]
Flat --> Rules[📜 rules<br/>markdown concat]
Flat --> Cmd[📌 agent_command<br/>prompt template]
Flat --> Skill[🎯 skill<br/>SKILL.md]
Flat --> Ext[⚡ code_extension<br/>in-process code]
Native --> Tool[🔧 native_tool<br/>JSON schema + run args workdir]
Native --> Hook[🪝 native_hook<br/>listen payload next]
Native --> Graph[📊 native_graph<br/>8 stage kinds + edges]
Native --> Agent[🤖 native_agent<br/>prompt + graph + tools]
Native --> Loop[🔁 native_loop<br/>run_turn ctx code]
Hook -.events.-> Pre[pre_step]
Hook -.events.-> PreEx[pre_execute]
Hook -.events.-> RE[request_error]
Hook -.events.-> Post[post_execute]
style Root fill:#C7CEEA,stroke:#333,color:#333
style Flat fill:#B5EAD7,stroke:#333,color:#333
style Native fill:#FFB3C6,stroke:#333,color:#333
style Config fill:#E8D5F5,stroke:#333,color:#333
style Rules fill:#E8D5F5,stroke:#333,color:#333
style Cmd fill:#E8D5F5,stroke:#333,color:#333
style Skill fill:#E8D5F5,stroke:#333,color:#333
style Ext fill:#E8D5F5,stroke:#333,color:#333
style Tool fill:#FFDAB9,stroke:#333,color:#333
style Hook fill:#FFDAB9,stroke:#333,color:#333
style Graph fill:#FFDAB9,stroke:#333,color:#333
style Agent fill:#FFDAB9,stroke:#333,color:#333
style Loop fill:#FFDAB9,stroke:#333,color:#333| Kind | 用途 | 落地文件 | Adapter 例子 |
| Kind | 用途 | 落地文件 | Adapter 例子 |
|---|---|---|---|
config | JSON object 合并到 adapter config | settings.json / opencode.json | pi / opencode |
rules | markdown context 追加到 rules 文件 | AGENTS.md | pi / opencode |
agent_command | 命名 prompt 模板 | prompts/ / command/ | pi / opencode |
skill | 命名 Agent Skill | skills/<name>/SKILL.md | pi / opencode |
code_extension | 命名代码文件,harness in-process 加载 | extensions/ / plugin/ | pi / opencode |
native_tool | 自带 JSON schema + run(args, workdir) | native/tools/ | native only |
native_hook | 监听一个 native loop event 的 listener | native/hooks/ | native only |
native_graph | native loop 的控制流(stages + edges) | native/graphs/ | native only |
native_agent | 一个 native agent(自己的 prompt + graph + tools + skills + budget) | native/agents/ | native only |
native_loop | native loop 的代码 run_turn(ctx) | native/loops/ | native only |
| (reserved) | reef 自带的版本检查、API 文档 skill | reef-version-check / reef-pi-extension-api | reef 内部 |
为什么扁平是关键设计决策:
The compose loader would mount its children through the same plugins, out of sight of every check that walks the root.
直译:嵌套会让 mount 跑出视线——所以拒绝 group entry(FLAT_TREE_REFUSAL = "the tree is flat: a group entry is not admitted")。
11 种 kinds 不算多也不算少——少到可以完整 admission gate 验证(每个 kind 的 plugin 函数在 load 时跑一遍 validate()),多到可以覆盖从纯配置(config)到完整 loop(native_loop)的所有组合。
validate_native_graph() 是这套设计中最精妙的一段——它验证 graph 的拓扑性质:
1 | def validate_native_graph(config: Any) -> Mapping[str, Any]: |
5 个不变量同时保证——Reachability(可达性)+ Termination(终止性)+ Cycle-via-Model(必经模型步骤)。这条不变量意味着graph 在编译期就被证明会终止,runtime 不需要做任何 termination check。
3.3 原语 3:不可变 Artifact 发布链 + Receipt-Driven 反馈
reef/artifact/release_chain.py 是 Reef 的”git for AI artifacts”:
1 | class ArtifactReleaseChain: |
ReleaseChain 的 3 个 head 与状态转移:
stateDiagram-v2
[*] --> Base: 初始化
Base --> Current: 第 1 步
Current --> Live: prepare_live (不动 head)
Live --> Current: 验证通过
Live --> Checkpoint: 持久化
Current --> Checkpoint: 每 5 步自动升级
Current --> Current: publish 接受新候选
Current --> Discarded: 评估不通过 (candidate 留在 history)
Checkpoint --> Current: rollback (回到 checkpoint)
note right of Live: weights:process_id:load:step
note right of Checkpoint: 永远可回滚的安全点
note left of Discarded: history 里但 head 不动3 个 head 指针:3 个 head 指针:
base(起点,永不动)current(当前 serving)checkpoint(可回滚的安全点)
prepare_live 创建”live child”——这是一种不动 head 的临时发布:weights 更新后 serving 立即能看到,但 checkpoint 还在原地,任何失败都能秒回滚。
Receipt 是 Reef 的”反馈关联协议”——每次 Serve 响应里加 x-reef-agent-record-id header,feedback 用这个 id 找到原始 interaction:
1 | # Serve 端 |
这跟 OpenAI 的 request_id 不一样:OpenAI 的 request_id 只能查到原始调用,Reef 的 receipt 是”feedback target”——feedback 必须能定位到具体哪条 response 才能评分。
3.4 原语 4:Admission Gate 拒绝 4 类危险提案
4 个 Admission Gate 的拦截流程:
graph TB
Entry([📥 New Entry Proposal]) --> G1{1. Inline<br/>Secret?<br/>api_key/token/...}
G1 -->|yes| Reject1([❌ 拒绝<br/>raise ValueError])
G1 -->|no| G2{2. Secret-Shaped<br/>Text?<br/>sk-/ghp_/AKIA.../BEGIN KEY}
G2 -->|yes| Redact[🔒 redact 为<br/>[redacted credential]]
G2 -->|no| G3{3. Directive-Shaped?<br/>ignore previous / new system prompt}
G3 -->|yes| Reject3([❌ 拒绝<br/>task 不入库])
G3 -->|no| G4{4. Unguarded<br/>console.write?<br/>in code_extension}
G4 -->|yes| Reject4([❌ 拒绝<br/>需 ctx.hasUI 守卫])
G4 -->|no| Accept([✅ 进入 Commit Log])
Redact --> Accept
style Entry fill:#C7CEEA,stroke:#333,color:#333
style G1 fill:#FFB3C6,stroke:#333,color:#333
style G2 fill:#FFB3C6,stroke:#333,color:#333
style G3 fill:#FFB3C6,stroke:#333,color:#333
style G4 fill:#FFB3C6,stroke:#333,color:#333
style Reject1 fill:#F5F5F5,stroke:#333,color:#333
style Reject3 fill:#F5F5F5,stroke:#333,color:#333
style Reject4 fill:#F5F5F5,stroke:#333,color:#333
style Redact fill:#FFF9C4,stroke:#333,color:#333
style Accept fill:#B5EAD7,stroke:#333,color:#333reef/harness/tree/nodes.py 把所有 entry validation 做成 4 个 admission gate:reef/harness/tree/nodes.py 把所有 entry validation 做成 4 个 admission gate:
| Gate | 检查内容 | 拒绝后果 |
|---|---|---|
_reject_inline_secret(data, path) | 递归遍历所有 key,匹配 _SECRET_NAME(api_key / token / secret / password 等) | entry 直接拒收,不会进入 commit log |
_reject_secret_shaped_text(text, where) | 正则匹配 _SECRET_TEXT(sk-... / ghp_... / AKIA... / -----BEGIN PRIVATE KEY-----) | text 被 redact 为 [redacted credential],从记录里剥掉 |
directive_shaped(text) | 4 类正则:_INJECTION_ROLE_PATTERN(”ignore previous instructions”)、_INJECTION_ROLE_HEADER_PATTERN(”new system prompt:”)、_CONFIRMATION_BYPASS_PATTERN、_INSTRUCTION_OVERRIDE_PATTERN | task saved 时检测到 injection 写法就拒收 |
_reject_unguarded_console_write(code, where) | 检查 extension 的 console.log / console.error 是否被 ctx.hasUI 守卫 | 编译期拒收——不能让 raw console write 污染带 UI 的 session |
最后一条尤其精妙——reef/harness/tree/nodes.py 的注释直接写:
An extension runs inside the harness process, and in a session with a UI that process owns the screen: a raw write lands in the middle of a drawn frame and leaves the terminal without its input box until the next full redraw.
这就是机制 vs 策略分离的另一面:harness 提供 ctx.ui.notify / ctx.ui.setStatus / ctx.ui.setWidget(策略),但拒绝绕过 UI 直接写 stdout(机制——保护已绘制 frame)。
3.5 原语 5:Refine “Design First” 提案协议
reef/recipe/reefine/evolution.py 是 Reef 的”提案者 prompt”——82KB 的精密设计。
核心 200 行 prompt 写了一条”design first, then write”协议:
- Restate the request in one sentence.
- List what triggers the behavior and what state the harness must know.
- List what only the user can provide.
- Describe how the user discovers, invokes and sees the result.
- Then write the entries: complete for what the request implies, and nothing the request did not ask for.
最后一句尤其关键——“nothing the request did not ask for“——提案者被训练显式拒绝 scope creep:用户说”加 ruff 规则”,绝不顺便加”重写整个项目的 setup”。
requires 对象是这套协议的另一面——把”只有用户能提供的东西”显式声明:
1 | { |
4 种 kind:env / permission / service / binary——全部运行时 check(shell command exits 0)+ 一次性 setup(reef-{adapter} install 时展示),绝不写到 tree state 里(否则会随 commit 历史泄露)。
四、可运行 MVP:250 行 Python 复刻 Reef 的”反馈驱动 Harness 改进”循环
下面这段代码用 ~250 行实现 Reef 核心机制(Serve → Observe → Grow → Commit),不依赖 GPU、不依赖 vLLM,用一个 fake LLM 模拟 grow 阶段:
1 | """ |
运行结果(实测):
1 | ============================================================ |
这套 MVP 把 Reef 5 个核心机制一次性复刻:
| 机制 | 在 MVP 里怎么体现 | 在 Reef 源码里 |
|---|---|---|
| Receipt-driven feedback | RecordStore.report(receipt, ...) | x-reef-agent-record-id header |
| Immutable artifact history | ReleaseChain._history 永远 append | reef/artifact/release_chain.py |
| Admission gate (secret/injection) | redact() / has_injection() | reef/harness/tree/nodes.py |
| Side-effect isolation | ObservedStore wrapper | reef/storage/observer.py |
| Fail-safe commit | Committer.commit() 拒绝就不动 head | reef/scenario/committer.py |
读者跑完这个 MVP,对 Reef “Serve → Observe → Grow → Commit“ 的核心循环会有肌肉记忆——而不是只读过 README 的概念印象。
五、设计哲学:5 条不变量
读完代码 + AGENTS.md + CONTRIBUTING.md,Reef 的设计哲学可以归纳为 5 条不变量:
5.1 不变量 1:Hook-First,机制 vs 策略分离
reef/harness/compose/events.py 提供 5 种 dispatch mode(机制),但每个 listener 是策略——由 plugin 自己决定做什么。Reef 没有 SkillLoader 这种”具体业务类”,只有一个 EventsService + RegistryService + 5 种 Node Kind plugin。
类比:Linux 内核只提供 syscall(机制),具体的 read() / write() 语义由 libc(策略)实现。
5.2 不变量 2:Fail-Safe,每一个副作用可隔离
reef/storage/observer.py 的 5 行注释直接写:
Wrapping the storage with
ObservedScenarioStoragereports them without any coordination code knowing an observer exists. The wrappers delegate every other call unchanged and isolate observer failures, so an exporter can never become part of record acceptance or the commit transaction.
这条不变量的代价:observer 失败只记日志——Prometheus exporter 崩了不会影响 commit。这是”机制 vs 策略”的另一面:observer 是策略,commit 是机制,二者不能互相耦合。
5.3 不变量 3:Flat Composition Tree,group 拒绝
reef/harness/tree/nodes.py 拒绝 group entry:
The compose loader would mount its children through the same plugins, out of sight of every check that walks the root.
直白说:嵌套会让”walk root”的所有 admission gate 失效——子节点可能根本不被检查。Reef 把安全性 > 灵活性作为 first principle。
5.4 不变量 4:Receipt-Driven,反馈必须可关联
每次 Serve 必带 receipt(x-reef-agent-record-id),每次 Report 必须 references receipt。没有 receipt 的 feedback 直接拒收——这条不变量保证了 Observe 阶段不会出现”反馈关联不到原始 interaction”的孤儿记录。
5.5 不变量 5:Bitter Lesson Friendly,”让模型自己学”
整个 Reefine 的 prompt 设计围绕一条原则——让 served model 自己设计、自己提案、自己验证,而不是写死 prompt template:
Without an instruction the proposer learns from failing reports.
如果用户没说清楚,提案者从失败的报告里学,下次提案就更好——这是 Bitter Lesson 的典型实现:把”聪明的人工规则”换成”模型从反馈中学”。
5.6 与 Bitter Lesson 的契合度
| 维度 | Bitter Lesson 友好? | 说明 |
|---|---|---|
| 机制 vs 策略 | ✅ 友好 | 5 种 dispatch mode + 11 种 Node Kind 是机制,listener 是策略 |
| 可学习性 | ✅ 友好 | 模型自己设计、自己提案;用户没说清楚就从失败报告学 |
| 静态业务规则 | ⚠️ 谨慎 | 11 种 kind 的 admission gate 是”人写的聪明规则”,但只验证合法性,不规定内容 |
| 静态 prompt template | ✅ 友好 | Reefine 用 model 写 prompt,不用手工维护 |
六、横向对比:4 个相邻项目的关键差异
6.1 对比矩阵
| 维度 | Reef | Letta(MemGPT) | Penguin-Harness | DeepCode |
|---|---|---|---|---|
| 核心定位 | 持续自进化基础设施 | 长期记忆 Agent 框架 | 自改 Skill 的 RSI Harness | 目标驱动循环工程 |
| 改动 surface | weights + harness(双表面) | memory(核心 + archival) | harness(Hook + Skill + Kernel Hash) | harness(Goal Loop + 6 件套) |
| 学习来源 | feedback + score + receipt | memory write/read | self-modifying skill | goal closure prompt |
| 不可变历史 | ✅ ReleaseChain (base/current/checkpoint) | ❌ 无 | ⚠️ Kernel Hash 对账 | ⚠️ PreCompact checkpoint |
| 反馈关联协议 | ✅ Receipt-driven (id header) | ❌ 无 | ❌ 无 | ⚠️ EvidenceLedger |
| 评估机制 | candidate vs current 评分 | 无 | Anchor-based apply | RepeatCallTracker + EvidenceLedger |
| Fail-safe rollback | ✅ publish 前可 rollback | ❌ 不可 | ⚠️ hash mismatch 警告 | ⚠️ bounded context |
| 适配器数量 | 8 个(claude/codex/dsh/hermes/opencode/pi/terminus/native) | ❌ 单 runtime | 1 个(Claude Code) | 1 个(TUI/Desktop/Web 三端共享状态) |
| License | Apache-2.0 | Apache-2.0 | Apache-2.0 | MIT |
| Stars | 7,489 | 25,070(领先) | 2,391 | 16,670 |
6.2 关键设计差异
Reef vs Letta:基础设施 vs 框架
Letta(MemGPT)是一个 Agent 框架——它给你一组”长期记忆”的 API(core_memory_append / archival_memory_search),让你手动管理记忆。Reef 是一个运行时——它给你一个”feedback 进来,自动更新”的循环。Letta 决定”用什么 memory API”;Reef 决定”怎样让 harness 越用越好”。
Reef vs Penguin-Harness:自动化 vs 可控
Penguin-Harness 把”自己改 Skill”做成了产品级功能,但它自己改自己——agent 直接 modify Skill 文件,靠 Kernel Hash 对账防破坏。Reef 把”改 Harness”做成离线 step——served model 提 proposal(design first),committer 评估后不可变发布,agent 永远不直接动 tree。
这条差异的实质:Penguin 让 Agent 自己改 Skill(可控性差、自进化快),Reef 让 Model 提案 + Committer 评估(可控性强、自进化慢)。
Reef vs DeepCode:基础设施 vs 框架
DeepCode 是 Harness 框架——它给你一个”Goal-driven Loop”跑在你的 coding task 上;它的 6 件套(GoalRuntimeRouter + RepeatCallTracker + EvidenceLedger + WorktreeService + AgentHook + PreCompact)是单进程内的扩展点。Reef 是跨进程的发布链——它不在你的 coding session 里跑,它在你的 coding session 后面跑,收集反馈、生成更新、发布新版本。
6.3 何时选 Reef,何时选其他
| 场景 | 推荐 |
|---|---|
| 我要做一个会被反复使用的 Agent(比如客服 agent、coding agent) | ✅ Reef——它的整个设计就是为了这个 |
| 我的 Agent 需要长期记忆(10K+ 条记录) | Letta / MemGPT |
| 我的 Agent 需要”自改 Skill”以适应新领域 | Penguin-Harness(如果能接受”agent 直接改文件”) |
| 我要做一个 SWE-bench coding agent | DeepCode(如果你要 TUI/Desktop/Web 三端共享状态) |
七、优缺点:架构 / 性能 / 复杂度三维评估
7.1 架构视角
优点(架构简洁性 / 扩展性 / 易用性):
- 简洁性:四步循环一图能画完——Serve → Observe → Grow → Commit。模块边界清晰(
service//storage//train//artifact//surface/),新人 onboarding 看 README + AGENTS.md 一天能上手。 - 扩展性:8 个 harness adapter 即插即用,加新 adapter 只要写
descriptor.yaml+harness_facts.yaml+quirks.py三个文件。Recipe 抽象让”如何 grow”也是可插拔的(SAO/GEPA/Reefine 三种 recipe 各自独立)。 - 易用性:HTTP API 兼容 OpenAI/Anthropic——
/v1/chat/completions直接接现有 client;x-reef-scenarioheader 创建新 scenario;/reef/report上报 feedback。零迁移成本。
缺点(性能 / 复杂度 / 维护性):
- 性能:Commit 一次涉及 staging → evaluate → publish 三个阶段,单次 commit 5-30 秒。如果想”分钟级自进化”会受限。
- 复杂度:379 个 Python 文件、8 个 harness adapter、4 种 backend(slime/vLLM/SGLang/Tinker)——部署一台 Reef 服务器要装 GPU + LFS + 多 backend,运维不轻。
- 维护性:recipe cookbook 在 monorepo 里(
recipes/+reef/recipe/),新 recipe 的注册机制需要看reef/recipe/registry.py;5 种 dispatch mode 的区别对新人理解成本高。
7.2 性能视角
Reef 的”性能瓶颈”不在 inference,而在 commit:
| 阶段 | 延迟 | 优化空间 |
|---|---|---|
| Serve | < 100ms(直接转发到 vLLM/SGLang) | 几乎无优化空间 |
| Observe | < 10ms(SQLite/Postgres lookup) | 加索引 |
| Grow | 5-30s(含一次 served-model proposer call + evaluation episodes) | 减少 evaluation episodes 或并发 |
| Commit | 100ms-1s(artifact 落 LFS + head 移动) | LFS 大文件慢,可改 S3 |
Bitter Lesson 视角:性能瓶颈在 Grow 的 “served model propose”——这一步用了 model 而非人工规则,所以随着模型变强,自动变快。这是 Reef 的”对的设计”。
7.3 复杂度视角
| 复杂度维度 | 评分 | 说明 |
|---|---|---|
| 部署复杂度 | 高(4/5) | GPU + LFS + 多个 backend 同时支持 |
| 学习曲线 | 中(3/5) | AGENTS.md + CONTRIBUTING.md 文档齐全,但模块多 |
| 二次开发复杂度 | 中(3/5) | 加新 recipe 简单(reef/recipe/registry.py + recipe cookbook),加新 harness adapter 中等(3 文件) |
| 运维复杂度 | 中(3/5) | 8 adapter × N recipe = 8N 配置矩阵,但每个组合都用同一套 deployment CLI |
八、从零搭建启示:MVP 蓝图 + 踩坑预警
8.1 我自己复刻时,最小可行实现(MVP)是什么?
如果让我用 250 行 Python 复刻 Reef 的核心机制,我会做以下 4 件事:
1. Receipt-driven feedback 协议
- Serve 响应加
x-reef-agent-record-idheader - Report endpoint 要求
references: [receipt] - 没有 receipt 的 feedback 拒收
2. Immutable artifact history
ReleaseChain用content_id = sha256(serialized_entries)做 immutable ID- 三个 head:
base/current/checkpoint - publish 前先 stage(不动 head)
3. Admission gate 至少 2 个
- secret-shaped text redact
- prompt-injection pattern detect
4. Side-effect isolation
- Observer 是 wrapper,失败只记日志
- Commit 失败不影响 storage
我的 250 行 MVP(第四节)就是这 4 件事的最小实现。
8.2 哪些组件是必须的,哪些可以暂时省略?
必须:
ReleaseChain+ receipt 协议 + admission gate + observer isolation——这 4 件是 Reef 的”安全骨架”- 至少一个 recipe(最简单的可以是”看到失败 feedback 就加一条 rules entry”)
可以暂时省略:
- 8 个 adapter(先做 1 个,比如 native + pi 二选一)
- 多 backend 支持(先 vLLM,再加 SGLang/Tinker)
native_graph的 8 种 stage kind(先只做model+tools+end三种)- Cordis 风格的 5 种 dispatch mode(先做
emit+bail两种)
8.3 踩坑预警:实际集成时会遇到哪些问题?
坑 1:Receipt header 在 client 端被 strip
OpenAI/Anthropic SDK 的 proxy 经常会 strip 掉自定义 header。Reef 用了双轨:header x-reef-agent-record-id + body metadata.reef_receipt——任一存在即可。
坑 2:LFS 在小文件上反而慢
Git LFS 对 < 1MB 文件的开销比 git 直接存储还大。Reef 的解决:artifact 必须 > 100KB 才用 LFS,否则直接落 git tree。
坑 3:Commit 顺序在并发下崩溃
多个 Grow step 同时尝试 commit 会撞 head。Reef 用 RLock + expected_step 双重校验——ScenarioCommitter 类负责序列化。
坑 4:Observer 的网络 exporter 拖垮 commit
Prometheus exporter 在网络故障时会 hang。Reef 的解法:RecordObserver 的所有方法都用 try/except 包住,失败只记日志,不抛。
坑 5:Recipe 的 requires 写错
提案者写了 {"name": "FOO", "kind": "env"} 但 FOO 没在 setup 阶段收集 → serving 时找不到 env var。Reef 的解法:reef-{adapter} install 阶段把所有 requires 转成 reef install --require X 的交互 prompt。
九、结论:为什么 Reef 是 Harness Engineering 的下一站
human-agent-society/reef(7489⭐,Apache-2.0)不是又一个 Agent 框架——它是 Harness Engineering 的”自进化层“。它把”feedback 进来、Harness 变好”这条朴素的因果链,做成了不可变、可回滚、可评估、可观测的运行时基础设施。
5 个核心原语(5 dispatch mode / 11 node kinds / 不可变 artifact / receipt-driven feedback / 4 admission gate),每个都对应 Harness Engineering 的一个真实痛点。
给读者的行动建议:
- 跑一遍我的 250 行 MVP(第四节)——用肌肉记忆理解四步循环;
- 读一遍
reef/harness/compose/events.py——看 5 种 dispatch mode 怎么用 ~300 行实现 Koa + Express + EventEmitter 合并; - 读一遍
reef/harness/tree/nodes.py——看 admission gate 怎么把”tree validation”做成第一公民; - 看一遍 AGENTS.md 的 “Codebase and boundaries” 章节——这是模块划分最清晰的 AGENTS.md 之一,新人值得学;
- 决定是否在你的项目里用 Reef——如果是会被反复使用的 Agent,先做 250 行 MVP 验证”feedback 进来、自动改进”的因果链,再决定是否上 Reef 全栈。
Reef 已经在 reefine recipe 里证明了”Harness 可以从用户原话学会新 Skill”——这只是开始。下一个 18 个月,Harness Engineering 的前沿会是”持续自进化基础设施”——Reef 是这条赛道的开源先行者。
当你的 Agent 不再等用户写 Skill,而是自己从失败里提一条 Skill proposal;当你的 Harness 不再是静态配置,而是一条 immutable 的 git history——Harness Engineering 才算真正闭环。
这就是 Reef 在做的事。
附录 A:参考链接
- Reef GitHub: https://github.com/human-agent-society/reef
- Reefine Tutorial: https://github.com/Human-Agent-Society/reef/blob/main/tutorials/reefine/README.md
- Cordis (event bus 来源): https://github.com/cordiverse/cordis
- Slime (weight training): https://github.com/THUDM/slime
- SGLang: https://github.com/sgl-project/sglang
- AGENTS.md (模块划分权威来源): https://github.com/Human-Agent-Society/reef/blob/main/AGENTS.md
附录 B:术语表
- Receipt(回执):每次 Serve 响应携带的
x-reef-agent-record-idheader;feedback 用它关联到原 interaction。 - Release:不可变 artifact 版本;用 sha256 content ID 标识。
- Scenario:一个 deployment 的子集,独立的 recipe + 独立 commits + 独立 history。
- Recipe:决定”如何 grow”的算法;SAO(weight surface)/ GEPA(prompt surface)/ Reefine(harness surface)。
- Composition tree:扁平 11 种 Node Kinds 构成的 harness 状态——不是文件树,是 admission-gated JSON tree。
- Admission gate:每个 entry 提交前必须通过的合法性检查——4 类(secret text / secret field / injection / unguarded console write)。
- Lifecycle states:Fiber 的 6 个状态——PENDING / LOADING / ACTIVE / FAILED / DISPOSED / UNLOADING。