Просмотр исходного кода

docs(web): align web docs with delivered CFA V2 facts, add Web V2 iteration plan

- 03 技术开发规划:Web-V2-A 删除违反 M6 红线的 stall_flag/stalls[] 依赖,
  改为真实合同(summary 七字段 + items[].record.raw_payload);decode 事件 4→5 类;
  现状对齐段时态完成时+commit 号;Web-V2-C 缩范围(回放 diff 推迟,注明缺导出配套);
  不做清单补 run 异步化拍板
- 02 数据与接口规划:7 接口标注已实现;新增第 8 节配置只读端点合同
- 05 实施简报 Web-A/Web-B 完成标注;01/README 实施现状标注
- 新增 06_WebV2迭代计划.md(Web V2 权威计划:拍板/数据合同/W2-W6 范围/验收)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sam Lee 3 дней назад
Родитель
Сommit
ce69e7730d

+ 7 - 5
web/README.md

@@ -40,8 +40,10 @@
 
 ## 后续实施顺序
 
-1. 补后端 Web 友好 API。
-2. 初始化 `web/` 下 Next.js 项目。
-3. 建立 API client、类型和数据 adapter。
-4. 复刻 `show` 的页面视觉与核心交互。
-5. 用真实 run 数据替换静态演示数据。
+1. 补后端 Web 友好 API。(已完成,commit 6ee0079)
+2. 初始化 `web/` 下 Next.js 项目。(已完成,commit c6c5e39)
+3. 建立 API client、类型和数据 adapter。(已完成)
+4. 复刻 `show` 的页面视觉与核心交互。(已完成基础版)
+5. 用真实 run 数据替换静态演示数据。(已完成)
+
+Web V2 迭代(时间线/配置只读/V1 bug 修复)见 `docs/06_WebV2迭代计划.md`。

+ 2 - 0
web/docs/01_产品功能规划.md

@@ -1,5 +1,7 @@
 # Web 产品功能规划
 
+> 实施现状(2026-06-10):本规划的 V1 范围(Run 列表/总览/七阶段/调试页)已落地(commit 6ee0079 后端 + c6c5e39 前端)。Web V2 三件套(时间线与耗时事实可视化 / 配置只读视图 / 回放来源标注)见 `03_技术开发规划.md` Web V2 节与 `06_WebV2迭代计划.md`。
+
 ## 目标用户
 
 新 Web 面向内部运营、产品、策略和工程用户。它不是营销页面,也不是单纯日志页,而是 ContentFindAgent 的运行观察、结果复盘和问题诊断面板。

+ 12 - 0
web/docs/02_数据与接口规划.md

@@ -85,6 +85,8 @@ Web 不应该直接绑定本地文件路径。后端如果暴露 runtime 文件
 
 ## 新增 Web 友好接口规划
 
+**实施现状(2026-06-10):以下 1-7 号接口已全部实现并提交(后端 commit 6ee0079;M6 为 timeline 增补 summary 七字段,commit ed13f10)。第 8 节配置只读接口由 Web V2 实做。**
+
 ### 1. `GET /runs`
 
 用途:Run 列表页。
@@ -250,6 +252,16 @@ Web 不应该直接绑定本地文件路径。后端如果暴露 runtime 文件
 - 规则判断结果
 - source path 引用
 
+### 8. 配置只读接口(Web V2 实做)
+
+用途:配置即真相只读视图(Web-V2-B);避免前端解析本地 JSON 源文件。三个端点均为全局只读、无参数、无写能力:
+
+- `GET /config/rule-packs` → `{source_file, data}`,data 为 `product_documents/规则包/douyin_rule_packs.v1.json` 全文(dispatch 5 条 / Content 包 hard_gates / scorecard / thresholds / effect_status_mapping / decision_reason_codes)
+- `GET /config/walk-strategy` → 同构,`product_documents/抖音游走策略/douyin_walk_strategy.v1.json` 全文(walk_rule_pack_binding 8 条 / edge catalog 10 条 / budget / stop policy)
+- `GET /config/query-prompts` → 同构,`product_documents/配置/query_prompts.v1.json` 全文(douyin/V1 profile)
+
+约束:只读展示;编辑仍走 Excel→JSON 工具链(M1);响应不含任何密钥(配置文件本身无密钥)。
+
 ## 前端 API 配置
 
 Next.js 前端第一版使用:

+ 20 - 20
web/docs/03_技术开发规划.md

@@ -378,51 +378,51 @@ web/
 
 本文档第一版写「本轮只写规划,不初始化 Next.js」,但实际 web 已落地骨架与基础消费,Web V2 是在此之上「消费 CFA V2 新增事实」,不是从零搭:
 
-- 前端已初始化(Next.js 15 + App Router):`app/runs/page.tsx`、`app/runs/[runId]/page.tsx`,feature 页 `features/runs/RunListPage.tsx`、`RunDashboardPage.tsx`,组件 `components/pipeline/PipelineHeader.tsx`、`components/cards/*`、`components/badges/StatusBadge.tsx`,`lib/api/client.ts`、`lib/adapters/pipeline.ts`。
-- 后端 Web-1 API 已存在(当前为未提交 WIP):`content_agent/dashboard_service.py`(`list_runs` / `dashboard` / `queries` / `timeline` / `content_items` / `runtime_files` / `runtime_file`),`api.py` 已注册 `GET /runs`、`/runs/{id}/dashboard|queries|timeline|content-items|runtime-files|runtime-files/{filename}`,`schemas.py` 有对应 response model,CORS 已配。
+- 前端已初始化并提交(Next.js 15 + App Router,commit c6c5e39,2026-06-10):`app/runs/page.tsx`、`app/runs/[runId]/page.tsx`,feature 页 `features/runs/RunListPage.tsx`、`RunDashboardPage.tsx`,组件 `components/pipeline/PipelineHeader.tsx`、`components/cards/*`、`components/badges/StatusBadge.tsx`,`lib/api/client.ts`、`lib/adapters/pipeline.ts`。
+- 后端 Web-1 API 已提交(commit 6ee0079,2026-06-10):`content_agent/dashboard_service.py`(`list_runs` / `dashboard` / `queries` / `timeline` / `content_items` / `runtime_files` / `runtime_file`),`api.py` 已注册 `GET /runs`、`/runs/{id}/dashboard|queries|timeline|content-items|runtime-files|runtime-files/{filename}`,`schemas.py` 有对应 response model,CORS 已配。
 - 即 Web-0…Web-5 的「骨架 + 基础消费」事实上已落地;Web V2 聚焦三块新消费。
-- **依赖关系**:Web V2 各项依赖 CFA V2 对应模块先落地(新增字段为增量,旧消费不破坏);CFA 未交付前,adapter 对缺字段降级为空状态,不白屏。
+- **依赖关系**:CFA V2 已全部交付(M3=42d0802 / M4=410cd72 / M5=7e86c9a / M6=ed13f10,2026-06-10),新增字段均为增量,旧消费不破坏;adapter 对缺字段仍降级为空状态,不白屏。
 
-### Web-V2-A:全流程时间线与卡点可视化(消费 CFA V2-M6
+### Web-V2-A:全流程时间线与耗时/失败事实可视化(消费 CFA V2-M6,已落地
 
 职责:
 
-- 把现 `timeline` 的扁平事件流升级为「甘特 / 阶段耗时」视图。
-- 展示每节点 `duration_ms`、`total_duration_ms`、`stalls[]`(decode 超时 / 限流命中 / query 高失败率)。
-- decode 逐条进度(`decode_submitted` / `polling` / `succeeded` / `timeout` 中间事件)。
+- 把现 `timeline` 的扁平事件流升级为「阶段耗时 + 事件流(日志线)」视图(横条即可,不引甘特图库)。
+- 展示 summary 七字段:`total_duration_ms` / `stage_duration_ms` / `query_failure_count` / `platform_rate_limited_count` / `decode_status_counts` / `error_counts` / `walk_status_counts`。
+- decode 逐条中间事件(五类:`decode_submitted` / `decode_polling` / `decode_succeeded` / `decode_failed` / `decode_timeout`)。
+- `stage_failed` 事件高亮并展示 error_code / 脱敏 message——前端只呈现事实。
 
-依赖接口:
+依赖接口(CFA V2-M6 已落地,commit ed13f10)
 
-- `GET /runs/{run_id}/timeline`(M6 后新增 `stage` / `started_at` / `ended_at` / `duration_ms` / `attempt` / `stall_flag` / `stall_reason` / `total_duration_ms` / `stalls[]`;这些字段当前代码均不存在,由 CFA V2-M6 补,属增量)。
+- `GET /runs/{run_id}/timeline`:summary 七字段在响应顶层 `summary`;单条事件的耗时细节在 `items[i].record.raw_payload`(`stage` / `started_at` / `ended_at` / `duration_ms` / `attempt`)。
+- **M6 拍板红线:后端不产生 `stall_flag` / `stall_reason` / `stalls[]` 等"卡住"判断字段;"卡住"的业务阈值留待真实运行数据积累后由产品定义,前端不得自行发明判断。**
 
 ### Web-V2-B:配置即真相只读视图(消费 CFA V2-M1 / M3 / M4)
 
 职责:
 
 - 展示当前生效的规则包(Content 包 hard gates / scorecard / thresholds)与游走 `walk_rule_pack_binding`(边→包)。
-- 在 walk 视图按边展示 `walk_actions.rule_pack_id`(M4 后非 NULL 按边正确),让「哪条边跑了哪个包」可见;future 包(`dispatch_enabled=false`)标注为「已归属未运行」。
+- 在 walk 视图按边展示 `walk_actions.rule_pack_id`(M4 已落地,按边正确非 NULL),并区分「边归属包」与「实际执行包」(`raw_payload.rule_pack_execution.executed` / `executed_rule_pack_id`);future 包(`dispatch_enabled=false`)标注为「已归属未运行」。
 
 依赖接口:
 
 - `GET /runs/{run_id}/content-items` + `runtime-files/rule_decisions.jsonl`(已存在)。
-- `runtime-files/walk_actions.jsonl`(已存在;`rule_pack_id` 字段由 CFA V2-M4 补正)。
-- 建议后端补一个只读「当前配置」摘要接口(暴露 rule_pack / binding 概要),避免前端直接解析 JSON 源文件
+- `runtime-files/walk_actions.jsonl`(已存在;`rule_pack_id` 与 `raw_payload.rule_pack_binding` / `rule_pack_execution` 已由 CFA V2-M4 落地)。
+- 后端只读配置接口(Web V2 实做):`GET /config/rule-packs`、`GET /config/walk-strategy`、`GET /config/query-prompts`,返回 product_documents 配置 JSON 原文 + source_file 标注;接口合同见 `02_数据与接口规划.md` 第 8 节
 
-### Web-V2-C:真实 case 回放 diff 视图(消费 CFA V2-M0
+### Web-V2-C:回放数据来源标注(缩范围;diff 视图推迟
 
-职责:
+职责(本轮范围)
 
-- 对接 M0 语料库回放:同一 case、不同配置(config × case 矩阵)的产物对照。
-- 复用现有 `data_origin` badge 区分「生产事实 / 回放导出」。
-- 展示 snapshot diff(改一档配置后入池 / 淘汰 / `rule_pack_id` 的变化)。
+- 复用现有 `data_origin` badge 区分「生产事实(production_db) / 回放导出(runtime_export) / 混合(mixed_with_runtime_export)」——已实现,保持。
 
-依赖接口
+推迟项与原因:
 
-- 现 `data_origin` 机制(已支持 `runtime_export` / `mixed_with_runtime_export`)。
-- 回放产物经 runtime export 读取,沿用 runtime file 白名单。
+- 「同一 case 不同配置的 snapshot diff 视图」推迟:M0 回放是 pytest 测试设施(`tests/replay_harness.py` 只写临时目录),**没有生产侧回放导出 API 或持久化产物**;做 diff 视图需先给后端补"回放产物导出 / 回放触发"配套,列入后续迭代再拍板。
 
 ### Web V2 不做
 
+- run 异步化与「运行中进度轮询」——POST /runs 当前同步阻塞,运行中无进度可查;本轮已拍板不做,留待后续迭代(需后端异步任务 + 轮询端点配套)。
 - 配置可视化「编辑」(写)能力——CFA V2 傻瓜配置上限是「业务改 Excel + CI 兜底」,可视化编辑 UI 留 Web V3;Web V2 只做配置「只读展示」。
 - 移动端适配。
 - 前端直连 MySQL。

+ 4 - 0
web/docs/05_Web实施简报.md

@@ -33,6 +33,8 @@
 
 ## Web-A:后端只读 Web API
 
+**状态:已完成(commit 6ee0079,2026-06-10)。以下为实施前简报原文。**
+
 ### 目标
 
 先补齐 Web 需要的只读聚合接口。前端第一版不要直接拼 runtime 文件,也不要在组件里理解所有 DB 表细节。
@@ -124,6 +126,8 @@ uv run --with pymysql python scripts/validate_content_agent_db.py --env-file .en
 
 ## Web-B:Next.js 项目初始化
 
+**状态:已完成(commit c6c5e39,2026-06-10)。以下为实施前简报原文。**
+
 ### 目标
 
 在 `web/` 下初始化独立 Next.js 应用,建立项目骨架、基础布局和 API client。

+ 37 - 0
web/docs/06_WebV2迭代计划.md

@@ -0,0 +1,37 @@
+# Web V2 迭代计划(权威版)
+
+状态:本文是 Web V2 的权威迭代计划,基于 CFA V2 已交付事实(M3=42d0802 / M4=410cd72 / M5=7e86c9a / M6=ed13f10,2026-06-10)与 web 骨架现状(6ee0079 后端 / c6c5e39 前端)。数据合同均经真实 mock run 实测。
+
+## 拍板
+
+- run 异步化与运行中进度轮询:**本轮不做**(POST /runs 同步阻塞;留待后续迭代)。
+- 回放 diff 视图:**推迟**(M0 回放是 pytest 设施,无生产导出配套);本轮只保持 data_origin 来源标注。
+- 配置只读 = 3 个全局端点(/config/rule-packs、/config/walk-strategy、/config/query-prompts);**只读不编辑**(编辑走 Excel→JSON 工具链,可视化编辑留 Web V3)。
+- 不引前端测试框架;前端验证 = `tsc --noEmit` + `next build` + 手动核验;后端新端点用 pytest TestClient。
+- 不做甘特图(与 CFA 06 计划 V3 留白一致);阶段耗时用纯 CSS 横条。
+- 前端不得发明"卡住"判断(M6 红线):只呈现耗时/失败/限流/decode 事实。
+
+## W2 后端(content_agent/api.py、schemas.py、dashboard_service.py、tests/test_api.py)
+
+1. 3 个全局只读配置端点(合同见 02 文档第 8 节);schemas 加 ConfigFileResponse{source_file, data}。
+2. dashboard_service `_query_decision_summaries` 的 `content_effect_status` 读取修复:改为 `search_query_effect_status or content_effect_status`(decision 记录从无 content_effect_status 字段,原代码恒读 None;与 M6C 对 `_effect_status_counts` 的修法一致)。
+3. `_walk_graph()` edge 增补 `rule_pack_executed` / `executed_rule_pack_id`(取自 walk action raw_payload.rule_pack_execution)——支撑"归属包 vs 实际执行包"展示。
+4. tests/test_api.py 追加配置端点与修复断言。
+
+## W3 时间线+日志页(web/app/runs/[runId]/timeline + features/runs/RunTimelinePage.tsx)
+
+数据合同(实测):timeline.summary 七字段;items[i] = {source, stage, event_type, status, timestamp, error_code, walk_action_id, record};阶段事件细节在 record.raw_payload(stage/started_at/ended_at/duration_ms/attempt)。
+
+页面:①summary 七字段 MetricCard 区;②stage_duration_ms 横条(12 阶段,stage_failed 红色高亮+error_code);③事件流列表(来源过滤 chips:阶段/decode/游走/路径;每条可展开 record.raw_payload 即日志明细;decode 按 platform_content_id 分组);④兜底链接到 runtime-files 的 run_events.jsonl 分页原文。types.ts 给 TimelineResponse 补 summary 强类型。dashboard 页移除零消费的 timeline state,改为时间线入口卡片。
+
+## W4 配置只读页(web/app/config + features/config/ConfigPage.tsx)
+
+三 tab:①规则包(dispatch 5 条含 future 标注/hard_gates 10 条/scorecard 维度与规则/effect_status_mapping 5 条/reason codes 9 条);②游走策略(binding 8 条/edge catalog 10 条/budget/stop policy);③Query Prompts(douyin/V1 profile 全字段)。AppShell 导航加"配置"入口。dashboard walk 视图 edge 展示归属包与执行包(executed=false 标"已归属未运行")。
+
+## W5 V1 bug 修复
+
+①timeline 零消费(由 W3 解决);③pipeline.ts 改用 stage_conclusions[].status;④status.ts 补 stage_*/decode/skipped 状态映射;⑤optionalRuntimeFile 吞错改为 console.warn+UI"文件加载失败";⑥rulePackLabel fallback 显示原始 id 并补四个 future 包中文名;⑦statusOptions 注明取值来源,列表页补展示 validation_status。(原清单中"patternSeed null 崩溃"复核为已安全,移除。)
+
+## 验收
+
+后端:uv run pytest -q(基线 299+新增);前端:tsc --noEmit + next build;手动:uvicorn + npm run dev,mock run 后核对时间线页/配置页/dashboard;红线:rg stall_flag/stalls 零命中,不触碰 product_documents/sql/runtime_files.py。