按批推进,每批一个 commit(独立回滚点)。每批完成即跑该批验证命令;最后一轮全量。
约定:测试命令在 v7/ 下跑,Windows 需 PYTHONUTF8=1(涉 python 时)与 $env:NODE_OPTIONS 不动;node 测试 npm test(vitest)。
test/commands/_helper.js gitBookCtx:写 .gitignore(.cache/、工作区/)+ core.quotepath false + 只 add 跟踪面(对齐 persist.js:58-78)npm test 全绿;git -C <tmp仓库> ls-files | grep 工作区 为空(用一条新断言固化)commit: test(v7): gitBookCtx 对齐真实建书形态(G-1)
serializers/yaml-dialect.js:needsQuoting 补全 + 双引号分支完整转义;新增往返测试表(review 全部 DRIFT/PARSEFAIL 值)storage/atomic.js:renamedIn 标志 + restorePlan 三段式;故障注入测试(第 2 文件 writeFile 抛错 → B 原文完好)state-machine/persist.js:validateRepairContent 按路径分派(book.yaml→parseBookConfig / 名册·时间线→parseMarkdownTable / 其余→parseFrontMatter);测试覆盖三类文件修复被接受util/workspace-path.js normalizeWorkspaceRel(剥前缀+按段拒 ..);finalizeChapter/stageChapter/两命令壳接入;finalize 清理 recursive+try/warning 不改写 ok;测试:目录清理失败仍 ok:true、.. 逃逸被拒、前缀直调不漏清flows/goto-chapter.js + R2 commands/finalize.js:active 批次守卫 + 人话指引;测试:批次在场 goto 被拒、手动 finalize 被拒(用批 0 修正后的 gitBookCtx)npm test;针对性重放上轮探针场景 P-1/P-2/P-3/P-7b 断言新语义commit: fix(v7): 互斥守卫+序列化器+原子写时序——第三轮 review 批1(R1-R4/R7/R8/R12)
util/aliases.js splitAliases 单源;EntityReader:87 / rebuilder:262 / staging 接入(A13 顺带)util/entity-type.js normalizeEntityType;rebuilder scanEntities/scanCharacters(ON CONFLICT 补 type)+ EntityReader 降级路径接入;fixture 名册类型改中文;测试:中文类型迁移书 list-characters/report/审稿名册可见serializers/markdown-table.js + parsers/markdown-table.js:\| 转义读写对称、全角行归一、多余列保留;EntityWriter.upsertRosterRow 合并保额外列;往返测试migrate/transform.js book.yaml 走 serializeYAML;测试:[快穿]反派/*追读/纯数字书名迁移后 parseBookConfig ok 且 books.jsonl 扫描重建不丢书npm test + migrate e2e(v6-inline/v6-sqlite fixtures)+ 探针场景 P-5/P-6commit: fix(v7): 迁移链类型/别名/序列化收口——第三轮 review 批2(R5/R6/R9-R11)
按 design.md 模块分组执行,可按模块拆多个小 commit:
npm test 全量commit: fix(v7): P2/S 清扫——第三轮 review 批3(或按模块多 commit)
npm test(429+新增全绿)→ push 观察 CI 六 jobcommit: docs(v7): spec 0.14 回填——第三轮 review 修复收口
每批独立 commit;批 1/2 涉及序列化器写路径,若发现写格式回归(存量书读不回),revert 对应批 commit 即可——读路径未动,存量文件安全。