以 Coder@mindraw-recovery 身份在现有未提交 MD-MEXP04-01 初版实现上做最小补修,不提交、不扩大范围、不改 m4c。必须修复独立 review 阻断项:移除文件名推断 safe copy 的写入 guard、校验 restore point 归属、补齐保存失败后的 restore point 可见与可恢复路径,并更新 QA / 台账 / 会话记忆。
mindrawSafeWriteback.ts 对 *-ai-frame-safe-*.mindraw 文件名的可信推断;getMindrawAiFrameSafetyState() 只返回 App 内创建记录,伪造 safe-copy 文件名仍返回 SAFE_COPY_REQUIRED。aiFrameSafeWriteback 元数据,包含 kind=safeCopy、safeCopyDocumentId、originalPath、originalHash、createdAt。restore_ai_frame_restore_point 恢复前校验 restore point 与当前 safe copy 的元数据一致、位于当前 safe copy 的 backup folder、文件名前缀匹配,并继续使用 staging / rollback 与 hash 校验。AiFramePanel 会刷新本次 restore point 状态;restoreActiveMindrawFromRestorePoint() 允许 dirty safe copy 执行受控恢复,恢复成功后清 dirty。CODEGRAPH.md、CHANGELOG.md、02-P/plan-progress.markdown;MD-MEXP04-01 已勾选完成,下一步归属 PM-MEXP04-GATE,未勾选 Gate。npm run test:run -- src/lib/mindrawSafeWriteback.test.ts src/lib/mindrawAiFrameWorkflow.test.ts src/lib/mindrawAppWriteApi.smoke.test.ts src/lib/mindrawAppWriteMutation.test.ts src/lib/mindrawAppWriteLease.test.ts src/lib/mindrawAppReadApi.test.ts:6 files / 52 tests PASS。npm run test:run -- src:29 files / 221 tests PASS。cargo test --manifest-path src-tauri/Cargo.toml:49 tests PASS。npm run build:PASS,仅既有 Vite 字体解析与 chunk size 警告。cargo check --manifest-path src-tauri/Cargo.toml:PASS。npm run doctor:mindraw:test:14 tests PASS。git diff --check:PASS。src/lib/mindrawSafeWriteback.ts、src/lib/mindrawSafeWriteback.test.ts、src/components/AiFramePanel.tsx、src/components/AiFramePanel.test.tsx、src/lib/mindrawAiFrameWorkflow.ts、src/lib/mindrawAiFrameWorkflow.test.ts、src-tauri/src/lib.rs、src/index.css。02-P/qa/mindraw-mexp04-real-user-safe-writeback-check.md、02-P/qa/mindraw-mexp04-real-user-safe-writeback.json、02-P/plan-progress.markdown。CODEGRAPH.md、CHANGELOG.md、INDEX.md。.assets 权威化。CHANGELOG.md 只更新 Unreleased 条目;本轮不递增版本。PM-MEXP04-GATE 复核 coder 证据、必要实机 smoke 和用户可体验交付判断。