docs(plan): P2 Task 3 勾选 + 两批审查移交件并入 Task 4

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-10-21 09:26:49 +08:00
parent 8edbbad45b
commit f4971a943b
@@ -64,7 +64,7 @@ cms-one/
- [ ] Step 3 绿 → commit `feat(adapter-wp): PHP serialize 受限解析器`
- [ ] 注:只支持 saxes 产出的字符串输入;**绝不 eval**;深度/元素数双限额
### Task 3: saxes 流式 WXR 解析器
### Task 3: saxes 流式 WXR 解析器 ✅ 完成(25e8b9c + 修复 8edbbad,双审通过;142 测试;审查修复:内存上界注释纠正(真实上界 O(maxWxrBytes))、错误前事件排空确定化(chunk 无关)、post_id 严格安全整数解析、嵌套畸形 fail-fast、类型清零强转。遗留至 Task 4:'-0' 归一、负数 id 策略在映射层统一)
**Files:** Create `src/parse/wxr-stream.ts`(依赖 saxes,锁 ^0.9);Test `test/wxr-stream.test.ts`(用 mini.xml)
@@ -90,6 +90,7 @@ cms-one/
- **canonical status 值域**:publish/draft/future/pending/private/trash/inherit → 原样;未知值 → 'unknown' + issue(测试钉死映射表)
- **property 断言**:每条产出 row 的 sourceId/sourceType 非空字符串、taxonomyRefs/attachmentRefs 元素形状合法、rawLocation 存在
- **Task 2 审查移交的补测**:d: 作数组键拒绝、s: 内容含 NUL、数字串键 s:1:"0" 形状归属(→Map)、1MB 性能烟雾(防 O(n²) 回归)
- **Task 3 审查移交的映射层策略**:postId 为 null/负值/-0 时映射器如何产出 sourceId(建议:String(postId) 且 null→记录 issue 并跳过该 item,勿静默猜)
- 注:publishedAt/modifiedAt/title 本阶段留在 knownFields(UniversalRow 顶层提升是阶段 3 导入映射的事,有意不提前)
- [ ] Step 2 实现 `mapItem(item, config): MappedResult`(config: 类型路由表 {post:'wp:post', page:'wp:page', product:'wp:product', attachment:'wp:attachment'} + site locale)——纯函数
- [ ] Step 3 绿 → commit `feat(adapter-wp): WXR→UniversalRow 映射器(status 值域/悬空保留/unsupported 分流)`