阶段二十三:后续治理待规划
阶段状态:进行中
计划状态:实施中
当前工作包:P23-10 文档、发布与生产收口
📌 结论摘要
P23-10 文档、发布与生产收口已完成,P23 阶段仍在进行中。 P23 的正式范围是“探针、告警与 AI Boss 运行闭环治理”,P23-1 至 P23-8 已完成生产部署,P23-9 已通过隔离端到端回归;本轮又复核了 CPA 版本上报定时器、RR 快照、API/Console/Docs 生产修订及完整本地测试。依据是 8787725c 与 128d73ff 的 Actions 留档、2026-11-04 生产回读和 bash scripts/ci/run-local-tests.sh。影响是 P23 不因接口接受就宣称微信真实送达;手机端收件确认和最终用户确认仍未完成。
P22 的准确状态是核心范围完成并归档,但不是原计划全部验收通过。P22-2/P22-3 的运行时探针目录、告警与 AI Boss 严格不变量、历史数据迁移和端到端负向回归转入 P23。P23-0 的第一项工作就是补正 P22 归档口径,避免把“阶段已归档”误写成“原始验收全部通过”。
🗂️ 目录
- 结论摘要
- P23 正式范围
- 现状证据
- 目标模型
- 工作包总表
- 历史数据迁移口径
- 告警中心页面设计
- 告警外发通道
- 执行顺序
- 验收矩阵
- P23-10 文档、发布与生产收口
- 不纳入 P23 的范围
- 计划状态
- 技术栈与架构选型
- 目标、成果与验收契约
- 分布式底座接入声明
- 未决项 / 需要决策
🎯 P23 正式范围
P23 分为四层,顺序不能颠倒:
| 层 | 解决的问题 | 主要产物 |
|---|---|---|
| 探针层 | 有哪些探针、谁负责、是否应该告警 | 统一探针注册表 |
| 告警层 | 故障、恢复、健康事件如何区分和保存 | 告警数据模型和历史迁移 |
| 处置层 | AI Boss 是否接收、做了什么、谁验证关闭 | 独立处置与验证状态 |
| 使用层 | 人如何筛选、查看、标记已读和收到通知 | 告警中心 UI 和通知通道 |
探针不是全部都要告警。 网络观测、业务健康和仅业务观察必须有明确边界;只有定义了用户影响、告警阈值和恢复条件的探针,才允许进入告警中心。
📊 现状证据
2026-11-03 只读回读 RR 告警库,当前状态如下:
| 指标 | 当前值 | 说明 |
|---|---|---|
| 告警总数 | 843 | 页面只显示最近 100 条 |
resolved 记录 |
774 | 多数是恢复或健康事件,不是独立故障 |
前面没有故障的 resolved |
737 | 没有可恢复的原故障 |
发布类 resolved |
728 | 每次发布成功都会形成一条“已恢复” |
handling_status=completed |
839 | 绝大多数没有 AI Boss 完成动作 |
没有 Incident 的 completed |
836 | 不能证明 AI Boss 接收过 |
没有 boss_completed 动作的 completed |
832 | 不能证明 AI Boss 处理过 |
真实 recovery_linked |
56 | 这部分才是恢复关联 |
页面点击产生的 read |
22 | 点击整行自动标记已读 |
这些数字说明当前告警中心不是单一页面问题,而是数据语义、事件模型和交互边界同时混在一起。
🧪 P23-1 实施记录(第一批已完成)
本轮已完成第一批代码、迁移和生产上线:
| 实施项 | 当前结果 |
|---|---|
| 记录类型 | 新增 fault、recovery、observation 三类记录 |
| 生命周期 | 新增 open、recovered、verified_closed、archived |
| 恢复字段 | 新增恢复来源、恢复说明、恢复时间,不再写入 result_summary |
| 阅读语义 | 新增手动 read/unread 和 read_source,点击行只打开详情 |
| AI Boss 判定 | completed 必须有 incident,页面只按 boss_processed 显示处理结果 |
| 查询接口 | 默认只查故障;支持事件视图、月份、级别、处置状态、阅读状态、来源、关键词和分页 |
| 迁移预演 | 生产副本迁移后为 69 条故障、778 条健康/恢复事件、62 条历史状态不完整、7 条真实 AI Boss 完成、56 条真实恢复关联;841 条未读、6 条保留已读 |
| 生产迁移 | 迁移后 69 条故障、783 条健康/恢复事件、62 条历史状态不完整、7 条真实 AI Boss 完成、56 条真实恢复关联;846 条未读、6 条保留已读;PRAGMA quick_check=ok |
| 阅读修正 | 第二批迁移清除了旧版 acknowledged_at 回填源,22 条自动已读回到未读,不再被下一次初始化重新写回 |
| 生产部署 | API Gateway 5dac0507、Console db6fa5a4 健康;默认视图 69 条故障,事件视图 783 条,全部记录 852 条 |
生产迁移前备份保存在 101 备份盘 /srv/codex-hub-backup/agentmeshos/p23-alert-migration/pre-p23-20261103T214927+0800/alerts.db,SHA256 为 d24b3561ea69e48e37097d5e394b4afaaea50bce22fb76b344137a6460eedb76。下一步进入 P23-2 统一探针注册表与 P23-3 强制契约。
🧪 P23-2 实施记录(已上线)
本轮已建立运行时探针注册表,覆盖当前生产 producer 的全部 16 个身份:
| 实施项 | 当前结果 |
|---|---|
| 注册表文件 | tools/api-gateway/src/probe_registry.json |
| 探针数量 | 38 条:35 条 active、2 条 retired、1 条 unmanaged |
| 告警资格 | 19 条允许进入告警 |
| 生产者覆盖 | 16 个 alert producer,与生产告警库 distinct producer 完全一致 |
| 分类 | 网络观测、控制、业务健康、业务观察、调度陈旧、退役、未纳管 |
| API | 新增管理员只读 GET /api/probes,返回责任、节点、调度、告警资格、恢复格式、页面和证据路径 |
| 门禁 | alert_payload 默认拒绝未登记 producer;当前 16 个生产 producer 全部已登记 |
| 生产回读 | API Gateway 659fe424 健康;/api/probes 返回 38 条探针、35 条 active、2 条 retired、1 条 unmanaged、19 条 alert-enabled、16 个 producer |
注册表只是责任和资格事实,不触发探测。Console 探针目录页面和运行态状态合并仍在后续批次。
🧪 P23-3 实施记录(已上线)
本轮已完成探针到告警的强制契约第一批:
| 实施项 | 当前结果 |
|---|---|
| 故障身份 | 同一 scope + context_id 的活动故障按同一事件更新,不因状态变化新建告警 |
| 状态更新 | DEGRADED → UNREACHABLE 等变化更新原事件,seen_count 累加,并追加 state_updated 审计 |
| 恢复挂接 | 恢复事件只关联活动故障,原故障变为 recovered,恢复事件保存为独立 recovery 记录,不进入默认告警 |
| Producer 门禁 | 未登记 producer 默认拒绝写入 |
| 适配器 | agentmeshos-console-alert.sh 接受 updated 响应 |
| Console | 告警行显示首次发生、最近观测和观测次数 |
| 回归 | 验证同上下文状态变化复用同一 event_id,恢复后原故障保留恢复来源和证据 |
| 生产回读 | API 与 Console 均为 ba9ea83a;生产库 69 条故障、795 条健康/恢复事件、858 条未读、6 条原有已读,quick_check=ok |
这一批已部署并回读;下一步进入 P23-5 AI Boss 生命周期与验证关闭。
🧪 P23-5 实施记录(已上线)
本轮已完成 AI Boss 生命周期和独立验证关闭的第一批代码:
| 实施项 | 当前结果 |
|---|---|
| AI Boss 完成约束 | completed 必须同时有 Incident、结果说明和结果证据 |
| 验证接口 | 新增管理员 POST /api/alerts/{event_id}/verify,支持 verified 和 rejected |
| 验证状态 | 已恢复故障可进入 待验证关闭、已验证关闭 或 验证被拒绝 |
| 独立关闭 | 验证关闭不依赖 AI Boss 是否完成,只要求恢复证据、验证人和验证证据 |
| Console | 新增验证状态筛选、验证关闭/拒绝按钮、详情中的验证人、时间和证据 |
| 回归 | 覆盖恢复故障验证、拒绝后重新验证、恢复记录不可直接验证、AI Boss 完成缺少证据被拒绝 |
| 生产回读 | API、Console、Docs 均为 f68dbf7f;验证接口返回非存在告警 404,目录包含 /api/alerts/{event_id}/verify;verified_closed=0、verification_rejected=0,未改动历史故障 |
这一批已部署并回读;下一步进入 P23-8 告警外发通道。
🧪 P23-8 实施记录(已上线)
告警外发通道已在告警库所在主机(RR,生产主机)落地,单一来源仍是同一份告警库;没有新增第二套告警服务、第二套调度器或第二份状态。
| 实施项 | 当前结果 |
|---|---|
| 外发引擎 | agentmeshos-alert-notifier.py,只读告警库,run / test / status 三个命令 |
| 调度 | agentmeshos-alert-notifier.timer 每 5 分钟运行一次,Persistent=true 补跑漏掉的一次 |
| 首次基线 | 2026-11-04 01:36:25 CST 建立,历史 13 条未闭环故障和约 800 条健康事件零补发 |
| 严重告警策略 | 立即邮件 + 微信(微信已配置时),30 分钟后升级,此后每 6 小时最多再升级 2 次 |
| 关注告警策略 | 持续 15 分钟后邮件,持续 60 分钟后升级一次 |
| 恢复通知 | 已通知过的故障补发一条恢复通知,恢复只挂原故障,不新建告警 |
| 未通知即恢复 | 严重级补一条“已恢复”,关注级不补发,避免噪声 |
| 去重与重试 | 唯一键 事件 + 通道 + 类型;单条最多 5 次尝试,失败后 5 分钟退避 |
| 审计账本 | 新增 alert_notifications、alert_notifier_state 两张表,逐条记录尝试、失败原因和发送时间 |
| 静默与维护 | 静默时段只抑制关注级通知;维护窗口可整体暂停;runtime-probe 默认只发首次通知不做持续升级 |
| 配置保护 | /etc/agentmeshos/alert-notification.env 为 root:root 0600,仓库只保留模板,收件地址与微信目标不入库 |
| 真实邮件出站 | postfix 经 mx3.qq.com 返回 250 OK,邮件队列为空 |
| 真实微信出站 | openclaw message send 退出码 0、返回 messageId、无错误;通道 lastOutboundAt 未更新,收件方是否实际收到尚未独立确认 |
| Console 状态 | 告警中心顶部新增“外发通道”状态条:邮件通道、微信通道、最近外发运行、待发送/失败 |
| 只读接口 | 新增 GET /api/alerts/notification-status,只回读通道是否可用与账本计数,不返回收件地址或微信目标 |
| 回归 | 外发引擎 22 项单元测试、安装契约测试、API 告警回归和 Console 浏览器契约全部通过 |
微信正文长度的实测边界:613 字符单行可用、285 字符多行可用、900 字符多行被服务端以 ret=-2 prepare failed 拒绝。因此微信侧使用专用紧凑正文并固定 500 字符上限,不与邮件正文共用同一份长文本。
微信投递的残余风险:发送接口接受不等于收件方已收到。当前只能证明“接口未报错”,无法证明“手机端已显示”。P23-9 没有取得收件人确认或独立网关投递回执,因此微信通道仍不能写成“投递已验证”。
生产验证边界:P23-9 在隔离 SQLite 和注入式发送器上通过故障、恢复、升级与 AI Boss 生命周期回归;没有向生产告警库注入故障,也没有等待真实 30 分钟升级窗口。P23-10 只做生产只读核验,没有补做生产故障注入或发送测试消息,因而不把隔离回归表述为真实生产告警闭环。
这一批已部署并回读;下一步进入 P23-9 隔离端到端负向回归。
🧪 P23-9 实施记录(隔离回归已通过)
P23-9 的第一批已完成:在临时 SQLite 中串联 API Gateway 与告警外发引擎,使用合成签名事件和注入式发送器验证完整状态链路,没有触碰生产告警库,也没有向真实收件人发信。
| 回归链路 | 结果 | 依据与影响 |
|---|---|---|
| 探针故障进入故障告警 | 通过 | probe-101 的合成故障被接受为一条 fault,重复上报只更新同一事件的观测次数 |
| 首次外发 | 通过 | 同一故障事件分别生成邮件和微信的 opened 账本记录 |
| 持续升级 | 通过 | 经过 1800 秒后生成 escalated,仍复用同一事件编号 |
| 恢复关联 | 通过 | 恢复事件单独记录为 recovery,原故障标记 recovery_status=recovered,没有创建第二条故障 |
| AI Boss 处理 | 通过 | processing 和 completed 均要求 Incident;completed 要求结果说明与结果证据 |
| 验证关闭 | 通过 | 恢复后的原故障可进入 verified_closed;重复验证返回 alert_already_verified |
| 发布成功不告警 | 通过 | 发布成功只进入 observation 事件,外发账本保持为空 |
| 未登记 producer | 通过 | 未登记签名身份被拒绝,不能伪造探针故障或恢复 |
| 阅读语义 | 通过 | 读取事件列表不会改变 read_at;手动阅读接口仍是唯一变更入口 |
测试入口为 scripts/maintenance/tests/p23-alert-closure-e2e-test.py,统一回归入口已增加同一测试。该测试使用 .venv/bin/python 执行,当前结果为 Ran 2 tests ... OK。
CI 修正记录:提交 0a90da09 的首次 Guardrails Run 因 Runner 102 的系统 python3 未安装 fastapi 失败;失败 Run 与 Job 日志已保存到 temp/actions/。根因不是回归逻辑,而是新测试依赖没有进入工作流环境。修复是在 Guardrails 中显式使用 actions/setup-python@v7、按项目现有 select-pypi-index.sh 选择 PyPI 源,并安装 tools/api-gateway/requirements.txt 后再运行测试。修复后的提交 29bdbbc5 已通过完整 Guardrails 验收;后续提交仍必须逐个回读自身 SHA 对应的 Run、Job 和 Step。
本批次边界:P23-9 的隔离回归不等于真实生产探针故障注入、真实升级等待或真实微信收件。P23-10 只读复核生产服务,没有制造告警或发送新消息;若后续确需生产注入,应另行明确目标、影响和回退条件,不能把它描述为本轮已执行。
本批次已完成隔离回归;随后进入 P23-10 文档、发布与生产收口。
🧾 P23-10 文档、发布与生产收口
📌 收口结论
P23-10 已完成文档同步、版本边界记录、CI 修复记录、CPA 版本上报生产发布和 101→RR 真实回读。不能把 P23 标记为全部完成。邮件通道已有真实出站证据;微信通道只有 OpenClaw 接口接受证据,尚无独立的手机端收件确认或网关侧最终投递回执。因此当前阶段仍为“进行中”,P23-11 Console 职责域收尾继续后置。
📊 发布与生产证据
| 对象 | 当前事实 | 依据 | 影响 / 下一步 |
|---|---|---|---|
| 计划文档 | 本文件与当前阶段摘要同步到 P23-10 | docs/plans/phase-23-placeholder.md、docs/plans/in-progress.md |
修改后运行 Markdown、计划状态和导航门禁 |
| 生产 Docs 版本 | Docs 容器运行 revision bb8f0d57ea2c1ddf1ca99467e8616dbaf0ed2eb9,状态 healthy |
RR 容器只读回读,2026-11-04 14:06 CST | Docs 已随本轮文档提交发布,公网 /healthz 返回 ok |
| API / Console 生产版本 | API Gateway revision 8787725c399bad7c40366eda4ce04a5feb16f3ea,Console revision 56c9a148e019adedfc863628e8732d3f579d1083,均 healthy |
RR 容器只读回读,API 于 07:53:42 CST 再核 revision 与健康 | API、Console 与 Docs 是独立发布物,必须分别核对 revision |
| 告警外发定时器 | agentmeshos-alert-notifier.timer active,服务最近结果为 success |
RR systemd 与外发状态接口回读 | 外发调度保持运行,不新增第二套调度器 |
| 外发状态接口 | 邮件、微信均已配置;失败数为 0,待发送数为 0,当前账本为空 | GET /api/alerts/notification-status |
只能证明当前无待发送失败,不能替代收件确认 |
| 邮件通道 | postfix 出站返回 250 OK,队列为空 |
postfix 出站日志与队列回读 | 邮件具备真实出站证据,仍不把队列为空等同于用户阅读 |
| 微信通道 | openclaw message send 返回成功和 messageId;lastOutboundAt 仍为 null |
OpenClaw 返回值与通道状态回读 | 仅证明接口接受,手机端是否显示仍待独立确认 |
| P23-9 隔离回归 | 告警闭环 2 tests OK、外发引擎 22 tests OK、Agent Runtime agent_runtime=passed |
.venv 本地回归与 GitHub Guardrails 留档 |
证明逻辑链路成立,不等同于真实生产故障注入 |
| CPA 版本上报窄通道 | 101 timer active/waiting,最近执行 success、退出码 0;RR 快照 0600 root:root,版本 v8.0.44-graceful-20261028 |
101 systemd 回读;RR 于 2026-11-04 07:53:42 CST 回读,快照年龄 75 秒 | 已完成;timer 每 5 分钟刷新,异常按运行态告警处理 |
| CI 修复与发布 | API 构建、RR 部署、备用控制面发布和 Guardrails 成功;最近 Docs、Guardrails 与部署 Job 成功 | temp/actions/8787725c*.jobs.json、temp/actions/128d73ff*.jobs.json |
本轮文档提交仍须重新回读自身 SHA 对应的 Run、Job、Step |
🧪 P23-10 验收边界
| 验收项 | 当前状态 | 判定依据 |
|---|---|---|
| 计划状态与生产状态一致 | 已通过(本轮提交后再次复核) | 详细计划、当前摘要、state.json 已统一为 P23-10 |
| Markdown 风格门禁 | 已通过 | node /root/.codex/bin/md-style-check.mjs;仅保留 6 组证据提示警告,无硬失败 |
| 计划状态门禁 | 已通过 | scripts/ci/agentmeshos-plan-state-check.py |
| 计划导航门禁 | 已通过 | scripts/ci/agentmeshos-plan-nav-check.py |
| GitHub 远端同步 | 已通过 | 提交 bb8f0d57 远端 SHA 与本地一致 |
| GitHub Actions | 已通过 | 同一提交的 Docs 构建、RR 部署与 Repository Guardrails 的 Run/Job/Step 全部成功;Runner 恢复工作流按条件 skipped |
| 邮件真实出站 | 已通过 | postfix 返回 250 OK,队列为空 |
| 微信真实收件 | 未完成 | 接口接受不等于手机端已显示,待用户确认或独立投递回执 |
| P23 阶段关闭 | 未完成 | 微信收件确认、最终观察和用户确认完成前保持“进行中” |
🔧 收口顺序
- 本轮更新计划和当前阶段摘要,记录 P23-10 实际生产回读。
- 运行 Markdown 风格、计划状态、计划导航和本地测试门禁。
- 提交并推送文档变更,回读远端分支 SHA。
- 使用精确提交 SHA 执行
bash scripts/ci/post-push-verify.sh,逐项确认必需 Actions。 - 本轮新提交的门禁全部通过后,P23-10 文档与发布收口才可记录为完成;P23 仍保留微信真实收件和最终用户确认两个未决项。
🧱 目标模型
记录类型
| 记录类型 | 含义 | 是否进入当前告警 |
|---|---|---|
fault |
真实故障或异常观测 | 是 |
recovery |
某个故障的恢复事件 | 不单独显示,挂在原故障时间线 |
observation |
发布成功、健康检查、指标记录 | 否,进入发布或健康事件视图 |
状态轴
| 状态轴 | 允许值 | 说明 |
|---|---|---|
| 严重级别 | critical、warning、info |
resolved 不再是严重级别 |
| 生命周期 | open、recovered、verified_closed、archived |
与 severity 分离 |
| 处置状态 | not_applicable、pending、processing、needs_benson_decision、completed、failed |
只有 fault 才需要处置 |
| 阅读状态 | unread、read |
只能由明确按钮改变 |
| 验证状态 | unverified、verified、rejected |
由 Benson 或指定验证人确认 |
关键字段
probe_id:探针唯一标识。producer:实际发送事件的组件。context_id:故障或发布上下文。dedup_key:稳定去重键,不包含生命周期状态。record_kind:fault、recovery或observation。recovery_source、recovery_summary、recovered_at:恢复来源和证据。boss_incident_id、boss_completed_at:AI Boss 是否真正参与。verification_status、verified_by、verified_at、verification_evidence:验证关闭。read_at、read_by、read_source:人工阅读记录;read_source区分manual和legacy_auto_click。
result_summary 只允许保存 AI Boss 的处理结果,不再保存“来源控制器已报告恢复”这类恢复说明。
🧩 工作包总表
| 工作包 | 内容 | 依赖 | 验收 |
|---|---|---|---|
| P23-0 | 补正 P22 验收口径,冻结 P23 范围、边界、数据和回退 | 无 | P22/P23 文档一致,用户确认范围 |
| P23-1 | 告警数据模型与历史迁移 | P23-0 | 843 条历史记录完成分类,计数可解释 |
| P23-2 | 统一探针注册表与责任归属 | P23-0 | 所有现行、仅业务、退役、未纳管探针均有记录 |
| P23-3 | 探针到告警的强制契约 | P23-1、P23-2 | 未登记 producer 不能写告警;恢复只挂原故障 |
| P23-4 | 发布/健康事件与告警分离 | P23-1 | 发布成功不进入告警;失败和回滚失败才进入 |
| P23-5 | AI Boss 生命周期与验证关闭 | P23-1、P23-3 | 只有 Incident + boss_completed 才算已处理 |
| P23-6 | 已读/未读与审计语义 | P23-1 | 点击行只打开详情;手动按钮才改变阅读状态 |
| P23-7 | 告警中心筛选、分页和详情 | P23-1、P23-6 | 月分组、每页 20/50/100、筛选准确 |
| P23-8 | 邮件/微信告警外发通道 | P23-3、P23-5 | 真实收件、真实出站、升级阈值和保活可验证 |
| P23-9 | 端到端负向回归 | P23-1 至 P23-8 | 故障、恢复、AI Boss、验证关闭全链路通过 |
| P23-10 | 文档、发布与生产收口 | P23-9 | 文档、镜像、API、页面和 Actions 全部回读 |
| P23-11 | Console 职责域收尾(可后置) | P23-10 | 重复入口清理、页面主归属明确 |
🔁 历史数据迁移口径
不删除 843 条历史记录,按类型重新分类并保留审计。
| 历史对象 | 建议处理 |
|---|---|
737 条无前置故障的 resolved |
改为 record_kind=observation,移出告警列表和告警计数 |
56 条真实 recovery_linked |
保留为原故障的恢复记录 |
832 条无 boss_completed 的 completed |
改为 handling_status=not_applicable 或 unknown,显示“历史状态不完整,AI Boss 未参与” |
| 22 条点击产生的已读 | 重置为未读,并追加 legacy_auto_read_migrated 审计记录 |
7 条真实 boss_completed |
保留,并补齐 incident、结果和证据 |
迁移前必须备份告警库并生成对象计数、哈希和回滚点。迁移后必须能回答每一个状态:为什么是故障、为什么是恢复、为什么是健康事件、为什么不是 AI Boss 处理。
🖥️ 告警中心页面设计
默认视图只显示当前告警,不再把所有历史记录堆在一个页面。
顶部筛选栏
- 月份或时间范围
- 严重级别
- 生命周期
- 处置状态
- 已读/未读
- 来源范围
- 服务名
- 关键词
标签页
| 标签页 | 内容 |
|---|---|
| 当前告警 | 仍未恢复、仍需要关注的故障 |
| 待我处理 | 等待 AI Boss 或等待 Benson 决策的告警 |
| 历史告警 | 已恢复、已验证关闭的故障 |
| 发布与恢复事件 | 发布成功、健康检查、恢复事件,不混入告警 |
列表与详情
列表每页默认 20 条,可选 20/50/100 条,按月分组,服务端分页。每行只显示严重级别、来源、服务、摘要、首次/最近时间和阅读状态。
点击行只打开详情抽屉,不改变已读状态。详情至少包含:
- 人类可读的故障标题和影响范围
- 首次发现、最近观测、恢复时间和验证关闭时间
- 证据和原始观测
- 恢复来源和恢复说明
- AI Boss 是否接收、处理阶段、结果和证据
- 完整时间线
- 默认折叠的内部编号
“标记已读/未读”必须是独立按钮。 “处理历史”只显示真实处置动作,“阅读记录”单独显示。
📣 告警外发通道
告警中心不能只靠页面被动查看。P23-8 必须定义:
- 哪些严重级别自动外发
- 首次故障、持续故障、恢复和升级分别发什么
- 邮件和微信的职责:邮件作为无人值守主告警,微信作为补充和沟通
- 去重、维护窗口、静默期和升级阈值
- 真实收件和真实出站证据
ClawBot 的纯沟通、记忆和 24 小时保活仍可作为 P19 独立议题;但告警外发部分必须和 P23 的告警模型一起验收。
🚦 执行顺序
- P23-0:补正 P22 验收口径,冻结 P23 范围和决策。
- P23-1、P23-4:先修正数据模型,停止新增发布健康噪声。
- P23-2、P23-3:建立探针注册表和告警强制契约。
- P23-5:完成 AI Boss 生命周期和验证关闭。
- P23-6、P23-7:重做阅读语义、筛选、分页和详情。
- P23-8:接入邮件/微信告警外发。
- P23-9、P23-10:端到端负向回归、发布和生产回读。
- P23-11:最后处理 Console 职责域和导航收尾。
✅ 验收矩阵
| 验收项 | 必须证明 |
|---|---|
| 探针目录完整 | 现行、仅业务、已停用、未纳管探针都有记录和责任人 |
| 故障只有一条活动告警 | 重复观测只增加次数和最近时间,不产生新告警 |
| 恢复只挂原故障 | 恢复不生成独立告警;原故障 lifecycle 变为 recovered |
| AI Boss 不冒充 | 无 Incident、无 boss_completed 时不得显示“AI Boss 已处理” |
| 验证关闭独立 | verified_closed 必须有验证人、时间和证据 |
| 发布成功不告警 | 发布成功进入发布记录,不进入告警列表 |
| 已读只能手动 | 点击行只打开详情;阅读状态只能由按钮改变 |
| 筛选和分页准确 | 月份、状态、来源和关键词组合后计数与列表一致 |
| 历史迁移可解释 | 843 条记录迁移后每类数量、原因和回滚点可查 |
| 通知可验证 | 邮件已有真实出站证据;微信仅有接口接受证据,真实收件仍待独立确认 |
| 端到端闭环 | 探针故障 → 一条告警 → 恢复 → AI Boss → 验证关闭全部通过 |
🚫 不纳入 P23 的范围
- P20 的 OfficeSummer 第二观测源和临时收口项。
- RR 迁移、整体网络架构改造或整套系统推倒重建。
- Codex ↔ Memory 跨项目可观测性,继续按独立计划推进。
- P19 的 ClawBot 纯沟通、记忆和 24 小时保活,除非与告警外发直接相关。
- P23-11 之前的 Console 导航大改;先把告警链路做对。
🧾 计划状态
| 项目 | 状态 | 说明 |
|---|---|---|
| 阶段状态 | 进行中 | P23-1 至 P23-10 主体已上线或通过隔离回归;微信收件与最终用户确认仍未完成 |
| 计划状态 | 实施中 | 数据模型、探针注册表、告警契约、AI Boss 与外发通道均已冻结 |
| 当前工作包 | P23-10 文档、发布与生产收口 |
P23-9 隔离端到端回归通过;本轮补齐文档、CI 和生产回读记录 |
| P22 | 核心范围完成并归档 | 不是原计划全部验收通过 |
🧱 技术栈与架构选型
P23 继续复用现有 API Gateway、SQLite 告警库、Console、systemd 探针和 RR 邮件入口,不新增第二套告警服务、不新增第二套调度器。需要新增的是数据字段、状态机、探针注册表和页面投影,不是新的基础设施。
数据迁移必须有备份、对象计数、哈希、回滚点和生产回读。页面只读取一个权威告警接口,不在前端重新探测或拼接第二份状态。
🎯 目标、成果与验收契约
P23 的最终成果是:任何一个告警都能回答“哪个探针发现、发现了什么、影响了什么、谁报告恢复、AI Boss 是否参与、谁验证关闭、当前是否已读”。如果其中一个问题无法回答,P23 不得标记完成。
验收以真实生产数据、故障注入、恢复事件、AI Boss 事件和页面回读为准,不以页面文案或单测代替。
🧩 分布式底座接入声明
接入结论:P23 暂不接入新的分布式执行底座。当前计划只建立数据模型、探针目录、告警契约和 Console 投影;若后续工作包需要 Nomad Job、Worker、Cloudreve 或新的凭据路径,必须单独声明数据路径、权限和回退,不得默认继承。
⚠️ 未决项 / 需要决策
| 事项 | 建议 | 状态 |
|---|---|---|
| 发布成功事件 | 完全移出告警,进入独立发布记录 | 已按推荐进入 P23-1 |
| 旧版 22 条自动已读 | 重置为未读,保留迁移审计 | 已按推荐进入 P23-1 |
| 832 条无 AI Boss 动作的 completed | 改为 not_applicable/unknown,不改 pending | 已按推荐进入 P23-1 |
| 告警交给 AI Boss | 当前由 Benson 在告警详情中显式点击发起;未实现告警自动触发 | tools/console-site/src/app.js 的 data-alert-dispatch 处理与生产页面契约;是否增加自动规则另行评审 |
| 告警保留期 | 活动告警长期保留,历史按月归档并可导出 | 待确认 |
| 邮件/微信升级阈值 | 邮件主告警,微信补充;严重级 30 分钟升级、关注级 60 分钟升级 | 已在 P23-8 冻结 |
| 微信真实收件 | OpenClaw 接口返回成功,但通道 lastOutboundAt 仍为空 |
待用户在微信端确认,或取得独立网关投递回执 |
| P23 最终关闭 | P23-10 文档与发布收口完成后,仍保留外部通知验收 | 未满足微信收件确认前不得归档 |
| Console 导航 | 放到 P23-11,最后处理 | 已暂缓 |
P23-1 执行期间,任何生产告警库迁移都必须先备份、在副本上预演、核对对象计数和回滚点;未完成预演前不直接修改生产数据,也不重做 Console 导航。