- uv(workspace) + pnpm monorepo;docker-compose(pg+api+web) - SQLAlchemy 16 MVP 表 + Alembic 初版迁移(无漂移,users stub) - FastAPI 骨架:统一错误信封(带 request_id) + structlog + /jobs/:id + OpenAPI - Next.js 骨架:纸感主题 token + OpenAPI→TS 客户端代码生成(gen:api) - CI(ruff/mypy/pytest + pg service + alembic 漂移校验) - 四份设计规格(PRODUCT/UX/ARCHITECTURE/DEV_PLAN) + CLAUDE.md
159 lines
15 KiB
Markdown
159 lines
15 KiB
Markdown
# 网文创作工作流 · 开发计划(DEV_PLAN)
|
||
|
||
> 基于 [PRODUCT_SPEC.md](./PRODUCT_SPEC.md) / [UX_SPEC.md](./UX_SPEC.md) / [ARCHITECTURE.md](./ARCHITECTURE.md) 的分阶段实现计划。
|
||
> 子任务尽量**解耦**(只经契约耦合,可并行);每个任务标注所需 **expert skill** 与**文档锚点**。
|
||
|
||
---
|
||
|
||
## 0. 锁定技术栈(本计划前提)
|
||
|
||
| 维度 | 决策 |
|
||
|---|---|
|
||
| 前端 | Next.js + TypeScript(纯 UI,OpenAPI 生成的 TS 客户端调后端) |
|
||
| 后端 | Python + FastAPI(async, SSE, Pydantic) |
|
||
| 编排 | **LangGraph**(写章→四审→验收 HITL/checkpoint/并行) |
|
||
| LLM 网关 | 薄自建:`anthropic` + `openai`(baseURL 覆盖 DeepSeek/Kimi/Qwen/GLM) + `google-genai`;缓存/降级/回退/记账自建 |
|
||
| 结构化输出 | Pydantic + `instructor` |
|
||
| ORM/迁移 | SQLAlchemy 2.0(async) + Alembic |
|
||
| 存储 | Postgres(**无向量**;确定性按需注入) |
|
||
| 长任务 | FastAPI BackgroundTasks + `jobs` 表(无专门队列) |
|
||
| 多租户 | **原型不做**(单用户 stub),后续再加 |
|
||
|
||
**原型不做(均为后续)**:多租户/Auth、向量检索(P2)、专门队列、全书扫描、社区市场。
|
||
|
||
---
|
||
|
||
## 1. 任务约定
|
||
|
||
格式:`Tx.y [skill] 标题` → 描述 · **依赖** · **DoD**(验收) · **锚点**(文档)。
|
||
|
||
**Skill 标签**(每任务调用对应 expert skill 编写):
|
||
| 标签 | 职责 |
|
||
|---|---|
|
||
| `@devops` | monorepo/CI/docker/部署/迁移工具链 |
|
||
| `@db` | SQLAlchemy 模型、Alembic 迁移、Repository |
|
||
| `@backend` | FastAPI 端点、记忆服务、验收事务、BackgroundTasks |
|
||
| `@llm` | LLM 网关、适配器、LangGraph 图、Agent 声明 |
|
||
| `@frontend` | Next.js 页面、组件、流式渲染、TS 客户端 |
|
||
| `@qa` | 单元/集成/E2E、mock 网关、契约测试 |
|
||
| `@docs` | 文档修订 |
|
||
|
||
**解耦原则**:任务只经**契约**耦合(OpenAPI / Pydantic schema / `orchestrator`·`gateway`·`Repository` 接口)。**契约先行**——每阶段首个任务先定 schema/接口,随后 front/back/llm 并行。
|
||
|
||
---
|
||
|
||
## Phase 0 · 基建与架构栈修订
|
||
|
||
> 目标:可运行的空骨架 + 文档与锁定栈一致。
|
||
|
||
- **T0.1 [@devops] monorepo 骨架** → `apps/web`(Next/TS) + `apps/api`(FastAPI) + `packages/*`(python) + `docker-compose`(pg)。· 依赖 无 · DoD `docker compose up` 起 pg+api+web,根路由各返回 200。· 锚点 ARCH §2.2/§2.3
|
||
- **T0.2 [@db] 初始 schema + 迁移** → SQLAlchemy 模型(全部 **MVP 表**:9 张创作表 + `chapter_reviews` + `chapter_digests` + jobs/skills/provider_credentials/tier_routing/usage_ledger;**P2 表 `timeline`/`decisions` 不建**;**无向量**;users stub) + Alembic 初版迁移。· 依赖 T0.1 · DoD `alembic upgrade head` 一次建齐全部 MVP 表(含 `chapter_reviews`/`chapter_digests`,后续阶段不再加建表迁移,只加 Repository/约束);模型↔迁移 CI 校验通过。· 锚点 ARCH §3.1
|
||
- **T0.3 [@backend] FastAPI 骨架 + 契约基建 + 可观测性底座** → 应用入口、`config`(提供商注册/档位默认/env)、统一错误信封(**带 `request_id`**)、OpenAPI 输出、`jobs` 轮询端点 `GET /jobs/:id`;**structlog 结构化日志 + 每请求 `request_id` 生成/透传中间件**(一次"写一章"= 一条贯穿 assemble→write→四审→accept 的 trace)。· 依赖 T0.1 · DoD `/openapi.json` 可取;错误信封统一且含 `request_id`;日志为 JSON 且每行带 `request_id`。· 锚点 ARCH §7.1/§7.4/§9.3
|
||
- **T0.4 [@frontend] 前端骨架 + 设计 token + 客户端代码生成** → Tailwind + 纸感 CSS 变量(UX §2)、`apps/web/lib/api` 由 `/openapi.json` 生成 TS 类型的管线。· 依赖 T0.1,T0.3 · DoD 主题 token 生效;改后端 schema 后 `npm run gen:api` 同步类型。· 锚点 UX §2 / ARCH §8.4
|
||
- **T0.5 [@devops] CI** → ruff+mypy+pytest(后端)、eslint+tsc+vitest(前端)、Alembic 校验。· 依赖 T0.1 · DoD PR 全绿才可合。· 锚点 ARCH §11
|
||
- **T0.6 [@docs] 架构栈修订** → 按计划清单回写 ARCHITECTURE+PRODUCT_SPEC(Python/FastAPI/LangGraph/无向量/无队列/单用户/OpenAPI 契约)。· 依赖 无 · DoD 两文档无残留 pgvector/队列/Node 后端/ts 代码块;三文档栈口径一致。· 锚点 全文 ✅(已完成)
|
||
|
||
---
|
||
|
||
## Phase 1 (M1) · 写章闭环骨架
|
||
|
||
> 目标:立项 → 写一章草稿(流式)→ 自动保存。**契约先行:T1.1 网关接口 + T1.4 API schema。**
|
||
|
||
- **T1.1 [@llm] LLM 网关接口 + 单 provider 适配器** → `gateway.run(LlmRequest)->LlmResponse`、`AsyncIterator[Delta]` 流;先实现 1 个 OpenAI 兼容适配器(如 DeepSeek);档位路由读 `tier_routing`/默认;usage 回传;**每次调用按 §4.8 字段集落 `usage_ledger`**(成本账本从第一天起,带 `request_id`)。· 依赖 T0.2,T0.3 · DoD 单测:给 LlmRequest 得流式 token + usage;mock provider 可注入;一次调用产生一条 `usage_ledger` 记录。· 锚点 ARCH §4.1–4.3/§4.8/§9.3
|
||
- **T1.2 [@backend] 记忆服务 `assemble`(确定性选择)** → `select_relevant_entities`(显式+主角+近况) + `render_cards` + prompt 组装(稳定内核/易变 + 缓存断点)。· 依赖 T0.2 · DoD 单测:给定大纲/设定,输出确定且稳定块排序无时间戳。· 锚点 ARCH §3.4/§5.3
|
||
- **T1.3 [@llm] LangGraph 写章节点 + SSE** → 单节点图(write) + checkpointer(Postgres) + 流式输出归一为 SSE 事件(`token/done/error`)。· 依赖 T1.1,T1.2 · DoD 调用得流式草稿;图状态落 checkpoint。· 锚点 ARCH §5.2/§7.3
|
||
- **T1.4 [@backend] API:立项 + 写章** → `POST /projects`、`GET /projects`、`GET /projects/:id`、`POST /projects/:id/chapters/:no/draft`(SSE)、`PUT /projects/:id/chapters/:no/draft`(章节自动保存,写 `chapters` draft,见 ARCH §7.2)。· 依赖 T0.3,T1.3 · DoD 端点契约入 OpenAPI;`draft` 返回 SSE 流;`PUT draft` 幂等保存当前草稿。· 锚点 ARCH §7.2
|
||
- **T1.5 [@frontend] AppShell + 作品库 + 立项向导** → 顶栏/左导航(UX §5)、作品库卡片(UX §6.1)、5 步立项向导(UX §6.2)落 `projects` 字段。· 依赖 T0.4,T1.4 · DoD 可建作品并进入工作台。· 锚点 UX §5/§6.1/§6.2
|
||
- **T1.6 [@frontend] 写作工作台(核心)** → 三栏(目录/宋体正文编辑器/本章助手)、流式打字机、本章注入透明面板、自动保存(UX §6.3/§8.3)。· 依赖 T1.4 · DoD 选章→写本章→流式出草稿→自动保存。· 锚点 UX §6.3/§8.3
|
||
- **T1.7 [@backend] 提供商凭据管理** → 加密存储 `provider_credentials`、`GET/PUT /settings/providers`、`POST /settings/providers/test`(探测+能力矩阵)。· 依赖 T0.2,T1.1 · DoD Key 脱敏返回;测试连接通。· 锚点 ARCH §4.7 / UX §6.10
|
||
- **T1.8 [@frontend] 设置页(模型与提供商)** → 档位路由 + 凭据行(脱敏/测试连接/能力徽标)(UX §6.10)。· 依赖 T0.4,T1.7 · DoD 连一家 provider 后可写章。· 锚点 UX §6.10
|
||
- **T1.9 [@qa] M1 E2E** → 立项→写一章草稿(mock 网关)→自动保存。· 依赖 T1.5–T1.8 · DoD E2E 绿;网关用 mock 不烧 token。· 锚点 ARCH §11
|
||
|
||
---
|
||
|
||
## Phase 2 (M2) · 一致性 + 验收
|
||
|
||
> 目标:写→审(一致性)→裁决→验收(事务写回)。**契约先行:T2.1 审稿/冲突 schema。**
|
||
|
||
- **T2.1 [@llm] continuity Agent 声明 + 结构化输出契约** → `AgentSpec`(分析档) + 输出 `{conflicts:[{type,where,refs,suggestion}]}`(仅冲突;digest 改在验收时从终稿另提)。· 依赖 T1.1 · DoD 契约测试:mock 响应符合 schema。· 锚点 ARCH §5.1/§5.4
|
||
- **T2.2 [@llm] LangGraph 并行审 + review SSE** → write→并行分支(先 continuity)→collect(**落 `chapter_reviews` 留痕**);review 端 SSE(`section/conflict/done`)。· 依赖 T1.3,T2.1 · DoD review 流式返回结构化冲突且入库可查。· 锚点 ARCH §5.2/§7.3
|
||
- **T2.3 [@db] 摘要/审稿留痕 Repository + 章节 version** → (表已在 T0.2 建好)`chapter_digests` 追加、`chapter_reviews` 写入、`chapters` 多 version 的 **Repository 逻辑 + 唯一约束**(不含新建表迁移)。· 依赖 T0.2 · DoD 单测:append 不覆盖;`(chapter, version)` 唯一。· 锚点 ARCH §3.1/§3.3
|
||
- **T2.4 [@backend] 验收事务 + 冲突 gate** → `POST /accept`(单事务:章节晋升 version + **从终稿提炼 digest** append + 裁决留痕 `chapter_reviews.decisions` + 占位 foreshadow/char 更新);未决冲突拦截(`CONFLICT_UNRESOLVED`);LangGraph HITL 恢复(checkpoint 仅控制流,正文/审稿以领域表为准)。· 依赖 T2.2,T2.3 · DoD 事务原子(失败全回滚);digest 来自终稿非草稿;有未决冲突禁验收。· 锚点 ARCH §5.5/§7.1
|
||
- **T2.5 [@backend] review API + 历史** → `POST /projects/:id/chapters/:no/review`(SSE) + `GET .../reviews`(审稿历史)。· 依赖 T2.2 · DoD 契约入 OpenAPI。· 锚点 ARCH §7.2
|
||
- **T2.6 [@frontend] 审稿报告页 + 冲突裁决 + 验收 gate** → 审稿页(UX §6.4)、正文冲突就地波浪线/锚点、裁决(采纳/忽略/手改)、验收「本次将更新」清单,未决禁验收。· 依赖 T2.4,T2.5 · DoD 写→审→裁决→验收闭环。· 锚点 UX §6.4/§8.3
|
||
- **T2.7 [@qa] M2 E2E** → 写→审(一致性)→裁决→验收→摘要入库。· 依赖 T2.6 · DoD E2E 绿。· 锚点 ARCH §11
|
||
|
||
---
|
||
|
||
## Phase 3 (M3) · 伏笔 + 节奏
|
||
|
||
> 目标:伏笔账本/到期提醒/看板 + 节奏引擎 + 大纲。
|
||
|
||
- **T3.1 [@db] 伏笔表 + 状态机** → `foreshadow` 表 + 纯函数状态机(OPEN/PARTIAL/CLOSED/OVERDUE)。· 依赖 T0.2 · DoD 状态机单测覆盖全转移。· 锚点 ARCH §6.2 / PS §4.2
|
||
- **T3.2 [@backend] 到期扫描(BackgroundTask)** → 验收后触发扫描置 OVERDUE;登记/状态变更接口。· 依赖 T2.4,T3.1 · DoD 章号越界自动 OVERDUE。· 锚点 ARCH §6.2
|
||
- **T3.3 [@llm] foreshadow-analyst + pace-checker 节点** → 并入四审;genre 模板 DSL(存 `rules` genre 级)。· 依赖 T2.2 · DoD 四审齐全、结构化输出。· 锚点 ARCH §5.4/§6.2/§6.4
|
||
- **T3.4 [@llm] outliner Agent + 伏笔窗口** → 大纲节点;产出含 `foreshadow_windows`;接近回收窗口提示。· 依赖 T1.1 · DoD 生成分卷分章 + 窗口。· 锚点 ARCH §5.4 / PS §4.2
|
||
- **T3.5 [@backend] API:outline + foreshadow** → `POST /outline`、`GET /foreshadow?status=`。· 依赖 T3.1,T3.4 · DoD 看板数据可取。· 锚点 ARCH §7.2
|
||
- **T3.6 [@frontend] 伏笔看板 + 大纲编辑器 + 节奏报告** → 四泳道看板(UX §6.8)、大纲伏笔徽标(UX §6.7)、节奏节拍图(UX §6.4)。· 依赖 T3.3,T3.5 · DoD OVERDUE 琥珀提醒;节拍图渲染。· 锚点 UX §6.7/§6.8
|
||
- **T3.7 [@qa] M3 E2E** → 埋设→进展→逾期提醒;排大纲含窗口。· 依赖 T3.6 · DoD E2E 绿。· 锚点 ARCH §11
|
||
|
||
---
|
||
|
||
## Phase 4 (M4) · 文风
|
||
|
||
> 目标:学文风(指纹) + 漂移打分/回炉。
|
||
|
||
- **T4.1 [@backend] BackgroundTasks 长任务框架** → `jobs` 写入/进度/查询;`POST /style`(202+jobId)。· 依赖 T0.3 · DoD 长任务异步跑、进度可轮询。· 锚点 ARCH §7.4
|
||
- **T4.2 [@llm] style-auditor 双轨 + 并入第四审** → 提取(分析档,带原文证据)→`style_fingerprint`;漂移打分(轻量档);**把漂移打分作为第四审并入 LangGraph review 并行分支与 review SSE**(补齐 continuity/foreshadow/pace 之外的第四审,对齐 ARCH §5.2「四审」)。· 依赖 T1.1,T2.2,T3.3 · DoD 指纹 16 维带证据;段落相似度分;review 图含四个并行分支、SSE 含文风漂移分项。· 锚点 ARCH §6.3/§5.2 / PS §4.3
|
||
- **T4.3 [@backend] API:style + refine** → `POST /style`(mode=update)、`POST /chapters/:no/refine`(回炉段)。· 依赖 T4.1,T4.2 · DoD 回炉返回新旧 diff。· 锚点 ARCH §7.2
|
||
- **T4.4 [@frontend] 文风页 + 漂移/回炉** → 样本上传+指纹+证据(UX §6.9)、漂移段标注、回炉 diff(UX §8.3)。· 依赖 T4.3 · DoD 学文风→写章漂移标红→一键回炉。· 锚点 UX §6.9/§8.3
|
||
- **T4.5 [@qa] M4 E2E** → 学文风→写章打分→回炉。· 依赖 T4.4 · DoD E2E 绿。· 锚点 ARCH §11
|
||
|
||
---
|
||
|
||
## Phase 5 (M5) · 生成 + 多 provider + 扩展
|
||
|
||
> 目标:世界观/角色生成 + 网关多 provider 韧性 + Skill/规则/命令面板。
|
||
|
||
- **T5.1 [@llm] worldbuilder + character-gen 节点** → 写手档;群像防雷同(注入已生成+已有);编排器入库前追加 continuity 校验。· 依赖 T2.1 · DoD 批量产差异化角色卡、过校验。· 锚点 ARCH §6.5 / PS §4.5
|
||
- **T5.2 [@backend] 生成/入库 API** → `POST /world/generate`、`/characters/generate`、`POST /characters`(入库)。· 依赖 T5.1 · DoD 预览→入库→进入注入。· 锚点 ARCH §7.2
|
||
- **T5.3 [@frontend] 角色生成器 + 世界观设计器 + 设定库** → 生成模态(UX §6.6)、世界观设计器、设定库 Codex(人物/世界观/时间线, UX §6.5)。· 依赖 T5.2 · DoD 一句话生成→预览→入库;Codex 可管理。· 锚点 UX §6.5/§6.6
|
||
- **T5.4 [@llm] 网关多 provider 韧性** → 多适配器(Anthropic/Gemini/更多 OpenAI 兼容)、回退链 + 熔断 + 能力协商/降级(`usage_ledger` 记账已在 T1.1 落地,此处仅扩展多 provider 维度)。· 依赖 T1.1 · DoD 限流/不支持结构化输出时降级/回退;多 provider 记账分维度可查。· 锚点 ARCH §4.4–4.6
|
||
- **T5.5 [@backend] Skill 运行时 + 规则** → `skills` registry loader + 表权限沙箱(越权拒绝) + `POST /rules`。· 依赖 T0.2,T1.1 · DoD 自定义 skill 受表权限约束、产出经验收 gate。· 锚点 ARCH §5.6 / PS §5.5/§7
|
||
- **T5.6 [@frontend] 规则页 + 技能库 + 命令面板** → 规则管理、技能库、命令面板(⌘K)。· 依赖 T5.5 · DoD 加规则/调 skill/快捷跳转。· 锚点 UX §7
|
||
- **T5.7 [@qa] M5 E2E + 切 provider** → 生成群像入库;切换 provider 回归(降级/回退)。· 依赖 T5.3,T5.4 · DoD E2E 绿;切 provider 不破。· 锚点 ARCH §11
|
||
|
||
---
|
||
|
||
## 2. 阶段 DoD 矩阵
|
||
|
||
| 阶段 | 出口标准(Definition of Done) |
|
||
|---|---|
|
||
| Phase 0 | 骨架可起;全表迁移;CI 绿;文档与锁定栈一致 |
|
||
| M1 | 立项→写一章草稿(流式)→自动保存;连一家 provider |
|
||
| M2 | 写→审(一致性)→裁决→验收(事务);未决冲突禁验收 |
|
||
| M3 | 伏笔账本/到期提醒/看板;大纲含回收窗口;节奏报告 |
|
||
| M4 | 学文风(指纹+证据);漂移打分+回炉 |
|
||
| M5 | 世界观/群像生成入库;多 provider 回退/降级;Skill 沙箱 |
|
||
|
||
## 3. 任务 ↔ 文档锚点覆盖(抽样自检)
|
||
|
||
| 功能(PS §) | 任务 | UX/ARCH 锚点 |
|
||
|---|---|---|
|
||
| 立项 §6 | T1.4/T1.5 | UX §6.2 |
|
||
| 写章 §4/§6 | T1.2/T1.3/T1.6 | ARCH §5.2/§5.3 |
|
||
| 一致性 §4.1 | T2.1/T2.4/T2.6 | ARCH §6.1 |
|
||
| 伏笔 §4.2 | T3.1/T3.2/T3.6 | ARCH §6.2 / UX §6.8 |
|
||
| 文风 §4.3 | T4.2/T4.4 | ARCH §6.3 / UX §6.9 |
|
||
| 节奏 §4.4 | T3.3/T3.6 | ARCH §6.4 |
|
||
| 角色生成 §4.5 | T5.1/T5.3 | UX §6.6 |
|
||
| 多提供商 §3.3 | T1.1/T5.4 | ARCH §4 / UX §6.10 |
|
||
| 技能 §5.5 | T5.5 | ARCH §5.6 |
|
||
|
||
## 4. 后续(原型外,对应规格的 P2/后续标注)
|
||
|
||
- 多租户 + Auth(§9.1):Repository 层加 `owner_id` 校验,接 Auth.js/OAuth。
|
||
- 向量检索(P2):`select_relevant_entities` 接口后接 pgvector + 嵌入服务。
|
||
- 专门队列:BackgroundTasks → arq/Celery(接口不变)。
|
||
- 全书一致性回归扫描、社区 Skill 市场、夜读模式。
|