Files
writer-work-flow/packages/agents/ww_agents/schema_catalog.py
Yaojia Wang 72b3c81146 feat(review): 人物塑造 advisory 审(第五审,仅建议不阻断验收)
写→审链新增第五审「人物塑造」(灵感③/D2):advisory 单维——仅建议、不阻断
验收(不进 conflicts、不碰 assert_conflicts_resolved、不入 REVIEW_RESERVED_NAMES);
只做人物塑造、不做氛围。

- SPEC characterization_spec(analyst,reads=("characters",),writes=())+
  prompts/characterization.md(只读、显式忽略文本长度与辞藻华丽度、引用逐字片段+置信度)
- schema CharacterizationReview{issues[...]}(全字段默认值守解析韧性)+ 注册 catalog
- 计数三处 22→23 + regen prompt_hashes.json(仅加一条)
- DB chapter_reviews 加 characterization JSONB nullable 列(迁移 f6a7b8c9d0e1)
- 接线:graph REVIEW_SPECS 追加 · chain ReviewRecordRepo · collect(extract/record) ·
  review_repo(Protocol/Sql/_to_view/ReviewView) · sse(event/factory/section) · normalize 自动纳入
- 契约 ReviewHistoryItem 加 characterization(gen:api 已重生成)
- 前端 sse/history/useReviewStream + CharacterizationPanel(只展示无裁决 UI、置信度降序+低置信折叠)+ ReviewReport 挂面板
- 测试 test_characterization_does_not_block_accept + 计数/golden + collect/normalize + 前端 reducer/normalize/parse

守不变量 #2/#3/#9;依赖 ⑧(motive/appearance 作客观锚点)。
2026-07-06 17:08:38 +02:00

72 lines
2.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""`SCHEMA_CATALOG`name → output schema 的唯一真相源Prompt 外置方案A · 步4
Pydantic 类型承载结构化解析与 `isinstance` 校验,无法从文本推导、无法运行时安全构造,
必须留 Python。`SPECS[name].output_schema` 一律从这里派生(单向派生,避免双真相)。
`input_schema` 全 23 个恒为 None入参为序列化文本本波不建入参槽YAGNI
`refiner` 是唯一纯文本 writer`None` 是合法值(无结构化 schema
"""
from __future__ import annotations
from typing import Final
from pydantic import BaseModel
from .schemas import (
BlurbResult,
BookTeardownResult,
CharacterGenResult,
CharacterizationReview,
ContinuationResult,
ContinuityReview,
DeAiResult,
DetailedOutlineResult,
ForeshadowReview,
GlossaryResult,
GoldenFingerResult,
IdeaListResult,
NameListResult,
OpeningResult,
OutlineResult,
PaceReview,
PolishResult,
ProjectPlanResult,
StyleDriftReview,
StyleFingerprintResult,
TitleListResult,
WorldGenResult,
)
# name → output_schemainput 全 None本波不建入参槽——YAGNI
SCHEMA_CATALOG: Final[dict[str, type[BaseModel] | None]] = {
"continuity": ContinuityReview,
"outliner": OutlineResult,
"foreshadow": ForeshadowReview,
"pace": PaceReview,
"characterization": CharacterizationReview,
"style_extract": StyleFingerprintResult,
"style": StyleDriftReview,
"refiner": None, # 唯一纯文本 writerNone 是合法值
"worldbuilder": WorldGenResult,
"character-gen": CharacterGenResult,
"brainstorm": IdeaListResult,
"book-title": TitleListResult,
"blurb": BlurbResult,
"name": NameListResult,
"golden-finger": GoldenFingerResult,
"glossary": GlossaryResult,
"opening": OpeningResult,
"fine-outline": DetailedOutlineResult,
"continue": ContinuationResult,
"expand": PolishResult,
"de-ai": DeAiResult,
"teardown": BookTeardownResult,
"project-plan": ProjectPlanResult,
}
def output_schema_for(name: str) -> type[BaseModel] | None:
"""name → output schema精确字符串相等命中未知 name → KeyError"""
return SCHEMA_CATALOG[name]