feat(web): 立项新增 基调/结局/视角 三字段(书级常量入 stable_core 缓存前缀)

灵感计划 §3④ + §4 D 枚举决策:
- projects 表加 tone/ending_type/narrative_pov(Text nullable、无 CHECK,同 genre/structure;
  迁移 e5f6a7b8c9d0 nullable 免 backfill)。
- ProjectCreateRequest/ProjectResponse + domain ProjectCreate/ProjectView 全链路透传(snake_case)。
- 完整 stable_core 链路:ProjectSpecView + SqlProjectSpecRepo.spec + _build_spec_section 渲染进
  「作品蓝本」块——书级常量随书稳定,字节稳定守缓存前缀不变量 #9,绝不入 volatile。
- 前端 wizard.ts 三字段 + 预设数组 TONES/ENDING_TYPES/NARRATIVE_POVS + ProjectWizard 控件与确认页回显。
- 契约变更已 pnpm gen:api + memory/contracts.md 登记。
This commit is contained in:
Yaojia Wang
2026-07-06 15:59:49 +02:00
parent 491d9342ef
commit 821ace5989
17 changed files with 247 additions and 1 deletions

View File

@@ -346,6 +346,8 @@
## 契约变更日志append-only
> 格式:`- [date] @skill 改 Cx<改了什么> → 影响 <依赖方/任务>`
- [2026-07-06] @db/@backend/@frontend C2+C3(④ 立项基调/结局/视角`projects` 表加 3 `tone`/`ending_type`/`narrative_pov`**Text nullable CHECK** genre/structure迁移 `e5f6a7b8c9d0`nullable backfill)。`ProjectCreateRequest`+`ProjectResponse``schemas/projects.py`各加 3 字段 `str|None`** Literal**Literal 只留 Verdictdomain `ProjectCreate`/`ProjectView`/`_to_view`/`SqlProjectRepo.create` + `FakeProjectRepo` 同步透传完整 stable_core 链路`ProjectSpecView``repositories.py`frozen 3 字段 + `SqlProjectSpecRepo.spec` 查询构造带上 + `_build_spec_section``assemble.py`渲染进作品蓝本**书级常量缓存前缀字节稳定守 #9**绝不入 volatile)。前端 `wizard.ts` `WizardForm`/`emptyWizardForm`/`toCreateRequest` + 预设数组 `TONES`/`ENDING_TYPES`/`NARRATIVE_POVS`仿 GENRES/STRUCTURES+ `ProjectWizard.tsx` 3 步控件toneSelectpov/endingSegmentedControl+ 确认页回显。**codegen**3 字段皆 `= None` 无默认工厂 openapi-typescript 渲染为 `?: string | null` 可选。→ 影响 @frontend `pnpm gen:api`未来 AI 立项方案回填这 3 字段
- [2026-07-06] @llm/@backend C3(⑧ appearance/motive 穿线`CharacterCardView``schemas/generation.py`+ `ww_agents.CharacterCard` 各加 `appearance:str=""` + `motive:str=""`**均给默认值守解析韧性**DB `characters.appearance/motive` 早已在初始迁移此前一直 NULL——**无新迁移**)。写侧 `CharacterWriteRepo.create`/`SqlCharacterWriteRepo`create+**update backfill 分支**/`CharacterWriteFields` 同步加两列`routers/generation.py` `_card_to_view`/`_view_to_card`/`_existing_characters` 双向形变带上两字段同批**重切 motive/traits/arc 口径**动机唯一落 `motive``traits[]` 只留核心/表层/阴影三层`arc` 引用 motive `character-gen.md` regen `prompt_hashes.json` 金标准)。**codegen 注意**因带 `default`openapi-typescript 把两字段渲染为**必填**响应恒有值前端 `CharacterCardView` 字面量构造点须显式给两字段。→ 影响 @frontend `pnpm gen:api` + `CharacterCardItem` 展示/编辑两字段未来 人物塑造审查以 motive/appearance 为客观锚点
- [2026-06-24] @llm/@backend C6-extPrompt 外置方案A21 prompt 散文外置 `prompts/<name>.md` + `load_prompt`/`SPECS`/`SCHEMA_CATALOG`/`REVIEW_RESERVED_NAMES`@llm+ `SpecResolver` + SkillRegistry 入库守卫前移 + toolbox 桥接 `SPECS`@backend+ `.gitattributes`/wheel package-data/CI 冒烟@devops)。随后全量重写 21 prompt 内容任务对齐schema 契约/不变量保持金标准 fixture 重生成)。门禁绿ruff/format/mypy(209)/pytest(744)。→ 影响后续波次可将编排器 + apps/api 路由切 `SpecResolver` 并删 `*_spec` 导出前端零影响GeneratorTool 描述符字段不变)。