diff --git a/project-docs/AI合同起草与审查助手-当前工作进度保存-2026-05-11.md b/project-docs/AI合同起草与审查助手-当前工作进度保存-2026-05-11.md index bbc97dd8..3c96781e 100644 --- a/project-docs/AI合同起草与审查助手-当前工作进度保存-2026-05-11.md +++ b/project-docs/AI合同起草与审查助手-当前工作进度保存-2026-05-11.md @@ -2119,6 +2119,35 @@ - 本轮无 required 阻塞项。 - 真实外部告警到人仍等待 Webhook URL;在 URL 提供前,系统已完成本地证据闭环和 02:00 低负载巡检调度。 +## 2026-05-17 企业微信真实 Webhook 告警送达闭环 +### 本轮完成项 +- 已将真实企业微信机器人 Webhook 配置到 Windows User 环境变量: + - 变量名:`AI_CONTRACT_WATCHDOG_WEBHOOK_URL` + - 变量值:已配置,按密钥处理,不写入 Git、文档或计划任务命令。 +- 已修复 `scripts/run-production-watchdog-scheduler.ps1` 的 Webhook 读取逻辑: + - 原问题:脚本只读取当前进程环境变量,新开的 PowerShell 或计划任务可能读不到 User 环境变量。 + - 现状态:按 `Process -> User -> Machine` 顺序读取 `AI_CONTRACT_WATCHDOG_WEBHOOK_URL`,计划任务可直接使用已配置的 User 环境变量。 +- 已执行真实非 dry-run 送达测试: + - 命令模式:`RunOnce` + - 巡检模式:轻量巡检,`-SkipWorktreeCheck -SkipCapacityGovernance` + - 通知策略:本次临时 `NotifyOnStatus=All`,用于 PASS 也发送一条测试消息。 + - 结果:`PHASE7_WATCHDOG_SCHEDULER_PASS` + - 产物:`project-docs/qa-artifacts/phase7.5-watchdog-scheduler/2026-05-17T22-13-23-234/watchdog-scheduler-summary.md` + - Webhook 检查:`PASS` + - Webhook 类型:`wecom` + - dry-run:`false` + +### 当前状态 +- 企业微信真实告警到人链路已经打通。 +- 每天 `02:00` 的低负载计划任务仍按 `WarnOrFail` 策略运行: + - 正常 PASS 不打扰。 + - 出现 WARN/FAIL 时自动推送企业微信。 +- 计划任务命令仍只引用环境变量名,不保存真实 Webhook URL。 + +### 阻塞项 +- 本轮无 required 阻塞项。 +- 外部 Webhook 已从“等待真实地址”变为“真实送达已验证”。 + ## 2026-05-16 Phase14 生产巡检与 Chat/报告法条引用闭环 ### 本轮完成项 - 已完成 Chat/报告法条引用闭环代码补齐并推送远程 `main`: diff --git a/scripts/run-production-watchdog-scheduler.ps1 b/scripts/run-production-watchdog-scheduler.ps1 index 627f980f..72850e5e 100644 --- a/scripts/run-production-watchdog-scheduler.ps1 +++ b/scripts/run-production-watchdog-scheduler.ps1 @@ -89,6 +89,14 @@ function Get-EffectiveWebhookUrl { if (-not [string]::IsNullOrWhiteSpace($value)) { return $value } + $value = [Environment]::GetEnvironmentVariable($WebhookUrlEnvVar, "User") + if (-not [string]::IsNullOrWhiteSpace($value)) { + return $value + } + $value = [Environment]::GetEnvironmentVariable($WebhookUrlEnvVar, "Machine") + if (-not [string]::IsNullOrWhiteSpace($value)) { + return $value + } } return "" }