<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Eventboat</title><link>https://eventboat.dev/zh/</link><description>Recent content on Eventboat</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sat, 05 Sep 2026 01:32:49 +0800</lastBuildDate><atom:link href="https://eventboat.dev/zh/index.xml" rel="self" type="application/rss+xml"/><item><title>v0.2.0-rc1</title><link>https://eventboat.dev/zh/blog/release/v0.2.0-rc1/</link><pubDate>Fri, 04 Sep 2026 00:00:00 +0000</pubDate><guid>https://eventboat.dev/zh/blog/release/v0.2.0-rc1/</guid><description>&lt;p&gt;我们很高兴宣布 &lt;strong&gt;v0.2.0-rc1&lt;/strong&gt;——Eventboat（Agent 原生事件路由器）的首个候选发布版本。&lt;/p&gt;&#10;&lt;h2 id="包含什么"&gt;包含什么&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Agent 原生&lt;/strong&gt;：MCP 服务器 15 个工具覆盖完整生命周期&#10;（catalog → verify → test → explain → deploy → status → trigger → tail → 死信回放）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;零自研语言&lt;/strong&gt;：CEL 谓词（K8s 标准）+ Starlark 转换（Python 方言、沙箱、确定性）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;可靠性引擎&lt;/strong&gt;：spool + settle + checkpoint（SQLite），七条不变量测试，&#10;kill -9 从水位恢复，死信库可查可回放&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;作业管道&lt;/strong&gt;：cron 调度、补偿窗口、重叠策略、类型化参数（回补）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;扩展阶梯&lt;/strong&gt;：CEL → Starlark → WASM（wazero）→ gRPC 进程外插件&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CESQL 方言&lt;/strong&gt;：CloudEvents 互操作（可选），官方 TCK 100%&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;LSP&lt;/strong&gt;：编辑器诊断、补全、hover&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CLI&lt;/strong&gt;：11 个命令，基于 &lt;a href="https://github.com/lynx-go/commands"&gt;lynx-go/commands&lt;/a&gt;，&#10;&lt;code&gt;--json&lt;/code&gt; 输出面向 Agent 和 CI&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="快速上手"&gt;快速上手&#10;&lt;/h2&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-f6465460-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="2"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-f6465460-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go install github.com/eventboat/eventboat/cmd/eventboat@v0.2.0-rc1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;eventboat help&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;→ &lt;a href="https://github.com/eventboat/eventboat/blob/main/CHANGELOG.md"&gt;完整 CHANGELOG&lt;/a&gt;&lt;/p&gt;</description></item><item><title>安装</title><link>https://eventboat.dev/zh/docs/get-started/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eventboat.dev/zh/docs/get-started/installation/</guid><description>&lt;h2 id="前提"&gt;前提&#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Go 1.25+（从源码构建）&lt;/li&gt;&#10;&lt;li&gt;零运行时依赖——全部编译进一个二进制&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="安装"&gt;安装&#10;&lt;/h2&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-04ad0d39-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-04ad0d39-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go install github.com/eventboat/eventboat/cmd/eventboat@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;验证：&lt;/p&gt;</description></item><item><title>什么是 Eventboat？</title><link>https://eventboat.dev/zh/docs/introduction/overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eventboat.dev/zh/docs/introduction/overview/</guid><description>&lt;p&gt;Eventboat 通过有向无环图（DAG）路由事件——从&lt;strong&gt;源&lt;/strong&gt;（Kafka、HTTP、cron、SQL、文件）&#10;到&lt;strong&gt;汇&lt;/strong&gt;（Kafka、HTTP、文件），保证 at-least-once 投递、死信可查可回放。&lt;/p&gt;</description></item><item><title>CLI 参考</title><link>https://eventboat.dev/zh/docs/reference/commands/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eventboat.dev/zh/docs/reference/commands/</guid><description>&lt;h2 id="总览"&gt;总览&#10;&lt;/h2&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-7ce5ed4d-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="console" data-td-line-count="14"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-7ce5ed4d-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] verify --config &amp;lt;pipeline.yaml&amp;gt; [--strict]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] test &amp;lt;testfile-or-dir&amp;gt; [...]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat run --config &amp;lt;pipeline.yaml&amp;gt; [--data-dir DIR] [--ephemeral]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat run --config-dir &amp;lt;dir&amp;gt; [--runtime runtime.yaml]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] trigger --config &amp;lt;job.yaml&amp;gt; [--parameters &amp;#39;{&amp;#34;from&amp;#34;:&amp;#34;...&amp;#34;}&amp;#39;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] jobs list --config &amp;lt;job.yaml&amp;gt; [--limit N]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] jobs show &amp;lt;run-id&amp;gt; --config &amp;lt;job.yaml&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] explain --config &amp;lt;pipeline.yaml&amp;gt; [--message f.json] [--topology]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] replay --config &amp;lt;pipeline.yaml&amp;gt; (--dlq | --spool --from N | --job &amp;lt;run-id&amp;gt;) [--dry-run]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat repl [--message sample.json] [--cel &amp;#39;expr&amp;#39; | --script f.star]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat lsp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] plugin catalog&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat [--json] plugin schema &amp;lt;name&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;eventboat mcp (--stdio | --http) [--config-dir &amp;lt;dir&amp;gt;] [--data-dir DIR]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="verify"&gt;verify&#10;&lt;/h2&gt;&#10;&lt;p&gt;静态验证管道。检查 schema、拓扑不变量（无环、无孤立节点、源无入边、汇无出边、&#10;至少一条源→汇通路）、CEL 谓词编译、Starlark 脚本编译、作业配置和语义 lint。&lt;/p&gt;</description></item><item><title>第一条管道</title><link>https://eventboat.dev/zh/docs/get-started/first-pipeline/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eventboat.dev/zh/docs/get-started/first-pipeline/</guid><description>&lt;h2 id="三段式格式"&gt;三段式格式&#10;&lt;/h2&gt;&#10;&lt;p&gt;每个 Eventboat 管道是一个 YAML 文件，三个顶层段：&lt;code&gt;sources&lt;/code&gt;、&lt;code&gt;transforms&lt;/code&gt;、&#10;&lt;code&gt;sinks&lt;/code&gt;——通过 &lt;code&gt;from&lt;/code&gt; 连边。&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-1ae48307-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="yaml" data-td-line-count="19"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-1ae48307-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;eventboat/v3&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Pipeline&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-first-pipeline }&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ingest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;*/5 * * * *&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;}&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 每 5 分钟&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;transforms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;ingest]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; payload.greeting = &amp;#34;hello from eventboat&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; payload.timestamp = meta.ingest_time&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;sinks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;console&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;hello]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{}&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 丢弃（演示用）&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="验证关卡-1"&gt;验证（关卡 1）&#10;&lt;/h2&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-1ae48307-fence-1" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-1ae48307-fence-1-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;eventboat verify --config pipeline.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;输出：&lt;code&gt;pipeline.yaml: 0 error(s), 0 warning(s)&lt;/code&gt;&lt;/p&gt;</description></item><item><title>架构</title><link>https://eventboat.dev/zh/docs/introduction/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://eventboat.dev/zh/docs/introduction/architecture/</guid><description>&lt;h2 id="三层模型"&gt;三层模型&#10;&lt;/h2&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-7600bf6f-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="" data-td-line-count="3"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-7600bf6f-fence-0-viewport" data-td-code-viewport&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;YAML (+overlay) → Config（类型化）→ Static IR → Runtime Engine&#10; ↓&#10; Source → Transform → Sink 插件&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Config 层&lt;/strong&gt;：YAML 解析、严格 schema 校验、变量替换&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Static IR&lt;/strong&gt;：校验后的 DAG + 预编译 CEL 程序 + Starlark 程序 + schema&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Runtime&lt;/strong&gt;：spool + settle + checkpoint 引擎，只消费 IR&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="可靠性模型"&gt;可靠性模型&#10;&lt;/h2&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-7600bf6f-fence-1" data-td-code data-td-code-auto-id&#10; data-td-language="" data-td-line-count="3"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-7600bf6f-fence-1-viewport" data-td-code-viewport&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;source → [spool: 追加式持久队列] → 内存 DAG → sinks&#10; │ │&#10; └── checkpoint ←── settle 跟踪 ←── 终态&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Spool&lt;/strong&gt;：每条消息先落 SQLite 再进 DAG（不变量 1）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Settle&lt;/strong&gt;：消息的全部分支到达终态即 settle&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Checkpoint&lt;/strong&gt;：只推进已 settle 的连续前缀（不变量 2）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;崩溃恢复&lt;/strong&gt;：kill -9 → 重启 → 从 checkpoint 重放，绝不丢（不变量 3）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;死信&lt;/strong&gt;：重试耗尽 → 死信库（可查询 + 可回放）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="七条不变量测试"&gt;七条不变量测试&#10;&lt;/h2&gt;&#10;&lt;p&gt;每条都有专属测试，CI 必须通过：&lt;/p&gt;</description></item></channel></rss>