记录CEO财务兜底生产收口(07-28-ceo-finance-fallback)

这个提交包含在:
2026-07-28 15:00:35 +08:00
父节点 a74cba1112
当前提交 0c779ab4f9
共修改 10 个文件,包含 76 行新增和 22 行删除
@@ -23,6 +23,58 @@ QA script patterns over new abstractions.
- `cd server && ./scripts/regression-workflow-actions.sh`
- `cd server && ./scripts/regression-all.sh`
## Scenario: Prisma Client Defaults In Raw SQL
### 1. Scope / Trigger
- Trigger: a script or route uses `$queryRaw`, `pg` or handwritten `INSERT` SQL against a Prisma-managed table whose schema declares `@default(uuid())` or another client-side default.
### 2. Signatures
- Prisma signature: `id String @id @default(uuid()) @db.Uuid`.
- Database signature may still be `id UUID NOT NULL` without a database `DEFAULT`.
- Raw insert must include `id` and bind an explicit UUID, for example `$1::uuid`.
### 3. Contracts
- Prisma schema defaults are not assumed to exist in PostgreSQL; inspect the applied migration or live column default before omitting a raw-SQL field.
- Raw audit inserts generate a fresh UUID in application code and keep the audit insert in the same transaction as the protected write.
- Dry-run may exercise audit inserts, but it must roll the transaction back and report zero committed audit rows.
### 4. Validation & Error Matrix
- Raw insert omits a required client-default field with no DB default -> PostgreSQL not-null failure; transaction rolls back.
- Explicit UUID has invalid syntax -> PostgreSQL cast failure; transaction rolls back.
- Audit insert fails after the business update -> the complete transaction rolls back; no partial rule update is allowed.
### 5. Good/Base/Bad Cases
- Good: explicit UUID, request ID, actor, target and JSON audit payload are bound and tested position by position.
- Base: Prisma Client `create()` may rely on the Prisma default because the client supplies it.
- Bad: infer from `@default(uuid())` that handwritten PostgreSQL may omit `id`.
### 6. Tests Required
- Assert the raw SQL column list contains the required ID and the bound value is a valid UUID.
- Assert every parameter position maps to its intended DB type.
- Assert dry-run begins a serializable transaction and executes `ROLLBACK`; audit failure paths must remain fail-closed.
### 7. Wrong vs Correct
#### Wrong
```sql
INSERT INTO audit_logs (request_id, actor_id, extra)
VALUES ($1, $2::uuid, $3::jsonb);
```
#### Correct
```sql
INSERT INTO audit_logs (id, request_id, actor_id, extra)
VALUES ($1::uuid, $2, $3::uuid, $4::jsonb);
```
## Scenario: Local Regression Migration Drift
### 1. Scope / Trigger
@@ -30,15 +30,15 @@
## 4. Deployment And Production Apply
- [ ] 提交并推送已验证代码。
- [x] 提交并推送已验证代码。
- [x] 修复部署脚本已知的数据目录保护缺陷:同步根目录与数据目录任一方向重叠时在 SSH 前阻断,自定义同步树内 `.env` 动态保护;隔离备份/恢复合同通过。
- [ ] 部署后核对 `/ready` 构建号、migration 状态、runtime smoke、external deps smoke 和前端 bundle。
- [ ] 生产只读冻结规则结构、active `finance`、CEO、角色、binding、历史快照和审计基线。
- [ ] 原子更新恰好 3 条启用规则并逐条写脱敏审计;任一预条件漂移则零写入停止。
- [ ] 只读解析 CEO 小/中/大额快照均为唯一 `finance`,普通员工链符合目标;不创建真实报销。
- [ ] 复核无角色、主管、binding、历史快照或企微写入变化。
- [x] 部署后核对 `/ready` 构建号、migration 状态、runtime smoke、external deps smoke 和前端 bundle。
- [x] 生产只读冻结规则结构、active `finance`、CEO、角色、binding、历史快照和审计基线。
- [x] 原子更新恰好 3 条启用规则并逐条写脱敏审计;任一预条件漂移则零写入停止。
- [x] 只读解析 CEO 小/中/大额快照均为唯一 `finance`,普通员工链符合目标;不创建真实报销。
- [x] 复核无角色、主管、binding、历史快照或企微写入变化。
部署执行备注:`3594872` 已通过标准部署、migration、runtime/external-deps smoke、独立公网构建号和前端 bundle 核验;同时将附件从同步树内迁至独立数据目录并保留校验一致的回退副本,自动备份/WARCH3 timer 已刷新运行身份。首次生产 dry-run 因审计表 UUID 缺失失败并完整回滚;需部署后续修复提交后重新完成本节全部勾选。
部署执行备注:`3594872` 首次部署通过,并将附件从同步树内迁至独立数据目录、保留校验一致的回退副本;首次生产 dry-run 因审计表 UUID 缺失失败并完整回滚。修复提交 `a74cba1` 随后部署,`/ready`、migration、runtime/external-deps smoke、92 个公网资源扫描通过;4 个自动运维 timer 已刷新运行身份。第二次 dry-run 为 `DRY_RUN_PASS`,apply 原子写入 3 条规则与 3 条脱敏审计,受保护计数稳定;只读解析 CEO 三档均为唯一 `finance`、普通员工链符合目标,0 条真实报销、0 次企微写入。
## 5. Stop Conditions
@@ -40,8 +40,8 @@
- [x] 前端类型、创建/编辑选项和推荐文案支持 `finance`,默认选择 `finance`,typecheck/build 通过。
- [x] 种子默认三档规则与目标链一致,相关回归测试通过。
- [x] 只读 review 确认权限、自审、状态机、历史快照和生产回填边界无扩大。
- [ ] 部署后公网 `/ready` 构建号匹配,runtime smoke 和关联认证/工作流检查通过。
- [ ] 生产恰好 3 条启用规则按目标结构回填并留下脱敏审计;active 账号、角色、binding 和历史审批快照计数无意外变化。
- [x] 部署后公网 `/ready` 构建号匹配,runtime smoke 和关联认证/工作流检查通过。
- [x] 生产恰好 3 条启用规则按目标结构回填并留下脱敏审计;active 账号、角色、binding 和历史审批快照计数无意外变化。
- [x] 当前事实源、管理员手册和任务结论不再宣称 `finance_mgr` 是本公司推荐兜底。
## Test Plan
+2
查看文件
@@ -746,6 +746,8 @@ git show 5da05eb:docs/trialrun/人工试运行报告.md
预期链路:小额 `finance_mgr -> finance`,中额 `finance_mgr`,大额 `finance_mgr`。若 `finance_mgr` 没有 active 非本人持有人,或申请人本人也持有兜底角色,系统继续阻断。
2026-07-28 状态增量:上述 2026-05 `finance_mgr` 与 `wangshunli` 负责人假设保留为历史发现,不再代表当前配置。用户确认 `majianyong` 为 `ceo`,`wangshunli` 仅为系统开发/系统管理员;Trellis task `07-28-ceo-finance-fallback` 已部署构建 `a74cba1112e0`,生产 3 条启用规则原子回填为小/中额 `manager -> finance`、大额 `manager -> ceo -> finance`,三档 fallback 均为 `finance`。只读解析确认 CEO 三档均为唯一 `finance`,普通员工链保持目标结构;写入 3 条脱敏审计,未创建真实报销、未写企业微信。
## OAFRONT6 前端成熟化小步收口
当前口径:OAFRONT6 只处理上线前低风险展示成熟化,不替代 OALAUNCH1 的真实业务闭环、权限矩阵、备份恢复、7 天稳定化和 Go/No-Go。
+2 -2
查看文件
@@ -82,7 +82,7 @@
## 审批与通知
- 正式审批口径:`majianyong` 是公司负责人 `ceo` 且不配置直属主管,当前唯一 active `manager` 向其汇报;`wangshunli` 只承担系统开发/系统管理,不配置正常业务审批角色;`admin` 不代表业务审批权。CEO 本人报销只有在 active 非本人 `finance` 兜底可解析时才能通过;本地候选已通过,部署与生产规则回填前公网仍必须阻断。
- 正式审批口径:`majianyong` 是公司负责人 `ceo` 且不配置直属主管,当前唯一 active `manager` 向其汇报;`wangshunli` 只承担系统开发/系统管理,不配置正常业务审批角色;`admin` 不代表业务审批权。生产三档规则已回填为 active 非本人 `finance` 兜底;无持有人或命中自审时继续阻断。
- WOUA-FIX 后,`SMOKE001`、`SMOKE201`、`SMOKE301`、`SMOKE302`、`SMOKE401`、`T0000` 已作为缺企微测试数据软归档;后续真机或公网试运行不得再把这些账号作为当前执行账号。
- 审批链正确性是业务逻辑验收,优先通过 PC 公网网页或自动化证明,不要求所有审批角色绑定企业微信。
- 企业微信真机验收只覆盖工作台入口、绑定/免登录、移动布局、待办、详情、PDF 上传入口和通知 deeplink;当前 `oa_smoke_01 -> SMOKE002` 与 `oa_smoke_02 -> SMOKE101` 足够覆盖“提交人 + 审批人”的核心移动体验。
@@ -97,7 +97,7 @@
| 普通低/中额单据 | PC/自动化 | `SMOKE002` / 测试员工 | 提交低/中额单据 | 待办分配给 `SMOKE101` | 通过 | S4 自动化证据 |
| 高额/高风险/例外单据 | PC/自动化 | 当前 active 角色账号 | 提交高额/例外单据 | 按当前负责人、财务和财务主管配置流转 | 需按 WOUA-FIX 后账号重跑 | 后续新证据 |
| 主管本人申请 | PC/自动化 | 当前 active 主管账号 | 主管提交本人申请 | 待办分配给非本人上级或明确阻断 | 需按 WOUA-FIX 后账号重跑 | 后续新证据 |
| 公司负责人本人申请 | PC/自动化 | 当前 active 负责人账号 | 负责人提交本人申请 | 三档均唯一进入 active 非本人 `finance`;无持有人或自审时阻断 | 本地聚焦回归通过,待部署和生产规则回填后只读复核 | 当前 Trellis task;后续公网证据 |
| 公司负责人本人申请 | PC/自动化 | 当前 active 负责人账号 | 负责人提交本人申请 | 三档均唯一进入 active 非本人 `finance`;无持有人或自审时阻断 | 已部署并完成生产规则只读解析;未创建真实报销 | 当前 Trellis task;构建 `a74cba1112e0` |
| 系统管理员无业务审批权 | PC/自动化 | 当前 active admin | 尝试审批测试单据 | 不允许仅凭 `admin` 审批 | 需按 WOUA-FIX 后账号重跑 | 后续新证据 |
| 财务复核与付款/导出 | PC/自动化 | 当前 active 财务角色账号 | 处理已批准测试单据 | 按财务与财务主管权限处理 | 需按 WOUA-FIX 后账号重跑 | 后续新证据 |
+1 -1
查看文件
@@ -108,7 +108,7 @@
- 缺直属主管、主管停用、主管链断裂或审批节点解析为申请人本人时,提交必须阻断并提示"未配置可审批人"或"当前审批规则未找到审批人"。
- 只有审批规则显式配置老板/总经理或兜底审批节点,且目标不是申请人本人时,才进入 `CEO` 或其他非本人兜底审批人。
- 不自动通过,不静默跳过,不用无条件升级 `CEO` 掩盖组织配置问题。
- 当前正式运行口径:`majianyong` 是公司负责人 `ceo` 且不配置直属主管;当前唯一 active `manager` 向其汇报。`wangshunli` 只承担系统开发/系统管理,不配置业务审批角色;`admin` 不代表业务审批权。CEO 本人报销目标由 active 非本人 `finance` 审批;本地候选已实现,部署和生产规则回填前保持阻断。
- 当前正式运行口径:`majianyong` 是公司负责人 `ceo` 且不配置直属主管;当前唯一 active `manager` 向其汇报。`wangshunli` 只承担系统开发/系统管理,不配置业务审批角色;`admin` 不代表业务审批权。生产规则已回填,CEO 本人三档报销均由唯一 active 非本人 `finance` 审批;无可用持有人或命中自审时仍阻断。
### W-2 转审适用范围
- 产品目标:转审是通用审批能力,目标覆盖报销、请假、采购、差旅。
+1 -1
查看文件
@@ -123,7 +123,7 @@
| `OALAUNCH1` | `issues/2026-05-23_16-49-39-oa-final-launch-readiness-v1.csv` | `EVIDENCE` | 历史最终启用门禁来源;真实业务闭环、连续 7 天、权限矩阵、备份恢复、数据治理培训、运营支持和 Day 7 人工决策要求仍可复用,但未来实际执行必须由新 Trellis task 承接。未取得新任务完整证据前不得宣布最终正式启用完成 |
| `OMAT1` | `issues/2026-05-23_17-20-00-oa-maturity-gap-review-v1.csv` | `CURRENT` | 当前成熟度缺口审查台账:按 MAGI 审视/执行/提升轮次调查 hyb-oa 是否成熟,并对标国内主流 OA/协同/低代码/财务/资产系统;已补充国内对标来源、小团队取舍原则、用户决策回填和成熟度证据视图;所有问题和建议先记录为待用户采纳、暂缓或否决,不直接改业务代码 |
| `OPOLICY1` | `issues/2026-05-24_01-20-52-oa-policy-system-alignment-v1.csv` | `CURRENT` | 当前制度与 OA 对齐合同:先调整外部制度包为小团队 V1,再回写 OA 事实源和启用门禁;制度参数、资料留存、用印台账、审批异常 SOP、制度签收和 P2 冻结进入 OALAUNCH1 数据治理门禁;现有合同台账、资产台账和公告能力可承载 V1,不立即做 schema 或业务代码改造 |
| `OAFLOW1` | `issues/2026-05-24_19-03-07-oa-owner-application-fallback-approval-v1.csv` | `CURRENT` | 负责人本人申请兜底机制仍有效,但当前人员职责已由用户修正:`majianyong` 是 `ceo` 且无直属主管,`wangshunli` 仅为系统开发/系统管理员,不参与正常业务审批;CEO 本人报销目标由 active 非本人 `finance` 审批。Trellis task `07-28-ceo-finance-fallback` 已完成本地候选实现与聚焦回归,支持 `finance|finance_mgr` 且默认 `finance`;尚未部署、生产 3 条启用规则尚未原子回填,因此当前公网仍阻断,不得把本地通过误读为生产已就绪 |
| `OAFLOW1` | `issues/2026-05-24_19-03-07-oa-owner-application-fallback-approval-v1.csv` | `CURRENT` | 负责人本人申请兜底机制仍有效:`majianyong` 是 `ceo` 且无直属主管,`wangshunli` 仅为系统开发/系统管理员,不参与正常业务审批。Trellis task `07-28-ceo-finance-fallback` 已部署构建 `a74cba1112e0` 并原子回填生产 3 条启用规则,支持 `finance|finance_mgr` 且默认 `finance`;CEO 三档只读解析均为唯一 active 非本人 `finance`,普通员工链保持目标结构,3 条脱敏审计已写入,未创建真实报销或写企业微信 |
| `OAFRONT6` | `issues/2026-05-25_12-29-03-oa-frontend-maturity-small-step-v1.csv` | `CURRENT` | 当前前端成熟化小步收口合同:承接 OAFRONT5 部署后 PC 硬问题清零和设计审计;路由标题修复、资产台账详情分区、移动视觉矩阵稳定等待、合同台账表单分组和长编号压缩均已实施部署,公网 PC 只读视觉矩阵复测 `PASS_PC_READONLY_VISUAL_READY` 且 `findingCount=0`;Portal 观察继续后置;本合同不写公网业务数据,不替代 OALAUNCH1 真实业务、备份恢复、7 天稳定化或 Go/No-Go |
| `OAKISS1` | `issues/2026-05-25_20-53-34-oa-business-flow-kiss-review-v1.csv` | `CURRENT` | 当前全业务流程 KISS 审查合同:按 MAGI 审视/执行/提升轮次,对报销/OCR、审批、采购/费用、合同/项目、付款/AP、票据池、资产、权限、移动/企微入口逐项做自动化和人工步骤审查;输出 KISS 建议台账,不直接改业务代码;OALAUNCH1 真实业务闭环、备份恢复、7 天稳定化和 Go/No-Go 仍是正式启用前硬门禁 |
| `PCDESIGN1` | `issues/2026-05-25_21-27-56-oa-pc-page-design-review-v1.csv` | `CURRENT` | 当前 PC 全页面设计审查合同:按 MAGI 审视/执行/提升轮次,以项目经理和设计总监视角盘点 45 条静态 PC 路由、A/B/C 页面分层、关键视觉矩阵和 KISS 建议;关键 PC 矩阵 `PASS_PC_READONLY_VISUAL_READY`,全静态路由扫描 `PASS_PC_STATIC_ROUTE_SCAN_READY`;建议优先收敛 HR/考勤边界、冻结模块入口、高密度 B/C 页默认视图和动态详情页证据,不直接改业务代码 |
+3 -3
查看文件
@@ -20,11 +20,11 @@
## 当前可信基线(2026-07-16)
- 最后有部署和公网复检证据的来源基线为 `df26922`;这是一条历史部署来源证据,未做当前公网只读检查时,不据此断言服务器此刻仍运行该提交。
- 当前本地 `main` 包含 7 月 P0 可信度修复和后续本地收口,尚未 push、部署或完成公网复检,不能视为线上已生效。
- 当前有部署和公网复检证据的来源基线为 `a74cba1112e0`;`/ready`、migration、runtime/external-deps smoke 和公网 bundle 均通过。
- 当前本地 `main` 已 push;生产 CEO 财务兜底规则回填完成。其他未取得本轮公网证据的历史任务仍按各自状态记录,不由此自动升级为已上线。
- 旧 OAOPS1 7 天真实试运行只有 Day 1–Day 4,后续中断,缺 Day 5–Day 7、现场人工业务闭环和 Day 7 Go/No-Go;归档只表示生命周期关闭,不代表目标完成。
- 下一轮真实连续试运行必须等待当前可信基线部署并完成公网复核,再新建 Trellis task,从新的 Day 1 连续启动。
- 当前 `07-28-ceo-finance-fallback` 已完成本地候选实现与聚焦验证:CEO 本人三档报销目标均为唯一 active 非本人 `finance`;尚未部署、生产规则尚未回填,因此不能据此宣布公网可用。
- `07-28-ceo-finance-fallback` 已部署构建 `a74cba1112e0` 并完成生产原子回填:3 条启用规则与 3 条脱敏审计写入成功,CEO 三档只读解析均为唯一 active 非本人 `finance`,普通员工链保持小/中额 `manager -> finance`、大额 `manager -> ceo -> finance`;未创建真实报销、未写企业微信。
## 历史事实源链(截至 2026-05)
+4 -4
查看文件
@@ -12,7 +12,7 @@
**OSMOKE1 OA-only smoke 账号治理**:企业微信账号数量有限时,不再为了 OA 报销、资产、财务、AP、合同或权限回归额外申请企业微信账号。企微测试账号只服务 HR/考勤链路;公网 OA 自动化使用 OA-only smoke 账号,允许不绑定企微,但必须在 OA 内保持 active、角色正确且可登录。企微/OA 一致性审计会把私有 env 中列出、显式员工号 allowlist 命中,或符合 `SMOKE*`/`smoke-*`/`oa-smoke-*`/测试命名的 OA-only smoke 账号归为 `oaOnlySmokeExempted`,不再当作“缺企微账号”归档;真实员工不得用该命名绕过一致性治理。恢复账号必须先 dry-run,真实修复必须 `--apply` 且设置 `OA_ONLY_SMOKE_REPAIR_APPLY=1`,不得重置密码、不得打印凭据、不得影响真实员工。
**OALAUNCH1 最终启用门禁**:ASSET1D 已完成资产台账公网部署、最小 UI 试录和 3 条脱敏 `EA-DOC` 受控导入;OAOPS1 自动巡检已具备公网只读证据,但正式启用前仍必须补齐真实业务闭环、权限矩阵、备份恢复演练、数据治理培训和 Day 7 Go/No-Go。新增 `scripts/qa/run-oa-final-launch-readiness.sh` 只聚合证据并输出 `PASS_OA_LAUNCH_READY`、`PASS_WITH_FINDINGS`、`PAUSED_MANUAL_CONFIRMATION` 或 `SKIP/BLOCKED_BY_EXTERNAL_CONFIG`;脚本不创建业务数据、不执行付款、不写企业微信、不做数据库恢复。未达到 `PASS_OA_LAUNCH_READY` 前,只能视为小团队稳定化收口中,不能宣布最终正式启用完成。
**OPOLICY1 制度与 OA 对齐口径**:公司制度包已裁剪为“小团队 V1”执行口径,原则是先做到能执行、能留痕、能追责。制度参数、资料留存、用印台账、审批异常 SOP、制度签收和 P2 冻结边界进入 OALAUNCH1 数据治理门禁;预算硬控、复杂招采、电子签章、完整电子档案系统、ERP/银行深集成和 AI 自动改规则不作为正式启用前置条件。
**OAFLOW1 负责人本人报销兜底审批**:当前业务负责人是 `majianyong`(`ceo`),不配置直属主管且不允许自审;`wangshunli` 仅承担系统开发和系统管理,不是业务审批人。用户确认 CEO 本人报销应由财务审批。`07-28-ceo-finance-fallback` 已在本地实现 `finance|finance_mgr` 兼容、新规则默认 `finance` 和三档 CEO 唯一 `finance` 快照,聚焦回归与前端构建通过;代码尚未部署、生产 3 条启用规则尚未回填,因此当前生产仍按旧 `finance_mgr` 配置阻断。不得用 `admin` 代批,也不得把系统管理员配置成假直属主管。
**OAFLOW1 负责人本人报销兜底审批**:当前业务负责人是 `majianyong`(`ceo`),不配置直属主管且不允许自审;`wangshunli` 仅承担系统开发和系统管理,不是业务审批人。`07-28-ceo-finance-fallback` 已部署并原子回填生产 3 条启用规则:三档负责人本人 fallback 均为 `finance`,CEO 三档只读解析均为唯一 active 非本人 `finance`;普通员工链保持小/中额 `manager -> finance`、大额 `manager -> ceo -> finance`。不得用 `admin` 代批,也不得把系统管理员配置成假直属主管。
## 1. 适用范围
- 适用于 `small_team_internal` 工作区模式。
@@ -32,7 +32,7 @@
- 正式审批组织口径:`majianyong` 配置为公司负责人 `ceo` 且不配置直属主管;`wangshunli` 仅配置系统开发/系统管理职责,不配置 `manager`、`ceo`、`finance` 或 `finance_mgr` 业务角色。
- 普通员工配置有效直属主管;当前唯一 active `manager` 的直属主管配置为 `majianyong`。不得把 `wangshunli` 放入正常业务汇报或审批链。
- `admin` 只代表系统管理权限,不代表业务审批权;需要业务审批时必须配置 `manager`、`ceo`、`finance`、`hr` 等正式业务角色。
- 缺直属主管、主管停用、主管链断裂或审批节点解析到申请人本人时,应先修正组织或审批规则,不要用管理员账号代批。CEO 本人报销只允许通过审批规则进入 active 非本人财务审批;本地代码已支持 `finance`,但部署和生产规则回填完成前仍保持阻断,不伪造成可用。
- 缺直属主管、主管停用、主管链断裂或审批节点解析到申请人本人时,应先修正组织或审批规则,不要用管理员账号代批。CEO 本人报销只允许通过当前已部署的审批规则进入 active 非本人 `finance` 审批;无可用持有人或命中自审时继续阻断。
5. 检查功能开关:
- 建议开启:`portal_home_v1`、企业微信入口相关开关、报销/OCR、审批待办、请假、项目基础能力和 `payment_batch_v1`。
- 按需开启:`announcements_v1`、`presence_board_v1`、`weekly_report_v1`、`employee_lifecycle_v1`、`hr_wecom_directory_sync_v1`、`todo_board_v1`、`global_search_v1`。
@@ -177,8 +177,8 @@ ORDER BY priority;
管理要求:
1. 本地候选代码允许 `owner_self_fallback_role = 'finance' | 'finance_mgr'` 或置空,新建规则默认 `finance`;生产尚未部署该候选,现有启用规则仍为旧 `finance_mgr` 配置,因此 CEO 本人报销继续阻断。
2. 部署通过后,必须在同一事务内把 3 条启用规则统一为 `finance` 收口:小/中额 `manager -> finance`,大额 `manager -> ceo -> finance`,三档 fallback 均为 `finance`;任一生产前置漂移则零写入停止。
1. 当前代码允许 `owner_self_fallback_role = 'finance' | 'finance_mgr'` 或置空,新建规则默认 `finance`;生产 3 条启用规则已统一为 `finance` 收口。
2. 当前生产链为小/中额 `manager -> finance`、大额 `manager -> ceo -> finance`,三档 fallback 均为 `finance`;后续变更仍必须原子执行,任一生产前置漂移则零写入停止。
3. 不得为省事把 `admin` 当业务审批角色,也不得仅为绕过阻断给财务人员附加超出实际职责的权限;优先按最小权限调整支持角色和规则。
4. 提交后系统保存审批快照;之后修改规则只影响新单,不回写历史流程。
5. 生产回填先在部署后的 server 容器内执行 `npm run apply:ceo-finance-fallback -- --dry-run --format=json`;只有结果为 `DRY_RUN_PASS`,才设置一次性写入确认开关并执行同一命令的 `--apply`。脚本只输出状态和计数,任一规则、角色、binding 或受保护计数漂移都会回滚。
+2 -2
查看文件
@@ -107,7 +107,7 @@ OA 中既有请假、补卡、外出、加班能力转为历史只读、镜像
### 2.4 OAFLOW1 负责人本人报销兜底审批
OAFLOW1 后,OA 主办的报销审批规则增加 `ownerSelfFallbackRole`。当公司负责人本人(当前为 `majianyong`,`ceo`)提交报销且直属主管节点无法解析时,系统应使用审批规则上的 active 非本人财务兜底替换第一层 `manager` 节点。用户确认目标审批人为现有 `finance`;`07-28-ceo-finance-fallback` 本地候选已支持 `finance|finance_mgr`,新建默认 `finance`,但尚未部署且生产规则尚未回填,所以当前生产仍必须阻断,不能宣称 CEO 本人报销已可用。规则只作用于新提交报销单,提交时保存 `workflow_steps_snapshot`,后续审批推进只读快照,不因之后修改审批规则而漂移。
OAFLOW1 后,OA 主办的报销审批规则增加 `ownerSelfFallbackRole`。当公司负责人本人(当前为 `majianyong`,`ceo`)提交报销且直属主管节点无法解析时,系统使用审批规则上的 active 非本人财务兜底替换第一层 `manager` 节点。`07-28-ceo-finance-fallback` 已部署并原子回填生产 3 条规则,当前目标审批人为现有 `finance`;代码兼容 `finance|finance_mgr`,新建默认 `finance`。规则只作用于新提交报销单,提交时保存 `workflow_steps_snapshot`,后续审批推进只读快照,不因之后修改审批规则而漂移。
执行边界:
@@ -115,7 +115,7 @@ OAFLOW1 后,OA 主办的报销审批规则增加 `ownerSelfFallbackRole`。当
- 不允许自审;若兜底角色也是申请人本人持有的角色,或没有 active 非本人持有人,提交必须阻断。
- 不支持 `admin` 作为负责人本人报销兜底角色;`admin` 仍只代表系统管理权限,不代表业务审批权。
- 当前首版只覆盖 OA 报销金额规则,不扩展到采购、合同、复杂 BPM 或自由流程。
- 本地候选允许 `ownerSelfFallbackRole=finance|finance_mgr` 或置空,并以 `finance` 为新建默认值;部署与生产规则原子回填完成前,负责人本人申请继续阻断。
- 当前允许 `ownerSelfFallbackRole=finance|finance_mgr` 或置空,并以 `finance` 为新建默认值;生产三档规则均已使用 `finance`,无 active 非本人持有人时继续阻断。
预期链路示例: