edit | blame | history | raw

2026-06-26 MD-H1-04 写入

用户目标

/Users/ar/Projects/ExcalidrawX/02-P/plan-progress.markdownP-20260626-m4c-handshake-coordination 领取 Mindraw 侧 MD-H1-04,完成受控 createAiResultFrame mutation 垂直切片。

范围边界:

  • 必须复用 MD-H1-03 lease / actor / writePlanId / workingRevision guard。
  • 不暴露任意 JSON patch。
  • 不覆盖 source Frame、source Frame 内原始元素或用户批注。
  • 不绕过 lease 检查。
  • 不启动正式 PM-H5-GATE

已完成事项

  • 新增 mindrawCommitWriteResult()
  • 新增 mutation schema validator,只接受 kind: "createAiResultFrame"
  • 新增 deterministic result layout planner:默认放在 source Frame 右侧。
  • 新增 result element builder:result Frame、标题、summary、prompt、body。
  • 新增 customData.m4c writer:记录 jobId、sourceFrameId、writePlanId、status、createdAt、actor、model。
  • 新增 source preservation guard,确保 source Frame 和 source 内原始元素不变。
  • 复用 mindrawPeekWriteLease() 做 lease、actor、writePlanIdworkingRevision guard。
  • 新增 active editor scene mutation bridge,让受控 mutation 同步当前 Excalidraw scene、store content,并走现有 saveTab()
  • 接入现有 save_mindraw_package 保存路径。
  • 保存失败返回 SAVE_FAILED 并保留 dirty。
  • 回写总台账 Progress Log。
  • 新增 QA 证据报告。

关键决策

  • 本轮仍不实现 loopback JSON-RPC / Tauri command transport;mindrawCommitWriteResult() 是内部 facade。
  • 不修改 mindrawGetCapabilities() 暴露能力,因为外部 transport 仍未完成。
  • 保存失败继续复用现有 saveTab() alert 行为,真实用户体验留给 MD-H1-05
  • result layout 采用可预测的 right-of-source placement,不做碰撞避让。

文件变更

  • src/lib/mindrawAppReadApi.ts
  • src/lib/mindrawAppWriteMutation.ts
  • src/lib/mindrawAppWriteMutation.test.ts
  • src/lib/editorBridge.ts
  • src/components/ExcalidrawEditor.tsx
  • CODEGRAPH.md
  • INDEX.md
  • 02-P/plan-progress.markdown
  • 02-P/qa/mindraw-phase38-write-mutation-check.md
  • .codex-sessionhistory/2026-06-26-MDH104写入.md

验证结果

  • npm run test:run -- src/lib/mindrawAppWriteMutation.test.ts
  • Test Files 1 passed
  • Tests 6 passed
  • npm run test:run -- 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
  • Test Files 5 passed
  • Tests 64 passed
  • npm run build
  • PASS
  • 仅有既有 Vite font resolve / chunk size warning
  • git diff --check -- ...
  • 无输出,行尾检查通过

未决问题

  • 尚无 loopback JSON-RPC / Tauri command transport。
  • 尚未做真实 App UI smoke。
  • 多窗口 / 多进程 lease 互斥仍未实现。
  • result layout 未做碰撞避让。
  • 保存失败 UI 仍沿用现有 alert。
  • PM-H5-GATE 未启动。

后续建议

  • 等 PM 派发 MD-H1-05 后,补真实 App QA:App open clean / dirty、用户编辑后 revision mismatch、lease timeout、save failed、result Frame 用户可见、source Frame 不变。
  • 等 m4c M4C-H5-03 回写后,由 PM 判断是否拆正式 PM-H5-GATE