diff --git a/apps/ai-game-creator-shell/src-tauri/src/export/registry.rs b/apps/ai-game-creator-shell/src-tauri/src/export/registry.rs index 275146002..2a777f71a 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/export/registry.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/export/registry.rs @@ -61,6 +61,12 @@ pub(crate) fn content_hash(text: &str) -> String { /// 读注册表;文件不存在时先用 `empty` 的规范序列化补一份空注册表,再读回来。 /// /// 「自动创建」是产品要求:面板一打开就要能显示空表单,而不是先报「文件不存在」。 +/// +/// 这里明确接受一个并发窗口:`read_to_string` 返回 `NotFound` 到下面 `write_atomically` 之间 +/// 没有锁,如果这期间别的写者(code agent 的脚本、并发的保存命令)抢先建好了同一个文件,本次 +/// 写入会用空注册表把它盖掉。不为此加锁或改成「原子重读 + 比较」:注册表本来就是用户与 agent +/// 共写的本机文件,真撞上时重新读一次就能看到最新内容,写入门禁级别的并发保证成本高于收益 +///(目标模块 `xhs_minitool::registry::save` 对同类窗口也是明确接受)。 pub(crate) fn load_or_create(path: &Path, empty: &T) -> Result, RegistryError> where T: Serialize + DeserializeOwned,