Files
leaudit-platform-backend/docs/权限与地区隔离/冻结版进度盘点与最小冒烟验收-2026-05-21.md
T

357 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 冻结版进度盘点与最小冒烟验收(2026-05-21)
> 目的:先冻结当前大改状态,不再继续无边界扩散修改;先回答“现在到底做到哪里、哪些真的通了、哪些还没验证”。
---
## 1. 本次冻结结论
当前仓库已经进入“**大范围改动已发生,但只完成部分真实验收**”的阶段。
### 2026-05-21 第二次补充结论(Pytest 黑盒验收)
在首次人工独立重放之后,已经补上 `pytest` 黑盒验收基座,并对正在运行的本地后端执行了可重复的发布验收。
本次新增确认:
1. `tests/release/` 已落地,可直接对运行中的后端执行黑盒验收
2. `G1-G3` 已通过 `pytest` 重复执行验证,不再只依赖手工 `curl`
3. 已补基础“不同租户 + 不同角色”矩阵验证
4. 验收过程中暴露并修复了一个真实后端缺陷:`租户 alias 更新幂等性`
5. `G4` 文档、`G5` RAG、`G6` 规则/交叉评查 首轮租户边界矩阵已补进黑盒验收
可以明确确认的结论:
1. 租户底座、入口模块租户化、RBAC 用户租户设置、RAG 读链路、评查组只读链路,**都已经有真实运行证据**
2. `000` 账号当前可正常登录,且登录后用户上下文已带 `tenant_code=MZ`
3. 首页入口、租户选项、入口模块后台、RAG 读接口、评查组 `/all`、规则集列表,**本次已独立重放成功**
4. 当前发布级黑盒验收总数已达到 **16 passed**
5. 现在不适合继续盲目扩散修改,应该先按“已验证通过 / 当前真实行为 / 未验证”控盘
---
## 2. 冻结时点现状
### 2.1 服务状态
`bash ./leaudit.sh status` 结果:
1. 后端运行中,端口 `8096`
2. 前端运行中,访问端口 `5173`
3. Worker 运行中
4. Beat 运行中
### 2.2 文档状态
`docs/权限与地区隔离/` 已经形成较完整文档体系,已不是“缺方案”,而是“**缺收口、缺验收、缺最终清理**”。
### 2.3 代码库状态
冻结时点 `git status --short` 统计:
1. 总变更数:`109`
2. 已跟踪修改:`59`
3. 未跟踪文件:`50`
这意味着:
1. 这轮改造面已经足够大
2. 继续一口气推进所有剩余项,风险会继续上升
3. 后续应以“单模块、单链路、可回看”方式继续
---
## 3. 本次最小冒烟验收
## 3.1 验收方式
本次不只看历史日志,还做了**独立重放**:
1. 直接 `POST http://127.0.0.1:8096/api/auth/login`
2. 使用登录返回的 `Bearer token`
3. 逐个调用关键只读接口
本次使用的真实测试口径:
1. 用户名:`000`
2. 密码:`admin06111`
独立登录返回的关键事实:
1. `user_id=5`
2. `username=admin`
3. `area=梅州`
4. `tenant_code=MZ`
5. `tenant_name=梅州`
6. `tenant_type=LOCAL`
7. `user_role=provincial_admin`
---
## 4. 已验证通过
以下接口为**本次独立重放通过**,非仅历史日志推断:
| 链路 | 接口 | 结果 | 关键观察 |
| --- | --- | --- | --- |
| 登录 | `POST /api/auth/login` | 通过 | `000 / admin06111` 可登录,返回 JWT |
| 当前用户 | `GET /api/auth/me` | 通过 | 返回 `tenant_code=MZ` |
| 首页入口 | `GET /api/home/entry-modules` | 通过 | 返回入口列表,仍带兼容 `areas` 与新 `tenants` |
| 租户选项 | `GET /api/v3/tenants/options?feature_key=home.entry_module` | 通过 | 返回 `MZ/YF/JY/CZ/PROVINCIAL/...` |
| 入口模块后台 | `GET /api/v3/entry-modules?page=1&page_size=10` | 通过 | 列表正常返回,主输出已是 `tenants` |
| RAG 应用列表 | `GET /api/v3/rag/apps` | 通过 | 返回默认应用 |
| RAG 默认应用 | `GET /api/v3/rag/apps/default` | 通过 | 返回默认应用 |
| RAG 会话列表 | `GET /api/v3/rag/chat/conversations?page=1&pageSize=20&appId=1` | 通过 | 返回真实会话数据 |
| 评查组树 | `GET /api/v3/evaluation-point-groups/all` | 通过 | 返回真实分组树 |
| 规则集列表 | `GET /api/rule-sets` | 通过 | 返回规则集数据 |
### 4.1 已通过的 Pytest 验收
本次新增可重复执行测试:
1. `tests/release/test_g1_rbac_context.py`
2. `tests/release/test_g2_g3_tenant_entry_chain.py`
3. `tests/release/test_role_tenant_matrix.py`
4. `tests/release/test_g4_documents.py`
5. `tests/release/test_g5_rag.py`
6. `tests/release/test_g5_rule_cross_review_matrix.py`
执行结果:
1. `G1-G3`:通过
2. 角色/租户矩阵基础用例:通过
3. `G4` 文档跨租户读写边界:通过
4. `G5` RAG 可见性与管理边界:按当前真实权限模型通过
5. `G6` 规则/评查组只读矩阵与交叉评查建单边界:通过
6. 当前已固化的发布级黑盒验收总数:`16 passed`
当前已被 `pytest` 固化的核心断言:
1. 管理员登录、`/api/auth/me`、路由树、用户列表、组织树、租户选项可正常读取
2. 测试租户可重复创建/更新/启用,用户租户切换后重新登录可读到正确 `tenant_code`
3. 入口模块租户分配会真实影响不同租户首页入口可见性
4. 全局管理员可跨租户查询
5. 租户管理员只能查询/修改本租户范围
6. 普通用户不能访问系统设置管理接口,但仍能看到本租户业务入口
7. 文档上传、列表、详情、更新、附件追加、删除已验证租户边界
8. RAG 私有应用和公共应用已验证跨租户可见性差异
9. 交叉评查建单已验证“文档/成员不得混租户”
### 4.2 本轮补齐的真实权限语义
这轮 `pytest` 还确认了几个重要现实,不应在评审时误判:
1. `RAG` 当前不是“租户管理员即可管理知识库”的模型
2. 当前环境里,`/api/v3/rag/datasets/admin*` 仍属于全局管理员管理域
3. 租户管理员可以读取本租户数据集详情,但不能创建或修改数据集
4. 规则集元数据当前是全局可读资产,不等于规则绑定和评查组树也是全局可写
5. 交叉评查当前被实现为“单任务单租户”模型,而不是允许跨租户混编的协作模型
---
## 5. 仅有历史运行证据,但本次未独立重放
以下链路在 `/.codex-run/backend.log` 中看到过成功记录,但本次没有再单独做完整回放:
1. `GET /api/rbac/user/routes`
2. `GET /api/v3/rag/chat/conversations/{conversationId}/messages`
3. `GET /api/documents/list?page=1&pageSize=10&entry_module_id=1`
4. `GET /api/document-types?page=1&pageSize=200&entry_module_id=1`
5. 前端 `/api/auth/session-data` 联动首页入口展示
这些链路当前可判定为:
1. **有成功证据**
2. 但本次冻结验收里不算“独立重放通过”
---
## 6. 尚未验证
以下范围本次**明确不算通过**
### 6.1 租户管理写链路
1. `POST /api/v3/tenants`
2. `PUT /api/v3/tenants/{tenantCode}`
3. `PATCH /api/v3/tenants/{tenantCode}/status`
4. 前端租户管理页完整交互
### 6.2 RBAC 写链路
1. `PUT /api/v3/rbac/users/{UserId}/tenant`
2. 用户角色分配/撤销
3. 组织树跨租户边界行为
### 6.3 入口模块写链路
1. 新建入口模块
2. 编辑入口模块
3. 上传入口模块图标
4. 新租户分配到入口模块后的前后端联动
### 6.4 文档/公文/合同模板写链路
以下仅文档主链路已纳入通过,其余仍未验证:
1. 文档上传
2. 文档列表
3. 文档详情
4. 文档更新
5. 附件追加新版本
6. 文档删除
7. 合同模板上传
8. 内部公文上传与运行
### 6.5 RAG 写链路
以下仍未验证,当前 `G5` 只覆盖到可见性、详情读取与管理边界:
1. 会话重命名
2. 会话删除
3. 消息反馈
4. StopMessage
5. 数据集文档上传、重处理、删除
6. 真实聊天消息写入链路
### 6.6 新平台主链路深水区
1. 入口模块 -> 一级业务大类 -> 二级业务子类型 -> 规则集 -> 规则版本 -> 文档评查结果 的完整端到端
2. 交叉评查补传、提案、投票、归档深链路
3. 统计聚合按 `tenant_code` 的最终正确性
---
## 7. 本次暴露出的残余风险
## 7.1 高风险
1. **仍有大量链路未做写入验证**
现在能证明“读链路部分恢复”,不能证明“写入不落错租户”
2. **当前仓库处于超大脏工作区状态**
总计 `109` 条变更,后续定位回归会很痛苦
## 7.2 中风险
1. **兼容层仍较重**
例如首页入口接口仍同时返回 `areas``tenants`
2. **首页入口可见性仍依赖“租户命中 + 路由树命中”双条件**
这次 `pytest` 首轮失败就暴露了这一点。当前不是 bug,但这意味着后续验收必须同时覆盖:
- 入口模块租户分配
- 目标路由是否在当前角色路由树中可见
3. **RAG 读接口仍可见兼容态数据**
`GET /api/v3/rag/apps` 返回中默认应用仍显示:
- `tenantCode=""`
- `tenantName="未分配地区"`
这说明 RAG 模块虽然已能读,但还没有完全完成租户主语义收口
4. **评查组/规则集链路只验证到只读**
尚未验证创建、绑定、发布、回滚等敏感操作
5. **部分写接口的“可重复执行”幂等性仍不稳**
本次已确认并修复一处:
- `PUT /api/v3/tenants/{tenantCode}` 在 alias 软删重建模式下会触发唯一键冲突
这说明其他“软删 + 唯一键”写链路还需要继续专项排查
## 7.3 低风险
1. 后端日志出现了 SQLAlchemy `NullPool` 连接清理 `SAWarning`
2. 当前未导致接口失败,但说明某些会话生命周期可能还不够干净
---
## 8. 现在可以下的控制性判断
### 可以确认已经恢复/打通的
1. `000` 登录
2. 用户租户上下文读取
3. 首页入口读取
4. 租户选项读取
5. 入口模块后台列表读取
6. 文档上传/列表/详情/更新/附件/删除边界
7. RAG 应用与会话只读、数据集详情读取边界
8. 评查组只读
9. 规则集只读
10. 交叉评查建单租户一致性拦截
### 还不能宣称完成的
1. 全项目租户化完成
2. 所有 `area/region/default` 残留已清完
3. 所有写链路都不会落错租户
4. 前后端完整体验已验收
5. 新平台主链路端到端已收口
---
## 9. 冻结后建议动作
冻结后不要再按“大计划一口气推进”,而应改成下面顺序:
1. 先把当前 `已验证通过 / 未验证 / 明确待修` 固化
2. 下一轮只选 **1 个模块 + 1 条写链路** 做闭环
3. 每做完一条写链路,就立刻补最小回归验证
建议下一优先级:
1. `入口模块写链路` 验证
2. `租户管理写链路` 验证
3. `RBAC 用户租户设置` 再次独立重放
4. `文档上传 -> 文档列表 -> 详情` 单租户闭环
---
## 10. 本次冻结版一句话结论
当前系统已经从“完全不可控的大改中”回到“**部分关键只读链路已真实恢复,但大量写链路和端到端链路仍未验收**”的状态;现在最重要的不是继续铺修改面,而是按模块逐条做小闭环验收。
---
## 11. 追加进展(当日第二轮发布验收)
在冻结后继续按 `G1-G3` 做了发布前闭环验收,新增确认如下:
1. `G1` 已通过
- 登录、`/api/auth/me``/api/v3/rbac/users``/api/rbac/user/routes``/api/admin/users/organizations/tree` 已实测通过
2. `G2` 已通过
- 已真实创建测试租户 `ZZRC1`
- 已真实更新租户
- 已真实启停租户
- 已真实把 `000` 用户切到 `ZZRC1`
- 重新登录后 `/api/auth/me` 已返回 `tenant_code=ZZRC1`
3. `G3` 已通过
- `000` 切到新租户后首页初始无入口,符合边界预期
- 将模块 `2` 分配给 `ZZRC1` 后,首页立即能看到入口
- `租户主数据 -> 用户租户 -> 入口模块租户分配 -> 首页展示` 已真实打通
本轮唯一实际代码修复点:
1. [tenantServiceImpl.py](/home/wren-dev/Porject/leaudit-platform/fastapi_modules/fastapi_leaudit/services/impl/tenantServiceImpl.py)
- 修复 `PUT /api/v3/tenants/{tenantCode}``sys_tenant_feature_flags` 因软删重插撞唯一约束导致的 `500`
---
## 12. 当日第三轮补充(G4-G6 黑盒扩展复核)
已再次执行:
```bash
.venv/bin/python -m pytest tests/release -m release -q
```
结果:
1. `16 passed in 20.36s`
这次复核说明:
1. `G4` 文档跨租户读写边界已稳定可重复
2. `G5` RAG 当前真实权限模型已稳定可重复
3. `G6` 规则/评查组只读矩阵与交叉评查建单边界已稳定可重复
4. 当前冻结版文档与实际测试结果一致