WARCH1 草拟企微审批最小历史留存合同
这个提交包含在:
@@ -0,0 +1,9 @@
|
||||
"ID","Title","Description","Acceptance","Test_Method","Tools","Dev_Status","Review1_Status","Regression_Status","Files","Dependencies","Notes"
|
||||
"WARCH1-0","最小历史留存合同与边界冻结","建立 WARCH1 最小自建历史留存实现合同;本阶段只覆盖请假 + 补卡企微审批历史、回调证据、补偿拉取证据和 QA-only 离线读取证明,不进入完整镜像、正式管理页、外出/加班、应急接管、恢复回写或 RuleOps。","1) 明确 WARCH1 是 WADM1 后的最小实现切片;2) 只写 OA 自建留存表,不写企微数据、不创建企微模板、不提交企微审批单;3) 企微读取固定 WECOM_AGENT_SECRET,不尝试其他 Secret、无 fallback;4) 缺 Secret、权限、可信 IP、可见范围、模板或回调配置时输出 NEEDS_CONFIG 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;5) 默认采用保守策略:原因摘要允许入 OA DB 受权限保护,报告/导出脱敏;回调 DB 写入失败返回非 200 让企微重试。","受影响流程:WADM1 设计 -> WARCH1 最小历史留存 -> 后续镜像准入;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-19_22-32-06-wecom-approval-archive-minimum-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-19_22-32-06-wecom-approval-archive-minimum-v1.csv --profile wecom --json;人工确认本合同后再编码。","python3|node|manual","TODO","TODO","TODO","issues/2026-05-19_22-32-06-wecom-approval-archive-minimum-v1.csv","[]","需要用户批准后才进入编码。回滚/清理:本行仅合同,无 schema、无代码、无部署、无 OA/企微数据写入。"
|
||||
"WARCH1-1","Prisma 留存表与迁移","新增最小审批留存 Prisma 模型和 migration:WecomApprovalArchive、WecomApprovalParticipant、WecomApprovalAction、WecomApprovalFieldSummary、WecomApprovalAttachmentSummary、WecomApprovalCallbackEvent、WecomApprovalCompensationRun、WecomApprovalCompensationItem、WecomApprovalReconcileFinding。","1) 主表以 corp_id_hash + sp_no 唯一,保存完整 sp_no、template_id、企微 userid、申请/完成/状态时间、last_source、last_detail_digest 和风险标记;2) 员工外键 onDelete SetNull,不因员工归档删除历史;3) 回调事件 idempotency_key 唯一,补偿 item run_id + sp_no 唯一,动作 archive_id + idempotency_key 唯一;4) 迁移只新增表和索引,不改旧表语义;5) 不保存 Secret、token、EncodingAESKey、原始 XML、密文或无治理原始 payload。","受影响流程:企微审批详情/回调 -> OA DB 留存 -> 断开企微 API 后历史可查;验证步骤:cd server && npm run prisma:format;cd server && npm run prisma:validate;cd server && npx prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script;检查 migration.sql 只新增 wecom_approval_* 表和索引。","prisma|node|manual","TODO","TODO","TODO","server/prisma/schema.prisma|server/prisma/migrations/*_wecom_approval_archive_minimum_v1/migration.sql","[""WARCH1-0""]","回滚路径:迁移上线前可删除新增 migration;上线后回滚代码时不删除已入库审计证据,必要时只停用写入入口。DB 内可保存完整外部键,日志、报告、Issue 和默认导出只输出脱敏前缀。"
|
||||
"WARCH1-2","审批详情与回调规范化服务","新增企微审批留存规范化服务,内部保留完整外部键用于入库,外部报告只输出脱敏前缀;从 getapprovaldetail 和回调解密结果中抽取请假/补卡必要字段、参与人、动作、字段摘要和 digest。","1) getapprovaldetail 规范化结果包含完整 sp_no、template_id、申请人/审批人 userid、规范化状态、状态时间、字段摘要、动作历史和 last_detail_digest;2) 回调规范化结果从只含前缀升级为内部完整键 + 外部脱敏摘要;3) 字段摘要只保存业务必要字段:申请类型、时间范围或补卡时间、时长、原因摘要、状态和审批历史;4) 原因摘要入库但限长、标敏感级别,报告/导出不输出完整文本;5) 不保存原始 payload、附件内容或评论全文。","受影响流程:企微详情/回调 -> 规范化 -> 入库 upsert;验证步骤:cd server && node --check src/services/integrations/wecomApprovalArchive.js;cd server && npx vitest run tests/unit/services/wecomApprovalArchive.test.js --reporter=verbose。","node|vitest","TODO","TODO","TODO","server/src/services/integrations/wecomApprovalArchive.js|server/tests/unit/services/wecomApprovalArchive.test.js|server/src/services/integrations/wecomCallbackCrypto.js|server/src/services/integrations/wecomApproval.js","[""WARCH1-1""]","默认选择:原因摘要完整入库到受权限保护业务表,默认 UI/export/report 脱敏或限权;如用户要求更严格,可改为前若干字 + digest。回滚/清理:规范化服务无外部副作用。"
|
||||
"WARCH1-3","回调事件入库与重试语义","调整 WCBK1 回调 POST 路径:验签、解密、规范化后写入 WecomApprovalCallbackEvent,并尝试合并到 WecomApprovalArchive;DB 写入失败返回非 200 触发企微重试,不再把失败伪造成成功。","1) POST /api/wecom/approval/callback 保持验签/解密;2) 回调事件按 idempotency_key upsert,重复投递不重复写动作历史;3) 找不到 archive 时也按完整 sp_no/template_id 先保存事件,补偿详情后再关联;4) DB 写入失败返回 5xx 或明确错误,企微可重试;5) 日志只输出 sp_no/template/userid/idempotency 脱敏前缀,不输出原始 XML、密文、Token、EncodingAESKey、完整 sp_no、完整 userid、完整 template_id 或原始 payload。","受影响流程:企微真实审批状态回调 -> OA 持久证据 -> 后续补偿比对;验证步骤:cd server && node --check src/routes/wecomApprovalCallback.js;cd server && npx vitest run tests/unit/routes/wecomApprovalCallback.test.js tests/unit/services/wecomApprovalArchive.test.js tests/unit/services/wecomCallbackCrypto.test.js --reporter=verbose;synthetic 回调重复投递验证不重复动作。","node|vitest","TODO","TODO","TODO","server/src/routes/wecomApprovalCallback.js|server/src/services/integrations/wecomApprovalArchive.js|server/tests/unit/routes/wecomApprovalCallback.test.js","[""WARCH1-2""]","默认选择:DB 写入失败不返回 success,接受企微重试;这是避免证据丢失的保护。回滚路径:可临时关闭归档写入并恢复 JSONL evidence fallback,但不得删除已入库证据。"
|
||||
"WARCH1-4","补偿拉取入库与对账 finding","扩展 WACP3 补偿 runner:按模板过滤只读调用 getapprovalinfo/getapprovaldetail 后,将 run/item/detail digest 和规范化审批历史写入 OA DB,并生成漏回调、重复回调、状态不一致等 WecomApprovalReconcileFinding。","1) 企微 API 仍只读,固定 WECOM_AGENT_SECRET,不尝试其他 Secret、无 fallback;2) 默认 dry-run 只生成规范化计划,写 OA DB 必须显式 --persist-to-db 且 WECOM_ARCHIVE_WRITE=1;3) 同一 run_id + sp_no 只能有一条 item;4) getapprovaldetail 是最终校准来源,旧 pending/unknown 不覆盖较新终态;5) 跨来源终态冲突写 status_mismatch finding,不静默改成功。","受影响流程:补偿拉取 -> 详情校准 -> OA 历史留存/回调比对;验证步骤:cd server && node --check src/scripts/check-wecom-approval-compensation-poc.js;cd server && npx vitest run tests/unit/scripts/check-wecom-approval-compensation-poc.test.js tests/unit/services/wecomApprovalArchive.test.js --reporter=verbose;dry-run 验证不写库,双开关验证才写库。","node|vitest","TODO","TODO","TODO","server/src/scripts/check-wecom-approval-compensation-poc.js|server/src/services/integrations/wecomApprovalArchive.js|server/tests/unit/scripts/check-wecom-approval-compensation-poc.test.js","[""WARCH1-2"",""WARCH1-3""]","写入保护:OA DB 持久化需要 --persist-to-db + WECOM_ARCHIVE_WRITE=1;不写企微数据。回滚/清理:可停止 runner 写入,已保存 run/item/finding 保留审计。"
|
||||
"WARCH1-5","QA-only 离线历史读取 runner","新增 QA-only runner check-wecom-approval-archive,验证不调用企微 API 时可从 OA DB 读取已保存请假/补卡历史摘要,并输出脱敏报告。","1) 新增 npm run check:wecom-approval-archive;2) 支持 --offline --format=json;3) 输出 PASS_ARCHIVE_HISTORY_READABLE、PASS_WITH_FINDINGS、PARTIAL_ARCHIVE_NEEDS_DATA 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;4) 报告只输出计数、状态摘要、脱敏 sp_no/template/userid 前缀、字段类型和 finding,不输出手机号、邮箱、token、secret、完整 userid、完整 template_id、完整 sp_no、原因全文、附件、评论或原始 payload;5) 断开企微 API 仍能读取 OA DB 历史摘要。","受影响流程:企微不可用 -> OA 自建历史查看能力验证;验证步骤:cd server && node --check src/scripts/check-wecom-approval-archive.js;cd server && npx vitest run tests/unit/scripts/check-wecom-approval-archive.test.js --reporter=verbose;执行 npm run check:wecom-approval-archive -- --offline --format=json。","node|vitest","TODO","TODO","TODO","server/src/scripts/check-wecom-approval-archive.js|server/package.json|server/tests/unit/scripts/check-wecom-approval-archive.test.js","[""WARCH1-4""]","该 runner 不调用企微 API、不写企微数据;默认只读 OA DB。回滚/清理:删除脚本和 package script 即可,DB 留存证据不删除。"
|
||||
"WARCH1-6","权限、脱敏与同意单击风险测试","补齐权限与隐私边界测试,确保完整外部键只在 DB 内受控保存,默认 API、runner、日志和导出不泄露;把 WREAD1 的同意单击风险落成审计事实。","1) 单测覆盖日志/报告不泄露手机号、邮箱、token、Secret、EncodingAESKey、完整 userid、完整 sp_no、完整 template_id、原始 XML、密文、原始 payload;2) DB 可保存完整外部键,默认输出仅脱敏前缀;3) 普通员工、审批人、HR/管理员的未来权限边界写入事实源;4) 同意单击动作记录来源=企微、操作者、时间、状态变化、回调/补偿一致性;5) 原因摘要默认不进入脱敏报告。","受影响流程:历史留存 -> 权限/审计 -> 后续查询和导出;验证步骤:cd server && npx vitest run tests/unit/services/wecomApprovalArchive.test.js tests/unit/scripts/check-wecom-approval-archive.test.js --reporter=verbose;rg -n '完整 sp_no|原因摘要|同意单击|原始 payload|WARCH1' docs .agents/skills/hyb-oa-delivery/SKILL.md。","vitest|rg","TODO","TODO","TODO","server/tests/unit/services/wecomApprovalArchive.test.js|server/tests/unit/scripts/check-wecom-approval-archive.test.js|docs/需求-统一审批中心规约.md|docs/管理员手册.md","[""WARCH1-5""]","本阶段不新增正式管理页;权限先以服务/runner/事实源固定,为后续 UI/API 做准入。回滚/清理:文档可按 git 回滚,测试无数据副作用。"
|
||||
"WARCH1-7","事实源回写、部署验证与提交","完成 WARCH1 实现后的文档回写、本地门禁、公网只读/受控写入验证和中文提交;若涉及远端写入,仅写 OA 自建留存表,不写企微数据。","1) Issue 状态按实测结果回填;2) 路线图、API 能力目录、统一审批规约、企业微信基础设施规约、请假考勤规约、管理员手册、试运行报告、文档索引、事实源矩阵和 skill 同步 WARCH1 结果;3) 本地 lint/syntax/Prisma/vitest/process gate/docs gate 通过;4) SYNC_ENV=0 受控部署,远端 /ready 正常;5) 远端先 dry-run,再在批准的双开关下持久化现有 OA-POC 请假/补卡历史,最后 offline runner 证明可读;6) 中文提交完成。","受影响流程:WARCH1 实现 -> 公网验证 -> 后续镜像准入;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-19_22-32-06-wecom-approval-archive-minimum-v1.csv;node scripts/qa/check-process-contract.mjs --baseline --json;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-19_22-32-06-wecom-approval-archive-minimum-v1.csv --profile wecom --json;cd server && npm run prisma:validate;cd server && npx vitest run tests/unit/services/wecomApprovalArchive.test.js tests/unit/scripts/check-wecom-approval-archive.test.js tests/unit/scripts/check-wecom-approval-compensation-poc.test.js tests/unit/routes/wecomApprovalCallback.test.js --reporter=verbose;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;git diff --check;SYNC_ENV=0 bash deploy/trialrun/deploy.sh;远端执行 npm run check:wecom-approval-compensation-poc -- --live --format=json 和 npm run check:wecom-approval-archive -- --offline --format=json。","python3|node|prisma|vitest|bash|git","TODO","TODO","TODO","docs/企微优先开发路线图.md|docs/企微API能力目录.md|docs/需求-统一审批中心规约.md|docs/需求-企业微信基础设施规约.md|docs/需求-请假考勤修正规约.md|docs/管理员手册.md|docs/trialrun/人工试运行报告.md|docs/文档索引.md|docs/文档事实源状态矩阵.md|.agents/skills/hyb-oa-delivery/SKILL.md","[""WARCH1-6""]","部署写入边界:SYNC_ENV=0,不同步本地 env;不写企微数据;如公网缺 Secret、权限、可信 IP、可见范围、模板或回调配置,记录 NEEDS_CONFIG 或 SKIP/BLOCKED_BY_EXTERNAL_CONFIG,不伪造成 PASS。提交信息建议:WARCH1 实现企微审批最小历史留存。"
|
||||
|
在新工单中引用
屏蔽一个用户