# ContentFindAgent 数据接口与来源总览

更新时间：2026-06-08

## 0. 证据口径

本文只记录旧版代码、旧版接口审计、DB-first schema inventory、ContentFindAgent 数据工程 run 和 subagent 交叉验证过的数据接口。当前数据接口与来源的目录入口以本文为准，字段合同以 [数据库字段总览](../数据库字段总览/) 为准。

机器可读索引见 [external_data_sources_registry.json](external_data_sources_registry.json)。本文负责给人解释接口来源、用途和边界；JSON 负责让程序、脚本或后续检查工具按 `source_id` 查询外部数据源、环境变量、接入状态、输出落点和缺口。

| 状态 | 含义 |
|---|---|
| 已验证 | 已有 DB / API 只读验证或旧版实测结果 |
| 源码定位 | 旧版代码能定位到接口或写入逻辑，但本次未实连 |
| blocked | 因 token、只读条件或副作用限制未实连 |
| pending / 待接入 | DB 字段存在，产品应接入，但旧版 ContentFindAgent 未作为主链路实现 |
| source-only | 已有配置来源或源码来源，但本轮未作为主链路实连验证 |
| missing | 变量、key、表或 API 未找到可用真实值 |
| 缺口 | 没有真实表、真实接口或稳定字段，不能写成已接入 |

不把 `show` 静态样例、小红书搜索、共创作者、相似作者、发现内容列表、淘汰原因表写成已验证接口。

### 0.1 阅读方式

每个阶段都按“短索引 + 详情块”组织：

- 短索引只看接口、用途和状态，方便快速扫读。
- 详情块再看输入字段、输出字段和边界，避免长表在窄屏下挤成一行。
- 缺口统一放在最后，避免和已验证接口混在一起。

### 0.2 环境配置和只读验证摘要

本节吸收原环境缺口报告的确认结果，只记录变量名、能力和验证状态，不记录密码、token、AK/SK 或完整 DSN。

#### 已验证配置

- `.env` 结构：pass
  - 对象：根目录 `.env`
  - 注释：共 `139` 个变量，无重复 key；本地私有文件，不进入代码仓库。
- 旧版 env 覆盖：pass
  - 对象：旧仓 Python `os.getenv(...)`
  - 注释：旧代码中发现的 `52` 个 getenv 变量都已在 `.env` 中覆盖。
- 业务库：pass
  - 变量：`DB_*`, `CONTENT_SUPPLY_DB_*`, `CONTENTFIND_DB_*`
  - 注释：`demand_content`, `workflow_decode_task_result`, `demand_find_author`, `demand_find_content_result`, `demand_find_task`, `demand_task_oprate` 均只读通过。
- Pattern 库：pass
  - 变量：`OPEN_AIGC_PATTERN_DB_*`, `PATTERN_GLOBAL_DB_*`, `CONTENTFIND_PATTERN_DB_*`
  - 注释：旧 MySQL `topic_pattern_element`, `topic_pattern_itemset`, `topic_pattern_category` 均只读通过，但新版 V1 不再把它们作为 `evidence_pack` 来源；只保留为历史迁移对照。
- Crawapi 抖音接口：pass
  - 变量：`CONTENTFIND_API_CRAWAPI_BASE_URL`, `CONTENTFIND_DOUYIN_*`, `CONTENTFIND_HOT_TOPIC_PATH`
  - 注释：抖音关键词、作者作品、内容画像、账号画像、今日热榜均只读通过。
  - 最新 smoke：2026-06-08 使用当前 `.env` 复测抖音关键词搜索，已不再返回强制登录异常；`POST /crawler/dou_yin/keyword` 可返回内容、`has_more` 和 `next_cursor`。同一内容调用 `POST /crawler/dou_yin/re_dian_bao/video_like_portrait` 返回 `code=0 / msg=null`，但样本画像为空，需按 `portrait_available=false / age_50_plus_level=missing` 处理。
- AIGC plan detail：pass
  - 变量：`AIGC_TOKEN`, `CONTENTFIND_API_AIGC_TOKEN`, `CONTENTFIND_API_READONLY_TOKEN`, `CONTENTFIND_AIGC_READONLY_PRODUCE_PLAN_ID`
  - 注释：只查 produce plan detail，未创建或保存计划。
- OpenRouter：pass
  - 变量：`OPENROUTER_API_KEY`, `OPENROUTER_BASE_URL`
  - 注释：两个 key 别名已同步；只读 key metadata probe HTTP 200；未调用 chat completion 或 embeddings。
- 上游 open_aigc MySQL：pass
  - 变量：`OPEN_AIGC_MYSQL_*`
  - 注释：本轮只读 `SELECT 1` 通过，并完成 5 张上游表 `LIMIT 1` 探测。
- 上游 open_aigc PG：pass
  - 变量：`OPEN_AIGC_PG_*`, `PGVECTOR_DSN`, `DATA_ENGINEERING_OPEN_AIGC_PG_DSN`
  - 注释：`DATA_ENGINEERING_OPEN_AIGC_PG_DSN` 和同步后的 `OPEN_AIGC_PG_*` 均只读 `SELECT 1` 通过；Pattern 相关表 `LIMIT 1` 通过。
- ODPS 表现数据：pass
  - 变量：`ODPS_ACCESS_ID`, `ODPS_ACCESS_KEY`, `ODPS_ENDPOINT`, `ODPS_PROJECT`
  - 注释：本轮 `SELECT 1` 通过，`video_dimension_detail_add_column`, `dwd_multi_demand_pool_di`, `feature_point_data` schema 可读。

#### 待补或仅有来源配置

- TikHub fallback：missing
  - 变量：`TIKHUB_API_KEY`, `TIKHUB_BASE_URL`, `TIKHUB_DOUYIN_SEARCH_PATH`
  - 注释：URL 和 path 已有，旧仓未找到真实 key；只能作为待补备用通道。
- OSS：missing
  - 变量：`ALIYUN_OSS_*`, `OSS_ACCESS_KEY_ID`, `OSS_ACCESS_KEY_SECRET`
  - 注释：变量名已定位，真实 AK/SK、bucket、region、prefix、public base URL 缺失。
- Feishu：source-only
  - 变量：`FEISHU_APP_ID`, `FEISHU_APP_SECRET`
  - 注释：旧版有来源，但不是 v2 主链路；本轮未调用。
- 前端联调 API：missing
  - 变量：`VITE_API_BASE_URL`, `VITE_CONTENTFIND_API_BASE_URL`
  - 注释：show 当前仍是静态沙盘，尚未接真实后端。

### 0.3 CFA 新数据合同

旧接口审计记录的是老系统和上游能力；新版 CFA 的生产事实层使用同一个云库里的 `content_agent_*` 表。

核心身份：

| 字段 | 含义 |
|---|---|
| `run_id` | 一次 CFA 运行 ID，由系统生成，同编号只能跑一次 |
| `policy_run_id` | 一次运行里的策略执行 ID。V1 一个 run 默认一套策略；V1.1 支持同一 run 多套策略实验 |
| `schema_version` | DB 表或 JSON 文件结构版本 |
| `record_schema_version` | JSONL 单行结构版本 |
| `policy_bundle_id` | 策略组合包 ID |
| `strategy_version` | 策略组合版本 |
| `rule_pack_id` / `rule_pack_version` | 规则包 ID 和版本 |

P0 新表：

```text
content_agent_runs
content_agent_source_contexts
content_agent_pattern_seed_packs
content_agent_queries
content_agent_discovered_content_items
content_agent_content_media_records
content_agent_rule_decisions
content_agent_source_path_records
content_agent_search_clues
content_agent_run_events
content_agent_final_outputs
content_agent_publish_jobs
content_agent_pattern_recall_evidence
content_agent_strategy_reviews
content_agent_policy_runs
```

字段边界：

- 关联、去重、状态筛选、审计和多策略比较字段必须做 DB 列。
- 原始响应、上游证据包、规则命中明细、运行事件详情和最终输出快照先放 JSON。
- JSON 字段要晋升成列，必须先经过命名登记、DDL、回填、测试和文档同步。

`content_agent_source_contexts` 是 run 级输入事实，不写 `policy_run_id`。从 `content_agent_pattern_seed_packs` 开始的策略相关表都必须写 `policy_run_id`。

## 1. 数据源

数据源阶段回答：从哪里拿原始素材、原始种子和可搜索线索。

### 1.1 索引

| 编号 | 接口/表 | 用途 | 状态 |
|---|---|---|---|
| S1 | `content-deconstruction-supply.demand_content` | 需求输入 | 已验证 |
| S2 | `open_aigc.public.pattern_itemset + pattern_itemset_post` | PG Pattern V2 到支撑素材 | 已验证 / V1 使用 |
| S3 | `content-deconstruction-supply.workflow_decode_task_result` | 直接 Case 原始素材和解构点 | 已验证 |
| S4 | 旧 MySQL `topic_pattern_itemset -> workflow_decode_task_result` | 历史 Pattern Item Set 派生多个 Case | 已废弃 / 迁移对照 |
| S5 | `open_aigc.public.pattern_mining_category` | PG Pattern V2 类目上下文 | 已验证 / V1 使用 |
| S6 | `content-deconstruction-supply.demand_find_author` | 历史沉淀账号 | 已验证 |
| S7 | 今日热榜 `/crawler/jin_ri_re_bang/content_rank` | 热点入口 | 已验证 |
| S8 | `open_aigc.post` | 上游历史内容素材 | 已验证 |
| S9 | `open_aigc.post_decode_topic_point_element` | 上游选题点元素 | 已验证 |
| S10 | `open_aigc.post_script_paragraph_field_element` | 上游脚本段落元素 | 已验证 |

### 1.2 详情

#### S1. 数据库：`content-deconstruction-supply`，表：`demand_content`

- 当前输入字段：`id`, `name`, `suggestion`, `score`, `merge_leve2`, `dt`, `ext_data`
- 新版必解析字段：`ext_data.evidence_pack`
- 输出字段：需求词、需求解释、品类、分数、日期。
- 边界：这是需求源，不是 Case 素材源；旧版只取基础字段，新版不能丢掉证据包。

`ext_data.evidence_pack` 需要包含并向下游传递：

| 字段 | 用途 |
|---|---|
| `source_kind` | 区分 Pattern、Case、聚类、历史搜索等来源 |
| `pattern_source_system` | 新版唯一合法值为 `pg_pattern_v2` |
| `case_id_type` | 说明 Case ID / post ID / channel content ID 的口径 |
| `source_post_id` | 绑定原始素材 ID |
| `pattern_execution_id` | 回查 Pattern 执行 |
| `mining_config_id` | 回查 Pattern 挖掘配置 |
| `itemset_ids` | 回查频繁项集 |
| `itemset_items[]` | 回查 itemset 内的分类、元素和维度 |
| `category_bindings` | 绑定分类树父节点 |
| `element_bindings` | 绑定分类树元素节点 |
| `support` / `absolute_support` | Pattern 支持度 |
| `matched_post_ids` | 记录 Pattern 支撑素材 |
| `video_ids` / `case_ids` | Pattern 来源下均为 `post_id` 语义 |
| `decode_case_ids` | PG-only 当前可为空数组，不参与 exact 闭合 |
| `seed_terms` | 给 Query 使用的策略种子 |
| `run_id` | 串起上游和下游 run_context |
| `demand_task_id` / `demand_content_id` | 绑定 DemandAgent 任务和需求记录 |
| `source_certainty` | 标记来源确定性 |
| `validation_status` | 标记已验证、待接入或待复看反查 |

这些字段要进入数据源、Query、判断、游走、资产清洗沉淀和策略学习。目标是从某个 `case_id` 或 `post_id` 能反查到 Pattern、itemset、分类节点或元素节点。

#### S2. 数据库：`open_aigc PG`，表：`public.pattern_itemset` + `public.pattern_itemset_post`

- 输入字段：`execution_id`, `itemset_id`, `mining_config_id`, `scope`
- 输出字段：`support`, `absolute_support`, `matched_post_ids`, `itemset_items`
- 边界：这是新版 DemandAgent `evidence_pack` 的正式 Pattern 主事实来源；旧 MySQL 只保留迁移对照。

#### S3. 数据库：`content-deconstruction-supply`，表：`workflow_decode_task_result`

- 输入字段：`channel_content_id`
- 输出字段：`title`, `body_text`, `images`, `video_url`, `channel`, `channel_account_id`, `channel_account_name`
- 解构字段：`purpose_points`, `key_points`, `inspiration_points`, `topic_fusion_result`, `merge_leve2`
- 边界：Case 的最终落点；可由直接 Case 或 Pattern 派生 Case 回查。

#### S4. 历史接口：旧 MySQL `topic_pattern_itemset` -> 数据库：`content-deconstruction-supply`，表：`workflow_decode_task_result`

- 输入字段：`execution_id`, `combination_type`, `item_count`, `support`, `absolute_support`, `matched_post_ids`
- 输出字段：用 `matched_post_ids` 回查 `workflow_decode_task_result.channel_content_id`
- 边界：旧字段仅作历史迁移对照；新版 `evidence_pack` 不能从这里生成或兜底。

#### S5. 数据库：`open_aigc PG`，表：`public.pattern_mining_category`

- 输入字段：`execution_id`, `id`, `path`, `source_type`
- 输出字段：`name`, `description`, `category_nature`, `level`, `parent_id`, `element_count`
- 边界：辅助解释 PG Pattern V2 的分类路径，不直接召回内容。

#### S6. 数据库：`content-deconstruction-supply`，表：`demand_find_author`

- 输入字段：`content_tags`, `channel`, `author_id`, `author_name`
- 输出字段：`run_id`, `author_name`, `author_link`, `author_id`, `elderly_ratio`, `elderly_tgi`, `is_good`, `remark`, `content_tags`, `channel`
- 边界：旧版可按 `content_tags LIKE query` 找历史作者。

#### S7. 接口：今日热榜 `/crawler/jin_ri_re_bang/content_rank`

- 输入字段：`sort_type`, `cursor`
- 输出字段：`source`, `jump_url`, `type`, `rankList[].title`, `rankList[].heat`, `has_more`, `next_cursor`
- 边界：热点只做修饰和探索入口，不等于最终内容源。

#### S8. 数据库：`open_aigc`，表：`post`

- 输入字段：`post_id`, `platform`, `merge_leve1`, `merge_leve2`, `import_date`
- 输出字段：`title`, `body_text`, `platform_account_id`, `platform_account_name`, `publish_timestamp`, `like_count`, `comment_count`, `collect_count`, `images`
- 边界：数据工程上游素材表，不是旧版 ContentFindAgent 主读表。

#### S9. 数据库：`open_aigc`，表：`post_decode_topic_point_element`

- 输入字段：`post_id`, `topic_point_id`, `element_type`, `element_sub_type`
- 输出字段：`element_name`, `element_description`, `element_source`, `element_reason`
- 边界：用于理解上游元素，不替代 `workflow_decode_task_result`。

#### S10. 数据库：`open_aigc`，表：`post_script_paragraph_field_element`

- 输入字段：`post_id`, `paragraph_id`, `field_type`, `element_type`, `element_sub_type`
- 输出字段：`element_name`, `element_description`
- 边界：用于策略学习和素材理解。

## 2. Query

Query 阶段回答：哪些输入会被转成平台可执行搜索词或采集动作。

### 2.1 索引

| 编号 | 接口/表 | 用途 | 状态 |
|---|---|---|---|
| Q1 | `demand_content` | 需求转 Query 输入 | 已验证 |
| Q2 | `workflow_decode_task_result` | Case 解构点转 Query 输入 | 已验证 |
| Q3 | `ext_data.evidence_pack.seed_terms/itemset_items/category_bindings` | PG Pattern V2 证据转 Query 输入 | 已验证 / V1 使用 |
| Q4 | 旧 MySQL `topic_pattern_element/topic_pattern_itemset` | 历史 Pattern 词或组合转 Query 输入 | 已废弃 / 迁移对照 |
| Q5 | OpenRouter | LLM Query Builder / 判断辅助 | 只读鉴权通过 |
| Q6 | `demand_find_task` | Query 执行 run_context 台账 | 已验证 |

### 2.2 详情

#### Q1. 数据库：`content-deconstruction-supply`，表：`demand_content`

- 输入字段：`name`, `suggestion`, `merge_leve2`, `score`, `dt`, `ext_data.evidence_pack.seed_terms`, `ext_data.evidence_pack.source_kind`
- 输出字段：Query 原始需求、品类、解释、策略种子。
- 边界：旧版从需求池出发；新版有证据包时优先使用 `seed_terms`，不能只把宽泛 `name` 当 Query 输入。

#### Q2. 数据库：`content-deconstruction-supply`，表：`workflow_decode_task_result`

- 输入字段：`purpose_points`, `key_points`, `inspiration_points`, `topic_fusion_result`, `title`, `body_text`, `merge_leve2`
- 输出字段：Case 策略种子、筛选点、回扣依据。
- 边界：v2 以解构出的策略种子为主，不直接用账号名做 Query。

#### Q3. 输入对象：`demand_content.ext_data.evidence_pack`

- 输入字段：`seed_terms`, `itemset_items`, `category_bindings`, `element_bindings`, `pattern_source_system`
- 输出字段：Pattern 词、维度、类目路径和 Query seed。
- 边界：`pattern_source_system` 必须为 `pg_pattern_v2`，不再从旧 MySQL 表临时补证据。

#### Q4. 历史接口：旧 MySQL `topic_pattern_element/topic_pattern_itemset`

- 输入字段：`combination_type`, `item_count`, `support`, `absolute_support`, `dimensions`, `matched_post_ids`
- 输出字段：Pattern 组合、支持度、多 Case 命中集合。
- 边界：字段曾验证存在，但不再作为新版 Query 主链路或 fallback。

#### Q5. 能力：OpenRouter

- 输入字段：`model`, `messages`, `tools`, `system`, `max_tokens`, `temperature`
- 输出字段：`content`, `tool_calls`, `prompt_tokens`, `completion_tokens`, `finish_reason`, `cost`, `usage`
- 边界：本轮只做 key metadata 鉴权探测，未调用 chat completion 或 embeddings；真实生成仍需显式预算开关。

#### Q6. 数据库：`content-deconstruction-supply`，表：`demand_find_task`

- 输入字段：`run_id`, `demand_content_id`, `status`, `created_at`, `token_coast`
- 输出字段：任务状态、成本、需求关联。
- 边界：不是 Query 内容表，但承载执行追踪。

## 3. Platform

Platform 阶段回答：同一个 Query 在平台上用什么动作执行，返回什么字段。

### 3.1 索引

| 编号 | 接口/表 | 用途 | 状态 |
|---|---|---|---|
| P1 | 抖音关键词搜索 `/crawler/dou_yin/keyword` | Query -> 发现视频 | 已验证 |
| P2 | TikHub 搜索 fallback | 抖音搜索备用 | blocked |
| P3 | 抖音账号作品 `/crawler/dou_yin/blogger` | 作者 -> 作者作品 | 已验证 |
| P4 | 热点宝内容画像 | 视频画像 | 已验证 |
| P5 | 热点宝账号画像 | 作者画像 | 已验证 |
| P6 | `demand_find_content_result` | 平台结果沉淀字段 | 已验证 |
| P7 | `demand_find_author` | 作者平台身份 | 已验证 |

### 3.2 详情

#### P1. 接口：抖音关键词搜索 `/crawler/dou_yin/keyword`

- 输入字段：`keyword`, `content_type`, `sort_type`, `publish_time`, `cursor`, `account_id`
- 输出字段：`platform_content_id`, `desc`, `author.nickname`, `author.platform_author_id`, `statistics.*`, `has_more`, `next_cursor`
- 边界：2026-06-08 真实 smoke 已确认 `content_type=视频` 可返回第一页、`has_more` 和 `next_cursor`；`综合` 口径不能直接照搬。

#### P2. 接口：TikHub 搜索 fallback

- 输入字段：`keyword`, `cursor`, `sort_type`, `publish_time`, `filter_duration`, `content_type`, `search_id`, `backtrace`
- 输出字段：`business_data[].data.aweme_info`, `next_page`, `backtrace`
- 边界：缺 `TIKHUB_API_KEY`，不能写成已接入。

#### P3. 接口：抖音账号作品 `/crawler/dou_yin/blogger`

- 输入字段：`account_id`, `sort_type`, `cursor`
- 输出字段：`platform_content_id`, `desc`, `author.*`, `statistics.*`, `has_more`, `next_cursor`
- 边界：已验证抖音作者作品；小红书作者作品仍待验证。

#### P4. 接口：热点宝内容画像

- 输入字段：`content_id`, `need_age`, `need_gender`, `need_province`
- 输出字段：年龄、性别、省份画像，`percentage`, `preference`
- 边界：用于判断，不是召回接口；2026-06-08 真实 smoke 确认接口可返回 `code=0`，但单条内容可能 `data.data=null`，运行层必须把它当作画像缺失而不是接口登录失败。

#### P5. 接口：热点宝账号画像

- 输入字段：`account_id`, `need_age`, `need_gender`, `need_province`
- 输出字段：年龄、性别、省份画像，`percentage`, `preference`
- 边界：可作为作者是否值得扩展的判断信号。

#### P6. 数据库：`content-deconstruction-supply`，表：`demand_find_content_result`

- 输入字段：`channel`, `platform_content_id`, `video_url`, `author_id`, `author_name`, `author_link`
- 输出字段：平台、内容 ID、作者 ID、链接。
- 边界：这是结果表字段，不是平台 API。

#### P7. 数据库：`content-deconstruction-supply`，表：`demand_find_author`

- 输入字段：`channel`, `author_id`, `author_name`, `author_link`, `content_tags`
- 输出字段：作者资产、内容标签、平台身份。
- 边界：可作为后续作者起点。

## 4. 判断

判断阶段回答：内容、作者、Pattern 派生 Case 是否值得留下或继续扩展。

### 4.1 索引

| 编号 | 接口/表 | 用途 | 状态 |
|---|---|---|---|
| J1 | 热点宝内容画像 | 50+ 内容适配 | 已验证 |
| J2 | 热点宝账号画像 | 50+ 作者适配 | 已验证 |
| J3 | `workflow_decode_task_result` | Case 回扣判断 | 已验证 |
| J4 | 解构接口 + 分类树 `match-paths` | 新发现内容 Pattern 回扣判断 | 待接入 |
| J5 | PG `pattern_itemset` + `pattern_itemset_post` | Pattern 来源 Case 支持度判断 | 已验证 / V1 使用 |
| J6 | `demand_find_content_result` | 判断结果沉淀 | 已验证 |
| J7 | `dwd_multi_demand_pool_di` | 下游需求池表现参考 | 已验证 |
| J8 | `feature_point_data` | 特征表现参考 | 已验证 |

### 4.2 详情

#### J1. 接口：热点宝内容画像

- 输入字段：`content_id`, `need_age`, `need_gender`, `need_province`
- 输出字段：年龄、性别、省份画像，`percentage`, `preference`
- 边界：判断信号，不直接代表内容质量。

#### J2. 接口：热点宝账号画像

- 输入字段：`account_id`, `need_age`, `need_gender`, `need_province`
- 输出字段：年龄、性别、省份画像，`percentage`, `preference`
- 边界：作者强不代表作品必然强。

#### J3. 数据库：`content-deconstruction-supply`，表：`workflow_decode_task_result`

- 输入字段：`purpose_points`, `key_points`, `inspiration_points`, `topic_fusion_result`
- 输出字段：目的点、关键点、灵感点、选题描述。
- 边界：直接 Case 和 Pattern 派生 Case 都回到这张表判断。

#### J4. 接口：解构接口 + 分类树 `match-paths`

- 输入字段：发现视频的解构元素、`source_type`, `top_k`, `min_score`
- 输出字段：分类树备选路径、分数和匹配依据。
- 当前 endpoint：`POST https://library.aiddit.com/api/search/categories/match-paths/v2`。
- 最新 smoke：2026-06-08 提交元素词 `毛主席`，返回 `success=true`，首个候选路径为 `/表象/视觉/实体/人物/个体/现实人物`，score 为 `1.0`。
- 边界：只有解构强证据词和本次 PG `evidence_pack` 能解释相连，才允许把 `pattern_recall` 升级为 `matched`。`strong / medium / weak` 只用于画像、置信度或强弱等级，不表示 Pattern 回扣通过。

#### J5. 数据库：`open_aigc PG`，表：`public.pattern_itemset` + `public.pattern_itemset_post`

- 输入字段：`support`, `absolute_support`, `item_count`, `matched_post_ids`, `combination_type`
- 输出字段：Pattern 支持度、支撑素材和 itemset 规模。
- 边界：只用于验证上游 `evidence_pack`，不替新发现内容做自动回扣。
- 输出字段：支持度、帖子集合、组合类型。
- 边界：用于 Pattern -> 多 Case 判断；旧版未主链路使用。

#### J6. 数据库：`content-deconstruction-supply`，表：`demand_find_content_result`

- 输入字段：`digg_count`, `comment_count`, `share_count`, `portrait_source`, `elderly_ratio`, `elderly_tgi`, `recommendation_reason`, `process_trace`
- 输出字段：互动、画像来源、50+ 指标、推荐理由、过程 run_context。
- 边界：旧版只沉淀最终结果，没有全量发现内容判断表。

#### J7. 数据库：`ODPS`，表：`dwd_multi_demand_pool_di`

- 输入字段：`strategy`, `demand_id`, `demand_name`, `weight`, `type`, `video_count`, `video_list`, `extend`, `dt`
- 输出字段：需求池权重和视频列表。
- 边界：用于策略学习/复盘，不是旧版判断实时输入。

#### J8. 数据库：`ODPS`，表：`feature_point_data`

- 输入字段：`特征点`, `总分发曝光pv`, `bn_总回流`, `质bn_rovn`, `分发视频量`, `总日回流uv`, `vid_list`, `dt`
- 输出字段：特征点表现、回流、视频列表。
- 边界：用于后续策略学习，不是旧版实时评分表。

## 5. 游走

游走阶段回答：从视频、作者、Pattern、Case 还能走到哪里。

### 5.1 索引

| 编号 | 接口/表 | 用途 | 状态 |
|---|---|---|---|
| W1 | 抖音关键词搜索返回作者 | 视频 -> 作者 | 已验证 |
| W2 | 抖音账号作品 | 作者 -> 作者作品 | 已验证 |
| W3 | `demand_find_author` | 历史作者 -> 作者作品 | 已验证 |
| W4 | PG `pattern_itemset_post` | Pattern -> 支撑素材 | 已验证 / V1 使用 |
| W5 | 旧 MySQL `topic_pattern_* -> workflow_decode_task_result` | 历史特征词或 itemset -> Case | 已废弃 / 迁移对照 |
| W6 | 相关搜索 / 标签 / 共创 / 相似作者 | 内容继续扩展 | 缺口 |
| W7 | 小红书笔记/作者/话题游走 | 小红书扩展 | 缺口 |

### 5.2 详情

#### W1. 接口：抖音关键词搜索返回作者

- 输入字段：`platform_content_id`, `desc`, `author.nickname`, `author.platform_author_id`, `statistics.*`
- 输出字段：作者昵称、`platform_author_id`、互动指标。
- 边界：只是进入作者判断，不代表作者自动入库。

#### W2. 接口：抖音账号作品

- 输入字段：`account_id` / `author.platform_author_id`, `sort_type`, `cursor`
- 输出字段：`platform_content_id`, `desc`, `author.*`, `statistics.*`, `has_more`, `next_cursor`
- 边界：作品需要重新过判断。

#### W3. 数据库：`content-deconstruction-supply`，表：`demand_find_author`

- 输入字段：`author_id`, `author_link`, `content_tags`, `channel`
- 输出字段：可复用作者身份、标签、画像指标。
- 边界：旧版按作者资产复用；作品仍走平台接口。

#### W4. 数据库：`open_aigc PG`，表：`public.pattern_itemset_post`

- 输入字段：`execution_id`, `itemset_id`
- 输出字段：`post_id` 列表，进入 `matched_post_ids`、`video_ids`、`case_ids`。
- 边界：这是新版 PG-only `evidence_pack` 的支撑素材来源。

#### W5. 历史接口：旧 MySQL `topic_pattern_*` -> 数据库：`content-deconstruction-supply`，表：`workflow_decode_task_result`

- 输入字段：`matched_post_ids`, `support`, `absolute_support`
- 输出字段：历史 Case 解构点。
- 边界：仅保留迁移说明，新版不再用它补齐或兜底 `evidence_pack`。

#### W6. 缺口：相关搜索 / 标签 / 共创 / 相似作者

- 输入字段：暂无稳定字段。
- 输出字段：暂无稳定返回。
- 边界：不写成已验证接口。

#### W7. 缺口：小红书笔记/作者/话题游走

- 输入字段：暂无旧版实测字段。
- 输出字段：暂无稳定返回。
- 边界：目前只有静态 Case 字段，不等于平台接口接入。

## 6. 资产清洗沉淀

资产清洗沉淀阶段回答：召回和判断后的内容、作者、后处理链接沉到哪里。

### 6.1 索引

| 编号 | 接口/表 | 用途 | 状态 |
|---|---|---|---|
| A1 | `demand_find_content_result` | 内容资产入库 | 已验证 |
| A2 | `demand_find_content_result` | 内容质量和画像沉淀 | 已验证 |
| A3 | `demand_find_author` | 作者资产入库 | 已验证 |
| A4 | AIGC plan | 后处理计划绑定 | 源码定位 / blocked |
| A5 | OSS log HTML | 过程可视化链接 | 源码定位 / blocked |
| A6 | 关系资产 | 来源、query、作者、标签、游走路径关系 | 缺口 |
| A7 | 搜索线索 | 有效 query、失败 query、标签、话题 | 缺口 |

### 6.2 详情

#### A1. 数据库：`content-deconstruction-supply`，表：`demand_find_content_result`（内容资产入库）

- 输入字段：`run_id`, `query`, `rank_no`, `video_url`, `title`, `author_name`, `author_link`, `author_id`, `platform_content_id`, `demand_content_id`, `channel`, `dt`
- 输出字段：内容资产、排序、来源需求、平台身份。
- 新版必须补：结构化 `source_evidence`，或 sidecar/source edge artifact。
- 边界：旧版沉淀最终内容，不沉淀全量发现内容列表；只靠 `platform_content_id + demand_content_id + process_trace` 不能 exact 回溯到 Pattern 和分类树节点。

#### A2. 数据库：`content-deconstruction-supply`，表：`demand_find_content_result`（内容质量和画像沉淀）

- 输入字段：`digg_count`, `comment_count`, `share_count`, `portrait_source`, `elderly_ratio`, `elderly_tgi`, `recommendation_reason`, `process_trace`
- 输出字段：互动指标、画像、推荐理由、过程记录。
- 边界：`process_trace` 可复盘，但不是结构化全量 run_context 表；不能替代 `source_evidence`。

#### A3. 数据库：`content-deconstruction-supply`，表：`demand_find_author`

- 输入字段：`run_id`, `author_name`, `author_link`, `author_id`, `elderly_ratio`, `elderly_tgi`, `is_good`, `remark`, `content_tags`, `channel`
- 输出字段：作者资产、画像、标签、入选理由。
- 边界：作者身份合并逻辑需新版明确。

#### A4. 能力：AIGC plan

- 输入字段：`platform_content_id`, `merge_leve2`, `produce_plan_id`, `account_id`, `sort_type`
- 输出字段：`crawler_plan_id`, `produce_plan_id`, `produce_plan_name`, `publish_plan_id`
- 边界：写侧副作用，开发测试不能默认触发。

#### A5. 能力：OSS log HTML

- 输入字段：`html_path`, `object_key`, `task_id`
- 输出字段：`web_html_url`
- 边界：上传有副作用；旧版只保留能力边界。

#### A6. 缺口：关系资产

- 输入字段：暂无真实表。
- 输出字段：暂无真实字段。
- 边界：内容与数据源、query、作者、标签、游走路径关系都需要承载，但当前不伪造 schema。

#### A7. 缺口：搜索线索

- 输入字段：暂无真实表。
- 输出字段：暂无真实字段。
- 边界：有效 query、失败 query、标签、话题、相关搜索线索目前只在结果和 run_context 中间接保留。

## 7. 策略学习

策略学习阶段回答：下一轮如何根据 run_context、表现和概念层事实调整策略。

### 7.1 索引

| 编号 | 接口/表 | 用途 | 状态 |
|---|---|---|---|
| L1 | `demand_find_task` | 任务级 run_context 和成本 | 已验证 |
| L2 | `demand_task_oprate` | 调度和预算开关 | 源码定位 |
| L3 | `demand_find_content_result` | 内容结果复盘 | 已验证 |
| L4 | `demand_find_author` | 作者资产复盘 | 已验证 |
| L5 | `open_aigc.global_category` | 长期概念分类 | 已验证 |
| L6 | `open_aigc.global_element` | 长期概念元素 | 已验证 |
| L7 | `open_aigc.element_classification_mapping` | 元素归类映射 | 已验证 |
| L8 | `open_aigc.public.pattern_mining_execution` | Pattern V2 执行快照 | 已验证 |
| L9 | `open_aigc.public.pattern_mining_element` | Pattern V2 元素快照 | 已验证 |
| L10 | `open_aigc.public.pattern_itemset` | Pattern V2 itemset | 已验证 |
| L11 | `open_aigc.public.pattern_itemset_item` | Pattern V2 itemset 成员 | 已验证 |
| L12 | `loghubods.video_dimension_detail_add_column` | 视频表现回看 | 已验证 |

### 7.2 详情

#### L1. 数据库：`content-deconstruction-supply`，表：`demand_find_task`

- 输入字段：`run_id`, `demand_content_id`, `status`, `created_at`, `token_coast`
- 输出字段：执行状态、成本、需求关联。
- 边界：只能看任务级结果，不能还原全量发现内容过程。

#### L2. 数据库：`content-deconstruction-supply`，表：`demand_task_oprate`

- 输入字段：`is_open`, `day_limit_coast`, `update_time`
- 输出字段：是否开启、日成本限制。
- 边界：策略控制数据，不是学习结论。

#### L3. 数据库：`content-deconstruction-supply`，表：`demand_find_content_result`

- 输入字段：`run_id`, `query`, `rank_no`, `channel`, `platform_content_id`, `process_trace`, `crawler_plan_id`, `produce_plan_id`, `publish_plan_id`, `web_html_url`, `source_evidence`
- 输出字段：成功路径、平台、计划绑定、过程记录、来源证据。
- 边界：没有失败待复看和淘汰原因结构化表；如果没有 `source_evidence` 或 source edge artifact，策略学习只能看到结果，不能 exact 回溯到 Pattern、Case 和分类树节点。

#### L4. 数据库：`content-deconstruction-supply`，表：`demand_find_author`

- 输入字段：`run_id`, `author_id`, `author_name`, `content_tags`, `elderly_ratio`, `elderly_tgi`, `is_good`, `channel`
- 输出字段：作者表现和可复用标签。
- 边界：后续需要与作品表现关联。

#### L5. 数据库：`open_aigc`，表：`global_category`

- 输入字段：`stable_id`, `name`, `source_type`, `path`, `parent_stable_id`, `category_nature`, `level`
- 输出字段：分类树和稳定分类 ID。
- 边界：上游概念层，非旧版实时输入。

#### L6. 数据库：`open_aigc`，表：`global_element`

- 输入字段：`id`, `name`, `source_type`, `belong_category_stable_id`, `element_sub_type`, `occurrence_count`
- 输出字段：元素词和出现次数。
- 边界：用于长期策略学习和 Pattern 生成。

#### L7. 数据库：`open_aigc`，表：`element_classification_mapping`

- 输入字段：`source_table`, `source_element_id`, `post_id`, `element_name`, `element_type`, `global_element_id`, `global_category_stable_id`, `classification_path`
- 输出字段：元素到全局类目的映射。
- 边界：用于理解上游元素如何进入 Pattern。

#### L8. 数据库：`open_aigc PG`，表：`public.pattern_mining_execution`

- 输入字段：`id`, `snapshot_date`, `is_current`, `status`, `post_count`, `category_count`, `element_count`, `topic_itemset_count`, `cross_itemset_count`, `start_time`, `end_time`, `error_message`
- 输出字段：Pattern 执行状态和规模。
- 边界：新版 DemandAgent 直接读取 PG Pattern V2；旧 PG -> MySQL bridge 仅作为历史风险说明。

#### L9. 数据库：`open_aigc PG`，表：`public.pattern_mining_element`

- 输入字段：`execution_id`, `post_id`, `source_table`, `source_element_id`, `element_type`, `element_sub_type`, `name`, `category_path`, `point_type`, `point_text`
- 输出字段：元素快照和类目路径。
- 边界：用于 PG Pattern V2 解释和后续回扣判断，不再服务旧 MySQL 兜底。

#### L10. 数据库：`open_aigc PG`，表：`public.pattern_itemset`

- 输入字段：`execution_id`, `combination_type`, `item_count`, `support`, `absolute_support`, `dimensions`, `is_cross_point`, `is_cross_layer`
- 输出字段：Pattern 组合、支持度、维度。
- 边界：新版 DemandAgent 读取它生成 `evidence_pack`；ContentFindAgent 通过 `evidence_pack/source_evidence` 间接消费，不直接连 PG。

#### L11. 数据库：`open_aigc PG`，表：`public.pattern_itemset_item`

- 输入字段：`itemset_id`, `layer`, `point_type`, `dimension`, `category_id`, `category_path`, `element_name`, `element_id`, `post_count`
- 输出字段：itemset 中的元素项。
- 边界：用于分析 Pattern 词和组合效果。

#### L12. 数据库：`loghubods`，表：`video_dimension_detail_add_column`

- 输入字段：`视频id`, `视频地址`, `标题`, `一级品类`, `二级品类`, `上传渠道`, `dt`
- 表现字段：`当日分发曝光pv`, `当日分发回流uv`, `rov_t0`, `流量池曝光`, `流量池播放`, `流量池回流`, `推荐曝光`, `推荐播放`, `推荐回流`, `总日回流uv`
- 输出字段：表现、曝光、播放、回流、标签。
- 边界：宽表只列策略学习关键字段。

## 8. 缺口清单

本节吸收原环境缺口报告的缺口项。凡是没有真实表、真实 key、真实接口或只读验证证据的能力，都不能在产品或技术文档里写成“已接入”。

### 8.1 P0 必须补齐

#### 新版发现内容列表承载

- 需要补：全量发现内容列表表或 API。
- 业务用途：保存所有召回的视频、笔记、作者，包括入池、观察、淘汰和最终入选。
- 当前状态：新版 DDL / schema registry 已定义为 `content_agent_discovered_content_items`；云库是否已建表并可写，按 P0 DB 验收确认。旧版未发现可承担该职责的真实表。
- 中文注释：旧版只保存最终结果，无法复盘“未入选的发现内容”。

#### 判断/淘汰日志承载

- 需要补：规则包执行记录、硬门槛、软评分、淘汰原因、停止原因表或 API。
- 业务用途：记录每个发现内容为什么继续、入池、观察、停止或淘汰。
- 当前状态：新版 DDL / schema registry 已定义为 `content_agent_rule_decisions`；云库是否已建表并可写，按 P0 DB 验收确认。旧版未发现可承担该职责的真实表。
- 中文注释：`process_trace` 只能粗略复盘，不能替代结构化规则日志。

#### 来源关系承载

- 需要补：数据源、seed、query、平台内容、作者、标签、游走路径关系表或 API；或先用 sidecar/source edge artifact 承载。
- 业务用途：记录内容从哪里来、经过哪条路径来、由哪个规则放行，并从 `case_id/post_id` 回溯到分类树节点。
- 当前状态：新版 DDL / schema registry 已定义为 `content_agent_source_path_records`；云库是否已建表并可写，按 P0 DB 验收确认。旧版未发现可承担该职责的真实表。
- 中文注释：没有关系承载，策略学习无法按来源和路径归因；最终只剩 `platform_content_id + demand_content_id + process_trace` 时，无法 exact 追到 Pattern 和分类树。

#### 搜索线索承载

- 需要补：有效 query、失败 query、标签、话题、相关搜索线索表或 API。
- 业务用途：保存下一轮可继续尝试的搜索线索，以及失败线索。
- 当前状态：新版 DDL / schema registry 已定义为 `content_agent_search_clues`；云库是否已建表并可写，按 P0 DB 验收确认。旧版未发现可承担该职责的真实表。
- 中文注释：旧版只在结果和 run_context 里间接留下 query，不够做系统学习。

#### show 联调后端

- 需要补：`VITE_API_BASE_URL`, `VITE_CONTENTFIND_API_BASE_URL`
- 业务用途：让 show 从静态沙盘切到真实后端接口。
- 当前状态：missing
- 中文注释：当前前端只能展示策略和静态样例，不能跑真实链路。

### 8.2 P1 生产增强

#### TikHub fallback

- 需要补：`TIKHUB_API_KEY`
- 业务用途：Crawapi 抖音搜索异常、限流或不可用时做备用召回。
- 当前状态：missing
- 中文注释：URL 已定位，缺 key；不能写成已接入。

#### OSS 过程链接

- 需要补：`ALIYUN_OSS_ACCESS_KEY_ID`, `ALIYUN_OSS_ACCESS_KEY_SECRET`, `ALIYUN_OSS_BUCKET`, `ALIYUN_OSS_REGION`, `ALIYUN_OSS_PREFIX`, `ALIYUN_OSS_PUBLIC_BASE_URL`
- 业务用途：保存任务日志、HTML 报告、截图、run_context 文件的可访问链接。
- 当前状态：missing
- 中文注释：旧版有上传能力线索，但当前缺真实 OSS 配置。

#### 外部调度源

- 需要补：`SCHEDULE_QUERY_API`, `SCHEDULE_QUERY_API_KEY`
- 业务用途：从外部系统接收任务、定时需求或批量触发策略运行。
- 当前状态：missing
- 中文注释：当前没有真实调度入口。

#### AIGC token 治理

- 需要补：将旧版 fallback token 换成密钥平台托管值。
- 业务用途：避免旧代码硬编码 token，保证后处理计划查询/绑定安全可维护。
- 当前状态：source-only
- 中文注释：这是安全治理，不是新增业务能力。

### 8.3 P2 产品待验证

#### 小红书笔记搜索、作者主页、作者笔记、话题标签接口

- 当前状态：无旧版实测接口。
- 中文注释：产品可以设计小红书路径，但技术文档不能写成已接入。

#### 快手、B站、视频号、票圈平台适配接口

- 当前状态：无旧版实测接口。
- 中文注释：这些平台暂时不能复用抖音字段口径。

#### 相关搜索、视频 tag、共创作者、相似作者、相似内容接口

- 当前状态：无稳定字段或实测。
- 中文注释：可以作为游走策略方向，但必须标为待验证。

#### 养号推荐流账号、cookie/session、设备、代理/风控配置

- 当前状态：无真实接入配置。
- 中文注释：养号是产品意图源，不能伪装成已有旧版 DB/API backing。

#### 策略实验、规则包版本、Prompt 版本、预算回写表/API

- 当前状态：无真实承载。
- 中文注释：策略学习需要这些承载，但当前没有真实表或 API。

#### Pattern -> Item Set -> 多 Case

- 当前状态：PG `pattern_itemset_post / pattern_itemset_item / pattern_mining_category` 字段存在，DemandAgent 新版已用于生成 `evidence_pack`；旧 MySQL 同名能力只作历史迁移说明。
- 中文注释：新版重要来源只指 PG Pattern V2，不指旧 `topic_pattern_*` 兜底。

## 9. 多平台 crawler 接口（crawler.aiddit.com）

本节记录 2026-06-11 对 `crawler.aiddit.com` 10 个平台接口的真实抓包实测。机器可读台账见 [crawler_endpoints.registry.json](crawler_endpoints.registry.json)（接口级，共 26 条 endpoint），原始 capture 在 `/tmp/aiddit_captures/`。所有接口共用 `CONTENTFIND_API_CRAWAPI_BASE_URL`，限流间隔 ≥15s。

2026-06-17 追加快手/视频号 URL 解包与 OSS v2 批量验证：完整 raw 和临时 URL 只保存在 gitignore 下的 `data/platform_url_probe/20260617_115219/`，提交文档只保留脱敏摘要。

- 快手：10 个 query，60 条 item，50 条 selected 正片 URL；selected 来源为 detail/search 各 25 条。20 条 selected URL 轻量验证均为 `video/mp4` 且 HTTP 200/206；no-referer 调 OSS v2 后 20/20 成功。
- 视频号：10 个 query，18 页，46 条 item，41 条 selected 正片 URL；selected 全部来自 `$.search.video_url_list[0].video_url`，host 为 `findermp.video.qq.com`。20 条 selected URL 轻量验证均为 `video/mp4` 且 HTTP 200/206；no-referer 调 OSS v2 后 20/20 成功。
- 两个平台使用生产当前 payload（把 `referer` dict 传给 OSS v2）时均 20/20 `oss_upload_response_invalid`；抽样 body 显示 `status=10000`、`oss_object=null`，错误包含 `dict object has no attribute encode`。去掉 `referer` 字段后同一批 selected URL 成功转存，因此历史 invalid 更像 OSS v2 payload 兼容问题，不是 URL 字段拆错。
- URL 解包规则必须先做候选分类和轻量验证，不能再把 `video_url_list[0]` 当唯一事实；快手推荐 detail 正片优先、search fallback，视频号推荐 findermp 正片优先，同时过滤 image/avatar/BGM/page/ad/material。

状态标签：✅=本批实测 code=0 可用；⛔=失败/超时/不可达（附错误码）；—=本平台无该能力或本批未抓到独立接口。

### 9.1 平台能力矩阵

| 平台 | 搜索 | 详情 | 作者作品 | 账号画像 | 视频可下载 |
|---|---|---|---|---|---|
| 抖音 douyin | ✅ `/dou_yin/keyword` | ✅ `/dou_yin/detail` | ✅ `/dou_yin/blogger` | ✅ `/dou_yin/re_dian_bao/account_fans_portrait`；内容画像 ⛔404 `video_like_portrait` | ✅（iOS UA+Referer 抖音） |
| 快手 kuaishou | ✅ `/kuai_shou/keyword_v2` | ✅ `/kuai_shou/detail` | — 无独立接口，依赖搜索聚合 | ✅ `/kuai_shou/account_info` | ✅（Range+Referer 快手） |
| 视频号 shipinhao | ✅ `/shi_pin_hao/keyword`（抖动需重试） | — | ⛔25011 `blogger` | ⛔10001 `account_info` | ✅（Referer channels.weixin） |
| 小红书 xiaohongshu | ✅ `/xiao_hong_shu/keyword` | ✅ `/xiao_hong_shu/detail` | ⛔超时 `blogger` | — | — 图文为主（note_card 嵌套） |
| B站 bilibili | ✅ `/bilibili/keyword` | ✅ `/bilibili/detail` | ⛔ 无作者接口 | — | ✅（m4s 分轨+Referer B站） |
| 公众号 weixin | ✅ `/wei_xin/keyword` | ✅ `/wei_xin/detail` | ⛔ blogger 不可达，作者仅 biz | ✅ `/wei_xin/account_info`（仅昵称/biz补全，无作品列表） | — 图文，无 tag |
| youtube | ✅ `/youtube/keyword` | ✅ `/youtube/detail` | — 无作者作品接口 | — | ⛔ detail 无视频地址（video_url_list=[]） |
| github | ✅ `/github/keyword` | — | — | — | ⛔ 非视频（代码仓库，topics 即 tag） |
| 知乎 zhihu | ⛔10000 全失败 | ⛔ | ⛔ | ⛔ | ⛔ |
| 头条 toutiao | ⛔10000 全失败 | ⛔ | ⛔ | ⛔ | ⛔ |

### 9.2 每平台一句话状态

- **抖音**：全链路最完整，搜索/详情/作者作品/账号画像/视频下载均通；仅内容级人群画像 404 不可用。详见 `接口台账/抖音.md`。
- **快手**：搜索/详情/账号info/视频下载通；无独立作者作品接口，author_to_works 暂依赖搜索聚合。详见 `接口台账/快手.md`。
- **视频号**：搜索可用但服务端抖动需重试+退避；视频可下载；blogger 与 account_info 失败。详见 `接口台账/视频号.md`。
- **小红书**：搜索/详情通，以图文为主（内容字段嵌在 note_card 下）；blogger 超时不可落地。详见 `接口台账/小红书.md`。
- **B站**：搜索/详情/视频下载通（m4s 分轨需合并）；集合内无作者作品接口。详见 `接口台账/B站.md`。
- **公众号**：搜索/详情/account_info 通，图文；作者仅 biz、blogger 不可达、整平台无 tag。详见 `接口台账/公众号.md`。
- **youtube**：搜索/详情通，但 detail 无视频地址、无作者作品接口；hashtag 须从 body_text 正则抽。详见 `接口台账/youtube.md`。
- **github**：仅搜索，且搜的是代码仓库非视频；topics 即 tag。详见 `接口台账/github.md`。
- **知乎**：整平台 blocked，关键词搜索两次均 code=10000，下游全部阻断。详见 `接口台账/知乎.md`。
- **头条**：整平台 blocked，关键词搜索两次均 code=10000，下游全部阻断。详见 `接口台账/头条.md`。

### 9.3 缺口

沿用「缺口统一放最后」的口径，本批 crawler 平台的明确缺口如下，均不能在产品或技术文档里写成"已接入"：

- **知乎 / 头条整平台不可用**：`/zhi_hu/keyword` 与 `/tou_tiao_hao/keyword` 两次抓包（含变参重试）均 `code=10000 / msg=未知错误 / data=null`，与参数无关，判定平台/接口侧不可用；detail/blogger/account_info/视频下载因搜索失败全部无样本，待上游修复复抓到 code=0 后再解锁登记。
- **视频号 blogger / account_info 失败 + 搜索抖动**：`/shi_pin_hao/blogger` `code=25011`、`/shi_pin_hao/account_info` `code=10001`（仅传 account_id 被拒，需补 app_id 或 account_name）；搜索首次 25011、重试才 code=0，必须带重试+退避。author_to_works 边当前不可落地。
- **小红书 blogger 超时**：`/xiao_hong_shu/blogger` 请求超时 `error=timed out` 无响应，需超时重试+退避；author_to_works 边当前不可落地。
- **B站无作者接口**：集合内无 author_to_works 数据源，作者维度仅作标识（以 `mid` 为准，`uid` 恒为 0 弃用）。
- **公众号作者仅 biz**：search item 的 `biz/nick_name` 为空须从 url 正则抽 `__biz`；blogger 不可达、`account_info.publish_count=null` 无作品列表，author_to_works 走不通；整平台 `topic_list=null` 无 tag，video_to_hashtag 不可走。
- **抖音内容画像 404**：`/dou_yin/re_dian_bao/video_like_portrait` 实测 HTTP 404 Not Found，内容级人群画像不可用，需上游确认正确 path 或下线，游走层不要挂该边（账号级画像 `account_fans_portrait` 仍可用）。
- **youtube detail 无视频地址**：`/youtube/detail` 结构完整但 `video_url_list=[] / image_url_list=[]`，视频/图片文件不可经本平台接口直取，须另走字幕或其它通道。
- **github 非视频**：`/github/keyword` 搜的是代码仓库（repo），无 video 字段，不能复用视频字段口径；`topics` 即 tag（多数为空）。
