Files
hms/docs/superpowers/specs/2026-05-20-v1-readiness-six-dimension-analysis.md

288 lines
11 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.
# HMS V1 发布就绪度 — 六维度全面均衡分析
> 日期: 2026-05-20 | 分支: feat/media-library-banner | 分析方法: 4 并行探索 + 6 专家组深度分析
## 综合评分: 6.3/10 (B-)
| 维度 | 评分 | 评级 | 趋势 | 核心发现 |
|------|------|------|------|---------|
| 架构 | **8.0** | A- | ↑ | 模块边界 9/10事件消费者幂等不统一缓存层薄弱 |
| 安全 | **7.5** | B+ | → | PII 加密企业级 9/10analytics 缺权限(HIGH),缺 HSTS/CSP |
| 前端 | **7.2** | B | ↑ | 64 页面全 lazy长者模式 100%,小程序零测试 |
| 产品 | **~7.0** | B | → | 核心流程完整6 模块冻结2 个 TODO 空实现 |
| 测试 | **5.5** | C+ | → | 990 测试但 Handler 0%,小程序 0中间件 0 |
| DevOps | **3.8** | D+ | ↑ | CD 缺失,备份不合规,无监控告警 |
---
## 一、架构维度 (8.0/10)
### 1.1 模块边界 — 优秀 (9/10)
- erp-core (L1) 零业务依赖,所有 L2 模块彼此零依赖erp-server (L3) 唯一组装点
- 8 个模块全部实现 ErpModule traitModuleRegistry 按拓扑排序启动
- 天然支持微服务拆分:只需将 EventBus 从进程内 broadcast 替换为消息队列
### 1.2 SQL 拼接风险 — 安全但有代码气味 (7/10)
| 位置 | 类型 | 风险 |
|------|------|------|
| `erp-plugin/src/host.rs:368` | advisory lock | NONE (纯数值) |
| `erp-plugin/src/host.rs:336-398` | 动态表名 | LOW (sanitize_identifier) |
| `erp-health/src/service/action_inbox_service.rs:240-353` | 硬编码条件 | NONE (编译时字面量) |
`sanitize_identifier()` 实现正确但缺长度限制PostgreSQL 63 字节标识符上限)。
### 1.3 事件系统 — 良好 (7.5/10)
- 31 事件类型 / 82 发布点 / 12 消费者模块 / Outbox + LISTEN/NOTIFY
- `consume_with_retry()` 提供幂等保证但实际未被消费者调用
- broadcast channel 容量 1024高并发下可能 lag30s 兜底轮询补偿)
### 1.4 缓存层 — 薄弱 (6.5/10)
- 仅有 Moka (权限缓存) + Redis (限流/session),无业务数据缓存
- 高频查询(菜单树、字典项、仪表盘统计)每次请求命中数据库
- 10x 用户增长时数据库连接池将成为瓶颈
### 1.5 架构 TOP 5 风险
1. **事件消费者未统一走 consume_with_retry** (MEDIUM) — 幂等保护不完整3-5d
2. **broadcast channel 容量有限** (MEDIUM) — 高并发丢事件2d
3. **缓存层薄弱** (MEDIUM) — 10x 扩展瓶颈5-8d
4. **action_inbox_service SQL 拼接** (LOW) — 代码气味0.5d
5. **迁移文件过多(156个)** (LOW) — 维护成本3d
---
## 二、安全维度 (7.5/10)
### 2.1 认证与授权 — 优秀 (8.5/10)
- JWT: HS256 + 15min access / 7d refresh + SHA-256 存储 refresh token
- 原子性刷新: `validate_and_revoke_atomic()` 防止 TOCTOU 竞态
- 密码: Argon2 + 随机 salt
- 权限守卫: 444 处 `require_permission()` 调用64 个 handler 文件
- 多租户: 双层隔离(应用层 tenant_id + PostgreSQL RLS
### 2.2 PII 加密 — 优秀 (9/10)
- KEK/DEK 分层 + AES-256-GCM + 盲索引 (HMAC-SHA256)
- 生产环境强制 KEK 配置(`debug_assertions` 下 dev_default 会 panic
- 支持租户级密钥轮换 API
### 2.3 API 安全 — 优秀 (9/10)
- 5 层 rate limiting: IP登录(5/min) + IP刷新(30/min) + 用户API(300/min) + 网关(60/min) + 账户锁定(5次/15min)
- 文件上传: 白名单 + Magic bytes + 大小限制 + UUID 文件名 + 租户隔离
- CORS: 生产环境拒绝通配符
### 2.4 安全 TOP 5 风险
1. **Analytics batch 端点缺权限校验** (HIGH) — CVSS 5.31h
2. **日志 PII 脱敏不完整** (MEDIUM) — secret_len 泄漏 + service 层未脱敏4h
3. **缺少 HSTS + CSP 安全头** (MEDIUM) — CVSS 3.12h
4. **插件 sanitize_identifier 缺长度限制** (MEDIUM) — 8h
5. **SSE token 通过 URL query parameter** (LOW) — 日志泄漏风险4h
---
## 三、前端维度 (7.2/10)
### 3.1 Web 前端 — 良好 (7.5/10)
- 316 TS/TSX 文件54 API 模块5 Zustand stores76 权限码
- **64 个路由页面全部 React.lazy()** — 最佳实践
- 6 个 manualChunks 分包sourcemap 生产关闭
- 10 处生产 `any`7 处在 points.ts 可修复)
- 最大文件 AdminDashboard.tsx 730 行(无超 800 行)
- 62 个测试文件,以 API 契约测试为主
### 3.2 小程序 — 良好但零测试 (7.0/10)
- 59 页面12 主包 + 47 子包34 组件38 service 文件
- 并发安全架构完善: ConcurrencyLimiter(12) + safeNavigateTo + requestUnlimited
- Design Token: 40+ CSS 变量93 SCSS 文件全量接入
- 长者模式: 58/58 页面 100% 覆盖
- **零单元测试** — MCP 自动化审计 96.2% 通过率但只覆盖可达性
### 3.3 前端 TOP 5 风险
1. **小程序零单元测试** (CRITICAL) — 161 文件无测试2-3d
2. **i18n 未实际使用** (HIGH) — 2,298 处硬编码中文3-5d
3. **生产 any 10 处** (MEDIUM) — points.ts 7 处可修复0.5d
4. **a11y 基本缺失** (MEDIUM) — 仅 9 处 aria-/role2-3d
5. **BLE 模块 any 密集** (LOW) — 14 处1d
---
## 四、测试维度 (5.5/10)
### 4.1 测试分布
| 层级 | 测试数 | 覆盖率 |
|------|--------|--------|
| 后端单元 | 802 | Service/DTO 覆盖较好 |
| 后端集成 | 188 | 24 个测试文件 |
| **Handler** | **~2** | **2.8% (2/72 文件)** |
| **安全中间件** | **1** | **20% (1/5)** |
| Web 前端 | 61 文件 | 页面覆盖率 20.8% |
| 小程序 | **0** | **0%** |
| E2E | 17 Web + 4 MP | 核心流程 |
### 4.2 测试密度(测试/1K行代码
| Crate | 密度 | 评价 |
|-------|------|------|
| erp-core | 28.1 | 优秀 |
| erp-message | 20.2 | 优秀 |
| erp-config | 15.3 | 良好 |
| erp-health | **4.9** | 不足 |
| erp-server | **0.7** | 严重不足 |
### 4.3 测试 TOP 5 风险
1. **Handler 层 0% 覆盖** (CRITICAL) — 72 个文件无测试2-3d
2. **小程序 0 测试** (CRITICAL) — 161 文件无测试2d
3. **安全中间件 0 测试** (HIGH) — rate_limit/tenant_rls/frozen_module1.5d
4. **erp-health 28/57 service 无测试** (HIGH) — 核心业务模块3-4d
5. **CI 不覆盖 E2E/小程序** (MEDIUM) — 1.5d
---
## 五、DevOps 维度 (3.8/10)
### 5.1 CI — 良好 (7/10)
- 双平台 CI: GitHub Actions (5 阶段后端 + 4 阶段前端) + Gitea CI (4 jobs)
- Rust 缓存 (Swatinem/rust-cache) + pnpm 缓存
- Clippy 0 警告强制 + cargo audit
### 5.2 CD — 缺失 (0/10)
- 无自动化部署流程
- 无 Docker 镜像版本 tag 策略
- 无蓝绿/金丝雀部署
### 5.3 监控 — 仅 exporter (4/10)
- Prometheus 指标: http_requests_total, http_request_duration, db_pool, eventbus_pending
- 3 级健康检查: /health, /health/live, /health/ready
- **无 Prometheus Server / Grafana / 告警 / 日志聚合 / 分布式追踪**
### 5.4 备份 — 不合规 (3/10)
- 每日 pg_dump + 7 天保留
- **无加密、无异地存储、无 PITR、无恢复测试**
- 医疗数据合规要求: RPO < 1h, 保留 >= 5 年
### 5.5 DevOps TOP 5 风险
1. **无 CD 能力** (CRITICAL) — 发布完全手动3-5d
2. **备份不满足医疗合规** (CRITICAL) — 无加密/异地/PITR5-8d
3. **无监控告警** (HIGH) — 生产盲飞3-5d
4. **迁移在启动时自动执行** (HIGH) — 破坏性 DDL 风险3-5d
5. **安全审计不阻止合并** (MEDIUM) — continue-on-error: true2-3d
---
## 六、产品维度 (~7.0/10)
### 6.1 功能完整性
- 核心流程完整: 患者建档 → 健康数据 → 预约 → 随访 → AI 分析
- 管理员流程完整: 用户管理 → 角色权限 → 数据字典 → 系统配置
- 6 个冻结模块: care-plans, shifts, family-proxy, medications, dialysis, dialysis-prescriptions, schedules
- 2 个 TODO 空实现: ActionDetailDrawer、PendingTasks
### 6.2 wiki 数据校准
| 指标 | wiki | 实际 | 差距 |
|------|------|------|------|
| Rust 源文件 | 652 | 694 | +42 |
| 后端路由 | 260+ | 376 | +116 |
| 权限码 | 132 | 140 | +8 |
| Git 提交 | 862 | 927+ | +65 |
| Web TS/TSX | 307 | 316 | +9 |
| 小程序 TS/TSX | 161 | 167 | +6 |
| API 服务文件 | 28 | 54 | +26 |
| utoipa 注解 | 89 | 94 | +5 |
| "待修复"条目 | 4 | 0 (全已修复) | 需标记 |
---
## 七、V1 发布策略(多专家组辩论共识)
### P0 阻塞项4 天)— 不完成不发布
| # | 行动项 | 维度 | 工作量 |
|---|--------|------|--------|
| A1 | Analytics batch 添加权限校验 | 安全 | 1h |
| A2 | HSTS + CSP + Permissions-Policy 安全头 | 安全 | 2h |
| A3 | 数据库备份加密 + 异地存储 | DevOps | 3d |
| A4 | Nginx TLS 配置模板 | DevOps | 0.5d |
| A5 | 迁移回滚策略文档 + 脚本 | DevOps | 1d |
### P1 测试加固3 天)— 强烈建议
| # | 行动项 | 维度 | 工作量 |
|---|--------|------|--------|
| A6 | 安全中间件 unhappy path 测试 (~15个) | 测试 | 1.5d |
| A7 | 核心 Handler 测试 (~40个) | 测试 | 1.5d |
### P2 V1.1 推迟项(~30 天)
| # | 行动项 | 维度 | 工作量 |
|---|--------|------|--------|
| B1 | Prometheus + Grafana 监控 + 告警 | DevOps | 3d |
| B2 | CD Pipeline (GitHub Actions) | DevOps | 5d |
| B3 | 小程序最小测试套件 | 测试 | 2d |
| B4 | 事件消费者统一 consume_with_retry | 架构 | 5d |
| B5 | 日志 PII 脱敏审查 | 安全 | 4h |
| B6 | 生产迁移策略(独立步骤) | DevOps | 2d |
| B7 | CI 安全审计阻止合并 | DevOps | 0.5d |
| B8 | 菜单树/字典项缓存 | 架构 | 3d |
| B9 | Web a11y 基础合规 | 前端 | 2-3d |
| B10 | points.ts any 类型修复 | 前端 | 2h |
### GO/NO-GO 硬底线
以下任一条件不满足即 NO-GO
1. 多租户数据隔离验证通过(无跨租户泄漏)
2. 核心用户流程端到端可用(建档→录入→预约→随访)
3. 数据库备份可成功恢复(至少一次恢复测试)
4. Analytics 越权已修复
5. 迁移失败有回滚方案
---
## 八、关键数字校准表wiki 更新用)
| 指标 | 当前 wiki | 应更新为 |
|------|-----------|---------|
| Rust 源文件 | 652 | 694 |
| 后端路由 | 260+ | 376+ |
| 权限码 | 132 | 140 |
| Git 提交 | 862 | 927+ |
| Web TS/TSX | 307 | 316 |
| 小程序 TS/TSX | 161 | 167 |
| Web API 服务文件 | 28 | 54 |
| 小程序组件 | 10 | 34 |
| 小程序 Service 文件 | 10+ | 38 |
| utoipa 注解文件 | 89 | 94 |
| Web 冻结路由 | 5 | 6 |
| 后端测试函数 | 943 | 990+ |
| 系统评分 | 6.8/10 (B) | 6.3/10 (B-) |
| 症状导航待修复 | 4 项 | 0 项(全已修复) |
---
## 附录: 分析方法论
- **阶段 1**: 4 个并行探索 Agent后端架构 / 前端+小程序 / 数据库+安全 / V1 就绪度)
- **阶段 2**: 6 个专家组深度分析(架构师 / 安全工程师 / 测试工程师 / 前端专家 / SRE / 产品经理)
- **阶段 3**: 多专家组辩论会议4 个议题:发布范围 / 测试策略 / DevOps 优先级 / 技术债务取舍)
- **总工具调用**: 400+ 次Grep/Glob/Read/Bash 跨 10 个 Agent
- **总分析时长**: ~15 分钟(并行执行)