diff --git a/.agents/skills/hyb-oa-delivery/SKILL.md b/.agents/skills/hyb-oa-delivery/SKILL.md index 8874535f..f3b66469 100644 --- a/.agents/skills/hyb-oa-delivery/SKILL.md +++ b/.agents/skills/hyb-oa-delivery/SKILL.md @@ -18,6 +18,7 @@ Read only what is relevant: - 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 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 fixes the engineering route: WAPC2 must be followed by WAPC2F automatic POC fixtures, WAPC2 rerun, WCBK1 callback POC, WACP3 compensation-pull POC, and WADM1 mirror data model design before `wecom_attendance_approval_mirror_v1`. 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. WAPC2F has implemented and deployed `npm run check:wecom-approval-fixtures`; public dry-run reached `PASS_FIXTURE_DRY_RUN_READY` at `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json`, but no real WeCom template or approval was created because `WECOM_APPROVAL_FIXTURE_WRITE=1` was not set. Do not start `wecom_attendance_approval_mirror_v1`, `oa_hr_emergency_mode_v1`, `wecom_recovery_writeback_v1`, or `wecom_ruleops_v1` without the next stage's own Issue CSV. +- 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`. This still does not clear real callback, compensation pull, mirror data model, emergency mode, writeback, or RuleOps. - 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 how this skill should evolve, read `docs/Agent开发交付实践.md`. @@ -111,7 +112,8 @@ Final responses should include: - 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:` / `--template=missed_punch:` and low-risk test approval numbers with `--sp-no=leave:` / `--sp-no=missed_punch:`. 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. - WPROC1 fixes the WeCom approval engineering process. Future WeCom work must satisfy route gate, capability gate, and implementation gate; use automatic runners before asking the user to do manual work. WPROC2 makes this executable through `node scripts/qa/check-process-contract.mjs --baseline` plus issue-specific profiles such as `--profile wecom-approval-fixture`; run it before WAPC2F and later high-risk WeCom contracts. Manual work is limited to write approval, secrets/callback config, WeCom backend settings that cannot be API-driven, real-device confirmation, and risk decisions. High-risk stages require POC before implementation: callback signature/decryption/idempotency, compensation pull, mirror data model, then mirror implementation. -- WAPC2F has added the WeCom approval fixture dry-run runner. Use `npm run check:wecom-approval-fixtures`; it defaults to applicant `SMOKE002`, approver `SMOKE101`, fixed `WECOM_AGENT_SECRET`, minimal generic OA-POC leave/missed-punch template payloads, and no write token or WeCom writes. Real fixture creation requires `--live --create-templates --submit-test-approvals` plus one-process `WECOM_APPROVAL_FIXTURE_WRITE=1` and explicit user approval. The public dry-run report is `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` with `PASS_FIXTURE_DRY_RUN_READY`; WAPC2 auto-rerun still requires real generated template IDs and `sp_no`. +- WAPC2F has added the WeCom approval fixture dry-run runner. Use `npm run check:wecom-approval-fixtures`; it defaults to applicant `SMOKE002`, approver `SMOKE101`, fixed `WECOM_AGENT_SECRET`, minimal generic OA-POC leave/missed-punch template payloads, and no write token or WeCom writes. Real fixture creation requires `--live --create-templates --submit-test-approvals` plus one-process `WECOM_APPROVAL_FIXTURE_WRITE=1` and explicit user approval. The public dry-run report is `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` with `PASS_FIXTURE_DRY_RUN_READY`. +- WAPC2FLIVE has executed that approved live path once after fixing the template payload shape; current public evidence is `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json`, `PASS_FIXTURE_CREATED`, `checks.autoRerun.status=OK`, and `PASS_APPROVAL_POC`. Do not create more approval fixtures without a new Issue CSV and explicit approval. - Approval-chain correctness can be proven by PC or automation, while Enterprise WeChat validates entry, binding,免登录, notification, deeplink, and mobile layout. - If real-device mobile validation is paused after automation passes, record the gate as `PAUSED`; do not close RS6/UI6/R6 mobile blockers until representative real-device confirmation is recorded. - Role-specific pages should use one shared OA/mobile framework and tailor summaries, entries, actions, and sensitive fields by role. Do not create unrelated UI systems for employee, approver, finance, admin, or CEO views. diff --git a/docs/trialrun/人工试运行报告.md b/docs/trialrun/人工试运行报告.md index c4f501c4..ad219eec 100644 --- a/docs/trialrun/人工试运行报告.md +++ b/docs/trialrun/人工试运行报告.md @@ -55,6 +55,7 @@ DCL7 已删除本文件中 R70-R91 的长流水历史,避免旧环境、旧开 - 2026-05-19 WAPC1 完成企微审批配置准备清单回写:WMSG1 只证明消息和 Deeplink 可用,不放行 `wecom_attendance_approval_mirror_v1`。本轮固化首批模板为请假、补卡、外出、加班;每个模板需准备模板 ID、适用范围、字段项、审批人规则、可见范围和所属自建应用权限;低风险测试 `sp_no` 不得包含采购、合同、报销、发票、银行回单或高敏附件;真实回调 Token/EncodingAESKey 只允许保存在部署环境,不写入文档或 Issue。后续 POC 需验证模板详情、审批详情、回调验签/解密/幂等、重试语义和补偿拉取。本轮不改业务代码、不部署、不接真实回调、不调用企微写接口。 - 2026-05-19 WAPC2 新增企微审批模板与低风险 `sp_no` 只读 POC:新增 `server/src/scripts/check-wecom-approval-poc.js` / `npm run check:wecom-approval-poc` 和只读集成服务,范围先锁定请假、补卡;固定 `WECOM_AGENT_SECRET` 调用 `POST /cgi-bin/oa/gettemplatedetail` 与 `POST /cgi-bin/oa/getapprovaldetail`,报告只输出脱敏模板 ID/`sp_no` 前缀、字段类型计数、审批节点计数和错误分类。本地 focused vitest 已覆盖 Secret 固定选择、无 fallback、缺配置、API 错误分类和脱敏输出。已以 `SYNC_ENV=0` 部署并远端执行 live 只读 POC,报告 `/app/artifacts/qa-flow/wecom-approval-poc-20260519T020429Z/summary.json` 结论为 `PARTIAL_APPROVAL_POC_NEEDS_CONFIG`:远端 `WECOM_AGENT_SECRET` 可用,但缺请假/补卡模板 ID 和两条低风险 `sp_no`;未伪造成 PASS。本轮不接真实回调、不调用企微写接口、不写 OA/企微数据、不进入深度镜像。 - 2026-05-19 WAPC2F 新增企微审批 POC 样件自动生成 dry-run:新增 `server/src/scripts/check-wecom-approval-fixtures.js` / `npm run check:wecom-approval-fixtures`,固定 `WECOM_AGENT_SECRET` 构建 OA-POC 请假/补卡最小通用模板候选和低风险审批申请候选;默认 dry-run 不获取写入 token、不调用企微写接口、不创建模板、不提交审批单。已以 `SYNC_ENV=0` 部署并远端执行 dry-run,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` 结论为 `PASS_FIXTURE_DRY_RUN_READY`:`SMOKE002 -> SMOKE101` 均 active、已绑定企微、非自审,payload 脱敏输出通过。live 创建 OA-POC 测试模板和测试审批单仍未批准、未执行;WAPC2 自动复跑需等 live 生成真实模板 ID 和 `sp_no` 后再执行。 +- 2026-05-19 WAPC2FLIVE 完成企微审批 OA-POC 样件 live 创建和 WAPC2 自动复跑:用户批准一次 live 创建并选择保留审计后,先以 `SYNC_ENV=0` 部署修正后的 runner,再远端 dry-run 复核 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053335Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`。首次 live 写入 API 因旧 `create_template` payload 返回 `301086 zh_CN text empty`,未创建任何模板或审批单;随后将 payload 修正为官方 `template_name` + `property` controls 结构并复跑有效 live,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`,请假/补卡 OA-POC 测试模板和低风险测试审批单均创建成功,`checks.autoRerun.status=OK` 且结论 `PASS_APPROVAL_POC`。报告只记录脱敏 template_id / `sp_no` 前缀;测试模板和测试审批记录保留审计,不自动删除。本轮不配置真实回调、不做补偿拉取、不建镜像表、不进入 `wecom_attendance_approval_mirror_v1`。 ## 关键证据索引 @@ -107,7 +108,8 @@ DCL7 已删除本文件中 R70-R91 的长流水历史,避免旧环境、旧开 | WMSG1 | 已完成:企微应用消息真实发送和 Deeplink 真机确认通过;报告 `checks.message.status=OK`、`errcode=0`、`recipientCount=1`,用户确认收到消息并可点击进入 OA 通知页面 | `issues/2026-05-19_07-41-37-wecom-message-live-verify-v1.csv`、`/app/artifacts/qa-flow/wecom-runtime-ready-20260518T234431Z/summary.json` | | WAPC1 | 已完成:企微审批配置准备清单已回写;首批模板为请假、补卡、外出、加班;低风险 `sp_no`、真实回调和后续 POC 准入项已固定;不代表审批镜像或回调接收已实现 | `issues/2026-05-19_08-44-58-wecom-approval-config-prep-v1.csv`、`docs/企微优先开发路线图.md`、`docs/企微API能力目录.md` | | WAPC2 | 已部署并公网只读复跑:新增请假/补卡模板详情和低风险审批详情 QA-only 只读 POC runner;远端 Secret 矩阵 OK,因缺请假/补卡模板 ID 和两条低风险 `sp_no` 返回 `PARTIAL_APPROVAL_POC_NEEDS_CONFIG`;不代表真实回调或审批镜像已实现 | `issues/2026-05-19_09-34-16-wecom-approval-template-spno-poc-v1.csv`、`server/src/scripts/check-wecom-approval-poc.js`、`server/src/services/integrations/wecomApproval.js`、`/app/artifacts/qa-flow/wecom-approval-poc-20260519T020429Z/summary.json` | -| WAPC2F | 已部署并公网 dry-run 通过:新增企微审批 POC 样件 runner;远端 dry-run 报告为 `PASS_FIXTURE_DRY_RUN_READY`,确认 `SMOKE002 -> SMOKE101` 非自审链、Secret 矩阵和脱敏报告边界;未真实创建模板或审批单 | `issues/2026-05-19_10-24-43-wecom-approval-fixture-auto-generate-v1.csv`、`server/src/scripts/check-wecom-approval-fixtures.js`、`/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` | +| WAPC2F | 已部署并公网 dry-run 通过:新增企微审批 POC 样件 runner;远端 dry-run 报告为 `PASS_FIXTURE_DRY_RUN_READY`,确认 `SMOKE002 -> SMOKE101` 非自审链、Secret 矩阵和脱敏报告边界 | `issues/2026-05-19_10-24-43-wecom-approval-fixture-auto-generate-v1.csv`、`server/src/scripts/check-wecom-approval-fixtures.js`、`/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` | +| WAPC2FLIVE | 已部署并完成 live 创建:修正 `create_template` payload 后,远端报告 `PASS_FIXTURE_CREATED`,OA-POC 请假/补卡测试模板和低风险测试审批单已创建并保留审计;自动复跑 WAPC2 为 `PASS_APPROVAL_POC`。不代表真实回调、补偿拉取、镜像模型或深度镜像已完成 | `issues/2026-05-19_13-24-12-wecom-approval-fixture-live-create-v1.csv`、`/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` | ## 当前门禁 diff --git a/docs/产品口径.md b/docs/产品口径.md index e181881d..6f70d151 100644 --- a/docs/产品口径.md +++ b/docs/产品口径.md @@ -45,7 +45,7 @@ ### P0-6 WCP1 企业微信能力 POC 结论 - WCP1 已完成 QA-only 只读 POC,历史结论为 `PAUSE_FOR_CONFIG`;该阻断已由 WCPC 复跑收口。 - 已可复用:工作台应用 token、核心配置、HCLT 通讯录 create/update/disable 证据、通讯录部门读取、人事助手字段配置读取;WCPC 又确认既有在职测试号的通讯录成员读取、人事助手花名册读取、打卡短窗口记录/规则读取和假期余额读取可用。 -- WCP1 初始缺口已留痕:通讯录测试成员读取 `wecom_errcode_48009`、人事助手测试员工读取 `wecom_errcode_60021`、打卡同步开关、审批模板 ID、测试审批单号、假期权限 `wecom_errcode_301062`、回调 URL/Token/AESKey。当前仍未补齐的是审批模板 ID、测试审批单号、真实回调配置、补偿拉取、镜像数据模型和 HR 写接口 POC。 +- WCP1 初始缺口已留痕:通讯录测试成员读取 `wecom_errcode_48009`、人事助手测试员工读取 `wecom_errcode_60021`、打卡同步开关、审批模板 ID、测试审批单号、假期权限 `wecom_errcode_301062`、回调 URL/Token/AESKey。WAPC2FLIVE 已解决请假/补卡 OA-POC 模板和低风险测试审批单样例;当前仍未补齐的是真实回调配置、补偿拉取、镜像数据模型、外出/加班样例或处理决策,以及 HR 写接口 POC。 - WCP1 报告继续作为初始配置缺口证据保留,当前 HR 主数据镜像准入以 WCPC 结论为准。 ### P0-7 WCPC 配置复跑口径 diff --git a/docs/企微API能力目录.md b/docs/企微API能力目录.md index a9fbe57e..a9e3c40e 100644 --- a/docs/企微API能力目录.md +++ b/docs/企微API能力目录.md @@ -2,8 +2,8 @@ **文档状态**:当前企微 API 调研与本项目使用事实源。 **分类**:集成事实源 / API 能力目录。 -**适用时间**:WAPI / WAPC1 / WAPC2 / WPROC1 / WPROC2 / WAPC2F 之后。 -**关联 Issue**:`WAPI,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F`。 +**适用时间**:WAPI / WAPC1 / WAPC2 / WPROC1 / WPROC2 / WAPC2F / WAPC2FLIVE 之后。 +**关联 Issue**:`WAPI,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE`。 **最近核对**:2026-05-19。 **不得误读**:本文只记录本项目会用到的企业微信官方 API 摘要、链接和项目决策,不复制官方文档全文,不保存 Secret、access token、完整 userid、手机号、邮箱或企微原始 payload。官方文档和企业微信后台权限配置始终是最终依据。 @@ -55,13 +55,13 @@ | 员工打卡规则 | [获取员工打卡规则](https://developer.work.weixin.qq.com/document/path/90263) | `/cgi-bin/checkin/getcheckinoption` | `POST` | `WECOM_AGENT_SECRET` 或显式 `WECOM_CHECKIN_SECRET` | `CAN_REUSE_NOW_FOR_READ` | 可作为后续考勤解释和规则快照依据。 | | 打卡日报/月报/排班 | [日报](https://developer.work.weixin.qq.com/document/path/93374)、[月报](https://developer.work.weixin.qq.com/document/path/93387)、[排班](https://developer.work.weixin.qq.com/document/path/93380) | 官方打卡扩展接口 | `POST` 为主 | `WECOM_AGENT_SECRET` 或显式 `WECOM_CHECKIN_SECRET` | `NEEDS_API_POC` | 不进入当前运行优先主线;后续考勤镜像合同时再做只读 POC。 | | 审批概述 | [审批](https://developer.work.weixin.qq.com/document/path/91854) | 模板、实例、回调、假期 | 混合 | `WECOM_AGENT_SECRET` | `PARTIAL_NEEDS_CONFIG` | HR/考勤员工日常审批可优先在企微处理,但 OA 镜像尚未实现。 | -| 审批模板详情 | [获取审批模板详情](https://developer.work.weixin.qq.com/document/path/91982) | `/cgi-bin/oa/gettemplatedetail` | `POST` | `WECOM_AGENT_SECRET` | `POC_RUNNER_READY_NEEDS_CONFIG` | WAPC2 已新增请假/补卡只读 POC runner;缺模板 ID 时报告 `PARTIAL_APPROVAL_POC_NEEDS_CONFIG`,不得进入镜像实现。 | -| 审批申请详情 | [获取审批申请详情](https://developer.work.weixin.qq.com/document/path/91983) | `/cgi-bin/oa/getapprovaldetail` | `POST` | `WECOM_AGENT_SECRET` | `POC_RUNNER_READY_NEEDS_CONFIG` | WAPC2 已新增低风险 `sp_no` 只读 POC runner;测试单不得包含采购、合同、报销、发票、银行回单或高敏附件。 | +| 审批模板详情 | [获取审批模板详情](https://developer.work.weixin.qq.com/document/path/91982) | `/cgi-bin/oa/gettemplatedetail` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_FOR_POC_FIXTURES` | WAPC2 runner 已可读模板详情;WAPC2FLIVE 已自动创建 OA-POC 请假/补卡测试模板并复跑得到 `PASS_APPROVAL_POC`。正式模板和外出/加班仍需单独配置或 POC。 | +| 审批申请详情 | [获取审批申请详情](https://developer.work.weixin.qq.com/document/path/91983) | `/cgi-bin/oa/getapprovaldetail` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_FOR_POC_FIXTURES` | WAPC2 runner 已可读审批详情;WAPC2FLIVE 已提交低风险请假/补卡测试审批单并自动复跑通过。测试单不得包含采购、合同、报销、发票、银行回单或高敏附件。 | | 审批状态回调 | [审批申请状态变化回调通知](https://developer.work.weixin.qq.com/document/path/91815) | 事件回调 | `POST` 事件 | `WECOM_AGENT_SECRET` 所属应用 | `NEEDS_CONFIG` | 需要真实回调 URL、Token、EncodingAESKey、验签、解密、幂等和重试设计;文档和报告只记录配置项名称,不保存密钥值。 | | 批量获取审批单号 | [批量获取审批单号](https://developer.work.weixin.qq.com/document/path/91816) | 官方审批单查询接口 | `POST` | `WECOM_AGENT_SECRET` | `NEEDS_API_POC` | 作为补偿拉取候选,WAPC1 后续 POC 前不得假定可用。 | -| 提交审批申请 | [提交审批申请](https://developer.work.weixin.qq.com/document/path/91853) | `/cgi-bin/oa/applyevent` | `POST` | `WECOM_AGENT_SECRET` | `WAPC2F_DRY_RUN_READY` | 已接入 WAPC2F QA-only runner;仅可用于 OA-POC 低风险请假/补卡测试审批单自动样件。默认 dry-run 不获取写入 token、不提交审批;live 写入需显式 CLI、`WECOM_APPROVAL_FIXTURE_WRITE=1` 和人工批准,申请人/审批人必须非自审。OA 主办报销、采购、合同、项目不迁到企微原生审批。 | +| 提交审批申请 | [提交审批申请](https://developer.work.weixin.qq.com/document/path/91853) | `/cgi-bin/oa/applyevent` | `POST` | `WECOM_AGENT_SECRET` | `DONE_LIVE_VERIFIED_FOR_OA_POC_FIXTURES` | 已接入 WAPC2F QA-only runner;仅可用于 OA-POC 低风险请假/补卡测试审批单自动样件。默认 dry-run 不获取写入 token、不提交审批;live 写入需显式 CLI、`WECOM_APPROVAL_FIXTURE_WRITE=1` 和人工批准,申请人/审批人必须非自审。WAPC2FLIVE 已提交请假/补卡测试审批单并保留审计;OA 主办报销、采购、合同、项目不迁到企微原生审批。 | | 假期余额 | [获取成员假期余额](https://developer.work.weixin.qq.com/document/path/93376) | `/cgi-bin/oa/vacation/getuservacationquota` | `POST` | `WECOM_AGENT_SECRET` | `CAN_REUSE_NOW_OR_NEEDS_PERMISSION` | WCPC 已证明可读但历史有权限错误;后续作为考勤镜像的只读项。 | -| 审批模板创建/更新 | [创建审批模板](https://developer.work.weixin.qq.com/document/path/97437)、[更新审批模板](https://developer.work.weixin.qq.com/document/path/97438) | `/cgi-bin/oa/approval/create_template` 等官方模板写接口 | `POST` | `WECOM_AGENT_SECRET` | `WAPC2F_DRY_RUN_READY_FOR_CREATE_TEMPLATE` | WAPC2F 仅实现 OA-POC 请假/补卡测试模板创建候选路径,当前公网只执行 dry-run;live 创建需显式 CLI、`WECOM_APPROVAL_FIXTURE_WRITE=1` 和人工批准。正式模板更新或 RuleOps 写入仍留后期合同。 | +| 审批模板创建/更新 | [创建审批模板](https://developer.work.weixin.qq.com/document/path/97437)、[更新审批模板](https://developer.work.weixin.qq.com/document/path/97438) | `/cgi-bin/oa/approval/create_template` 等官方模板写接口 | `POST` | `WECOM_AGENT_SECRET` | `DONE_LIVE_VERIFIED_FOR_OA_POC_FIXTURES` | WAPC2FLIVE 已用 `template_name` + `property` controls 结构创建 OA-POC 请假/补卡测试模板并保留审计。正式模板更新、外出/加班模板、RuleOps 写入仍留后期合同。 | ## 4. WAPC1 审批配置准备清单 @@ -92,12 +92,13 @@ WAPC2 不代表真实回调、审批镜像、应急接管、恢复回写或 Rule WPROC1 将 WAPC2 之后的审批路线固定为: -`WAPC2 -> WAPC2F 自动生成 POC 样件 -> WAPC2 自动复跑 -> WCBK1 回调只读 POC -> WACP3 补偿拉取 POC -> WADM1 镜像数据模型设计 -> wecom_attendance_approval_mirror_v1` +`WAPC2 -> WAPC2F 自动生成 POC 样件 -> WAPC2FLIVE live 创建与 WAPC2 自动复跑 -> WCBK1 回调只读 POC -> WACP3 补偿拉取 POC -> WADM1 镜像数据模型设计 -> wecom_attendance_approval_mirror_v1` 门禁要求: -- `WAPC2F` 已新增 `npm run check:wecom-approval-fixtures`,公网 dry-run 报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`;它只证明 OA-POC 请假/补卡最小通用模板和低风险审批申请 payload 可构建、非自审预检通过。 -- `WAPC2F` 只允许创建 OA-POC 前缀低风险测试模板和测试审批单;默认 dry-run 不获取写入 token、不调用企微写接口,live 写入必须同时具备 CLI 写入参数、`WECOM_APPROVAL_FIXTURE_WRITE=1` 和人工批准。 +- `WAPC2F` 已新增 `npm run check:wecom-approval-fixtures`,公网 dry-run 报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`;它证明 OA-POC 请假/补卡最小通用模板和低风险审批申请 payload 可构建、非自审预检通过。 +- `WAPC2FLIVE` 已在用户批准后创建 OA-POC 请假/补卡测试模板和测试审批单,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`。首次旧 payload 返回 `301086` 且未创建任何模板或审批单;已修正为官方 `template_name` + `property` controls 结构。 +- `WAPC2F/WAPC2FLIVE` 只允许创建 OA-POC 前缀低风险测试模板和测试审批单;默认 dry-run 不获取写入 token、不调用企微写接口,live 写入必须同时具备 CLI 写入参数、`WECOM_APPROVAL_FIXTURE_WRITE=1` 和人工批准。 - `WAPC2F` 固定 `WECOM_AGENT_SECRET`,不得 fallback 到通讯录、打卡或历史 HR assistant Secret。 - `WAPC2F` 默认申请人 `SMOKE002`、审批人 `SMOKE101`;命中自审、同一企微 userid、不可见、未绑定或 inactive 时硬阻断。 - `WCBK1` 必须先证明真实回调 URL 验证、验签、解密、幂等键和重复投递,不保存 Token、EncodingAESKey 或原始密文。 @@ -107,7 +108,7 @@ WPROC1 将 WAPC2 之后的审批路线固定为: ## 7. 运行优先结论 - 近期优先利用:企业微信工作台入口、OAuth/免登、绑定、个人应用消息、OA deeplink、通讯录 userid 清单、可选成员详情、人事助手花名册读取、打卡记录和打卡规则读取。 -- 暂缓深度镜像:`wecom_attendance_approval_mirror_v1`、`oa_hr_emergency_mode_v1`、`wecom_recovery_writeback_v1`、`wecom_ruleops_v1` 均等 WOUA 差异收口或 WHMS 同步窗口决策、WAPC1 审批配置准备清单、WAPC2 请假/补卡只读 POC、WAPC2F 自动样件、WCBK1 回调只读 POC、WACP3 补偿拉取 POC、WADM1 镜像数据模型设计、外出/加班模板测试和打卡细项明确后再拆。 +- 暂缓深度镜像:`wecom_attendance_approval_mirror_v1`、`oa_hr_emergency_mode_v1`、`wecom_recovery_writeback_v1`、`wecom_ruleops_v1` 均等 WOUA 差异收口或 WHMS 同步窗口决策、WAPC1 审批配置准备清单、WAPC2 请假/补卡只读 POC、WAPC2FLIVE 自动样件、WCBK1 回调只读 POC、WACP3 补偿拉取 POC、WADM1 镜像数据模型设计、外出/加班模板测试和打卡细项明确后再拆。 - OA 主办边界不变:报销、采购、费用、合同、项目、付款批次、AP、代账交接、审计和高敏附件继续在 OA 内完成,只向企业微信发送脱敏提醒和 OA 链接。 ## 8. 后续使用要求 diff --git a/docs/企微优先开发路线图.md b/docs/企微优先开发路线图.md index e58d75f5..dae2b7d0 100644 --- a/docs/企微优先开发路线图.md +++ b/docs/企微优先开发路线图.md @@ -2,10 +2,10 @@ **文档状态**:当前开发路线图事实源。 **分类**:开发治理 / 路线图。 -**适用时间**:WDRG / WCP1 / WHMSLIVE / WOUA / WAPI / WRRA / WOUA-FIX / WRV1 / WRA1 / WMSG1 / WAPC1 / WAPC2 / WPROC1 / WPROC2 / WAPC2F 之后。 -**关联 Issue**:`WDRG,WCP1,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F`。 +**适用时间**:WDRG / WCP1 / WHMSLIVE / WOUA / WAPI / WRRA / WOUA-FIX / WRV1 / WRA1 / WMSG1 / WAPC1 / WAPC2 / WPROC1 / WPROC2 / WAPC2F / WAPC2FLIVE 之后。 +**关联 Issue**:`WDRG,WCP1,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE`。 **最近审计**:2026-05-19。 -**不得误读**:本文只控制后续开发节奏、阶段顺序和门禁。WHMSLIVE 后只代表企微 HR 主数据镜像已部署并受控验证;WAPI 后进一步固定企微 API/Secret 口径并转为运行优先;WRRA 后明确 `PASS_WITH_FINDINGS` 只代表只读对账成功且存在差异,不代表企微考勤/审批镜像、OA 应急接管、恢复回写或 RuleOps 已完成运行时实现。WMSG1 只证明企业微信应用消息可达和 Deeplink 可回到 OA;WAPC1 只固化审批配置准备清单;WAPC2 只新增请假/补卡模板详情和低风险 `sp_no` 审批详情只读 POC,不代表真实回调或镜像能力已完成。WPROC1 后,WAPC2 不直接放行深度镜像,必须先完成自动样件、回调、补偿拉取和镜像数据模型设计门禁。WPROC2 只新增可执行 process gate。WAPC2F 当前只证明 OA-POC 请假/补卡样件 dry-run payload、非自审预检和公网 dry-run 可用;未真实创建企微模板或审批单,未自动复跑真实 WAPC2,仍不放行深度镜像。 +**不得误读**:本文只控制后续开发节奏、阶段顺序和门禁。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`;这只放行下一步回调只读 POC,不代表真实回调、补偿拉取、镜像数据模型或 `wecom_attendance_approval_mirror_v1` 已完成。 ## 1. 路线图原则 @@ -35,9 +35,10 @@ | `WMSG1` | 已完成真机确认 | 使用现有 `check:wecom-runtime-ready` runner 单次发送脱敏企微应用消息;报告 `/app/artifacts/qa-flow/wecom-runtime-ready-20260518T234431Z/summary.json` 显示 `checks.message.status=OK`、`errcode=0`、`recipientCount=1`,用户确认收到“OA 运行就绪检查”并可点击进入 OA 通知页面。 | | `WAPC1` | 配置准备清单已固化 | WMSG1 后的下一步改为审批配置准备清单:首批关注请假、补卡、外出、加班模板;准备模板 ID、低风险测试 `sp_no`、真实回调 URL/Token/EncodingAESKey 和后续 POC 准入项。本阶段不接真实回调、不调用写接口、不进入深度镜像。 | | `WAPC2` | 已部署并公网只读复跑 | 新增 QA-only `npm run check:wecom-approval-poc`,范围先锁定请假和补卡;固定 `WECOM_AGENT_SECRET` 调用 `POST /cgi-bin/oa/gettemplatedetail` 与 `POST /cgi-bin/oa/getapprovaldetail`,报告只输出脱敏模板 ID/`sp_no` 前缀、字段/节点计数和错误分类。公网报告 `/app/artifacts/qa-flow/wecom-approval-poc-20260519T020429Z/summary.json` 为 `PARTIAL_APPROVAL_POC_NEEDS_CONFIG`:Secret 可用,但缺请假/补卡模板 ID 和两条低风险 `sp_no`,未伪造成 PASS。 | -| `WPROC1` | 路线与流程门禁已修正 | 固化三层门禁、Definition of Ready、Definition of Done、自动化优先和非自审规则。后续路线调整为 `WAPC2 -> WAPC2F 自动生成 POC 样件 -> WAPC2 自动复跑 -> WCBK1 回调只读 POC -> WACP3 补偿拉取 POC -> WADM1 镜像数据模型设计 -> wecom_attendance_approval_mirror_v1`。WAPC2F 默认测试链为 `SMOKE002 -> SMOKE101`,若 `SMOKE101` 不可用,不自动换人,先问答确认。 | +| `WPROC1` | 路线与流程门禁已修正 | 固化三层门禁、Definition of Ready、Definition of Done、自动化优先和非自审规则。后续路线调整为 `WAPC2 -> WAPC2F 自动生成 POC 样件 -> WAPC2FLIVE live 创建与 WAPC2 自动复跑 -> WCBK1 回调只读 POC -> WACP3 补偿拉取 POC -> WADM1 镜像数据模型设计 -> wecom_attendance_approval_mirror_v1`。WAPC2F 默认测试链为 `SMOKE002 -> SMOKE101`,若 `SMOKE101` 不可用,不自动换人,先问答确认。 | | `WPROC2` | 流程自动化门禁已新增 | 新增 `scripts/qa/check-process-contract.mjs`,把 WPROC1 的三层门禁、DoR/DoD、自动化优先、非自审、Secret 固定、live 写入开关、缺配置分类和脱敏边界升级为可执行 process gate;WAPC2F 实施前必须先通过 baseline gate 和 `wecom-approval-fixture` profile。 | -| `WAPC2F` | 已实现并公网 dry-run 通过 | 新增 QA-only `npm run check:wecom-approval-fixtures`,固定 `WECOM_AGENT_SECRET` 构建 OA-POC 请假/补卡最小通用模板和低风险审批申请 payload;默认 dry-run 不获取写入 token、不调用企微写接口。公网报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`:`SMOKE002 -> SMOKE101` active、已绑定、非自审,live 写入未批准且未执行。 | +| `WAPC2F` | 已实现并公网 dry-run 通过 | 新增 QA-only `npm run check:wecom-approval-fixtures`,固定 `WECOM_AGENT_SECRET` 构建 OA-POC 请假/补卡最小通用模板和低风险审批申请 payload;默认 dry-run 不获取写入 token、不调用企微写接口。公网报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`:`SMOKE002 -> SMOKE101` active、已绑定、非自审。 | +| `WAPC2FLIVE` | 已完成 live 创建与 WAPC2 自动复跑 | 用户批准后执行一次 live 创建窗口:第一次旧 payload 返回 `301086` 且未创建任何模板或审批单;修正为官方 `template_name` + `property` controls 后,远端报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`,已创建 OA-POC 请假/补卡测试模板和低风险测试审批单,`checks.autoRerun.status=OK` 且 `PASS_APPROVAL_POC`。测试模板和测试审批记录保留审计,不自动删除;仍不放行深度镜像。 | ## 3. 阶段路线 @@ -47,12 +48,12 @@ | 2 | `wecom_hr_master_sync_v1` | 企微/人事助手员工、部门、主管、职位、联系方式和在职状态镜像到 OA。 | POC 证明人事助手/通讯录读取和回调能力可用,或明确缺口处理方式。 | WHMSLIVE 后已完成本地门禁、部署和受控公网验证;OA 可自动创建/更新员工档案、账号、角色、企微绑定和审计;最终 `force_off`,真实员工批量 apply 仍需单独批准;缺配置时记录 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 | | 3 | `runtime_first_wecom_enablement` | 先把已可用企微能力用于系统运行:入口、免登/绑定、脱敏消息、deeplink、通讯录 userid 清单、人事助手读取、打卡读取和只读对账。 | WAPI API 目录和 Secret 矩阵完成;WOUA 按新读取策略复跑。 | WOUA-FIX 后 OA active 缺企微已清零;WRV1/WRA1 通过 `check:wecom-runtime-ready` 给出运行优先结论;WMSG1 已证明真实消息和 Deeplink 可用。`PASS_WITH_CONFIG_GAPS` 只允许继续入口、免登、消息和只读读取主链路,不放行深度镜像;审批模板、测试 `sp_no`、真实回调仍阻断 `wecom_attendance_approval_mirror_v1`。 | | 4 | `WAPC1 / WAPC2` | 审批配置准备和请假/补卡模板详情、低风险审批详情只读 POC。 | 运行优先门禁完成;WMSG1 消息和 Deeplink 已确认。 | WAPC2 runner 已部署,缺模板 ID 或 `sp_no` 时真实记录 `PARTIAL_APPROVAL_POC_NEEDS_CONFIG`,不放行深度镜像。 | -| 5 | `WAPC2F 自动生成 POC 样件` | 尽量用 QA-only runner 自动创建 OA-POC 请假/补卡测试模板和低风险测试审批单。 | WAPC2 已证明 Secret 可用但缺模板或 `sp_no`;WPROC2 baseline gate 和 WAPC2F profile gate 通过;dry-run 先通过;live 写入需用户另行批准。 | 当前已完成 dry-run:`PASS_FIXTURE_DRY_RUN_READY`。下一步若批准 live,必须显式 `--live --create-templates --submit-test-approvals` 且单次进程设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`;申请人 `SMOKE002`、审批人 `SMOKE101` 通过 active、绑定、可见和非自审预检;缺权限或不支持时记录 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 | -| 6 | `WAPC2 自动复跑` | 使用 WAPC2F 生成的脱敏模板 ID 和 `sp_no` 自动复跑只读 POC。 | WAPC2F live 写入生成全部或部分样件。 | 请假/补卡模板详情与审批详情可读为 `PASS_APPROVAL_POC`;部分缺项为 `PARTIAL_APPROVAL_POC_NEEDS_CONFIG`。当前 dry-run 未生成真实模板 ID 或 `sp_no`,因此未执行真实 WAPC2 自动复跑。 | +| 5 | `WAPC2F 自动生成 POC 样件` | 尽量用 QA-only runner 自动创建 OA-POC 请假/补卡测试模板和低风险测试审批单。 | WAPC2 已证明 Secret 可用但缺模板或 `sp_no`;WPROC2 baseline gate 和 WAPC2F profile gate 通过;dry-run 先通过;live 写入需用户批准。 | 已完成:`PASS_FIXTURE_CREATED`。创建使用显式 `--live --create-templates --submit-test-approvals` 和单次进程 `WECOM_APPROVAL_FIXTURE_WRITE=1`;申请人 `SMOKE002`、审批人 `SMOKE101` 通过 active、绑定、可见和非自审预检;报告只记录脱敏模板 ID / `sp_no` 前缀。 | +| 6 | `WAPC2 自动复跑` | 使用 WAPC2F 生成的脱敏模板 ID 和 `sp_no` 自动复跑只读 POC。 | WAPC2F live 写入生成全部或部分样件。 | 已完成:live 报告中 `checks.autoRerun.status=OK`,请假/补卡模板详情与审批详情可读,结论 `PASS_APPROVAL_POC`。 | | 7 | `WCBK1 回调只读 POC` | 证明真实回调 URL 验证、验签、解密、幂等键和重复投递处理。 | 回调 URL、Token、EncodingAESKey 由部署环境配置;不得写入仓库或聊天。 | 真实回调可达、可验签/解密、重复投递幂等、失败重试语义明确;缺配置记录 `NEEDS_CONFIG`。 | | 8 | `WACP3 补偿拉取 POC` | 证明按时间窗口批量获取审批单号并可拉取审批详情,作为回调丢失补偿。 | WAPC2 或 WAPC2F 至少能提供低风险样例;官方 API 和权限明确。 | 能按窗口拿到审批单号并拉详情;不能伪造成 PASS,权限或可信 IP 问题记录 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 | | 9 | `WADM1 镜像数据模型设计` | 先设计镜像字段、状态机、幂等键、索引、隐私保留和回滚方案。 | WAPC2/WAPC2F、WCBK1、WACP3 结论可支撑模型设计。 | 数据模型、状态流、幂等、索引、脱敏、审计和迁移回滚方案经 Issue CSV 固化后,才允许实现镜像。 | -| 10 | `wecom_attendance_approval_mirror_v1` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA。 | 运行优先门禁完成且 WOUA 差异已收口或有明确处理决策;WAPC2F/WCBK1/WACP3/WADM1 均完成;外出/加班模板和打卡规则细项明确。 | OA 可查询企微 HR/考勤镜像、附件摘要、审批历史、考勤解释和审计;不把 OA 主办高敏审批迁到企微。 | +| 10 | `wecom_attendance_approval_mirror_v1` | 企微打卡、请假、补卡、外出、加班、假期余额和审批历史镜像到 OA。 | 运行优先门禁完成且 WOUA 差异已收口或有明确处理决策;WAPC2FLIVE/WCBK1/WACP3/WADM1 均完成;外出/加班模板和打卡规则细项明确。 | OA 可查询企微 HR/考勤镜像、附件摘要、审批历史、考勤解释和审计;不把 OA 主办高敏审批迁到企微。 | | 11 | `oa_hr_emergency_mode_v1` | 企业微信不可用时,由管理员人工开启 OA HR/考勤应急接管。 | 企微镜像数据可支撑对账;OA 应急入口、权限和审计方案明确。 | 管理员可填写原因、范围、预计结束时间和责任人后开启/关闭;应急单据带 `EMERGENCY` 标记。 | | 12 | `wecom_recovery_writeback_v1` | 企微恢复后,OA 应急数据先 dry-run,再回写企微。 | 应急接管模式完成;企微写回接口、冲突规则和回滚策略已单独批准。 | 系统生成成功、失败、跳过和冲突清单;无冲突项可自动回写,冲突进入人工确认。 | | 13 | `wecom_ruleops_v1` | AI 草拟企微规则、生成差异报告和 dry-run,人工确认后写入企微。 | 前述同步/回写链路稳定;企微规则 API 能力和权限已验证。 | 每次写入保存前后快照、确认人、API `errcode`、失败原因、回滚建议和审计记录。 | @@ -132,7 +133,7 @@ POC 默认只读或低风险探测。任何生产写操作、企微规则写入 - `callback.config=NEEDS_CONFIG`:本轮只读报告未证明真实回调配置存在。 - `hr.staff_update_classification=NEEDS_API_POC`:人事助手资料更新属于写接口,需单独批准后再做低风险 POC。 -WCPC 已允许进入 `wecom_hr_master_sync_v1`。WHMS 已承接该阶段,完成本地实现、部署和受控公网验证;考勤/审批镜像仍需先补审批模板、审批单、回调配置、补偿拉取和镜像数据模型,并按 WPROC1 顺序完成 WAPC2F/WCBK1/WACP3/WADM1 后再另建 `wecom_attendance_approval_mirror_v1` 合同,不得把 WCPC 或 WHMS 误读为考勤/审批运行时迁移已完成。 +WCPC 已允许进入 `wecom_hr_master_sync_v1`。WHMS 已承接该阶段,完成本地实现、部署和受控公网验证;考勤/审批镜像仍需先补回调配置、补偿拉取和镜像数据模型,并按 WPROC1 顺序完成 WCBK1/WACP3/WADM1 后再另建 `wecom_attendance_approval_mirror_v1` 合同,不得把 WCPC、WHMS 或 WAPC2FLIVE 误读为考勤/审批运行时迁移已完成。 ## 9. WHMS HR 主数据镜像状态 @@ -159,7 +160,7 @@ WCPC 已允许进入 `wecom_hr_master_sync_v1`。WHMS 已承接该阶段,完 - 公网验证窗口中临时将 `wecom_hr_master_sync_v1` 设为 `force_on`,对既有低风险测试号 `SMOKE002/测试员工`(脱敏 `oa_smoke***`)执行 dry-run 和显式 userids apply;企微读取链路通过,因企微侧缺手机号、邮箱和部门,按规则记录 `missing_required_field` 并跳过,未写入 OA 主数据。 - 已验证普通员工访问同步 API 返回 403;验证结束后 `wecom_hr_master_sync_v1` 已恢复为 `force_off`。 - 未执行生产真实员工批量 `apply`;后续若要正式批量同步真实员工,必须另行批准并先处理企微必填字段质量。 -- 下一步先处理 WOUA 用户一致性差异或明确 WHMS 批量同步窗口;`wecom_attendance_approval_mirror_v1` 暂缓到 WAPC2F 自动样件、WAPC2 自动复跑、真实回调 POC、补偿拉取 POC、镜像数据模型和打卡细项明确后再另建合同。 +- 下一步先处理 WOUA 用户一致性差异或明确 WHMS 批量同步窗口;`wecom_attendance_approval_mirror_v1` 暂缓到 WAPC2FLIVE 自动样件和 WAPC2 自动复跑证据、真实回调 POC、补偿拉取 POC、镜像数据模型和打卡细项明确后再另建合同。当前 WAPC2FLIVE 与 WAPC2 自动复跑已完成,因此下一阶段默认应进入 `WCBK1 回调只读 POC` 准备。 ## 10. WRRA 路线修正与下一阶段 @@ -172,7 +173,7 @@ WRRA 将 WAPI/WOUA 后的路线门禁修正为“运行优先 + 差异收口先 - WRA1 后,`WECOM_CHECKIN_SYNC_ENABLED` 只作为正式考勤同步开关;QA-only 打卡短窗口读取可以显式绕过该开关做只读探测,报告记录 `readable_sync_disabled`,但不得启动正式同步批次。 - 报告输出到 `artifacts/qa-flow/wecom-runtime-ready-/summary.json`,结论限定为 `PASS_RUNTIME_READY`、`PASS_WITH_CONFIG_GAPS` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 - 对剩余企微缺字段保持 accepted finding,不补企微资料;如后续要补字段或 WHMS 真实员工批量 apply,必须另建写入合同。 -- `wecom_attendance_approval_mirror_v1` 继续暂缓,直到审批模板 ID、测试 `sp_no`、WAPC2F 自动样件、真实回调配置、回调验签/解密/幂等、补偿拉取、镜像数据模型和打卡细项 POC 明确。 +- `wecom_attendance_approval_mirror_v1` 继续暂缓,直到真实回调配置、回调验签/解密/幂等、补偿拉取、镜像数据模型和打卡细项 POC 明确。WAPC2FLIVE 已解决请假/补卡低风险模板 ID 与 `sp_no` 样例来源,但不替代回调、补偿和模型门禁。 ## 11. WAPC1 审批配置准备清单 @@ -216,8 +217,8 @@ WAPC2 承接 WAPC1 的配置准备清单,但范围先收窄到请假和补卡 WAPC2 通过后,下一步不是直接进入 `wecom_attendance_approval_mirror_v1`。WPROC1/WAPC2F 固定后续必须先做: -1. `WAPC2F 自动生成 POC 样件`:dry-run 已通过;默认申请人 `SMOKE002`、审批人 `SMOKE101`,两者必须 active、已绑定企微、可见、不是同一 OA 员工且不是同一企微 userid;live 创建模板/审批单仍需另行问答批准。 -2. `WAPC2 自动复跑`:只有 live 生成真实模板 ID 和 `sp_no` 后,才使用脱敏模板 ID 和 `sp_no` 复跑只读 POC。 +1. `WAPC2F 自动生成 POC 样件`:dry-run 已通过;默认申请人 `SMOKE002`、审批人 `SMOKE101`,两者必须 active、已绑定企微、可见、不是同一 OA 员工且不是同一企微 userid;WAPC2FLIVE 已在用户批准后创建 OA-POC 请假/补卡测试模板和低风险测试审批单,记录脱敏报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json`。 +2. `WAPC2 自动复跑`:已由 WAPC2FLIVE 自动传入生成的模板 ID 和 `sp_no`,只读复跑结论为 `PASS_APPROVAL_POC`。 3. `WCBK1 回调只读 POC`:证明 URL 验证、验签、解密、幂等和重复投递。 4. `WACP3 补偿拉取 POC`:证明按时间窗口拿到审批单号并可拉取审批详情。 5. `WADM1 镜像数据模型设计`:先设计字段、状态机、幂等键、索引和隐私保留边界。 diff --git a/docs/开发交付与变更管理规约.md b/docs/开发交付与变更管理规约.md index 4b5e3d23..4c336582 100644 --- a/docs/开发交付与变更管理规约.md +++ b/docs/开发交付与变更管理规约.md @@ -22,7 +22,7 @@ WDRG 后,企微优先 HR/考勤改造增加一层路线图门禁;WAPI/WRRA `需求事实源 -> 设计门禁 -> 路线图门禁 -> 企微能力 POC -> 单功能 Issue CSV -> 方案批准 -> 开发实现 -> review -> QA 回归 -> 部署 / 公网验证` -路线图只控制顺序、边界、准入和退出条件;具体接口、schema、页面、权限、审计和测试仍必须在单功能 Issue CSV 中声明。阶段未退出前不得跳阶段:WOUA-FIX 已完成测试账号差异收口,但 `PASS_WITH_FINDINGS` 的剩余缺字段/归档绑定不直接放行深度镜像;WRA1 已完成 `WECOM-RUNTIME-READY-V1` 的运行入口、OAuth/绑定、脱敏消息、通讯录、人事助手和打卡只读门禁修正;WMSG1 已完成真实应用消息和 Deeplink 确认。当前 `PASS_WITH_CONFIG_GAPS` 只表示运行优先主链路可用,WAPC1 只表示审批配置准备清单已固化;WAPC2 只证明请假/补卡模板详情和审批详情只读 runner 已具备。WPROC1 后,审批镜像前必须先完成 WAPC2F 自动样件、WAPC2 自动复跑、WCBK1 回调只读 POC、WACP3 补偿拉取 POC 和 WADM1 镜像数据模型设计。 +路线图只控制顺序、边界、准入和退出条件;具体接口、schema、页面、权限、审计和测试仍必须在单功能 Issue CSV 中声明。阶段未退出前不得跳阶段:WOUA-FIX 已完成测试账号差异收口,但 `PASS_WITH_FINDINGS` 的剩余缺字段/归档绑定不直接放行深度镜像;WRA1 已完成 `WECOM-RUNTIME-READY-V1` 的运行入口、OAuth/绑定、脱敏消息、通讯录、人事助手和打卡只读门禁修正;WMSG1 已完成真实应用消息和 Deeplink 确认。当前 `PASS_WITH_CONFIG_GAPS` 只表示运行优先主链路可用,WAPC1 只表示审批配置准备清单已固化;WAPC2 只证明请假/补卡模板详情和审批详情只读 runner 已具备。WAPC2FLIVE 已创建 OA-POC 请假/补卡测试样件并自动复跑 WAPC2 通过;审批镜像前仍必须先完成 WCBK1 回调只读 POC、WACP3 补偿拉取 POC 和 WADM1 镜像数据模型设计。 ## 2. Issue 生命周期 @@ -97,7 +97,7 @@ WDRG 后,企微优先 HR/考勤路线采用“路线图门禁 + 单功能 Issu 当前企微优先路线顺序固定为: -`WECOM-CAPABILITY-POC-V1 -> wecom_hr_master_sync_v1 -> runtime_first_wecom_enablement -> WOUA-FIX / WECOM-RUNTIME-READY-V1 -> WAPC1 审批配置准备 -> WAPC2 请假/补卡只读 POC -> WAPC2F 自动生成 POC 样件 -> WAPC2 自动复跑 -> WCBK1 回调只读 POC -> WACP3 补偿拉取 POC -> WADM1 镜像数据模型设计 -> wecom_attendance_approval_mirror_v1 -> oa_hr_emergency_mode_v1 -> wecom_recovery_writeback_v1 -> wecom_ruleops_v1` +`WECOM-CAPABILITY-POC-V1 -> wecom_hr_master_sync_v1 -> runtime_first_wecom_enablement -> WOUA-FIX / WECOM-RUNTIME-READY-V1 -> WAPC1 审批配置准备 -> WAPC2 请假/补卡只读 POC -> WAPC2F 自动生成 POC 样件 -> WAPC2FLIVE live 创建与 WAPC2 自动复跑 -> WCBK1 回调只读 POC -> WACP3 补偿拉取 POC -> WADM1 镜像数据模型设计 -> wecom_attendance_approval_mirror_v1 -> oa_hr_emergency_mode_v1 -> wecom_recovery_writeback_v1 -> wecom_ruleops_v1` 允许并行处理线上缺陷、正式使用阻断、真实反馈扫尾和 QA-only 脚本维护;但采购、合同、报销、付款、AP、代账和高敏附件等 OA 主办域必须另开合同,不得混入企微 HR/考勤路线。 diff --git a/docs/文档事实源状态矩阵.md b/docs/文档事实源状态矩阵.md index 7a8ec0fc..f5d2def6 100644 --- a/docs/文档事实源状态矩阵.md +++ b/docs/文档事实源状态矩阵.md @@ -80,7 +80,8 @@ | `WAPC2` | `issues/2026-05-19_09-34-16-wecom-approval-template-spno-poc-v1.csv` | `CURRENT` | 企微审批模板与低风险 `sp_no` 只读 POC 已部署并公网复跑:新增 `check:wecom-approval-poc` QA-only runner 和只读集成服务,范围请假/补卡,固定 `WECOM_AGENT_SECRET` 调用 `gettemplatedetail`/`getapprovaldetail`;远端报告 `/app/artifacts/qa-flow/wecom-approval-poc-20260519T020429Z/summary.json` 为 `PARTIAL_APPROVAL_POC_NEEDS_CONFIG`,缺模板或 `sp_no` 不放行深度镜像 | | `WPROC1` | `issues/2026-05-19_10-43-50-wecom-process-route-engineering-v1.csv` | `CURRENT` | 企微路线与开发流程工程化修正:docs-only/contract-only 固化三层门禁、Definition of Ready、Definition of Done、自动化优先、非自审和高风险 POC 前置;修正 WAPC2F 默认链为 `SMOKE002 -> SMOKE101`,WAPC2 后不得直接进入深度镜像 | | `WPROC2` | `issues/2026-05-19_11-15-10-process-gate-automation-v1.csv` | `CURRENT` | 开发流程自动化门禁:新增 `scripts/qa/check-process-contract.mjs` process gate、WAPC2F profile 和最小门禁接入;WAPC2F 实施前必须先通过 baseline gate,不部署、不写 OA/企微数据 | -| `WAPC2F` | `issues/2026-05-19_10-24-43-wecom-approval-fixture-auto-generate-v1.csv` | `CURRENT` | 企微审批 POC 样件自动生成 dry-run 已实现并部署验证:新增 `check:wecom-approval-fixtures` QA-only runner,固定 `WECOM_AGENT_SECRET` 构建 OA-POC 请假/补卡最小通用模板和低风险审批申请 payload;远端报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`;未真实创建模板或审批单,live 写入仍需单独批准 | +| `WAPC2F` | `issues/2026-05-19_10-24-43-wecom-approval-fixture-auto-generate-v1.csv` | `EVIDENCE` | 企微审批 POC 样件自动生成 dry-run 已实现并部署验证:新增 `check:wecom-approval-fixtures` QA-only runner,固定 `WECOM_AGENT_SECRET` 构建 OA-POC 请假/补卡最小通用模板和低风险审批申请 payload;远端报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY` | +| `WAPC2FLIVE` | `issues/2026-05-19_13-24-12-wecom-approval-fixture-live-create-v1.csv` | `CURRENT` | 企微审批 OA-POC 样件 live 创建已完成:修正 `create_template` payload 为官方 `template_name` + `property` controls 结构后,远端报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`,请假/补卡测试模板和低风险测试审批单已创建并保留审计,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`;仍不代表真实回调、补偿拉取、镜像模型或深度镜像已完成 | 旧 Issue CSV 保留为历史审计证据:不删除、不批量回写、不移动到 `docs/archive/` 或其他归档目录。新连续合同如替代旧合同,只在新合同 `Notes` 或文档索引中说明 supersedes。 @@ -88,28 +89,28 @@ | Doc_ID | Path | Category | Authority | Status | Owner | Related_Issues | Evidence | Supersedes | Last_Audited | Audit_Method | Risk | Notes | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| `IDX` | `docs/文档索引.md` | 入口索引 | 最高文档入口 | `CURRENT` | product/dev | `GOV8,QAOPS9,P2D,P2-ORG,P2-FIN-DECISION,P2-FIN-V1,P2-OCR-SAMPLE,P2Q,P2AUTO,P2AF,P2-FIN-LIVE-DECISION,P2-FIN-LIVE,PRELAUNCH,CASHIER-VOUCHER-V1,LAUNCH-DEPLOY-FINANCE,FIN-PROD-ENABLE,ACCOUNTING-HANDOFF-V1,SYSTEM-COMPLETE-GATE,LAUNCH-OPS-V1,REQ-COMPLETE-AUDIT,ATTV1,LAUNCH-AUTO-OPS-V1,AUTO-REMAINING-CLOSEOUT,HR-WECOM-DIRECTORY-V1,WFOC,DBWFOC,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F` | `rg` | none | 2026-05-19 | `node scripts/qa/audit-docs.mjs --check-registry` | medium | 判断当前该读什么 | -| `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` | `audit-docs` | none | 2026-05-19 | `audit-docs --check-registry` | medium | 判断文档权威性 | -| `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` | Issue CSV | `docs/requirements-specification.md` | 2026-05-19 | `rg` | high | WAPC1 后定义 HR 主数据镜像读取口径、运行优先、WOUA 差异收口、消息实发和审批配置准备边界;ERP 未来不接入 OA | -| `PRODUCT-SCOPE` | `docs/产品口径.md` | 需求事实源 | 产品边界事实源 | `CURRENT` | product | `REQ8,P2T,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WAPC1` | `rg` | none | 2026-05-19 | `rg` | high | 记录已拍板产品边界、企微/OA 设计门禁、开发路线图、WCPC 准入结论、WHMS 部署验证、WAPI 运行优先、WRRA 差异收口和 WAPC1 审批配置准备口径 | +| `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` | `rg` | none | 2026-05-19 | `node scripts/qa/audit-docs.mjs --check-registry` | medium | 判断当前该读什么 | +| `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` | `audit-docs` | none | 2026-05-19 | `audit-docs --check-registry` | medium | 判断文档权威性 | +| `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` | Issue CSV | `docs/requirements-specification.md` | 2026-05-19 | `rg` | high | WAPC2FLIVE 后定义 HR 主数据镜像读取口径、运行优先、WOUA 差异收口、消息实发、审批配置准备、请假/补卡 POC 样例和深度镜像前置边界;ERP 未来不接入 OA | +| `PRODUCT-SCOPE` | `docs/产品口径.md` | 需求事实源 | 产品边界事实源 | `CURRENT` | product | `REQ8,P2T,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WAPC1,WAPC2FLIVE` | `rg` | none | 2026-05-19 | `rg` | high | 记录已拍板产品边界、企微/OA 设计门禁、开发路线图、WCPC 准入结论、WHMS 部署验证、WAPI 运行优先、WRRA 差异收口、WAPC1 审批配置准备和 WAPC2FLIVE 请假/补卡样例口径 | | `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` | Issue CSV | none | 2026-05-19 | `rg` | high | WAPC2F 后记录企微 HR/考勤路线阶段顺序、API/Secret 口径、运行优先、消息实发、审批配置、只读 POC、process gate、WAPC2F dry-run 通过、WCBK1 回调、WACP3 补偿拉取、WADM1 模型设计和禁止跳阶段 | -| `WECOM-API-CATALOG` | `docs/企微API能力目录.md` | 集成事实源 | 企微 API 能力目录和 Secret 矩阵事实源 | `CURRENT` | product/backend/qa | `WAPI,WRRA,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F` | 官方企业微信开发者中心链接/Issue CSV | none | 2026-05-19 | `rg` | high | 企微开发先读;只保存摘要、链接和项目决策,不保存 Secret、token、完整 userid、手机号、邮箱或原始 payload;WAPC2F 后记录 create_template/applyevent dry-run ready 和 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` | Issue CSV | none | 2026-05-19 | `rg` | high | WAPC2FLIVE 后记录企微 HR/考勤路线阶段顺序、API/Secret 口径、运行优先、消息实发、审批配置、只读 POC、process gate、OA-POC live 创建、WCBK1 回调、WACP3 补偿拉取、WADM1 模型设计和禁止跳阶段 | +| `WECOM-API-CATALOG` | `docs/企微API能力目录.md` | 集成事实源 | 企微 API 能力目录和 Secret 矩阵事实源 | `CURRENT` | product/backend/qa | `WAPI,WRRA,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE` | 官方企业微信开发者中心链接/Issue CSV | none | 2026-05-19 | `rg` | high | 企微开发先读;只保存摘要、链接和项目决策,不保存 Secret、token、完整 userid、手机号、邮箱或原始 payload;WAPC2FLIVE 后记录 create_template/applyevent live 通过和审批样件保留审计边界 | | `DELIVERY` | `docs/开发交付与变更管理规约.md` | 开发治理 | 开发交付事实源 | `CURRENT` | dev/qa | `GOV8,WDRG,WRRA,WAPC1,WPROC1,WPROC2` | `rg` | none | 2026-05-19 | `rg` | high | Issue、review、commit、交付规则;WPROC2 后采用路线门禁、能力门禁、实现门禁、DoR/DoD、自动化优先和可执行 process gate | -| `QA-GATE` | `docs/测试规约与回归门禁.md` | 测试验收 | 测试和回归门禁事实源 | `CURRENT` | qa | `QAF8,GOV8,WPROC1,WPROC2` | 回归脚本/Playwright | none | 2026-05-19 | `rg` | high | 测试计划、DONE 门禁、企微三层门禁、自动化优先、非自审测试要求和 check-process-contract | +| `QA-GATE` | `docs/测试规约与回归门禁.md` | 测试验收 | 测试和回归门禁事实源 | `CURRENT` | qa | `QAF8,GOV8,WPROC1,WPROC2,WAPC2FLIVE` | 回归脚本/Playwright | none | 2026-05-19 | `rg` | high | 测试计划、DONE 门禁、企微三层门禁、自动化优先、非自审测试要求、check-process-contract 和 WAPC2FLIVE 后续回调/补偿/模型门禁 | | `AGENT-PRACTICE` | `docs/Agent开发交付实践.md` | Agent 治理 | Agent 协作事实源 | `CURRENT` | dev | `GOV8,DG8` | Skill 校验 | none | 2026-05-13 | `rg` | medium | Agent 协作开发实践和设计主参考层级 | | `AGENTS` | `AGENTS.md` | 执行硬约束 | 项目硬规则 | `CURRENT` | lead | `GOV8` | 人工核对 | none | 2026-05-13 | `rg` | high | 不可违反约束 | -| `SKILL-HYB` | `.agents/skills/hyb-oa-delivery/SKILL.md` | Skill | 项目交付 Skill | `CURRENT` | dev | `GOV8,DG8,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F` | quick_validate | none | 2026-05-19 | `quick_validate.py` | medium | 每轮交付操作入口;企微/OA 后续先读 API 能力目录、Secret 矩阵、路线图和 WAPC2F dry-run 状态,不得跳过 live 样件、WCBK1/WACP3/WADM1 直接做考勤审批镜像 | -| `REQ-WF` | `docs/需求-统一审批中心规约.md` | 需求事实源 | 审批模块规约 | `CURRENT` | product/backend | `AP6,WF8,WFOC,DBWFOC,WFDG,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F` | workflow 回归 | none | 2026-05-19 | `rg` | high | OA 主办审批、企微镜像、WRV1/WRA1/WMSG1/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F 运行优先、审批配置、只读 POC、dry-run 样件、回调/补偿/模型设计前置和 OA 应急接管边界 | +| `SKILL-HYB` | `.agents/skills/hyb-oa-delivery/SKILL.md` | Skill | 项目交付 Skill | `CURRENT` | dev | `GOV8,DG8,WFDG,WDRG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE` | quick_validate | none | 2026-05-19 | `quick_validate.py` | medium | 每轮交付操作入口;企微/OA 后续先读 API 能力目录、Secret 矩阵、路线图和 WAPC2FLIVE live 状态,不得跳过 WCBK1/WACP3/WADM1 直接做考勤审批镜像 | +| `REQ-WF` | `docs/需求-统一审批中心规约.md` | 需求事实源 | 审批模块规约 | `CURRENT` | product/backend | `AP6,WF8,WFOC,DBWFOC,WFDG,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE` | workflow 回归 | none | 2026-05-19 | `rg` | high | OA 主办审批、企微镜像、WRV1/WRA1/WMSG1/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F/WAPC2FLIVE 运行优先、审批配置、只读 POC、live 样件、回调/补偿/模型设计前置和 OA 应急接管边界 | | `REQ-OCR` | `docs/需求-报销发票OCR规约.md` | 需求事实源 | OCR 模块规约 | `CURRENT` | product/backend | `RI6,OCR8,BIZ8` | OCR 回归 | none | 2026-05-13 | `rg` | high | OCR 和发票边界 | | `RULE-REIMB` | `docs/报销发票附件规则.md` | 需求事实源 | 报销发票附件规则 | `CURRENT` | product/finance | `RI6,BIZ8` | 报销回归 | none | 2026-05-13 | `rg` | high | 报销、发票、附件细则 | -| `REQ-WECOM` | `docs/需求-企业微信基础设施规约.md` | 需求事实源 | 企业微信边界规约 | `CURRENT` | product/backend | `R7E,ORG8,WF8,ATTV1,HR-WECOM-DIRECTORY-V1,WFOC,DBWFOC,WFDG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F` | live smoke/真机反馈/Issue CSV | none | 2026-05-19 | `rg` | high | 企微优先承担 HR/考勤员工日常审批和人事/打卡能力;WAPC2F 固定 dry-run 样件与 live 写入批准边界;采购、合同、项目、报销和财务继续 OA 主办 | +| `REQ-WECOM` | `docs/需求-企业微信基础设施规约.md` | 需求事实源 | 企业微信边界规约 | `CURRENT` | product/backend | `R7E,ORG8,WF8,ATTV1,HR-WECOM-DIRECTORY-V1,WFOC,DBWFOC,WFDG,WCP1,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE` | live smoke/真机反馈/Issue CSV | none | 2026-05-19 | `rg` | high | 企微优先承担 HR/考勤员工日常审批和人事/打卡能力;WAPC2FLIVE 固定 OA-POC 样件 live 创建与保留审计边界;采购、合同、项目、报销和财务继续 OA 主办 | | `RUNBOOK-TRIAL` | `docs/试运行与自动化验证手册.md` | 操作手册 | 试运行验证手册 | `CURRENT` | qa/ops | `R7E,QAOPS8` | live readiness | none | 2026-05-13 | `rg` | medium | 本地、公网、企业微信和真实 OCR 验证 | -| `MANUAL-ADMIN` | `docs/管理员手册.md` | 操作手册 | 管理员手册 | `CURRENT` | ops/admin | `ORG8,R7E,WFOC,DBWFOC,WFDG,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F` | 人工验收 | none | 2026-05-19 | `rg` | medium | 管理员上线、企微优先边界、Secret 矩阵、OA 主办数据边界、HR 主数据镜像、运行门禁、消息实发、审批配置、只读 POC、WAPC2F dry-run 和非自审链路 | +| `MANUAL-ADMIN` | `docs/管理员手册.md` | 操作手册 | 管理员手册 | `CURRENT` | ops/admin | `ORG8,R7E,WFOC,DBWFOC,WFDG,WCPC,WHMS,WHMSLIVE,WOUA,WAPI,WRRA,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WPROC1,WPROC2,WAPC2F,WAPC2FLIVE` | 人工验收 | none | 2026-05-19 | `rg` | medium | 管理员上线、企微优先边界、Secret 矩阵、OA 主办数据边界、HR 主数据镜像、运行门禁、消息实发、审批配置、只读 POC、WAPC2FLIVE live 样件和非自审链路 | | `MANUAL-EMPLOYEE` | `docs/员工快速上手.md` | 操作手册 | 员工手册 | `CURRENT` | product | `R7E,WFOC,DBWFOC,WFDG` | 人工验收 | none | 2026-05-18 | `rg` | low | 员工侧使用说明,HR/考勤优先企业微信,采购/合同/财务仍在 OA;区分企微镜像和 OA 应急接管 | | `R7-DRAFT` | `docs/trialrun/R7扩大试运行草案.md` | 草案 | R7 准备材料 | `DRAFT` | product/qa | `R7E` | R7EP 报告 | none | 2026-05-13 | `rg` | medium | 不代表当前 R7E 执行状态 | | `OPS-RUNBOOK` | `docs/trialrun/OPS7运维交接Runbook.md` | 运维草案 | OPS 准备材料 | `DRAFT` | ops | `OPS8,QAOPS8` | 只读检查 | none | 2026-05-13 | `rg` | medium | 不代表恢复演练已执行 | -| `TRIAL-REPORT` | `docs/trialrun/人工试运行报告.md` | 证据材料 | 试运行证据入口 | `EVIDENCE` | qa | `R7EP,OPS8,QAF8,WOUA,WAPI,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WAPC2F` | artifacts/qa-flow | none | 2026-05-19 | `rg` | medium | 只证明发生过;记录 WOUA-FIX 受控写入、WRV1/WRA1 运行优先门禁、WMSG1 消息实发真机确认、WAPC1 配置准备清单、WAPC2 只读 POC 和 WAPC2F dry-run,不直接放行深度镜像 | +| `TRIAL-REPORT` | `docs/trialrun/人工试运行报告.md` | 证据材料 | 试运行证据入口 | `EVIDENCE` | qa | `R7EP,OPS8,QAF8,WOUA,WAPI,WOUAFIX,WRV1,WRA1,WMSG1,WAPC1,WAPC2,WAPC2F,WAPC2FLIVE` | artifacts/qa-flow | none | 2026-05-19 | `rg` | medium | 只证明发生过;记录 WOUA-FIX 受控写入、WRV1/WRA1 运行优先门禁、WMSG1 消息实发真机确认、WAPC1 配置准备清单、WAPC2 只读 POC、WAPC2F dry-run 和 WAPC2FLIVE live 样件创建,不直接放行深度镜像 | | `FBA-AUDIT` | `docs/trialrun/R7E后功能边界审计.md` | 证据材料 | R7E 后功能边界审计 | `EVIDENCE` | product/dev/qa | `FBA,R7E,QAOPS8,P2T` | Issue CSV | none | 2026-05-15 | `rg` | medium | 只作为功能边界、P2 候选和 Issue 草案证据,不直接派工 | | `HISTORY-MATRIX` | `docs/历史功能状态矩阵.md` | 历史材料 | 历史功能索引 | `HISTORICAL` | product | `DCL7` | git 历史 | none | 2026-05-13 | `rg` | low | 只追溯历史 | | `OLD-IMPL-PLAN` | `docs/implementation_plan.md` | 已移除历史 | 早期实施计划 | `REMOVED` | product | `DCL7` | git history | none | 2026-05-13 | manual | low | 从 git 历史恢复 | @@ -129,7 +130,7 @@ | `docs/报销发票附件规则.md` | 当前事实源 | 报销、发票、附件细则 | | `docs/需求-报销发票OCR规约.md` | 当前事实源 | OCR 和报销模块规约 | | `docs/需求-企业微信基础设施规约.md` | 当前事实源 | 企业微信入口、身份、消息、deeplink | -| `docs/需求-请假考勤修正规约.md` | 当前事实源 | 请假、补卡、考勤修正、WAPC2 只读 POC 和 WPROC1/WPROC2 后续门禁 | +| `docs/需求-请假考勤修正规约.md` | 当前事实源 | 请假、补卡、考勤修正、WAPC2 只读 POC、WAPC2FLIVE 样例和 WPROC1/WPROC2 后续门禁 | | `docs/需求-采购费用审批规约.md` | 当前事实源 | 采购和费用审批 | | `docs/需求-合同附件归档规约.md` | 当前事实源 | 合同台账和附件归档 | | `docs/需求-项目轻管理规约.md` | 当前事实源 | 项目轻管理 | @@ -198,10 +199,10 @@ - `ME6-3` 代表性企业微信真机门禁已关闭。 - MIF7-1..7 与 MIF7T 已完成本地整改、公网部署、公网匿名复检和带凭据 live smoke/OCR 复检。 -- R7E 真实扩大试运行阶段验收、P2 排序、R7E 收口、QAOPS8 上线硬化阶段收口、QAOPS9 上线硬化连续合同、PRELAUNCH 正式启用前公网预回归、CASHIER-VOUCHER-V1 财务闭环与银行回单附件、LAUNCH-DEPLOY-FINANCE 部署复检、FIN-PROD-ENABLE 正式常开、ACCOUNTING-HANDOFF-V1 代账交接 SOP、SYSTEM-COMPLETE-GATE 系统完成门禁、LAUNCH-OPS-V1 首周运营保障、REQ-COMPLETE-AUDIT 需求完成度复核、ATTV1 考勤统一入口、AUTO-REMAINING-CLOSEOUT 剩余自动化收口、HRWD-CONTACT-LIVE-TEST 公网企微通讯录真实写入闭环、WFOC 需求重构、DBWFOC 数据边界修正、WFDG 设计门禁、WDRG 路线图门禁、WCPC 配置复跑、WHMSLIVE、WAPI、WRRA、WOUA-FIX、WRA1、WMSG1、WAPC1、WAPC2、WPROC1、WPROC2 和 WAPC2F dry-run 均已完成,当前 P0/P1 阻断为 0;P2D 已完成决策分流,P2-ORG 只读巡检已完成且无需写修复合同。LAUNCH-AUTO-OPS-V1 发现的公网 `payment_batch_v1=force_off` 漂移已由 AUTOREM 恢复为 `force_on`,正式自动巡检结论为 `GO_TO_OPERATE`;`erp_sync=force_off`,ERP 未来不接入 OA,正式支付接口、图片 OCR 和银行流水导入继续不进入当前路线。WCP1 已完成企业微信能力 QA-only 只读 POC,历史结论为 `PAUSE_FOR_CONFIG`;WCPC 使用既有在职测试号 `SMOKE002/测试员工`(脱敏 `oa_smoke***`)完成远端只读复跑,报告 `/tmp/wecom-capability-poc-wcpc-smoke002/summary.json`,结论 `GO_TO_HR_MASTER_SYNC`,`nextStageAllowed=true`,`blockingCapabilities=[]`。WHMS 已实现并部署验证 `wecom_hr_master_sync_v1`、同步批次/逐员工记录、dry-run/apply、管理员 API、People 管理入口和 QA-only runner;默认和最终均为 `force_off`,公网 `SMOKE002` 因缺手机号、邮箱和部门按 `missing_required_field` 跳过,未执行生产真实员工批量 apply。WAPI 已将企微官方 API 能力目录、Secret 矩阵和运行优先路线落为当前事实源:通讯录读取使用 `WECOM_CONTACT_SECRET` 和 `user/list_id`,成员详情只作可选富化,人事助手/花名册、打卡、消息、OAuth 和审批读取默认使用 `WECOM_AGENT_SECRET`,`WECOM_CHECKIN_SECRET` 只作专用打卡 override,`WECOM_HR_ASSISTANT_SECRET` 不参与默认读取;后续企微能力不清楚时先查官方 API 和 [企微 API 能力目录](./企微API能力目录.md),不得靠运行时多个 Secret 试错。WOUA-FIX 已按用户确认执行受控写入并复检:7 个 OA active 缺企微测试账号软归档,`T0000` seed 复活问题修正,`SMOKE201` 测试主管和待办副作用已转交,最终 WOUA 报告 `/app/artifacts/qa-flow/wecom-oa-user-consistency-20260518T161716Z/summary.json` 为 `PASS_WITH_FINDINGS`,但 OA active 5、企微 active 5、匹配 5、OA active 缺企微 0;剩余 5 个企微缺字段先接受不补,`HRWDTEST-20260517214548` 归档绑定保留审计。WRV1 原始报告 `/app/artifacts/qa-flow/wecom-runtime-ready-20260518T173402Z/summary.json` 曾因同步开关误阻断;WRA1 已修正并公网复跑,报告 `/app/artifacts/qa-flow/wecom-runtime-ready-20260518T180506Z/summary.json` 为 `PASS_WITH_CONFIG_GAPS`,入口/OAuth、Secret 矩阵、OA active 绑定、通讯录、人事助手、消息 dry-run 和打卡只读链路均通过,打卡记录 `readable_sync_disabled`。WMSG1 已证明企业微信应用消息和 Deeplink 可用;WAPC1 已固定首批审批模板(请假、补卡、外出、加班)、低风险 `sp_no`、真实回调配置项、验签/解密/幂等/重试和补偿拉取准入清单;WAPC2 已新增请假/补卡模板详情和审批详情只读 POC runner;WPROC1 已固定后续自动化优先、非自审和三层门禁,WPROC2 已将其升级为 `check-process-contract` process gate;WAPC2F 已新增审批样件 runner 并公网 dry-run 通过,未真实创建企微模板或审批单。HR/考勤员工日常审批优先复用企业微信,OA 目标是按域镜像、人工接管、恢复回写和 RuleOps;采购、费用、合同、项目、报销、付款、AP、代账交接、审计和高敏附件继续 OA 主办。考勤/审批镜像、审批回调、OA 应急接管、恢复回写和 RuleOps 尚未实现;审批模板 live 创建、测试审批单 `sp_no`、真实回调配置、补偿拉取、镜像数据模型和 HR 写接口仍需后续独立合同处理;不得跳过 WAPC2F live 样件、WCBK1、WACP3、WADM1 直接进入 `wecom_attendance_approval_mirror_v1`、`oa_hr_emergency_mode_v1`、`wecom_recovery_writeback_v1` 或 `wecom_ruleops_v1`。HRWD 已完成 OA 驱动企业微信通讯录同步,并通过 `HRWDTEST-20260517214548` 真实公网 create/update/disable 验证;测试成员按审计要求保留离职/禁用状态。 +- R7E 真实扩大试运行阶段验收、P2 排序、R7E 收口、QAOPS8 上线硬化阶段收口、QAOPS9 上线硬化连续合同、PRELAUNCH 正式启用前公网预回归、CASHIER-VOUCHER-V1 财务闭环与银行回单附件、LAUNCH-DEPLOY-FINANCE 部署复检、FIN-PROD-ENABLE 正式常开、ACCOUNTING-HANDOFF-V1 代账交接 SOP、SYSTEM-COMPLETE-GATE 系统完成门禁、LAUNCH-OPS-V1 首周运营保障、REQ-COMPLETE-AUDIT 需求完成度复核、ATTV1 考勤统一入口、AUTO-REMAINING-CLOSEOUT 剩余自动化收口、HRWD-CONTACT-LIVE-TEST 公网企微通讯录真实写入闭环、WFOC 需求重构、DBWFOC 数据边界修正、WFDG 设计门禁、WDRG 路线图门禁、WCPC 配置复跑、WHMSLIVE、WAPI、WRRA、WOUA-FIX、WRA1、WMSG1、WAPC1、WAPC2、WPROC1、WPROC2、WAPC2F dry-run 和 WAPC2FLIVE 均已完成,当前 P0/P1 阻断为 0;P2D 已完成决策分流,P2-ORG 只读巡检已完成且无需写修复合同。LAUNCH-AUTO-OPS-V1 发现的公网 `payment_batch_v1=force_off` 漂移已由 AUTOREM 恢复为 `force_on`,正式自动巡检结论为 `GO_TO_OPERATE`;`erp_sync=force_off`,ERP 未来不接入 OA,正式支付接口、图片 OCR 和银行流水导入继续不进入当前路线。WCP1 已完成企业微信能力 QA-only 只读 POC,历史结论为 `PAUSE_FOR_CONFIG`;WCPC 使用既有在职测试号 `SMOKE002/测试员工`(脱敏 `oa_smoke***`)完成远端只读复跑,报告 `/tmp/wecom-capability-poc-wcpc-smoke002/summary.json`,结论 `GO_TO_HR_MASTER_SYNC`,`nextStageAllowed=true`,`blockingCapabilities=[]`。WHMS 已实现并部署验证 `wecom_hr_master_sync_v1`、同步批次/逐员工记录、dry-run/apply、管理员 API、People 管理入口和 QA-only runner;默认和最终均为 `force_off`,公网 `SMOKE002` 因缺手机号、邮箱和部门按 `missing_required_field` 跳过,未执行生产真实员工批量 apply。WAPI 已将企微官方 API 能力目录、Secret 矩阵和运行优先路线落为当前事实源:通讯录读取使用 `WECOM_CONTACT_SECRET` 和 `user/list_id`,成员详情只作可选富化,人事助手/花名册、打卡、消息、OAuth 和审批读取默认使用 `WECOM_AGENT_SECRET`,`WECOM_CHECKIN_SECRET` 只作专用打卡 override,`WECOM_HR_ASSISTANT_SECRET` 不参与默认读取;后续企微能力不清楚时先查官方 API 和 [企微 API 能力目录](./企微API能力目录.md),不得靠运行时多个 Secret 试错。WOUA-FIX 已按用户确认执行受控写入并复检:7 个 OA active 缺企微测试账号软归档,`T0000` seed 复活问题修正,`SMOKE201` 测试主管和待办副作用已转交,最终 WOUA 报告 `/app/artifacts/qa-flow/wecom-oa-user-consistency-20260518T161716Z/summary.json` 为 `PASS_WITH_FINDINGS`,但 OA active 5、企微 active 5、匹配 5、OA active 缺企微 0;剩余 5 个企微缺字段先接受不补,`HRWDTEST-20260517214548` 归档绑定保留审计。WRV1 原始报告 `/app/artifacts/qa-flow/wecom-runtime-ready-20260518T173402Z/summary.json` 曾因同步开关误阻断;WRA1 已修正并公网复跑,报告 `/app/artifacts/qa-flow/wecom-runtime-ready-20260518T180506Z/summary.json` 为 `PASS_WITH_CONFIG_GAPS`,入口/OAuth、Secret 矩阵、OA active 绑定、通讯录、人事助手、消息 dry-run 和打卡只读链路均通过,打卡记录 `readable_sync_disabled`。WMSG1 已证明企业微信应用消息和 Deeplink 可用;WAPC1 已固定首批审批模板(请假、补卡、外出、加班)、低风险 `sp_no`、真实回调配置项、验签/解密/幂等/重试和补偿拉取准入清单;WAPC2 已新增请假/补卡模板详情和审批详情只读 POC runner;WPROC1 已固定后续自动化优先、非自审和三层门禁,WPROC2 已将其升级为 `check-process-contract` process gate;WAPC2F 已新增审批样件 runner并公网 dry-run 通过;WAPC2FLIVE 已在用户批准后修正 `create_template` payload,创建 OA-POC 请假/补卡测试模板和低风险测试审批单,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`。HR/考勤员工日常审批优先复用企业微信,OA 目标是按域镜像、人工接管、恢复回写和 RuleOps;采购、费用、合同、项目、报销、付款、AP、代账交接、审计和高敏附件继续 OA 主办。考勤/审批镜像、审批回调、OA 应急接管、恢复回写和 RuleOps 尚未实现;真实回调配置、补偿拉取、镜像数据模型和 HR 写接口仍需后续独立合同处理;不得跳过 WCBK1、WACP3、WADM1 直接进入 `wecom_attendance_approval_mirror_v1`、`oa_hr_emergency_mode_v1`、`wecom_recovery_writeback_v1` 或 `wecom_ruleops_v1`。HRWD 已完成 OA 驱动企业微信通讯录同步,并通过 `HRWDTEST-20260517214548` 真实公网 create/update/disable 验证;测试成员按审计要求保留离职/禁用状态。 - WMSG1 已完成企微应用消息实发与 Deeplink 真机验证:远端报告 `/app/artifacts/qa-flow/wecom-runtime-ready-20260518T234431Z/summary.json` 显示 `checks.message.status=OK`、`errcode=0`、`recipientCount=1`,用户确认收到“OA 运行就绪检查”并可点击进入 OA 通知页面;本证据只证明消息和 Deeplink 可用,不放行审批模板、测试 `sp_no`、真实回调或深度镜像。 - WAPC1 已完成企微审批配置准备清单:首批只准备请假、补卡、外出、加班模板;每个模板需准备模板 ID、适用范围、字段项、审批人规则、可见范围和自建应用权限;测试 `sp_no` 必须低风险且不得含采购、合同、报销、发票、银行回单或高敏附件;真实回调 Token/EncodingAESKey 不写入仓库或文档。本证据只代表配置准备口径已固化,不代表真实回调、审批镜像、应急接管、恢复回写或 RuleOps 已实现。 - WAPC2 已完成企微审批模板与低风险 `sp_no` 只读 POC 本地实现、部署和公网只读复跑:范围只包括请假和补卡,固定 `WECOM_AGENT_SECRET`,远端报告为 `PARTIAL_APPROVAL_POC_NEEDS_CONFIG`;本证据只代表模板详情/审批详情只读 runner 已具备且远端 Secret 可用,不代表模板 ID、测试 `sp_no`、真实回调或深度镜像已配置完成。 -- WPROC1 已修正企微路线与开发流程工程化门禁:后续默认自动化优先,人工只处理批准、密钥/回调配置、企微后台不可 API 化配置、真机确认和风险拍板;WAPC2F 默认使用 `SMOKE002 -> SMOKE101` 非自审链,`SMOKE101` 不可用时停止问答确认;`wecom_attendance_approval_mirror_v1` 前必须完成 WAPC2F、WAPC2 自动复跑、WCBK1、WACP3 和 WADM1。 +- WPROC1 已修正企微路线与开发流程工程化门禁:后续默认自动化优先,人工只处理批准、密钥/回调配置、企微后台不可 API 化配置、真机确认和风险拍板;WAPC2F 默认使用 `SMOKE002 -> SMOKE101` 非自审链,`SMOKE101` 不可用时停止问答确认;`wecom_attendance_approval_mirror_v1` 前必须完成 WAPC2F、WAPC2 自动复跑、WCBK1、WACP3 和 WADM1。当前 WAPC2F 和 WAPC2 自动复跑已由 WAPC2FLIVE 完成。 - WPROC2 已新增开发流程自动化门禁:`node scripts/qa/check-process-contract.mjs --baseline` 检查核心事实源和 WAPC2F 合同,`wecom-approval-fixture` profile 检查非自审、Secret 固定、live 双开关、缺配置分类和脱敏边界;该门禁已接入 `scripts/check-minimal.sh`。 -- WAPC2F 已实现企微审批 POC 样件自动生成 dry-run:`npm run check:wecom-approval-fixtures` 已部署公网并返回 `PASS_FIXTURE_DRY_RUN_READY`,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json`;当前未设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,未创建模板或审批单,下一步 live 写入必须再次问答确认。 +- WAPC2F 已实现企微审批 POC 样件自动生成 dry-run:`npm run check:wecom-approval-fixtures` 已部署公网并返回 `PASS_FIXTURE_DRY_RUN_READY`,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json`。WAPC2FLIVE 已在用户批准后执行 live 创建,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`;后续不再重复创建样件,下一步应单独规划 `WCBK1` 回调只读 POC。 diff --git a/docs/文档索引.md b/docs/文档索引.md index 68897f3a..49929cd8 100644 --- a/docs/文档索引.md +++ b/docs/文档索引.md @@ -20,7 +20,7 @@ ## 最近事实源链 -R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> MIF7/MIF7T(公网部署与带凭据公网复检已收口) -> DG8 -> DG9 -> R7E -> FBA -> QAOPS9/P2D -> P2-ORG -> P2-FIN-DECISION -> P2-FIN-V1 -> P2-OCR-SAMPLE -> P2Q -> P2AUTO -> P2AF -> P2-FIN-LIVE-DECISION -> P2-FIN-LIVE -> PRELAUNCH -> CASHIER-VOUCHER-V1 -> LAUNCH-DEPLOY-FINANCE -> FIN-PROD-ENABLE -> ACCOUNTING-HANDOFF-V1 -> SYSTEM-COMPLETE-GATE -> LAUNCH-OPS-V1 -> REQ-COMPLETE-AUDIT -> ATTV1 -> LAUNCH-AUTO-OPS-V1 -> AUTO-REMAINING-CLOSEOUT -> HR-WECOM-DIRECTORY-V1 -> HRWD-CONTACT-LIVE-TEST -> WCFB -> WFOC -> DBWFOC -> WFDG -> WDRG -> WCP1 -> WCPC -> WHMS -> WHMSLIVE -> WOUA -> WAPI -> WRRA -> WOUA-FIX -> WRV1 -> WRA1 -> WMSG1 -> WAPC1 -> WAPC2 -> WPROC1 -> WPROC2 -> WAPC2F dry-run。 +R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> MIF7/MIF7T(公网部署与带凭据公网复检已收口) -> DG8 -> DG9 -> R7E -> FBA -> QAOPS9/P2D -> P2-ORG -> P2-FIN-DECISION -> P2-FIN-V1 -> P2-OCR-SAMPLE -> P2Q -> P2AUTO -> P2AF -> P2-FIN-LIVE-DECISION -> P2-FIN-LIVE -> PRELAUNCH -> CASHIER-VOUCHER-V1 -> LAUNCH-DEPLOY-FINANCE -> FIN-PROD-ENABLE -> ACCOUNTING-HANDOFF-V1 -> SYSTEM-COMPLETE-GATE -> LAUNCH-OPS-V1 -> REQ-COMPLETE-AUDIT -> ATTV1 -> LAUNCH-AUTO-OPS-V1 -> AUTO-REMAINING-CLOSEOUT -> HR-WECOM-DIRECTORY-V1 -> HRWD-CONTACT-LIVE-TEST -> WCFB -> WFOC -> DBWFOC -> WFDG -> WDRG -> WCP1 -> WCPC -> WHMS -> WHMSLIVE -> WOUA -> WAPI -> WRRA -> WOUA-FIX -> WRV1 -> WRA1 -> WMSG1 -> WAPC1 -> WAPC2 -> WPROC1 -> WPROC2 -> WAPC2F dry-run -> WAPC2FLIVE。 - R6、PC6、PA6、FL6、AP6、RI6、LP6 已完成并部署。 - ME6 自动化、公网视觉矩阵和 `ME6-3` 代表性企业微信真机门禁已完成。 @@ -71,9 +71,10 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M - WMSG1 是 WRA1 后的企微应用消息实发与 Deeplink 真机验证合同:使用现有 runner 单次设置 `WECOM_RUNTIME_TEST_SEND=1`,向管理员本人对应 OA 员工号 `HYD000006` 发送脱敏消息;报告 `/app/artifacts/qa-flow/wecom-runtime-ready-20260518T234431Z/summary.json` 显示 `errcode=0`、`recipientCount=1`,用户确认收到消息并可点击进入 OA 通知页面。审批模板、测试 `sp_no` 和真实回调仍需后续配置。 - WAPC1 是 WMSG1 后的企微审批配置准备清单合同:只固化请假、补卡、外出、加班模板准备项、低风险 `sp_no`、真实回调配置项和 POC 准入,不开发镜像。 - WAPC2 是 WAPC1 后的请假/补卡审批只读 POC 合同:新增 `server/src/scripts/check-wecom-approval-poc.js` 和 `npm run check:wecom-approval-poc`,固定 `WECOM_AGENT_SECRET` 读取 `gettemplatedetail`/`getapprovaldetail`;缺模板 ID 或低风险 `sp_no` 时报告 `PARTIAL_APPROVAL_POC_NEEDS_CONFIG`,不放行深度镜像。 -- WPROC1 是 WAPC2 后的企微路线与开发流程工程化修正合同:只更新合同和事实源,不写业务代码、不部署、不写 OA/企微数据;固定后续顺序为 `WAPC2F -> WAPC2 自动复跑 -> WCBK1 -> WACP3 -> WADM1 -> wecom_attendance_approval_mirror_v1`,并修正 WAPC2F 默认非自审链为 `SMOKE002 -> SMOKE101`。 +- WPROC1 是 WAPC2 后的企微路线与开发流程工程化修正合同:只更新合同和事实源,不写业务代码、不部署、不写 OA/企微数据;固定后续顺序为 `WAPC2F -> WAPC2FLIVE live 创建与 WAPC2 自动复跑 -> WCBK1 -> WACP3 -> WADM1 -> wecom_attendance_approval_mirror_v1`,并修正 WAPC2F 默认非自审链为 `SMOKE002 -> SMOKE101`。 - WPROC2 是 WPROC1 后的开发流程自动化门禁合同:新增 `scripts/qa/check-process-contract.mjs` process gate,并接入 `scripts/check-minimal.sh`;WAPC2F 实施前必须先通过 baseline gate 和 `wecom-approval-fixture` profile。本轮不部署、不写 OA/企微数据、不实现 WAPC2F 业务 runner。 -- WAPC2F 是 WPROC2 后的企微审批 POC 样件自动生成 dry-run 合同:新增 `server/src/scripts/check-wecom-approval-fixtures.js` 和 `npm run check:wecom-approval-fixtures`,公网报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`;未设置 `WECOM_APPROVAL_FIXTURE_WRITE=1`,未真实创建企微模板或审批单,live 写入需另行批准。 +- WAPC2F 是 WPROC2 后的企微审批 POC 样件自动生成 dry-run 合同:新增 `server/src/scripts/check-wecom-approval-fixtures.js` 和 `npm run check:wecom-approval-fixtures`,公网报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`。 +- WAPC2FLIVE 是 WAPC2F 后的企微审批 OA-POC 样件 live 创建合同:用户批准后执行 live 窗口,修正 `create_template` payload 为官方 `template_name` + `property` controls 结构;远端报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`,请假/补卡测试模板和低风险测试审批单已创建并保留审计,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`;不代表真实回调、补偿拉取、镜像模型或深度镜像已完成。 ## 当前活跃治理流 @@ -134,7 +135,8 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M | `WAPC2` | `issues/2026-05-19_09-34-16-wecom-approval-template-spno-poc-v1.csv` | 已部署并公网只读复跑:企微审批模板与低风险 `sp_no` 只读 POC | 新增 QA-only runner、只读集成服务和 focused 单测;范围请假+补卡;固定 `WECOM_AGENT_SECRET` 调用 `gettemplatedetail` / `getapprovaldetail`;远端报告 `/app/artifacts/qa-flow/wecom-approval-poc-20260519T020429Z/summary.json` 为 `PARTIAL_APPROVAL_POC_NEEDS_CONFIG` | 不新增公开 API/schema/UI;不接真实回调;不调用企微写接口;不写 OA/企微数据;不进入深度镜像 | | `WPROC1` | `issues/2026-05-19_10-43-50-wecom-process-route-engineering-v1.csv` | 当前路线与流程治理:企微工程化门禁修正 | 固化三层门禁、Definition of Ready、Definition of Done、自动化优先、非自审和高风险能力先 POC;修正 WAPC2F 默认链为 `SMOKE002 -> SMOKE101` | docs-only/contract-only;不改业务代码、不部署、不写 OA/企微数据;WAPC2 后仍需 WAPC2F、WCBK1、WACP3、WADM1 后才能进入深度镜像 | | `WPROC2` | `issues/2026-05-19_11-15-10-process-gate-automation-v1.csv` | 当前流程自动化门禁:process gate 框架 | 新增 `check-process-contract` QA-only CLI、WAPC2F profile、最小门禁接入和事实源回写;WAPC2F 实施前先跑 baseline gate | 不部署、不改业务 API/schema/UI、不写 OA/企微数据、不实现 WAPC2F runner | -| `WAPC2F` | `issues/2026-05-19_10-24-43-wecom-approval-fixture-auto-generate-v1.csv` | 当前审批样件 dry-run:企微审批 POC 样件自动生成 runner 已部署并公网 dry-run 通过 | 新增 `check:wecom-approval-fixtures`,固定 `WECOM_AGENT_SECRET`,默认 dry-run 构建 OA-POC 请假/补卡模板和审批申请 payload;`SMOKE002 -> SMOKE101` 非自审预检通过;远端报告 `PASS_FIXTURE_DRY_RUN_READY` | 不新增公开 API/schema/UI;不真实创建模板或审批单;不接回调;不进入深度镜像;live 写入需另行批准 | +| `WAPC2F` | `issues/2026-05-19_10-24-43-wecom-approval-fixture-auto-generate-v1.csv` | 已完成:企微审批 POC 样件自动生成 runner 已部署并公网 dry-run 通过 | 新增 `check:wecom-approval-fixtures`,固定 `WECOM_AGENT_SECRET`,默认 dry-run 构建 OA-POC 请假/补卡模板和审批申请 payload;`SMOKE002 -> SMOKE101` 非自审预检通过;远端报告 `PASS_FIXTURE_DRY_RUN_READY` | 不新增公开 API/schema/UI;dry-run 不真实创建模板或审批单;不接回调;不进入深度镜像 | +| `WAPC2FLIVE` | `issues/2026-05-19_13-24-12-wecom-approval-fixture-live-create-v1.csv` | 当前审批样件 live:OA-POC 请假/补卡测试模板和测试审批单已创建 | 修正 `create_template` payload 后,远端报告 `PASS_FIXTURE_CREATED`,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`;测试模板和审批记录保留审计,只记录脱敏 template_id / `sp_no` 前缀 | 不改公开 API/schema/UI;不接真实回调;不做补偿拉取;不建镜像表;不进入深度镜像 | 旧 Issue CSV 不删除、不批量回写、不移动到归档目录。若新治理流替代旧合同,只在新 CSV 的 `Notes` 或本索引说明 supersedes,旧文件保留历史审计语义。 @@ -154,17 +156,17 @@ R6 -> PC6 -> PA6 -> FL6 -> AP6 -> RI6 -> LP6 -> ME6/QG6 -> DG7/MRF7 -> MIA7 -> M | 文档 | 用途 | | --- | --- | -| [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md) | PRD 主事实源;WAPC1/WAPC2/WPROC1/WPROC2 后包含企微审批配置、只读 POC、工程化前置和 process gate 口径 | +| [海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md) | PRD 主事实源;WAPC2FLIVE 后包含企微审批配置、只读 POC、工程化前置、process gate、请假/补卡样例和深度镜像前置口径 | | [文档事实源状态矩阵](./文档事实源状态矩阵.md) | 文档分类、删除恢复和冲突规则 | | [产品设计规则](./产品设计规则.md) | PC、移动、企业微信 WebView 设计事实源;DG8 后飞书工作台/飞书审批为唯一主 UI/布局参考;DG9 后按页面分层和样板选型 | -| [企微优先开发路线图](./企微优先开发路线图.md) | WDRG/WCP1/WCPC/WHMS/WHMSLIVE/WOUA/WAPI/WRRA/WOUA-FIX/WRV1/WRA1/WMSG1/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F 后企微优先 HR/考勤改造的阶段顺序、准入/退出门禁、并行规则、禁止跳阶段、API/Secret 口径、运行优先、消息实发、审批配置、只读 POC、process gate、dry-run 自动样件、回调、补偿拉取和模型设计事实源 | -| [企微 API 能力目录](./企微API能力目录.md) | WAPI/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F 后企微官方 API、Secret 矩阵、权限/可信 IP/回调模板、读写边界、运行优先、审批配置、只读 POC、WAPC2F dry-run 和 live 写入边界、WCBK1/WACP3/WADM1 决策事实源 | -| [产品口径](./产品口径.md) | 已拍板产品边界和业务规则;WAPC1/WAPC2/WPROC1/WPROC2 后包含审批配置、只读 POC、工程化前置阶段顺序和 process gate | +| [企微优先开发路线图](./企微优先开发路线图.md) | WDRG/WCP1/WCPC/WHMS/WHMSLIVE/WOUA/WAPI/WRRA/WOUA-FIX/WRV1/WRA1/WMSG1/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F/WAPC2FLIVE 后企微优先 HR/考勤改造的阶段顺序、准入/退出门禁、并行规则、禁止跳阶段、API/Secret 口径、运行优先、消息实发、审批配置、只读 POC、process gate、自动样件 live 证据、回调、补偿拉取和模型设计事实源 | +| [企微 API 能力目录](./企微API能力目录.md) | WAPI/WAPC1/WAPC2/WPROC1/WPROC2/WAPC2F/WAPC2FLIVE 后企微官方 API、Secret 矩阵、权限/可信 IP/回调模板、读写边界、运行优先、审批配置、只读 POC、WAPC2F dry-run、WAPC2FLIVE live 创建和 WCBK1/WACP3/WADM1 决策事实源 | +| [产品口径](./产品口径.md) | 已拍板产品边界和业务规则;WAPC2FLIVE 后包含审批配置、只读 POC、工程化前置阶段顺序、process gate 和请假/补卡样例口径 | | [需求 - 统一审批中心规约](./需求-统一审批中心规约.md) | OA 主办审批、企微主办 HR/考勤员工日常审批镜像、催办、超时提醒、审批效率 | | [报销发票附件规则](./报销发票附件规则.md) | 报销、发票、OCR、附件细则 | | [需求 - 报销发票 OCR 规约](./需求-报销发票OCR规约.md) | 报销发票 OCR 模块规约 | | [需求 - 企业微信基础设施规约](./需求-企业微信基础设施规约.md) | 企业微信入口、身份、消息、deeplink、HR/考勤员工日常审批、打卡、人事助手、按域镜像、OA 接管和恢复回写 | -| [需求 - 请假考勤修正规约](./需求-请假考勤修正规约.md) | 企微请假/补卡/外出/加班、WAPC1 审批配置准备、WAPC2 请假/补卡只读 POC、WPROC1/WPROC2 后续门禁、考勤镜像、OA 应急接管和恢复回写 | +| [需求 - 请假考勤修正规约](./需求-请假考勤修正规约.md) | 企微请假/补卡/外出/加班、WAPC1 审批配置准备、WAPC2 请假/补卡只读 POC、WAPC2FLIVE 请假/补卡样例、WPROC1/WPROC2 后续门禁、考勤镜像、OA 应急接管和恢复回写 | | [需求 - 采购费用审批规约](./需求-采购费用审批规约.md) | 采购、费用、附件、审批规则 | | [需求 - 合同附件归档规约](./需求-合同附件归档规约.md) | 合同台账和附件归档边界 | | [需求 - 项目轻管理规约](./需求-项目轻管理规约.md) | 项目轻管理边界 | diff --git a/docs/测试规约与回归门禁.md b/docs/测试规约与回归门禁.md index cd1c620e..429d07c4 100644 --- a/docs/测试规约与回归门禁.md +++ b/docs/测试规约与回归门禁.md @@ -70,7 +70,7 @@ Definition of Done: - 人工只保留批准、密钥/回调配置、企微后台不可 API 化配置、真机确认和风险拍板。 - 若面向公网或企微可测,必须有 `/ready`、runtime smoke、public bundle scan 或对应 live runner 证据。 -高风险企微能力的 POC 顺序固定为:WAPC2F 自动样件 -> WAPC2 自动复跑 -> WCBK1 回调只读 POC -> WACP3 补偿拉取 POC -> WADM1 镜像数据模型设计 -> `wecom_attendance_approval_mirror_v1`。真实回调必须先证明验签、解密、幂等和重复投递;补偿拉取必须先证明按时间窗口拿到审批单号并可拉详情;镜像实现前必须先有字段、状态机、幂等键、索引和隐私保留边界设计。 +高风险企微能力的 POC 顺序固定为:WAPC2F 自动样件 -> WAPC2FLIVE live 创建与 WAPC2 自动复跑 -> WCBK1 回调只读 POC -> WACP3 补偿拉取 POC -> WADM1 镜像数据模型设计 -> `wecom_attendance_approval_mirror_v1`。当前 WAPC2FLIVE 已完成,后续不得跳过回调、补偿和模型门禁。真实回调必须先证明验签、解密、幂等和重复投递;补偿拉取必须先证明按时间窗口拿到审批单号并可拉详情;镜像实现前必须先有字段、状态机、幂等键、索引和隐私保留边界设计。 ## 4. MVP 首轮测试矩阵 diff --git a/docs/海音达OA-MVP需求规格说明书.md b/docs/海音达OA-MVP需求规格说明书.md index 7ad1853a..eae50bd0 100644 --- a/docs/海音达OA-MVP需求规格说明书.md +++ b/docs/海音达OA-MVP需求规格说明书.md @@ -106,7 +106,7 @@ WCP1 已按“Live 只读 + 测试员工优先”完成企业微信能力 POC。 | 通讯录 | `CAN_REUSE_NOW` | HCLT 已证明 `HRWDTEST-20260517214548` create/update/disable 成功,部门读取可用;WCPC 对既有在职测试号的成员读取已通过。 | | 人事助手 | `CAN_REUSE_NOW_FOR_READ` | 字段配置读取可用;WCPC 对既有在职测试号的花名册读取已通过;资料更新属于写接口,需后续单独批准 POC。 | | 打卡 | `CAN_REUSE_NOW_FOR_READ` | WCPC 短窗口打卡记录和规则读取已通过;日报、月报、排班等细分能力留到考勤镜像合同继续验证。 | -| 审批与假期余额 | `PARTIAL_NEEDS_CONFIG` | 假期余额读取已通过;审批模板 ID、测试审批单号、真实回调、补偿拉取和镜像数据模型仍需后续考勤/审批镜像前补齐。 | +| 审批与假期余额 | `PARTIAL_NEEDS_CONFIG` | 假期余额读取已通过;WAPC2FLIVE 已生成请假/补卡 OA-POC 模板和低风险测试审批单并复跑只读 POC 通过;真实回调、补偿拉取、镜像数据模型、外出/加班样例或处理决策仍需后续考勤/审批镜像前补齐。 | | OA 主办高敏审批 | `KEEP_OA_PRIMARY` | 报销、采购、合同、项目、付款、AP 和代账继续 OA 主办,企微只做脱敏消息和 OA deeplink。 | WCP1 历史结论为 `PAUSE_FOR_CONFIG`,不是 `GO_TO_HR_MASTER_SYNC`;该阻断已由 WCPC 复跑收口。WCP1 报告继续作为初始配置缺口证据保留,当前 HR 主数据镜像准入以 WCPC 结论为准。 diff --git a/docs/管理员手册.md b/docs/管理员手册.md index d4518b63..5b17b694 100644 --- a/docs/管理员手册.md +++ b/docs/管理员手册.md @@ -1,6 +1,6 @@ # hyb-oa 管理员手册(10 人以下团队版) -**当前状态(2026-05-19 / WAPC2F)**:R7E、PRELAUNCH、CASHIER-VOUCHER-V1、LAUNCH-DEPLOY-FINANCE、FIN-PROD-ENABLE、ACCOUNTING-HANDOFF-V1、ATTV1、HR-WECOM-DIRECTORY-V1、HRWD-CONTACT-LIVE-TEST、DBWFOC、WFDG、WDRG、WCPC、WHMSLIVE、WAPI、WRRA、WOUA-FIX、WRV1、WRA1、WMSG1、WAPC1、WAPC2、WPROC1、WPROC2 和 WAPC2F dry-run 均已收口;SYSTEM-COMPLETE-GATE 结论为 `GO_TO_USE`。WCP1 历史结论为 `PAUSE_FOR_CONFIG`,WCPC 已使用既有在职低风险测试号 `SMOKE002/测试员工`(报告只记录 `oa_smoke***`)复跑通过,结论为 `GO_TO_HR_MASTER_SYNC`。WHMS 已实现并部署验证 `wecom_hr_master_sync_v1`:企微/人事助手 HR 主数据可 dry-run/apply 到 OA 员工镜像、账号、角色、绑定和审计;默认和最终均为 `force_off`,公网 `SMOKE002` 因企微侧缺手机号、邮箱和部门按 `missing_required_field` 跳过,未对真实员工执行生产批量 apply。WAPI 后固定企微 API 能力目录和 Secret 矩阵:通讯录使用 `WECOM_CONTACT_SECRET`,人事助手/打卡/消息/OAuth/审批读取使用 `WECOM_AGENT_SECRET`,运行时代码不得靠多个 Secret 试错;WOUA-FIX 已按用户确认软归档 7 个缺企微测试账号,复检 OA active 5、企微 active 5、匹配 5、OA active 缺企微 0,剩余 5 个企微缺字段先接受不补,1 个归档绑定保留审计。WRV1 新增并部署 `npm run check:wecom-runtime-ready` 运行优先门禁;WRA1 已修正 QA-only 打卡只读门禁并公网复跑,报告 `/app/artifacts/qa-flow/wecom-runtime-ready-20260518T180506Z/summary.json` 为 `PASS_WITH_CONFIG_GAPS`;WMSG1 已完成真实企业微信应用消息和 Deeplink 真机确认;WAPC1 已固化审批配置准备清单;WAPC2 已新增请假/补卡模板详情和低风险 `sp_no` 只读 POC runner;WPROC2 已新增 process gate;WAPC2F 已新增审批样件 runner 并公网 dry-run 通过,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`,但未真实创建企微模板或审批单。WPROC1 明确 WAPC2 后必须先做 WAPC2F 自动样件、WAPC2 自动复跑、WCBK1 回调只读 POC、WACP3 补偿拉取 POC 和 WADM1 镜像数据模型设计,不能直接进入 `wecom_attendance_approval_mirror_v1`。采购、费用、合同、项目、报销、付款、AP、代账交接和高敏附件继续 OA 主办,企业微信只做脱敏提醒和 OA deeplink。公网 `payment_batch_v1=force_on`,`erp_sync=force_off`。公司当前无 ERP/独立财务系统,且 ERP 未来不接入 OA;财务闭环以 OA 内审批、台账、付款批次、银行对公付款回单和月度代账交接为准。 +**当前状态(2026-05-19 / WAPC2FLIVE)**:R7E、PRELAUNCH、财务闭环、ATTV1、HR-WECOM-DIRECTORY-V1、WAPI、WOUA-FIX、WRV1/WRA1、WMSG1、WAPC1/WAPC2、WPROC1/WPROC2、WAPC2F dry-run 和 WAPC2FLIVE 均已收口;SYSTEM-COMPLETE-GATE 结论为 `GO_TO_USE`。WAPI 后固定企微 API 能力目录和 Secret 矩阵:通讯录使用 `WECOM_CONTACT_SECRET`,人事助手/打卡/消息/OAuth/审批读取使用 `WECOM_AGENT_SECRET`,运行时代码不得靠多个 Secret 试错。WAPC2FLIVE 已创建 OA-POC 请假/补卡测试模板和低风险测试审批单,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`;测试模板和审批记录保留审计,不自动删除。WPROC1 明确下一步仍需 WCBK1 回调只读 POC、WACP3 补偿拉取 POC 和 WADM1 镜像数据模型设计,不能直接进入 `wecom_attendance_approval_mirror_v1`。采购、费用、合同、项目、报销、付款、AP、代账交接和高敏附件继续 OA 主办,企业微信只做脱敏提醒和 OA deeplink。公网 `payment_batch_v1=force_on`,`erp_sync=force_off`。公司当前无 ERP/独立财务系统,且 ERP 未来不接入 OA;财务闭环以 OA 内审批、台账、付款批次、银行对公付款回单和月度代账交接为准。 ## 1. 适用范围 - 适用于 `small_team_internal` 工作区模式。 @@ -198,7 +198,7 @@ WCP1/WCPC/WHMS 后续推进: 2. WCP1 历史结论为 `PAUSE_FOR_CONFIG`;WCPC 已用既有在职测试号完成远端只读复跑,报告 `/tmp/wecom-capability-poc-wcpc-smoke002/summary.json`,结论 `GO_TO_HR_MASTER_SYNC`。 3. WCPC 已证明 HR 主数据镜像准入项可用:通讯录成员读取、人事助手花名册读取、打卡短窗口记录/规则读取和假期余额读取均达到可复用状态;审批模板、审批实例和回调配置仍是后续考勤/审批镜像前置项。 4. WHMS 已实现并部署验证 `wecom_hr_master_sync_v1`,包括同步批次、逐员工结果、dry-run/apply、People 管理入口和 QA-only runner;公网验证后最终保持 `force_off`。 -5. 正式开发仍按 `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2 自动复跑` -> `WCBK1 回调只读 POC` -> `WACP3 补偿拉取 POC` -> `WADM1 镜像数据模型设计` -> `wecom_attendance_approval_mirror_v1` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` -> `wecom_ruleops_v1` 分合同实施;WOUA-FIX 已收口测试账号差异和处理决策,WRV1/WRA1/WMSG1 已验证运行入口、OAuth/绑定、脱敏消息、Deeplink、通讯录、人事助手和打卡读取主链路。审批模板 ID、测试 `sp_no`、真实回调配置、验签/解密/幂等、补偿拉取和镜像数据模型未明确前,不得进入深度考勤/审批镜像。 +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` -> `WACP3 补偿拉取 POC` -> `WADM1 镜像数据模型设计` -> `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 已生成请假/补卡低风险样例;真实回调配置、验签/解密/幂等、补偿拉取和镜像数据模型未明确前,不得进入深度考勤/审批镜像。 6. 任何生产写接口、企微规则写入、应急模式开启或恢复回写都必须有单独批准、dry-run 或可审计记录。 WCPC 配置复跑清单: @@ -241,7 +241,7 @@ WAPC2 请假/补卡只读 POC 操作口径: 1. 优先用 WAPC2F runner 自动生成 OA-POC 请假/补卡测试模板和低风险测试审批单;当前 dry-run 已通过,真实创建模板/审批单前仍需管理员批准单次 live 写入。 2. WAPC2F 默认申请人为 `SMOKE002`,审批人为 `SMOKE101`;两者必须 active、已绑定企微、可见、不是同一 OA 员工、不是同一企微 userid。`SMOKE101` 不可用时不自动换人,先问答确认。 -3. WAPC2F live 写入只能在单次命令同时包含 `--live --create-templates --submit-test-approvals` 且设置 `WECOM_APPROVAL_FIXTURE_WRITE=1` 时执行;默认 dry-run 不获取写入 token、不在企微后台留下 OA-POC 记录。 +3. WAPC2F live 写入只能在单次命令同时包含 `--live --create-templates --submit-test-approvals` 且设置 `WECOM_APPROVAL_FIXTURE_WRITE=1` 时执行;默认 dry-run 不获取写入 token、不在企微后台留下 OA-POC 记录。WAPC2FLIVE 已执行一次批准的 live 创建,后续不得重复创建样件,除非另建 Issue CSV 并再次批准。 4. 测试单 `sp_no` 不得包含采购、合同、报销、发票、银行回单、高敏附件或真实敏感业务资料。 5. QA 在服务器容器内执行 `npm run check:wecom-approval-poc -- --live --format=json`,并通过 CLI 或临时 env 传入请假/补卡模板 ID 和 `sp_no`。 6. 报告结论 `PASS_APPROVAL_POC` 只代表模板详情和审批详情只读链路可用;`PARTIAL_APPROVAL_POC_NEEDS_CONFIG` 代表缺模板 ID 或 `sp_no`;`SKIP/BLOCKED_BY_EXTERNAL_CONFIG` 代表 Secret、权限、可信 IP、可见范围或企微 API 阻断。 @@ -421,7 +421,7 @@ WAPC2 请假/补卡只读 POC 操作口径: - `WECOM_ALLOWED_RETURN_HOSTS=oa.hyinda.com` 5. 先让管理员用账号密码登录,在 `个人设置` 完成一次绑定,再测试企业微信工作台直达;已绑定用户从手机企业微信进入时应直接看到移动工作台。 6. 若启用 OA 同步企业微信打卡数据,在企业微信打卡 API「可调用接口的应用」中授权 `海音达工作台`。OA 默认可复用 `WECOM_AGENT_SECRET`;只有单独创建考勤同步应用时才额外配置 `WECOM_CHECKIN_SECRET`。 -7. HR/考勤员工日常审批后续配置企业微信原生审批模板作为主流程;按 WAPC1 先准备请假、补卡、外出、加班模板 ID、低风险测试 `sp_no` 和回调配置,WAPC2 先只读验证请假/补卡模板详情和审批详情,再按 WPROC1 顺序做 WAPC2F 自动样件、WAPC2 自动复跑、WCBK1 回调 POC、WACP3 补偿拉取 POC 和 WADM1 镜像数据模型。报销、财务、采购、合同和项目类 OA 主办审批仍使用企业微信消息提醒并回到 OA 页面完成。 +7. HR/考勤员工日常审批后续配置企业微信原生审批模板作为主流程;WAPC2FLIVE 已自动生成请假/补卡 OA-POC 低风险样件并复跑只读 POC,通过后仍需按 WPROC1 顺序做 WCBK1 回调 POC、WACP3 补偿拉取 POC 和 WADM1 镜像数据模型。外出/加班模板仍需后续单独配置或 POC。报销、财务、采购、合同和项目类 OA 主办审批仍使用企业微信消息提醒并回到 OA 页面完成。 ### 员工会看到的典型状态 - 未绑定:登录页会提示“当前企业微信账号尚未绑定”,回退到账号密码登录。 diff --git a/docs/需求-企业微信基础设施规约.md b/docs/需求-企业微信基础设施规约.md index c27fd798..2e75e6a4 100644 --- a/docs/需求-企业微信基础设施规约.md +++ b/docs/需求-企业微信基础设施规约.md @@ -6,7 +6,7 @@ **上级事实源**:[海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md) **相关事实源**:[需求 - 统一审批中心规约](./需求-统一审批中心规约.md)、[企微 API 能力目录](./企微API能力目录.md) -本规约细化企业微信在 `hyb-oa` 中的基础设施边界、入口、免登/绑定、通讯录身份、消息通知、deeplink、打卡、人事助手、原生审批、OA 镜像、人工接管和恢复回写要求。WFOC 起产品方向调整为“企微优先 + OA 无痛接管”;DBWFOC 后进一步固定为:HR/考勤员工日常审批优先使用企业微信,OA 做按域镜像、备份接管、财务闭环和审计中台;采购、合同、项目、财务和高敏附件继续由 OA 主办。WAPI 后,所有企微相关开发必须先读取本规约和 [企微 API 能力目录](./企微API能力目录.md),确认官方 API、Secret、权限、可信 IP、回调/模板和读写边界,再拆 Issue CSV。WMSG1 已证明企业微信应用消息和 Deeplink 真机回流可用;WAPC1 后审批进入配置准备清单,WAPC2 后先做请假/补卡模板详情与低风险 `sp_no` 只读 POC;WAPC2F 已实现 OA-POC 样件 dry-run 并公网验证 `PASS_FIXTURE_DRY_RUN_READY`,但未真实创建模板或审批单。WPROC1 后仍必须先做 live 样件批准、WAPC2 自动复跑、回调、补偿拉取和镜像数据模型门禁,不是直接进入审批镜像实现。 +本规约细化企业微信在 `hyb-oa` 中的基础设施边界、入口、免登/绑定、通讯录身份、消息通知、deeplink、打卡、人事助手、原生审批、OA 镜像、人工接管和恢复回写要求。WFOC 起产品方向调整为“企微优先 + OA 无痛接管”;DBWFOC 后进一步固定为:HR/考勤员工日常审批优先使用企业微信,OA 做按域镜像、备份接管、财务闭环和审计中台;采购、合同、项目、财务和高敏附件继续由 OA 主办。WAPI 后,所有企微相关开发必须先读取本规约和 [企微 API 能力目录](./企微API能力目录.md),确认官方 API、Secret、权限、可信 IP、回调/模板和读写边界,再拆 Issue CSV。WMSG1 已证明企业微信应用消息和 Deeplink 真机回流可用;WAPC1 后审批进入配置准备清单,WAPC2 后先做请假/补卡模板详情与低风险 `sp_no` 只读 POC;WAPC2F 已实现 OA-POC 样件 dry-run 并公网验证 `PASS_FIXTURE_DRY_RUN_READY`。WAPC2FLIVE 已在用户批准后创建 OA-POC 请假/补卡测试模板和低风险测试审批单,自动复跑 WAPC2 为 `PASS_APPROVAL_POC`。WPROC1 后仍必须先做回调、补偿拉取和镜像数据模型门禁,不是直接进入审批镜像实现。 --- @@ -246,7 +246,7 @@ WCP1 当前分类: | 人事助手测试员工花名册读取 | `NEEDS_CONFIG` | `hr.staff_read` 返回 `wecom_errcode_60021`,需将测试成员纳入应用/人事助手权限范围,或改用在职测试员工复跑。 | | 人事助手资料更新 | `NEEDS_API_POC` | 属生产写接口,本轮只分类,不调用。 | | 打卡记录和规则读取 | `NEEDS_CONFIG` | 远端 `WECOM_CHECKIN_SYNC_ENABLED` 未开启,短窗口打卡和规则读取按配置阻断记录。 | -| 审批模板、审批详情、假期余额 | `NEEDS_CONFIG` | 缺审批模板 ID、测试审批单号,假期余额返回 `wecom_errcode_301062`。 | +| 审批模板、审批详情、假期余额 | `PARTIAL_NEEDS_CONFIG` | WAPC2FLIVE 已生成请假/补卡 OA-POC 模板和低风险测试审批单并复跑通过;外出/加班样例、真实回调、补偿拉取和镜像数据模型仍需后续合同。 | | 回调配置 | `NEEDS_CONFIG` | 回调 URL、Token、AESKey 未作为可读配置注入,本轮不能证明回调链路。 | | 采购/合同/报销/财务审批 | `KEEP_OA_PRIMARY` | 继续 OA 主办,企业微信只做脱敏消息和 OA deeplink。 | diff --git a/docs/需求-统一审批中心规约.md b/docs/需求-统一审批中心规约.md index 98c4ec10..d92b8b24 100644 --- a/docs/需求-统一审批中心规约.md +++ b/docs/需求-统一审批中心规约.md @@ -5,7 +5,7 @@ **状态**:模块级开发规约 **上级事实源**:[海音达OA-MVP需求规格说明书](./海音达OA-MVP需求规格说明书.md) -本规约细化 `hyb-oa` 审批中心和企业微信原生审批镜像的产品边界、角色权限、状态模型、异常规则、留痕要求和验收场景。WFOC 起,审批按主办方分层;DBWFOC 后边界进一步收窄:报销、财务、采购、合同和项目类审批继续由 OA 主办;请假、补卡、外出、加班等 HR/考勤员工日常审批优先由企业微信主办,OA 同步按域镜像并保留人工接管和恢复回写能力。WMSG1 已验证企业微信应用消息和 Deeplink 回流,WAPC1 后审批镜像前置工作进入配置准备清单阶段,WAPC2 已提供请假/补卡只读 POC runner。WPROC1 后,WAPC2 不能直接放行镜像实现,必须先完成 WAPC2F、WCBK1、WACP3 和 WADM1 门禁。后续审批相关开发必须先从本规约拆分 Issue CSV,再进入技术方案和代码实现。 +本规约细化 `hyb-oa` 审批中心和企业微信原生审批镜像的产品边界、角色权限、状态模型、异常规则、留痕要求和验收场景。WFOC 起,审批按主办方分层;DBWFOC 后边界进一步收窄:报销、财务、采购、合同和项目类审批继续由 OA 主办;请假、补卡、外出、加班等 HR/考勤员工日常审批优先由企业微信主办,OA 同步按域镜像并保留人工接管和恢复回写能力。WMSG1 已验证企业微信应用消息和 Deeplink 回流,WAPC1 后审批镜像前置工作进入配置准备清单阶段,WAPC2 已提供请假/补卡只读 POC runner,WAPC2FLIVE 已自动生成请假/补卡 OA-POC 样件并复跑通过。后续仍必须先完成 WCBK1、WACP3 和 WADM1 门禁,不能直接放行镜像实现。后续审批相关开发必须先从本规约拆分 Issue CSV,再进入技术方案和代码实现。 --- @@ -354,7 +354,7 @@ WF8-3、WF8-4、WF8-5 实现前必须基于本设计给技术方案;实现后 - 采购单附件、合同正文、报价、供应商资料、发票、银行回单、代账资料和其他高敏附件不进入企业微信原生审批或企业微信附件;企业微信只做提醒、deeplink 和免登录回流。 - 按域镜像是默认规则:企微主办 HR/考勤域镜像到 OA;OA 主办采购、合同、项目、财务和报销域不反向全量镜像到企微。 - WFDG 后,审批相关页面和接口必须区分 `OA 主办`、`企微镜像` 和 `OA 应急接管`;企微镜像不得被误用为 OA 日常新建入口,OA 应急接管单据必须带 `EMERGENCY` 并进入恢复回写队列。 -- WAPI/WRRA/WOUA-FIX/WAPC1/WAPC2/WPROC1 后,审批相关运行时迁移必须先读 [企微优先开发路线图](./企微优先开发路线图.md) 和 [企微 API 能力目录](./企微API能力目录.md),按 `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2 自动复跑` -> `WCBK1 回调只读 POC` -> `WACP3 补偿拉取 POC` -> `WADM1 镜像数据模型设计` -> `wecom_attendance_approval_mirror_v1` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` 的顺序拆单功能 Issue CSV;WOUA-FIX 只收口了用户一致性测试账号差异和处理决策,WRV1/WRA1/WMSG1 只验证入口、OAuth/绑定、脱敏消息、deeplink、通讯录、人事助手、打卡只读主链路和真实消息回流。WAPC1 只固化审批配置准备清单;WAPC2 只读模板详情和低风险 `sp_no` 审批详情;WAPC2F 只能生成 OA-POC 低风险测试样件;真实回调配置、验签/解密/幂等、补偿拉取和镜像数据模型未明确前,不得直接开发企微审批镜像或恢复回写。 +- WAPI/WRRA/WOUA-FIX/WAPC1/WAPC2/WPROC1 后,审批相关运行时迁移必须先读 [企微优先开发路线图](./企微优先开发路线图.md) 和 [企微 API 能力目录](./企微API能力目录.md),按 `wecom_hr_master_sync_v1` -> `runtime_first_wecom_enablement` -> `WOUA-FIX / WECOM-RUNTIME-READY-V1` -> `WAPC1 审批配置准备` -> `WAPC2 请假/补卡只读 POC` -> `WAPC2F 自动生成 POC 样件` -> `WAPC2FLIVE live 创建与 WAPC2 自动复跑` -> `WCBK1 回调只读 POC` -> `WACP3 补偿拉取 POC` -> `WADM1 镜像数据模型设计` -> `wecom_attendance_approval_mirror_v1` -> `oa_hr_emergency_mode_v1` -> `wecom_recovery_writeback_v1` 的顺序拆单功能 Issue CSV;WOUA-FIX 只收口了用户一致性测试账号差异和处理决策,WRV1/WRA1/WMSG1 只验证入口、OAuth/绑定、脱敏消息、deeplink、通讯录、人事助手、打卡只读主链路和真实消息回流。WAPC1 只固化审批配置准备清单;WAPC2 只读模板详情和低风险 `sp_no` 审批详情;WAPC2FLIVE 只生成 OA-POC 低风险测试样件并自动复跑只读 POC;真实回调配置、验签/解密/幂等、补偿拉取和镜像数据模型未明确前,不得直接开发企微审批镜像或恢复回写。 - WRV1/WRA1 runner `npm run check:wecom-runtime-ready` 中的审批模板、测试 `sp_no` 和真实回调检查只允许输出 `NEEDS_CONFIG`;这类缺口不阻断运行优先主链路的 `PASS_WITH_CONFIG_GAPS`,但必须阻断 `wecom_attendance_approval_mirror_v1`、应急恢复回写和 RuleOps。`WECOM_CHECKIN_SYNC_ENABLED` 只控制正式考勤同步批次,不阻断 QA-only 打卡只读能力探测。 - WMSG1 已证明企业微信应用消息可达和 Deeplink 可进入 OA 通知页;该证据只清除通知链路,不清除审批模板、测试 `sp_no` 或真实回调前置。WAPC1 固化配置准备清单后,WAPC2 先提供请假/补卡模板详情和低风险审批详情只读 POC;WPROC1 后优先用 WAPC2F 自动生成 POC 样件,不默认要求人工手动创建模板或测试单。人工介入限于写入批准、密钥/回调配置、企微后台无法 API 化配置、真机确认和风险拍板。 - 后续企微审批同步的 POC 必须输出 `CAN_REUSE_NOW`、`NEEDS_CONFIG`、`NEEDS_API_POC`、`KEEP_OA_PRIMARY`、`NOT_SUPPORTED_BY_API`,缺模板、回调、Secret 或权限时记录 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`。 @@ -400,7 +400,7 @@ WAPC2 是 WAPC1 后的首个审批只读 POC,范围只包括请假和补卡, ### 9.3 WAPC2F 自动生成 POC 样件 -WAPC2F 是 WAPC2 后的自动化优先补缺阶段,目标是尽量用 QA-only runner 自动创建 OA-POC 请假/补卡测试模板和低风险测试审批单,再自动复跑 WAPC2。它不是正式模板配置、不是真实业务审批,也不是镜像实现。当前已新增 `npm run check:wecom-approval-fixtures` 并完成公网 dry-run,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`;本次未真实创建企微模板或审批单。 +WAPC2F 是 WAPC2 后的自动化优先补缺阶段,目标是尽量用 QA-only runner 自动创建 OA-POC 请假/补卡测试模板和低风险测试审批单,再自动复跑 WAPC2。它不是正式模板配置、不是真实业务审批,也不是镜像实现。当前已新增 `npm run check:wecom-approval-fixtures` 并完成公网 dry-run,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T045001Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`。WAPC2FLIVE 已在用户批准后修正 `create_template` payload,创建 OA-POC 请假/补卡测试模板和低风险测试审批单,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`,并自动复跑 WAPC2 得到 `PASS_APPROVAL_POC`;测试模板和审批记录保留审计,不自动删除。 - 默认申请人固定 `SMOKE002`,审批人固定 `SMOKE101`。 - 预检两者必须 active、已绑定企微、可见、不是同一 OA 员工、不是同一企微 userid。 diff --git a/docs/需求-请假考勤修正规约.md b/docs/需求-请假考勤修正规约.md index b74ad259..814359b3 100644 --- a/docs/需求-请假考勤修正规约.md +++ b/docs/需求-请假考勤修正规约.md @@ -228,7 +228,7 @@ WFOC 后,正常审批规则优先以企业微信审批模板和打卡/假期 - 后续 A0.8:`WAPC2 自动复跑`,用自动样件的脱敏模板 ID 和 `sp_no` 复跑只读 POC。 - 后续 A0.9:`WCBK1 回调只读 POC` 和 `WACP3 补偿拉取 POC`,证明真实回调验签/解密/幂等和按时间窗口拉审批单号/详情。 - 后续 A0.10:`WADM1 镜像数据模型设计`,先设计字段、状态机、幂等键、索引、隐私保留和迁移回滚。 -- 后续 A1:`wecom_attendance_approval_mirror_v1`,同步企微请假、补卡、外出、加班审批、附件、历史和状态回调;该命名承接旧口径 `wecom_native_approval_mirror_v1`。正式开发前必须补齐审批模板 ID、测试 `sp_no`、真实回调配置、回调验签/解密/幂等、补偿拉取、镜像数据模型和必要打卡细项 POC。 +- 后续 A1:`wecom_attendance_approval_mirror_v1`,同步企微请假、补卡、外出、加班审批、附件、历史和状态回调;该命名承接旧口径 `wecom_native_approval_mirror_v1`。WAPC2FLIVE 已生成请假/补卡 OA-POC 模板和低风险 `sp_no` 样例;正式开发前仍必须补齐外出/加班样例或处理决策、真实回调配置、回调验签/解密/幂等、补偿拉取、镜像数据模型和必要打卡细项 POC。 - 后续 A2:企微打卡规则、排班、记录、日报、月报按域镜像,覆盖 Secret/API 权限、短窗口同步、错误码和脱敏证据。 - 后续 A3:`oa_hr_emergency_mode_v1`,管理员人工接管、应急提交、应急审批和恢复队列。 - 后续 A4:`wecom_recovery_writeback_v1`,企微恢复后 dry-run、自动回写、失败重试和冲突清单。 diff --git a/issues/2026-05-19_13-24-12-wecom-approval-fixture-live-create-v1.csv b/issues/2026-05-19_13-24-12-wecom-approval-fixture-live-create-v1.csv new file mode 100644 index 00000000..9c2ab6bd --- /dev/null +++ b/issues/2026-05-19_13-24-12-wecom-approval-fixture-live-create-v1.csv @@ -0,0 +1,7 @@ +ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes +WAPC2FL-0,live 创建合同建档与边界冻结,"建立 WAPC2FLIVE 企微审批 OA-POC 样件 live 创建合同;承接 WAPC2F dry-run 已通过事实,本轮只允许单次 live 创建请假/补卡测试模板和低风险测试审批单,并自动复跑 WAPC2 只读 POC。","1) CSV 校验通过;2) 固定申请人 SMOKE002、审批人 SMOKE101;3) 固定 WECOM_AGENT_SECRET,不尝试其他 Secret,不靠运行时猜 Secret;4) live 命令必须同时带 --live --create-templates --submit-test-approvals 且单次进程设置 WECOM_APPROVAL_FIXTURE_WRITE=1;5) 禁止自审,必须明确不是同一 OA 员工且不是同一企微 userid;6) 报告不输出手机号、邮箱、完整 sp_no、完整 userid、token、secret、完整 template_id 或原始 payload;7) 测试模板和测试审批记录保留审计;8) 不改正式模板、不接真实回调、不进 wecom_attendance_approval_mirror_v1。","受影响流程:WAPC2F dry-run -> 单次 live 创建 OA-POC 样件 -> WAPC2 只读自动复跑;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-19_13-24-12-wecom-approval-fixture-live-create-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-19_13-24-12-wecom-approval-fixture-live-create-v1.csv --profile wecom-approval-fixture --json。",python3|node,DONE,DONE,DONE,issues/2026-05-19_13-24-12-wecom-approval-fixture-live-create-v1.csv,[],WAPC2F dry-run 已提交 5b47755;用户已批准 live 创建并选择保留审计;回滚/清理口径为保留 OA-POC 测试模板和审批记录作为审计证据,不自动删除。 +WAPC2FL-1,本地门禁与远端 dry-run 复核,"执行 live 前复核本地代码与流程门禁,并在远端容器先 dry-run,确保当前公网仍为 PASS_FIXTURE_DRY_RUN_READY。","1) WPROC2 baseline gate 通过;2) WAPC2FL profile gate 通过;3) node --check、prisma validate、focused vitest 通过;4) 远端 dry-run 仍为 PASS_FIXTURE_DRY_RUN_READY;5) 若 dry-run 为 PARTIAL 或 SKIP,停止 live 并记录真实原因。","受影响流程:live 写入准入前置;验证步骤:node scripts/qa/check-process-contract.mjs --baseline --json;cd server && node --check src/scripts/check-wecom-approval-fixtures.js;cd server && node --check src/services/integrations/wecomApproval.js;cd server && npm run prisma:validate;cd server && npx vitest run tests/unit/scripts/check-wecom-approval-fixtures.test.js tests/unit/scripts/check-wecom-approval-poc.test.js --reporter=verbose;远端 npm run check:wecom-approval-fixtures -- --format=json。",node|npm|vitest|ssh,DONE,DONE,DONE,server/src/scripts/check-wecom-approval-fixtures.js|server/src/services/integrations/wecomApproval.js,"[""WAPC2FL-0""]",本地门禁通过;已 SYNC_ENV=0 部署;远端 dry-run `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053335Z/summary.json` 为 `PASS_FIXTURE_DRY_RUN_READY`;清理/回滚口径:dry-run 不写企微数据,无需清理。 +WAPC2FL-2,单次 live 创建 OA-POC 样件,"在远端容器内仅单次进程设置 WECOM_APPROVAL_FIXTURE_WRITE=1,执行 check-wecom-approval-fixtures live 路径,创建 OA-POC 请假/补卡测试模板和低风险测试审批单。","1) 命令仅执行一次;2) live 写入状态为 PASS_FIXTURE_CREATED 或真实 BLOCKED/PARTIAL;3) 若企微返回权限、可信 IP、可见范围、模板能力或参数错误,记录 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;4) 不换 Secret、不换审批人、不修改正式模板;5) 报告只保留脱敏 template_id/sp_no 前缀。","受影响流程:企微审批测试模板创建和测试审批申请提交;验证步骤:远端 WECOM_APPROVAL_FIXTURE_WRITE=1 npm run check:wecom-approval-fixtures -- --format=json --live --create-templates --submit-test-approvals;核对 status、checks.liveWrite、createdTemplatePrefixes、submittedApprovalPrefixes、mainBlockers 和 privacy。",ssh|npm,DONE,DONE,DONE,external,"[""WAPC2FL-1""]",首次 live 写入 API 因旧 `create_template` payload 返回 `301086 zh_CN text empty`,未创建模板或审批单;修正为官方 `template_name` + `property` controls 结构并部署后执行有效 live,报告 `/app/artifacts/qa-flow/wecom-approval-fixtures-20260519T053400Z/summary.json` 为 `PASS_FIXTURE_CREATED`;企微后台留下 OA-POC 请假/补卡测试模板和测试审批记录,按用户选择保留审计,不自动删除。 +WAPC2FL-3,WAPC2 自动复跑核验,"live 样件生成后由 runner 自动传入生成的模板 ID 和 sp_no,复用 WAPC2 只读 POC 验证 gettemplatedetail/getapprovaldetail 链路。","1) checks.autoRerun.status=OK;2) auto rerun conclusion 为 PASS_APPROVAL_POC;3) 若只生成部分样件,记录 PARTIAL_APPROVAL_POC_NEEDS_CONFIG;4) 若企微只读 API 阻断,记录 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;5) 不输出完整模板 ID 或 sp_no。","受影响流程:OA-POC 样件创建 -> 模板详情读取 -> 审批详情读取 -> 只读证据闭环;验证步骤:检查 live 报告 checks.autoRerun.status、checks.autoRerun.conclusion、templateIdPrefixes、spNoPrefixes;必要时远端执行 npm run check:wecom-approval-poc -- --live --format=json 并仅传入脱敏外的内部生成参数。",ssh|npm,DONE,DONE,DONE,external,"[""WAPC2FL-2""]",live 报告 `checks.autoRerun.status=OK`、`conclusion=PASS_APPROVAL_POC`、targetCount=2;报告仅保存脱敏 template_id/sp_no 前缀,不把完整 ID 写入文档、Issue 或聊天;清理/回滚口径:只读复跑不写数据,已创建 OA-POC 样件保留审计。 +WAPC2FL-4,事实源回写与证据登记,"按 live 实际结果回写试运行报告、路线图、API 能力目录、文档索引、事实源矩阵和必要的项目 skill。","1) 文档记录 live 创建结果、报告路径和保留审计策略;2) 明确本轮只创建 OA-POC 测试样件,不代表真实回调、补偿拉取、镜像数据模型或深度镜像已完成;3) 不保存完整 template_id、sp_no、userid、token、secret、表单值、附件、评论或原始 payload。","受影响流程:WAPC2FLIVE 证据入库和后续路线判断;验证步骤: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 'WAPC2FLIVE|PASS_FIXTURE_CREATED|PASS_APPROVAL_POC|WECOM_APPROVAL_FIXTURE_WRITE|保留审计|WCBK1|wecom_attendance_approval_mirror_v1' docs .agents/skills/hyb-oa-delivery/SKILL.md。",node|python3|rg,DONE,DONE,DONE,docs/trialrun/人工试运行报告.md|docs/企微优先开发路线图.md|docs/企微API能力目录.md|docs/文档索引.md|docs/文档事实源状态矩阵.md|.agents/skills/hyb-oa-delivery/SKILL.md,"[""WAPC2FL-3""]",事实源已按 `PASS_FIXTURE_CREATED` 和 `PASS_APPROVAL_POC` 回写;`audit-docs` errors=0 warnings=1(既有未登记文件警告),skill 校验通过;文档明确本轮不代表真实回调、补偿拉取、镜像模型或深度镜像完成。 +WAPC2FL-5,状态回填、最终门禁与中文提交,"按实际结果回填 WAPC2FLIVE 状态,运行最终门禁并中文提交;最终用问答方式决定是否进入 WCBK1 回调只读 POC。","1) Issue 状态按实际通过项回填;2) git diff --check 通过;3) 必要本地/文档门禁通过;4) 中文提交为 WAPC2FLIVE 创建企微审批 POC 样件;5) 最终说明包含当前状态、改了什么、测试了什么、结果是什么、企微后台留下什么记录和下一步问答。","受影响流程:WAPC2FLIVE 交付闭环;验证步骤:git diff --check;bash scripts/check-minimal.sh;git status --short;git log --oneline -1;最终问答说明是否进入 WCBK1 回调只读 POC。",git|bash,DONE,DONE,DONE,issues/2026-05-19_13-24-12-wecom-approval-fixture-live-create-v1.csv|N/A,"[""WAPC2FL-4""]",最终门禁已通过:`git diff --check`、`bash scripts/check-minimal.sh`;提交后复核 git status/log。不直接进入 WCBK1、WACP3、WADM1 或 wecom_attendance_approval_mirror_v1;后续仍需单独合同和问答确认;live 后清理/回滚口径为保留 OA-POC 测试模板和测试审批记录作为审计,不自动删除。 diff --git a/server/src/scripts/check-wecom-approval-fixtures.js b/server/src/scripts/check-wecom-approval-fixtures.js index 89a3f329..65913646 100644 --- a/server/src/scripts/check-wecom-approval-fixtures.js +++ b/server/src/scripts/check-wecom-approval-fixtures.js @@ -143,31 +143,47 @@ function fixtureNumber(targetKey, generatedAt) { return `WAPC2F-${targetKey}-${generatedAt.slice(0, 10).replace(/-/g, "")}`; } +function fixtureControlIds() { + return { + type: "Text-01", + date: "Date-01", + reason: "Textarea-01", + }; +} + +function buildTemplateControl(control, id, title, options = {}) { + return { + property: { + control, + id, + title: localized(title), + placeholder: localized(options.placeholder || title), + require: options.require ? 1 : 0, + un_print: 1, + }, + config: options.config || {}, + }; +} + +function dayTimestamp(generatedAt) { + const date = new Date(`${generatedAt.slice(0, 10)}T00:00:00.000Z`); + return String(Math.floor(date.getTime() / 1000)); +} + function buildTemplateFixturePayload(target, generatedAt) { const label = targetLabel(target.key); const number = fixtureNumber(target.key, generatedAt); + const controlIds = fixtureControlIds(); return { - template_names: localized(`OA-POC-${label}-${generatedAt.slice(0, 10)}`), + template_name: localized(`OA-POC-${label}-${generatedAt.slice(0, 10)}`), template_content: { controls: [ - { - control: "Text", - id: "fixture_type", - title: localized("类型"), - require: 1, - }, - { - control: "Date", - id: "fixture_date", - title: localized("日期"), - require: 1, - }, - { - control: "Textarea", - id: "fixture_reason", - title: localized("说明"), - require: 0, - }, + buildTemplateControl("Text", controlIds.type, "类型", { require: true }), + buildTemplateControl("Date", controlIds.date, "日期", { + require: true, + config: { date: { type: "day" } }, + }), + buildTemplateControl("Textarea", controlIds.reason, "说明", { require: false }), ], }, fixture_marker: { @@ -182,39 +198,38 @@ function buildTemplateFixturePayload(target, generatedAt) { function buildApplyFixturePayload({ target, templateId, applicantUserId, approverUserId, generatedAt }) { const label = targetLabel(target.key); const number = fixtureNumber(target.key, generatedAt); + const controlIds = fixtureControlIds(); return { creator_userid: applicantUserId, template_id: templateId, use_template_approver: 0, approver: [ { - attr: 2, + attr: 1, userid: [approverUserId], }, ], notifyer: [ - { - userid: [approverUserId], - }, + approverUserId, ], notify_type: 1, apply_data: { contents: [ { control: "Text", - id: "fixture_type", + id: controlIds.type, title: localized("类型"), value: { text: label }, }, { control: "Date", - id: "fixture_date", + id: controlIds.date, title: localized("日期"), - value: { date: generatedAt.slice(0, 10) }, + value: { date: { type: "day", s_timestamp: dayTimestamp(generatedAt) } }, }, { control: "Textarea", - id: "fixture_reason", + id: controlIds.reason, title: localized("说明"), value: { text: `${number} low-risk dry-run fixture` }, }, @@ -234,7 +249,7 @@ function summarizeFixturePayload(payload, kind) { : payload?.apply_data?.contents || []; const controlTypes = {}; for (const control of controls) { - const key = toSafeString(control?.control || "unknown", 80) || "unknown"; + const key = toSafeString(control?.control || control?.property?.control || "unknown", 80) || "unknown"; controlTypes[key] = (controlTypes[key] || 0) + 1; } return { diff --git a/server/tests/unit/scripts/check-wecom-approval-fixtures.test.js b/server/tests/unit/scripts/check-wecom-approval-fixtures.test.js index 46e9ef79..b40a6322 100644 --- a/server/tests/unit/scripts/check-wecom-approval-fixtures.test.js +++ b/server/tests/unit/scripts/check-wecom-approval-fixtures.test.js @@ -124,6 +124,65 @@ describe("check-wecom-approval-fixtures", () => { expect(report.checks.fixturePayloads).toHaveLength(2); }); + it("builds create_template payload with official template_name and property controls", () => { + const payload = buildTemplateFixturePayload( + { key: "leave", label: "请假" }, + "2026-05-19T10:00:00.000Z", + ); + + expect(payload.template_names).toBeUndefined(); + expect(payload.template_name).toEqual([{ text: "OA-POC-请假-2026-05-19", lang: "zh_CN" }]); + expect(payload.template_content.controls).toHaveLength(3); + expect(payload.template_content.controls[0]).toMatchObject({ + property: { + control: "Text", + id: "Text-01", + title: [{ text: "类型", lang: "zh_CN" }], + placeholder: [{ text: "类型", lang: "zh_CN" }], + require: 1, + un_print: 1, + }, + config: {}, + }); + expect(payload.template_content.controls[1]).toMatchObject({ + property: { + control: "Date", + id: "Date-01", + }, + config: { + date: { + type: "day", + }, + }, + }); + }); + + it("builds applyevent payload with template control ids and non-self approver", () => { + const payload = buildApplyFixturePayload({ + target: { key: "leave", label: "请假" }, + templateId: SENSITIVE_TEMPLATE_ID, + applicantUserId: SENSITIVE_APPLICANT_USERID, + approverUserId: SENSITIVE_APPROVER_USERID, + generatedAt: "2026-05-19T10:00:00.000Z", + }); + + expect(payload.creator_userid).toBe(SENSITIVE_APPLICANT_USERID); + expect(payload.template_id).toBe(SENSITIVE_TEMPLATE_ID); + expect(payload.use_template_approver).toBe(0); + expect(payload.approver).toEqual([{ attr: 1, userid: [SENSITIVE_APPROVER_USERID] }]); + expect(payload.notifyer).toEqual([SENSITIVE_APPROVER_USERID]); + expect(payload.apply_data.contents.map((item) => item.id)).toEqual(["Text-01", "Date-01", "Textarea-01"]); + expect(payload.apply_data.contents[1]).toMatchObject({ + control: "Date", + value: { + date: { + type: "day", + s_timestamp: "1779148800", + }, + }, + }); + }); + it("does not write in live mode without the explicit env switch", async () => { const createTemplateImpl = vi.fn(); const report = await executeApprovalFixtures(baseOptions({