Files
dreamweaver/docs/technical/harness-engineering-modernization.md

1079 lines
48 KiB
Markdown
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.
# Harness Engineering 架构改造技术设计
**项目**: DreamWeaver 梦语织机
**版本**: 0.1
**日期**: 2026-06-23
**状态**: 阶段 0-15 当前切片已完成,主生成与资产任务均已写入 WorkflowPlan 快照,资产生成/重试已开始由 plan-driven executor 驱动executor coverage 已进入 admin-only 聚合并嵌入 admin traceadmin-only harness readiness 审查已建立,用户侧 job event/request payload 已使用白名单脱敏,文本故事和绘本已纳入内部评测驱动,内部 golden replay 基线、覆盖摘要、admin-only evaluation analytics 和 admin-only 完整 trace 已建立
**作者**: Codex
---
## 1. 背景
DreamWeaver 当前已经完成统一生成工作流的第一轮落地:`POST /api/generations` 会创建 `generation_jobs`,后台 worker 执行故事或绘本生成,`generation_job_events` 记录关键过程,前端通过 job 查询和故事状态展示进度、失败与重试入口。
现有架构已经具备 harness engineering 的雏形:
- `story_service` 负责上下文准备、主内容生成、故事落库、资产补全、状态同步和任务收敛。
- `generation_jobs` 负责 job/event、进度摘要、取消、重试和 Provider 聚合。
- `provider_router` 负责 Provider 选择、failover、熔断、成本和调用事件。
- `story_status` 负责把文本、图片、音频状态推导为统一故事状态。
当前主要问题不是缺少能力,而是生成运行时控制逻辑分散在多个 service 内。取消检查、事件记录、资产恢复、Provider 轨迹、失败分类和质量校验还没有形成显式的运行时边界。
本设计的目标,是把现有“隐性 harness”升级为可观测、可恢复、可验证、可演进的 Generation Harness Runtime同时保留当前 API、数据库和前端主行为。
## 2. 目标
### 2.1 产品目标
- 家长提交故事或绘本生成后,能获得稳定、可解释、可恢复的结果。
- 主内容生成成功后,即使图片或音频失败,也不影响阅读。
- 用户能清楚看到任务步骤、失败原因和可重试资产。
- 后续新增语音共创、更多内容模式或新资产类型时,复用同一套运行时模型。
### 2.2 工程目标
-`story_service` 中的运行时控制职责抽到 harness 层。
- 让 workflow step、artifact、trace、failure category 成为一等概念。
- 让内容生成结果在持久化和发布前具备可追踪、可回归的评测结果。
- 保持 `/api/generations`、旧兼容接口、现有状态字段和主要测试行为不破坏。
- 优先做渐进式重构,不引入复杂工作流引擎,不进行大爆炸重写。
- 每个大阶段都产出阶段报告,包含实现、审查、验证和风险。
### 2.3 非目标
- 本轮不引入 Temporal、Dagster、LangGraph 等外部工作流引擎。
- 本轮不彻底重做数据库结构。
- 本轮不废弃旧生成接口,只继续保持兼容层指向统一入口。
- 本轮不把 DreamWeaver 抽象成通用 agent 平台,所有抽象必须服务儿童故事生成业务。
- 本轮不要求一次性完成所有 eval、质量门和 replay 能力。
## 3. 架构原则
1. **主内容优先可读**
文本故事或绘本结构是 blocking artifact封面、分页插图、音频是 recoverable artifact。
2. **API 稳定优先**
先重构内部边界再考虑扩展响应字段。现有前端、smoke、测试不应被第一阶段打断。
3. **事件结构稳定**
继续复用 `generation_job_events`,但逐步标准化 metadata避免每个调用点随手定义不同结构。
4. **Provider 不等于产品能力**
Provider 只是 tool invocation 的实现。产品能力应由 capability、workflow step、artifact 和 recovery policy 共同定义。
5. **评测驱动优先**
生成成功不等于产品成功。每条新执行路径必须先定义可追踪 evaluation 事件、评分维度、阻断阈值和回归测试,再扩大迁移范围。
6. **评测数据内部分级**
评测分数、维度、阈值和阻断细节属于内部质量资产与商业机密,不通过用户端接口或用户前端分发。用户端只展示可操作功能、可解释进度和可恢复状态。
7. **小步可验证**
每个最小任务都必须能通过单测、局部测试或文档审查验证。
## 4. 目标架构
```mermaid
flowchart TB
API["FastAPI API 层"] --> COMMAND["Generation Command"]
COMMAND --> HARNESS["Generation Harness Runtime"]
HARNESS --> CTX["Context Builder<br/>档案 / 宇宙 / 记忆 / 输入规范化"]
HARNESS --> PLAN["Workflow Plan<br/>story / storybook / asset_generation / asset_retry"]
HARNESS --> CONTROL["Execution Control<br/>取消 / 超时收敛 / 安全检查点"]
HARNESS --> TRACE["Trace Recorder<br/>job events / step metadata / provider trace"]
HARNESS --> ARTIFACT["Artifact Workflows<br/>story_text / storybook_pages / image / audio"]
HARNESS --> GUARD["Quality Gates<br/>schema / 儿童安全 / 内容完整性"]
HARNESS --> EVAL["Evaluators<br/>结构 / 安全 / 年龄适配 / 教育价值 / 可读性"]
ARTIFACT --> ROUTER["Provider Router<br/>策略 / failover / 熔断 / 成本"]
ROUTER --> ADAPTERS["Provider Adapters"]
HARNESS --> STATE["State Store<br/>stories / generation_jobs / generation_job_events"]
STATE --> FE["Vue 前端进度 / 详情 / 重试"]
```
## 5. 运行时核心概念
### 5.1 Generation Command
表示一次用户意图,来源包括:
- `POST /api/generations`
- `POST /api/generations/{story_id}/retry-assets`
- `POST /api/generations/jobs/{job_id}/retry`
- 旧兼容接口产生的同步生成调用
标准字段:
| 字段 | 说明 |
| --- | --- |
| `output_mode` | `story``storybook``asset_generation``asset_retry` |
| `input_type` | `keywords``full_story``image``audio` 或资产组合 |
| `user_id` | 当前用户 |
| `story_id` | 已有故事 ID可为空 |
| `request_payload` | 原始请求的 JSON 安全快照 |
### 5.2 Workflow Step
第一阶段先将现有 event type 映射为标准 step不立即改库
| Step | 当前事件 | 是否阻塞主内容 |
| --- | --- | --- |
| `request_acceptance` | `request_accepted``retry_queued``workflow_planned` | 是 |
| `worker_start` | `worker_started` | 是 |
| `context_preparation` | `context_prepared` | 是 |
| `narrative_generation` | `narrative_generated` | 是 |
| `evaluation` | `evaluation_completed` | 是 |
| `story_persistence` | `story_saved` | 是 |
| `image_generation` | `cover_image_*``storybook_*image*` | 否 |
| `audio_generation` | `audio_*` | 否 |
| `postprocessing` | `postprocessing_queued` | 否 |
| `completion` | `generation_completed``asset_*_completed` | 是 |
| `cancellation` | `cancel_requested``generation_canceled` | 是 |
| `stale_recovery` | `generation_stale_failed` | 是 |
### 5.3 Artifact
| Artifact | 来源 | 状态字段 | 恢复策略 |
| --- | --- | --- | --- |
| `story_text` | text provider | `text_status` | 失败则 job failed |
| `storybook_pages` | storybook provider | `text_status` | 失败则 job failed |
| `cover_image` | image provider | `image_status` | 失败后 `degraded_completed`,可重试 |
| `page_image` | image provider | `image_status` | 部分页失败后 `degraded_completed`,可重试 |
| `audio` | tts provider + file cache | `audio_status` | 失败后 `degraded_completed`,可重试 |
| `achievement_memory` | Celery 后处理 | 事件记录 | 失败不影响主内容 |
### 5.4 Failure Category
第一阶段先在代码中定义枚举和 metadata 规范;后续逐步写入事件:
| Category | 说明 |
| --- | --- |
| `provider_error` | 外部 Provider 返回失败或不可用 |
| `schema_error` | Provider 输出无法解析或字段不完整 |
| `safety_error` | 儿童安全或内容安全校验失败 |
| `timeout` | 调用超时或 job 超时 |
| `canceled` | 用户取消 |
| `stale_job` | 后台任务卡住后被系统收敛 |
| `storage_error` | 数据库、文件缓存或持久化失败 |
| `validation_error` | 用户输入、档案或宇宙校验失败 |
| `unknown_error` | 未归类错误 |
### 5.5 Trace Metadata
标准 event metadata 应逐步包含:
```json
{
"step": "narrative_generation",
"artifact": "story_text",
"capability": "text",
"adapter": "demo",
"provider_id": null,
"strategy": "priority",
"latency_ms": 42,
"estimated_cost_usd": 0.01,
"failure_category": null,
"error": null,
"retryable": false,
"blocks_main_result": true
}
```
### 5.6 Evaluation Result
每次主内容生成必须逐步产出可追踪评测结果。第一阶段使用确定性启发式,后续可替换或叠加模型评测、人审样本集和离线 replay。
标准字段:
| 字段 | 说明 |
| --- | --- |
| `overall_score` | `0.0-1.0` 总分 |
| `passed` | 是否通过当前阈值 |
| `blocking` | 是否阻断持久化或发布 |
| `scores` | 维度评分列表 |
| `quality_gate` | 质量门失败详情,可为空 |
| `warnings` | 非阻断风险提示 |
当前维度:
- `structure`
- `safety`
- `age_fit`
- `educational_value`
- `readability`
标准事件:
- `workflow_planned`
- `evaluation_completed`
短期兼容要求:
- 不删除现有 metadata 字段。
- 新增字段必须向后兼容。
- 前端仍可使用当前 `event_type``status``message``event_metadata`
- 用户端 API 和用户前端不得返回或展示 `overall_score`、维度分数、阈值、阻断策略或 golden replay 结果。
### 5.7 Workflow Plan Coverage
`WorkflowPlan` 是生成 harness 的显式执行骨架。当前主生成路径和资产路径都会写入 `workflow_planned` 事件:
| 模式 | plan mode | 关键任务 | 备注 |
| --- | --- | --- | --- |
| 普通故事无图片 | `story` | `prepare_context``generate_narrative``evaluate_narrative``persist_story``queue_postprocessing``complete_generation` | 当前最小 plan-aware 路径 |
| 普通故事带图片 | `story_with_assets` | 在普通故事任务基础上增加 `generate_cover_image` | 封面图为 `required=false``recoverable=true` |
| 绘本 | `storybook` | `prepare_context``generate_storybook_pages``evaluate_storybook_pages`、可选 `generate_storybook_images``persist_storybook``queue_postprocessing``complete_generation` | 绘本图片为可恢复资产 |
| 资产生成 | `asset_generation` | `start_asset_generation``complete_image_asset``complete_audio_asset``complete_asset_generation` | 图片/音频均为 `required=false``recoverable=true` |
| 资产重试 | `asset_retry` | `start_asset_retry``complete_image_asset``complete_audio_asset``complete_asset_retry` | 同步重试路径也记录 plan |
当前边界:
- `workflow_planned` 可进入用户侧进度,因为它只描述产品步骤,不包含评分、阈值或 golden replay 信息。
- 用户端只返回 coarse plan metadata`plan_mode``planned_task_count``recoverable_task_count`
- 用户端不返回原始 `plan.tasks`、任务 key、内部阈值或执行策略。
- `evaluation_completed` 只保留在内部事件、内部测试和 admin-only 聚合中。
- 用户端 job detail 会过滤 `evaluation_completed`
- 用户端 trace summary 不统计 `evaluation_completed` 的事件数量、step、artifact 或失败分类。
- 用户端 trace summary 不统计 `executor_completed` 的事件数量、task key 或 result asset。
### 5.8 Public Event Metadata Sanitizer
用户侧 job detail 的 `events[*].event_metadata` 使用白名单输出。数据库中的内部 metadata 不被删除,内部分析、测试和 admin-only 能力仍可读取完整事件;普通用户 API 只返回产品可解释且可操作的字段。
允许公开的类别:
- 标准 step、artifact、failure_category。
- 资源状态和资产范围,如 `asset``assets``status``image_status``audio_status`
- 用户可理解的执行上下文,如 `mode``output_mode``input_type``page_count``page_number`
- Provider 运营摘要,如 `adapter``capability``strategy``latency_ms``estimated_cost_usd`
- coarse plan 摘要:`plan_mode``planned_task_count``recoverable_task_count`
禁止公开的类别:
- `evaluation_completed` 事件本身。
- `overall_score`、维度分数、评分 reason、阈值、质量门 issue 明细。
- 原始 `plan``plan.tasks`
- `result_snapshot`、内部错误原文、内部阈值、replay/golden case 信息。
- 任意未来新增 metadata 字段,除非显式加入白名单。
### 5.9 Internal Evaluation Replay
内部 evaluation replay 用于把固定 golden cases 和当前 evaluator 输出做对比,帮助我们在调整质量门、评分维度或 Provider 输出结构时快速发现评测基线漂移。
当前边界:
- replay 输入和结果只用于后端测试、内部工具或未来 admin-only 能力。
- replay fixture 不被线上生成链路自动读取。
- replay 不新增公开 API不改变用户端 schema不进入用户前端 bundle。
- 用户端 trace summary 的 `total_events` 不统计内部 `evaluation_completed`
- replay 断言只检查内部质量事实:`passed``blocking``overall_score` 区间、维度存在性、质量门 issue code 和 warning。
- replay case 可以携带内部覆盖标签:年龄段、内容形态、风险区域和标签集合。
- replay suite 可以生成内部覆盖摘要artifact、age_band、content_shape、risk_area、tags、outcome。
当前 golden case 覆盖:
- 完整普通故事通过。
- 较长普通故事通过。
- 普通故事空正文被质量门阻断。
- 普通故事封面提示词缺失被质量门阻断。
- 普通故事安全风险词被质量门阻断。
- 普通故事结构合格但在高阈值下因阅读体验偏短被评测阻断。
- 完整绘本分页通过。
- 绘本重复页码被质量门阻断。
- 绘本没有分页内容被质量门阻断。
- 绘本分页安全风险词被质量门阻断。
- 绘本分页正文过短触发内部 warning 并在高阈值下阻断。
### 5.10 Admin-Only Evaluation Analytics
内部评测 analytics 只允许在管理控制面读取,用于质量运营和评测策略复盘。该能力不得进入用户端 `/api/generations` 路由、用户前端类型或用户前端 bundle。
当前 admin-only 聚合字段:
| 字段 | 说明 |
| --- | --- |
| `total_evaluations` | 内部评测事件数量 |
| `passed_evaluations` | 通过数量 |
| `blocked_evaluations` | 阻断数量 |
| `pass_rate` | 通过率 |
| `average_score` | 总分平均值 |
| `by_artifact` | 按 `story_text` / `storybook_pages` 聚合 |
| `by_output_mode` | 按 story / storybook 聚合 |
| `score_bands` | 按分数段聚合 |
| `dimension_scores` | 各评分维度平均分 |
| `quality_gate_issues` | 质量门 issue code 聚合 |
| `failure_categories` | 质量门 failure category 聚合 |
| `warnings` | 内部 warning 文案聚合 |
安全边界:
- 只挂载在 admin router 下,受 `ENABLE_ADMIN_CONSOLE` 和 Basic Auth admin guard 保护。
- 不返回故事正文、绘本分页正文、用户 prompt、cover prompt、score reason、quality gate message、单条 evaluation event 或 job event 明细。
- 用户端 API 继续过滤 `evaluation_completed`
- 用户端 trace summary 继续不统计内部 `evaluation_completed`
- 用户端前端不包含该接口调用、类型定义或展示组件。
### 5.11 Admin-Only Executor Coverage
内部 executor coverage 用于审查 `WorkflowPlan` 是否真正驱动了资产执行,以及哪些 task key 仍只是计划占位或被当前 runner 忽略。该能力只属于管理控制面,不进入用户 API 或用户前端。
当前 admin-only 聚合字段:
| 字段 | 说明 |
| --- | --- |
| `total_runs` | executor 完成事件数量 |
| `total_planned_tasks` | 计划任务总数 |
| `total_executed_tasks` | 实际执行任务总数 |
| `total_ignored_tasks` | 被 runner 忽略的任务总数 |
| `coverage_ratio` | `executed / planned` |
| `by_plan_mode` | 按 `asset_generation` / `asset_retry` 等模式聚合 |
| `by_output_mode` | 按生成 job 的 output mode 聚合 |
| `executed_task_keys` | 已执行 task key 聚合 |
| `ignored_task_keys` | 已忽略 task key 聚合 |
| `result_assets` | 返回资产聚合 |
安全边界:
- 只挂载在 admin router 下,受 `ENABLE_ADMIN_CONSOLE` 和 Basic Auth admin guard 保护。
- `executor_completed` 事件、task key、ignored task key 和 result asset 明细不进入用户 job detail。
- 用户 job summary 如果短暂停留在内部 `executor_completed` step会映射为安全公开的 `workflow_planned`
- 用户 trace summary 不统计 `executor_completed`,避免通过事件数量或聚合维度泄露内部执行器结构。
- 用户前端不包含 `/admin/executors/coverage` 调用、类型定义或展示组件。
### 5.12 Admin Trace Executor Coverage Summary
管理端单个 generation trace 在完整事件流之外,额外返回 `executor_coverage` 摘要,用于一次请求内同时完成“看事件”和“看执行覆盖”的审查。
设计边界:
- `GET /admin/generations/jobs/{job_id}/trace` 复用全局 executor coverage 的聚合函数,避免两个 admin 视图统计口径不一致。
- trace 内嵌 summary 的 `scope``admin_internal_job_executor_coverage`,只统计当前 job 的 `executor_completed` 事件。
- trace 内嵌 summary 允许返回 task key、ignored task key 和 result asset因为该接口已经是 admin-only 完整内部 trace。
- 用户侧 `/api/generations/jobs/{job_id}``/api/generations/{story_id}/jobs``/api/generations/{story_id}/trace-summary` 均不返回该字段。
### 5.13 Admin-Only Harness Readiness
内部 harness readiness 用于在扩大 plan-driven executor 或评测策略接管范围前,给管理控制面提供一个聚合级别的上线前审查摘要。
输入来源:
- 内部 golden replay fixture随后端 app 一起发布,避免运行环境缺少测试目录。
- admin-only evaluation analytics 聚合。
- admin-only executor coverage 聚合。
当前 readiness checks
| Check | 说明 | 默认门槛 |
| --- | --- | --- |
| `golden_replay` | 内部 golden cases 是否全部符合预期 | 必须全部通过 |
| `runtime_evaluation_samples` | 当前窗口是否有运行期 evaluation 样本 | 至少 1 条 |
| `runtime_evaluation_quality` | 运行期 evaluation 通过率和均分是否达标 | pass rate >= 0.7average score >= 0.7 |
| `executor_coverage_samples` | 当前窗口是否有 executor coverage 样本 | 至少 1 次 run |
| `executor_coverage_ratio` | executor 实际执行任务占计划任务比例 | coverage ratio >= 0.2 |
安全边界:
- 只挂载在 admin router 下,受 `ENABLE_ADMIN_CONSOLE` 和 Basic Auth admin guard 保护。
- 只返回聚合结果、阈值、状态和 coverage summary。
- 不返回故事正文、绘本分页正文、用户 prompt、cover prompt、score reason、quality gate message 或单条事件明细。
- 用户端 API 和用户前端不包含该接口调用、类型定义或展示组件。
## 6. 模块设计
### 6.1 `app/services/harness/types.py`
新增纯类型模块,不依赖数据库。
职责:
- 定义 `WorkflowStep`
- 定义 `ArtifactKind`
- 定义 `FailureCategory`
- 定义 `StepStatus`
- 定义 `TraceMetadata`
- 定义从旧 event type 到标准 step 的映射函数
验收:
- 单测覆盖 event type 到 step 的映射。
- 未知 event type 映射到 `unknown` 或保守默认,不抛出非预期异常。
### 6.2 `app/services/harness/trace.py`
封装 job event 写入。
职责:
- 提供 `TraceRecorder.record_step(...)`
- 提供 `TraceRecorder.record_provider_call(...)`
- 统一补齐 `step``artifact``failure_category``retryable``blocks_main_result`
- 内部继续调用现有 `record_generation_event`
验收:
- 现有 `generation_job_events` 行为保持。
- 新事件 metadata 含标准字段。
- job 为空时安全跳过,兼容旧同步接口。
### 6.3 `app/services/harness/control.py`
封装执行控制。
职责:
- 提供 `ExecutionControl.stop_if_cancel_requested(...)`
- 保留现有取消语义和 `GenerationJobCanceledError`
- 后续可扩展 step timeout、checkpoint、stale recovery
验收:
- 取消中的 job 仍被标记为 `canceled`
- 现有取消测试继续通过。
### 6.4 `app/services/harness/artifacts.py`
第二阶段再拆。第一阶段先保留 `story_service` 中的资产函数,只把共享结果类型移动或桥接。
职责:
- 表达 `AssetCompletionResult`
- 后续承载封面、绘本插图、音频工作流
验收:
- 资产重试行为不变。
- `retryable_assets` 行为不变。
### 6.5 `story_service` 改造方式
第一阶段仅做低风险替换:
- `_record_job_event_if_present` 代理到 `TraceRecorder`
- `_stop_if_job_cancel_requested` 代理到 `ExecutionControl`
- `AssetCompletionResult` 可先留在原文件,第二阶段再移动
- 不重写 `generate_generation_service``run_generation_job_service` 主流程
第二阶段再拆分:
- `story_generation_workflow.py`
- `storybook_generation_workflow.py`
- `asset_generation_workflow.py`
- `asset_retry_workflow.py`
## 7. 阶段计划
### 阶段 0: 设计与基线
目标:
- 产出本技术设计。
- 产出阶段 0 报告。
- 明确阶段拆解、验收标准和验证方式。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H0-1 | 梳理现有统一生成 PRD、架构文档和测试 | 文档引用现有边界,不重复设计入口 |
| H0-2 | 定义目标 runtime 架构 | 技术设计包含模块、数据、阶段计划 |
| H0-3 | 拆分最小可执行任务 | 每个阶段有任务 ID 和验收标准 |
| H0-4 | 建立阶段报告机制 | `docs/planning/` 下有阶段报告 |
### 阶段 1: Harness 基础类型与事件封装
目标:
- 新增 harness 包。
- 标准化 workflow step、artifact、failure category。
-`TraceRecorder` 封装事件写入。
-`ExecutionControl` 封装取消检查。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H1-1 | 新增 `app/services/harness/__init__.py` | 后端 import 正常 |
| H1-2 | 新增 `types.py` 枚举和映射 | 单测覆盖核心 event type |
| H1-3 | 新增 `trace.py` | record 后 metadata 含 `step` |
| H1-4 | 新增 `control.py` | 取消行为与旧逻辑一致 |
| H1-5 | 替换 `story_service` 中事件和取消 helper 的内部实现 | 现有 API 行为不变 |
| H1-6 | 补 `tests/test_harness_runtime.py` | 后端测试通过 |
验证命令:
```bash
cd backend
pytest tests/test_harness_runtime.py tests/test_generation_jobs.py
ruff check app tests
```
阶段报告:
- `docs/planning/harness-stage-1-report.md`
### 阶段 2: 资产工作流边界抽取
目标:
- 将封面、绘本插图、音频补全从 `story_service` 中拆成 artifact workflow。
- 保持当前 `StoryAssetStatus``sync_story_status` 语义。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H2-1 | 移动或桥接 `AssetCompletionResult` | import 稳定 |
| H2-2 | 抽普通故事封面工作流 | 封面生成、失败、重试测试通过 |
| H2-3 | 抽绘本图片工作流 | 绘本逐页事件顺序不破坏 |
| H2-4 | 抽音频工作流 | 音频缓存和失败状态测试通过 |
| H2-5 | 补 artifact workflow 单测 | 资产相关测试通过 |
验证命令:
```bash
cd backend
pytest tests/test_stories.py tests/test_generation_jobs.py tests/test_audio_cache.py
ruff check app tests
```
阶段报告:
- `docs/planning/harness-stage-2-report.md`
### 阶段 3: Workflow Plan 与执行器
目标:
- 用显式 `WorkflowPlan` 表达 story、storybook、asset_generation、asset_retry。
-`_generate_generation_service_with_job` 的分支压缩到计划构建和执行器。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H3-1 | 定义 `WorkflowPlan``WorkflowTask` | 不依赖 FastAPI schema |
| H3-2 | 为普通故事构建 plan | 不生成图片时步骤正确 |
| H3-3 | 为完整故事构建 plan | 图片为 recoverable step |
| H3-4 | 为绘本构建 plan | 绘本结构和图片步骤可区分 |
| H3-5 | 为资产任务构建 plan | 重试和后台生成共用计划 |
| H3-6 | 增加 plan 单测 | 核心模式计划快照稳定 |
验证命令:
```bash
cd backend
pytest tests/test_harness_runtime.py tests/test_generation_jobs.py tests/test_stories.py
ruff check app tests
```
阶段报告:
- `docs/planning/harness-stage-3-report.md`
### 阶段 4: Quality Gates 与输出验证
目标:
- 在 Provider 输出进入持久化之前,加入低成本、确定性的质量门。
- 后续可扩展模型评审,但第一轮避免额外 AI 成本。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H4-1 | 定义 quality gate 接口 | 不绑定具体 Provider |
| H4-2 | 文本故事完整性检查 | 标题、正文、封面 prompt 缺失可识别 |
| H4-3 | 绘本结构检查 | 页数、页码、正文、图片 prompt 可识别 |
| H4-4 | 儿童内容基础安全检查 | 明显不适龄词或空内容阻断 |
| H4-5 | gate 失败写入 `failure_category` | job event 可解释 |
验证命令:
```bash
cd backend
pytest tests/test_harness_runtime.py tests/test_generation_jobs.py tests/test_stories.py
ruff check app tests
```
阶段报告:
- `docs/planning/harness-stage-4-report.md`
### 阶段 5: Trace Analytics 与前端增量展示
目标:
- 前端继续消费现有 job/event但可展示标准 step、artifact、failure category。
- 管理端可按 failure category 聚合失败原因。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H5-1 | 后端聚合支持标准 step/failure category | 旧字段兼容 |
| H5-2 | 用户端生成轨迹展示 step 名称 | 移动端不溢出 |
| H5-3 | 管理端 Provider dashboard 增加 failure category | 构建通过 |
| H5-4 | 更新 smoke 脚本校验标准 metadata | demo smoke 通过 |
验证命令:
```bash
cd backend
pytest
ruff check app tests
cd ../frontend
npm run build
cd ../admin-frontend
npm run build
```
阶段报告:
- `docs/planning/harness-stage-5-report.md`
### 阶段 6: 新架构真实运行烟测
目标:
- 使用新代码启动本地 API 与 Celery worker。
- 复用 Docker demo stack 中的 PostgreSQL 与 Redis。
- 通过真实 HTTP API 覆盖登录、生成、worker 执行、故事落库、trace summary 和 provider stats。
- 覆盖主内容工作流与资源重试工作流。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H6-1 | 启动本地新代码 API | `/health` 返回 `{"status":"ok"}` |
| H6-2 | 启动本地新代码 worker | 生成任务可被 worker claim 并执行 |
| H6-3 | 使用 dev 登录创建真实 cookie 会话 | `/auth/session` 返回开发用户 |
| H6-4 | 提交普通故事生成 | job 进入 completed/degraded 且 story 落库 |
| H6-5 | 查询 trace summary/provider stats | 返回 step、artifact、provider 聚合 |
| H6-6 | 执行图片资源重试 | trace summary 聚合出 `image_generation``cover_image` |
| H6-7 | 清理临时进程并恢复 Docker worker | `docker compose ps` 环境回到可用状态 |
验证命令:
```bash
cd backend
DATABASE_URL='postgresql+asyncpg://dreamweaver:dreamweaver_password@localhost:52432/dreamweaver_db' \
CELERY_BROKER_URL='redis://localhost:52379/0' \
CELERY_RESULT_BACKEND='redis://localhost:52379/0' \
REDIS_URL='redis://localhost:52379/0' \
.venv/bin/python -m uvicorn app.main:app --host 127.0.0.1 --port 53000
DATABASE_URL='postgresql+asyncpg://dreamweaver:dreamweaver_password@localhost:52432/dreamweaver_db' \
CELERY_BROKER_URL='redis://localhost:52379/0' \
CELERY_RESULT_BACKEND='redis://localhost:52379/0' \
REDIS_URL='redis://localhost:52379/0' \
.venv/bin/celery -A app.core.celery_app worker --loglevel=info --concurrency=1
```
阶段报告:
- `docs/planning/harness-stage-6-report.md`
### 阶段 7: 评测驱动与执行器最小接管
目标:
- 将“生成是否合格”从隐含质量门升级为结构化 evaluation result。
- 让普通故事、`generate_images=false` 的最小路径由 `WorkflowPlan` 参与执行。
- 在 job events 中记录 `workflow_planned``evaluation_completed`
- 用测试锁住评分、阻断、事件顺序和 trace 聚合。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H7-1 | 新增 deterministic evaluator | 通过/阻断用例有单测 |
| H7-2 | 新增 plan-aware executor helper | 任务写入 `workflow_planned` |
| H7-3 | 普通故事无图片路径接入 plan | worker 事件序列包含 plan/evaluation |
| H7-4 | 质量门失败也写入 evaluation | failed job 可解释阻断原因 |
| H7-5 | 增加评测驱动 QA 用例文档 | 覆盖功能、边界、错误和状态转换 |
| H7-6 | 阶段报告记录 bug/风险 | 大 bug 可后续统一处理 |
| H7-7 | 增加内部 golden replay 基线 | 固定样本可离线回放并被单测锁定 |
| H7-8 | 增加 replay 覆盖摘要 | 年龄段、内容形态、风险区域和 outcome 分布可被单测锁定 |
验证命令:
```bash
cd backend
.venv/bin/python -m pytest tests/test_harness_runtime.py tests/test_generation_jobs.py
.venv/bin/python -m ruff check app tests
```
阶段报告:
- `docs/planning/harness-stage-7-report.md`
### 阶段 8: Admin-Only Evaluation Analytics
目标:
- 提供管理控制面内部评测摘要,用于质量运营和评测策略复盘。
- 明确 admin-only 权限边界,避免将评测数据分发给普通用户。
- 只返回聚合摘要不返回原始内容、prompt、单条评测明细或评分 reason。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H8-1 | 新增 admin evaluation analytics 服务 | 可聚合 `evaluation_completed` |
| H8-2 | 新增 admin-only 路由 | `/admin/evaluations/analytics` 受 admin guard 保护 |
| H8-3 | 支持 days/artifact 过滤 | 过滤测试通过 |
| H8-4 | 锁定用户端隔离 | 用户端扫描无 evaluation analytics 入口 |
| H8-5 | 阶段报告记录安全边界 | 明确不返回原始内容和单条明细 |
验证命令:
```bash
cd backend
.venv/bin/python -m pytest tests/test_admin_providers.py tests/test_generation_jobs.py
.venv/bin/python -m ruff check app tests
```
阶段报告:
- `docs/planning/harness-stage-8-report.md`
### 阶段 9: WorkflowPlan 接管扩展
目标:
- 让普通故事无图片、普通故事带图片、绘本三条主生成路径都写入显式 `workflow_planned`
- 将计划快照用于锁定事件顺序、可恢复资产任务和后续执行器迁移边界。
- 继续保持评测数据内部分级,用户端只看到可用进度和可恢复状态。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H9-1 | 带图片故事路径记录 `story_with_assets` plan | 事件顺序中 `workflow_planned` 位于 `worker_started``context_prepared` 之间 |
| H9-2 | 绘本路径记录 `storybook` plan | plan 快照包含 `evaluate_storybook_pages` 和可恢复图片任务 |
| H9-3 | 补主路径事件顺序测试 | story、story_with_assets、storybook 三条路径均被测试覆盖 |
| H9-4 | 锁定用户端评测隔离 | 用户 API 不返回 `evaluation_completed`、评分、维度或 replay 数据 |
| H9-5 | 阶段报告记录执行偏差和验证结果 | 报告包含实现、审查、测试和风险 |
验证命令:
```bash
cd backend
.venv/bin/python -m pytest tests/test_generation_jobs.py
.venv/bin/python -m pytest
.venv/bin/python -m ruff check app tests
cd ../frontend
npm run build
cd ../admin-frontend
npm run build
```
阶段报告:
- `docs/planning/harness-stage-9-report.md`
### 阶段 10: 资产计划与 Public Metadata Sanitizer
目标:
-`asset_generation``asset_retry` 也纳入 `WorkflowPlan` 记录。
- 让用户侧 job event metadata 使用白名单脱敏,避免未来内部 metadata 扩展时误泄露质量策略。
- 保留用户前端需要的可解释字段step、artifact、failure category、资源状态、Provider 运营摘要和 coarse plan 摘要。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H10-1 | 后台资产生成记录 `asset_generation` plan | worker 事件顺序包含 `workflow_planned` |
| H10-2 | 资源重试记录 `asset_retry` plan | 同步 retry events 包含 plan 快照 |
| H10-3 | 旧封面/音频生成接口记录资产 plan | 兼容接口不破坏现有响应 |
| H10-4 | 用户 event metadata 白名单脱敏 | 用户 API 不返回原始 `plan.tasks``result_snapshot`、内部错误和阈值 |
| H10-5 | 补资产计划和 sanitizer 回归测试 | `tests/test_generation_jobs.py` 覆盖相关路径 |
验证命令:
```bash
cd backend
.venv/bin/python -m pytest tests/test_generation_jobs.py
.venv/bin/python -m pytest
.venv/bin/python -m ruff check app tests
cd ../frontend
npm run build
cd ../admin-frontend
npm run build
```
阶段报告:
- `docs/planning/harness-stage-10-report.md`
### 阶段 11: Trace 访问分级与 Request Payload Sanitizer
目标:
- 用户侧 job detail 的 `request_payload` 改为白名单脱敏避免内部调度参数、Provider override、评测策略或原始输入被接口原样回传。
- 新增 admin-only generation trace detail`admin_guard` 保护下返回完整内部 request payload、workflow plan 和 evaluation metadata。
- 明确用户前端与管理控制面的 trace 数据边界,为后续 executor 接管保留完整取证能力。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H11-1 | 用户侧 request payload 白名单脱敏 | 用户 job detail 只返回 output/input mode、资产、故事 ID、页数、图片请求开关等安全控制字段 |
| H11-2 | 新增 admin-only trace detail 服务 | 管理端可按 job id 读取完整内部 request payload 和完整 event metadata |
| H11-3 | 新增 admin trace 路由与响应模型 | `GET /admin/generations/jobs/{job_id}/trace``admin_guard` 保护 |
| H11-4 | 补用户脱敏和 admin 完整 trace 测试 | 用户接口不含内部字段admin 接口包含 `evaluation_completed` 和完整 plan |
| H11-5 | 阶段报告记录商业机密边界 | 报告说明用户端不分发评测数据admin-only 数据用途和剩余风险 |
验证命令:
```bash
cd backend
.venv/bin/python -m pytest tests/test_generation_jobs.py tests/test_admin_providers.py -q
.venv/bin/python -m pytest
.venv/bin/python -m ruff check app tests
cd ../frontend
npm run build
cd ../admin-frontend
npm run build
```
阶段报告:
- `docs/planning/harness-stage-11-report.md`
### 阶段 12: Plan-Driven Asset Executor 试点
目标:
-`WorkflowPlan` 从“记录计划”进入“驱动执行”的第一步。
- 先接管低风险资产任务:`asset_generation``asset_retry`、旧封面生成、旧音频生成。
- 保留现有 asset workflow 的 provider 调用、状态同步、取消检查和事件记录,不把细节复制进 executor。
- 保持用户侧公开面不新增评测数据或内部 task metadata。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H12-1 | 新增 `run_asset_plan` | 按 `WorkflowTask.key` 顺序执行图片/音频任务,并返回执行结果 |
| H12-2 | 后台 `asset_generation` 接入 plan runner | 多资产 job 按 plan 顺序生成音频和图片,事件顺序稳定 |
| H12-3 | 同步 `asset_retry` 接入 plan runner | 图片/音频重试仍保持原有完成和失败语义 |
| H12-4 | 旧封面/音频接口接入 plan runner | `/api/image/generate/{id}``/api/audio/{id}` 行为兼容 |
| H12-5 | 补 executor 与资产路径回归测试 | harness 单测覆盖执行顺序generation job 测试覆盖组合资产执行 |
验证命令:
```bash
cd backend
.venv/bin/python -m pytest tests/test_harness_runtime.py tests/test_generation_jobs.py -q
.venv/bin/python -m pytest
.venv/bin/python -m ruff check app tests
cd ../frontend
npm run build
cd ../admin-frontend
npm run build
```
阶段报告:
- `docs/planning/harness-stage-12-report.md`
### 阶段 13: Admin-Only Executor Coverage
目标:
- 将资产 executor 的执行结果记录成内部 `executor_completed` 事件。
- 新增 admin-only executor coverage 聚合,用于审查 plan-driven execution 覆盖率。
- 用户侧 job detail、job list 和 trace summary 继续隐藏内部 executor task key 与 coverage metadata。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H13-1 | executor result 生成 coverage metadata | metadata 包含 plan mode、planned/executed/ignored counts、task keys、result assets |
| H13-2 | 资产路径记录 `executor_completed` | asset generation/retry 和旧资源接口写入内部 executor 事件 |
| H13-3 | 新增 admin-only coverage API | `GET /admin/executors/coverage` 受 admin guard 保护 |
| H13-4 | 用户侧过滤 executor 事件和 step | 用户 API 不返回 `executor_completed` 或 task keys |
| H13-5 | 补 admin coverage 与用户隔离测试 | 聚合、过滤、鉴权和用户隔离均被测试覆盖 |
验证命令:
```bash
cd backend
.venv/bin/python -m pytest tests/test_generation_jobs.py tests/test_admin_providers.py tests/test_harness_runtime.py -q
.venv/bin/python -m pytest
.venv/bin/python -m ruff check app tests
cd ../frontend
npm run build
cd ../admin-frontend
npm run build
```
阶段报告:
- `docs/planning/harness-stage-13-report.md`
### 阶段 14: Admin Trace Executor Coverage Summary
目标:
- 让 admin-only 完整 generation trace 自带 executor coverage 摘要。
- 复用全局 executor coverage 聚合逻辑,保持 `/admin/executors/coverage` 与单 job trace 的统计口径一致。
- 修正用户 trace summary 的隔离边界,确保内部 `executor_completed` 不通过聚合数量或 task key 泄露。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H14-1 | 抽出 executor coverage 纯聚合函数 | 全局 coverage API 与单 job trace 复用同一函数 |
| H14-2 | admin trace 返回 `executor_coverage` | `GET /admin/generations/jobs/{job_id}/trace` 包含当前 job executor summary |
| H14-3 | 用户 trace summary 过滤 `executor_completed` | 用户 trace summary 不统计内部 executor 事件数量或 task key |
| H14-4 | 补 admin trace summary 与用户隔离测试 | admin 可见覆盖摘要;用户 detail/list/trace summary 不可见 |
| H14-5 | 阶段报告记录审查与验证 | 报告包含实现、风险、命令和结果 |
验证命令:
```bash
cd backend
.venv/bin/python -m pytest tests/test_generation_jobs.py tests/test_admin_providers.py tests/test_harness_runtime.py -q
.venv/bin/python -m pytest
.venv/bin/python -m ruff check app tests
cd ../frontend
npm run build
cd ../admin-frontend
npm run build
```
阶段报告:
- `docs/planning/harness-stage-14-report.md`
### 阶段 15: Admin-Only Harness Readiness
目标:
- 建立一个 admin-only readiness audit在扩大 harness 接管范围前给出聚合质量门。
- 复用 golden replay、evaluation analytics 和 executor coverage避免新增独立统计口径。
- 保持用户侧完全不可见不向用户端分发评测数据、executor task key 或 readiness 结果。
最小任务:
| ID | 任务 | 验收 |
| --- | --- | --- |
| H15-1 | 将 golden replay fixture 放入 app 内部路径 | Docker 运行环境可读取内部 golden cases |
| H15-2 | 新增 admin harness readiness 服务 | 聚合 golden replay、evaluation analytics 和 executor coverage |
| H15-3 | 新增 admin-only readiness API | `GET /admin/harness/readiness` 受 admin guard 保护 |
| H15-4 | 补 readiness ready/blocked/鉴权测试 | ready、blocked、needs_attention 和 401 均被覆盖 |
| H15-5 | 阶段报告记录安全边界和验证 | 报告说明不返回正文、prompt、score reason 或单条事件 |
验证命令:
```bash
cd backend
.venv/bin/python -m pytest tests/test_admin_providers.py tests/test_harness_runtime.py -q
.venv/bin/python -m pytest
.venv/bin/python -m ruff check app tests
cd ../frontend
npm run build
cd ../admin-frontend
npm run build
```
阶段报告:
- `docs/planning/harness-stage-15-report.md`
## 8. 需求与验收
### 功能需求
| ID | 优先级 | 需求 | 验收标准 |
| --- | --- | --- | --- |
| FR-001 | MUST | 系统必须保留统一生成 API 行为 | `/api/generations` 测试继续通过 |
| FR-002 | MUST | 系统必须有标准 workflow step 类型 | 核心 event type 可映射到 step |
| FR-003 | MUST | 系统必须有标准 artifact 类型 | story、storybook、image、audio 可区分 |
| FR-004 | MUST | 系统必须标准化 job event metadata | 新事件含 `step`,旧字段不删除 |
| FR-005 | MUST | 用户取消语义必须保持 | 取消测试继续通过 |
| FR-006 | SHOULD | Provider 调用应记录标准 trace 字段 | provider event 含 capability、adapter、latency、cost、step |
| FR-007 | SHOULD | 资产工作流应从主 service 拆出 | `story_service` 行数和职责减少 |
| FR-008 | SHOULD | 输出验证应在持久化前执行 | schema 缺失可被测试捕获 |
| FR-009 | COULD | 前端展示标准 step/failure category | 构建通过且无布局溢出 |
| FR-010 | MUST | 用户侧事件 metadata 必须白名单脱敏 | 用户 API 不返回评测分数、原始 plan、result snapshot 或内部错误原文 |
| FR-011 | MUST | 用户侧 request payload 必须白名单脱敏 | 用户 job detail 不返回原始输入、内部调度参数、provider override 或评测策略 |
| FR-012 | SHOULD | 管理控制面可读取完整内部 trace | admin-only trace endpoint 返回完整 request payload 和完整 event metadata |
| FR-013 | SHOULD | 资产任务应由 WorkflowPlan 驱动执行 | asset generation/retry 按 plan task key 执行图片和音频任务 |
| FR-014 | SHOULD | 管理控制面可审查 executor 覆盖率 | admin-only coverage endpoint 聚合 executor runs、task counts 和 result assets |
| FR-015 | SHOULD | 管理端单 job trace 可审查 executor 覆盖摘要 | admin-only trace endpoint 返回当前 job 的 executor coverage summary |
| FR-016 | SHOULD | 管理控制面可执行 harness readiness 审查 | admin-only readiness endpoint 聚合 golden replay、evaluation analytics 和 executor coverage |
### 非功能需求
| ID | 优先级 | 需求 | 验收标准 |
| --- | --- | --- | --- |
| NFR-001 | MUST | 向后兼容 | 现有测试和 smoke 主链路不破坏 |
| NFR-002 | MUST | 可测试 | 每个新增 harness 模块有单测 |
| NFR-003 | MUST | 可观测 | job/event 可以解释 step、artifact、失败原因 |
| NFR-004 | SHOULD | 低耦合 | harness 类型模块不依赖 FastAPI 和 SQLAlchemy |
| NFR-005 | SHOULD | 性能稳定 | 不新增阻塞式外部调用 |
| NFR-006 | SHOULD | 中文一致性 | 文档、用户可见文案和新增注释使用简体中文 |
| NFR-007 | MUST | 默认不公开内部 metadata | 未加入白名单的新字段不会出现在用户侧 job event 响应中 |
| NFR-008 | MUST | Trace 数据访问分级 | 用户接口只返回安全公开字段;完整评测和内部调度数据仅在 admin guard 后提供 |
| NFR-009 | SHOULD | Executor 接管必须小步可回退 | 先接资产任务;主文本生成仍保持原有服务路径 |
| NFR-010 | MUST | Executor coverage 默认不公开 | `executor_completed`、task keys 和 coverage metadata 不进入用户端接口 |
| NFR-011 | MUST | Admin trace 统计口径一致 | 单 job trace 与全局 executor coverage 复用同一聚合逻辑 |
| NFR-012 | MUST | Readiness 数据默认不公开 | readiness endpoint 只在 admin guard 后提供不返回正文、prompt、score reason 或单条事件 |
## 9. 风险与缓解
| 风险 | 影响 | 缓解 |
| --- | --- | --- |
| 过度抽象导致改造变慢 | 中 | 第一阶段只抽类型、trace、control不拆主流程 |
| 事件 metadata 变化影响前端 | 中 | 只新增字段,不删除旧字段 |
| 取消/重试语义被破坏 | 高 | 优先跑 `tests/test_generation_jobs.py` |
| Provider trace 与 job event 重复 | 低 | 保持 Provider 事件专注调用层workflow 事件专注产品步骤 |
| 文档与实现偏离 | 中 | 每个阶段报告必须记录实现偏差 |
| 质量门误伤内容 | 中 | 第四阶段先做确定性低风险检查,模型评审延后 |
| 评测 analytics 泄露商业机密 | 高 | 仅 admin-only 聚合摘要;用户端 API/前端不接入;测试覆盖 admin guard 和用户端隔离 |
| 新增 trace metadata 误进用户 API | 高 | `public_generation_event_metadata` 使用 allowlist新增字段默认不公开 |
| 请求 payload 混入内部字段 | 高 | `public_generation_request_payload` 使用 allowlist完整 payload 仅 admin-only trace endpoint 可见 |
| Executor 抽象过早扩大范围 | 中 | 阶段 12 只接管资产 task key主文本、评测和持久化暂不迁移 |
| Executor coverage 泄露内部执行策略 | 中 | `executor_completed` 全量过滤用户侧响应,只在 admin-only coverage/trace 中提供 |
| Admin trace 与全局 coverage 口径漂移 | 中 | 抽出共享聚合函数,测试同时覆盖 admin trace 和全局 coverage API |
| Readiness 运行环境缺少 golden fixture | 中 | golden cases 放入 app 内部 harness fixtures随 Docker `COPY app ./app` 发布 |
| Readiness 聚合泄露内部内容 | 高 | 只返回聚合状态和覆盖摘要;测试断言不包含 story title、score reason 或 quality gate message |
## 10. 审查清单
每个阶段完成前必须检查:
- [ ] 是否保持 `/api/generations` 行为兼容
- [ ] 是否有对应测试或验证命令
- [ ] 是否没有引入不必要的外部框架
- [ ] 是否没有重写无关功能
- [ ] 是否保留用户已有工作区改动
- [ ] 是否更新阶段报告
- [ ] 是否更新本设计中的阶段状态或偏差记录
## 11. 当前状态
| 阶段 | 状态 | 备注 |
| --- | --- | --- |
| 阶段 0 | 已完成设计基线 | 已建立本设计与阶段 0 报告 |
| 阶段 1 | 已完成基础实现 | 已新增 harness 类型、trace recorder、execution control并通过定向测试 |
| 阶段 2 | 已完成主要资产补全抽取 | 封面、音频、持久化绘本缺失图片补全已迁入 harness asset workflows |
| 阶段 3 | 已完成计划建模基线 | 已定义 WorkflowPlan/WorkflowTask 和核心模式计划快照;执行器接管留待后续 |
| 阶段 4 | 已完成确定性质量门 | 已接入文本故事和绘本结构完整性/儿童安全基础检查 |
| 阶段 5 | 已完成 trace analytics 与前端展示 | 已新增 trace summary API并在用户端/管理端生成轨迹中展示 step、artifact、failure category |
| 阶段 6 | 已完成真实运行烟测 | 已通过本地新代码 API/worker + Docker PostgreSQL/Redis 覆盖主生成和图片资源重试链路 |
| 阶段 7 | 已完成 7A/7B/7C/7D/7E 当前切片 | 已接入 deterministic evaluator、`workflow_planned``evaluation_completed`、普通故事无图片 plan-aware 路径、绘本内部评测、内部 golden replay 和覆盖摘要;已修正并锁定用户侧不分发评测数据 |
| 阶段 8 | 已完成 admin-only evaluation analytics 当前切片 | 已新增 `/admin/evaluations/analytics` 聚合接口、admin guard 测试、days/artifact 过滤和用户端隔离扫描 |
| 阶段 9 | 已完成 WorkflowPlan 接管扩展当前切片 | 普通故事带图片和绘本路径已记录 plan 快照,三条主路径事件顺序与用户端评测隔离已由测试覆盖 |
| 阶段 10 | 已完成资产计划与 public metadata sanitizer 当前切片 | 资产生成/重试路径已记录 plan用户侧 event metadata 改为白名单并隐藏原始 plan、result snapshot 和内部字段 |
| 阶段 11 | 已完成 trace 访问分级当前切片 | 用户侧 request payload 改为白名单;新增 admin-only 完整 trace endpoint 并覆盖鉴权和内部事件测试 |
| 阶段 12 | 已完成 plan-driven asset executor 当前切片 | `run_asset_plan` 已按 plan task key 驱动图片/音频资产任务;后台资产生成、资源重试和旧封面/音频接口已接入 |
| 阶段 13 | 已完成 admin-only executor coverage 当前切片 | 资产 executor 已记录内部 `executor_completed`;新增 `/admin/executors/coverage`,用户侧继续过滤 executor 事件和 task keys |
| 阶段 14 | 已完成 admin trace executor coverage summary 当前切片 | admin trace 已内嵌单 job executor coverage 摘要;用户 trace summary 继续过滤内部 executor 事件 |
| 阶段 15 | 已完成 admin-only harness readiness 当前切片 | 新增 `/admin/harness/readiness` 聚合 golden replay、evaluation analytics 与 executor coverage用户侧继续不可见 |