WEXT1F 回填外出终态取证结果

这个提交包含在:
2026-05-22 18:47:24 +08:00
父节点 e3bf4eecc9
当前提交 a606716890
共修改 4 个文件,包含 5 行新增和 5 行删除
+2 -2
查看文件
@@ -589,9 +589,9 @@ Go 结论边界:
| 执行合同 | 已建档 | 新增 `issues/2026-05-22_14-23-19-wecom-formal-outing-overtime-evidence-v1.csv`,ID 为 `WEXT1F-0..WEXT1F-7`。 |
| 只读证据脚本 | 已新增 | 新增 `scripts/qa/run-wecom-formal-outing-overtime-evidence.sh`,真实业务运行必须使用 `--remote` 从部署服务器 server 容器执行;本地直接执行默认拒绝,即使伪造远端环境变量也会因非 `/app` 容器路径拒绝。 |
| 人工前置 | 已确认 | 用户确认 `SMOKE002` 已在企业微信正式外出和加班模板提交低风险测试单,审批人不可编辑;`SMOKE101` 已先看详情再处理。 |
| 系统校验 | `PASS_WITH_FINDINGS` | 远端报告 `/app/artifacts/qa-flow/wecom-formal-outing-overtime-evidence-20260522-091957/summary.json`:`/ready` 通过,外出/加班补偿拉取和 OA 归档成功,离线归档可读,WRULE1 为 `PASS_RULE_MATCH`,隐私扫描通过。finding:加班已通过;外出仍显示 `审批中`;加班存在 callback duplicate observation,历史 callback window finding 仍为观察项。 |
| 系统校验 | `PASS_WITH_FINDINGS` | 二次远端报告 `/app/artifacts/qa-flow/wecom-formal-outing-overtime-evidence-20260522-104521/summary.json`:`/ready` 通过,外出/加班补偿拉取和 OA 归档成功,离线归档可读 2 条 `approved`,WRULE1 为 `PASS_RULE_MATCH`,隐私扫描通过。finding 仅剩 callback duplicate observation 和历史 callback window observation,不阻断进入 WREAL1 问答。 |
| 写入边界 | 已固定 | 不设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不调用 create_template/applyevent,不创建 OA-POC 外出/加班样件,不启用真实员工;报告不得泄露完整 `sp_no`、template_id、userid、手机号、邮箱、token、Secret、EncodingAESKey、表单值、附件、评论或原始 payload。 |
| 后续准入 | 暂不自动放行 WREAL1 | 外出终态未归档为已通过或已驳回前,不把 WEXT1F 误读为完整通过;下一步需人工确认外出单是否仍待审批,或接受 `PASS_WITH_FINDINGS` 并指定先处理 finding。 |
| 后续准入 | 暂不自动放行 WREAL1 | 外出和加班正式模板测试号证据均已形成 approved 终态;WREAL1 仍需用户单独问答确认,不能自动启用真实员工。 |
## 历史恢复
+1 -1
查看文件
@@ -14,7 +14,7 @@
**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` 临时文件提供,不写入仓库文档或聊天。
**WEXT1F 执行口径**:正式模板外出/加班证据由 `scripts/qa/run-wecom-formal-outing-overtime-evidence.sh --remote` 从部署服务器执行。该脚本只在用户完成 `SMOKE002` 人工提交、`SMOKE101` 先看详情再处理后运行;远端命令还必须带 `WEXT1F_MANUAL_CONFIRMATION=SMOKE002_SUBMITTED_SMOKE101_REVIEWED`,否则只输出 `PAUSED_MANUAL_CONFIRMATION`,不跑企微 API。它不创建模板、不自动提交审批、不写企业微信,只使用 `--target=outing --target=overtime` 的补偿拉取读取详情,并强制带 `--filter-creator-employee-no=SMOKE002`,避免按正式模板 ID 宽泛读取其他员工单据;在 `WECOM_ARCHIVE_WRITE=1` + `--persist-to-db` 双开关下写 OA 自建留存,再执行外出/加班离线归档读取和 WRULE1。报告结论限定为 `PASS_FORMAL_OUTING_OVERTIME_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;未形成外出/加班正式模板归档前不得进入 WREAL1。
**WEXT1F 远端结果**:2026-05-22 远端报告 `/app/artifacts/qa-flow/wecom-formal-outing-overtime-evidence-20260522-091957/summary.json` 为 `PASS_WITH_FINDINGS`。外出/加班正式模板补偿拉取、OA 归档、离线读取和 WRULE1 审批链校验均可用,隐私扫描通过;加班已通过,外出仍显示审批中。该结果不自动放行 WREAL1,需先确认外出终态或接受 finding 后再进入下一问答。
**WEXT1F 远端结果**:2026-05-22 二次远端报告 `/app/artifacts/qa-flow/wecom-formal-outing-overtime-evidence-20260522-104521/summary.json` 为 `PASS_WITH_FINDINGS`。外出/加班正式模板补偿拉取、OA 归档、离线读取和 WRULE1 审批链校验均可用,隐私扫描通过;外出和加班均已归档为 `approved`。剩余 finding 为 callback duplicate 和历史 callback window observation,不阻断进入 WREAL1 问答,但真实员工试用仍需用户单独确认。
## 1. 路线图原则