# Harness Engineering 架构改造技术设计 **项目**: DreamWeaver 梦语织机 **版本**: 0.1 **日期**: 2026-06-23 **状态**: 阶段 0-15 当前切片已完成,主生成与资产任务均已写入 WorkflowPlan 快照,资产生成/重试已开始由 plan-driven executor 驱动,executor coverage 已进入 admin-only 聚合并嵌入 admin trace,admin-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
档案 / 宇宙 / 记忆 / 输入规范化"] HARNESS --> PLAN["Workflow Plan
story / storybook / asset_generation / asset_retry"] HARNESS --> CONTROL["Execution Control
取消 / 超时收敛 / 安全检查点"] HARNESS --> TRACE["Trace Recorder
job events / step metadata / provider trace"] HARNESS --> ARTIFACT["Artifact Workflows
story_text / storybook_pages / image / audio"] HARNESS --> GUARD["Quality Gates
schema / 儿童安全 / 内容完整性"] HARNESS --> EVAL["Evaluators
结构 / 安全 / 年龄适配 / 教育价值 / 可读性"] ARTIFACT --> ROUTER["Provider Router
策略 / failover / 熔断 / 成本"] ROUTER --> ADAPTERS["Provider Adapters"] HARNESS --> STATE["State Store
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.7,average 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;用户侧继续不可见 |