Files
writer-work-flow/apps/api/ww_api/schemas/outline.py
Yaojia Wang 5fb7bfb1de feat: M3 — 伏笔账本 + 节奏引擎 + 大纲(含并发记账 bugfix)
- 伏笔账本:纯函数状态机(OPEN/PARTIAL/CLOSED/OVERDUE) + ForeshadowLedger repo;验收后到期扫描(BackgroundTask 自建 session 置 OVERDUE);登记/状态变更端点
- 节奏 + 三审齐:foreshadow-analyst + pace-checker 并入 LangGraph 并行审(REVIEW_SPECS),collect 分列落 chapter_reviews(conflicts/foreshadow_sug/pace),review SSE 加 foreshadow/pace 事件
- 大纲:outliner Agent 产 OutlineResult(含 foreshadow_windows),POST /outline 逐章 upsert outline 表;GET /foreshadow?status= 看板
- 前端:伏笔四泳道看板(OVERDUE 琥珀) + 大纲编辑器(窗口徽标) + 节奏节拍图(▁▃▅) + 审稿页消费 foreshadow/pace SSE
- bugfix(T3.8):并行三审共用请求 session 记账触发 'Session is already flushing' → foreshadow/pace 静默丢失;SqlAlchemyLedgerSink.record 改 add-only(靠端点/事务 commit),加并发回归测试
- M3 E2E:真实 DB + mock 网关零 token 走通 埋设→进展→验收后扫描 OVERDUE→看板 + 大纲含窗口 + 三审齐 SSE/留痕;E2E 暴露并钉住上述 bug
- 门禁绿:mypy 111 / pytest 228(0 xfailed) / alembic 无漂移;前端 gen:api/lint/tsc/vitest 69/build
2026-06-18 14:21:17 +02:00

44 lines
1.5 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.

"""大纲生成端点的请求/响应 schemaC3 扩 / ARCH §5.4, §7.2)。
snake_case前端经 OpenAPI 生成 TS 类型消费(改字段 → 前端 `pnpm gen:api`)。
大纲生成是**作者显式动作**(不变量 #3outliner `writes=["outline"]` 声明经此端点落地,
非 AI 静默写其它表)。窗口字段供前端 T3.6 渲染伏笔窗口徽标。
"""
from __future__ import annotations
from pydantic import BaseModel, Field
class OutlineGenerateRequest(BaseModel):
"""POST /projects/:id/outline触发大纲生成 + 持久化。
M3 简单分卷:`volume` 缺省=1schema 无逐章卷号;本端点把整批章节落到同一卷)。
"""
volume: int = Field(default=1, ge=1, description="本批大纲所属卷号M3 默认全卷 1")
class ForeshadowWindowView(BaseModel):
"""单章关联的伏笔回收窗口snake_case形对齐 `ww_agents.ForeshadowWindow`)。"""
code: str
plant_chapter: int | None = None
expected_close_from: int | None = None
expected_close_to: int | None = None
class OutlineChapterView(BaseModel):
"""单章大纲视图:章号 + 卷 + 节拍 + 伏笔窗口。"""
no: int
volume: int
beats: list[str] = Field(default_factory=list)
foreshadow_windows: list[ForeshadowWindowView] = Field(default_factory=list)
class OutlineResponse(BaseModel):
"""大纲生成响应:逐章已持久化的大纲(含窗口,供前端 T3.6)。"""
chapters: list[OutlineChapterView] = Field(default_factory=list)