## Before / After
| 环节 | Before | After |
|---|---|---|
| 路由 | 看到“Google 搜索/社媒采集”就直接跑 actor | 先查 `actors.health.json`,确认 actor 是否仍推荐、是否需要付费 plan、最近一次 canary 是否通过 |
| 输入 | runner 内置一份静态 payload,schema 变了才在任务中 400 | `--validate-input` 先用最小 payload 做 schema canary,失败时直接报出字段差异和 fallback |
| 成本 | 只靠人工记得小 limit | `--max-usd 0.20 --min-items 10` 作为默认闸门,超过成本或低质量直接停止 |
| 结果质量 | `SUCCEEDED` 就默认可用 | 同时检查 items 数、placeholder/noResults/demo、dataset 为空、核心字段缺失 |
### 思维实验
用户说:“去 X 和 Google 找 OpenClaw 微信插件的最新资料。”
旧流程:crawl-hub 直接调用 Google Search actor,actor 因 `queries must be string` 报 400;临时改 web search,最后在结论里补一句“schema 不一致”。
新流程:
```bash
python3 .agents/skills/crawl-hub/scripts/crawl_hub.py --source google-search --query "OpenClaw 微信插件" --limit 10 --canary --max-usd 0.10
```
runner 先读取健康表,发现 `google-search` 最近 canary 失败;它不会烧钱启动正式 run,而是输出:
```text
source=google-search
status=CANARY_FAILED
reason=input_schema_mismatch
last_error=queries must be string
fallback=web_search_official_sources
```
然后任务直接转到稳定 fallback,并把这次失败写回健康表。下一次同类研究不需要重复踩同一个坑。