merge: 合入候选分支(09-17借款/ERP退役、09-18编号、09-19预算并发、完整10-05错误码迁移,均经确认)

# Conflicts:
#	.agents/skills/trellis-before-dev/SKILL.md
#	.agents/skills/trellis-brainstorm/SKILL.md
#	.agents/skills/trellis-continue/SKILL.md
#	.agents/skills/trellis-start/SKILL.md
#	.trellis/tasks/08-23-isolated-backup-restore-drill/design.md
#	.trellis/tasks/08-23-isolated-backup-restore-drill/prd.md
#	.trellis/tasks/09-05-error-explainability-payment-readiness/prd.md
#	.trellis/tasks/09-05-error-explainability-payment-readiness/task.json
#	.trellis/tasks/09-09-existing-deploy-seed-separation/implement.md
#	.trellis/tasks/archive/2026-09/09-05-trellis-upgrade-rule-cleanup/task.json
#	.trellis/workflow.md
#	scripts/qa/error-reason-legacy-baseline.json
#	server/src/routes/apOperations.js
#	server/src/routes/portal.js
#	server/src/routes/todos.js
#	server/tests/unit/fixtures/error-reason-messages.json
#	server/tests/unit/routes/apOperations.permissions.test.js
这个提交包含在:
2026-09-26 07:54:10 +08:00
当前提交 46a70aa552
共修改 395 个文件,包含 23086 行新增和 13407 行删除
@@ -1,11 +1,95 @@
# 错误可解释性与付款就绪治理
## B34 当前验收状态
用户批准接续后,损坏账号导入的限定修复已完成本地合成验证:已复现白名单格式返回固定400提示,未知解析故障继续500且不记录原解析内容;权限、文件限制、合法导入、日期文本与事务保持。最终68项导入加854项原因合同断言通过,前端typecheck/build及原因strict/self-test通过,详见implement最新回执。此结论不等于独立复核、真实导入或上线;下方“尚未实施”保留原时点,D15非阻塞、D16现合同及17 ERP排除不变。
## 2026-09-17 用户澄清:考勤由企业微信承办
用户明确“考勤功能在企微”。按现行产品规则,打卡、请假、补卡、外出、加班由企微承办;OA 保留月度摘要、异常解释、同步状态及审计,不恢复旧 OA 打卡。此前 D15 是 OA 摘要查询的极低年份技术观测,不是企微考勤故障,也不是新建 OA 考勤的需求。
D15 不列为本轮必须修复或阻塞收尾的项目;原 2000–2100 建议仅为未采纳的技术备选,不再作为等待用户决定的必办项。保留观测和现有代码,不把它记为已修复,也不由此认定所有企微摘要/同步代码均已废弃。B34 账号导入仍为下一本地修复优先项。
## 2026-09-17 剩余边界确认结果
W6三类余项已完成本地范围确认,产品源码未更改。损坏账号CSV/XLSX在两入口仍返回500且CSV异常可将合成单元格交给日志,列为B34优先修复方案;具体错误白名单、固定安全提示与未知内部异常分流见design。低年份D15将工资待精简路径排除,统一考勤保留入口只读偏移另待接受年份决策。AP反向ledger区间D16保持现有200及有界查询,不作为必须修复项;非法日期/其他区间原拒绝保持。
本轮验收为合成行为证据、在用/排除依据与限定实施方案,不把characterization通过记成缺陷已修复。旧17处ERP排除与原人工复审日期不变;不修改原AC勾选、不提交部署或访问真实数据。
## G8按在用路径收口
按implement顶部B31–B33合同处理57处,17处ERP旧分支按用户最新指示跳过并保留源码/基线。其依据为产品设计规则61/89及企微路线图37;通用outbox有notification.im消费者不整文件跳过。当前权限/状态/编号/开关/认证业务规则保持,只本地合成。所有旧材料保护、独立PENDING,不读真实配置密钥/外联/提交部署或实施借款。
## G7本地错误合同接续
查询考勤周报八源42处,按implement顶部B29/B30逐操作合同实施;三方固定提示、精确减基线、实际路由/服务负例和合法回归、页面安全消费及保护新候选。legacy考勤硬关闭保持,内部路由用合成门禁桩分层验证;周报项目开关失败前原update尝试保持。独立PENDING,不扩权限/状态规则,原真实数据/外联/提交部署边界不变。
## G6验收补充
共享审批工具、流程定义、审批规则和委托仅迁移原错误合同,保留原status/details、角色/自审批/快照/主管链规则及事务副作用位置。明确不可达防御与本地mock边界,另限定修复委托列表有效期OR覆盖本人范围OR的组合缺陷:两者AND同时生效,恢复原有范围而不新增管理权;须有合成数据红绿路由证据。具体操作与验收以implement为准;独立只读复核PENDING。
## G5验收补充
延续120处采购/资产/流转盘点/合同与共享预算错误合同治理,仅新增明确原因和固定安全提示,原状态/权限/冻结/附件安全及业务写入顺序保持。具体子批先行合同与进展以implement顶部为准;仅本地合成,不以扫描数代替分支或真实业务验收。
## G4差旅验收补充
B19–B21覆盖申请、订单、授权、交易及共享预算和对账错误合同。保留原400/409/details、审批/付款/预算规则、锁/事务、按条导入跳过与幂等、ERP排队门禁及敏感文案固定映射。另修复申请关联项目误调用未定义parseUuid导致500,复用本文件已有id解析器,原可见/绑定规则不改。缺预算池前原ledger尝试、工作流拒绝前原风险处理继续明确记账,不虚报零写入或真实回滚。
## G3基础资料验收补充
B15–B18覆盖公司/成本中心/单据分类/供应商、日历、费用标准/类型、假别、模板及项目逐操作错误合同。仅补稳定原因与固定安全提示,保持原400/409/details、权限、开关、状态、金额/日期schema、默认值/null和事务审计。项目收口项的原先行惰性初始化例外明确记录:拒绝后不修改目标项、不记成功审计,不承诺所有拒绝零写入。旧详情中的公司代码及无效费用类型列表不用于拼UI文案。仅合成测试,具体合同与验收状态见implement顶部。
## B11–B14连续本地验收
覆盖预算范围/选池与控制规则、员工账号/部门、员工资料/生命周期/合同培训证书及头像/合同附件错误解释。保留旧HTTP、VALID_001、详情字段与权限/冻结/事务/业务规则,三方原因及可恢复提示同批。员工文件读取只捕获既有生产映射的FST_REQ_FILE_TOO_LARGE并补原因,原文件限额/格式/内容检查和下载阻断安全message/审计保持。原目录无调用helper清理与不可达日期防御分支单独记录,测试只用合成资料和离线桩,详细合同以implement顶部为准。
## B10及剩余546处治理
按implement顶部8组总表连续处理同类本地错误合同。B10限定预算/绩效路由原拒绝条件,保留管理员权限、经理/本人冻结、预算范围/额度和事务状态;只补25个明确原因及安全恢复提示。覆盖原status/details、无后续写入/成功审计、正常与权限回归,三方文案和严格基线同批验证。共享预算服务仍单列未完成,不能称整个预算域清零。
## B6/D13/D14/B7接续验收
连续完成账号导入文件7原因、月份后置守卫补证/具体提示、公告三日期字段合法性与公告操作原因/现有页面错误反馈,并收齐工资维护现有校验原因。共36原因,业务拒绝条件不变。原status/details、导入事务/预览审计、工资生成发放规则、公告时区/缺省/签收保护保持;非法上传或公告时间不进入业务写入。月份00/13已有校验不能重复宣称修复,低年份Date.UTC偏移另列决策。精确合同与状态以implement最新入口为准,不扩大到真实业务或借款实施。
## 本轮D12/B5验收补充
继续执行已批准的本地日期与错误治理:HR入职日期缺失保留默认,提供但非法必须整条跳过并保留安全审计,在部门/账号/角色/身份/主管写入之前拒绝;已有员工不新增入职日更新。员工目录、合同筛选(含对应导出外层输入)及在岗历史范围共7原因,兼容原status/details与默认范围。以本轮implement顶部为当前限定合同;旧“D12尚未实施”为历史时点,完成状态以本轮回执为准。仅合成数据与离线桩;独立/发布不由主会话本地验证抵扣。
## 2026-09-17 连续本地治理范围(当前合同)
用户已批准按后期规划连续推进。继D1–D4后,实施D5用户创建/修改/CSV/XLSX入职日、D6员工资料/生命周期/档案、D7 AP直接列表、D8余项盘点、D9仪表板直接读、D10薪资/预算/绩效、D11考勤修正/请假和同步请求日期。仅本地输入校验,保留原权限、开关、状态机、额度/区间/默认日期和nullable/optional;旧attendance_v1固定关闭不被解冻。CSV须保留合法日期及文本标识原值,非法apply整批无业务写入,dry-run原审计保留。
B3/B4限于dashboard/AP查询/开关及账号创建/修改/工号不可改/空修改/导入错误行9原因;旧VALID_001、status/details保持,客户端具体安全文本、固定夹具和真实路由负例同批。剩余豁免只删消失指纹,原owner/2026-10-05不变。
验收按D5–D9/B3/B4最终17文件520项及后续D10/D11的9文件61项分列,两组不冒称全仓/独立/真实DB或公网。前端typecheck/build通过;完整记录/初跑失败/精确命令归implement及新证据目录。D12外部HR多格式日期须先分清缺失默认与非法跳过,尚未实施;datetime/月份、AP反向区间改变、历史数据修订和借款实现不在本批。旧批次/冻结材料保留,提交发布另按门禁。
## 2026-09-17 D1–D4本地接续范围
用户在D1–D4规划落盘后要求继续推进,本轮仅落实待办dueDate、员工目录及导出的hireDate筛选、节假日批量日期、仪表板/AP导出date-only字段。无效日历日期须在写入/业务导出查询前拒绝,原nullable/optional、权限、重复/归档冲突及区间语义保持;CSV/XLSX共同验证。完整结果见implement顶部,未来09-25人工复审与剩余错误豁免仍开放。
不扩大共享parseDateOnlyString转换、员工资料写入/导入、审计datetime、工资月份或AP台账反向区间规则;不修改客户端/迁移/生产。B1/B2原候选保留,本次新输入另冻供独立审查,不将旧450项验证冒称覆盖新输入。
## 2026-09-17 后续治理范围(本地实施已批准,已发布批次不重做)
按09-08优先级表承接B1/B2。B1先覆盖contractsRegistry、purchaseRequests、travelOrders、travelReconciliation的外部日期,再覆盖weeklyReports/presence;只加输入日历守卫,不开放冻结模块、不改审批/付款规则、历史数据或旧parseDateOnlyString转换约定。内部派生日期逐调用点追上游资格,不因引用旧解析器就整文件替换。
B2先用现有AST门禁盘点当前豁免及用户可达操作,再处理确实未迁移的常用路径;已发布paymentAccounts/invoicePool/auth/workflow提示不重复实施。每项必须同时有服务端原因码、兼容details、客户端具体文案及动态字段/无副作用断言;保留逐条批处理失败原合同,不靠宽泛正则或删基线隐藏问题。
新增小批验收:非法日历输入在事务/写入前拒绝,闰日/月末/null/省略及原区间/周起点语义保持;新原因码三方文本一致,动态字段投影仍安全,主链路零新增例外;受影响真实路由/客户端定向测试通过并经相应只读审查。09-25复审、09-30必要单项延期提案、10-02查漏、10-05原到期门禁不变,责任人shunli;本轮未创建定时任务、不延期。
用户已于本日批准按梳理继续,本节既有B1/B2小批进入本地实施;新增schema/业务规则、整库历史修订、生产写入和发布不在范围。与08-23受保护操作等待解耦,不要求完整灾备全部通过才能做本地治理。
## 2026-09-09 追加阶段
用户已批准综合任务安排的本地实施。复用本 task 管理 10-05 到期豁免分流,不改变原功能验收。当前交付是 73 文件/673 指纹全量核对与分流台账(implement.md §13);未迁移原因码、未修改基线日期,不把 file 级分类冒充逐调用业务裁决。新分支迁移沿原 status/code/details 兼容与精确测试合同;须先完成既有两笔隔离提交,不能在原脏树叠第三笔产品代码。延期、提交、推送、部署各守明确授权。
## Goal
把“系统知道为什么不能继续、真人只看到参数校验失败”的缺陷从逐页补文案改成可持续的错误合同,并以付款批次为第一个完整样板:财务在点击前就知道付款资料是否齐全、缺什么、由谁补;点击后的服务端二次校验与页面提示必须来自同一份实时判断。