Przeglądaj źródła

docs: resolve 3 deferred V2 decisions (corpus / shim / decode)

Folded the discussed-then-decided answers into the V2 plan:
- M-test corpus chicken-egg -> SYNTHETIC cases for 入池/待复看 (real baseline
  for id=45 全REJECT); no wait on M2, no remote export dependency. Real cases
  replace synthetic opportunistically post-M2.
- M2 dispatch shim -> KEEP top-level Content compat shim BUT add a non-Content
  反证 test forcing an Author dispatch through per-entity routing to prove the
  mechanism is real (guards against false-positive "decoupling done").
- M5 decode 20-min serial -> add MINIMAL 补跑/不阻塞 (single-item timeout ->
  pending, background poll resume); full batch/parallel stays V3. Aligned
  appendix A.2, section 12, and section 11 acceptance accordingly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sam Lee 1 miesiąc temu
rodzic
commit
8412075490

+ 12 - 7
tech_documents/工程落地/06_V2阶段开发计划.md

@@ -85,10 +85,11 @@ V2 主题开发融合为 6 个解耦业务模块(M0–M5)。每个模块独
 - 脱敏沿用并**扩展** `FORBIDDEN_RAW_PAYLOAD_KEYS`(补 `sec_uid` / `account_id` 等),对**文件语料库同样强制**(补 DB 后端不覆盖的缺口)。
 - snapshot 存 `tests/fixtures/cases/{case_id}/expected/`,按记录类型分文件(rule_decisions / walk_actions / final_output 摘要),断言**关键字段子集**而非整文件 byte(避免易碎)。
 - 脱敏后的语料库与 snapshot **入库**(安全);`runtime/v1/` 仍 git-ignore。
+- **语料库多样性来源(已拍板,解「鸡生蛋」)**:基线用真实(`id=45 全 REJECT`);「入池」「待复看」两种结局用**手工合成案例**(构造带完整画像的内容)立刻凑齐三种结局,**不等 M2、不依赖远端导出**。M2 修好后真实「待复看」自然产生,可逐步用真实案例替换对应合成案例。
 
 开工前必须拍板:
 
-- 首批语料库案例数与多样性。建议至少 3 个结局:全 REJECT(id=45 现状基线)、含 ADD 入池、含 KEEP 待复看。需业务 / 远端协助导出 2 个非全 REJECT 真实 run
+- 无(语料库多样性来源已拍板:基线真实 + 入池/待复看合成,见「已拍板」)
 
 可先按当前默认值推进:
 
@@ -346,11 +347,12 @@ V2 主题开发融合为 6 个解耦业务模块(M0–M5)。每个模块独
 - scorecard `scoring_rules` / `thresholds` 经 M0 由 Excel 维护标定;机制不动,数值业务填。
 - `evaluator` 区分「单维度缺失」与「全 scorecard 缺失」(当前 `not matched_scoring_rules` 触发 missing_score 太激进)。
 - 不做多包决策合并(V3);future 包仍 `dispatch_enabled=false`。
+- **解耦真伪防假成功(已拍板)**:顶层 dispatch 保留指向 Content 的兼容 shim(避免大改 `evaluator` / `run_service` / 测试),但**加一条非 Content 反证测试**——测试内临时启用一个非 Content(如 Author)dispatch,强制其走按 entity 分流并选到 Author 包,证明分流机制真生效、未回落 Content。
 
 开工前必须拍板(开发到 M2 时定):
 
 - 画像 `missing` 与 `weak` 是否区别对待。建议:`missing`→待复看;`weak`→进 scorecard 按分;最终阈值由业务在 Excel 定。注意:现 `age_50_plus_weak` 把 `["weak","missing"]` 合成一条 gate(`douyin_rule_packs.v1.json`),要分裂行为须拆 gate 或在 `evaluator` 加 field-value 分支。
-- **dispatch「每 entity 最多 1 个」护栏的落点**:`policy_json.py:80-93` 现按 `target_entity=="Content"` 硬编码 + `len(matches)!=1` raise。参数化后该护栏放在 `_select_dispatch()` / `load_policy_bundle()` / `evaluator` 哪一层、以及多 entity 同时 enabled 时的报错口径,须在开发到该步时定。(注:顶层 dispatch 兼容 shim 是否掩盖解耦真伪,另列待业务讨论,不在本条。)
+- **dispatch「每 entity 最多 1 个」护栏的落点**:`policy_json.py:80-93` 现按 `target_entity=="Content"` 硬编码 + `len(matches)!=1` raise。参数化后该护栏放在 `_select_dispatch()` / `load_policy_bundle()` / `evaluator` 哪一层、以及多 entity 同时 enabled 时的报错口径,须在开发到该步时定。(顶层 dispatch 兼容 shim 掩盖解耦真伪的风险已拍板:**保留 shim + 加一条非 Content 反证测试**,见「已拍板」与「测试用例」。)
 
 可先按当前默认值推进:
 
@@ -406,6 +408,7 @@ V2 主题开发融合为 6 个解耦业务模块(M0–M5)。每个模块独
 - 画像缺失 → `KEEP_CONTENT_FOR_REVIEW`。
 - 画像齐全 → 正常进 scorecard 评分。
 - 全 scorecard 缺失 → `missing_score`;单维度缺失不误判为全缺失。
+- **解耦反证**:临时启用一个非 Content(如 Author)dispatch,强制其走按 entity 分流并选到 Author 包,断言未回落 Content(防兼容 shim 假成功)。
 
 ---
 
@@ -602,6 +605,7 @@ V2 主题开发融合为 6 个解耦业务模块(M0–M5)。每个模块独
 - 增强 `content_agent_run_events`,**不新增 DB 表 / runtime 文件**。
 - 事件加 `stage` / `started_at` / `ended_at` / `duration_ms` / `attempt` / `stall_flag` / `stall_reason`(细粒度进 `raw_payload`)。
 - decode 经 `event_sink` 回调发 `decode_submitted` / `polling(attempt,elapsed)` / `succeeded` / `timeout` 中间事件。
+- decode 加**最小「补跑 / 不阻塞」(已拍板)**:单条超时落 `pending` 不阻塞整条 run,后台轮询补回扣;**不做完整批量 / 并发提交(留 V3)**。让真实 run 不被「最坏 6×20 分钟」串行墙卡死,接近日常可用。
 - `.env.example` 加短等待档(60–120s),默认仍 1200。
 - timeline 聚合 `total_duration_ms` / `stalls[]` 供前端甘特消费。
 - 卡点检测:decode 超时、limiter 命中、query 高失败率打 `stall_flag`(只标记,不推送告警)。
@@ -619,7 +623,7 @@ V2 主题开发融合为 6 个解耦业务模块(M0–M5)。每个模块独
 
 - 前端时间线 / 甘特组件。
 - 独立 `step_logs` DB 表(V3 选项)。
-- decode 批量 / 并发。
+- decode 完整批量 / 并发提交(V2 只做最小补跑 / 不阻塞,完整批量并发留 V3)
 - 卡点自动告警推送(只在 timeline 标记)。
 
 涉及文件:
@@ -644,7 +648,7 @@ V2 主题开发融合为 6 个解耦业务模块(M0–M5)。每个模块独
 
 1. `graph` 节点计时装饰器,产出每节点 `duration_ms` / `stage`。
 2. `recorder` 事件加 duration / stage / stall 字段(进 `raw_payload`)。
-3. `decode` 加 `event_sink` 中间事件 + 短等待档注释。
+3. `decode` 加 `event_sink` 中间事件 + 短等待档注释 + **最小补跑**(单条超时落 `pending`、后台轮询续跑、不阻塞整条 run)
 4. `errors` 加 `PLATFORM_RATE_LIMITED`(与 M4 协同)。
 5. `timeline` 聚合 `duration` / `stalls` / `total_duration_ms`。
 6. 卡点标记(decode 慢 / 限流 / 高失败率)。
@@ -669,6 +673,7 @@ V2 主题开发融合为 6 个解耦业务模块(M0–M5)。每个模块独
 
 - 节点事件含 `duration_ms` / `stage`。
 - decode 中间事件(submitted / polling / succeeded / timeout)落盘。
+- decode 单条超时落 `pending`、后台补回扣,不阻塞整条 run(最小补跑)。
 - timeline 含 `stalls[]` / `total_duration_ms`。
 - 不新增 DB 表 / runtime 文件,registry validator 通过。
 
@@ -680,7 +685,7 @@ V2 主题开发融合为 6 个解耦业务模块(M0–M5)。每个模块独
 
 - **全量回归**:`uv run pytest -q`:188 基线全绿 + 各模块随 PR 落地的新测试(M3 触发用例;M2 / M3 `rule_pack_id` 写回非 NULL 且按边正确、画像缺失走 review;M1 默认零回归;M4 blogger / v2 parser;M5 duration / decode 中间事件;M-test 回放 + snapshot)。
 - **CI 闸全过**:`validate_walk_strategy_config`、`validate_schema_registry`、`validate_content_agent_db`、`check_naming_standards` + 新 `validate_rule_pack_config` / `validate_config_excel_sync` / `validate_query_prompts_config` + `build_config_from_excel.py --check`。
-- **多案例语料库回放(M-test 语料库,离线、无外网)**:至少 3 个结局各一例——全 REJECT(id=45 现状基线)、含 ADD 入池、含 KEEP 待复看——重放并以 snapshot 校验关键产物(`decision_action_counts`、`walk_actions.rule_pack_id` 按边、画像缺失分流、timeline `duration_ms`)。
+- **多案例语料库回放(M-test 语料库,离线、无外网)**:至少 3 个结局各一例——全 REJECT(id=45 真实基线)、含 ADD 入池、含 KEEP 待复看(入池 / 待复看初期用**合成案例**,真实案例机会性替换)——重放并以 snapshot 校验关键产物(`decision_action_counts`、`walk_actions.rule_pack_id` 按边、画像缺失分流、timeline `duration_ms`)。
 - **config × case 矩阵**:同一案例过不同配置(默认包 / 放宽画像门槛 / 自定义 query profile / future 包归属),验证解耦——改配置只改产物、不崩链路、snapshot diff 可读。
 - **live smoke(真连一次,探上游漂移)**:`demand_content.id=45`、`seed_terms=["中医养生"]`、短等待 `MAX_WAIT=60` 真连 Crawapi / decode / 分类树跑一次,专抓「回放语料库照过、生产却炸」的接口契约漂移(抖音风控、分类树 v2 结构变更);**非每次 CI,收尾 + 定期手触**。验收点:初始 2 query 不错翻页、rejected 不扩边、`walk_actions.rule_pack_id` 非 NULL 按边正确、画像缺失 → 待复看不再全 REJECT、timeline 有 duration + 卡点、DB 不残留 `running`。
 - **诚实限制**:多样真实案例无法全提前——真连接口慢 / 不稳 / 需凭证,只能随真实联调机会性收割,收尾凑够 3–5 条做对照(已记于 M-test「可先按当前默认值推进」)。
@@ -690,7 +695,7 @@ V2 主题开发融合为 6 个解耦业务模块(M0–M5)。每个模块独
 1. 档 4:数据源 / 平台宽度扩展(Case、历史搜索、热点、小红书等)。
 2. 多包自由叠加 / 同实体多包并行决策合并(V2 保 `_find_rule_pack_by_dispatch` 单包护栏)。
 3. future 包(Author / Hashtag / Path / Budget)真跑 evaluator(V2 只写「归属」,`dispatch_enabled=false`)。
-4. AIGC decode 批量 / 并发提交。
+4. AIGC decode **完整批量 / 并发提交**(V2 只做最小补跑 / 不阻塞;完整批量并发留 V3)
 5. 前端时间线 / 甘特组件(V2 只后端 API)。
 6. 独立 `step_logs` DB 表(默认增强 run_events)。
 7. DemandAgent 合同改造。
@@ -753,7 +758,7 @@ CONTENTFIND_PATTERN_RECALL_POLL_INTERVAL_SECONDS=5
 
 结果 `pattern_recall_evidence = 4`、`recall_status_counts = {"matched": 1, "pending": 3}`。
 
-V2-M5 处理:保留短等待调测模板(60–120s);正式生产保留 20 分钟但需异步化 / 补跑;增加 decode submit / poll 中间事件逐条进度落盘;评估批量 / 并发(批量 / 并发提交本身留 V3)
+V2-M5 处理(已拍板):保留短等待调测模板(60–120s);增加 decode submit / poll 中间事件逐条进度落盘;做**最小补跑 / 不阻塞**(单条超时落 `pending`、后台续跑,不被串行墙卡死);完整批量 / 并发提交留 V3
 
 ### A.3 P6 游走触发条件与业务策略不一致(→ V2-M3)