# 冻结版进度盘点与最小冒烟验收（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. 当前冻结版文档与实际测试结果一致
