跳转至

阶段二十三:后续治理待规划

阶段状态:进行中

计划状态:实施中

当前工作包: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 分为四层,顺序不能颠倒:

层 解决的问题 主要产物
探针层 有哪些探针、谁负责、是否应该告警 统一探针注册表
告警层 故障、恢复、健康事件如何区分和保存 告警数据模型和历史迁移
处置层 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 阶段关闭 未完成 微信收件确认、最终观察和用户确认完成前保持“进行中”

🔧 收口顺序

  1. 本轮更新计划和当前阶段摘要,记录 P23-10 实际生产回读。
  2. 运行 Markdown 风格、计划状态、计划导航和本地测试门禁。
  3. 提交并推送文档变更,回读远端分支 SHA。
  4. 使用精确提交 SHA 执行 bash scripts/ci/post-push-verify.sh,逐项确认必需 Actions。
  5. 本轮新提交的门禁全部通过后,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 的告警模型一起验收。

🚦 执行顺序

  1. P23-0:补正 P22 验收口径,冻结 P23 范围和决策。
  2. P23-1、P23-4:先修正数据模型,停止新增发布健康噪声。
  3. P23-2、P23-3:建立探针注册表和告警强制契约。
  4. P23-5:完成 AI Boss 生命周期和验证关闭。
  5. P23-6、P23-7:重做阅读语义、筛选、分页和详情。
  6. P23-8:接入邮件/微信告警外发。
  7. P23-9、P23-10:端到端负向回归、发布和生产回读。
  8. 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 导航。