Concepts 导读

小纸条消息 lifecycle refactor:先把底下那条暗线看见

小纸条消息 lifecycle refactor 这页在补地图,不是在发操作说明。看完你应该能指出它埋在系统哪一层、为什么会牵动后面的动作,以及最容易把哪几件事想反。原文最响的一记鼓点,其实是:This page is the target design for replacing scattered 消息通道 turn, reply dispatch, previ…。

先听这页的人话版

Message lifecycle refactor

这一页不是在堆术语,它像把“小纸条消息 lifecycle refactor”这台小机器搬到桌上,当着你的面拆开给你看。你先不用全记住,先抓住它到底在忙什么:This page is the target design for replacing scattered 消息通道 turn, reply dispatch, preview 一边说一边…。

如果把这页当成“给普通人看的版本”,你最应该带走的是:它到底在教你一件什么事、什么时候要这样做、以及哪里最容易踩坑。

原始路径:/concepts/message-lifecycle-refactor 章节数量:33 查看原文

第 1 站

Start Here

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:This page is the target design for replacing scattered 消息通道 turn, reply dispatch, preview 一边说一边送ing, and outbound deliv…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:This page is the target design for replacing scattered 消息通道 turn, reply dispatch, preview 一边说一边送ing, and outbound deliv…。

原文小纸条

This page is the target design for replacing scattered channel turn, reply dispatch, preview streaming, and outbound delivery helpers with one durable message lifecycle.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The short version:。

原文小纸条

The short version:

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:commit, fail.

原文小纸条

commit, fail.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:dispatch, platform ack, fail.

原文小纸条

dispatch, platform ack, fail.

像准备清单

这一串条目别硬背,把它当成“Start Here”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:The core primitives should be **receive**…、A reply is only a relation on an outbound…、A turn is an inbound-processing convenien…、Sending must be context based: begin, ren…。

原文小纸条
  • The core primitives should be **receive** and **send**, not **reply**.
  • A reply is only a relation on an outbound message.
  • A turn is an inbound-processing convenience, not the owner of delivery.
  • Sending must be context based: begin, render, preview or stream, final send,
  • Receiving must be context based too: normalize, dedupe, route, record,
  • The public plugin SDK should collapse to one small channel-message surface.

第 2 站

Problems

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The current 消息通道 stack grew from several valid local needs: recordInboundSessionAndDispatchReply, reply payload helpers…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The current 消息通道 stack grew from several valid local needs:。

原文小纸条

The current channel stack grew from several valid local needs:

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:recordInboundSessionAndDispatchReply, reply payload helpers, reply chunking, reply references, and outbound runtime hel…。

原文小纸条

recordInboundSessionAndDispatchReply, reply payload helpers, reply chunking, reply references, and outbound runtime helpers.

像准备清单

这一串条目别硬背,把它当成“Problems”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Simple inbound adapters use runtime.消息通道.…、Rich adapters use runtime.消息通道.turn.runPr…、Legacy helpers use dispatchInboundReplyWi…、Preview 一边说一边送ing lives in 消息通道-specific…。

原文小纸条
  • Simple inbound adapters use runtime.channel.turn.run.
  • Rich adapters use runtime.channel.turn.runPrepared.
  • Legacy helpers use dispatchInboundReplyWithBase,
  • Preview streaming lives in channel-specific dispatchers.
  • Final delivery durability is being added around existing reply payload paths.
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:That shape fixes local bugs, but it leaves OpenClaw with too many public concepts and too many places where delivery se…。

原文小纸条

That shape fixes local bugs, but it leaves OpenClaw with too many public concepts and too many places where delivery semantics can drift.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The reliability issue that exposed this is:。

原文小纸条

The reliability issue that exposed this is:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“Telegram polling update acked”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“-> assistant final text exists”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“-> process restarts before sendMessage succeeds”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
原文代码块
Telegram polling update acked
  -> assistant final text exists
  -> process restarts before sendMessage succeeds
  -> final response is lost
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The target invariant is broader than Telegram: once core decides a visible outbound 小纸条消息 should exist, the intent must…。

原文小纸条

The target invariant is broader than Telegram: once core decides a visible outbound message should exist, the intent must be durable before the platform send is attempted, and the platform receipt must be committed after success. That gives OpenClaw at-least-once recovery. Exactly-once behavior exists only for adapters that can prove native idempotency or reconcile an unknown-after-send attempt against platform state before replay.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:That is the end state for this refactor, not a description of every current path. During migration, existing outbound h…。

原文小纸条

That is the end state for this refactor, not a description of every current path. During migration, existing outbound helpers can still fall through to a direct send when best-effort queue writes fail. The refactor is complete only when durable final sends fail closed or explicitly opt out with a documented non-durable policy.

第 3 站

Goals

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:declares replay-safe behavior. semantics. edit, append, or completed block delivery. 门口的小门卫 failures do not re-enter sh…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:declares replay-safe behavior.

原文小纸条

declares replay-safe behavior.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:semantics.

原文小纸条

semantics.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:edit, append, or completed block delivery.

原文小纸条

edit, append, or completed block delivery.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:门口的小门卫 failures do not re-enter shared bot-enabled rooms as fresh prompts.

原文小纸条

gateway failures do not re-enter shared bot-enabled rooms as fresh prompts.

像准备清单

这一串条目别硬背,把它当成“Goals”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:One core lifecycle for all 消息通道 小纸条消息 rec…、Durable final sends by default in the new…、Shared preview, edit, 一边说一边送, finalizatio…、A small 新本领插件 SDK surface that third-part…。

原文小纸条
  • One core lifecycle for all channel message receive and send paths.
  • Durable final sends by default in the new message lifecycle after an adapter
  • Shared preview, edit, stream, finalization, retry, recovery, and receipt
  • A small plugin SDK surface that third-party plugins can learn and maintain.
  • Compatibility for existing channel.turn callers during migration.
  • Clear extension points for new channel capabilities.
  • No platform-specific branches in core.
  • No token-delta channel messages. Channel streaming remains message preview,
  • Structured OpenClaw-origin metadata for operational/system output so visible

第 4 站

Non goals

这一节主要在解释“Non goals”到底是干什么的,以及你什么时候会遇到它。

这段在解决什么

这一节主要在解释“Non goals”到底是干什么的,以及你什么时候会遇到它。

为什么值得看

如果你是第一次接触 OpenClaw,这一节最值得看的不是术语本身,而是它背后的使用场景和限制。

真要动手时

真正动手时,先看它有没有默认值、有没有必须打开的选项、以及会不会影响安全边界。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Feishu cards, QQ voice, or Teams activities.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Feishu cards, QQ voice, or Teams activities.

原文小纸条

Feishu cards, QQ voice, or Teams activities.

像准备清单

这一串条目别硬背,把它当成“Non goals”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Do not remove runtime.消息通道.turn.* in the…、Do not force every 消息通道 into the same nat…、Do not teach core Telegram topics, Slack…、Do not publish all internal migration hel…。

原文小纸条
  • Do not remove runtime.channel.turn.* in the first phase.
  • Do not force every channel into the same native transport behavior.
  • Do not teach core Telegram topics, Slack native streams, Matrix redactions,
  • Do not publish all internal migration helpers as stable SDK API.
  • Do not make retries replay completed non-idempotent platform operations.

第 5 站

Reference 聪明脑袋模型

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Vercel Chat has a good public mental 聪明脑袋模型: 一边说一边送, startTyping, and history fetches OpenClaw should borrow the vocabu…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Vercel Chat has a good public mental 聪明脑袋模型:。

原文小纸条

Vercel Chat has a good public mental model:

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:一边说一边送, startTyping, and history fetches。

原文小纸条

stream, startTyping, and history fetches

像准备清单

这一串条目别硬背,把它当成“Reference model”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Chat、Thread、消息通道、小纸条消息。

原文小纸条
  • Chat
  • Thread
  • Channel
  • Message
  • adapter methods such as postMessage, editMessage, deleteMessage,
  • a state adapter for dedupe, locks, queues, and persistence
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:OpenClaw should borrow the vocabulary, not copy the surface.

原文小纸条

OpenClaw should borrow the vocabulary, not copy the surface.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:What OpenClaw needs beyond that 聪明脑袋模型:。

原文小纸条

What OpenClaw needs beyond that model:

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:duplicate suppression.

原文小纸条

duplicate suppression.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:third-party 新本领插件s should see one coherent 小纸条消息 对话接口.

原文小纸条

third-party plugins should see one coherent message API.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:progress, approvals, media directives, silent replies, and 大家一起的房间 mention history.

原文小纸条

progress, approvals, media directives, silent replies, and group mention history.

像准备清单

这一串条目别硬背,把它当成“Reference model”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Durable outbound send intents before dire…、Explicit send contexts with begin, commit…、Receive contexts that know platform ack p…、Receipts that survive restart and can dri…。

原文小纸条
  • Durable outbound send intents before direct transport calls.
  • Explicit send contexts with begin, commit, and fail.
  • Receive contexts that know platform ack policy.
  • Receipts that survive restart and can drive edits, deletes, recovery, and
  • A smaller public SDK. Bundled plugins can use internal runtime helpers, but
  • Agent-specific behavior: sessions, transcripts, block streaming, tool
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:thread.post() style promises are not enough for OpenClaw. They hide the transaction boundary that decides whether a sen…。

原文小纸条

thread.post() style promises are not enough for OpenClaw. They hide the transaction boundary that decides whether a send is recoverable.

第 6 站

Core 聪明脑袋模型

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

这段在解决什么

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

为什么值得看

你理解的是能力边界,不只是功能名字。

真要动手时

如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The new domain should live under an internal core namespace such as src/消息通道s/小纸条消息/*. It has four concepts: receive ow…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The new domain should live under an internal core namespace such as src/消息通道s/小纸条消息/*.

原文小纸条

The new domain should live under an internal core namespace such as src/channels/message/*.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:It has four concepts:。

原文小纸条

It has four concepts:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“core.messages.receive(...)”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“core.messages.send(...)”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“core.messages.live(...)”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
原文代码块
core.messages.receive(...)
core.messages.send(...)
core.messages.live(...)
core.messages.state(...)
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:receive owns inbound lifecycle.

原文小纸条

receive owns inbound lifecycle.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:send owns outbound lifecycle.

原文小纸条

send owns outbound lifecycle.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:live owns preview, edit, progress, and 一边说一边送 state.

原文小纸条

live owns preview, edit, progress, and stream state.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:state owns durable intent storage, receipts, idempotency, recovery, locks, and dedupe.

原文小纸条

state owns durable intent storage, receipts, idempotency, recovery, locks, and dedupe.

第 7 站

小纸条消息

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

这段在解决什么

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

为什么值得看

你理解的是能力边界,不只是功能名字。

真要动手时

如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:A normalized 小纸条消息 is platform-neutral:。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:A normalized 小纸条消息 is platform-neutral:。

原文小纸条

A normalized message is platform-neutral:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type ChannelMessage = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这里在给“id”挂牌子,告诉系统它该指向“string;”。
  • 这里在给“channel”挂牌子,告诉系统它该指向“string;”。
原文代码块
type ChannelMessage = {
  id: string;
  channel: string;
  accountId?: string;
  direction: "inbound" | "outbound";
  target: MessageTarget;
  sender?: MessageActor;
  body?: MessageBody;
  attachments?: MessageAttachment[];
  relation?: MessageRelation;
  origin?: MessageOrigin;
  timestamp?: number;
  raw?: unknown;
};

第 8 站

Target

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

这段在解决什么

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

为什么值得看

你理解的是能力边界,不只是功能名字。

真要动手时

如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The target describes where the 小纸条消息 lives:。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The target describes where the 小纸条消息 lives:。

原文小纸条

The target describes where the message lives:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type MessageTarget = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这里在给“kind”挂牌子,告诉系统它该指向“direct | group | channel | thread;”。
  • 这里在给“id”挂牌子,告诉系统它该指向“string;”。
原文代码块
type MessageTarget = {
  kind: "direct" | "group" | "channel" | "thread";
  id: string;
  label?: string;
  spaceId?: string;
  parentId?: string;
  threadId?: string;
  nativeChannelId?: string;
};

第 9 站

Relation

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

这段在解决什么

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

为什么值得看

你理解的是能力边界,不只是功能名字。

真要动手时

如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Reply is a relation, not an 对话接口 root: This lets the same send path handle normal replies, cron notifications, approval…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Reply is a relation, not an 对话接口 root:。

原文小纸条

Reply is a relation, not an API root:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type MessageRelation =”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“| {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这里在给“kind”挂牌子,告诉系统它该指向“reply;”。
原文代码块
type MessageRelation =
  | {
      kind: "reply";
      inboundMessageId?: string;
      replyToId?: string;
      threadId?: string;
      quote?: MessageQuote;
    }
  | {
      kind: "followup";
      sessionKey?: string;
      previousMessageId?: string;
    }
  | {
      kind: "broadcast";
      reason?: string;
    }
  | {
      kind: "system";
      reason:
        | "approval"
        | "task"
        | "hook"
        | "cron"
        | "subagent"
        | "message_tool"
        | "cli"
        | "control_ui"
        | "automation"
        | "error";
    };
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:This lets the same send path handle normal replies, cron notifications, approval prompts, task completions, 小纸条消息-工具小帮手…。

原文小纸条

This lets the same send path handle normal replies, cron notifications, approval prompts, task completions, message-tool sends, CLI or Control UI sends, subagent results, and automation sends.

第 10 站

Origin

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Origin describes who produced a 小纸条消息 and how OpenClaw should treat echoes of that 小纸条消息. It is separate from relation:…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Origin describes who produced a 小纸条消息 and how OpenClaw should treat echoes of that 小纸条消息. It is separate from relation:…。

原文小纸条

Origin describes who produced a message and how OpenClaw should treat echoes of that message. It is separate from relation: a message can be a reply to a user and still be OpenClaw-originated operational output.

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type MessageOrigin =”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“| {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这里在给“source”挂牌子,告诉系统它该指向“openclaw;”。
原文代码块
type MessageOrigin =
  | {
      source: "openclaw";
      schemaVersion: 1;
      kind: "gateway_failure";
      code: "agent_failed_before_reply" | "missing_api_key" | "model_login_expired";
      echoPolicy: "drop_bot_room_echo";
    }
  | {
      source: "user" | "external_bot" | "platform" | "unknown";
    };
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Core owns the meaning of OpenClaw-originated output. 消息通道s own how that origin is encoded into their transport.

原文小纸条

Core owns the meaning of OpenClaw-originated output. Channels own how that origin is encoded into their transport.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The first required use is 门口的小门卫 failure output. Humans should still see 小纸条消息s such as "机器人朋友 failed before reply" or…。

原文小纸条

The first required use is gateway failure output. Humans should still see messages such as "Agent failed before reply" or "Missing API key", but tagged OpenClaw operational output must not be accepted as bot-authored input in shared rooms when allowBots is enabled.

第 11 站

Receipt

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Receipts are first-class: Receipts are the bridge from durable intent to future edit, delete, preview finalization, dup…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Receipts are first-class:。

原文小纸条

Receipts are first-class:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type MessageReceipt = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这里在给“primaryPlatformMessageId?”挂牌子,告诉系统它该指向“string;”。
  • 这里在给“platformMessageIds”挂牌子,告诉系统它该指向“string[];”。
原文代码块
type MessageReceipt = {
  primaryPlatformMessageId?: string;
  platformMessageIds: string[];
  parts: MessageReceiptPart[];
  threadId?: string;
  replyToId?: string;
  editToken?: string;
  deleteToken?: string;
  url?: string;
  sentAt: number;
  raw?: unknown;
};

type MessageReceiptPart = {
  platformMessageId: string;
  kind: "text" | "media" | "voice" | "card" | "preview" | "unknown";
  index: number;
  threadId?: string;
  replyToId?: string;
  editToken?: string;
  deleteToken?: string;
  url?: string;
  raw?: unknown;
};
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Receipts are the bridge from durable intent to future edit, delete, preview finalization, duplicate suppression, and re…。

原文小纸条

Receipts are the bridge from durable intent to future edit, delete, preview finalization, duplicate suppression, and recovery.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:A receipt can describe one platform 小纸条消息 or a multi-part delivery. Chunked text, media plus text, voice plus text, and…。

原文小纸条

A receipt can describe one platform message or a multi-part delivery. Chunked text, media plus text, voice plus text, and card fallbacks must preserve all platform ids while still exposing a primary id for threading and later edits.

第 12 站

Receive context

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Receiving should not be a bare helper call. The core needs a context that knows dedupe, routing, session recording, and…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Receiving should not be a bare helper call. The core needs a context that knows dedupe, routing, session recording, and…。

原文小纸条

Receiving should not be a bare helper call. The core needs a context that knows dedupe, routing, session recording, and platform ack policy.

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type MessageReceiveContext = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这里在给“id”挂牌子,告诉系统它该指向“string;”。
  • 这里在给“channel”挂牌子,告诉系统它该指向“string;”。
原文代码块
type MessageReceiveContext = {
  id: string;
  channel: string;
  accountId?: string;
  input: ChannelMessage;
  ack: ReceiveAckController;
  route: MessageRouteController;
  session: MessageSessionController;
  log: MessageLifecycleLogger;

  dedupe(): Promise
ReceiveDedupeResult
;
  resolve(): Promise
ResolvedInboundMessage
;
  record(resolved: ResolvedInboundMessage): Promise
RecordResult
;
  dispatch(recorded: RecordResult): Promise
DispatchResult
;
  commit(result: DispatchResult): Promise<void>;
  fail(error: unknown): Promise<void>;
};
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Receive flow:。

原文小纸条

Receive flow:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“platform event”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“-> begin receive context”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“-> normalize”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
原文代码块
platform event
  -> begin receive context
  -> normalize
  -> classify
  -> dedupe and self-echo gate
  -> route and authorize
  -> record inbound session metadata
  -> dispatch agent run
  -> durable outbound sends happen through send context
  -> commit receive
  -> ack platform when policy allows
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Ack is not one thing. The receive contract must keep these signals separate:。

原文小纸条

Ack is not one thing. The receive contract must keep these signals separate:

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:the event envelope. Some platforms require this before dispatch.

原文小纸条

the event envelope. Some platforms require this before dispatch.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:again. This must not advance past work that cannot be recovered.

原文小纸条

again. This must not advance past work that cannot be recovered.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:dedupe and route a redelivery.

原文小纸条

dedupe and route a redelivery.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:durability boundary.

原文小纸条

durability boundary.

像准备清单

这一串条目别硬背,把它当成“Receive context”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:**Transport ack:** tells the platform 小铃铛…、**Polling offset ack:** advances a cursor…、**Inbound record ack:** confirms OpenClaw…、**User-visible receipt:** optional read/s…。

原文小纸条
  • **Transport ack:** tells the platform webhook or socket that OpenClaw accepted
  • **Polling offset ack:** advances a cursor so the same event is not fetched
  • **Inbound record ack:** confirms OpenClaw persisted enough inbound metadata to
  • **User-visible receipt:** optional read/status/typing behavior; never a
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:ReceiveAckPolicy controls transport or polling acknowledgement only. It must not be reused for read receipts or status…。

原文小纸条

ReceiveAckPolicy controls transport or polling acknowledgement only. It must not be reused for read receipts or status reactions.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Before bot authorization, receive must apply the shared OpenClaw echo policy when the 消息通道 can decode 小纸条消息 origin meta…。

原文小纸条

Before bot authorization, receive must apply the shared OpenClaw echo policy when the channel can decode message origin metadata:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这里在给“function shouldDropOpenClawEcho(params”挂牌子,告诉系统它该指向“{”。
  • 这里在给“origin?”挂牌子,告诉系统它该指向“MessageOrigin;”。
  • 这里在给“isBotAuthor”挂牌子,告诉系统它该指向“boolean;”。
原文代码块
function shouldDropOpenClawEcho(params: {
  origin?: MessageOrigin;
  isBotAuthor: boolean;
  isRoomish: boolean;
}): boolean {
  return (
    params.isBotAuthor &&
    params.isRoomish &&
    params.origin?.source === "openclaw" &&
    params.origin.kind === "gateway_failure" &&
    params.origin.echoPolicy === "drop_bot_room_echo"
  );
}
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:This drop is tag-based, not text-based. A bot-authored room 小纸条消息 with the same visible 门口的小门卫-failure text but without…。

原文小纸条

This drop is tag-based, not text-based. A bot-authored room message with the same visible gateway-failure text but without OpenClaw origin metadata still goes through normal allowBots authorization.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Ack policy is explicit:。

原文小纸条

Ack policy is explicit:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type ReceiveAckPolicy =”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这里在给“| { kind”挂牌子,告诉系统它该指向“immediate; reason: webhook-timeout | platform-contract }”。
  • 这里在给“| { kind”挂牌子,告诉系统它该指向“after-record }”。
原文代码块
type ReceiveAckPolicy =
  | { kind: "immediate"; reason: "webhook-timeout" | "platform-contract" }
  | { kind: "after-record" }
  | { kind: "after-durable-send" }
  | { kind: "manual" };
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Telegram polling now uses the receive-context ack policy for its persisted restart watermark. The tracker still observe…。

原文小纸条

Telegram polling now uses the receive-context ack policy for its persisted restart watermark. The tracker still observes grammY updates as they enter the middleware chain, but OpenClaw persists only the safe completed update id after successful dispatch, leaving failed or lower pending updates replayable after a restart. Telegram's upstream getUpdates fetch offset is still controlled by the polling library, so the remaining deeper cut is a fully durable polling source if we need platform-level redelivery beyond OpenClaw's restart watermark. Webhook platforms may need immediate HTTP ack, but they still need inbound dedupe and durable outbound send intents because webhooks can redeliver.

第 13 站

Send context

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Sending is also context based: Preferred orchestration: The helper expands to: The intent must exist before transport I…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Sending is also context based:。

原文小纸条

Sending is also context based:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type MessageSendContext = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这里在给“id”挂牌子,告诉系统它该指向“string;”。
  • 这里在给“channel”挂牌子,告诉系统它该指向“string;”。
原文代码块
type MessageSendContext = {
  id: string;
  channel: string;
  accountId?: string;
  message: ChannelMessage;
  intent: DurableSendIntent;
  attempt: number;
  signal: AbortSignal;
  previousReceipt?: MessageReceipt;
  preview?: LiveMessageState;
  log: MessageLifecycleLogger;

  render(): Promise
RenderedMessageBatch
;
  previewUpdate(rendered: RenderedMessageBatch): Promise
LiveMessageState
;
  send(rendered: RenderedMessageBatch): Promise
MessageReceipt
;
  edit(receipt: MessageReceipt, rendered: RenderedMessageBatch): Promise
MessageReceipt
;
  delete(receipt: MessageReceipt): Promise<void>;
  commit(receipt: MessageReceipt): Promise<void>;
  fail(error: unknown): Promise<void>;
};
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Preferred orchestration:。

原文小纸条

Preferred orchestration:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“await core.messages.withSendContext(message, async (ctx) => {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“const rendered = await ctx.render();”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“if (ctx.preview?.canFinalizeInPlace) {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
原文代码块
await core.messages.withSendContext(message, async (ctx) => {
  const rendered = await ctx.render();

  if (ctx.preview?.canFinalizeInPlace) {
    return await ctx.edit(ctx.preview.receipt, rendered);
  }

  return await ctx.send(rendered);
});
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The helper expands to:。

原文小纸条

The helper expands to:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“begin durable intent”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“-> render”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“-> optional preview/edit/stream work”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
原文代码块
begin durable intent
  -> render
  -> optional preview/edit/stream work
  -> mark sending
  -> final platform send or final edit
  -> mark committing with raw receipt
  -> commit receipt
  -> ack durable intent
  -> fail durable intent on classified failure
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The intent must exist before transport I/O. A restart after begin but before commit is recoverable.

原文小纸条

The intent must exist before transport I/O. A restart after begin but before commit is recoverable.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The dangerous boundary is after platform success and before receipt commit. If a process dies there, OpenClaw cannot kn…。

原文小纸条

The dangerous boundary is after platform success and before receipt commit. If a process dies there, OpenClaw cannot know whether the platform message exists unless the adapter provides native idempotency or a receipt reconciliation path. Those attempts must resume in unknown_after_send, not blindly replay. Channels without reconciliation may choose at-least-once replay only if duplicate visible messages are an acceptable, documented tradeoff for that channel and relation. The current SDK reconciliation bridge requires the adapter to declare reconcileUnknownSend, then asks durableFinal.reconcileUnknownSend to classify an unknown entry as sent, not_sent, or unresolved; only not_sent permits replay, and unresolved entries stay terminal or retry only the reconciliation check.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Durability policy must be explicit:。

原文小纸条

Durability policy must be explicit:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type MessageDurabilityPolicy = "required" | "best_effort" | "disabled";”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
原文代码块
type MessageDurabilityPolicy = "required" | "best_effort" | "disabled";
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:required means core must fail closed when it cannot write the durable intent. best_effort can fall through when persist…。

原文小纸条

required means core must fail closed when it cannot write the durable intent. best_effort can fall through when persistence is unavailable. disabled keeps the old direct send behavior. During migration, legacy wrappers and public compatibility helpers default to disabled; they must not infer required from the fact that a channel has a generic outbound adapter.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Send contexts also own 消息通道-local post-send effects. A migration is not safe if durable delivery bypasses local behavio…。

原文小纸条

Send contexts also own channel-local post-send effects. A migration is not safe if durable delivery bypasses local behavior that was previously attached to the channel's direct send path. Examples include self-echo suppression caches, thread participation markers, native edit anchors, model-signature rendering, and platform-specific duplicate guards. Those effects must either move into the send adapter, the render adapter, or a named send-context hook before that channel can enable durable generic final delivery.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Send helpers must return receipts all the way back to their caller. Durable wrappers cannot swallow 小纸条消息 ids or replac…。

原文小纸条

Send helpers must return receipts all the way back to their caller. Durable wrappers cannot swallow message ids or replace a channel delivery result with undefined; buffered dispatchers use those ids for thread anchors, later edits, preview finalization, and duplicate suppression.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Fallback sends operate on batches, not single payloads. Silent-reply rewrites, media fallback, card fallback, and chunk…。

原文小纸条

Fallback sends operate on batches, not single payloads. Silent-reply rewrites, media fallback, card fallback, and chunk projection can all produce more than one deliverable message, so a send context must either deliver the whole projected batch or explicitly document why only one payload is valid.

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type RenderedMessageBatch = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这里在给“units”挂牌子,告诉系统它该指向“RenderedMessageUnit[];”。
  • 这里在给“atomicity”挂牌子,告诉系统它该指向“all_or_retry_remaining | best_effort_parts;”。
原文代码块
type RenderedMessageBatch = {
  units: RenderedMessageUnit[];
  atomicity: "all_or_retry_remaining" | "best_effort_parts";
  idempotencyKey: string;
};

type RenderedMessageUnit = {
  index: number;
  kind: "text" | "media" | "voice" | "card" | "preview" | "unknown";
  payload: unknown;
  required: boolean;
};
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:When such a fallback is durable, the whole projected batch must be represented by one durable send intent or another at…。

原文小纸条

When such a fallback is durable, the whole projected batch must be represented by one durable send intent or another atomic batch plan. Recording each payload one-by-one is not enough: a crash between payloads can leave a partial visible fallback with no durable record for the remaining payloads. Recovery must know which units already have receipts and either replay only missing units or mark the batch unknown_after_send until the adapter reconciles it.

第 14 站

Live context

这一节主要在解释“Live context”到底是干什么的,以及你什么时候会遇到它。

这段在解决什么

这一节主要在解释“Live context”到底是干什么的,以及你什么时候会遇到它。

为什么值得看

如果你是第一次接触 OpenClaw,这一节最值得看的不是术语本身,而是它背后的使用场景和限制。

真要动手时

真正动手时,先看它有没有默认值、有没有必须打开的选项、以及会不会影响安全边界。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Preview, edit, progress, and 一边说一边送 behavior should be one opt-in lifecycle. Live state is durable enough to recover or…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Preview, edit, progress, and 一边说一边送 behavior should be one opt-in lifecycle.

原文小纸条

Preview, edit, progress, and stream behavior should be one opt-in lifecycle.

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type MessageLiveAdapter = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这里在给“begin?(ctx”挂牌子,告诉系统它该指向“MessageSendContext): Promise”。
  • 这一行“LiveMessageState”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
原文代码块
type MessageLiveAdapter = {
  begin?(ctx: MessageSendContext): Promise
LiveMessageState
;
  update?(
    ctx: MessageSendContext,
    state: LiveMessageState,
    update: LiveMessageUpdate,
  ): Promise
LiveMessageState
;
  finalize?(
    ctx: MessageSendContext,
    state: LiveMessageState,
    final: RenderedMessageBatch,
  ): Promise
MessageReceipt
;
  cancel?(
    ctx: MessageSendContext,
    state: LiveMessageState,
    reason: LiveCancelReason,
  ): Promise<void>;
};
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Live state is durable enough to recover or suppress duplicates:。

原文小纸条

Live state is durable enough to recover or suppress duplicates:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type LiveMessageState = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这里在给“mode”挂牌子,告诉系统它该指向“partial | block | progress | native;”。
  • 这里在给“receipt?”挂牌子,告诉系统它该指向“MessageReceipt;”。
原文代码块
type LiveMessageState = {
  mode: "partial" | "block" | "progress" | "native";
  receipt?: MessageReceipt;
  visibleSince?: number;
  canFinalizeInPlace: boolean;
  lastRenderedHash?: string;
  staleAfterMs?: number;
};
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:This should cover current behavior:。

原文小纸条

This should cover current behavior:

像准备清单

这一串条目别硬背,把它当成“Live context”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Telegram send plus edit preview, with fre…、Discord send plus edit preview, cancel on…、Slack native 一边说一边送 or draft preview depe…、Mattermost draft post finalization.

原文小纸条
  • Telegram send plus edit preview, with fresh final after stale preview age.
  • Discord send plus edit preview, cancel on media/error/explicit reply.
  • Slack native stream or draft preview depending on thread shape.
  • Mattermost draft post finalization.
  • Matrix draft event finalization or redaction on mismatch.
  • Teams native progress stream.
  • QQ Bot stream or accumulated fallback.

第 15 站

Adapter surface

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The public SDK target should be one subpath: Target shape: Send adapter: Receive adapter: Before preflight authorizatio…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The public SDK target should be one subpath:。

原文小纸条

The public SDK target should be one subpath:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

原文代码块
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Target shape:。

原文小纸条

Target shape:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type ChannelMessageAdapter = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这里在给“receive?”挂牌子,告诉系统它该指向“MessageReceiveAdapter;”。
  • 这里在给“send”挂牌子,告诉系统它该指向“MessageSendAdapter;”。
原文代码块
type ChannelMessageAdapter = {
  receive?: MessageReceiveAdapter;
  send: MessageSendAdapter;
  live?: MessageLiveAdapter;
  origin?: MessageOriginAdapter;
  render?: MessageRenderAdapter;
  capabilities: MessageCapabilities;
};
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Send adapter:。

原文小纸条

Send adapter:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type MessageSendAdapter = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这里在给“send(ctx”挂牌子,告诉系统它该指向“MessageSendContext rendered: RenderedMessageBatch): Promise”。
  • 这一行“MessageReceipt”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
原文代码块
type MessageSendAdapter = {
  send(ctx: MessageSendContext, rendered: RenderedMessageBatch): Promise
MessageReceipt
;
  edit?(
    ctx: MessageSendContext,
    receipt: MessageReceipt,
    rendered: RenderedMessageBatch,
  ): Promise
MessageReceipt
;
  delete?(ctx: MessageSendContext, receipt: MessageReceipt): Promise<void>;
  classifyError?(ctx: MessageSendContext, error: unknown): DeliveryFailureKind;
  reconcileUnknownSend?(ctx: MessageSendContext): Promise
MessageReceipt
;
  afterSendSuccess?(ctx: MessageSendContext, receipt: MessageReceipt): Promise<void>;
  afterCommit?(ctx: MessageSendContext, receipt: MessageReceipt): Promise<void>;
};
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Receive adapter:。

原文小纸条

Receive adapter:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type MessageReceiveAdapter”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“TRaw”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“= {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
原文代码块
type MessageReceiveAdapter
TRaw
 = {
  normalize(raw: TRaw, ctx: MessageNormalizeContext): Promise
ChannelMessage
;
  classify?(message: ChannelMessage): Promise
MessageEventClass
;
  preflight?(message: ChannelMessage, event: MessageEventClass): Promise
MessagePreflightResult
;
  ackPolicy?(message: ChannelMessage, event: MessageEventClass): ReceiveAckPolicy;
};
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Before preflight authorization, core must run the shared OpenClaw echo predicate whenever origin.decode returns OpenCla…。

原文小纸条

Before preflight authorization, core must run the shared OpenClaw echo predicate whenever origin.decode returns OpenClaw-origin metadata. The receive adapter supplies platform facts such as bot author and room shape; core owns the drop decision and ordering so channels do not reimplement text filters.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Origin adapter:。

原文小纸条

Origin adapter:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type MessageOriginAdapter”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“TRaw”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“= {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
原文代码块
type MessageOriginAdapter
TRaw
 = {
  encode?(origin: MessageOrigin): TNative | undefined;
  decode?(raw: TRaw): MessageOrigin | undefined;
};
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Core sets 小纸条消息Origin. 消息通道s only translate it to and from native transport metadata. Slack maps this to chat.post小纸条消息…。

原文小纸条

Core sets MessageOrigin. Channels only translate it to and from native transport metadata. Slack maps this to chat.postMessage({ metadata }) and inbound message.metadata; Matrix can map it to extra event content; channels without native metadata can use a receipt/outbound registry when that is the best available approximation.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Capabilities:。

原文小纸条

Capabilities:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type MessageCapabilities = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这里在给“text”挂牌子,告诉系统它该指向“{ maxLength?: number; chunking?: boolean };”。
  • 这里在给“attachments?”挂牌子,告诉系统它该指向“{”。
原文代码块
type MessageCapabilities = {
  text: { maxLength?: number; chunking?: boolean };
  attachments?: {
    upload: boolean;
    remoteUrl: boolean;
    voice?: boolean;
  };
  threads?: {
    reply: boolean;
    topic?: boolean;
    nativeThread?: boolean;
  };
  live?: {
    edit: boolean;
    delete: boolean;
    nativeStream?: boolean;
    progress?: boolean;
  };
  delivery?: {
    idempotencyKey?: boolean;
    retryAfter?: boolean;
    receiptRequired?: boolean;
  };
};

第 16 站

Public SDK reduction

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

这段在解决什么

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

为什么值得看

你理解的是能力边界,不只是功能名字。

真要动手时

如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The new public surface should absorb or deprecate these conceptual areas: Compatibility subpaths can remain as wrappers…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The new public surface should absorb or deprecate these conceptual areas:。

原文小纸条

The new public surface should absorb or deprecate these conceptual areas:

像准备清单

这一串条目别硬背,把它当成“Public SDK reduction”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:reply-runtime、reply-dispatch-runtime、reply-reference、reply-chunking。

原文小纸条
  • reply-runtime
  • reply-dispatch-runtime
  • reply-reference
  • reply-chunking
  • reply-payload
  • inbound-reply-dispatch
  • channel-reply-pipeline
  • most public uses of outbound-runtime
  • ad hoc draft stream lifecycle helpers
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Compatibility subpaths can remain as wrappers, but new third-party 新本领插件s should not need them.

原文小纸条

Compatibility subpaths can remain as wrappers, but new third-party plugins should not need them.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Bundled 新本领插件s may keep internal helper imports through reserved runtime subpaths while migrating. Public docs should s…。

原文小纸条

Bundled plugins may keep internal helper imports through reserved runtime subpaths while migrating. Public docs should steer plugin authors to plugin-sdk/channel-message once it exists.

第 17 站

Relationship to 消息通道 turn

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

这段在解决什么

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

为什么值得看

你理解的是能力边界,不只是功能名字。

真要动手时

如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:runtime.消息通道.turn.* should stay during migration. It should become a compatibility adapter: 消息通道.turn.runPrepared shoul…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:runtime.消息通道.turn.* should stay during migration.

原文小纸条

runtime.channel.turn.* should stay during migration.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:It should become a compatibility adapter:。

原文小纸条

It should become a compatibility adapter:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“channel.turn.run”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“-> messages.receive context”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“-> session dispatch”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
原文代码块
channel.turn.run
  -> messages.receive context
  -> session dispatch
  -> messages.send context for visible output
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:消息通道.turn.runPrepared should also remain initially:。

原文小纸条

channel.turn.runPrepared should also remain initially:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“channel-owned dispatcher”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“-> messages.receive record/finalize bridge”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“-> messages.live for preview/progress”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
原文代码块
channel-owned dispatcher
  -> messages.receive record/finalize bridge
  -> messages.live for preview/progress
  -> messages.send for final delivery
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:After all bundled 新本领插件s and known third-party compatibility paths are bridged, 消息通道.turn can be deprecated. It should…。

原文小纸条

After all bundled plugins and known third-party compatibility paths are bridged, channel.turn can be deprecated. It should not be removed until there is a published SDK migration path and contract tests proving old plugins still work or fail with a clear version error.

第 18 站

Compatibility guardrails

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:During migration, generic durable delivery is opt-in for any 消息通道 whose existing delivery callback has side effects bey…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:During migration, generic durable delivery is opt-in for any 消息通道 whose existing delivery callback has side effects bey…。

原文小纸条

During migration, generic durable delivery is opt-in for any channel whose existing delivery callback has side effects beyond "send this payload".

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Legacy entry points are non-durable by default:。

原文小纸条

Legacy entry points are non-durable by default:

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:delivery callback unless that 消息通道 explicitly supplies an audited durable policy/options object.

原文小纸条

delivery callback unless that channel explicitly supplies an audited durable policy/options object.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:explicitly calls the send context.

原文小纸条

explicitly calls the send context.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:dispatchInboundReplyWithBase, and direct-DM helpers never inject generic durable delivery before the caller-provided de…。

原文小纸条

dispatchInboundReplyWithBase, and direct-DM helpers never inject generic durable delivery before the caller-provided deliver or reply callback.

像准备清单

这一串条目别硬背,把它当成“Compatibility guardrails”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:消息通道.turn.run and dispatchAssembled消息通道Tu…、消息通道.turn.runPrepared stays 消息通道-owned un…、Public compatibility helpers such as reco…。

原文小纸条
  • channel.turn.run and dispatchAssembledChannelTurn use the channel's
  • channel.turn.runPrepared stays channel-owned until the prepared dispatcher
  • Public compatibility helpers such as recordInboundSessionAndDispatchReply,
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:For migration bridge types, durable: undefined means "not durable". The durable path is enabled only by an explicit pol…。

原文小纸条

For migration bridge types, durable: undefined means "not durable". The durable path is enabled only by an explicit policy/options value. durable: false can remain as a compatibility spelling, but implementation should not require every unmigrated channel to add it.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Current bridge code must keep the durability decision explicit:。

原文小纸条

Current bridge code must keep the durability decision explicit:

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:handled_no_send are terminal; unsupported and not_applicable may fall back to 消息通道-owned delivery; failed propagates th…。

原文小纸条

handled_no_send are terminal; unsupported and not_applicable may fall back to channel-owned delivery; failed propagates the send failure.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:silent delivery, reply target preservation, native quote preservation, and 小纸条消息-sending hooks. Missing parity should c…。

原文小纸条

silent delivery, reply target preservation, native quote preservation, and message-sending hooks. Missing parity should choose channel-owned delivery, not a generic send that changes user-visible behavior.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:pendingFinalDelivery* session fields can carry the intent id during the transition; the end state is a 小纸条消息SendIntent…。

原文小纸条

pendingFinalDelivery* session fields can carry the intent id during the transition; the end state is a MessageSendIntent store instead of frozen reply text plus ad hoc context fields.

像准备清单

这一串条目别硬背,把它当成“Compatibility guardrails”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Durable final delivery returns a discrimi…、Generic durable final delivery is gated b…、Queue-backed durable sends expose a deliv…。

原文小纸条
  • Durable final delivery returns a discriminated status. handled_visible and
  • Generic durable final delivery is gated by adapter capabilities such as
  • Queue-backed durable sends expose a delivery intent reference. Existing
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Do not enable the generic durable path for a 消息通道 until all of these are true:。

原文小纸条

Do not enable the generic durable path for a channel until all of these are true:

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:the old direct path.

原文小纸条

the old direct path.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:ids.

原文小纸条

ids.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:as outside the durable guarantee.

原文小纸条

as outside the durable guarantee.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:replayable intent or batch plan.

原文小纸条

replayable intent or batch plan.

像准备清单

这一串条目别硬背,把它当成“Compatibility guardrails”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:The generic send adapter executes the sam…、Local post-send side effects are preserve…、The adapter returns receipts or delivery…、Prepared dispatcher paths either call the…。

原文小纸条
  • The generic send adapter executes the same rendering and transport behavior as
  • Local post-send side effects are preserved through the send context.
  • The adapter returns receipts or delivery results with all platform message
  • Prepared dispatcher paths either call the new send context or stay documented
  • Fallback delivery handles every projected payload, not only the first one.
  • Durable fallback delivery records the whole projected payload array as one
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Concrete migration hazards to preserve:。

原文小纸条

Concrete migration hazards to preserve:

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:successful send. Durable final sends must still populate that cache, otherwise OpenClaw can re-ingest its own final rep…。

原文小纸条

successful send. Durable final sends must still populate that cache, otherwise OpenClaw can re-ingest its own final replies as inbound user messages.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:after 大家一起的房间 replies. Generic durable delivery must not bypass those effects; either move them into Tlon render/send/f…。

原文小纸条

after group replies. Generic durable delivery must not bypass those effects; either move them into Tlon render/send/finalize adapters or keep Tlon on the channel-owned path.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:behavior. They are not covered by an assembled-turn durable guarantee until their prepared dispatchers explicitly route…。

原文小纸条

behavior. They are not covered by an assembled-turn durable guarantee until their prepared dispatchers explicitly route finals through the send context.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:array. A single-payload shortcut can drop additional fallback payloads after projection.

原文小纸条

array. A single-payload shortcut can drop additional fallback payloads after projection.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:have reply-token handling, media proxying, sent-小纸条消息 caches, loading/status cleanup, or callback-only targets. They st…。

原文小纸条

have reply-token handling, media proxying, sent-message caches, loading/status cleanup, or callback-only targets. They stay on channel-owned delivery until those semantics are represented by the send adapter and verified by tests.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:target. Generic outbound must not guess from OriginatingTo or To and skip that callback.

原文小纸条

target. Generic outbound must not guess from OriginatingTo or To and skip that callback.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:bot-authored room echoes must be dropped before allowBots authorization. 消息通道s must not implement this with visible-tex…。

原文小纸条

bot-authored room echoes must be dropped before allowBots authorization. Channels must not implement this with visible-text prefix filters except as a short emergency stopgap; the durable contract is structured origin metadata.

像准备清单

这一串条目别硬背,把它当成“Compatibility guardrails”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:i小纸条消息 monitor delivery records sent 小纸条消…、Tlon appends an optional 聪明脑袋模型 signature…、Discord and other prepared dispatchers al…、Telegram silent fallback delivery must de…。

原文小纸条
  • iMessage monitor delivery records sent messages in an echo cache after a
  • Tlon appends an optional model signature and records participated threads
  • Discord and other prepared dispatchers already own direct delivery and preview
  • Telegram silent fallback delivery must deliver the full projected payload
  • LINE, Zalo, Nostr, and other existing assembled/helper paths may
  • Direct-DM helpers can have a reply callback that is the only correct transport
  • OpenClaw gateway failure output must stay visible to humans, but tagged

第 19 站

Internal storage

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The durable queue should store 小纸条消息 send intents, not reply payloads. Recovery loop: The queue should keep enough iden…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The durable queue should store 小纸条消息 send intents, not reply payloads.

原文小纸条

The durable queue should store message send intents, not reply payloads.

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type DurableSendIntent = {”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这里在给“id”挂牌子,告诉系统它该指向“string;”。
  • 这里在给“idempotencyKey”挂牌子,告诉系统它该指向“string;”。
原文代码块
type DurableSendIntent = {
  id: string;
  idempotencyKey: string;
  channel: string;
  accountId?: string;
  message: ChannelMessage;
  batch?: RenderedMessageBatch;
  liveState?: LiveMessageState;
  status:
    | "pending"
    | "sending"
    | "committing"
    | "unknown_after_send"
    | "sent"
    | "failed"
    | "cancelled";
  attempt: number;
  nextAttemptAt?: number;
  receipt?: MessageReceipt;
  partialReceipt?: MessageReceipt;
  failure?: DeliveryFailure;
  createdAt: number;
  updatedAt: number;
};
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Recovery loop:。

原文小纸条

Recovery loop:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“load pending or sending intents”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“-> acquire idempotency lock”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“-> skip if receipt already committed”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
原文代码块
load pending or sending intents
  -> acquire idempotency lock
  -> skip if receipt already committed
  -> reconstruct send context
  -> render if needed
  -> reconcile unknown_after_send if needed
  -> call adapter send/edit/finalize
  -> commit receipt, mark unknown_after_send, or schedule retry
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:The queue should keep enough identity to replay through the same account, thread, target, formatting policy, and media…。

原文小纸条

The queue should keep enough identity to replay through the same account, thread, target, formatting policy, and media rules after restart.

第 20 站

Failure classes

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:消息通道 adapters classify transport failures into closed categories: Core policy: the 消息通道 declares that safe. already exi…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:消息通道 adapters classify transport failures into closed categories:。

原文小纸条

Channel adapters classify transport failures into closed categories:

像魔法口令拆解

这段像放在桌上的操作卡,谁来照着做,现场就会动起来。

  • 这一行“type DeliveryFailureKind =”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“| "transient"”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
  • 这一行“| "rate_limit"”是在给电脑递一张小纸条,告诉它眼下该做哪一步。
原文代码块
type DeliveryFailureKind =
  | "transient"
  | "rate_limit"
  | "auth"
  | "permission"
  | "not_found"
  | "invalid_payload"
  | "conflict"
  | "cancelled"
  | "unknown";
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Core policy:。

原文小纸条

Core policy:

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:the 消息通道 declares that safe.

原文小纸条

the channel declares that safe.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:already exists.

原文小纸条

already exists.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:commit becomes unknown_after_send unless the adapter can prove the platform operation did not happen.

原文小纸条

commit becomes unknown_after_send unless the adapter can prove the platform operation did not happen.

像准备清单

这一串条目别硬背,把它当成“Failure classes”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Retry transient and rate_limit.、Do not retry invalid_payload unless a ren…、Do not retry auth or permission until 设置说…、For not_found, let live finalization fall…。

原文小纸条
  • Retry transient and rate_limit.
  • Do not retry invalid_payload unless a render fallback exists.
  • Do not retry auth or permission until configuration changes.
  • For not_found, let live finalization fall back from edit to fresh send when
  • For conflict, use receipt/idempotency rules to decide whether the message
  • Any error after the adapter may have completed platform I/O but before receipt

第 21 站

消息通道 mapping

这一节主要在解释“消息通道 mapping”到底是干什么的,以及你什么时候会遇到它。

这段在解决什么

这一节主要在解释“消息通道 mapping”到底是干什么的,以及你什么时候会遇到它。

为什么值得看

如果你是第一次接触 OpenClaw,这一节最值得看的不是术语本身,而是它背后的使用场景和限制。

真要动手时

真正动手时,先看它有没有默认值、有没有必须打开的选项、以及会不会影响安全边界。

先别急着背术语

这一小段像旁白,在提醒我们镜头已经切到下一站。

像整理表格

这段是在把几种选项排成表格,左边像标签,右边像说明。手机上可以横向滑动原文表格。

原文表格
ChannelTarget migration
TelegramReceive ack policy plus durable final sends. Live adapter owns send plus edit preview, stale preview final send, topics, quote-reply preview skip, media fallback, and retry-after handling.
DiscordSend adapter wraps existing durable payload delivery. Live adapter owns draft edit, progress draft, media/error preview cancel, reply target preservation, and message id receipts. Audit bot-authored gateway-failure echoes in shared rooms; use an outbound registry or other native equivalent if Discord cannot carry origin metadata on normal messages.
SlackSend adapter handles normal chat posts. Live adapter chooses native stream when thread shape supports it, otherwise draft preview. Receipts preserve thread timestamps. Origin adapter maps OpenClaw gateway failures to Slack chat.postMessage.metadata and drops tagged bot-room echoes before allowBots authorization.
WhatsAppSend adapter owns text/media send with durable final intents. Receive adapter handles group mention and sender identity. Live can stay absent until WhatsApp has an editable transport.
MatrixLive adapter owns draft event edits, finalization, redaction, encrypted media constraints, and reply-target mismatch fallback. Receive adapter owns encrypted event hydration and dedupe. Origin adapter should encode OpenClaw gateway-failure origin into Matrix event content and drop configured-bot room echoes before allowBots handling.
MattermostLive adapter owns one draft post, progress/tool folding, finalization in place, and fresh-send fallback.
Microsoft TeamsLive adapter owns native progress and block stream behavior. Send adapter owns activities and attachment/card receipts.
FeishuRender adapter owns text/card/raw rendering. Live adapter owns streaming cards and duplicate final suppression. Send adapter owns comments, topic sessions, media, and voice suppression.
QQ BotLive adapter owns C2C streaming, accumulator timeout, and fallback final send. Render adapter owns media tags and text-as-voice.
SignalSimple receive plus send adapter. No live adapter unless signal-cli adds reliable edit support.
iMessageSimple receive plus send adapter. iMessage send must preserve monitor echo-cache population before durable finals can bypass monitor delivery.
Google ChatSimple receive plus send adapter with thread relation mapped to spaces and thread ids. Audit allowBots=true room behavior for tagged OpenClaw gateway-failure echoes.
LINESimple receive plus send adapter with reply-token constraints modeled as target/relation capability.
Nextcloud TalkSDK receive bridge plus send adapter.
IRCSimple receive plus send adapter, no durable edit receipts.
NostrReceive plus send adapter for encrypted DMs; receipts are event ids.
QA ChannelContract-test adapter for receive, send, live, retry, and recovery behavior.
Synology ChatSimple receive plus send adapter.
TlonSend adapter must preserve model-signature rendering and participated-thread tracking before generic durable final delivery is enabled.
TwitchSimple receive plus send adapter with rate-limit classification.
ZaloSimple receive plus send adapter.
Zalo PersonalSimple receive plus send adapter.

第 22 站

Phase 1: Internal 小纸条消息 Domain

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

这段在解决什么

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

为什么值得看

你理解的是能力边界,不只是功能名字。

真要动手时

如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:origins, receipts, capabilities, durable intents, receive context, send context, live context, and failure classes. cur…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:origins, receipts, capabilities, durable intents, receive context, send context, live context, and failure classes.

原文小纸条

origins, receipts, capabilities, durable intents, receive context, send context, live context, and failure classes.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:current reply delivery, then move that field to 消息通道小纸条消息 and rendered 小纸条消息 types as the refactor replaces reply paylo…。

原文小纸条

current reply delivery, then move that field to ChannelMessage and rendered message types as the refactor replaces reply payloads.

像准备清单

这一串条目别硬背,把它当成“Phase 1: Internal Message Domain”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Add src/消息通道s/小纸条消息/* types for 小纸条消息s, t…、Add origin?: 小纸条消息Origin to the migration…、Keep this internal until adapters and tes…、Add pure unit tests for state transitions…。

原文小纸条
  • Add src/channels/message/* types for messages, targets, relations,
  • Add origin?: MessageOrigin to the migration bridge payload type used by
  • Keep this internal until adapters and tests prove the shape.
  • Add pure unit tests for state transitions and serialization.

第 23 站

Phase 2: Durable Send Core

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:小纸条消息 send intents. only one reply payload. cannot be written in the new 小纸条消息 lifecycle, after the adapter declares re…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:小纸条消息 send intents.

原文小纸条

message send intents.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:only one reply payload.

原文小纸条

only one reply payload.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:cannot be written in the new 小纸条消息 lifecycle, after the adapter declares replay safety. Existing 消息通道-turn and SDK comp…。

原文小纸条

cannot be written in the new message lifecycle, after the adapter declares replay safety. Existing channel-turn and SDK compatibility paths remain direct-send by default during this phase.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:of treating durable send as a terminal side effect.

原文小纸条

of treating durable send as a terminal side effect.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:chunked sends preserve OpenClaw operational provenance.

原文小纸条

chunked sends preserve OpenClaw operational provenance.

像准备清单

这一串条目别硬背,把它当成“Phase 2: Durable Send Core”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Move the existing outbound queue from rep…、Let a durable send intent carry a project…、Preserve the current queue recovery behav…、Make deliverOutboundPayloads call 小纸条消息s.…。

原文小纸条
  • Move the existing outbound queue from reply-payload durability to durable
  • Let a durable send intent carry a projected payload array or batch plan, not
  • Preserve the current queue recovery behavior through compatibility conversion.
  • Make deliverOutboundPayloads call messages.send.
  • Make final-send durability the default and fail closed when the durable intent
  • Record receipts consistently.
  • Return receipts and delivery results to the original dispatcher caller instead
  • Persist message origin through durable send intents so recovery, replay, and

第 24 站

Phase 3: 消息通道 Turn Bridge

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:小纸条消息s.receive and 小纸条消息s.send. only when its adapter explicitly opts in with a replay-safe durability policy. native e…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:小纸条消息s.receive and 小纸条消息s.send.

原文小纸条

messages.receive and messages.send.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:only when its adapter explicitly opts in with a replay-safe durability policy.

原文小纸条

only when its adapter explicitly opts in with a replay-safe durability policy.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:native edits and cannot replay safely yet, but do not rely on false markers to protect unmigrated 消息通道s.

原文小纸条

native edits and cannot replay safely yet, but do not rely on false markers to protect unmigrated channels.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:the 消息通道 mapping proves the generic send path preserves the old 消息通道 delivery semantics.

原文小纸条

the channel mapping proves the generic send path preserves the old channel delivery semantics.

像准备清单

这一串条目别硬背,把它当成“Phase 3: Channel Turn Bridge”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Reimplement 消息通道.turn.run and dispatchAss…、Keep current fact types stable.、Keep legacy behavior by default. An assem…、Keep durable: false as a compatibility es…。

原文小纸条
  • Reimplement channel.turn.run and dispatchAssembledChannelTurn on top of
  • Keep current fact types stable.
  • Keep legacy behavior by default. An assembled-turn channel becomes durable
  • Keep durable: false as a compatibility escape hatch for paths that finalize
  • Default assembled-turn durability only in the new message lifecycle, after

第 25 站

Phase 4: Prepared Dispatcher Bridge

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:they already have durable-final work or simpler send paths. the send context. Documentation and changelog entries must…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:they already have durable-final work or simpler send paths.

原文小纸条

they already have durable-final work or simpler send paths.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:the send context. Documentation and changelog entries must say "assembled 消息通道 turns" or name the migrated 消息通道 paths r…。

原文小纸条

the send context. Documentation and changelog entries must say "assembled channel turns" or name the migrated channel paths rather than claiming all automatic final replies.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:public compatibility helpers behavior-preserving. They may expose an explicit send-context opt-in later, but must not a…。

原文小纸条

public compatibility helpers behavior-preserving. They may expose an explicit send-context opt-in later, but must not automatically attempt generic durable delivery before the caller-owned delivery callback.

像准备清单

这一串条目别硬背,把它当成“Phase 4: Prepared Dispatcher Bridge”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Replace deliverDurableInboundReplyPayload…、Keep the old helper as a wrapper.、Port Telegram, WhatsApp, Slack, Signal, i…、Treat every prepared dispatcher as uncove…。

原文小纸条
  • Replace deliverDurableInboundReplyPayload with a send-context bridge.
  • Keep the old helper as a wrapper.
  • Port Telegram, WhatsApp, Slack, Signal, iMessage, and Discord first because
  • Treat every prepared dispatcher as uncovered until it explicitly opts in to
  • Keep recordInboundSessionAndDispatchReply, direct-DM helpers, and similar

第 26 站

Phase 5: Unified Live Lifecycle

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

这段在解决什么

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

为什么值得看

你理解的是能力边界,不只是功能名字。

真要动手时

如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:parity tests.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:parity tests.

原文小纸条

parity tests.

像准备清单

这一串条目别硬背,把它当成“Phase 5: Unified Live Lifecycle”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Build 小纸条消息s.live with two proof adapters:、Telegram for send plus edit plus stale fi…、Matrix for draft finalization plus redact…、Then migrate Discord, Slack, Mattermost,…。

原文小纸条
  • Build messages.live with two proof adapters:
  • Telegram for send plus edit plus stale final send.
  • Matrix for draft finalization plus redaction fallback.
  • Then migrate Discord, Slack, Mattermost, Teams, QQ Bot, and Feishu.
  • Delete duplicated preview finalization code only after each channel has

第 27 站

Phase 6: Public SDK

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

这段在解决什么

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

为什么值得看

你理解的是能力边界,不只是功能名字。

真要动手时

如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:新本领插件 SDK docs. shouldDropOpenClawEcho predicate in the 消息通道-小纸条消息 SDK surface. migrated.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:新本领插件 SDK docs.

原文小纸条

plugin SDK docs.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:shouldDropOpenClawEcho predicate in the 消息通道-小纸条消息 SDK surface.

原文小纸条

shouldDropOpenClawEcho predicate in the channel-message SDK surface.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:migrated.

原文小纸条

migrated.

像准备清单

这一串条目别硬背,把它当成“Phase 6: Public SDK”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Add openclaw/新本领插件-sdk/消息通道-小纸条消息.、Document it as the preferred 消息通道 新本领插件 对…、Update package exports, entrypoint invent…、Include 小纸条消息Origin, origin encode/decode…。

原文小纸条
  • Add openclaw/plugin-sdk/channel-message.
  • Document it as the preferred channel plugin API.
  • Update package exports, entrypoint inventory, generated API baselines, and
  • Include MessageOrigin, origin encode/decode hooks, and the shared
  • Keep compatibility wrappers for old subpaths.
  • Mark reply-named SDK helpers as deprecated in docs after bundled plugins are

第 28 站

Phase 7: All Senders

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

这段在解决什么

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

为什么值得看

你理解的是能力边界,不只是功能名字。

真要动手时

如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Move all non-reply outbound producers onto 小纸条消息s.send: This is where the 聪明脑袋模型 stops being "机器人朋友 replies" and become…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Move all non-reply outbound producers onto 小纸条消息s.send:。

原文小纸条

Move all non-reply outbound producers onto messages.send:

像准备清单

这一串条目别硬背,把它当成“Phase 7: All Senders”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:cron and heartbeat notifications、task completions、hook results、approval prompts and approval results。

原文小纸条
  • cron and heartbeat notifications
  • task completions
  • hook results
  • approval prompts and approval results
  • message tool sends
  • subagent completion announcements
  • explicit CLI or Control UI sends
  • automation/broadcast paths
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:This is where the 聪明脑袋模型 stops being "机器人朋友 replies" and becomes "OpenClaw sends 小纸条消息s".

原文小纸条

This is where the model stops being "agent replies" and becomes "OpenClaw sends messages".

第 29 站

Phase 8: Deprecate Turn

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

这段在解决什么

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

为什么值得看

你理解的是能力边界,不只是功能名字。

真要动手时

如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:and third-party contracts have a stable replacement.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:and third-party contracts have a stable replacement.

原文小纸条

and third-party contracts have a stable replacement.

像准备清单

这一串条目别硬背,把它当成“Phase 8: Deprecate Turn”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Keep 消息通道.turn as a wrapper for at least…、Publish migration notes.、Run 新本领插件 SDK compatibility tests against…、Remove or hide old internal helpers only…。

原文小纸条
  • Keep channel.turn as a wrapper for at least one compatibility window.
  • Publish migration notes.
  • Run plugin SDK compatibility tests against old imports.
  • Remove or hide old internal helpers only after no bundled plugin needs them

第 30 站

Test plan

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Unit tests: supports reconciliation. serialization, and recovery. Integration tests: explicitly opts in. and do not gen…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Unit tests:。

原文小纸条

Unit tests:

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:supports reconciliation.

原文小纸条

supports reconciliation.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:serialization, and recovery.

原文小纸条

serialization, and recovery.

像准备清单

这一串条目别硬背,把它当成“Test plan”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Durable send intent serialization and rec…、Idempotency key reuse and duplicate suppr…、Receipt commit and replay skip.、unknown_after_send recovery that reconcil…。

原文小纸条
  • Durable send intent serialization and recovery.
  • Idempotency key reuse and duplicate suppression.
  • Receipt commit and replay skip.
  • unknown_after_send recovery that reconciles before replay when an adapter
  • Failure classification policy.
  • Receive ack policy sequencing.
  • Relation mapping for reply, followup, system, and broadcast sends.
  • Gateway-failure origin factory and shouldDropOpenClawEcho predicate.
  • Origin preservation through payload normalization, chunking, durable queue
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Integration tests:。

原文小纸条

Integration tests:

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:explicitly opts in.

原文小纸条

explicitly opts in.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:and do not generic-send before those callbacks.

原文小纸条

and do not generic-send before those callbacks.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:restart and cannot leave the later payloads unrecorded after an early crash.

原文小纸条

restart and cannot leave the later payloads unrecorded after an early crash.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:dispatcher.

原文小纸条

dispatcher.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:is disabled or unavailable.

原文小纸条

is disabled or unavailable.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:requires normal delivery.

原文小纸条

requires normal delivery.

像准备清单

这一串条目别硬背,把它当成“Test plan”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:消息通道.turn.run simple adapter still record…、Legacy assembled-event delivery does not…、消息通道.turn.runPrepared bridge still record…、Public compatibility helpers call caller-…。

原文小纸条
  • channel.turn.run simple adapter still records and sends.
  • Legacy assembled-event delivery does not become durable unless the channel
  • channel.turn.runPrepared bridge still records and finalizes.
  • Public compatibility helpers call caller-owned delivery callbacks by default
  • Durable fallback delivery replays the whole projected payload array after
  • Durable assembled-event delivery returns platform message ids to the buffered
  • Custom delivery hooks still return platform message ids when durable delivery
  • Final reply survives restart between assistant completion and platform send.
  • Preview draft finalizes in place when allowed.
  • Preview draft is cancelled or redacted when media/error/reply-target mismatch
  • Block streaming and preview streaming do not both deliver the same text.
  • Media streamed early is not duplicated in final delivery.
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:消息通道 tests:。

原文小纸条

Channel tests:

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:completed watermark.

原文小纸条

completed watermark.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:the persisted safe-completed offset 聪明脑袋模型.

原文小纸条

the persisted safe-completed offset model.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:atomically, not one single-payload durable intent per loop iteration.

原文小纸条

atomically, not one single-payload durable intent per loop iteration.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:or changelog claim Discord final-reply durability.

原文小纸条

or changelog claim Discord final-reply durability.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:generic durable send until their adapter parity tests exist.

原文小纸条

generic durable send until their adapter parity tests exist.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:migrated to a complete 小纸条消息 target and replay-safe send adapter.

原文小纸条

migrated to a complete message target and replay-safe send adapter.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:bot-room echoes drop before allowBots, and untagged bot 小纸条消息s with the same visible text still follow normal bot autho…。

原文小纸条

bot-room echoes drop before allowBots, and untagged bot messages with the same visible text still follow normal bot authorization.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:accounts drop before allowBots handling.

原文小纸条

accounts drop before allowBots handling.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:allowBots modes before claiming generic protection there.

原文小纸条

allowBots modes before claiming generic protection there.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:thread tracking.

原文小纸条

thread tracking.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Synology Chat, Tlon, Twitch, Zalo, and Zalo Personal simple durable final sends.

原文小纸条

Synology Chat, Tlon, Twitch, Zalo, and Zalo Personal simple durable final sends.

像准备清单

这一串条目别硬背,把它当成“Test plan”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Telegram topic reply with polling ack del…、Telegram polling recovery for accepted-bu…、Telegram stale preview sends fresh final…、Telegram silent fallback sends every proj…。

原文小纸条
  • Telegram topic reply with polling ack delayed until the receive context's safe
  • Telegram polling recovery for accepted-but-not-delivered updates covered by
  • Telegram stale preview sends fresh final and cleans up preview.
  • Telegram silent fallback sends every projected fallback payload.
  • Telegram silent fallback durability records the full projected fallback array
  • Discord preview cancel on media/error/explicit reply.
  • Discord prepared dispatcher finals route through the send context before docs
  • iMessage durable final sends populate the monitor sent-message echo cache.
  • LINE, Zalo, and Nostr legacy delivery paths are not bypassed by
  • Direct-DM/Nostr callback delivery remains authoritative unless explicitly
  • Slack tagged OpenClaw gateway failure messages stay visible outbound, tagged
  • Slack native stream fallback to draft preview in top-level DMs.
  • Matrix preview finalization and redaction fallback.
  • Matrix tagged OpenClaw gateway-failure room echoes from configured bot
  • Discord and Google Chat shared-room gateway-failure cascade audits cover
  • Mattermost draft finalization and fresh-send fallback.
  • Teams native progress finalization.
  • Feishu duplicate final suppression.
  • QQ Bot accumulator timeout fallback.
  • Tlon durable final sends preserve model-signature rendering and participated
  • WhatsApp, Signal, iMessage, Google Chat, LINE, IRC, Nostr, Nextcloud Talk,
像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:Validation:。

原文小纸条

Validation:

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:public SDK/export changes.

原文小纸条

public SDK/export changes.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:simple send-only 消息通道 before removing compatibility wrappers.

原文小纸条

simple send-only channel before removing compatibility wrappers.

像准备清单

这一串条目别硬背,把它当成“Test plan”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Targeted Vitest files during development.、pnpm check:changed in Testbox for the ful…、Broader pnpm check in Testbox before land…、Live or qa-消息通道 smoke for at least one ed…。

原文小纸条
  • Targeted Vitest files during development.
  • pnpm check:changed in Testbox for the full changed surface.
  • Broader pnpm check in Testbox before landing the complete refactor or after
  • Live or qa-channel smoke for at least one edit-capable channel and one

第 31 站

Open questions

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

这段在解决什么

这一节在讲一类能力是怎么工作的:它能做什么、不能做什么、适合在什么场景下调用。

为什么值得看

你理解的是能力边界,不只是功能名字。

真要动手时

如果这节里同时出现命令、配置和例子,优先先看例子,再回头看配置。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:fully durable polling source that can control platform-level redelivery, not only OpenClaw's persisted restart watermar…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:fully durable polling source that can control platform-level redelivery, not only OpenClaw's persisted restart watermar…。

原文小纸条

fully durable polling source that can control platform-level redelivery, not only OpenClaw's persisted restart watermark.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:as the final send intent or in a sibling live-state store.

原文小纸条

as the final send intent or in a sibling live-state store.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:新本领插件-sdk/消息通道-小纸条消息 ships.

原文小纸条

plugin-sdk/channel-message ships.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:provide normalize/send/live hooks through define消息通道小纸条消息Adapter.

原文小纸条

provide normalize/send/live hooks through defineChannelMessageAdapter.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:state.

原文小纸条

state.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:should be 聪明脑袋模型ed as send-context hooks, adapter-owned finalize steps, or receipt subscribers.

原文小纸条

should be modeled as send-context hooks, adapter-owned finalize steps, or receipt subscribers.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:registries, and which cannot offer reliable cross-bot echo suppression.

原文小纸条

registries, and which cannot offer reliable cross-bot echo suppression.

像准备清单

这一串条目别硬背,把它当成“Open questions”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Whether Telegram should eventually replac…、Whether durable live preview state should…、How long compatibility wrappers stay docu…、Whether third-party 新本领插件s should impleme…。

原文小纸条
  • Whether Telegram should eventually replace the grammY runner source with a
  • Whether durable live preview state should be stored in the same queue record
  • How long compatibility wrappers stay documented after
  • Whether third-party plugins should implement receive adapters directly or only
  • Which receipt fields are safe to expose in public SDK versus internal runtime
  • Whether side effects such as self-echo caches and participated-thread markers
  • Which channels have native origin metadata, which need persisted outbound

第 32 站

Acceptance criteria

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:小纸条消息s.send. documented compatibility wrapper. finalization. the final response or duplicating already committed sends;…。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:小纸条消息s.send.

原文小纸条

messages.send.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:documented compatibility wrapper.

原文小纸条

documented compatibility wrapper.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:finalization.

原文小纸条

finalization.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:the final response or duplicating already committed sends; sends whose platform outcome is unknown are reconciled befor…。

原文小纸条

the final response or duplicating already committed sends; sends whose platform outcome is unknown are reconciled before replay or documented as at-least-once for that adapter.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:unless a caller explicitly selected a documented non-durable mode.

原文小纸条

unless a caller explicitly selected a documented non-durable mode.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:消息通道-owned delivery; generic durable send is explicit opt-in only.

原文小纸条

channel-owned delivery; generic durable send is explicit opt-in only.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:primary id for threading/edit convenience.

原文小纸条

primary id for threading/edit convenience.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:delivery callbacks.

原文小纸条

delivery callbacks.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:path explicitly uses the send context.

原文小纸条

path explicitly uses the send context.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:intent or batch plan.

原文小纸条

intent or batch plan.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:bot-authored room echoes are dropped before bot authorization on 消息通道s that declare support for the origin contract.

原文小纸条

bot-authored room echoes are dropped before bot authorization on channels that declare support for the origin contract.

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:policy, migration, and test coverage.

原文小纸条

policy, migration, and test coverage.

像准备清单

这一串条目别硬背,把它当成“Acceptance criteria”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:Every bundled 小纸条消息 消息通道 sends final visi…、Every inbound 小纸条消息 消息通道 enters through 小…、Every preview/edit/一边说一边送 消息通道 uses 小纸条消息…、消息通道.turn is only a wrapper.

原文小纸条
  • Every bundled message channel sends final visible output through
  • Every inbound message channel enters through messages.receive or a
  • Every preview/edit/stream channel uses messages.live for draft state and
  • channel.turn is only a wrapper.
  • Reply-named SDK helpers are compatibility exports, not the recommended path.
  • Durable recovery can replay pending final sends after restart without losing
  • Durable final sends fail closed when the durable intent cannot be written,
  • Legacy channel-turn and SDK compatibility helpers default to direct
  • Receipts preserve all platform message ids for multi-part deliveries and a
  • Durable wrappers preserve channel-local side effects before replacing direct
  • Prepared dispatchers are not counted as durable until their final delivery
  • Fallback delivery handles every projected payload.
  • Durable fallback delivery records every projected payload in one replayable
  • OpenClaw-originated gateway failure output is visible to humans but tagged
  • The docs explain send, receive, live, state, receipts, relations, failure

第 33 站

Related

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

这段在解决什么

这一节在讲规则和边界:什么默认允许、什么必须显式打开、什么被禁止。

为什么值得看

这种内容决定了 OpenClaw 是“能做”还是“现在还不能做”,读懂它比记术语更重要。

真要动手时

你可以把这一节当成权限说明书,真正配置时优先盯住 default、required、allow、deny 这几个词。

先别急着背术语

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:---。

像准备清单

这一串条目别硬背,把它当成“Related”门口贴出来的几张便签就行。它们在提醒你先备好什么、别漏掉什么、哪里最容易走错:小纸条消息s、一边说一边送ing and chunking、Progress drafts、Retry policy。

像讲绘本

如果把这一段摆成一个小场景,你会看到几样东西正在互相打招呼、拦路或者传东西。别急着记名词,先抓住它此刻到底在发生什么:---。

原文小纸条

---

AdSense 连接验证已经放在页面头部;广告单元等站点审批通过后再启用。

google-adsense-account: ca-pub-3833673520933536