# 2026-06-27 MD-H5-04 Live Recovery ## 用户目标 从 `02-P/plan-progress.markdown` 的 `P-20260626-m4c-handshake-coordination` 领取 Mindraw 侧 `MD-H5-04`,恢复 H5 retry 所需真实 App live transport / capability。完成后回写总台账 Progress Log,保存证据和会话记忆;不领取 `PM-*` / `H*`,不改 m4c `03-O`。 ## 已完成事项 - 重新读取 `/Users/ar/.codex/AGENTS.md`、项目 `AGENTS.md`、`INDEX.md`、`CODEGRAPH.md` 和总台账中 `MD-H5-04` / `M4C-H5-06` / `PM-H5-RETRY-GATE` 状态。 - 复现 m4c No-Go 基线:旧 capability 指向 `pid=781`,该 PID 不存在。 - 补 Mindraw 正常退出时的 capability cleanup:只清理 `pid` 等于当前进程的 primary / legacy capability 文件,避免误删其他实例新 capability。 - 构建当前源码本地 QA debug App,并打开安全副本 `/private/tmp/mindraw-md-h5-04-live-recovery/MD-H5-04-live-copy.mindraw`。 - 重新生成有效 runtime capability:当前 PID `93170` 存活,endpoint `http://127.0.0.1:53739/rpc`。 - 用外部进程验证 `/health`、`/capabilities`、`get_open_document_state`、`get_live_frame_context`、lease acquire-release 和任意 patch 拒绝。 - 通过 doctor 验证 live capability 为 `appWriteLease=pass`;伪造 stale capability 为 `appWriteLease=stale` / `MINDRAW_APP_API_NOT_REACHABLE`。 - 回写总台账并将 `MD-H5-04` 标记完成,下一步归属 PM。 ## 关键决策 - `MD-H5-04` 只做 live transport / capability 恢复和证据,不做 controlled commit,不做 Phase 4 `.assets`,不启动 H8 / 发布。 - stale 改进保持最小范围:正常退出清理当前 PID capability;crash / 强杀仍由调用方通过 `/health` 判定 stale。 - 不自行派发 m4c 重跑任务;PM 根据本轮证据决定是否派 m4c 侧重跑。 ## 文件变更 - `src-tauri/src/app_api_transport.rs` - `src-tauri/src/lib.rs` - `scripts/mindraw-doctor.test.mjs` - `CODEGRAPH.md` - `INDEX.md` - `02-P/plan-progress.markdown` - `02-P/qa/mindraw-h5-live-transport-recovery-check.md` - `02-P/qa/mindraw-h5-live-transport-recovery.json` ## 验证结果 - `cargo test --manifest-path src-tauri/Cargo.toml app_api_transport`:PASS,4 tests。 - `npm run doctor:mindraw:test`:PASS,13 tests。 - `npm run test:run -- src/lib/mindrawAppApiTransport.test.ts src/lib/mindrawAppWriteApi.smoke.test.ts`:PASS,2 files / 11 tests。 - `npm run tauri -- build --debug --bundles app`:PASS,本地 QA debug App 构建成功。 - 外部 Node smoke:PASS,证据见 `02-P/qa/mindraw-h5-live-transport-recovery.json`。 - `git diff --check`:PASS,无输出。 - `cargo fmt --manifest-path src-tauri/Cargo.toml`:未执行成功,本机缺 `rustfmt`。 ## 未决问题 - 当前 endpoint / token 是运行态临时值,App 退出后必须重新读取 capability。 - crash / `kill -9` 仍可能留下 stale capability,需要调用方以真实 `/health` 判定。 - 多 App 实例竞争同一个 capability 文件仍未作为本轮范围处理。 - m4c 是否重跑 H5 retry 由 PM 判断。 ## 后续建议 - PM 复核 `MD-H5-04` 证据后决定是否派发 m4c 侧重跑。 - 若 H5 retry 仍遇到 stale,下一步应考虑 capability TTL / heartbeat / single-instance ownership 方案,但需由 PM 拆新任务。