浏览代码

fix: address 8 user-facing issues from system review

- projection_status: 四项→五项 (added vector)
- --minimal mode: remove stale chapter_drafted reference
- extract-context: --format text removed (always JSON now)
- context-agent: consume reasoning fields in writer brief section 4
- context-agent: document 裁决层 fields in tool section
- SKILL.md: fix stale chapter_reviewed in common mistakes
- SKILL.md: remove extract_chapter_context.py from preflight check
- webnovel-query: add knowledge temporal query type and commands
lingfengQAQ 2 月之前
父节点
当前提交
cf1f79256e

+ 18 - 4
webnovel-writer/agents/context-agent.md

@@ -48,9 +48,17 @@ python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" memo
 写前真源(开写前必须遵守的"大纲、设定、禁区"):
 - `.story-system/MASTER_SETTING.json` - 全书主设定合同(题材、调性、核心禁忌)
 - `.story-system/volumes/volume_{NNN}.json` - 卷级合同(本卷目标、爽点密度、节奏策略)
-- `.story-system/chapters/chapter_{NNN}.json` - 章级合同(本章焦点、动态上下文)
+- `.story-system/chapters/chapter_{NNN}.json` - 章级合同(本章焦点、动态上下文、**裁决层输出**
 - `.story-system/reviews/chapter_{NNN}.review.json` - 审查合同(必须覆盖节点、本章禁区)
 
+**裁决层字段**(在 `chapter_{NNN}.json` 的 `reasoning` 对象中):
+- `genre` - 命中的题材
+- `style_priority` - 风格优先级(如"冷硬算计 > 超然物外 > 热血冲突")
+- `pacing_strategy` - 节奏默认策略(如"慢蓄快爆 修炼段精简 斗法段拉满")
+- `inject_target` - 建议注入位置
+
+这些字段由 `story-system` 引擎根据题材自动裁决,必须在阶段 D 织入任务书第 4 段"这章怎么写更顺"。
+
 写后真源(已发布章节的"定稿状态"):
 - latest accepted `.story-system/commits/chapter_{NNN}.commit.json` - 章节提交记录(accepted 才是有效定稿)
 
@@ -199,8 +207,12 @@ python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" inde
    - 动机 = 角色目标 + 当前处境 + 上章钩子压力
    - 情绪底色 = 上章结束情绪 + 事件走向
    - 可用能力 = 当前境界 + 近期获得 + 设定禁用项
-2. 组装三层执行包(见输出格式)
-3. 执行红线校验(见检查清单)
+2. 读取裁决层输出:
+   - 从 `.story-system/chapters/chapter_{NNN}.json` 的 `reasoning` 字段读取 `style_priority`、`pacing_strategy`
+   - 从 `master_setting` 的 `anti_patterns` 读取题材毒点
+   - 将这些裁决信息翻译为自然语言,织入任务书第 4 段
+3. 组装写作任务书五段(见输出格式)
+4. 执行红线校验(见检查清单)
 
 ## 6. 边界与禁区
 
@@ -262,8 +274,10 @@ python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" inde
 ### 4. 这章怎么写更顺
 
 这一段最关键。把以下信息翻译成自然的写作提醒:
+- **裁决层输出**(最重要):从 `chapter_{NNN}.json` 的 `reasoning` 字段读取风格优先级、节奏策略,翻译成具体的写作指导。例如 `style_priority: "冷硬算计 > 超然物外"` 应翻译为"这章写的时候保持算计感,角色每一步都在盘算,不要写成热血冲突"
 - 题材基调和参考气质(题材锚定)
 - 本章具体写法建议(writing_guidance)
+- `master_setting` 中的 `anti_patterns`——翻译为"别犯这些错"的自然提醒
 - 最近几章的审查得分趋势和低分区间提醒(追读信号)
 - 章节阶段和风险标记(方法论策略)
 - 从 `core-constraints.md` 和 `anti-ai-guide.md` 翻过来的自然提醒
@@ -354,7 +368,7 @@ python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "{project_root}" inde
 
 ### 缺失处理
 
-- `load-context` 返回空 sections → 降级为 `extract-context --format json` 全量加载
+- `load-context` 返回空 sections → 降级为 `extract-context --chapter {NNNN} --format json` 全量加载
 - `runtime_status.fallback_sources` 非空 → 必须在输出中显式标明已进入 legacy fallback
 - `chapter_meta` 不存在 → 跳过"接住上章"
 - 最近 3 章数据不完整 → 只用现有数据做差异化检查

+ 3 - 6
webnovel-writer/scripts/extract_chapter_context.py

@@ -363,7 +363,8 @@ def main():
     parser = argparse.ArgumentParser(description="提取章节创作所需的精简上下文")
     parser.add_argument("--chapter", type=int, required=True, help="目标章节号")
     parser.add_argument("--project-root", type=str, help="项目根目录")
-    parser.add_argument("--format", choices=["text", "json"], default="text", help="输出格式")
+    parser.add_argument("--format", choices=["json"], default="json",
+                        help="输出格式(始终 JSON,text 渲染由 context-agent 负责)")
 
     args = parser.parse_args()
 
@@ -374,11 +375,7 @@ def main():
             else find_project_root()
         )
         payload = build_chapter_context_payload(project_root, args.chapter)
-
-        if args.format == "json":
-            print(json.dumps(payload, ensure_ascii=False, indent=2))
-        else:
-            print(_render_text(payload), end="")
+        print(json.dumps(payload, ensure_ascii=False, indent=2))
 
     except Exception as exc:
         print(f"❌ 错误: {exc}", file=sys.stderr)

+ 11 - 1
webnovel-writer/skills/webnovel-query/SKILL.md

@@ -33,6 +33,7 @@ export PROJECT_ROOT="$(python "${SCRIPTS_DIR}/webnovel.py" --project-root "${WOR
 | 金手指/系统 | 金手指状态 | state.json |
 | 节奏/Strand | 节奏分析 | state.json + strand-weave-pattern.md |
 | 标签/实体格式 | 格式查询 | tag-specification.md |
+| 某角色在第N章时/历史状态/时间点状态 | 时序查询 | knowledge query-entity-state / query-relationships |
 
 ## 引用加载策略
 
@@ -70,7 +71,16 @@ python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" mem
    - 写后真源(4):已发布章节的"定稿状态",不可篡改
    - 投影层(5-6):从写后真源自动生成的"查询视图",方便快速检索
 5. **确认上下文充足**:查询类型已识别 + 主链合同 / latest commit 已加载
-6. **执行查询**:按类型检索对应数据源
+6. **执行查询**:按类型检索对应数据源。若为时序查询,使用以下命令:
+
+```bash
+# 查询某实体在指定章节时的状态
+python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" knowledge query-entity-state --entity "{entity_id}" --at-chapter {N}
+
+# 查询某实体在指定章节时的所有关系
+python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" knowledge query-relationships --entity "{entity_id}" --at-chapter {N}
+```
+
 7. **格式化输出**:按下方模板输出
 
 ## 输出格式

+ 6 - 5
webnovel-writer/skills/webnovel-write/SKILL.md

@@ -29,7 +29,7 @@ allowed-tools: Read Write Edit Grep Bash Task
 - ❌ 把全部 references 一次性读完再起草
 - ❌ 用文件存在性替代 `chapter_status` 判断
 - ❌ 润色时改动事件顺序、设定结果或节点收束方向
-- ❌ Step 5 失败后直接开始下一章(状态还在 `chapter_reviewed`
+- ❌ Step 5 失败后直接开始下一章(commit 可能是 `rejected` 或 projection 未完成
 - ❌ 把全部 reference 一次性读完再开始写
 
 ## 优先级链
@@ -117,7 +117,7 @@ allowed-tools: Read Write Edit Grep Bash Task
 
 必须完成:
 - 解析真实书项目根,必须包含 `.webnovel/state.json`
-- 校验核心输入:`大纲/总纲.md`、`${CLAUDE_PLUGIN_ROOT}/scripts/extract_chapter_context.py`
+- 校验核心输入:`大纲/总纲.md`
 - 规范化变量:`WORKSPACE_ROOT`、`PROJECT_ROOT`、`SKILL_ROOT`、`SCRIPTS_DIR`、`chapter_num`、`chapter_padded`
 
 ```bash
@@ -286,11 +286,12 @@ python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" cha
 
 **成功标准**(accepted commit 才会触发投影):
 - `.story-system/commits/chapter_{chapter_num}.commit.json` 已生成(写后真源)
-- `projection_status` 项全部为 `done` 或 `skipped`:
+- `projection_status` 项全部为 `done` 或 `skipped`:
   - `state` → `.webnovel/state.json` 投影完成(主角境界、当前位置等)
   - `index` → `index.db` 投影完成(角色出场、势力关系等)
   - `summary` → `summaries/ch{chapter_padded}.md` 投影完成(章节摘要)
   - `memory` → `memory_scratchpad.json` 投影完成(长期记忆事实)
+  - `vector` → 向量索引投影完成(事件/实体语义检索)
 
 **投影层定位**(Phase 5 明确):
 - `.webnovel/state.json` / `index.db` / `summaries` / `memory_scratchpad` 只是 commit 的"查询视图"
@@ -329,7 +330,7 @@ git -c i18n.commitEncoding=UTF-8 commit -m "第{chapter_num}章: {title}"
 2. Step 3 已产出审查结果并落库(`--minimal` 除外)。
 3. 若存在 `blocking=true` 的 issue,流程必须停在 Step 3。
 4. Step 4 的 `anti_ai_force_check=pass`(`--minimal` 除外)。
-5. Step 5 已生成 accepted `CHAPTER_COMMIT`,`projection_status` 项全部为 `done` 或 `skipped`。
+5. Step 5 已生成 accepted `CHAPTER_COMMIT`,`projection_status` 项全部为 `done` 或 `skipped`。
 6. `chapter_status` 为 `chapter_committed`(由 projection writer 自动推进,不手动写入)。
 7. 若启用观测,已读取最新 timing 记录并给出结论。
 
@@ -346,7 +347,7 @@ tail -n 1 "${PROJECT_ROOT}/.webnovel/observability/data_agent_timing.jsonl" || t
 ```
 
 成功标准:
-- `chapter_status` 为 `chapter_committed`(`--minimal` 模式下至少为 `chapter_drafted`)。
+- `chapter_status` 为 `chapter_committed`(由 projection writer 自动推进)。
 - accepted `CHAPTER_COMMIT` 已写入 `.story-system/commits/`,且投影链路完成。
 - 章节文件、摘要文件、状态文件、长期记忆暂存文件齐全且内容可读。
 - 审查结果可追溯。