WTCLOSE2 收口测试号最终证据

这个提交包含在:
2026-05-22 11:05:52 +08:00
父节点 b2414dc0c4
当前提交 592cf6524c
共修改 9 个文件,包含 431 行新增和 39 行删除
文件差异因一行或多行过长而隐藏
+13
查看文件
@@ -545,6 +545,19 @@ Go 结论边界:
| 人工门禁关系 | 不替代 WAPPR1 | `--manual-gate=<template>:A/B/C/D` 只登记管理员后台和真机提交页结论;缺门禁时输出 `PAUSED_MANUAL_CONFIRMATION`。WRULE1 只能证明已提交审批链是否匹配 OA 理论规则,不能证明申请页是否允许改审批人。 |
| 隐私边界 | 已固化 | 报告只输出脱敏 `sp_no`、template、employee 前缀、计数和 finding 类型;不输出完整 userid、完整 template_id、完整审批单号、手机号、邮箱、token、Secret、表单值、附件、评论或原始 payload。 |
## WTCLOSE2 测试号最终收口与证据复核
执行时间:2026-05-22 建档。本轮承接 2026-05-21 WAPPR1 四类模板均为 A 的人工门禁结论,自动复跑测试号最终收口证据;不写企业微信、不创建外出/加班模板或审批单、不启用真实员工。
| 项目 | 状态 | 证据与边界 |
| --- | --- | --- |
| 执行合同 | 已建档 | 新增 `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 既有报告索引。 |
| 写入边界 | 已固定 | 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。 |
| 结论分类 | 已固定 | `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 名审批人/管理员观察,且需另行问答。 |
## 历史恢复
需要追溯 R70-R91 的详细流水时,使用:
+16 -14
查看文件
@@ -2,14 +2,15 @@
**文档状态**:当前开发路线图事实源。
**分类**:开发治理 / 路线图。
**适用时间**: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 / WREAL1-PREP / WEXT1-LIVE 路线选择之后。
**关联 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,WREAL1P`。
**最近审计**:2026-05-21。
**适用时间**: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 / WREAL1-PREP / WEXT1-LIVE 路线选择之后。
**关联 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,WREAL1P`。
**最近审计**: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 已完成。
**WROUTE2 补充口径**:WFULLSMOKE1 之后先锁定测试号全域收口,再进入 WEXT1-LIVE 问答;WREAL1 首批固定为 1 名真实员工 + 1 名审批人/管理员观察;WREAL1 通过后优先规划 `wecom_attendance_approval_mirror_v1` 最小完整镜像,应急接管、恢复回写和 RuleOps 后置。
**WTCLOSE1 执行口径**:公司不到 10 人,WAPPR1 四类模板目标按 A 执行;正式 HR/考勤审批采用一层直属主管或指定审批角色自动带出审批人,主管链缺失、审批人不可见/停用/未绑定或命中自审时由管理员兜底或阻断。本轮自动执行到 WAUTO1/WFULLSMOKE1 汇总和 WEXT1-LIVE 前 dry-run,不授权任何企微写入。
**WAPPR1 2026-05-21 人工门禁结论**:测试员工直属上级已设置为测试主管;用户真机确认请假、补卡、外出、加班提交页均自动带出测试主管,且申请人不能删除、改人或新增审批人,四类模板均为 A。该结论只放行规则门禁,不等于批准外出/加班 live 写入或真实员工试用;后续仍需 WRULE1 实际审批链校验和 WEXT1-LIVE/WREAL1 问答。
**WRULE1 执行口径**:采用“单一组织规则,两个执行域”。OA 维护员工、直属主管、业务角色和管理员兜底事实;企业微信只执行 HR/考勤审批;OA 通过 `check:wecom-approval-rule-validator` 读取已归档企微审批详情,计算理论审批人并对比实际审批链。WRULE1 是只读校验器,不新增 HR/考勤审批引擎,不写企微,不替代 WAPPR1 的后台人工确认和真机提交页确认。
**WTCLOSE2 执行口径**:新增 `scripts/qa/run-wecom-test-account-final-closeout.sh` 汇总测试号最终证据,复跑 WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1。WFULLSMOKE1 在 WTCLOSE2 中以 `WFULLSMOKE_ALLOW_PUBLIC_WRITES=0` 运行,不新增 OA 测试业务数据;脚本不写企业微信、不创建外出/加班样件、不启用真实员工。WTCLOSE2 结论只进入 WEXT1-LIVE 问答,不自动执行 live。
## 1. 路线图原则
@@ -19,13 +20,13 @@
- WEGOV1 后固定四域边界:企微主办域为打卡、请假、补卡、外出、加班、假期余额和人事助手;OA 主办域为报销、采购、合同、项目、付款、发票、银行回单、高敏附件和经营审计;OA 留存域保存企微关键历史和完整外部关联键;OA 应急域只在企微不可用时由管理员人工开启。
- OA 不重造企业微信完整打卡、考勤和 HR 产品;V1 目标是企微不可用时可以查看已保存历史,不是完整替代企微继续办理。
- WROAD2 后“可受控使用”和“完整镜像增强”分离:请假/补卡已归档历史可在 OA 查询,先用测试账号做 3 天每日脚本化巡检;完整镜像、应急接管、恢复回写和 RuleOps 继续后置。
- 外出/加班不作为当前受控上线阻断;`WEXT1` dry-run 已完成,live 创建必须在 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WAUTO1、WEXT1LD 和 WFULLSMOKE1 结论可接受后另建 `WEXT1-LIVE` 合同并再次人工确认。
- 外出/加班不作为当前受控上线阻断;`WEXT1` dry-run 已完成,live 创建必须在 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WRULE1、WAUTO1、WEXT1LD、WFULLSMOKE1 和 WTCLOSE2 结论可接受后另建 `WEXT1-LIVE` 合同并再次人工确认。
- WOPS1 后巡检告警采用“状态记忆 + 新增异常”策略:既有 `PASS_WITH_FINDINGS` observation 进入基线后不重复发企微消息;只有 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`、脚本失败、新增 finding、状态恶化或人工 `--force` 才发送脱敏告警。
- 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`;通过后仍只进入人工问答。
- WFULLSMOKE1 把三天目标从“企微受控巡检”扩展为全域主路径闭环:企微 HR/考勤、OA 报销、采购、合同/项目、付款批次、移动端和运维巡检一起汇总;只允许 `TEST/SMOKE/WFULL` 标记的 OA 测试业务数据,不写企业微信、不真实付款、不写 ERP、不导入银行流水。
- WROUTE2 后锁定“测试号全域收口 -> 外出/加班测试号 live POC -> 真实小试用 -> 最小完整镜像”:当前不启用真实员工;WREAL1 首批固定为 1 名真实员工 + 1 名审批人/管理员观察;WREAL1 通过后优先规划 `wecom_attendance_approval_mirror_v1` 最小完整镜像,不先做应急接管、恢复回写或 RuleOps。
- WTCLOSE1 后小团队审批规则按一层主管/指定审批角色 + 管理员兜底执行;2026-05-21 用户已真机确认请假、补卡、外出、加班四类模板均达到 A;若后续模板回退为 B/C/D,立即暂停 WEXT1-LIVE 或 WREAL1。
- WTCLOSE1/WTCLOSE2 后小团队审批规则按一层主管/指定审批角色 + 管理员兜底执行;2026-05-21 用户已真机确认请假、补卡、外出、加班四类模板均达到 A;若后续模板回退为 B/C/D,立即暂停 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-LIVE、WREAL1 和最小完整镜像。
- 企业微信自建应用不按完整隔离 sandbox 处理;后续默认使用真实企业内受控测试域、本地 synthetic 自动测试、公网 live runner 和少量真机确认。
- 阶段未满足退出条件前不得跳阶段。线上缺陷、安全风险、正式使用阻断或真实反馈可以另开独立 Issue CSV,但不得混入企微 HR/考勤主路线。
@@ -65,7 +66,7 @@
| `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,不写企业微信、不创建模板或审批单。 |
| `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、WAUTO1/WEXT1LD 和 WFULLSMOKE1 可解释通过后另起 `WEXT1-LIVE` 合同。 |
| `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` 合同。 |
| `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-BIZ1` | 三天人工业务冒烟已建档 | 三天内并行补充测试账号业务动作:`SMOKE002` 每天按规则尝试企微打卡,提交低风险请假/补卡;`SMOKE101` 先看详情再审批;`HYD000006` 每天查看 OA 归档历史和打卡摘要。人工业务冒烟不替代 WARCH3 自动巡检,不写企业微信,不启用真实员工。 |
@@ -105,12 +106,13 @@
| 24 | `WEXT1LD 外出/加班 live 前 dry-run gate` | 在 live 创建前远端只执行外出/加班 dry-run。 | WEXT1 dry-run runner 已存在;用户要求 live 前先自动 dry-run。 | 不带 live 写入参数;通过后只进入问答,不自动创建模板或审批单。 |
| 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 名审批人/管理员观察。 |
| 27 | `WEXT1-LIVE 外出/加班测试号 live POC` | 单次创建外出+加班 OA-POC 模板和低风险测试审批单,并做真机可读性和审批规则确认。 | WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1/WRULE1/WAUTO1/WEXT1LD/WFULLSMOKE1 可解释通过;新建独立 Issue CSV;再次说明会留下的企微记录并取得人工确认。 | 两类样件保留审计;固定 `SMOKE002 -> SMOKE101`、`WECOM_AGENT_SECRET` 和双开关;只保存脱敏 template/`sp_no`/userid 前缀;`SMOKE101` 真机确认消息、列表、详情、按钮风险和审批人是否自动带出。 |
| 28 | `WREAL1 小范围真实试用` | 在 1 名真实员工 + 1 名审批人/管理员观察范围验证企微主办 HR/考勤和 OA 留存。 | 请假、补卡、外出、加班四类测试号证据通过;WAPPR1/WRULE1 规则门禁通过;WFULLSMOKE1 可解释通过;用户通过问答确认真实员工、审批人、试用周期、暂停条件和回滚联系人。 | 试用报告可解释通过或暂停;仍不直接全员推广。 |
| 29 | `wecom_attendance_approval_mirror_v1 最小完整镜像` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA。 | WREAL1 通过后优先规划;不得仅凭测试号证据进入,也不先做应急接管、恢复回写或 RuleOps。 | OA 可查询企微 HR/考勤镜像、附件摘要、审批历史、考勤解释和审计;不把 OA 主办高敏审批迁到企微。 |
| 30 | `oa_hr_emergency_mode_v1` | 企业微信不可用时,由管理员人工开启 OA HR/考勤应急接管。 | 自建历史留存和镜像数据可支撑对账;OA 应急入口、权限和审计方案明确。 | 管理员可填写原因、范围、预计结束时间和责任人后开启/关闭;应急单据带 `EMERGENCY` 标记。 |
| 31 | `wecom_recovery_writeback_v1` | 企微恢复后,OA 应急数据先 dry-run,再回写企微。 | 应急接管模式完成;企微写回接口、冲突规则和回滚策略已单独批准。 | 系统生成成功、失败、跳过和冲突清单;无冲突项可自动回写,冲突进入人工确认。 |
| 32 | `wecom_ruleops_v1` | AI 草拟企微规则、生成差异报告和 dry-run,人工确认后写入企微。 | 前述同步/回写链路稳定;企微规则 API 能力和权限已验证。 | 每次写入保存前后快照、确认人、API `errcode`、失败原因、回滚建议和审计记录。 |
| 27 | `WTCLOSE2 测试号最终收口与证据复核` | 自动复跑测试号收口证据,确认是否可以进入 WEXT1-LIVE 问答。 | WAPPR1 四类模板均为 A;WRULE1 已实现;WAUTO1/WEXT1LD/WFULLSMOKE1 已存在。 | 输出 `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` 真机确认消息、列表、详情、按钮风险和审批人是否自动带出。 |
| 29 | `WREAL1 小范围真实试用` | 在 1 名真实员工 + 1 名审批人/管理员观察范围验证企微主办 HR/考勤和 OA 留存。 | 请假、补卡、外出、加班四类测试号证据通过;WAPPR1/WRULE1 规则门禁通过;WTCLOSE2 和 WEXT1-LIVE 可解释通过;用户通过问答确认真实员工、审批人、试用周期、暂停条件和回滚联系人。 | 试用报告可解释通过或暂停;仍不直接全员推广。 |
| 30 | `wecom_attendance_approval_mirror_v1 最小完整镜像` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA。 | WREAL1 通过后优先规划;不得仅凭测试号证据进入,也不先做应急接管、恢复回写或 RuleOps。 | OA 可查询企微 HR/考勤镜像、附件摘要、审批历史、考勤解释和审计;不把 OA 主办高敏审批迁到企微。 |
| 31 | `oa_hr_emergency_mode_v1` | 企业微信不可用时,由管理员人工开启 OA HR/考勤应急接管。 | 自建历史留存和镜像数据可支撑对账;OA 应急入口、权限和审计方案明确。 | 管理员可填写原因、范围、预计结束时间和责任人后开启/关闭;应急单据带 `EMERGENCY` 标记。 |
| 32 | `wecom_recovery_writeback_v1` | 企微恢复后,OA 应急数据先 dry-run,再回写企微。 | 应急接管模式完成;企微写回接口、冲突规则和回滚策略已单独批准。 | 系统生成成功、失败、跳过和冲突清单;无冲突项可自动回写,冲突进入人工确认。 |
| 33 | `wecom_ruleops_v1` | AI 草拟企微规则、生成差异报告和 dry-run,人工确认后写入企微。 | 前述同步/回写链路稳定;企微规则 API 能力和权限已验证。 | 每次写入保存前后快照、确认人、API `errcode`、失败原因、回滚建议和审计记录。 |
## 4. 每阶段固定门禁
@@ -282,9 +284,9 @@ WAPC2 通过后,下一步不是直接进入 `wecom_attendance_approval_mirror_
9. `WARCH2 正式只读历史查询`:已提供 OA DB 只读 API 和 PC/移动历史页。
10. `WROAD2+OPS 受控上线与每日巡检`:先做测试账号 3 天脚本化巡检,沉淀 Day 0/Day 1/Day 2/Day 3 脱敏报告。
11. `WARCH3 / WCHECK1 / WEXT1 / WOPS1`:已补归档稳定化自动巡检、打卡摘要留存、外出/加班 dry-run 和告警降噪。
12. `WROAD2-CLOSEOUT / WROAD2-BIZ1 / WAPPR1 / WAUTO1 / WEXT1LD / WFULLSMOKE1 / WEXT1-LIVE / WREAL1`:三天验收期间并行完成人工业务冒烟、审批规则规范化、自动证据汇总和全域最终目标主路径测试;先完成外出/加班 live 前 dry-run,再问答进入外出/加班测试号 live POC;请假、补卡、外出、加班四类测试号证据和审批规则门禁通过后,再问真实小范围试用。
12. `WROAD2-CLOSEOUT / WROAD2-BIZ1 / WAPPR1 / WRULE1 / WAUTO1 / WEXT1LD / WFULLSMOKE1 / WTCLOSE2 / WEXT1-LIVE / WREAL1`:三天验收期间并行完成人工业务冒烟、审批规则规范化、审批链校验、自动证据汇总和全域最终目标主路径测试;先完成外出/加班 live 前 dry-run 和测试号最终收口,再问答进入外出/加班测试号 live POC;请假、补卡、外出、加班四类测试号证据和审批规则门禁通过后,再问真实小范围试用。
WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WAUTO1/WEXT1LD、WFULLSMOKE1、WEXT1-LIVE、四类测试号证据和 WREAL1 通过或明确批准前,不拆 `wecom_attendance_approval_mirror_v1`。
WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WRULE1、WAUTO1/WEXT1LD、WFULLSMOKE1、WTCLOSE2、WEXT1-LIVE、四类测试号证据和 WREAL1 通过或明确批准前,不拆 `wecom_attendance_approval_mirror_v1`。
## 13. WADM1 自建留存/镜像数据模型设计
+10 -9
查看文件
@@ -104,6 +104,7 @@
| `WFULLSMOKE1` | `issues/2026-05-20_19-01-12-three-day-full-goal-smoke-v1.csv` | `CURRENT` | 三天全域最终目标测试总控合同已建立:新增 `scripts/qa/run-three-day-full-goal-smoke.sh` 聚合企微 HR/考勤、OA 报销、采购、合同/项目、付款批次、移动/企微入口和运维巡检;允许带 `TEST/SMOKE/WFULL` 标记的 OA 测试业务数据,不写企业微信、不创建外出/加班样件、不启用真实员工、不真实付款、不接真实支付、不写 ERP、不导入银行流水 |
| `WROUTE2` | `issues/2026-05-20_20-15-29-wecom-test-account-closeout-to-minimal-mirror-route-v1.csv` | `CURRENT` | 测试号收口到最小完整镜像路线锁定合同已建立:当前先收口 WROAD2/WROAD2-BIZ1/WAPPR1/WAUTO1/WEXT1LD/WFULLSMOKE1,不提前启用真实员工;WAPPR1 四类模板必须达到 A 才能进入 WEXT1-LIVE 或 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` | `CURRENT` | 小团队自动审批规则与测试号全域收口 dry-run 合同:公司不到 10 人,WAPPR1 四类模板目标均为 A;正式 HR/考勤审批采用一层直属主管或指定审批角色自动带出审批人,主管链缺失、审批人不可见/停用/未绑定或自审时管理员兜底或阻断;本轮自动执行 WAUTO1/WFULLSMOKE1 汇总和外出/加班 live 前 dry-run,不写企业微信、不启用真实员工 |
| `WTCLOSE2` | `issues/2026-05-22_10-21-12-wecom-test-account-final-closeout-v1.csv` | `CURRENT` | 测试号最终收口与证据复核合同:WAPPR1 四类模板均为 A 后,自动复跑 `/ready`、WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1;不写企业微信、不创建模板或审批单、不启用真实员工,只进入 WEXT1-LIVE 问答 |
| `WREAL1-PREP` | `issues/2026-05-20_14-35-42-wecom-real-trial-prep-v1.csv` | `CURRENT` | 真实小范围试用准备合同:只固化候选员工、非自审审批人、回滚联系人、允许流程、暂停条件和验收标准;当前不启用真实员工,真实试用必须等请假/补卡/外出/加班四类测试号证据、WAPPR1 审批规则门禁和 WFULLSMOKE1 全域主路径可解释通过后再问 |
旧 Issue CSV 保留为历史审计证据:不删除、不批量回写、不移动到 `docs/archive/` 或其他归档目录。新连续合同如替代旧合同,只在新合同 `Notes` 或文档索引中说明 supersedes。
@@ -112,28 +113,28 @@
| Doc_ID | Path | Category | Authority | Status | Owner | Related_Issues | Evidence | Supersedes | Last_Audited | Audit_Method | Risk | Notes |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `IDX` | `docs/文档索引.md` | 入口索引 | 最高文档入口 | `CURRENT` | product/dev | `GOV8,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,WFOC,DBWFOC,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WRULE1,WAUTO1,WEXT1LD,WFULLSMOKE1,WREAL1P` | `rg` | none | 2026-05-20 | `node scripts/qa/audit-docs.mjs --check-registry` | medium | 判断当前该读什么;WAUTO1/WEXT1LD/WFULLSMOKE1 后优先读取企微主办 + OA 自建留存路线、三天业务冒烟、审批规则规范化、审批链校验器、自动证据汇总、全域最终目标测试、受控上线巡检、告警降噪、打卡摘要、外出/加班 dry-run、WEXT1-LIVE 前置和真实试用准备 |
| `REG` | `docs/文档事实源状态矩阵.md` | 文档台账 | 文档分类和状态事实源 | `CURRENT` | product/dev | `GOV8,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,WFOC,DBWFOC,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WAUTO1,WEXT1LD,WFULLSMOKE1,WREAL1P` | `audit-docs` | none | 2026-05-20 | `audit-docs --check-registry` | medium | 判断文档权威性;登记当前受控上线、三天业务冒烟、审批规则规范化、自动证据汇总、全域最终目标测试、自动巡检、告警降噪、打卡摘要留存、外出/加班 dry-run、WEXT1-LIVE 前置和真实试用准备事实 |
| `IDX` | `docs/文档索引.md` | 入口索引 | 最高文档入口 | `CURRENT` | product/dev | `GOV8,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,WFOC,DBWFOC,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WRULE1,WAUTO1,WEXT1LD,WFULLSMOKE1,WTCLOSE2,WREAL1P` | `rg` | none | 2026-05-22 | `node scripts/qa/audit-docs.mjs --check-registry` | medium | 判断当前该读什么;WAUTO1/WEXT1LD/WFULLSMOKE1/WTCLOSE2 后优先读取企微主办 + OA 自建留存路线、三天业务冒烟、审批规则规范化、审批链校验器、自动证据汇总、全域最终目标测试、测试号最终收口、受控上线巡检、告警降噪、打卡摘要、外出/加班 dry-run、WEXT1-LIVE 前置和真实试用准备 |
| `REG` | `docs/文档事实源状态矩阵.md` | 文档台账 | 文档分类和状态事实源 | `CURRENT` | product/dev | `GOV8,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,WFOC,DBWFOC,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WRULE1,WAUTO1,WEXT1LD,WFULLSMOKE1,WTCLOSE2,WREAL1P` | `audit-docs` | none | 2026-05-22 | `audit-docs --check-registry` | medium | 判断文档权威性;登记当前受控上线、三天业务冒烟、审批规则规范化、审批链校验、自动证据汇总、全域最终目标测试、测试号最终收口、自动巡检、告警降噪、打卡摘要留存、外出/加班 dry-run、WEXT1-LIVE 前置和真实试用准备事实 |
| `PRD-MVP` | `docs/海音达OA-MVP需求规格说明书.md` | 需求事实源 | PRD 主事实源 | `CURRENT` | product | `REQ8,P2T,GOV8,HR-WECOM-DIRECTORY-V1,WFOC,DBWFOC,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WAPC1,WAPC2,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1` | Issue CSV | `docs/requirements-specification.md` | 2026-05-20 | `rg` | high | WARCH3/WCHECK1/WEXT1/WOPS1 后定义 HR/考勤企微主办、OA 自建留存、受控测试域、只读历史查询、自动巡检、打卡摘要、外出/加班 dry-run、WEXT1-LIVE、WREAL1 前置和深度镜像边界;ERP 未来不接入 OA |
| `PRODUCT-SCOPE` | `docs/产品口径.md` | 需求事实源 | 产品边界事实源 | `CURRENT` | product | `REQ8,P2T,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WAPC1,WAPC2FLIVE,WCBK1,WEGOV1` | `rg` | none | 2026-05-19 | `rg` | high | 记录已拍板产品边界、企微/OA 设计门禁、开发路线图、WCBK1 真实回调事件证据、WEGOV1 混合主办边界和 OA 自建留存策略 |
| `DESIGN-UI` | `docs/产品设计规则.md` | 设计事实源 | PC/移动/企业微信设计事实源 | `CURRENT` | design/frontend | `MIA7,MIF7,GOV8,DG8,DG9,WFDG` | Playwright/视觉审查/DG8/DG9/WFDG | none | 2026-05-18 | `rg` | high | 页面改动必须读取;DG8 后飞书为主 UI/布局参考;DG9 后按页面分层和样板选型;WFDG 后区分 OA 主办、企微镜像和 OA 应急接管 |
| `ROADMAP-WECOM` | `docs/企微优先开发路线图.md` | 开发治理 | 企微优先开发路线图事实源 | `CURRENT` | product/dev | `WDRG,WCP1,WCPC,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,WREAL1P` | Issue CSV | none | 2026-05-20 | `rg` | high | WAUTO1/WEXT1LD/WFULLSMOKE1/WTCLOSE1 后固定最小审批历史留存、正式只读历史查询、受控上线自动巡检、三天业务冒烟、审批规则规范化、自动证据汇总、全域最终目标测试、小团队一层审批 + 管理员兜底、告警降噪、打卡摘要、外出/加班 dry-run、live 前 dry-run gate、WEXT1-LIVE 前置和真实试用准备;仍禁止直接进入深度镜像 |
| `WECOM-API-CATALOG` | `docs/企微API能力目录.md` | 集成事实源 | 企微 API 能力目录和 Secret 矩阵事实源 | `CURRENT` | product/backend/qa | `WAPI,WRRA,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WADM1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WAPPR1,WTCLOSE1,WRULE1` | 官方企业微信开发者中心链接/Issue CSV | none | 2026-05-20 | `rg` | high | 企微开发先读;只保存摘要、链接和项目决策,不保存 Secret、token、完整 userid、手机号、邮箱或原始 payload;记录审批补偿、打卡摘要、巡检只写 OA 留存、不写企业微信、企微原生审批规则不可只读 API 化、需人工门禁,以及 WRULE1 只读审批链校验边界 |
| `ROADMAP-WECOM` | `docs/企微优先开发路线图.md` | 开发治理 | 企微优先开发路线图事实源 | `CURRENT` | product/dev | `WDRG,WCP1,WCPC,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,WRULE1,WAUTO1,WEXT1LD,WFULLSMOKE1,WROUTE2,WTCLOSE1,WTCLOSE2,WREAL1P` | Issue CSV | none | 2026-05-22 | `rg` | high | WAUTO1/WEXT1LD/WFULLSMOKE1/WTCLOSE1/WTCLOSE2 后固定最小审批历史留存、正式只读历史查询、受控上线自动巡检、三天业务冒烟、审批规则规范化、审批链校验、自动证据汇总、全域最终目标测试、小团队一层审批 + 管理员兜底、测试号最终收口、告警降噪、打卡摘要、外出/加班 dry-run、live 前 dry-run gate、WEXT1-LIVE 前置和真实试用准备;仍禁止直接进入深度镜像 |
| `WECOM-API-CATALOG` | `docs/企微API能力目录.md` | 集成事实源 | 企微 API 能力目录和 Secret 矩阵事实源 | `CURRENT` | product/backend/qa | `WAPI,WRRA,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WADM1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WAPPR1,WTCLOSE1,WRULE1,WTCLOSE2` | 官方企业微信开发者中心链接/Issue CSV | none | 2026-05-22 | `rg` | high | 企微开发先读;只保存摘要、链接和项目决策,不保存 Secret、token、完整 userid、手机号、邮箱或原始 payload;记录审批补偿、打卡摘要、巡检只写 OA 留存、不写企业微信、企微原生审批规则不可只读 API 化、需人工门禁,以及 WRULE1/WTCLOSE2 只读审批链校验和最终收口边界 |
| `DELIVERY` | `docs/开发交付与变更管理规约.md` | 开发治理 | 开发交付事实源 | `CURRENT` | dev/qa | `GOV8,WDRG,WRRA,WAPC1,WPROC1,WPROC2,WCBK1,WEGOV1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WAUTO1,WEXT1LD,WFULLSMOKE1` | `rg` | none | 2026-05-20 | `rg` | high | Issue、review、commit、交付规则;WFULLSMOKE1 后固定 WAUTO1、WEXT1LD、全域最终目标测试和 WEXT1-LIVE/WREAL1 前置门禁 |
| `QA-GATE` | `docs/测试规约与回归门禁.md` | 测试验收 | 测试和回归门禁事实源 | `CURRENT` | qa | `QAF8,GOV8,WPROC1,WPROC2,WAPC2FLIVE,WCBK1,WEGOV1` | 回归脚本/Playwright | none | 2026-05-19 | `rg` | high | 测试计划、DONE 门禁、企微三层门禁、自动化优先、非自审、无完整 sandbox 假设、WREAD1 真机可读性和 WARCH1 留存验收门禁 |
| `AGENT-PRACTICE` | `docs/Agent开发交付实践.md` | Agent 治理 | Agent 协作事实源 | `CURRENT` | dev | `GOV8,DG8` | Skill 校验 | none | 2026-05-13 | `rg` | medium | Agent 协作开发实践和设计主参考层级 |
| `AGENTS` | `AGENTS.md` | 执行硬约束 | 项目硬规则 | `CURRENT` | lead | `GOV8` | 人工核对 | none | 2026-05-13 | `rg` | high | 不可违反约束 |
| `SKILL-HYB` | `.agents/skills/hyb-oa-delivery/SKILL.md` | Skill | 项目交付 Skill | `CURRENT` | dev | `GOV8,DG8,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,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,WREAL1P` | quick_validate | none | 2026-05-20 | `quick_validate.py` | medium | 每轮交付操作入口;企微/OA 后续先读 API 能力目录、Secret 矩阵、路线图、WEGOV1/WADM1/WARCH1/WARCH2/WROAD2/WARCH3/WCHECK1/WEXT1/WOPS1/WROAD2B/WAPPR1/WAUTO1/WEXT1LD/WFULLSMOKE1/WTCLOSE1 自建留存、受控巡检、业务冒烟、审批规则、自动证据汇总、全域收口 dry-run 和告警降噪边界;不得绕过 WROAD2C/WROAD2B/WAPPR1/WAUTO1/WEXT1LD/WFULLSMOKE1/WTCLOSE1/WEXT1-LIVE/WREAL1 或后续独立合同直接做完整考勤审批镜像 |
| `REQ-WF` | `docs/需求-统一审批中心规约.md` | 需求事实源 | 审批模块规约 | `CURRENT` | product/backend | `AP6,WF8,WFOC,DBWFOC,WFDG,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WREAD1F,WADM1,WARCH1,WAPPR1,WAUTO1,WEXT1LD,WFULLSMOKE1,WTCLOSE1,WRULE1` | workflow 回归 | none | 2026-05-20 | `rg` | high | OA 主办审批、企微主办 HR/考勤审批、OA 自建留存、真实回调事件证据、WACP3R 补偿拉取 findings、WREAD1 请假/补卡真机可读性结论、WARCH1 最小历史留存、WAPPR1 审批规则规范化和 API 不支持读取规则边界、WTCLOSE1 小团队一层审批 + 管理员兜底目标 A、WRULE1 理论审批人与实际审批链校验、WAUTO1/WEXT1LD/WFULLSMOKE1 前置和 OA 应急接管边界 |
| `SKILL-HYB` | `.agents/skills/hyb-oa-delivery/SKILL.md` | Skill | 项目交付 Skill | `CURRENT` | dev | `GOV8,DG8,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,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,WRULE1,WAUTO1,WEXT1LD,WFULLSMOKE1,WROUTE2,WTCLOSE1,WTCLOSE2,WREAL1P` | quick_validate | none | 2026-05-22 | `quick_validate.py` | medium | 每轮交付操作入口;企微/OA 后续先读 API 能力目录、Secret 矩阵、路线图、WEGOV1/WADM1/WARCH1/WARCH2/WROAD2/WARCH3/WCHECK1/WEXT1/WOPS1/WROAD2B/WAPPR1/WRULE1/WAUTO1/WEXT1LD/WFULLSMOKE1/WTCLOSE1/WTCLOSE2 自建留存、受控巡检、业务冒烟、审批规则、审批链校验、自动证据汇总、全域收口 dry-run、最终测试号收口和告警降噪边界;不得绕过 WROAD2C/WROAD2B/WAPPR1/WRULE1/WAUTO1/WEXT1LD/WFULLSMOKE1/WTCLOSE2/WEXT1-LIVE/WREAL1 或后续独立合同直接做完整考勤审批镜像 |
| `REQ-WF` | `docs/需求-统一审批中心规约.md` | 需求事实源 | 审批模块规约 | `CURRENT` | product/backend | `AP6,WF8,WFOC,DBWFOC,WFDG,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WREAD1F,WADM1,WARCH1,WAPPR1,WAUTO1,WEXT1LD,WFULLSMOKE1,WTCLOSE1,WRULE1,WTCLOSE2` | workflow 回归 | none | 2026-05-22 | `rg` | high | OA 主办审批、企微主办 HR/考勤审批、OA 自建留存、真实回调事件证据、WACP3R 补偿拉取 findings、WREAD1 请假/补卡真机可读性结论、WARCH1 最小历史留存、WAPPR1 审批规则规范化和 API 不支持读取规则边界、WTCLOSE1 小团队一层审批 + 管理员兜底目标 A、WRULE1 理论审批人与实际审批链校验、WTCLOSE2 测试号最终收口、WAUTO1/WEXT1LD/WFULLSMOKE1 前置和 OA 应急接管边界 |
| `REQ-OCR` | `docs/需求-报销发票OCR规约.md` | 需求事实源 | OCR 模块规约 | `CURRENT` | product/backend | `RI6,OCR8,BIZ8` | OCR 回归 | none | 2026-05-13 | `rg` | high | OCR 和发票边界 |
| `RULE-REIMB` | `docs/报销发票附件规则.md` | 需求事实源 | 报销发票附件规则 | `CURRENT` | product/finance | `RI6,BIZ8` | 报销回归 | none | 2026-05-13 | `rg` | high | 报销、发票、附件细则 |
| `REQ-WECOM` | `docs/需求-企业微信基础设施规约.md` | 需求事实源 | 企业微信边界规约 | `CURRENT` | product/backend | `R7E,ORG8,WF8,ATTV1,HR-WECOM-DIRECTORY-V1,WFOC,DBWFOC,WFDG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WADM1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WROAD2B,WAPPR1,WAUTO1,WEXT1LD,WFULLSMOKE1,WTCLOSE1` | live smoke/真机反馈/Issue CSV | none | 2026-05-20 | `rg` | high | 企微优先承担 HR/考勤员工日常审批和人事/打卡能力;WARCH2 已提供请假/补卡正式只读历史查询,WARCH3 固定受控上线自动巡检,WCHECK1 固定打卡摘要留存,WEXT1 固定外出/加班 dry-run,WROAD2B 固定三天人工业务冒烟,WAPPR1/WTCLOSE1 固定审批规则规范化和小团队目标 A,WFULLSMOKE1 固定全域主路径测试边界,WEXT1-LIVE 需三天验收后另建合同;采购、合同、项目、报销和财务继续 OA 主办 |
| `REQ-WECOM` | `docs/需求-企业微信基础设施规约.md` | 需求事实源 | 企业微信边界规约 | `CURRENT` | product/backend | `R7E,ORG8,WF8,ATTV1,HR-WECOM-DIRECTORY-V1,WFOC,DBWFOC,WFDG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WADM1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WROAD2B,WAPPR1,WAUTO1,WEXT1LD,WFULLSMOKE1,WTCLOSE1,WTCLOSE2` | live smoke/真机反馈/Issue CSV | none | 2026-05-22 | `rg` | high | 企微优先承担 HR/考勤员工日常审批和人事/打卡能力;WARCH2 已提供请假/补卡正式只读历史查询,WARCH3 固定受控上线自动巡检,WCHECK1 固定打卡摘要留存,WEXT1 固定外出/加班 dry-run,WROAD2B 固定三天人工业务冒烟,WAPPR1/WTCLOSE1 固定审批规则规范化和小团队目标 A,WFULLSMOKE1 固定全域主路径测试边界,WTCLOSE2 固定最终测试号自动收口,WEXT1-LIVE 需收口后另建合同;采购、合同、项目、报销和财务继续 OA 主办 |
| `RUNBOOK-TRIAL` | `docs/试运行与自动化验证手册.md` | 操作手册 | 试运行验证手册 | `CURRENT` | qa/ops | `R7E,QAOPS8` | live readiness | none | 2026-05-13 | `rg` | medium | 本地、公网、企业微信和真实 OCR 验证 |
| `MANUAL-ADMIN` | `docs/管理员手册.md` | 操作手册 | 管理员手册 | `CURRENT` | ops/admin | `ORG8,R7E,WFOC,DBWFOC,WFDG,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WADM1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WAUTO1,WEXT1LD,WFULLSMOKE1,WTCLOSE1,WREAL1P` | 人工验收 | none | 2026-05-20 | `rg` | medium | 管理员上线、企微优先边界、Secret 矩阵、WARCH3 自动巡检与脱敏告警、WOPS1 告警降噪、WCHECK1 打卡摘要留存、WROAD2B 三天业务冒烟、WAPPR1/WTCLOSE1 审批规则规范化和 API 不支持读取规则后的人工后台/真机门禁、小团队目标 A、WAUTO1 自动证据汇总、WFULLSMOKE1 全域最终目标测试、WEXT1 外出/加班 dry-run、WEXT1-LIVE 前置、WREAL1 准备和深度镜像前置关注点 |
| `MANUAL-ADMIN` | `docs/管理员手册.md` | 操作手册 | 管理员手册 | `CURRENT` | ops/admin | `ORG8,R7E,WFOC,DBWFOC,WFDG,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WACP3,WACP3R,WREAD1,WADM1,WARCH1,WARCH2,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WAUTO1,WEXT1LD,WFULLSMOKE1,WTCLOSE1,WTCLOSE2,WREAL1P` | 人工验收 | none | 2026-05-22 | `rg` | medium | 管理员上线、企微优先边界、Secret 矩阵、WARCH3 自动巡检与脱敏告警、WOPS1 告警降噪、WCHECK1 打卡摘要留存、WROAD2B 三天业务冒烟、WAPPR1/WTCLOSE1 审批规则规范化和 API 不支持读取规则后的人工后台/真机门禁、小团队目标 A、WAUTO1 自动证据汇总、WFULLSMOKE1 全域最终目标测试、WTCLOSE2 测试号最终收口、WEXT1 外出/加班 dry-run、WEXT1-LIVE 前置、WREAL1 准备和深度镜像前置关注点 |
| `MANUAL-EMPLOYEE` | `docs/员工快速上手.md` | 操作手册 | 员工手册 | `CURRENT` | product | `R7E,WFOC,DBWFOC,WFDG` | 人工验收 | none | 2026-05-18 | `rg` | low | 员工侧使用说明,HR/考勤优先企业微信,采购/合同/财务仍在 OA;区分企微镜像和 OA 应急接管 |
| `R7-DRAFT` | `docs/trialrun/R7扩大试运行草案.md` | 草案 | R7 准备材料 | `DRAFT` | product/qa | `R7E` | R7EP 报告 | none | 2026-05-13 | `rg` | medium | 不代表当前 R7E 执行状态 |
| `OPS-RUNBOOK` | `docs/trialrun/OPS7运维交接Runbook.md` | 运维草案 | OPS 准备材料 | `DRAFT` | ops | `OPS8,QAOPS8` | 只读检查 | none | 2026-05-13 | `rg` | medium | 不代表恢复演练已执行 |
| `TRIAL-REPORT` | `docs/trialrun/人工试运行报告.md` | 证据材料 | 试运行证据入口 | `EVIDENCE` | qa | `R7EP,OPS8,QAF8,WOUA,WAPI,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WAUTO1,WEXT1LD,WFULLSMOKE1,WTCLOSE1,WREAL1P` | artifacts/qa-flow | none | 2026-05-20 | `rg` | medium | 只证明发生过;记录 WAPC2FLIVE live 样件、WCBK1 真实回调事件、WEGOV1 路线治理、WROAD2 Day 0、WARCH3 自动巡检、WOPS1 告警降噪、WCHECK1 打卡摘要、WEXT1 dry-run、WROAD2B 三天业务冒烟、WAPPR1 审批规则门禁、WAUTO1/WEXT1LD、WFULLSMOKE1 全域最终目标测试、WTCLOSE1 小团队收口 dry-run 和 WREAL1 准备,不直接放行深度镜像 |
| `TRIAL-REPORT` | `docs/trialrun/人工试运行报告.md` | 证据材料 | 试运行证据入口 | `EVIDENCE` | qa | `R7EP,OPS8,QAF8,WOUA,WAPI,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WAPC2F,WAPC2FLIVE,WCBK1,WEGOV1,WROAD2,WARCH3,WCHECK1,WEXT1,WOPS1,WROAD2C,WROAD2B,WAPPR1,WAUTO1,WEXT1LD,WFULLSMOKE1,WTCLOSE1,WRULE1,WTCLOSE2,WREAL1P` | artifacts/qa-flow | none | 2026-05-22 | `rg` | medium | 只证明发生过;记录 WAPC2FLIVE live 样件、WCBK1 真实回调事件、WEGOV1 路线治理、WROAD2 Day 0、WARCH3 自动巡检、WOPS1 告警降噪、WCHECK1 打卡摘要、WEXT1 dry-run、WROAD2B 三天业务冒烟、WAPPR1 审批规则门禁、WAUTO1/WEXT1LD、WFULLSMOKE1 全域最终目标测试、WTCLOSE1 小团队收口 dry-run、WRULE1 审批链校验、WTCLOSE2 测试号最终收口和 WREAL1 准备,不直接放行深度镜像 |
| `FBA-AUDIT` | `docs/trialrun/R7E后功能边界审计.md` | 证据材料 | R7E 后功能边界审计 | `EVIDENCE` | product/dev/qa | `FBA,R7E,QAOPS8,P2T` | Issue CSV | none | 2026-05-15 | `rg` | medium | 只作为功能边界、P2 候选和 Issue 草案证据,不直接派工 |
| `HISTORY-MATRIX` | `docs/历史功能状态矩阵.md` | 历史材料 | 历史功能索引 | `HISTORICAL` | product | `DCL7` | git 历史 | none | 2026-05-13 | `rg` | low | 只追溯历史 |
| `OLD-IMPL-PLAN` | `docs/implementation_plan.md` | 已移除历史 | 早期实施计划 | `REMOVED` | product | `DCL7` | git history | none | 2026-05-13 | manual | low | 从 git 历史恢复 |
+3 -2
查看文件
@@ -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 -> 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 测试号最终收口与证据复核 -> WEXT1-LIVE 路线选择(待测试号收口、全域主路径、业务冒烟和规则门禁后另建合同) -> 四类测试号证据和审批规则门禁通过后问答 WREAL1 小范围真实试用(首批 1 名真实员工 + 1 名审批人/管理员观察) -> wecom_attendance_approval_mirror_v1 最小完整镜像。
- R6、PC6、PA6、FL6、AP6、RI6、LP6 已完成并部署。
- ME6 自动化、公网视觉矩阵和 `ME6-3` 代表性企业微信真机门禁已完成。
@@ -165,6 +165,7 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
| `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 继续后置 |
| `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、三天业务动作和最终问答 |
| `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 问答 |
| `WREAL1-PREP` | `issues/2026-05-20_14-35-42-wecom-real-trial-prep-v1.csv` | 当前真实试用准备:不启用真实员工 | 固化候选员工、非自审审批人、回滚联系人、允许流程、暂停条件和验收标准;真实试用必须等请假、补卡、外出、加班四类测试号证据、WAPPR1 和 WFULLSMOKE1 通过后再问 | 当前不创建外出/加班 live 样件;真实员工名单不写入 Issue 或文档,后续通过问答确认 |
旧 Issue CSV 不删除、不批量回写、不移动到归档目录。若新治理流替代旧合同,只在新 CSV 的 `Notes` 或本索引说明 supersedes,旧文件保留历史审计语义。
@@ -188,7 +189,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 和深度镜像前置口径 |
| [文档事实源状态矩阵](./文档事实源状态矩阵.md) | 文档分类、删除恢复和冲突规则 |
| [产品设计规则](./产品设计规则.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/WAUTO1/WEXT1LD/WFULLSMOKE1/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-LIVE 和后续 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 留存边界事实源 |
| [产品口径](./产品口径.md) | 已拍板产品边界和业务规则;WEGOV1 后包含混合主办、自建留存、受控测试域、后续阶段顺序和深度镜像前置口径 |
| [需求 - 统一审批中心规约](./需求-统一审批中心规约.md) | OA 主办审批、企微主办 HR/考勤员工日常审批镜像、催办、超时提醒、审批效率 |
+7 -5
查看文件
@@ -6,6 +6,7 @@
**WTCLOSE1 小团队规则**:公司不到 10 人时,HR/考勤审批先按一层直属主管或指定审批角色自动带出审批人,申请人不能任意改人;主管链缺失、审批人不可见/停用/未绑定或命中自审时,管理员兜底或阻断。当前目标是请假、补卡、外出、加班四类模板均达到 A;本轮自动工作只到 WAUTO1/WFULLSMOKE1 汇总和 WEXT1-LIVE 前 dry-run,不创建企微样件。
**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 和最小镜像。
**WTCLOSE2 测试号最终收口**:命令为 `bash scripts/qa/run-wecom-test-account-final-closeout.sh`。该脚本复跑 WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1,并汇总 WROAD2/WARCH3 既有报告;WFULLSMOKE1 在该脚本中关闭公网写流程,不新增 OA 测试业务数据;脚本不写企业微信、不创建审批样件、不启用真实员工。
## 1. 适用范围
- 适用于 `small_team_internal` 工作区模式。
@@ -210,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`。
3. WCPC 已证明 HR 主数据镜像准入项可用:通讯录成员读取、人事助手花名册读取、打卡短窗口记录/规则读取和假期余额读取均达到可复用状态;审批模板、审批实例和回调配置仍是后续考勤/审批镜像前置项。
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 审批规则规范化` -> `WAUTO1 自动证据汇总` -> `WEXT1LD 外出/加班 live 前 dry-run` -> `WFULLSMOKE1 三天全域最终目标测试` -> `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、WAUTO1/WEXT1LD/WFULLSMOKE1、WEXT1-LIVE、WREAL1 问答或明确批准,直接进入深度考勤/审批镜像。
- WROUTE2 后尾部顺序修正为:`WFULLSMOKE1` -> `WROUTE2` -> `WEXT1-LIVE` -> `WREAL1(首批 1 名真实员工 + 1 名审批人/管理员观察)` -> `wecom_attendance_approval_mirror_v1 最小完整镜像`;应急接管、恢复回写和 RuleOps 仍排在最小镜像稳定之后。
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 测试号最终收口与证据复核` -> `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 问答或明确批准,直接进入深度考勤/审批镜像。
- WROUTE2/WTCLOSE2 后尾部顺序修正为:`WFULLSMOKE1` -> `WROUTE2` -> `WTCLOSE2` -> `WEXT1-LIVE` -> `WREAL1(首批 1 名真实员工 + 1 名审批人/管理员观察)` -> `wecom_attendance_approval_mirror_v1 最小完整镜像`;应急接管、恢复回写和 RuleOps 仍排在最小镜像稳定之后。
6. 任何生产写接口、企微规则写入、应急模式开启或恢复回写都必须有单独批准、dry-run 或可审计记录。
WCPC 配置复跑清单:
@@ -350,9 +351,10 @@ WROAD2/WARCH3 企微受控上线每日巡检:
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。
19. WEXT1-LIVE 已锁定为外出+加班两类一起创建 OA-POC 测试模板和低风险审批单,固定 `SMOKE002 -> SMOKE101`、`WECOM_AGENT_SECRET` 和双开关;样件保留审计,由 `SMOKE101` 真机确认消息卡片、列表、详情页、按钮风险和审批人是否自动带出。
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/WAUTO1/WEXT1LD/WFULLSMOKE1 三天结束后再做人工问答:进入 WEXT1-LIVE、先处理指定 finding、或暂停;未确认前不启用真实员工,不创建外出/加班 live 样件。
22. WREAL1-PREP/WROUTE2 当前只准备和锁定路线,不要求提供真实员工;后续真实试用必须等请假、补卡、外出、加班四类测试号证据、WAPPR1 审批规则门禁和 WFULLSMOKE1 可解释通过后再问,首批固定为 1 名真实员工 + 1 名审批人/管理员观察。
23. `wecom_attendance_approval_mirror_v1` 最小完整镜像必须等 WREAL1 通过后优先规划;应急接管、恢复回写、RuleOps、图片 OCR、复杂 BPM、预算、ERP 和银行流水导入继续冻结。
21. WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1/WRULE1/WAUTO1/WEXT1LD/WFULLSMOKE1/WTCLOSE2 结束后再做人工问答:进入 WEXT1-LIVE、先处理指定 finding、或暂停;未确认前不启用真实员工,不创建外出/加班 live 样件。
22. WTCLOSE2 作为 WEXT1-LIVE 前的最后自动收口:复跑命令 `bash scripts/qa/run-wecom-test-account-final-closeout.sh`,结论为 `PASS_TEST_ACCOUNT_CLOSEOUT_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;它只进入问答,不自动 live。
23. WREAL1-PREP/WROUTE2 当前只准备和锁定路线,不要求提供真实员工;后续真实试用必须等请假、补卡、外出、加班四类测试号证据、WAPPR1/WRULE1 审批规则门禁、WTCLOSE2 和 WEXT1-LIVE 可解释通过后再问,首批固定为 1 名真实员工 + 1 名审批人/管理员观察。
24. `wecom_attendance_approval_mirror_v1` 最小完整镜像必须等 WREAL1 通过后优先规划;应急接管、恢复写回、RuleOps、图片 OCR、复杂 BPM、预算、ERP 和银行流水导入继续冻结。
问题登记最小字段:
+12 -1
查看文件
@@ -355,7 +355,7 @@ WF8-3、WF8-4、WF8-5 实现前必须基于本设计给技术方案;实现后
- 采购单附件、合同正文、报价、供应商资料、发票、银行回单、代账资料和其他高敏附件不进入企业微信原生审批或企业微信附件;企业微信只做提醒、deeplink 和免登录回流。
- 按域镜像是默认规则:企微主办 HR/考勤域镜像到 OA;OA 主办采购、合同、项目、财务和报销域不反向全量镜像到企微。
- 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 审批规则规范化` -> `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` 的顺序拆单功能 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;WAUTO1 只做自动证据汇总,WEXT1LD 只做 live 前 dry-run,WFULLSMOKE1 只做全域主路径总控;WROUTE2 只锁定路线,不授权写入;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 测试号最终收口与证据复核` -> `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 或测试号证据直接放行。
- 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 化配置、真机确认和风险拍板。
- 后续企微审批同步的 POC 必须输出 `CAN_REUSE_NOW`、`NEEDS_CONFIG`、`NEEDS_API_POC`、`KEEP_OA_PRIMARY`、`NOT_SUPPORTED_BY_API`,缺模板、回调、Secret 或权限时记录 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。
@@ -438,6 +438,17 @@ WRULE1 不新造 HR/考勤审批引擎,也不读取企微后台规则配置。
- 报告只输出审批类型、计数、脱敏 `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 和最小完整镜像。
### 9.3.3 WTCLOSE2 测试号最终收口与证据复核
WTCLOSE2 是 WEXT1-LIVE 前的最后自动收口。它复跑并汇总 WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1 证据,确认测试号链路是否可解释通过;它不写企业微信、不创建外出/加班模板或审批单、不启用真实员工。
- runner 为 `bash scripts/qa/run-wecom-test-account-final-closeout.sh`,输出 `artifacts/qa-flow/wecom-test-account-final-closeout-*/summary.json`。
- WFULLSMOKE1 在 WTCLOSE2 中必须以 `WFULLSMOKE_ALLOW_PUBLIC_WRITES=0` 运行,不新增 OA 测试业务数据。
- WRULE1 固定传入 `--manual-gate=all:A`,但仍只代表已提交审批链校验,不替代 WAPPR1 人工后台和真机门禁。
- 外出/加班步骤只执行 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`。
- WTCLOSE2 可解释通过后只能进入 WEXT1-LIVE 问答;live 创建、真实员工试用和最小完整镜像仍需各自独立合同和人工批准。
### 9.4 WEGOV1 / WACP3 / WREAD1 / WADM1 / WARCH1 前置门禁
在 `wecom_attendance_approval_mirror_v1` 前必须补齐治理、POC、真机和数据模型门禁:
@@ -0,0 +1,10 @@
"ID","Title","Description","Acceptance","Test_Method","Tools","Dev_Status","Review1_Status","Regression_Status","Files","Dependencies","Notes"
"WTCLOSE2-0","测试号最终收口合同建档","建立 WTCLOSE2 测试号最终收口与证据复核合同,承接 WAPPR1 四类模板 A 结论。目标是在不写企业微信、不启用真实员工的前提下,复跑并汇总 WROAD2/WARCH3/WAUTO1/WFULLSMOKE1/WEXT1LD/WRULE1 证据。","1) 新合同使用 WTCLOSE2-0..WTCLOSE2-8;2) 明确 WAPPR1=A 只代表规则门禁通过,不授权 live 或真实试用;3) 不创建外出/加班模板或审批单;4) 不启用真实员工;5) 输出 PASS_TEST_ACCOUNT_CLOSEOUT_READY、PASS_WITH_FINDINGS、PAUSED_MANUAL_CONFIRMATION 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG。","受影响流程:测试号三天巡检/业务冒烟 -> 自动证据汇总 -> WRULE1 审批链校验 -> WEXT1-LIVE/WREAL1 问答准入;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-22_10-21-12-wecom-test-account-final-closeout-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-22_10-21-12-wecom-test-account-final-closeout-v1.csv --profile wecom --json。","python3|node","DONE","DONE","DONE","issues/2026-05-22_10-21-12-wecom-test-account-final-closeout-v1.csv","[]","回滚/清理:删除本 CSV 或恢复事实源;本合同不授权企微写入、不部署真实员工、不修改 Prisma schema。"
"WTCLOSE2-1","QA-only 最终收口编排脚本","新增测试号最终收口脚本,自动复跑 /ready、WAUTO1、WFULLSMOKE1、外出/加班 dry-run、WRULE1,并汇总 WROAD2/WARCH3 既有报告。","1) 脚本路径 scripts/qa/run-wecom-test-account-final-closeout.sh;2) 输出 artifacts/qa-flow/wecom-test-account-final-closeout-*/summary.json;3) WFULLSMOKE1 以 WFULLSMOKE_ALLOW_PUBLIC_WRITES=0 运行,不创建新的 OA 测试业务数据;4) WEXT1LD 只 dry-run,不设置 WECOM_APPROVAL_FIXTURE_WRITE=1;5) WRULE1 使用 --manual-gate=all:A;6) 报告不泄露完整外部键或敏感字段。","受影响流程:自动证据复跑 -> 脱敏汇总 -> WEXT1-LIVE 问答;验证步骤:bash -n scripts/qa/run-wecom-test-account-final-closeout.sh;bash scripts/qa/run-wecom-test-account-final-closeout.sh。","bash|node|npm","DONE","DONE","DONE","scripts/qa/run-wecom-test-account-final-closeout.sh","[""WTCLOSE2-0""]","回滚/清理:删除新增脚本和本地 artifacts 报告;脚本默认不写企微。"
"WTCLOSE2-2","WAUTO1/WFULLSMOKE1 只读复核","由 WTCLOSE2 编排脚本复跑 WAUTO1 与 WFULLSMOKE1,收集受控试用、全域主路径、归档和移动入口证据。","1) WAUTO1 report 纳入 WTCLOSE2 summary;2) WFULLSMOKE1 report 纳入 WTCLOSE2 summary;3) 不触发企微写入;4) 不启用真实员工;5) WFULLSMOKE1 公网写流程关闭,避免新增 OA 测试业务数据。","受影响流程:公网 ready -> 企微受控试用汇总 -> OA 主办域 smoke 汇总;验证步骤:bash scripts/qa/run-wecom-test-account-final-closeout.sh 后检查 summary.json childReports。","bash|node","DONE","DONE","DONE","scripts/qa/run-wecom-test-account-final-closeout.sh|scripts/qa/collect-wecom-controlled-trial-evidence.sh|scripts/qa/run-three-day-full-goal-smoke.sh","[""WTCLOSE2-1""]","回滚/清理:报告保留审计;如公网凭据缺失记录 finding,不伪造成通过。"
"WTCLOSE2-3","WRULE1 实际审批链复核","在 WAPPR1 四类 A 的人工门禁基础上,复跑 WRULE1 审批链校验器,检查 OA 理论审批人与已归档企微实际审批链是否一致。","1) WRULE1 使用 --template=leave/missed_punch/outing/overtime 与 --manual-gate=all:A;2) 无归档样本或本地 DB 不可读时真实记录 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;3) 自审、审批人不匹配或申请人可手选均阻断;4) 不调用企微 API、不写 OA/企微。","受影响流程:OA 组织规则 -> OA 已归档企微审批详情 -> 理论/实际审批链对账;验证步骤:cd server && npm run check:wecom-approval-rule-validator -- --format=json --template=leave --template=missed_punch --template=outing --template=overtime --manual-gate=all:A。","npm|node","DONE","DONE","DONE","server/src/scripts/check-wecom-approval-rule-validator.js|scripts/qa/run-wecom-test-account-final-closeout.sh","[""WTCLOSE2-1""]","回滚/清理:无运行态写入;若本地无归档数据,记录阻断并等待远端或后续真实样例。"
"WTCLOSE2-4","外出加班 live 前 dry-run 复核","复跑外出/加班 live 前 dry-run,确认 payload、测试链、非自审、固定 WECOM_AGENT_SECRET、不尝试其他 Secret 和脱敏报告仍可用。","1) 只执行 --target=outing --target=overtime dry-run;2) 不带 --live、--create-templates、--submit-test-approvals;3) 不设置 WECOM_APPROVAL_FIXTURE_WRITE=1;4) 失败不自动换人、不自动重试 live;5) 结果进入 WTCLOSE2 summary。","受影响流程:外出/加班 dry-run -> WEXT1-LIVE 问答准入;验证步骤:cd server && npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime。","npm|node","DONE","DONE","DONE","server/src/scripts/check-wecom-approval-fixtures.js|scripts/qa/run-wecom-test-account-final-closeout.sh","[""WTCLOSE2-1""]","回滚/清理:dry-run 报告保留审计;不创建企微模板或审批单;不允许运行时猜 Secret。"
"WTCLOSE2-5","事实源和问答门禁回写","更新路线图、管理员手册、试运行报告、文档索引、事实源矩阵和项目 skill,固化 WTCLOSE2 -> WEXT1-LIVE -> WREAL1 -> 最小镜像顺序。","1) 事实源包含 WTCLOSE2;2) 明确 WAPPR1=A 后仍需 WRULE1 和问答;3) 明确 WEXT1-LIVE 先问再写;4) 明确 WREAL1 默认 1 名真实员工 + 1 名审批人/管理员观察;5) 文档审计和 skill 校验通过。","受影响流程:后续任务读取事实源 -> WEXT1-LIVE 问答 -> WREAL1 问答 -> 最小镜像规划;验证步骤:node scripts/qa/audit-docs.mjs --check-registry;quick_validate.py .agents/skills/hyb-oa-delivery;rg -n ""WTCLOSE2|PASS_TEST_ACCOUNT_CLOSEOUT_READY|先问再写|1 名真实员工"" docs .agents/skills/hyb-oa-delivery/SKILL.md。","node|python3|rg","DONE","DONE","DONE","docs/企微优先开发路线图.md|docs/管理员手册.md|docs/trialrun/人工试运行报告.md|docs/文档索引.md|docs/文档事实源状态矩阵.md|.agents/skills/hyb-oa-delivery/SKILL.md","[""WTCLOSE2-4""]","回滚/清理:恢复本轮文档和 skill 改动;不修改历史 Issue 快照。"
"WTCLOSE2-6","隐私和写入边界核对","核对 WTCLOSE2 及子报告不泄露完整 sp_no、template_id、userid、手机号、邮箱、token、Secret、EncodingAESKey、表单值、附件、评论或原始 payload;确认未写企微。","1) WTCLOSE2 privacy smoke 通过;2) 报告仅含状态、计数和路径;3) 未设置企微写入变量;4) 未执行 live 创建;5) 真实员工未启用。","受影响流程:报告生成 -> 隐私扫描 -> 后续人工问答;验证步骤:bash scripts/qa/run-wecom-test-account-final-closeout.sh;git diff --check。","bash|git","DONE","DONE","DONE","scripts/qa/run-wecom-test-account-final-closeout.sh|artifacts/qa-flow","[""WTCLOSE2-2"",""WTCLOSE2-3"",""WTCLOSE2-4""]","回滚/清理:如发现泄露,暂停并清理本地报告;不进入提交。"
"WTCLOSE2-7","只读 reviewer 审查","审批规则和 live/真实试用准入属于高风险治理项,实施后另开只读 reviewer subagent 审查,不允许修改代码。","1) reviewer 只读;2) 审查 WAPPR1=A 是否被误读为 live/真实试用批准;3) 审查 WTCLOSE2 summary 是否保留 WRULE1/WEXT1-LIVE/WREAL1 门禁;4) 审查隐私和写入边界;5) blocker 必须修复或记录。","受影响流程:实现完成 -> 独立评审 -> 状态回填;验证步骤:reviewer subagent 输出无 blocker 或 blocker 已处理。","subagent|manual","DONE","DONE","DONE","N/A","[""WTCLOSE2-6""]","回滚/清理:reviewer 不修改文件;如发现高风险,暂停 WEXT1-LIVE/WREAL1。"
"WTCLOSE2-8","门禁状态回填和中文提交","完成合同校验、process gate、脚本语法、自动验证、文档审计、skill 校验、diff 检查、状态回填和中文提交。","1) validate_issues_csv 通过;2) process gate baseline 和 issue-specific 通过;3) bash -n 通过;4) WTCLOSE2 runner 已执行并生成 summary;5) audit-docs、quick_validate、git diff --check 通过;6) 中文提交包含 WTCLOSE2。","受影响流程:合同 -> 实施 -> 验证 -> review -> 提交 -> 后续问答;验证步骤:git status --short;git log -1 --oneline。","python3|node|bash|git","DONE","DONE","DONE","issues/2026-05-22_10-21-12-wecom-test-account-final-closeout-v1.csv|scripts/qa/run-wecom-test-account-final-closeout.sh|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md","[""WTCLOSE2-7""]","提交建议:WTCLOSE2 收口测试号最终证据;最终报告 artifacts/qa-flow/wecom-test-account-final-closeout-20260522-105852/summary.json,结论 SKIP/BLOCKED_BY_EXTERNAL_CONFIG,公网 /ready 与隐私扫描通过,未写企微,未创建样件,未启用真实员工;回滚/清理:恢复本轮 CSV、脚本和文档改动,保留或按审计要求清理本地 artifacts。"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 WTCLOSE2-0 测试号最终收口合同建档 建立 WTCLOSE2 测试号最终收口与证据复核合同,承接 WAPPR1 四类模板 A 结论。目标是在不写企业微信、不启用真实员工的前提下,复跑并汇总 WROAD2/WARCH3/WAUTO1/WFULLSMOKE1/WEXT1LD/WRULE1 证据。 1) 新合同使用 WTCLOSE2-0..WTCLOSE2-8;2) 明确 WAPPR1=A 只代表规则门禁通过,不授权 live 或真实试用;3) 不创建外出/加班模板或审批单;4) 不启用真实员工;5) 输出 PASS_TEST_ACCOUNT_CLOSEOUT_READY、PASS_WITH_FINDINGS、PAUSED_MANUAL_CONFIRMATION 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG。 受影响流程:测试号三天巡检/业务冒烟 -> 自动证据汇总 -> WRULE1 审批链校验 -> WEXT1-LIVE/WREAL1 问答准入;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-22_10-21-12-wecom-test-account-final-closeout-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-22_10-21-12-wecom-test-account-final-closeout-v1.csv --profile wecom --json。 python3|node DONE DONE DONE issues/2026-05-22_10-21-12-wecom-test-account-final-closeout-v1.csv [] 回滚/清理:删除本 CSV 或恢复事实源;本合同不授权企微写入、不部署真实员工、不修改 Prisma schema。
3 WTCLOSE2-1 QA-only 最终收口编排脚本 新增测试号最终收口脚本,自动复跑 /ready、WAUTO1、WFULLSMOKE1、外出/加班 dry-run、WRULE1,并汇总 WROAD2/WARCH3 既有报告。 1) 脚本路径 scripts/qa/run-wecom-test-account-final-closeout.sh;2) 输出 artifacts/qa-flow/wecom-test-account-final-closeout-*/summary.json;3) WFULLSMOKE1 以 WFULLSMOKE_ALLOW_PUBLIC_WRITES=0 运行,不创建新的 OA 测试业务数据;4) WEXT1LD 只 dry-run,不设置 WECOM_APPROVAL_FIXTURE_WRITE=1;5) WRULE1 使用 --manual-gate=all:A;6) 报告不泄露完整外部键或敏感字段。 受影响流程:自动证据复跑 -> 脱敏汇总 -> WEXT1-LIVE 问答;验证步骤:bash -n scripts/qa/run-wecom-test-account-final-closeout.sh;bash scripts/qa/run-wecom-test-account-final-closeout.sh。 bash|node|npm DONE DONE DONE scripts/qa/run-wecom-test-account-final-closeout.sh ["WTCLOSE2-0"] 回滚/清理:删除新增脚本和本地 artifacts 报告;脚本默认不写企微。
4 WTCLOSE2-2 WAUTO1/WFULLSMOKE1 只读复核 由 WTCLOSE2 编排脚本复跑 WAUTO1 与 WFULLSMOKE1,收集受控试用、全域主路径、归档和移动入口证据。 1) WAUTO1 report 纳入 WTCLOSE2 summary;2) WFULLSMOKE1 report 纳入 WTCLOSE2 summary;3) 不触发企微写入;4) 不启用真实员工;5) WFULLSMOKE1 公网写流程关闭,避免新增 OA 测试业务数据。 受影响流程:公网 ready -> 企微受控试用汇总 -> OA 主办域 smoke 汇总;验证步骤:bash scripts/qa/run-wecom-test-account-final-closeout.sh 后检查 summary.json childReports。 bash|node DONE DONE DONE scripts/qa/run-wecom-test-account-final-closeout.sh|scripts/qa/collect-wecom-controlled-trial-evidence.sh|scripts/qa/run-three-day-full-goal-smoke.sh ["WTCLOSE2-1"] 回滚/清理:报告保留审计;如公网凭据缺失记录 finding,不伪造成通过。
5 WTCLOSE2-3 WRULE1 实际审批链复核 在 WAPPR1 四类 A 的人工门禁基础上,复跑 WRULE1 审批链校验器,检查 OA 理论审批人与已归档企微实际审批链是否一致。 1) WRULE1 使用 --template=leave/missed_punch/outing/overtime 与 --manual-gate=all:A;2) 无归档样本或本地 DB 不可读时真实记录 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;3) 自审、审批人不匹配或申请人可手选均阻断;4) 不调用企微 API、不写 OA/企微。 受影响流程:OA 组织规则 -> OA 已归档企微审批详情 -> 理论/实际审批链对账;验证步骤:cd server && npm run check:wecom-approval-rule-validator -- --format=json --template=leave --template=missed_punch --template=outing --template=overtime --manual-gate=all:A。 npm|node DONE DONE DONE server/src/scripts/check-wecom-approval-rule-validator.js|scripts/qa/run-wecom-test-account-final-closeout.sh ["WTCLOSE2-1"] 回滚/清理:无运行态写入;若本地无归档数据,记录阻断并等待远端或后续真实样例。
6 WTCLOSE2-4 外出加班 live 前 dry-run 复核 复跑外出/加班 live 前 dry-run,确认 payload、测试链、非自审、固定 WECOM_AGENT_SECRET、不尝试其他 Secret 和脱敏报告仍可用。 1) 只执行 --target=outing --target=overtime dry-run;2) 不带 --live、--create-templates、--submit-test-approvals;3) 不设置 WECOM_APPROVAL_FIXTURE_WRITE=1;4) 失败不自动换人、不自动重试 live;5) 结果进入 WTCLOSE2 summary。 受影响流程:外出/加班 dry-run -> WEXT1-LIVE 问答准入;验证步骤:cd server && npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime。 npm|node DONE DONE DONE server/src/scripts/check-wecom-approval-fixtures.js|scripts/qa/run-wecom-test-account-final-closeout.sh ["WTCLOSE2-1"] 回滚/清理:dry-run 报告保留审计;不创建企微模板或审批单;不允许运行时猜 Secret。
7 WTCLOSE2-5 事实源和问答门禁回写 更新路线图、管理员手册、试运行报告、文档索引、事实源矩阵和项目 skill,固化 WTCLOSE2 -> WEXT1-LIVE -> WREAL1 -> 最小镜像顺序。 1) 事实源包含 WTCLOSE2;2) 明确 WAPPR1=A 后仍需 WRULE1 和问答;3) 明确 WEXT1-LIVE 先问再写;4) 明确 WREAL1 默认 1 名真实员工 + 1 名审批人/管理员观察;5) 文档审计和 skill 校验通过。 受影响流程:后续任务读取事实源 -> WEXT1-LIVE 问答 -> WREAL1 问答 -> 最小镜像规划;验证步骤:node scripts/qa/audit-docs.mjs --check-registry;quick_validate.py .agents/skills/hyb-oa-delivery;rg -n "WTCLOSE2|PASS_TEST_ACCOUNT_CLOSEOUT_READY|先问再写|1 名真实员工" docs .agents/skills/hyb-oa-delivery/SKILL.md。 node|python3|rg DONE DONE DONE docs/企微优先开发路线图.md|docs/管理员手册.md|docs/trialrun/人工试运行报告.md|docs/文档索引.md|docs/文档事实源状态矩阵.md|.agents/skills/hyb-oa-delivery/SKILL.md ["WTCLOSE2-4"] 回滚/清理:恢复本轮文档和 skill 改动;不修改历史 Issue 快照。
8 WTCLOSE2-6 隐私和写入边界核对 核对 WTCLOSE2 及子报告不泄露完整 sp_no、template_id、userid、手机号、邮箱、token、Secret、EncodingAESKey、表单值、附件、评论或原始 payload;确认未写企微。 1) WTCLOSE2 privacy smoke 通过;2) 报告仅含状态、计数和路径;3) 未设置企微写入变量;4) 未执行 live 创建;5) 真实员工未启用。 受影响流程:报告生成 -> 隐私扫描 -> 后续人工问答;验证步骤:bash scripts/qa/run-wecom-test-account-final-closeout.sh;git diff --check。 bash|git DONE DONE DONE scripts/qa/run-wecom-test-account-final-closeout.sh|artifacts/qa-flow ["WTCLOSE2-2","WTCLOSE2-3","WTCLOSE2-4"] 回滚/清理:如发现泄露,暂停并清理本地报告;不进入提交。
9 WTCLOSE2-7 只读 reviewer 审查 审批规则和 live/真实试用准入属于高风险治理项,实施后另开只读 reviewer subagent 审查,不允许修改代码。 1) reviewer 只读;2) 审查 WAPPR1=A 是否被误读为 live/真实试用批准;3) 审查 WTCLOSE2 summary 是否保留 WRULE1/WEXT1-LIVE/WREAL1 门禁;4) 审查隐私和写入边界;5) blocker 必须修复或记录。 受影响流程:实现完成 -> 独立评审 -> 状态回填;验证步骤:reviewer subagent 输出无 blocker 或 blocker 已处理。 subagent|manual DONE DONE DONE N/A ["WTCLOSE2-6"] 回滚/清理:reviewer 不修改文件;如发现高风险,暂停 WEXT1-LIVE/WREAL1。
10 WTCLOSE2-8 门禁状态回填和中文提交 完成合同校验、process gate、脚本语法、自动验证、文档审计、skill 校验、diff 检查、状态回填和中文提交。 1) validate_issues_csv 通过;2) process gate baseline 和 issue-specific 通过;3) bash -n 通过;4) WTCLOSE2 runner 已执行并生成 summary;5) audit-docs、quick_validate、git diff --check 通过;6) 中文提交包含 WTCLOSE2。 受影响流程:合同 -> 实施 -> 验证 -> review -> 提交 -> 后续问答;验证步骤:git status --short;git log -1 --oneline。 python3|node|bash|git DONE DONE DONE issues/2026-05-22_10-21-12-wecom-test-account-final-closeout-v1.csv|scripts/qa/run-wecom-test-account-final-closeout.sh|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md ["WTCLOSE2-7"] 提交建议:WTCLOSE2 收口测试号最终证据;最终报告 artifacts/qa-flow/wecom-test-account-final-closeout-20260522-105852/summary.json,结论 SKIP/BLOCKED_BY_EXTERNAL_CONFIG,公网 /ready 与隐私扫描通过,未写企微,未创建样件,未启用真实员工;回滚/清理:恢复本轮 CSV、脚本和文档改动,保留或按审计要求清理本地 artifacts。
+351
查看文件
@@ -0,0 +1,351 @@
#!/usr/bin/env bash
set -u -o pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
SERVER_DIR="$ROOT_DIR/server"
PUBLIC_BASE_URL="${LIVE_SMOKE_BASE_URL:-https://oa.hyinda.com}"
REPORT_DIR="${WTCLOSE2_REPORT_DIR:-$ROOT_DIR/artifacts/qa-flow/wecom-test-account-final-closeout-$(date +%Y%m%d-%H%M%S)}"
SUMMARY_TXT="$REPORT_DIR/summary.txt"
STATUS=0
FINDING_COUNT=0
mkdir -p "$REPORT_DIR"
: >"$SUMMARY_TXT"
log() {
printf '%s\n' "$*" | tee -a "$SUMMARY_TXT"
}
run_step() {
local name="$1"
shift
local log_file="$REPORT_DIR/${name}.log"
log ">>> [wtclose2] $name"
if "$@" > >(tee "$log_file") 2>&1; then
log "[wtclose2][PASS] $name"
else
local code="$?"
log "[wtclose2][FAIL] $name exit=$code"
STATUS=1
fi
}
run_finding_step() {
local name="$1"
shift
local log_file="$REPORT_DIR/${name}.log"
log ">>> [wtclose2] $name"
if "$@" > >(tee "$log_file") 2>&1; then
log "[wtclose2][PASS] $name"
else
local code="$?"
log "[wtclose2][FINDING] $name exit=$code"
FINDING_COUNT=$((FINDING_COUNT + 1))
fi
}
run_server_finding_step() {
local name="$1"
shift
local log_file="$REPORT_DIR/${name}.log"
log ">>> [wtclose2] $name"
if (cd "$SERVER_DIR" && "$@") > >(tee "$log_file") 2>&1; then
log "[wtclose2][PASS] $name"
else
local code="$?"
log "[wtclose2][FINDING] $name exit=$code"
FINDING_COUNT=$((FINDING_COUNT + 1))
fi
}
run_ready() {
run_step "public-ready" curl -fsS "$PUBLIC_BASE_URL/ready"
}
write_day_report_index() {
node - "$ROOT_DIR" "$REPORT_DIR" <<'NODE' || true
const fs = require("node:fs");
const path = require("node:path");
const [rootDir, reportDir] = process.argv.slice(2);
const qaRoot = path.join(rootDir, "artifacts/qa-flow");
function readJson(file) {
try {
return JSON.parse(fs.readFileSync(file, "utf8"));
} catch {
return null;
}
}
function collect(prefix) {
let dirs = [];
try {
dirs = fs.readdirSync(qaRoot, { withFileTypes: true })
.filter((entry) => entry.isDirectory() && entry.name.startsWith(prefix))
.map((entry) => path.join(qaRoot, entry.name, "summary.json"))
.filter((file) => fs.existsSync(file))
.sort()
.slice(-8);
} catch {}
return dirs.map((file) => {
const json = readJson(file);
return {
status: json?.status || json?.conclusion || "UNKNOWN",
conclusion: json?.conclusion || null,
checkedAt: json?.checkedAt || json?.generatedAt || null,
reportPath: path.resolve(file),
};
});
}
const index = {
issueId: "WTCLOSE2",
generatedAt: new Date().toISOString(),
wroad2Reports: collect("wroad2-ops-"),
warch3Reports: collect("warch3-ops-"),
wauto1Reports: collect("wecom-controlled-trial-evidence-"),
wfullsmokeReports: collect("three-day-full-goal-smoke-"),
wext1DryRunReports: collect("wecom-approval-fixtures-"),
wrule1Reports: collect("wecom-approval-rule-validator-"),
};
fs.writeFileSync(path.join(reportDir, "day-report-index.json"), `${JSON.stringify(index, null, 2)}\n`, "utf8");
NODE
}
run_wauto1() {
run_finding_step "wauto1-evidence" env \
WAUTO1_REPORT_DIR="$REPORT_DIR/wecom-controlled-trial-evidence" \
LIVE_SMOKE_BASE_URL="$PUBLIC_BASE_URL" \
bash "$ROOT_DIR/scripts/qa/collect-wecom-controlled-trial-evidence.sh"
}
run_wfullsmoke1() {
run_finding_step "wfullsmoke1-no-public-writes" env \
WFULLSMOKE_REPORT_DIR="$REPORT_DIR/three-day-full-goal-smoke" \
WFULLSMOKE_ALLOW_PUBLIC_WRITES=0 \
LIVE_SMOKE_BASE_URL="$PUBLIC_BASE_URL" \
bash "$ROOT_DIR/scripts/qa/run-three-day-full-goal-smoke.sh"
}
run_wext1ld_dryrun() {
run_server_finding_step "outing-overtime-dryrun" npm run check:wecom-approval-fixtures -- \
--format=json \
--target=outing \
--target=overtime \
--report-dir="$REPORT_DIR/wecom-approval-fixtures-dryrun"
}
run_wrule1() {
run_server_finding_step "approval-rule-validator" npm run check:wecom-approval-rule-validator -- \
--format=json \
--template=leave \
--template=missed_punch \
--template=outing \
--template=overtime \
--manual-gate=all:A \
--limit=50 \
--report-dir="$REPORT_DIR/wecom-approval-rule-validator"
}
run_privacy_smoke() {
local sensitive_pattern='([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|encoding_aes_key|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 safe_metadata_pattern='"[^"]*(secret|token)[^"]*"[[:space:]]*:[[:space:]]*"WECOM_[A-Z0-9_]*(SECRET|TOKEN)([[:space:]]|["]|$)|"[^"]*(secret|token)[^"]*"[[:space:]]*:[[:space:]]*"WECOM_[A-Z0-9_]*(SECRET|TOKEN)[^"]*(source|path|read paths|fallback)'
local matches
matches="$(grep -RInEi "$sensitive_pattern" "$REPORT_DIR" | grep -vE 'HRWDTEST-[0-9]{14}' | grep -vEi "$safe_metadata_pattern" || true)"
if [[ -n "$matches" ]]; then
printf '%s\n' "$matches"
log "[wtclose2][FAIL] report-privacy-smoke matched sensitive pattern"
STATUS=1
else
log "[wtclose2][PASS] report-privacy-smoke"
fi
}
write_summary_json() {
node - "$ROOT_DIR" "$REPORT_DIR" "$PUBLIC_BASE_URL" "$STATUS" "$FINDING_COUNT" <<'NODE' || return 1
const fs = require("node:fs");
const path = require("node:path");
const { execSync } = require("node:child_process");
const [rootDir, reportDir, baseURL, statusInput, findingCountInput] = process.argv.slice(2);
function readJson(file) {
if (!file || !fs.existsSync(file)) return null;
try {
return JSON.parse(fs.readFileSync(file, "utf8"));
} catch {
return null;
}
}
function child(relativePath) {
const file = path.join(reportDir, relativePath, "summary.json");
const json = readJson(file);
return {
status: json?.status || json?.conclusion || "MISSING",
conclusion: json?.conclusion || null,
reportPath: fs.existsSync(file) ? path.resolve(file) : null,
findingCount: Number(json?.findingCount || 0),
};
}
function safeStatus(value) {
return String(value || "UNKNOWN").slice(0, 80);
}
function isBlocked(value) {
return /SKIP|BLOCKED|FAIL|ERROR/i.test(value);
}
function isFinding(value) {
return /FINDING/i.test(value);
}
function isManualGap(value) {
return /PAUSED|PARTIAL|MISSING|NEEDS/i.test(value);
}
let commit = "unknown";
try {
commit = execSync("git rev-parse --short HEAD", { cwd: rootDir, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
} catch {}
const dayReportIndex = readJson(path.join(reportDir, "day-report-index.json")) || {};
const childReports = {
publicReady: {
status: Number(statusInput || 0) === 0 ? "PASS" : "FAIL",
reportPath: path.resolve(path.join(reportDir, "public-ready.log")),
},
wauto1: child("wecom-controlled-trial-evidence"),
wfullsmoke1: child("three-day-full-goal-smoke"),
outingOvertimeDryRun: child("wecom-approval-fixtures-dryrun"),
wrule1: child("wecom-approval-rule-validator"),
};
const findings = [];
for (const [source, report] of Object.entries(childReports)) {
const status = safeStatus(report.status);
if (status === "PASS" || /^PASS_/.test(status)) {
if (isFinding(status) || Number(report.findingCount || 0) > 0) {
findings.push({ source, status, severity: "finding", reportPath: report.reportPath });
}
continue;
}
if (isBlocked(status)) {
findings.push({ source, status, severity: "blocker", reportPath: report.reportPath });
} else if (isManualGap(status)) {
findings.push({ source, status, severity: "manual_or_data_gap", reportPath: report.reportPath });
} else {
findings.push({ source, status, severity: "finding", reportPath: report.reportPath });
}
}
const manualGates = [
{
id: "WAPPR1",
status: "PASS_APPROVER_RULES_READY",
evidence: "2026-05-21 用户真机确认请假、补卡、外出、加班均为 A",
},
{
id: "WROAD2-BIZ1",
status: "NEEDS_CLOSEOUT_SUMMARY",
evidence: "三天打卡、请假/补卡、详情后审批和 OA 历史查看需随最终验收确认",
},
{
id: "WEXT1-LIVE",
status: "PENDING_USER_APPROVAL",
evidence: "外出/加班 dry-run 通过后仍需单独问答批准 live 写入",
},
{
id: "WREAL1",
status: "PENDING_USER_APPROVAL",
evidence: "测试号证据和 WRULE1 可解释通过后,再问 1 名真实员工 + 1 名审批人/管理员观察",
},
];
let status = "PASS_TEST_ACCOUNT_CLOSEOUT_READY";
if (Number(statusInput || 0) !== 0 || findings.some((item) => item.severity === "blocker")) {
status = "SKIP/BLOCKED_BY_EXTERNAL_CONFIG";
} else if (findings.some((item) => item.severity === "manual_or_data_gap") || manualGates.some((gate) => gate.status.startsWith("NEEDS"))) {
status = "PAUSED_MANUAL_CONFIRMATION";
} else if (findings.length || Number(findingCountInput || 0) > 0) {
status = "PASS_WITH_FINDINGS";
}
const summary = {
issueId: "WTCLOSE2",
mode: "wecom-test-account-final-closeout",
status,
conclusion: status,
baseURL,
commit,
checkedAt: new Date().toISOString(),
reportDir: path.resolve(reportDir),
accounts: {
applicant: "SMOKE002",
approver: "SMOKE101",
adminObserverEmployeeNo: "HYD000006",
},
childReports,
sourceReports: {
dayReportIndex: path.resolve(path.join(reportDir, "day-report-index.json")),
wroad2Reports: dayReportIndex.wroad2Reports || [],
warch3Reports: dayReportIndex.warch3Reports || [],
},
manualGates,
findingCount: findings.length,
findings,
boundaries: {
noWeComWrites: true,
noWeComTemplateCreation: true,
noWeComApprovalSubmission: true,
noRealEmployees: true,
noOutingOvertimeLive: true,
wfullsmokePublicWrites: false,
onlyAllowedOaWrites: "existing WARCH3/WCHECK1 archive paths when invoked by child runners",
},
nextQuestions: {
closeout: [
"A:接受测试号收口,进入 WEXT1-LIVE 问答。",
"B:接受 PASS_WITH_FINDINGS,但先处理指定 finding。",
"C:暂停,不进入 live 或真实试用。",
],
wext1Live: [
"A:批准一次 live 创建外出+加班 OA-POC 样件,保留审计。",
"B:只保留 dry-run,不创建样件。",
"C:外出/加班移出 V1。",
],
wreal1: [
"A:1 名真实员工 + 1 名审批人/管理员观察。",
"B:继续测试账号,不引入真实员工。",
"C:暂停,先处理指定 finding。",
],
},
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",
};
fs.writeFileSync(path.join(reportDir, "summary.json"), `${JSON.stringify(summary, null, 2)}\n`, "utf8");
console.log(`[wtclose2] summary=${path.join(reportDir, "summary.json")}`);
NODE
}
finish() {
write_day_report_index
write_summary_json || STATUS=1
run_privacy_smoke
write_summary_json || STATUS=1
log "[wtclose2] report=$REPORT_DIR"
exit "$STATUS"
}
trap finish EXIT
run_ready
write_day_report_index
run_wauto1
run_wfullsmoke1
run_wext1ld_dryrun
run_wrule1