WREMOTE1 规划远端收口和正式模板测试

这个提交包含在:
2026-05-22 13:41:48 +08:00
父节点 170b9f9146
当前提交 6361dc2efb
共修改 18 个文件,包含 330 行新增和 171 行删除
文件差异因一行或多行过长而隐藏
+25 -14
查看文件
@@ -465,11 +465,11 @@ Go 结论边界:
| 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,不创建企微模板、不提交审批单 | | 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 | | 隐私边界 | 保持 | 报告和告警只输出状态、计数、报告路径、脱敏 userid/template/sp_no 前缀;不输出手机号、邮箱、token、Secret、完整外部键、位置、人脸、设备明文、表单值、附件、评论或原始 payload |
上述能力仍不代表完整审批镜像、应急接管、恢复回写或 RuleOps 已完成。WROAD2-CLOSEOUT 三天验收期间同步执行 WROAD2-BIZ1 三天业务冒烟和 WAPPR1 审批规则规范化门禁;通过后再问答是否进入 WEXT1-LIVE 外出/加班测试号 live POC。请假、补卡、外出、加班四类测试号证据和审批规则门禁均通过后,才单独问答是否启动 WREAL1 小范围真实试用。 上述能力仍不代表完整审批镜像、应急接管、恢复回写或 RuleOps 已完成。WROAD2-CLOSEOUT 三天验收期间同步执行 WROAD2-BIZ1 三天业务冒烟和 WAPPR1 审批规则规范化门禁;通过后再问答是否进入 WEXT1-FORMAL 正式模板外出/加班测试。请假、补卡、外出、加班四类测试号证据和审批规则门禁均通过后,才单独问答是否启动 WREAL1 小范围真实试用。
## WOPS1 / WROAD2-CLOSEOUT / WREAL1-PREP 后续规划 ## WOPS1 / WROAD2-CLOSEOUT / WREAL1-PREP 后续规划
执行时间:2026-05-20。基于 WARCH3/WCHECK1/WEXT1 后的受控上线结果和用户后续选择,当前不扩大真实员工、不立即创建外出/加班 live 样件,先完成三天稳态验收,并在三天内并行执行 WROAD2-BIZ1 人工业务冒烟与 WAPPR1 审批规则规范化;通过后再另建 WEXT1-LIVE 合同创建外出+加班测试号样件,四类测试号证据和审批规则门禁通过后才问是否进入真实小范围试用。 执行时间:2026-05-20。基于 WARCH3/WCHECK1/WEXT1 后的受控上线结果和用户后续选择,当前不扩大真实员工、不立即创建外出/加班 live 样件,先完成三天稳态验收,并在三天内并行执行 WROAD2-BIZ1 人工业务冒烟与 WAPPR1 审批规则规范化;WREMOTE1 后改为 WEXT1-FORMAL 正式模板人工提交测试,四类测试号证据和审批规则门禁通过后才问是否进入真实小范围试用。
| 项 | 当前结果 | 证据和边界 | | 项 | 当前结果 | 证据和边界 |
| --- | --- | --- | | --- | --- | --- |
@@ -479,9 +479,9 @@ Go 结论边界:
| WAPPR1 审批规则规范化 | 已建档,作为真实试用前门禁 | 用户发现补卡申请需要申请人手动选择审批人,该现象作为 blocking finding 治理。测试模板固定 `SMOKE002 -> SMOKE101`;正式请假、补卡、外出、加班模板必须按直属主管、部门负责人或指定审批角色自动带出审批人;申请人不得任意选择审批人,审批人缺失、停用、未绑定、不可见或自审时阻断。 | | WAPPR1 审批规则规范化 | 已建档,作为真实试用前门禁 | 用户发现补卡申请需要申请人手动选择审批人,该现象作为 blocking finding 治理。测试模板固定 `SMOKE002 -> SMOKE101`;正式请假、补卡、外出、加班模板必须按直属主管、部门负责人或指定审批角色自动带出审批人;申请人不得任意选择审批人,审批人缺失、停用、未绑定、不可见或自审时阻断。 |
| WRULE1 审批链校验器 | 已建档并进入本地 POC | 固定“单一组织规则,两个执行域”:OA 维护主管链、业务审批角色和管理员兜底,企微执行 HR/考勤审批,OA 只读已归档审批详情并校验理论审批人是否匹配实际审批链。WRULE1 不读取企微后台规则、不写企微、不替代 WAPPR1 人工门禁。 | | WRULE1 审批链校验器 | 已建档并进入本地 POC | 固定“单一组织规则,两个执行域”:OA 维护主管链、业务审批角色和管理员兜底,企微执行 HR/考勤审批,OA 只读已归档审批详情并校验理论审批人是否匹配实际审批链。WRULE1 不读取企微后台规则、不写企微、不替代 WAPPR1 人工门禁。 |
| WREAL1-PREP 真实试用准备 | 仅规划,不启用真实员工 | 固化候选员工 active/已绑定/可见、审批人非本人、回滚联系人、允许流程、暂停条件和验收标准。当前继续测试账号;真实试用必须等请假、补卡、外出、加班四类测试号证据和 WAPPR1/WRULE1 审批规则门禁通过后再问答确认,默认仍从 1 名真实员工 + 1 名审批人/管理员观察开始。 | | WREAL1-PREP 真实试用准备 | 仅规划,不启用真实员工 | 固化候选员工 active/已绑定/可见、审批人非本人、回滚联系人、允许流程、暂停条件和验收标准。当前继续测试账号;真实试用必须等请假、补卡、外出、加班四类测试号证据和 WAPPR1/WRULE1 审批规则门禁通过后再问答确认,默认仍从 1 名真实员工 + 1 名审批人/管理员观察开始。 |
| 外出/加班 | live POC 待三天验收后另建合同 | WEXT1 dry-run 证据保留;当前不创建企微外出/加班模板或审批单。已锁定 WEXT1-LIVE 方向:外出+加班两类一起创建 OA-POC 测试模板和低风险审批单,固定 `SMOKE002 -> SMOKE101`、`WECOM_AGENT_SECRET` 和双开关,样件保留审计,由 `SMOKE101` 真机确认。 | | 外出/加班 | 正式模板测试待远端收口后问答 | WEXT1 dry-run 证据保留;当前不创建企微外出/加班模板或审批单。已锁定 WEXT1-FORMAL 方向:使用现有正式模板,由 `SMOKE002` 真机提交低风险外出/加班测试单,`SMOKE101` 先看详情再审批,系统只读补偿、归档和 WRULE1。 |
三天验收结束后的人工问答选项固定为:进入 WEXT1-LIVE、先处理指定 finding、或暂停。外出/加班 live 写入前必须再次说明当前状态、改了什么、测了什么、结果是什么和会留下什么企微记录;四类测试号证据和 WAPPR1/WRULE1 审批规则门禁通过后,再问是否进入真实小范围试用。 三天验收结束后的人工问答选项固定为:进入 WEXT1-FORMAL、先处理指定 finding、或暂停。外出/加班正式模板人工测试前必须再次说明当前状态、改了什么、测了什么、结果是什么和会留下什么企微记录;四类测试号证据和 WAPPR1/WRULE1 审批规则门禁通过后,再问是否进入真实小范围试用。
## WAUTO1 / WEXT1LD 自动证据汇总与 live 前 dry-run ## WAUTO1 / WEXT1LD 自动证据汇总与 live 前 dry-run
@@ -491,9 +491,9 @@ Go 结论边界:
| --- | --- | --- | | --- | --- | --- |
| WAUTO1 自动证据汇总 | 远端 `PAUSED_MANUAL_CONFIRMATION` | 新增 `scripts/qa/collect-wecom-controlled-trial-evidence.sh`,汇总 WROAD2/WARCH3/WCHECK1/WROAD2-BIZ1/WAPPR1/WEXT1 dry-run 证据,复跑公网 `/ready`、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描。公网报告 `/app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-103617/summary.json`:`/ready` 通过,外出/加班 dry-run 通过,审批补偿和归档离线为 `PASS_WITH_FINDINGS`,WARCH3 历史 summary 在容器内不可见记为人工缺口;脚本默认不设置 `WECOM_ARCHIVE_WRITE=1`、`WECOM_CHECKIN_ARCHIVE_WRITE=1` 或 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不写 OA DB、不写企业微信、不创建模板或审批单。 | | WAUTO1 自动证据汇总 | 远端 `PAUSED_MANUAL_CONFIRMATION` | 新增 `scripts/qa/collect-wecom-controlled-trial-evidence.sh`,汇总 WROAD2/WARCH3/WCHECK1/WROAD2-BIZ1/WAPPR1/WEXT1 dry-run 证据,复跑公网 `/ready`、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描。公网报告 `/app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-103617/summary.json`:`/ready` 通过,外出/加班 dry-run 通过,审批补偿和归档离线为 `PASS_WITH_FINDINGS`,WARCH3 历史 summary 在容器内不可见记为人工缺口;脚本默认不设置 `WECOM_ARCHIVE_WRITE=1`、`WECOM_CHECKIN_ARCHIVE_WRITE=1` 或 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不写 OA DB、不写企业微信、不创建模板或审批单。 |
| WAPPR1 人工确认模板 | 已补充 | 请假、补卡、外出、加班逐模板确认:A 审批人自动带出且申请人不能任意选择;B 默认带出但申请人仍可改人;C 必须申请人手选审批人;D 当前看不到或模板未配置。B/C/D 均不得直接进入真实员工试用。不要记录 Secret、token、完整 userid、完整审批单号、完整 template_id、表单值、附件、评论或原始 payload。 | | WAPPR1 人工确认模板 | 已补充 | 请假、补卡、外出、加班逐模板确认:A 审批人自动带出且申请人不能任意选择;B 默认带出但申请人仍可改人;C 必须申请人手选审批人;D 当前看不到或模板未配置。B/C/D 均不得直接进入真实员工试用。不要记录 Secret、token、完整 userid、完整审批单号、完整 template_id、表单值、附件、评论或原始 payload。 |
| WAPPR1 人工门禁结果 | `PASS_APPROVER_RULES_READY` | 2026-05-21 用户确认测试员工直属上级已设置为测试主管;请假、补卡、外出、加班提交页均自动带出测试主管,且申请人不能删除、改人或新增审批人,四类模板均为 A。该结论仍需结合 WRULE1 提交后实际审批链校验、WROAD2-BIZ1 业务动作和三天自动汇总,不自动触发 WEXT1-LIVE 或 WREAL1。 | | WAPPR1 人工门禁结果 | `PASS_APPROVER_RULES_READY` | 2026-05-21 用户确认测试员工直属上级已设置为测试主管;请假、补卡、外出、加班提交页均自动带出测试主管,且申请人不能删除、改人或新增审批人,四类模板均为 A。该结论仍需结合 WRULE1 提交后实际审批链校验、WROAD2-BIZ1 业务动作和三天自动汇总,不自动触发 WEXT1-FORMAL 或 WREAL1。 |
| WEXT1LD 外出/加班 dry-run gate | 远端 dry-run 通过 | 远端只执行 `npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`,不带 live 写入参数,不设置写入环境变量。报告 `/app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-103617/wecom-approval-fixtures-dryrun/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`,且 `liveWrite.requested=false`、`liveWrite.allowed=false`。dry-run 通过后,仍需问答选择:批准一次 live 创建外出+加班 OA-POC 样件、只保留 dry-run、或外出/加班移出 V1。 | | WEXT1LD 外出/加班 dry-run gate | 远端 dry-run 通过 | 远端只执行 `npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`,不带 live 写入参数,不设置写入环境变量。报告 `/app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-103617/wecom-approval-fixtures-dryrun/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`,且 `liveWrite.requested=false`、`liveWrite.allowed=false`。dry-run 通过后,不自动创建模板或审批单;下一步按 WEXT1-FORMAL 问答决定是否人工提交正式模板测试单。 |
| 后续人工问答 | 待三天汇总 | 三天汇总后选项固定为:接受 `PASS_AUTO_EVIDENCE_READY` 并进入 WEXT1-LIVE live 问答;接受 `PASS_WITH_FINDINGS` 但先处理指定 finding;暂停,不进入外出/加班 live 或真实试用。 | | 后续人工问答 | 待三天汇总 | 三天汇总后选项固定为:接受 `PASS_AUTO_EVIDENCE_READY` 并进入 WEXT1-FORMAL 问答;接受 `PASS_WITH_FINDINGS` 但先处理指定 finding;暂停,不进入外出/加班正式模板测试或真实试用。 |
## WFULLSMOKE1 三天全域最终目标测试 ## WFULLSMOKE1 三天全域最终目标测试
@@ -503,7 +503,7 @@ Go 结论边界:
| --- | --- | --- | | --- | --- | --- |
| 总控合同 | 已建档 | 新增 `issues/2026-05-20_19-01-12-three-day-full-goal-smoke-v1.csv`,覆盖企微 HR/考勤、OA 报销、采购、合同/项目、付款批次、移动端和运维巡检。 | | 总控合同 | 已建档 | 新增 `issues/2026-05-20_19-01-12-three-day-full-goal-smoke-v1.csv`,覆盖企微 HR/考勤、OA 报销、采购、合同/项目、付款批次、移动端和运维巡检。 |
| QA 编排脚本 | 已新增 | 新增 `scripts/qa/run-three-day-full-goal-smoke.sh`,聚合公网 `/ready`、feature flag、WARCH3/WAUTO1、审批补偿与归档离线读取、打卡摘要 offline、OA 主办域浏览器主路径、移动/企微入口矩阵和隐私扫描。 | | QA 编排脚本 | 已新增 | 新增 `scripts/qa/run-three-day-full-goal-smoke.sh`,聚合公网 `/ready`、feature flag、WARCH3/WAUTO1、审批补偿与归档离线读取、打卡摘要 offline、OA 主办域浏览器主路径、移动/企微入口矩阵和隐私扫描。 |
| 数据边界 | 已固定 | 允许创建带 `TEST/SMOKE/WFULL` 标记的 OA 测试业务数据并保留审计;不写企业微信、不创建外出/加班样件、不启用真实员工、不真实付款、不接真实支付、不写 ERP、不导入银行流水。 | | 数据边界 | 已固定 | 允许创建带 `TEST-SMOKE-WFULL` 标记的 OA 测试业务数据并保留审计;不写企业微信、不创建外出/加班样件、不启用真实员工、不真实付款、不接真实支付、不写 ERP、不导入银行流水。 |
| 人工门禁 | 待执行 | Day 1/2/3 仍由 `SMOKE002`、`SMOKE101`、`HYD000006` 完成打卡、请假/补卡、审批详情确认、OA 历史查看和四类模板审批规则 A/B/C/D 确认;只有 WAPPR1 为 A 才能进入后续 live 或真实试用问答。 | | 人工门禁 | 待执行 | Day 1/2/3 仍由 `SMOKE002`、`SMOKE101`、`HYD000006` 完成打卡、请假/补卡、审批详情确认、OA 历史查看和四类模板审批规则 A/B/C/D 确认;只有 WAPPR1 为 A 才能进入后续 live 或真实试用问答。 |
| 后续问答 | 待三天汇总 | 三天汇总后按结果选择:接受主路径闭环、先处理 finding、或暂停;外出/加班 live 和 WREAL1 真实小范围试用均不能由 WFULLSMOKE1 自动启动。 | | 后续问答 | 待三天汇总 | 三天汇总后按结果选择:接受主路径闭环、先处理 finding、或暂停;外出/加班 live 和 WREAL1 真实小范围试用均不能由 WFULLSMOKE1 自动启动。 |
@@ -514,8 +514,8 @@ Go 结论边界:
| 项 | 当前结果 | 证据和边界 | | 项 | 当前结果 | 证据和边界 |
| --- | --- | --- | | --- | --- | --- |
| 路线合同 | 已建档 | 新增 `issues/2026-05-20_20-15-29-wecom-test-account-closeout-to-minimal-mirror-route-v1.csv`,作为 WFULLSMOKE1 后的路线锁定合同。 | | 路线合同 | 已建档 | 新增 `issues/2026-05-20_20-15-29-wecom-test-account-closeout-to-minimal-mirror-route-v1.csv`,作为 WFULLSMOKE1 后的路线锁定合同。 |
| 测试号收口 | 已锁定 | 当前优先完成 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WRULE1、WAUTO1、WEXT1LD 和 WFULLSMOKE1;WAPPR1 四类模板必须为 A,WRULE1 必须为 `PASS_RULE_MATCH` 或可解释 `PASS_WITH_ADMIN_FALLBACK`,否则不进入 WEXT1-LIVE 或 WREAL1。 | | 测试号收口 | 已锁定 | 当前优先完成 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WRULE1、WAUTO1、WEXT1LD 和 WFULLSMOKE1;WAPPR1 四类模板必须为 A,WRULE1 必须为 `PASS_RULE_MATCH` 或可解释 `PASS_WITH_ADMIN_FALLBACK`,否则不进入 WEXT1-FORMAL 或 WREAL1。 |
| 外出/加班 live | 待后续问答 | 只有三天验收、全域主路径、业务冒烟、规则门禁和 dry-run 均可解释通过后,才另建 WEXT1-LIVE 合同并再次问答是否一次性 live 创建外出+加班测试号样件。 | | 外出/加班正式模板测试 | 待后续问答 | 只有三天验收、全域主路径、业务冒烟、规则门禁和 dry-run 均可解释通过后,才另建 WEXT1-FORMAL 合同并再次问答是否让 `SMOKE002` 人工提交正式模板外出+加班测试单。 |
| 真实试用与镜像 | 后置 | WREAL1 首批固定为 1 名真实员工 + 1 名审批人/管理员观察;WREAL1 通过后优先规划 `wecom_attendance_approval_mirror_v1` 最小完整镜像,应急接管、恢复回写和 RuleOps 均后置。 | | 真实试用与镜像 | 后置 | WREAL1 首批固定为 1 名真实员工 + 1 名审批人/管理员观察;WREAL1 通过后优先规划 `wecom_attendance_approval_mirror_v1` 最小完整镜像,应急接管、恢复回写和 RuleOps 均后置。 |
## WTCLOSE1 小团队自动审批规则与测试号全域收口 dry-run ## WTCLOSE1 小团队自动审批规则与测试号全域收口 dry-run
@@ -527,11 +527,11 @@ Go 结论边界:
| 执行合同 | 已建档 | 新增 `issues/2026-05-20_21-10-00-wecom-test-account-closeout-auto-dryrun-v1.csv`,ID 为 `WTCLOSE1-0..WTCLOSE1-8`。 | | 执行合同 | 已建档 | 新增 `issues/2026-05-20_21-10-00-wecom-test-account-closeout-auto-dryrun-v1.csv`,ID 为 `WTCLOSE1-0..WTCLOSE1-8`。 |
| 审批规则 | 执行目标 A | 小团队 HR/考勤审批采用一层直属主管或指定审批角色自动带出审批人;申请人不能任意改人;主管链缺失、审批人不可见/停用/未绑定或命中自审时,由管理员兜底或阻断。请假、补卡、外出、加班四类模板若为 B/C/D,均为阻断 finding。 | | 审批规则 | 执行目标 A | 小团队 HR/考勤审批采用一层直属主管或指定审批角色自动带出审批人;申请人不能任意改人;主管链缺失、审批人不可见/停用/未绑定或命中自审时,由管理员兜底或阻断。请假、补卡、外出、加班四类模板若为 B/C/D,均为阻断 finding。 |
| WAPPR1 API 边界调研 | 已确认需人工门禁 | 企业微信 `gettemplatedetail` 只返回模板控件,`getapprovaldetail` 只返回已提交审批单的实际审批节点和审批人,均不能只读读取“申请人是否可手选审批人/审批规则配置”。`applyevent` 的 `use_template_approver=1` 可使用后台流程,但属于写入型验证且存在模板限制,不能作为通用只读门禁。因此 WAPPR1 必须由后台人工确认、真机提交页确认和 API 提交后实际审批链校验共同组成。 | | WAPPR1 API 边界调研 | 已确认需人工门禁 | 企业微信 `gettemplatedetail` 只返回模板控件,`getapprovaldetail` 只返回已提交审批单的实际审批节点和审批人,均不能只读读取“申请人是否可手选审批人/审批规则配置”。`applyevent` 的 `use_template_approver=1` 可使用后台流程,但属于写入型验证且存在模板限制,不能作为通用只读门禁。因此 WAPPR1 必须由后台人工确认、真机提交页确认和 API 提交后实际审批链校验共同组成。 |
| 自动范围 | 只到汇总和 dry-run | 复跑 WAUTO1、WFULLSMOKE1 和外出/加班 dry-run;公网 OA 测试业务数据必须带 `TEST/SMOKE/WFULL` 标记并保留审计;不设置企微写入开关,不执行 live 创建。 | | 自动范围 | 只到汇总和 dry-run | 复跑 WAUTO1、WFULLSMOKE1 和外出/加班 dry-run;公网 OA 测试业务数据必须带 `TEST-SMOKE-WFULL` 标记并保留审计;不设置企微写入开关,不执行 live 创建。 |
| WAUTO1 公网汇总 | `PAUSED_MANUAL_CONFIRMATION` | 公网报告 `/app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-130010/summary.json`;`/ready`、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描完成;finding 为 WARCH3 历史 summary 缺口、审批补偿和归档离线既有 `PASS_WITH_FINDINGS`。人工门禁仍待 WROAD2-BIZ1 三天业务动作和 WAPPR1 四类模板确认。 | | WAUTO1 公网汇总 | `PAUSED_MANUAL_CONFIRMATION` | 公网报告 `/app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-130010/summary.json`;`/ready`、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描完成;finding 为 WARCH3 历史 summary 缺口、审批补偿和归档离线既有 `PASS_WITH_FINDINGS`。人工门禁仍待 WROAD2-BIZ1 三天业务动作和 WAPPR1 四类模板确认。 |
| WFULLSMOKE1 公网全域 smoke | `PASS_WITH_FINDINGS` | 公网报告 `/app/artifacts/qa-flow/three-day-full-goal-smoke-20260520-125909/summary.json`;主控脚本完成三天全域目标聚合。finding 为 live feature flag/OA 公网写流程需凭据或人工确认、运行镜像缺部分浏览器 spec、既有 WARCH3/WROAD2/WAUTO1 观察项;未写企业微信,未创建外出/加班样件,未启用真实员工。 | | WFULLSMOKE1 公网全域 smoke | `PASS_WITH_FINDINGS` | 公网报告 `/app/artifacts/qa-flow/three-day-full-goal-smoke-20260520-125909/summary.json`;主控脚本完成三天全域目标聚合。finding 为 live feature flag/OA 公网写流程需凭据或人工确认、运行镜像缺部分浏览器 spec、既有 WARCH3/WROAD2/WAUTO1 观察项;未写企业微信,未创建外出/加班样件,未启用真实员工。 |
| 外出/加班 live 前 dry-run | `PASS_FIXTURE_DRY_RUN_READY` | 公网报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260520T125941Z/summary.json`;`secretMatrix=OK`、`actors=OK`、`liveWrite=DRY_RUN_READY`、`autoRerun=DRY_RUN_SKIPPED`。本轮没有设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,没有带 `--live --create-templates --submit-test-approvals`,没有创建企微模板或审批单。 | | 外出/加班 live 前 dry-run | `PASS_FIXTURE_DRY_RUN_READY` | 公网报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260520T125941Z/summary.json`;`secretMatrix=OK`、`actors=OK`、`liveWrite=DRY_RUN_READY`、`autoRerun=DRY_RUN_SKIPPED`。本轮没有设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,没有带 `--live --create-templates --submit-test-approvals`,没有创建企微模板或审批单。 |
| 后续问答 | 待自动复核和三天业务收口 | dry-run 已具备进入问答的自动证据,且 2026-05-21 WAPPR1 四类模板人工门禁均为 A。下一步需复跑只读证据汇总和 WRULE1 实际审批链校验,并结合三天业务动作可解释通过后,再问是否进入 WEXT1-LIVE;真实员工试用仍固定后置为 1 名真实员工 + 1 名审批人/管理员观察。 | | 后续问答 | 待自动复核和三天业务收口 | dry-run 已具备进入问答的自动证据,且 2026-05-21 WAPPR1 四类模板人工门禁均为 A。下一步需复跑只读证据汇总和 WRULE1 实际审批链校验,并结合三天业务动作可解释通过后,再问是否进入 WEXT1-FORMAL;真实员工试用仍固定后置为 1 名真实员工 + 1 名审批人/管理员观察。 |
## WRULE1 企微 HR/考勤审批链校验器 POC ## WRULE1 企微 HR/考勤审批链校验器 POC
@@ -554,9 +554,9 @@ Go 结论边界:
| 执行合同 | 已建档 | 新增 `issues/2026-05-22_10-21-12-wecom-test-account-final-closeout-v1.csv`,ID 为 `WTCLOSE2-0..WTCLOSE2-8`。 | | 执行合同 | 已建档 | 新增 `issues/2026-05-22_10-21-12-wecom-test-account-final-closeout-v1.csv`,ID 为 `WTCLOSE2-0..WTCLOSE2-8`。 |
| QA 编排脚本 | 已新增 | 新增 `scripts/qa/run-wecom-test-account-final-closeout.sh`,复跑公网 `/ready`、WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1,并汇总 WROAD2/WARCH3 既有报告索引。 | | QA 编排脚本 | 已新增 | 新增 `scripts/qa/run-wecom-test-account-final-closeout.sh`,复跑公网 `/ready`、WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1,并汇总 WROAD2/WARCH3 既有报告索引。 |
| 写入边界 | 已固定 | WFULLSMOKE1 在 WTCLOSE2 中以 `WFULLSMOKE_ALLOW_PUBLIC_WRITES=0` 运行,不新增 OA 测试业务数据;外出/加班仅 dry-run,不设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不带 live 写入参数。 | | 写入边界 | 已固定 | WFULLSMOKE1 在 WTCLOSE2 中以 `WFULLSMOKE_ALLOW_PUBLIC_WRITES=0` 运行,不新增 OA 测试业务数据;外出/加班仅 dry-run,不设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不带 live 写入参数。 |
| 规则门禁 | 已固定 | WRULE1 复跑时使用 `--manual-gate=all:A`,引用用户 2026-05-21 真机确认;该证据仍只支持进入问答,不等于批准 WEXT1-LIVE 或 WREAL1。 | | 规则门禁 | 已固定 | WRULE1 复跑时使用 `--manual-gate=all:A`,引用用户 2026-05-21 真机确认;该证据仍只支持进入问答,不等于批准 WEXT1-FORMAL 或 WREAL1。 |
| 结论分类 | 已固定 | `PASS_TEST_ACCOUNT_CLOSEOUT_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION`、`SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 | | 结论分类 | 已固定 | `PASS_TEST_ACCOUNT_CLOSEOUT_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION`、`SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 |
| 后续问答 | 待 WTCLOSE2 汇总 | 若 WTCLOSE2 可解释通过,再问是否批准 WEXT1-LIVE 单次 live 创建外出+加班 OA-POC 样件;真实员工试用仍固定后置为 1 名真实员工 + 1 名审批人/管理员观察,且需另行问答。 | | 后续问答 | 待 WTCLOSE2 汇总 | 若 WTCLOSE2 可解释通过,再问是否批准 WEXT1-FORMAL 正式模板外出+加班人工测试;真实员工试用仍固定后置为 1 名真实员工 + 1 名审批人/管理员观察,且需另行问答。 |
## WTCLOSE2F 远端可信 IP 执行口径修正 ## WTCLOSE2F 远端可信 IP 执行口径修正
@@ -569,6 +569,17 @@ Go 结论边界:
| 本地边界 | 已固定 | 本地直接执行脚本默认拒绝跑企微链路;本地只用于 `bash -n`、合同、文档和静态门禁。此前本地缺 env/DB 造成的 WTCLOSE2 阻断不能作为企微业务阻断证据。 | | 本地边界 | 已固定 | 本地直接执行脚本默认拒绝跑企微链路;本地只用于 `bash -n`、合同、文档和静态门禁。此前本地缺 env/DB 造成的 WTCLOSE2 阻断不能作为企微业务阻断证据。 |
| 写入边界 | 不变 | 远端 WTCLOSE2 仍不写企业微信、不创建外出/加班模板或审批单、不启用真实员工;WFULLSMOKE1 仍以 `WFULLSMOKE_ALLOW_PUBLIC_WRITES=0` 运行。 | | 写入边界 | 不变 | 远端 WTCLOSE2 仍不写企业微信、不创建外出/加班模板或审批单、不启用真实员工;WFULLSMOKE1 仍以 `WFULLSMOKE_ALLOW_PUBLIC_WRITES=0` 运行。 |
## WREMOTE1 / WFULLSMOKE2 / WEXT1-FORMAL 后续路线执行口径
执行时间:2026-05-22。WTCLOSE2F 后,后续路线改为先远端可信 IP 收口,再用正式模板做外出/加班测试号人工提交,最后再问答进入 1 人真实试用。
| 项目 | 状态 | 证据与边界 |
| --- | --- | --- |
| 执行合同 | 已建档 | 新增 `issues/2026-05-22_12-34-41-wecom-remote-closeout-and-full-smoke-v1.csv`,ID 为 `WREMOTE1-0..WREMOTE1-8`。 |
| 全域 smoke | 已规划 | `scripts/qa/run-three-day-full-goal-smoke.sh` 增加 `--remote`,必须在部署服务器执行;允许 `TEST-SMOKE-WFULL` 标记 OA 测试数据,不写企业微信。 |
| 外出/加班 | 路线修正 | 不自动创建 OA-POC 外出/加班模板;由 `SMOKE002` 在正式模板真机提交,`SMOKE101` 先看详情再审批,系统只读补偿、归档和 WRULE1。 |
| 真实试用 | 待问答 | 首批仍为 1 名真实员工 + 1 名审批人/管理员观察;真实员工号只通过 `/tmp/hyb-oa-wreal1.env` 临时文件提供,不进仓库。 |
## 历史恢复 ## 历史恢复
需要追溯 R70-R91 的详细流水时,使用: 需要追溯 R70-R91 的详细流水时,使用:
+5 -5
查看文件
@@ -37,8 +37,8 @@
### P0-5 WDRG 开发路线图门禁 ### P0-5 WDRG 开发路线图门禁
- WDRG 后采用“路线图门禁 + 单功能 Issue CSV”:路线图只控制阶段顺序、准入/退出门禁、并行规则和禁止跳阶段,具体功能仍单独方案、单独 Issue CSV、单独验证。 - WDRG 后采用“路线图门禁 + 单功能 Issue CSV”:路线图只控制阶段顺序、准入/退出门禁、并行规则和禁止跳阶段,具体功能仍单独方案、单独 Issue CSV、单独验证。
- 当前企微优先 HR/考勤路线顺序固定为:`WECOM-CAPABILITY-POC-V1` -> `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC(真实事件已确认)` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `wecom_attendance_approval_mirror_v1` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1`。 - 当前企微优先 HR/考勤路线顺序固定为:`WECOM-CAPABILITY-POC-V1` -> `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC(真实事件已确认)` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1/WARCH2 最小留存和正式只读查询` -> `WROAD2/WARCH3/WCHECK1/WEXT1/WOPS1/WAPPR1/WRULE1` -> `WTCLOSE2/WREMOTE1/WFULLSMOKE2 远端收口` -> `WEXT1-FORMAL 正式模板外出/加班测试` -> `WREAL1 小范围真实试用` -> `wecom_attendance_approval_mirror_v1` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1`。
- `WECOM-CAPABILITY-POC-V1` 已由 WCPC 收口,WHMS/WHMSLIVE 已完成 HR 主数据镜像实现和受控公网验证,WOUA-FIX 已完成测试账号差异收口;WRV1/WRA1/WMSG1 固定运行入口、OAuth/绑定、脱敏消息、Deeplink、通讯录、人事助手和打卡只读门禁;WACP3R 已证明请假/补卡补偿拉取和详情读取可用。后续不得跳过审批可读性门禁、镜像数据模型设计和最小历史留存,直接开发考勤/审批镜像、OA 应急接管、恢复回写或 RuleOps 正式写入。 - `WECOM-CAPABILITY-POC-V1` 已由 WCPC 收口,WHMS/WHMSLIVE 已完成 HR 主数据镜像实现和受控公网验证,WOUA-FIX 已完成测试账号差异收口;WRV1/WRA1/WMSG1 固定运行入口、OAuth/绑定、脱敏消息、Deeplink、通讯录、人事助手和打卡只读门禁;WACP3R 已证明请假/补卡补偿拉取和详情读取可用。后续不得跳过审批可读性门禁、镜像数据模型设计、最小历史留存、远端收口、正式模板外出/加班测试和真实小范围试用,直接开发考勤/审批镜像、OA 应急接管、恢复回写或 RuleOps 正式写入。
- 线上缺陷、正式使用阻断、真实反馈扫尾和 QA-only 脚本维护可以另开合同并行;采购、合同、报销、付款、AP、代账和高敏附件继续 OA 主办,不混入企微 HR/考勤路线。 - 线上缺陷、正式使用阻断、真实反馈扫尾和 QA-only 脚本维护可以另开合同并行;采购、合同、报销、付款、AP、代账和高敏附件继续 OA 主办,不混入企微 HR/考勤路线。
- 路线图事实源为 [企微优先开发路线图](./企微优先开发路线图.md);该路线图不代表任何运行时迁移能力已完成。 - 路线图事实源为 [企微优先开发路线图](./企微优先开发路线图.md);该路线图不代表任何运行时迁移能力已完成。
- API 和 Secret 事实源为 [企微 API 能力目录](./企微API能力目录.md):通讯录用 `WECOM_CONTACT_SECRET`;人事助手、打卡、消息和 OAuth 默认用 `WECOM_AGENT_SECRET`;不得在运行时代码里轮询多个 Secret 试错。 - API 和 Secret 事实源为 [企微 API 能力目录](./企微API能力目录.md):通讯录用 `WECOM_CONTACT_SECRET`;人事助手、打卡、消息和 OAuth 默认用 `WECOM_AGENT_SECRET`;不得在运行时代码里轮询多个 Secret 试错。
@@ -46,14 +46,14 @@
### P0-6 WCP1 企业微信能力 POC 结论 ### P0-6 WCP1 企业微信能力 POC 结论
- WCP1 已完成 QA-only 只读 POC,历史结论为 `PAUSE_FOR_CONFIG`;该阻断已由 WCPC 复跑收口。 - WCP1 已完成 QA-only 只读 POC,历史结论为 `PAUSE_FOR_CONFIG`;该阻断已由 WCPC 复跑收口。
- 已可复用:工作台应用 token、核心配置、HCLT 通讯录 create/update/disable 证据、通讯录部门读取、人事助手字段配置读取;WCPC 又确认既有在职测试号的通讯录成员读取、人事助手花名册读取、打卡短窗口记录/规则读取和假期余额读取可用。 - 已可复用:工作台应用 token、核心配置、HCLT 通讯录 create/update/disable 证据、通讯录部门读取、人事助手字段配置读取;WCPC 又确认既有在职测试号的通讯录成员读取、人事助手花名册读取、打卡短窗口记录/规则读取和假期余额读取可用。
- WCP1 初始缺口已留痕:通讯录测试成员读取 `wecom_errcode_48009`、人事助手测试员工读取 `wecom_errcode_60021`、打卡同步开关、审批模板 ID、测试审批单号、假期权限 `wecom_errcode_301062`、回调 URL/Token/AESKey。WAPC2FLIVE 已解决请假/补卡 OA-POC 模板和低风险测试审批单样例;WCBK1 已解决请假/补卡范围内的真实回调 URL 与事件确认;WACP3R 已解决请假/补卡范围内的补偿拉取只读 POC。当前仍未补齐的是镜像数据模型、最小历史留存、外出/加班样例或处理决策,以及 HR 写接口 POC。 - WCP1 初始缺口已留痕:通讯录测试成员读取 `wecom_errcode_48009`、人事助手测试员工读取 `wecom_errcode_60021`、打卡同步开关、审批模板 ID、测试审批单号、假期权限 `wecom_errcode_301062`、回调 URL/Token/AESKey。WAPC2FLIVE 已解决请假/补卡 OA-POC 模板和低风险测试审批单样例;WCBK1 已解决请假/补卡范围内的真实回调 URL 与事件确认;WACP3R 已解决请假/补卡范围内的补偿拉取只读 POC。当前仍未补齐的是正式模板外出/加班测试、真实小范围试用、最小完整镜像,以及 HR 写接口 POC。
- WCP1 报告继续作为初始配置缺口证据保留,当前 HR 主数据镜像准入以 WCPC 结论为准。 - WCP1 报告继续作为初始配置缺口证据保留,当前 HR 主数据镜像准入以 WCPC 结论为准。
### P0-7 WCPC 配置复跑口径 ### P0-7 WCPC 配置复跑口径
- WCPC 只做企业微信后台配置收口和只读 POC 复跑,不改业务代码、不部署、不持久写服务器 `.env`。 - WCPC 只做企业微信后台配置收口和只读 POC 复跑,不改业务代码、不部署、不持久写服务器 `.env`。
- 已按用户要求自动查找并使用既有在职低风险测试号 `SMOKE002/测试员工` 复跑;报告和文档只记录脱敏企业微信 userid 前缀 `oa_smoke***`,不得使用已离职/禁用的 `HRWDTEST-20260517214548` 作为主测试号。 - 已按用户要求自动查找并使用既有在职低风险测试号 `SMOKE002/测试员工` 复跑;报告和文档只记录脱敏企业微信 userid 前缀 `oa_smoke***`,不得使用已离职/禁用的 `HRWDTEST-20260517214548` 作为主测试号。
- 复跑报告为远端 `/tmp/wecom-capability-poc-wcpc-smoke002/summary.json`,结论 `GO_TO_HR_MASTER_SYNC`,`nextStageAllowed=true`,`blockingCapabilities=[]`。 - 复跑报告为远端 `/tmp/wecom-capability-poc-wcpc-smoke002/summary.json`,结论 `GO_TO_HR_MASTER_SYNC`,`nextStageAllowed=true`,`blockingCapabilities=[]`。
- WCPC 已由 WHMS 承接;请假/补卡审批模板 ID、测试审批单号 `sp_no`、真实回调和补偿拉取已由 WAPC2FLIVE/WCBK1/WACP3R 验证;镜像数据模型、最小历史留存、外出/加班样例和 HR 写接口仍需后续独立合同处理。WAPC1/WAPC2 已固定配置准备和只读 POC,但不得据此直接跳到考勤/审批镜像、OA 应急接管、恢复回写或 RuleOps。 - WCPC 已由 WHMS 承接;请假/补卡审批模板 ID、测试审批单号 `sp_no`、真实回调和补偿拉取已由 WAPC2FLIVE/WCBK1/WACP3R 验证;镜像数据模型、最小历史留存、正式模板外出/加班测试和 HR 写接口仍需后续独立合同处理。WAPC1/WAPC2 已固定配置准备和只读 POC,但不得据此直接跳到考勤/审批镜像、OA 应急接管、恢复回写或 RuleOps。
### P0-8 WHMS 企微 HR 主数据镜像口径 ### P0-8 WHMS 企微 HR 主数据镜像口径
- WHMS 已本地实现并部署验证 `wecom_hr_master_sync_v1`,默认和最终均为 `force_off`,未执行生产真实员工批量 apply。 - WHMS 已本地实现并部署验证 `wecom_hr_master_sync_v1`,默认和最终均为 `force_off`,未执行生产真实员工批量 apply。
@@ -63,7 +63,7 @@
- WHMSLIVE 公网验证中,`SMOKE002/测试员工`(脱敏 `oa_smoke***`)因企微侧缺手机号、邮箱和部门按 `missing_required_field` 跳过,证明缺字段不会写入占位数据;普通员工访问同步 API 已验证为 403。 - WHMSLIVE 公网验证中,`SMOKE002/测试员工`(脱敏 `oa_smoke***`)因企微侧缺手机号、邮箱和部门按 `missing_required_field` 跳过,证明缺字段不会写入占位数据;普通员工访问同步 API 已验证为 403。
- 已有 OA 员工只更新安全主数据字段,不覆盖银行账户、身份证、工资、合同附件或历史审批。 - 已有 OA 员工只更新安全主数据字段,不覆盖银行账户、身份证、工资、合同附件或历史审批。
- WAPI 后 WHMS/WOUA 读取策略修正为通讯录 `user/list_id` + 可选成员详情 + 人事助手 `get_staff_info`,通讯录用 `WECOM_CONTACT_SECRET`,人事助手用 `WECOM_AGENT_SECRET`,不再靠 fallback 试错。 - WAPI 后 WHMS/WOUA 读取策略修正为通讯录 `user/list_id` + 可选成员详情 + 人事助手 `get_staff_info`,通讯录用 `WECOM_CONTACT_SECRET`,人事助手用 `WECOM_AGENT_SECRET`,不再靠 fallback 试错。
- WHMS/WOUA-FIX 不代表考勤/审批镜像、OA 应急接管、恢复回写或 RuleOps 已完成;WRA1 后 WRV1 的 `PASS_WITH_CONFIG_GAPS` 只代表运行优先主链路可用且曾有审批/回调配置缺口;WMSG1 只证明消息和 Deeplink 可用;WAPC1 只证明审批配置准备清单已固化;WAPC2 只证明只读 runner 已具备;WAPC2FLIVE 只证明 OA-POC 样件可创建并可读;WCBK1 已证明真实回调 URL 验证、验签/解密和一条现有 OA-POC 测试审批单事件脱敏留证;WACP3R 已证明补偿拉取和审批详情读取可用但曾发现回调证据文件未持久化;WEGOV1 只修正路线和治理;WADM1/WARCH1 已补齐最小自建留存设计和实现。WROAD2-BIZ1 只补充测试账号业务冒烟,WAPPR1 只固定审批人自动带出和禁止申请人任意选审批人的真实试用前门禁。后续仍不能直接扩大到完整 `wecom_attendance_approval_mirror_v1`,需另建正式查询、外出/加班、打卡细项、审批规则和权限验收合同。 - WHMS/WOUA-FIX 不代表考勤/审批镜像、OA 应急接管、恢复回写或 RuleOps 已完成;WRA1 后 WRV1 的 `PASS_WITH_CONFIG_GAPS` 只代表运行优先主链路可用且曾有审批/回调配置缺口;WMSG1 只证明消息和 Deeplink 可用;WAPC1 只证明审批配置准备清单已固化;WAPC2 只证明只读 runner 已具备;WAPC2FLIVE 只证明 OA-POC 样件可创建并可读;WCBK1 已证明真实回调 URL 验证、验签/解密和一条现有 OA-POC 测试审批单事件脱敏留证;WACP3R 已证明补偿拉取和审批详情读取可用但曾发现回调证据文件未持久化;WEGOV1 只修正路线和治理;WADM1/WARCH1 已补齐最小自建留存设计和实现。WROAD2-BIZ1 只补充测试账号业务冒烟,WAPPR1 只固定审批人自动带出和禁止申请人任意选审批人的真实试用前门禁。后续仍不能直接扩大到完整 `wecom_attendance_approval_mirror_v1`,需另建远端收口、正式模板外出/加班测试、真实小范围试用、打卡细项、审批规则和权限验收合同。
--- ---
+4 -4
查看文件
@@ -63,11 +63,11 @@
| 审批申请详情 | [获取审批申请详情](https://developer.work.weixin.qq.com/document/path/91983) | `/cgi-bin/oa/getapprovaldetail` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_FOR_ARCHIVE` | WAPC2 runner 已可读审批详情;WAPC2FLIVE 已提交低风险请假/补卡测试审批单并自动复跑通过。该接口可校验已提交审批单的实际审批节点、审批人和状态,但不能证明申请页是否允许手选或修改审批人。WARCH1 复用该接口作为补偿拉取详情最终校准来源,可在 `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1` 双开关下写 OA 自建留存表;WROAD2 每日巡检只通过该路径补齐 OA 留存,不写企业微信。测试单不得包含采购、合同、报销、发票、银行回单或高敏附件。 | | 审批申请详情 | [获取审批申请详情](https://developer.work.weixin.qq.com/document/path/91983) | `/cgi-bin/oa/getapprovaldetail` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_FOR_ARCHIVE` | WAPC2 runner 已可读审批详情;WAPC2FLIVE 已提交低风险请假/补卡测试审批单并自动复跑通过。该接口可校验已提交审批单的实际审批节点、审批人和状态,但不能证明申请页是否允许手选或修改审批人。WARCH1 复用该接口作为补偿拉取详情最终校准来源,可在 `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1` 双开关下写 OA 自建留存表;WROAD2 每日巡检只通过该路径补齐 OA 留存,不写企业微信。测试单不得包含采购、合同、报销、发票、银行回单或高敏附件。 |
| 审批状态回调 | [审批申请状态变化回调通知](https://developer.work.weixin.qq.com/document/path/91815) | 事件回调 | `GET` URL 验证 / `POST` 事件 | 自建应用回调 Token/EncodingAESKey | `CAN_REUSE_NOW_FOR_ARCHIVE` | WCBK1 已部署只读 `GET/POST /api/wecom/approval/callback` 和 `check:wecom-approval-callback-poc`;公网真实事件已确认。WARCH1 后 POST 回调默认把规范化事件写入 `WecomApprovalCallbackEvent` 和 `WecomApprovalArchive`,DB 写入失败返回非 200 触发企微重试;不保存 Token、EncodingAESKey、原始 XML、密文或原始 payload。 | | 审批状态回调 | [审批申请状态变化回调通知](https://developer.work.weixin.qq.com/document/path/91815) | 事件回调 | `GET` URL 验证 / `POST` 事件 | 自建应用回调 Token/EncodingAESKey | `CAN_REUSE_NOW_FOR_ARCHIVE` | WCBK1 已部署只读 `GET/POST /api/wecom/approval/callback` 和 `check:wecom-approval-callback-poc`;公网真实事件已确认。WARCH1 后 POST 回调默认把规范化事件写入 `WecomApprovalCallbackEvent` 和 `WecomApprovalArchive`,DB 写入失败返回非 200 触发企微重试;不保存 Token、EncodingAESKey、原始 XML、密文或原始 payload。 |
| 批量获取审批单号 | [批量获取审批单号](https://developer.work.weixin.qq.com/document/path/91816) | `/cgi-bin/oa/getapprovalinfo` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_FOR_ARCHIVE` | WACP3/WACP3R 已新增 `check:wecom-approval-compensation-poc`,支持按 `creator` 自动发现 OA-POC 模板,再按 `template_id` filters 拉审批单号,并用 `getapprovaldetail` 拉详情;WARCH1 增加 OA DB 持久化双开关、补偿 run/item 和对账 finding,用于解决回调证据文件跨部署丢失问题。WROAD2+OPS 每日巡检复用该 runner;只允许以 `WECOM_ARCHIVE_WRITE=1` + `--persist-to-db` 写 OA 留存库,不写企微、不无过滤拉取高风险业务单据。 | | 批量获取审批单号 | [批量获取审批单号](https://developer.work.weixin.qq.com/document/path/91816) | `/cgi-bin/oa/getapprovalinfo` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_FOR_ARCHIVE` | WACP3/WACP3R 已新增 `check:wecom-approval-compensation-poc`,支持按 `creator` 自动发现 OA-POC 模板,再按 `template_id` filters 拉审批单号,并用 `getapprovaldetail` 拉详情;WARCH1 增加 OA DB 持久化双开关、补偿 run/item 和对账 finding,用于解决回调证据文件跨部署丢失问题。WROAD2+OPS 每日巡检复用该 runner;只允许以 `WECOM_ARCHIVE_WRITE=1` + `--persist-to-db` 写 OA 留存库,不写企微、不无过滤拉取高风险业务单据。 |
| 提交审批申请 | [提交审批申请](https://developer.work.weixin.qq.com/document/path/91853) | `/cgi-bin/oa/applyevent` | `POST` | `WECOM_AGENT_SECRET` | `DONE_LIVE_VERIFIED_FOR_OA_POC_FIXTURES` | 已接入 WAPC2F QA-only runner;请假/补卡已完成一次 live 创建并保留审计。`use_template_approver=1` 可使用管理后台设置的模板流程,但这是写入型验证,会创建审批单;且官方文档限制部分模板不能通过接口提交,不能作为 WAPPR1 通用只读门禁。WEXT1 扩展外出/加班 payload,但本轮只 dry-run;live 写入仍需显式 CLI、`WECOM_APPROVAL_FIXTURE_WRITE=1`、非自审预检和人工批准。OA 主办报销、采购、合同、项目不迁到企微原生审批。 | | 提交审批申请 | [提交审批申请](https://developer.work.weixin.qq.com/document/path/91853) | `/cgi-bin/oa/applyevent` | `POST` | `WECOM_AGENT_SECRET` | `DONE_LIVE_VERIFIED_FOR_OA_POC_FIXTURES` | 已接入 WAPC2F QA-only runner;请假/补卡已完成一次 live 创建并保留审计。`use_template_approver=1` 可使用管理后台设置的模板流程,但这是写入型验证,会创建审批单;且官方文档限制部分模板不能通过接口提交,不能作为 WAPPR1 通用只读门禁。WEXT1 扩展外出/加班 payload,但当前后续路线不再自动创建外出/加班 OA-POC 模板,改为 WEXT1-FORMAL 正式模板人工提交 + 系统只读校验。OA 主办报销、采购、合同、项目不迁到企微原生审批。 |
| 审批规则配置读取 | 审批模板详情、审批申请详情、提交审批申请、[审批流程引擎](https://developer.work.weixin.qq.com/document/path/90269) | 无原生审批规则只读接口 | N/A | N/A | `NOT_SUPPORTED_BY_API / NEEDS_MANUAL_GATE` | 当前未发现官方只读 API 可读取企微原生审批模板的“申请人自选节点”“是否允许改审批人”或后台审批规则配置。WAPPR1 必须用管理后台人工确认 + 真机提交页确认 + `getapprovaldetail` 实际审批链校验;审批流程引擎面向自建/第三方应用流程,不等同于读取或修改企业微信原生审批应用规则。 | | 审批规则配置读取 | 审批模板详情、审批申请详情、提交审批申请、[审批流程引擎](https://developer.work.weixin.qq.com/document/path/90269) | 无原生审批规则只读接口 | N/A | N/A | `NOT_SUPPORTED_BY_API / NEEDS_MANUAL_GATE` | 当前未发现官方只读 API 可读取企微原生审批模板的“申请人自选节点”“是否允许改审批人”或后台审批规则配置。WAPPR1 必须用管理后台人工确认 + 真机提交页确认 + `getapprovaldetail` 实际审批链校验;审批流程引擎面向自建/第三方应用流程,不等同于读取或修改企业微信原生审批应用规则。 |
| 审批链规则校验 | OA 归档审批详情 + OA 员工主管链/角色 | `npm run check:wecom-approval-rule-validator` | QA-only 本地/远端脚本 | 上游审批详情固定 `WECOM_AGENT_SECRET`;脚本默认只读 OA DB | `CAN_REUSE_NOW_FOR_RULE_POC` | WRULE1 采用“单一组织规则,两个执行域”:OA 维护员工直属主管、业务审批角色和管理员兜底事实,企业微信执行 HR/考勤审批。脚本读取已归档企微审批详情,对比理论审批人和实际审批链,输出 `PASS_RULE_MATCH`、`PASS_WITH_ADMIN_FALLBACK`、`FAIL_APPLICANT_CAN_CHOOSE`、`FAIL_SELF_APPROVAL`、`FAIL_APPROVER_MISMATCH`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。脚本不读取企微后台规则、不写企微、不替代 WAPPR1 人工门禁。 | | 审批链规则校验 | OA 归档审批详情 + OA 员工主管链/角色 | `npm run check:wecom-approval-rule-validator` | QA-only 本地/远端脚本 | 上游审批详情固定 `WECOM_AGENT_SECRET`;脚本默认只读 OA DB | `CAN_REUSE_NOW_FOR_RULE_POC` | WRULE1 采用“单一组织规则,两个执行域”:OA 维护员工直属主管、业务审批角色和管理员兜底事实,企业微信执行 HR/考勤审批。脚本读取已归档企微审批详情,对比理论审批人和实际审批链,输出 `PASS_RULE_MATCH`、`PASS_WITH_ADMIN_FALLBACK`、`FAIL_APPLICANT_CAN_CHOOSE`、`FAIL_SELF_APPROVAL`、`FAIL_APPROVER_MISMATCH`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。脚本不读取企微后台规则、不写企微、不替代 WAPPR1 人工门禁。 |
| 假期余额 | [获取成员假期余额](https://developer.work.weixin.qq.com/document/path/93376) | `/cgi-bin/oa/vacation/getuservacationquota` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_OR_NEEDS_PERMISSION` | WCPC 已证明可读但历史有权限错误;后续作为考勤镜像的只读项。 | | 假期余额 | [获取成员假期余额](https://developer.work.weixin.qq.com/document/path/93376) | `/cgi-bin/oa/vacation/getuservacationquota` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_OR_NEEDS_PERMISSION` | WCPC 已证明可读但历史有权限错误;后续作为考勤镜像的只读项。 |
| 审批模板创建/更新 | [创建审批模板](https://developer.work.weixin.qq.com/document/path/97437)、[更新审批模板](https://developer.work.weixin.qq.com/document/path/97438) | `/cgi-bin/oa/approval/create_template` 等官方模板写接口 | `POST` | `WECOM_AGENT_SECRET` | `DONE_LIVE_VERIFIED_FOR_OA_POC_FIXTURES` | WAPC2FLIVE 已用 `template_name` + `property` controls 结构创建 OA-POC 请假/补卡测试模板并保留审计。WEXT1 只为外出/加班构建 dry-run payload;正式模板更新、外出/加班 live 创建和 RuleOps 写入仍留后期合同。 | | 审批模板创建/更新 | [创建审批模板](https://developer.work.weixin.qq.com/document/path/97437)、[更新审批模板](https://developer.work.weixin.qq.com/document/path/97438) | `/cgi-bin/oa/approval/create_template` 等官方模板写接口 | `POST` | `WECOM_AGENT_SECRET` | `DONE_LIVE_VERIFIED_FOR_OA_POC_FIXTURES` | WAPC2FLIVE 已用 `template_name` + `property` controls 结构创建 OA-POC 请假/补卡测试模板并保留审计。WEXT1 只为外出/加班构建 dry-run payload;WREMOTE1 后外出/加班测试改走现有正式模板人工提交,不再自动创建 OA-POC 外出/加班模板;正式模板更新和 RuleOps 写入仍留后期合同。 |
## 4. WAPC1 审批配置准备清单 ## 4. WAPC1 审批配置准备清单
@@ -99,7 +99,7 @@ WAPC2 不代表真实回调、审批镜像、应急接管、恢复回写或 Rule
WPROC1 将 WAPC2 之后的审批路线固定为: WPROC1 将 WAPC2 之后的审批路线固定为:
`WAPC2 -> WAPC2F 自动生成 POC 样件 -> WAPC2FLIVE live 创建与 WAPC2 自动复跑 -> WCBK1 回调只读 POC -> WEGOV1 企微主办治理与自建留存路线修正 -> WACP3/WACP3R 补偿拉取 POC -> WREAD1 审批可读性与误审批防护门禁 -> WADM1 自建留存/镜像数据模型设计 -> WARCH1 最小自建历史留存实现 -> WARCH2 正式只读历史查询 -> WROAD2+OPS 受控上线与每日巡检 -> WARCH3 归档稳定化自动巡检 -> WCHECK1 打卡摘要留存 -> WEXT1 外出/加班 dry-run -> WOPS1 巡检告警降噪 -> WROAD2-CLOSEOUT 三天验收 -> WROAD2-BIZ1 三天业务冒烟 -> WAPPR1 审批规则规范化 -> WRULE1 审批链校验器 POC -> WAUTO1 自动证据汇总 -> WEXT1LD 外出/加班 live 前 dry-run -> WFULLSMOKE1 三天全域最终目标测试 -> WROUTE2 测试号收口到最小镜像路线锁定 -> WEXT1-LIVE 外出/加班测试号 live POC -> 四类测试号证据和审批规则门禁通过后问答 WREAL1 小范围真实试用(首批 1 名真实员工 + 1 名审批人/管理员观察) -> wecom_attendance_approval_mirror_v1 最小完整镜像` `WAPC2 -> WAPC2F 自动生成 POC 样件 -> WAPC2FLIVE live 创建与 WAPC2 自动复跑 -> WCBK1 回调只读 POC -> WEGOV1 企微主办治理与自建留存路线修正 -> WACP3/WACP3R 补偿拉取 POC -> WREAD1 审批可读性与误审批防护门禁 -> WADM1 自建留存/镜像数据模型设计 -> WARCH1 最小自建历史留存实现 -> WARCH2 正式只读历史查询 -> WROAD2+OPS 受控上线与每日巡检 -> WARCH3 归档稳定化自动巡检 -> WCHECK1 打卡摘要留存 -> WEXT1 外出/加班 dry-run -> WOPS1 巡检告警降噪 -> WROAD2-CLOSEOUT 三天验收 -> WROAD2-BIZ1 三天业务冒烟 -> WAPPR1 审批规则规范化 -> WRULE1 审批链校验器 POC -> WAUTO1 自动证据汇总 -> WEXT1LD 外出/加班 live 前 dry-run -> WFULLSMOKE1 三天全域最终目标测试 -> WROUTE2 测试号收口到最小镜像路线锁定 -> WTCLOSE2/WTCLOSE2F 远端可信 IP 执行口径修正 -> WREMOTE1/WFULLSMOKE2 远端收口 -> WEXT1-FORMAL 正式模板外出/加班测试 -> 四类测试号证据和审批规则门禁通过后问答 WREAL1 小范围真实试用(首批 1 名真实员工 + 1 名审批人/管理员观察) -> wecom_attendance_approval_mirror_v1 最小完整镜像`
门禁要求: 门禁要求:
@@ -138,7 +138,7 @@ WADM1/WARCH1 将已验证的审批能力固定为“可读可留存”的实现
## 7. 运行优先结论 ## 7. 运行优先结论
- 近期优先利用:企业微信工作台入口、OAuth/免登、绑定、个人应用消息、OA deeplink、通讯录 userid 清单、可选成员详情、人事助手花名册读取、打卡记录和打卡规则读取,以及 WROAD2/WARCH3 测试账号受控上线巡检。 - 近期优先利用:企业微信工作台入口、OAuth/免登、绑定、个人应用消息、OA deeplink、通讯录 userid 清单、可选成员详情、人事助手花名册读取、打卡记录和打卡规则读取,以及 WROAD2/WARCH3 测试账号受控上线巡检。
- 暂缓深度镜像:WREAD1、WADM1、WARCH1、WARCH2 已完成请假/补卡可读性、模型设计、最小历史留存和正式只读查询;WARCH3/WCHECK1/WEXT1/WOPS1/WROAD2-BIZ1/WAPPR1/WRULE1/WAUTO1/WEXT1LD/WFULLSMOKE1/WROUTE2 本轮只解决巡检稳定、打卡摘要留存、外出/加班 dry-run、告警降噪、测试账号业务冒烟、审批规则门禁、理论审批人自动校验、自动证据汇总、全域测试和路线锁定;`wecom_attendance_approval_mirror_v1` 最小完整镜像仍需等 WEXT1-LIVE、四类测试号证据和 WREAL1 小范围真实试用通过后再优先规划;`oa_hr_emergency_mode_v1`、`wecom_recovery_writeback_v1`、`wecom_ruleops_v1` 后置,或你明确批准后再拆。 - 暂缓深度镜像:WREAD1、WADM1、WARCH1、WARCH2 已完成请假/补卡可读性、模型设计、最小历史留存和正式只读查询;WARCH3/WCHECK1/WEXT1/WOPS1/WROAD2-BIZ1/WAPPR1/WRULE1/WAUTO1/WEXT1LD/WFULLSMOKE1/WROUTE2/WTCLOSE2/WREMOTE1 本轮只解决巡检稳定、打卡摘要留存、外出/加班 dry-run、告警降噪、测试账号业务冒烟、审批规则门禁、理论审批人自动校验、自动证据汇总、全域测试、路线锁定和远端收口;`wecom_attendance_approval_mirror_v1` 最小完整镜像仍需等 WEXT1-FORMAL、四类测试号证据和 WREAL1 小范围真实试用通过后再优先规划;`oa_hr_emergency_mode_v1`、`wecom_recovery_writeback_v1`、`wecom_ruleops_v1` 后置,或你明确批准后再拆。
- OA 主办边界不变:报销、采购、费用、合同、项目、付款批次、AP、代账交接、审计和高敏附件继续在 OA 内完成,只向企业微信发送脱敏提醒和 OA 链接。 - OA 主办边界不变:报销、采购、费用、合同、项目、付款批次、AP、代账交接、审计和高敏附件继续在 OA 内完成,只向企业微信发送脱敏提醒和 OA 链接。
## 8. 后续使用要求 ## 8. 后续使用要求
+39 -37
查看文件
@@ -2,16 +2,17 @@
**文档状态**:当前开发路线图事实源。 **文档状态**:当前开发路线图事实源。
**分类**:开发治理 / 路线图。 **分类**:开发治理 / 路线图。
**适用时间**:WDRG / WCP1 / WHMSLIVE / WOUA / WAPI / WRRA / WOUA-FIX / WRV1 / WRA1 / WMSG1 / WAPC1 / WAPC2 / WPROC1 / WPROC2 / WAPC2F / WAPC2FLIVE / WCBK1 / WEGOV1 / WACP3 / WACP3R / WREAD1 / WREAD1F / WADM1 / WARCH1 / WARCH2 / WROAD2 / WARCH3 / WCHECK1 / WEXT1 / WOPS1 / WROAD2-CLOSEOUT / WROAD2-BIZ1 / WAPPR1 / WAUTO1 / WEXT1LD / WFULLSMOKE1 / WROUTE2 / WTCLOSE1 / WRULE1 / WTCLOSE2 / WTCLOSE2F / WREAL1-PREP / WEXT1-LIVE 路线选择之后。 **适用时间**:WDRG / WCP1 / WHMSLIVE / WOUA / WAPI / WRRA / WOUA-FIX / WRV1 / WRA1 / WMSG1 / WAPC1 / WAPC2 / WPROC1 / WPROC2 / WAPC2F / WAPC2FLIVE / WCBK1 / WEGOV1 / WACP3 / WACP3R / WREAD1 / WREAD1F / WADM1 / WARCH1 / WARCH2 / WROAD2 / WARCH3 / WCHECK1 / WEXT1 / WOPS1 / WROAD2-CLOSEOUT / WROAD2-BIZ1 / WAPPR1 / WAUTO1 / WEXT1LD / WFULLSMOKE1 / WROUTE2 / WTCLOSE1 / WRULE1 / WTCLOSE2 / WTCLOSE2F / WREMOTE1 / WFULLSMOKE2 / WEXT1-FORMAL / WREAL1-PREP 路线选择之后。
**关联 Issue**:`WDRG,WCP1,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WREAD1F,WADM1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WAUTO1,WEXT1LD,WFULLSMOKE1,WROUTE2,WTCLOSE1,WRULE1,WTCLOSE2,WTCLOSE2F,WREAL1P`。 **关联 Issue**:`WDRG,WCP1,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WREAD1F,WADM1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WAUTO1,WEXT1LD,WFULLSMOKE1,WROUTE2,WTCLOSE1,WRULE1,WTCLOSE2,WTCLOSE2F,WREMOTE1,WFULLSMOKE2,WEXT1-FORMAL,WREAL1P`。
**最近审计**:2026-05-22。 **最近审计**:2026-05-22。
**不得误读**:本文只控制后续开发节奏、阶段顺序和门禁。WHMSLIVE 后只代表企微 HR 主数据镜像已部署并受控验证;WAPI 后进一步固定企微 API/Secret 口径并转为运行优先;WRRA 后明确 `PASS_WITH_FINDINGS` 只代表只读对账成功且存在差异,不代表企微考勤/审批镜像、OA 应急接管、恢复回写或 RuleOps 已完成运行时实现。WMSG1 只证明企业微信应用消息可达和 Deeplink 可回到 OA;WAPC1 只固化审批配置准备清单;WAPC2 只新增请假/补卡模板详情和低风险 `sp_no` 审批详情只读 POC,不代表真实回调或镜像能力已完成。WPROC1 后,WAPC2 不直接放行深度镜像,必须先完成自动样件、回调、补偿拉取和镜像数据模型设计门禁。WPROC2 只新增可执行 process gate。WAPC2FLIVE 已创建 OA-POC 请假/补卡测试模板和低风险测试审批单,并自动复跑 WAPC2 得到 `PASS_APPROVAL_POC`。WCBK1 已完成真实回调 URL 验证和一条现有 OA-POC 测试审批单事件确认,公网报告为 `PASS_CALLBACK_EVENT_CONFIRMED`;WEGOV1 后路线明确为“企微成熟功能优先上线,OA 做自建留存、审计、入口、消息和应急兜底”。WACP3R 已将补偿拉取复跑修正为自动按 `SMOKE002` creator 发现 OA-POC 请假/补卡模板,公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` 为 `PASS_WITH_FINDINGS`。WREAD1F 新样例后,审批人真机确认请假和补卡消息卡片、列表、详情页均可看清;远端人工结果报告 `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` 为 `PASS_READABLE`。但同意按钮单击即通过仍是操作风险,需在 WARCH1/WARCH2 的留存、审计、提示或操作规程中继续处理。WADM1 只完成自建留存/镜像数据模型设计;WARCH1 只实现请假/补卡最小审批历史留存、回调事件入库、补偿拉取入库和 QA-only 离线读取证明;WARCH2 只提供 OA DB 只读查询 API 和 PC/移动历史页,不调用企微 API、不读取企微 Secret、不代表完整镜像、外出/加班、应急接管、恢复回写或 RuleOps 已完成。WROAD2 后当前策略是测试账号受控上线和每日脚本化巡检,允许补偿归档写 OA 自建留存库,但不写企业微信、不扩大真实员工范围;WARCH3 将每日巡检升级为服务器 `systemd timer` 与脱敏企微告警,WCHECK1 增加打卡规范化明细、日/月摘要和规则快照留存,WEXT1 只完成外出/加班 dry-run 支持。WOPS1 已公网验证巡检告警降噪:`HYD000006` 是管理员 `wangshunli` 的 employee_no,脚本不再把姓名字符串当员工号;已知 finding 不重复发送,只有阻断、脚本失败、新增 finding 或状态恶化才告警。WROAD2-BIZ1 在三天内补充测试账号人工业务冒烟;WAPPR1 将申请人任意选择审批人列为真实试用前阻断 finding。WAUTO1 只做只读证据汇总,WEXT1LD 只做外出/加班 live 前 dry-run,均不授权 live 创建。WFULLSMOKE1 是三天全域最终目标测试总控,只聚合企微 HR/考勤、OA 主办域、移动端和运维巡检证据;它允许在公网试运行环境创建带 `TEST/SMOKE/WFULL` 标记的 OA 测试业务数据,但不写企业微信、不创建外出/加班样件、不做真实付款、不接真实支付、不写 ERP、不导入银行流水、不启用真实员工。WREAL1-PREP 只准备真实小范围试用清单,不启用真实员工;后续顺序收紧为 WROAD2-CLOSEOUT 三天验收 -> WROAD2-BIZ1 三天业务冒烟 -> WAPPR1 审批规则规范化 -> WAUTO1 自动证据汇总 -> WEXT1LD 外出/加班 live 前 dry-run -> WFULLSMOKE1 三天全域最终目标测试 -> WEXT1-LIVE 外出/加班测试号 live POC -> 请假/补卡/外出/加班四类测试号证据和审批规则门禁通过后再问真实小范围试用。上述阶段仍不代表完整深度镜像、应急接管、恢复回写或 RuleOps 已完成。 **不得误读**:本文只控制后续开发节奏、阶段顺序和门禁。WHMSLIVE 后只代表企微 HR 主数据镜像已部署并受控验证;WAPI 后进一步固定企微 API/Secret 口径并转为运行优先;WRRA 后明确 `PASS_WITH_FINDINGS` 只代表只读对账成功且存在差异,不代表企微考勤/审批镜像、OA 应急接管、恢复回写或 RuleOps 已完成运行时实现。WMSG1 只证明企业微信应用消息可达和 Deeplink 可回到 OA;WAPC1 只固化审批配置准备清单;WAPC2 只新增请假/补卡模板详情和低风险 `sp_no` 审批详情只读 POC,不代表真实回调或镜像能力已完成。WPROC1 后,WAPC2 不直接放行深度镜像,必须先完成自动样件、回调、补偿拉取和镜像数据模型设计门禁。WPROC2 只新增可执行 process gate。WAPC2FLIVE 已创建 OA-POC 请假/补卡测试模板和低风险测试审批单,并自动复跑 WAPC2 得到 `PASS_APPROVAL_POC`。WCBK1 已完成真实回调 URL 验证和一条现有 OA-POC 测试审批单事件确认,公网报告为 `PASS_CALLBACK_EVENT_CONFIRMED`;WEGOV1 后路线明确为“企微成熟功能优先上线,OA 做自建留存、审计、入口、消息和应急兜底”。WACP3R 已将补偿拉取复跑修正为自动按 `SMOKE002` creator 发现 OA-POC 请假/补卡模板,公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` 为 `PASS_WITH_FINDINGS`。WREAD1F 新样例后,审批人真机确认请假和补卡消息卡片、列表、详情页均可看清;远端人工结果报告 `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` 为 `PASS_READABLE`。但同意按钮单击即通过仍是操作风险,需在 WARCH1/WARCH2 的留存、审计、提示或操作规程中继续处理。WADM1 只完成自建留存/镜像数据模型设计;WARCH1 只实现请假/补卡最小审批历史留存、回调事件入库、补偿拉取入库和 QA-only 离线读取证明;WARCH2 只提供 OA DB 只读查询 API 和 PC/移动历史页,不调用企微 API、不读取企微 Secret、不代表完整镜像、外出/加班、应急接管、恢复回写或 RuleOps 已完成。WROAD2 后当前策略是测试账号受控上线和每日脚本化巡检,允许补偿归档写 OA 自建留存库,但不写企业微信、不扩大真实员工范围;WARCH3 将每日巡检升级为服务器 `systemd timer` 与脱敏企微告警,WCHECK1 增加打卡规范化明细、日/月摘要和规则快照留存,WEXT1 只完成外出/加班 dry-run 支持。WOPS1 已公网验证巡检告警降噪:`HYD000006` 是管理员 `wangshunli` 的 employee_no,脚本不再把姓名字符串当员工号;已知 finding 不重复发送,只有阻断、脚本失败、新增 finding 或状态恶化才告警。WROAD2-BIZ1 在三天内补充测试账号人工业务冒烟;WAPPR1 将申请人任意选择审批人列为真实试用前阻断 finding。WAUTO1 只做只读证据汇总,WEXT1LD 只做外出/加班 live 前 dry-run,均不授权 live 创建。WFULLSMOKE1 是三天全域最终目标测试总控,只聚合企微 HR/考勤、OA 主办域、移动端和运维巡检证据;它允许在公网试运行环境创建带 `TEST-SMOKE-WFULL` 标记的 OA 测试业务数据,但不写企业微信、不创建外出/加班样件、不做真实付款、不接真实支付、不写 ERP、不导入银行流水、不启用真实员工。WREAL1-PREP 只准备真实小范围试用清单,不启用真实员工;后续顺序收紧为 WROAD2-CLOSEOUT 三天验收 -> WROAD2-BIZ1 三天业务冒烟 -> WAPPR1 审批规则规范化 -> WAUTO1 自动证据汇总 -> WEXT1LD 外出/加班 live 前 dry-run -> WFULLSMOKE1 三天全域最终目标测试 -> WEXT1-FORMAL 正式模板外出/加班测试 -> 请假/补卡/外出/加班四类测试号证据和审批规则门禁通过后再问真实小范围试用。上述阶段仍不代表完整深度镜像、应急接管、恢复回写或 RuleOps 已完成。
**WTCLOSE2F 顺序修正**:上一条长段中的“后续顺序”以本条为准:WROAD2-CLOSEOUT -> WROAD2-BIZ1 -> WAPPR1 -> WRULE1 -> WAUTO1 -> WEXT1LD -> WFULLSMOKE1 -> WTCLOSE2/WTCLOSE2F 远端可信 IP 收口 -> WEXT1-LIVE 问答 -> WREAL1 问答 -> 最小完整镜像。 **WTCLOSE2F 顺序修正**:上一条长段中的“后续顺序”以本条为准:WROAD2-CLOSEOUT -> WROAD2-BIZ1 -> WAPPR1 -> WRULE1 -> WAUTO1 -> WEXT1LD -> WFULLSMOKE1 -> WTCLOSE2/WTCLOSE2F 远端可信 IP 收口 -> WREMOTE1/WFULLSMOKE2 远端收口 -> WEXT1-FORMAL 正式模板人工提交问答 -> WREAL1 问答 -> 最小完整镜像。
**WROUTE2 补充口径**:WFULLSMOKE1 之后先锁定测试号全域收口,再进入 WEXT1-LIVE 问答;WREAL1 首批固定为 1 名真实员工 + 1 名审批人/管理员观察;WREAL1 通过后优先规划 `wecom_attendance_approval_mirror_v1` 最小完整镜像,应急接管、恢复回写和 RuleOps 后置。 **WROUTE2/WREMOTE1 补充口径**:WFULLSMOKE1 之后先锁定测试号全域收口,再进入 WREMOTE1/WFULLSMOKE2 远端收口;外出/加班下一步使用 WEXT1-FORMAL 正式模板人工提交,不再自动创建外出/加班 OA-POC 样件。WREAL1 首批固定为 1 名真实员工 + 1 名审批人/管理员观察;WREAL1 通过后优先规划 `wecom_attendance_approval_mirror_v1` 最小完整镜像,应急接管、恢复回写和 RuleOps 后置。
**WTCLOSE1 执行口径**:公司不到 10 人,WAPPR1 四类模板目标按 A 执行;正式 HR/考勤审批采用一层直属主管或指定审批角色自动带出审批人,主管链缺失、审批人不可见/停用/未绑定或命中自审时由管理员兜底或阻断。本轮自动执行到 WAUTO1/WFULLSMOKE1 汇总和 WEXT1-LIVE 前 dry-run,不授权任何企微写入。 **WTCLOSE1 执行口径**:公司不到 10 人,WAPPR1 四类模板目标按 A 执行;正式 HR/考勤审批采用一层直属主管或指定审批角色自动带出审批人,主管链缺失、审批人不可见/停用/未绑定或命中自审时由管理员兜底或阻断。本轮自动执行到 WAUTO1/WFULLSMOKE1 汇总和 WEXT1LD dry-run,不授权任何企微写入。
**WAPPR1 2026-05-21 人工门禁结论**:测试员工直属上级已设置为测试主管;用户真机确认请假、补卡、外出、加班提交页均自动带出测试主管,且申请人不能删除、改人或新增审批人,四类模板均为 A。该结论只放行规则门禁,不等于批准外出/加班 live 写入或真实员工试用;后续仍需 WRULE1 实际审批链校验和 WEXT1-LIVE/WREAL1 问答。 **WAPPR1 2026-05-21 人工门禁结论**:测试员工直属上级已设置为测试主管;用户真机确认请假、补卡、外出、加班提交页均自动带出测试主管,且申请人不能删除、改人或新增审批人,四类模板均为 A。该结论只放行规则门禁,不等于批准外出/加班正式模板测试单或真实员工试用;后续仍需 WRULE1 实际审批链校验和 WEXT1-FORMAL/WREAL1 问答。
**WRULE1 执行口径**:采用“单一组织规则,两个执行域”。OA 维护员工、直属主管、业务角色和管理员兜底事实;企业微信只执行 HR/考勤审批;OA 通过 `check:wecom-approval-rule-validator` 读取已归档企微审批详情,计算理论审批人并对比实际审批链。WRULE1 是只读校验器,不新增 HR/考勤审批引擎,不写企微,不替代 WAPPR1 的后台人工确认和真机提交页确认。 **WRULE1 执行口径**:采用“单一组织规则,两个执行域”。OA 维护员工、直属主管、业务角色和管理员兜底事实;企业微信只执行 HR/考勤审批;OA 通过 `check:wecom-approval-rule-validator` 读取已归档企微审批详情,计算理论审批人并对比实际审批链。WRULE1 是只读校验器,不新增 HR/考勤审批引擎,不写企微,不替代 WAPPR1 的后台人工确认和真机提交页确认。
**WTCLOSE2/WTCLOSE2F 执行口径**:新增 `scripts/qa/run-wecom-test-account-final-closeout.sh` 汇总测试号最终证据,复跑 WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1。由于企业微信 API 已配置可信 IP,只允许部署服务器访问,WTCLOSE2 运行证据必须来自部署服务器:本地直接执行脚本默认拒绝跑企微链路,正确命令为 `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote`,由 SSH 到部署服务器并在 server 容器中执行;本地只做合同、语法、文档和静态门禁。WFULLSMOKE1 在 WTCLOSE2 中以 `WFULLSMOKE_ALLOW_PUBLIC_WRITES=0` 运行,不新增 OA 测试业务数据;如子 runner 触发既有归档写库,只能走 WARCH3/WCHECK1 已批准的 OA 自建留存路径。脚本不写企业微信、不创建外出/加班样件、不启用真实员工。WTCLOSE2 结论只进入 WEXT1-LIVE 问答,不自动执行 live;此前本地缺 env/DB 造成的 WTCLOSE2 阻断不能作为企微业务阻断证据。 **WTCLOSE2/WTCLOSE2F 执行口径**:新增 `scripts/qa/run-wecom-test-account-final-closeout.sh` 汇总测试号最终证据,复跑 WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1。由于企业微信 API 已配置可信 IP,只允许部署服务器访问,WTCLOSE2 运行证据必须来自部署服务器:本地直接执行脚本默认拒绝跑企微链路,正确命令为 `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote`,由 SSH 到部署服务器并在 server 容器中执行;本地只做合同、语法、文档和静态门禁。WFULLSMOKE1 在 WTCLOSE2 中以 `WFULLSMOKE_ALLOW_PUBLIC_WRITES=0` 运行,不新增 OA 测试业务数据;如子 runner 触发既有归档写库,只能走 WARCH3/WCHECK1 已批准的 OA 自建留存路径。脚本不写企业微信、不创建外出/加班样件、不启用真实员工。WTCLOSE2 结论只进入 WREMOTE1/WFULLSMOKE2 和 WEXT1-FORMAL 问答,不自动提交审批;此前本地缺 env/DB 造成的 WTCLOSE2 阻断不能作为企微业务阻断证据。
**WREMOTE1/WFULLSMOKE2/WEXT1-FORMAL 执行口径**:WTCLOSE2F 后下一步先 `SYNC_ENV=0` 部署或确认远端代码同步,再从部署服务器执行 `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote`。全域 smoke 也必须从部署服务器执行:`WFULLSMOKE_ALLOW_PUBLIC_WRITES=1 bash scripts/qa/run-three-day-full-goal-smoke.sh --remote`,允许创建带 `TEST-SMOKE-WFULL` 标记的 OA 测试业务数据,不写企业微信。外出/加班不再自动创建 OA-POC 测试模板;改为使用现有正式模板,由 `SMOKE002` 真机人工提交,`SMOKE101` 先看详情再审批,系统只读补偿拉取、归档和 WRULE1 校验。WREAL1 真实员工和审批人只通过 `/tmp/hyb-oa-wreal1.env` 临时文件提供,不写入仓库文档或聊天。
## 1. 路线图原则 ## 1. 路线图原则
@@ -21,14 +22,14 @@
- WEGOV1 后固定四域边界:企微主办域为打卡、请假、补卡、外出、加班、假期余额和人事助手;OA 主办域为报销、采购、合同、项目、付款、发票、银行回单、高敏附件和经营审计;OA 留存域保存企微关键历史和完整外部关联键;OA 应急域只在企微不可用时由管理员人工开启。 - WEGOV1 后固定四域边界:企微主办域为打卡、请假、补卡、外出、加班、假期余额和人事助手;OA 主办域为报销、采购、合同、项目、付款、发票、银行回单、高敏附件和经营审计;OA 留存域保存企微关键历史和完整外部关联键;OA 应急域只在企微不可用时由管理员人工开启。
- OA 不重造企业微信完整打卡、考勤和 HR 产品;V1 目标是企微不可用时可以查看已保存历史,不是完整替代企微继续办理。 - OA 不重造企业微信完整打卡、考勤和 HR 产品;V1 目标是企微不可用时可以查看已保存历史,不是完整替代企微继续办理。
- WROAD2 后“可受控使用”和“完整镜像增强”分离:请假/补卡已归档历史可在 OA 查询,先用测试账号做 3 天每日脚本化巡检;完整镜像、应急接管、恢复回写和 RuleOps 继续后置。 - WROAD2 后“可受控使用”和“完整镜像增强”分离:请假/补卡已归档历史可在 OA 查询,先用测试账号做 3 天每日脚本化巡检;完整镜像、应急接管、恢复回写和 RuleOps 继续后置。
- 外出/加班不作为当前受控上线阻断;`WEXT1` dry-run 已完成,live 创建必须在 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WRULE1、WAUTO1、WEXT1LD、WFULLSMOKE1 和 WTCLOSE2 结论可接受后另建 `WEXT1-LIVE` 合同并再次人工确认。 - 外出/加班不作为当前受控上线阻断;`WEXT1` dry-run 已完成。WREMOTE1 后下一步改为 WEXT1-FORMAL:只在远端收口可解释通过并再次问答确认后,由 `SMOKE002` 在正式模板人工提交测试单,系统只读校验;不再自动创建外出/加班 OA-POC 样件。
- WOPS1 后巡检告警采用“状态记忆 + 新增异常”策略:既有 `PASS_WITH_FINDINGS` observation 进入基线后不重复发企微消息;只有 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`、脚本失败、新增 finding、状态恶化或人工 `--force` 才发送脱敏告警。 - WOPS1 后巡检告警采用“状态记忆 + 新增异常”策略:既有 `PASS_WITH_FINDINGS` observation 进入基线后不重复发企微消息;只有 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`、脚本失败、新增 finding、状态恶化或人工 `--force` 才发送脱敏告警。
- WAUTO1 把三天受控试用证据汇总脚本化:只复检 `/ready`、读取既有 WROAD2/WARCH3/WCHECK1/WEXT1 报告、执行只读/离线 runner 和外出/加班 dry-run,不触发 WROAD2 补偿归档写库路径,不写企微、不创建模板或审批单。 - WAUTO1 把三天受控试用证据汇总脚本化:只复检 `/ready`、读取既有 WROAD2/WARCH3/WCHECK1/WEXT1 报告、执行只读/离线 runner 和外出/加班 dry-run,不触发 WROAD2 补偿归档写库路径,不写企微、不创建模板或审批单。
- WEXT1LD 是外出/加班 live 前 dry-run gate:远端只执行 `npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`,不设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不带 `--live`/`--create-templates`/`--submit-test-approvals`;通过后仍只进入人工问答。 - WEXT1LD 是外出/加班 live 前 dry-run gate:远端只执行 `npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`,不设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不带 `--live`/`--create-templates`/`--submit-test-approvals`;通过后仍只进入人工问答。
- WFULLSMOKE1 把三天目标从“企微受控巡检”扩展为全域主路径闭环:企微 HR/考勤、OA 报销、采购、合同/项目、付款批次、移动端和运维巡检一起汇总;只允许 `TEST/SMOKE/WFULL` 标记的 OA 测试业务数据,不写企业微信、不真实付款、不写 ERP、不导入银行流水。 - WFULLSMOKE1 把三天目标从“企微受控巡检”扩展为全域主路径闭环:企微 HR/考勤、OA 报销、采购、合同/项目、付款批次、移动端和运维巡检一起汇总;只允许 `TEST-SMOKE-WFULL` 标记的 OA 测试业务数据,不写企业微信、不真实付款、不写 ERP、不导入银行流水。
- WROUTE2 后锁定“测试号全域收口 -> 外出/加班测试号 live POC -> 真实小试用 -> 最小完整镜像”:当前不启用真实员工;WREAL1 首批固定为 1 名真实员工 + 1 名审批人/管理员观察;WREAL1 通过后优先规划 `wecom_attendance_approval_mirror_v1` 最小完整镜像,不先做应急接管、恢复回写或 RuleOps。 - WROUTE2/WREMOTE1 后锁定“测试号全域收口 -> 正式模板外出/加班人工测试 -> 真实小试用 -> 最小完整镜像”:当前不启用真实员工;WREAL1 首批固定为 1 名真实员工 + 1 名审批人/管理员观察;WREAL1 通过后优先规划 `wecom_attendance_approval_mirror_v1` 最小完整镜像,不先做应急接管、恢复回写或 RuleOps。
- WTCLOSE1/WTCLOSE2 后小团队审批规则按一层主管/指定审批角色 + 管理员兜底执行;2026-05-21 用户已真机确认请假、补卡、外出、加班四类模板均达到 A;若后续模板回退为 B/C/D,立即暂停 WEXT1-LIVE 或 WREAL1。 - WTCLOSE1/WTCLOSE2 后小团队审批规则按一层主管/指定审批角色 + 管理员兜底执行;2026-05-21 用户已真机确认请假、补卡、外出、加班四类模板均达到 A;若后续模板回退为 B/C/D,立即暂停 WEXT1-FORMAL 或 WREAL1。
- WRULE1 后,WAPPR1 仍是人工规则门禁;WRULE1 只把已提交审批链和 OA 理论审批人自动对账。`PASS_RULE_MATCH` 或可解释 `PASS_WITH_ADMIN_FALLBACK` 才能继续测试号收口;`FAIL_APPLICANT_CAN_CHOOSE`、`FAIL_SELF_APPROVAL`、`FAIL_APPROVER_MISMATCH` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG` 均阻断 WEXT1-LIVE、WREAL1 和最小完整镜像。 - WRULE1 后,WAPPR1 仍是人工规则门禁;WRULE1 只把已提交审批链和 OA 理论审批人自动对账。`PASS_RULE_MATCH` 或可解释 `PASS_WITH_ADMIN_FALLBACK` 才能继续测试号收口;`FAIL_APPLICANT_CAN_CHOOSE`、`FAIL_SELF_APPROVAL`、`FAIL_APPROVER_MISMATCH` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG` 均阻断 WEXT1-FORMAL、WREAL1 和最小完整镜像。
- 企业微信自建应用不按完整隔离 sandbox 处理;后续默认使用真实企业内受控测试域、本地 synthetic 自动测试、公网 live runner 和少量真机确认。 - 企业微信自建应用不按完整隔离 sandbox 处理;后续默认使用真实企业内受控测试域、本地 synthetic 自动测试、公网 live runner 和少量真机确认。
- 阶段未满足退出条件前不得跳阶段。线上缺陷、安全风险、正式使用阻断或真实反馈可以另开独立 Issue CSV,但不得混入企微 HR/考勤主路线。 - 阶段未满足退出条件前不得跳阶段。线上缺陷、安全风险、正式使用阻断或真实反馈可以另开独立 Issue CSV,但不得混入企微 HR/考勤主路线。
- ERP 未来不接入 OA;真实支付、图片 OCR、银行流水导入、复杂 BPM、审批设计器、重预算和其他 P2 大功能继续冻结,试用期只处理阻断和真实反馈。 - ERP 未来不接入 OA;真实支付、图片 OCR、银行流水导入、复杂 BPM、审批设计器、重预算和其他 P2 大功能继续冻结,试用期只处理阻断和真实反馈。
@@ -54,7 +55,7 @@
| `WAPC1` | 配置准备清单已固化 | WMSG1 后的下一步改为审批配置准备清单:首批关注请假、补卡、外出、加班模板;准备模板 ID、低风险测试 `sp_no`、真实回调 URL/Token/EncodingAESKey 和后续 POC 准入项。本阶段不接真实回调、不调用写接口、不进入深度镜像。 | | `WAPC1` | 配置准备清单已固化 | WMSG1 后的下一步改为审批配置准备清单:首批关注请假、补卡、外出、加班模板;准备模板 ID、低风险测试 `sp_no`、真实回调 URL/Token/EncodingAESKey 和后续 POC 准入项。本阶段不接真实回调、不调用写接口、不进入深度镜像。 |
| `WAPC2` | 已部署并公网只读复跑 | 新增 QA-only `npm run check:wecom-approval-poc`,范围先锁定请假和补卡;固定 `WECOM_AGENT_SECRET` 调用 `POST /cgi-bin/oa/gettemplatedetail` 与 `POST /cgi-bin/oa/getapprovaldetail`,报告只输出脱敏模板 ID/`sp_no` 前缀、字段/节点计数和错误分类。公网报告 `/app/artifacts/qa-flow/wecom-approval-poc-20260519T020429Z/summary.json` 为 `PARTIAL_APPROVAL_POC_NEEDS_CONFIG`:Secret 可用,但缺请假/补卡模板 ID 和两条低风险 `sp_no`,未伪造成 PASS。 | | `WAPC2` | 已部署并公网只读复跑 | 新增 QA-only `npm run check:wecom-approval-poc`,范围先锁定请假和补卡;固定 `WECOM_AGENT_SECRET` 调用 `POST /cgi-bin/oa/gettemplatedetail` 与 `POST /cgi-bin/oa/getapprovaldetail`,报告只输出脱敏模板 ID/`sp_no` 前缀、字段/节点计数和错误分类。公网报告 `/app/artifacts/qa-flow/wecom-approval-poc-20260519T020429Z/summary.json` 为 `PARTIAL_APPROVAL_POC_NEEDS_CONFIG`:Secret 可用,但缺请假/补卡模板 ID 和两条低风险 `sp_no`,未伪造成 PASS。 |
| `WPROC1` | 路线与流程门禁已修正 | 固化三层门禁、Definition of Ready、Definition of Done、自动化优先和非自审规则。WAPC2F 默认测试链为 `SMOKE002 -> SMOKE101`,若 `SMOKE101` 不可用,不自动换人,先问答确认;后续当前顺序以 WEGOV1 行和阶段表为准。 | | `WPROC1` | 路线与流程门禁已修正 | 固化三层门禁、Definition of Ready、Definition of Done、自动化优先和非自审规则。WAPC2F 默认测试链为 `SMOKE002 -> SMOKE101`,若 `SMOKE101` 不可用,不自动换人,先问答确认;后续当前顺序以 WEGOV1 行和阶段表为准。 |
| `WPROC2` | 流程自动化门禁已新增 | 新增 `scripts/qa/check-process-contract.mjs`,把 WPROC1 的三层门禁、DoR/DoD、自动化优先、非自审、Secret 固定、live 写入开关、缺配置分类和脱敏边界升级为可执行 process gate;WAPC2F 实施前必须先通过 baseline gate 和 `wecom-approval-fixture` profile。 | | `WPROC2` | 流程自动化门禁已新增 | 新增 `scripts/qa/check-process-contract.mjs`,把 WPROC1 的三层门禁、DoR/DoD、自动化优先、非自审、Secret 固定、正式模板人工测试开关、缺配置分类和脱敏边界升级为可执行 process gate;WAPC2F 实施前必须先通过 baseline gate 和 `wecom-approval-fixture` profile。 |
| `WAPC2F` | 已实现并公网 dry-run 通过 | 新增 QA-only `npm run check:wecom-approval-fixtures`,固定 `WECOM_AGENT_SECRET` 构建 OA-POC 请假/补卡最小通用模板和低风险审批申请 payload;默认 dry-run 不获取写入 token、不调用企微写接口。公网报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`:`SMOKE002 -> SMOKE101` active、已绑定、非自审。 | | `WAPC2F` | 已实现并公网 dry-run 通过 | 新增 QA-only `npm run check:wecom-approval-fixtures`,固定 `WECOM_AGENT_SECRET` 构建 OA-POC 请假/补卡最小通用模板和低风险审批申请 payload;默认 dry-run 不获取写入 token、不调用企微写接口。公网报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`:`SMOKE002 -> SMOKE101` active、已绑定、非自审。 |
| `WAPC2FLIVE` | 已完成 live 创建与 WAPC2 自动复跑 | 用户批准后执行一次 live 创建窗口:第一次旧 payload 返回 `301086` 且未创建任何模板或审批单;修正为官方 `template_name` + `property` controls 后,远端报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`,已创建 OA-POC 请假/补卡测试模板和低风险测试审批单,`checks.autoRerun.status=OK` 且 `PASS_APPROVAL_POC`。测试模板和测试审批记录保留审计,不自动删除;仍不放行深度镜像。 | | `WAPC2FLIVE` | 已完成 live 创建与 WAPC2 自动复跑 | 用户批准后执行一次 live 创建窗口:第一次旧 payload 返回 `301086` 且未创建任何模板或审批单;修正为官方 `template_name` + `property` controls 后,远端报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`,已创建 OA-POC 请假/补卡测试模板和低风险测试审批单,`checks.autoRerun.status=OK` 且 `PASS_APPROVAL_POC`。测试模板和测试审批记录保留审计,不自动删除;仍不放行深度镜像。 |
| `WCBK1` | 真实回调 URL 与事件已确认 | 新增只读 `GET/POST /api/wecom/approval/callback`、`npm run check:wecom-approval-callback-poc` 和 `wecom-callback` process gate。远端配置回调 URL、Token 和 EncodingAESKey 后,live runner 报告 `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T083422Z/summary.json` 达到 `PASS_CALLBACK_URL_VERIFIED`;用户随后由 `SMOKE101` 同意一条现有 OA-POC 补卡测试审批单,复跑报告 `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T092648Z/summary.json` 达到 `PASS_CALLBACK_EVENT_CONFIRMED`,脱敏证据记录 `eventCount=1`、状态 `已通过`。 | | `WCBK1` | 真实回调 URL 与事件已确认 | 新增只读 `GET/POST /api/wecom/approval/callback`、`npm run check:wecom-approval-callback-poc` 和 `wecom-callback` process gate。远端配置回调 URL、Token 和 EncodingAESKey 后,live runner 报告 `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T083422Z/summary.json` 达到 `PASS_CALLBACK_URL_VERIFIED`;用户随后由 `SMOKE101` 同意一条现有 OA-POC 补卡测试审批单,复跑报告 `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T092648Z/summary.json` 达到 `PASS_CALLBACK_EVENT_CONFIRMED`,脱敏证据记录 `eventCount=1`、状态 `已通过`。 |
@@ -67,14 +68,14 @@
| `WROAD2+OPS` | 受控上线和每日巡检 Day 0 已完成 | 当前进入测试账号受控上线:范围固定 `SMOKE002 -> SMOKE101`,管理员观察和告警员工号固定 `HYD000006`,即管理员 `wangshunli` 的 employee_no;脚本不再把姓名字符串 `wangshunli` 当员工号。试用 3 天,每日触发一键巡检脚本。巡检复用 `/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 为缺 live smoke 登录凭据/pending OCR 子检查异常以及历史 callback gap,按已知 observation 不阻断测试账号受控试用。 | | `WROAD2+OPS` | 受控上线和每日巡检 Day 0 已完成 | 当前进入测试账号受控上线:范围固定 `SMOKE002 -> SMOKE101`,管理员观察和告警员工号固定 `HYD000006`,即管理员 `wangshunli` 的 employee_no;脚本不再把姓名字符串 `wangshunli` 当员工号。试用 3 天,每日触发一键巡检脚本。巡检复用 `/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 为缺 live smoke 登录凭据/pending OCR 子检查异常以及历史 callback gap,按已知 observation 不阻断测试账号受控试用。 |
| `WARCH3` | 归档稳定化自动巡检已实现 | 新增 `scripts/qa/run-warch3-ops-daily.sh` 聚合 WROAD2 子报告、归类 observation/finding、解释历史 callback gap,并新增 `deploy/trialrun/install-warch3-ops-timer.sh` 安装服务器 `systemd service/timer`,每天 07:30 触发;WOPS1 后巡检告警默认只发 `HYD000006`,由 `npm run send:wecom-ops-alert` 读取状态文件判断新增 finding 或状态恶化,已知 finding 不重复告警。仍只允许补偿归档写 OA DB,不写企业微信、不创建模板或审批单。 | | `WARCH3` | 归档稳定化自动巡检已实现 | 新增 `scripts/qa/run-warch3-ops-daily.sh` 聚合 WROAD2 子报告、归类 observation/finding、解释历史 callback gap,并新增 `deploy/trialrun/install-warch3-ops-timer.sh` 安装服务器 `systemd service/timer`,每天 07:30 触发;WOPS1 后巡检告警默认只发 `HYD000006`,由 `npm run send:wecom-ops-alert` 读取状态文件判断新增 finding 或状态恶化,已知 finding 不重复告警。仍只允许补偿归档写 OA DB,不写企业微信、不创建模板或审批单。 |
| `WCHECK1` | 打卡摘要留存已实现 | 新增打卡日/月摘要和规则快照留存表、`wecomCheckinArchive` 服务和 `npm run check:wecom-checkin-summary-archive` runner。保存规范化打卡明细、日/月摘要、异常摘要、规则快照摘要和 hash;报告只输出计数、状态、异常摘要和脱敏 userid 前缀,不保存完整位置、人脸、设备明文或原始 payload。 | | `WCHECK1` | 打卡摘要留存已实现 | 新增打卡日/月摘要和规则快照留存表、`wecomCheckinArchive` 服务和 `npm run check:wecom-checkin-summary-archive` runner。保存规范化打卡明细、日/月摘要、异常摘要、规则快照摘要和 hash;报告只输出计数、状态、异常摘要和脱敏 userid 前缀,不保存完整位置、人脸、设备明文或原始 payload。 |
| `WEXT1` | 外出/加班 dry-run 已实现 | 扩展 `npm run check:wecom-approval-fixtures` 支持 `--target=outing --target=overtime`,只构建 OA-POC 外出/加班最小通用模板和低风险审批申请 payload,仍默认 dry-run。已锁定后续 live 范围为外出+加班两类一起创建、样件保留审计、`SMOKE101` 真机确认,但必须等 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WRULE1、WAUTO1/WEXT1LD、WFULLSMOKE1 和 WTCLOSE2 可解释通过后另起 `WEXT1-LIVE` 合同。 | | `WEXT1` | 外出/加班 dry-run 已实现 | 扩展 `npm run check:wecom-approval-fixtures` 支持 `--target=outing --target=overtime`,只构建 OA-POC 外出/加班最小通用模板和低风险审批申请 payload,仍默认 dry-run。WREMOTE1 后后续路线改为正式模板人工提交:`SMOKE002` 真机提交外出/加班测试单、`SMOKE101` 先看详情再审批,系统只读校验。 |
| `WOPS1` | 巡检告警降噪已公网验证 | 将 WARCH3 告警从“有 finding 就发”改为“阻断、失败、新增 finding 或状态恶化才发”;默认收件员工号 `HYD000006`。远端二次触发报告 `/app/artifacts/qa-flow/wecom-ops-alert-20260520T070740Z/summary.json` 为 `PASS_ALERT_SKIPPED_NO_FINDINGS`,原因 `no_new_findings_or_status_worsening`;状态文件只保存脱敏状态、finding 摘要和报告路径。 | | `WOPS1` | 巡检告警降噪已公网验证 | 将 WARCH3 告警从“有 finding 就发”改为“阻断、失败、新增 finding 或状态恶化才发”;默认收件员工号 `HYD000006`。远端二次触发报告 `/app/artifacts/qa-flow/wecom-ops-alert-20260520T070740Z/summary.json` 为 `PASS_ALERT_SKIPPED_NO_FINDINGS`,原因 `no_new_findings_or_status_worsening`;状态文件只保存脱敏状态、finding 摘要和报告路径。 |
| `WROAD2-CLOSEOUT` | 三天验收采集中 | Day 1/2/3 继续由 WARCH3 timer 采集;已知 observation(live smoke 凭据、pending OCR、历史 callback gap)可接受但要保留趋势;三天结束后只在异常或验收点问答,若通过则进入 `WEXT1-LIVE` 合同,不直接启用真实员工。 | | `WROAD2-CLOSEOUT` | 三天验收采集中 | Day 1/2/3 继续由 WARCH3 timer 采集;已知 observation(live smoke 凭据、pending OCR、历史 callback gap)可接受但要保留趋势;三天结束后只在异常或验收点问答,若通过则进入 `WEXT1-FORMAL` 合同,不直接启用真实员工。 |
| `WROAD2-BIZ1` | 三天人工业务冒烟已建档 | 三天内并行补充测试账号业务动作:`SMOKE002` 每天按规则尝试企微打卡,提交低风险请假/补卡;`SMOKE101` 先看详情再审批;`HYD000006` 每天查看 OA 归档历史和打卡摘要。人工业务冒烟不替代 WARCH3 自动巡检,不写企业微信,不启用真实员工。 | | `WROAD2-BIZ1` | 三天人工业务冒烟已建档 | 三天内并行补充测试账号业务动作:`SMOKE002` 每天按规则尝试企微打卡,提交低风险请假/补卡;`SMOKE101` 先看详情再审批;`HYD000006` 每天查看 OA 归档历史和打卡摘要。人工业务冒烟不替代 WARCH3 自动巡检,不写企业微信,不启用真实员工。 |
| `WAPPR1` | 人工规则门禁已通过 | 用户先发现补卡可编辑审批人、请假/外出/加班提示指定上级为空;2026-05-21 设置测试员工直属上级为测试主管并调整模板后,用户真机确认请假、补卡、外出、加班均为 A:自动带出测试主管且申请人不能编辑审批人。该结论仍需后续 WRULE1 校验实际审批链,不自动授权 WEXT1-LIVE 或 WREAL1。 | | `WAPPR1` | 人工规则门禁已通过 | 用户先发现补卡可编辑审批人、请假/外出/加班提示指定上级为空;2026-05-21 设置测试员工直属上级为测试主管并调整模板后,用户真机确认请假、补卡、外出、加班均为 A:自动带出测试主管且申请人不能编辑审批人。该结论仍需后续 WRULE1 校验实际审批链,不自动授权 WEXT1-FORMAL 或 WREAL1。 |
| `WAUTO1` | 自动证据汇总已实现 | 新增 `scripts/qa/collect-wecom-controlled-trial-evidence.sh`,只读汇总 WROAD2/WARCH3/WCHECK1/WROAD2-BIZ1/WAPPR1/WEXT1 dry-run 证据,并复跑 `/ready`、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描。脚本默认不写 OA DB、不写企业微信、不创建模板或审批单,结论限定为 `PASS_AUTO_EVIDENCE_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 | | `WAUTO1` | 自动证据汇总已实现 | 新增 `scripts/qa/collect-wecom-controlled-trial-evidence.sh`,只读汇总 WROAD2/WARCH3/WCHECK1/WROAD2-BIZ1/WAPPR1/WEXT1 dry-run 证据,并复跑 `/ready`、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描。脚本默认不写 OA DB、不写企业微信、不创建模板或审批单,结论限定为 `PASS_AUTO_EVIDENCE_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 |
| `WEXT1LD` | 外出/加班 live 前 dry-run gate 已实现 | 新增独立 dry-run 合同,远端只执行外出+加班 payload dry-run;固定 `SMOKE002 -> SMOKE101` 和 `WECOM_AGENT_SECRET`,不尝试其他 Secret,不设置写入双开关。dry-run 通过后仍必须问答选择是否一次性 live 创建样件、只保留 dry-run 或移出 V1。 | | `WEXT1LD` | 外出/加班 live 前 dry-run gate 已实现 | 新增独立 dry-run 合同,远端只执行外出+加班 payload dry-run;固定 `SMOKE002 -> SMOKE101` 和 `WECOM_AGENT_SECRET`,不尝试其他 Secret,不设置写入双开关。dry-run 通过后不自动创建模板或审批单;下一步按 WEXT1-FORMAL 问答决定是否人工提交正式模板测试单。 |
| `WFULLSMOKE1` | 三天全域最终目标测试已建档 | 新增总控合同和 `scripts/qa/run-three-day-full-goal-smoke.sh`,聚合企微 HR/考勤、OA 报销、采购、合同/项目、付款批次、移动端和运维巡检。脚本可在具备凭据且未关闭写入时创建带 `TEST/SMOKE/WFULL` 标记的 OA 测试业务数据;不写企业微信、不创建外出/加班样件、不启用真实员工、不做真实付款、不接真实支付、不写 ERP、不导入银行流水。 | | `WFULLSMOKE1` | 三天全域最终目标测试已建档 | 新增总控合同和 `scripts/qa/run-three-day-full-goal-smoke.sh`,聚合企微 HR/考勤、OA 报销、采购、合同/项目、付款批次、移动端和运维巡检。脚本可在具备凭据且未关闭写入时创建带 `TEST-SMOKE-WFULL` 标记的 OA 测试业务数据;不写企业微信、不创建外出/加班样件、不启用真实员工、不做真实付款、不接真实支付、不写 ERP、不导入银行流水。 |
| `WREAL1-PREP / WROUTE2` | 真实小范围试用准备和路线锁定已固化 | 只固化候选员工条件、非自审审批人条件、回滚联系人、允许流程、暂停条件和验收标准;当前继续测试账号,四类测试号证据、WAPPR1 审批规则门禁和 WFULLSMOKE1 可解释通过后才问是否启动真实小范围试用;首批真实试用固定为 1 名真实员工 + 1 名审批人/管理员观察。 | | `WREAL1-PREP / WROUTE2` | 真实小范围试用准备和路线锁定已固化 | 只固化候选员工条件、非自审审批人条件、回滚联系人、允许流程、暂停条件和验收标准;当前继续测试账号,四类测试号证据、WAPPR1 审批规则门禁和 WFULLSMOKE1 可解释通过后才问是否启动真实小范围试用;首批真实试用固定为 1 名真实员工 + 1 名审批人/管理员观察。 |
## 3. 阶段路线 ## 3. 阶段路线
@@ -97,23 +98,24 @@
| 14 | `WROAD2+OPS 受控上线与每日巡检` | 把 WARCH2 后的能力先放入测试账号受控使用,用每日脚本化巡检验证入口、运行、补偿归档和 OA 离线查询稳定性。 | WARCH2 公网验证完成;用户选择先受控上线、不直接深镜像;允许 `SYNC_ENV=0` 部署和补偿归档写 OA DB。 | Day 0 公网巡检已生成 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json`,结论 `PASS_WITH_FINDINGS`;后续以 WARCH3 systemd timer 承接每日巡检。脚本不写企业微信、不创建样件;发现缺配置时真实记录 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 | | 14 | `WROAD2+OPS 受控上线与每日巡检` | 把 WARCH2 后的能力先放入测试账号受控使用,用每日脚本化巡检验证入口、运行、补偿归档和 OA 离线查询稳定性。 | WARCH2 公网验证完成;用户选择先受控上线、不直接深镜像;允许 `SYNC_ENV=0` 部署和补偿归档写 OA DB。 | Day 0 公网巡检已生成 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json`,结论 `PASS_WITH_FINDINGS`;后续以 WARCH3 systemd timer 承接每日巡检。脚本不写企业微信、不创建样件;发现缺配置时真实记录 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 |
| 15 | `WARCH3 归档稳定化` | 稳定每日补偿、归档对账 finding、历史查询可用性、旧 callback gap 解释和报告趋势。 | WROAD2+OPS Day 0 和用户批准 systemd timer。 | 已新增 WARCH3 汇总脚本、脱敏企微告警和 07:30 systemd timer 安装脚本;WOPS1 后默认收件员工号为 `HYD000006`,已知 finding 不重复告警;每日归档报告可解释,live smoke/OCR 仅作 observation。公网安装和 Day 1/2/3 汇总仍按 WARCH3/WROAD2 证据回填。 | | 15 | `WARCH3 归档稳定化` | 稳定每日补偿、归档对账 finding、历史查询可用性、旧 callback gap 解释和报告趋势。 | WROAD2+OPS Day 0 和用户批准 systemd timer。 | 已新增 WARCH3 汇总脚本、脱敏企微告警和 07:30 systemd timer 安装脚本;WOPS1 后默认收件员工号为 `HYD000006`,已知 finding 不重复告警;每日归档报告可解释,live smoke/OCR 仅作 observation。公网安装和 Day 1/2/3 汇总仍按 WARCH3/WROAD2 证据回填。 |
| 16 | `WCHECK1 打卡摘要留存` | 保存规范化打卡明细、日/月摘要、异常摘要和规则快照。 | WROAD2+OPS 或 WARCH3 证明审批归档稳定;打卡只读 API 和权限仍可用。 | 已新增摘要表、规则快照、归档服务和 QA runner;OA 可查看必要打卡摘要和异常摘要;不保存完整位置、人脸、设备明文或原始 payload。 | | 16 | `WCHECK1 打卡摘要留存` | 保存规范化打卡明细、日/月摘要、异常摘要和规则快照。 | WROAD2+OPS 或 WARCH3 证明审批归档稳定;打卡只读 API 和权限仍可用。 | 已新增摘要表、规则快照、归档服务和 QA runner;OA 可查看必要打卡摘要和异常摘要;不保存完整位置、人脸、设备明文或原始 payload。 |
| 17 | `WEXT1 外出/加班 dry-run` | 自动生成外出/加班低风险 POC 样件 payload,但不 live 创建。 | 用户批准先做 dry-run。 | 已扩展 WAPC2F runner 支持 `outing`、`overtime` dry-run;非自审、Secret 固定和脱敏报告沿用既有门禁。live 创建模板/审批单前必须再次问答批准。 | | 17 | `WEXT1 外出/加班 dry-run` | 自动生成外出/加班低风险 POC 样件 payload,但不 live 创建。 | 用户批准先做 dry-run。 | 已扩展 WAPC2F runner 支持 `outing`、`overtime` dry-run;非自审、Secret 固定和脱敏报告沿用既有门禁。WREMOTE1 后不再用该路径自动创建外出/加班模板或审批单。 |
| 18 | `WOPS1 巡检告警降噪` | 修正管理员告警收件人和重复 finding 告警策略。 | 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`;默认收件员工号 `HYD000006`,重复已知 finding 不发送。 | | 18 | `WOPS1 巡检告警降噪` | 修正管理员告警收件人和重复 finding 告警策略。 | 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`;默认收件员工号 `HYD000006`,重复已知 finding 不发送。 |
| 19 | `WROAD2-CLOSEOUT 三天验收` | 汇总 Day 0/1/2/3 巡检报告,决定是否进入外出/加班 live POC。 | WOPS1 本地和公网验证通过;WARCH3 timer 正常。 | 输出 `PASS_CONTROLLED_OPS_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`,并结合 WROAD2-BIZ1 人工业务冒烟结果问答确认。 | | 19 | `WROAD2-CLOSEOUT 三天验收` | 汇总 Day 0/1/2/3 巡检报告,决定是否进入正式模板外出/加班测试。 | WOPS1 本地和公网验证通过;WARCH3 timer 正常。 | 输出 `PASS_CONTROLLED_OPS_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`,并结合 WROAD2-BIZ1 人工业务冒烟结果问答确认。 |
| 20 | `WROAD2-BIZ1 三天业务冒烟` | 在测试账号范围补充真实业务动作:打卡、请假、补卡、OA 离线查看,并为外出/加班 live POC 准备人工验收清单。 | 用户选择三天内测试更多业务;仍限定测试账号。 | 输出 `PASS_BUSINESS_SMOKE_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;不写企微、不创建外出/加班样件。 | | 20 | `WROAD2-BIZ1 三天业务冒烟` | 在测试账号范围补充真实业务动作:打卡、请假、补卡、OA 离线查看,并为外出/加班正式模板测试准备人工验收清单。 | 用户选择三天内测试更多业务;仍限定测试账号。 | 输出 `PASS_BUSINESS_SMOKE_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;不写企微、不创建外出/加班样件。 |
| 21 | `WAPPR1 审批规则规范化门禁` | 统一企微 HR/考勤审批人规则,禁止申请人任意选择审批人。 | 发现补卡申请需要手动选择审批人;用户要求审批规则按规范自动化;官方 API 不支持只读读取原生模板审批规则。 | 四类模板按模板给出 `PASS_APPROVER_RULES_READY`、`PASS_WITH_TEMPLATE_ADJUSTMENTS`、`FAIL_KEEP_OA_PRIMARY_FOR_THIS_TEMPLATE` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;规则不通过不得进入真实试用。WAPPR1 必须保留后台人工确认和真机提交页确认,API 只校验提交后的实际审批链。 | | 21 | `WAPPR1 审批规则规范化门禁` | 统一企微 HR/考勤审批人规则,禁止申请人任意选择审批人。 | 发现补卡申请需要手动选择审批人;用户要求审批规则按规范自动化;官方 API 不支持只读读取原生模板审批规则。 | 四类模板按模板给出 `PASS_APPROVER_RULES_READY`、`PASS_WITH_TEMPLATE_ADJUSTMENTS`、`FAIL_KEEP_OA_PRIMARY_FOR_THIS_TEMPLATE` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;规则不通过不得进入真实试用。WAPPR1 必须保留后台人工确认和真机提交页确认,API 只校验提交后的实际审批链。 |
| 22 | `WRULE1 企微 HR/考勤审批链校验器 POC` | OA 按单一组织规则计算理论审批人,对比企微已提交审批链,防止两套规则或自审。 | WAPPR1 已建档;已存在 OA 自建审批归档和员工主管链/角色数据;用户选择单规则双域。 | 新增 `check:wecom-approval-rule-validator`,默认只读 OA DB、不调用企微、不写 OA/企微。结论限定 `PASS_RULE_MATCH`、`PASS_WITH_ADMIN_FALLBACK`、`FAIL_APPLICANT_CAN_CHOOSE`、`FAIL_SELF_APPROVAL`、`FAIL_APPROVER_MISMATCH`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 | | 22 | `WRULE1 企微 HR/考勤审批链校验器 POC` | OA 按单一组织规则计算理论审批人,对比企微已提交审批链,防止两套规则或自审。 | WAPPR1 已建档;已存在 OA 自建审批归档和员工主管链/角色数据;用户选择单规则双域。 | 新增 `check:wecom-approval-rule-validator`,默认只读 OA DB、不调用企微、不写 OA/企微。结论限定 `PASS_RULE_MATCH`、`PASS_WITH_ADMIN_FALLBACK`、`FAIL_APPLICANT_CAN_CHOOSE`、`FAIL_SELF_APPROVAL`、`FAIL_APPROVER_MISMATCH`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 |
| 23 | `WAUTO1 受控试用证据自动汇总` | 自动汇总三天受控试用证据,准备 WAPPR1 人工确认和 WEXT1-LIVE 问答。 | WROAD2-BIZ1/WAPPR1/WRULE1 已建档,用户要求能自动执行的全部脚本化。 | 新脚本默认只读,不触发补偿归档写库,不写企微;输出脱敏 summary 和 WAPPR1 人工清单。 | | 23 | `WAUTO1 受控试用证据自动汇总` | 自动汇总三天受控试用证据,准备 WAPPR1 人工确认和 WEXT1-FORMAL 问答。 | WROAD2-BIZ1/WAPPR1/WRULE1 已建档,用户要求能自动执行的全部脚本化。 | 新脚本默认只读,不触发补偿归档写库,不写企微;输出脱敏 summary 和 WAPPR1 人工清单。 |
| 24 | `WEXT1LD 外出/加班 live 前 dry-run gate` | 在 live 创建前远端只执行外出/加班 dry-run。 | WEXT1 dry-run runner 已存在;用户要求 live 前先自动 dry-run。 | 不带 live 写入参数;通过后只进入问答,不自动创建模板或审批单。 | | 24 | `WEXT1LD 外出/加班 live 前 dry-run gate` | 在正式模板测试前远端只执行外出/加班 dry-run。 | WEXT1 dry-run runner 已存在;用户要求 live 前先自动 dry-run。 | 不带 live 写入参数;通过后只进入 WEXT1-FORMAL 问答,不自动创建模板或审批单。 |
| 25 | `WFULLSMOKE1 三天全域最终目标测试` | 汇总企微 HR/考勤、OA 报销、采购、合同/项目、付款批次、移动/企微入口和运维巡检主路径。 | 用户要求三天内测试整个项目最终目标;WROAD2/WARCH3/WCHECK1/WROAD2-BIZ1/WAPPR1/WRULE1/WAUTO1/WEXT1LD 已建立。 | 输出 `PASS_FULL_GOAL_SMOKE_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;只允许 `TEST/SMOKE/WFULL` OA 测试数据,不写企微、不真实付款、不写 ERP、不导入银行流水。 | | 25 | `WFULLSMOKE1 三天全域最终目标测试` | 汇总企微 HR/考勤、OA 报销、采购、合同/项目、付款批次、移动/企微入口和运维巡检主路径。 | 用户要求三天内测试整个项目最终目标;WROAD2/WARCH3/WCHECK1/WROAD2-BIZ1/WAPPR1/WRULE1/WAUTO1/WEXT1LD 已建立。 | 输出 `PASS_FULL_GOAL_SMOKE_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;只允许 `TEST-SMOKE-WFULL` OA 测试数据,不写企微、不真实付款、不写 ERP、不导入银行流水。 |
| 26 | `WREAL1-PREP / WROUTE2 真实试用准备和路线锁定` | 固化候选员工、审批人、允许流程、暂停条件、回滚联系人和验收标准,不启用真实员工,并锁定测试号收口到最小完整镜像的后续顺序。 | 用户选择先收口测试账号,不提前启用真实员工。 | 文档和合同明确真实试用需等四类测试号证据、WAPPR1/WRULE1 审批规则门禁和 WFULLSMOKE1 可解释通过后再问;当前继续测试账号,首批真实试用固定为 1 名真实员工 + 1 名审批人/管理员观察。 | | 26 | `WREAL1-PREP / WROUTE2 真实试用准备和路线锁定` | 固化候选员工、审批人、允许流程、暂停条件、回滚联系人和验收标准,不启用真实员工,并锁定测试号收口到最小完整镜像的后续顺序。 | 用户选择先收口测试账号,不提前启用真实员工。 | 文档和合同明确真实试用需等四类测试号证据、WAPPR1/WRULE1 审批规则门禁和 WFULLSMOKE1 可解释通过后再问;当前继续测试账号,首批真实试用固定为 1 名真实员工 + 1 名审批人/管理员观察。 |
| 27 | `WTCLOSE2/WTCLOSE2F 测试号最终收口与证据复核` | 在部署服务器可信 IP 上自动复跑测试号收口证据,确认是否可以进入 WEXT1-LIVE 问答。 | WAPPR1 四类模板均为 A;WRULE1 已实现;WAUTO1/WEXT1LD/WFULLSMOKE1 已存在;远端代码与本地合同同步。 | 通过 `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote` 输出 `PASS_TEST_ACCOUNT_CLOSEOUT_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;不写企业微信、不创建样件、不启用真实员工;本地直接执行不作为业务证据。 | | 27 | `WTCLOSE2/WTCLOSE2F 测试号最终收口与证据复核` | 在部署服务器可信 IP 上自动复跑测试号收口证据,确认是否可以进入 WREMOTE1/WFULLSMOKE2 和 WEXT1-FORMAL 问答。 | WAPPR1 四类模板均为 A;WRULE1 已实现;WAUTO1/WEXT1LD/WFULLSMOKE1 已存在;远端代码与本地合同同步。 | 通过 `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote` 输出 `PASS_TEST_ACCOUNT_CLOSEOUT_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;不写企业微信、不创建样件、不启用真实员工;本地直接执行不作为业务证据。 |
| 28 | `WEXT1-LIVE 外出/加班测试号 live POC` | 单次创建外出+加班 OA-POC 模板和低风险测试审批单,并做真机可读性和审批规则确认。 | WTCLOSE2 可解释通过;新建独立 Issue CSV;再次说明会留下的企微记录并取得人工确认。 | 两类样件保留审计;固定 `SMOKE002 -> SMOKE101`、`WECOM_AGENT_SECRET` 和双开关;只保存脱敏 template/`sp_no`/userid 前缀;`SMOKE101` 真机确认消息、列表、详情、按钮风险和审批人是否自动带出。 | | 28 | `WREMOTE1/WFULLSMOKE2 远端收口和全域 smoke` | 从部署服务器可信 IP 执行 WTCLOSE2,再远端运行允许 `TEST-SMOKE-WFULL` OA 测试数据的全域 smoke。 | WTCLOSE2F 已完成;允许 `SYNC_ENV=0` 部署;用户批准 OA 主办域公网测试数据。 | 远端报告输出 `PASS_TEST_ACCOUNT_CLOSEOUT_READY`、`PASS_FULL_GOAL_SMOKE_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或真实 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;不写企业微信、不启用真实员工。 |
| 29 | `WREAL1 小范围真实试用` | 在 1 名真实员工 + 1 名审批人/管理员观察范围验证企微主办 HR/考勤和 OA 留存。 | 请假、补卡、外出、加班四类测试号证据通过;WAPPR1/WRULE1 规则门禁通过;WTCLOSE2 和 WEXT1-LIVE 可解释通过;用户通过问答确认真实员工、审批人、试用周期、暂停条件和回滚联系人。 | 试用报告可解释通过或暂停;仍不直接全员推广。 | | 29 | `WEXT1-FORMAL 正式模板外出/加班测试` | 使用现有正式外出/加班模板,由测试账号人工提交,系统只读校验补偿、归档和审批链。 | WREMOTE1/WFULLSMOKE2 可解释通过;再次问答确认人工提交窗口。 | 不创建 OA-POC 模板、不自动提交审批单;`SMOKE002` 提交,`SMOKE101` 先看详情再审批;若可改审批人、自审或审批链不符,阻断 WREAL1。 |
| 30 | `wecom_attendance_approval_mirror_v1 最小完整镜像` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA。 | WREAL1 通过后优先规划;不得仅凭测试号证据进入,也不先做应急接管、恢复回写或 RuleOps。 | OA 可查询企微 HR/考勤镜像、附件摘要、审批历史、考勤解释和审计;不把 OA 主办高敏审批迁到企微。 | | 30 | `WREAL1 小范围真实试用` | 在 1 名真实员工 + 1 名审批人/管理员观察范围验证企微主办 HR/考勤和 OA 留存。 | 请假、补卡、外出、加班四类测试号证据通过;WAPPR1/WRULE1 规则门禁通过;WREMOTE1/WFULLSMOKE2/WEXT1-FORMAL 可解释通过;用户通过 `/tmp/hyb-oa-wreal1.env` 提供真实员工和审批人。 | 试用报告可解释通过或暂停;仍不直接全员推广。 |
| 31 | `oa_hr_emergency_mode_v1` | 企业微信不可用时,由管理员人工开启 OA HR/考勤应急接管。 | 自建历史留存和镜像数据可支撑对账;OA 应急入口、权限和审计方案明确。 | 管理员可填写原因、范围、预计结束时间和责任人后开启/关闭;应急单据带 `EMERGENCY` 标记。 | | 31 | `wecom_attendance_approval_mirror_v1 最小完整镜像` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA。 | WREAL1 通过后优先规划;不得仅凭测试号证据进入,也不先做应急接管、恢复回写或 RuleOps。 | OA 可查询企微 HR/考勤镜像、附件摘要、审批历史、考勤解释和审计;不把 OA 主办高敏审批迁到企微。 |
| 32 | `wecom_recovery_writeback_v1` | 企微恢复后,OA 应急数据先 dry-run,再回写企微。 | 应急接管模式完成;企微写回接口、冲突规则和回滚策略已单独批准。 | 系统生成成功、失败、跳过和冲突清单;无冲突项可自动回写,冲突进入人工确认。 | | 32 | `oa_hr_emergency_mode_v1` | 企业微信不可用时,由管理员人工开启 OA HR/考勤应急接管。 | 自建历史留存和镜像数据可支撑对账;OA 应急入口、权限和审计方案明确。 | 管理员可填写原因、范围、预计结束时间和责任人后开启/关闭;应急单据带 `EMERGENCY` 标记。 |
| 33 | `wecom_ruleops_v1` | AI 草拟企微规则、生成差异报告和 dry-run,人工确认后写入企微。 | 前述同步/回写链路稳定;企微规则 API 能力和权限已验证。 | 每次写入保存前后快照、确认人、API `errcode`、失败原因、回滚建议和审计记录。 | | 33 | `wecom_recovery_writeback_v1` | 企微恢复后,OA 应急数据先 dry-run,再回写企微。 | 应急接管模式完成;企微写回接口、冲突规则和回滚策略已单独批准。 | 系统生成成功、失败、跳过和冲突清单;无冲突项可自动回写,冲突进入人工确认。 |
| 34 | `wecom_ruleops_v1` | AI 草拟企微规则、生成差异报告和 dry-run,人工确认后写入企微。 | 前述同步/回写链路稳定;企微规则 API 能力和权限已验证。 | 每次写入保存前后快照、确认人、API `errcode`、失败原因、回滚建议和审计记录。 |
## 4. 每阶段固定门禁 ## 4. 每阶段固定门禁
@@ -285,9 +287,9 @@ WAPC2 通过后,下一步不是直接进入 `wecom_attendance_approval_mirror_
9. `WARCH2 正式只读历史查询`:已提供 OA DB 只读 API 和 PC/移动历史页。 9. `WARCH2 正式只读历史查询`:已提供 OA DB 只读 API 和 PC/移动历史页。
10. `WROAD2+OPS 受控上线与每日巡检`:先做测试账号 3 天脚本化巡检,沉淀 Day 0/Day 1/Day 2/Day 3 脱敏报告。 10. `WROAD2+OPS 受控上线与每日巡检`:先做测试账号 3 天脚本化巡检,沉淀 Day 0/Day 1/Day 2/Day 3 脱敏报告。
11. `WARCH3 / WCHECK1 / WEXT1 / WOPS1`:已补归档稳定化自动巡检、打卡摘要留存、外出/加班 dry-run 和告警降噪。 11. `WARCH3 / WCHECK1 / WEXT1 / WOPS1`:已补归档稳定化自动巡检、打卡摘要留存、外出/加班 dry-run 和告警降噪。
12. `WROAD2-CLOSEOUT / WROAD2-BIZ1 / WAPPR1 / WRULE1 / WAUTO1 / WEXT1LD / WFULLSMOKE1 / WTCLOSE2 / WEXT1-LIVE / WREAL1`:三天验收期间并行完成人工业务冒烟、审批规则规范化、审批链校验、自动证据汇总和全域最终目标主路径测试;先完成外出/加班 live 前 dry-run 和测试号最终收口,再问答进入外出/加班测试号 live POC;请假、补卡、外出、加班四类测试号证据和审批规则门禁通过后,再问真实小范围试用。 12. `WROAD2-CLOSEOUT / WROAD2-BIZ1 / WAPPR1 / WRULE1 / WAUTO1 / WEXT1LD / WFULLSMOKE1 / WTCLOSE2 / WREMOTE1 / WFULLSMOKE2 / WEXT1-FORMAL / WREAL1`:三天验收期间并行完成人工业务冒烟、审批规则规范化、审批链校验、自动证据汇总和全域最终目标主路径测试;先完成外出/加班 dry-run、测试号最终收口和远端收口,再问答进入正式模板外出/加班人工测试;请假、补卡、外出、加班四类测试号证据和审批规则门禁通过后,再问真实小范围试用。
WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WRULE1、WAUTO1/WEXT1LD、WFULLSMOKE1、WTCLOSE2、WEXT1-LIVE、四类测试号证据和 WREAL1 通过或明确批准前,不拆 `wecom_attendance_approval_mirror_v1`。 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WRULE1、WAUTO1/WEXT1LD、WFULLSMOKE1、WTCLOSE2、WREMOTE1/WFULLSMOKE2、WEXT1-FORMAL、四类测试号证据和 WREAL1 通过或明确批准前,不拆 `wecom_attendance_approval_mirror_v1`。
## 13. WADM1 自建留存/镜像数据模型设计 ## 13. WADM1 自建留存/镜像数据模型设计
@@ -374,11 +376,11 @@ WROAD2+OPS 把 WARCH2 后的可用能力先进入测试账号受控使用,不
- 业务冒烟:WROAD2-BIZ1 在三天内补充人工业务动作,不替代自动巡检。`SMOKE002` 每天按企微规则尝试上/下班打卡,提交低风险请假和补卡;`SMOKE101` 必须先打开详情再审批;`HYD000006` 每天查看 OA 企微审批归档和打卡摘要。无法打卡、无法审批或仍需手选审批人时按 finding 记录,不伪造成通过。 - 业务冒烟:WROAD2-BIZ1 在三天内补充人工业务动作,不替代自动巡检。`SMOKE002` 每天按企微规则尝试上/下班打卡,提交低风险请假和补卡;`SMOKE101` 必须先打开详情再审批;`HYD000006` 每天查看 OA 企微审批归档和打卡摘要。无法打卡、无法审批或仍需手选审批人时按 finding 记录,不伪造成通过。
- 审批规则:WAPPR1 把“申请人不得任意选择审批人”列为真实试用前门禁。测试模板固定 `SMOKE002 -> SMOKE101`;正式模板必须按直属主管、部门负责人或指定审批角色自动带出审批人;审批人缺失、停用、未绑定、不可见或等于申请人本人时阻断。企微 API 不能只读读取原生模板的审批规则配置,因此后台人工确认和真机提交页确认是 WAPPR1 必要证据,`getapprovaldetail` 只作为提交后实际审批链校验。 - 审批规则:WAPPR1 把“申请人不得任意选择审批人”列为真实试用前门禁。测试模板固定 `SMOKE002 -> SMOKE101`;正式模板必须按直属主管、部门负责人或指定审批角色自动带出审批人;审批人缺失、停用、未绑定、不可见或等于申请人本人时阻断。企微 API 不能只读读取原生模板的审批规则配置,因此后台人工确认和真机提交页确认是 WAPPR1 必要证据,`getapprovaldetail` 只作为提交后实际审批链校验。
- 自动证据:WAUTO1 使用 `scripts/qa/collect-wecom-controlled-trial-evidence.sh` 只读汇总三天证据,读取既有 WROAD2/WARCH3/WCHECK1/WEXT1 报告并复跑只读/离线 runner;该脚本不设置 `WECOM_ARCHIVE_WRITE=1`、`WECOM_CHECKIN_ARCHIVE_WRITE=1` 或 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不替代 WARCH3 定时巡检和人工业务冒烟。 - 自动证据:WAUTO1 使用 `scripts/qa/collect-wecom-controlled-trial-evidence.sh` 只读汇总三天证据,读取既有 WROAD2/WARCH3/WCHECK1/WEXT1 报告并复跑只读/离线 runner;该脚本不设置 `WECOM_ARCHIVE_WRITE=1`、`WECOM_CHECKIN_ARCHIVE_WRITE=1` 或 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不替代 WARCH3 定时巡检和人工业务冒烟。
- 全域总控:WFULLSMOKE1 使用 `scripts/qa/run-three-day-full-goal-smoke.sh` 聚合企微 HR/考勤、OA 报销、采购、合同/项目、付款批次、移动/企微入口和运维巡检;具备 live smoke 凭据时只允许创建 `TEST/SMOKE/WFULL` 标记的 OA 测试业务数据,不写企业微信、不真实付款、不接真实支付、不写 ERP、不导入银行流水。 - 全域总控:WFULLSMOKE1 使用 `scripts/qa/run-three-day-full-goal-smoke.sh` 聚合企微 HR/考勤、OA 报销、采购、合同/项目、付款批次、移动/企微入口和运维巡检;具备 live smoke 凭据时只允许创建 `TEST-SMOKE-WFULL` 标记的 OA 测试业务数据,不写企业微信、不真实付款、不接真实支付、不写 ERP、不导入银行流水。
### 6.4 WARCH3 / WCHECK1 / WEXT1 当前边界 ### 6.4 WARCH3 / WCHECK1 / WEXT1 当前边界
- `WARCH3`:`scripts/qa/run-warch3-ops-daily.sh` 聚合 WROAD2 子报告并输出 `artifacts/qa-flow/warch3-ops-<timestamp>/summary.json`;`deploy/trialrun/install-warch3-ops-timer.sh` 安装 `hyb-oa-warch3-ops.service/timer`,每日 07:30 触发。巡检失败或 finding 可用 `npm run send:wecom-ops-alert` 发脱敏企微应用消息,双开关为 `--send` + `WARCH3_OPS_ALERT_SEND=1`。 - `WARCH3`:`scripts/qa/run-warch3-ops-daily.sh` 聚合 WROAD2 子报告并输出 `artifacts/qa-flow/warch3-ops-<timestamp>/summary.json`;`deploy/trialrun/install-warch3-ops-timer.sh` 安装 `hyb-oa-warch3-ops.service/timer`,每日 07:30 触发。巡检失败或 finding 可用 `npm run send:wecom-ops-alert` 发脱敏企微应用消息,双开关为 `--send` + `WARCH3_OPS_ALERT_SEND=1`。
- `WCHECK1`:`WecomCheckinRecord` 继续作为规范化明细;新增日摘要、月摘要和规则快照。`npm run check:wecom-checkin-summary-archive` 默认离线只读;写 OA 留存必须同时具备 `--persist-to-db` + `WECOM_CHECKIN_ARCHIVE_WRITE=1`。报告不输出完整 userid、位置、人脸、设备明文或原始 payload。 - `WCHECK1`:`WecomCheckinRecord` 继续作为规范化明细;新增日摘要、月摘要和规则快照。`npm run check:wecom-checkin-summary-archive` 默认离线只读;写 OA 留存必须同时具备 `--persist-to-db` + `WECOM_CHECKIN_ARCHIVE_WRITE=1`。报告不输出完整 userid、位置、人脸、设备明文或原始 payload。
- `WEXT1`:`npm run check:wecom-approval-fixtures -- --target=outing --target=overtime` 只做 dry-run。外出/加班 live 创建仍需新 Issue CSV 和人工批准,不因请假/补卡已验证而自动放行。 - `WEXT1`:`npm run check:wecom-approval-fixtures -- --target=outing --target=overtime` 只做 dry-run。WREMOTE1 后外出/加班不再走自动创建 OA-POC 样件路线,改为正式模板人工提交 + 系统只读校验。
- `WEXT1LD`:live 前 dry-run gate 只执行 `npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`,不带 live 写入参数;通过后问答选项为批准一次 live 创建外出+加班 OA-POC 样件、只保留 dry-run、或将外出/加班移出 V1。 - `WEXT1LD`:live 前 dry-run gate 只执行 `npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`,不带 live 写入参数;通过后不自动创建模板或审批单,下一步由 WEXT1-FORMAL 问答决定是否让 `SMOKE002` 真机提交正式模板外出/加班测试单。
+1 -1
查看文件
@@ -97,7 +97,7 @@ WDRG 后,企微优先 HR/考勤路线采用“路线图门禁 + 单功能 Issu
当前企微优先路线顺序固定为: 当前企微优先路线顺序固定为:
`WECOM-CAPABILITY-POC-V1 -> wecom_hr_master_sync_v1 -> runtime_first_wecom_enablement -> WOUA-FIX / WECOM-RUNTIME-READY-V1 -> WAPC1 审批配置准备 -> WAPC2 请假/补卡只读 POC -> WAPC2F 自动生成 POC 样件 -> WAPC2FLIVE live 创建与 WAPC2 自动复跑 -> WCBK1 回调只读 POC(真实事件已确认) -> WEGOV1 企微主办治理与自建留存路线修正 -> WACP3/WACP3R 补偿拉取 POC -> WREAD1 审批可读性与误审批防护门禁 -> WADM1 自建留存/镜像数据模型设计 -> WARCH1 最小自建历史留存实现 -> WARCH2 正式只读历史查询 -> WROAD2+OPS 受控上线与每日巡检 -> WARCH3 归档稳定化自动巡检 -> WCHECK1 打卡摘要留存 -> WEXT1 外出/加班 dry-run -> WOPS1 巡检告警降噪 -> WROAD2-CLOSEOUT 三天验收 -> WROAD2-BIZ1 三天业务冒烟 -> WAPPR1 审批规则规范化 -> WAUTO1 自动证据汇总 -> WEXT1LD 外出/加班 live 前 dry-run -> WFULLSMOKE1 三天全域最终目标测试 -> WROUTE2 测试号收口到最小镜像路线锁定 -> WEXT1-LIVE 外出/加班测试号 live POC -> 四类测试号证据和审批规则门禁通过后问答 WREAL1 小范围真实试用(首批 1 名真实员工 + 1 名审批人/管理员观察) -> wecom_attendance_approval_mirror_v1 最小完整镜像 -> oa_hr_emergency_mode_v1 -> wecom_recovery_writeback_v1 -> wecom_ruleops_v1` `WECOM-CAPABILITY-POC-V1 -> wecom_hr_master_sync_v1 -> runtime_first_wecom_enablement -> WOUA-FIX / WECOM-RUNTIME-READY-V1 -> WAPC1 审批配置准备 -> WAPC2 请假/补卡只读 POC -> WAPC2F 自动生成 POC 样件 -> WAPC2FLIVE live 创建与 WAPC2 自动复跑 -> WCBK1 回调只读 POC(真实事件已确认) -> WEGOV1 企微主办治理与自建留存路线修正 -> WACP3/WACP3R 补偿拉取 POC -> WREAD1 审批可读性与误审批防护门禁 -> WADM1 自建留存/镜像数据模型设计 -> WARCH1 最小自建历史留存实现 -> WARCH2 正式只读历史查询 -> WROAD2+OPS 受控上线与每日巡检 -> WARCH3 归档稳定化自动巡检 -> WCHECK1 打卡摘要留存 -> WEXT1 外出/加班 dry-run -> WOPS1 巡检告警降噪 -> WROAD2-CLOSEOUT 三天验收 -> WROAD2-BIZ1 三天业务冒烟 -> WAPPR1 审批规则规范化 -> WRULE1 审批链校验器 POC -> WAUTO1 自动证据汇总 -> WEXT1LD 外出/加班 live 前 dry-run -> WFULLSMOKE1 三天全域最终目标测试 -> WROUTE2 测试号收口到最小镜像路线锁定 -> WTCLOSE2/WTCLOSE2F 远端可信 IP 执行口径修正 -> WREMOTE1/WFULLSMOKE2 远端收口 -> WEXT1-FORMAL 正式模板外出/加班测试 -> 四类测试号证据和审批规则门禁通过后问答 WREAL1 小范围真实试用(首批 1 名真实员工 + 1 名审批人/管理员观察) -> wecom_attendance_approval_mirror_v1 最小完整镜像 -> oa_hr_emergency_mode_v1 -> wecom_recovery_writeback_v1 -> wecom_ruleops_v1`
允许并行处理线上缺陷、正式使用阻断、真实反馈扫尾和 QA-only 脚本维护;但采购、合同、报销、付款、AP、代账和高敏附件等 OA 主办域必须另开合同,不得混入企微 HR/考勤路线。 允许并行处理线上缺陷、正式使用阻断、真实反馈扫尾和 QA-only 脚本维护;但采购、合同、报销、付款、AP、代账和高敏附件等 OA 主办域必须另开合同,不得混入企微 HR/考勤路线。
文件差异因一行或多行过长而隐藏
+10 -9
查看文件
@@ -20,7 +20,7 @@
## 最近事实源链 ## 最近事实源链
R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> MIF7/MIF7T(公网部署与带凭据公网复检已收口) -> DG8 -> DG9 -> R7E -> FBA -> QAOPS9/P2D -> P2-ORG -> P2-FIN-DECISION -> P2-FIN-V1 -> P2-OCR-SAMPLE -> P2Q -> P2AUTO -> P2AF -> P2-FIN-LIVE-DECISION -> P2-FIN-LIVE -> PRELAUNCH -> CASHIER-VOUCHER-V1 -> LAUNCH-DEPLOY-FINANCE -> FIN-PROD-ENABLE -> ACCOUNTING-HANDOFF-V1 -> SYSTEM-COMPLETE-GATE -> LAUNCH-OPS-V1 -> REQ-COMPLETE-AUDIT -> ATTV1 -> LAUNCH-AUTO-OPS-V1 -> AUTO-REMAINING-CLOSEOUT -> HR-WECOM-DIRECTORY-V1 -> HRWD-CONTACT-LIVE-TEST -> WCFB -> WFOC -> DBWFOC -> WFDG -> WDRG -> WCP1 -> WCPC -> WHMS -> WHMSLIVE -> WOUA -> WAPI -> WRRA -> WOUA-FIX -> WRV1 -> WRA1 -> WMSG1 -> WAPC1 -> WAPC2 -> WPROC1 -> WPROC2 -> WAPC2F dry-run -> WAPC2FLIVE -> WCBK1 -> WEGOV1 -> WACP3/WACP3R -> WREAD1 自动汇总 -> WREAD1F 新样例 -> WREAD1 真机确认 -> WADM1 自建留存模型设计 -> WARCH1 最小审批历史留存 -> WARCH2 正式只读历史查询 -> WROAD2+OPS 受控上线与每日巡检 -> WARCH3 归档稳定化自动巡检 -> WCHECK1 打卡摘要留存 -> WEXT1 外出/加班 dry-run -> WOPS1 巡检告警降噪 -> WROAD2-CLOSEOUT 三天验收 -> WROAD2-BIZ1 三天业务冒烟 -> WAPPR1 审批规则规范化 -> WRULE1 审批链校验器 POC -> WAUTO1 自动证据汇总 -> WEXT1LD live 前 dry-run -> WFULLSMOKE1 三天全域最终目标测试 -> WROUTE2 测试号收口到最小镜像路线锁定 -> WTCLOSE1 小团队自动审批规则与测试号全域收口 dry-run -> WTCLOSE2 测试号最终收口与证据复核 -> WTCLOSE2F 远端可信 IP 执行口径修正 -> WEXT1-LIVE 路线选择(待测试号收口、全域主路径、业务冒烟和规则门禁后另建合同) -> 四类测试号证据和审批规则门禁通过后问答 WREAL1 小范围真实试用(首批 1 名真实员工 + 1 名审批人/管理员观察) -> wecom_attendance_approval_mirror_v1 最小完整镜像。 R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> MIF7/MIF7T(公网部署与带凭据公网复检已收口) -> DG8 -> DG9 -> R7E -> FBA -> QAOPS9/P2D -> P2-ORG -> P2-FIN-DECISION -> P2-FIN-V1 -> P2-OCR-SAMPLE -> P2Q -> P2AUTO -> P2AF -> P2-FIN-LIVE-DECISION -> P2-FIN-LIVE -> PRELAUNCH -> CASHIER-VOUCHER-V1 -> LAUNCH-DEPLOY-FINANCE -> FIN-PROD-ENABLE -> ACCOUNTING-HANDOFF-V1 -> SYSTEM-COMPLETE-GATE -> LAUNCH-OPS-V1 -> REQ-COMPLETE-AUDIT -> ATTV1 -> LAUNCH-AUTO-OPS-V1 -> AUTO-REMAINING-CLOSEOUT -> HR-WECOM-DIRECTORY-V1 -> HRWD-CONTACT-LIVE-TEST -> WCFB -> WFOC -> DBWFOC -> WFDG -> WDRG -> WCP1 -> WCPC -> WHMS -> WHMSLIVE -> WOUA -> WAPI -> WRRA -> WOUA-FIX -> WRV1 -> WRA1 -> WMSG1 -> WAPC1 -> WAPC2 -> WPROC1 -> WPROC2 -> WAPC2F dry-run -> WAPC2FLIVE -> WCBK1 -> WEGOV1 -> WACP3/WACP3R -> WREAD1 自动汇总 -> WREAD1F 新样例 -> WREAD1 真机确认 -> WADM1 自建留存模型设计 -> WARCH1 最小审批历史留存 -> WARCH2 正式只读历史查询 -> WROAD2+OPS 受控上线与每日巡检 -> WARCH3 归档稳定化自动巡检 -> WCHECK1 打卡摘要留存 -> WEXT1 外出/加班 dry-run -> WOPS1 巡检告警降噪 -> WROAD2-CLOSEOUT 三天验收 -> WROAD2-BIZ1 三天业务冒烟 -> WAPPR1 审批规则规范化 -> WRULE1 审批链校验器 POC -> WAUTO1 自动证据汇总 -> WEXT1LD live 前 dry-run -> WFULLSMOKE1 三天全域最终目标测试 -> WROUTE2 测试号收口到最小镜像路线锁定 -> WTCLOSE1 小团队自动审批规则与测试号全域收口 dry-run -> WTCLOSE2 测试号最终收口与证据复核 -> WTCLOSE2F 远端可信 IP 执行口径修正 -> WREMOTE1 远端可信 IP 收口 -> WFULLSMOKE2 全域 smoke -> WEXT1-FORMAL 正式模板外出/加班测试 -> 四类测试号证据和审批规则门禁通过后问答 WREAL1 小范围真实试用(首批 1 名真实员工 + 1 名审批人/管理员观察) -> wecom_attendance_approval_mirror_v1 最小完整镜像。
- R6、PC6、PA6、FL6、AP6、RI6、LP6 已完成并部署。 - R6、PC6、PA6、FL6、AP6、RI6、LP6 已完成并部署。
- ME6 自动化、公网视觉矩阵和 `ME6-3` 代表性企业微信真机门禁已完成。 - ME6 自动化、公网视觉矩阵和 `ME6-3` 代表性企业微信真机门禁已完成。
@@ -80,7 +80,7 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
- WACP3 是 WEGOV1 后的企微审批补偿拉取 POC 合同:新增 `check:wecom-approval-compensation-poc` 和 `getapprovalinfo` 只读封装;初始公网报告缺模板 ID,WACP3R 已改为按 `SMOKE002` creator 自动发现 OA-POC 请假/补卡模板并复跑,公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` 为 `PASS_WITH_FINDINGS`,补偿拉取和详情读取可用,finding 为回调证据文件未持久化。 - WACP3 是 WEGOV1 后的企微审批补偿拉取 POC 合同:新增 `check:wecom-approval-compensation-poc` 和 `getapprovalinfo` 只读封装;初始公网报告缺模板 ID,WACP3R 已改为按 `SMOKE002` creator 自动发现 OA-POC 请假/补卡模板并复跑,公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` 为 `PASS_WITH_FINDINGS`,补偿拉取和详情读取可用,finding 为回调证据文件未持久化。
- WARCH1 是 WADM1 后的最小自建历史留存合同:新增审批留存 Prisma 表、回调事件入库、补偿拉取双开关入库和离线读取 runner;只覆盖请假/补卡历史留存,不写企微、不创建模板或审批单、不进入完整镜像、应急接管、恢复回写或 RuleOps。 - WARCH1 是 WADM1 后的最小自建历史留存合同:新增审批留存 Prisma 表、回调事件入库、补偿拉取双开关入库和离线读取 runner;只覆盖请假/补卡历史留存,不写企微、不创建模板或审批单、不进入完整镜像、应急接管、恢复回写或 RuleOps。
- WARCH2 是 WARCH1 后的正式只读历史查询合同:新增只读 OA DB 查询 API 和 PC/移动历史页,只覆盖请假/补卡已归档历史;页面不提供审批动作,不进入待办语境;已完成 `SYNC_ENV=0` 公网部署、`/ready`、未登录 401 和远端离线归档复跑。 - WARCH2 是 WARCH1 后的正式只读历史查询合同:新增只读 OA DB 查询 API 和 PC/移动历史页,只覆盖请假/补卡已归档历史;页面不提供审批动作,不进入待办语境;已完成 `SYNC_ENV=0` 公网部署、`/ready`、未登录 401 和远端离线归档复跑。
- WROAD2+OPS 是 WARCH2 后的受控上线与每日巡检合同:范围固定测试账号 `SMOKE002 -> SMOKE101`,管理员观察和告警员工号使用 `HYD000006`(`wangshunli` 的员工号),3 天每日触发脚本;巡检可用 `WECOM_ARCHIVE_WRITE=1` 写 OA 自建留存库,不写企业微信、不创建模板或审批单。Day 0 公网报告 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` 为 `PASS_WITH_FINDINGS`,主链路通过并保留可解释 finding。后续优先 WOPS1 告警降噪、WROAD2-CLOSEOUT 三天验收;验收后先问答是否进入 WEXT1-LIVE 外出/加班测试号 live POC,再由四类测试号证据决定是否询问真实小范围试用。 - WROAD2+OPS 是 WARCH2 后的受控上线与每日巡检合同:范围固定测试账号 `SMOKE002 -> SMOKE101`,管理员观察和告警员工号使用 `HYD000006`(`wangshunli` 的员工号),3 天每日触发脚本;巡检可用 `WECOM_ARCHIVE_WRITE=1` 写 OA 自建留存库,不写企业微信、不创建模板或审批单。Day 0 公网报告 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` 为 `PASS_WITH_FINDINGS`,主链路通过并保留可解释 finding。后续优先 WOPS1 告警降噪、WROAD2-CLOSEOUT 三天验收;验收后先问答是否进入 WEXT1-FORMAL 正式模板外出/加班测试,再由四类测试号证据决定是否询问真实小范围试用。
## 当前活跃治理流 ## 当前活跃治理流
@@ -156,17 +156,18 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
| `WCHECK1` | `issues/2026-05-20_12-48-04-wecom-checkin-summary-archive-v1.csv` | 当前打卡摘要留存:企微打卡数据进入 OA 自建历史摘要 | 新增打卡日/月摘要和规则快照表、`wecomCheckinArchive` 服务和 `npm run check:wecom-checkin-summary-archive`;公网 live `/app/artifacts/qa-flow/wecom-checkin-summary-archive-20260520T054907Z/summary.json` 为 `PASS_CHECKIN_ARCHIVE_READY`,offline `/app/artifacts/qa-flow/wecom-checkin-summary-archive-20260520T054926Z/summary.json` 为 `PASS_CHECKIN_ARCHIVE_OFFLINE_READY` | 不写企业微信;不保存位置、人脸、设备明文、原始 payload 或密钥;本窗口 0 条打卡明细、2 条规则快照已写 OA 留存 | | `WCHECK1` | `issues/2026-05-20_12-48-04-wecom-checkin-summary-archive-v1.csv` | 当前打卡摘要留存:企微打卡数据进入 OA 自建历史摘要 | 新增打卡日/月摘要和规则快照表、`wecomCheckinArchive` 服务和 `npm run check:wecom-checkin-summary-archive`;公网 live `/app/artifacts/qa-flow/wecom-checkin-summary-archive-20260520T054907Z/summary.json` 为 `PASS_CHECKIN_ARCHIVE_READY`,offline `/app/artifacts/qa-flow/wecom-checkin-summary-archive-20260520T054926Z/summary.json` 为 `PASS_CHECKIN_ARCHIVE_OFFLINE_READY` | 不写企业微信;不保存位置、人脸、设备明文、原始 payload 或密钥;本窗口 0 条打卡明细、2 条规则快照已写 OA 留存 |
| `WEXT1` | `issues/2026-05-20_12-48-04-wecom-outing-overtime-fixture-dryrun-v1.csv` | 当前外出/加班低风险 POC dry-run | 扩展 `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` | 不 live 创建企微模板或审批单;live 前必须另起问答和 Issue CSV;不放行完整镜像 | | `WEXT1` | `issues/2026-05-20_12-48-04-wecom-outing-overtime-fixture-dryrun-v1.csv` | 当前外出/加班低风险 POC dry-run | 扩展 `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` | 不 live 创建企微模板或审批单;live 前必须另起问答和 Issue CSV;不放行完整镜像 |
| `WOPS1` | `issues/2026-05-20_14-35-42-warch3-ops-alert-tuning-v1.csv` | 已完成并公网验证:巡检告警降噪,只报新增异常或状态恶化 | 默认收件员工号改为 `HYD000006`(管理员 `wangshunli` 的员工号);`send-wecom-ops-alert` 使用状态文件记录上次状态和 finding 摘要;远端 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`,重复 finding 未发送 | 不写企业微信业务数据;只发送脱敏状态消息;不扩大真实用户 | | `WOPS1` | `issues/2026-05-20_14-35-42-warch3-ops-alert-tuning-v1.csv` | 已完成并公网验证:巡检告警降噪,只报新增异常或状态恶化 | 默认收件员工号改为 `HYD000006`(管理员 `wangshunli` 的员工号);`send-wecom-ops-alert` 使用状态文件记录上次状态和 finding 摘要;远端 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`,重复 finding 未发送 | 不写企业微信业务数据;只发送脱敏状态消息;不扩大真实用户 |
| `WROAD2-CLOSEOUT` | `issues/2026-05-20_14-35-42-wroad2-controlled-ops-closeout-v1.csv` | 当前三天受控巡检验收:Day 1/2/3 采集后人工确认 | 已知 observation 为 live smoke 凭据、pending OCR 和历史 callback gap,不阻断;主链必须保持企微 runtime、审批补偿归档、OA 离线读取、打卡摘要 offline 可读和隐私扫描通过 | 三天结束前不启用真实员工;结论需结合 WROAD2-BIZ1/WAPPR1 后问答确认是否进入 WEXT1-LIVE、先处理 finding 或暂停 | | `WROAD2-CLOSEOUT` | `issues/2026-05-20_14-35-42-wroad2-controlled-ops-closeout-v1.csv` | 当前三天受控巡检验收:Day 1/2/3 采集后人工确认 | 已知 observation 为 live smoke 凭据、pending OCR 和历史 callback gap,不阻断;主链必须保持企微 runtime、审批补偿归档、OA 离线读取、打卡摘要 offline 可读和隐私扫描通过 | 三天结束前不启用真实员工;结论需结合 WROAD2-BIZ1/WAPPR1 后问答确认是否进入 WEXT1-FORMAL、先处理 finding 或暂停 |
| `WROAD2-BIZ1` | `issues/2026-05-20_17-13-57-wroad2-business-smoke-v1.csv` | 当前三天业务冒烟:补充测试账号人工业务动作 | `SMOKE002` 每天按企微规则尝试打卡并提交低风险请假/补卡,`SMOKE101` 先看详情再审批,`HYD000006` 查看 OA 归档历史和打卡摘要 | 不替代 WARCH3 自动巡检;不写企业微信;无法打卡、无法审批或仍需手选审批人时记录 finding | | `WROAD2-BIZ1` | `issues/2026-05-20_17-13-57-wroad2-business-smoke-v1.csv` | 当前三天业务冒烟:补充测试账号人工业务动作 | `SMOKE002` 每天按企微规则尝试打卡并提交低风险请假/补卡,`SMOKE101` 先看详情再审批,`HYD000006` 查看 OA 归档历史和打卡摘要 | 不替代 WARCH3 自动巡检;不写企业微信;无法打卡、无法审批或仍需手选审批人时记录 finding |
| `WAPPR1` | `issues/2026-05-20_17-13-57-wecom-approval-rule-governance-v1.csv` | 当前审批规则规范化门禁:2026-05-21 人工门禁已通过 | 用户已设置测试员工直属上级为测试主管,并真机确认请假、补卡、外出、加班均自动带出测试主管且申请人不能编辑审批人,四类模板均为 A | 仍需 WRULE1 校验提交后的实际审批链;不自动授权外出/加班 live 或真实员工试用;后续模板若回退为 B/C/D 立即暂停 | | `WAPPR1` | `issues/2026-05-20_17-13-57-wecom-approval-rule-governance-v1.csv` | 当前审批规则规范化门禁:2026-05-21 人工门禁已通过 | 用户已设置测试员工直属上级为测试主管,并真机确认请假、补卡、外出、加班均自动带出测试主管且申请人不能编辑审批人,四类模板均为 A | 仍需 WRULE1 校验提交后的实际审批链;不自动授权外出/加班 live 或真实员工试用;后续模板若回退为 B/C/D 立即暂停 |
| `WRULE1` | `issues/2026-05-20_23-56-15-wecom-hr-approval-rule-validator-v1.csv` | 当前审批链校验器 POC:单一组织规则 + 企微执行 + OA 校验留存 | 新增 `npm run check:wecom-approval-rule-validator`,按 OA 直属主管、业务审批角色和管理员兜底计算理论审批人,并对比 OA 已归档企微审批详情中的实际审批链 | 只读 OA DB;不读取企微后台规则、不调用企微 API、不写 OA/企微;不替代 WAPPR1 人工 A/B/C/D 门禁 | | `WRULE1` | `issues/2026-05-20_23-56-15-wecom-hr-approval-rule-validator-v1.csv` | 当前审批链校验器 POC:单一组织规则 + 企微执行 + OA 校验留存 | 新增 `npm run check:wecom-approval-rule-validator`,按 OA 直属主管、业务审批角色和管理员兜底计算理论审批人,并对比 OA 已归档企微审批详情中的实际审批链 | 只读 OA DB;不读取企微后台规则、不调用企微 API、不写 OA/企微;不替代 WAPPR1 人工 A/B/C/D 门禁 |
| `WAUTO1` | `issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv` | 当前受控试用证据自动汇总:把三天自动报告和只读 runner 汇总成脱敏证据 | 新增 `scripts/qa/collect-wecom-controlled-trial-evidence.sh`,复跑 `/ready`、WARCH3 summary-only、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描 | 默认不写 OA DB、不写企业微信、不创建模板或审批单;WAPPR1 和三天业务仍需人工确认 | | `WAUTO1` | `issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv` | 当前受控试用证据自动汇总:把三天自动报告和只读 runner 汇总成脱敏证据 | 新增 `scripts/qa/collect-wecom-controlled-trial-evidence.sh`,复跑 `/ready`、WARCH3 summary-only、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描 | 默认不写 OA DB、不写企业微信、不创建模板或审批单;WAPPR1 和三天业务仍需人工确认 |
| `WEXT1LD` | `issues/2026-05-20_18-04-16-wecom-outing-overtime-live-dryrun-gate-v1.csv` | 当前外出/加班 live 前 dry-run gate:只做远端 dry-run,不授权 live 写入 | 远端执行 `npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`;固定 `SMOKE002 -> SMOKE101` 和 `WECOM_AGENT_SECRET` | 不设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不带 live 写入参数;通过后仍需问答是否 live 创建样件 | | `WEXT1LD` | `issues/2026-05-20_18-04-16-wecom-outing-overtime-live-dryrun-gate-v1.csv` | 当前外出/加班 live 前 dry-run gate:只做远端 dry-run,不授权企微写入 | 远端执行 `npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`;固定 `SMOKE002 -> SMOKE101` 和 `WECOM_AGENT_SECRET` | 不设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不带 live 写入参数;WREMOTE1 后下一步按 WEXT1-FORMAL 问答决定是否人工提交正式模板测试单 |
| `WFULLSMOKE1` | `issues/2026-05-20_19-01-12-three-day-full-goal-smoke-v1.csv` | 当前三天全域最终目标测试总控:覆盖企微 HR/考勤、OA 主办域、移动端和运维巡检 | 新增 `scripts/qa/run-three-day-full-goal-smoke.sh`,聚合 `/ready`、feature flag、WARCH3/WAUTO1、审批归档、打卡摘要、OA 报销/采购/付款批次主路径、移动/企微入口和隐私扫描 | 只允许 `TEST/SMOKE/WFULL` OA 测试业务数据;不写企业微信、不创建外出/加班样件、不启用真实员工、不真实付款、不接真实支付、不写 ERP、不导入银行流水 | | `WFULLSMOKE1` | `issues/2026-05-20_19-01-12-three-day-full-goal-smoke-v1.csv` | 当前三天全域最终目标测试总控:覆盖企微 HR/考勤、OA 主办域、移动端和运维巡检 | 新增 `scripts/qa/run-three-day-full-goal-smoke.sh`,聚合 `/ready`、feature flag、WARCH3/WAUTO1、审批归档、打卡摘要、OA 报销/采购/付款批次主路径、移动/企微入口和隐私扫描 | 只允许 `TEST-SMOKE-WFULL` OA 测试业务数据;不写企业微信、不创建外出/加班样件、不启用真实员工、不真实付款、不接真实支付、不写 ERP、不导入银行流水 |
| `WROUTE2` | `issues/2026-05-20_20-15-29-wecom-test-account-closeout-to-minimal-mirror-route-v1.csv` | 当前后续路线锁定:测试号全域收口 -> 外出/加班 live POC -> 真实小试用 -> 最小完整镜像 | 固化 WAPPR1 A 为 WEXT1-LIVE 和 WREAL1 硬门禁;WREAL1 首批固定为 1 名真实员工 + 1 名审批人/管理员观察;WREAL1 通过后优先规划 `wecom_attendance_approval_mirror_v1` 最小完整镜像 | 不写企业微信;不启用真实员工;不创建外出/加班样件;应急接管、恢复回写和 RuleOps 继续后置 | | `WROUTE2` | `issues/2026-05-20_20-15-29-wecom-test-account-closeout-to-minimal-mirror-route-v1.csv` | 当前后续路线锁定:测试号全域收口 -> 外出/加班 live POC -> 真实小试用 -> 最小完整镜像 | 固化 WAPPR1 A 为 WEXT1-FORMAL 和 WREAL1 硬门禁;WREAL1 首批固定为 1 名真实员工 + 1 名审批人/管理员观察;WREAL1 通过后优先规划 `wecom_attendance_approval_mirror_v1` 最小完整镜像 | 不写企业微信;不启用真实员工;不创建外出/加班样件;应急接管、恢复回写和 RuleOps 继续后置 |
| `WTCLOSE1` | `issues/2026-05-20_21-10-00-wecom-test-account-closeout-auto-dryrun-v1.csv` | 当前小团队自动审批规则与测试号全域收口 dry-run:公司不到 10 人时,四类 HR/考勤模板目标均为 A | 固化一层主管或指定审批角色 + 管理员兜底规则;公网 WAUTO1 `/app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-130010/summary.json` 为 `PAUSED_MANUAL_CONFIRMATION`,WFULLSMOKE1 `/app/artifacts/qa-flow/three-day-full-goal-smoke-20260520-125909/summary.json` 为 `PASS_WITH_FINDINGS`,外出/加班 dry-run `/app/artifacts/qa-flow/wecom-approval-fixtures-20260520T125941Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`;2026-05-21 WAPPR1 四类模板已由用户真机确认均为 A | 不写企业微信;不创建外出/加班模板或审批单;不启用真实员工;进入 WEXT1-LIVE/WREAL1 前仍需 WRULE1、三天业务动作和最终问答 | | `WTCLOSE1` | `issues/2026-05-20_21-10-00-wecom-test-account-closeout-auto-dryrun-v1.csv` | 当前小团队自动审批规则与测试号全域收口 dry-run:公司不到 10 人时,四类 HR/考勤模板目标均为 A | 固化一层主管或指定审批角色 + 管理员兜底规则;公网 WAUTO1 `/app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-130010/summary.json` 为 `PAUSED_MANUAL_CONFIRMATION`,WFULLSMOKE1 `/app/artifacts/qa-flow/three-day-full-goal-smoke-20260520-125909/summary.json` 为 `PASS_WITH_FINDINGS`,外出/加班 dry-run `/app/artifacts/qa-flow/wecom-approval-fixtures-20260520T125941Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`;2026-05-21 WAPPR1 四类模板已由用户真机确认均为 A | 不写企业微信;不创建外出/加班模板或审批单;不启用真实员工;进入 WEXT1-FORMAL/WREAL1 前仍需 WRULE1、三天业务动作和最终问答 |
| `WTCLOSE2` | `issues/2026-05-22_10-21-12-wecom-test-account-final-closeout-v1.csv` | 当前测试号最终收口与证据复核:WEXT1-LIVE 前最后自动收口 | 新增 `scripts/qa/run-wecom-test-account-final-closeout.sh`,复跑 `/ready`、WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1;WFULLSMOKE1 在该脚本中关闭公网写流程,WRULE1 使用 `--manual-gate=all:A` | 不写企业微信;不新增 OA 测试业务数据;不创建外出/加班模板或审批单;不启用真实员工;结论只进入 WEXT1-LIVE 问答 | | `WTCLOSE2` | `issues/2026-05-22_10-21-12-wecom-test-account-final-closeout-v1.csv` | 当前测试号最终收口与证据复核:WEXT1-FORMAL 前最后自动收口 | 新增 `scripts/qa/run-wecom-test-account-final-closeout.sh`,复跑 `/ready`、WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1;WFULLSMOKE1 在该脚本中关闭公网写流程,WRULE1 使用 `--manual-gate=all:A` | 不写企业微信;不新增 OA 测试业务数据;不创建外出/加班模板或审批单;不启用真实员工;结论只进入 WEXT1-FORMAL 问答 |
| `WTCLOSE2F` | `issues/2026-05-22_11-10-06-wecom-test-account-closeout-remote-only-v1.csv` | 当前 WTCLOSE2 远端可信 IP 执行口径修正 | WTCLOSE2 真实运行命令改为 `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote`,由部署服务器 server 容器执行;本地直接执行默认拒绝跑企微链路 | 本地只做合同、语法、文档和静态门禁;此前本地缺 env/DB 的 WTCLOSE2 输出不作为企微业务阻断证据 | | `WTCLOSE2F` | `issues/2026-05-22_11-10-06-wecom-test-account-closeout-remote-only-v1.csv` | 当前 WTCLOSE2 远端可信 IP 执行口径修正 | WTCLOSE2 真实运行命令改为 `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote`,由部署服务器 server 容器执行;本地直接执行默认拒绝跑企微链路 | 本地只做合同、语法、文档和静态门禁;此前本地缺 env/DB 的 WTCLOSE2 输出不作为企微业务阻断证据 |
| `WREMOTE1` | `issues/2026-05-22_12-34-41-wecom-remote-closeout-and-full-smoke-v1.csv` | 当前远端收口、全域 smoke 和正式模板外出/加班测试路线 | WFULLSMOKE2 必须使用 `--remote` 在部署服务器执行;外出/加班使用正式模板由 `SMOKE002` 人工提交、`SMOKE101` 审批,系统只读补偿、归档和 WRULE1 | 允许 OA `TEST-SMOKE-WFULL` 测试数据;不写企业微信、不自动创建外出/加班模板或审批单;真实员工信息只通过 `/tmp/hyb-oa-wreal1.env` 临时文件 |
| `WREAL1-PREP` | `issues/2026-05-20_14-35-42-wecom-real-trial-prep-v1.csv` | 当前真实试用准备:不启用真实员工 | 固化候选员工、非自审审批人、回滚联系人、允许流程、暂停条件和验收标准;真实试用必须等请假、补卡、外出、加班四类测试号证据、WAPPR1 和 WFULLSMOKE1 通过后再问 | 当前不创建外出/加班 live 样件;真实员工名单不写入 Issue 或文档,后续通过问答确认 | | `WREAL1-PREP` | `issues/2026-05-20_14-35-42-wecom-real-trial-prep-v1.csv` | 当前真实试用准备:不启用真实员工 | 固化候选员工、非自审审批人、回滚联系人、允许流程、暂停条件和验收标准;真实试用必须等请假、补卡、外出、加班四类测试号证据、WAPPR1 和 WFULLSMOKE1 通过后再问 | 当前不创建外出/加班 live 样件;真实员工名单不写入 Issue 或文档,后续通过问答确认 |
旧 Issue CSV 不删除、不批量回写、不移动到归档目录。若新治理流替代旧合同,只在新 CSV 的 `Notes` 或本索引说明 supersedes,旧文件保留历史审计语义。 旧 Issue CSV 不删除、不批量回写、不移动到归档目录。若新治理流替代旧合同,只在新 CSV 的 `Notes` 或本索引说明 supersedes,旧文件保留历史审计语义。
@@ -190,7 +191,7 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
| [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md) | PRD 主事实源;WARCH3/WCHECK1/WEXT1 后包含企微审批配置、只读 POC、工程化前置、process gate、请假/补卡样例、自建留存、受控上线巡检、打卡摘要、外出/加班 dry-run 和深度镜像前置口径 | | [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md) | PRD 主事实源;WARCH3/WCHECK1/WEXT1 后包含企微审批配置、只读 POC、工程化前置、process gate、请假/补卡样例、自建留存、受控上线巡检、打卡摘要、外出/加班 dry-run 和深度镜像前置口径 |
| [文档事实源状态矩阵](./文档事实源状态矩阵.md) | 文档分类、删除恢复和冲突规则 | | [文档事实源状态矩阵](./文档事实源状态矩阵.md) | 文档分类、删除恢复和冲突规则 |
| [产品设计规则](./产品设计规则.md) | PC、移动、企业微信 WebView 设计事实源;DG8 后飞书工作台/飞书审批为唯一主 UI/布局参考;DG9 后按页面分层和样板选型 | | [产品设计规则](./产品设计规则.md) | PC、移动、企业微信 WebView 设计事实源;DG8 后飞书工作台/飞书审批为唯一主 UI/布局参考;DG9 后按页面分层和样板选型 |
| [企微优先开发路线图](./企微优先开发路线图.md) | WDRG/WCP1/WCPC/WHMS/WHMSLIVE/WOUA/WAPI/WRRA/WOUA-FIX/WRV1/WRA1/WMSG1/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F/WAPC2FLIVE/WCBK1/WEGOV1/WACP3/WACP3R/WREAD1/WREAD1F/WARCH1/WARCH2/WROAD2/WARCH3/WCHECK1/WEXT1/WOPS1/WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1/WRULE1/WAUTO1/WEXT1LD/WFULLSMOKE1/WTCLOSE1/WTCLOSE2/WREAL1-PREP 后企微优先 HR/考勤改造的阶段顺序、准入/退出门禁、并行规则、禁止跳阶段、API/Secret 口径、运行优先、自建留存、受控上线巡检、三天业务冒烟、审批规则规范化、审批链校验、自动证据汇总、全域最终目标测试、测试号最终收口、告警降噪、打卡摘要、外出/加班 dry-run、WEXT1-LIVE 和后续 WREAL1/镜像前置事实源 | | [企微优先开发路线图](./企微优先开发路线图.md) | WDRG/WCP1/WCPC/WHMS/WHMSLIVE/WOUA/WAPI/WRRA/WOUA-FIX/WRV1/WRA1/WMSG1/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F/WAPC2FLIVE/WCBK1/WEGOV1/WACP3/WACP3R/WREAD1/WREAD1F/WARCH1/WARCH2/WROAD2/WARCH3/WCHECK1/WEXT1/WOPS1/WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1/WRULE1/WAUTO1/WEXT1LD/WFULLSMOKE1/WTCLOSE1/WTCLOSE2/WREAL1-PREP 后企微优先 HR/考勤改造的阶段顺序、准入/退出门禁、并行规则、禁止跳阶段、API/Secret 口径、运行优先、自建留存、受控上线巡检、三天业务冒烟、审批规则规范化、审批链校验、自动证据汇总、全域最终目标测试、测试号最终收口、告警降噪、打卡摘要、外出/加班 dry-run、WEXT1-FORMAL 和后续 WREAL1/镜像前置事实源 |
| [企微 API 能力目录](./企微API能力目录.md) | WAPI/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F/WAPC2FLIVE/WCBK1/WEGOV1/WACP3/WACP3R/WARCH1/WARCH2/WROAD2/WARCH3/WCHECK1/WEXT1 后企微官方 API、Secret 矩阵、权限/可信 IP/回调模板、读写边界、运行优先、审批配置、只读 POC、回调/补偿入库、打卡摘要留存、外出/加班 dry-run 和巡检写 OA 留存边界事实源 | | [企微 API 能力目录](./企微API能力目录.md) | WAPI/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F/WAPC2FLIVE/WCBK1/WEGOV1/WACP3/WACP3R/WARCH1/WARCH2/WROAD2/WARCH3/WCHECK1/WEXT1 后企微官方 API、Secret 矩阵、权限/可信 IP/回调模板、读写边界、运行优先、审批配置、只读 POC、回调/补偿入库、打卡摘要留存、外出/加班 dry-run 和巡检写 OA 留存边界事实源 |
| [产品口径](./产品口径.md) | 已拍板产品边界和业务规则;WEGOV1 后包含混合主办、自建留存、受控测试域、后续阶段顺序和深度镜像前置口径 | | [产品口径](./产品口径.md) | 已拍板产品边界和业务规则;WEGOV1 后包含混合主办、自建留存、受控测试域、后续阶段顺序和深度镜像前置口径 |
| [需求 - 统一审批中心规约](./需求-统一审批中心规约.md) | OA 主办审批、企微主办 HR/考勤员工日常审批镜像、催办、超时提醒、审批效率 | | [需求 - 统一审批中心规约](./需求-统一审批中心规约.md) | OA 主办审批、企微主办 HR/考勤员工日常审批镜像、催办、超时提醒、审批效率 |
+1 -1
查看文件
@@ -70,7 +70,7 @@ Definition of Done:
- 人工只保留批准、密钥/回调配置、企微后台不可 API 化配置、真机确认和风险拍板。 - 人工只保留批准、密钥/回调配置、企微后台不可 API 化配置、真机确认和风险拍板。
- 若面向公网或企微可测,必须有 `/ready`、runtime smoke、public bundle scan 或对应 live runner 证据。 - 若面向公网或企微可测,必须有 `/ready`、runtime smoke、public bundle scan 或对应 live runner 证据。
高风险企微能力的 POC 顺序固定为:WAPC2F 自动样件 -> WAPC2FLIVE live 创建与 WAPC2 自动复跑 -> WCBK1 回调只读 POC -> WEGOV1 企微主办治理与自建留存路线修正 -> WACP3/WACP3R 补偿拉取 POC -> WREAD1 审批可读性与误审批防护门禁 -> WADM1 自建留存/镜像数据模型设计 -> WARCH1 最小自建历史留存实现 -> WARCH2 正式只读历史查询 -> WROAD2/WARCH3/WCHECK1 受控巡检和打卡摘要 -> WROAD2-BIZ1 三天业务冒烟 -> WAPPR1 审批规则规范化 -> WAUTO1 自动证据汇总 -> WEXT1LD 外出/加班 live 前 dry-run -> WFULLSMOKE1 三天全域最终目标测试 -> WROUTE2 测试号收口到最小镜像路线锁定 -> WEXT1-LIVE 外出/加班测试号 live POC -> WREAL1 小范围真实试用(首批 1 名真实员工 + 1 名审批人/管理员观察) -> `wecom_attendance_approval_mirror_v1` 最小完整镜像。当前 WAPC2FLIVE、WCBK1、WACP3R、请假/补卡 WREAD1、WADM1、WARCH1、WARCH2、WARCH3/WCHECK1/WEXT1/WOPS1 均已完成;后续不得跳过三天业务冒烟、审批规则门禁、全域测试、外出/加班 live、真实试用等独立门禁直接做完整镜像。真实回调必须先证明验签、解密、幂等和重复投递;补偿拉取必须先证明按时间窗口拿到审批单号并可拉详情;可读性门禁必须确认审批消息、列表、详情页和快捷同意/驳回误操作风险;审批规则门禁必须确认申请人不能任意选择审批人、审批人自动带出且非自审;镜像实现前必须先有字段、状态机、幂等键、索引和隐私保留边界设计。 高风险企微能力的 POC 顺序固定为:WAPC2F 自动样件 -> WAPC2FLIVE live 创建与 WAPC2 自动复跑 -> WCBK1 回调只读 POC -> WEGOV1 企微主办治理与自建留存路线修正 -> WACP3/WACP3R 补偿拉取 POC -> WREAD1 审批可读性与误审批防护门禁 -> WADM1 自建留存/镜像数据模型设计 -> WARCH1 最小自建历史留存实现 -> WARCH2 正式只读历史查询 -> WROAD2/WARCH3/WCHECK1 受控巡检和打卡摘要 -> WROAD2-BIZ1 三天业务冒烟 -> WAPPR1 审批规则规范化 -> WRULE1 审批链校验器 POC -> WAUTO1 自动证据汇总 -> WEXT1LD 外出/加班 live 前 dry-run -> WFULLSMOKE1 三天全域最终目标测试 -> WROUTE2 测试号收口到最小镜像路线锁定 -> WTCLOSE2/WTCLOSE2F 远端可信 IP 执行口径修正 -> WREMOTE1/WFULLSMOKE2 远端收口 -> WEXT1-FORMAL 正式模板外出/加班测试 -> WREAL1 小范围真实试用(首批 1 名真实员工 + 1 名审批人/管理员观察) -> `wecom_attendance_approval_mirror_v1` 最小完整镜像。当前 WAPC2FLIVE、WCBK1、WACP3R、请假/补卡 WREAD1、WADM1、WARCH1、WARCH2、WARCH3/WCHECK1/WEXT1/WOPS1 均已完成;后续不得跳过三天业务冒烟、审批规则门禁、远端收口、正式模板外出/加班测试、真实试用等独立门禁直接做完整镜像。真实回调必须先证明验签、解密、幂等和重复投递;补偿拉取必须先证明按时间窗口拿到审批单号并可拉详情;可读性门禁必须确认审批消息、列表、详情页和快捷同意/驳回误操作风险;审批规则门禁必须确认申请人不能任意选择审批人、审批人自动带出且非自审;镜像实现前必须先有字段、状态机、幂等键、索引和隐私保留边界设计。
WEGOV1 后的企业微信测试环境口径:不假设自建应用有完整隔离 sandbox。自动化优先覆盖 API、回调、补偿拉取、脱敏报告和 OA 留存校验;人工只确认后台不可 API 化配置、真机收到/点击、审批详情是否看得清、正式写入和应急风险拍板。 WEGOV1 后的企业微信测试环境口径:不假设自建应用有完整隔离 sandbox。自动化优先覆盖 API、回调、补偿拉取、脱敏报告和 OA 留存校验;人工只确认后台不可 API 化配置、真机收到/点击、审批详情是否看得清、正式写入和应急风险拍板。
+7 -7
查看文件
@@ -56,9 +56,9 @@
| 恢复回写层 | OA + 企业微信 API | 企微恢复后由 `wecom_recovery_writeback_v1` 对应急数据执行 dry-run、自动回写、失败重试和冲突清单。 | | 恢复回写层 | OA + 企业微信 API | 企微恢复后由 `wecom_recovery_writeback_v1` 对应急数据执行 dry-run、自动回写、失败重试和冲突清单。 |
| 财务主办层 | OA | 报销、PDF 发票 OCR、发票查重、付款批次、银行回单、AP 台账、代账交接继续 OA 主办,不迁移到企微。 | | 财务主办层 | OA | 报销、PDF 发票 OCR、发票查重、付款批次、银行回单、AP 台账、代账交接继续 OA 主办,不迁移到企微。 |
无痛切换是长期目标,不代表本轮已实现完整替代。完整镜像按域定义:企微主办域镜像到 OA;OA 主办域不反向全量镜像到企微,只发送脱敏标题、业务类型、业务编号、状态和 OA 链接。WEGOV1 后,OA 不重造企业微信完整打卡/考勤/HR 产品,但必须保存企微关键历史、完整外部关联键和必要快照,保证企微不可用时可查看既有数据。WROAD2 后“可受控使用”和“完整镜像增强”分离:先用测试账号 `SMOKE002 -> SMOKE101 + HYD000006/wangshunli` 做 3 天每日脚本化巡检,允许补偿归档写 OA 自建留存库,不写企业微信;WARCH3 改为 07:30 自动巡检,WCHECK1 优先做打卡摘要留存,WEXT1 只做外出/加班 dry-run,WOPS1 后只报新增异常或状态恶化,WROAD2-BIZ1 补充三天测试账号打卡/请假/补卡/OA 离线查看人工业务冒烟,WAPPR1 把审批人自动带出和禁止申请人任意选择审批人列为真实试用前门禁,图片 OCR、复杂 BPM、预算、ERP、银行流水导入等 P2 大功能继续冻结。后续必须按 `wecom_hr_master_sync_v1`、`runtime_first_wecom_enablement`、`WOUA-FIX / WECOM-RUNTIME-READY-V1`、`WAPC1 审批配置准备`、`WAPC2 请假/补卡只读 POC`、`WAPC2F 自动生成 POC 样件`、`WAPC2FLIVE live 创建与 WAPC2 自动复跑`、`WCBK1 回调只读 POC(真实事件已确认)`、`WEGOV1 企微主办治理与自建留存路线修正`、`WACP3/WACP3R 补偿拉取 POC`、`WREAD1 审批可读性与误审批防护门禁`、`WADM1 自建留存/镜像数据模型设计`、`WARCH1 最小自建历史留存实现`、`WARCH2 正式只读历史查询`、`WROAD2+OPS 受控上线与每日巡检`、`WARCH3 归档稳定化自动巡检`、`WCHECK1 打卡摘要留存`、`WEXT1 外出/加班 dry-run`、`WOPS1 巡检告警降噪`、`WROAD2-CLOSEOUT 三天验收`、`WROAD2-BIZ1 三天业务冒烟`、`WAPPR1 审批规则规范化`、`WEXT1-LIVE 外出/加班测试号 live POC`、`WREAL1 小范围真实试用`、`wecom_attendance_approval_mirror_v1`(承接旧口径 `wecom_native_approval_mirror_v1`)、`oa_hr_emergency_mode_v1`、`wecom_recovery_writeback_v1` 和 `wecom_ruleops_v1` 分阶段拆 Issue CSV;WREAL1 必须等请假、补卡、外出、加班四类测试号证据和审批规则门禁通过后再问答启动。 无痛切换是长期目标,不代表本轮已实现完整替代。完整镜像按域定义:企微主办域镜像到 OA;OA 主办域不反向全量镜像到企微,只发送脱敏标题、业务类型、业务编号、状态和 OA 链接。WEGOV1 后,OA 不重造企业微信完整打卡/考勤/HR 产品,但必须保存企微关键历史、完整外部关联键和必要快照,保证企微不可用时可查看既有数据。WROAD2 后“可受控使用”和“完整镜像增强”分离:先用测试账号 `SMOKE002 -> SMOKE101 + HYD000006/wangshunli` 做 3 天每日脚本化巡检,允许补偿归档写 OA 自建留存库,不写企业微信;WARCH3 改为 07:30 自动巡检,WCHECK1 优先做打卡摘要留存,WEXT1 只做外出/加班 dry-run,WOPS1 后只报新增异常或状态恶化,WROAD2-BIZ1 补充三天测试账号打卡/请假/补卡/OA 离线查看人工业务冒烟,WAPPR1 把审批人自动带出和禁止申请人任意选择审批人列为真实试用前门禁,图片 OCR、复杂 BPM、预算、ERP、银行流水导入等 P2 大功能继续冻结。后续必须按 `wecom_hr_master_sync_v1`、`runtime_first_wecom_enablement`、`WOUA-FIX / WECOM-RUNTIME-READY-V1`、`WAPC1 审批配置准备`、`WAPC2 请假/补卡只读 POC`、`WAPC2F 自动生成 POC 样件`、`WAPC2FLIVE live 创建与 WAPC2 自动复跑`、`WCBK1 回调只读 POC(真实事件已确认)`、`WEGOV1 企微主办治理与自建留存路线修正`、`WACP3/WACP3R 补偿拉取 POC`、`WREAD1 审批可读性与误审批防护门禁`、`WADM1 自建留存/镜像数据模型设计`、`WARCH1 最小自建历史留存实现`、`WARCH2 正式只读历史查询`、`WROAD2+OPS 受控上线与每日巡检`、`WARCH3 归档稳定化自动巡检`、`WCHECK1 打卡摘要留存`、`WEXT1 外出/加班 dry-run`、`WOPS1 巡检告警降噪`、`WROAD2-CLOSEOUT 三天验收`、`WROAD2-BIZ1 三天业务冒烟`、`WAPPR1 审批规则规范化`、`WRULE1 审批链校验器 POC`、`WAUTO1/WFULLSMOKE1 自动证据和全域 smoke`、`WTCLOSE2/WREMOTE1/WFULLSMOKE2 远端收口`、`WEXT1-FORMAL 正式模板外出/加班测试`、`WREAL1 小范围真实试用`、`wecom_attendance_approval_mirror_v1`(承接旧口径 `wecom_native_approval_mirror_v1`)、`oa_hr_emergency_mode_v1`、`wecom_recovery_writeback_v1` 和 `wecom_ruleops_v1` 分阶段拆 Issue CSV;WREAL1 必须等请假、补卡、外出、加班四类测试号证据和审批规则门禁通过后再问答启动。
WROUTE2 后,企微 HR/考勤路线尾部以 `WAUTO1 -> WEXT1LD -> WFULLSMOKE1 -> WROUTE2 -> WEXT1-LIVE -> WREAL1(首批 1 名真实员工 + 1 名审批人/管理员观察) -> wecom_attendance_approval_mirror_v1 最小完整镜像 -> oa_hr_emergency_mode_v1 -> wecom_recovery_writeback_v1 -> wecom_ruleops_v1` 为准;WROUTE2 只锁定路线,不授权 live 写企微、不启用真实员工、不创建外出/加班样件。 WROUTE2/WREMOTE1 后,企微 HR/考勤路线尾部以 `WAUTO1 -> WEXT1LD -> WFULLSMOKE1 -> WROUTE2 -> WTCLOSE2/WTCLOSE2F -> WREMOTE1/WFULLSMOKE2 -> WEXT1-FORMAL -> WREAL1(首批 1 名真实员工 + 1 名审批人/管理员观察) -> wecom_attendance_approval_mirror_v1 最小完整镜像 -> oa_hr_emergency_mode_v1 -> wecom_recovery_writeback_v1 -> wecom_ruleops_v1` 为准;WROUTE2 只锁定路线,WREMOTE1 只授权远端只读/全域 smoke,不授权写企微、不启用真实员工、不创建外出/加班样件。
### 1.5 DBWFOC 数据边界修正 ### 1.5 DBWFOC 数据边界修正
@@ -79,9 +79,9 @@ WFDG 将 DBWFOC 后的产品方向固化为开发前设计门禁。本节只代
| 报销、采购、合同、项目、付款、AP、代账 | OA | 主办提交、审批、附件、导出、付款批次、审计和代账资料 | 只发送脱敏消息和 OA deeplink | 采购单附件、合同正文、报价、供应商资料、发票、银行回单和代账资料不进入企微原生审批或企微附件 | | 报销、采购、合同、项目、付款、AP、代账 | OA | 主办提交、审批、附件、导出、付款批次、审计和代账资料 | 只发送脱敏消息和 OA deeplink | 采购单附件、合同正文、报价、供应商资料、发票、银行回单和代账资料不进入企微原生审批或企微附件 |
| RuleOps | OA + 企业微信 API | AI 草拟、差异报告、dry-run、人工确认、审计和回滚建议 | 接收经确认的审批模板、打卡规则、排班、假期余额或人事字段配置写入 | AI 不得直接改正式规则;每次写入保存前后快照、确认人、API `errcode` 和失败原因 | | RuleOps | OA + 企业微信 API | AI 草拟、差异报告、dry-run、人工确认、审计和回滚建议 | 接收经确认的审批模板、打卡规则、排班、假期余额或人事字段配置写入 | AI 不得直接改正式规则;每次写入保存前后快照、确认人、API `errcode` 和失败原因 |
`WECOM-CAPABILITY-POC-V1` / WCPC 已按 `CAN_REUSE_NOW`、`NEEDS_CONFIG`、`NEEDS_API_POC`、`KEEP_OA_PRIMARY`、`NOT_SUPPORTED_BY_API` 输出人事助手、通讯录、打卡、审批、假期余额、回调和权限配置能力矩阵,并达到 HR 主数据镜像准入。WHMS/WHMSLIVE 已完成 HR 主数据镜像实现和受控公网验证;WAPI 已固定 API/Secret 口径并复跑 WOUA;WRRA 后明确 `PASS_WITH_FINDINGS` 不能直接放行深度镜像;WOUA-FIX 已将 7 个缺企微测试账号软归档并复检 `oaActiveMissingInWecom=0`,企微缺字段先接受不补;WMSG1 已证明真实企微应用消息和 Deeplink 可用;WAPC1 已固化审批配置准备清单;WAPC2 已提供请假/补卡只读 POC runner;WAPC2FLIVE 已创建 OA-POC 样件并自动复跑通过;WCBK1 已完成真实回调 URL 验证和审批状态事件确认;WACP3R 已自动发现 OA-POC 请假/补卡模板并证明补偿拉取和详情读取可用;WPROC1/WPROC2 已固定自动化优先、非自审、高风险 POC 前置和 process gate;WEGOV1 固定企微主办 + OA 自建留存路线;WARCH1/WARCH2 已完成请假/补卡最小留存和正式只读查询;WARCH3/WCHECK1/WEXT1/WOPS1 补齐自动巡检、打卡摘要、外出/加班 dry-run 和告警降噪;WROAD2-BIZ1/WAPPR1 固定三天人工业务冒烟和审批规则规范化门禁。生产写接口必须单独批准。正式开发顺序为 `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC(真实事件已确认)` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `WARCH2 正式只读历史查询` -> `WROAD2+OPS 受控上线与每日巡检` -> `WARCH3 归档稳定化自动巡检` -> `WCHECK1 打卡摘要留存` -> `WEXT1 外出/加班 dry-run` -> `WOPS1 巡检告警降噪` -> `WROAD2-CLOSEOUT 三天验收` -> `WROAD2-BIZ1 三天业务冒烟` -> `WAPPR1 审批规则规范化` -> `WEXT1-LIVE 外出/加班测试号 live POC` -> `WREAL1 小范围真实试用` -> `wecom_attendance_approval_mirror_v1`(承接旧口径 `wecom_native_approval_mirror_v1`)-> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1`;WREAL1 不能仅凭测试号巡检启动,必须等四类测试号证据和审批规则门禁通过后再问答。 `WECOM-CAPABILITY-POC-V1` / WCPC 已按 `CAN_REUSE_NOW`、`NEEDS_CONFIG`、`NEEDS_API_POC`、`KEEP_OA_PRIMARY`、`NOT_SUPPORTED_BY_API` 输出人事助手、通讯录、打卡、审批、假期余额、回调和权限配置能力矩阵,并达到 HR 主数据镜像准入。WHMS/WHMSLIVE 已完成 HR 主数据镜像实现和受控公网验证;WAPI 已固定 API/Secret 口径并复跑 WOUA;WRRA 后明确 `PASS_WITH_FINDINGS` 不能直接放行深度镜像;WOUA-FIX 已将 7 个缺企微测试账号软归档并复检 `oaActiveMissingInWecom=0`,企微缺字段先接受不补;WMSG1 已证明真实企微应用消息和 Deeplink 可用;WAPC1 已固化审批配置准备清单;WAPC2 已提供请假/补卡只读 POC runner;WAPC2FLIVE 已创建 OA-POC 样件并自动复跑通过;WCBK1 已完成真实回调 URL 验证和审批状态事件确认;WACP3R 已自动发现 OA-POC 请假/补卡模板并证明补偿拉取和详情读取可用;WPROC1/WPROC2 已固定自动化优先、非自审、高风险 POC 前置和 process gate;WEGOV1 固定企微主办 + OA 自建留存路线;WARCH1/WARCH2 已完成请假/补卡最小留存和正式只读查询;WARCH3/WCHECK1/WEXT1/WOPS1 补齐自动巡检、打卡摘要、外出/加班 dry-run 和告警降噪;WROAD2-BIZ1/WAPPR1/WRULE1 固定三天人工业务冒烟、审批规则规范化和审批链校验门禁。生产写接口必须单独批准。正式开发顺序为 `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC(真实事件已确认)` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `WARCH2 正式只读历史查询` -> `WROAD2+OPS 受控上线与每日巡检` -> `WARCH3 归档稳定化自动巡检` -> `WCHECK1 打卡摘要留存` -> `WEXT1 外出/加班 dry-run` -> `WOPS1 巡检告警降噪` -> `WROAD2-CLOSEOUT 三天验收` -> `WROAD2-BIZ1 三天业务冒烟` -> `WAPPR1 审批规则规范化` -> `WRULE1 审批链校验器 POC` -> `WAUTO1/WFULLSMOKE1 自动证据和全域 smoke` -> `WTCLOSE2/WTCLOSE2F 远端可信 IP 执行口径修正` -> `WREMOTE1/WFULLSMOKE2 远端收口` -> `WEXT1-FORMAL 正式模板外出/加班测试` -> `WREAL1 小范围真实试用` -> `wecom_attendance_approval_mirror_v1`(承接旧口径 `wecom_native_approval_mirror_v1`)-> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1`;WREAL1 不能仅凭测试号巡检启动,必须等四类测试号证据和审批规则门禁通过后再问答。
WROUTE2 进一步锁定尾部顺序:`WFULLSMOKE1 -> WROUTE2 -> WEXT1-LIVE -> WREAL1(首批 1 名真实员工 + 1 名审批人/管理员观察) -> wecom_attendance_approval_mirror_v1 最小完整镜像`;应急接管、恢复回写和 RuleOps 均排在最小完整镜像稳定之后。 WROUTE2/WREMOTE1 进一步锁定尾部顺序:`WFULLSMOKE1 -> WROUTE2 -> WTCLOSE2/WTCLOSE2F -> WREMOTE1/WFULLSMOKE2 -> WEXT1-FORMAL -> WREAL1(首批 1 名真实员工 + 1 名审批人/管理员观察) -> wecom_attendance_approval_mirror_v1 最小完整镜像`;应急接管、恢复回写和 RuleOps 均排在最小完整镜像稳定之后。
### 1.7 WDRG 开发路线图门禁 ### 1.7 WDRG 开发路线图门禁
@@ -94,7 +94,7 @@ WDRG 将 WFDG 后的设计门禁转化为开发节奏门禁。本节只代表路
| `runtime_first_wecom_enablement` | 优先利用入口、免登/绑定、脱敏消息、deeplink、通讯录 userid 清单、人事助手读取、打卡读取和只读对账 | API/Secret 口径固定,WOUA 差异已分类并有处理决策 | | `runtime_first_wecom_enablement` | 优先利用入口、免登/绑定、脱敏消息、deeplink、通讯录 userid 清单、人事助手读取、打卡读取和只读对账 | API/Secret 口径固定,WOUA 差异已分类并有处理决策 |
| `WOUA-FIX / WECOM-RUNTIME-READY-V1` | 收口 OA/企微用户一致性差异和运行优先准入 | 区分真实员工、测试账号、待补企微字段、待清理绑定和 WHMS 批量窗口决策 | | `WOUA-FIX / WECOM-RUNTIME-READY-V1` | 收口 OA/企微用户一致性差异和运行优先准入 | 区分真实员工、测试账号、待补企微字段、待清理绑定和 WHMS 批量窗口决策 |
| `WAPC2FLIVE -> WCBK1 -> WACP3/WACP3R -> WREAD1 -> WADM1 -> WARCH1 -> WARCH2` | 先用请假/补卡低风险样例证明审批详情、回调、补偿拉取、可读性、自建留存和只读查询 | 已完成请假/补卡最小链路;仍不代表完整镜像、外出/加班、应急接管或恢复回写 | | `WAPC2FLIVE -> WCBK1 -> WACP3/WACP3R -> WREAD1 -> WADM1 -> WARCH1 -> WARCH2` | 先用请假/补卡低风险样例证明审批详情、回调、补偿拉取、可读性、自建留存和只读查询 | 已完成请假/补卡最小链路;仍不代表完整镜像、外出/加班、应急接管或恢复回写 |
| `WROAD2+OPS -> WARCH3 -> WCHECK1 -> WEXT1 -> WOPS1 -> WROAD2-CLOSEOUT -> WROAD2-BIZ1 -> WAPPR1 -> WEXT1-LIVE -> WREAL1` | 先测试账号受控上线和每日巡检,再做归档稳定化自动巡检、打卡摘要留存、外出/加班 dry-run、告警降噪、三天验收、人工业务冒烟、审批规则规范化和外出/加班测试号 live POC;四类测试号证据和规则门禁通过后才问真实试用 | 3 天巡检报告、归档/打卡摘要边界、审批规则门禁和四类测试号证据明确后,再评估真实试用和完整镜像 | | `WROAD2+OPS -> WARCH3 -> WCHECK1 -> WEXT1 -> WOPS1 -> WROAD2-CLOSEOUT -> WROAD2-BIZ1 -> WAPPR1 -> WRULE1 -> WTCLOSE2/WREMOTE1 -> WEXT1-FORMAL -> WREAL1` | 先测试账号受控上线和每日巡检,再做归档稳定化自动巡检、打卡摘要留存、外出/加班 dry-run、告警降噪、三天验收、人工业务冒烟、审批规则规范化、审批链校验、远端收口和正式模板外出/加班人工测试;四类测试号证据和规则门禁通过后才问真实试用 | 远端巡检报告、归档/打卡摘要边界、审批规则门禁和四类测试号证据明确后,再评估真实试用和完整镜像 |
| `wecom_attendance_approval_mirror_v1` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA | WREAL1 通过或明确批准后再拆;OA 可查询企微 HR/考勤镜像、考勤解释和审计 | | `wecom_attendance_approval_mirror_v1` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA | WREAL1 通过或明确批准后再拆;OA 可查询企微 HR/考勤镜像、考勤解释和审计 |
| `oa_hr_emergency_mode_v1` | 企业微信不可用时管理员人工开启 OA HR/考勤应急接管 | 应急单据带 `EMERGENCY` 标记,开启/关闭均有原因、范围、责任人和审计 | | `oa_hr_emergency_mode_v1` | 企业微信不可用时管理员人工开启 OA HR/考勤应急接管 | 应急单据带 `EMERGENCY` 标记,开启/关闭均有原因、范围、责任人和审计 |
| `wecom_recovery_writeback_v1` | 企微恢复后,OA 应急数据先 dry-run,再回写企微 | 生成成功、失败、跳过和冲突清单,不静默覆盖企微正式记录 | | `wecom_recovery_writeback_v1` | 企微恢复后,OA 应急数据先 dry-run,再回写企微 | 生成成功、失败、跳过和冲突清单,不静默覆盖企微正式记录 |
@@ -112,7 +112,7 @@ WCP1 已按“Live 只读 + 测试员工优先”完成企业微信能力 POC。
| 通讯录 | `CAN_REUSE_NOW` | HCLT 已证明 `HRWDTEST-20260517214548` create/update/disable 成功,部门读取可用;WCPC 对既有在职测试号的成员读取已通过。 | | 通讯录 | `CAN_REUSE_NOW` | HCLT 已证明 `HRWDTEST-20260517214548` create/update/disable 成功,部门读取可用;WCPC 对既有在职测试号的成员读取已通过。 |
| 人事助手 | `CAN_REUSE_NOW_FOR_READ` | 字段配置读取可用;WCPC 对既有在职测试号的花名册读取已通过;资料更新属于写接口,需后续单独批准 POC。 | | 人事助手 | `CAN_REUSE_NOW_FOR_READ` | 字段配置读取可用;WCPC 对既有在职测试号的花名册读取已通过;资料更新属于写接口,需后续单独批准 POC。 |
| 打卡 | `CAN_REUSE_NOW_FOR_READ` | WCPC 短窗口打卡记录和规则读取已通过;日报、月报、排班等细分能力留到考勤镜像合同继续验证。 | | 打卡 | `CAN_REUSE_NOW_FOR_READ` | WCPC 短窗口打卡记录和规则读取已通过;日报、月报、排班等细分能力留到考勤镜像合同继续验证。 |
| 审批与假期余额 | `PARTIAL_NEEDS_CONFIG` | 假期余额读取已通过;WAPC2FLIVE 已生成请假/补卡 OA-POC 模板和低风险测试审批单并复跑只读 POC 通过;真实回调、补偿拉取、镜像数据模型、外出/加班样例或处理决策仍需后续考勤/审批镜像前补齐。 | | 审批与假期余额 | `PARTIAL_NEEDS_CONFIG` | 假期余额读取已通过;WAPC2FLIVE 已生成请假/补卡 OA-POC 模板和低风险测试审批单并复跑只读 POC 通过;正式模板外出/加班测试、远端收口、真实试用和最小完整镜像仍需后续合同补齐。 |
| OA 主办高敏审批 | `KEEP_OA_PRIMARY` | 报销、采购、合同、项目、付款、AP 和代账继续 OA 主办,企微只做脱敏消息和 OA deeplink。 | | OA 主办高敏审批 | `KEEP_OA_PRIMARY` | 报销、采购、合同、项目、付款、AP 和代账继续 OA 主办,企微只做脱敏消息和 OA deeplink。 |
WCP1 历史结论为 `PAUSE_FOR_CONFIG`,不是 `GO_TO_HR_MASTER_SYNC`;该阻断已由 WCPC 复跑收口。WCP1 报告继续作为初始配置缺口证据保留,当前 HR 主数据镜像准入以 WCPC 结论为准。 WCP1 历史结论为 `PAUSE_FOR_CONFIG`,不是 `GO_TO_HR_MASTER_SYNC`;该阻断已由 WCPC 复跑收口。WCP1 报告继续作为初始配置缺口证据保留,当前 HR 主数据镜像准入以 WCPC 结论为准。
@@ -305,7 +305,7 @@ WFOC/DBWFOC 后审批分为两类:OA 主办审批和企微主办审批。OA
- 企业微信打卡用于原始采集和规则执行,保留其定位、人脸、Wi-Fi、排班、设备和防作弊能力。 - 企业微信打卡用于原始采集和规则执行,保留其定位、人脸、Wi-Fi、排班、设备和防作弊能力。
- OA 不重造企业微信打卡规则、定位、人脸识别、排班或防作弊引擎。 - OA 不重造企业微信打卡规则、定位、人脸识别、排班或防作弊引擎。
- 请假、补卡、外出、加班等考勤修正申请优先在企业微信原生审批中提交和处理。 - 请假、补卡、外出、加班等考勤修正申请优先在企业微信原生审批中提交和处理。
- OA 先通过 WARCH1/WARCH2 保存并查询请假/补卡已归档历史,再通过 WROAD2+OPS 做测试账号受控巡检;`WCHECK1` 已保存打卡日/月摘要、异常摘要和规则快照,`WEXT1` 已完成外出/加班 dry-run,`WROAD2-BIZ1` 补充三天人工业务冒烟,`WAPPR1` 固定审批人规则规范化门禁。完整 `wecom_attendance_approval_mirror_v1` 需等 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WEXT1-LIVE、四类测试号证据和 WREAL1 通过或明确批准后再拆。 - OA 先通过 WARCH1/WARCH2 保存并查询请假/补卡已归档历史,再通过 WROAD2+OPS 做测试账号受控巡检;`WCHECK1` 已保存打卡日/月摘要、异常摘要和规则快照,`WEXT1` 已完成外出/加班 dry-run,`WROAD2-BIZ1` 补充三天人工业务冒烟,`WAPPR1` 固定审批人规则规范化门禁。完整 `wecom_attendance_approval_mirror_v1` 需等 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WRULE1、WTCLOSE2/WREMOTE1、WEXT1-FORMAL、四类测试号证据和 WREAL1 通过或明确批准后再拆。
- 企业微信不可用时,管理员可人工开启 `oa_hr_emergency_mode_v1`,临时开放 OA 提交和审批;应急单据带 `EMERGENCY` 标记并进入恢复回写队列。 - 企业微信不可用时,管理员可人工开启 `oa_hr_emergency_mode_v1`,临时开放 OA 提交和审批;应急单据带 `EMERGENCY` 标记并进入恢复回写队列。
### 7.2 用户流程 ### 7.2 用户流程
+16 -16
查看文件
@@ -1,11 +1,11 @@
# hyb-oa 管理员手册(10 人以下团队版) # hyb-oa 管理员手册(10 人以下团队版)
**当前状态(2026-05-20 / WOPS1/WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1/WRULE1/WREAL1-PREP 后)**:R7E、PRELAUNCH、财务闭环、ATTV1、HR-WECOM-DIRECTORY-V1、WAPI、WOUA-FIX、WRV1/WRA1、WMSG1、WAPC1/WAPC2、WPROC1/WPROC2、WAPC2F dry-run、WAPC2FLIVE、WCBK1、WEGOV1、WACP3/WACP3R、WREAD1/WREAD1F、WADM1、WARCH1 和 WARCH2 均已收口到当前开发阶段;WROAD2+OPS 已完成测试账号受控上线 Day 0 巡检,报告 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` 为 `PASS_WITH_FINDINGS`;SYSTEM-COMPLETE-GATE 结论为 `GO_TO_USE`。WAPI 后固定企微 API 能力目录和 Secret 矩阵:通讯录使用 `WECOM_CONTACT_SECRET`,人事助手/打卡/消息/OAuth/审批读取使用 `WECOM_AGENT_SECRET`,运行时代码不得靠多个 Secret 试错。WAPC2FLIVE 已创建 OA-POC 请假/补卡测试模板和低风险测试审批单,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`;测试模板和审批记录保留审计,不自动删除。WCBK1 已部署只读回调端点和 runner,远端完成回调 URL 验证并收到一条由 `SMOKE101` 同意现有 OA-POC 补卡测试单触发的真实审批状态事件,报告 `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T092648Z/summary.json` 为 `PASS_CALLBACK_EVENT_CONFIRMED`。WACP3R 已新增自动发现模板 ID 路径并公网只读复跑,报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` 为 `PASS_WITH_FINDINGS`;WREAD1F 新样例后,用户确认请假/补卡在企业微信消息卡片、列表和详情页均可看清,远端报告 `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` 为 `PASS_READABLE`。WARCH1 已新增并部署请假/补卡最小审批历史留存:回调事件默认入 OA DB,补偿拉取可在 `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1` 双开关下写 OA 留存,离线 runner 可不调用企微 API 读取已保存历史摘要;公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` 和 `/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` 均为 `PASS_WITH_FINDINGS`,2 条请假/补卡历史可离线读取,finding 是旧回调未入库历史 gap。WARCH2 已新增只读历史查询 API 和 PC/移动历史页:页面入口为“企微审批历史”,文案固定“企业微信主办,OA 自建留存”和“仅已归档记录”,只读 OA DB,不调用企微 API,不提供审批动作;权限按本人相关、直属下属和 HR/admin/* 分层,申请人未映射或 callback-only 记录仅 HR/admin/* 可见。WARCH3 已新增 07:30 systemd timer 巡检和脱敏企微告警;WOPS1 将默认告警收件员工号修正为 `HYD000006`,也就是管理员 `wangshunli` 的员工号,并把策略改为只在阻断、脚本失败、新增 finding 或状态恶化时发送,已知 observation 不重复告警。WCHECK1 已新增打卡规范化明细、日/月摘要和规则快照留存;WEXT1 已支持外出/加班 dry-run,但未 live 创建模板或审批单。WROAD2-BIZ1 固定三天内补充测试账号人工业务冒烟:`SMOKE002` 打卡、请假、补卡,`SMOKE101` 先看详情再审批,`HYD000006` 查看 OA 归档历史和打卡摘要;WAPPR1 固定审批规则门禁,申请人不得任意选择审批人,正式模板必须自动带出审批人,缺审批人或自审时阻断。WRULE1 新增只读审批链校验器:OA 按员工直属主管、指定审批角色和管理员兜底计算理论审批人,再与 OA 已归档的企微实际审批链对比;它不读取企微后台规则、不写企业微信、不替代 WAPPR1 人工 A/B/C/D 门禁。巡检只允许补偿归档和打卡摘要写 OA 留存库,不写企业微信、不扩大真实员工。WREAL1-PREP 只准备真实小范围试用清单,当前不启用真实员工;三天巡检、业务冒烟和审批规则门禁后先问答是否进入 WEXT1-LIVE 外出/加班测试号 live POC,四类测试号证据和 WAPPR1/WRULE1 通过后才问是否启动真实小范围试用。同意单击即通过风险已进入归档审计事实,后续正式历史页和操作规程继续突出动作来源与补偿一致性。采购、费用、合同、项目、报销、付款、AP、代账交接和高敏附件继续 OA 主办,企业微信只做脱敏提醒和 OA deeplink。公网 `payment_batch_v1=force_on`,`erp_sync=force_off`。公司当前无 ERP/独立财务系统,且 ERP 未来不接入 OA;财务闭环以 OA 内审批、台账、付款批次、银行对公付款回单和月度代账交接为准。 **当前状态(2026-05-20 / WOPS1/WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1/WRULE1/WREAL1-PREP 后)**:R7E、PRELAUNCH、财务闭环、ATTV1、HR-WECOM-DIRECTORY-V1、WAPI、WOUA-FIX、WRV1/WRA1、WMSG1、WAPC1/WAPC2、WPROC1/WPROC2、WAPC2F dry-run、WAPC2FLIVE、WCBK1、WEGOV1、WACP3/WACP3R、WREAD1/WREAD1F、WADM1、WARCH1 和 WARCH2 均已收口到当前开发阶段;WROAD2+OPS 已完成测试账号受控上线 Day 0 巡检,报告 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` 为 `PASS_WITH_FINDINGS`;SYSTEM-COMPLETE-GATE 结论为 `GO_TO_USE`。WAPI 后固定企微 API 能力目录和 Secret 矩阵:通讯录使用 `WECOM_CONTACT_SECRET`,人事助手/打卡/消息/OAuth/审批读取使用 `WECOM_AGENT_SECRET`,运行时代码不得靠多个 Secret 试错。WAPC2FLIVE 已创建 OA-POC 请假/补卡测试模板和低风险测试审批单,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`;测试模板和审批记录保留审计,不自动删除。WCBK1 已部署只读回调端点和 runner,远端完成回调 URL 验证并收到一条由 `SMOKE101` 同意现有 OA-POC 补卡测试单触发的真实审批状态事件,报告 `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T092648Z/summary.json` 为 `PASS_CALLBACK_EVENT_CONFIRMED`。WACP3R 已新增自动发现模板 ID 路径并公网只读复跑,报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` 为 `PASS_WITH_FINDINGS`;WREAD1F 新样例后,用户确认请假/补卡在企业微信消息卡片、列表和详情页均可看清,远端报告 `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` 为 `PASS_READABLE`。WARCH1 已新增并部署请假/补卡最小审批历史留存:回调事件默认入 OA DB,补偿拉取可在 `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1` 双开关下写 OA 留存,离线 runner 可不调用企微 API 读取已保存历史摘要;公网报告 `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` 和 `/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` 均为 `PASS_WITH_FINDINGS`,2 条请假/补卡历史可离线读取,finding 是旧回调未入库历史 gap。WARCH2 已新增只读历史查询 API 和 PC/移动历史页:页面入口为“企微审批历史”,文案固定“企业微信主办,OA 自建留存”和“仅已归档记录”,只读 OA DB,不调用企微 API,不提供审批动作;权限按本人相关、直属下属和 HR/admin/* 分层,申请人未映射或 callback-only 记录仅 HR/admin/* 可见。WARCH3 已新增 07:30 systemd timer 巡检和脱敏企微告警;WOPS1 将默认告警收件员工号修正为 `HYD000006`,也就是管理员 `wangshunli` 的员工号,并把策略改为只在阻断、脚本失败、新增 finding 或状态恶化时发送,已知 observation 不重复告警。WCHECK1 已新增打卡规范化明细、日/月摘要和规则快照留存;WEXT1 已支持外出/加班 dry-run,但未 live 创建模板或审批单。WROAD2-BIZ1 固定三天内补充测试账号人工业务冒烟:`SMOKE002` 打卡、请假、补卡,`SMOKE101` 先看详情再审批,`HYD000006` 查看 OA 归档历史和打卡摘要;WAPPR1 固定审批规则门禁,申请人不得任意选择审批人,正式模板必须自动带出审批人,缺审批人或自审时阻断。WRULE1 新增只读审批链校验器:OA 按员工直属主管、指定审批角色和管理员兜底计算理论审批人,再与 OA 已归档的企微实际审批链对比;它不读取企微后台规则、不写企业微信、不替代 WAPPR1 人工 A/B/C/D 门禁。巡检只允许补偿归档和打卡摘要写 OA 留存库,不写企业微信、不扩大真实员工。WREAL1-PREP 只准备真实小范围试用清单,当前不启用真实员工;三天巡检、业务冒烟和审批规则门禁后先问答是否进入 WEXT1-FORMAL 正式模板外出/加班测试,四类测试号证据和 WAPPR1/WRULE1 通过后才问是否启动真实小范围试用。同意单击即通过风险已进入归档审计事实,后续正式历史页和操作规程继续突出动作来源与补偿一致性。采购、费用、合同、项目、报销、付款、AP、代账交接和高敏附件继续 OA 主办,企业微信只做脱敏提醒和 OA deeplink。公网 `payment_batch_v1=force_on`,`erp_sync=force_off`。公司当前无 ERP/独立财务系统,且 ERP 未来不接入 OA;财务闭环以 OA 内审批、台账、付款批次、银行对公付款回单和月度代账交接为准。
**WROUTE2 后续路线锁定**:继续先收口测试账号全域证据,不提前启用真实员工。WAPPR1 四类模板必须达到 A(审批人自动带出,申请人不能任意选择)后,才允许另建 WEXT1-LIVE 合同并再次问答是否一次性 live 创建外出+加班测试号样件。请假、补卡、外出、加班四类测试号证据通过后,WREAL1 首批固定为 1 名真实员工 + 1 名审批人/管理员观察;WREAL1 通过后优先规划 `wecom_attendance_approval_mirror_v1` 最小完整镜像,应急接管、恢复回写和 RuleOps 均后置。 **WROUTE2/WREMOTE1 后续路线锁定**:继续先收口测试账号全域证据,不提前启用真实员工。WAPPR1 四类模板必须达到 A(审批人自动带出,申请人不能任意选择)后,下一步不再自动创建外出/加班 OA-POC 模板,而是先远端执行 WTCLOSE2 和 WFULLSMOKE2,再问答是否由 `SMOKE002` 在正式模板提交外出+加班测试单、`SMOKE101` 先看详情再审批。请假、补卡、外出、加班四类测试号证据通过后,WREAL1 首批固定为 1 名真实员工 + 1 名审批人/管理员观察;WREAL1 通过后优先规划 `wecom_attendance_approval_mirror_v1` 最小完整镜像,应急接管、恢复回写和 RuleOps 均后置。
**WTCLOSE1 小团队规则**:公司不到 10 人时,HR/考勤审批先按一层直属主管或指定审批角色自动带出审批人,申请人不能任意改人;主管链缺失、审批人不可见/停用/未绑定或命中自审时,管理员兜底或阻断。当前目标是请假、补卡、外出、加班四类模板均达到 A;本轮自动工作只到 WAUTO1/WFULLSMOKE1 汇总和 WEXT1-LIVE 前 dry-run,不创建企微样件。 **WTCLOSE1 小团队规则**:公司不到 10 人时,HR/考勤审批先按一层直属主管或指定审批角色自动带出审批人,申请人不能任意改人;主管链缺失、审批人不可见/停用/未绑定或命中自审时,管理员兜底或阻断。当前目标是请假、补卡、外出、加班四类模板均达到 A;本轮自动工作只到 WAUTO1/WFULLSMOKE1 汇总、WEXT1LD dry-run 和 WREMOTE1 远端收口,不创建企微样件。
**WAPPR1 2026-05-21 真机结论**:测试员工直属上级已设置为测试主管;请假、补卡、外出、加班提交页均自动带出测试主管,且申请人不能删除、改人或新增审批人,四类模板均按 A 记录。该结论仍需结合提交后的 WRULE1 实际审批链校验和三天业务冒烟证据,不单独放行真实员工试用。 **WAPPR1 2026-05-21 真机结论**:测试员工直属上级已设置为测试主管;请假、补卡、外出、加班提交页均自动带出测试主管,且申请人不能删除、改人或新增审批人,四类模板均按 A 记录。该结论仍需结合提交后的 WRULE1 实际审批链校验和三天业务冒烟证据,不单独放行真实员工试用。
**WRULE1 审批链校验**:管理员后台规则和真机提交页仍由 WAPPR1 人工确认;系统只能用已归档审批详情校验实际审批链。校验命令为 `npm run check:wecom-approval-rule-validator -- --template=<类型> --manual-gate=<类型>:A`,缺人工门禁时结论为 `PAUSED_MANUAL_CONFIRMATION`;自审、实际审批人不符或申请人可手选审批人均阻断 WEXT1-LIVE、WREAL1 和最小镜像。 **WRULE1 审批链校验**:管理员后台规则和真机提交页仍由 WAPPR1 人工确认;系统只能用已归档审批详情校验实际审批链。校验命令为 `npm run check:wecom-approval-rule-validator -- --template=<类型> --manual-gate=<类型>:A`,缺人工门禁时结论为 `PAUSED_MANUAL_CONFIRMATION`;自审、实际审批人不符或申请人可手选审批人均阻断 WEXT1-FORMAL、WREAL1 和最小镜像。
**WTCLOSE2/WTCLOSE2F 测试号最终收口**:企业微信 API 已限制只能由部署服务器可信 IP 访问,因此命令必须使用 `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote`。本地直接执行脚本会拒绝跑企微链路,只能用于 `bash -n`、合同和文档静态门禁;不得把本地缺 env/DB 的结果当作业务阻断。远端脚本复跑 WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1,并汇总 WROAD2/WARCH3 既有报告;WFULLSMOKE1 在该脚本中关闭公网业务写流程,不新增 OA 测试业务数据;如子 runner 触发既有归档写库,只能走 WARCH3/WCHECK1 已批准的 OA 自建留存路径;脚本不写企业微信、不创建审批样件、不启用真实员工。 **WTCLOSE2/WTCLOSE2F 测试号最终收口**:企业微信 API 已限制只能由部署服务器可信 IP 访问,因此命令必须使用 `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote`。本地直接执行脚本会拒绝跑企微链路,只能用于 `bash -n`、合同和文档静态门禁;不得把本地缺 env/DB 的结果当作业务阻断。远端脚本复跑 WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1,并汇总 WROAD2/WARCH3 既有报告;WFULLSMOKE1 在该脚本中关闭公网业务写流程,不新增 OA 测试业务数据;如子 runner 触发既有归档写库,只能走 WARCH3/WCHECK1 已批准的 OA 自建留存路径;脚本不写企业微信、不创建审批样件、不启用真实员工。
## 1. 适用范围 ## 1. 适用范围
@@ -211,8 +211,8 @@ WCP1/WCPC/WHMS 后续推进:
2. WCP1 历史结论为 `PAUSE_FOR_CONFIG`;WCPC 已用既有在职测试号完成远端只读复跑,报告 `/tmp/wecom-capability-poc-wcpc-smoke002/summary.json`,结论 `GO_TO_HR_MASTER_SYNC`。 2. WCP1 历史结论为 `PAUSE_FOR_CONFIG`;WCPC 已用既有在职测试号完成远端只读复跑,报告 `/tmp/wecom-capability-poc-wcpc-smoke002/summary.json`,结论 `GO_TO_HR_MASTER_SYNC`。
3. WCPC 已证明 HR 主数据镜像准入项可用:通讯录成员读取、人事助手花名册读取、打卡短窗口记录/规则读取和假期余额读取均达到可复用状态;审批模板、审批实例和回调配置仍是后续考勤/审批镜像前置项。 3. WCPC 已证明 HR 主数据镜像准入项可用:通讯录成员读取、人事助手花名册读取、打卡短窗口记录/规则读取和假期余额读取均达到可复用状态;审批模板、审批实例和回调配置仍是后续考勤/审批镜像前置项。
4. WHMS 已实现并部署验证 `wecom_hr_master_sync_v1`,包括同步批次、逐员工结果、dry-run/apply、People 管理入口和 QA-only runner;公网验证后最终保持 `force_off`。 4. WHMS 已实现并部署验证 `wecom_hr_master_sync_v1`,包括同步批次、逐员工结果、dry-run/apply、People 管理入口和 QA-only runner;公网验证后最终保持 `force_off`。
5. 正式开发仍按 `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `WARCH2 正式只读历史查询` -> `WROAD2+OPS 受控上线与每日巡检` -> `WARCH3 归档稳定化自动巡检` -> `WCHECK1 打卡摘要留存` -> `WEXT1 外出/加班 dry-run` -> `WOPS1 巡检告警降噪` -> `WROAD2-CLOSEOUT 三天验收` -> `WROAD2-BIZ1 三天业务冒烟` -> `WAPPR1 审批规则规范化` -> `WRULE1 审批链校验器 POC` -> `WAUTO1 自动证据汇总` -> `WEXT1LD 外出/加班 live 前 dry-run` -> `WFULLSMOKE1 三天全域最终目标测试` -> `WROUTE2 测试号收口到最小镜像路线锁定` -> `WTCLOSE2 测试号最终收口与证据复核` -> `WTCLOSE2F 远端可信 IP 执行口径修正` -> `WEXT1-LIVE 外出/加班测试号 live POC` -> `四类测试号证据和审批规则门禁通过后问答 WREAL1 小范围真实试用` -> `wecom_attendance_approval_mirror_v1` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1` 分合同实施;WOUA-FIX 已收口测试账号差异和处理决策,WRV1/WRA1/WMSG1 已验证运行入口、OAuth/绑定、脱敏消息、Deeplink、通讯录、人事助手和打卡读取主链路。WAPC2FLIVE 已生成请假/补卡低风险样例,WCBK1 已证明真实审批回调 URL、验签/解密和事件脱敏留证,WACP3R 已证明请假/补卡补偿拉取和详情读取可用,WREAD1 已确认请假/补卡可读性,WADM1 已明确自建留存模型,WARCH1 已实现最小请假/补卡历史留存,WARCH2 已实现正式只读查询;后续仍不得跳过 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WRULE1、WAUTO1/WEXT1LD/WFULLSMOKE1、WTCLOSE2、WEXT1-LIVE、WREAL1 问答或明确批准,直接进入深度考勤/审批镜像。 5. 正式开发仍按 `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `WARCH2 正式只读历史查询` -> `WROAD2+OPS 受控上线与每日巡检` -> `WARCH3 归档稳定化自动巡检` -> `WCHECK1 打卡摘要留存` -> `WEXT1 外出/加班 dry-run` -> `WOPS1 巡检告警降噪` -> `WROAD2-CLOSEOUT 三天验收` -> `WROAD2-BIZ1 三天业务冒烟` -> `WAPPR1 审批规则规范化` -> `WRULE1 审批链校验器 POC` -> `WAUTO1 自动证据汇总` -> `WEXT1LD 外出/加班 live 前 dry-run` -> `WFULLSMOKE1 三天全域最终目标测试` -> `WROUTE2 测试号收口到最小镜像路线锁定` -> `WTCLOSE2 测试号最终收口与证据复核` -> `WTCLOSE2F 远端可信 IP 执行口径修正` -> `WREMOTE1/WFULLSMOKE2 远端收口` -> `WEXT1-FORMAL 正式模板外出/加班测试` -> `四类测试号证据和审批规则门禁通过后问答 WREAL1 小范围真实试用` -> `wecom_attendance_approval_mirror_v1` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1` 分合同实施;WOUA-FIX 已收口测试账号差异和处理决策,WRV1/WRA1/WMSG1 已验证运行入口、OAuth/绑定、脱敏消息、Deeplink、通讯录、人事助手和打卡读取主链路。WAPC2FLIVE 已生成请假/补卡低风险样例,WCBK1 已证明真实审批回调 URL、验签/解密和事件脱敏留证,WACP3R 已证明请假/补卡补偿拉取和详情读取可用,WREAD1 已确认请假/补卡可读性,WADM1 已明确自建留存模型,WARCH1 已实现最小请假/补卡历史留存,WARCH2 已实现正式只读查询;后续仍不得跳过 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WRULE1、WAUTO1/WEXT1LD/WFULLSMOKE1、WTCLOSE2/WREMOTE1、WEXT1-FORMAL、WREAL1 问答或明确批准,直接进入深度考勤/审批镜像。
- WROUTE2/WTCLOSE2 后尾部顺序修正为:`WFULLSMOKE1` -> `WROUTE2` -> `WTCLOSE2` -> `WTCLOSE2F` -> `WEXT1-LIVE` -> `WREAL1(首批 1 名真实员工 + 1 名审批人/管理员观察)` -> `wecom_attendance_approval_mirror_v1 最小完整镜像`;应急接管、恢复回写和 RuleOps 仍排在最小镜像稳定之后。 - WROUTE2/WTCLOSE2/WREMOTE1 后尾部顺序修正为:`WFULLSMOKE1` -> `WROUTE2` -> `WTCLOSE2` -> `WTCLOSE2F` -> `WREMOTE1/WFULLSMOKE2` -> `WEXT1-FORMAL` -> `WREAL1(首批 1 名真实员工 + 1 名审批人/管理员观察)` -> `wecom_attendance_approval_mirror_v1 最小完整镜像`;应急接管、恢复回写和 RuleOps 仍排在最小镜像稳定之后。
6. 任何生产写接口、企微规则写入、应急模式开启或恢复回写都必须有单独批准、dry-run 或可审计记录。 6. 任何生产写接口、企微规则写入、应急模式开启或恢复回写都必须有单独批准、dry-run 或可审计记录。
WCPC 配置复跑清单: WCPC 配置复跑清单:
@@ -268,9 +268,9 @@ WEGOV1 自动化与人工边界:
WAPC2 请假/补卡只读 POC 操作口径: WAPC2 请假/补卡只读 POC 操作口径:
1. 优先用 WAPC2F runner 自动生成 OA-POC 请假/补卡测试模板和低风险测试审批单;当前 dry-run 已通过,真实创建模板/审批单前仍需管理员批准单次 live 写入。 1. 优先用 WAPC2F runner 自动生成 OA-POC 请假/补卡测试模板和低风险测试审批单;当前 dry-run 已通过,真实创建模板/审批单前仍需管理员批准单次 live 创建。
2. WAPC2F 默认申请人为 `SMOKE002`,审批人为 `SMOKE101`;两者必须 active、已绑定企微、可见、不是同一 OA 员工、不是同一企微 userid。`SMOKE101` 不可用时不自动换人,先问答确认。 2. WAPC2F 默认申请人为 `SMOKE002`,审批人为 `SMOKE101`;两者必须 active、已绑定企微、可见、不是同一 OA 员工、不是同一企微 userid。`SMOKE101` 不可用时不自动换人,先问答确认。
3. WAPC2F live 写入只能在单次命令同时包含 `--live --create-templates --submit-test-approvals` 且设置 `WECOM_APPROVAL_FIXTURE_WRITE=1` 时执行;默认 dry-run 不获取写入 token、不在企微后台留下 OA-POC 记录。WAPC2FLIVE 已执行一次批准的 live 创建,后续不得重复创建样件,除非另建 Issue CSV 并再次批准。 3. WAPC2F live 创建只能在单次命令同时包含 `--live --create-templates --submit-test-approvals` 且设置 `WECOM_APPROVAL_FIXTURE_WRITE=1` 时执行;默认 dry-run 不获取写入 token、不在企微后台留下 OA-POC 记录。WAPC2FLIVE 已执行一次批准的 live 创建,后续不得重复创建样件,除非另建 Issue CSV 并再次批准。
4. 测试单 `sp_no` 不得包含采购、合同、报销、发票、银行回单、高敏附件或真实敏感业务资料。 4. 测试单 `sp_no` 不得包含采购、合同、报销、发票、银行回单、高敏附件或真实敏感业务资料。
5. QA 在服务器容器内执行 `npm run check:wecom-approval-poc -- --live --format=json`,并通过 CLI 或临时 env 传入请假/补卡模板 ID 和 `sp_no`。 5. QA 在服务器容器内执行 `npm run check:wecom-approval-poc -- --live --format=json`,并通过 CLI 或临时 env 传入请假/补卡模板 ID 和 `sp_no`。
6. 报告结论 `PASS_APPROVAL_POC` 只代表模板详情和审批详情只读链路可用;`PARTIAL_APPROVAL_POC_NEEDS_CONFIG` 代表缺模板 ID 或 `sp_no`;`SKIP/BLOCKED_BY_EXTERNAL_CONFIG` 代表 Secret、权限、可信 IP、可见范围或企微 API 阻断。 6. 报告结论 `PASS_APPROVAL_POC` 只代表模板详情和审批详情只读链路可用;`PARTIAL_APPROVAL_POC_NEEDS_CONFIG` 代表缺模板 ID 或 `sp_no`;`SKIP/BLOCKED_BY_EXTERNAL_CONFIG` 代表 Secret、权限、可信 IP、可见范围或企微 API 阻断。
@@ -340,20 +340,20 @@ WROAD2/WARCH3 企微受控上线每日巡检:
7. 告警命令为 `cd server && npm run send:wecom-ops-alert -- --summary-file=<summary.json> --send`,真实发送还需 `WARCH3_OPS_ALERT_SEND=1`;默认收件员工号为 `HYD000006`,消息只包含阶段、状态、finding 数、报告路径和下一步建议。 7. 告警命令为 `cd server && npm run send:wecom-ops-alert -- --summary-file=<summary.json> --send`,真实发送还需 `WARCH3_OPS_ALERT_SEND=1`;默认收件员工号为 `HYD000006`,消息只包含阶段、状态、finding 数、报告路径和下一步建议。
8. WOPS1 后告警使用状态文件 `artifacts/qa-flow/warch3-ops-alert-state.json` 记忆上次状态和 finding 摘要;已知 `PASS_WITH_FINDINGS` 或 observation 不重复发消息,只有 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`、脚本失败、新增 finding、状态恶化或人工 `--force` 才发送。 8. WOPS1 后告警使用状态文件 `artifacts/qa-flow/warch3-ops-alert-state.json` 记忆上次状态和 finding 摘要;已知 `PASS_WITH_FINDINGS` 或 observation 不重复发消息,只有 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`、脚本失败、新增 finding、状态恶化或人工 `--force` 才发送。
9. WCHECK1 打卡摘要命令:`cd server && npm run check:wecom-checkin-summary-archive -- --offline --format=json`;如要写 OA 留存,必须 `WECOM_CHECKIN_ARCHIVE_WRITE=1` 且带 `--live --persist-to-db`。 9. WCHECK1 打卡摘要命令:`cd server && npm run check:wecom-checkin-summary-archive -- --offline --format=json`;如要写 OA 留存,必须 `WECOM_CHECKIN_ARCHIVE_WRITE=1` 且带 `--live --persist-to-db`。
10. WEXT1 外出/加班 dry-run:`cd server && npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`;live 创建必须另起 `WEXT1-LIVE` 合同,并再次说明状态、测试结果、企微留痕和清理/保留边界后人工确认。 10. WEXT1 外出/加班 dry-run:`cd server && npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`;WREMOTE1 后下一步不再自动 live 创建外出/加班 OA-POC 样件,而是另走 `WEXT1-FORMAL` 问答,由 `SMOKE002` 真机提交正式模板测试单,系统只读补偿、归档和审批链。
11. WROAD2-BIZ1 三天人工业务冒烟:`SMOKE002` 每天按企微规则尝试上/下班打卡,提交低风险请假和补卡;`SMOKE101` 每条审批必须先打开详情再同意或驳回;`HYD000006` 每天查看 OA 企微审批归档历史和打卡摘要。无法打卡、无法审批或仍需手动选择审批人时,按 finding 记录,不伪造成通过。 11. WROAD2-BIZ1 三天人工业务冒烟:`SMOKE002` 每天按企微规则尝试上/下班打卡,提交低风险请假和补卡;`SMOKE101` 每条审批必须先打开详情再同意或驳回;`HYD000006` 每天查看 OA 企微审批归档历史和打卡摘要。无法打卡、无法审批或仍需手动选择审批人时,按 finding 记录,不伪造成通过。
12. WAPPR1 审批规则规范化:测试模板固定 `SMOKE002 -> SMOKE101`;正式请假、补卡、外出、加班模板必须按一层直属主管或指定审批角色自动带出审批人。申请人不得任意选择审批人;审批人缺失、停用、未绑定、不可见、主管链断裂或自审时,必须由管理员兜底或阻断,不能直接进入真实试用。 12. WAPPR1 审批规则规范化:测试模板固定 `SMOKE002 -> SMOKE101`;正式请假、补卡、外出、加班模板必须按一层直属主管或指定审批角色自动带出审批人。申请人不得任意选择审批人;审批人缺失、停用、未绑定、不可见、主管链断裂或自审时,必须由管理员兜底或阻断,不能直接进入真实试用。
13. WAPPR1 管理员后台检查位置:进入企业微信管理后台的审批应用或自建应用审批接口模板配置,打开请假、补卡、外出、加班对应模板的编辑页,检查“审批流程/规则”是否存在“申请人自选”节点,是否按直属主管、部门负责人或指定审批角色自动带出审批人,以及主管链缺失、自审、审批人停用或不可见时是否阻断或进入管理员兜底。 13. WAPPR1 管理员后台检查位置:进入企业微信管理后台的审批应用或自建应用审批接口模板配置,打开请假、补卡、外出、加班对应模板的编辑页,检查“审批流程/规则”是否存在“申请人自选”节点,是否按直属主管、部门负责人或指定审批角色自动带出审批人,以及主管链缺失、自审、审批人停用或不可见时是否阻断或进入管理员兜底。
14. WAPPR1 真机确认方式:用 `SMOKE002` 进入对应模板提交页,不提交敏感内容,只观察审批人是否自动带出、是否可以任意改人;提交低风险样例后,由系统用 `getapprovaldetail` 校验实际审批链是否为 `SMOKE101` 且无自审。企业微信官方 API 不能只读读取后台审批规则本身,管理员手动设置后系统只能检查提交后的实际结果。 14. WAPPR1 真机确认方式:用 `SMOKE002` 进入对应模板提交页,不提交敏感内容,只观察审批人是否自动带出、是否可以任意改人;提交低风险样例后,由系统用 `getapprovaldetail` 校验实际审批链是否为 `SMOKE101` 且无自审。企业微信官方 API 不能只读读取后台审批规则本身,管理员手动设置后系统只能检查提交后的实际结果。
15. WAUTO1 自动证据汇总:`bash scripts/qa/collect-wecom-controlled-trial-evidence.sh`。该脚本只读汇总 `/ready`、WARCH3 summary、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描;不会设置 `WECOM_ARCHIVE_WRITE=1`、`WECOM_CHECKIN_ARCHIVE_WRITE=1` 或 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不写 OA DB、不写企业微信。 15. WAUTO1 自动证据汇总:`bash scripts/qa/collect-wecom-controlled-trial-evidence.sh`。该脚本只读汇总 `/ready`、WARCH3 summary、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描;不会设置 `WECOM_ARCHIVE_WRITE=1`、`WECOM_CHECKIN_ARCHIVE_WRITE=1` 或 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不写 OA DB、不写企业微信。
16. WFULLSMOKE1 三天全域最终目标测试:`bash scripts/qa/run-three-day-full-goal-smoke.sh`。该脚本聚合企微 HR/考勤、OA 报销、采购、合同/项目、付款批次、移动/企微入口和运维巡检;若只想做只读汇总,可设置 `WFULLSMOKE_ALLOW_PUBLIC_WRITES=0`。默认只允许带 `TEST/SMOKE/WFULL` 标记的 OA 测试业务数据;不写企业微信、不创建外出/加班样件、不启用真实员工、不真实付款、不接真实支付、不写 ERP、不导入银行流水。 16. WFULLSMOKE2 全域最终目标测试:`WFULLSMOKE_ALLOW_PUBLIC_WRITES=1 bash scripts/qa/run-three-day-full-goal-smoke.sh --remote`。该脚本必须在部署服务器可信 IP 上执行,聚合企微 HR/考勤、OA 报销、采购、合同/项目、付款批次、移动/企微入口和运维巡检;若只想做只读汇总,可设置 `WFULLSMOKE_ALLOW_PUBLIC_WRITES=0`。默认只允许带 `TEST-SMOKE-WFULL` 标记的 OA 测试业务数据;不写企业微信、不创建外出/加班样件、不启用真实员工、不真实付款、不接真实支付、不写 ERP、不导入银行流水。
17. WAPPR1 人工确认清单按请假、补卡、外出、加班逐模板填写:模板入口、适用范围、审批人规则、是否允许申请人手选、是否可能自审、主管链缺失时表现、审批人不可见或停用时表现。每个模板只选一个结论:A 审批人自动带出且申请人不能任意选择;B 默认带出但申请人仍可改人;C 必须申请人手选审批人;D 当前看不到或模板未配置。B/C/D 均不得直接进入真实员工试用。 17. WAPPR1 人工确认清单按请假、补卡、外出、加班逐模板填写:模板入口、适用范围、审批人规则、是否允许申请人手选、是否可能自审、主管链缺失时表现、审批人不可见或停用时表现。每个模板只选一个结论:A 审批人自动带出且申请人不能任意选择;B 默认带出但申请人仍可改人;C 必须申请人手选审批人;D 当前看不到或模板未配置。B/C/D 均不得直接进入真实员工试用。
18. WEXT1LD live 前 dry-run:远端只执行 `npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`;不要设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不要带 `--live`、`--create-templates` 或 `--submit-test-approvals`。通过后仍需问答选择:批准一次 live 创建外出+加班 OA-POC 样件、只保留 dry-run、或外出/加班移出 V1。 18. WEXT1LD live 前 dry-run:远端只执行 `npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`;不要设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不要带 `--live`、`--create-templates` 或 `--submit-test-approvals`。WREMOTE1 后续路线已改为 WEXT1-FORMAL:只在问答批准后,由 `SMOKE002` 真机提交正式模板外出/加班测试单,系统只读校验;不再自动创建外出/加班 OA-POC 样件。
19. WEXT1-LIVE 已锁定为外出+加班两类一起创建 OA-POC 测试模板和低风险审批单,固定 `SMOKE002 -> SMOKE101`、`WECOM_AGENT_SECRET` 和双开关;样件保留审计,由 `SMOKE101` 真机确认消息卡片、列表、详情页、按钮风险和审批人是否自动带出。 19. WEXT1-FORMAL 已锁定为使用现有正式外出+加班模板人工提交,不自动创建 OA-POC 测试模板,不自动提交审批单。操作方式为 `SMOKE002` 真机提交正式模板外出/加班测试单,`SMOKE101` 先看详情再审批;系统随后在部署服务器只读复跑补偿拉取、OA 归档读取和 WRULE1,确认实际审批链与 OA 理论审批人一致。
20. Day 0 公网报告为 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json`,结论 `PASS_WITH_FINDINGS`:企微 runtime、补偿归档、离线归档读取和隐私扫描通过;finding 为缺 live smoke 登录凭据/pending OCR 子检查异常以及历史 callback gap,不阻断测试账号受控试用。 20. Day 0 公网报告为 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json`,结论 `PASS_WITH_FINDINGS`:企微 runtime、补偿归档、离线归档读取和隐私扫描通过;finding 为缺 live smoke 登录凭据/pending OCR 子检查异常以及历史 callback gap,不阻断测试账号受控试用。
21. WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1/WRULE1/WAUTO1/WEXT1LD/WFULLSMOKE1/WTCLOSE2 结束后再做人工问答:进入 WEXT1-LIVE、先处理指定 finding、或暂停;未确认前不启用真实员工,不创建外出/加班 live 样件。 21. WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1/WRULE1/WAUTO1/WEXT1LD/WFULLSMOKE1/WTCLOSE2 结束后再做人工问答:进入 WEXT1-FORMAL 正式模板人工提交测试、先处理指定 finding、或暂停;未确认前不启用真实员工,不自动创建外出/加班样件。
22. WTCLOSE2 作为 WEXT1-LIVE 前的最后自动收口:复跑命令必须是 `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote`,因为企微 API 只允许部署服务器可信 IP 访问;结论为 `PASS_TEST_ACCOUNT_CLOSEOUT_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;它只进入问答,不自动 live。本地直接执行脚本只用于静态门禁,不得作为企微业务证据。 22. WTCLOSE2 作为 WEXT1-FORMAL 前的最后自动收口:复跑命令必须是 `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote`,因为企微 API 只允许部署服务器可信 IP 访问;结论为 `PASS_TEST_ACCOUNT_CLOSEOUT_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;它只进入问答,不自动提交审批。本地直接执行脚本只用于静态门禁,不得作为企微业务证据。
23. WREAL1-PREP/WROUTE2 当前只准备和锁定路线,不要求提供真实员工;后续真实试用必须等请假、补卡、外出、加班四类测试号证据、WAPPR1/WRULE1 审批规则门禁、WTCLOSE2 和 WEXT1-LIVE 可解释通过后再问,首批固定为 1 名真实员工 + 1 名审批人/管理员观察。 23. WREAL1-PREP/WROUTE2 当前只准备和锁定路线,不要求提供真实员工;后续真实试用必须等请假、补卡、外出、加班四类测试号证据、WAPPR1/WRULE1 审批规则门禁、WREMOTE1/WFULLSMOKE2 和 WEXT1-FORMAL 可解释通过后再问,首批固定为 1 名真实员工 + 1 名审批人/管理员观察。真实员工和审批人只通过 `/tmp/hyb-oa-wreal1.env` 临时文件提供,不写入仓库或聊天。
24. `wecom_attendance_approval_mirror_v1` 最小完整镜像必须等 WREAL1 通过后优先规划;应急接管、恢复写回、RuleOps、图片 OCR、复杂 BPM、预算、ERP 和银行流水导入继续冻结。 24. `wecom_attendance_approval_mirror_v1` 最小完整镜像必须等 WREAL1 通过后优先规划;应急接管、恢复写回、RuleOps、图片 OCR、复杂 BPM、预算、ERP 和银行流水导入继续冻结。
问题登记最小字段: 问题登记最小字段:
@@ -477,7 +477,7 @@ WROAD2/WARCH3 企微受控上线每日巡检:
- `WECOM_ALLOWED_RETURN_HOSTS=oa.hyinda.com` - `WECOM_ALLOWED_RETURN_HOSTS=oa.hyinda.com`
5. 先让管理员用账号密码登录,在 `个人设置` 完成一次绑定,再测试企业微信工作台直达;已绑定用户从手机企业微信进入时应直接看到移动工作台。 5. 先让管理员用账号密码登录,在 `个人设置` 完成一次绑定,再测试企业微信工作台直达;已绑定用户从手机企业微信进入时应直接看到移动工作台。
6. 若启用 OA 同步企业微信打卡数据,在企业微信打卡 API「可调用接口的应用」中授权 `海音达工作台`。OA 默认可复用 `WECOM_AGENT_SECRET`;只有单独创建考勤同步应用时才额外配置 `WECOM_CHECKIN_SECRET`。 6. 若启用 OA 同步企业微信打卡数据,在企业微信打卡 API「可调用接口的应用」中授权 `海音达工作台`。OA 默认可复用 `WECOM_AGENT_SECRET`;只有单独创建考勤同步应用时才额外配置 `WECOM_CHECKIN_SECRET`。
7. HR/考勤员工日常审批后续配置企业微信原生审批模板作为主流程;WAPC2FLIVE 已自动生成请假/补卡 OA-POC 低风险样件并复跑只读 POC,WCBK1 已完成真实回调事件确认,WACP3R 已完成补偿拉取,WREAD1 已确认请假/补卡在企微中可读,WADM1 已完成自建留存/镜像模型设计,WARCH1 已完成最小请假/补卡历史留存,WARCH2 已完成正式只读历史查询。WARCH3/WCHECK1/WEXT1 后先做自动巡检、打卡摘要留存和外出/加班 dry-run;WOPS1 后告警默认发给 `HYD000006`(`wangshunli` 的员工号)且只报新增异常。同意单击即通过需继续纳入操作提示和审计设计。外出/加班 live 模板仍需后续单独批准。报销、财务、采购、合同和项目类 OA 主办审批仍使用企业微信消息提醒并回到 OA 页面完成。 7. HR/考勤员工日常审批后续配置企业微信原生审批模板作为主流程;WAPC2FLIVE 已自动生成请假/补卡 OA-POC 低风险样件并复跑只读 POC,WCBK1 已完成真实回调事件确认,WACP3R 已完成补偿拉取,WREAD1 已确认请假/补卡在企微中可读,WADM1 已完成自建留存/镜像模型设计,WARCH1 已完成最小请假/补卡历史留存,WARCH2 已完成正式只读历史查询。WARCH3/WCHECK1/WEXT1 后先做自动巡检、打卡摘要留存和外出/加班 dry-run;WOPS1 后告警默认发给 `HYD000006`(`wangshunli` 的员工号)且只报新增异常。同意单击即通过需继续纳入操作提示和审计设计。外出/加班正式模板人工测试仍需后续单独批准。报销、财务、采购、合同和项目类 OA 主办审批仍使用企业微信消息提醒并回到 OA 页面完成。
### 员工会看到的典型状态 ### 员工会看到的典型状态
- 未绑定:登录页会提示“当前企业微信账号尚未绑定”,回退到账号密码登录。 - 未绑定:登录页会提示“当前企业微信账号尚未绑定”,回退到账号密码登录。
@@ -6,7 +6,7 @@
**上级事实源**:[海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md) **上级事实源**:[海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md)
**相关事实源**:[需求 - 统一审批中心规约](./需求-统一审批中心规约.md)、[企微 API 能力目录](./企微API能力目录.md) **相关事实源**:[需求 - 统一审批中心规约](./需求-统一审批中心规约.md)、[企微 API 能力目录](./企微API能力目录.md)
本规约细化企业微信在 `hyb-oa` 中的基础设施边界、入口、免登/绑定、通讯录身份、消息通知、deeplink、打卡、人事助手、原生审批、OA 自建留存、OA 镜像、人工接管和恢复回写要求。WFOC 起产品方向调整为“企微优先 + OA 无痛接管”;DBWFOC 后进一步固定为:HR/考勤员工日常审批优先使用企业微信,OA 做按域镜像、备份接管、财务闭环和审计中台;采购、合同、项目、财务和高敏附件继续由 OA 主办。WAPI 后,所有企微相关开发必须先读取本规约和 [企微 API 能力目录](./企微API能力目录.md),确认官方 API、Secret、权限、可信 IP、回调/模板和读写边界,再拆 Issue CSV。WMSG1 已证明企业微信应用消息和 Deeplink 真机回流可用;WAPC1 后审批进入配置准备清单,WAPC2 后先做请假/补卡模板详情与低风险 `sp_no` 只读 POC;WAPC2F 已实现 OA-POC 样件 dry-run并公网验证 `PASS_FIXTURE_DRY_RUN_READY`。WAPC2FLIVE 已在用户批准后创建 OA-POC 请假/补卡测试模板和低风险测试审批单,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`。WCBK1 已完成真实回调 URL 验证和一条现有 OA-POC 测试审批单事件确认,公网结论 `PASS_CALLBACK_EVENT_CONFIRMED`。WEGOV1 后固定“企微主办 HR/考勤成熟能力,OA 保存关键历史和外部关联键”的路线。WACP3R 已自动发现 OA-POC 请假/补卡模板并完成公网补偿拉取复跑,报告为 `PASS_WITH_FINDINGS`;补偿拉取和详情读取可用,当时 finding 为回调证据文件未持久化。WREAD1F 后,用户真机确认请假/补卡审批卡片、列表和详情页可读,远端报告为 `PASS_READABLE`;同意单击即通过作为操作风险进入后续设计。WADM1 已完成自建留存/镜像数据模型设计,WARCH1 已创建最小审批留存迁移和运行时入库路径,WARCH2 已提供 OA DB 正式只读查询 API 和 PC/移动历史页。WROAD2 后先做测试账号受控上线和每日巡检;WARCH3 已新增服务器 07:30 systemd timer 和脱敏企微告警;WCHECK1 已新增打卡摘要留存;WEXT1 已新增外出/加班 dry-run;WOPS1 已完成告警降噪。WROAD2-BIZ1 在三天内补充测试账号打卡、请假、补卡和 OA 离线查看人工业务冒烟;WAPPR1 把审批规则规范化列为真实试用前门禁,申请人不得任意选择审批人,正式模板必须自动带出审批人。后续先等 WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1 结果,再问答进入 WEXT1-LIVE 外出/加班测试号 live POC;四类测试号证据和审批规则门禁通过前不问真实员工试用,不直接进入完整审批镜像、应急接管、恢复回写或 RuleOps。 本规约细化企业微信在 `hyb-oa` 中的基础设施边界、入口、免登/绑定、通讯录身份、消息通知、deeplink、打卡、人事助手、原生审批、OA 自建留存、OA 镜像、人工接管和恢复回写要求。WFOC 起产品方向调整为“企微优先 + OA 无痛接管”;DBWFOC 后进一步固定为:HR/考勤员工日常审批优先使用企业微信,OA 做按域镜像、备份接管、财务闭环和审计中台;采购、合同、项目、财务和高敏附件继续由 OA 主办。WAPI 后,所有企微相关开发必须先读取本规约和 [企微 API 能力目录](./企微API能力目录.md),确认官方 API、Secret、权限、可信 IP、回调/模板和读写边界,再拆 Issue CSV。WMSG1 已证明企业微信应用消息和 Deeplink 真机回流可用;WAPC1 后审批进入配置准备清单,WAPC2 后先做请假/补卡模板详情与低风险 `sp_no` 只读 POC;WAPC2F 已实现 OA-POC 样件 dry-run并公网验证 `PASS_FIXTURE_DRY_RUN_READY`。WAPC2FLIVE 已在用户批准后创建 OA-POC 请假/补卡测试模板和低风险测试审批单,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`。WCBK1 已完成真实回调 URL 验证和一条现有 OA-POC 测试审批单事件确认,公网结论 `PASS_CALLBACK_EVENT_CONFIRMED`。WEGOV1 后固定“企微主办 HR/考勤成熟能力,OA 保存关键历史和外部关联键”的路线。WACP3R 已自动发现 OA-POC 请假/补卡模板并完成公网补偿拉取复跑,报告为 `PASS_WITH_FINDINGS`;补偿拉取和详情读取可用,当时 finding 为回调证据文件未持久化。WREAD1F 后,用户真机确认请假/补卡审批卡片、列表和详情页可读,远端报告为 `PASS_READABLE`;同意单击即通过作为操作风险进入后续设计。WADM1 已完成自建留存/镜像数据模型设计,WARCH1 已创建最小审批留存迁移和运行时入库路径,WARCH2 已提供 OA DB 正式只读查询 API 和 PC/移动历史页。WROAD2 后先做测试账号受控上线和每日巡检;WARCH3 已新增服务器 07:30 systemd timer 和脱敏企微告警;WCHECK1 已新增打卡摘要留存;WEXT1 已新增外出/加班 dry-run;WOPS1 已完成告警降噪。WROAD2-BIZ1 在三天内补充测试账号打卡、请假、补卡和 OA 离线查看人工业务冒烟;WAPPR1 把审批规则规范化列为真实试用前门禁,申请人不得任意选择审批人,正式模板必须自动带出审批人。WTCLOSE2F 后,后续先远端收口和 WFULLSMOKE2 全域 smoke,再使用正式外出/加班模板由 `SMOKE002` 人工提交、`SMOKE101` 审批,系统只读补偿、归档和审批链;不再自动创建外出/加班 OA-POC 模板。四类测试号证据和审批规则门禁通过前不问真实员工试用,不直接进入完整审批镜像、应急接管、恢复回写或 RuleOps。
--- ---
@@ -36,7 +36,7 @@
| 通讯录 | 成员创建、读取、更新、禁用或删除 | 近期已验证 OA 写企微;后续改为企微主源同步 OA,OA 保留修复和审计 | `CAN_REUSE_NOW`:HCLT create/update/disable、部门读取和 WCPC 既有在职测试号 `contact.member_read` 均已通过 | | 通讯录 | 成员创建、读取、更新、禁用或删除 | 近期已验证 OA 写企微;后续改为企微主源同步 OA,OA 保留修复和审计 | `CAN_REUSE_NOW`:HCLT create/update/disable、部门读取和 WCPC 既有在职测试号 `contact.member_read` 均已通过 |
| 人事助手 | 员工字段配置、花名册读取、花名册更新 | 作为员工主数据源,驱动 OA 员工、账号、角色、绑定和状态镜像 | `LOCAL_IMPLEMENTED_FOR_READ_SYNC`:字段配置和既有在职测试号花名册读取已通过;WHMS 已本地实现只读同步到 OA;资料更新写接口仍需单独 POC | | 人事助手 | 员工字段配置、花名册读取、花名册更新 | 作为员工主数据源,驱动 OA 员工、账号、角色、绑定和状态镜像 | `LOCAL_IMPLEMENTED_FOR_READ_SYNC`:字段配置和既有在职测试号花名册读取已通过;WHMS 已本地实现只读同步到 OA;资料更新写接口仍需单独 POC |
| 打卡 | 打卡记录、员工规则、日报、月报、排班、补卡、规则管理 | 企微主办规则和采集,OA 同步按域镜像和应急对账 | `CAN_REUSE_NOW_FOR_READ`:WCPC 短窗口打卡记录和规则读取通过;日报/月报/排班等细项留到考勤镜像合同继续验证 | | 打卡 | 打卡记录、员工规则、日报、月报、排班、补卡、规则管理 | 企微主办规则和采集,OA 同步按域镜像和应急对账 | `CAN_REUSE_NOW_FOR_READ`:WCPC 短窗口打卡记录和规则读取通过;日报/月报/排班等细项留到考勤镜像合同继续验证 |
| 审批 | 模板详情、提交审批、审批状态回调、审批详情、模板创建/更新、批量获取审批单号、假期余额 | HR/考勤员工日常审批企微主办,OA 同步镜像;OA 主办财务、采购、合同、项目和报销审批不迁移 | `WARCH3/WEXT1_CONTROLLED_OPS`:WAPC2FLIVE 已创建请假/补卡 OA-POC 样件并复跑通过;WCBK1 已证明审批状态回调 URL 验证、验签、解密和真实事件脱敏留证;WACP3R 已通过 `getapprovalinfo` 自动发现模板并拉取请假/补卡详情;WARCH1 已补齐回调事件、补偿拉取和对账 finding 的最小 OA 自建留存;WARCH2 已提供只读历史查询;WARCH3 已自动巡检和告警;WROAD2-BIZ1 补充人工业务冒烟;WAPPR1 固定自动审批人规则门禁;WEXT1 只完成外出/加班 dry-run。完整镜像、外出/加班 live、真实试用、应急接管和恢复回写仍需后续合同 | | 审批 | 模板详情、提交审批、审批状态回调、审批详情、模板创建/更新、批量获取审批单号、假期余额 | HR/考勤员工日常审批企微主办,OA 同步镜像;OA 主办财务、采购、合同、项目和报销审批不迁移 | `WREMOTE1/WEXT1_FORMAL_CONTROLLED_OPS`:WAPC2FLIVE 已创建请假/补卡 OA-POC 样件并复跑通过;WCBK1 已证明审批状态回调 URL 验证、验签、解密和真实事件脱敏留证;WACP3R 已通过 `getapprovalinfo` 自动发现模板并拉取请假/补卡详情;WARCH1 已补齐回调事件、补偿拉取和对账 finding 的最小 OA 自建留存;WARCH2 已提供只读历史查询;WARCH3 已自动巡检和告警;WROAD2-BIZ1 补充人工业务冒烟;WAPPR1 固定自动审批人规则门禁;WEXT1 只完成外出/加班 dry-run。完整镜像、正式模板外出/加班测试、真实试用、应急接管和恢复回写仍需后续合同 |
| 工作台和消息 | 自建应用入口、应用消息、deeplink | 继续作为 OA 移动入口和通知渠道 | `CAN_REUSE_NOW`;WRV1 新增 `check:wecom-runtime-ready` 对入口、OAuth、脱敏消息 dry-run 和 deeplink 做运行就绪门禁 | | 工作台和消息 | 自建应用入口、应用消息、deeplink | 继续作为 OA 移动入口和通知渠道 | `CAN_REUSE_NOW`;WRV1 新增 `check:wecom-runtime-ready` 对入口、OAuth、脱敏消息 dry-run 和 deeplink 做运行就绪门禁 |
| 财务/报销 | 企微不提供本项目需要的 PDF OCR、付款批次、银行回单和代账闭环 | OA 主办 | `KEEP_OA_PRIMARY` | | 财务/报销 | 企微不提供本项目需要的 PDF OCR、付款批次、银行回单和代账闭环 | OA 主办 | `KEEP_OA_PRIMARY` |
| 真实支付、ERP、图片 OCR、银行流水导入 | 非本路线目标 | 不进入当前路线 | `NOT_IN_SCOPE` | | 真实支付、ERP、图片 OCR、银行流水导入 | 非本路线目标 | 不进入当前路线 | `NOT_IN_SCOPE` |
@@ -235,9 +235,9 @@ REQAUD 复核后,ATTV1 已完成统一入口实现,企业微信打卡边界
## 7.8 WDRG 开发路线图门禁 ## 7.8 WDRG 开发路线图门禁
- WDRG 后,企业微信相关运行时迁移采用“路线图门禁 + 单功能 Issue CSV”,路线图事实源为 [企微优先开发路线图](./企微优先开发路线图.md)。 - WDRG 后,企业微信相关运行时迁移采用“路线图门禁 + 单功能 Issue CSV”,路线图事实源为 [企微优先开发路线图](./企微优先开发路线图.md)。
- WROAD2 后阶段顺序调整为 `WECOM-CAPABILITY-POC-V1` -> `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `WARCH2 正式只读历史查询` -> `WROAD2+OPS 受控上线与每日巡检` -> `WARCH3 归档稳定化自动巡检` -> `WCHECK1 打卡摘要留存` -> `WEXT1 外出/加班 dry-run` -> `WOPS1 巡检告警降噪` -> `WROAD2-CLOSEOUT 三天验收` -> `WROAD2-BIZ1 三天业务冒烟` -> `WAPPR1 审批规则规范化` -> `WAUTO1 自动证据汇总` -> `WEXT1LD 外出/加班 live 前 dry-run` -> `WFULLSMOKE1 三天全域最终目标测试` -> `WROUTE2 测试号收口到最小镜像路线锁定` -> `WEXT1-LIVE 外出/加班测试号 live POC` -> `WREAL1 小范围真实试用(首批 1 名真实员工 + 1 名审批人/管理员观察)` -> `wecom_attendance_approval_mirror_v1 最小完整镜像` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1`;其中 WREAL1 只能在请假、补卡、外出、加班四类测试号证据和审批规则门禁通过后再问答启动。 - WROAD2 后阶段顺序调整为 `WECOM-CAPABILITY-POC-V1` -> `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `WARCH2 正式只读历史查询` -> `WROAD2+OPS 受控上线与每日巡检` -> `WARCH3 归档稳定化自动巡检` -> `WCHECK1 打卡摘要留存` -> `WEXT1 外出/加班 dry-run` -> `WOPS1 巡检告警降噪` -> `WROAD2-CLOSEOUT 三天验收` -> `WROAD2-BIZ1 三天业务冒烟` -> `WAPPR1 审批规则规范化` -> `WRULE1 审批链校验器 POC` -> `WAUTO1 自动证据汇总` -> `WEXT1LD 外出/加班 live 前 dry-run` -> `WFULLSMOKE1 三天全域最终目标测试` -> `WROUTE2 测试号收口到最小镜像路线锁定` -> `WTCLOSE2/WTCLOSE2F 远端可信 IP 执行口径修正` -> `WREMOTE1/WFULLSMOKE2 远端收口` -> `WEXT1-FORMAL 正式模板外出/加班测试` -> `WREAL1 小范围真实试用(首批 1 名真实员工 + 1 名审批人/管理员观察)` -> `wecom_attendance_approval_mirror_v1 最小完整镜像` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1`;其中 WREAL1 只能在请假、补卡、外出、加班四类测试号证据和审批规则门禁通过后再问答启动。
- `WECOM-CAPABILITY-POC-V1` 已由 WCPC 收口,WHMS/WHMSLIVE 已完成 HR 主数据镜像实现和受控公网验证;后续不得跳过运行优先门禁和 WOUA 差异处理决策直接开发企微 HR/考勤审批镜像、OA 应急接管、恢复回写或 RuleOps 正式写入。 - `WECOM-CAPABILITY-POC-V1` 已由 WCPC 收口,WHMS/WHMSLIVE 已完成 HR 主数据镜像实现和受控公网验证;后续不得跳过运行优先门禁和 WOUA 差异处理决策直接开发企微 HR/考勤审批镜像、OA 应急接管、恢复回写或 RuleOps 正式写入。
- 运行优先阶段先利用入口、免登/绑定、脱敏消息、deeplink、通讯录 userid 清单、人事助手花名册读取和打卡读取;WOUA-FIX 已按用户确认软归档 7 个缺企微测试账号,复检 `oaActiveMissingInWecom=0`;剩余企微缺字段先接受不补,归档测试绑定保留审计。WRV1 用 `server/src/scripts/check-wecom-runtime-ready.js` 固化运行优先门禁,WRA1 修正 QA-only 打卡只读门禁,WMSG1 完成真实消息和 Deeplink 真机确认。报告结论只能是 `PASS_RUNTIME_READY`、`PASS_WITH_CONFIG_GAPS` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。该结论仍不能直接放行深度镜像,深度考勤/审批镜像需在 WAPC1、WAPC2、WAPC2F/WAPC2FLIVE、WCBK1、WEGOV1、WACP3、WREAD1、WADM1、WARCH1、WARCH2、WROAD2+OPS、WARCH3、WCHECK1、WEXT1、WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WEXT1-LIVE 和 WREAL1 或明确批准后再拆。 - 运行优先阶段先利用入口、免登/绑定、脱敏消息、deeplink、通讯录 userid 清单、人事助手花名册读取和打卡读取;WOUA-FIX 已按用户确认软归档 7 个缺企微测试账号,复检 `oaActiveMissingInWecom=0`;剩余企微缺字段先接受不补,归档测试绑定保留审计。WRV1 用 `server/src/scripts/check-wecom-runtime-ready.js` 固化运行优先门禁,WRA1 修正 QA-only 打卡只读门禁,WMSG1 完成真实消息和 Deeplink 真机确认。报告结论只能是 `PASS_RUNTIME_READY`、`PASS_WITH_CONFIG_GAPS` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。该结论仍不能直接放行深度镜像,深度考勤/审批镜像需在 WAPC1、WAPC2、WAPC2F/WAPC2FLIVE、WCBK1、WEGOV1、WACP3、WREAD1、WADM1、WARCH1、WARCH2、WROAD2+OPS、WARCH3、WCHECK1、WEXT1、WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WRULE1、WTCLOSE2/WREMOTE1、WEXT1-FORMAL 和 WREAL1 或明确批准后再拆。
- WAPC2F 自动样件默认申请人 `SMOKE002`、审批人 `SMOKE101`;两者必须 active、已绑定企微、可见、不是同一 OA 员工且不是同一企微 userid。`SMOKE101` 不可用时不自动换人,返回配置缺口并问答确认。 - WAPC2F 自动样件默认申请人 `SMOKE002`、审批人 `SMOKE101`;两者必须 active、已绑定企微、可见、不是同一 OA 员工且不是同一企微 userid。`SMOKE101` 不可用时不自动换人,返回配置缺口并问答确认。
- 线上缺陷、正式使用阻断、真实反馈扫尾和 QA-only 脚本维护可另开合同并行;采购、合同、报销、付款、AP、代账和高敏附件继续 OA 主办,不混入企微 HR/考勤路线。 - 线上缺陷、正式使用阻断、真实反馈扫尾和 QA-only 脚本维护可另开合同并行;采购、合同、报销、付款、AP、代账和高敏附件继续 OA 主办,不混入企微 HR/考勤路线。
- 本路线图只代表开发节奏和门禁,不代表任何企微 HR/考勤镜像、OA 应急接管、恢复回写或 RuleOps 运行时能力已完成。 - 本路线图只代表开发节奏和门禁,不代表任何企微 HR/考勤镜像、OA 应急接管、恢复回写或 RuleOps 运行时能力已完成。
@@ -258,7 +258,7 @@ WCP1 当前分类:
| 人事助手测试员工花名册读取 | `NEEDS_CONFIG` | `hr.staff_read` 返回 `wecom_errcode_60021`,需将测试成员纳入应用/人事助手权限范围,或改用在职测试员工复跑。 | | 人事助手测试员工花名册读取 | `NEEDS_CONFIG` | `hr.staff_read` 返回 `wecom_errcode_60021`,需将测试成员纳入应用/人事助手权限范围,或改用在职测试员工复跑。 |
| 人事助手资料更新 | `NEEDS_API_POC` | 属生产写接口,本轮只分类,不调用。 | | 人事助手资料更新 | `NEEDS_API_POC` | 属生产写接口,本轮只分类,不调用。 |
| 打卡记录和规则读取 | `NEEDS_CONFIG` | 远端 `WECOM_CHECKIN_SYNC_ENABLED` 未开启,短窗口打卡和规则读取按配置阻断记录。 | | 打卡记录和规则读取 | `NEEDS_CONFIG` | 远端 `WECOM_CHECKIN_SYNC_ENABLED` 未开启,短窗口打卡和规则读取按配置阻断记录。 |
| 审批模板、审批详情、假期余额 | `PARTIAL_NEEDS_CONFIG` | WAPC2FLIVE 已生成请假/补卡 OA-POC 模板和低风险测试审批单并复跑通过;外出/加班样例、真实回调、补偿拉取和镜像数据模型仍需后续合同。 | | 审批模板、审批详情、假期余额 | `PARTIAL_NEEDS_CONFIG` | WAPC2FLIVE 已生成请假/补卡 OA-POC 模板和低风险测试审批单并复跑通过;外出/加班正式模板测试、真实试用和最小完整镜像仍需后续合同。 |
| 回调配置 | `PASS_CALLBACK_EVENT_CONFIRMED` | WCBK1 已在部署环境配置回调 URL、Token 和 EncodingAESKey,并由企微后台保存验证;live runner 先达到 `PASS_CALLBACK_URL_VERIFIED`,随后 `SMOKE101` 同意现有 OA-POC 补卡测试单触发真实事件,报告 `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T092648Z/summary.json` 记录 1 条脱敏事件。 | | 回调配置 | `PASS_CALLBACK_EVENT_CONFIRMED` | WCBK1 已在部署环境配置回调 URL、Token 和 EncodingAESKey,并由企微后台保存验证;live runner 先达到 `PASS_CALLBACK_URL_VERIFIED`,随后 `SMOKE101` 同意现有 OA-POC 补卡测试单触发真实事件,报告 `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T092648Z/summary.json` 记录 1 条脱敏事件。 |
| 采购/合同/报销/财务审批 | `KEEP_OA_PRIMARY` | 继续 OA 主办,企业微信只做脱敏消息和 OA deeplink。 | | 采购/合同/报销/财务审批 | `KEEP_OA_PRIMARY` | 继续 OA 主办,企业微信只做脱敏消息和 OA deeplink。 |
@@ -336,7 +336,7 @@ WCPC 已达到 `GO_TO_HR_MASTER_SYNC`。WHMS 已承接该结论并完成 `wecom_
- 人事助手花名册读取:固定 `WECOM_AGENT_SECRET` 和 `POST /cgi-bin/hr/get_staff_info`;`WECOM_HR_ASSISTANT_SECRET` 不作为默认读取来源。 - 人事助手花名册读取:固定 `WECOM_AGENT_SECRET` 和 `POST /cgi-bin/hr/get_staff_info`;`WECOM_HR_ASSISTANT_SECRET` 不作为默认读取来源。
- 打卡短窗口读取:默认 `WECOM_AGENT_SECRET`,仅显式配置 `WECOM_CHECKIN_SECRET` 时覆盖;WRA1 后 QA-only 只读探测不要求 `WECOM_CHECKIN_SYNC_ENABLED=true`,该开关只控制正式考勤同步批次;缺权限、可信 IP、可见范围或 Secret 时仍记录配置阻断。 - 打卡短窗口读取:默认 `WECOM_AGENT_SECRET`,仅显式配置 `WECOM_CHECKIN_SECRET` 时覆盖;WRA1 后 QA-only 只读探测不要求 `WECOM_CHECKIN_SYNC_ENABLED=true`,该开关只控制正式考勤同步批次;缺权限、可信 IP、可见范围或 Secret 时仍记录配置阻断。
- 应用消息:默认只构建脱敏 payload;公网 live 发送必须同时指定 `--send-test-message` 和 `WECOM_RUNTIME_TEST_SEND=1`,内容只含标题、类型、编号、状态和 OA deeplink。 - 应用消息:默认只构建脱敏 payload;公网 live 发送必须同时指定 `--send-test-message` 和 `WECOM_RUNTIME_TEST_SEND=1`,内容只含标题、类型、编号、状态和 OA deeplink。
- 审批模板、测试 `sp_no` 和真实回调已由 WAPC2FLIVE/WCBK1 在请假/补卡 OA-POC 范围内验证;外出/加班样例、补偿拉取和镜像数据模型仍阻断 `wecom_attendance_approval_mirror_v1`。 - 审批模板、测试 `sp_no` 和真实回调已由 WAPC2FLIVE/WCBK1 在请假/补卡 OA-POC 范围内验证;外出/加班正式模板证据、远端收口、真实试用和镜像数据模型仍阻断 `wecom_attendance_approval_mirror_v1`。
结论口径: 结论口径:
+16 -6
查看文件
@@ -355,7 +355,7 @@ WF8-3、WF8-4、WF8-5 实现前必须基于本设计给技术方案;实现后
- 采购单附件、合同正文、报价、供应商资料、发票、银行回单、代账资料和其他高敏附件不进入企业微信原生审批或企业微信附件;企业微信只做提醒、deeplink 和免登录回流。 - 采购单附件、合同正文、报价、供应商资料、发票、银行回单、代账资料和其他高敏附件不进入企业微信原生审批或企业微信附件;企业微信只做提醒、deeplink 和免登录回流。
- 按域镜像是默认规则:企微主办 HR/考勤域镜像到 OA;OA 主办采购、合同、项目、财务和报销域不反向全量镜像到企微。 - 按域镜像是默认规则:企微主办 HR/考勤域镜像到 OA;OA 主办采购、合同、项目、财务和报销域不反向全量镜像到企微。
- WFDG 后,审批相关页面和接口必须区分 `OA 主办`、`企微镜像` 和 `OA 应急接管`;企微镜像不得被误用为 OA 日常新建入口,OA 应急接管单据必须带 `EMERGENCY` 并进入恢复回写队列。 - WFDG 后,审批相关页面和接口必须区分 `OA 主办`、`企微镜像` 和 `OA 应急接管`;企微镜像不得被误用为 OA 日常新建入口,OA 应急接管单据必须带 `EMERGENCY` 并进入恢复回写队列。
- WAPI/WRRA/WOUA-FIX/WAPC1/WAPC2/WPROC1/WEGOV1 后,审批相关运行时迁移必须先读 [企微优先开发路线图](./企微优先开发路线图.md) 和 [企微 API 能力目录](./企微API能力目录.md),按 `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `WARCH2 正式只读历史查询` -> `WROAD2+OPS 受控上线与每日巡检` -> `WARCH3 归档稳定化自动巡检` -> `WCHECK1 打卡摘要留存` -> `WEXT1 外出/加班 dry-run` -> `WOPS1 巡检告警降噪` -> `WROAD2-CLOSEOUT 三天验收` -> `WROAD2-BIZ1 三天业务冒烟` -> `WAPPR1 审批规则规范化` -> `WRULE1 审批链校验器 POC` -> `WAUTO1 自动证据汇总` -> `WEXT1LD 外出/加班 live 前 dry-run` -> `WFULLSMOKE1 三天全域最终目标测试` -> `WROUTE2 测试号收口到最小镜像路线锁定` -> `WTCLOSE2 测试号最终收口与证据复核` -> `WTCLOSE2F 远端可信 IP 执行口径修正` -> `WEXT1-LIVE 外出/加班测试号 live POC` -> `四类测试号证据和审批规则门禁通过后问答 WREAL1 小范围真实试用(首批 1 名真实员工 + 1 名审批人/管理员观察)` -> `wecom_attendance_approval_mirror_v1 最小完整镜像` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` 的顺序拆单功能 Issue CSV;WOUA-FIX 只收口了用户一致性测试账号差异和处理决策,WRV1/WRA1/WMSG1 只验证入口、OAuth/绑定、脱敏消息、deeplink、通讯录、人事助手、打卡只读主链路和真实消息回流。WAPC1 只固化审批配置准备清单;WAPC2 只读模板详情和低风险 `sp_no` 审批详情;WAPC2FLIVE 只生成 OA-POC 低风险测试样件并自动复跑只读 POC;WCBK1 只证明真实审批状态回调可验签、可解密、可脱敏留证;WACP3R 只证明补偿拉取和详情读取可用,并发现回调证据文件未持久化;WEGOV1 只修正混合主办、自建留存和测试治理口径;WREAD1 只证明请假/补卡当前样例可读;WADM1 只完成模型设计;WARCH1 已实现请假/补卡最小历史留存;WARCH2 只提供只读查询 API 和历史页;WEXT1 只完成外出/加班 dry-run;WROAD2-BIZ1 只补充测试账号人工业务冒烟清单;WAPPR1 将申请人任意选择审批人列为真实试用前阻断 finding;WRULE1 只校验已归档审批链;WAUTO1 只做自动证据汇总,WEXT1LD 只做 live 前 dry-run,WFULLSMOKE1 只做全域主路径总控;WROUTE2 只锁定路线,WTCLOSE2 只做最终自动收口,不授权写入;WEXT1-LIVE 写入前必须另建合同并再次人工确认。完整企微审批镜像必须等 WREAL1 通过后再规划,应急接管和恢复回写仍后置,不得用 WARCH1/WARCH2 或测试号证据直接放行。 - WAPI/WRRA/WOUA-FIX/WAPC1/WAPC2/WPROC1/WEGOV1 后,审批相关运行时迁移必须先读 [企微优先开发路线图](./企微优先开发路线图.md) 和 [企微 API 能力目录](./企微API能力目录.md),按 `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC` -> `WEGOV1 企微主办治理与自建留存路线修正` -> `WACP3/WACP3R 补偿拉取 POC` -> `WREAD1 审批可读性与误审批防护门禁` -> `WADM1 自建留存/镜像数据模型设计` -> `WARCH1 最小自建历史留存实现` -> `WARCH2 正式只读历史查询` -> `WROAD2+OPS 受控上线与每日巡检` -> `WARCH3 归档稳定化自动巡检` -> `WCHECK1 打卡摘要留存` -> `WEXT1 外出/加班 dry-run` -> `WOPS1 巡检告警降噪` -> `WROAD2-CLOSEOUT 三天验收` -> `WROAD2-BIZ1 三天业务冒烟` -> `WAPPR1 审批规则规范化` -> `WRULE1 审批链校验器 POC` -> `WAUTO1 自动证据汇总` -> `WEXT1LD 外出/加班 live 前 dry-run` -> `WFULLSMOKE1 三天全域最终目标测试` -> `WROUTE2 测试号收口到最小镜像路线锁定` -> `WTCLOSE2 测试号最终收口与证据复核` -> `WTCLOSE2F 远端可信 IP 执行口径修正` -> `WREMOTE1/WFULLSMOKE2 远端收口` -> `WEXT1-FORMAL 正式模板外出/加班测试` -> `四类测试号证据和审批规则门禁通过后问答 WREAL1 小范围真实试用(首批 1 名真实员工 + 1 名审批人/管理员观察)` -> `wecom_attendance_approval_mirror_v1 最小完整镜像` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` 的顺序拆单功能 Issue CSV;WOUA-FIX 只收口了用户一致性测试账号差异和处理决策,WRV1/WRA1/WMSG1 只验证入口、OAuth/绑定、脱敏消息、deeplink、通讯录、人事助手、打卡只读主链路和真实消息回流。WAPC1 只固化审批配置准备清单;WAPC2 只读模板详情和低风险 `sp_no` 审批详情;WAPC2FLIVE 只生成 OA-POC 低风险测试样件并自动复跑只读 POC;WCBK1 只证明真实审批状态回调可验签、可解密、可脱敏留证;WACP3R 只证明补偿拉取和详情读取可用,并发现回调证据文件未持久化;WEGOV1 只修正混合主办、自建留存和测试治理口径;WREAD1 只证明请假/补卡当前样例可读;WADM1 只完成模型设计;WARCH1 已实现请假/补卡最小历史留存;WARCH2 只提供只读查询 API 和历史页;WEXT1 只完成外出/加班 dry-run;WROAD2-BIZ1 只补充测试账号人工业务冒烟清单;WAPPR1 将申请人任意选择审批人列为真实试用前阻断 finding;WRULE1 只校验已归档审批链;WAUTO1 只做自动证据汇总,WEXT1LD 只做 live 前 dry-run,WFULLSMOKE1 只做全域主路径总控;WROUTE2 只锁定路线,WTCLOSE2/WREMOTE1 只做远端收口和全域 smoke,不授权写企微;WEXT1-FORMAL 人工提交前必须另建合同并再次人工确认。完整企微审批镜像必须等 WREAL1 通过后再规划,应急接管和恢复回写仍后置,不得用 WARCH1/WARCH2 或测试号证据直接放行。
- WRV1/WRA1 runner `npm run check:wecom-runtime-ready` 中的审批模板、测试 `sp_no` 和真实回调检查只允许输出 `NEEDS_CONFIG`;这类缺口不阻断运行优先主链路的 `PASS_WITH_CONFIG_GAPS`,但必须阻断 `wecom_attendance_approval_mirror_v1`、应急恢复回写和 RuleOps。`WECOM_CHECKIN_SYNC_ENABLED` 只控制正式考勤同步批次,不阻断 QA-only 打卡只读能力探测。 - WRV1/WRA1 runner `npm run check:wecom-runtime-ready` 中的审批模板、测试 `sp_no` 和真实回调检查只允许输出 `NEEDS_CONFIG`;这类缺口不阻断运行优先主链路的 `PASS_WITH_CONFIG_GAPS`,但必须阻断 `wecom_attendance_approval_mirror_v1`、应急恢复回写和 RuleOps。`WECOM_CHECKIN_SYNC_ENABLED` 只控制正式考勤同步批次,不阻断 QA-only 打卡只读能力探测。
- WMSG1 已证明企业微信应用消息可达和 Deeplink 可进入 OA 通知页;该证据只清除通知链路,不清除审批模板、测试 `sp_no` 或真实回调前置。WAPC1 固化配置准备清单后,WAPC2 先提供请假/补卡模板详情和低风险审批详情只读 POC;WPROC1 后优先用 WAPC2F 自动生成 POC 样件,不默认要求人工手动创建模板或测试单。人工介入限于写入批准、密钥/回调配置、企微后台无法 API 化配置、真机确认和风险拍板。 - WMSG1 已证明企业微信应用消息可达和 Deeplink 可进入 OA 通知页;该证据只清除通知链路,不清除审批模板、测试 `sp_no` 或真实回调前置。WAPC1 固化配置准备清单后,WAPC2 先提供请假/补卡模板详情和低风险审批详情只读 POC;WPROC1 后优先用 WAPC2F 自动生成 POC 样件,不默认要求人工手动创建模板或测试单。人工介入限于写入批准、密钥/回调配置、企微后台无法 API 化配置、真机确认和风险拍板。
- 后续企微审批同步的 POC 必须输出 `CAN_REUSE_NOW`、`NEEDS_CONFIG`、`NEEDS_API_POC`、`KEEP_OA_PRIMARY`、`NOT_SUPPORTED_BY_API`,缺模板、回调、Secret 或权限时记录 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 - 后续企微审批同步的 POC 必须输出 `CAN_REUSE_NOW`、`NEEDS_CONFIG`、`NEEDS_API_POC`、`KEEP_OA_PRIMARY`、`NOT_SUPPORTED_BY_API`,缺模板、回调、Secret 或权限时记录 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。
@@ -407,7 +407,7 @@ WAPC2F 是 WAPC2 后的自动化优先补缺阶段,目标是尽量用 QA-only
- 预检两者必须 active、已绑定企微、可见、不是同一 OA 员工、不是同一企微 userid。 - 预检两者必须 active、已绑定企微、可见、不是同一 OA 员工、不是同一企微 userid。
- 自审硬阻断,不因 `admin`、`manager`、`ceo`、`finance` 或其他角色放开。 - 自审硬阻断,不因 `admin`、`manager`、`ceo`、`finance` 或其他角色放开。
- 如果 `SMOKE101` 不可用,不自动换成 `HYD000007` 或其他人员;必须返回配置缺口并用问答方式确认新链路。 - 如果 `SMOKE101` 不可用,不自动换成 `HYD000007` 或其他人员;必须返回配置缺口并用问答方式确认新链路。
- live 写入必须有显式 CLI 参数 `--live --create-templates --submit-test-approvals` 和单次进程环境变量 `WECOM_APPROVAL_FIXTURE_WRITE=1`,默认 dry-run 不获取写入 token、不调用企微写接口。 - live 创建 OA-POC 样件必须有显式 CLI 参数 `--live --create-templates --submit-test-approvals` 和单次进程环境变量 `WECOM_APPROVAL_FIXTURE_WRITE=1`,默认 dry-run 不获取写入 token、不调用企微写接口;WEXT1-FORMAL 正式模板测试不走该写入路径。
- 报告只保存脱敏模板 ID/`sp_no` 前缀、计数、状态和错误分类,不保存完整 `sp_no`、表单值、附件、评论、完整 userid、Secret、token 或原始 payload。 - 报告只保存脱敏模板 ID/`sp_no` 前缀、计数、状态和错误分类,不保存完整 `sp_no`、表单值、附件、评论、完整 userid、Secret、token 或原始 payload。
### 9.3.1 WAPPR1 企微审批规则规范化门禁 ### 9.3.1 WAPPR1 企微审批规则规范化门禁
@@ -421,7 +421,7 @@ WAPPR1 承接 WROAD2 期间发现的补卡申请仍需申请人手动选择审
- WAPPR1 验收必须由三类证据组合:管理员在企微后台确认无“申请人自选”节点;`SMOKE002` 真机提交页确认审批人自动带出且不能任意改人;提交后用 `getapprovaldetail` 校验实际审批人为 `SMOKE101` 且无自审。 - WAPPR1 验收必须由三类证据组合:管理员在企微后台确认无“申请人自选”节点;`SMOKE002` 真机提交页确认审批人自动带出且不能任意改人;提交后用 `getapprovaldetail` 校验实际审批人为 `SMOKE101` 且无自审。
- 2026-05-21 人工门禁结论:测试员工直属上级已设置为测试主管,用户真机确认请假、补卡、外出、加班提交页均自动带出测试主管,且申请人不能删除、改人或新增审批人;四类模板均按 A / `PASS_APPROVER_RULES_READY` 记录。 - 2026-05-21 人工门禁结论:测试员工直属上级已设置为测试主管,用户真机确认请假、补卡、外出、加班提交页均自动带出测试主管,且申请人不能删除、改人或新增审批人;四类模板均按 A / `PASS_APPROVER_RULES_READY` 记录。
- 结论按模板分别记录:`PASS_APPROVER_RULES_READY`、`PASS_WITH_TEMPLATE_ADJUSTMENTS`、`FAIL_KEEP_OA_PRIMARY_FOR_THIS_TEMPLATE` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 - 结论按模板分别记录:`PASS_APPROVER_RULES_READY`、`PASS_WITH_TEMPLATE_ADJUSTMENTS`、`FAIL_KEEP_OA_PRIMARY_FOR_THIS_TEMPLATE` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。
- A/B/C/D 人工门禁口径不变:只有 A 可作为规则门禁通过条件;B、C、D 均阻断 WEXT1-LIVE、WREAL1 和后续 `wecom_attendance_approval_mirror_v1`。 - A/B/C/D 人工门禁口径不变:只有 A 可作为规则门禁通过条件;B、C、D 均阻断 WEXT1-FORMAL、WREAL1 和后续 `wecom_attendance_approval_mirror_v1`。
- 如果企微模板能力或后台配置暂时无法做到自动审批人规则,对应模板继续保持测试账号 POC 或 OA 主办,不进入 WREAL1 真实员工试用。 - 如果企微模板能力或后台配置暂时无法做到自动审批人规则,对应模板继续保持测试账号 POC 或 OA 主办,不进入 WREAL1 真实员工试用。
### 9.3.2 WRULE1 企微 HR/考勤审批链校验器 POC ### 9.3.2 WRULE1 企微 HR/考勤审批链校验器 POC
@@ -436,11 +436,11 @@ WRULE1 不新造 HR/考勤审批引擎,也不读取企微后台规则配置。
- 未传 `--manual-gate=<template>:A/B/C/D` 时输出 `PAUSED_MANUAL_CONFIRMATION`,表示缺少后台人工确认或真机提交页证据,不得把实际审批链匹配误读为模板规则已合规。 - 未传 `--manual-gate=<template>:A/B/C/D` 时输出 `PAUSED_MANUAL_CONFIRMATION`,表示缺少后台人工确认或真机提交页证据,不得把实际审批链匹配误读为模板规则已合规。
- 结论限定为 `PASS_RULE_MATCH`、`PASS_WITH_ADMIN_FALLBACK`、`FAIL_APPLICANT_CAN_CHOOSE`、`FAIL_SELF_APPROVAL`、`FAIL_APPROVER_MISMATCH`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 - 结论限定为 `PASS_RULE_MATCH`、`PASS_WITH_ADMIN_FALLBACK`、`FAIL_APPLICANT_CAN_CHOOSE`、`FAIL_SELF_APPROVAL`、`FAIL_APPROVER_MISMATCH`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。
- 报告只输出审批类型、计数、脱敏 `sp_no`/template/employee 前缀和 finding 类型,不输出完整 userid、完整 template_id、完整 `sp_no`、手机号、邮箱、token、Secret、表单值、附件、评论或原始 payload。 - 报告只输出审批类型、计数、脱敏 `sp_no`/template/employee 前缀和 finding 类型,不输出完整 userid、完整 template_id、完整 `sp_no`、手机号、邮箱、token、Secret、表单值、附件、评论或原始 payload。
- `PASS_RULE_MATCH` 或可解释 `PASS_WITH_ADMIN_FALLBACK` 只是进入测试号收口的自动证据之一;四类模板仍必须先由 WAPPR1 人工确认 A,才能进入 WEXT1-LIVE、WREAL1 和最小完整镜像。 - `PASS_RULE_MATCH` 或可解释 `PASS_WITH_ADMIN_FALLBACK` 只是进入测试号收口的自动证据之一;四类模板仍必须先由 WAPPR1 人工确认 A,才能进入 WEXT1-FORMAL、WREAL1 和最小完整镜像。
### 9.3.3 WTCLOSE2 测试号最终收口与证据复核 ### 9.3.3 WTCLOSE2 测试号最终收口与证据复核
WTCLOSE2 是 WEXT1-LIVE 前的最后自动收口。它复跑并汇总 WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1 证据,确认测试号链路是否可解释通过;它不写企业微信、不创建外出/加班模板或审批单、不启用真实员工。 WTCLOSE2 是正式模板外出/加班测试前的最后自动收口。它复跑并汇总 WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1 证据,确认测试号链路是否可解释通过;它不写企业微信、不创建外出/加班模板或审批单、不启用真实员工。
- 企业微信 API 受可信 IP 限制,WTCLOSE2 真实运行必须在部署服务器执行;runner 为 `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote`,由 SSH 到部署服务器并在 server 容器中生成 `artifacts/qa-flow/wecom-test-account-final-closeout-*/summary.json`。 - 企业微信 API 受可信 IP 限制,WTCLOSE2 真实运行必须在部署服务器执行;runner 为 `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote`,由 SSH 到部署服务器并在 server 容器中生成 `artifacts/qa-flow/wecom-test-account-final-closeout-*/summary.json`。
- 本地直接执行 WTCLOSE2 脚本默认拒绝跑企微链路;本地只允许做 `bash -n`、合同、文档和静态门禁,不得把本地缺 env/DB 输出当作企微业务阻断证据。 - 本地直接执行 WTCLOSE2 脚本默认拒绝跑企微链路;本地只允许做 `bash -n`、合同、文档和静态门禁,不得把本地缺 env/DB 输出当作企微业务阻断证据。
@@ -448,7 +448,17 @@ WTCLOSE2 是 WEXT1-LIVE 前的最后自动收口。它复跑并汇总 WAUTO1、W
- WRULE1 固定传入 `--manual-gate=all:A`,但仍只代表已提交审批链校验,不替代 WAPPR1 人工后台和真机门禁。 - WRULE1 固定传入 `--manual-gate=all:A`,但仍只代表已提交审批链校验,不替代 WAPPR1 人工后台和真机门禁。
- 外出/加班步骤只执行 dry-run,不设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不带 `--live`、`--create-templates` 或 `--submit-test-approvals`。 - 外出/加班步骤只执行 dry-run,不设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不带 `--live`、`--create-templates` 或 `--submit-test-approvals`。
- 结论限定为 `PASS_TEST_ACCOUNT_CLOSEOUT_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 - 结论限定为 `PASS_TEST_ACCOUNT_CLOSEOUT_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。
- WTCLOSE2 可解释通过后只能进入 WEXT1-LIVE 问答;live 创建、真实员工试用和最小完整镜像仍需各自独立合同和人工批准。 - WTCLOSE2 可解释通过后只能进入 WREMOTE1/WFULLSMOKE2 远端收口和 WEXT1-FORMAL 人工提交问答;真实员工试用和最小完整镜像仍需各自独立合同和人工批准。
### 9.3.4 WREMOTE1/WEXT1-FORMAL 正式模板外出/加班测试
WTCLOSE2F 后,企业微信审批相关业务证据必须来自部署服务器可信 IP。外出/加班下一步不再自动创建 OA-POC 测试模板,也不由系统自动提交审批单;改为使用企业微信后台现有正式模板做真实提交页和审批链验证。
- WREMOTE1 先部署/同步代码并执行 `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote`;全域 smoke 使用 `WFULLSMOKE_ALLOW_PUBLIC_WRITES=1 bash scripts/qa/run-three-day-full-goal-smoke.sh --remote`。
- WEXT1-FORMAL 人工操作为 `SMOKE002` 在正式外出、加班模板提交低风险测试单,`SMOKE101` 先打开详情页再审批。
- 系统只读校验为补偿拉取、审批详情读取、OA 归档读取、WRULE1 审批链校验和隐私扫描;不得调用创建模板、提交审批或其他企微写接口。
- 若正式模板出现申请人可任意改审批人、自审、审批人不一致、可见范围或可信 IP 阻断,结论记录为 blocking finding,不进入 WREAL1。
- WREAL1 真实员工和审批人信息只通过 `/tmp/hyb-oa-wreal1.env` 临时文件提供,不写入 Issue CSV、仓库文档或聊天。
### 9.4 WEGOV1 / WACP3 / WREAD1 / WADM1 / WARCH1 前置门禁 ### 9.4 WEGOV1 / WACP3 / WREAD1 / WADM1 / WARCH1 前置门禁
+5 -4
查看文件
@@ -7,7 +7,7 @@
**相关事实源**:[需求 - 统一审批中心规约](./需求-统一审批中心规约.md)、[需求 - 企业微信基础设施规约](./需求-企业微信基础设施规约.md) **相关事实源**:[需求 - 统一审批中心规约](./需求-统一审批中心规约.md)、[需求 - 企业微信基础设施规约](./需求-企业微信基础设施规约.md)
**体验总依据**:[产品设计规则基线](./产品设计规则.md) **体验总依据**:[产品设计规则基线](./产品设计规则.md)
本规约细化请假、补卡、外出、加班与考勤修正的产品要求。WFOC 起,企业微信作为 HR/考勤员工日常审批和打卡规则主操作端;OA 负责按域镜像、应急接管、恢复回写、查询导出和审计。WEGOV1 后进一步明确:企微成熟 HR/考勤功能优先上线,OA 不重造企业微信完整打卡/考勤/HR 产品,但必须做自建历史留存、审计、入口、消息和应急兜底。WAPC2 后,请假和补卡先通过 QA-only runner 只读验证模板详情与低风险 `sp_no` 审批详情;WAPC2FLIVE 已生成 OA-POC 样件并复跑通过;WCBK1 已完成真实回调 URL 验证和一条测试审批事件确认;WACP3R 已自动发现模板并证明补偿拉取和详情读取可用。WREAD1F 后,用户真机确认请假/补卡在企业微信消息卡片、列表和详情页均可看清,远端报告 `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` 为 `PASS_READABLE`;驳回有二次确认,同意单击即通过。WARCH1 已实现请假/补卡最小审批历史留存、回调事件入库、补偿拉取入库和离线读取证明;WARCH2 已提供正式只读历史查询。WROAD2 后进入测试账号受控上线;WARCH3 已新增 07:30 systemd 自动巡检和脱敏企微告警;WCHECK1 已新增打卡规范化明细、日/月摘要和规则快照留存;WEXT1 已支持外出/加班 dry-run,但未 live 创建模板或审批单。WOPS1 后告警默认发给 `HYD000006`(`wangshunli` 的员工号)且只报新增异常;WROAD2-BIZ1 在三天内补充测试账号打卡、请假、补卡和 OA 离线查看人工业务冒烟;WAPPR1 把“申请人不得任意选择审批人、必须自动带出审批人、禁止自审”列为真实试用前门禁。WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1 完成前不启用真实员工;外出/加班 live 仍需 WEXT1-LIVE 独立合同和人工确认;四类测试号证据与审批规则门禁通过后才问真实小范围试用。当前仍不代表完整审批镜像、外出/加班正式样件、应急接管或恢复回写已实现。PC 和移动页面体验以产品设计规则基线为依据,不重复定义通用审批链和移动导航规则。 本规约细化请假、补卡、外出、加班与考勤修正的产品要求。WFOC 起,企业微信作为 HR/考勤员工日常审批和打卡规则主操作端;OA 负责按域镜像、应急接管、恢复回写、查询导出和审计。WEGOV1 后进一步明确:企微成熟 HR/考勤功能优先上线,OA 不重造企业微信完整打卡/考勤/HR 产品,但必须做自建历史留存、审计、入口、消息和应急兜底。WAPC2 后,请假和补卡先通过 QA-only runner 只读验证模板详情与低风险 `sp_no` 审批详情;WAPC2FLIVE 已生成 OA-POC 样件并复跑通过;WCBK1 已完成真实回调 URL 验证和一条测试审批事件确认;WACP3R 已自动发现模板并证明补偿拉取和详情读取可用。WREAD1F 后,用户真机确认请假/补卡在企业微信消息卡片、列表和详情页均可看清,远端报告 `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` 为 `PASS_READABLE`;驳回有二次确认,同意单击即通过。WARCH1 已实现请假/补卡最小审批历史留存、回调事件入库、补偿拉取入库和离线读取证明;WARCH2 已提供正式只读历史查询。WROAD2 后进入测试账号受控上线;WARCH3 已新增 07:30 systemd 自动巡检和脱敏企微告警;WCHECK1 已新增打卡规范化明细、日/月摘要和规则快照留存;WEXT1 已支持外出/加班 dry-run,但未 live 创建模板或审批单。WOPS1 后告警默认发给 `HYD000006`(`wangshunli` 的员工号)且只报新增异常;WROAD2-BIZ1 在三天内补充测试账号打卡、请假、补卡和 OA 离线查看人工业务冒烟;WAPPR1 把“申请人不得任意选择审批人、必须自动带出审批人、禁止自审”列为真实试用前门禁。WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1/WRULE1/WTCLOSE2/WREMOTE1 完成前不启用真实员工;外出/加班下一步改为 WEXT1-FORMAL 正式模板人工提交 + 系统只读校验,不再自动创建 OA-POC 外出/加班模板;四类测试号证据与审批规则门禁通过后才问真实小范围试用。当前仍不代表完整审批镜像、外出/加班正式模板证据、应急接管或恢复回写已实现。PC 和移动页面体验以产品设计规则基线为依据,不重复定义通用审批链和移动导航规则。
--- ---
@@ -49,7 +49,7 @@ REQAUD 复核后,ATTV1 已完成统一入口实现,当前运行时完成度
| 请假对团队状态/日历的影响 | `DONE` | 已批准请假可作为团队状态和日历依据。 | | 请假对团队状态/日历的影响 | `DONE` | 已批准请假可作为团队状态和日历依据。 |
| 企业微信打卡作为原始采集 | `DONE` | 由企业微信侧承载定位、人脸、Wi-Fi、设备和防作弊能力;OA 不重造。 | | 企业微信打卡作为原始采集 | `DONE` | 由企业微信侧承载定位、人脸、Wi-Fi、设备和防作弊能力;OA 不重造。 |
| 企业微信打卡 API 同步 | `PARTIAL` | 已新增同步批次和企微打卡摘要表;有已授权调用打卡 API 的自建应用 Secret 和企微权限时同步,缺配置时记录 `SKIP`。`WECOM_CHECKIN_SECRET` 可作为单独考勤同步应用的显式覆盖;未配置时复用已授权工作台应用的 `WECOM_AGENT_SECRET`。 | | 企业微信打卡 API 同步 | `PARTIAL` | 已新增同步批次和企微打卡摘要表;有已授权调用打卡 API 的自建应用 Secret 和企微权限时同步,缺配置时记录 `SKIP`。`WECOM_CHECKIN_SECRET` 可作为单独考勤同步应用的显式覆盖;未配置时复用已授权工作台应用的 `WECOM_AGENT_SECRET`。 |
| 企微 HR/考勤审批镜像 | `CONTROLLED_OPS_READY` | WAPC2 已新增请假/补卡模板详情和低风险 `sp_no` 审批详情只读 POC;WAPC2FLIVE 已完成自动样件与 WAPC2 自动复跑;WCBK1 已完成真实回调 URL 验证和一条测试审批事件确认;WACP3R 已证明请假/补卡补偿拉取和详情读取可用;WREAD1F 已完成请假/补卡模板级真机确认,结论 `PASS_READABLE`。WARCH1 已实现请假/补卡最小历史留存和离线读取,WARCH2 已实现正式只读历史查询。WROAD2+OPS 做测试账号巡检,WARCH3 已升级自动巡检,WCHECK1 已补打卡摘要留存,WEXT1 只完成外出/加班 dry-run,WOPS1 修正告警降噪和管理员员工号;后续 `wecom_attendance_approval_mirror_v1` 仍需 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WEXT1-LIVE、四类测试号证据、WREAL1 小范围真实试用或明确批准。 | | 企微 HR/考勤审批镜像 | `CONTROLLED_OPS_READY` | WAPC2 已新增请假/补卡模板详情和低风险 `sp_no` 审批详情只读 POC;WAPC2FLIVE 已完成自动样件与 WAPC2 自动复跑;WCBK1 已完成真实回调 URL 验证和一条测试审批事件确认;WACP3R 已证明请假/补卡补偿拉取和详情读取可用;WREAD1F 已完成请假/补卡模板级真机确认,结论 `PASS_READABLE`。WARCH1 已实现请假/补卡最小历史留存和离线读取,WARCH2 已实现正式只读历史查询。WROAD2+OPS 做测试账号巡检,WARCH3 已升级自动巡检,WCHECK1 已补打卡摘要留存,WEXT1 只完成外出/加班 dry-run,WOPS1 修正告警降噪和管理员员工号;后续 `wecom_attendance_approval_mirror_v1` 仍需 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WRULE1、WTCLOSE2/WREMOTE1、WEXT1-FORMAL、四类测试号证据、WREAL1 小范围真实试用或明确批准。 |
| 员工补卡申请审批 | `DONE_AS_OA_FALLBACK` | 当前 OA 能提交补卡修正;WFOC 后正常入口迁往企微,OA 仅在应急模式开放并进入恢复回写。 | | 员工补卡申请审批 | `DONE_AS_OA_FALLBACK` | 当前 OA 能提交补卡修正;WFOC 后正常入口迁往企微,OA 仅在应急模式开放并进入恢复回写。 |
| 外出申请审批 | `DONE_AS_OA_FALLBACK` | 当前 OA 能提交外出修正;WFOC 后正常入口迁往企微,OA 仅在应急模式开放并进入恢复回写。 | | 外出申请审批 | `DONE_AS_OA_FALLBACK` | 当前 OA 能提交外出修正;WFOC 后正常入口迁往企微,OA 仅在应急模式开放并进入恢复回写。 |
| 加班申请审批 | `DONE_AS_OA_FALLBACK` | 当前 OA 能提交加班修正;WFOC 后正常入口迁往企微,OA 仅在应急模式开放并进入恢复回写。 | | 加班申请审批 | `DONE_AS_OA_FALLBACK` | 当前 OA 能提交加班修正;WFOC 后正常入口迁往企微,OA 仅在应急模式开放并进入恢复回写。 |
@@ -237,8 +237,9 @@ WFOC 后,正常审批规则优先以企业微信审批模板和打卡/假期
- 已完成 A0.19:`WEXT1 外出/加班 dry-run`,支持外出/加班低风险 POC payload 构建;live 创建模板或审批单前必须再次问答批准。 - 已完成 A0.19:`WEXT1 外出/加班 dry-run`,支持外出/加班低风险 POC payload 构建;live 创建模板或审批单前必须再次问答批准。
- 后续 A0.20:`WROAD2-BIZ1 三天业务冒烟`,在测试账号范围补充真实业务动作:`SMOKE002` 每天按企微规则尝试上/下班打卡并提交低风险请假/补卡,`SMOKE101` 先打开详情再审批,`HYD000006` 每天查看 OA 企微审批归档和打卡摘要;无法打卡、无法审批或需要手选审批人时记录 finding。 - 后续 A0.20:`WROAD2-BIZ1 三天业务冒烟`,在测试账号范围补充真实业务动作:`SMOKE002` 每天按企微规则尝试上/下班打卡并提交低风险请假/补卡,`SMOKE101` 先打开详情再审批,`HYD000006` 每天查看 OA 企微审批归档和打卡摘要;无法打卡、无法审批或需要手选审批人时记录 finding。
- 后续 A0.21:`WAPPR1 审批规则规范化门禁`,请假、补卡、外出、加班正式模板必须按直属主管、部门负责人或指定审批角色自动带出审批人;申请人不得任意选择审批人;审批人缺失、停用、未绑定、不可见或自审时阻断,未通过模板不得进入真实试用。 - 后续 A0.21:`WAPPR1 审批规则规范化门禁`,请假、补卡、外出、加班正式模板必须按直属主管、部门负责人或指定审批角色自动带出审批人;申请人不得任意选择审批人;审批人缺失、停用、未绑定、不可见或自审时阻断,未通过模板不得进入真实试用。
- 后续 A0.22:`WEXT1-LIVE 外出/加班测试号 live POC`,仅在 WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1 可解释通过后另建合同并再次人工确认;一次创建外出+加班 OA-POC 低风险样件,固定 `SMOKE002 -> SMOKE101`、`WECOM_AGENT_SECRET` 和写入双开关,样件保留审计。 - 后续 A0.22:`WTCLOSE2/WREMOTE1/WFULLSMOKE2 远端收口`,仅在 WAPPR1=A、WRULE1 可解释通过后,从部署服务器可信 IP 复跑测试号收口和全域 smoke;本地只做静态门禁,不作为企微业务证据。
- 后续 A0.23:`WREAL1 小范围真实试用`,仅在请假、补卡、外出、加班四类测试号证据和 WAPPR1 审批规则门禁通过后启动,首批固定为 1 名真实员工 + 1 名审批人/管理员观察,届时再确认试用周期、回滚联系人和验收标准。 - 后续 A0.23:`WEXT1-FORMAL 正式模板外出/加班测试`,仅在远端收口可解释通过后再次问答确认;由 `SMOKE002` 在现有正式模板提交低风险外出/加班测试单,`SMOKE101` 先看详情再审批,系统只读补偿、归档和审批链校验;不自动创建 OA-POC 外出/加班模板或审批单。
- 后续 A0.24:`WREAL1 小范围真实试用`,仅在请假、补卡、外出、加班四类测试号证据和 WAPPR1/WRULE1 审批规则门禁通过后启动,首批固定为 1 名真实员工 + 1 名审批人/管理员观察,届时再确认试用周期、回滚联系人和验收标准。
- 后续 A1:`wecom_attendance_approval_mirror_v1 最小完整镜像`,同步企微请假、补卡、外出、加班审批、附件摘要、历史、状态回调、打卡摘要、必要假期/人事快照;该命名承接旧口径 `wecom_native_approval_mirror_v1`。正式开发前仍必须完成 WREAL1 或获得明确批准,并保留打卡细项、假期余额和四类测试号证据边界;应急接管、恢复回写和 RuleOps 后置。 - 后续 A1:`wecom_attendance_approval_mirror_v1 最小完整镜像`,同步企微请假、补卡、外出、加班审批、附件摘要、历史、状态回调、打卡摘要、必要假期/人事快照;该命名承接旧口径 `wecom_native_approval_mirror_v1`。正式开发前仍必须完成 WREAL1 或获得明确批准,并保留打卡细项、假期余额和四类测试号证据边界;应急接管、恢复回写和 RuleOps 后置。
- 后续 A2:`oa_hr_emergency_mode_v1`,管理员人工接管、应急提交、应急审批和恢复队列。 - 后续 A2:`oa_hr_emergency_mode_v1`,管理员人工接管、应急提交、应急审批和恢复队列。
- 后续 A3:`wecom_recovery_writeback_v1`,企微恢复后 dry-run、自动回写、失败重试和冲突清单。 - 后续 A3:`wecom_recovery_writeback_v1`,企微恢复后 dry-run、自动回写、失败重试和冲突清单。
@@ -0,0 +1,10 @@
"ID","Title","Description","Acceptance","Test_Method","Tools","Dev_Status","Review1_Status","Regression_Status","Files","Dependencies","Notes"
"WREMOTE1-0","建立远端可信 IP 收口合同","建立 WREMOTE1/WFULLSMOKE2/WEXT1-FORMAL/WREAL1/WMIRROR1 后续路线合同,承接 WTCLOSE2F 后只能从部署服务器访问企微 API 的边界;企微审批、打卡、消息和运行态检查固定 WECOM_AGENT_SECRET,不尝试其他 Secret、无 fallback、不允许运行时猜 Secret。","1) 新合同使用 WREMOTE1-0..WREMOTE1-8;2) 明确企微 API 证据只来自部署服务器可信 IP;3) 明确本地只做合同、语法、文档、静态门禁;4) 明确 WEXT1-FORMAL 改为正式模板人工提交,不再自动创建 OA-POC 外出/加班模板。","受影响流程:路线合同 -> 远端 WTCLOSE2 -> 全域 smoke -> 正式模板外出/加班 -> WREAL1;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-22_12-34-41-wecom-remote-closeout-and-full-smoke-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-22_12-34-41-wecom-remote-closeout-and-full-smoke-v1.csv --profile wecom --json。","python3|node","DONE","DONE","DONE","issues/2026-05-22_12-34-41-wecom-remote-closeout-and-full-smoke-v1.csv","[]","回滚/清理:恢复本轮合同、脚本和文档改动;不修改 Prisma schema;不写企业微信。"
"WREMOTE1-1","WFULLSMOKE2 增加远端执行入口","给 scripts/qa/run-three-day-full-goal-smoke.sh、scripts/qa/run-wecom-test-account-final-closeout.sh 和 WAUTO1 汇总脚本增加 --remote 和可信 IP 保护,避免本地误跑企微链路;远端容器内设置 *_EXECUTION_MODE=remote 和 *_REMOTE_CONTEXT=deployment-server。","1) 本地直接执行默认拒绝并提示 --remote;2) --remote 经 SSH 到部署服务器 server 容器执行;3) 可通过 WFULLSMOKE_ALLOW_PUBLIC_WRITES 控制是否允许 OA 测试业务数据写入;4) summary 记录 executionMode 和 trustedIpBoundary;5) 不新增企微写入开关。","受影响流程:WFULLSMOKE2/WAUTO1/WTCLOSE2 远端执行 -> 企微链路可信 IP -> OA 主办域公网 smoke;验证步骤:bash -n scripts/qa/run-three-day-full-goal-smoke.sh scripts/qa/run-wecom-test-account-final-closeout.sh scripts/qa/collect-wecom-controlled-trial-evidence.sh;bash scripts/qa/run-three-day-full-goal-smoke.sh --help;本地直接执行三个脚本均应返回非 0 且提示 --remote。","bash|ssh","DONE","DONE","DONE","scripts/qa/run-three-day-full-goal-smoke.sh|scripts/qa/run-wecom-test-account-final-closeout.sh|scripts/qa/collect-wecom-controlled-trial-evidence.sh","[""WREMOTE1-0""]","回滚/清理:恢复脚本;远端全域 smoke 只允许 TEST-SMOKE-WFULL 标记 OA 测试数据;不写企微。"
"WREMOTE1-2","更新事实源为正式模板外出加班测试","更新路线图、管理员手册、统一审批规约、试运行报告、文档索引、事实源矩阵和项目 skill,固化外出/加班 live 使用正式模板人工提交 + 系统只读校验。","1) 文档不再把下一步描述为自动创建外出/加班 OA-POC 模板;2) 明确 SMOKE002 真机提交正式模板、SMOKE101 先看详情再审批;3) 系统只读补偿拉取、归档和 WRULE1;4) WREAL1 仍需另行问答和临时 env。","受影响流程:后续执行者读取事实源 -> 正确执行正式模板测试;验证步骤:rg -n ""WREMOTE1|WFULLSMOKE2|WEXT1-FORMAL|正式模板|/tmp/hyb-oa-wreal1.env"" docs .agents/skills/hyb-oa-delivery/SKILL.md;node scripts/qa/audit-docs.mjs --check-registry;quick_validate.py .agents/skills/hyb-oa-delivery。","rg|node|python3","DONE","DONE","DONE","docs/企微优先开发路线图.md|docs/管理员手册.md|docs/trialrun/人工试运行报告.md|docs/文档索引.md|docs/文档事实源状态矩阵.md|docs/需求-统一审批中心规约.md|.agents/skills/hyb-oa-delivery/SKILL.md","[""WREMOTE1-1""]","回滚/清理:恢复文档和 skill;不写仓库中的真实员工信息。"
"WREMOTE1-3","准备 WREAL1 临时 env 模板","在 /tmp/hyb-oa-wreal1.env 准备真实试用临时配置占位,供用户后续填写真实员工和审批人/观察人,不进仓库。","1) 文件只在 /tmp;2) 只包含注释和空值占位;3) 不输出真实员工号;4) 后续只校验非空和脱敏。","受影响流程:WREAL1 启动前人工配置 -> 系统脱敏读取;验证步骤:test -f /tmp/hyb-oa-wreal1.env;awk -F= '/^WREAL1_/ {print $1""=""($2==""""?""EMPTY"":""SET"")}' /tmp/hyb-oa-wreal1.env 确认只输出 key 和 SET/EMPTY,不输出真实员工号。","bash","DONE","DONE","DONE","/tmp/hyb-oa-wreal1.env","[""WREMOTE1-2""]","回滚/清理:删除 /tmp/hyb-oa-wreal1.env;该文件不纳入 git。"
"WREMOTE1-4","只读 reviewer 审查远端与正式模板边界","涉及审批规则、权限和真实试用准入,实施后由只读 reviewer 检查是否可能误用本地结果、误授权企微写入或跳过人工门禁。","1) reviewer 只读;2) 审查 WFULLSMOKE2 本地默认阻断;3) 审查 WEXT1-FORMAL 不创建模板、不自动提交审批;4) 审查 WREAL1 信息不入仓库;5) blocker 必须修复。","受影响流程:脚本/文档修正 -> 独立评审 -> 门禁回填;验证步骤:reviewer subagent 输出无 blocker 或 blocker 已处理。","subagent|manual","DONE","DONE","DONE","N/A","[""WREMOTE1-3""]","回滚/清理:reviewer 不修改文件;如发现风险,暂停部署和远端执行。"
"WREMOTE1-5","本地静态门禁复跑","复跑合同、process gate、脚本语法、文档审计、skill 校验、diff 检查和最小回归。","1) validate_issues_csv 通过;2) baseline 和 issue-specific process gate 通过;3) bash -n 通过;4) audit-docs、quick_validate、git diff --check 通过;5) bash scripts/check-minimal.sh 通过。","受影响流程:本地静态门禁 -> 提交 -> 部署;验证步骤:validate_issues_csv.py <csv>;node scripts/qa/check-process-contract.mjs --baseline --json;node scripts/qa/check-process-contract.mjs --issue <csv> --profile wecom --json;bash -n scripts/qa/run-three-day-full-goal-smoke.sh scripts/qa/run-wecom-test-account-final-closeout.sh scripts/qa/collect-wecom-controlled-trial-evidence.sh;bash scripts/check-minimal.sh。","python3|node|bash|git","DONE","DONE","DONE","scripts/qa/run-three-day-full-goal-smoke.sh|scripts/qa/run-wecom-test-account-final-closeout.sh|scripts/qa/collect-wecom-controlled-trial-evidence.sh|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md","[""WREMOTE1-4""]","回滚/清理:若门禁失败,保留 TODO 并暂停部署。"
"WREMOTE1-6","部署并远端执行 WTCLOSE2","本地门禁通过并提交后,使用 SYNC_ENV=0 部署/同步,然后从部署服务器可信 IP 执行 WTCLOSE2 远端收口。","1) SYNC_ENV=0 部署成功;2) /ready 正常;3) bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote 生成远端报告;4) 报告不泄露完整 sp_no/template_id/userid/token/Secret/表单值/原始 payload。","受影响流程:部署 -> 远端 WTCLOSE2 -> WEXT1-FORMAL 问答;验证步骤:SYNC_ENV=0 bash deploy/trialrun/deploy.sh;curl -fsS https://oa.hyinda.com/ready;bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote。","bash|ssh|curl","TODO","TODO","TODO","deploy/trialrun/*|scripts/qa/run-wecom-test-account-final-closeout.sh","[""WREMOTE1-5""]","回滚/清理:若部署或远端 WTCLOSE2 阻断,记录真实 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;不继续正式模板测试。"
"WREMOTE1-7","远端执行 WFULLSMOKE2 全域 smoke","远端运行 WFULLSMOKE2,允许创建 TEST-SMOKE-WFULL 标记的 OA 主办域测试数据,验证全域主路径。","1) 远端执行全域 smoke;2) 只创建 TEST-SMOKE-WFULL 标记 OA 测试业务数据;3) 不写企业微信、不真实付款、不接支付、不写 ERP、不导入银行流水;4) 输出 PASS_FULL_GOAL_SMOKE_READY、PASS_WITH_FINDINGS、PAUSED_MANUAL_CONFIRMATION 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG。","受影响流程:OA 报销 -> 采购 -> 合同/项目 -> 付款批次 -> 移动/企微入口;验证步骤:WFULLSMOKE_ALLOW_PUBLIC_WRITES=1 bash scripts/qa/run-three-day-full-goal-smoke.sh --remote;核对 summary.json 和测试标记。","bash|ssh|playwright","TODO","TODO","TODO","scripts/qa/run-three-day-full-goal-smoke.sh","[""WREMOTE1-6""]","回滚/清理:测试数据保留审计,不自动清理;若凭据缺失,记录 PASS_WITH_FINDINGS 或 PAUSED_MANUAL_CONFIRMATION。"
"WREMOTE1-8","提交并报告后续人工门禁","回填 WREMOTE1 状态并中文提交;远端 WTCLOSE2/WFULLSMOKE2 结果决定是否进入正式模板外出/加班人工提交问答。","1) CSV 状态按真实验证回填;2) 中文提交包含 WREMOTE1;3) 最终说明是否已部署、远端报告路径和下一步人工操作;4) 若未远端执行,明确阻断原因。","受影响流程:提交 -> 人工 WEXT1-FORMAL 问答 -> WREAL1;验证步骤:git status --short;git log -1 --oneline。","git","TODO","TODO","TODO","issues/2026-05-22_12-34-41-wecom-remote-closeout-and-full-smoke-v1.csv|scripts/qa/run-three-day-full-goal-smoke.sh|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md","[""WREMOTE1-7""]","回滚/清理:revert 本提交;WEXT1-FORMAL 和 WREAL1 仍需后续人工确认。"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 WREMOTE1-0 建立远端可信 IP 收口合同 建立 WREMOTE1/WFULLSMOKE2/WEXT1-FORMAL/WREAL1/WMIRROR1 后续路线合同,承接 WTCLOSE2F 后只能从部署服务器访问企微 API 的边界;企微审批、打卡、消息和运行态检查固定 WECOM_AGENT_SECRET,不尝试其他 Secret、无 fallback、不允许运行时猜 Secret。 1) 新合同使用 WREMOTE1-0..WREMOTE1-8;2) 明确企微 API 证据只来自部署服务器可信 IP;3) 明确本地只做合同、语法、文档、静态门禁;4) 明确 WEXT1-FORMAL 改为正式模板人工提交,不再自动创建 OA-POC 外出/加班模板。 受影响流程:路线合同 -> 远端 WTCLOSE2 -> 全域 smoke -> 正式模板外出/加班 -> WREAL1;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-22_12-34-41-wecom-remote-closeout-and-full-smoke-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-22_12-34-41-wecom-remote-closeout-and-full-smoke-v1.csv --profile wecom --json。 python3|node DONE DONE DONE issues/2026-05-22_12-34-41-wecom-remote-closeout-and-full-smoke-v1.csv [] 回滚/清理:恢复本轮合同、脚本和文档改动;不修改 Prisma schema;不写企业微信。
3 WREMOTE1-1 WFULLSMOKE2 增加远端执行入口 给 scripts/qa/run-three-day-full-goal-smoke.sh、scripts/qa/run-wecom-test-account-final-closeout.sh 和 WAUTO1 汇总脚本增加 --remote 和可信 IP 保护,避免本地误跑企微链路;远端容器内设置 *_EXECUTION_MODE=remote 和 *_REMOTE_CONTEXT=deployment-server。 1) 本地直接执行默认拒绝并提示 --remote;2) --remote 经 SSH 到部署服务器 server 容器执行;3) 可通过 WFULLSMOKE_ALLOW_PUBLIC_WRITES 控制是否允许 OA 测试业务数据写入;4) summary 记录 executionMode 和 trustedIpBoundary;5) 不新增企微写入开关。 受影响流程:WFULLSMOKE2/WAUTO1/WTCLOSE2 远端执行 -> 企微链路可信 IP -> OA 主办域公网 smoke;验证步骤:bash -n scripts/qa/run-three-day-full-goal-smoke.sh scripts/qa/run-wecom-test-account-final-closeout.sh scripts/qa/collect-wecom-controlled-trial-evidence.sh;bash scripts/qa/run-three-day-full-goal-smoke.sh --help;本地直接执行三个脚本均应返回非 0 且提示 --remote。 bash|ssh DONE DONE DONE scripts/qa/run-three-day-full-goal-smoke.sh|scripts/qa/run-wecom-test-account-final-closeout.sh|scripts/qa/collect-wecom-controlled-trial-evidence.sh ["WREMOTE1-0"] 回滚/清理:恢复脚本;远端全域 smoke 只允许 TEST-SMOKE-WFULL 标记 OA 测试数据;不写企微。
4 WREMOTE1-2 更新事实源为正式模板外出加班测试 更新路线图、管理员手册、统一审批规约、试运行报告、文档索引、事实源矩阵和项目 skill,固化外出/加班 live 使用正式模板人工提交 + 系统只读校验。 1) 文档不再把下一步描述为自动创建外出/加班 OA-POC 模板;2) 明确 SMOKE002 真机提交正式模板、SMOKE101 先看详情再审批;3) 系统只读补偿拉取、归档和 WRULE1;4) WREAL1 仍需另行问答和临时 env。 受影响流程:后续执行者读取事实源 -> 正确执行正式模板测试;验证步骤:rg -n "WREMOTE1|WFULLSMOKE2|WEXT1-FORMAL|正式模板|/tmp/hyb-oa-wreal1.env" docs .agents/skills/hyb-oa-delivery/SKILL.md;node scripts/qa/audit-docs.mjs --check-registry;quick_validate.py .agents/skills/hyb-oa-delivery。 rg|node|python3 DONE DONE DONE docs/企微优先开发路线图.md|docs/管理员手册.md|docs/trialrun/人工试运行报告.md|docs/文档索引.md|docs/文档事实源状态矩阵.md|docs/需求-统一审批中心规约.md|.agents/skills/hyb-oa-delivery/SKILL.md ["WREMOTE1-1"] 回滚/清理:恢复文档和 skill;不写仓库中的真实员工信息。
5 WREMOTE1-3 准备 WREAL1 临时 env 模板 在 /tmp/hyb-oa-wreal1.env 准备真实试用临时配置占位,供用户后续填写真实员工和审批人/观察人,不进仓库。 1) 文件只在 /tmp;2) 只包含注释和空值占位;3) 不输出真实员工号;4) 后续只校验非空和脱敏。 受影响流程:WREAL1 启动前人工配置 -> 系统脱敏读取;验证步骤:test -f /tmp/hyb-oa-wreal1.env;awk -F= '/^WREAL1_/ {print $1"="($2==""?"EMPTY":"SET")}' /tmp/hyb-oa-wreal1.env 确认只输出 key 和 SET/EMPTY,不输出真实员工号。 bash DONE DONE DONE /tmp/hyb-oa-wreal1.env ["WREMOTE1-2"] 回滚/清理:删除 /tmp/hyb-oa-wreal1.env;该文件不纳入 git。
6 WREMOTE1-4 只读 reviewer 审查远端与正式模板边界 涉及审批规则、权限和真实试用准入,实施后由只读 reviewer 检查是否可能误用本地结果、误授权企微写入或跳过人工门禁。 1) reviewer 只读;2) 审查 WFULLSMOKE2 本地默认阻断;3) 审查 WEXT1-FORMAL 不创建模板、不自动提交审批;4) 审查 WREAL1 信息不入仓库;5) blocker 必须修复。 受影响流程:脚本/文档修正 -> 独立评审 -> 门禁回填;验证步骤:reviewer subagent 输出无 blocker 或 blocker 已处理。 subagent|manual DONE DONE DONE N/A ["WREMOTE1-3"] 回滚/清理:reviewer 不修改文件;如发现风险,暂停部署和远端执行。
7 WREMOTE1-5 本地静态门禁复跑 复跑合同、process gate、脚本语法、文档审计、skill 校验、diff 检查和最小回归。 1) validate_issues_csv 通过;2) baseline 和 issue-specific process gate 通过;3) bash -n 通过;4) audit-docs、quick_validate、git diff --check 通过;5) bash scripts/check-minimal.sh 通过。 受影响流程:本地静态门禁 -> 提交 -> 部署;验证步骤:validate_issues_csv.py <csv>;node scripts/qa/check-process-contract.mjs --baseline --json;node scripts/qa/check-process-contract.mjs --issue <csv> --profile wecom --json;bash -n scripts/qa/run-three-day-full-goal-smoke.sh scripts/qa/run-wecom-test-account-final-closeout.sh scripts/qa/collect-wecom-controlled-trial-evidence.sh;bash scripts/check-minimal.sh。 python3|node|bash|git DONE DONE DONE scripts/qa/run-three-day-full-goal-smoke.sh|scripts/qa/run-wecom-test-account-final-closeout.sh|scripts/qa/collect-wecom-controlled-trial-evidence.sh|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md ["WREMOTE1-4"] 回滚/清理:若门禁失败,保留 TODO 并暂停部署。
8 WREMOTE1-6 部署并远端执行 WTCLOSE2 本地门禁通过并提交后,使用 SYNC_ENV=0 部署/同步,然后从部署服务器可信 IP 执行 WTCLOSE2 远端收口。 1) SYNC_ENV=0 部署成功;2) /ready 正常;3) bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote 生成远端报告;4) 报告不泄露完整 sp_no/template_id/userid/token/Secret/表单值/原始 payload。 受影响流程:部署 -> 远端 WTCLOSE2 -> WEXT1-FORMAL 问答;验证步骤:SYNC_ENV=0 bash deploy/trialrun/deploy.sh;curl -fsS https://oa.hyinda.com/ready;bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote。 bash|ssh|curl TODO TODO TODO deploy/trialrun/*|scripts/qa/run-wecom-test-account-final-closeout.sh ["WREMOTE1-5"] 回滚/清理:若部署或远端 WTCLOSE2 阻断,记录真实 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;不继续正式模板测试。
9 WREMOTE1-7 远端执行 WFULLSMOKE2 全域 smoke 远端运行 WFULLSMOKE2,允许创建 TEST-SMOKE-WFULL 标记的 OA 主办域测试数据,验证全域主路径。 1) 远端执行全域 smoke;2) 只创建 TEST-SMOKE-WFULL 标记 OA 测试业务数据;3) 不写企业微信、不真实付款、不接支付、不写 ERP、不导入银行流水;4) 输出 PASS_FULL_GOAL_SMOKE_READY、PASS_WITH_FINDINGS、PAUSED_MANUAL_CONFIRMATION 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG。 受影响流程:OA 报销 -> 采购 -> 合同/项目 -> 付款批次 -> 移动/企微入口;验证步骤:WFULLSMOKE_ALLOW_PUBLIC_WRITES=1 bash scripts/qa/run-three-day-full-goal-smoke.sh --remote;核对 summary.json 和测试标记。 bash|ssh|playwright TODO TODO TODO scripts/qa/run-three-day-full-goal-smoke.sh ["WREMOTE1-6"] 回滚/清理:测试数据保留审计,不自动清理;若凭据缺失,记录 PASS_WITH_FINDINGS 或 PAUSED_MANUAL_CONFIRMATION。
10 WREMOTE1-8 提交并报告后续人工门禁 回填 WREMOTE1 状态并中文提交;远端 WTCLOSE2/WFULLSMOKE2 结果决定是否进入正式模板外出/加班人工提交问答。 1) CSV 状态按真实验证回填;2) 中文提交包含 WREMOTE1;3) 最终说明是否已部署、远端报告路径和下一步人工操作;4) 若未远端执行,明确阻断原因。 受影响流程:提交 -> 人工 WEXT1-FORMAL 问答 -> WREAL1;验证步骤:git status --short;git log -1 --oneline。 git TODO TODO TODO issues/2026-05-22_12-34-41-wecom-remote-closeout-and-full-smoke-v1.csv|scripts/qa/run-three-day-full-goal-smoke.sh|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md ["WREMOTE1-7"] 回滚/清理:revert 本提交;WEXT1-FORMAL 和 WREAL1 仍需后续人工确认。
@@ -9,6 +9,62 @@ SUMMARY_TXT="$REPORT_DIR/summary.txt"
STATUS=0 STATUS=0
FINDING_COUNT=0 FINDING_COUNT=0
usage() {
cat <<'EOF'
Usage:
bash scripts/qa/collect-wecom-controlled-trial-evidence.sh --remote
WAUTO1 reads live Enterprise WeChat approval data, so business evidence must run
on the deployment server trusted IP. Local execution is blocked; use bash -n for
syntax/static checks.
EOF
}
run_remote() {
local deploy_server="${DEPLOY_SERVER:-deploy@118.89.77.218}"
local remote_dir="${REMOTE_DIR:-/opt/hyb-oa-trialrun}"
local remote_env_file="${REMOTE_ENV_FILE:-${remote_dir}/deploy/trialrun/.env}"
local compose_file="${COMPOSE_FILE:-deploy/trialrun/docker-compose.yml}"
local public_base_url="${LIVE_SMOKE_BASE_URL:-$PUBLIC_BASE_URL}"
ssh "$deploy_server" \
"REMOTE_DIR='${remote_dir}' REMOTE_ENV_FILE='${remote_env_file}' COMPOSE_FILE='${compose_file}' LIVE_SMOKE_BASE_URL='${public_base_url}' bash -s" <<'REMOTE'
set -euo pipefail
cd "$REMOTE_DIR"
if docker compose version >/dev/null 2>&1; then
compose_cmd=(docker compose)
else
compose_cmd=(docker-compose)
fi
"${compose_cmd[@]}" -f "$COMPOSE_FILE" --env-file "$REMOTE_ENV_FILE" exec -T server sh -lc \
"cd /app && LIVE_SMOKE_BASE_URL='$LIVE_SMOKE_BASE_URL' WAUTO1_EXECUTION_MODE=remote WAUTO1_REMOTE_CONTEXT=deployment-server bash scripts/qa/collect-wecom-controlled-trial-evidence.sh"
REMOTE
}
case "${1:-}" in
--remote)
run_remote
exit $?
;;
--help|-h)
usage
exit 0
;;
"")
;;
*)
printf '[wauto1][ERROR] unknown argument: %s\n' "$1" >&2
usage >&2
exit 2
;;
esac
if [[ "${WAUTO1_EXECUTION_MODE:-}" != "remote" || "${WAUTO1_REMOTE_CONTEXT:-}" != "deployment-server" ]]; then
printf '[wauto1][ERROR] Enterprise WeChat evidence must run on the deployment server trusted IP. Use --remote.\n' >&2
usage >&2
exit 2
fi
mkdir -p "$REPORT_DIR" mkdir -p "$REPORT_DIR"
: >"$SUMMARY_TXT" : >"$SUMMARY_TXT"
@@ -107,7 +163,7 @@ write_manual_checklist() {
- C:必须申请人手选审批人。 - C:必须申请人手选审批人。
- D:当前看不到或模板未配置。 - D:当前看不到或模板未配置。
小团队默认规则:公司不到 10 人,按一层直属主管或指定审批角色自动带出审批人;主管链缺失、审批人不可见/停用/未绑定或命中自审时,由管理员兜底或阻断。当前目标按 A 执行,B/C/D 均视为阻断 WEXT1-LIVE 和 WREAL1 的 finding。 小团队默认规则:公司不到 10 人,按一层直属主管或指定审批角色自动带出审批人;主管链缺失、审批人不可见/停用/未绑定或命中自审时,由管理员兜底或阻断。当前目标按 A 执行,B/C/D 均视为阻断 WEXT1-FORMAL 和 WREAL1 的 finding。
需要记录的字段:模板入口、适用范围、审批人规则、是否允许申请人手选、是否可能自审、主管链缺失时表现、审批人不可见或停用时表现。 需要记录的字段:模板入口、适用范围、审批人规则、是否允许申请人手选、是否可能自审、主管链缺失时表现、审批人不可见或停用时表现。
@@ -235,10 +291,10 @@ const manualGates = [
requiredEvidence: "请假、补卡、外出、加班逐模板均达到 A;小团队采用一层主管/指定审批角色 + 管理员兜底", requiredEvidence: "请假、补卡、外出、加班逐模板均达到 A;小团队采用一层主管/指定审批角色 + 管理员兜底",
}, },
{ {
id: "WEXT1-LIVE", id: "WEXT1-FORMAL",
status: "PENDING_USER_APPROVAL", status: "PENDING_USER_APPROVAL",
owner: "human_lead", owner: "human_lead",
requiredEvidence: "外出/加班 dry-run 可解释通过后,是否允许单次 live 创建 OA-POC 样件", requiredEvidence: "远端收口可解释通过后,是否允许 SMOKE002 人工提交正式模板外出/加班测试单,系统只读校验",
}, },
]; ];
@@ -286,15 +342,15 @@ const summary = {
findings, findings,
manualGates, manualGates,
nextQuestions: { nextQuestions: {
wext1Live: [ wext1Formal: [
"A:批准一次 live 创建外出+加班 OA-POC 样件,保留审计。", "A:批准 SMOKE002 在正式模板提交外出+加班低风险测试单,SMOKE101 先看详情再审批,系统只读校验并保留审计。",
"B:只保留 dry-run,不创建样件。", "B:只测请假/补卡/打卡,不提交外出/加班正式模板测试单。",
"C:外出/加班移出 V1。", "C:暂停,先检查企微正式模板配置。",
], ],
threeDayCloseout: [ threeDayCloseout: [
"A:接受 PASS_AUTO_EVIDENCE_READY,进入 WEXT1-LIVE live 问答。", "A:接受 PASS_AUTO_EVIDENCE_READY,进入 WEXT1-FORMAL 正式模板人工提交问答。",
"B:接受 PASS_WITH_FINDINGS,但先处理指定 finding。", "B:接受 PASS_WITH_FINDINGS,但先处理指定 finding。",
"C:暂停,不进入外出/加班 live 或真实试用。", "C:暂停,不进入外出/加班正式模板测试或真实试用。",
], ],
}, },
privacy: "status/count/report-path summaries only; no phone/email/token/Secret/EncodingAESKey/full userid/full template_id/full sp_no/form values/attachments/comments/raw payload/XML/ciphertext", privacy: "status/count/report-path summaries only; no phone/email/token/Secret/EncodingAESKey/full userid/full template_id/full sp_no/form values/attachments/comments/raw payload/XML/ciphertext",
+78 -15
查看文件
@@ -10,6 +10,63 @@ SUMMARY_TXT="$REPORT_DIR/summary.txt"
STATUS=0 STATUS=0
FINDING_COUNT=0 FINDING_COUNT=0
usage() {
cat <<'EOF'
Usage:
bash scripts/qa/run-three-day-full-goal-smoke.sh --remote
WFULLSMOKE includes Enterprise WeChat read checks, so business evidence must run
on the deployment server trusted IP. Local execution is intentionally blocked
and bash -n should be used for syntax/static checks.
EOF
}
run_remote() {
local deploy_server="${DEPLOY_SERVER:-deploy@118.89.77.218}"
local remote_dir="${REMOTE_DIR:-/opt/hyb-oa-trialrun}"
local remote_env_file="${REMOTE_ENV_FILE:-${remote_dir}/deploy/trialrun/.env}"
local compose_file="${COMPOSE_FILE:-deploy/trialrun/docker-compose.yml}"
local public_base_url="${LIVE_SMOKE_BASE_URL:-$PUBLIC_BASE_URL}"
local public_writes="${WFULLSMOKE_ALLOW_PUBLIC_WRITES:-1}"
ssh "$deploy_server" \
"REMOTE_DIR='${remote_dir}' REMOTE_ENV_FILE='${remote_env_file}' COMPOSE_FILE='${compose_file}' LIVE_SMOKE_BASE_URL='${public_base_url}' WFULLSMOKE_ALLOW_PUBLIC_WRITES='${public_writes}' bash -s" <<'REMOTE'
set -euo pipefail
cd "$REMOTE_DIR"
if docker compose version >/dev/null 2>&1; then
compose_cmd=(docker compose)
else
compose_cmd=(docker-compose)
fi
"${compose_cmd[@]}" -f "$COMPOSE_FILE" --env-file "$REMOTE_ENV_FILE" exec -T server sh -lc \
"cd /app && LIVE_SMOKE_BASE_URL='$LIVE_SMOKE_BASE_URL' WFULLSMOKE_EXECUTION_MODE=remote WFULLSMOKE_REMOTE_CONTEXT=deployment-server WFULLSMOKE_ALLOW_PUBLIC_WRITES='$WFULLSMOKE_ALLOW_PUBLIC_WRITES' bash scripts/qa/run-three-day-full-goal-smoke.sh"
REMOTE
}
case "${1:-}" in
--remote)
run_remote
exit $?
;;
--help|-h)
usage
exit 0
;;
"")
;;
*)
printf '[wfullsmoke1][ERROR] unknown argument: %s\n' "$1" >&2
usage >&2
exit 2
;;
esac
if [[ "${WFULLSMOKE_EXECUTION_MODE:-}" != "remote" || "${WFULLSMOKE_REMOTE_CONTEXT:-}" != "deployment-server" ]]; then
printf '[wfullsmoke1][ERROR] Enterprise WeChat checks must run on the deployment server trusted IP. Use --remote.\n' >&2
usage >&2
exit 2
fi
mkdir -p "$REPORT_DIR" mkdir -p "$REPORT_DIR"
: >"$SUMMARY_TXT" : >"$SUMMARY_TXT"
@@ -153,7 +210,7 @@ run_r7e_flow() {
LIVE_SMOKE_BASE_URL="$PUBLIC_BASE_URL" \ LIVE_SMOKE_BASE_URL="$PUBLIC_BASE_URL" \
QA_ISSUE_ID=WFULLSMOKE1 \ QA_ISSUE_ID=WFULLSMOKE1 \
TRIALRUN_ISSUE_ID=WFULLSMOKE1 \ TRIALRUN_ISSUE_ID=WFULLSMOKE1 \
TRIALRUN_MARKER_PREFIX="${WFULLSMOKE_MARKER_PREFIX:-WFULL}" \ TRIALRUN_MARKER_PREFIX="${WFULLSMOKE_MARKER_PREFIX:-TEST-SMOKE-WFULL}" \
TRIALRUN_REPORT_TITLE="WFULLSMOKE1 ${flow} 主路径报告" \ TRIALRUN_REPORT_TITLE="WFULLSMOKE1 ${flow} 主路径报告" \
TRIALRUN_REPORT_DIR="$flow_report" \ TRIALRUN_REPORT_DIR="$flow_report" \
TRIALRUN_SCREENSHOT_DIR="$flow_screens" \ TRIALRUN_SCREENSHOT_DIR="$flow_screens" \
@@ -173,9 +230,9 @@ run_procurement_contract_project_regression() {
MANAGER_PASSWORD="$LIVE_SMOKE_MANAGER_PASSWORD" \ MANAGER_PASSWORD="$LIVE_SMOKE_MANAGER_PASSWORD" \
FINANCE_MGR_IDENTIFIER="$LIVE_SMOKE_FINANCE_MGR_IDENTIFIER" \ FINANCE_MGR_IDENTIFIER="$LIVE_SMOKE_FINANCE_MGR_IDENTIFIER" \
FINANCE_MGR_PASSWORD="$LIVE_SMOKE_FINANCE_MGR_PASSWORD" \ FINANCE_MGR_PASSWORD="$LIVE_SMOKE_FINANCE_MGR_PASSWORD" \
PROCUREMENT_REGRESSION_MARKER_PREFIX="${WFULLSMOKE_MARKER_PREFIX:-WFULL}" \ PROCUREMENT_REGRESSION_MARKER_PREFIX="${WFULLSMOKE_MARKER_PREFIX:-TEST-SMOKE-WFULL}" \
PROCUREMENT_PO_NO="PO-${WFULLSMOKE_MARKER_PREFIX:-WFULL}-${marker}" \ PROCUREMENT_PO_NO="PO-${WFULLSMOKE_MARKER_PREFIX:-TEST-SMOKE-WFULL}-${marker}" \
PROCUREMENT_CONTRACT_NO="CT-${WFULLSMOKE_MARKER_PREFIX:-WFULL}-${marker}" \ PROCUREMENT_CONTRACT_NO="CT-${WFULLSMOKE_MARKER_PREFIX:-TEST-SMOKE-WFULL}-${marker}" \
bash "$ROOT_DIR/server/scripts/regression-procurement.sh" bash "$ROOT_DIR/server/scripts/regression-procurement.sh"
} }
@@ -199,6 +256,8 @@ run_wecom_and_archive_chain() {
run_finding_step "wauto1-evidence" env \ run_finding_step "wauto1-evidence" env \
WAUTO1_REPORT_DIR="$REPORT_DIR/wecom-controlled-trial-evidence" \ WAUTO1_REPORT_DIR="$REPORT_DIR/wecom-controlled-trial-evidence" \
WAUTO1_EXECUTION_MODE=remote \
WAUTO1_REMOTE_CONTEXT=deployment-server \
LIVE_SMOKE_BASE_URL="$PUBLIC_BASE_URL" \ LIVE_SMOKE_BASE_URL="$PUBLIC_BASE_URL" \
bash "$ROOT_DIR/scripts/qa/collect-wecom-controlled-trial-evidence.sh" bash "$ROOT_DIR/scripts/qa/collect-wecom-controlled-trial-evidence.sh"
} }
@@ -252,14 +311,14 @@ write_manual_checklist() {
## Day 3 ## Day 3
- HYD000006:确认三天业务结果和 OA 历史可读性。 - HYD000006:确认三天业务结果和 OA 历史可读性。
- 若 WAPPR1 为 A 且外出/加班 dry-run 通过,再问答是否进入 WEXT1-LIVE。 - 若 WAPPR1 为 A 且远端收口通过,再问答是否进入 WEXT1-FORMAL:由 SMOKE002 真机提交正式模板外出/加班测试单,系统只读校验。
边界:不要记录 Secret、token、EncodingAESKey、完整 userid、完整审批单号、完整 template_id、表单值、附件、评论或原始 payload。 边界:不要记录 Secret、token、EncodingAESKey、完整 userid、完整审批单号、完整 template_id、表单值、附件、评论或原始 payload。
EOF EOF
} }
run_privacy_smoke() { run_privacy_smoke() {
local sensitive_pattern='access_token=[A-Za-z0-9._-]{8,}|1[3-9][0-9]{9}|[[:alnum:]._%+-]+@[[:alnum:].-]+\.[[:alpha:]]{2,}|-----BEGIN|BEGIN [A-Z ]*KEY|"((token|secret|password|EncodingAESKey|encodingAESKey|sp_no|spNo|template_id|templateId|userid|userId|external_userid|externalUserId|external_user_id))"[[:space:]]*:[[:space:]]*"[^"*]{8,}"|\b20[0-9]{12,}\b|"(raw|rawPayload|raw_payload|payload|xml|ciphertext|Encrypt|formValue|formValues|attachments|comments)"[[:space:]]*:' local sensitive_pattern='(["'\''"]?(WECOM_[A-Z0-9_]*(SECRET|TOKEN)|[A-Z0-9_]*(TOKEN|SECRET|PASSWORD|ENCODING_AES_KEY|ENCODINGAESKEY|CORP_SECRET|ACCESS_TOKEN)[A-Z0-9_]*)["'\''"]?[[:space:]]*[:=][[:space:]]*["'\''"]?[A-Za-z0-9._:/+=-]{8,}["'\''"]?)|Authorization:[[:space:]]*Bearer[[:space:]]+[A-Za-z0-9._-]{8,}|access_token=[A-Za-z0-9._-]{8,}|1[3-9][0-9]{9}|[[:alnum:]._%+-]+@[[:alnum:].-]+\.[[:alpha:]]{2,}|-----BEGIN|BEGIN [A-Z ]*KEY|"((token|secret|password|EncodingAESKey|encodingAESKey|sp_no|spNo|template_id|templateId|userid|userId|external_userid|externalUserId|external_user_id))"[[:space:]]*:[[:space:]]*"[^"*]{8,}"|\b20[0-9]{12,}\b|"(raw|rawPayload|raw_payload|payload|xml|ciphertext|Encrypt|formValue|formValues|attachments|comments)"[[:space:]]*:'
local matches local matches
matches="$(grep -RInE "$sensitive_pattern" "$REPORT_DIR" | grep -vE 'HRWDTEST-[0-9]{14}' || true)" matches="$(grep -RInE "$sensitive_pattern" "$REPORT_DIR" | grep -vE 'HRWDTEST-[0-9]{14}' || true)"
if [[ -n "$matches" ]]; then if [[ -n "$matches" ]]; then
@@ -383,10 +442,10 @@ const manualGates = [
requiredEvidence: "四类模板均为 A:一层主管/指定审批角色自动带出,申请人不能任意选择;缺主管/不可用/自审时管理员兜底或阻断", requiredEvidence: "四类模板均为 A:一层主管/指定审批角色自动带出,申请人不能任意选择;缺主管/不可用/自审时管理员兜底或阻断",
}, },
{ {
id: "WEXT1-LIVE", id: "WEXT1-FORMAL",
status: "PENDING_USER_APPROVAL", status: "PENDING_USER_APPROVAL",
owner: "human_lead", owner: "human_lead",
requiredEvidence: "WAPPR1=A 且 WEXT1LD dry-run 通过后,是否允许 live 创建外出/加班样件", requiredEvidence: "WAPPR1=A 且 WREMOTE1/WFULLSMOKE2 可解释通过后,是否允许 SMOKE002 人工提交正式模板外出/加班测试单",
}, },
{ {
id: "WREAL1", id: "WREAL1",
@@ -412,6 +471,10 @@ const summary = {
conclusion: status, conclusion: status,
baseURL, baseURL,
commit, commit,
executionMode: process.env.WFULLSMOKE_EXECUTION_MODE || "unknown",
remoteContext: process.env.WFULLSMOKE_REMOTE_CONTEXT || "unknown",
runtimeHost: process.env.HOSTNAME || "unknown",
trustedIpBoundary: "Enterprise WeChat API checks must run on the deployment server; local runs are blocked by default",
checkedAt: new Date().toISOString(), checkedAt: new Date().toISOString(),
reportDir: path.resolve(reportDir), reportDir: path.resolve(reportDir),
accounts: { accounts: {
@@ -427,7 +490,7 @@ const summary = {
}, },
boundaries: { boundaries: {
oaTestDataAllowed: true, oaTestDataAllowed: true,
testMarkerRequired: "TEST/SMOKE/WFULL", testMarkerRequired: "TEST-SMOKE-WFULL",
noRealPayment: true, noRealPayment: true,
noErpWrite: true, noErpWrite: true,
noBankStatementImport: true, noBankStatementImport: true,
@@ -446,15 +509,15 @@ const summary = {
"C:必须申请人手选审批人。", "C:必须申请人手选审批人。",
"D:当前看不到或模板未配置。", "D:当前看不到或模板未配置。",
], ],
wext1Live: [ wext1Formal: [
"A:批准一次 live 创建外出+加班 OA-POC 样件,保留审计。", "A:批准 SMOKE002 在正式模板提交外出+加班低风险测试单,SMOKE101 先看详情再审批,系统只读校验并保留审计。",
"B:只保留 dry-run,不创建样件。", "B:只测请假/补卡/打卡,不提交外出/加班正式模板测试单。",
"C:外出/加班移出 V1。", "C:暂停,先检查企微正式模板配置。",
], ],
finalCloseout: [ finalCloseout: [
"A:接受主路径闭环通过,进入外出/加班 live 或 WREAL1 准备。", "A:接受主路径闭环通过,进入 WEXT1-FORMAL 或 WREAL1 准备问答。",
"B:接受 PASS_WITH_FINDINGS,但先处理指定 finding。", "B:接受 PASS_WITH_FINDINGS,但先处理指定 finding。",
"C:暂停,不进入 live、真实员工试用或镜像。", "C:暂停,不进入正式模板外出/加班测试、真实员工试用或镜像。",
], ],
}, },
privacy: "status/count/report-path summaries only; no phone/email/token/Secret/EncodingAESKey/full userid/full template_id/full sp_no/form values/attachments/comments/raw payload/XML/ciphertext", privacy: "status/count/report-path summaries only; no phone/email/token/Secret/EncodingAESKey/full userid/full template_id/full sp_no/form values/attachments/comments/raw payload/XML/ciphertext",
@@ -13,11 +13,10 @@ usage() {
cat <<'EOF' cat <<'EOF'
Usage: Usage:
bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote
WTCLOSE2_EXECUTION_MODE=remote bash scripts/qa/run-wecom-test-account-final-closeout.sh
WTCLOSE2 must run on the deployment server because Enterprise WeChat API access is WTCLOSE2 must run on the deployment server because Enterprise WeChat API access is
restricted by trusted IP. Local execution is intentionally blocked unless restricted by trusted IP. Local execution is intentionally blocked; use bash -n
WTCLOSE2_ALLOW_LOCAL_RUN=1 is set for script development only. for syntax/static checks.
EOF EOF
} }
@@ -38,7 +37,7 @@ else
compose_cmd=(docker-compose) compose_cmd=(docker-compose)
fi fi
"${compose_cmd[@]}" -f "$COMPOSE_FILE" --env-file "$REMOTE_ENV_FILE" exec -T server sh -lc \ "${compose_cmd[@]}" -f "$COMPOSE_FILE" --env-file "$REMOTE_ENV_FILE" exec -T server sh -lc \
"cd /app && LIVE_SMOKE_BASE_URL='$LIVE_SMOKE_BASE_URL' WTCLOSE2_EXECUTION_MODE=remote bash scripts/qa/run-wecom-test-account-final-closeout.sh" "cd /app && LIVE_SMOKE_BASE_URL='$LIVE_SMOKE_BASE_URL' WTCLOSE2_EXECUTION_MODE=remote WTCLOSE2_REMOTE_CONTEXT=deployment-server bash scripts/qa/run-wecom-test-account-final-closeout.sh"
REMOTE REMOTE
} }
@@ -60,7 +59,7 @@ case "${1:-}" in
;; ;;
esac esac
if [[ "${WTCLOSE2_EXECUTION_MODE:-}" != "remote" && "${WTCLOSE2_ALLOW_LOCAL_RUN:-0}" != "1" ]]; then if [[ "${WTCLOSE2_EXECUTION_MODE:-}" != "remote" || "${WTCLOSE2_REMOTE_CONTEXT:-}" != "deployment-server" ]]; then
printf '[wtclose2][ERROR] Enterprise WeChat API checks must run on the deployment server trusted IP. Use --remote.\n' >&2 printf '[wtclose2][ERROR] Enterprise WeChat API checks must run on the deployment server trusted IP. Use --remote.\n' >&2
usage >&2 usage >&2
exit 2 exit 2
@@ -175,6 +174,8 @@ NODE
run_wauto1() { run_wauto1() {
run_finding_step "wauto1-evidence" env \ run_finding_step "wauto1-evidence" env \
WAUTO1_REPORT_DIR="$REPORT_DIR/wecom-controlled-trial-evidence" \ WAUTO1_REPORT_DIR="$REPORT_DIR/wecom-controlled-trial-evidence" \
WAUTO1_EXECUTION_MODE=remote \
WAUTO1_REMOTE_CONTEXT=deployment-server \
LIVE_SMOKE_BASE_URL="$PUBLIC_BASE_URL" \ LIVE_SMOKE_BASE_URL="$PUBLIC_BASE_URL" \
bash "$ROOT_DIR/scripts/qa/collect-wecom-controlled-trial-evidence.sh" bash "$ROOT_DIR/scripts/qa/collect-wecom-controlled-trial-evidence.sh"
} }
@@ -182,6 +183,8 @@ run_wauto1() {
run_wfullsmoke1() { run_wfullsmoke1() {
run_finding_step "wfullsmoke1-no-public-writes" env \ run_finding_step "wfullsmoke1-no-public-writes" env \
WFULLSMOKE_REPORT_DIR="$REPORT_DIR/three-day-full-goal-smoke" \ WFULLSMOKE_REPORT_DIR="$REPORT_DIR/three-day-full-goal-smoke" \
WFULLSMOKE_EXECUTION_MODE=remote \
WFULLSMOKE_REMOTE_CONTEXT=deployment-server \
WFULLSMOKE_ALLOW_PUBLIC_WRITES=0 \ WFULLSMOKE_ALLOW_PUBLIC_WRITES=0 \
LIVE_SMOKE_BASE_URL="$PUBLIC_BASE_URL" \ LIVE_SMOKE_BASE_URL="$PUBLIC_BASE_URL" \
bash "$ROOT_DIR/scripts/qa/run-three-day-full-goal-smoke.sh" bash "$ROOT_DIR/scripts/qa/run-three-day-full-goal-smoke.sh"
@@ -312,9 +315,9 @@ const manualGates = [
evidence: "三天打卡、请假/补卡、详情后审批和 OA 历史查看需随最终验收确认", evidence: "三天打卡、请假/补卡、详情后审批和 OA 历史查看需随最终验收确认",
}, },
{ {
id: "WEXT1-LIVE", id: "WEXT1-FORMAL",
status: "PENDING_USER_APPROVAL", status: "PENDING_USER_APPROVAL",
evidence: "外出/加班 dry-run 通过后仍需单独问答批准 live 写入", evidence: "远端收口可解释通过后仍需单独问答批准 SMOKE002 人工提交正式模板外出/加班测试单;系统只读校验",
}, },
{ {
id: "WREAL1", id: "WREAL1",
@@ -368,14 +371,14 @@ const summary = {
}, },
nextQuestions: { nextQuestions: {
closeout: [ closeout: [
"A:接受测试号收口,进入 WEXT1-LIVE 问答。", "A:接受测试号收口,进入 WEXT1-FORMAL 正式模板人工提交问答。",
"B:接受 PASS_WITH_FINDINGS,但先处理指定 finding。", "B:接受 PASS_WITH_FINDINGS,但先处理指定 finding。",
"C:暂停,不进入 live 或真实试用。", "C:暂停,不进入正式模板外出/加班测试或真实试用。",
], ],
wext1Live: [ wext1Formal: [
"A:批准一次 live 创建外出+加班 OA-POC 样件,保留审计。", "A:批准 SMOKE002 在正式模板提交外出+加班低风险测试单,SMOKE101 先看详情再审批,系统只读校验并保留审计。",
"B:只保留 dry-run,不创建样件。", "B:只测请假/补卡/打卡,不提交外出/加班正式模板测试单。",
"C:外出/加班移出 V1。", "C:暂停,先检查企微正式模板配置。",
], ],
wreal1: [ wreal1: [
"A:1 名真实员工 + 1 名审批人/管理员观察。", "A:1 名真实员工 + 1 名审批人/管理员观察。",