WTCLOSE2F 修正测试号收口远端执行口径

这个提交包含在:
2026-05-22 11:36:31 +08:00
父节点 592cf6524c
当前提交 170b9f9146
共修改 9 个文件,包含 97 行新增和 16 行删除
+3 -3
查看文件
@@ -22,7 +22,7 @@ Read only what is relevant:
- WROAD2-BIZ1/WAPPR1/WRULE1 adjust the post-WOPS1 route: during the 3-day window, add manual business smoke on test accounts without replacing WARCH3 automation. `SMOKE002` should try WeCom check-in and submit low-risk leave/missed-punch, `SMOKE101` must open details before approving, and `HYD000006` checks OA archived approval/check-in summaries. WAPPR1 treats "applicant must manually choose approver" as a blocking rule finding: test templates remain `SMOKE002 -> SMOKE101`, formal leave/missed-punch/outing/overtime templates must auto-resolve approvers from direct manager, department owner, or configured approval role, and applicant-chosen arbitrary approvers/self-approval must block WREAL1. Official WeCom APIs do not expose a read-only native-template approval-rule configuration surface: `gettemplatedetail` returns controls, `getapprovaldetail` returns actual submitted flow, and `applyevent use_template_approver=1` is a write-style check, so do not design WAPPR1 as pure API automation. WRULE1 adds `npm run check:wecom-approval-rule-validator` to compare OA theoretical approvers with archived WeCom actual approval chains; it is read-only, does not read WeCom backend rules, and does not replace WAPPR1 A/B/C/D manual gates. WAUTO1 can automate evidence collection, and WFULLSMOKE1 can aggregate full-domain smoke evidence, but WAPPR1 choices A/B/C/D and real-device business actions remain manual gates. Do not start WEXT1-LIVE, WREAL1, deep mirror, emergency, writeback, or RuleOps until WROAD2-CLOSEOUT, WROAD2-BIZ1, WAPPR1, WRULE1, WAUTO1/WEXT1LD, WFULLSMOKE1, WTCLOSE2, WEXT1-LIVE, and the relevant question gates or explicit approval are complete. - WROAD2-BIZ1/WAPPR1/WRULE1 adjust the post-WOPS1 route: during the 3-day window, add manual business smoke on test accounts without replacing WARCH3 automation. `SMOKE002` should try WeCom check-in and submit low-risk leave/missed-punch, `SMOKE101` must open details before approving, and `HYD000006` checks OA archived approval/check-in summaries. WAPPR1 treats "applicant must manually choose approver" as a blocking rule finding: test templates remain `SMOKE002 -> SMOKE101`, formal leave/missed-punch/outing/overtime templates must auto-resolve approvers from direct manager, department owner, or configured approval role, and applicant-chosen arbitrary approvers/self-approval must block WREAL1. Official WeCom APIs do not expose a read-only native-template approval-rule configuration surface: `gettemplatedetail` returns controls, `getapprovaldetail` returns actual submitted flow, and `applyevent use_template_approver=1` is a write-style check, so do not design WAPPR1 as pure API automation. WRULE1 adds `npm run check:wecom-approval-rule-validator` to compare OA theoretical approvers with archived WeCom actual approval chains; it is read-only, does not read WeCom backend rules, and does not replace WAPPR1 A/B/C/D manual gates. WAUTO1 can automate evidence collection, and WFULLSMOKE1 can aggregate full-domain smoke evidence, but WAPPR1 choices A/B/C/D and real-device business actions remain manual gates. Do not start WEXT1-LIVE, WREAL1, deep mirror, emergency, writeback, or RuleOps until WROAD2-CLOSEOUT, WROAD2-BIZ1, WAPPR1, WRULE1, WAUTO1/WEXT1LD, WFULLSMOKE1, WTCLOSE2, WEXT1-LIVE, and the relevant question gates or explicit approval are complete.
- WROUTE2 locks the post-WFULLSMOKE1 route: first close out test-account evidence, then ask for WEXT1-LIVE outing+overtime test-account live POC, then ask WREAL1 with exactly 1 real employee + 1 approver/admin observer, then prioritize `wecom_attendance_approval_mirror_v1` minimum complete mirror. WTCLOSE1 adds the small-team execution rule: because the company has fewer than 10 people, WAPPR1 targets option A for leave/missed-punch/outing/overtime; formal HR/attendance approvals use one direct manager or configured approval role with admin fallback/blocking when the approver chain is missing, unavailable, invisible, unbound, or self-approval. WRULE1 enforces this as an OA-side validator over archived WeCom approval details; `PASS_RULE_MATCH` or explainable `PASS_WITH_ADMIN_FALLBACK` can support test-account closeout, while `FAIL_APPLICANT_CAN_CHOOSE`, `FAIL_SELF_APPROVAL`, `FAIL_APPROVER_MISMATCH`, missing manual gates, or external config blockers stop WEXT1-LIVE/WREAL1. WTCLOSE1 only authorizes WAUTO1/WFULLSMOKE1 aggregation and WEXT1-LIVE pre-dry-run; WTCLOSE2 only performs final test-account evidence closeout. Neither authorizes WeCom writes, real employees, outing/overtime fixture creation, emergency mode, writeback, or RuleOps. - WROUTE2 locks the post-WFULLSMOKE1 route: first close out test-account evidence, then ask for WEXT1-LIVE outing+overtime test-account live POC, then ask WREAL1 with exactly 1 real employee + 1 approver/admin observer, then prioritize `wecom_attendance_approval_mirror_v1` minimum complete mirror. WTCLOSE1 adds the small-team execution rule: because the company has fewer than 10 people, WAPPR1 targets option A for leave/missed-punch/outing/overtime; formal HR/attendance approvals use one direct manager or configured approval role with admin fallback/blocking when the approver chain is missing, unavailable, invisible, unbound, or self-approval. WRULE1 enforces this as an OA-side validator over archived WeCom approval details; `PASS_RULE_MATCH` or explainable `PASS_WITH_ADMIN_FALLBACK` can support test-account closeout, while `FAIL_APPLICANT_CAN_CHOOSE`, `FAIL_SELF_APPROVAL`, `FAIL_APPROVER_MISMATCH`, missing manual gates, or external config blockers stop WEXT1-LIVE/WREAL1. WTCLOSE1 only authorizes WAUTO1/WFULLSMOKE1 aggregation and WEXT1-LIVE pre-dry-run; WTCLOSE2 only performs final test-account evidence closeout. Neither authorizes WeCom writes, real employees, outing/overtime fixture creation, emergency mode, writeback, or RuleOps.
- WAPPR1 2026-05-21 manual gate result: the user set the test employee's direct manager to the test supervisor and confirmed on a real device that leave, missed punch, outing, and overtime all auto-fill the test supervisor and the applicant cannot delete/change/add approvers. Treat all four templates as A / `PASS_APPROVER_RULES_READY`, but still require WRULE1 actual-chain validation, WROAD2-BIZ1 business evidence, WTCLOSE2 final test-account closeout, and explicit WEXT1-LIVE/WREAL1 question gates before any WeCom write or real-employee trial. - WAPPR1 2026-05-21 manual gate result: the user set the test employee's direct manager to the test supervisor and confirmed on a real device that leave, missed punch, outing, and overtime all auto-fill the test supervisor and the applicant cannot delete/change/add approvers. Treat all four templates as A / `PASS_APPROVER_RULES_READY`, but still require WRULE1 actual-chain validation, WROAD2-BIZ1 business evidence, WTCLOSE2 final test-account closeout, and explicit WEXT1-LIVE/WREAL1 question gates before any WeCom write or real-employee trial.
- WTCLOSE2 adds `scripts/qa/run-wecom-test-account-final-closeout.sh` as the final automatic test-account closeout before WEXT1-LIVE. It reruns `/ready`, WAUTO1, WFULLSMOKE1 with `WFULLSMOKE_ALLOW_PUBLIC_WRITES=0`, outing/overtime dry-run without live flags, and WRULE1 with `--manual-gate=all:A`; it must not set WeCom write switches, create templates/approvals, enable real employees, or treat WAPPR1=A as live approval. - WTCLOSE2/WTCLOSE2F adds `scripts/qa/run-wecom-test-account-final-closeout.sh` as the final automatic test-account closeout before WEXT1-LIVE. Enterprise WeChat API checks must run from the deployment server trusted IP, so use `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote`; local direct execution is blocked by default and may only be used for syntax/static gates. The remote run reruns `/ready`, WAUTO1, WFULLSMOKE1 with `WFULLSMOKE_ALLOW_PUBLIC_WRITES=0`, outing/overtime dry-run without live flags, and WRULE1 with `--manual-gate=all:A`; it must not set WeCom write switches, create templates/approvals, enable real employees, or treat WAPPR1=A as live approval. Do not treat previous local missing-env/DB WTCLOSE2 output as a WeCom business blocker.
- WAPC2FLIVE supersedes the WAPC2F dry-run gap for OA-POC samples: after user approval, the runner was corrected to the official `template_name` + `property` controls create-template payload, deployed with `SYNC_ENV=0`, and the public live report `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` reached `PASS_FIXTURE_CREATED`; leave/missed-punch OA-POC templates and low-risk test approvals were created and retained for audit, with WAPC2 auto-rerun `PASS_APPROVAL_POC`. WCBK1 has added and deployed read-only `GET/POST /api/wecom/approval/callback`, `wecomCallbackCrypto`, `npm run check:wecom-approval-callback-poc`, and the `wecom-callback` process gate. After remote callback config was set, public report `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T083422Z/summary.json` reached `PASS_CALLBACK_URL_VERIFIED`; after `SMOKE101` approved an existing OA-POC missed-punch test approval, `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T092648Z/summary.json` reached `PASS_CALLBACK_EVENT_CONFIRMED` with one redacted event. WACP3/WACP3R has added and deployed `npm run check:wecom-approval-compensation-poc`, `POST /cgi-bin/oa/getapprovalinfo` read support, and automatic template discovery by `SMOKE002` creator; WREAD1 deploy reran WACP3R at `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T125515Z/summary.json` and then generated `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T125532Z/summary.json` as `PAUSED_MANUAL_CONFIRMATION`. WREAD1F then fixed duplicate OA-POC template names by adding timestamp uniqueness and created fresh leave/missed-punch approvals at `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T131958Z/summary.json`; final WREAD1 manual report `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` is `PASS_READABLE`. This clears leave/missed-punch readability only; mirror data model, minimum archive, emergency mode, writeback, RuleOps, and outing/overtime sample decisions remain later gates. - WAPC2FLIVE supersedes the WAPC2F dry-run gap for OA-POC samples: after user approval, the runner was corrected to the official `template_name` + `property` controls create-template payload, deployed with `SYNC_ENV=0`, and the public live report `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` reached `PASS_FIXTURE_CREATED`; leave/missed-punch OA-POC templates and low-risk test approvals were created and retained for audit, with WAPC2 auto-rerun `PASS_APPROVAL_POC`. WCBK1 has added and deployed read-only `GET/POST /api/wecom/approval/callback`, `wecomCallbackCrypto`, `npm run check:wecom-approval-callback-poc`, and the `wecom-callback` process gate. After remote callback config was set, public report `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T083422Z/summary.json` reached `PASS_CALLBACK_URL_VERIFIED`; after `SMOKE101` approved an existing OA-POC missed-punch test approval, `/app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T092648Z/summary.json` reached `PASS_CALLBACK_EVENT_CONFIRMED` with one redacted event. WACP3/WACP3R has added and deployed `npm run check:wecom-approval-compensation-poc`, `POST /cgi-bin/oa/getapprovalinfo` read support, and automatic template discovery by `SMOKE002` creator; WREAD1 deploy reran WACP3R at `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T125515Z/summary.json` and then generated `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T125532Z/summary.json` as `PAUSED_MANUAL_CONFIRMATION`. WREAD1F then fixed duplicate OA-POC template names by adding timestamp uniqueness and created fresh leave/missed-punch approvals at `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T131958Z/summary.json`; final WREAD1 manual report `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` is `PASS_READABLE`. This clears leave/missed-punch readability only; mirror data model, minimum archive, emergency mode, writeback, RuleOps, and outing/overtime sample decisions remain later gates.
- WEGOV1 changes the current WeCom route to "Enterprise WeChat owns mature HR/attendance flows; OA stores self-owned history, audit, entry, messages, and emergency fallback." Treat four domains explicitly: WeCom-owned domain is check-in, leave, missed punch, outing, overtime, leave balance, and HR assistant; OA-owned domain remains reimbursement, procurement, contracts, projects, payments, invoices, bank receipts, sensitive attachments, and operating audit; OA archive domain stores WeCom business history, full external keys, and necessary snapshots; OA emergency domain is manually enabled only when WeCom is unavailable. Do not assume a full isolated WeCom sandbox; use the controlled test domain `SMOKE002 -> SMOKE101`, `OA-POC` templates, low-risk approvals, synthetic tests, public live runners, and limited real-device confirmation. WARCH1 now supplies the minimum leave/missed-punch archive implementation, WARCH2 supplies the formal read-only history query surface, and WROAD2 supplies controlled ops daily checks. Do not start deep mirror until WROAD2-CLOSEOUT, WROAD2-BIZ1, WAPPR1, WRULE1, WAUTO1/WEXT1LD, WFULLSMOKE1, WTCLOSE2, WEXT1-LIVE, WREAL1 question gates or explicit approval, and the mirror stage's own contract are complete. - WEGOV1 changes the current WeCom route to "Enterprise WeChat owns mature HR/attendance flows; OA stores self-owned history, audit, entry, messages, and emergency fallback." Treat four domains explicitly: WeCom-owned domain is check-in, leave, missed punch, outing, overtime, leave balance, and HR assistant; OA-owned domain remains reimbursement, procurement, contracts, projects, payments, invoices, bank receipts, sensitive attachments, and operating audit; OA archive domain stores WeCom business history, full external keys, and necessary snapshots; OA emergency domain is manually enabled only when WeCom is unavailable. Do not assume a full isolated WeCom sandbox; use the controlled test domain `SMOKE002 -> SMOKE101`, `OA-POC` templates, low-risk approvals, synthetic tests, public live runners, and limited real-device confirmation. WARCH1 now supplies the minimum leave/missed-punch archive implementation, WARCH2 supplies the formal read-only history query surface, and WROAD2 supplies controlled ops daily checks. Do not start deep mirror until WROAD2-CLOSEOUT, WROAD2-BIZ1, WAPPR1, WRULE1, WAUTO1/WEXT1LD, WFULLSMOKE1, WTCLOSE2, WEXT1-LIVE, WREAL1 question gates or explicit approval, and the mirror stage's own contract are complete.
- For reimbursement, invoice, OCR, duplicate invoice, or attachment work, read `docs/报销发票附件规则.md` and `references/reimbursement.md`. - For reimbursement, invoice, OCR, duplicate invoice, or attachment work, read `docs/报销发票附件规则.md` and `references/reimbursement.md`.
@@ -113,8 +113,8 @@ Final responses should include:
- R6 scope defaults to reimbursement, leave, procurement, approval, Enterprise WeChat entry/notification, finance payment/export. - R6 scope defaults to reimbursement, leave, procurement, approval, Enterprise WeChat entry/notification, finance payment/export.
- Do not expand to budget, ERP, AI, full travel, or complex BPM during R6; record those as follow-up Issues. - Do not expand to budget, ERP, AI, full travel, or complex BPM during R6; record those as follow-up Issues.
- Enterprise WeChat personal app message is the formal approval notification channel after R5; mock and group bots are not acceptance evidence for R6 business notification. - Enterprise WeChat personal app message is the formal approval notification channel after R5; mock and group bots are not acceptance evidence for R6 business notification.
- After WAPI, ERP is not a future OA integration target. HR/attendance employee daily approvals (leave, missed punch, outing, overtime) should reuse mature Enterprise WeChat capabilities first, while OA provides self-owned archive, domain-based mirror, manual takeover, recovery writeback, finance closeout, and audit. Reimbursement, payment batches, AP, accounting handoff, procurement, expenses, contracts, projects, sensitive attachments, invoices, bank receipts, and accounting handoff materials remain OA-primary unless a later Issue changes that domain explicitly. OA-primary approvals may send Enterprise WeChat personal-app notifications, but messages must contain only dehydrated title/type/no/status/deeplink; do not upload procurement forms, contract bodies, quotes, supplier files, invoices, bank receipts, or accounting materials to WeCom native approvals or WeCom attachments. Current WAPI rule: contacts read with `WECOM_CONTACT_SECRET`; HR assistant/roster/check-in/approval default to `WECOM_AGENT_SECRET`, with `WECOM_CHECKIN_SECRET` only as explicit check-in override; no runtime Secret guessing. Current stage order is `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 -> wecom_ruleops_v1`. UI and API work must distinguish `OA 主办`, `企微主办`, `OA 自建留存`, and `OA 应急接管`. Do not treat WEXT1 dry-run, WEXT1LD, WFULLSMOKE1, WROUTE2, or WTCLOSE2 as permission to live-create outing/overtime templates or approvals; live needs explicit user approval. - After WAPI, ERP is not a future OA integration target. HR/attendance employee daily approvals (leave, missed punch, outing, overtime) should reuse mature Enterprise WeChat capabilities first, while OA provides self-owned archive, domain-based mirror, manual takeover, recovery writeback, finance closeout, and audit. Reimbursement, payment batches, AP, accounting handoff, procurement, expenses, contracts, projects, sensitive attachments, invoices, bank receipts, and accounting handoff materials remain OA-primary unless a later Issue changes that domain explicitly. OA-primary approvals may send Enterprise WeChat personal-app notifications, but messages must contain only dehydrated title/type/no/status/deeplink; do not upload procurement forms, contract bodies, quotes, supplier files, invoices, bank receipts, or accounting materials to WeCom native approvals or WeCom attachments. Current WAPI rule: contacts read with `WECOM_CONTACT_SECRET`; HR assistant/roster/check-in/approval default to `WECOM_AGENT_SECRET`, with `WECOM_CHECKIN_SECRET` only as explicit check-in override; no runtime Secret guessing. Current stage order is `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 -> wecom_ruleops_v1`. UI and API work must distinguish `OA 主办`, `企微主办`, `OA 自建留存`, and `OA 应急接管`. Do not treat WEXT1 dry-run, WEXT1LD, WFULLSMOKE1, WROUTE2, WTCLOSE2, or WTCLOSE2F as permission to live-create outing/overtime templates or approvals; live needs explicit user approval.
- Current post-WROAD2 route wording is: `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 最小完整镜像`. WREAL1-PREP only prepared the checklist and does not enable real employees. Do not treat WEXT1 dry-run, WEXT1LD, WFULLSMOKE1, WROUTE2, or WTCLOSE2 as permission to live-create outing/overtime templates or approvals; live needs explicit user approval. - Current post-WROAD2 route wording is: `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 最小完整镜像`. WREAL1-PREP only prepared the checklist and does not enable real employees. Do not treat WEXT1 dry-run, WEXT1LD, WFULLSMOKE1, WROUTE2, WTCLOSE2, or WTCLOSE2F as permission to live-create outing/overtime templates or approvals; live needs explicit user approval.
- WMSG1 has verified real Enterprise WeChat personal-app delivery and Deeplink return: report `/app/artifacts/qa-flow/wecom-runtime-ready-20260518T234431Z/summary.json` has `checks.message.status=OK`, `errcode=0`, and `recipientCount=1`; the user confirmed receiving "OA 运行就绪检查" and opening the OA notifications page from the message. This only clears message/deeplink runtime evidence; template/detail, callback evidence, compensation pull, readability, self-owned archive model design, and minimum archive implementation are covered by WAPC2FLIVE/WCBK1/WACP3R/WREAD1/WADM1/WARCH1 in the OA-POC leave/missed-punch scope, while deep mirror work remains a separate later gate. - WMSG1 has verified real Enterprise WeChat personal-app delivery and Deeplink return: report `/app/artifacts/qa-flow/wecom-runtime-ready-20260518T234431Z/summary.json` has `checks.message.status=OK`, `errcode=0`, and `recipientCount=1`; the user confirmed receiving "OA 运行就绪检查" and opening the OA notifications page from the message. This only clears message/deeplink runtime evidence; template/detail, callback evidence, compensation pull, readability, self-owned archive model design, and minimum archive implementation are covered by WAPC2FLIVE/WCBK1/WACP3R/WREAD1/WADM1/WARCH1 in the OA-POC leave/missed-punch scope, while deep mirror work remains a separate later gate.
- WAPC1 has fixed the WeCom approval configuration preparation gate: first templates are leave, missed punch, outing, and overtime; each needs template ID, scope, fields, approver rules, visible scope, and self-built app permission; low-risk test `sp_no` must not contain procurement, contract, reimbursement, invoice, bank receipt, sensitive attachment, or real sensitive business material; callback URL/Token/EncodingAESKey are deployment-only values and must not be written to repo docs or Issue CSV. Do not implement real approval callback handling, deep mirror, emergency mode, recovery writeback, or RuleOps until a later approved Issue covers the POC or implementation. - WAPC1 has fixed the WeCom approval configuration preparation gate: first templates are leave, missed punch, outing, and overtime; each needs template ID, scope, fields, approver rules, visible scope, and self-built app permission; low-risk test `sp_no` must not contain procurement, contract, reimbursement, invoice, bank receipt, sensitive attachment, or real sensitive business material; callback URL/Token/EncodingAESKey are deployment-only values and must not be written to repo docs or Issue CSV. Do not implement real approval callback handling, deep mirror, emergency mode, recovery writeback, or RuleOps until a later approved Issue covers the POC or implementation.
- WAPC2 has added the WeCom approval template/detail read-only POC runner for leave and missed punch. Use `npm run check:wecom-approval-poc`; pass template IDs with `--template=leave:<id>` / `--template=missed_punch:<id>` and low-risk test approval numbers with `--sp-no=leave:<sp_no>` / `--sp-no=missed_punch:<sp_no>`. The runner must use only `WECOM_AGENT_SECRET`, redact full template IDs and `sp_no`, and never output form values, attachments, comments, full userid, token, Secret, or raw payload. - WAPC2 has added the WeCom approval template/detail read-only POC runner for leave and missed punch. Use `npm run check:wecom-approval-poc`; pass template IDs with `--template=leave:<id>` / `--template=missed_punch:<id>` and low-risk test approval numbers with `--sp-no=leave:<sp_no>` / `--sp-no=missed_punch:<sp_no>`. The runner must use only `WECOM_AGENT_SECRET`, redact full template IDs and `sp_no`, and never output form values, attachments, comments, full userid, token, Secret, or raw payload.
+11
查看文件
@@ -558,6 +558,17 @@ Go 结论边界:
| 结论分类 | 已固定 | `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-LIVE 单次 live 创建外出+加班 OA-POC 样件;真实员工试用仍固定后置为 1 名真实员工 + 1 名审批人/管理员观察,且需另行问答。 |
## WTCLOSE2F 远端可信 IP 执行口径修正
执行时间:2026-05-22。用户确认企业微信后台已限制 API 只能由部署服务器访问,本地执行 WTCLOSE2 会因缺远端 env、DB 和可信 IP 产生误导性阻断,因此修正如下:
| 项目 | 状态 | 证据与边界 |
| --- | --- | --- |
| 执行合同 | 已建档 | 新增 `issues/2026-05-22_11-10-06-wecom-test-account-closeout-remote-only-v1.csv`,ID 为 `WTCLOSE2F-0..WTCLOSE2F-5`。 |
| 执行入口 | 已修正 | WTCLOSE2 真实运行命令改为 `bash scripts/qa/run-wecom-test-account-final-closeout.sh --remote`,由 SSH 到部署服务器并在 server 容器中执行。 |
| 本地边界 | 已固定 | 本地直接执行脚本默认拒绝跑企微链路;本地只用于 `bash -n`、合同、文档和静态门禁。此前本地缺 env/DB 造成的 WTCLOSE2 阻断不能作为企微业务阻断证据。 |
| 写入边界 | 不变 | 远端 WTCLOSE2 仍不写企业微信、不创建外出/加班模板或审批单、不启用真实员工;WFULLSMOKE1 仍以 `WFULLSMOKE_ALLOW_PUBLIC_WRITES=0` 运行。 |
## 历史恢复 ## 历史恢复
需要追溯 R70-R91 的详细流水时,使用: 需要追溯 R70-R91 的详细流水时,使用:
+5 -4
查看文件
@@ -2,15 +2,16 @@
**文档状态**:当前开发路线图事实源。 **文档状态**:当前开发路线图事实源。
**分类**:开发治理 / 路线图。 **分类**:开发治理 / 路线图。
**适用时间**: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 路线选择之后。 **适用时间**: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 路线选择之后。
**关联 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`。 **关联 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`。
**最近审计**: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-LIVE 外出/加班测试号 live POC -> 请假/补卡/外出/加班四类测试号证据和审批规则门禁通过后再问真实小范围试用。上述阶段仍不代表完整深度镜像、应急接管、恢复回写或 RuleOps 已完成。
**WTCLOSE2F 顺序修正**:上一条长段中的“后续顺序”以本条为准:WROAD2-CLOSEOUT -> WROAD2-BIZ1 -> WAPPR1 -> WRULE1 -> WAUTO1 -> WEXT1LD -> WFULLSMOKE1 -> WTCLOSE2/WTCLOSE2F 远端可信 IP 收口 -> WEXT1-LIVE 问答 -> WREAL1 问答 -> 最小完整镜像。
**WROUTE2 补充口径**:WFULLSMOKE1 之后先锁定测试号全域收口,再进入 WEXT1-LIVE 问答;WREAL1 首批固定为 1 名真实员工 + 1 名审批人/管理员观察;WREAL1 通过后优先规划 `wecom_attendance_approval_mirror_v1` 最小完整镜像,应急接管、恢复回写和 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,不授权任何企微写入。 **WTCLOSE1 执行口径**:公司不到 10 人,WAPPR1 四类模板目标按 A 执行;正式 HR/考勤审批采用一层直属主管或指定审批角色自动带出审批人,主管链缺失、审批人不可见/停用/未绑定或命中自审时由管理员兜底或阻断。本轮自动执行到 WAUTO1/WFULLSMOKE1 汇总和 WEXT1-LIVE 前 dry-run,不授权任何企微写入。
**WAPPR1 2026-05-21 人工门禁结论**:测试员工直属上级已设置为测试主管;用户真机确认请假、补卡、外出、加班提交页均自动带出测试主管,且申请人不能删除、改人或新增审批人,四类模板均为 A。该结论只放行规则门禁,不等于批准外出/加班 live 写入或真实员工试用;后续仍需 WRULE1 实际审批链校验和 WEXT1-LIVE/WREAL1 问答。 **WAPPR1 2026-05-21 人工门禁结论**:测试员工直属上级已设置为测试主管;用户真机确认请假、补卡、外出、加班提交页均自动带出测试主管,且申请人不能删除、改人或新增审批人,四类模板均为 A。该结论只放行规则门禁,不等于批准外出/加班 live 写入或真实员工试用;后续仍需 WRULE1 实际审批链校验和 WEXT1-LIVE/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 执行口径**:新增 `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。 **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 阻断不能作为企微业务阻断证据。
## 1. 路线图原则 ## 1. 路线图原则
@@ -106,7 +107,7 @@
| 24 | `WEXT1LD 外出/加班 live 前 dry-run gate` | 在 live 创建前远端只执行外出/加班 dry-run。 | WEXT1 dry-run runner 已存在;用户要求 live 前先自动 dry-run。 | 不带 live 写入参数;通过后只进入问答,不自动创建模板或审批单。 | | 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、不导入银行流水。 | | 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 测试号最终收口与证据复核` | 自动复跑测试号收口证据,确认是否可以进入 WEXT1-LIVE 问答。 | WAPPR1 四类模板均为 A;WRULE1 已实现;WAUTO1/WEXT1LD/WFULLSMOKE1 已存在。 | 输出 `PASS_TEST_ACCOUNT_CLOSEOUT_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;不写企业微信、不创建样件、不启用真实员工。 | | 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`;不写企业微信、不创建样件、不启用真实员工;本地直接执行不作为业务证据。 |
| 28 | `WEXT1-LIVE 外出/加班测试号 live POC` | 单次创建外出+加班 OA-POC 模板和低风险测试审批单,并做真机可读性和审批规则确认。 | WTCLOSE2 可解释通过;新建独立 Issue CSV;再次说明会留下的企微记录并取得人工确认。 | 两类样件保留审计;固定 `SMOKE002 -> SMOKE101`、`WECOM_AGENT_SECRET` 和双开关;只保存脱敏 template/`sp_no`/userid 前缀;`SMOKE101` 真机确认消息、列表、详情、按钮风险和审批人是否自动带出。 | | 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 可解释通过;用户通过问答确认真实员工、审批人、试用周期、暂停条件和回滚联系人。 | 试用报告可解释通过或暂停;仍不直接全员推广。 | | 29 | `WREAL1 小范围真实试用` | 在 1 名真实员工 + 1 名审批人/管理员观察范围验证企微主办 HR/考勤和 OA 留存。 | 请假、补卡、外出、加班四类测试号证据通过;WAPPR1/WRULE1 规则门禁通过;WTCLOSE2 和 WEXT1-LIVE 可解释通过;用户通过问答确认真实员工、审批人、试用周期、暂停条件和回滚联系人。 | 试用报告可解释通过或暂停;仍不直接全员推广。 |
| 30 | `wecom_attendance_approval_mirror_v1 最小完整镜像` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA。 | WREAL1 通过后优先规划;不得仅凭测试号证据进入,也不先做应急接管、恢复回写或 RuleOps。 | OA 可查询企微 HR/考勤镜像、附件摘要、审批历史、考勤解释和审计;不把 OA 主办高敏审批迁到企微。 | | 30 | `wecom_attendance_approval_mirror_v1 最小完整镜像` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA。 | WREAL1 通过后优先规划;不得仅凭测试号证据进入,也不先做应急接管、恢复回写或 RuleOps。 | OA 可查询企微 HR/考勤镜像、附件摘要、审批历史、考勤解释和审计;不把 OA 主办高敏审批迁到企微。 |
+2 -1
查看文件
@@ -102,9 +102,10 @@
| `WAUTO1` | `issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv` | `CURRENT` | 受控试用证据自动汇总合同已实现:新增 `scripts/qa/collect-wecom-controlled-trial-evidence.sh`,只读汇总 WROAD2/WARCH3/WCHECK1/WROAD2-BIZ1/WAPPR1/WEXT1 dry-run 证据,复跑 `/ready`、WARCH3 summary-only、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描;默认不写 OA DB、不写企业微信、不创建模板或审批单 | | `WAUTO1` | `issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv` | `CURRENT` | 受控试用证据自动汇总合同已实现:新增 `scripts/qa/collect-wecom-controlled-trial-evidence.sh`,只读汇总 WROAD2/WARCH3/WCHECK1/WROAD2-BIZ1/WAPPR1/WEXT1 dry-run 证据,复跑 `/ready`、WARCH3 summary-only、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描;默认不写 OA DB、不写企业微信、不创建模板或审批单 |
| `WEXT1LD` | `issues/2026-05-20_18-04-16-wecom-outing-overtime-live-dryrun-gate-v1.csv` | `CURRENT` | 外出/加班 live 前 dry-run gate 已实现:远端只执行 `npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`,固定 `SMOKE002 -> SMOKE101` 与 `WECOM_AGENT_SECRET`;不设置写入环境变量、不带 live 写入参数,dry-run 通过后仍需人工问答批准或暂停 | | `WEXT1LD` | `issues/2026-05-20_18-04-16-wecom-outing-overtime-live-dryrun-gate-v1.csv` | `CURRENT` | 外出/加班 live 前 dry-run gate 已实现:远端只执行 `npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`,固定 `SMOKE002 -> SMOKE101` 与 `WECOM_AGENT_SECRET`;不设置写入环境变量、不带 live 写入参数,dry-run 通过后仍需人工问答批准或暂停 |
| `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、不导入银行流水 | | `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 后置 | | `WROUTE2` | `issues/2026-05-20_20-15-29-wecom-test-account-closeout-to-minimal-mirror-route-v1.csv` | `CURRENT` | 测试号收口到最小完整镜像路线锁定合同已建立:当前先收口 WROAD2/WROAD2-BIZ1/WAPPR1/WRULE1/WAUTO1/WEXT1LD/WFULLSMOKE1/WTCLOSE2,不提前启用真实员工;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,不写企业微信、不启用真实员工 | | `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 问答 | | `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 问答 |
| `WTCLOSE2F` | `issues/2026-05-22_11-10-06-wecom-test-account-closeout-remote-only-v1.csv` | `CURRENT` | WTCLOSE2 远端可信 IP 执行口径修正:企微 API 只能由部署服务器访问,WTCLOSE2 真实运行必须使用 `--remote` 在 server 容器内执行;本地直接执行默认阻断,只保留静态门禁用途 |
| `WREAL1-PREP` | `issues/2026-05-20_14-35-42-wecom-real-trial-prep-v1.csv` | `CURRENT` | 真实小范围试用准备合同:只固化候选员工、非自审审批人、回滚联系人、允许流程、暂停条件和验收标准;当前不启用真实员工,真实试用必须等请假/补卡/外出/加班四类测试号证据、WAPPR1 审批规则门禁和 WFULLSMOKE1 全域主路径可解释通过后再问 | | `WREAL1-PREP` | `issues/2026-05-20_14-35-42-wecom-real-trial-prep-v1.csv` | `CURRENT` | 真实小范围试用准备合同:只固化候选员工、非自审审批人、回滚联系人、允许流程、暂停条件和验收标准;当前不启用真实员工,真实试用必须等请假/补卡/外出/加班四类测试号证据、WAPPR1 审批规则门禁和 WFULLSMOKE1 全域主路径可解释通过后再问 |
旧 Issue CSV 保留为历史审计证据:不删除、不批量回写、不移动到 `docs/archive/` 或其他归档目录。新连续合同如替代旧合同,只在新合同 `Notes` 或文档索引中说明 supersedes。 旧 Issue CSV 保留为历史审计证据:不删除、不批量回写、不移动到 `docs/archive/` 或其他归档目录。新连续合同如替代旧合同,只在新合同 `Notes` 或文档索引中说明 supersedes。
+2 -1
查看文件
@@ -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 测试号最终收口与证据复核 -> 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 执行口径修正 -> WEXT1-LIVE 路线选择(待测试号收口、全域主路径、业务冒烟和规则门禁后另建合同) -> 四类测试号证据和审批规则门禁通过后问答 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` 代表性企业微信真机门禁已完成。
@@ -166,6 +166,7 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
| `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-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、三天业务动作和最终问答 | | `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 问答 | | `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 问答 |
| `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 输出不作为企微业务阻断证据 |
| `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,旧文件保留历史审计语义。
+4 -4
查看文件
@@ -6,7 +6,7 @@
**WTCLOSE1 小团队规则**:公司不到 10 人时,HR/考勤审批先按一层直属主管或指定审批角色自动带出审批人,申请人不能任意改人;主管链缺失、审批人不可见/停用/未绑定或命中自审时,管理员兜底或阻断。当前目标是请假、补卡、外出、加班四类模板均达到 A;本轮自动工作只到 WAUTO1/WFULLSMOKE1 汇总和 WEXT1-LIVE 前 dry-run,不创建企微样件。 **WTCLOSE1 小团队规则**:公司不到 10 人时,HR/考勤审批先按一层直属主管或指定审批角色自动带出审批人,申请人不能任意改人;主管链缺失、审批人不可见/停用/未绑定或命中自审时,管理员兜底或阻断。当前目标是请假、补卡、外出、加班四类模板均达到 A;本轮自动工作只到 WAUTO1/WFULLSMOKE1 汇总和 WEXT1-LIVE 前 dry-run,不创建企微样件。
**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-LIVE、WREAL1 和最小镜像。
**WTCLOSE2 测试号最终收口**:命令为 `bash scripts/qa/run-wecom-test-account-final-closeout.sh`。该脚本复跑 WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1,并汇总 WROAD2/WARCH3 既有报告;WFULLSMOKE1 在该脚本中关闭公网写流程,不新增 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. 适用范围
- 适用于 `small_team_internal` 工作区模式。 - 适用于 `small_team_internal` 工作区模式。
@@ -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 测试号最终收口与证据复核` -> `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 执行口径修正` -> `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 仍排在最小镜像稳定之后。 - WROUTE2/WTCLOSE2 后尾部顺序修正为:`WFULLSMOKE1` -> `WROUTE2` -> `WTCLOSE2` -> `WTCLOSE2F` -> `WEXT1-LIVE` -> `WREAL1(首批 1 名真实员工 + 1 名审批人/管理员观察)` -> `wecom_attendance_approval_mirror_v1 最小完整镜像`;应急接管、恢复回写和 RuleOps 仍排在最小镜像稳定之后。
6. 任何生产写接口、企微规则写入、应急模式开启或恢复回写都必须有单独批准、dry-run 或可审计记录。 6. 任何生产写接口、企微规则写入、应急模式开启或恢复回写都必须有单独批准、dry-run 或可审计记录。
WCPC 配置复跑清单: WCPC 配置复跑清单:
@@ -352,7 +352,7 @@ WROAD2/WARCH3 企微受控上线每日巡检:
19. WEXT1-LIVE 已锁定为外出+加班两类一起创建 OA-POC 测试模板和低风险审批单,固定 `SMOKE002 -> SMOKE101`、`WECOM_AGENT_SECRET` 和双开关;样件保留审计,由 `SMOKE101` 真机确认消息卡片、列表、详情页、按钮风险和审批人是否自动带出。 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,不阻断测试账号受控试用。 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-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。 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。本地直接执行脚本只用于静态门禁,不得作为企微业务证据。
23. WREAL1-PREP/WROUTE2 当前只准备和锁定路线,不要求提供真实员工;后续真实试用必须等请假、补卡、外出、加班四类测试号证据、WAPPR1/WRULE1 审批规则门禁、WTCLOSE2 和 WEXT1-LIVE 可解释通过后再问,首批固定为 1 名真实员工 + 1 名审批人/管理员观察。 23. WREAL1-PREP/WROUTE2 当前只准备和锁定路线,不要求提供真实员工;后续真实试用必须等请假、补卡、外出、加班四类测试号证据、WAPPR1/WRULE1 审批规则门禁、WTCLOSE2 和 WEXT1-LIVE 可解释通过后再问,首批固定为 1 名真实员工 + 1 名审批人/管理员观察。
24. `wecom_attendance_approval_mirror_v1` 最小完整镜像必须等 WREAL1 通过后优先规划;应急接管、恢复写回、RuleOps、图片 OCR、复杂 BPM、预算、ERP 和银行流水导入继续冻结。 24. `wecom_attendance_approval_mirror_v1` 最小完整镜像必须等 WREAL1 通过后优先规划;应急接管、恢复写回、RuleOps、图片 OCR、复杂 BPM、预算、ERP 和银行流水导入继续冻结。
+3 -2
查看文件
@@ -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 测试号最终收口与证据复核` -> `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 执行口径修正` -> `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 打卡只读能力探测。 - 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`。
@@ -442,7 +442,8 @@ WRULE1 不新造 HR/考勤审批引擎,也不读取企微后台规则配置。
WTCLOSE2 是 WEXT1-LIVE 前的最后自动收口。它复跑并汇总 WAUTO1、WFULLSMOKE1、外出/加班 dry-run 和 WRULE1 证据,确认测试号链路是否可解释通过;它不写企业微信、不创建外出/加班模板或审批单、不启用真实员工。 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`。 - 企业微信 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 输出当作企微业务阻断证据。
- WFULLSMOKE1 在 WTCLOSE2 中必须以 `WFULLSMOKE_ALLOW_PUBLIC_WRITES=0` 运行,不新增 OA 测试业务数据。 - WFULLSMOKE1 在 WTCLOSE2 中必须以 `WFULLSMOKE_ALLOW_PUBLIC_WRITES=0` 运行,不新增 OA 测试业务数据。
- 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`。
@@ -0,0 +1,7 @@
"ID","Title","Description","Acceptance","Test_Method","Tools","Dev_Status","Review1_Status","Regression_Status","Files","Dependencies","Notes"
"WTCLOSE2F-0","修正 WTCLOSE2 远端可信 IP 执行口径","修正 WTCLOSE2 的执行边界:企微 API 已限制只能由部署服务器访问,本地不得复跑企微 live/read runner,也不得把本地缺 env/DB 误判为业务阻断。","1) 新合同使用 WTCLOSE2F-0..WTCLOSE2F-5;2) 明确本地只做合同、语法、文档和静态门禁;3) 企微 API、OA 远端归档 DB 和 WTCLOSE2 live/read 收口必须在部署服务器执行;固定 WECOM_AGENT_SECRET,不尝试其他 Secret;权限、可信 IP、模板、env 或可见范围缺口统一记录为 NEEDS_CONFIG 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;4) 旧本地 WTCLOSE2 阻断结论不得作为企微业务阻断事实。","受影响流程:本地门禁 -> 远端可信 IP WTCLOSE2 -> WEXT1-LIVE 问答;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-22_11-10-06-wecom-test-account-closeout-remote-only-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-22_11-10-06-wecom-test-account-closeout-remote-only-v1.csv --profile wecom --json。","python3|node","DONE","DONE","DONE","issues/2026-05-22_11-10-06-wecom-test-account-closeout-remote-only-v1.csv","[]","回滚/清理:恢复本轮合同、脚本和文档改动;不修改远端配置、不写企业微信、不新增 Prisma schema。"
"WTCLOSE2F-1","WTCLOSE2 脚本增加 remote-only 保护","修改 scripts/qa/run-wecom-test-account-final-closeout.sh:默认本地直接执行时拒绝跑企微链路;新增 --remote,经 SSH 到部署服务器后在 server 容器里执行同一脚本。","1) 本地直接执行输出错误并提示 --remote;2) --remote 使用 DEPLOY_SERVER、REMOTE_DIR、REMOTE_ENV_FILE 和 docker compose exec server;3) 远端容器内设置 WTCLOSE2_EXECUTION_MODE=remote;4) summary 记录 executionMode 和 trustedIpBoundary;5) 脚本不新增企微写入开关。","受影响流程:WTCLOSE2 运行入口 -> 部署服务器可信 IP -> 远端 env/DB 证据;验证步骤:bash -n scripts/qa/run-wecom-test-account-final-closeout.sh;bash scripts/qa/run-wecom-test-account-final-closeout.sh --help;本地直接执行应返回非 0 且提示 --remote。","bash|ssh","DONE","DONE","DONE","scripts/qa/run-wecom-test-account-final-closeout.sh","[""WTCLOSE2F-0""]","回滚/清理:恢复脚本;远端 --remote 只执行 dry-run/只读收口,不创建企微模板或审批单。"
"WTCLOSE2F-2","事实源更新远端执行边界","更新路线图、管理员手册、统一审批规约、试运行报告、文档索引、事实源矩阵和项目 skill,固化 WTCLOSE2 必须部署服务器执行。","1) 事实源写清企微 API 受可信 IP 限制;2) WTCLOSE2 命令改为 --remote;3) 本地 WTCLOSE2 只能作为脚本开发/静态检查,不能作为业务证据;4) WEXT1-LIVE 仍需远端 WTCLOSE2 可解释通过和人工确认。","受影响流程:后续执行者读取事实源 -> 正确选择远端运行;验证步骤:rg -n ""WTCLOSE2F|trusted IP|可信 IP|--remote|本地不得"" 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","[""WTCLOSE2F-1""]","回滚/清理:恢复本轮文档和 skill 改动;不修改历史事实源之外的业务代码。"
"WTCLOSE2F-3","只读 reviewer 审查远端门禁","审批规则和 WEXT1-LIVE/WREAL1 准入属于高风险治理项,修正后由只读 reviewer 检查是否仍可能误用本地结果。","1) reviewer 只读;2) 审查本地执行是否默认阻断;3) 审查 --remote 是否仍保持不写企微、不启用真实员工;4) 审查文档是否明确旧本地结果不可作为业务阻断;5) blocker 必须修复。","受影响流程:脚本/文档修正 -> 独立评审 -> 门禁回填;验证步骤:reviewer subagent 输出无 blocker 或 blocker 已处理。","subagent|manual","DONE","DONE","DONE","N/A","[""WTCLOSE2F-2""]","回滚/清理:reviewer 不修改文件;如发现风险,暂停 WEXT1-LIVE/WREAL1。reviewer 无 blocker;旧路线句和归档写库口径已按意见修正。"
"WTCLOSE2F-4","本地静态门禁复跑","复跑合同、process gate、脚本语法、文档审计、skill 校验、diff 检查和最小回归,确认修正不破坏现有系统。","1) validate_issues_csv 通过;2) process gate baseline 与 issue-specific 通过;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-wecom-test-account-final-closeout.sh;bash scripts/check-minimal.sh。","python3|node|bash|git","DONE","DONE","DONE","scripts/qa/run-wecom-test-account-final-closeout.sh|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md","[""WTCLOSE2F-3""]","回滚/清理:若门禁失败,恢复本轮改动或保留 TODO;不部署。"
"WTCLOSE2F-5","提交远端执行口径修正","回填 WTCLOSE2F 状态并中文提交。远端实际 WTCLOSE2 运行需在部署同步后另行执行,不在本地伪造。","1) CSV 状态回填;2) git diff --check 通过;3) 中文提交包含 WTCLOSE2F;4) 最终说明本轮未部署,远端执行需先 SYNC_ENV=0 部署或确认远端代码已同步。","受影响流程:提交 -> 后续部署/远端 WTCLOSE2 问答;验证步骤:git status --short;git log -1 --oneline。","git","DONE","DONE","DONE","issues/2026-05-22_11-10-06-wecom-test-account-closeout-remote-only-v1.csv|scripts/qa/run-wecom-test-account-final-closeout.sh|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md","[""WTCLOSE2F-4""]","回滚/清理:revert 本提交;远端部署和远端 WTCLOSE2 执行需单独确认。本轮未部署、未远端执行业务证据。"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 WTCLOSE2F-0 修正 WTCLOSE2 远端可信 IP 执行口径 修正 WTCLOSE2 的执行边界:企微 API 已限制只能由部署服务器访问,本地不得复跑企微 live/read runner,也不得把本地缺 env/DB 误判为业务阻断。 1) 新合同使用 WTCLOSE2F-0..WTCLOSE2F-5;2) 明确本地只做合同、语法、文档和静态门禁;3) 企微 API、OA 远端归档 DB 和 WTCLOSE2 live/read 收口必须在部署服务器执行;固定 WECOM_AGENT_SECRET,不尝试其他 Secret;权限、可信 IP、模板、env 或可见范围缺口统一记录为 NEEDS_CONFIG 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;4) 旧本地 WTCLOSE2 阻断结论不得作为企微业务阻断事实。 受影响流程:本地门禁 -> 远端可信 IP WTCLOSE2 -> WEXT1-LIVE 问答;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-22_11-10-06-wecom-test-account-closeout-remote-only-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-22_11-10-06-wecom-test-account-closeout-remote-only-v1.csv --profile wecom --json。 python3|node DONE DONE DONE issues/2026-05-22_11-10-06-wecom-test-account-closeout-remote-only-v1.csv [] 回滚/清理:恢复本轮合同、脚本和文档改动;不修改远端配置、不写企业微信、不新增 Prisma schema。
3 WTCLOSE2F-1 WTCLOSE2 脚本增加 remote-only 保护 修改 scripts/qa/run-wecom-test-account-final-closeout.sh:默认本地直接执行时拒绝跑企微链路;新增 --remote,经 SSH 到部署服务器后在 server 容器里执行同一脚本。 1) 本地直接执行输出错误并提示 --remote;2) --remote 使用 DEPLOY_SERVER、REMOTE_DIR、REMOTE_ENV_FILE 和 docker compose exec server;3) 远端容器内设置 WTCLOSE2_EXECUTION_MODE=remote;4) summary 记录 executionMode 和 trustedIpBoundary;5) 脚本不新增企微写入开关。 受影响流程:WTCLOSE2 运行入口 -> 部署服务器可信 IP -> 远端 env/DB 证据;验证步骤:bash -n scripts/qa/run-wecom-test-account-final-closeout.sh;bash scripts/qa/run-wecom-test-account-final-closeout.sh --help;本地直接执行应返回非 0 且提示 --remote。 bash|ssh DONE DONE DONE scripts/qa/run-wecom-test-account-final-closeout.sh ["WTCLOSE2F-0"] 回滚/清理:恢复脚本;远端 --remote 只执行 dry-run/只读收口,不创建企微模板或审批单。
4 WTCLOSE2F-2 事实源更新远端执行边界 更新路线图、管理员手册、统一审批规约、试运行报告、文档索引、事实源矩阵和项目 skill,固化 WTCLOSE2 必须部署服务器执行。 1) 事实源写清企微 API 受可信 IP 限制;2) WTCLOSE2 命令改为 --remote;3) 本地 WTCLOSE2 只能作为脚本开发/静态检查,不能作为业务证据;4) WEXT1-LIVE 仍需远端 WTCLOSE2 可解释通过和人工确认。 受影响流程:后续执行者读取事实源 -> 正确选择远端运行;验证步骤:rg -n "WTCLOSE2F|trusted IP|可信 IP|--remote|本地不得" 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 ["WTCLOSE2F-1"] 回滚/清理:恢复本轮文档和 skill 改动;不修改历史事实源之外的业务代码。
5 WTCLOSE2F-3 只读 reviewer 审查远端门禁 审批规则和 WEXT1-LIVE/WREAL1 准入属于高风险治理项,修正后由只读 reviewer 检查是否仍可能误用本地结果。 1) reviewer 只读;2) 审查本地执行是否默认阻断;3) 审查 --remote 是否仍保持不写企微、不启用真实员工;4) 审查文档是否明确旧本地结果不可作为业务阻断;5) blocker 必须修复。 受影响流程:脚本/文档修正 -> 独立评审 -> 门禁回填;验证步骤:reviewer subagent 输出无 blocker 或 blocker 已处理。 subagent|manual DONE DONE DONE N/A ["WTCLOSE2F-2"] 回滚/清理:reviewer 不修改文件;如发现风险,暂停 WEXT1-LIVE/WREAL1。reviewer 无 blocker;旧路线句和归档写库口径已按意见修正。
6 WTCLOSE2F-4 本地静态门禁复跑 复跑合同、process gate、脚本语法、文档审计、skill 校验、diff 检查和最小回归,确认修正不破坏现有系统。 1) validate_issues_csv 通过;2) process gate baseline 与 issue-specific 通过;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-wecom-test-account-final-closeout.sh;bash scripts/check-minimal.sh。 python3|node|bash|git DONE DONE DONE scripts/qa/run-wecom-test-account-final-closeout.sh|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md ["WTCLOSE2F-3"] 回滚/清理:若门禁失败,恢复本轮改动或保留 TODO;不部署。
7 WTCLOSE2F-5 提交远端执行口径修正 回填 WTCLOSE2F 状态并中文提交。远端实际 WTCLOSE2 运行需在部署同步后另行执行,不在本地伪造。 1) CSV 状态回填;2) git diff --check 通过;3) 中文提交包含 WTCLOSE2F;4) 最终说明本轮未部署,远端执行需先 SYNC_ENV=0 部署或确认远端代码已同步。 受影响流程:提交 -> 后续部署/远端 WTCLOSE2 问答;验证步骤:git status --short;git log -1 --oneline。 git DONE DONE DONE issues/2026-05-22_11-10-06-wecom-test-account-closeout-remote-only-v1.csv|scripts/qa/run-wecom-test-account-final-closeout.sh|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md ["WTCLOSE2F-4"] 回滚/清理:revert 本提交;远端部署和远端 WTCLOSE2 执行需单独确认。本轮未部署、未远端执行业务证据。
@@ -9,6 +9,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-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
restricted by trusted IP. Local execution is intentionally blocked unless
WTCLOSE2_ALLOW_LOCAL_RUN=1 is set for script development only.
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' WTCLOSE2_EXECUTION_MODE=remote bash scripts/qa/run-wecom-test-account-final-closeout.sh"
REMOTE
}
case "${1:-}" in
--remote)
run_remote
exit $?
;;
--help|-h)
usage
exit 0
;;
"")
;;
*)
printf '[wtclose2][ERROR] unknown argument: %s\n' "$1" >&2
usage >&2
exit 2
;;
esac
if [[ "${WTCLOSE2_EXECUTION_MODE:-}" != "remote" && "${WTCLOSE2_ALLOW_LOCAL_RUN:-0}" != "1" ]]; then
printf '[wtclose2][ERROR] Enterprise WeChat API 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"
@@ -151,7 +208,7 @@ run_wrule1() {
} }
run_privacy_smoke() { 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 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|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 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 local matches
matches="$(grep -RInEi "$sensitive_pattern" "$REPORT_DIR" | grep -vE 'HRWDTEST-[0-9]{14}' | grep -vEi "$safe_metadata_pattern" || true)" matches="$(grep -RInEi "$sensitive_pattern" "$REPORT_DIR" | grep -vE 'HRWDTEST-[0-9]{14}' | grep -vEi "$safe_metadata_pattern" || true)"
@@ -282,6 +339,8 @@ const summary = {
conclusion: status, conclusion: status,
baseURL, baseURL,
commit, commit,
executionMode: process.env.WTCLOSE2_EXECUTION_MODE || "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: {