# Worker A：7-27 归档性审查结果

> 审查时间：2026-05-20
> 审查范围：`design/07-ai/process/7-27-online-markdown-writeback-final-content-truth-v2.md` × 当前 Rust 代码

---

## 1. 对照步骤 1-6 的完成状态

| 步骤 | 内容 | 状态 | 证据 |
|------|------|------|------|
| 步骤 1 | 增强 `blocks_to_markdown`：注释格式加 type/rev，复杂块用 raw marker | ✅ 已实现 | `doc.rs:1185-1215` — 输出 `<!-- block:id:type:level=N -->` 和 `[mnote-raw-block:id]` |
| 步骤 2 | 实现 `parse_final_markdown_to_blocks` | ✅ 已实现 | `doc.rs:656-747` — 完整实现含正则提取、fuzzy 回退、复杂块保留 |
| 步骤 3 | 实现 `build_page_content` | ✅ 已实现 | `doc.rs:850-913` — 含新块 ID 生成、复杂块保留、inline contentNodes 保护 |
| 步骤 4 | 替换 `doc_markdown_edit` online 写回路径 | ✅ 已实现 | `doc.rs:1625-1700` — "// 7-27: 在线写回以最终 markdown 为真源" |
| 步骤 5 | 更新 `full_content` 处理 | ✅ 已实现 | `doc.rs:1578-1585` — 转为 search=全文, replace=full，进新路径 |
| 步骤 6 | 清理旧代码 | ✅ 已标记 | Line 1911: `// 退役：7-27 …直接写回` |

## 2. 测试矩阵覆盖

| 优先级 | 场景 | 测试函数 | 结果 |
|--------|------|----------|------|
| P0 | 单块精确 search/replace | `test_search_replace_exact` | ✅ |
| P0 | 忽略空白 match | `test_search_replace_normalized_chinese_byte_boundaries` | ✅ |
| P0 | 多 operation 命中同块 | `hermes_tools_markdown_edit_merges_same_block_operations` | ✅ |
| P0 | full_content | `hermes_tools_markdown_edit_online_full_content_rejects_unsafe_block_mapping` | ✅ 注释明确："7-27 修复后：full_content 不再被拒绝" |
| P1 | heading 替换 | `test_blocks_to_markdown_heading` | ✅ |
| P1 | 包含复杂块文档的替换 | `test_build_page_content_full_content_replaces_old_text_blocks_but_keeps_complex_blocks` | ✅ |
| P1 | dryRun | `hermes_tools_markdown_edit_local_dry_run_does_not_write` | ✅ |
| P1 | revision 过期检查 | `hermes_tools_markdown_edit_online_page_body_save_carries_revision_conflict_key` | ✅ |
| P2 | 原始块 ID 消失保留 | `test_build_page_content_preserves_missing_original_text_block_when_some_ids_remain` | ✅ |
| P2 | 空 operations | `hermes_tools_markdown_edit_rejects_no_applied_operations` | ✅ |

## 3. 开放问题状态

| 开放问题 | 当前状态 |
|----------|----------|
| OQ1：`<!-- block:id:type:rev -->` 被 search/replace 破坏 | `extract_block_comment` 在解析不完整注释时返回 `(None, None)`，标记为 `is_new=true`，安全降级 |
| OQ2：full_content 块类型从 GFM 前缀推断 | `detect_block_type_from_prefix` 支持 heading/todo/paragraph，代码块等交由 fallback 处理 |
| OQ3：行内格式保持 | `update_legacy_block_text_for_markdown_edit` + `replace_single_inline_text_value` 在文本不变时保留 marks，改变时更新 text 字段 |

## 4. 验证结果

```
$ cargo test -p mnote-web markdown_edit -- --test-threads=1
16 passed; 0 failed

$ cargo test -p mnote-web hermes_tools_manifest_describes_markdown_edit_write_contract -- --test-threads=1
1 passed; 0 failed

$ git diff --check
无冲突标记
```

## 5. 结论：可归档

**归档条件全部满足：**
- 步骤 1-6 全部实现 ✅
- P0/P1 测试矩阵全部通过 ✅
- 旧代码已标记退役 ✅
- 命名管道的 reason 字段包含 `"mnote.doc.markdown_edit (7-27)"` ✅
- 开放问题均为已知边界，不需要阻碍归档

## 6. 执行操作

将 `design/07-ai/process/7-27-online-markdown-writeback-final-content-truth-v2.md` 移动到 `design/07-ai/done/`。
