工作区/待定稿/
批次.json 批次元数据(真源,机器域 JSON)
0006-夜探藏经阁/
草稿.md front matter + 正文(终稿形态)
定稿包.json 完整 finalize payload(预登记的机器形态)
审稿单.md 该章两审产物(批量审稿呈报用)
0007-.../
src/staging/index.js(新模块,批次真源的唯一读写点)
├─ readBatch(repoPath) → {exists, 起章, 章列表:[{章号,标题,状态,目录}], 连续无条目变动}
├─ stagedFacts(repoPath) → 叠加视图用事实包(见 §2.2)
├─ stageChapter(ctx, {chapterNum, payload}) → 校验+落盘+清工作区+停止判定
├─ judgeStop(ctx, batch) → {stop: bool, reasons: string[]}(四件套,纯脚本)
├─ judgeBatchQuality(staged, baselineFp, config) → 质检判据(纯函数,零 IO)
├─ rejectFrom(repoPath, chapterNum) → K=打回,K+1..N=受影响
├─ finalizeBatch(ctx) → 逐章 finalizeChapter,按章原子
└─ discardBatch(repoPath) → 删批次
commands/:stage-chapter / batch-status / finalize-batch / batch-reject / batch-discard(薄壳)
消费点小改:prep/index.js、review/index.js、mechanical-check/index.js、state-machine/{index,dto}.js
写章八阶段与状态机零改动(spec §8.1);自动模式只是"第 7-8 步的确认与入档推迟到批末"。
{
"起章": 6,
"章列表": [
{ "章号": 6, "标题": "夜探藏经阁", "状态": "待审收", "目录": "0006-夜探藏经阁" },
{ "章号": 7, "标题": "…", "状态": "受影响", "目录": "0007-…" }
],
"连续无条目变动": 0
}
待审收 | 打回 | 受影响。stage-chapter 写入/覆盖时置待审收并重算计数;rejectFrom 置打回/受影响。NNNN-净化标题(复用 ChapterWriter 的 sanitize 规则,抽公共 util 或复制口径并测一致)。受影响并人话说明——宁保守勿臆断);空目录=无批次。{
chapters: [{ 章号, 标题, frontMatter, body }], // 升序;来自各章 草稿.md
threads: Map<id, {status, lastAdvanced}>, // 由各定稿包 threadUpdates + 草稿声明推导
newEntities: Set<string>, newAliases: Set<string>, // rosterUpserts 的 正名/别名
characterUpdates: Map<name, updates合并>, // 后章覆盖前章同字段
timelineRows: [{volumeNum, row}],
secretWrites: [{id, frontMatter, content}],
总字数, 弱钩尾计数 // 近况叠加用的派生值
}
threadUpdates[].updates.状态 直接采信;开启类声明(草稿 front matter「埋下/设下/萌芽」)产生新条目 进行 态。与机检/审稿共用 parseThreadDeclarations,不双写。warnings 里如实说明(消费点原样透传给报告/材料,不静默)。前置校验(不过则零写入):
工作区/审稿.md 存在(先审后暂存——与手动模式"作者过目审稿单"对应的自动模式不变量:审稿单必须已生成,作者批末统一看)落盘(writeAtomicBatch 原子批):草稿.md(payload.frontMatter+body 组回)、定稿包.json、审稿单.md(搬 工作区/审稿.md 内容)、批次.json 更新;随后清工作区单章文件(细纲/本章写作材料/草稿-A/审稿/评审报告——payload.workspaceFiles 并集)。
返回:{ok, staged: N, 停止: judgeStop 结果, output 人话}。
staged ≥ config.连写批次大小收卷: 是 → 停(转卷复盘);下一章卷号(末 staged 章卷号,或其 +1 若收卷)无 大纲/卷纲/第NN卷.md → 停config.连写无条目变动上限(默认 3;BookConfigReader defaults 加键)包含'弱钩'或以'-弱'结尾)≥ 连续弱钩上限{过线: bool, 原因: string[]},原因人话("批内连续 3 章弱钩,建议人工过一眼节奏")。stagedFacts 有章时——近章结尾取 staged 末两章 body 尾 150 字(不足再回定稿章补);时间线片段追加 staged rows(标注「批内预登记」);信息差边界并入 staged secretWrites(listUnrevealed 结果 + staged 未揭晓);全书近况行加「批内已暂存 X 章(第 A-B 章)」且总章数/字数/连续弱钩计入 staged。{id, type, 简述: 声明原文, 状态, 开启章} 形态出现);名册/相关角色并入 newEntities/characterUpdates;时间线/信息差/近况同 prep 口径。checkThreadDeclarations 的 known Map 并入 staged threads;checkNewProperNouns 的 known 并入 newEntities/newAliases;checkSecretKeywords 增 staged 未揭晓秘密。签名不动——staging 事实在 mechanicalCheck 入口读一次传下去。readBatch().exists 为开关:无批次零行为变化(AC5 全关矩阵)。finalizeChapter(ctx, payload)(每章自身原子 commit + 缓存刷新)→ 成功删该章批次目录并更新批次.json。失败 → 立即停,返回已入档/未入档清单与人话原因(已入档的保留——按章原子;工作区剩余批次原样,续跑=修复后再跑 finalize-batch)。runHealthCheck(例行,只算定稿)→ 输出附体检一句话状态。--until=<章号>:只转正到第 K 章(作者"前几章先发"),其余留批次。batch-reject <章号>:章号必须在批次内;置 K=打回(清该章目录内容,保留目录与元数据行——重写后 stage-chapter 覆盖)、K+1..N=受影响(工件保留)。受影响章重审通道:宿主重跑 review-input(叠加视图已反映 K 重写后事实)→ save-review → stage-chapter <章号> --payload=… 覆盖式重暂存(章号连续性校验对"批内已存在的章号"放行为覆盖)。batch-discard:fs.rm 待定稿/ 整树;输出确认人话。破坏性:宿主必须先向作者确认(SKILL.md 写明),脚本本身不再二次确认(CLI 无交互约定)。batch-status [--json]:readBatch + judgeStop + judgeBatchQuality + 各章审稿单阻断数摘要;--json 给宿主,无参出人话表。unfinishedWorkDetail 的待定稿分支充实——dto 加 批次: {起章, 章数, 各章状态摘要, 建议};「从哪继续」细分:有打回/受影响 → "重写打回章/重审受影响章";全待审收且停止命中 → "呈报作者批量审稿";未满 → "继续批内下一章"。自动确认细纲: config.自动确认细纲 布尔直出 + 期望产物文案条件化;连写指引一句话("作者要连写时走 stage-chapter 批次流,见 SKILL 自动模式段")。连写无条目变动上限 进 BookConfigReader defaults(值 3)+ spec §3 回填。git revert 单期可退;批次数据全在工作区(gitignore),代码回退不留残留状态。batch-discard 清工作区即回到手动模式,定稿零污染——宪法级路径(作者敲定才入 git)保证爆炸半径限于工作区。