feat(llm): 整章重写预检澄清 spec + 教条 clarify_rewrite(WFW-9 M2)

镜像 clarify_refine(仅 name/prompt 不同,复用 ClarifyDecision,不新增 schema):
新增 clarify_rewrite_spec(analyst 档、reads=()/writes=() 只读,不变量 #2/#3)+ 章级
教条 prompts/clarify_rewrite.md(segment→整章:判作者章级重写意见是否含糊)。注册进
SPECS/SCHEMA_CATALOG,自检数量 24→25,__init__ 导出,金标准仅新增 1 条哈希无漂移。
This commit is contained in:
Yaojia Wang
2026-07-08 11:42:21 +02:00
parent 331a07abc4
commit 4a09f273d9
7 changed files with 117 additions and 4 deletions

View File

@@ -5,6 +5,7 @@
"character-gen": "e0f97a5d7bb622fdd7582cdeef85ba13b3f434b2633f4d22a8c6daeba48636bf",
"characterization": "643988cb899a66472acb3e18709f3299d2025f9bda132c774ee26c589266b51f",
"clarify_refine": "c2ed53c3a2d6c414c4ae5c92ead45634a56c47cd363a44f83ec1e020099480af",
"clarify_rewrite": "381864a21bfa43fa295236be981580369b3d1cbbdeb72ee10dffe52957110232",
"continue": "f1ce02be3b186fc966c89cf0d54ea57a400e91d435ea91f5722cb17e43d11763",
"continuity": "1bdf9799bad9076e54de2023433ec7da7b559509d986392a0563dc1ee20cf4a1",
"de-ai": "9ce3020cdd4b223cc4d13c289babd2811bbfece4b392711dcba4fd0301c87249",

View File

@@ -11,11 +11,13 @@ from __future__ import annotations
import pytest
from pydantic import ValidationError
from ww_agents import (
SPECS,
AgentSpec,
ClarifyDecision,
ClarifyOption,
ClarifyQuestion,
clarify_refine_spec,
clarify_rewrite_spec,
)
# ---- ClarifyDecision / ClarifyQuestion / ClarifyOption schema ----
@@ -123,3 +125,43 @@ def test_clarify_refine_spec_is_agent_spec_and_immutable() -> None:
assert isinstance(clarify_refine_spec, AgentSpec)
with pytest.raises(ValidationError):
clarify_refine_spec.tier = "writer"
# ---- clarify_rewrite_spec 声明WFW-9 M2整章重写预检澄清镜像 clarify_refine----
def test_clarify_rewrite_spec_is_analyst_tier() -> None:
# 不变量 #2整章含糊判别 + 反问构造用分析档,只声明 tier不写 model
assert clarify_rewrite_spec.tier == "analyst"
assert clarify_rewrite_spec.name == "clarify_rewrite"
def test_clarify_rewrite_spec_is_read_only() -> None:
# 不变量 #3只读——不读库真相源材料端点注入、不写任何表
assert clarify_rewrite_spec.reads == ()
assert clarify_rewrite_spec.writes == ()
def test_clarify_rewrite_spec_output_schema_reuses_clarify_decision() -> None:
# 复用 ClarifyDecision不新增 schema与 refine 侧同构
assert clarify_rewrite_spec.output_schema is ClarifyDecision
def test_clarify_rewrite_spec_prompt_documents_constraints() -> None:
# v1 硬上限 1 问 + 自由输入兜底 + 防循环须在教条里显式约束(与 refine 侧同纪律)
prompt = clarify_rewrite_spec.system_prompt
assert prompt # 非空
assert "1 问" in prompt
assert "自由输入" in prompt
assert "防循环" in prompt
def test_clarify_rewrite_spec_registered_in_specs() -> None:
# 注册表同一实例(兼容期 *_spec 与 SPECS[name] 为同对象,不变量)
assert SPECS["clarify_rewrite"] is clarify_rewrite_spec
def test_clarify_rewrite_spec_is_agent_spec_and_immutable() -> None:
assert isinstance(clarify_rewrite_spec, AgentSpec)
with pytest.raises(ValidationError):
clarify_rewrite_spec.tier = "writer"

View File

@@ -52,8 +52,8 @@ def test_load_prompt_matches_golden(name: str) -> None:
# ---- #1 注册表唯一性 ----
def test_specs_registry_len_is_24() -> None:
assert len(SPECS) == 24
def test_specs_registry_len_is_25() -> None:
assert len(SPECS) == 25
# name 即 keydict 已去重;逐项确认 key == spec.name无错位
assert all(key == spec.name for key, spec in SPECS.items())