# 2026-06-29 Frame Scoped Read ## 用户目标 以 `coder2@mindraw` 身份领取并完成 `MD-FLSR-01`,把 Mindraw 侧 Frame link 的 AI / App API 读取边界机械化为 `frame-only`,防止同一 `.mindraw` 文档中 Frame 外文本进入 promptable context。 ## 已完成事项 - 读取项目规则、索引、统一台账、`CODEGRAPH.md` 和 m4c 既有 deep link / Frame context package 契约。 - 修改 `src/lib/mindrawAppReadApi.ts`:`mindrawGetLiveFrameContext()` 返回 `readScope="frame-only"`、`target.kind="frame"`、Frame bounds、included / excluded / outside text scope audit、`outsideTextIncluded=false` 和 `scopeWarnings`。 - 补强 `src/lib/mindrawAppReadApi.test.ts` 和 `src/lib/mindrawAppApiTransport.test.ts`,覆盖目标 Frame 内文本 / 图片可读,Frame 外普通文本、同文档外部 Frame 文本和外部图片 file 不进入返回 context。 - 新增 QA 证据 `02-P/qa/mindraw-flsr-frame-scoped-read-check.md` 与 `.json`。 - 同步 `INDEX.md`、`CODEGRAPH.md`、`CHANGELOG.md` 和 `02-P/plan-progress.markdown`。 ## 关键决策 - `mindraw://localhost?documentId=...&elementId=` 在 AI / App API 读取场景默认是 `frame-only`。 - 普通对象链接若被当作 Frame 读取,必须返回 `TARGET_NOT_FRAME`,不得 fallback 到 document read。 - `diagnostics` / `scopeAudit` 只记录 Frame 外元素 id / count 等低语义信息,不记录 Frame 外文本内容。 - 本轮不做 H8 release、不重打 DMG、不做真实 AI provider、不做正式 MCP server、不触碰 m4c `03-O`。 ## 文件变更 - `src/lib/mindrawAppReadApi.ts` - `src/lib/mindrawAppReadApi.test.ts` - `src/lib/mindrawAppApiTransport.test.ts` - `02-P/qa/mindraw-flsr-frame-scoped-read-check.md` - `02-P/qa/mindraw-flsr-frame-scoped-read-check.json` - `INDEX.md` - `CODEGRAPH.md` - `CHANGELOG.md` - `02-P/plan-progress.markdown` ## 验证 - `npm run test:run -- src/lib/mindrawAppReadApi.test.ts src/lib/mindrawAppApiTransport.test.ts`:PASS,2 files / 14 tests。 - `npm run test:run -- src/lib/mindrawAppReadApi.test.ts src/lib/mindrawAppApiTransport.test.ts src/lib/mindrawAiFrameWorkflow.test.ts src/lib/mindrawAppWriteApi.smoke.test.ts`:PASS,4 files / 32 tests。 - `npm run build`:PASS,只有既有字体解析和 chunk size warnings。 ## 未决问题 - `M4C-FLSR-01` 仍需 m4c 侧完成 consumer guard / sanitized context package。 - `PM-FLSR-GATE` 仍需 PM 在 Mindraw / m4c 双方完成后统一收敛。 ## 后续建议 - PM 等待 m4c 回写 `M4C-FLSR-01` 后执行 `PM-FLSR-GATE`。 - m4c 侧应把无法获得 frame-scoped context 的场景作为 blocker,不得直接读取整份 `drawing.excalidraw`。