WAUTO1 WEXT1LD 增加受控试用自动证据汇总

这个提交包含在:
2026-05-20 18:45:26 +08:00
父节点 15e665d91e
当前提交 dcb6913e2f
共修改 9 个文件,包含 386 行新增和 29 行删除
+6 -6
查看文件
@@ -17,11 +17,11 @@ Read only what is relevant:
- For approval workflow, roles, self-approval, notification, deeplink, reminder, or escalation work, read `docs/需求-统一审批中心规约.md`. - For approval workflow, roles, self-approval, notification, deeplink, reminder, or escalation work, read `docs/需求-统一审批中心规约.md`.
- For HR lifecycle, employee onboarding/offboarding, Enterprise WeChat directory sync, account disablement, or Enterprise WeChat API work, read `docs/需求-企业微信基础设施规约.md`, `docs/企微API能力目录.md`, `docs/管理员手册.md`, and the latest HCLT/HRWD/WAPI/WRRA Issue CSV evidence first. - For HR lifecycle, employee onboarding/offboarding, Enterprise WeChat directory sync, account disablement, or Enterprise WeChat API work, read `docs/需求-企业微信基础设施规约.md`, `docs/企微API能力目录.md`, `docs/管理员手册.md`, and the latest HCLT/HRWD/WAPI/WRRA Issue CSV evidence first.
- For any Enterprise WeChat capability, Secret, callback, approval, check-in, HR assistant, or contact-directory task, read `docs/企微API能力目录.md` before planning or coding. WAPI fixes the current Secret matrix: contacts use `WECOM_CONTACT_SECRET`; workbench/OAuth/messages/HR assistant/roster/check-in/approval use `WECOM_AGENT_SECRET`; `WECOM_CHECKIN_SECRET` is only an explicit check-in override; `WECOM_HR_ASSISTANT_SECRET` is historical compatibility and not a default. Do not write runtime code that tries multiple Secrets to guess the correct one. - For any Enterprise WeChat capability, Secret, callback, approval, check-in, HR assistant, or contact-directory task, read `docs/企微API能力目录.md` before planning or coding. WAPI fixes the current Secret matrix: contacts use `WECOM_CONTACT_SECRET`; workbench/OAuth/messages/HR assistant/roster/check-in/approval use `WECOM_AGENT_SECRET`; `WECOM_CHECKIN_SECRET` is only an explicit check-in override; `WECOM_HR_ASSISTANT_SECRET` is historical compatibility and not a default. Do not write runtime code that tries multiple Secrets to guess the correct one.
- For Enterprise WeChat-first HR/attendance runtime migration, read `docs/企微优先开发路线图.md` before planning or coding. WDRG makes the roadmap authoritative for stage order; WAPI adds the runtime-first stage before deep mirror work; WRRA states that WOUA `PASS_WITH_FINDINGS` does not clear deep mirror work; WOUA-FIX has now soft-archived the 7 OA active test accounts missing in WeCom, fixed the `T0000` seed reactivation behavior, transferred the `SMOKE201` test-manager side effects, and rerun WOUA with `oaActiveMissingInWecom=0`. WCPC has rerun the capability POC with an existing active test account and reached `GO_TO_HR_MASTER_SYNC`; WHMS/WHMSLIVE has implemented, deployed, and publicly verified `wecom_hr_master_sync_v1`, with the production flag restored to `force_off` and production real-employee batch apply not approved. WMSG1 proves real app-message delivery and Deeplink return only; WAPC1 fixes the approval configuration preparation checklist before mirror work; WAPC2 adds the leave/missed-punch approval template and low-risk `sp_no` read-only POC runner. WPROC1/WPROC2 fixed the engineering process gate; WEGOV1 is the route gate, and WACP3R has now rerun the compensation-pull POC by automatically discovering OA-POC leave/missed-punch template IDs from `SMOKE002` creator. Public report `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` is `PASS_WITH_FINDINGS`: compensation pull and detail read work, with finding that callback evidence files are not persisted across deploys. WREAD1/WREAD1F have now completed real-device readability confirmation for leave and missed-punch: public report `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` is `PASS_READABLE`; the user confirmed cards/lists/details are readable, reject has second confirmation, and approve is single-tap. WADM1 has completed the self-owned archive/mirror data-model design. WARCH1 has implemented and publicly verified the minimum leave/missed-punch archive slice: Prisma archive/callback/compensation/finding tables, callback DB persistence with non-200 retry on DB failure, compensation persistence behind `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1`, and offline `npm run check:wecom-approval-archive`; public reports `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` and `/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` are `PASS_WITH_FINDINGS`, with 2 archived histories readable and only a historical pre-WARCH1 callback gap finding. WARCH2 has now added the formal OA read-only archive API/page: `/api/wecom/approval-archive`, `/wecom-approval-archive`, and `/mobile/wecom-approval-archive` read OA DB only, do not call WeCom API or read WeCom Secrets, and enforce self/direct-report/HR-admin visibility with unmapped applicant records HR/admin-only. WROAD2+OPS is the controlled launch gate: use test accounts `SMOKE002 -> SMOKE101`, observe/admin-alert via employee_no `HYD000006` (the employee id for `wangshunli`), run daily checks for 3 days, allow only compensation archive writes to OA DB via `WECOM_ARCHIVE_WRITE=1`, and do not create WeCom templates/approvals, write WeCom, or expand real users. Day 0 public report `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` is `PASS_WITH_FINDINGS`: WeCom runtime, compensation archive persistence, offline archive read, and privacy smoke pass; findings are missing live-smoke login credentials/pending OCR subcheck and historical callback gap. It still does not implement full mirror, outing/overtime live, emergency mode, writeback, or RuleOps. WPROC2 adds the executable `process gate`: before WAPC2F or other high-risk WeCom work, run `node scripts/qa/check-process-contract.mjs --baseline` and the issue-specific profile check to enforce DoR/DoD, fixed Secret source, non-self approval, live write switches, missing-config classification, and redaction boundaries. Do not start `wecom_attendance_approval_mirror_v1`, `oa_hr_emergency_mode_v1`, `wecom_recovery_writeback_v1`, or `wecom_ruleops_v1` without WROAD2-CLOSEOUT, WROAD2-BIZ1, WAPPR1, WEXT1-LIVE, WREAL1 question gates or explicit approval, and the next stage's own Issue CSV and acceptance gates. - For Enterprise WeChat-first HR/attendance runtime migration, read `docs/企微优先开发路线图.md` before planning or coding. WDRG makes the roadmap authoritative for stage order; WAPI adds the runtime-first stage before deep mirror work; WRRA states that WOUA `PASS_WITH_FINDINGS` does not clear deep mirror work; WOUA-FIX has now soft-archived the 7 OA active test accounts missing in WeCom, fixed the `T0000` seed reactivation behavior, transferred the `SMOKE201` test-manager side effects, and rerun WOUA with `oaActiveMissingInWecom=0`. WCPC has rerun the capability POC with an existing active test account and reached `GO_TO_HR_MASTER_SYNC`; WHMS/WHMSLIVE has implemented, deployed, and publicly verified `wecom_hr_master_sync_v1`, with the production flag restored to `force_off` and production real-employee batch apply not approved. WMSG1 proves real app-message delivery and Deeplink return only; WAPC1 fixes the approval configuration preparation checklist before mirror work; WAPC2 adds the leave/missed-punch approval template and low-risk `sp_no` read-only POC runner. WPROC1/WPROC2 fixed the engineering process gate; WEGOV1 is the route gate, and WACP3R has now rerun the compensation-pull POC by automatically discovering OA-POC leave/missed-punch template IDs from `SMOKE002` creator. Public report `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T115944Z/summary.json` is `PASS_WITH_FINDINGS`: compensation pull and detail read work, with finding that callback evidence files are not persisted across deploys. WREAD1/WREAD1F have now completed real-device readability confirmation for leave and missed-punch: public report `/app/artifacts/qa-flow/wecom-approval-readability-gate-20260519T133628Z/summary.json` is `PASS_READABLE`; the user confirmed cards/lists/details are readable, reject has second confirmation, and approve is single-tap. WADM1 has completed the self-owned archive/mirror data-model design. WARCH1 has implemented and publicly verified the minimum leave/missed-punch archive slice: Prisma archive/callback/compensation/finding tables, callback DB persistence with non-200 retry on DB failure, compensation persistence behind `--persist-to-db` + `WECOM_ARCHIVE_WRITE=1`, and offline `npm run check:wecom-approval-archive`; public reports `/app/artifacts/qa-flow/wecom-approval-compensation-poc-20260519T160306Z/summary.json` and `/app/artifacts/qa-flow/wecom-approval-archive-20260519T160330Z/summary.json` are `PASS_WITH_FINDINGS`, with 2 archived histories readable and only a historical pre-WARCH1 callback gap finding. WARCH2 has now added the formal OA read-only archive API/page: `/api/wecom/approval-archive`, `/wecom-approval-archive`, and `/mobile/wecom-approval-archive` read OA DB only, do not call WeCom API or read WeCom Secrets, and enforce self/direct-report/HR-admin visibility with unmapped applicant records HR/admin-only. WROAD2+OPS is the controlled launch gate: use test accounts `SMOKE002 -> SMOKE101`, observe/admin-alert via employee_no `HYD000006` (the employee id for `wangshunli`), run daily checks for 3 days, allow only compensation archive writes to OA DB via `WECOM_ARCHIVE_WRITE=1`, and do not create WeCom templates/approvals, write WeCom, or expand real users. Day 0 public report `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` is `PASS_WITH_FINDINGS`: WeCom runtime, compensation archive persistence, offline archive read, and privacy smoke pass; findings are missing live-smoke login credentials/pending OCR subcheck and historical callback gap. It still does not implement full mirror, outing/overtime live, emergency mode, writeback, or RuleOps. WAUTO1 adds `scripts/qa/collect-wecom-controlled-trial-evidence.sh` for read-only controlled-trial evidence aggregation; it must not set `WECOM_ARCHIVE_WRITE=1`, `WECOM_CHECKIN_ARCHIVE_WRITE=1`, or `WECOM_APPROVAL_FIXTURE_WRITE=1`. WEXT1LD is the outing/overtime live-before dry-run gate and does not authorize live fixture creation. WPROC2 adds the executable `process gate`: before WAPC2F or other high-risk WeCom work, run `node scripts/qa/check-process-contract.mjs --baseline` and the issue-specific profile check to enforce DoR/DoD, fixed Secret source, non-self approval, live write switches, missing-config classification, and redaction boundaries. Do not start `wecom_attendance_approval_mirror_v1`, `oa_hr_emergency_mode_v1`, `wecom_recovery_writeback_v1`, or `wecom_ruleops_v1` without WROAD2-CLOSEOUT, WROAD2-BIZ1, WAPPR1, WAUTO1/WEXT1LD evidence, WEXT1-LIVE, WREAL1 question gates or explicit approval, and the next stage's own Issue CSV and acceptance gates.
- WARCH3/WCHECK1/WEXT1 update the route after WROAD2 Day 0: WARCH3 adds `scripts/qa/run-warch3-ops-daily.sh`, `deploy/trialrun/install-warch3-ops-timer.sh`, and `npm run send:wecom-ops-alert` for 07:30 systemd巡检和脱敏企微告警;public report `/app/artifacts/qa-flow/warch3-ops-20260520-054841/summary.json` is `PASS_WITH_FINDINGS`, and WOPS1 now fixes alert noise: default recipient is `HYD000006` (the employee_no for `wangshunli`), repeated known findings are skipped via `artifacts/qa-flow/warch3-ops-alert-state.json`, and only blocked/failure/new-finding/status-worsening/force sends a message. WOPS1 public rerun `/app/artifacts/qa-flow/warch3-ops-20260520-070731/summary.json` is `PASS_WITH_FINDINGS`, and alert report `/app/artifacts/qa-flow/wecom-ops-alert-20260520T070740Z/summary.json` is `PASS_ALERT_SKIPPED_NO_FINDINGS` with `no_new_findings_or_status_worsening`. WCHECK1 adds `npm run check:wecom-checkin-summary-archive`, daily/monthly check-in summaries, and rule snapshots with `--persist-to-db` + `WECOM_CHECKIN_ARCHIVE_WRITE=1` as the only OA DB write gate; public reports `/app/artifacts/qa-flow/wecom-checkin-summary-archive-20260520T054907Z/summary.json` and `/app/artifacts/qa-flow/wecom-checkin-summary-archive-20260520T054926Z/summary.json` are `PASS_CHECKIN_ARCHIVE_READY` and `PASS_CHECKIN_ARCHIVE_OFFLINE_READY`. WEXT1 only extends approval fixtures for `--target=outing --target=overtime` dry-run; public report `/app/artifacts/qa-flow/wecom-approval-fixtures-20260520T054940Z/summary.json` is `PASS_FIXTURE_DRY_RUN_READY`. These stages still do not create outing/overtime WeCom templates/approvals, expand real users, or implement full mirror/emergency/writeback/RuleOps. WEXT1-LIVE needs WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1, a new Issue CSV, and explicit approval; WREAL1 real users are asked only after leave, missed punch, outing, and overtime test-account evidence plus approver-rule gate pass. - WARCH3/WCHECK1/WEXT1 update the route after WROAD2 Day 0: WARCH3 adds `scripts/qa/run-warch3-ops-daily.sh`, `deploy/trialrun/install-warch3-ops-timer.sh`, and `npm run send:wecom-ops-alert` for 07:30 systemd巡检和脱敏企微告警;public report `/app/artifacts/qa-flow/warch3-ops-20260520-054841/summary.json` is `PASS_WITH_FINDINGS`, and WOPS1 now fixes alert noise: default recipient is `HYD000006` (the employee_no for `wangshunli`), repeated known findings are skipped via `artifacts/qa-flow/warch3-ops-alert-state.json`, and only blocked/failure/new-finding/status-worsening/force sends a message. WOPS1 public rerun `/app/artifacts/qa-flow/warch3-ops-20260520-070731/summary.json` is `PASS_WITH_FINDINGS`, and alert report `/app/artifacts/qa-flow/wecom-ops-alert-20260520T070740Z/summary.json` is `PASS_ALERT_SKIPPED_NO_FINDINGS` with `no_new_findings_or_status_worsening`. WCHECK1 adds `npm run check:wecom-checkin-summary-archive`, daily/monthly check-in summaries, and rule snapshots with `--persist-to-db` + `WECOM_CHECKIN_ARCHIVE_WRITE=1` as the only OA DB write gate; public reports `/app/artifacts/qa-flow/wecom-checkin-summary-archive-20260520T054907Z/summary.json` and `/app/artifacts/qa-flow/wecom-checkin-summary-archive-20260520T054926Z/summary.json` are `PASS_CHECKIN_ARCHIVE_READY` and `PASS_CHECKIN_ARCHIVE_OFFLINE_READY`. WEXT1 only extends approval fixtures for `--target=outing --target=overtime` dry-run; public report `/app/artifacts/qa-flow/wecom-approval-fixtures-20260520T054940Z/summary.json` is `PASS_FIXTURE_DRY_RUN_READY`. WAUTO1/WEXT1LD now add a read-only evidence aggregation script and a live-before dry-run contract; neither creates outing/overtime WeCom templates/approvals, expands real users, or implements full mirror/emergency/writeback/RuleOps. WEXT1-LIVE needs WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1/WAUTO1/WEXT1LD, a new Issue CSV, and explicit approval; WREAL1 real users are asked only after leave, missed punch, outing, and overtime test-account evidence plus approver-rule gate pass.
- WROAD2-BIZ1/WAPPR1 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. Do not start WEXT1-LIVE, WREAL1, deep mirror, emergency, writeback, or RuleOps until WROAD2-CLOSEOUT, WROAD2-BIZ1, WAPPR1, WEXT1-LIVE, and the relevant question gates or explicit approval are complete. - WROAD2-BIZ1/WAPPR1 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. WAUTO1 can automate evidence collection, 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, WAUTO1/WEXT1LD, WEXT1-LIVE, and the relevant question gates or explicit approval are complete.
- 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, 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, WAUTO1/WEXT1LD, 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`.
- For local/WeCom/public trial-run, OCR runtime, Caddy, or DB drift work, read `docs/试运行与自动化验证手册.md` and `references/trialrun.md`. - For local/WeCom/public trial-run, OCR runtime, Caddy, or DB drift work, read `docs/试运行与自动化验证手册.md` and `references/trialrun.md`.
- For how this skill should evolve, read `docs/Agent开发交付实践.md`. - For how this skill should evolve, read `docs/Agent开发交付实践.md`.
@@ -110,8 +110,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 审批规则规范化 -> WEXT1-LIVE 外出/加班测试号 live POC -> 四类测试号证据和审批规则门禁通过后问答 WREAL1 小范围真实试用 -> 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 as permission to live-create outing/overtime templates or approvals; that needs a new Issue CSV and 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 审批规则规范化 -> WAUTO1 自动证据汇总 -> WEXT1LD 外出/加班 live 前 dry-run -> WEXT1-LIVE 外出/加班测试号 live POC -> 四类测试号证据和审批规则门禁通过后问答 WREAL1 小范围真实试用 -> 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 or WEXT1LD 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 审批规则规范化 -> WEXT1-LIVE 外出/加班测试号 live POC -> 四类测试号证据和审批规则门禁通过后问答 WREAL1 小范围真实试用 -> wecom_attendance_approval_mirror_v1`. WREAL1-PREP only prepared the checklist and does not enable real employees. Do not treat WEXT1 dry-run as permission to live-create outing/overtime templates or approvals; that needs a new Issue CSV and explicit user approval. - Current post-WROAD2 route wording is: `WOPS1 巡检告警降噪 -> WROAD2-CLOSEOUT 三天验收 -> WROAD2-BIZ1 三天业务冒烟 -> WAPPR1 审批规则规范化 -> WAUTO1 自动证据汇总 -> WEXT1LD 外出/加班 live 前 dry-run -> WEXT1-LIVE 外出/加班测试号 live POC -> 四类测试号证据和审批规则门禁通过后问答 WREAL1 小范围真实试用 -> wecom_attendance_approval_mirror_v1`. WREAL1-PREP only prepared the checklist and does not enable real employees. Do not treat WEXT1 dry-run or WEXT1LD 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
查看文件
@@ -482,6 +482,17 @@ Go 结论边界:
三天验收结束后的人工问答选项固定为:进入 WEXT1-LIVE、先处理指定 finding、或暂停。外出/加班 live 写入前必须再次说明当前状态、改了什么、测了什么、结果是什么和会留下什么企微记录;四类测试号证据和 WAPPR1 审批规则门禁通过后,再问是否进入真实小范围试用。 三天验收结束后的人工问答选项固定为:进入 WEXT1-LIVE、先处理指定 finding、或暂停。外出/加班 live 写入前必须再次说明当前状态、改了什么、测了什么、结果是什么和会留下什么企微记录;四类测试号证据和 WAPPR1 审批规则门禁通过后,再问是否进入真实小范围试用。
## WAUTO1 / WEXT1LD 自动证据汇总与 live 前 dry-run
执行时间:2026-05-20。本轮不写企业微信、不启用真实员工,先把三天受控试用证据汇总、WAPPR1 人工确认清单和外出/加班 live 前 dry-run 脚本化。
| 项 | 当前结果 | 证据和边界 |
| --- | --- | --- |
| WAUTO1 自动证据汇总 | 远端 `PAUSED_MANUAL_CONFIRMATION` | 新增 `scripts/qa/collect-wecom-controlled-trial-evidence.sh`,汇总 WROAD2/WARCH3/WCHECK1/WROAD2-BIZ1/WAPPR1/WEXT1 dry-run 证据,复跑公网 `/ready`、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描。公网报告 `/app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-103617/summary.json`:`/ready` 通过,外出/加班 dry-run 通过,审批补偿和归档离线为 `PASS_WITH_FINDINGS`,WARCH3 历史 summary 在容器内不可见记为人工缺口;脚本默认不设置 `WECOM_ARCHIVE_WRITE=1`、`WECOM_CHECKIN_ARCHIVE_WRITE=1` 或 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不写 OA DB、不写企业微信、不创建模板或审批单。 |
| WAPPR1 人工确认模板 | 已补充 | 请假、补卡、外出、加班逐模板确认:A 审批人自动带出且申请人不能任意选择;B 默认带出但申请人仍可改人;C 必须申请人手选审批人;D 当前看不到或模板未配置。B/C/D 均不得直接进入真实员工试用。不要记录 Secret、token、完整 userid、完整审批单号、完整 template_id、表单值、附件、评论或原始 payload。 |
| WEXT1LD 外出/加班 dry-run gate | 远端 dry-run 通过 | 远端只执行 `npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`,不带 live 写入参数,不设置写入环境变量。报告 `/app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-103617/wecom-approval-fixtures-dryrun/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`,且 `liveWrite.requested=false`、`liveWrite.allowed=false`。dry-run 通过后,仍需问答选择:批准一次 live 创建外出+加班 OA-POC 样件、只保留 dry-run、或外出/加班移出 V1。 |
| 后续人工问答 | 待三天汇总 | 三天汇总后选项固定为:接受 `PASS_AUTO_EVIDENCE_READY` 并进入 WEXT1-LIVE live 问答;接受 `PASS_WITH_FINDINGS` 但先处理指定 finding;暂停,不进入外出/加班 live 或真实试用。 |
## 历史恢复 ## 历史恢复
需要追溯 R70-R91 的详细流水时,使用: 需要追溯 R70-R91 的详细流水时,使用:
+20 -12
查看文件
@@ -2,10 +2,10 @@
**文档状态**:当前开发路线图事实源。 **文档状态**:当前开发路线图事实源。
**分类**:开发治理 / 路线图。 **分类**:开发治理 / 路线图。
**适用时间**: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 / 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 / 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,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,WREAL1P`。
**最近审计**:2026-05-20。 **最近审计**:2026-05-20。
**不得误读**:本文只控制后续开发节奏、阶段顺序和门禁。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。WREAL1-PREP 只准备真实小范围试用清单,不启用真实员工;后续顺序收紧为 WROAD2-CLOSEOUT 三天验收 -> WROAD2-BIZ1 三天业务冒烟 -> WAPPR1 审批规则规范化 -> 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 创建。WREAL1-PREP 只准备真实小范围试用清单,不启用真实员工;后续顺序收紧为 WROAD2-CLOSEOUT 三天验收 -> WROAD2-BIZ1 三天业务冒烟 -> WAPPR1 审批规则规范化 -> WAUTO1 自动证据汇总 -> WEXT1LD 外出/加班 live 前 dry-run -> WEXT1-LIVE 外出/加班测试号 live POC -> 请假/补卡/外出/加班四类测试号证据和审批规则门禁通过后再问真实小范围试用。上述阶段仍不代表完整深度镜像、应急接管、恢复回写或 RuleOps 已完成。
## 1. 路线图原则 ## 1. 路线图原则
@@ -15,9 +15,11 @@
- WEGOV1 后固定四域边界:企微主办域为打卡、请假、补卡、外出、加班、假期余额和人事助手;OA 主办域为报销、采购、合同、项目、付款、发票、银行回单、高敏附件和经营审计;OA 留存域保存企微关键历史和完整外部关联键;OA 应急域只在企微不可用时由管理员人工开启。 - WEGOV1 后固定四域边界:企微主办域为打卡、请假、补卡、外出、加班、假期余额和人事助手;OA 主办域为报销、采购、合同、项目、付款、发票、银行回单、高敏附件和经营审计;OA 留存域保存企微关键历史和完整外部关联键;OA 应急域只在企微不可用时由管理员人工开启。
- OA 不重造企业微信完整打卡、考勤和 HR 产品;V1 目标是企微不可用时可以查看已保存历史,不是完整替代企微继续办理。 - OA 不重造企业微信完整打卡、考勤和 HR 产品;V1 目标是企微不可用时可以查看已保存历史,不是完整替代企微继续办理。
- WROAD2 后“可受控使用”和“完整镜像增强”分离:请假/补卡已归档历史可在 OA 查询,先用测试账号做 3 天每日脚本化巡检;完整镜像、应急接管、恢复回写和 RuleOps 继续后置。 - WROAD2 后“可受控使用”和“完整镜像增强”分离:请假/补卡已归档历史可在 OA 查询,先用测试账号做 3 天每日脚本化巡检;完整镜像、应急接管、恢复回写和 RuleOps 继续后置。
- 外出/加班不作为当前受控上线阻断;`WEXT1` dry-run 已完成,live 创建必须在 WROAD2-CLOSEOUT、WROAD2-BIZ1 和 WAPPR1 结论可接受后另建 `WEXT1-LIVE` 合同并再次人工确认。 - 外出/加班不作为当前受控上线阻断;`WEXT1` dry-run 已完成,live 创建必须在 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WAUTO1 和 WEXT1LD 结论可接受后另建 `WEXT1-LIVE` 合同并再次人工确认。
- WOPS1 后巡检告警采用“状态记忆 + 新增异常”策略:既有 `PASS_WITH_FINDINGS` observation 进入基线后不重复发企微消息;只有 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`、脚本失败、新增 finding、状态恶化或人工 `--force` 才发送脱敏告警。 - WOPS1 后巡检告警采用“状态记忆 + 新增异常”策略:既有 `PASS_WITH_FINDINGS` observation 进入基线后不重复发企微消息;只有 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`、脚本失败、新增 finding、状态恶化或人工 `--force` 才发送脱敏告警。
- WREAL1-PREP 只做真实小范围试用准备,当前继续测试账号;真实员工名单、试用周期、回滚联系人和验收标准必须等 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WEXT1-LIVE、四类测试号证据和审批规则门禁通过后再通过问答确认。 - 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`;通过后仍只进入人工问答。
- WREAL1-PREP 只做真实小范围试用准备,当前继续测试账号;真实员工名单、试用周期、回滚联系人和验收标准必须等 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WAUTO1/WEXT1LD、WEXT1-LIVE、四类测试号证据和审批规则门禁通过后再通过问答确认。
- 企业微信自建应用不按完整隔离 sandbox 处理;后续默认使用真实企业内受控测试域、本地 synthetic 自动测试、公网 live runner 和少量真机确认。 - 企业微信自建应用不按完整隔离 sandbox 处理;后续默认使用真实企业内受控测试域、本地 synthetic 自动测试、公网 live runner 和少量真机确认。
- 阶段未满足退出条件前不得跳阶段。线上缺陷、安全风险、正式使用阻断或真实反馈可以另开独立 Issue CSV,但不得混入企微 HR/考勤主路线。 - 阶段未满足退出条件前不得跳阶段。线上缺陷、安全风险、正式使用阻断或真实反馈可以另开独立 Issue CSV,但不得混入企微 HR/考勤主路线。
- ERP 未来不接入 OA;真实支付、图片 OCR、银行流水导入、复杂 BPM、审批设计器、重预算和其他 P2 大功能继续冻结,试用期只处理阻断和真实反馈。 - ERP 未来不接入 OA;真实支付、图片 OCR、银行流水导入、复杂 BPM、审批设计器、重预算和其他 P2 大功能继续冻结,试用期只处理阻断和真实反馈。
@@ -56,11 +58,13 @@
| `WROAD2+OPS` | 受控上线和每日巡检 Day 0 已完成 | 当前进入测试账号受控上线:范围固定 `SMOKE002 -> SMOKE101`,管理员观察和告警员工号固定 `HYD000006`,即管理员 `wangshunli` 的 employee_no;脚本不再把姓名字符串 `wangshunli` 当员工号。试用 3 天,每日触发一键巡检脚本。巡检复用 `/ready`、live smoke、feature flag、企微 runtime、审批补偿和 OA 归档离线读取;仅补偿归档步骤可用进程级 `WECOM_ARCHIVE_WRITE=1` 写 OA 自建留存库,不写企业微信、不创建模板或审批单。Day 0 报告 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` 为 `PASS_WITH_FINDINGS`,finding 为缺 live smoke 登录凭据/pending OCR 子检查异常以及历史 callback gap,按已知 observation 不阻断测试账号受控试用。 | | `WROAD2+OPS` | 受控上线和每日巡检 Day 0 已完成 | 当前进入测试账号受控上线:范围固定 `SMOKE002 -> SMOKE101`,管理员观察和告警员工号固定 `HYD000006`,即管理员 `wangshunli` 的 employee_no;脚本不再把姓名字符串 `wangshunli` 当员工号。试用 3 天,每日触发一键巡检脚本。巡检复用 `/ready`、live smoke、feature flag、企微 runtime、审批补偿和 OA 归档离线读取;仅补偿归档步骤可用进程级 `WECOM_ARCHIVE_WRITE=1` 写 OA 自建留存库,不写企业微信、不创建模板或审批单。Day 0 报告 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json` 为 `PASS_WITH_FINDINGS`,finding 为缺 live smoke 登录凭据/pending OCR 子检查异常以及历史 callback gap,按已知 observation 不阻断测试账号受控试用。 |
| `WARCH3` | 归档稳定化自动巡检已实现 | 新增 `scripts/qa/run-warch3-ops-daily.sh` 聚合 WROAD2 子报告、归类 observation/finding、解释历史 callback gap,并新增 `deploy/trialrun/install-warch3-ops-timer.sh` 安装服务器 `systemd service/timer`,每天 07:30 触发;WOPS1 后巡检告警默认只发 `HYD000006`,由 `npm run send:wecom-ops-alert` 读取状态文件判断新增 finding 或状态恶化,已知 finding 不重复告警。仍只允许补偿归档写 OA DB,不写企业微信、不创建模板或审批单。 | | `WARCH3` | 归档稳定化自动巡检已实现 | 新增 `scripts/qa/run-warch3-ops-daily.sh` 聚合 WROAD2 子报告、归类 observation/finding、解释历史 callback gap,并新增 `deploy/trialrun/install-warch3-ops-timer.sh` 安装服务器 `systemd service/timer`,每天 07:30 触发;WOPS1 后巡检告警默认只发 `HYD000006`,由 `npm run send:wecom-ops-alert` 读取状态文件判断新增 finding 或状态恶化,已知 finding 不重复告警。仍只允许补偿归档写 OA DB,不写企业微信、不创建模板或审批单。 |
| `WCHECK1` | 打卡摘要留存已实现 | 新增打卡日/月摘要和规则快照留存表、`wecomCheckinArchive` 服务和 `npm run check:wecom-checkin-summary-archive` runner。保存规范化打卡明细、日/月摘要、异常摘要、规则快照摘要和 hash;报告只输出计数、状态、异常摘要和脱敏 userid 前缀,不保存完整位置、人脸、设备明文或原始 payload。 | | `WCHECK1` | 打卡摘要留存已实现 | 新增打卡日/月摘要和规则快照留存表、`wecomCheckinArchive` 服务和 `npm run check:wecom-checkin-summary-archive` runner。保存规范化打卡明细、日/月摘要、异常摘要、规则快照摘要和 hash;报告只输出计数、状态、异常摘要和脱敏 userid 前缀,不保存完整位置、人脸、设备明文或原始 payload。 |
| `WEXT1` | 外出/加班 dry-run 已实现 | 扩展 `npm run check:wecom-approval-fixtures` 支持 `--target=outing --target=overtime`,只构建 OA-POC 外出/加班最小通用模板和低风险审批申请 payload,仍默认 dry-run。已锁定后续 live 范围为外出+加班两类一起创建、样件保留审计、`SMOKE101` 真机确认,但必须等 WROAD2-CLOSEOUT 三天验收后另起 `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、WAUTO1/WEXT1LD 可解释通过后另起 `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 摘要和报告路径。 | | `WOPS1` | 巡检告警降噪已公网验证 | 将 WARCH3 告警从“有 finding 就发”改为“阻断、失败、新增 finding 或状态恶化才发”;默认收件员工号 `HYD000006`。远端二次触发报告 `/app/artifacts/qa-flow/wecom-ops-alert-20260520T070740Z/summary.json` 为 `PASS_ALERT_SKIPPED_NO_FINDINGS`,原因 `no_new_findings_or_status_worsening`;状态文件只保存脱敏状态、finding 摘要和报告路径。 |
| `WROAD2-CLOSEOUT` | 三天验收采集中 | Day 1/2/3 继续由 WARCH3 timer 采集;已知 observation(live smoke 凭据、pending OCR、历史 callback gap)可接受但要保留趋势;三天结束后只在异常或验收点问答,若通过则进入 `WEXT1-LIVE` 合同,不直接启用真实员工。 | | `WROAD2-CLOSEOUT` | 三天验收采集中 | Day 1/2/3 继续由 WARCH3 timer 采集;已知 observation(live smoke 凭据、pending OCR、历史 callback gap)可接受但要保留趋势;三天结束后只在异常或验收点问答,若通过则进入 `WEXT1-LIVE` 合同,不直接启用真实员工。 |
| `WROAD2-BIZ1` | 三天人工业务冒烟已建档 | 三天内并行补充测试账号业务动作:`SMOKE002` 每天按规则尝试企微打卡,提交低风险请假/补卡;`SMOKE101` 先看详情再审批;`HYD000006` 每天查看 OA 归档历史和打卡摘要。人工业务冒烟不替代 WARCH3 自动巡检,不写企业微信,不启用真实员工。 | | `WROAD2-BIZ1` | 三天人工业务冒烟已建档 | 三天内并行补充测试账号业务动作:`SMOKE002` 每天按规则尝试企微打卡,提交低风险请假/补卡;`SMOKE101` 先看详情再审批;`HYD000006` 每天查看 OA 归档历史和打卡摘要。人工业务冒烟不替代 WARCH3 自动巡检,不写企业微信,不启用真实员工。 |
| `WAPPR1` | 审批规则规范化门禁已建档 | 用户发现补卡申请需要手动选择审批人后,正式把“申请人不得任意选择审批人”列为真实试用前门禁。测试模板固定 `SMOKE002 -> SMOKE101`;正式模板必须按直属主管、部门负责人或指定审批角色自动带出审批人;审批人缺失、停用、未绑定、不可见或自审时阻断。 | | `WAPPR1` | 审批规则规范化门禁已建档 | 用户发现补卡申请需要手动选择审批人后,正式把“申请人不得任意选择审批人”列为真实试用前门禁。测试模板固定 `SMOKE002 -> SMOKE101`;正式模板必须按直属主管、部门负责人或指定审批角色自动带出审批人;审批人缺失、停用、未绑定、不可见或自审时阻断。 |
| `WAUTO1` | 自动证据汇总已实现 | 新增 `scripts/qa/collect-wecom-controlled-trial-evidence.sh`,只读汇总 WROAD2/WARCH3/WCHECK1/WROAD2-BIZ1/WAPPR1/WEXT1 dry-run 证据,并复跑 `/ready`、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描。脚本默认不写 OA DB、不写企业微信、不创建模板或审批单,结论限定为 `PASS_AUTO_EVIDENCE_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 |
| `WEXT1LD` | 外出/加班 live 前 dry-run gate 已实现 | 新增独立 dry-run 合同,远端只执行外出+加班 payload dry-run;固定 `SMOKE002 -> SMOKE101` 和 `WECOM_AGENT_SECRET`,不尝试其他 Secret,不设置写入双开关。dry-run 通过后仍必须问答选择是否一次性 live 创建样件、只保留 dry-run 或移出 V1。 |
| `WREAL1-PREP` | 真实小范围试用准备已固化 | 只固化候选员工条件、非自审审批人条件、回滚联系人、允许流程、暂停条件和验收标准;当前继续测试账号,四类测试号证据和 WAPPR1 审批规则门禁通过后才问是否启动真实小范围试用。 | | `WREAL1-PREP` | 真实小范围试用准备已固化 | 只固化候选员工条件、非自审审批人条件、回滚联系人、允许流程、暂停条件和验收标准;当前继续测试账号,四类测试号证据和 WAPPR1 审批规则门禁通过后才问是否启动真实小范围试用。 |
## 3. 阶段路线 ## 3. 阶段路线
@@ -88,10 +92,12 @@
| 19 | `WROAD2-CLOSEOUT 三天验收` | 汇总 Day 0/1/2/3 巡检报告,决定是否进入外出/加班 live POC。 | WOPS1 本地和公网验证通过;WARCH3 timer 正常。 | 输出 `PASS_CONTROLLED_OPS_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`,并结合 WROAD2-BIZ1 人工业务冒烟结果问答确认。 | | 19 | `WROAD2-CLOSEOUT 三天验收` | 汇总 Day 0/1/2/3 巡检报告,决定是否进入外出/加班 live POC。 | WOPS1 本地和公网验证通过;WARCH3 timer 正常。 | 输出 `PASS_CONTROLLED_OPS_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`,并结合 WROAD2-BIZ1 人工业务冒烟结果问答确认。 |
| 20 | `WROAD2-BIZ1 三天业务冒烟` | 在测试账号范围补充真实业务动作:打卡、请假、补卡、OA 离线查看,并为外出/加班 live POC 准备人工验收清单。 | 用户选择三天内测试更多业务;仍限定测试账号。 | 输出 `PASS_BUSINESS_SMOKE_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;不写企微、不创建外出/加班样件。 | | 20 | `WROAD2-BIZ1 三天业务冒烟` | 在测试账号范围补充真实业务动作:打卡、请假、补卡、OA 离线查看,并为外出/加班 live POC 准备人工验收清单。 | 用户选择三天内测试更多业务;仍限定测试账号。 | 输出 `PASS_BUSINESS_SMOKE_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;不写企微、不创建外出/加班样件。 |
| 21 | `WAPPR1 审批规则规范化门禁` | 统一企微 HR/考勤审批人规则,禁止申请人任意选择审批人。 | 发现补卡申请需要手动选择审批人;用户要求审批规则按规范自动化。 | 四类模板按模板给出 `PASS_APPROVER_RULES_READY`、`PASS_WITH_TEMPLATE_ADJUSTMENTS`、`FAIL_KEEP_OA_PRIMARY_FOR_THIS_TEMPLATE` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;规则不通过不得进入真实试用。 | | 21 | `WAPPR1 审批规则规范化门禁` | 统一企微 HR/考勤审批人规则,禁止申请人任意选择审批人。 | 发现补卡申请需要手动选择审批人;用户要求审批规则按规范自动化。 | 四类模板按模板给出 `PASS_APPROVER_RULES_READY`、`PASS_WITH_TEMPLATE_ADJUSTMENTS`、`FAIL_KEEP_OA_PRIMARY_FOR_THIS_TEMPLATE` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;规则不通过不得进入真实试用。 |
| 22 | `WREAL1-PREP 真实试用准备` | 固化候选员工、审批人、允许流程、暂停条件、回滚联系人和验收标准,不启用真实员工。 | 用户选择可以并行准备但暂不引入真实员工。 | 文档和合同明确真实试用需等四类测试号证据和 WAPPR1 审批规则门禁通过后再问;当前继续测试账号。 | | 22 | `WAUTO1 受控试用证据自动汇总` | 自动汇总三天受控试用证据,准备 WAPPR1 人工确认和 WEXT1-LIVE 问答。 | WROAD2-BIZ1/WAPPR1 已建档,用户要求能自动执行的全部脚本化。 | 新脚本默认只读,不触发补偿归档写库,不写企微;输出脱敏 summary 和 WAPPR1 人工清单。 |
| 23 | `WEXT1-LIVE 外出/加班测试号 live POC` | 单次创建外出+加班 OA-POC 模板和低风险测试审批单,并做真机可读性和审批规则确认。 | WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1 可解释通过;新建独立 Issue CSV;再次说明会留下的企微记录并取得人工确认。 | 两类样件保留审计;固定 `SMOKE002 -> SMOKE101`、`WECOM_AGENT_SECRET` 和双开关;只保存脱敏 template/`sp_no`/userid 前缀;`SMOKE101` 真机确认消息、列表、详情、按钮风险和审批人是否自动带出。 | | 23 | `WEXT1LD 外出/加班 live 前 dry-run gate` | 在 live 创建前远端只执行外出/加班 dry-run。 | WEXT1 dry-run runner 已存在;用户要求 live 前先自动 dry-run。 | 不带 live 写入参数;通过后只进入问答,不自动创建模板或审批单。 |
| 24 | `WREAL1 小范围真实试用` | 在 1-2 名真实员工范围验证企微主办 HR/考勤和 OA 留存。 | 请假、补卡、外出、加班四类测试号证据通过;WAPPR1 规则门禁通过;用户通过问答提供真实员工、审批人、试用周期、暂停条件和回滚联系人。 | 试用报告可解释通过或暂停;仍不直接全员推广。 | | 24 | `WREAL1-PREP 真实试用准备` | 固化候选员工、审批人、允许流程、暂停条件、回滚联系人和验收标准,不启用真实员工。 | 用户选择可以并行准备但暂不引入真实员工。 | 文档和合同明确真实试用需等四类测试号证据和 WAPPR1 审批规则门禁通过后再问;当前继续测试账号。 |
| 25 | `wecom_attendance_approval_mirror_v1` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA。 | WREAL1 通过后再规划;不得仅凭测试号证据进入。 | OA 可查询企微 HR/考勤镜像、附件摘要、审批历史、考勤解释和审计;不把 OA 主办高敏审批迁到企微。 | | 25 | `WEXT1-LIVE 外出/加班测试号 live POC` | 单次创建外出+加班 OA-POC 模板和低风险测试审批单,并做真机可读性和审批规则确认。 | WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1/WAUTO1/WEXT1LD 可解释通过;新建独立 Issue CSV;再次说明会留下的企微记录并取得人工确认。 | 两类样件保留审计;固定 `SMOKE002 -> SMOKE101`、`WECOM_AGENT_SECRET` 和双开关;只保存脱敏 template/`sp_no`/userid 前缀;`SMOKE101` 真机确认消息、列表、详情、按钮风险和审批人是否自动带出。 |
| 26 | `WREAL1 小范围真实试用` | 在 1-2 名真实员工范围验证企微主办 HR/考勤和 OA 留存。 | 请假、补卡、外出、加班四类测试号证据通过;WAPPR1 规则门禁通过;用户通过问答提供真实员工、审批人、试用周期、暂停条件和回滚联系人。 | 试用报告可解释通过或暂停;仍不直接全员推广。 |
| 27 | `wecom_attendance_approval_mirror_v1` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA。 | WREAL1 通过后再规划;不得仅凭测试号证据进入。 | OA 可查询企微 HR/考勤镜像、附件摘要、审批历史、考勤解释和审计;不把 OA 主办高敏审批迁到企微。 |
| 26 | `oa_hr_emergency_mode_v1` | 企业微信不可用时,由管理员人工开启 OA HR/考勤应急接管。 | 自建历史留存和镜像数据可支撑对账;OA 应急入口、权限和审计方案明确。 | 管理员可填写原因、范围、预计结束时间和责任人后开启/关闭;应急单据带 `EMERGENCY` 标记。 | | 26 | `oa_hr_emergency_mode_v1` | 企业微信不可用时,由管理员人工开启 OA HR/考勤应急接管。 | 自建历史留存和镜像数据可支撑对账;OA 应急入口、权限和审计方案明确。 | 管理员可填写原因、范围、预计结束时间和责任人后开启/关闭;应急单据带 `EMERGENCY` 标记。 |
| 27 | `wecom_recovery_writeback_v1` | 企微恢复后,OA 应急数据先 dry-run,再回写企微。 | 应急接管模式完成;企微写回接口、冲突规则和回滚策略已单独批准。 | 系统生成成功、失败、跳过和冲突清单;无冲突项可自动回写,冲突进入人工确认。 | | 27 | `wecom_recovery_writeback_v1` | 企微恢复后,OA 应急数据先 dry-run,再回写企微。 | 应急接管模式完成;企微写回接口、冲突规则和回滚策略已单独批准。 | 系统生成成功、失败、跳过和冲突清单;无冲突项可自动回写,冲突进入人工确认。 |
| 28 | `wecom_ruleops_v1` | AI 草拟企微规则、生成差异报告和 dry-run,人工确认后写入企微。 | 前述同步/回写链路稳定;企微规则 API 能力和权限已验证。 | 每次写入保存前后快照、确认人、API `errcode`、失败原因、回滚建议和审计记录。 | | 28 | `wecom_ruleops_v1` | AI 草拟企微规则、生成差异报告和 dry-run,人工确认后写入企微。 | 前述同步/回写链路稳定;企微规则 API 能力和权限已验证。 | 每次写入保存前后快照、确认人、API `errcode`、失败原因、回滚建议和审计记录。 |
@@ -266,9 +272,9 @@ WAPC2 通过后,下一步不是直接进入 `wecom_attendance_approval_mirror_
9. `WARCH2 正式只读历史查询`:已提供 OA DB 只读 API 和 PC/移动历史页。 9. `WARCH2 正式只读历史查询`:已提供 OA DB 只读 API 和 PC/移动历史页。
10. `WROAD2+OPS 受控上线与每日巡检`:先做测试账号 3 天脚本化巡检,沉淀 Day 0/Day 1/Day 2/Day 3 脱敏报告。 10. `WROAD2+OPS 受控上线与每日巡检`:先做测试账号 3 天脚本化巡检,沉淀 Day 0/Day 1/Day 2/Day 3 脱敏报告。
11. `WARCH3 / WCHECK1 / WEXT1 / WOPS1`:已补归档稳定化自动巡检、打卡摘要留存、外出/加班 dry-run 和告警降噪。 11. `WARCH3 / WCHECK1 / WEXT1 / WOPS1`:已补归档稳定化自动巡检、打卡摘要留存、外出/加班 dry-run 和告警降噪。
12. `WROAD2-CLOSEOUT / WROAD2-BIZ1 / WAPPR1 / WEXT1-LIVE / WREAL1`:三天验收期间并行完成人工业务冒烟和审批规则规范化;通过后先问答进入外出/加班测试号 live POC;请假、补卡、外出、加班四类测试号证据和审批规则门禁通过后,再问真实小范围试用。 12. `WROAD2-CLOSEOUT / WROAD2-BIZ1 / WAPPR1 / WAUTO1 / WEXT1LD / WEXT1-LIVE / WREAL1`:三天验收期间并行完成人工业务冒烟、审批规则规范化和自动证据汇总;先完成外出/加班 live 前 dry-run,再问答进入外出/加班测试号 live POC;请假、补卡、外出、加班四类测试号证据和审批规则门禁通过后,再问真实小范围试用。
WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WEXT1-LIVE、四类测试号证据和 WREAL1 通过或明确批准前,不拆 `wecom_attendance_approval_mirror_v1`。 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1、WAUTO1/WEXT1LD、WEXT1-LIVE、四类测试号证据和 WREAL1 通过或明确批准前,不拆 `wecom_attendance_approval_mirror_v1`。
## 13. WADM1 自建留存/镜像数据模型设计 ## 13. WADM1 自建留存/镜像数据模型设计
@@ -354,9 +360,11 @@ WROAD2+OPS 把 WARCH2 后的可用能力先进入测试账号受控使用,不
- 后续顺序:WROAD2+OPS 后优先 `WARCH3` 归档稳定化,再做 `WCHECK1` 打卡摘要留存;外出/加班进入 `WEXT1` dry-run。上述阶段完成前,不启动完整深度镜像、应急接管、恢复回写或 RuleOps。 - 后续顺序:WROAD2+OPS 后优先 `WARCH3` 归档稳定化,再做 `WCHECK1` 打卡摘要留存;外出/加班进入 `WEXT1` dry-run。上述阶段完成前,不启动完整深度镜像、应急接管、恢复回写或 RuleOps。
- 业务冒烟:WROAD2-BIZ1 在三天内补充人工业务动作,不替代自动巡检。`SMOKE002` 每天按企微规则尝试上/下班打卡,提交低风险请假和补卡;`SMOKE101` 必须先打开详情再审批;`HYD000006` 每天查看 OA 企微审批归档和打卡摘要。无法打卡、无法审批或仍需手选审批人时按 finding 记录,不伪造成通过。 - 业务冒烟:WROAD2-BIZ1 在三天内补充人工业务动作,不替代自动巡检。`SMOKE002` 每天按企微规则尝试上/下班打卡,提交低风险请假和补卡;`SMOKE101` 必须先打开详情再审批;`HYD000006` 每天查看 OA 企微审批归档和打卡摘要。无法打卡、无法审批或仍需手选审批人时按 finding 记录,不伪造成通过。
- 审批规则:WAPPR1 把“申请人不得任意选择审批人”列为真实试用前门禁。测试模板固定 `SMOKE002 -> SMOKE101`;正式模板必须按直属主管、部门负责人或指定审批角色自动带出审批人;审批人缺失、停用、未绑定、不可见或等于申请人本人时阻断。 - 审批规则:WAPPR1 把“申请人不得任意选择审批人”列为真实试用前门禁。测试模板固定 `SMOKE002 -> SMOKE101`;正式模板必须按直属主管、部门负责人或指定审批角色自动带出审批人;审批人缺失、停用、未绑定、不可见或等于申请人本人时阻断。
- 自动证据:WAUTO1 使用 `scripts/qa/collect-wecom-controlled-trial-evidence.sh` 只读汇总三天证据,读取既有 WROAD2/WARCH3/WCHECK1/WEXT1 报告并复跑只读/离线 runner;该脚本不设置 `WECOM_ARCHIVE_WRITE=1`、`WECOM_CHECKIN_ARCHIVE_WRITE=1` 或 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不替代 WARCH3 定时巡检和人工业务冒烟。
### 6.4 WARCH3 / WCHECK1 / WEXT1 当前边界 ### 6.4 WARCH3 / WCHECK1 / WEXT1 当前边界
- `WARCH3`:`scripts/qa/run-warch3-ops-daily.sh` 聚合 WROAD2 子报告并输出 `artifacts/qa-flow/warch3-ops-<timestamp>/summary.json`;`deploy/trialrun/install-warch3-ops-timer.sh` 安装 `hyb-oa-warch3-ops.service/timer`,每日 07:30 触发。巡检失败或 finding 可用 `npm run send:wecom-ops-alert` 发脱敏企微应用消息,双开关为 `--send` + `WARCH3_OPS_ALERT_SEND=1`。 - `WARCH3`:`scripts/qa/run-warch3-ops-daily.sh` 聚合 WROAD2 子报告并输出 `artifacts/qa-flow/warch3-ops-<timestamp>/summary.json`;`deploy/trialrun/install-warch3-ops-timer.sh` 安装 `hyb-oa-warch3-ops.service/timer`,每日 07:30 触发。巡检失败或 finding 可用 `npm run send:wecom-ops-alert` 发脱敏企微应用消息,双开关为 `--send` + `WARCH3_OPS_ALERT_SEND=1`。
- `WCHECK1`:`WecomCheckinRecord` 继续作为规范化明细;新增日摘要、月摘要和规则快照。`npm run check:wecom-checkin-summary-archive` 默认离线只读;写 OA 留存必须同时具备 `--persist-to-db` + `WECOM_CHECKIN_ARCHIVE_WRITE=1`。报告不输出完整 userid、位置、人脸、设备明文或原始 payload。 - `WCHECK1`:`WecomCheckinRecord` 继续作为规范化明细;新增日摘要、月摘要和规则快照。`npm run check:wecom-checkin-summary-archive` 默认离线只读;写 OA 留存必须同时具备 `--persist-to-db` + `WECOM_CHECKIN_ARCHIVE_WRITE=1`。报告不输出完整 userid、位置、人脸、设备明文或原始 payload。
- `WEXT1`:`npm run check:wecom-approval-fixtures -- --target=outing --target=overtime` 只做 dry-run。外出/加班 live 创建仍需新 Issue CSV 和人工批准,不因请假/补卡已验证而自动放行。 - `WEXT1`:`npm run check:wecom-approval-fixtures -- --target=outing --target=overtime` 只做 dry-run。外出/加班 live 创建仍需新 Issue CSV 和人工批准,不因请假/补卡已验证而自动放行。
- `WEXT1LD`:live 前 dry-run gate 只执行 `npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`,不带 live 写入参数;通过后问答选项为批准一次 live 创建外出+加班 OA-POC 样件、只保留 dry-run、或将外出/加班移出 V1。
+6 -4
查看文件
@@ -98,6 +98,8 @@
| `WROAD2-CLOSEOUT` | `issues/2026-05-20_14-35-42-wroad2-controlled-ops-closeout-v1.csv` | `CURRENT` | 三天受控巡检验收合同:Day 1/2/3 由 WARCH3 timer 采集后汇总,已知 live smoke 凭据、pending OCR 和历史 callback gap 作为 observation 不阻断;结束后需结合 WROAD2-BIZ1 和 WAPPR1 结论,再问答确认进入 WEXT1-LIVE、先处理 finding 或暂停,不直接启用真实员工 | | `WROAD2-CLOSEOUT` | `issues/2026-05-20_14-35-42-wroad2-controlled-ops-closeout-v1.csv` | `CURRENT` | 三天受控巡检验收合同:Day 1/2/3 由 WARCH3 timer 采集后汇总,已知 live smoke 凭据、pending OCR 和历史 callback gap 作为 observation 不阻断;结束后需结合 WROAD2-BIZ1 和 WAPPR1 结论,再问答确认进入 WEXT1-LIVE、先处理 finding 或暂停,不直接启用真实员工 |
| `WROAD2-BIZ1` | `issues/2026-05-20_17-13-57-wroad2-business-smoke-v1.csv` | `CURRENT` | 三天测试账号业务冒烟合同:不替代 WARCH3 自动巡检;`SMOKE002` 每天按企微规则尝试打卡并提交低风险请假/补卡,`SMOKE101` 先看详情再审批,`HYD000006` 查看 OA 企微审批归档和打卡摘要;无法打卡、无法审批或仍需手选审批人时记录 finding;不写企业微信、不启用真实员工 | | `WROAD2-BIZ1` | `issues/2026-05-20_17-13-57-wroad2-business-smoke-v1.csv` | `CURRENT` | 三天测试账号业务冒烟合同:不替代 WARCH3 自动巡检;`SMOKE002` 每天按企微规则尝试打卡并提交低风险请假/补卡,`SMOKE101` 先看详情再审批,`HYD000006` 查看 OA 企微审批归档和打卡摘要;无法打卡、无法审批或仍需手选审批人时记录 finding;不写企业微信、不启用真实员工 |
| `WAPPR1` | `issues/2026-05-20_17-13-57-wecom-approval-rule-governance-v1.csv` | `CURRENT` | 企微审批规则规范化门禁合同:补卡手动选择审批人现象作为 blocking finding;测试模板固定 `SMOKE002 -> SMOKE101`;正式请假、补卡、外出、加班模板必须按直属主管、部门负责人或指定审批角色自动带出审批人;申请人不得任意选择审批人;审批人缺失、停用、未绑定、不可见或自审时阻断;规则未通过不得进入真实试用 | | `WAPPR1` | `issues/2026-05-20_17-13-57-wecom-approval-rule-governance-v1.csv` | `CURRENT` | 企微审批规则规范化门禁合同:补卡手动选择审批人现象作为 blocking finding;测试模板固定 `SMOKE002 -> SMOKE101`;正式请假、补卡、外出、加班模板必须按直属主管、部门负责人或指定审批角色自动带出审批人;申请人不得任意选择审批人;审批人缺失、停用、未绑定、不可见或自审时阻断;规则未通过不得进入真实试用 |
| `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 通过后仍需人工问答批准或暂停 |
| `WREAL1-PREP` | `issues/2026-05-20_14-35-42-wecom-real-trial-prep-v1.csv` | `CURRENT` | 真实小范围试用准备合同:只固化候选员工、非自审审批人、回滚联系人、允许流程、暂停条件和验收标准;当前不启用真实员工,真实试用必须等请假/补卡/外出/加班四类测试号证据和 WAPPR1 审批规则门禁通过后再问 | | `WREAL1-PREP` | `issues/2026-05-20_14-35-42-wecom-real-trial-prep-v1.csv` | `CURRENT` | 真实小范围试用准备合同:只固化候选员工、非自审审批人、回滚联系人、允许流程、暂停条件和验收标准;当前不启用真实员工,真实试用必须等请假/补卡/外出/加班四类测试号证据和 WAPPR1 审批规则门禁通过后再问 |
旧 Issue CSV 保留为历史审计证据:不删除、不批量回写、不移动到 `docs/archive/` 或其他归档目录。新连续合同如替代旧合同,只在新合同 `Notes` 或文档索引中说明 supersedes。 旧 Issue CSV 保留为历史审计证据:不删除、不批量回写、不移动到 `docs/archive/` 或其他归档目录。新连续合同如替代旧合同,只在新合同 `Notes` 或文档索引中说明 supersedes。
@@ -106,18 +108,18 @@
| Doc_ID | Path | Category | Authority | Status | Owner | Related_Issues | Evidence | Supersedes | Last_Audited | Audit_Method | Risk | Notes | | 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,WREAL1P` | `rg` | none | 2026-05-20 | `node scripts/qa/audit-docs.mjs --check-registry` | medium | 判断当前该读什么;WROAD2B/WAPPR1 后优先读取企微主办 + OA 自建留存路线、三天业务冒烟、审批规则规范化、受控上线巡检、告警降噪、打卡摘要、外出/加班 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,WAUTO1,WEXT1LD,WREAL1P` | `rg` | none | 2026-05-20 | `node scripts/qa/audit-docs.mjs --check-registry` | medium | 判断当前该读什么;WAUTO1/WEXT1LD 后优先读取企微主办 + 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,WREAL1P` | `audit-docs` | none | 2026-05-20 | `audit-docs --check-registry` | medium | 判断文档权威性;登记当前受控上线、三天业务冒烟、审批规则规范化、自动巡检、告警降噪、打卡摘要留存、外出/加班 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,WREAL1P` | `audit-docs` | none | 2026-05-20 | `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 | | `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 自建留存策略 | | `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 应急接管 | | `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,WREAL1P` | Issue CSV | none | 2026-05-20 | `rg` | high | WROAD2B/WAPPR1 后固定最小审批历史留存、正式只读历史查询、受控上线自动巡检、三天业务冒烟、审批规则规范化、告警降噪、打卡摘要、外出/加班 dry-run、WEXT1-LIVE 前置和真实试用准备;仍禁止直接进入深度镜像 | | `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,WREAL1P` | Issue CSV | none | 2026-05-20 | `rg` | high | WAUTO1/WEXT1LD 后固定最小审批历史留存、正式只读历史查询、受控上线自动巡检、三天业务冒烟、审批规则规范化、自动证据汇总、告警降噪、打卡摘要、外出/加班 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` | 官方企业微信开发者中心链接/Issue CSV | none | 2026-05-20 | `rg` | high | 企微开发先读;只保存摘要、链接和项目决策,不保存 Secret、token、完整 userid、手机号、邮箱或原始 payload;记录审批补偿、打卡摘要和巡检只写 OA 留存、不写企业微信的边界 | | `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` | 官方企业微信开发者中心链接/Issue CSV | none | 2026-05-20 | `rg` | high | 企微开发先读;只保存摘要、链接和项目决策,不保存 Secret、token、完整 userid、手机号、邮箱或原始 payload;记录审批补偿、打卡摘要和巡检只写 OA 留存、不写企业微信的边界 |
| `DELIVERY` | `docs/开发交付与变更管理规约.md` | 开发治理 | 开发交付事实源 | `CURRENT` | dev/qa | `GOV8,WDRG,WRRA,WAPC1,WPROC1,WPROC2,WCBK1,WEGOV1` | `rg` | none | 2026-05-19 | `rg` | high | Issue、review、commit、交付规则;WEGOV1 后采用自动化优先、受控测试域、自建留存说明和 WACP3/WREAD1/WADM1/WARCH1 前置门禁 | | `DELIVERY` | `docs/开发交付与变更管理规约.md` | 开发治理 | 开发交付事实源 | `CURRENT` | dev/qa | `GOV8,WDRG,WRRA,WAPC1,WPROC1,WPROC2,WCBK1,WEGOV1` | `rg` | none | 2026-05-19 | `rg` | high | Issue、review、commit、交付规则;WEGOV1 后采用自动化优先、受控测试域、自建留存说明和 WACP3/WREAD1/WADM1/WARCH1 前置门禁 |
| `QA-GATE` | `docs/测试规约与回归门禁.md` | 测试验收 | 测试和回归门禁事实源 | `CURRENT` | qa | `QAF8,GOV8,WPROC1,WPROC2,WAPC2FLIVE,WCBK1,WEGOV1` | 回归脚本/Playwright | none | 2026-05-19 | `rg` | high | 测试计划、DONE 门禁、企微三层门禁、自动化优先、非自审、无完整 sandbox 假设、WREAD1 真机可读性和 WARCH1 留存验收门禁 | | `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 协作开发实践和设计主参考层级 | | `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 | 不可违反约束 | | `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,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 自建留存、受控巡检、业务冒烟、审批规则和告警降噪边界;不得绕过 WROAD2C/WROAD2B/WAPPR1/WEXT1-LIVE/WREAL1 或后续独立合同直接做完整考勤审批镜像 | | `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,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 自建留存、受控巡检、业务冒烟、审批规则、自动证据汇总和告警降噪边界;不得绕过 WROAD2C/WROAD2B/WAPPR1/WAUTO1/WEXT1LD/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` | workflow 回归 | none | 2026-05-20 | `rg` | high | OA 主办审批、企微主办 HR/考勤审批、OA 自建留存、真实回调事件证据、WACP3R 补偿拉取 findings、WREAD1 请假/补卡真机可读性结论、WARCH1 最小历史留存、WAPPR1 审批规则规范化及 OA 应急接管边界 | | `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` | workflow 回归 | none | 2026-05-20 | `rg` | high | OA 主办审批、企微主办 HR/考勤审批、OA 自建留存、真实回调事件证据、WACP3R 补偿拉取 findings、WREAD1 请假/补卡真机可读性结论、WARCH1 最小历史留存、WAPPR1 审批规则规范化及 OA 应急接管边界 |
| `REQ-OCR` | `docs/需求-报销发票OCR规约.md` | 需求事实源 | OCR 模块规约 | `CURRENT` | product/backend | `RI6,OCR8,BIZ8` | OCR 回归 | none | 2026-05-13 | `rg` | high | OCR 和发票边界 | | `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 | 报销、发票、附件细则 | | `RULE-REIMB` | `docs/报销发票附件规则.md` | 需求事实源 | 报销发票附件规则 | `CURRENT` | product/finance | `RI6,BIZ8` | 报销回归 | none | 2026-05-13 | `rg` | high | 报销、发票、附件细则 |
+3 -1
查看文件
@@ -159,6 +159,8 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
| `WROAD2-CLOSEOUT` | `issues/2026-05-20_14-35-42-wroad2-controlled-ops-closeout-v1.csv` | 当前三天受控巡检验收:Day 1/2/3 采集后人工确认 | 已知 observation 为 live smoke 凭据、pending OCR 和历史 callback gap,不阻断;主链必须保持企微 runtime、审批补偿归档、OA 离线读取、打卡摘要 offline 可读和隐私扫描通过 | 三天结束前不启用真实员工;结论需结合 WROAD2-BIZ1/WAPPR1 后问答确认是否进入 WEXT1-LIVE、先处理 finding 或暂停 | | `WROAD2-CLOSEOUT` | `issues/2026-05-20_14-35-42-wroad2-controlled-ops-closeout-v1.csv` | 当前三天受控巡检验收:Day 1/2/3 采集后人工确认 | 已知 observation 为 live smoke 凭据、pending OCR 和历史 callback gap,不阻断;主链必须保持企微 runtime、审批补偿归档、OA 离线读取、打卡摘要 offline 可读和隐私扫描通过 | 三天结束前不启用真实员工;结论需结合 WROAD2-BIZ1/WAPPR1 后问答确认是否进入 WEXT1-LIVE、先处理 finding 或暂停 |
| `WROAD2-BIZ1` | `issues/2026-05-20_17-13-57-wroad2-business-smoke-v1.csv` | 当前三天业务冒烟:补充测试账号人工业务动作 | `SMOKE002` 每天按企微规则尝试打卡并提交低风险请假/补卡,`SMOKE101` 先看详情再审批,`HYD000006` 查看 OA 归档历史和打卡摘要 | 不替代 WARCH3 自动巡检;不写企业微信;无法打卡、无法审批或仍需手选审批人时记录 finding | | `WROAD2-BIZ1` | `issues/2026-05-20_17-13-57-wroad2-business-smoke-v1.csv` | 当前三天业务冒烟:补充测试账号人工业务动作 | `SMOKE002` 每天按企微规则尝试打卡并提交低风险请假/补卡,`SMOKE101` 先看详情再审批,`HYD000006` 查看 OA 归档历史和打卡摘要 | 不替代 WARCH3 自动巡检;不写企业微信;无法打卡、无法审批或仍需手选审批人时记录 finding |
| `WAPPR1` | `issues/2026-05-20_17-13-57-wecom-approval-rule-governance-v1.csv` | 当前审批规则规范化门禁:真实试用前必须解决审批人规则 | 测试模板固定 `SMOKE002 -> SMOKE101`;正式请假、补卡、外出、加班模板必须自动带出审批人;申请人不得任意选择审批人 | 审批人缺失、停用、未绑定、不可见或自审时阻断;规则未通过的模板不得进入真实试用 | | `WAPPR1` | `issues/2026-05-20_17-13-57-wecom-approval-rule-governance-v1.csv` | 当前审批规则规范化门禁:真实试用前必须解决审批人规则 | 测试模板固定 `SMOKE002 -> SMOKE101`;正式请假、补卡、外出、加班模板必须自动带出审批人;申请人不得任意选择审批人 | 审批人缺失、停用、未绑定、不可见或自审时阻断;规则未通过的模板不得进入真实试用 |
| `WAUTO1` | `issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv` | 当前受控试用证据自动汇总:把三天自动报告和只读 runner 汇总成脱敏证据 | 新增 `scripts/qa/collect-wecom-controlled-trial-evidence.sh`,复跑 `/ready`、WARCH3 summary-only、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描 | 默认不写 OA DB、不写企业微信、不创建模板或审批单;WAPPR1 和三天业务仍需人工确认 |
| `WEXT1LD` | `issues/2026-05-20_18-04-16-wecom-outing-overtime-live-dryrun-gate-v1.csv` | 当前外出/加班 live 前 dry-run gate:只做远端 dry-run,不授权 live 写入 | 远端执行 `npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`;固定 `SMOKE002 -> SMOKE101` 和 `WECOM_AGENT_SECRET` | 不设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不带 live 写入参数;通过后仍需问答是否 live 创建样件 |
| `WREAL1-PREP` | `issues/2026-05-20_14-35-42-wecom-real-trial-prep-v1.csv` | 当前真实试用准备:不启用真实员工 | 固化候选员工、非自审审批人、回滚联系人、允许流程、暂停条件和验收标准;真实试用必须等请假、补卡、外出、加班四类测试号证据和 WAPPR1 通过后再问 | 当前不创建外出/加班 live 样件;真实员工名单不写入 Issue 或文档,后续通过问答确认 | | `WREAL1-PREP` | `issues/2026-05-20_14-35-42-wecom-real-trial-prep-v1.csv` | 当前真实试用准备:不启用真实员工 | 固化候选员工、非自审审批人、回滚联系人、允许流程、暂停条件和验收标准;真实试用必须等请假、补卡、外出、加班四类测试号证据和 WAPPR1 通过后再问 | 当前不创建外出/加班 live 样件;真实员工名单不写入 Issue 或文档,后续通过问答确认 |
旧 Issue CSV 不删除、不批量回写、不移动到归档目录。若新治理流替代旧合同,只在新 CSV 的 `Notes` 或本索引说明 supersedes,旧文件保留历史审计语义。 旧 Issue CSV 不删除、不批量回写、不移动到归档目录。若新治理流替代旧合同,只在新 CSV 的 `Notes` 或本索引说明 supersedes,旧文件保留历史审计语义。
@@ -182,7 +184,7 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M
| [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md) | PRD 主事实源;WARCH3/WCHECK1/WEXT1 后包含企微审批配置、只读 POC、工程化前置、process gate、请假/补卡样例、自建留存、受控上线巡检、打卡摘要、外出/加班 dry-run 和深度镜像前置口径 | | [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md) | PRD 主事实源;WARCH3/WCHECK1/WEXT1 后包含企微审批配置、只读 POC、工程化前置、process gate、请假/补卡样例、自建留存、受控上线巡检、打卡摘要、外出/加班 dry-run 和深度镜像前置口径 |
| [文档事实源状态矩阵](./文档事实源状态矩阵.md) | 文档分类、删除恢复和冲突规则 | | [文档事实源状态矩阵](./文档事实源状态矩阵.md) | 文档分类、删除恢复和冲突规则 |
| [产品设计规则](./产品设计规则.md) | PC、移动、企业微信 WebView 设计事实源;DG8 后飞书工作台/飞书审批为唯一主 UI/布局参考;DG9 后按页面分层和样板选型 | | [产品设计规则](./产品设计规则.md) | PC、移动、企业微信 WebView 设计事实源;DG8 后飞书工作台/飞书审批为唯一主 UI/布局参考;DG9 后按页面分层和样板选型 |
| [企微优先开发路线图](./企微优先开发路线图.md) | WDRG/WCP1/WCPC/WHMS/WHMSLIVE/WOUA/WAPI/WRRA/WOUA-FIX/WRV1/WRA1/WMSG1/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F/WAPC2FLIVE/WCBK1/WEGOV1/WACP3/WACP3R/WREAD1/WREAD1F/WARCH1/WARCH2/WROAD2/WARCH3/WCHECK1/WEXT1/WOPS1/WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1/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/WAUTO1/WEXT1LD/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 留存边界事实源 | | [企微 API 能力目录](./企微API能力目录.md) | WAPI/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F/WAPC2FLIVE/WCBK1/WEGOV1/WACP3/WACP3R/WARCH1/WARCH2/WROAD2/WARCH3/WCHECK1/WEXT1 后企微官方 API、Secret 矩阵、权限/可信 IP/回调模板、读写边界、运行优先、审批配置、只读 POC、回调/补偿入库、打卡摘要留存、外出/加班 dry-run 和巡检写 OA 留存边界事实源 |
| [产品口径](./产品口径.md) | 已拍板产品边界和业务规则;WEGOV1 后包含混合主办、自建留存、受控测试域、后续阶段顺序和深度镜像前置口径 | | [产品口径](./产品口径.md) | 已拍板产品边界和业务规则;WEGOV1 后包含混合主办、自建留存、受控测试域、后续阶段顺序和深度镜像前置口径 |
| [需求 - 统一审批中心规约](./需求-统一审批中心规约.md) | OA 主办审批、企微主办 HR/考勤员工日常审批镜像、催办、超时提醒、审批效率 | | [需求 - 统一审批中心规约](./需求-统一审批中心规约.md) | OA 主办审批、企微主办 HR/考勤员工日常审批镜像、催办、超时提醒、审批效率 |
+9 -6
查看文件
@@ -205,7 +205,7 @@ 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 审批规则规范化` -> `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、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 审批规则规范化` -> `WAUTO1 自动证据汇总` -> `WEXT1LD 外出/加班 live 前 dry-run` -> `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、WEXT1-LIVE、WREAL1 问答或明确批准,直接进入深度考勤/审批镜像。
6. 任何生产写接口、企微规则写入、应急模式开启或恢复回写都必须有单独批准、dry-run 或可审计记录。 6. 任何生产写接口、企微规则写入、应急模式开启或恢复回写都必须有单独批准、dry-run 或可审计记录。
WCPC 配置复跑清单: WCPC 配置复跑清单:
@@ -336,11 +336,14 @@ WROAD2/WARCH3 企微受控上线每日巡检:
10. WEXT1 外出/加班 dry-run:`cd server && npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`;live 创建必须另起 `WEXT1-LIVE` 合同,并再次说明状态、测试结果、企微留痕和清理/保留边界后人工确认。 10. WEXT1 外出/加班 dry-run:`cd server && npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime`;live 创建必须另起 `WEXT1-LIVE` 合同,并再次说明状态、测试结果、企微留痕和清理/保留边界后人工确认。
11. WROAD2-BIZ1 三天人工业务冒烟:`SMOKE002` 每天按企微规则尝试上/下班打卡,提交低风险请假和补卡;`SMOKE101` 每条审批必须先打开详情再同意或驳回;`HYD000006` 每天查看 OA 企微审批归档历史和打卡摘要。无法打卡、无法审批或仍需手动选择审批人时,按 finding 记录,不伪造成通过。 11. WROAD2-BIZ1 三天人工业务冒烟:`SMOKE002` 每天按企微规则尝试上/下班打卡,提交低风险请假和补卡;`SMOKE101` 每条审批必须先打开详情再同意或驳回;`HYD000006` 每天查看 OA 企微审批归档历史和打卡摘要。无法打卡、无法审批或仍需手动选择审批人时,按 finding 记录,不伪造成通过。
12. WAPPR1 审批规则规范化:测试模板固定 `SMOKE002 -> SMOKE101`;正式请假、补卡、外出、加班模板必须按直属主管、部门负责人或指定审批角色自动带出审批人。申请人不得任意选择审批人;审批人缺失、停用、未绑定、不可见或自审时,必须阻断或暂停真实试用。 12. WAPPR1 审批规则规范化:测试模板固定 `SMOKE002 -> SMOKE101`;正式请假、补卡、外出、加班模板必须按直属主管、部门负责人或指定审批角色自动带出审批人。申请人不得任意选择审批人;审批人缺失、停用、未绑定、不可见或自审时,必须阻断或暂停真实试用。
13. WEXT1-LIVE 已锁定为外出+加班两类一起创建 OA-POC 测试模板和低风险审批单,固定 `SMOKE002 -> SMOKE101`、`WECOM_AGENT_SECRET` 和双开关;样件保留审计,由 `SMOKE101` 真机确认消息卡片、列表、详情页、按钮风险和审批人是否自动带出。 13. WAUTO1 自动证据汇总:`bash scripts/qa/collect-wecom-controlled-trial-evidence.sh`。该脚本只读汇总 `/ready`、WARCH3 summary、审批补偿只读、审批归档离线、打卡摘要 offline、外出/加班 dry-run 和隐私扫描;不会设置 `WECOM_ARCHIVE_WRITE=1`、`WECOM_CHECKIN_ARCHIVE_WRITE=1` 或 `WECOM_APPROVAL_FIXTURE_WRITE=1`,不写 OA DB、不写企业微信。
14. Day 0 公网报告为 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json`,结论 `PASS_WITH_FINDINGS`:企微 runtime、补偿归档、离线归档读取和隐私扫描通过;finding 为缺 live smoke 登录凭据/pending OCR 子检查异常以及历史 callback gap,不阻断测试账号受控试用。 14. WAPPR1 人工确认清单按请假、补卡、外出、加班逐模板填写:模板入口、适用范围、审批人规则、是否允许申请人手选、是否可能自审、主管链缺失时表现、审批人不可见或停用时表现。每个模板只选一个结论:A 审批人自动带出且申请人不能任意选择;B 默认带出但申请人仍可改人;C 必须申请人手选审批人;D 当前看不到或模板未配置。B/C/D 均不得直接进入真实员工试用。
15. WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1 三天结束后再做人工问答:进入 WEXT1-LIVE、先处理指定 finding、或暂停;未确认前不启用真实员工,不创建外出/加班 live 样件。 15. 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。
16. WREAL1-PREP 当前只准备清单,不要求提供真实员工;后续真实试用必须等请假、补卡、外出、加班四类测试号证据和 WAPPR1 审批规则门禁通过后再问,默认仍从 1 名真实员工 + 1 名审批人/管理员观察开始。 16. WEXT1-LIVE 已锁定为外出+加班两类一起创建 OA-POC 测试模板和低风险审批单,固定 `SMOKE002 -> SMOKE101`、`WECOM_AGENT_SECRET` 和双开关;样件保留审计,由 `SMOKE101` 真机确认消息卡片、列表、详情页、按钮风险和审批人是否自动带出。
17. 完整镜像、应急接管、恢复回写、RuleOps、图片 OCR、复杂 BPM、预算、ERP 和银行流水导入继续冻结;镜像必须等真实小范围试用通过后再规划。 17. Day 0 公网报告为 `/app/artifacts/qa-flow/wroad2-ops-20260520-041941/summary.json`,结论 `PASS_WITH_FINDINGS`:企微 runtime、补偿归档、离线归档读取和隐私扫描通过;finding 为缺 live smoke 登录凭据/pending OCR 子检查异常以及历史 callback gap,不阻断测试账号受控试用。
18. WROAD2-CLOSEOUT/WROAD2-BIZ1/WAPPR1/WAUTO1/WEXT1LD 三天结束后再做人工问答:进入 WEXT1-LIVE、先处理指定 finding、或暂停;未确认前不启用真实员工,不创建外出/加班 live 样件。
19. WREAL1-PREP 当前只准备清单,不要求提供真实员工;后续真实试用必须等请假、补卡、外出、加班四类测试号证据和 WAPPR1 审批规则门禁通过后再问,默认仍从 1 名真实员工 + 1 名审批人/管理员观察开始。
20. 完整镜像、应急接管、恢复回写、RuleOps、图片 OCR、复杂 BPM、预算、ERP 和银行流水导入继续冻结;镜像必须等真实小范围试用通过后再规划。
问题登记最小字段: 问题登记最小字段:
@@ -0,0 +1,9 @@
"ID","Title","Description","Acceptance","Test_Method","Tools","Dev_Status","Review1_Status","Regression_Status","Files","Dependencies","Notes"
"WAUTO1-0","受控试用自动证据汇总合同建档","建立 WAUTO1 自动证据汇总合同:在不写企业微信、不启用真实员工的前提下,汇总 WROAD2/WARCH3/WCHECK1/WROAD2-BIZ1/WAPPR1/WEXT1 dry-run 证据,并准备三天受控试用汇总。企微 Secret 来源固定 WECOM_AGENT_SECRET;不尝试其他 Secret、无 fallback、不允许运行时猜 Secret;缺 Secret、权限、可信 IP、可见范围或外部配置时记录 NEEDS_CONFIG 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG。","1) 新合同使用 WAUTO1-0..WAUTO1-7;2) 明确全自动只读为主,不写企微、不创建模板、不提交审批单;3) OA 写库仅限既有巡检合同允许的补偿归档/打卡摘要路径,本脚本默认不写 OA;4) 输出结论限定 PASS_AUTO_EVIDENCE_READY、PASS_WITH_FINDINGS、PAUSED_MANUAL_CONFIRMATION 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;5) 报告不泄露手机号、邮箱、token、Secret、EncodingAESKey、完整 userid、完整 template_id、完整 sp_no、表单值、附件、评论或原始 payload。","受影响流程:受控试用证据收集 -> 三天验收汇总 -> WEXT1-LIVE 问答准入;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv --profile wecom --json。","python3|node","DONE","DONE","DONE","issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv","[]","回滚/清理:删除本 CSV 或恢复事实源即可;本合同不写 OA/企微业务数据,不部署时无运行态影响。"
"WAUTO1-1","自动证据汇总脚本","新增 QA-only 脚本 scripts/qa/collect-wecom-controlled-trial-evidence.sh,自动读取本地或远端运行环境中的既有 WROAD2/WARCH3/WCHECK1/WEXT1 dry-run 报告,并复跑只读门禁。脚本不得调用会设置 WECOM_ARCHIVE_WRITE=1、WECOM_CHECKIN_ARCHIVE_WRITE=1 或 WECOM_APPROVAL_FIXTURE_WRITE=1 的路径。","1) 脚本可执行 bash -n;2) 复检公网 /ready;3) 使用 WARCH3 summary-only 聚合既有 WROAD2 报告,不触发 WROAD2 写库路径;4) 复跑审批补偿只读、审批归档离线读取、打卡摘要 offline、外出/加班 fixture dry-run;5) 不写企业微信、不创建模板、不提交审批单、不写 OA DB;6) 生成 artifacts/qa-flow/wecom-controlled-trial-evidence-<timestamp>/summary.json。","受影响流程:公网就绪 -> 只读补偿 -> OA 离线归档 -> 打卡摘要离线 -> 外出/加班 dry-run -> 汇总报告;验证步骤:bash -n scripts/qa/collect-wecom-controlled-trial-evidence.sh;scripts/qa/collect-wecom-controlled-trial-evidence.sh。","bash|node|npm|curl","DONE","DONE","DONE","scripts/qa/collect-wecom-controlled-trial-evidence.sh","[""WAUTO1-0""]","回滚/清理:删除脚本或恢复本文件;脚本默认只读,不设置写入环境变量,不持久安装 cron/systemd timer。"
"WAUTO1-2","证据汇总结论和脱敏边界","自动汇总脚本读取子报告状态并归类 finding、manual gate 和外部阻断;报告只保存状态、计数、报告路径和脱敏边界。","1) 子报告包含 public-ready、WARCH3 summary、approval compensation readonly、approval archive offline、checkin summary offline、outing/overtime dry-run;2) 有阻断时输出 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;3) 有已知 finding 或子报告 PASS_WITH_FINDINGS 时输出 PASS_WITH_FINDINGS;4) 自动证据可用但 WAPPR1/三天人工业务仍待确认时输出 PAUSED_MANUAL_CONFIRMATION;5) 隐私扫描覆盖 summary 和子报告日志。","受影响流程:子报告收集 -> 状态归类 -> 隐私扫描 -> 三天验收问答;验证步骤:scripts/qa/collect-wecom-controlled-trial-evidence.sh;rg -n ""PASS_AUTO_EVIDENCE_READY|PAUSED_MANUAL_CONFIRMATION|SKIP/BLOCKED_BY_EXTERNAL_CONFIG|privacy"" scripts/qa/collect-wecom-controlled-trial-evidence.sh。","bash|node|rg","DONE","DONE","DONE","scripts/qa/collect-wecom-controlled-trial-evidence.sh","[""WAUTO1-1""]","回滚/清理:报告位于 artifacts/qa-flow,可保留审计;如误生成报告,删除对应本地 artifacts 目录即可,不影响 OA/企微数据。"
"WAUTO1-3","WAPPR1 人工确认模板","在管理员手册和事实源中补充 WAPPR1 逐模板人工确认清单:请假、补卡、外出、加班分别确认模板入口、适用范围、审批人规则、是否允许申请人手选、是否可能自审、主管链缺失时表现、审批人不可见或停用时表现。","1) 每个模板人工选项固定为 A 审批人自动带出且申请人不能任意选择、B 默认带出但申请人仍可改人、C 必须申请人手选审批人、D 当前看不到或模板未配置;2) B/C/D 均不得直接进入真实试用;3) 不保存 Secret、token、完整 userid、完整审批单号或表单值;4) 结果可写入试运行报告或 WAPPR1 Notes。","受影响流程:企微模板后台确认 -> 审批规则门禁 -> WREAL1 准入;验证步骤:rg -n ""WAPPR1 人工确认|审批人自动带出|申请人不能任意选择|必须申请人手选|当前看不到或模板未配置"" docs/管理员手册.md docs/trialrun/人工试运行报告.md docs/企微优先开发路线图.md。","rg|manual","DONE","DONE","DONE","docs/管理员手册.md|docs/trialrun/人工试运行报告.md|docs/企微优先开发路线图.md","[""WAUTO1-0""]","回滚/清理:恢复本轮文档改动;若模板规则不满足,保持测试账号范围或对应模板 OA 主办,不进入真实员工试用。"
"WAUTO1-4","三天汇总问答准入","固化三天自动证据和人工业务冒烟后的问答出口,不自动进入外出/加班 live 或真实员工试用。","1) 三天汇总后问答选项固定为 A 接受 PASS_AUTO_EVIDENCE_READY 并进入 WEXT1-LIVE live 问答、B 接受 PASS_WITH_FINDINGS 但先处理指定 finding、C 暂停;2) 正常和已知 observation 不每日打扰;3) 新增异常、状态恶化、阻断或脚本失败才提醒;4) WEXT1-LIVE live 写入仍需独立合同和人工确认。","受影响流程:Day 0-3 自动报告 -> 人工业务冒烟 -> 审批规则门禁 -> WEXT1-LIVE 问答;验证步骤:rg -n ""PASS_AUTO_EVIDENCE_READY|PASS_WITH_FINDINGS|WEXT1-LIVE live 问答|暂停"" docs docs/管理员手册.md .agents/skills/hyb-oa-delivery/SKILL.md。","rg","DONE","DONE","DONE","docs/企微优先开发路线图.md|docs/管理员手册.md|docs/trialrun/人工试运行报告.md|.agents/skills/hyb-oa-delivery/SKILL.md","[""WAUTO1-3""]","回滚/清理:恢复事实源改动;不修改企微后台、不写业务数据。"
"WAUTO1-5","事实源回写","更新路线图、管理员手册、试运行报告、文档索引、事实源矩阵和项目 skill,登记 WAUTO1 自动证据汇总和 WEXT1LD dry-run gate。","1) 路线明确 WAUTO1 是只读证据汇总,不替代 WARCH3 定时巡检;2) WEXT1LD 只执行外出/加班 dry-run,不创建模板或审批单;3) WEXT1-LIVE 只能在 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1 和 dry-run 可解释通过后问答进入;4) 真实员工试用仍后置。","受影响流程:事实源 -> 自动证据汇总 -> WEXT1LD dry-run -> WEXT1-LIVE/WREAL1 问答;验证步骤:node scripts/qa/audit-docs.mjs --check-registry;python3 /home/shunli/.codex/skills/.system/skill-creator/scripts/quick_validate.py .agents/skills/hyb-oa-delivery;rg -n ""WAUTO1|WEXT1LD|collect-wecom-controlled-trial-evidence|WAPPR1 人工确认"" 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","[""WAUTO1-4""]","回滚/清理:恢复文档和 skill 改动;不影响已存在审计报告。"
"WAUTO1-6","本地和公网只读验证","执行合同门禁、脚本语法、文档门禁、最小门禁,并在受控部署后远端只读执行自动证据汇总脚本。","1) 两个新 CSV 校验通过;2) baseline 和 issue-specific process gate 通过;3) bash -n 通过;4) audit-docs、skill quick_validate、git diff --check、scripts/check-minimal.sh 通过;5) SYNC_ENV=0 部署后远端 /ready 正常;6) 远端自动证据汇总报告不泄露敏感数据。","受影响流程:本地门禁 -> 受控部署 -> 远端只读证据汇总 -> 三天验收准备;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv;node scripts/qa/check-process-contract.mjs --baseline --json;bash -n scripts/qa/collect-wecom-controlled-trial-evidence.sh;SYNC_ENV=0 bash deploy/trialrun/deploy.sh;ssh 远端执行脚本。","python3|node|bash|ssh","DONE","DONE","DONE","issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv|scripts/qa/collect-wecom-controlled-trial-evidence.sh|deploy/trialrun/*","[""WAUTO1-5""]","回滚/清理:如远端只读验证失败,仅记录真实 PARTIAL/SKIP,不改远端 env,不写企微;部署使用 SYNC_ENV=0,不覆盖远端密钥。远端报告 /app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-103617/summary.json 为 PAUSED_MANUAL_CONFIRMATION:自动子链可解释通过或 PASS_WITH_FINDINGS,但 WAPPR1/三天业务人工门禁仍待确认。"
"WAUTO1-7","状态回填与中文提交","完成 WAUTO1/WEXT1LD 状态回填、本地门禁、公网只读验证和中文提交。","1) CSV 状态与真实执行结果一致;2) 自动证据汇总报告路径回写;3) WEXT1LD dry-run 结果回写;4) git status 干净;5) 中文提交包含 WAUTO1/WEXT1LD。","受影响流程:证据汇总 -> 状态回填 -> 提交 -> 后续人工问答;验证步骤:git diff --check;git status --short;git log -1 --oneline。","git","DONE","DONE","DONE","issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv|issues/2026-05-20_18-04-16-wecom-outing-overtime-live-dryrun-gate-v1.csv|scripts/qa/collect-wecom-controlled-trial-evidence.sh|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md","[""WAUTO1-6""]","提交建议:WAUTO1 WEXT1LD 增加受控试用自动证据汇总。状态边界:远端汇总为 PAUSED_MANUAL_CONFIRMATION,不放行 live;后续必须等人工问答。"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 WAUTO1-0 受控试用自动证据汇总合同建档 建立 WAUTO1 自动证据汇总合同:在不写企业微信、不启用真实员工的前提下,汇总 WROAD2/WARCH3/WCHECK1/WROAD2-BIZ1/WAPPR1/WEXT1 dry-run 证据,并准备三天受控试用汇总。企微 Secret 来源固定 WECOM_AGENT_SECRET;不尝试其他 Secret、无 fallback、不允许运行时猜 Secret;缺 Secret、权限、可信 IP、可见范围或外部配置时记录 NEEDS_CONFIG 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG。 1) 新合同使用 WAUTO1-0..WAUTO1-7;2) 明确全自动只读为主,不写企微、不创建模板、不提交审批单;3) OA 写库仅限既有巡检合同允许的补偿归档/打卡摘要路径,本脚本默认不写 OA;4) 输出结论限定 PASS_AUTO_EVIDENCE_READY、PASS_WITH_FINDINGS、PAUSED_MANUAL_CONFIRMATION 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;5) 报告不泄露手机号、邮箱、token、Secret、EncodingAESKey、完整 userid、完整 template_id、完整 sp_no、表单值、附件、评论或原始 payload。 受影响流程:受控试用证据收集 -> 三天验收汇总 -> WEXT1-LIVE 问答准入;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv --profile wecom --json。 python3|node DONE DONE DONE issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv [] 回滚/清理:删除本 CSV 或恢复事实源即可;本合同不写 OA/企微业务数据,不部署时无运行态影响。
3 WAUTO1-1 自动证据汇总脚本 新增 QA-only 脚本 scripts/qa/collect-wecom-controlled-trial-evidence.sh,自动读取本地或远端运行环境中的既有 WROAD2/WARCH3/WCHECK1/WEXT1 dry-run 报告,并复跑只读门禁。脚本不得调用会设置 WECOM_ARCHIVE_WRITE=1、WECOM_CHECKIN_ARCHIVE_WRITE=1 或 WECOM_APPROVAL_FIXTURE_WRITE=1 的路径。 1) 脚本可执行 bash -n;2) 复检公网 /ready;3) 使用 WARCH3 summary-only 聚合既有 WROAD2 报告,不触发 WROAD2 写库路径;4) 复跑审批补偿只读、审批归档离线读取、打卡摘要 offline、外出/加班 fixture dry-run;5) 不写企业微信、不创建模板、不提交审批单、不写 OA DB;6) 生成 artifacts/qa-flow/wecom-controlled-trial-evidence-<timestamp>/summary.json。 受影响流程:公网就绪 -> 只读补偿 -> OA 离线归档 -> 打卡摘要离线 -> 外出/加班 dry-run -> 汇总报告;验证步骤:bash -n scripts/qa/collect-wecom-controlled-trial-evidence.sh;scripts/qa/collect-wecom-controlled-trial-evidence.sh。 bash|node|npm|curl DONE DONE DONE scripts/qa/collect-wecom-controlled-trial-evidence.sh ["WAUTO1-0"] 回滚/清理:删除脚本或恢复本文件;脚本默认只读,不设置写入环境变量,不持久安装 cron/systemd timer。
4 WAUTO1-2 证据汇总结论和脱敏边界 自动汇总脚本读取子报告状态并归类 finding、manual gate 和外部阻断;报告只保存状态、计数、报告路径和脱敏边界。 1) 子报告包含 public-ready、WARCH3 summary、approval compensation readonly、approval archive offline、checkin summary offline、outing/overtime dry-run;2) 有阻断时输出 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;3) 有已知 finding 或子报告 PASS_WITH_FINDINGS 时输出 PASS_WITH_FINDINGS;4) 自动证据可用但 WAPPR1/三天人工业务仍待确认时输出 PAUSED_MANUAL_CONFIRMATION;5) 隐私扫描覆盖 summary 和子报告日志。 受影响流程:子报告收集 -> 状态归类 -> 隐私扫描 -> 三天验收问答;验证步骤:scripts/qa/collect-wecom-controlled-trial-evidence.sh;rg -n "PASS_AUTO_EVIDENCE_READY|PAUSED_MANUAL_CONFIRMATION|SKIP/BLOCKED_BY_EXTERNAL_CONFIG|privacy" scripts/qa/collect-wecom-controlled-trial-evidence.sh。 bash|node|rg DONE DONE DONE scripts/qa/collect-wecom-controlled-trial-evidence.sh ["WAUTO1-1"] 回滚/清理:报告位于 artifacts/qa-flow,可保留审计;如误生成报告,删除对应本地 artifacts 目录即可,不影响 OA/企微数据。
5 WAUTO1-3 WAPPR1 人工确认模板 在管理员手册和事实源中补充 WAPPR1 逐模板人工确认清单:请假、补卡、外出、加班分别确认模板入口、适用范围、审批人规则、是否允许申请人手选、是否可能自审、主管链缺失时表现、审批人不可见或停用时表现。 1) 每个模板人工选项固定为 A 审批人自动带出且申请人不能任意选择、B 默认带出但申请人仍可改人、C 必须申请人手选审批人、D 当前看不到或模板未配置;2) B/C/D 均不得直接进入真实试用;3) 不保存 Secret、token、完整 userid、完整审批单号或表单值;4) 结果可写入试运行报告或 WAPPR1 Notes。 受影响流程:企微模板后台确认 -> 审批规则门禁 -> WREAL1 准入;验证步骤:rg -n "WAPPR1 人工确认|审批人自动带出|申请人不能任意选择|必须申请人手选|当前看不到或模板未配置" docs/管理员手册.md docs/trialrun/人工试运行报告.md docs/企微优先开发路线图.md。 rg|manual DONE DONE DONE docs/管理员手册.md|docs/trialrun/人工试运行报告.md|docs/企微优先开发路线图.md ["WAUTO1-0"] 回滚/清理:恢复本轮文档改动;若模板规则不满足,保持测试账号范围或对应模板 OA 主办,不进入真实员工试用。
6 WAUTO1-4 三天汇总问答准入 固化三天自动证据和人工业务冒烟后的问答出口,不自动进入外出/加班 live 或真实员工试用。 1) 三天汇总后问答选项固定为 A 接受 PASS_AUTO_EVIDENCE_READY 并进入 WEXT1-LIVE live 问答、B 接受 PASS_WITH_FINDINGS 但先处理指定 finding、C 暂停;2) 正常和已知 observation 不每日打扰;3) 新增异常、状态恶化、阻断或脚本失败才提醒;4) WEXT1-LIVE live 写入仍需独立合同和人工确认。 受影响流程:Day 0-3 自动报告 -> 人工业务冒烟 -> 审批规则门禁 -> WEXT1-LIVE 问答;验证步骤:rg -n "PASS_AUTO_EVIDENCE_READY|PASS_WITH_FINDINGS|WEXT1-LIVE live 问答|暂停" docs docs/管理员手册.md .agents/skills/hyb-oa-delivery/SKILL.md。 rg DONE DONE DONE docs/企微优先开发路线图.md|docs/管理员手册.md|docs/trialrun/人工试运行报告.md|.agents/skills/hyb-oa-delivery/SKILL.md ["WAUTO1-3"] 回滚/清理:恢复事实源改动;不修改企微后台、不写业务数据。
7 WAUTO1-5 事实源回写 更新路线图、管理员手册、试运行报告、文档索引、事实源矩阵和项目 skill,登记 WAUTO1 自动证据汇总和 WEXT1LD dry-run gate。 1) 路线明确 WAUTO1 是只读证据汇总,不替代 WARCH3 定时巡检;2) WEXT1LD 只执行外出/加班 dry-run,不创建模板或审批单;3) WEXT1-LIVE 只能在 WROAD2-CLOSEOUT、WROAD2-BIZ1、WAPPR1 和 dry-run 可解释通过后问答进入;4) 真实员工试用仍后置。 受影响流程:事实源 -> 自动证据汇总 -> WEXT1LD dry-run -> WEXT1-LIVE/WREAL1 问答;验证步骤:node scripts/qa/audit-docs.mjs --check-registry;python3 /home/shunli/.codex/skills/.system/skill-creator/scripts/quick_validate.py .agents/skills/hyb-oa-delivery;rg -n "WAUTO1|WEXT1LD|collect-wecom-controlled-trial-evidence|WAPPR1 人工确认" 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 ["WAUTO1-4"] 回滚/清理:恢复文档和 skill 改动;不影响已存在审计报告。
8 WAUTO1-6 本地和公网只读验证 执行合同门禁、脚本语法、文档门禁、最小门禁,并在受控部署后远端只读执行自动证据汇总脚本。 1) 两个新 CSV 校验通过;2) baseline 和 issue-specific process gate 通过;3) bash -n 通过;4) audit-docs、skill quick_validate、git diff --check、scripts/check-minimal.sh 通过;5) SYNC_ENV=0 部署后远端 /ready 正常;6) 远端自动证据汇总报告不泄露敏感数据。 受影响流程:本地门禁 -> 受控部署 -> 远端只读证据汇总 -> 三天验收准备;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv;node scripts/qa/check-process-contract.mjs --baseline --json;bash -n scripts/qa/collect-wecom-controlled-trial-evidence.sh;SYNC_ENV=0 bash deploy/trialrun/deploy.sh;ssh 远端执行脚本。 python3|node|bash|ssh DONE DONE DONE issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv|scripts/qa/collect-wecom-controlled-trial-evidence.sh|deploy/trialrun/* ["WAUTO1-5"] 回滚/清理:如远端只读验证失败,仅记录真实 PARTIAL/SKIP,不改远端 env,不写企微;部署使用 SYNC_ENV=0,不覆盖远端密钥。远端报告 /app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-103617/summary.json 为 PAUSED_MANUAL_CONFIRMATION:自动子链可解释通过或 PASS_WITH_FINDINGS,但 WAPPR1/三天业务人工门禁仍待确认。
9 WAUTO1-7 状态回填与中文提交 完成 WAUTO1/WEXT1LD 状态回填、本地门禁、公网只读验证和中文提交。 1) CSV 状态与真实执行结果一致;2) 自动证据汇总报告路径回写;3) WEXT1LD dry-run 结果回写;4) git status 干净;5) 中文提交包含 WAUTO1/WEXT1LD。 受影响流程:证据汇总 -> 状态回填 -> 提交 -> 后续人工问答;验证步骤:git diff --check;git status --short;git log -1 --oneline。 git DONE DONE DONE issues/2026-05-20_18-04-16-wecom-controlled-trial-auto-evidence-v1.csv|issues/2026-05-20_18-04-16-wecom-outing-overtime-live-dryrun-gate-v1.csv|scripts/qa/collect-wecom-controlled-trial-evidence.sh|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md ["WAUTO1-6"] 提交建议:WAUTO1 WEXT1LD 增加受控试用自动证据汇总。状态边界:远端汇总为 PAUSED_MANUAL_CONFIRMATION,不放行 live;后续必须等人工问答。
@@ -0,0 +1,7 @@
"ID","Title","Description","Acceptance","Test_Method","Tools","Dev_Status","Review1_Status","Regression_Status","Files","Dependencies","Notes"
"WEXT1LD-0","外出加班 live 前 dry-run 合同建档","建立 WEXT1LD 外出/加班 live 前 dry-run gate;本阶段只执行远端 dry-run,不写企业微信、不创建模板、不提交审批单。企微 Secret 来源固定 WECOM_AGENT_SECRET;不尝试其他 Secret、无 fallback、不允许运行时猜 Secret;缺 Secret、权限、可信 IP、可见范围或外部配置时输出 NEEDS_CONFIG 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG。","1) 新合同使用 WEXT1LD-0..WEXT1LD-5;2) 只 dry-run 外出和加班两类 OA-POC payload;3) 不设置 WECOM_APPROVAL_FIXTURE_WRITE=1;4) 不带 --live、--create-templates、--submit-test-approvals;5) 结果作为 WEXT1-LIVE 人工问答前置,不自动批准 live。","受影响流程:外出/加班样件 dry-run -> WEXT1-LIVE live 问答 -> 四类测试号证据;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-20_18-04-16-wecom-outing-overtime-live-dryrun-gate-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-20_18-04-16-wecom-outing-overtime-live-dryrun-gate-v1.csv --profile wecom --json。","python3|node","DONE","DONE","DONE","issues/2026-05-20_18-04-16-wecom-outing-overtime-live-dryrun-gate-v1.csv","[]","回滚/清理:本合同仅 dry-run;如失败,保留请假/补卡范围,不进入外出/加班 live,不写企微。"
"WEXT1LD-1","dry-run 命令和双开关保护","远端 dry-run 使用现有 runner:npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime。明确 live 写入必须另起 WEXT1-LIVE 合同并同时具备 WECOM_APPROVAL_FIXTURE_WRITE=1、--live、--create-templates、--submit-test-approvals 和人工批准。","1) dry-run 命令不含 live 写入参数;2) runner 固定测试链 SMOKE002 -> SMOKE101,禁止自审;3) 预检 active、已绑定企微、可见、不是同一 OA 员工、不是同一企微 userid;4) SMOKE101 不可用时不自动换人;5) dry-run 不获取写入 token。","受影响流程:外出/加班 payload 构建 -> 非自审预检 -> dry-run 报告;验证步骤:scripts/qa/collect-wecom-controlled-trial-evidence.sh;远端核对 /app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-103617/wecom-approval-fixtures-dryrun/summary.json 的 status=PASS_FIXTURE_DRY_RUN_READY、checks.liveWrite.requested=false、checks.liveWrite.allowed=false。","bash|node","DONE","DONE","DONE","scripts/qa/collect-wecom-controlled-trial-evidence.sh|server/src/scripts/check-wecom-approval-fixtures.js","[""WEXT1LD-0""]","回滚/清理:dry-run 只生成 artifacts 报告;如需 live,必须重新问答和新合同,本行不授权写企微。"
"WEXT1LD-2","远端 dry-run 证据","在 SYNC_ENV=0 受控部署后远端执行外出/加班 dry-run,报告作为 WEXT1-LIVE 前置证据。","1) 远端 /ready 正常;2) dry-run 结论优先 PASS_FIXTURE_DRY_RUN_READY;3) 若缺配置记录 PARTIAL_FIXTURE_NEEDS_CONFIG 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;4) 结果不伪造成 PASS;5) 不改变远端 env,不覆盖密钥。","受影响流程:受控部署 -> 远端 dry-run -> live 前问答;验证步骤:SYNC_ENV=0 bash deploy/trialrun/deploy.sh;ssh 远端执行 npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime;核对 summary.json。","bash|ssh|npm","DONE","DONE","DONE","deploy/trialrun/deploy.sh|artifacts/qa-flow/*","[""WEXT1LD-1""]","回滚/清理:远端仅生成报告;不写 OA/企微业务数据,不创建模板或审批单。远端证据在 /app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-103617/wecom-approval-fixtures-dryrun/summary.json,状态 PASS_FIXTURE_DRY_RUN_READY,liveWrite.requested=false 且 allowed=false。"
"WEXT1LD-3","脱敏报告边界","外出/加班 dry-run 和 WAUTO1 汇总报告只输出目标类型、计数、状态、脱敏 userid/template/sp_no 前缀和报告路径,不输出敏感信息。","1) 不输出手机号、邮箱、token、Secret、EncodingAESKey、完整 userid、完整 template_id、完整 sp_no、表单值、附件、评论或原始 payload;2) 隐私关键词扫描通过;3) 若发现泄露则阻断提交和 live 问答。","受影响流程:dry-run 报告 -> 隐私扫描 -> WEXT1-LIVE 问答;验证步骤:scripts/qa/collect-wecom-controlled-trial-evidence.sh;grep 隐私关键词扫描无命中;git diff --check。","bash|grep|git","DONE","DONE","DONE","scripts/qa/collect-wecom-controlled-trial-evidence.sh|artifacts/qa-flow/*","[""WEXT1LD-2""]","回滚/清理:删除含问题的本地 artifacts 报告并修正脚本后复跑;不保存敏感原始 payload。"
"WEXT1LD-4","事实源和人工问答出口","更新事实源,明确 dry-run 通过后只进入问答,不自动 live 创建外出/加班样件。","1) WEXT1-LIVE 问答选项固定为 A 批准一次 live 创建外出+加班 OA-POC 样件并保留审计、B 只保留 dry-run 不创建样件、C 外出/加班移出 V1;2) live 前再次说明当前状态、改了什么、测了什么、会留下什么企微记录和清理/保留边界;3) WREAL1 仍等四类测试号证据和 WAPPR1 通过后再问。","受影响流程:WEXT1LD dry-run -> WEXT1-LIVE 问答 -> WREAL1 前置;验证步骤:rg -n ""WEXT1LD|批准一次 live 创建外出\+加班|只保留 dry-run|外出/加班移出 V1|四类测试号证据"" docs .agents/skills/hyb-oa-delivery/SKILL.md。","rg","DONE","DONE","DONE","docs/企微优先开发路线图.md|docs/管理员手册.md|docs/trialrun/人工试运行报告.md|docs/文档索引.md|docs/文档事实源状态矩阵.md|.agents/skills/hyb-oa-delivery/SKILL.md","[""WEXT1LD-3""]","回滚/清理:恢复文档和 skill;不修改企微模板。"
"WEXT1LD-5","状态回填与提交","完成 WEXT1LD 状态回填、门禁、远端 dry-run 证据和中文提交。","1) WEXT1LD CSV 校验通过;2) process gate 通过;3) dry-run 报告路径回写;4) 中文提交包含 WEXT1LD;5) 未授权 live 写入。","受影响流程:dry-run 证据 -> 状态回填 -> live 问答准备;验证步骤:validate_issues_csv.py WEXT1LD CSV;node scripts/qa/check-process-contract.mjs --issue WEXT1LD CSV --profile wecom --json;git status --short;git log -1 --oneline。","python3|node|git","DONE","DONE","DONE","issues/2026-05-20_18-04-16-wecom-outing-overtime-live-dryrun-gate-v1.csv|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md","[""WEXT1LD-4""]","回滚/清理:本行仅状态回填和提交;不授权 live 创建,若 dry-run 证据无效则回退 CSV 状态并重新执行。远端 dry-run 已 PASS,但 WAUTO1 总结论仍为 PAUSED_MANUAL_CONFIRMATION,需等人工问答。提交建议:WAUTO1 WEXT1LD 增加受控试用自动证据汇总。"
1 ID Title Description Acceptance Test_Method Tools Dev_Status Review1_Status Regression_Status Files Dependencies Notes
2 WEXT1LD-0 外出加班 live 前 dry-run 合同建档 建立 WEXT1LD 外出/加班 live 前 dry-run gate;本阶段只执行远端 dry-run,不写企业微信、不创建模板、不提交审批单。企微 Secret 来源固定 WECOM_AGENT_SECRET;不尝试其他 Secret、无 fallback、不允许运行时猜 Secret;缺 Secret、权限、可信 IP、可见范围或外部配置时输出 NEEDS_CONFIG 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG。 1) 新合同使用 WEXT1LD-0..WEXT1LD-5;2) 只 dry-run 外出和加班两类 OA-POC payload;3) 不设置 WECOM_APPROVAL_FIXTURE_WRITE=1;4) 不带 --live、--create-templates、--submit-test-approvals;5) 结果作为 WEXT1-LIVE 人工问答前置,不自动批准 live。 受影响流程:外出/加班样件 dry-run -> WEXT1-LIVE live 问答 -> 四类测试号证据;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-20_18-04-16-wecom-outing-overtime-live-dryrun-gate-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-20_18-04-16-wecom-outing-overtime-live-dryrun-gate-v1.csv --profile wecom --json。 python3|node DONE DONE DONE issues/2026-05-20_18-04-16-wecom-outing-overtime-live-dryrun-gate-v1.csv [] 回滚/清理:本合同仅 dry-run;如失败,保留请假/补卡范围,不进入外出/加班 live,不写企微。
3 WEXT1LD-1 dry-run 命令和双开关保护 远端 dry-run 使用现有 runner:npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime。明确 live 写入必须另起 WEXT1-LIVE 合同并同时具备 WECOM_APPROVAL_FIXTURE_WRITE=1、--live、--create-templates、--submit-test-approvals 和人工批准。 1) dry-run 命令不含 live 写入参数;2) runner 固定测试链 SMOKE002 -> SMOKE101,禁止自审;3) 预检 active、已绑定企微、可见、不是同一 OA 员工、不是同一企微 userid;4) SMOKE101 不可用时不自动换人;5) dry-run 不获取写入 token。 受影响流程:外出/加班 payload 构建 -> 非自审预检 -> dry-run 报告;验证步骤:scripts/qa/collect-wecom-controlled-trial-evidence.sh;远端核对 /app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-103617/wecom-approval-fixtures-dryrun/summary.json 的 status=PASS_FIXTURE_DRY_RUN_READY、checks.liveWrite.requested=false、checks.liveWrite.allowed=false。 bash|node DONE DONE DONE scripts/qa/collect-wecom-controlled-trial-evidence.sh|server/src/scripts/check-wecom-approval-fixtures.js ["WEXT1LD-0"] 回滚/清理:dry-run 只生成 artifacts 报告;如需 live,必须重新问答和新合同,本行不授权写企微。
4 WEXT1LD-2 远端 dry-run 证据 在 SYNC_ENV=0 受控部署后远端执行外出/加班 dry-run,报告作为 WEXT1-LIVE 前置证据。 1) 远端 /ready 正常;2) dry-run 结论优先 PASS_FIXTURE_DRY_RUN_READY;3) 若缺配置记录 PARTIAL_FIXTURE_NEEDS_CONFIG 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;4) 结果不伪造成 PASS;5) 不改变远端 env,不覆盖密钥。 受影响流程:受控部署 -> 远端 dry-run -> live 前问答;验证步骤:SYNC_ENV=0 bash deploy/trialrun/deploy.sh;ssh 远端执行 npm run check:wecom-approval-fixtures -- --format=json --target=outing --target=overtime;核对 summary.json。 bash|ssh|npm DONE DONE DONE deploy/trialrun/deploy.sh|artifacts/qa-flow/* ["WEXT1LD-1"] 回滚/清理:远端仅生成报告;不写 OA/企微业务数据,不创建模板或审批单。远端证据在 /app/artifacts/qa-flow/wecom-controlled-trial-evidence-20260520-103617/wecom-approval-fixtures-dryrun/summary.json,状态 PASS_FIXTURE_DRY_RUN_READY,liveWrite.requested=false 且 allowed=false。
5 WEXT1LD-3 脱敏报告边界 外出/加班 dry-run 和 WAUTO1 汇总报告只输出目标类型、计数、状态、脱敏 userid/template/sp_no 前缀和报告路径,不输出敏感信息。 1) 不输出手机号、邮箱、token、Secret、EncodingAESKey、完整 userid、完整 template_id、完整 sp_no、表单值、附件、评论或原始 payload;2) 隐私关键词扫描通过;3) 若发现泄露则阻断提交和 live 问答。 受影响流程:dry-run 报告 -> 隐私扫描 -> WEXT1-LIVE 问答;验证步骤:scripts/qa/collect-wecom-controlled-trial-evidence.sh;grep 隐私关键词扫描无命中;git diff --check。 bash|grep|git DONE DONE DONE scripts/qa/collect-wecom-controlled-trial-evidence.sh|artifacts/qa-flow/* ["WEXT1LD-2"] 回滚/清理:删除含问题的本地 artifacts 报告并修正脚本后复跑;不保存敏感原始 payload。
6 WEXT1LD-4 事实源和人工问答出口 更新事实源,明确 dry-run 通过后只进入问答,不自动 live 创建外出/加班样件。 1) WEXT1-LIVE 问答选项固定为 A 批准一次 live 创建外出+加班 OA-POC 样件并保留审计、B 只保留 dry-run 不创建样件、C 外出/加班移出 V1;2) live 前再次说明当前状态、改了什么、测了什么、会留下什么企微记录和清理/保留边界;3) WREAL1 仍等四类测试号证据和 WAPPR1 通过后再问。 受影响流程:WEXT1LD dry-run -> WEXT1-LIVE 问答 -> WREAL1 前置;验证步骤:rg -n "WEXT1LD|批准一次 live 创建外出\+加班|只保留 dry-run|外出/加班移出 V1|四类测试号证据" docs .agents/skills/hyb-oa-delivery/SKILL.md。 rg DONE DONE DONE docs/企微优先开发路线图.md|docs/管理员手册.md|docs/trialrun/人工试运行报告.md|docs/文档索引.md|docs/文档事实源状态矩阵.md|.agents/skills/hyb-oa-delivery/SKILL.md ["WEXT1LD-3"] 回滚/清理:恢复文档和 skill;不修改企微模板。
7 WEXT1LD-5 状态回填与提交 完成 WEXT1LD 状态回填、门禁、远端 dry-run 证据和中文提交。 1) WEXT1LD CSV 校验通过;2) process gate 通过;3) dry-run 报告路径回写;4) 中文提交包含 WEXT1LD;5) 未授权 live 写入。 受影响流程:dry-run 证据 -> 状态回填 -> live 问答准备;验证步骤:validate_issues_csv.py WEXT1LD CSV;node scripts/qa/check-process-contract.mjs --issue WEXT1LD CSV --profile wecom --json;git status --short;git log -1 --oneline。 python3|node|git DONE DONE DONE issues/2026-05-20_18-04-16-wecom-outing-overtime-live-dryrun-gate-v1.csv|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md ["WEXT1LD-4"] 回滚/清理:本行仅状态回填和提交;不授权 live 创建,若 dry-run 证据无效则回退 CSV 状态并重新执行。远端 dry-run 已 PASS,但 WAUTO1 总结论仍为 PAUSED_MANUAL_CONFIRMATION,需等人工问答。提交建议:WAUTO1 WEXT1LD 增加受控试用自动证据汇总。
+315
查看文件
@@ -0,0 +1,315 @@
#!/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="${WAUTO1_REPORT_DIR:-$ROOT_DIR/artifacts/qa-flow/wecom-controlled-trial-evidence-$(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"
}
latest_summary() {
local pattern="$1"
find "$ROOT_DIR/artifacts/qa-flow" -maxdepth 3 -path "$pattern" -type f 2>/dev/null \
| sort \
| tail -n 1
}
run_step() {
local name="$1"
shift
local log_file="$REPORT_DIR/${name}.log"
log ">>> [wauto1] $name"
if "$@" > >(tee "$log_file") 2>&1; then
log "[wauto1][PASS] $name"
else
local code="$?"
log "[wauto1][FAIL] $name exit=$code"
STATUS=1
fi
}
run_finding_step() {
local name="$1"
shift
local log_file="$REPORT_DIR/${name}.log"
log ">>> [wauto1] $name"
if "$@" > >(tee "$log_file") 2>&1; then
log "[wauto1][PASS] $name"
else
local code="$?"
log "[wauto1][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 ">>> [wauto1] $name"
if (cd "$SERVER_DIR" && "$@") > >(tee "$log_file") 2>&1; then
log "[wauto1][PASS] $name"
else
local code="$?"
log "[wauto1][FINDING] $name exit=$code"
FINDING_COUNT=$((FINDING_COUNT + 1))
fi
}
run_ready() {
run_step "public-ready" curl -fsS "$PUBLIC_BASE_URL/ready"
}
run_warch3_summary_only() {
local wroad2_summary
wroad2_summary="$(latest_summary '*/wroad2-ops-*/summary.json')"
if [[ -z "$wroad2_summary" ]]; then
log "[wauto1][FINDING] warch3-summary-only missing latest WROAD2 summary"
FINDING_COUNT=$((FINDING_COUNT + 1))
return 0
fi
run_finding_step "warch3-summary-only" env \
WARCH3_SKIP_WROAD2=1 \
WARCH3_SEND_ALERT=0 \
WARCH3_WROAD2_SUMMARY_FILE="$wroad2_summary" \
WARCH3_OPS_REPORT_DIR="$REPORT_DIR/warch3-summary" \
bash "$ROOT_DIR/scripts/qa/run-warch3-ops-daily.sh"
}
run_readonly_runners() {
run_server_finding_step "approval-compensation-readonly" npm run check:wecom-approval-compensation-poc -- --live --format=json --discover-template-ids --report-dir="$REPORT_DIR/wecom-approval-compensation-poc"
run_server_finding_step "approval-archive-offline" npm run check:wecom-approval-archive -- --offline --format=json --report-dir="$REPORT_DIR/wecom-approval-archive"
run_server_finding_step "checkin-summary-offline" npm run check:wecom-checkin-summary-archive -- --offline --format=json --report-dir="$REPORT_DIR/wecom-checkin-summary-archive"
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"
}
write_manual_checklist() {
cat >"$REPORT_DIR/wappr1-manual-checklist.md" <<'EOF'
# WAPPR1 人工确认清单
请分别检查请假、补卡、外出、加班模板,并按每个模板给出一个选项:
- A:审批人自动带出,申请人不能任意选择。
- B:审批人默认带出,但申请人仍可改人。
- C:必须申请人手选审批人。
- D:当前看不到或模板未配置。
需要记录的字段:模板入口、适用范围、审批人规则、是否允许申请人手选、是否可能自审、主管链缺失时表现、审批人不可见或停用时表现。
边界:不要记录 Secret、token、EncodingAESKey、完整 userid、完整审批单号、完整 template_id、表单值、附件、评论或原始 payload。
EOF
}
run_privacy_smoke() {
local sensitive_pattern='access_token=[A-Za-z0-9._-]{8,}|1[3-9][0-9]{9}|[[:alnum:]._%+-]+@[[:alnum:].-]+\.[[:alpha:]]{2,}|-----BEGIN|BEGIN [A-Z ]*KEY|"((token|secret|password|EncodingAESKey|encodingAESKey|sp_no|spNo|template_id|templateId|userid|userId|external_userid|externalUserId|external_user_id))"[[:space:]]*:[[:space:]]*"[^"*]{8,}"|\b20[0-9]{12,}\b|"(raw|rawPayload|raw_payload|payload|xml|ciphertext|Encrypt|formValue|formValues|attachments|comments)"[[:space:]]*:'
if grep -RInE "$sensitive_pattern" "$REPORT_DIR"; then
log "[wauto1][FAIL] privacy smoke matched sensitive pattern"
STATUS=1
else
log "[wauto1][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 findLatestSummary(prefix) {
const qaRoot = path.join(rootDir, "artifacts/qa-flow");
let files = [];
try {
files = 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();
} catch {}
return files.at(-1) || null;
}
function childReport(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,
};
}
function safeStatus(value) {
return String(value || "UNKNOWN").slice(0, 80);
}
function isBlocked(status) {
return /SKIP|BLOCKED|FAIL|ERROR/i.test(status);
}
function isPartial(status) {
return /PARTIAL|NEEDS_CONFIG|NEEDS_DATA|MISSING/i.test(status);
}
function isFinding(status) {
return /FINDING/i.test(status);
}
let commit = "unknown";
try {
commit = execSync("git rev-parse --short HEAD", { cwd: rootDir, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
} catch {}
const childReports = {
publicReady: {
status: Number(statusInput || 0) === 0 ? "PASS" : "FAIL",
reportPath: path.resolve(path.join(reportDir, "public-ready.log")),
},
warch3Summary: childReport("warch3-summary"),
approvalCompensationReadonly: childReport("wecom-approval-compensation-poc"),
approvalArchiveOffline: childReport("wecom-approval-archive"),
checkinSummaryOffline: childReport("wecom-checkin-summary-archive"),
outingOvertimeDryRun: childReport("wecom-approval-fixtures-dryrun"),
};
const sourceReports = {
latestWroad2: findLatestSummary("wroad2-ops-"),
latestWarch3: findLatestSummary("warch3-ops-"),
latestCheckin: findLatestSummary("wecom-checkin-summary-archive-"),
latestOutingOvertimeDryRun: findLatestSummary("wecom-approval-fixtures-"),
};
const statuses = Object.fromEntries(Object.entries(childReports).map(([key, value]) => [key, safeStatus(value.status)]));
const statusValues = Object.values(statuses);
const findings = [];
for (const [key, value] of Object.entries(statuses)) {
if (isBlocked(value)) {
findings.push({ source: key, status: value, severity: "blocker" });
} else if (isPartial(value)) {
findings.push({ source: key, status: value, severity: "manual_or_data_gap" });
} else if (isFinding(value)) {
findings.push({ source: key, status: value, severity: "finding" });
}
}
const manualGates = [
{
id: "WROAD2-BIZ1",
status: "PENDING_MANUAL_CONFIRMATION",
owner: "SMOKE002/SMOKE101/HYD000006",
requiredEvidence: "三天打卡、请假、补卡、详情后审批和 OA 历史查看结果",
},
{
id: "WAPPR1",
status: "PENDING_MANUAL_CONFIRMATION",
owner: "HYD000006",
requiredEvidence: "请假、补卡、外出、加班逐模板审批人自动化选项 A/B/C/D",
},
{
id: "WEXT1-LIVE",
status: "PENDING_USER_APPROVAL",
owner: "human_lead",
requiredEvidence: "外出/加班 dry-run 可解释通过后,是否允许单次 live 创建 OA-POC 样件",
},
];
let status = "PASS_AUTO_EVIDENCE_READY";
if (statusValues.some(isBlocked) || findings.some((item) => item.severity === "blocker")) {
status = "SKIP/BLOCKED_BY_EXTERNAL_CONFIG";
} else if (statusValues.some(isPartial)) {
status = "PAUSED_MANUAL_CONFIRMATION";
} else if (Number(findingCountInput || 0) > 0 || statusValues.some(isFinding)) {
status = "PASS_WITH_FINDINGS";
} else if (manualGates.some((gate) => gate.status.includes("PENDING"))) {
status = "PAUSED_MANUAL_CONFIRMATION";
}
const summary = {
issueId: "WAUTO1",
mode: "wecom-controlled-trial-auto-evidence",
status,
conclusion: status,
baseURL,
commit,
checkedAt: new Date().toISOString(),
reportDir: path.resolve(reportDir),
scope: {
accounts: {
applicant: "SMOKE002",
approver: "SMOKE101",
adminObserverEmployeeNo: "HYD000006",
},
secretSource: "WECOM_AGENT_SECRET for WeCom approval/checkin read paths; no runtime Secret fallback",
noRealEmployees: true,
},
boundaries: {
noWeComWrites: true,
noWeComTemplateCreation: true,
noWeComApprovalSubmission: true,
noOaWritesFromThisScript: true,
noFixtureLiveFlags: true,
dryRunOnlyForOutingOvertime: true,
},
childReports,
sourceReports,
statuses,
findingCount: findings.length,
findings,
manualGates,
nextQuestions: {
wext1Live: [
"A:批准一次 live 创建外出+加班 OA-POC 样件,保留审计。",
"B:只保留 dry-run,不创建样件。",
"C:外出/加班移出 V1。",
],
threeDayCloseout: [
"A:接受 PASS_AUTO_EVIDENCE_READY,进入 WEXT1-LIVE live 问答。",
"B:接受 PASS_WITH_FINDINGS,但先处理指定 finding。",
"C:暂停,不进入外出/加班 live 或真实试用。",
],
},
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(`[wauto1] summary=${path.join(reportDir, "summary.json")}`);
NODE
}
finish() {
write_manual_checklist
write_summary_json || STATUS=1
run_privacy_smoke
log "[wauto1] report=$REPORT_DIR"
exit "$STATUS"
}
trap finish EXIT
run_ready
run_warch3_summary_only
run_readonly_runners