|
@@ -11,13 +11,13 @@
|
|
|
|
|
|
|
|
| 问题 | 真实证据 | 对策 |
|
|
| 问题 | 真实证据 | 对策 |
|
|
|
|---|---|---|
|
|
|---|---|---|
|
|
|
-| 只有抖音一本规则包,程序写死只翻抖音 | `policy_json.py:17`(路径写死)、`:95`(默认 platform=douyin)、`:121/154`(字面量 ==douyin) | 规则包按平台选(M2) |
|
|
|
|
|
-| 打分配比焊死且 3 处副本 | `evaluator.py:226/239/242`、`run_record/validation.py:969/971/973`、`flow_ledger_service.py:1500/1506` | 搬进每平台手册,三处联动(M2) |
|
|
|
|
|
|
|
+| 多平台规则包机制已通,但只接了抖音 dispatch | `policy_json.py:16/28/122-131/154-173` 已按 platform 派发;`douyin_rule_packs.v1.json:21-35` 仍只有 `platform=douyin` | M3 补快手/视频号 dispatch |
|
|
|
|
|
+| 打分权重已搬手册,但运营治理还没进 Excel 大矩阵 | `evaluator.py:274-308` 读 `score_weight_profiles`;`douyin_rule_packs.v1.json:348-362` 已有三套运行权重 | M4 把规则/权重/平台能力纳入 Excel 全平台矩阵 |
|
|
|
| 评分维度被离线校验锁死恰两维 | `validate_rule_pack_config.py:99`、`validate_v4_config_contract.py:470` | 放开支持可变维度集(M1) |
|
|
| 评分维度被离线校验锁死恰两维 | `validate_rule_pack_config.py:99`、`validate_v4_config_contract.py:470` | 放开支持可变维度集(M1) |
|
|
|
| 游走只认两态,非抖快视平台一跑即崩 | `walk_graph_json.py:156` 只认 supported/blocked;bilibili/youtube/weixin/github 写 unsupported/weak、toutiao/zhihu 写 `_all` | 扩四态 + 规范化(M1) |
|
|
| 游走只认两态,非抖快视平台一跑即崩 | `walk_graph_json.py:156` 只认 supported/blocked;bilibili/youtube/weixin/github 写 unsupported/weak、toutiao/zhihu 写 `_all` | 扩四态 + 规范化(M1) |
|
|
|
| 边目录绑死抖音 | `walk_strategy_json.py:87` 硬断言 strategy_id=douyin_walk_strategy_v1;`walk_graph_json.py:19` EDGE_CATALOG_PATH 抖音文件 | 解耦成平台无关总章程(M1) |
|
|
| 边目录绑死抖音 | `walk_strategy_json.py:87` 硬断言 strategy_id=douyin_walk_strategy_v1;`walk_graph_json.py:19` EDGE_CATALOG_PATH 抖音文件 | 解耦成平台无关总章程(M1) |
|
|
|
-| 小红书/公众号无 client | `content_agent/integrations/` 仅 douyin/kuaishou/shipinhao | 新建 client(M3) |
|
|
|
|
|
-| 学习算法要调权重,但权重焊代码、改要发版 | 同打分配比焊死 | 把权重/门槛搬进可写配置铺路(M2/M4) |
|
|
|
|
|
|
|
+| V5 运行平台需收口 | `run_service.py:568-577` real 模式只注册 douyin/kuaishou/shipinhao;国内库当前仅抖音/快手历史 run,`discovered_content_items` 均为 video | M3 只补三短视频平台规则与游走,不接图文/图片模态 |
|
|
|
|
|
+| 学习算法要调权重,但运营入口与回流闭环未完成 | 权重已配置化,但还未进入 Excel 全平台矩阵;`performance_feedback` 仍无写入器 | M4 做 Excel 治理与 fake 回流 join |
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
@@ -25,21 +25,21 @@
|
|
|
|
|
|
|
|
| 子系统 | V5 要做 | V5 不做 |
|
|
| 子系统 | V5 要做 | V5 不做 |
|
|
|
|---|---|---|
|
|
|---|---|---|
|
|
|
-| 打分顶层公式 | 维度集+权重搬进每平台手册;evaluator 只读不算 | 不改非抖音 0.5/0.5 行为(快照零变化);不改 AI 出契合分 |
|
|
|
|
|
|
|
+| 打分顶层公式 | 维度集+权重搬进每平台手册;evaluator 只读不算 | 不改非抖音 0.5/0.5 行为(金标准门零变化);不改 AI 出契合分 |
|
|
|
| 评分卡 schema | 固定两维→按平台激活可变特征集 | 不做配置 DSL(不在配置写控制流) |
|
|
| 评分卡 schema | 固定两维→按平台激活可变特征集 | 不做配置 DSL(不在配置写控制流) |
|
|
|
| 规则包加载 | `load_policy_bundle` 加 platform、按平台选包 | 不强制每平台立刻拆包(抖音先维持) |
|
|
| 规则包加载 | `load_policy_bundle` 加 platform、按平台选包 | 不强制每平台立刻拆包(抖音先维持) |
|
|
|
| 游走边目录/四态 | 边目录解耦成总章程;校验扩四态 | 不打墙③(引擎即插即用大重构) |
|
|
| 游走边目录/四态 | 边目录解耦成总章程;校验扩四态 | 不打墙③(引擎即插即用大重构) |
|
|
|
| 游走预算 | walk_policy 从全局改 default+平台段 | 不改抖音/视频号现有游走行为 |
|
|
| 游走预算 | walk_policy 从全局改 default+平台段 | 不改抖音/视频号现有游走行为 |
|
|
|
-| 平台接入 | 公众号/小红书建 client;快手/视频号补齐手册 | 不接头条/知乎(平台侧坏) |
|
|
|
|
|
-| 作者作品 | 打通快手/小红书(client 加方法+profile 改 supported) | 视频号上游 blocked,保持空返回 |
|
|
|
|
|
|
|
+| 平台接入 | 收口 douyin/kuaishou/shipinhao 三短视频平台;补快手/视频号规则包 dispatch | 不接公众号/小红书/头条/知乎;不做图文/图片/文字存储路线 |
|
|
|
|
|
+| 作者作品 | M3 打通快手 `author_to_works`(client 加方法+profile 改 supported) | 视频号上游 blocked,保持空返回 |
|
|
|
| 门槛 | 维持按平台分段 | 不做"平台×品类"细分 |
|
|
| 门槛 | 维持按平台分段 | 不做"平台×品类"细分 |
|
|
|
| 学习算法 | 只铺路:权重门槛搬可写配置 + 回流 fake 验 join + 人审流程约定 | 本体留下期;不接真实回流源;不自动反写上线 |
|
|
| 学习算法 | 只铺路:权重门槛搬可写配置 + 回流 fake 验 join + 人审流程约定 | 本体留下期;不接真实回流源;不自动反写上线 |
|
|
|
-| 数据库 | 零改动(已真连库核对) | 不动表结构(仅 performance_feedback 按需补列) |
|
|
|
|
|
|
|
+| 数据库 | 零改动(已真连库核对) | 不动表结构;不新增图文/图片/文字 asset 表 |
|
|
|
|
|
|
|
|
### V4 复用边界
|
|
### V4 复用边界
|
|
|
|
|
|
|
|
一句话:V5 **复用 V4 的工程容器,不复用"抖音专属、焊死"那部分**。
|
|
一句话:V5 **复用 V4 的工程容器,不复用"抖音专属、焊死"那部分**。
|
|
|
-- 复用:graph/runtime/evaluator 框架、`rule_decisions.scorecard` JSON 列、`tests/replay_harness.py`、`score_thresholds.json` 按平台分段样板、`platform_profiles/*.json` 一平台一文件范式。
|
|
|
|
|
|
|
+- 复用:graph/runtime/evaluator 框架、`rule_decisions.scorecard` JSON 列、两条金标准 corpus、`score_thresholds.json` 按平台分段样板、`platform_profiles/*.json` 一平台一文件范式。
|
|
|
- 不继承:抖音专属规则包路径写死、打分权重焊死、游走边目录绑死抖音、四态炸弹。
|
|
- 不继承:抖音专属规则包路径写死、打分权重焊死、游走边目录绑死抖音、四态炸弹。
|
|
|
|
|
|
|
|
---
|
|
---
|
|
@@ -48,11 +48,11 @@
|
|
|
|
|
|
|
|
| M | 名称 | 主要目标 | 依赖 |
|
|
| M | 名称 | 主要目标 | 依赖 |
|
|
|
|---|---|---|---|
|
|
|---|---|---|---|
|
|
|
-| M0 | 安全网与零变化基准 | 在 v5 分支做;建金标准 case(已拉 v4_douyin_57663)+ 复用 replay_harness | 现状代码 + corpus |
|
|
|
|
|
|
|
+| M0 | 安全网与零变化基准 | 在 v5 分支做;用金标准 case 已存历史分项复刻 evaluator 判定 | 现状代码 + corpus |
|
|
|
| M1 | 打地基 | 修四态炸弹 + 边目录解耦成总章程 + 放开评分两维限制 | M0 基准 |
|
|
| M1 | 打地基 | 修四态炸弹 + 边目录解耦成总章程 + 放开评分两维限制 | M0 基准 |
|
|
|
| M2 | 通机制 | 激活按平台选规则包 + 打分公式搬手册(3处联动)+ 抖音迁标准手册零变化 | M1 |
|
|
| M2 | 通机制 | 激活按平台选规则包 + 打分公式搬手册(3处联动)+ 抖音迁标准手册零变化 | M1 |
|
|
|
-| M3 | 填平台手册 | 公众号/小红书建 client+手册;快手/视频号补齐;打通快手/小红书作者作品 | M2 |
|
|
|
|
|
-| M4 | 收尾 | 清死配置 + Excel 每平台重组 + 学习算法铺入口 + 回流 fake 验 join | M1-M3 |
|
|
|
|
|
|
|
+| M3 | 三短视频平台规则与游走补齐 | 补快手/视频号 dispatch;打通快手 author_to_works;视频号保持 blocked | M2 |
|
|
|
|
|
+| M4 | 收尾 | 清死配置 + Excel 全平台大矩阵 + 学习算法铺入口 + 回流 fake 验 join | M1-M3 |
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
@@ -61,8 +61,8 @@
|
|
|
| 原则 | 说明 |
|
|
| 原则 | 说明 |
|
|
|
|---|---|
|
|
|---|---|
|
|
|
| 先合同后代码 | 先定评分卡新 schema、手册字段、平台代号口径,再改逻辑 |
|
|
| 先合同后代码 | 先定评分卡新 schema、手册字段、平台代号口径,再改逻辑 |
|
|
|
-| 等价迁移优先 | M2 先原样搬(数值不改),金标准快照逐条复现=零变化,再谈加平台 |
|
|
|
|
|
-| 改行为先贴 diff | 行为中性的批快照零重钉;改行为的批(如快手作者作品)先贴 diff 给用户 |
|
|
|
|
|
|
|
+| 等价迁移优先 | M2 先原样搬(数值不改),金标准 evaluator 门逐条复刻=零变化,再谈加平台 |
|
|
|
|
|
+| 改行为先贴 diff | 行为中性的批必须保持金标准门通过;改行为的批(如快手作者作品)先贴 diff 给用户 |
|
|
|
| 平台差异显式声明 | 不靠 `if platform==douyin`;靠手册声明"有无该维度/线索" |
|
|
| 平台差异显式声明 | 不靠 `if platform==douyin`;靠手册声明"有无该维度/线索" |
|
|
|
| 删除先归档 | 删配置先 grep 确认无引用;删数据走归档脚本可回灌 |
|
|
| 删除先归档 | 删配置先 grep 确认无引用;删数据走归档脚本可回灌 |
|
|
|
| 不打墙③/不上学习本体 | V5 不做游走引擎即插即用、不做学习算法本体,只铺路 |
|
|
| 不打墙③/不上学习本体 | V5 不做游走引擎即插即用、不做学习算法本体,只铺路 |
|
|
@@ -76,19 +76,20 @@
|
|
|
**当前真实状态**:
|
|
**当前真实状态**:
|
|
|
- 已在 `v5` 分支(本地+`origin/v5`);`main`/`V4-已完成-已上线`=纯 V4(43d28d69)。
|
|
- 已在 `v5` 分支(本地+`origin/v5`);`main`/`V4-已完成-已上线`=纯 V4(43d28d69)。
|
|
|
- 金标准 case 已拉**两条**(均已脱敏、在 `tests/fixtures/cases/`):抖音 `v4_douyin_57663`(110 条决策四分支全,scorecard **三维**含 50+)+ 快手 `v4_kuaishou_57758`(51 条决策四分支全,scorecard **两维**无 50+);分别覆盖"三维/两维"两条打分路径。
|
|
- 金标准 case 已拉**两条**(均已脱敏、在 `tests/fixtures/cases/`):抖音 `v4_douyin_57663`(110 条决策四分支全,scorecard **三维**含 50+)+ 快手 `v4_kuaishou_57758`(51 条决策四分支全,scorecard **两维**无 50+);分别覆盖"三维/两维"两条打分路径。
|
|
|
-- 复用机制已存在:`tests/replay_harness.py`(`replay_case()` L63-104、`load_corpus()` L44-50、`CorpusPlatformClient`)、`tests/fixtures/snapshots/`(6 个决策摘要/指纹快照)。
|
|
|
|
|
|
|
+- 复刻机制已验证:从两条 `rule_decisions.jsonl` 的历史 `scorecard`/decision 字段重建 evaluator 最小 bundle,加载 `JsonPolicyBundleStore.load_policy_bundle("V4")`,直接调用 `evaluator.decide()` 可逐条复刻历史 decision;只读干跑抖音 110/110、快手 51/51 均 0 mismatch。
|
|
|
|
|
+- DB/JSON/Excel 三方证据已核对:国内库 `content_agent_rule_decisions` 与 fixture 关键字段 0 mismatch;`score_thresholds.json` 经 `policy_json.py` 注入 evaluator 是实际门槛来源;Excel 不参与 M0 复刻。
|
|
|
|
|
|
|
|
-**已拍板**:金标准用 V4 真实 case;只在打分逻辑层比对、不端到端重跑;V3 老快照作废、机制复用数据重建;**① 快手两维基准已配(`v4_kuaishou_57758`,2026-06-28 最新 success);② 金标准 corpus 进 git——抖音+快手各一条,已脱敏**。
|
|
|
|
|
|
|
+**已拍板**:金标准用 V4 真实 case;只在 evaluator 判定逻辑层比对、不端到端重跑;V3 老 replay 基线作废、机制用历史分项复刻数据重建;**① 快手两维基准已配(`v4_kuaishou_57758`,2026-06-28 最新 success);② 金标准 corpus 进 git——抖音+快手各一条,已脱敏**。
|
|
|
|
|
|
|
|
**🟠 待拍板**:无(本阶段待拍板均已拍)。
|
|
**🟠 待拍板**:无(本阶段待拍板均已拍)。
|
|
|
|
|
|
|
|
**本阶段不处理**:不改任何业务代码;不接学习算法。
|
|
**本阶段不处理**:不改任何业务代码;不接学习算法。
|
|
|
|
|
|
|
|
-**涉及文件**:`tests/fixtures/cases/v4_douyin_57663/`、`tests/replay_harness.py`、`tests/fixtures/snapshots/`。
|
|
|
|
|
|
|
+**涉及文件**:`tests/fixtures/cases/v4_douyin_57663/`、`tests/fixtures/cases/v4_kuaishou_57758/`、`content_agent/business_modules/rule_judgment/evaluator.py`(只调用)、`content_agent/integrations/policy_json.py`(只调用)、`tests/test_v5_golden_corpus_baseline.py`(新增)。
|
|
|
|
|
|
|
|
-**开发顺序**:① 用两条 corpus + replay_harness 跑出抖音/快手基线快照并钉死;② 把"快照逐条比对"接成 M1-M3 每批的回归门。
|
|
|
|
|
|
|
+**开发顺序**:① 从两条 corpus 的历史 decision/scorecard 重建 evaluator 最小 bundle;② 直接调用 `evaluator.decide()` 逐条复刻历史 action/reason/score/scorecard/allow_walk;③ 把"历史 decision 逐条复刻"接成 M1-M4 每批的回归门。
|
|
|
|
|
|
|
|
-**验证**:`uv run pytest tests/ -k replay`;基线快照可重放、逐条稳定。
|
|
|
|
|
|
|
+**验证**:`uv run pytest tests/test_v5_golden_corpus_baseline.py -q`;抖音 110 条、快手 51 条历史 decision 逐条稳定复刻。
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
@@ -101,11 +102,9 @@
|
|
|
- 边目录:`walk_strategy_json.py:87` 硬断言 `strategy_id=="douyin_walk_strategy_v1"`;`walk_graph_json.py:19` `EDGE_CATALOG_PATH` 指抖音文件。
|
|
- 边目录:`walk_strategy_json.py:87` 硬断言 `strategy_id=="douyin_walk_strategy_v1"`;`walk_graph_json.py:19` `EDGE_CATALOG_PATH` 指抖音文件。
|
|
|
- 两维锁死:`validate_rule_pack_config.py:99`、`validate_v4_config_contract.py:470` 写死 `keys==["query_relevance","platform_performance"]`。
|
|
- 两维锁死:`validate_rule_pack_config.py:99`、`validate_v4_config_contract.py:470` 写死 `keys==["query_relevance","platform_performance"]`。
|
|
|
|
|
|
|
|
-**已拍板**:四态=能走/屏蔽(blocked)/没接口(no_interface)/将来做(planned);边目录解耦成平台无关全集;数据库零改动。
|
|
|
|
|
|
|
+**已拍板**:四态命名固定为 `supported`(能走)/`blocked`(屏蔽)/`no_interface`(没接口)/`planned`(将来做);`edge_supported` 语义固定为只有 `supported` 才走,其余三态都跳过并保留状态原因;toutiao/zhihu 的 `_all` 简写不保留,改成逐边显式声明;边目录解耦成平台无关全集;数据库零改动。
|
|
|
|
|
|
|
|
-**🟠 待拍板**:① 四态的具体命名(no_interface/planned 还是别的词);② `edge_supported` 对 no_interface/planned 的语义(都按"不走"处理?);③ toutiao/zhihu 的 `_all` 简写是改成逐边声明还是保留并在校验器特判。
|
|
|
|
|
-
|
|
|
|
|
-**可先按当前默认值推进**:四态语义=只有 supported 才走,其余三态都跳过留痕(与现状兼容)。
|
|
|
|
|
|
|
+**🟠 待拍板**:无(本阶段待拍板均已拍)。
|
|
|
|
|
|
|
|
**本阶段不处理**:不动 evaluator 打分逻辑;不接新平台 client;不改抖快视行为。
|
|
**本阶段不处理**:不动 evaluator 打分逻辑;不接新平台 client;不改抖快视行为。
|
|
|
|
|
|
|
@@ -113,11 +112,11 @@
|
|
|
|
|
|
|
|
**字段合同**:profile `edges.<edge>.status` 取值域 supported|blocked|no_interface|planned;边目录全集新增"平台无关"标识,去 douyin strategy_id 硬绑(放宽成 `*_walk_strategy_v1` 或独立 catalog)。
|
|
**字段合同**:profile `edges.<edge>.status` 取值域 supported|blocked|no_interface|planned;边目录全集新增"平台无关"标识,去 douyin strategy_id 硬绑(放宽成 `*_walk_strategy_v1` 或独立 catalog)。
|
|
|
|
|
|
|
|
-**开发顺序**:① 校验器状态白名单 2→4 + 处理 `_all`;② 规范化 7 个 profile 的非法值;③ 放宽 strategy_id 断言/解耦 EDGE_CATALOG_PATH;④ 放开两维校验脚本;⑤ 跑金标准快照零变化 + 全测试绿。
|
|
|
|
|
|
|
+**开发顺序**:① 校验器状态白名单 2→4 + 将 `_all` 展开为逐边显式声明;② 规范化 7 个 profile 的非法值;③ 放宽 strategy_id 断言/解耦 EDGE_CATALOG_PATH;④ 放开两维校验脚本;⑤ 跑金标准 evaluator 门零变化 + 全测试绿。
|
|
|
|
|
|
|
|
-**验证**:`uv run pytest`;`load_profile("bilibili")` 不再崩;抖音金标准快照逐条零变化。
|
|
|
|
|
|
|
+**验证**:`uv run pytest`;`load_profile("bilibili")` 不再崩;金标准 evaluator 门逐条零变化。
|
|
|
|
|
|
|
|
-**失败归因**:profile 校验仍崩→白名单/`_all` 没覆盖;抖音快照变了→误碰了打分(本阶段不该碰)。
|
|
|
|
|
|
|
+**失败归因**:profile 校验仍崩→白名单/`_all` 没覆盖;金标准 evaluator 门失败→误碰了打分/门槛/判定(本阶段不该碰)。
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
@@ -126,9 +125,10 @@
|
|
|
**目标**:激活"按平台选规则包"内建开关;打分配比从代码搬进手册;抖音先迁成第一本标准手册且**行为零变化**。
|
|
**目标**:激活"按平台选规则包"内建开关;打分配比从代码搬进手册;抖音先迁成第一本标准手册且**行为零变化**。
|
|
|
|
|
|
|
|
**当前真实状态**:
|
|
**当前真实状态**:
|
|
|
-- 规则包写死:`policy_json.py:17`(路径)、`:95`(默认 douyin)、`:121/154`(字面量)。多平台派发机制已内建:`_select_dispatch`/`_enabled_dispatches`(`policy_json.py:88-126`),规则包 `rule_pack_dispatch` 段已带 platform 字段但仅 1 条 enabled。
|
|
|
|
|
-- 打分配比焊死 3 处:`evaluator.py:226`(非抖音 0.5/0.5)、`:239`(抖音 0.35/0.35/0.30)、`:242`(抖音不完整 35/35);`validation.py:969/971/973`(跑验反算副本);`flow_ledger_service.py:1500/1506`(前端展示副本)。
|
|
|
|
|
-- 门槛已配置化样板:`score_thresholds.json`(default+douyin 段),`evaluator.py:292-300` `_v4_thresholds` 合并。
|
|
|
|
|
|
|
+- M2 机制已落地:`policy_json.py:16` `load_policy_bundle(strategy_version, platform="douyin")`;`:28/122-131/154-173` 按 platform 选 dispatch 并构建 `rule_pack_by_entity`。
|
|
|
|
|
+- 规则包内容仍只有抖音一本:`douyin_rule_packs.v1.json:21-35` `rule_pack_dispatch` 只有 `platform=douyin`;这正是 M3 需要补快手/视频号 dispatch 的入口。
|
|
|
|
|
+- 打分配比已搬到手册:`evaluator.py:274-308` 从 `score_weight_profiles` 读取权重;`douyin_rule_packs.v1.json:348-362` 定义 default two-dimension、douyin 50+ ok、douyin 50+ not_attempted 三套 profile。
|
|
|
|
|
+- 门槛已配置化样板:`score_thresholds.json`(default+douyin 段),`evaluator.py:341-349` `_v4_thresholds` 合并。
|
|
|
|
|
|
|
|
**已拍板**:抖音 35/35/30、非抖音 0.5/0.5 原样搬配置(数值不改);抖音迁移行为零变化作基线;3 处副本联动改。
|
|
**已拍板**:抖音 35/35/30、非抖音 0.5/0.5 原样搬配置(数值不改);抖音迁移行为零变化作基线;3 处副本联动改。
|
|
|
|
|
|
|
@@ -140,69 +140,158 @@
|
|
|
|
|
|
|
|
**字段合同**:规则包 scorecard 段新增每维 `weight`/`active`/`platform_scope`;`load_policy_bundle(strategy_version, platform)` 加参;dispatch 按 platform 选。
|
|
**字段合同**:规则包 scorecard 段新增每维 `weight`/`active`/`platform_scope`;`load_policy_bundle(strategy_version, platform)` 加参;dispatch 按 platform 选。
|
|
|
|
|
|
|
|
-**开发顺序**:① `load_policy_bundle` 加 platform、路径按平台解析(缺则回退默认);② dispatch 去 douyin 字面量;③ 抖音规则包补 weight/active 字段;④ `_v4_scorecard_total` 改"读维度列表按权重合成";⑤ 同步改 validation/flow_ledger 两副本;⑥ 跑抖音金标准快照**逐条零变化**(核心验收)。
|
|
|
|
|
|
|
+**开发顺序**:① `load_policy_bundle` 加 platform、路径按平台解析(缺则回退默认);② dispatch 去 douyin 字面量;③ 抖音规则包补 weight/active 字段;④ `_v4_scorecard_total` 改"读维度列表按权重合成";⑤ 同步改 validation/flow_ledger 两副本;⑥ 跑金标准 evaluator 门**逐条零变化**(核心验收)。
|
|
|
|
|
|
|
|
**达到效果**:能按平台选规则包;抖音决策与 V4 分毫不差;改权重只改手册不改引擎。
|
|
**达到效果**:能按平台选规则包;抖音决策与 V4 分毫不差;改权重只改手册不改引擎。
|
|
|
|
|
|
|
|
-**验证**:`uv run pytest`;抖音金标准 110 条决策 scorecard/decision 逐条复现;`grep "0.35\|0.30\|platform==" evaluator.py` 打分主路径清零。
|
|
|
|
|
|
|
+**验证**:`uv run pytest`;金标准 evaluator 门 161 条历史 decision 逐条复刻;`grep "0.35\|0.30\|platform==" evaluator.py` 打分主路径清零。
|
|
|
|
|
|
|
|
**失败归因**:抖音分数变了→搬配置时数值/分流写错;跑验失败→validation 副本没同步。
|
|
**失败归因**:抖音分数变了→搬配置时数值/分流写错;跑验失败→validation 副本没同步。
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-## 8. M3 填平台手册(公众号/小红书优先 + 快手/视频号补齐 + 作者作品打通)
|
|
|
|
|
|
|
+## 8. M3 三短视频平台规则与游走补齐
|
|
|
|
|
|
|
|
-**目标**:多平台真正铺开。新建公众号/小红书 client+手册;快手/视频号补齐手册;打通快手/小红书作者作品。
|
|
|
|
|
|
|
+**目标**:把 V5 运行范围收口到抖音、快手、视频号三短视频平台。补齐快手/视频号规则包 dispatch,并把快手 `author_to_works` 正式打开;不接公众号/小红书,不做图文/图片/文字资产路线,不改 DB。
|
|
|
|
|
|
|
|
**当前真实状态**:
|
|
**当前真实状态**:
|
|
|
-- client 仅 3 个:`douyin.py:143`/`kuaishou.py:121`/`shipinhao.py:127`;小红书/公众号无 client。平台工厂 `run_service.py:572-576` `real_clients` dict 三平台。
|
|
|
|
|
-- 7 个 profile 缺 `observable_performance`(打分参数):bilibili/github/toutiao/weixin/xiaohongshu/youtube/zhihu。
|
|
|
|
|
-- 作者作品:`kuaishou.py` 无 `fetch_author_works`;`shipinhao.py:340-342` 硬返回 `[]`;抖音 `fetch_author_works`(`douyin.py:143`)是模板。实测(2026-06-26)快手/小红书 blogger 上游可用(各 20 条)。
|
|
|
|
|
-- 引擎侧 author_to_works 边 + `_expand_authors` 已就绪,加 client 方法+profile 改 supported 即可,引擎零改。
|
|
|
|
|
|
|
+- 三短视频 client 已是运行边界:`run_service.py:568-577` real 模式只注册 `douyin/kuaishou/shipinhao`;国内 DB 当前只有抖音 14 run、快手 13 run、视频号 0 run,`discovered_content_items`/`content_media_records` 均为 video。
|
|
|
|
|
+- 三平台视频字段已存在:抖音 raw `video.play_addr`/detail `video_url_list`,快手 `video_url_list`,视频号 `video_url_list`;本阶段不新增图片/文字媒体链路。
|
|
|
|
|
+- M2 机制已具备:`JsonPolicyBundleStore.load_policy_bundle(strategy_version, platform)` 已按 platform 选 dispatch;但 `douyin_rule_packs.v1.json` 当前 `rule_pack_dispatch` 仍只有 `platform=douyin`,所以快手/视频号会缺规则包 dispatch。
|
|
|
|
|
+- 快手作者作品是"上游已证实、代码未打开":`walk_engine.py:437-506` 已在 profile gate 通过后调用 `fetch_author_works`;`kuaishou.py` 目前有 search/detail/account_info,但无 `fetch_author_works`;`tests/test_kuaishou_client.py` 仍断言没有 author works client。
|
|
|
|
|
+- 新证据推翻旧 registry:`product_documents/全平台游走策略.md:28-31` 记录 2026-06-26 实测 `/crawler/kuai_shou/blogger` 返回 20 条;旧 `crawler_endpoints.registry.json:344` "未抓到独立作者作品列表接口"需在 M3 实现时同步更正。
|
|
|
|
|
+- profile 当前仍阻断快手作者边:`platform_profiles/kuaishou.json:117-123` `author_to_works`/`author_work_to_content` 为 blocked;视频号 `platform_profiles/shipinhao.json:47-48` 保持 blocked;抖音 `platform_profiles/douyin.json:56-57` 已 supported。
|
|
|
|
|
|
|
|
-**已拍板**:公众号/小红书优先;打通快手/小红书作者作品;视频号作者保持空(上游 blocked);头条/知乎不接。
|
|
|
|
|
|
|
+**已拍板**:V5 runtime 只启用抖音/快手/视频号三短视频平台;快手 `author_to_works` 纳入 M3 core 现在打开;视频号作者作品保持 blocked;公众号/小红书/图文/图片/文字存储不进 V5。
|
|
|
|
|
|
|
|
-**🟠 待拍板**:① 公众号/小红书谁先做(都标优先,需排序);② 快手/小红书作者作品打通是否算"运作规则变化"需单独贴 diff 确认(方案 A 严格零变化 vs 方案 B 评分零变化+游走增强,前述已倾向 B);③ 公众号图文牵动视频判定链,判定环节怎么降级(图文无视频)。
|
|
|
|
|
|
|
+**🟠 待拍板**:无。快手 `author_to_works` 属于已确认的有意游走增强,不再拆 M3X。
|
|
|
|
|
|
|
|
-**本阶段不处理**:不接头条/知乎;不做合集/原声/地理/相似新游走(上游无接口)。
|
|
|
|
|
|
|
+**本阶段不处理**:不接公众号/小红书/头条/知乎;不做图文 Gemini 判定;不新增图片/文字下载与 OSS 存储;不改 DB schema;不改 evaluator 打分行为。
|
|
|
|
|
|
|
|
-**涉及文件**:新建 `integrations/xiaohongshu.py`/`weixin.py`(参照 kuaishou.py ~300 行);`run_service.py:572`(工厂加分支);新增/补 `platform_profiles/{xiaohongshu,weixin}.json` 的 observable_performance;`kuaishou.py`/`xiaohongshu.py` 加 `fetch_author_works`;`platform_profiles/{kuaishou,xiaohongshu}.json` author_to_works→supported;各平台规则包手册 `rule_packs/{平台}.json`。
|
|
|
|
|
|
|
+**涉及文件**:`product_documents/规则包/douyin_rule_packs.v1.json`(补 `kuaishou/shipinhao` dispatch 或等价三平台 dispatch 配置)、`content_agent/integrations/kuaishou.py`(新增 `fetch_author_works`)、`tech_documents/数据接口与来源/platform_profiles/kuaishou.json`(`author_to_works`/`author_work_to_content` 改 supported)、`tech_documents/数据接口与来源/platform_profiles/shipinhao.json`(保持 blocked)、`tests/test_policy_dispatch.py`、`tests/test_kuaishou_client.py`、`tests/test_walk_graph_config.py`、`tests/test_walk_engine_deep_frontier.py`。
|
|
|
|
|
|
|
|
-**开发顺序**:① 快手 client 加 fetch_author_works + profile 改 supported(最小、引擎零改);② 小红书建 client + fetch_author_works + profile;③ 公众号建 client(图文,接判定链);④ 补 7 平台 observable_performance JSON;⑤ 各平台写打分+游走手册;⑥ 验证三平台(抖快视)快照零变化 + 新平台跑通。
|
|
|
|
|
|
|
+**开发顺序**:① 补快手/视频号 dispatch,确保三平台都能 `load_policy_bundle("V4", platform=...)`;② `CrawapiKuaishouClient.fetch_author_works()` 接 `/crawler/kuai_shou/blogger`,复用快手 canonical normalizer,输出 video item 且标记 `previous_discovery_step=author_works`/`content_metadata_source=kuaishou_blogger`;③ 快手 profile 两条作者边改 supported,视频号维持 blocked;④ 更新旧 registry/接口文档中快手作者作品旧口径;⑤ 跑三平台 smoke 与 M0 golden gate。
|
|
|
|
|
|
|
|
-**达到效果**:公众号/小红书能跑完整流程;快手/小红书能顺着作者挖;各平台用各自手册互不影响。
|
|
|
|
|
|
|
+**达到效果**:三短视频平台都能走 M2 平台 dispatch;快手能顺着作者继续挖作品;抖音/快手 evaluator 金标准保持零变化;视频号按当前上游能力只走 search/detail 可用路径。
|
|
|
|
|
|
|
|
-**验证**:`uv run pytest`;抖快视金标准零变化;新平台 smoke(真实接口单发,间隔 15s)。
|
|
|
|
|
|
|
+**验证**:`uv run pytest tests/test_policy_dispatch.py -q`;`uv run pytest tests/test_kuaishou_client.py tests/test_douyin_client.py tests/test_shipinhao_client.py -q`;`uv run pytest tests/test_walk_graph_config.py tests/test_walk_engine_deep_frontier.py -q`;`uv run pytest tests/test_v5_golden_corpus_baseline.py -q`。快手真实 run 的 walk 行为允许因 `author_to_works` 打开而变化,但必须贴 walk action diff 说明;抖音/快手 evaluator decision 仍要求零变化。
|
|
|
|
|
|
|
|
-**失败归因**:新平台字段映射错→normalize 没按平台 raw 结构;老平台快照变→新平台手册污染了共享层。
|
|
|
|
|
|
|
+**失败归因**:快手作者作品无新增→client 请求/normalizer/profile gate 三处排查;快手决策分数变了→误碰 evaluator/threshold/rule pack 权重;视频号误走作者边→profile 没保持 blocked;Excel/config gate 失败→M3 误进 M4 范围。
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-## 9. M4 收尾(清死配置 + Excel 重组 + 学习算法铺入口 + 回流 fake)
|
|
|
|
|
|
|
+## 9. M4 收尾(清死配置 + Excel 全平台大矩阵 + 学习算法铺入口 + 回流 fake)
|
|
|
|
|
|
|
|
-**目标**:清 V3 死配置;Excel 改成每平台可维护;给学习算法把"可写入口"留好;回流用假数据验通 join 链路。
|
|
|
|
|
|
|
+**目标**:清 V3/旧平台死配置;把 Excel/JSON 配置治理重组成"全平台大矩阵";给学习算法把"可写入口"留好;回流用假数据验通 join 链路。这里的"全平台"是配置台账与未来能力位,不代表 V5 runtime 接入公众号/小红书或图文。
|
|
|
|
|
|
|
|
**当前真实状态**:
|
|
**当前真实状态**:
|
|
|
-- 死配置:`douyin_rule_packs.v1.json` scorecard.dimensions 恰两维(50/50)、scoring_rules、thresholds 为 V3 残留(V4 实走 score_thresholds.json + 硬编码权重,搬配置后这些应清)。
|
|
|
|
|
-- Excel:`规则包映射配置表.xlsx`(`build_config_from_excel.py:60-73` 8 sheet,dispatch/meta 有 platform 列)、`游走策略配置表.xlsx`(`:78-84` 4 sheet 无 platform 列)。坑:`build_config_from_excel.py:155` 新增行被静默跳过(`if obj is not None`)。
|
|
|
|
|
-- 回流:`performance_feedback` 表(`sql/content_agent_schema.sql:496-526` 完整字段)0 写入、无写入器;`database_runtime.py:301` 只读;`rule_decisions.scorecard JSON`(`:158`)已存特征。`learning_review.py` 只统计+待批建议、不反喂。
|
|
|
|
|
-- 数据库:真连库核对零改动、无 ENUM/CHECK。
|
|
|
|
|
|
|
+- 死配置需逐项证明再删:M2 后运行权重已在规则手册 `score_weight_profiles`,但 `score_thresholds.json` 仍是 evaluator 运行门槛真源(`policy_json.py:37-40` 加载,`evaluator.py` 合并 default+platform),不能当死配置误删。
|
|
|
|
|
+- Excel 是两本固定 workbook: `规则包映射配置表.xlsx` 当前 13 张 sheet;`游走策略配置表.xlsx` 当前 4 张 sheet。M4 采用现有 workbook 路线,在 sheet 内按 platform 做矩阵,不拆每平台独立 Excel。
|
|
|
|
|
+- 转换器当前不能承接结构新增:`build_config_from_excel.py:60-84` 固定 sheet spec;`:155/161` 只 overlay 已有 JSON 对象,Excel 新增行会因 `if obj is not None` 被静默跳过。当前规则包 workbook 里 `rule_package_meta/rule_pack_catalog/input_contract_fields/decision_action_catalog/字段注释` 是 no-op/台账 sheet,Excel 出现不等于 runtime 启用。
|
|
|
|
|
+- 权重 profile 仍是 M2 过渡态:`evaluator.py:267-288` 还按 `default_two_dimension/douyin_fifty_plus_ok/douyin_fifty_plus_not_attempted` 三个固定名字选权重;`validate_rule_pack_config.py:27-31/196-198` 与 `validate_v4_config_contract.py:44-48/611-613` 仍强制要求这三套旧 profile 存在。M4 要把它们降级为历史兼容别名,长期改成通用 profile 矩阵。
|
|
|
|
|
+- 门槛仍是独立运行真源:`score_thresholds.json` 当前只有 `default + douyin` 段;`policy_json.py:37` 加载后由 `evaluator.py:_v4_thresholds` 合并。M4 不能把审批字段直接塞进现有门槛 JSON 段,要先用 `score_threshold_profiles` 承接 Excel 治理,再生成运行态 JSON。
|
|
|
|
|
+- 配置门已包含 Excel byte-equal:`run_config_gate.py:21-23` 串 `build_config_from_excel.py --check` 与 `validate_config_excel_sync.py`;所以 M4 重组必须同步改 Excel、JSON、转换器和校验器。
|
|
|
|
|
+- 回流:`performance_feedback` 表(`sql/content_agent_schema.sql:496-526` 完整字段)0 写入、无写入器;`database_runtime.py:301` 只读;`rule_decisions.scorecard JSON`(`:158`)已存特征。`learning_review.py` 只统计+待批建议、不反喂;现有测试已防止 `auto_apply/rule_pack_patch/walk_strategy_patch/budget_patch` 这类自动反写。
|
|
|
|
|
+- 数据库:真连国内库 MySQL 8.0.46 只读核对,无 config/rule_pack/profile/weight/threshold 配置表;`content_agent_rule_decisions=2929`,`content_agent_walk_actions=7615`,`content_agent_performance_feedback=0`;`rule_decisions` 与 `discovered_content_items` 可用 `run_id + policy_run_id + platform_content_id` 2929/2929 对账;不改 DB schema、不改历史字段。
|
|
|
|
|
+
|
|
|
|
|
+**已拍板**:M4 继续做 Excel 重组和死配置清理;Excel 做全平台大矩阵;Excel 里出现的平台不等于 runtime 启用;平台边状态固定四态 `supported / blocked / no_interface / planned`;规则包没有匹配时不允许 fallback 到抖音;学习算法本体 V5 不做、只铺路;fake 回流只做 join 验证和策略复盘证据,不自动学习、不自动改规则;权重和门槛都进 Excel 治理,但只有 `approval_status=approved` 且 `runtime_enabled=true` 才能生成运行 JSON;审批状态固定五态 `draft / waiting_for_human_reivew / approved / rejected / deprecated`(永久接受已拍板拼写 `waiting_for_human_reivew`);审批审计字段只保留 `approval_status + last_reviewed_at + owner`;门槛矩阵采用一行一个 `threshold_key + threshold_value`;游走预算按 `platform + edge_id` 配置,先把现有 `walk_policy.json` 全局/edge 预算原样迁成 `default`,仅给快手 `author_to_works` 单独显式一行且不趁 M4 调大预算;死配置归档目录进入 git,后续是否删除由人工手动决定;权重 profile 长期按 `platform_scope + applies_when + dimension_key + weight_percent + priority` 选择,不再靠 profile 名写死平台或维度数。
|
|
|
|
|
+
|
|
|
|
|
+**🟠 待拍板**:无方向性待拍板。后续 M4 implementation brief 需把本文已拍板字段拆成施工步骤,细化每张 sheet 的迁移顺序、转换器新增行策略、validator 失败提示和归档回滚流程。
|
|
|
|
|
+
|
|
|
|
|
+**本阶段不处理**:不接真实回流源;不做跨 run 学习器;不做自动反写;不因"全平台大矩阵"启用公众号/小红书 runtime;不改 DB schema。
|
|
|
|
|
+
|
|
|
|
|
+**涉及文件**:`douyin_rule_packs.v1.json`/后续平台规则包 JSON(清死配置前先 grep+validator 证明不读)、两个 Excel + `build_config_from_excel.py`(先支持结构新增,防静默跳过)、`scripts/validate_rule_pack_config.py`/`scripts/validate_v4_config_contract.py`/`scripts/run_config_gate.py`(矩阵校验)、`performance_feedback` 写入器(新,fake)、join 校验脚本(新)、`learning_review.py`(可选扩跨 run,留下期)。
|
|
|
|
|
+
|
|
|
|
|
+**开发顺序**:① 逐项 grep/validator 确认死配置无运行时读取,区分 `score_thresholds.json` 这类仍在读的真源;② 先建 `archive/v5_m4_dead_config_archive/<timestamp>/...` 归档目录和 manifest,死配置只先迁走不直接删除,归档目录进 git;③ 改 `build_config_from_excel.py` 让 Excel 新增 platform 行/矩阵行能生成 JSON,不再静默跳过;④ 在 `规则包映射配置表.xlsx` 13 sheet 与 `游走策略配置表.xlsx` 4 sheet 内做全平台矩阵重组,同步 JSON;⑤ 扩校验器覆盖"新增行不能丢、只有 approved+runtime_enabled 才进运行 JSON、平台矩阵字段合法、runtime 启用仍只限三短视频";⑥ 写 fake performance_feedback 写入器,样本从 M0 golden corpus 和当前 DB 各选,同时覆盖稳定复刻与真实 join;⑦ 验证假成绩能 join 回 `rule_decisions.scorecard`(命中率报告);⑧ 约定"改权重/门槛→人审→写 JSON 生效"流程文档。
|
|
|
|
|
+
|
|
|
|
|
+**达到效果**:运营能在 Excel 看到全平台规则/游走能力矩阵,并通过转换器生成真实 JSON;V5 runtime 仍只启用三短视频平台;死配置清干净但不误删运行真源;假数据能对回打分记录,学习算法入口就绪。
|
|
|
|
|
+
|
|
|
|
|
+**验证**:`uv run --with openpyxl python scripts/build_config_from_excel.py --check`;`uv run python scripts/validate_rule_pack_config.py`;`uv run python scripts/validate_v4_config_contract.py`;`python3 scripts/run_config_gate.py`;新增/扩展测试覆盖 Excel 新增行不会被静默跳过;`git diff -- sql` 为空;fake join 命中率达标。
|
|
|
|
|
+
|
|
|
|
|
+**失败归因**:Excel 改了不生效→新行仍被 overlay-only 逻辑跳过;全平台矩阵导致 runtime 接入越界→dispatch/profile enabled 口径没分清"台账"和"启用";未知平台被错判→dispatch miss 被错误 fallback 到抖音;未来四维/五维扩展失败→仍按三套旧 profile 名写死选择逻辑;误删后 golden gate 失败→把 `score_thresholds.json` 或权重真源当死配置删了;join 对不上→content_id 关联键口径不一致;游走预算超限展示不清→只记录了 `budget_exhausted/budget_tier=blocked`,没有给运营统一展示成 `budget_blocked`。
|
|
|
|
|
|
|
|
-**已拍板**:学习算法本体 V5 不做、只铺路;回流先 fake 验 join;门槛只到平台层;权重门槛改了人审才生效。
|
|
|
|
|
|
|
+### M4 Excel Sheet 字段整理草案(关键口径已拍板)
|
|
|
|
|
|
|
|
-**🟠 待拍板**:① Excel 组织——每平台一分页 vs 每平台一独立 Excel(对应草稿待拍 ③);② 死配置是删还是留空壳(建议删,先确认 evaluator V4 路径不读);③ 回流 fake 的 case 用哪条(可复用 M0 的 v4_douyin_57663 的 content_id 造假成绩)。
|
|
|
|
|
|
|
+**大白话解释**:这里先不直接改 Excel。这个表只是把"以后运营到底在哪张表里改什么"摊开。`sheet` 可以理解成 Excel 里的一个标签页;M4 不建议上来就删整张标签页,而是先分三类:① 运行真的会读、要保留并接进转换器;② 现在只是说明/旧台账,要么改成真能生成 JSON,要么迁走;③ 当前 JSON 已经在运行读,但还没进 Excel,必须新增标签页承接。Excel 是"配置台账 + 可生成 JSON 的治理入口",不是"出现即上线";平台是否上线看 `runtime_enabled/dispatch_enabled/profile status`,不是看 Excel 有没有一行。权重 profile 也不能继续叫 `douyin_xxx`:平台是字段,条件是 `applies_when`,维度和权重是行;这样未来三维、四维、五维都只是加矩阵行,不用每次给 evaluator 加新 if。
|
|
|
|
|
|
|
|
-**本阶段不处理**:不接真实回流源;不做跨 run 学习器;不做自动反写。
|
|
|
|
|
|
|
+**已确认的真实证据**:
|
|
|
|
|
+- 当前转换器只认固定 sheet spec:`build_config_from_excel.py:60-84`;新增 Excel 行会因只 overlay 已有 JSON 对象而被跳过(`_set_if_exists` / `if obj is not None` 口径)。
|
|
|
|
|
+- 当前配置门已全绿:`build_config_from_excel.py --check` 与 `run_config_gate.py` 均通过,说明现状 Excel↔JSON byte-equal,但也说明新增结构必须先改转换器。
|
|
|
|
|
+- 权重 profile 真实读 JSON 但仍是旧三名:`evaluator.py:267-288` 写死三套 profile 选择;`douyin_rule_packs.v1.json:376-390` 也只有这三套。M4 附录只把旧名标历史兼容,不把它们作为未来命名规范。
|
|
|
|
|
+- DB 不承接配置:国内库 MySQL 8.0.46,无 config/rule_pack/profile/excel/weight/threshold 配置表;`content_agent_performance_feedback` 已存在但 0 写入;`rule_decisions` 和 `discovered_content_items` 2929/2929 可对账,所以 M4 不做 migration、不改历史字段,只做 fake 写入和 join 验证。
|
|
|
|
|
|
|
|
-**涉及文件**:`douyin_rule_packs.v1.json`(清 V3 段)、两个 Excel + `build_config_from_excel.py`(先改底稿防静默跳过)、`performance_feedback` 写入器(新,fake)、join 校验脚本(新)、`learning_review.py`(可选扩跨 run,留下期)。
|
|
|
|
|
|
|
+**状态说明**:
|
|
|
|
|
+- `converter_read`:当前 Excel 转换器已经读取这个 sheet。
|
|
|
|
|
+- `runtime_required`:运行或校验强依赖的合同。
|
|
|
|
|
+- `runtime_compat_copy`:兼容副本,短期保留,迁移完成后可删除。
|
|
|
|
|
+- `ledger_only`:台账/说明 sheet,当前不等于 runtime 启用。
|
|
|
|
|
|
|
|
-**开发顺序**:① 确认 V3 死配置无运行时读取→清掉;② Excel 底稿改造支持加平台行/分页;③ 写 fake performance_feedback 写入器 + 灌假数据;④ 验证假成绩能 join 回 `rule_decisions.scorecard`(命中率报告);⑤ 约定"改权重→人审→写手册生效"流程文档。
|
|
|
|
|
|
|
+**审批和运行启用统一规则**:
|
|
|
|
|
+- 允许的 `approval_status` 只有五个:`draft / waiting_for_human_reivew / approved / rejected / deprecated`;`waiting_for_human_reivew` 作为长期枚举值保留,不再纠正拼写。
|
|
|
|
|
+- 只有 `approval_status=approved` 且 `runtime_enabled=true` 的行才能进入运行 JSON;其他行可以留在 Excel 台账里,但只能作为草稿、待审、废弃或未来能力位。
|
|
|
|
|
+- 审批审计字段只保留 `approval_status`、`last_reviewed_at`、`owner`;M4 不新增 `created_by/approved_by/approved_at` 这类更重的流程字段。
|
|
|
|
|
+- `applies_when` 只能用可审计表达式,不写任意代码。M4 先支持 `always`、`no_extra_dimension_available`、`field_exists:<path>`、`field_missing:<path>`、`field_equals:<path>:<value>`。
|
|
|
|
|
+- 权重默认同一个 profile 加总必须等于 100;只有 `normalization_policy=raw_sum` 允许不等于 100,且必须填写 `normalization_reason`。
|
|
|
|
|
+- `missing_dimension_policy=technical_retry` 表示关键维度缺失时判技术失败,并记录缺少的 `dimension_key`、`score_source_path` 和失败原因;不要新造平行失败字段,优先落到现有 `scorecard.failure_type/exception_type/final_status/missing_observable_fields` 与 flow ledger 技术详情。
|
|
|
|
|
|
|
|
-**达到效果**:运营能在 Excel 改任一平台手册并生效;死配置清干净;假数据能对回打分记录,学习算法入口就绪。
|
|
|
|
|
|
|
+#### A. `规则包映射配置表.xlsx`
|
|
|
|
|
|
|
|
-**验证**:`uv run pytest`;`build_config_from_excel.py --check` 字节等价;fake join 命中率达标。
|
|
|
|
|
|
|
+| sheet | 状态 | M4 动作 | 当前字段 | M4 建议字段 | 说明 |
|
|
|
|
|
+|---|---|---|---|---|---|
|
|
|
|
|
+| `rule_package_meta` | `ledger_only` | 保留为元信息;若要可编辑,需接入转换器 | `package_id,schema_version,package_name,platform,strategy_id,strategy_version,effective_from,effective_to,status,owner,description,source_json_path,注释` | 追加 `platform_scope,runtime_enabled,approval_status,last_reviewed_at,target_json_path` | 区分"有台账"和"运行启用";V5 runtime 仍只启用三短视频。 |
|
|
|
|
|
+| `rule_pack_catalog` | `ledger_only` | 保留;补平台与审批字段 | `rule_pack_id,rule_pack_version,pack_name,target_entity,enabled,runtime_stage,dispatch_enabled,input_node,decision_node,decision_output_keys,description,注释` | 追加 `platform,target_platforms,profile_key,score_schema_version,walk_strategy_id,runtime_enabled,approval_status,last_reviewed_at,owner` | 每个平台的规则手册从这里看总目录;Excel 出现不代表已派发。 |
|
|
|
|
|
+| `rule_pack_dispatch` | `converter_read/runtime_required` | 保留并扩成全平台矩阵 | `dispatch_id,platform,runtime_stage,strategy_version,target_entity,content_format,rule_pack_id,rule_pack_version,dispatch_enabled,priority,fallback_policy,注释` | 追加 `runtime_enabled,platform_status,profile_path,dispatch_scope,rollout_status,approval_status,last_reviewed_at,owner` | M2/M3 已按 platform 选 dispatch;`fallback_policy` 只管 dispatch 缺失/冲突处理,unknown platform 不允许 fallback 到抖音。 |
|
|
|
|
|
+| `input_contract_fields` | `ledger_only` | 保留;M4 必须决定是接入转换器还是改只读 | `contract_id,rule_pack_id,rule_pack_version,field_path,field_label,required,nullable,missing_policy,default_value,evidence_source,注释` | 追加 `platform,target_entity,input_node,json_type,allowed_values,profile_dependency,enabled` | 多平台输入差异要显式列出,否则以后又会回到代码里写死。 |
|
|
|
|
|
+| `hard_gate_rules` | `converter_read/runtime_required` | 保留;清死配置行 | `gate_id,rule_pack_id,rule_pack_version,priority,gate_label,field_path,operator,expected_value,severity,stop_scoring,decision_action,decision_reason_code,effect_status,enabled,注释` | 追加 `platform_scope,target_platforms,profile_key,runtime_enabled,approval_status,deprecated_reason` | hard gate 是运行合同,不能删 sheet;只能删经证明不用的行。 |
|
|
|
|
|
+| `scorecard_dimensions` | `converter_read/runtime_required` | 保留;补平台/权重 profile 关联 | `dimension_id,rule_pack_id,rule_pack_version,dimension_key,dimension_label,max_score,weight_percent,enabled,runtime_status,evidence_paths,description,注释` | 追加 `platform,target_platforms,active,weight_profile_id,feature_source,score_source_path,profile_dependency,learning_tunable,approval_status` | 基础两维 `query_relevance/platform_performance` 必须保留;允许额外 active dimension;`fifty_plus` 当前只代表抖音 50+ 画像维度,不是跨平台通用老年维度名。 |
|
|
|
|
|
+| `scorecard_scoring_rules` | `converter_read/runtime_required` | 保留;补公式版本与平台范围 | `scoring_rule_id,dimension_id,rule_pack_id,field_path,operator,expected_value,score_value,score_formula,missing_policy,priority,enabled,注释` | 追加 `dimension_key,platform_scope,score_profile_id,formula_version,normalization_policy,learning_tunable,approval_status` | 管每个维度怎么算分;未来多平台差异不能靠代码分支。 |
|
|
|
|
|
+| `threshold_actions` | `converter_read/runtime_required` | 保留;但运行门槛真源另列新 sheet | `threshold_id,rule_pack_id,rule_pack_version,min_score,max_score,score_missing_policy,decision_action,decision_reason_code,effect_status,priority,enabled,注释` | 追加 `platform,threshold_profile_id,pool_query,review_query,walk_query,walk_platform,walk_total,learning_tunable,approval_status` | 规则包内 thresholds 不是当前唯一运行门槛;`score_thresholds.json` 仍是真源,见新增 `score_threshold_profiles`。 |
|
|
|
|
|
+| `decision_reason_codes` | `converter_read/runtime_required` | 保留;支持旧码退场 | `decision_reason_code,reason_label,reason_category,business_explanation,is_hard_gate,is_primary_reason_candidate,reportable,recommended_action,owner,status,注释` | 追加 `platform_scope,target_entity,severity,deprecated_reason,replacement_code` | reason code 是报表/复盘口径,必须统一治理。 |
|
|
|
|
|
+| `decision_action_catalog` | `ledger_only` | 保留为动作台账;M4 判断是否接入转换器 | `decision_action,action_label,target_entity,business_meaning,runtime_effect,is_terminal,is_deprecated,allowed_in_v1,注释` | 追加 `allowed_platforms,allowed_runtime_stages,effect_status_default,walk_permission_effect,deprecated_reason` | 当前含 future action,不能误当运行启用。 |
|
|
|
|
|
+| `effect_status_mapping` | `converter_read/runtime_required` | 保留 | `mapping_id,target_level,decision_action,reason_category,is_hard_gate,content_effect_status,query_effect_status,priority,enabled,注释` | 追加 `platform_scope,target_entity,runtime_enabled,aggregation_policy,approval_status` | content/query 四态映射是 dashboard 和 golden gate 基础。 |
|
|
|
|
|
+| `query_effect_aggregation` | `converter_read/runtime_required` | 保留 | `aggregation_id,condition_label,success_count_rule,pending_count_rule,failed_count_rule,rule_blocked_count_rule,query_effect_status,walk_next_step,priority,enabled,注释` | 追加 `platform_scope,walk_policy_ref,next_edge_policy,runtime_enabled` | query 结果会影响后续游走,要和平台边能力矩阵挂上。 |
|
|
|
|
|
+| `字段注释` | `ledger_only` | 保留 | `sheet_name,field_name,字段中文名,注释` | 追加 `json_path,required,owner,last_reviewed_at` | 字段变多后,这是运营读懂表格的说明书。 |
|
|
|
|
|
+| `score_weight_profiles` | **新增/runtime_required** | 新增通用权重 profile 矩阵 | 无 | `profile_id,profile_label,historical_alias_ids,rule_pack_id,rule_pack_version,platform_scope,content_format,applies_when,dimension_key,weight_percent,normalization_policy,normalization_reason,missing_dimension_policy,critical_dimension,runtime_enabled,approval_status,priority,fallback_profile_id,learning_tunable,注释` | 当前 `score_weight_profiles` 已被 evaluator 真实读取,但还在 JSON-only;长期按 `platform_scope + applies_when + dimension_key + weight_percent + priority` 选 profile,支持三维/四维/五维扩展。 |
|
|
|
|
|
+| `score_threshold_profiles` | **新增/runtime_required** | 新增门槛 profile 矩阵 | 无 | `profile_id,platform_scope,content_format,threshold_key,threshold_value,applies_when,runtime_enabled,approval_status,last_reviewed_at,owner,priority,learning_tunable,注释` | 承接 `score_thresholds.json`;一行只放一个 `threshold_key + threshold_value`,权重和门槛都进 Excel,但只有人审通过且启用的行才能生成运行门槛 JSON。 |
|
|
|
|
|
+| `learning_feedback_join_contract` | **新增/ledger_only** | 新增 fake 回流 join 合同 | 无 | `join_contract_id,platform,feedback_table,decision_table,join_keys,scorecard_fields,metric_fields,fake_case_id,expected_match_rate,approval_status,注释` | M4 只做 fake 回流 join,不做学习算法本体;先把 join 键拍清楚。 |
|
|
|
|
|
|
|
|
-**失败归因**:Excel 改了不生效→新行被静默跳过(没先改底稿);join 对不上→content_id 关联键口径不一致。
|
|
|
|
|
|
|
+**权重 profile 历史兼容别名**:`default_two_dimension`、`douyin_fifty_plus_ok`、`douyin_fifty_plus_not_attempted` 只作为 M2/M0 golden gate 兼容事实保留,不是长期命名规范。长期可分别映射为 `base_video_two_dimension_v1`、`audience_50plus_available_v1`、`audience_50plus_skipped_by_query_gate_v1`;平台范围写进 `platform_scope`,触发条件写进 `applies_when`,不要把平台名写进 profile 名。
|
|
|
|
|
+
|
|
|
|
|
+**规则包表 no-op 处理口径**:本阶段不建议直接删整张 sheet。`rule_package_meta`、`rule_pack_catalog`、`decision_action_catalog`、`字段注释` 先明确保留为 `ledger_only`,只负责让运营看懂配置和未来能力,不直接进运行 JSON;`input_contract_fields` 有业务合同价值,后续 M4 brief 优先判断是否接入转换器,若暂不接入也必须标成只读台账。总原则是:能解释业务的 sheet 留作台账,会影响运行的 sheet 才接转换器,两者都不能靠"Excel 里有一行"直接上线。
|
|
|
|
|
+
|
|
|
|
|
+#### B. `游走策略配置表.xlsx`
|
|
|
|
|
+
|
|
|
|
|
+| sheet | 状态 | M4 动作 | 当前字段 | M4 建议字段 | 说明 |
|
|
|
|
|
+|---|---|---|---|---|---|
|
|
|
|
|
+| `walk_edge_catalog` | `converter_read/runtime_compat_copy` | **迁出后删除候选** | `edge_id,edge_type,from_node_type,to_node_type,edge_label,enabled,runtime_stage,creates_new_node,can_loop,priority,notes,注释` | 迁入平台无关单源后字段为 `edge_id,edge_type,from_node_type,to_node_type,edge_label,enabled,runtime_stage,creates_new_node,can_loop,priority,catalog_scope,source_path_type,endpoint_role,gate,extract_rule,deprecated_reason,注释` | M1 已把边目录从抖音策略中解耦;M4 应避免 `douyin_walk_strategy` 和 `walk_edge_catalog.json` 双源。 |
|
|
|
|
|
+| `walk_rule_pack_binding` | `converter_read/runtime_required` | 保留;补平台维度 | `binding_id,edge_id,target_entity,rule_pack_id,rule_pack_version,required,dispatch_policy,notes,注释` | 追加 `platform,platform_scope,runtime_enabled,edge_status_required,rule_pack_platform,approval_status` | 说明每条边要不要绑定规则包;以后不同平台不能混在一行里。 |
|
|
|
|
|
+| `v4_walk_gate` | `converter_read/runtime_required` | 保留;建议拆成 edge 行 | `gate_id,requires_allow_walk,source_field,deny_reason_code,applies_to_edges,raw_payload_fields,notes,注释` | `gate_id,platform_scope,edge_id,requires_allow_walk,source_field,deny_reason_code,gate_mode,raw_payload_fields,raw_payload_schema,runtime_enabled,approval_status,注释` | 当前 `applies_to_edges` 是数组;矩阵化后每条边一行,更容易校验。 |
|
|
|
|
|
+| `walk_fact_contract` | `converter_read/runtime_required` | 保留 | `runtime_file,db_table,required_fields,json_fields,unique_key,notes,注释` | 追加 `platform_scope,record_schema_version,writer,reader,validation_scope,owner` | DB 不改,但事实层合同要覆盖三平台和 fake 回流验证。 |
|
|
|
|
|
+| `platform_edge_matrix` | **新增/runtime_required** | 新增全平台边能力矩阵 | 无 | `platform,edge_id,status,status_reason,runtime_enabled,approval_status,profile_path,endpoint_ref,can_walk,blocked_reason,evidence_ref,last_verified_at,注释` | `status` 固定四态 `supported / blocked / no_interface / planned`;`can_walk` 是派生字段,只有 `supported` 才为 true;Excel 有平台行不等于 runtime 启用。 |
|
|
|
|
|
+| `walk_policy_budget_matrix` | **新增/runtime_required** | 新增预算矩阵 | 无 | `platform,edge_id,budget_tier,max_total_actions,max_per_content,max_works_per_author,max_pages,budget_exhausted_reason_code,operator_display_status,runtime_enabled,approval_status,last_reviewed_at,owner,注释` | 承接 `walk_policy.json` 的预算/权限;先把现有全局/edge 预算原样迁成 `default`,再只给快手 `author_to_works` 单独显式一行;预算按 `platform + edge_id` 配,超限运行原因保留 `budget_exhausted`,运营展示统一为 `budget_blocked`。 |
|
|
|
|
|
+
|
|
|
|
|
+**游走表删除口径**:`walk_edge_catalog` 是唯一整张 sheet 删除候选,但前提是 M4 先把它迁到平台无关单源并让转换器/validator 覆盖 `walk_edge_catalog.json`。迁移前不删。
|
|
|
|
|
+
|
|
|
|
|
+#### C. Fake 回流 case 选择口径
|
|
|
|
|
+
|
|
|
|
|
+| 项 | 建议 |
|
|
|
|
|
+|---|---|
|
|
|
|
|
+| 是否改 DB schema | 不改。`content_agent_performance_feedback` 已存在,当前 0 写入;不改历史 DB 字段。 |
|
|
|
|
|
+| fake 写入目标 | 只写现有 `content_agent_performance_feedback` 或本地 runtime fake store;不新增表,不新增 config/weight/profile DB 表。 |
|
|
|
|
|
+| join 键 | `run_id + policy_run_id + platform + platform_content_id`;`platform_content_id` 对应 `rule_decisions.decision_target_id`。 |
|
|
|
|
|
+| fake 字段 | `feedback_id=fake_m4_{policy_run_id}_{platform_content_id}`,`feedback_source=m4_fake_feedback`,`feedback_status=available`,`completion_rate`,`share_rate`,`average_watch_seconds`,`play_count`,`like_count`,`comment_count`,`share_count`,`collect_count`,`impression_count`。 |
|
|
|
|
|
+| raw_payload 必放 | `run_id,policy_run_id,decision_id,rule_pack_id,rule_pack_version,score,scorecard_snapshot,fake_case_version`。 |
|
|
|
|
|
+| fake 样本类型 | 固定选五类:高分入池、人工复核、低分拒绝、技术失败、快手 `author_to_works` 游走增强样本;样本来源从 M0 golden corpus 和当前 DB 各选,保证稳定复刻和真实 join 都覆盖。 |
|
|
|
|
|
+| 验收 | 选定 fake 样本 join 命中率 100%;`learning_review` 只产建议,不自动改权重/门槛。 |
|
|
|
|
|
+
|
|
|
|
|
+#### D. 死配置归档 manifest
|
|
|
|
|
+
|
|
|
|
|
+| 项 | 口径 |
|
|
|
|
|
+|---|---|
|
|
|
|
|
+| 归档目录 | `archive/v5_m4_dead_config_archive/<timestamp>/...`,目录进入 git。 |
|
|
|
|
|
+| 删除策略 | M4 只归档不自动删除;后续是否物理删除由人工手动决定。 |
|
|
|
|
|
+| manifest 字段 | `archive_id,source_path,archive_path,archived_at,archived_by,proof_no_runtime_read,restore_instruction,stable_until,delete_after,approval_status,注释`。 |
|
|
|
|
|
+| 验收 | 每个归档项必须有 grep/validator 证据证明 runtime 不读;必须能按 `restore_instruction` 回灌。 |
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|