WOPS1 调整巡检告警降噪

Issue: WOPS1, WROAD2C, WREAL1P
这个提交包含在:
2026-05-20 15:17:07 +08:00
父节点 56b720b8ab
当前提交 3ce183ddcf
共修改 13 个文件,包含 329 行新增和 87 行删除
+15 -2
查看文件
@@ -65,7 +65,7 @@ DCL7 已删除本文件中 R70-R91 的长流水历史,避免旧环境、旧开
- 2026-05-19 WADM1 完成企微自建留存/镜像数据模型设计:本轮只更新 Issue CSV 和事实源,不改 Prisma schema、不写业务代码、不部署、不写 OA/企微业务数据。设计固定 `WecomApprovalArchive`、参与人/动作/字段摘要、附件摘要、回调事件、补偿拉取 run/item、对账 finding、打卡/人事快照复用边界、隐私保留、权限和迁移回滚策略。WACP3R “回调证据文件未持久化”的 finding 进入 WARCH1 入库实现;同意单击即通过进入 WARCH1 历史留存、审批轨迹和操作规程提示。该阶段已由下一条 WARCH1 承接,仍不能直接进入完整审批镜像、应急接管、恢复回写或 RuleOps。
- 2026-05-19 WARCH1 实现企微审批最小自建历史留存:新增审批留存 Prisma 表、回调事件表、补偿 run/item/finding、`wecomApprovalArchive` 规范化服务、回调 DB 入库默认路径、补偿拉取 `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1` 双开关和 `npm run check:wecom-approval-archive` 离线读取 runner。已以 `SYNC_ENV=0` 部署并应用 migration;远端补偿持久化报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` 为 `PASS_WITH_FINDINGS`,`archivePersistence.status=OK`、`storedCount=2`;离线读取报告 `/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` 为 `PASS_WITH_FINDINGS`,可读请假/补卡 2 条已通过历史。finding 是 WARCH1 前旧回调未持久化到 DB 的历史 gap,已作为对账 finding 留存,不是当前写入链路阻断。范围仅请假/补卡;不写企微数据、不创建模板或审批单、不新增正式管理页、不进入完整镜像、应急接管、恢复回写或 RuleOps。报告和日志只输出脱敏 `sp_no`、template、userid 前缀,DB 内保存完整外部键用于审计和补偿。
- 2026-05-20 WARCH2 实现并部署企微审批历史正式只读查询:新增 `/api/wecom/approval-archive` 列表和详情 API、PC/移动共用历史页、备用模块入口和移动考勤卡片入口。查询只读 OA DB,不调用企微 API、不读取企微 Secret;普通员工看本人相关,主管看直属下属和本人相关,HR/admin/* 看全量;`leave.view_all` / `attendance.view_all` 不单独代表全量企微归档权限;申请人未映射、callback-only 或外部-only 记录仅 HR/admin/* 可见。页面固定“企业微信主办,OA 自建留存”“仅已归档记录”,不展示审批按钮或 pending 待办语义。已以 `SYNC_ENV=0` 部署,公网 `/ready` 正常,新 API 未登录返回 401;远端离线归档报告 `/app/artifacts/qa-flow/wecom-approval-archive-20260520T013610Z/summary.json` 为 `PASS_WITH_FINDINGS`,可读 2 条请假/补卡历史,finding 仍为 WARCH1 前旧回调未入库历史 gap。
- 2026-05-20 WROAD2+OPS 建立受控上线与每日巡检合同:当前不直接进入完整镜像,改为测试账号 `SMOKE002 -> SMOKE101 + wangshunli` 3 天受控试用,每日手动触发 `scripts/qa/run-wroad2-ops-daily.sh`。脚本复用公网 `/ready`、live smoke、feature flag、企微 runtime、审批补偿和 OA 归档离线读取;默认只读,唯一允许写入是补偿归档以进程级 `WECOM_ARCHIVE_WRITE=1` 写 OA 自建留存库,不写企业微信、不创建模板或审批单、不安装 cron/systemd timer。Day 0 公网巡检报告待 WROAD2 部署执行后回填。
- 2026-05-20 WROAD2+OPS 建立受控上线与每日巡检合同:当前不直接进入完整镜像,改为测试账号 `SMOKE002 -> SMOKE101` 3 天受控试用,管理员观察和告警员工号使用 `HYD000006`(`wangshunli` 的员工号),每日触发 `scripts/qa/run-wroad2-ops-daily.sh` 或 WARCH3 timer。脚本复用公网 `/ready`、live smoke、feature flag、企微 runtime、审批补偿和 OA 归档离线读取;默认只读,唯一允许写入是补偿归档以进程级 `WECOM_ARCHIVE_WRITE=1` 写 OA 自建留存库,不写企业微信、不创建模板或审批单。Day 0 公网巡检报告 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` 为 `PASS_WITH_FINDINGS`,finding 按 observation 管理。
## 关键证据索引
@@ -460,13 +460,26 @@ Go 结论边界:
| 项 | 当前结果 | 证据和边界 |
| --- | --- | --- |
| WARCH3 自动巡检 | 公网已验证,`PASS_WITH_FINDINGS` | 新增 `scripts/qa/run-warch3-ops-daily.sh`、`deploy/trialrun/install-warch3-ops-timer.sh` 和 `npm run send:wecom-ops-alert`;服务器已安装 `hyb-oa-warch3-ops.timer`,下次触发为 2026-05-21 07:30 CST;手动 service 报告 `/app/artifacts/qa-flow/warch3-ops-20260520-054841/summary.json` 为 `PASS_WITH_FINDINGS`,告警报告 `/app/artifacts/qa-flow/wecom-ops-alert-20260520T054851Z/summary.json` 为 `PASS_ALERT_SENT_WITH_CONFIG_GAPS`,已向有效管理员 `HYD000006` 发送脱敏消息,`wangshunli` 仅作为非员工号别名 gap 记录 |
| WARCH3 自动巡检 | 公网已验证,`PASS_WITH_FINDINGS` | 新增 `scripts/qa/run-warch3-ops-daily.sh`、`deploy/trialrun/install-warch3-ops-timer.sh` 和 `npm run send:wecom-ops-alert`;服务器已安装 `hyb-oa-warch3-ops.timer`,下次触发为 2026-05-21 07:30 CST;手动 service 报告 `/app/artifacts/qa-flow/warch3-ops-20260520-054841/summary.json` 为 `PASS_WITH_FINDINGS`,告警报告 `/app/artifacts/qa-flow/wecom-ops-alert-20260520T054851Z/summary.json` 为 `PASS_ALERT_SENT_WITH_CONFIG_GAPS`,已向管理员 `wangshunli` 的员工号 `HYD000006` 发送脱敏消息;后续脚本不再把姓名字符串 `wangshunli` 当作 employee_no 使用 |
| WCHECK1 打卡摘要留存 | 公网已验证,live/offline 均通过 | 新增打卡日/月摘要、规则快照、`wecomCheckinArchive` 服务和 `npm run check:wecom-checkin-summary-archive`;live 报告 `/app/artifacts/qa-flow/wecom-checkin-summary-archive-20260520T054907Z/summary.json` 为 `PASS_CHECKIN_ARCHIVE_READY`,本窗口 0 条打卡明细、2 条规则快照已写 OA 留存;offline 报告 `/app/artifacts/qa-flow/wecom-checkin-summary-archive-20260520T054926Z/summary.json` 为 `PASS_CHECKIN_ARCHIVE_OFFLINE_READY` |
| WEXT1 外出/加班 | 公网 dry-run 通过,live 未批准 | `npm run check:wecom-approval-fixtures` 支持 `--target=outing --target=overtime`;公网报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260520T054940Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`;本轮只构建最小通用模板和审批申请 payload,不创建企微模板、不提交审批单 |
| 隐私边界 | 保持 | 报告和告警只输出状态、计数、报告路径、脱敏 userid/template/sp_no 前缀;不输出手机号、邮箱、token、Secret、完整外部键、位置、人脸、设备明文、表单值、附件、评论或原始 payload |
上述能力仍不代表完整审批镜像、应急接管、恢复回写或 RuleOps 已完成。WREAL1 小范围真实试用需等 WROAD2 三天验收、WARCH3/WCHECK1/WEXT1 公网结果可解释后再单独问答确认。
## WOPS1 / WROAD2-CLOSEOUT / WREAL1-PREP 后续规划
执行时间:2026-05-20。基于 WARCH3/WCHECK1/WEXT1 后的受控上线结果,当前不扩大真实员工、不创建外出/加班 live 样件,先处理巡检告警降噪、三天验收和真实试用准备。
| 项 | 当前结果 | 证据和边界 |
| --- | --- | --- |
| WOPS1 巡检告警降噪 | 公网已验证 | 告警默认收件员工号修正为 `HYD000006`,即管理员 `wangshunli` 的员工号;不再把 `wangshunli` 字符串当作 employee_no。`send-wecom-ops-alert` 增加状态文件,首次 `PASS_WITH_FINDINGS` 记录为基线;远端二次触发 WARCH3 报告 `/app/artifacts/qa-flow/warch3-ops-20260520-070731/summary.json` 为 `PASS_WITH_FINDINGS`,告警报告 `/app/artifacts/qa-flow/wecom-ops-alert-20260520T070740Z/summary.json` 为 `PASS_ALERT_SKIPPED_NO_FINDINGS`,原因 `no_new_findings_or_status_worsening`。后续只有阻断、脚本失败、新增 finding、状态恶化或人工 `--force` 才发送脱敏消息。 |
| WROAD2-CLOSEOUT 三天验收 | 待 Day 1/2/3 自动采集 | Day 0 报告 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` 为 `PASS_WITH_FINDINGS`。已知 observation 为 live smoke 凭据、pending OCR 子检查和历史 callback gap,不阻断受控试用;企微 runtime、审批补偿归档、OA 离线读取、打卡摘要 offline 可读和隐私扫描仍是主链路。 |
| WREAL1-PREP 真实试用准备 | 仅规划,不启用真实员工 | 固化候选员工 active/已绑定/可见、审批人非本人、回滚联系人、允许流程、暂停条件和验收标准。当前继续测试账号;首批真实试用待 WROAD2-CLOSEOUT 后再问答确认,默认只覆盖请假、补卡、打卡摘要和 OA 历史查看。 |
| 外出/加班 | 继续暂缓 live | WEXT1 dry-run 证据保留;不创建企微外出/加班模板或审批单。若后续要 live 创建,必须另建合同并再次问答批准。 |
三天验收结束后的人工问答选项固定为:确认进入真实试用、先处理指定 finding、或暂停。进入真实员工试用前还需单独确认试用人数、审批人、周期、回滚联系人和暂停条件。
## 历史恢复
需要追溯 R70-R91 的详细流水时,使用: