## ADDED Requirements ### Requirement: JSON 文件写入使用原子操作 `ConfigManager.save()`、`AnalyticsService._save_analytics()` 和 `AnalyticsService._save_weights()` SHALL 使用「写临时文件 → `os.replace()` 原子重命名」的方式持久化数据。临时文件 SHALL 创建于与目标文件相同的目录(同卷),以确保 `os.replace()` 的原子性。 #### Scenario: 写入过程中进程中断不产生损坏文件 - **WHEN** JSON 写入过程中进程被强制终止 - **THEN** 目标文件保持写入前的完整状态,不出现空文件或半写入的 JSON #### Scenario: 正常写入成功替换目标文件 - **WHEN** `ConfigManager.save()` 被调用且数据合法 - **THEN** 目标 `config.json` 被更新为最新内容,写入前存在的临时文件已被清理 #### Scenario: 临时文件与目标文件在同一目录 - **WHEN** 调用任意原子写函数 - **THEN** 临时文件的父目录与目标文件的父目录相同(通过 `tempfile.mkstemp(dir=)` 实现)