# 2026-06-27 ResultFrame 避让 ## 用户目标 用户确认 `M-体验01` 视觉验收通过后,进一步要求后续 AI 自动生成的新 Frame 不能与已有 Frame 重叠,必须避开已有 Frame,在右侧空白处生成。 ## 已完成事项 - 补强 `src/lib/mindrawAppWriteMutation.ts` 的 `createAiResultFrame` 布局策略:从 source Frame 右侧开始放置 result Frame,但会扫描当前 scene 中非 source 的元素 / Frame;若候选位置与已有对象相交,则继续向右移动到下一个空位。 - 新增回归测试:source 右侧已有 Frame 时,新 result Frame 会落到已有 Frame 的右侧,而不是覆盖它。 - 更新 `CODEGRAPH.md` 和 `02-P/plan-progress.markdown`,把 result Frame 避让规则记录为项目事实。 - 重新生成本地 debug App:`/Users/ar/Projects/ExcalidrawX/src-tauri/target/debug/bundle/macos/Mindraw.app`。 ## 关键决策 - 避让逻辑放在 Mindraw App 的受控 mutation 层,而不是让 m4c 自己猜位置;所有通过 `commit_write_result(createAiResultFrame)` 的外部调用都会复用这条规则。 - 当前运行中的旧 debug App 进程不会自动热更新;需要关闭重开 debug App 才会加载新代码。 ## 文件变更 - `/Users/ar/Projects/ExcalidrawX/src/lib/mindrawAppWriteMutation.ts` - `/Users/ar/Projects/ExcalidrawX/src/lib/mindrawAppWriteMutation.test.ts` - `/Users/ar/Projects/ExcalidrawX/CODEGRAPH.md` - `/Users/ar/Projects/ExcalidrawX/02-P/plan-progress.markdown` ## 验证记录 - `npm run test:run -- src/lib/mindrawAppWriteMutation.test.ts`:1 file / 7 tests PASS。 - `npm run test:run -- src/lib/mindrawAppWriteApi.smoke.test.ts`:1 file / 6 tests PASS。 - `npm run test:run -- src/lib/mindrawAppWriteApi.smoke.test.ts src/lib/mindrawAppWriteMutation.test.ts src/lib/mindrawAppWriteLease.test.ts src/lib/mindrawAppReadApi.test.ts src/store/useStore.test.ts src/lib/excalidrawFile.test.ts`:6 files / 71 tests PASS。 - `npm run build`:PASS。 - `npm run tauri -- build --debug --bundles app`:PASS,重新生成 debug App。 - `git diff --check` 对相关文件通过。 - m4c `03-O` `git status --short` 无输出。 ## 未决问题 - 当前仍有旧 debug Mindraw 进程 PID `32350` 运行;若用户立刻继续做真实外部写入,需要先关闭并重新打开 debug App。 - 该避让策略优先向右寻找空位;尚未做更复杂的二维布局、自动换行或用户可配置摆放策略。