# Changelog

---

## [0.12.0] - 2026-06-20

### Added — PDF 导出 + 报告模板架构（Phase 8.2.1）

- **PdfSharpCore 1.3.64**：纯托管 PDF 库（netstandard2.0，Unity IL2CPP 兼容），新增 9 个传递依赖 DLL
- **ReportData 结构化模型**：`ReportData → Sections → Blocks`（KeyValueBlock / TableBlock / TextBlock），替代原 StringBuilder 拼接
- **ReportBlockConverter**：ReportBlock 多态 JSON 序列化转换器（netstandard2.1 不支持 JsonPolymorphic 属性）
- **MarkdownRenderer**：从 ReportData 渲染 Markdown，与 PDF 共用数据源
- **StandardPdfTemplate**：内置标准 PDF 模板（A4、中文字体嵌入、表格边框、自动分页、页码）
- **CjkFontResolver**：PdfSharpCore IFontResolver 实现，从文件路径加载 CJK TrueType 字体
- **IPathProvider.GetFontPath()**：字体文件路径接口，`UnityPathProvider` / `TestPathProvider` 均已实现
- **SimulationReport +ReportDataJson**：结构化报告数据 JSON 字段，供 PDF 重新渲染
- **IReportService.ExportReport(id, format)**：返回 `byte[]`，支持 `"pdf"` / `"md"`
- **IReportService.ExportToFile(id, dir, format)**：导出文件，返回路径
- **ReportService.Generate 自动导出 MD**：仿真后自动生成 `.md` 文件到 `{DataRoot}/reports/`
- **Unity ReportManager**：新增 `ExportReport(reportId, format)` 和 `Export(reportId, dir, format)` 桥接
- **CJK 字体文件**：`data/fonts/CJK-Font.ttf`（SimHei，9.7MB）+ Unity StreamingAssets 同步
- **check_unity_build.ps1 修复**：加 `-quit` 参数 + 300s 超时，解决 Unity batchmode 不退出导致挂起

### Changed — ReportGenerator 重构

- **ReportGenerator.Generate 返回 ReportData**（原返回 string），翻译函数去掉 emoji 前缀（SimHei 不支持 emoji 字形）
- **ExportToFile 签名变更**：加 `format` 参数（`"pdf"` / `"md"`），不向后兼容旧的两参数签名
- **DLL 数量 14→22**：新增 PdfSharpCore + SharpZipLib + SixLabors.Fonts/ImageSharp + 5 个 System.* 传递依赖

### Docs

- 对接文档 V2.0：新增坐标系与 3D 可视化章节、完整枚举值清单、所有 Manager 完整方法签名、核心模型完整字段
- 架构设计：导出章节更新为 PdfSharpCore 选型，接口签名同步

### Metrics

- 测试 **262**（+12），全部通过 15s

---

## [0.11.0] - 2026-06-18

### Breaking — 发射平台与探测设备分离

- **LaunchPlatformSpec**：新增纯发射平台规格（GunCount/ChannelsPerGun/MuzzleVelocity/CruiseSpeed 等，无探测字段）
- **ScenarioUnit.FireUnitSpecId → LaunchPlatformSpecId**：发射平台部署通过新 FK 引用
- **SensorSpec 统一探测来源**：发射平台自带探测 + 独立探测设备，统一通过 SensorSpecId 引用
- **BuildDetectionSources 简化**：只查 SensorSpec，不分 Launch/Detection 两条路径
- **FireUnitSpec 保留不用**：旧类型保留代码但不参与运行时
- **defaults.json +launchPlatforms**：新数据区

### Added — 代码审查 + 测试覆盖

- **DataServiceTests**：12 个，覆盖 7 类基础数据 CRUD
- **死代码清除**：MunitionEntity._hasExceededReleaseAltitude
- **Spec 类独立文件**：DroneSpec/FireUnitSpec/SensorSpec 等从 DefaultData.cs 拆出，命名空间 → Models
- **PagedResult/EnumMetadata 独立文件**
- **GetEnums 返回中英文对照**：EnumItem{Name,ChineseName,Value}
- **FormationTemplate 补 PrimaryKey**

### Added — 3D 模型引用

- **DroneSpec/FireUnitSpec/SensorSpec +ModelId**：FK → ModelInfo
- **EntitySnapshot +ModelId**：每帧推送给 Unity
- **ModelInfo.ModelType→EntityType(枚举) +Description**

### Metrics

- 测试 **250**（+12），全部通过 12s

---

## [0.10.0] - 2026-06-18

### Breaking — 平台物理统一 + 模型重命名

- **空基/地基物理统一**：去除 DefensePlanner 所有平台类型分支，统一用 `InterceptCalculator.Compute`（删 `ComputeHorizontal`），统一用 `MuzzleVelocity`（删 `CruiseSpeed` 分支）
- **抛物线选解策略**：两解逐一计算距离匹配 + `fireTime>0` 可行性，选最早拦截的解（非简单选高角/低角）
- **`TargetType` → `DroneType`**：删 `Electric`/`Piston`，重编号 `HighSpeed=2`，`TargetConfig.DroneType` 属性同步改名
- **`TargetConfig` → `ScenarioDrone`**：核心模型重命名
- **`SimTask` → `Scenario`**：想定主表重命名，`ScenarioNumber` 取代 `TaskNumber`
- **`TaskFullConfig` → `ScenarioConfig`**：聚合配置重命名，`Task` 属性 → `Info`
- **`TaskId` → `ScenarioId`**：所有 FK 重命名
- **`ScenarioService` 方法**：`CreateTask`→`CreateScenario`、`DeleteTask`→`DeleteScenario`、`SearchTasks`→`SearchScenarios`、`GetTaskDetail`→`GetScenarioDetail`

### Added — 模型业务属性

- **`ScenarioDrone` / `DroneSpec`**：+`Model`（型号）、+`Description`（描述/用途）
- **`Scenario`**：+`Description`（想定描述）
- **`ScenarioUnit` / `FireUnitSpec`**：+`Description`
- **`ReportManager.Export(reportId, outputDir)`**：支持指定导出路径

### Changed — 数据库迁移

- `CreateMainTables` 删旧表 `SimTask`、`TargetConfig`、`SimulationReport`（自动重建）
- `scenariosVersion` 3→4 触发 demo 想定重建

### Docs

- 对接文档 V1.6：去历史命名对照，只写现状
- 架构设计 V15：同步模型表结构 + 枚举值

### Metrics

- 测试 **238**，全量通过 11s

---

## [0.9.0] - 2026-06-17

### Breaking — 运动学前向计算 + 基础数据 CRUD

- **Kinematics 前向计算**：新增 `ComputeParabolicRange(v₀, θ, Δy)` 和 `ParabolicApex(v₀, θ)`，正问题直接由角度算射程和时间
- **Math.Max 回退全部移除**：`CalculateLaunchAngle`/`ParabolicShellTime`/`ParabolicTimeOfFlight` 不再静默钳位或 45° 回退，非法输入直接抛异常
- **GaussianPuffDispersion / CloudExpansionModel / DetectionCalculator**：BurstChargeKg≤0 抛异常，不再用 `Math.Max(0.01, ...)` 掩护；Phase3 `x≤0` 显式跳过

### Changed — 空基固定阵位发射

- **空基不再「飞向投放点」**：改为固定阵位水平发射（θ=0°），`ComputeParabolicRange` 前向计算飞行时间
- **DefensePlanner 空基**：`ComputeHorizontal` 使用 `platform.PosY`（非 `ReleaseAltitude`）；云团位置 = 炮弹实际到达位置
- **MunitionEntity 下落修正**：`_arrivesDescending` 区分上升/下落到达；`Math.Max(0.01, ...)` 除零回退移除
- **死代码删除**：`CommandFlyTo`/`FlyingToTarget`/`ReadyToRelease` 状态 + SimulationEngine "1b. 到达投放点" 块

### Added — 实体属性全面暴露

- **EntitySnapshot +VelX/Y/Z**：所有实体帧快照带瞬时速度
- **引擎 Platforms 列表公开**：`SimulationEngine.Platforms`
- **CloudEntity**：Pos/Radius/Density/Phase/Elapsed 便捷属性（不再穿透 Dispersion）
- **MunitionEntity**：LaunchAngle/Azimuth/MuzzleVelocity/FlightDuration/Start/LaunchTime/ElapsedTime/Velocity 全部 public
- **DroneEntity**：TraveledArc/TotalArc/Progress
- **PlatformEntity**：Target/FlightDistance/FlownDistance
- **DetectionEntity**：PosX/Y/Z

### Added — 基础数据 CRUD（DataService）

- **7 类规格入库**：FireUnitSpec / DroneSpec / SensorSpec / EnvironmentSpec / FormationTemplate / RouteTemplate / AmmunitionSpec
- **类名规范化**：TargetPreset→DroneSpec, DetectionPreset→SensorSpec, WeatherPreset→EnvironmentSpec, FireUnitTemplate→FireUnitSpec, RoutePreset→RouteTemplate
- **IDataService + DataService**：全 CRUD（GetAll/Save/Delete）
- **Unity Manager 接入**：ScenarioManager.DataService + SimulationRunner.DataService

### Added — FrameDataStore LiveFrames 内存回放

- **Flush 后保留 LiveFrames 副本**：仿真刚结束可内存回放，零磁盘 IO
- **ReplayController 双路径**：`LoadReplay(scenarioId, frameStore)` 优先内存，回退 SQLite
- **LiveFrames 生命周期**：BeginRecording/Discard 清除

### Changed — 3机空基编队测试启用

- `Seed3DronesAirBased` 参数对齐单机（风速/航速），平台沿 X 轴间隔 300m
- `Scenario_3DronesAirBased_AllDestroyed` 移除 Skip，全部通过
- `Scenario_DetectionDriven_PlanningDelayedByDetectionBoundary` 移除 Skip

### Metrics

- 测试 **243**（+12），跳过 0，全量通过 11s

---

## [0.8.0] - 2026-06-16

### Added — 探测实时链路（Phase 10）

- **3D 球冠探测**：`DetectionCalculator.IsInCoverage`（水平距离 + 俯仰角 + 高度门限），planner 与运行时共用
- **EarliestDetection 采样法**：线段-圆求交改为沿航路采样（步长≤50m）调 `IsInCoverage`
- **DetectionEntity**：运行时探测实体 + per-drone 状态机（Undetected ⇄ Detected），Tick 第5步扫描
- **实时探测事件**：`OnTargetDetected` / `SimEventType.TargetDetected` / `PlanningFailed`
- **ScenarioUnit + DetectionSource**：+4 个 3D 球冠字段（MinElevation/MaxElevation/MinDetectAlt/MaxDetectAlt）
- **默认数据全部加入 3D 球冠参数**（地基 -5°~85°、空基 -80°~30°）

### Added — Planner 诊断 + 拦截点计算

- **InterceptCalculator**：抛物线与直线联立方程求解拦截点（地基可变角度 + 空基固定水平 θ=0°）
- **HasInterceptWindow**：拦截窗口可行性检查（从探测边界算有效飞行时间）
- **TryGenerateFireEvents**：每个 `return events` 带拒绝原因
- **Planner Summary**：含失败原因 + 建议值（探测范围/弧长/反应时间）
- **PlannerConfig**：+`ReactionTime`（5s）/ `ExpansionFactor`（0.9）/ `TimingSafetyMargin`（1s）

### Changed — 消除硬编码

- **速度从 waypoint.Speed 读取**：`DroneEntity.CruiseSpeed` / `GetDroneSpeedKph` 不再用 `ScenarioDrone.TypicalSpeed`
- **`AmmunitionSpec` +`Phase2Duration`**（30s）：`CloudExpansionModel` 不再写死 `30f`
- **`GetArrivalTime` 基于 DetectArc**：从探测点到中点算到达时间（而非航路起点）
- **TestData 改为从 seeded 数据库读取**（不再内嵌 JSON 重复 defaults.json）

### Changed — 默认想定参数

- 巡航导弹速度 300→200 km/h
- 空基航路 10km→20km，平台位置 1500→6000，巡航速度 55→80 m/s
- 地基火力单元放航路终点，探测范围按 80% 规则

### Metrics

- 测试 204 → **231**（+27），全量通过 7s

---

## [0.7.0] - 2026-06-15

### Breaking — 概念升级：编组拆分 + Group 表移除

- **Group 表移除**：原 `Group` 表（DroneFleet / EquipmentGroup）不再创建。向后兼容保留旧库中的 Group 表，但不再主动读写
- **GroupType 枚举删除**：不再区分 DroneFleet / EquipmentGroup
- **GroupService / IGroupService / GroupRepository 删除**：不再需要编组管理服务
- **Unity GroupManager 删除**：不再需要编组管理桥接

### Changed — 数据模型重命名

- **`GroupId` → `WaveId`**ScenarioDrone 四表的编组外键重命名为批次外键
- **RoutePlan 索引重命名**：`(ScenarioId, GroupId)` → `(ScenarioId, WaveId)`
- **RoutePlanRepository / WaypointRepository**：`GetByScenarioAndGroup` → `GetByScenarioAndWave`
- **IScenarioService.SaveRoute**：`groupId` 参数 → `waveId`

### Changed — 算法类型重命名

- **`DroneGroup` → `DroneWave`**：AlgorithmTypes、IDefensePlanner、DefensePlanner、SimulationEngine 全部使用新类型名
- **`DroneGroupId` → `DroneWaveId`**：UnitAssignment 中的编队引用 → 批次引用
- **`BuildDroneGroups()` → `BuildDroneWaves()`**：SimulationEngine 构建方法重命名

### Changed — 文档同步

- 总体架构设计：编组概念升级说明
- DefensePlanner 技术方案：DroneGroup → DroneWave
- 实施计划：GroupService 移除、多编队 → 多批次
- Unity 前端对接文档：DefaultDefenseAdvisor → DefensePlanner，SaveRoute 签名更新
- 仿真器实体事件映射：BuildDroneGroups → BuildDroneWaves

### Removed

- 7 个文件：Group.cs / GroupRepository.cs / IGroupService.cs / GroupService.cs / GroupManager.cs / GroupServiceTests.cs / GroupRepositoryTests.cs

### Metrics

- 测试 208 → **204**（−4，删除 Group 相关测试），全量通过 63s
- 0 编译错误，0 编译警告

---

## [0.6.0] - 2026-06-15

### Added — 探测驱动的规划（8.1.1）

- **DetectionCalculator 静态工具类**：探测能力评估的唯一实现（与 Kinematics/RouteGeometry 同范式）。光电受 Visibility 衰减（`有效=基准×min(1,Visibility/基准)`），雷达/红外不受影响；统一信息网络找最早探测点（线段-圆求交）
- **探测源模型**（DetectionSource）：独立探测设备 + 火力单元自带探测统一表达（雷达/光电/红外三距离 + 精度）
- **ScenarioUnit 扩展**：删单一 `DetectionRadius`，加 `RadarRange/EORange/IRange/DetectionAccuracy` 四字段
- **FireUnit 探测字段激活**：BuildFireUnits 从 ScenarioUnit 读取并赋值（原为死代码）
- **planner 接口扩展**：`IDefensePlanner.Plan` 加第 4 参数 `detectionSources`
- **PlannerConfig 加 DefaultDetectionAccuracy**（无探测时回退精度）
- 单元测试：DetectionCalculator 13 项、探测驱动规划 2 项

### Changed — planner 基于探测信息规划

- planner 假设威胁从探测边界被发现，到达时间 = (拦截弧长 − 探测弧长)/速度，而非上帝视角的航路起点
- SimulationEngine.Initialize 构建 `List<DetectionSource>`（独立探测 + 火力单元自带），传入 planner
- 报告探测设备表用新字段（雷达/光电/红外/精度）

### Fixed

- Solve 健壮性：GenerateFireEventsAt 返回空时（探测边界太靠后来不及拦截）不再 IndexOutOfRange

### Metrics

- 测试 193 → **208**（+15），全量通过 64s
- 0 编译警告

---

## [0.5.0] - 2026-06-14

### Added — 物理模型统一架构

- **RouteGeometry 静态工具类**：航路几何唯一实现（总弧长/弧长→位置/点→最近弧长/切向量/到达时间）。planner（预测）和 DroneEntity（执行）共用，消除本地折线插值
- **PlannerConfig + planner_config.json**：planner 策略参数全部外置（重叠系数、威胁类型系数、弹药匹配表、临界/上限概率阈值）。代码零默认值，文件缺失即抛异常
- 单元测试：RouteGeometry 16 项、PlannerConfig 6 项、DroneEntity L 形多 waypoint 1 项、Z 向航路感知 1 项

### Changed — planner 不再写本地物理公式

- **DefaultDefensePlanner 航路感知布局**：云团 offset 沿航路切向（`RouteGeometry.TangentAt`），不再写死 X 轴；穿越点用 `RouteGeometry.PositionAt`，到达时间用 `RouteGeometry.TravelTimeTo`——支持任意方向/折线航路
- **云团重叠**：间距从 `2R`（相切）改为 `2R×(1−重叠系数)`，重叠 20% 由配置驱动，消除相切处的密度空洞
- **DroneEntity 弧长驱动**：运动改为 `_traveledArc += speed×dt` + `RouteGeometry.PositionAt`，删除 `CurrentWaypointIndex` 逐段插值、`dist<1.0` 阈值、`step>=dist` snap 丢位移等本地逻辑
- **CloudExpansionModel.RoundsNeeded** 签名：`effectiveRadius` 参数改为 `spacing`，间距由调用方（planner）按重叠系数传入，公式仍在共享模块
- **策略参数从配置读**：威胁类型系数、弹药匹配表、临界概率（0.5）、拦截概率上限（0.95）全部从 `PlannerConfig` 读，planner 内零硬编码

### Fixed — planner 与引擎物理一致性

- **PathInSphere 云团参考系修正**：毁伤判定改在云团参考系计算（`drone.Pos − cloud.Center`），修正云团在 tick 内移动导致的每 tick ~2m 系统误差
- **ComputeEffectiveRadius 云龄 bug**：从 `ArrivalTime×2`（无人机飞行时间，概念错误）改为 `expansionTime`（云团自身膨胀时长）

### Removed

- SimulationEngine 所有硬编码桌面路径的诊断写入（`planner_targets.csv`/`cloud_actual.csv`/`path_in_cloud.txt`/`_hitLog`/`_totalPathInCloud`）——这些造成集成测试并行时文件竞争（flaky 失败根因）
- DefaultDefensePlanner 的硬编码 `MatchTable`/`TypeCoefficient` 字典（移入配置）

### Metrics

- 测试 167 → **191**（+24），全量通过 41s
- 关键验证：活塞+西风、空基+东风有风场景击毁成功；Z 向航路云团沿航路分布；L 形折线多 waypoint 运动正确

---

## [0.4.1] - 2026-06-14

### Added

- 天气纳入 Planner 规划：抛撒点风偏预补偿。云团生成后会在 `expansionTime` 内被风吹偏 `windVec × expansionTime`，Planner 逆风预置抛撒点 `cloudGen = 穿越点 − windVec × expansionTime`，使云团漂移后中心正好回到无人机航路上
- 单元测试：`DispersionModelTests` Phase3 天气差异 2 项（雾 vs 晴、夜 vs 晴）；`DefensePlannerTests` 风偏补偿 4 项（无风/东风/西风/北风方向性）

### Fixed

- `GaussianPuffDispersion.Tick` Phase3 写死 `WeatherType.Sunny` 的 bug：原代码 `GetStabilityClass((WeatherType)0, windSpeed)` 导致任何天气下扩散行为都相同，预估（`CloudExpansionModel` 已正确读 env）与运行时模型不一致。改为存储 `env` 字段，使用真实 `env.WeatherType`

### Changed

- `DefaultDefensePlanner.GenerateFireEventsAt` 区分无人机穿越点 `tx,tz`（用于 `txArrival` 计算）与云团生成点 `cloudGenX,Z`（弹药瞄准目标 + FireEvent 输出）
- 移除 `Solve` 中 `e.TargetX = mid.X + offset` 的覆盖（会抹掉风偏补偿；多发散布偏移已由 `targetOffset` 参数处理）

---

## [0.4.0] - 2026-06-13

### Added

- 路径积分毁伤判定：`DamageAssessment.PathInSphere` 替代离散 `ContainsPoint`，无人机穿云暴露精确计算
- 损伤模型暴露所需暴露时间：`IDamageModel.RequiredExposureSeconds`，Planner 从损伤模型读取所需覆盖时长
- 云团膨胀独立模块：`CloudExpansionModel`，封装 `RadiusAt`/`DensityAt`/`TimeToReach`/`TimeToDensity`/`RoundsNeeded`
- 单元测试：`DamageAssessment` 5 项 (穿心/相邻/间隙/9 链/跨云)、`Kinematics` 抛物线 4 项 (45°标准公式验证)
- 密度阈值统一：引擎处 `cloudDensity >= ammo.EffectiveConcentration` 统一检查，三个损伤模型去掉各自硬编码阈值

### Changed

- Planner `CalcRoundsNeeded` 从硬编码 `2:6s` 改为 `_damageModel.RequiredExposureSeconds`
- `CloudExpansionModel.RoundsNeeded` 间距 `= 2R`（消除 `1.5f` 魔法数字）
- `FireUnit` = 物理单元（不拆通道），Planner 一辆车发一条线
- `MunitionEntity.HasArrived` 上升段触发（不再要求下行），附带精确插值
- 空基平台投放逻辑：飞向云位、距目标 `driftDist` 释放、位置插值保留
- 仿真场景缩短：Piston 5km/150km/h、Jet 5km/200km/h、AirBased 10km/150km/h，全量 22s

### Fixed

- 抛物线弹道精确求解：`CalculateLaunchAngle`/`ParabolicShellTime` 解 tan(θ) 二次方程取平射解
- 空基 `PlatformEntity` 投放时不再传送到终点
- 缺失 `else` 导致空基走地基分支
- `Event.OccurredAt` 使用精确 `FireEvent.FireTime`/`m.ArrivalTime`
- `_frameDb.Commit` 批量 50 帧
- 报告火力单元计数（`_entityCounter` 重置）

### Removed

- `ComputeEffectiveRadius` 公式转移到 `CloudExpansionModel`
- 损伤模型内部浓度阈值（`TriggerThreshold`/`EffectiveThreshold`）
- `CalcRoundsNeeded` `/2` 魔法加 1

### Added

- DefensePlanner 防御规划引擎：五步流水线（威胁排序 → 弹药匹配 → 候选生成 → 贪心分配 → 时序生成）
- 空基平台飞行与投弹：状态机（Idle → FlyingToTarget → ReadyToRelease），载机速度继承，弹药抛物线下落
- 火力单元通道模型：GunCount × ChannelsPerGun，ChannelInterval 物理间隔，Cooldown 冷却
- 默认火力单元配置：4 种模板（轻型/标准/重地基 + 标准空基 8 通道）
- 推荐算法统一处理空基/地基平台类型
- 物理间隔错开发射：发射间隔 = 云团直径 / 无人机速度
- 每发弹按目标点位置独立计算到达时间
- 报告显示 per-unit 发射数 + 事件标注火力单元

### Changed

- IDefenseAdvisor → IDefensePlanner：统一输入 `List<FireUnit>` + `List<DroneGroup>`
- FireUnit 重构：统一表达空基/地基平台（Type/Position/GunCount/ChannelsPerGun）
- SimulationEngine 内部调用 Planner 自动生成发射计划
- MunitionEntity 空投使用 Kinematics.AirDropPosition（继承载机速度 + 重力）
- PlatformEntity 加入 CurrentVelocity 属性

### Fixed

- 同平台多弹 FireTime 相同导致冷却跳过：FireTime += i × Cooldown
- 同平台弹药飞行时间按目标位置变化被吃掉：统一用中心点飞行时间
- recommendedTiming 按每发目标点独立计算（非中点）
- 空基 FireEvent.MuzzleVelocity 错误写 800
- SQLite domain reload 崩溃：SqliteConnectionTracker + AssemblyReloadEvents.beforeAssemblyReload

### Removed

- IDefenseAdvisor / DefaultDefenseAdvisor / RecommendMultiGroup
- SimulationRunner.BuildFireSchedule fallback
- 所有硬编码默认值（55f/800f/1000f/+500f/0.1f clamp）
- 所有静默 fallback（null return/empty events）
- Models.SimEvent 死代码

---

## [0.2.0] - 2026-06-12

### Added

- 三阶段气溶胶扩散模型（爆轰膨胀 → 湍流扩散 → 高斯扩散）
- 防御推荐算法：根据弹药规格自动计算齐射数、间距、拦截概率
- 仿真引擎事件驱动：OnMunitionLaunched / OnCloudGenerated / OnDroneDestroyed 等 6 个事件
- FireSchedule 发射计划：推荐方案直接生成，引擎执行
- 多编队多批次支持：RoutePlan 多航路、RecommendMultiGroup 火力分配
- 仿真报告：七章结构（结果/环境/目标/推荐/部署/时序/时间线），自动导出 Markdown
- 数据库种子：首次建表自动从 JSON 导入弹药规格
- 帧数据 TTL 清理（6 个月过期自动删除）
- 仿真加速：TimeScale 支持
- Unity Manager 桥接层：ModelManager / ScenarioManager / SimulationRunner / ReportManager / ReplayController / GroupManager
- Unity 全流程验证：一键菜单验证 7 个模块
- 边界测试：空部署 / 强风 / 超长航路 / 空基弹药

### Changed

- 仿真引擎重构为纯执行器，不包含决策逻辑
- RoutePlan 主键改为 Id，支持多编队
- 弹药参数改为 JSON 文件配置
- 报告结构重组，结果前置

### Fixed

- 弹药飞行时间用真实弹道计算
- 云团生成位置使用目标坐标
- 编队偏移应用到初始位置
- Edit 模式下 AddComponent 不触发 Awake

---

## [0.1.0] - 2026-06-11

### Added

- 项目初始化：.NET Standard 2.1 类库 + xUnit 测试框架
- 数据模型（11 张业务表 + 2 张运行时表）
- SQLite 持久化 + 任务分库架构
- 想定管理（5 步配置 CRUD）
- 仿真引擎基础框架
