# 2026-06-28 MEXP05 补修 ## 用户目标 以 Mindraw coder 身份只领取 `MD-MEXP05-02`,修复 `PM-MEXP05-GATE` 独立 review 的两个 No-Go 阻断项:AssetStore temp symlink escape,以及 save / repair 后续 scene 或 manifest 写失败后残留本轮新增 blob。 ## 已完成事项 - 读取并遵守项目入口规则、统一台账、`CODEGRAPH.md`、MEXP05 QA 文档和相关全局研发 / QA / 会话记忆规则。 - 修复 `src-tauri/src/asset_store.rs` 与 `src-tauri/src/lib.rs` 的原子 temp 写入,改为 `OpenOptions::create_new(true)`,预置 temp symlink / 旧 temp 文件 fail-closed。 - AssetStore save / repair 写入时记录本轮新建 blob;后续 `drawing.excalidraw` 或 `manifest.json` 写失败时只删除这些本轮新增 blob,不删除既有资产,不自动清理 orphan。 - 新增 3 个 MEXP05 回归测试: - `mexp05_preexisting_asset_temp_symlink_does_not_write_outside` - `mexp05_save_manifest_failure_removes_only_new_blob` - `mexp05_repair_scene_failure_removes_new_blob_and_preserves_package` - 更新 `02-P/qa/mindraw-mexp05-assetstore-authority-check.md`、`02-P/plan-progress.markdown`、`CODEGRAPH.md`、`CHANGELOG.md`。 ## 关键决策 - 不改 `inlineCache=required`,不做 AssetStore API transport,不做 m4c 真实 smoke,不打包、不递增版本、不进入 H8 / formal release。 - `INDEX.md` 本轮不新增入口;QA 文档已说明无需更新理由。工作区中 `INDEX.md` 仍有接手前并行修改,未回滚。 - 本轮 coder 结论只回到 `PM-MEXP05-GATE` 复跑 independent review / Gate,不标 PM Gate GO。 ## 验证结果 - `cargo test --manifest-path src-tauri/Cargo.toml mexp05`:11 PASS。 - `cargo test --manifest-path src-tauri/Cargo.toml mindraw_package_tests`:40 PASS。 - `cargo test --manifest-path src-tauri/Cargo.toml`:61 PASS。 - `cargo check --manifest-path src-tauri/Cargo.toml`:PASS。 - `npm run test:run -- src/lib/imageImportPersistence.test.ts src/lib/imageImport.test.ts src/lib/obsidianExcalidraw.test.ts src/store/useStore.test.ts src/lib/mindrawAppWriteApi.smoke.test.ts`:5 files / 64 tests PASS。 - `npm run build`:PASS,仅既有字体解析、dialog 动静态导入和 chunk size warning。 - `git diff --check`:PASS。 - 限定 `src-tauri/src/asset_store.rs` 与 MEXP05 QA 的隐私 / path 泄漏扫描:无命中。 ## 未决问题 - 仍需 `PM-MEXP05-GATE` 复跑 independent review / Gate。 - 未做 m4c 真实 generated asset smoke;如 PM 认为需要,应另拆任务。 - 未做 H8 / formal release、打包、版本递增或发布冻结。