Просмотр исходного кода

test: skill-creator eval——reviewer/write/review 3组eval + 测试项目fixture

测试项目 fixture 包含:
- state.json(3章进度、主角状态、实体、伏笔)
- 大纲(总纲 + 详细大纲 + 时间线)
- 设定集(世界观)
- 摘要(ch0003)
- 长期记忆(world_rule + open_loop)
- 故意植入 AI 癖好的第4章正文

Eval 覆盖:
- reviewer: 3 个 eval(AI味检测 + 设定一致性 + 连贯性)
- webnovel-write: 3 个 eval(标准/fast/anti-AI 模式)
- webnovel-review: 1 个 eval(完整审查流程)

运行方式:/skill-creator eval 然后指定 skill 路径
lingfengQAQ 2 месяцев назад
Родитель
Сommit
9f80ba8520

+ 56 - 0
webnovel-writer/agents/evals/evals.json

@@ -0,0 +1,56 @@
+{
+  "skill_name": "reviewer",
+  "evals": [
+    {
+      "id": 1,
+      "prompt": "审查第4章正文。chapter=4, chapter_file='正文/第0004章-迦南学院的考验.md', project_root='agents/evals/files/test-project', scripts_dir 为本插件的 scripts 目录。",
+      "expected_output": "输出结构化 JSON 问题清单,包含多个 ai_flavor 类型的 issue,识别出密集的 AI 写作痕迹",
+      "files": [
+        "agents/evals/files/test-project/正文/第0004章-迦南学院的考验.md",
+        "agents/evals/files/test-project/.webnovel/state.json",
+        "agents/evals/files/test-project/.webnovel/summaries/ch0003.md",
+        "agents/evals/files/test-project/.webnovel/memory_scratchpad.json"
+      ],
+      "expectations": [
+        "输出是合法 JSON,包含 issues 数组和 summary 字符串",
+        "至少有 1 个 ai_flavor 类型的 issue 识别了'缓缓'或'淡淡'等万能副词",
+        "至少有 1 个 ai_flavor 类型的 issue 识别了'首先/其次/最后'三段式",
+        "至少有 1 个 ai_flavor 类型的 issue 识别了'眸中闪过'或'瞳孔微缩'等神态模板",
+        "至少有 1 个 ai_flavor 类型的 issue 识别了情绪标签化('他非常紧张'或'他感到欣慰')",
+        "至少有 1 个 ai_flavor 类型的 issue 识别了章末总结句('总而言之')",
+        "每个 issue 都有 severity、category、location、description 字段",
+        "每个 issue 都有 evidence 字段且非空",
+        "没有输出 overall_score(reviewer 不评分)",
+        "没有输出 pass/fail 判定(reviewer 只列问题)"
+      ]
+    },
+    {
+      "id": 2,
+      "prompt": "审查第4章正文,检查设定一致性。chapter=4, chapter_file='正文/第0004章-迦南学院的考验.md', project_root='agents/evals/files/test-project', scripts_dir 为本插件的 scripts 目录。",
+      "expected_output": "识别出正文中萧炎使用了'吸力控制'(药老指导),这与设定一致;但不应报告虚假的设定冲突",
+      "files": [
+        "agents/evals/files/test-project/正文/第0004章-迦南学院的考验.md",
+        "agents/evals/files/test-project/.webnovel/state.json",
+        "agents/evals/files/test-project/设定集/世界观.md"
+      ],
+      "expectations": [
+        "输出是合法 JSON",
+        "不会把萧炎的斗者九星报告为设定冲突(与 state.json 一致)",
+        "不会虚构 state.json 中不存在的信息来报告问题"
+      ]
+    },
+    {
+      "id": 3,
+      "prompt": "审查第4章正文,检查连贯性。chapter=4, chapter_file='正文/第0004章-迦南学院的考验.md', project_root='agents/evals/files/test-project', scripts_dir 为本插件的 scripts 目录。上一章摘要在 .webnovel/summaries/ch0003.md。",
+      "expected_output": "检查与上章的衔接,上章结尾在迦南学院演武场、黄昏,本章开头在'晨光',时间有跳跃需要标注",
+      "files": [
+        "agents/evals/files/test-project/正文/第0004章-迦南学院的考验.md",
+        "agents/evals/files/test-project/.webnovel/summaries/ch0003.md"
+      ],
+      "expectations": [
+        "输出是合法 JSON",
+        "至少有 1 个 continuity 或 timeline 类型的 issue 提到时间跳跃(上章黄昏,本章晨光)"
+      ]
+    }
+  ]
+}

+ 42 - 0
webnovel-writer/agents/evals/files/test-project/.webnovel/memory_scratchpad.json

@@ -0,0 +1,42 @@
+{
+  "character_state": [],
+  "story_facts": [],
+  "world_rules": [
+    {
+      "id": "rule-realm-001",
+      "layer": "semantic",
+      "category": "world_rule",
+      "subject": "力量体系",
+      "field": "境界顺序",
+      "value": "斗之气→斗者→斗师→大斗师→斗灵→斗王→斗皇→斗宗→斗尊→斗圣→斗帝",
+      "status": "active",
+      "source_chapter": 1,
+      "evidence": ["ch0001"],
+      "updated_at": "2026-04-01T00:00:00",
+      "payload": {}
+    }
+  ],
+  "timeline": [],
+  "open_loops": [
+    {
+      "id": "ol-three-year-001",
+      "layer": "semantic",
+      "category": "open_loop",
+      "subject": "三年之约",
+      "field": "",
+      "value": "萧炎与纳兰嫣然的三年之约即将到期,萧炎必须在期限内恢复实力",
+      "status": "active",
+      "source_chapter": 1,
+      "evidence": ["ch0001"],
+      "updated_at": "2026-04-01T00:00:00",
+      "payload": {"expected_payoff": "对决", "urgency": 0.8}
+    }
+  ],
+  "reader_promises": [],
+  "relationships": [],
+  "meta": {
+    "version": 1,
+    "last_updated": "2026-04-01T00:00:00",
+    "total_items": 2
+  }
+}

+ 112 - 0
webnovel-writer/agents/evals/files/test-project/.webnovel/state.json

@@ -0,0 +1,112 @@
+{
+  "progress": {
+    "current_chapter": 3,
+    "total_words": 7500,
+    "last_updated": "2026-04-01"
+  },
+  "project": {
+    "title": "斗破苍穹(测试)",
+    "genre": "xianxia",
+    "author": "test"
+  },
+  "protagonist_state": {
+    "name": "萧炎",
+    "location": "迦南学院",
+    "power": {
+      "realm": "斗者",
+      "layer": "九星"
+    },
+    "golden_finger": {
+      "name": "药老戒指",
+      "level": 1
+    }
+  },
+  "entities_v3": {
+    "角色": {
+      "xiaoyan": {
+        "name": "萧炎",
+        "canonical_name": "萧炎",
+        "tier": "核心",
+        "aliases": ["他", "少年"],
+        "is_protagonist": true,
+        "first_appearance": 1,
+        "last_appearance": 3,
+        "current": {
+          "realm": "斗者九星",
+          "location": "迦南学院"
+        }
+      },
+      "xuner": {
+        "name": "薰儿",
+        "canonical_name": "薰儿",
+        "tier": "核心",
+        "aliases": ["她", "少女"],
+        "first_appearance": 1,
+        "last_appearance": 2,
+        "current": {
+          "realm": "斗者七星",
+          "location": "萧家"
+        }
+      },
+      "yaolao": {
+        "name": "药老",
+        "canonical_name": "药尘",
+        "tier": "核心",
+        "aliases": ["老者", "药尘"],
+        "first_appearance": 2,
+        "last_appearance": 3,
+        "current": {
+          "realm": "斗圣(封印)",
+          "location": "萧炎戒指内"
+        }
+      }
+    }
+  },
+  "strand_tracker": {
+    "history": [
+      {"chapter": 1, "strand": "quest"},
+      {"chapter": 2, "strand": "quest"},
+      {"chapter": 3, "strand": "constellation"}
+    ]
+  },
+  "chapter_meta": {
+    "0003": {
+      "hook": {
+        "type": "危机钩",
+        "content": "纳兰嫣然的信使已到萧家门口",
+        "strength": "strong"
+      },
+      "pattern": {
+        "opening": "动作开场",
+        "hook": "危机钩",
+        "emotion_rhythm": "低→高",
+        "info_density": "medium"
+      },
+      "ending": {
+        "time": "黄昏",
+        "location": "迦南学院演武场",
+        "emotion": "紧张期待"
+      }
+    }
+  },
+  "plot_threads": {
+    "foreshadowing": [
+      {
+        "content": "三年之约即将到期",
+        "planted_chapter": 1,
+        "target_chapter": 10,
+        "resolved_chapter": null,
+        "status": "active",
+        "urgency": 80
+      },
+      {
+        "content": "药老真实身份尚未揭晓",
+        "planted_chapter": 2,
+        "target_chapter": 20,
+        "resolved_chapter": null,
+        "status": "active",
+        "urgency": 30
+      }
+    ]
+  }
+}

+ 19 - 0
webnovel-writer/agents/evals/files/test-project/.webnovel/summaries/ch0003.md

@@ -0,0 +1,19 @@
+---
+chapter: 0003
+time: "次日傍晚"
+location: "迦南学院演武场"
+characters: ["萧炎", "药老"]
+state_changes: ["萧炎: 抵达迦南学院"]
+hook_type: "危机钩"
+hook_strength: "strong"
+---
+
+## 剧情摘要
+萧炎在药老的指导下抵达迦南学院,路上遭遇一队纨绔子弟挑衅,药老提醒他忍耐。到达学院后,他看到入学测试的公告,发现测试官正是以严苛出名的韩越。纳兰嫣然的信使在学院门口出现,让萧炎心中一沉。
+
+## 伏笔
+- [推进] 三年之约——纳兰嫣然的信使出现
+- [埋设] 韩越与某势力有关联
+
+## 承接点
+萧炎准备参加第二天的入学测试,药老警告他不要暴露太多实力。

+ 21 - 0
webnovel-writer/agents/evals/files/test-project/大纲/总纲.md

@@ -0,0 +1,21 @@
+# 斗破苍穹(测试用总纲)
+
+## 基本信息
+- 题材:玄幻/修仙
+- 主角:萧炎
+- 核心冲突:三年之约
+
+## 卷目录
+
+### 第1卷:萧家废材(第1-10章)
+萧炎从天才沦为废材,意外获得药老戒指,重新踏上修炼之路,目标是三年之约的对决。
+
+## 第1卷章纲
+
+### 第4章:迦南学院的考验
+- 目标:萧炎参加迦南学院入学测试
+- 阻力:测试官看不起废材出身的萧炎
+- 代价:必须展露部分实力,暴露修炼恢复的秘密
+- 核心冲突:是隐藏实力保全秘密,还是全力以赴证明自己
+- 本章变化:萧炎通过测试,引起某位长老注意
+- 钩子:长老似乎认出了药老戒指的气息

+ 8 - 0
webnovel-writer/agents/evals/files/test-project/大纲/第1卷-时间线.md

@@ -0,0 +1,8 @@
+## 第1卷 时间线
+
+| 章节 | 时间 | 事件 |
+|------|------|------|
+| 第1章 | 某日清晨 | 萧炎在试炼场被羞辱,发现斗之气消退 |
+| 第2章 | 当日夜 | 药老从戒指中苏醒,与萧炎达成约定 |
+| 第3章 | 次日 | 萧炎开始秘密修炼,前往迦南学院 |
+| 第4章 | 第三日上午 | 迦南学院入学测试 |

+ 19 - 0
webnovel-writer/agents/evals/files/test-project/大纲/第1卷-详细大纲.md

@@ -0,0 +1,19 @@
+## 第1卷 详细大纲
+
+### 第4章:迦南学院的考验
+
+**目标**:萧炎参加迦南学院入学测试,证明自己并非废材。
+
+**阻力**:测试官韩越对萧炎的废材名声嗤之以鼻,测试难度被故意提高。
+
+**代价**:展露部分实力等于暴露修炼恢复的秘密,可能引来觊觎药老戒指的势力。
+
+**核心冲突**:隐藏实力保全秘密 vs 全力以赴证明自己。
+
+**反派层级**:韩越(小障碍级)。
+
+**本章变化**:萧炎通过测试,但长老注意到他身上的异常气息。
+
+**未闭合问题**:长老是否认出了药老戒指?这会带来什么后果?
+
+**钩子**:长老在萧炎离开后,自言自语:"这股气息……不可能……"

+ 35 - 0
webnovel-writer/agents/evals/files/test-project/正文/第0004章-迦南学院的考验.md

@@ -0,0 +1,35 @@
+晨光从窗缝中缓缓渗入,萧炎缓缓睁开了双眼。他的眸中闪过一丝坚定,随即被平静取代。
+
+他非常紧张。今天是迦南学院入学测试的日子,这关系到他能否在三年之约到来前获得足够的资源。他心中暗道,绝不能失败。
+
+萧炎缓缓站起身来,活动了一下筋骨。药老的声音从戒指中传来:"小子,准备好了吗?"
+
+"准备好了。"萧炎淡淡说道。
+
+他走出房间,迎面撞上了一个身穿华服的少年。那少年上下打量了萧炎一眼,嘴角微微上扬,露出一丝不屑。
+
+"又一个废物想进迦南学院?"华服少年冷冷说道。
+
+萧炎没有回应,只是静静地从他身边走过。他深知,与这种人争执毫无意义。更重要的是,他需要保存体力应对接下来的测试。
+
+来到演武场,萧炎看到了测试官韩越。韩越是一位斗师级强者,以严苛著称。他站在高台上,目光如鹰般扫视着下方的考生。
+
+首先,萧炎需要通过斗之气测试。其次,他要在实战对抗中展示足够的实力。最后,他还需要获得至少一位长老的认可。
+
+测试开始了。萧炎将手掌按在测试石上,体内的斗之气缓缓涌出。测试石亮起了淡淡的光芒——斗者九星。
+
+韩越的眉头微蹙,眼中闪过一丝惊讶。这个曾经的废物,竟然恢复到了斗者九星?
+
+"不错。"韩越淡淡道,"不过斗者九星想进迦南学院,还远远不够。"
+
+萧炎心中一沉,但他很快便稳住了心神。药老在戒指中轻声提醒:"用吸力控制输出,不要暴露全部实力。"
+
+实战对抗开始了。萧炎的对手是一位斗者八星的考生。对方率先出手,一拳轰向萧炎的胸口。萧炎侧身闪避,同时右手探出,精准地抓住了对方的手腕。
+
+这一招展示了远超同级的战斗经验,引起了台上一位白发长老的注意。
+
+长老的瞳孔微缩,他似乎感应到了什么。那股若有若无的气息……不可能……
+
+萧炎最终通过了测试。他感到欣慰,同时又有些担忧,内心深处还有一丝不安。他知道,自己的秘密可能已经不那么安全了。但无论如何,他迈出了重要的一步。
+
+总而言之,今天的测试虽然充满挑战,但萧炎凭借自己的实力和智慧成功通过了考验。他深知,未来的路还很长,真正的考验才刚刚开始。

+ 12 - 0
webnovel-writer/agents/evals/files/test-project/设定集/世界观.md

@@ -0,0 +1,12 @@
+# 世界观设定
+
+## 力量体系
+境界顺序:斗之气→斗者→斗师→大斗师→斗灵→斗王→斗皇→斗宗→斗尊→斗圣→斗帝
+
+每个大境界分为一至九星。突破大境界需要契机+足够的斗之气积累。
+
+## 迦南学院
+大陆顶级学府之一,入学测试包含斗之气测试和实战对抗两部分。测试官有权调整难度。
+
+## 药老(药尘)
+曾经的斗圣强者,因重伤灵魂寄居于一枚古朴戒指中。目前只能以灵魂体与萧炎交流,无法直接干预外界。

+ 22 - 0
webnovel-writer/skills/webnovel-review/evals/evals.json

@@ -0,0 +1,22 @@
+{
+  "skill_name": "webnovel-review",
+  "evals": [
+    {
+      "id": 1,
+      "prompt": "使用 /webnovel-review 审查第4章(agents/evals/files/test-project/正文/第0004章-迦南学院的考验.md)。项目在 agents/evals/files/test-project/。",
+      "expected_output": "生成审查报告,包含 AI 味问题和时间线问题,并将审查指标写入 index.db",
+      "files": [
+        "agents/evals/files/test-project/正文/第0004章-迦南学院的考验.md",
+        "agents/evals/files/test-project/.webnovel/state.json",
+        "agents/evals/files/test-project/.webnovel/summaries/ch0003.md"
+      ],
+      "expectations": [
+        "审查报告被生成",
+        "报告中识别了至少 3 个 ai_flavor 问题",
+        "报告中识别了时间跳跃问题(上章黄昏→本章晨光)",
+        "审查指标被写入(review_metrics)",
+        "报告中的每个 issue 都有 evidence"
+      ]
+    }
+  ]
+}

+ 62 - 0
webnovel-writer/skills/webnovel-write/evals/evals.json

@@ -0,0 +1,62 @@
+{
+  "skill_name": "webnovel-write",
+  "evals": [
+    {
+      "id": 1,
+      "prompt": "使用 /webnovel-write 写第4章。项目在 agents/evals/files/test-project/。",
+      "expected_output": "完成 Step 0.5 到 Step 6 的完整流程,生成第4章正文文件、审查结果、摘要文件和状态更新",
+      "files": [
+        "agents/evals/files/test-project/.webnovel/state.json",
+        "agents/evals/files/test-project/大纲/总纲.md",
+        "agents/evals/files/test-project/大纲/第1卷-详细大纲.md",
+        "agents/evals/files/test-project/大纲/第1卷-时间线.md",
+        "agents/evals/files/test-project/.webnovel/summaries/ch0003.md",
+        "agents/evals/files/test-project/.webnovel/memory_scratchpad.json",
+        "agents/evals/files/test-project/设定集/世界观.md"
+      ],
+      "expectations": [
+        "正文文件 正文/第0004章*.md 被创建且非空",
+        "正文中包含萧炎参加迦南学院测试的内容(符合章纲)",
+        "正文中回应了上章钩子(纳兰嫣然信使)",
+        "正文中没有出现 [TODO] 或 [待补充] 占位符",
+        "正文字数在 1500-3000 之间",
+        "Step 3 调用了 reviewer agent 进行审查",
+        "Step 4 加载了 anti-ai-guide.md",
+        "Step 5 调用了 data-agent 回写数据",
+        "章末保留了未闭合问题或悬念(不是安全着陆)"
+      ]
+    },
+    {
+      "id": 2,
+      "prompt": "使用 /webnovel-write --fast 写第4章。项目在 agents/evals/files/test-project/。",
+      "expected_output": "fast 模式跳过部分审查维度但仍完成核心流程",
+      "files": [
+        "agents/evals/files/test-project/.webnovel/state.json",
+        "agents/evals/files/test-project/大纲/第1卷-详细大纲.md"
+      ],
+      "expectations": [
+        "正文文件被创建且非空",
+        "流程中包含 Step 3(审查),但为轻量模式",
+        "仍完成 Step 5 数据回写",
+        "正文中没有出现 [TODO] 或 [待补充]"
+      ]
+    },
+    {
+      "id": 3,
+      "prompt": "使用 /webnovel-write 写第4章。项目在 agents/evals/files/test-project/。特别注意 anti-AI:正文不应有密集的'缓缓''淡淡'副词、不应有'首先其次最后'三段式、不应有情绪标签化描写。",
+      "expected_output": "生成的正文 AI 味低,通过 anti-AI 检查",
+      "files": [
+        "agents/evals/files/test-project/.webnovel/state.json",
+        "agents/evals/files/test-project/大纲/第1卷-详细大纲.md"
+      ],
+      "expectations": [
+        "正文中'缓缓'出现次数不超过 2 次",
+        "正文中'淡淡'出现次数不超过 1 次",
+        "正文中不存在'首先……其次……最后'三段式",
+        "正文中不存在'他感到X'形式的情绪标签(应改为行为暗示)",
+        "正文中不存在'总而言之''由此可见'等总结词",
+        "Step 4 输出 anti_ai_force_check=pass"
+      ]
+    }
+  ]
+}