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