文件
hyb-oa/issues/2026-05-22_14-23-19-wecom-formal-outing-overtime-evidence-v1.csv
T

10 KiB

1IDTitleDescriptionAcceptanceTest_MethodToolsDev_StatusReview1_StatusRegression_StatusFilesDependenciesNotes
2WEXT1F-0建立正式模板外出加班证据合同建立 WEXT1-FORMAL 执行合同,承接 WREMOTE1 后的路线:不再自动创建 OA-POC 外出/加班模板,不自动提交审批单;由 SMOKE002 在企业微信正式模板人工提交外出和加班,SMOKE101 先看详情再审批,系统只从部署服务器可信 IP 做只读拉取、OA 归档和审批链校验;审批读取 Secret 来源固定 WECOM_AGENT_SECRET,不尝试其他 Secret、无 fallback、不允许运行时猜 Secret。1) Issue ID 使用 WEXT1F-0..WEXT1F-7;2) 明确企业微信 API 证据只从部署服务器可信 IP 获取;3) 明确本轮不写企业微信、不创建模板、不自动提交审批、不启用真实员工;4) 明确 OA 写入只限 WECOM_ARCHIVE_WRITE=1 + --persist-to-db 的既有归档路径。受影响流程:正式模板外出/加班人工提交 -> 企微补偿只读拉取 -> OA 归档 -> WRULE1 审批链校验 -> WREAL1 准入;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-22_14-23-19-wecom-formal-outing-overtime-evidence-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-22_14-23-19-wecom-formal-outing-overtime-evidence-v1.csv --profile wecom --json。python3|nodeDONEDONEDONEissues/2026-05-22_14-23-19-wecom-formal-outing-overtime-evidence-v1.csv[]回滚/清理:删除本合同;不修改 Prisma schema;不写企业微信。
3WEXT1F-1扩展补偿拉取显式目标扩展 check-wecom-approval-compensation-poc,使其默认仍只覆盖请假和补卡,但支持显式 --target=outing --target=overtime;支持从正式模板提交记录按 SMOKE002 创建人只读发现外出/加班模板 ID,并在正式模板详情拉取时强制使用 --filter-creator-employee-no=SMOKE002,避免按 template_id 宽泛读取同模板其他员工单据。1) 默认无 --target 时仍为 leave + missed_punch;2) 显式 --target=outing --target=overtime 才纳入外出/加班;3) 支持 WECOM_APPROVAL_OUTING_TEMPLATE_ID/WECOM_APPROVAL_OVERTIME_TEMPLATE_ID 或 --discover-template-ids 发现;4) WEXT1F 正式模板拉取必须带 creator=SMOKE002 过滤,无法解析则不拉取;5) 报告只输出脱敏前缀和计数;6) 不新增企微写入开关。受影响流程:正式模板人工提交后 -> getapprovalinfo 按创建人发现模板 -> 按 template_id + creator 拉取外出/加班详情;验证步骤:cd server && npm run test -- tests/unit/scripts/check-wecom-approval-compensation-poc.test.js。node|vitestDONEDONEDONEserver/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["WEXT1F-0"]回滚/清理:恢复补偿 runner;默认范围保持不变,避免误扩大 WARCH3/WAUTO1 现有巡检。
4WEXT1F-2扩展 OA 归档离线读取目标扩展 check-wecom-approval-archive 离线读取目标,支持 --template=outing 和 --template=overtime,用于证明正式模板外出/加班详情已经进入 OA 自建留存。1) 默认离线读取仍为 leave + missed_punch;2) 显式模板参数可读 outing/overtime;3) 不调用企微 API;4) 报告不输出完整 sp_no、template_id、userid、表单值、附件、评论或原始 payload。受影响流程:OA 归档库 -> 外出/加班历史只读查看;验证步骤:cd server && npm run test -- tests/unit/scripts/check-wecom-approval-archive.test.js。node|vitestDONEDONEDONEserver/src/scripts/check-wecom-approval-archive.js|server/tests/unit/scripts/check-wecom-approval-archive.test.js["WEXT1F-1"]回滚/清理:恢复离线读取目标集合;不改业务 API 或前端页面。
5WEXT1F-3新增远端正式模板证据脚本新增 QA-only 脚本 scripts/qa/run-wecom-formal-outing-overtime-evidence.sh;本地默认拒绝业务执行,--remote 通过 SSH 到部署服务器容器运行;容器内只读拉取外出/加班、可选归档到 OA、自建留存离线读、WRULE1 校验和隐私扫描;脚本必须要求人工确认标记 WEXT1F_MANUAL_CONFIRMATION=SMOKE002_SUBMITTED_SMOKE101_REVIEWED,否则只输出 PAUSED,不跑企微 API。1) 本地直接执行必须提示 --remote;2) 即使伪造远端环境变量,本地非 /app 容器路径也必须拒绝;3) 远端执行使用 WEXT1F_EXECUTION_MODE=remote 和 WEXT1F_REMOTE_CONTEXT=deployment-server;4) 缺人工确认标记时不跑企微 API;5) 不设置任何企微写入开关;6) 归档写 OA 只通过 WECOM_ARCHIVE_WRITE=1 + --persist-to-db;7) 输出 artifacts/qa-flow/wecom-formal-outing-overtime-evidence-<timestamp>/summary.json。受影响流程:正式模板人工提交后 -> 远端只读收证据;验证步骤:bash -n scripts/qa/run-wecom-formal-outing-overtime-evidence.sh;bash scripts/qa/run-wecom-formal-outing-overtime-evidence.sh --help;本地直接执行返回非 0 且提示 --remote;WEXT1F_EXECUTION_MODE=remote WEXT1F_REMOTE_CONTEXT=deployment-server bash scripts/qa/run-wecom-formal-outing-overtime-evidence.sh 仍应因非 /app 容器路径拒绝。bash|ssh|nodeDONEDONEDONEscripts/qa/run-wecom-formal-outing-overtime-evidence.sh["WEXT1F-2"]回滚/清理:删除脚本;脚本不创建模板、不提交审批、不启用真实员工。
6WEXT1F-4更新事实源和人工步骤更新现有事实源,记录 WEXT1-FORMAL 的正式模板人工操作清单、可信 IP 边界、外出/加班证据准入和 WREAL1 后置条件;不新建独立说明文档。1) 文档明确 SMOKE002 人工提交正式模板外出/加班;2) 文档明确 SMOKE101 先看详情再审批;3) 文档明确系统只能只读拉取、归档和校验;4) 文档明确 WREAL1 仍需另行问答。受影响流程:管理员按文档执行 WEXT1-FORMAL;验证步骤:rg -n "WEXT1-FORMAL|正式模板|SMOKE002|SMOKE101|run-wecom-formal-outing-overtime-evidence|WREAL1" docs .agents/skills/hyb-oa-delivery/SKILL.md;node scripts/qa/audit-docs.mjs --check-registry;quick_validate.py .agents/skills/hyb-oa-delivery。rg|node|python3DONEDONEDONEdocs/企微优先开发路线图.md|docs/管理员手册.md|docs/trialrun/人工试运行报告.md|docs/文档索引.md|docs/文档事实源状态矩阵.md|docs/需求-统一审批中心规约.md|.agents/skills/hyb-oa-delivery/SKILL.md["WEXT1F-3"]回滚/清理:恢复文档和 skill;不记录真实员工信息。
7WEXT1F-5本地门禁与只读评审执行合同校验、process gate、脚本语法、focused 单测、文档审计、skill 校验、diff 检查和最小回归;涉及审批规则和权限边界,实施后启动只读 reviewer subagent。1) validate_issues_csv 通过;2) baseline 和 issue-specific process gate 通过;3) bash -n 通过;4) focused vitest 通过;5) docs/skill/diff/minimal gates 通过;6) reviewer 无 blocker 或 blocker 已修复。受影响流程:脚本/规则边界 -> 独立评审 -> 部署前门禁;验证步骤:validate_issues_csv.py <csv>;node scripts/qa/check-process-contract.mjs --baseline --json;node scripts/qa/check-process-contract.mjs --issue <csv> --profile wecom --json;cd server && npm run test -- tests/unit/scripts/check-wecom-approval-compensation-poc.test.js tests/unit/scripts/check-wecom-approval-archive.test.js tests/unit/scripts/check-wecom-approval-rule-validator.test.js;bash scripts/check-minimal.sh。python3|node|bash|subagent|gitDONEDONEDONEserver/src/scripts/*|scripts/qa/run-wecom-formal-outing-overtime-evidence.sh|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md["WEXT1F-4"]本地门禁已通过;只读 reviewer 已复核 creator 过滤、本地伪远端拒绝和人工确认门禁无 blocker;部署/人工提交/远端取证仍在 WEXT1F-6/7。
8WEXT1F-6部署并等待人工提交本地门禁通过后 SYNC_ENV=0 部署,复检 /ready;然后给出 SMOKE002/SMOKE101 真机操作步骤,等待用户确认已提交/已审批后再跑远端证据脚本。1) SYNC_ENV=0 部署成功;2) /ready 正常;3) 不在用户人工提交前跑正式模板证据通过结论;4) 给出按账号、模板、时间、确认点排列的人工步骤。受影响流程:部署 -> 人工正式模板外出/加班 -> 远端证据脚本;验证步骤:SYNC_ENV=0 bash deploy/trialrun/deploy.sh;curl -fsS https://oa.hyinda.com/ready;人工回复已提交/已审批。bash|curl|manualDONEDONEDONEdeploy/trialrun/*|scripts/qa/run-wecom-formal-outing-overtime-evidence.sh["WEXT1F-5"]已以 SYNC_ENV=0 部署提交 234fc29/608f173;公网 /ready 返回 ok=true;用户已确认 SMOKE002/SMOKE101 完成正式外出/加班人工动作。
9WEXT1F-7远端收证据并回填提交用户完成正式模板外出/加班人工测试后,从部署服务器执行 WEXT1F 证据脚本,回填报告路径和真实结论,中文提交。1) 远端 summary 结论限定 PASS_FORMAL_OUTING_OVERTIME_READY、PASS_WITH_FINDINGS、PAUSED_MANUAL_CONFIRMATION、SKIP/BLOCKED_BY_EXTERNAL_CONFIG;2) 报告包含补偿拉取、OA 归档离线读、WRULE1、隐私扫描;3) 不泄露完整 sp_no/template_id/userid/手机号/邮箱/token/Secret/EncodingAESKey/表单值/附件/评论/原始 payload;4) commit message 使用中文并引用 WEXT1F。受影响流程:正式模板外出/加班证据 -> WREAL1 问答准入;验证步骤:bash scripts/qa/run-wecom-formal-outing-overtime-evidence.sh --remote;git status --short;git log -1 --oneline。bash|ssh|gitDONEDONEDONEissues/2026-05-22_14-23-19-wecom-formal-outing-overtime-evidence-v1.csv|server/src/scripts/*|scripts/qa/run-wecom-formal-outing-overtime-evidence.sh|docs/*|.agents/skills/hyb-oa-delivery/SKILL.md["WEXT1F-6"]二次远端报告 /app/artifacts/qa-flow/wecom-formal-outing-overtime-evidence-20260522-104521/summary.json 结论 PASS_WITH_FINDINGS;/ready 通过,outing/overtime 均已拉到 approved 终态并写入 OA 归档,离线归档读取可读 2 条 approved,WRULE1 为 PASS_RULE_MATCH,隐私扫描通过;剩余 finding 为 callback_duplicate_for_pulled_detail 和历史 callback window observation,不阻断进入 WREAL1 问答。