# 更新日志
本项目所有重要变更都会在此文件中记录。
格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
本项目遵循 [语义化版本规范](https://semver.org/lang/zh-CN/spec/v2.0.0.html)。
## [0.3.0] - 2026-07-04
### 概览
本次发布聚焦于**安全加固**与**依赖精简**:移除 confers 集成与 CLI 工具以收敛职责边界,缓存底座切换至 oxcache 0.3.2,修复 diting 安全审计 10 项发现与 kueiku FMEA 分析 5 项 Bug。共计 2057 个测试全部通过。
#### BREAKING 变更 ⚠️
1. **移除 confers 集成** — 删除 6 个特性:`validation`、`schema`、`watch`、`audit`、`hot-reload`、`cli`。如需 confers 能力,用户在自身代码中集成。
2. **移除 CLI 工具** — 删除 `src/main.rs` 与 `src/cli/` 目录,`cli` 特性不再存在。
3. **缓存底座从 dashmap 切换至 oxcache 0.3.2** — `DashMapCache` 现为 `OxcacheSyncCache` 的类型别名(由 oxcache 的 `DashMapMemoryBackend` 支撑),内部所有 `DashMap` 用法替换为 `Mutex<HashMap>` 或 `RwLock<HashMap>`。
4. **移除 dashmap 依赖** — 不再出现在 Cargo.toml。
5. **ServerConfig 默认值变更** — `DEFAULT_HOST` 从 `"0.0.0.0"`(fail-open,绑定所有网卡)改为 `"127.0.0.1"`(fail-safe 回环)。`Default` 实现改用常量:host="127.0.0.1"、port=8080、request_timeout_secs=30。
6. **JWT 密钥强制最小 32 字符** — `MIN_SECRET_LENGTH=32` 常量现已实际用于校验,短于 32 字符的密钥将被拒绝并返回错误。
7. **CORS 校验收紧** — `"http://"`(仅 scheme 无 host)在 `validate()` 与 `build_cors_layer()` 中均被拒绝。
8. **AppConfigBuilder::build() 一致性修复** — 未设置 `timeout` 字段时默认填充 `Some(TimeoutConfig::default())`,与 `AppConfig::default()` 行为一致。
#### 安全修复(diting 审计 — 10 项)
- **HIGH-001**:缓存 `key_index`/`backend` 一致性竞态 — 现在在整个 backend 操作期间持有 index 锁
- **HIGH-002**:缓存静默吞错 — backend 错误现通过 `log::warn!` 记录,不再 `let _ =`
- **MED-001**:websocket 中 `RwLock` 中毒 — 所有 `.write().unwrap()`/`.read().unwrap()` 替换为感知中毒的 `match`/`if let Ok(...)` 模式
- **MED-002**:`regex_cache.rs` 与 `validation.rs` 中 `Mutex` 中毒 — 同样替换为感知中毒模式
- **MED-003**:`init_all_plugins` 中 `Mutex` 中毒 — `routes.lock().unwrap().len()` 替换为 `.lock().map(|g| g.len()).unwrap_or(0)`
- **MED-004**:CORS validate 不一致 — 在 scheme 校验后新增 host 校验
- **LOW-001**:`ServerConfig` fail-open 默认值 — 已修复(见 BREAKING 第 5 项)
- **LOW-002**:JWT 密钥无最小长度 — 已修复(见 BREAKING 第 6 项)
- **LOW-003**:WebSocket 认证文档告警 — 新增 Security Warning 文档注释
- **LOW-004**:`SecurityHeaders::relaxed()` CSP 告警 — 新增 Security Warning 文档注释
#### Bug 修复(kueiku FMEA 分析 — 5 项)
- **BUG-1 [严重]**:`remove_connection` usize 下溢 — 现先检查 `map.remove(id).is_some()` 再 `fetch_sub(1)`,防止 `usize::MAX` 下溢导致所有新连接被永久阻塞
- **BUG-2 [低]**:`check_and_record` 窗口重置 off-by-one — 窗口重置时计数设为 1(非 0),当前消息被计入(原先每窗口允许 max+1 条消息)
- **BUG-3 [中]**:`AppConfigBuilder::build()` timeout 不一致 — 已修复(见 BREAKING 第 8 项)
- **BUG-4 [中]**:缓存 backend 容量驱逐后 `key_index` 成为超集 — `find_keys_by_pattern` 现通过 `backend.exists()` 过滤并惰性清理过期索引项
- **BUG-5 [低]**:`get_stats` 静默丢弃浮点统计 — 现尝试 u64 → f64(rate/ratio/pct ×100)→ `log::warn!`(不再静默)
#### 依赖变更
- **新增**:`oxcache = { version = "0.3.2", features = ["memory"] }`(来自 crates.io)
- **移除**:`dashmap`、`confers`、`schemars`、`clap`、`tera`、`walkdir`
- **移除特性**:`validation`、`schema`、`watch`、`audit`、`hot-reload`、`cli`
#### 从 v0.2.0 迁移
1. 若使用 `cli` 特性或 `src/main.rs` 二进制,需在应用层自行实现 CLI
2. 若依赖 `confers` 特性(validation/schema/watch/audit/hot-reload),需在自身代码中直接集成 confers
3. `DashMapCache` 类型仍可编译(为 `OxcacheSyncCache` 别名),但底层实现已变更
4. `ServerConfig::default()` 现绑定 `127.0.0.1`,生产部署需显式配置 host
5. JWT 密钥若短于 32 字符将被拒绝,请更新密钥
#### 测试
- ✅ 2057 个测试全部通过(0 失败)
- ✅ clippy 零警告零错误
---
## [0.2.0] - 2026-07-04
### 概览
本次重大更新包含 Phase 1 架构改进(统一注册系统、配置管理重构、安全模块增强、缓存系统优化)、MCP SDK 迁移、OpenAPI 自动生成、文件拆分、代码质量清理(specmark code-quality-cleanup),以及性能基准文档。
#### BREAKING 变更 ⚠️
**MCP SDK 迁移(mcp-sdk 0.0.3 → rmcp 0.16):**
- 移除 `mcp-sdk = "0.0.3"` 依赖,新增 `rmcp = { version = "~0.16", features = ["server"] }`
- 移除 `initialize` 握手流程,改用 `server/discover` 端点(适配 MCP 2026-07-28 规范)
- 新增 `StatelessServerHandler` 无状态适配层,实现 `rmcp::ServerHandler` trait
- `RouteRegistration::register_mcp` 签名从 `fn register_mcp(&self, server: &mut Server)` 改为 `fn register_mcp(&self, registry: &mut dyn McpToolRegistry)`
- 新增 `Mcp-Method` 和 `Mcp-Name` HTTP 头解析(`parse_mcp_headers`)
- 新增 `cache_semantics` 模块处理 `ttlMs` 和 `cacheScope` 字段
- 新增 Multi Round-Trip Requests (MRTR) 支持,`MrtrSessionManager` 管理 300 秒超时会话
**配置验证统一:**
- `AuthConfig`、`ServerConfig`、`AppConfig` 的 `ValidateConfig` trait 实现委托给 inherent `validate()` 方法,消除双实现行为分叉
#### 新增特性
**统一注册系统:**
- 新增 `define_registration!` 宏,消除协议模块重复代码
- 新增 `Registration` trait,提供统一的协议注册接口
- HTTP、MCP、WebSocket、gRPC 四大协议模块全面采用统一注册系统
- 编译时协议选择,未使用的协议零编译代码
**OpenAPI 自动生成(新 `openapi` feature):**
- 基于 utoipa 5.5.0 生成 OpenAPI 3.1 规范
- `#[service_api]` 宏在 `openapi` 特性启用时自动通过 `inventory::submit!` 注册 `OpenApiRouteInfo`
- 新增 `OpenApiBuilder` 链式构造器(`new().title().version().description().build()`)
- 新增 `generate_openapi_spec()` 函数收集所有注册路由生成完整规范
- 宏使用 `#[cfg(feature = "openapi")]` 门控,未启用时零运行时开销
**OpenAPI 路径参数自动映射:**
- `#[service_api]` 宏自动提取路径参数(如 `/users/:id`)并生成 OpenAPI 参数条目
- 新增 `rust_type_to_openapi_schema()` 将 Rust 基本类型映射到 OpenAPI (type, format) 对
- 新增 `OpenApiPathParam` 类型,通过 `OpenApiRouteInfo::with_path_params()` 注册
- 宏生成 `#[cfg_attr(feature = "openapi", utoipa::path(...))]` 属性,支持 utoipa 工具链发现
**配置管理:**
- 新增模块化配置文件:`app.rs`、`cache.rs`、`security.rs`
- 新增 Builder 模式支持,提供更友好的 API
- 新增集中式默认值管理
- 新增配置验证功能(需启用 `validation` feature)
**安全增强:**
- 新增 API Key 版本管理功能
- 新增 LRU 缓存管理器,防止内存增长
- 新增密钥轮换审计日志
- 新增密钥过期检查机制
**缓存优化:**
- 新增 `canonicalize_cache_key()` 键规范化函数
- 新增 `invalidate(pattern: &str)` 模式匹配失效
- 新增 `find_keys_by_pattern()` 正则表达式匹配
- 新增 `get_stats()` 统计信息跟踪
- 新增 `delete_many()` 批量删除操作
#### 文件拆分(降低单文件复杂度)
**Phase 1 拆分:**
- `src/mcp/mod.rs` 拆分为 `server.rs`、`handler.rs`、`stateless.rs`、`headers.rs`、`cache_semantics.rs`、`mrtr.rs`、`protocol.rs` + `tests/`(mod.rs 从 800+ 行降至 200 行)
- `src/websocket/mod.rs` 拆分为 `connection.rs`、`handler.rs`、`broadcast.rs`、`message.rs` + `tests/`(mod.rs 从 2742 行降至 69 行)
- `src/core/error/mod.rs` 拆分为 `api_error.rs`、`i18n.rs`、`context.rs`、`sdforge_error.rs` + `tests/`(mod.rs 从 800+ 行降至 23 行)
**代码质量清理拆分(specmark code-quality-cleanup):**
- `src/security/audit.rs` (2210 行) → `audit/mod.rs` + `audit/tests/`(54 audit_logger + 10 builder 测试)
- `src/security/bearer.rs` (2107 行) → `bearer/mod.rs` + `bearer/tests/`(71 bearer_auth + 11 builder 测试)
- `src/security/types.rs` (1565 行) → `types/mod.rs` + `types/tests/`(75 types 测试)
- `src/http/mod.rs` (2210 → 434 行) + `tests/`(22 config + 44 routing + 3 middleware 测试)
- `src/grpc/mod.rs` (2067 → ~251 行) + `tests/`(88 grpc_service + 9 interceptor 测试)
- `src/streaming/mod.rs` (1458 → 231 行) + `tests/`(16 sse + 61 stream_builder 测试)
#### 改进
- 重构 HTTP 路由注册流程,减少样板代码
- 重构 MCP 工具注册流程,提高一致性
- 重构 WebSocket 路由注册,简化实现
- 重构 gRPC 路由注册,统一风格
- 优化缓存键处理,减少因格式不一致导致的 miss
- 优化错误处理,移除 CLI 相关变体(仅在 main.rs 中可用)
- audit 模块的 `eprintln!` 替换为 `log::warn!`(新增 `log` 工作区依赖)
- validation 模块移除 `#![allow(clippy::result_large_err)]`,改为 6 个函数级 `#[allow]`
- websocket/tests 和 core/error/tests 清理 `#![allow(unused_imports)]` 和未使用导入
- websocket handler/connection 添加 `#[cfg(feature = "security")]` 门控,使 `http,websocket`(无 security)编译通过
- 为 perf_* 示例添加 `required-features = ["cache"]` 声明
- 所有源文件添加 `SPDX-License-Identifier: MIT` 头
#### 正确性修复
- **CRIT-3**:移除 `macros/src/lib.rs` 中 `_param_unwraps` 的逐字重复定义
- **CRIT-4**:`AuthConfig`/`ServerConfig`/`AppConfig` 双 `validate()` 实现统一为单一来源
- **CRIT-5**:`MrtrSessionManager::create_session` 添加会话 ID 冲突检查,冲突时返回 `ErrorData::invalid_params`(原静默覆盖)
- **CRIT-6**:SSE 流 30 秒超时后发送 `Error` 事件,客户端可区分超时与正常完成
- **HIGH-003**:修复 `RegexCache` LRU 驱逐逻辑(`Reverse(time)` 导致驱逐 MRU 而非 LRU)
- **C-HIGH-1**:修复版本路由 `"v"` 单字符误判为有效版本(缺少 `len() > 1` 检查)
- **C-HIGH-4**:`ApiError::from_std_error` 中 `SystemTime::now().duration_since(UNIX_EPOCH).unwrap()` 改为 `.unwrap_or_default()`,防止系统时钟回拨 panic
#### 质量门禁
- 覆盖率从 88.96% 提升至 95.94%(2720/2835 行),超过 95% 目标
- `cargo clippy --all-features --all-targets -- -D warnings` 零警告零错误
- CI 覆盖率门禁修复:`--features full --lib` 替代 `--all-features --workspace` 避免 macros trybuild 测试超时
- `.tarpaulin.toml` 配置修正:`exclude_files` → `exclude-files`(kebab-case)
- diting 6 维度全量审查完成(Security/Performance/Quality/Architecture/Simplification/Correctness),6 项 P0 Critical/High 问题已修复
- 25 项 Medium/High 技术债记录至 `SIMPLIFY-DEBT.md` 作为 v0.2.1+ backlog
#### 文档
- `README.md` 改为中文版(原 `README_zh.md`),英文版迁移至 `README_EN.md`
- 移除所有 Redis 提及(与 no-db 策略一致)
- 修正 `CacheConfig` 文档示例字段(`ttl_seconds`/`max_size_mb`/`max_entries` → `default_ttl_secs`/`max_items`/`track_stats`)
- Feature 表格新增 `openapi`/`cli`/`validation`/`schema`/`watch`/`audit`/`simd-json`/`hex` 行,修正 `mcp`/`security`/`full` 依赖描述
- 新增 "OpenAPI 自动生成" 章节(README.md + README_EN.md)
- 新增 "MCP 2026-07-28 迁移指南" 章节(README.md + README_EN.md)
- 项目结构图补充 `streaming/` 模块
- 新增 `docs/benchmarks/vs-server-less.md` 性能基准文档(http vs full 编译时间/体积对比,实测数据)
- 新增 `SIMPLIFY-DEBT.md` 技术债清单(记录 25 项 Medium/High 技术债作为 v0.2.1+ backlog,含源代码路径索引)
#### 测试
- ✅ lib 测试 1638 个全部通过(基线 1383 + 新增 255)
- ✅ clippy 零警告零错误
- ✅ 覆盖率 95.94%
- ✅ CI 门禁本地验证通过
#### 技术债务
- 移除 `SdForgeError::Generator` 变体(CLI 模块不可用于 lib)
- 清理条件编译相关的 unreachable pattern
- `ApiError` 枚举体积过大(Internal/ServiceUnavailable 变体包含 `Box<dyn StdError>` + `ErrorContext`),导致 `clippy::result_large_err` 在 validation 模块 6 个函数上需局部 `#[allow]`;拆分 `ApiError` 记录为技术债
---
## [0.1.0] - 2026-01-19
### 初始发布
SDForge 框架首次发布(前身为 axiom,已于 2026-01-17 重命名为 sdforge)。
#### 核心特性
- **统一接口**:单个 `#[service_api]` 宏同时支持 HTTP 和 MCP
- **编译期协议选择**:通过 Cargo features 控制生成哪些协议
- **零运行时开销**:未使用的协议不会出现在二进制文件中
- **类型安全**:编译期验证 API 配置正确性
#### 支持的协议
- HTTP(通过 Axum 0.8.8)
- MCP(通过 mcp-sdk 0.0.3,后续在 0.2.0 迁移到 rmcp 0.16)
#### 支持的特性
| `http` | HTTP 服务器支持 | ✅ |
| `mcp` | MCP 协议支持 | ❌ |
| `streaming` | SSE 流式响应 | ❌ |
| `timestamp` | 响应时间戳 | ❌ |
| `logging` | 结构化请求日志 | ❌ |
| `security` | 安全认证和审计 | ❌ |
| `cache` | 响应缓存(LRU) | ❌ |
| `full` | 启用所有功能 | ❌ |
#### 安全功能
- Bearer Token 认证(HMAC-SHA256 JWT 验证)
- IP 白名单验证(拒绝私有/保留地址)
- 限流器(带幂等性支持)
- 审计日志(防 DoS 设计)
- 错误消息脱敏(防止信息泄露)
#### 缓存系统
- 基于内存的 HTTP 响应缓存
- ETag 和 Last-Modified 支持
- LRU 淘汰策略
- 可配置的大小和数量限制
#### 测试
- 单元测试(23+ 测试)
- 集成测试(HTTP、MCP、双协议)
- 缓存集成测试
- 配置集成测试
- 编译失败测试
#### 性能
- HTTP 请求处理:10,000+ req/s
- MCP 工具调用:5,000+ ops/s
- P50 延迟:< 0.5ms
- P95 延迟:< 1ms