2026-04-03-phase1-cleanup.md 28 KB

Phase 1: 清理废弃模块 + 审查合并 + 流程精简

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: 砍掉不产生价值的模块(workflow、resume),将 6 个 checker 合并为 1 个审查 agent,Step 2B 合并到 Step 4,预计单章 Token 降低 60-70%。

Architecture: 纯减法重构。删除 workflow_manager.py 及其测试、resume skill 及其引用。将 6 个独立 checker agent 合并为 1 个 reviewer.md,输出新的结构化问题清单 schema。更新 webnovel-write SKILL.md 流程从 8 步变 7 步。更新 review_pipeline.py 适配新 schema。更新 webnovel.py CLI 移除 workflow 命令。

Tech Stack: Python 3.13, pytest, Claude Code plugin (markdown agents/skills)

Spec: docs/superpowers/specs/2026-04-02-harness-v6-design.md


File Structure

要删除的文件

文件 原因
scripts/workflow_manager.py Claude Code 原生 /resume 替代
scripts/data_modules/tests/test_workflow_manager.py 对应模块删除
skills/webnovel-resume/SKILL.md 同上
skills/webnovel-resume/references/workflow-resume.md 同上
agents/consistency-checker.md 合并到 reviewer.md
agents/continuity-checker.md 合并到 reviewer.md
agents/ooc-checker.md 合并到 reviewer.md
agents/high-point-checker.md 合并到 reviewer.md
agents/pacing-checker.md 合并到 reviewer.md
agents/reader-pull-checker.md 合并到 reviewer.md
references/checker-output-schema.md 被新 schema 替代
skills/webnovel-write/references/step-3-review-gate.md 逻辑内联到 SKILL.md
skills/webnovel-write/references/step-5-debt-switch.md 0.6KB,内联到 SKILL.md
skills/webnovel-write/references/workflow-details.md 已标记 deprecated
skills/webnovel-write/references/step-1.5-contract.md context-agent 将重构

要创建的文件

文件 职责
agents/reviewer.md 统一审查 agent,输出结构化问题清单
references/review-schema.md 新审查输出 schema 定义
scripts/data_modules/review_schema.py 新 schema 的 Python 数据类 + 校验
scripts/data_modules/tests/test_review_schema.py 新 schema 测试

要修改的文件

文件 改什么
skills/webnovel-write/SKILL.md 7 步新流程,去 workflow 记录,去 Step 2B,合并审查
scripts/review_pipeline.py 适配新 schema(无 overall_score,有 blocking_count)
scripts/data_modules/webnovel.py 移除 workflow 命令路由
scripts/data_modules/index_manager.py review_metrics 表结构适配(去 overall_score,加 issues_count/blocking_count)
scripts/data_modules/tests/test_webnovel_unified_cli.py 移除 workflow 相关测试
scripts/data_modules/tests/test_coverage_boost.py 移除 workflow 相关引用

Task 1: 定义新审查 schema

Files:

  • Create: scripts/data_modules/review_schema.py
  • Create: scripts/data_modules/tests/test_review_schema.py
  • Create: references/review-schema.md

  • [ ] Step 1: 写 schema 测试

    # scripts/data_modules/tests/test_review_schema.py
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """审查 schema 测试"""
    import pytest
    from data_modules.review_schema import ReviewIssue, ReviewResult, parse_review_output
    
    
    def test_review_issue_blocking_defaults():
    """critical severity 默认 blocking=True"""
    issue = ReviewIssue(
        severity="critical",
        category="continuity",
        location="第3段",
        description="主角使用了已失去的能力",
    )
    assert issue.blocking is True
    
    
    def test_review_issue_non_critical_not_blocking():
    """非 critical 默认 blocking=False"""
    issue = ReviewIssue(
        severity="high",
        category="setting",
        location="第7段",
        description="时间线矛盾",
    )
    assert issue.blocking is False
    
    
    def test_review_result_counts():
    """blocking_count 自动计算"""
    result = ReviewResult(
        chapter=10,
        issues=[
            ReviewIssue(severity="critical", category="continuity", location="p1", description="d1"),
            ReviewIssue(severity="high", category="setting", location="p2", description="d2"),
            ReviewIssue(severity="high", category="timeline", location="p3", description="d3", blocking=True),
        ],
        summary="测试",
    )
    assert result.blocking_count == 2
    assert result.issues_count == 3
    assert result.has_blocking is True
    
    
    def test_review_result_no_issues():
    result = ReviewResult(chapter=10, issues=[], summary="无问题")
    assert result.blocking_count == 0
    assert result.has_blocking is False
    
    
    def test_review_result_to_dict_roundtrip():
    result = ReviewResult(
        chapter=10,
        issues=[
            ReviewIssue(severity="medium", category="ai_flavor", location="p5", description="AI味重",
                        evidence="'稳住心神'出现3次", fix_hint="替换为具体动作描写"),
        ],
        summary="1个AI味问题",
    )
    d = result.to_dict()
    assert d["chapter"] == 10
    assert d["blocking_count"] == 0
    assert len(d["issues"]) == 1
    assert d["issues"][0]["category"] == "ai_flavor"
    assert d["issues"][0]["fix_hint"] == "替换为具体动作描写"
    
    
    def test_parse_review_output_from_dict():
    raw = {
        "issues": [
            {"severity": "critical", "category": "continuity", "location": "p1",
             "description": "矛盾", "evidence": "证据", "fix_hint": "修复"},
        ],
        "summary": "1个严重问题",
    }
    result = parse_review_output(chapter=5, raw=raw)
    assert result.chapter == 5
    assert result.blocking_count == 1
    
    
    def test_parse_review_output_tolerates_missing_fields():
    raw = {
        "issues": [
            {"severity": "low", "description": "小问题"},
        ],
        "summary": "轻微",
    }
    result = parse_review_output(chapter=1, raw=raw)
    assert result.issues[0].category == "other"
    assert result.issues[0].location == ""
    
    
    def test_review_result_to_metrics_dict():
    result = ReviewResult(
        chapter=10,
        issues=[
            ReviewIssue(severity="critical", category="continuity", location="p1", description="d1"),
            ReviewIssue(severity="high", category="ai_flavor", location="p2", description="d2"),
        ],
        summary="测试",
    )
    metrics = result.to_metrics_dict()
    assert metrics["chapter"] == 10
    assert metrics["issues_count"] == 2
    assert metrics["blocking_count"] == 1
    assert "continuity" in metrics["categories"]
    assert "ai_flavor" in metrics["categories"]
    
  • [ ] Step 2: 运行测试确认失败

Run: cd webnovel-writer/scripts && python -m pytest data_modules/tests/test_review_schema.py -v --no-cov Expected: FAIL — ModuleNotFoundError: No module named 'data_modules.review_schema'

  • [ ] Step 3: 实现 review_schema.py

    # scripts/data_modules/review_schema.py
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    审查结果 schema(v6)。
    
    替代原 checker-output-schema.md 的评分制,改为结构化问题清单。
    """
    from __future__ import annotations
    
    from dataclasses import asdict, dataclass, field
    from datetime import datetime
    from typing import Any, Dict, List, Optional
    
    VALID_SEVERITIES = {"critical", "high", "medium", "low"}
    VALID_CATEGORIES = {
    "continuity", "setting", "character", "timeline",
    "ai_flavor", "logic", "pacing", "other",
    }
    
    
    @dataclass
    class ReviewIssue:
    severity: str
    category: str = "other"
    location: str = ""
    description: str = ""
    evidence: str = ""
    fix_hint: str = ""
    blocking: Optional[bool] = None
    
    def __post_init__(self):
        if self.severity not in VALID_SEVERITIES:
            self.severity = "medium"
        if self.category not in VALID_CATEGORIES:
            self.category = "other"
        if self.blocking is None:
            self.blocking = self.severity == "critical"
    
    def to_dict(self) -> Dict[str, Any]:
        return asdict(self)
    
    
    @dataclass
    class ReviewResult:
    chapter: int
    issues: List[ReviewIssue] = field(default_factory=list)
    summary: str = ""
    
    @property
    def issues_count(self) -> int:
        return len(self.issues)
    
    @property
    def blocking_count(self) -> int:
        return sum(1 for i in self.issues if i.blocking)
    
    @property
    def has_blocking(self) -> bool:
        return self.blocking_count > 0
    
    def to_dict(self) -> Dict[str, Any]:
        return {
            "chapter": self.chapter,
            "issues": [i.to_dict() for i in self.issues],
            "issues_count": self.issues_count,
            "blocking_count": self.blocking_count,
            "has_blocking": self.has_blocking,
            "summary": self.summary,
        }
    
    def to_metrics_dict(self) -> Dict[str, Any]:
        categories = sorted(set(i.category for i in self.issues))
        return {
            "chapter": self.chapter,
            "issues_count": self.issues_count,
            "blocking_count": self.blocking_count,
            "categories": categories,
            "timestamp": datetime.now().isoformat(timespec="seconds"),
        }
    
    
    def parse_review_output(chapter: int, raw: Dict[str, Any]) -> ReviewResult:
    issues = []
    for item in raw.get("issues", []):
        if not isinstance(item, dict):
            continue
        issues.append(ReviewIssue(
            severity=str(item.get("severity", "medium")),
            category=str(item.get("category", "other")),
            location=str(item.get("location", "")),
            description=str(item.get("description", "")),
            evidence=str(item.get("evidence", "")),
            fix_hint=str(item.get("fix_hint", "")),
            blocking=item.get("blocking"),
        ))
    return ReviewResult(
        chapter=chapter,
        issues=issues,
        summary=str(raw.get("summary", "")),
    )
    
  • [ ] Step 4: 运行测试确认通过

Run: cd webnovel-writer/scripts && python -m pytest data_modules/tests/test_review_schema.py -v --no-cov Expected: 8 passed

  • [ ] Step 5: 写 review-schema.md 参考文档

    # 审查输出 Schema(v6)
    
    统一审查 Agent 输出格式。替代原 checker-output-schema.md 的评分制。
    
    ## 核心变化
    
    - **无总分**:不再输出 overall_score,改为结构化问题清单
    - **blocking 语义**:替代原 timeline_gate,severity=critical 默认阻断
    - **单 agent**:不再区分 6 个 checker,统一由 reviewer agent 输出
    
    ## Issue Schema
    
    | 字段 | 类型 | 必填 | 说明 |
    |------|------|------|------|
    | severity | critical/high/medium/low | ✅ | 严重度 |
    | category | continuity/setting/character/timeline/ai_flavor/logic/pacing/other | ✅ | 问题分类 |
    | location | string | ✅ | 位置(如"第3段") |
    | description | string | ✅ | 问题描述 |
    | evidence | string | ❌ | 原文引用或记忆对比 |
    | fix_hint | string | ❌ | 修复建议 |
    | blocking | bool | ❌ | 是否阻断(critical 默认 true) |
    
    ## 阻断规则
    
    - 存在任何 `blocking=true` 的 issue → Step 4 不得开始
    - `severity=critical` 自动 `blocking=true`
    - 其余 severity 由审查 agent 根据上下文判断
    
    ## 指标沉淀
    
    每次审查写入 `index.db.review_metrics`:
    - `chapter, issues_count, blocking_count, categories, timestamp`
    - 用于趋势观测,不用于 gate 决策
    
  • [ ] Step 6: 提交

    git add scripts/data_modules/review_schema.py scripts/data_modules/tests/test_review_schema.py references/review-schema.md
    git commit -m "feat: 新审查 schema(v6)——结构化问题清单替代评分制"
    

Task 2: 创建统一审查 agent

Files:

  • Create: agents/reviewer.md

  • [ ] Step 1: 写 reviewer.md

    ---
    name: reviewer
    description: 统一审查 agent。检查正文的设定一致性、叙事连贯性、角色一致性、时间线、AI味,输出结构化问题清单。
    tools: Read, Grep, Bash
    model: inherit
    ---
    
    # reviewer(统一审查 agent)
    
    ## 身份与目标
    
    你是章节审查员。你的职责是读完正文后,找出所有可验证的问题,输出结构化问题清单。
    
    你不评分、不给建议、不写摘要性评价。你只找问题、给证据、给修复方向。
    
    ## 可用工具
    
    - `Read`:读取正文、设定集、记忆数据
    - `Grep`:在正文中搜索关键词
    - `Bash`:调用记忆模块查询
    
    

    bash

查询角色当前状态

python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" state get-entity --id "{entity_id}"

查询最近状态变更

python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" index get-recent-state-changes --limit 20


## 思维链(ReAct)

对每个检查维度:
1. **读取**相关数据(角色状态、世界规则、上章摘要)
2. **对比**正文内容与数据
3. **判断**是否存在矛盾/问题
4. **记录**问题到清单(含 evidence 和 fix_hint)

## 输入

- `chapter`:章节号
- `chapter_file`:正文文件路径
- `project_root`:项目根目录
- `scripts_dir`:脚本目录

## 检查维度(按顺序执行)

### 1. 设定一致性(category: setting)
- 角色能力是否与当前境界匹配
- 地点描述是否与世界观一致
- 物品/货币使用是否符合已建立规则

### 2. 时间线(category: timeline)
- 本章时间是否与上章衔接(无回跳或有合理解释)
- 倒计时/截止日期是否正确推进
- 角色同时出现在两个地点

### 3. 叙事连贯(category: continuity)
- 上章钩子是否有回应
- 场景转换是否有过渡
- 情绪弧是否连续(上章愤怒本章突然平静无过渡)

### 4. 角色一致性(category: character)
- 对话风格是否符合角色特征
- 行为是否与已建立的性格/动机一致
- 角色知识边界——角色是否使用了不应知道的信息

### 5. 逻辑(category: logic)
- 因果关系是否成立
- 角色决策是否有合理动机
- 战斗/冲突结果是否符合已建立的力量对比

### 6. AI味(category: ai_flavor)
- 是否存在禁用词/禁用句式(稳住心神、不禁XXX、嘴角微微上扬等)
- 是否存在每段"起因→经过→结果→感悟"的四段式结构
- 是否存在过度解释(展示而非讲述的缺失)
- 情绪描写是否模板化("眼中闪过一丝XXX")

## 边界与禁区

- **不评分**——不输出 overall_score、不输出 pass/fail
- **不评价文笔质量**——"写得不够好"不是 issue,"与角色性格矛盾"才是
- **不建议情节改动**——"这里应该加个反转"不是 issue
- **不重复大纲内容**——不在 issue 中暴露未发生的剧情
- **只报可验证的问题**——必须有 evidence(原文引用 or 数据对比)

## 检查清单

完成审查前自检:
- [ ] 每个 issue 都有 evidence
- [ ] 没有"感觉"类的主观评价
- [ ] severity 分级合理(critical 仅用于确定的事实矛盾)
- [ ] category 归类正确
- [ ] blocking 字段只在 critical 或确认阻断时为 true

## 输出格式

严格按以下 JSON 格式输出(无其他文本):

json { "issues": [

{
  "severity": "critical | high | medium | low",
  "category": "continuity | setting | character | timeline | ai_flavor | logic | pacing | other",
  "location": "第N段 或 具体引用",
  "description": "问题描述",
  "evidence": "原文引用 vs 数据记录",
  "fix_hint": "修复方向",
  "blocking": true
}

], "summary": "N个问题:X个阻断,Y个高优" }


## 错误处理

- 无法读取角色状态 → 跳过设定一致性检查,在 summary 中标注"无法校验设定一致性:数据读取失败"
- 无法读取上章摘要 → 跳过连贯性检查中的"上章钩子回应"项
- 正文为空 → 输出单条 critical issue:"正文为空"
  • [ ] Step 2: 提交

    git add agents/reviewer.md
    git commit -m "feat: 统一审查 agent reviewer.md——合并6个checker为1个"
    

Task 3: 删除 workflow 模块和 resume skill

Files:

  • Delete: scripts/workflow_manager.py
  • Delete: scripts/data_modules/tests/test_workflow_manager.py
  • Delete: skills/webnovel-resume/SKILL.md
  • Delete: skills/webnovel-resume/references/workflow-resume.md
  • Modify: scripts/data_modules/webnovel.py
  • Modify: scripts/data_modules/tests/test_coverage_boost.py

  • [ ] Step 1: 从 webnovel.py 移除 workflow 命令路由

scripts/data_modules/webnovel.py 中删除 workflow 相关的 parser 和路由:

删除 parser 定义:

# 删除这两行
p_workflow = sub.add_parser("workflow", help="转发到 workflow_manager.py")
p_workflow.add_argument("args", nargs=argparse.REMAINDER)

删除路由分支:

# 删除这两行
if tool == "workflow":
    raise SystemExit(_run_script("workflow_manager.py", [*forward_args, *rest]))
  • Step 2: 从 test_coverage_boost.py 移除 workflow 相关测试

删除 test_webnovel_passthrough_workflow_script 测试函数。

  • [ ] Step 3: 删除 workflow_manager.py 和测试

    git rm scripts/workflow_manager.py
    git rm scripts/data_modules/tests/test_workflow_manager.py
    
  • [ ] Step 4: 删除 resume skill

    git rm skills/webnovel-resume/SKILL.md
    git rm skills/webnovel-resume/references/workflow-resume.md
    rmdir skills/webnovel-resume/references 2>/dev/null || true
    rmdir skills/webnovel-resume 2>/dev/null || true
    
  • [ ] Step 5: 运行测试确认无破损

Run: cd "D:\wk\novel skill\webnovel-writer" && python -m pytest --no-cov --tb=short Expected: 全部通过(数量会减少,因为删了 test_workflow_manager.py 的 10 个测试)

  • [ ] Step 6: 提交

    git add -A
    git commit -m "refactor: 移除 workflow_manager + resume skill,由 Claude Code /resume 替代"
    

Task 4: 删除 6 个旧 checker agent 和旧 schema

Files:

  • Delete: agents/consistency-checker.md
  • Delete: agents/continuity-checker.md
  • Delete: agents/ooc-checker.md
  • Delete: agents/high-point-checker.md
  • Delete: agents/pacing-checker.md
  • Delete: agents/reader-pull-checker.md
  • Delete: references/checker-output-schema.md
  • Delete: skills/webnovel-write/references/step-3-review-gate.md

  • [ ] Step 1: 删除旧 checker agents

    git rm agents/consistency-checker.md
    git rm agents/continuity-checker.md
    git rm agents/ooc-checker.md
    git rm agents/high-point-checker.md
    git rm agents/pacing-checker.md
    git rm agents/reader-pull-checker.md
    
  • [ ] Step 2: 删除旧 schema 和 review gate

    git rm references/checker-output-schema.md
    git rm skills/webnovel-write/references/step-3-review-gate.md
    
  • [ ] Step 3: 提交

    git add -A
    git commit -m "refactor: 移除6个旧checker agent和旧schema,由reviewer.md替代"
    

Task 5: 更新 review_pipeline.py 适配新 schema

Files:

  • Modify: scripts/review_pipeline.py
  • Modify: scripts/data_modules/tests/test_webnovel_unified_cli.py

  • [ ] Step 1: 写测试——review_pipeline 适配新 schema

test_webnovel_unified_cli.py 中修改 test_review_pipeline_builds_artifacts,将旧的 checker 多结果格式改为新的单 reviewer 输出:

def test_review_pipeline_builds_artifacts_v6(tmp_path):
    _ensure_scripts_on_path()
    import review_pipeline as review_pipeline_module

    project_root = (tmp_path / "book").resolve()
    (project_root / ".webnovel").mkdir(parents=True, exist_ok=True)
    (project_root / ".webnovel" / "state.json").write_text("{}", encoding="utf-8")

    review_results_path = tmp_path / "review_results.json"
    review_results_path.write_text(
        json.dumps(
            {
                "issues": [
                    {
                        "severity": "critical",
                        "category": "timeline",
                        "location": "第2段",
                        "description": "时间线回跳",
                        "evidence": "上章深夜,本章突然中午",
                        "fix_hint": "补时间过渡",
                        "blocking": True,
                    },
                    {
                        "severity": "medium",
                        "category": "ai_flavor",
                        "location": "第5段",
                        "description": "'稳住心神'出现2次",
                        "fix_hint": "替换为具体动作",
                    },
                ],
                "summary": "1个阻断,1个中等",
            },
            ensure_ascii=False,
        ),
        encoding="utf-8",
    )

    payload = review_pipeline_module.build_review_artifacts(
        project_root=project_root,
        chapter=20,
        review_results_path=review_results_path,
        report_file="",
    )

    assert payload["review_result"]["blocking_count"] == 1
    assert payload["review_result"]["has_blocking"] is True
    assert payload["review_result"]["issues_count"] == 2
    assert payload["metrics"]["issues_count"] == 2
    assert payload["metrics"]["blocking_count"] == 1
  • Step 2: 运行测试确认失败

Run: cd webnovel-writer/scripts && python -m pytest data_modules/tests/test_webnovel_unified_cli.py::test_review_pipeline_builds_artifacts_v6 -v --no-cov Expected: FAIL(review_pipeline 还是旧逻辑)

  • [ ] Step 3: 重写 review_pipeline.py

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    Step 3 审查结果处理。
    
    读取 reviewer agent 的原始输出 JSON,解析为 ReviewResult,
    生成 metrics 用于 index.db 沉淀。
    """
    from __future__ import annotations
    
    import json
    import sys
    from pathlib import Path
    from typing import Any, Dict, Optional
    
    
    def _ensure_scripts_path() -> None:
    scripts_dir = Path(__file__).resolve().parent
    if str(scripts_dir) not in sys.path:
        sys.path.insert(0, str(scripts_dir))
    
    
    _ensure_scripts_path()
    
    from data_modules.review_schema import ReviewResult, parse_review_output
    
    
    def build_review_artifacts(
    project_root: Path,
    chapter: int,
    review_results_path: Path,
    report_file: str = "",
    ) -> Dict[str, Any]:
    raw = json.loads(review_results_path.read_text(encoding="utf-8"))
    result = parse_review_output(chapter=chapter, raw=raw)
    metrics = result.to_metrics_dict()
    if report_file:
        metrics["report_file"] = report_file
    
    return {
        "chapter": chapter,
        "review_result": result.to_dict(),
        "metrics": metrics,
    }
    
    
    def main() -> None:
    import argparse
    
    parser = argparse.ArgumentParser(description="Review pipeline v6")
    parser.add_argument("--project-root", required=True)
    parser.add_argument("--chapter", type=int, required=True)
    parser.add_argument("--review-results", required=True)
    parser.add_argument("--metrics-out", default="")
    parser.add_argument("--report-file", default="")
    
    args = parser.parse_args()
    project_root = Path(args.project_root)
    review_results_path = Path(args.review_results)
    
    payload = build_review_artifacts(
        project_root=project_root,
        chapter=args.chapter,
        review_results_path=review_results_path,
        report_file=args.report_file,
    )
    
    if args.metrics_out:
        out_path = Path(args.metrics_out)
        out_path.parent.mkdir(parents=True, exist_ok=True)
        out_path.write_text(
            json.dumps(payload["metrics"], ensure_ascii=False, indent=2),
            encoding="utf-8",
        )
    
    print(json.dumps(payload, ensure_ascii=False, indent=2))
    
    
    if __name__ == "__main__":
    main()
    
  • [ ] Step 4: 运行测试确认通过

Run: cd webnovel-writer/scripts && python -m pytest data_modules/tests/test_webnovel_unified_cli.py -v --no-cov Expected: 全部通过

  • [ ] Step 5: 提交

    git add scripts/review_pipeline.py scripts/data_modules/tests/test_webnovel_unified_cli.py
    git commit -m "refactor: review_pipeline 适配 v6 schema——无评分,结构化问题清单"
    

Task 6: 更新 webnovel-write SKILL.md(新 7 步流程)

Files:

  • Modify: skills/webnovel-write/SKILL.md
  • Delete: skills/webnovel-write/references/step-5-debt-switch.md
  • Delete: skills/webnovel-write/references/workflow-details.md
  • Delete: skills/webnovel-write/references/step-1.5-contract.md

  • [ ] Step 1: 删除废弃引用文件

    git rm skills/webnovel-write/references/step-5-debt-switch.md
    git rm skills/webnovel-write/references/workflow-details.md
    git rm skills/webnovel-write/references/step-1.5-contract.md
    
  • [ ] Step 2: 重写 SKILL.md

完整重写 skills/webnovel-write/SKILL.md,核心变化:

  1. 流程从 8 步变 7 步

    Step 0.5 预检 → Step 1 上下文搜集 → Step 2 起草 → Step 3 审查 → Step 4 润色+风格+anti-AI → Step 5 数据回写 → Step 6 Git
    
  2. 去掉所有 workflow 记录命令(删除每步前后的 workflow start-step / complete-step

  3. Step 2B 合并到 Step 4:Step 4 职责变为"润色 + 风格适配 + anti-AI 修复"

  4. Step 3 改为单 reviewer agent

    使用 Task 调用 reviewer agent(不再调用 6 个独立 checker)
    输出:review_results.json(新 schema)
    通过 review_pipeline 生成 metrics
    blocking issue 存在时阻断
    
  5. Step 4 增加 anti-AI 职责

    - 消费 Step 3 的问题清单,逐条修复
    - 执行风格适配(原 Step 2B 的工作)
    - anti-AI 最终 gate:修复后复检,确认无 blocking 残留
    
  6. 模式定义更新

    标准:Step 0.5 → 1 → 2 → 3 → 4 → 5 → 6
    --fast:Step 0.5 → 1 → 2 → 3(轻量) → 4 → 5 → 6
    --minimal:Step 0.5 → 1 → 2 → 4(仅排版) → 5 → 6
    
  7. References 更新:移除对已删文件的引用,添加 review-schema.md 引用

  • [ ] Step 3: 提交

    git add -A
    git commit -m "refactor: webnovel-write SKILL.md v6——7步流程,单reviewer,合并风格适配"
    

Task 7: 清理旧 review_pipeline 测试并跑全量回归

Files:

  • Modify: scripts/data_modules/tests/test_webnovel_unified_cli.py

  • [ ] Step 1: 移除旧 review_pipeline 测试中不兼容的断言

更新 test_review_pipeline_builds_artifactstest_review_pipeline_main_creates_output_directories 以适配新 schema。旧测试依赖 overall_scoretimeline_gate 等已移除的字段。

如果 Task 5 的新测试已覆盖,直接删除旧版测试。

  • Step 2: 全量回归测试

Run: cd "D:\wk\novel skill\webnovel-writer" && python -m pytest --tb=short Expected: 全部通过,覆盖率 ≥ 90%

  • [ ] Step 3: 如有失败修复后提交

    git add -A
    git commit -m "test: 清理旧 review 测试,全量回归通过"
    

Task 8: 最终验证

  • [ ] Step 1: 确认删除完整性

    # 这些文件应该不存在
    test ! -f webnovel-writer/scripts/workflow_manager.py
    test ! -f webnovel-writer/skills/webnovel-resume/SKILL.md
    test ! -f webnovel-writer/agents/consistency-checker.md
    test ! -f webnovel-writer/agents/continuity-checker.md
    test ! -f webnovel-writer/agents/ooc-checker.md
    test ! -f webnovel-writer/agents/high-point-checker.md
    test ! -f webnovel-writer/agents/pacing-checker.md
    test ! -f webnovel-writer/agents/reader-pull-checker.md
    test ! -f webnovel-writer/references/checker-output-schema.md
    
    # 这些文件应该存在
    test -f webnovel-writer/agents/reviewer.md
    test -f webnovel-writer/references/review-schema.md
    test -f webnovel-writer/scripts/data_modules/review_schema.py
    
  • [ ] Step 2: 全量测试 + 覆盖率

Run: cd "D:\wk\novel skill\webnovel-writer" && python -m pytest Expected: 全部通过,覆盖率 ≥ 90%

  • [ ] Step 3: 确认 agents/ 目录只剩 3 个 agent

    ls webnovel-writer/agents/
    # 期望:context-agent.md  data-agent.md  reviewer.md
    
  • [ ] Step 4: 最终提交(如有遗漏修复)

    git add -A
    git commit -m "chore: Phase 1 完成——清理验证通过"