docs: 阶段2收尾——ADR-016/typecheck链/阶段3移交清单/README

- ADR-016:saxes ^6.0.0(勘误:计划曾误写 ^0.9)/commander ^14 根依赖/清洗三件套
  同 range + 镜像直调 launder.naughtyHref/tsx ^4 CLI 直吃 TS;跨包接线(根 tsconfig
  paths 三方消费、build 侧 dist+prebuild、tsconfig 双链型并存);根 engines 升
  >=22.12(对齐 sanitize-html 2.18 engines,CI node 22 与本机 24 均满足)
- 根 typecheck 链扩为四段:追加 pnpm --filter @sf/adapter-wp typecheck
- Plan 2 文末新增"移交阶段 3 清单"定稿(7 项:taxonomyRefs 自建缺失 term、
  media_bundle 映射、connection 库级唯一索引、REST 重审项、导入消费接口、
  Task 0.2 cms 备份续传携带、versions.ts bump 纪律);Task 9 与验收节勾选
- README:快速开始加 pnpm sf 示例;目录结构/文档导航/当前状态更新为阶段 2 完成
- 三绿:lint / typecheck(四段)/ test 263 全部通过(数量不变)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-10-21 13:34:15 +08:00
parent 57357cd493
commit 2a0d830520
6 changed files with 64 additions and 20 deletions
@@ -138,18 +138,30 @@ cms-one/
- [ ] Step 2: 峰值内存记录——smoke 脚本内 `setInterval(100ms)` 采样 `heapUsed` 与 `rss` 取 max(瞬时值无意义);流式断言:解析 5.5MB 文件峰值 heapUsed < 100MB(不整读)
- [ ] Step 3: 耗时记录;结果写 evidence 文档;commit `test(evidence): 阶段2真实WXR冒烟通过`
### Task 9: 阶段 2 收尾
### Task 9: 阶段 2 收尾 ✅ 完成(ADR-016 定稿 / typecheck 四段链 / 根 engines 升 >=22.12 / 移交阶段 3 清单 / README,同批一个 docs commit;三绿 263 不变;不 push——推送由用户执行)
- [ ] ADR-016(saxes/commander/sanitize-html 选型与许可证);根 typecheck 链加 @sf/adapter-wp;lint 全绿;contracts 首个消费者接线验证(adapter-wp workspace 依赖 contracts——**Plan 1 终审前瞻项落实**:import 路径用 dist 还是 src 的决策一并入 ADR-016)
- [ ] **Task 7 审查移交**:① connection (site_id,name) 库级唯一索引须在第二个写入方(REST 通道)出现前完成 ② media_bundle→WXR attachment URL 的映射策略(uploads 路径约定)记入阶段 3 计划输入 ③ REST 化时重审:白名单 TOCTOU、cwd 自动放行、connection.kind 枚举扩 ④ sanitize-html engines>=22.12 与根 engines>=22 的口径(升根或记 ADR)
- [ ] 全量三绿 + push;plan 勾选;**移交阶段 3 清单**(内容/分类/媒体入库:media 魔数校验、source_records 落库、稳定身份 upsert、checksum skip、route_registry 生成;**续传携带:Task 0.2 cms 数据备份(用户暂缓,阶段 6 L3 验收前必须补做**——责任链不断)
- [x] ADR-016(saxes/commander/sanitize-html 选型与许可证);根 typecheck 链加 @sf/adapter-wp;lint 全绿;contracts 首个消费者接线验证(adapter-wp workspace 依赖 contracts——**Plan 1 终审前瞻项落实**:import 路径用 dist 还是 src 的决策一并入 ADR-016)
- [x] **Task 7 审查移交**:① connection (site_id,name) 库级唯一索引须在第二个写入方(REST 通道)出现前完成 ② media_bundle→WXR attachment URL 的映射策略(uploads 路径约定)记入阶段 3 计划输入 ③ REST 化时重审:白名单 TOCTOU、cwd 自动放行、connection.kind 枚举扩 ④ sanitize-html engines>=22.12 与根 engines>=22 的口径(升根或记 ADR)——①~④ 均已沉淀至文末"移交阶段 3 清单",④ 已落 ADR-016 决策三(根 engines 升 >=22.12)
- [x] 全量三绿 + plan 勾选;**移交阶段 3 清单**(见文末新节定稿);push 由用户执行(本任务不 push)
## 验收(对照 spec §15 阶段 2)
- [ ] `source:register` 三类输入登记幂等,快照 content-addressed 且不可变
- [ ] 脱敏夹具全链全绿(mini.xml → 5 row + 0 意外 unsupported)
- [ ] 大文件不整读内存(5.5MB 峰值 <100MB)
- [ ] 恶意/畸形输入安全失败(外部实体/超限/截断——带位置错误,不崩溃不静默)
- [ ] 解析器不访问网络(测试钉死)
- [ ] 真实 WXR 冒烟计数与基线逐项一致;unsupported 75 条分类清晰
- [ ] 三绿(lint/typecheck/test)+ 全部推送
- [x] `source:register` 三类输入登记幂等,快照 content-addressed 且不可变
- [x] 脱敏夹具全链全绿(mini.xml → 5 row + 0 意外 unsupported)
- [x] 大文件不整读内存(5.5MB 峰值 <100MB)
- [x] 恶意/畸形输入安全失败(外部实体/超限/截断——带位置错误,不崩溃不静默)
- [x] 解析器不访问网络(测试钉死)
- [x] 真实 WXR 冒烟计数与基线逐项一致;unsupported 75 条分类清晰
- [x] 三绿(lint/typecheck/test,263 测试);推送由用户执行(Task 9 不 push)
---
## 移交阶段 3 清单(Plan 2 收官定稿——散落各任务的移交项汇总,阶段 3 计划的必读输入)
1. **taxonomyRefs 解析:wp:term 表不完备(真实数据实证)**——本 WXR 的 term 表缺 category(148 引用/5 nicename)与 post_tag(659 引用/471 nicename)条目(WordPress 7.1.3 导出行为)。阶段 3 做 slug→term 解析时须按 **(domain, nicename) 自建缺失 term**(item 引用的 value 作 name),不能只依赖 wp:term 事件。锚点设计已被实数据正向验证:term 表覆盖的 taxonomy 内 nicename≡slug 100%(706/706,见 `docs/evidence/phase2-smoke.md`)。
2. **media_bundle → WXR attachment URL 映射策略**——media 清单(snapshot metadata.manifest,相对路径)与 WXR item 的 attachment_url/图库引用之间的映射须定策略(WordPress uploads 路径约定 `wp-content/uploads/<yyyy>/<mm>/<file>`;路径对拍 + 失配报告)——消费清单时面对。
3. **connection (site_id, name) 库级唯一索引**——现为应用层 select-then-insert(事务 + advisory lock 保护,register.service.ts 注释已注明);**第二写入方(REST 通道)出现前**必须落库级唯一约束。
4. **REST 通道落地时重审**——路径白名单 TOCTOU(校验与 open 之间的窗口)、CLI cwd 自动放行的去留、connection.kind 枚举扩('cli' 之外的新来源值)。
5. **导入管道消费接口**——registerSource 返回值与 snapshot metadata 形状(含 storageRoot/manifest)是阶段 3 的输入契约,消费侧若需变形优先加法扩展;source_records 落库用稳定身份键(ADR-006);checksum skip 语义:changed=false → skip(报告 created/skipped 即导入前投影,spec §7.5)。
6. **续传携带:Task 0.2 cms 数据备份**(用户暂缓)——**阶段 6 L3 验收前必须补做,责任链不断**。
7. **versions.ts bump 纪律提醒**——映射表(DEFAULT_TYPE_ROUTES / STATUS_MAP / META_KEYS)或清洗白名单(SANITIZE_CONFIG)任何实质变更,须 bump 对应 MAPPING_VERSION / SANITIZER_VERSION(bump 语义 JSDoc 已冻结于 `packages/adapter-wordpress/src/versions.ts`);下游以版本块判断是否需要重新标准化(spec §7.5)。