---
name: yichen-unified-search
description: 逸尘自用的统一网页与社交平台搜索编排器。用于关键词驱动的实时公共网页检索、并行批量搜索、金融/学术/法律/安全等垂直搜索，以及 GitHub、微信公众号、小红书、抖音、今日头条、Twitter/X、B站、YouTube、小宇宙等平台的公开内容发现；可对本次搜索所得候选做原文核验和轻量富化，并把不同后端结果统一交接为候选记录。AnySearch 负责公共网页、批量与垂直搜索，平台原生/OpenCLI 只作对应平台适配器。不用于读取或下载用户直接给出的已知 URL、URL 文件或已确认候选；此类任务使用 yichen-content-archive。
---

# 逸尘统一搜索

把搜索拆成“定范围 → 选后端 → 取候选 → 标准化 → 核验”。只编排现有工具，不复制搜索、抓取或登录实现。

## 固定边界

1. 只搜索和读取用户当轮目标所需的公开内容；不发帖、不评论、不点赞、不关注、不私信、不改变账号状态。
2. 绝对不得操控微信桌面端或移动端 UI。微信公众号只走匿名公共搜索；需要公众号后台或非公开数据时停止并说明此 Skill 不处理。
3. 不读取、同步或搜索私人收藏、书签、个人 Feed、群组、通知、私信、草稿或后台数据。
4. 不下载媒体、不归档、不建立长期数据库、不运行定时监控。用户要读取、下载、转写或归档已审核 URL 清单时，交给 `$yichen-content-archive` 并重新确认动作与范围。
5. 不绕过验证码、登录墙、限流或风控。缺失字段写 `null`，零结果只表示本次后端未返回候选。
6. 用户直接给出已知 URL、URL 文件，或要求读取/下载/归档已确认候选时，停止搜索并交给 `$yichen-content-archive`。只有用户明确要求“搜索引用、讨论或关联这个 URL 的其他公开内容”时，才把 URL 标记为 `--input-kind url-seed`；该模式只把 URL 当发现线索，不读取或归档 URL 本身。
7. 搜索词、候选核验 URL 和垂直参数会发给 AnySearch。不得提交密码、Cookie、个人数据、商业秘密或其他敏感查询。

## 路由

先运行离线路由器检查计划；它不联网，也不执行后端：

```bash
python3 ~/.agents/skills/yichen-unified-search/scripts/route_search.py \
  --query "检索词" --platform auto --mode search --limit 10
```

把 URL 当作公开搜索种子而不是已知内容读取时，必须显式标记：

```bash
python3 ~/.agents/skills/yichen-unified-search/scripts/route_search.py \
  --query "搜索引用 https://example.com/research 的公开报道" \
  --platform web --input-kind url-seed --limit 10
```

按以下优先级执行：

1. 明确要求公共网页、新闻、多个独立关键词、`site:` 查询或垂直领域发现时，使用 AnySearch。
2. 垂直领域先执行 AnySearch `get_sub_domains`，再带齐所有必填参数搜索；不确定是否垂直时，用 `batch_search` 并行一条通用查询和若干垂直查询。
3. 明确要求某平台的站内/原生覆盖时，才使用该平台适配器。不要把平台适配器当成通用网页兜底。
4. 明确要求批量跨关键词时，优先使用 AnySearch；平台限定批量改成公共 `site:` 查询，并标明它不是站内全量结果。
5. 只有需要核验或轻量富化本次搜索刚返回的候选时，才对该候选使用 AnySearch `extract`。不得用它读取用户直接给出的已知 URL。
6. AnySearch 不可用时说明错误；只有用户同意后才改用其他公共网页搜索。不要静默切换到读取账号登录态的后端。

完整后端、命令形状和登录门槛见 [references/routes.md](references/routes.md)。

## 登录与安全门

- 小红书、抖音站内搜索：执行前说明平台、原始关键词和预计条数，取得用户当轮明确授权读取 Chrome 登录态；一次授权不扩展到其他关键词、平台或后续任务。
- Twitter/X：先检查 Grok CLI OAuth；已登录时优先使用 `$yichen-grok-consult`。若主路由不可用，可按 OpenCLI → xreach 的只读顺序回退；进入浏览器登录态适配器前必须按对应工具提示取得当轮授权。认证失败、401/403 或权限错误时停止，不得改读其他私人状态。
- B站、YouTube、微信、今日头条和小宇宙公共发现：先匿名。出现登录限定时停止；本 Skill 不升级为登录读取。
- AnySearch API Key：匿名额度可直接使用。收到新 Key 时先询问，用户明确同意后才能保存；不要让用户在聊天中粘贴 Key。

## 标准流程

1. 复述范围：关键词、平台、时间范围、条数、是否需要原生站内覆盖。
2. 运行 `route_search.py`；检查 `status`、`authorization`、`steps` 和 `limitations`。
3. 多后端或登录态任务直接运行 `python3 ~/.agents/skills/yichen-web-research/scripts/doctor_yichen.py`，不要回调总路由 Skill；OpenCLI 路线再运行 `opencli doctor`。只把真实体检结果视为可用性，不把命令存在当成可用。
4. 仅调用计划中的既有后端。AnySearch 从 `~/.agents/skills/anysearch/runtime.conf` 读取当前 `Command`，不要复制 CLI，也不要硬编码代理或 Key。
5. 把每个后端输出映射到 [references/candidate-schema.md](references/candidate-schema.md)；保持原始 URL、来源平台、后端和限制。
6. 先 URL 去重，再按标题/作者/发布时间做近重复合并；不要把互动量当成事实正确性。
7. 对最终将引用的本轮搜索候选，可用 AnySearch `extract` 打开原文核验或补少量正文线索。搜索卡片和摘要只能作发现线索；不要把核验扩展成下载或归档。
8. 交付候选与覆盖说明；标明每个平台的登录态使用、失败、截断、时间筛选和索引局限。

## 最小交付

返回一个候选交接包：

```json
{
  "schema_version": "1.0",
  "request": {},
  "routes": [],
  "candidates": [],
  "coverage": [],
  "errors": []
}
```

若用户只要答案，可用 Markdown 展示精选候选，但内部仍保留同一字段语义。不要把候选列表冒充完整、穷尽或已核验事实。
