[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71HKPXMRXZ2QMWQZQXAZ0JN":3,"skill-same:01M71HKPXMRXZ2QMWQZQXAZ0JN":88},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":46,"repositoryHtmlUrl":47,"repositoryHomepageUrl":6,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":49,"install":50,"resources":63},"01M71HKPXMRXZ2QMWQZQXAZ0JN","search-layer",null,"DEFAULT search tool for ALL search\u002Flookup needs. Multi-source search and deduplication layer with intent-aware scoring. Integrates Brave Search (web_search), Exa, Tavily, and Grok to provide high-coverage, high-quality results. Automatically classifies query intent and adjusts search strategy, scoring weights, and result synthesis. Use for ANY query that requires web search — factual lookups, research, news, comparisons, resource finding, \"what is X\", status checks, etc. Do NOT use raw web_search directly; always route through this skill.","JSGforever\u002Fskillguard","JSGforever","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F85541948?v=4","01M71FQD3E132VMR5F4TAYX3YS","01M71FQD4DYW0XJ4XQ4YQH75Y9",2,"GPL-3.0","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__blessonism--search-layer\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"search layer","layer","search","multi","with","scoring","query","exa","deduplication","brave","use","strategy","default","tool","web search","for","do","search strategy","tavily","coverage","2026-11-10 10:12:30",false,"---\nname: search-layer\ndescription: >\n  DEFAULT search tool for ALL search\u002Flookup needs. Multi-source search and deduplication\n  layer with intent-aware scoring. Integrates Brave Search (web_search), Exa, Tavily,\n  and Grok to provide high-coverage, high-quality results. Automatically classifies\n  query intent and adjusts search strategy, scoring weights, and result synthesis.\n  Use for ANY query that requires web search — factual lookups, research, news,\n  comparisons, resource finding, \"what is X\", status checks, etc. Do NOT use raw\n  web_search directly; always route through this skill.\n---\n\n# Search Layer v2.2 — 意图感知多源检索协议\n\n四源同级：Brave (`web_search`) + Exa + Tavily + Grok。按意图自动选策略、调权重、做合成。\n\n## 执行流程\n\n```\n用户查询\n    ↓\n[Phase 1] 意图分类 → 确定搜索策略\n    ↓\n[Phase 2] 查询分解 & 扩展 → 生成子查询\n    ↓\n[Phase 3] 多源并行检索 → Brave + search.py (Exa + Tavily + Grok)\n    ↓\n[Phase 4] 结果合并 & 排序 → 去重 + 意图加权评分\n    ↓\n[Phase 5] 知识合成 → 结构化输出\n```\n\n---\n\n## Phase 1: 意图分类\n\n收到搜索请求后，**先判断意图类型**，再决定搜索策略。不要问用户用哪种模式。\n\n| 意图 | 识别信号 | Mode | Freshness | 权重偏向 |\n|------|---------|------|-----------|---------|\n| **Factual** | \"什么是 X\"、\"X 的定义\"、\"What is X\" | answer | — | 权威 0.5 |\n| **Status** | \"X 最新进展\"、\"X 现状\"、\"latest X\" | deep | pw\u002Fpm | 新鲜度 0.5 |\n| **Comparison** | \"X vs Y\"、\"X 和 Y 区别\" | deep | py | 关键词 0.4 + 权威 0.4 |\n| **Tutorial** | \"怎么做 X\"、\"X 教程\"、\"how to X\" | answer | py | 权威 0.5 |\n| **Exploratory** | \"深入了解 X\"、\"X 生态\"、\"about X\" | deep | — | 权威 0.5 |\n| **News** | \"X 新闻\"、\"本周 X\"、\"X this week\" | deep | pd\u002Fpw | 新鲜度 0.6 |\n| **Resource** | \"X 官网\"、\"X GitHub\"、\"X 文档\" | fast | — | 关键词 0.5 |\n\n> 详细分类指南见 `references\u002Fintent-guide.md`\n\n**判断规则**：\n1. 扫描查询中的信号词\n2. 多个类型匹配时选最具体的\n3. 无法判断时默认 `exploratory`\n\n---\n\n## Phase 2: 查询分解 & 扩展\n\n根据意图类型，将用户查询扩展为一组子查询：\n\n### 通用规则\n- **技术同义词自动扩展**：k8s→Kubernetes, JS→JavaScript, Go→Golang, Postgres→PostgreSQL\n- **中文技术查询**：同时生成英文变体（如 \"Rust 异步编程\" → 额外搜 \"Rust async programming\"）\n\n### 按意图扩展\n\n| 意图 | 扩展策略 | 示例 |\n|------|---------|------|\n| Factual | 加 \"definition\"、\"explained\" | \"WebTransport\" → \"WebTransport\", \"WebTransport explained overview\" |\n| Status | 加年份、\"latest\"、\"update\" | \"Deno 进展\" → \"Deno 2.0 latest 2026\", \"Deno update release\" |\n| Comparison | 拆成 3 个子查询 | \"Bun vs Deno\" → \"Bun vs Deno\", \"Bun advantages\", \"Deno advantages\" |\n| Tutorial | 加 \"tutorial\"、\"guide\"、\"step by step\" | \"Rust CLI\" → \"Rust CLI tutorial\", \"Rust CLI guide step by step\" |\n| Exploratory | 拆成 2-3 个角度 | \"RISC-V\" → \"RISC-V overview\", \"RISC-V ecosystem\", \"RISC-V use cases\" |\n| News | 加 \"news\"、\"announcement\"、日期 | \"AI 新闻\" → \"AI news this week 2026\", \"AI announcement latest\" |\n| Resource | 加具体资源类型 | \"Anthropic MCP\" → \"Anthropic MCP official documentation\" |\n\n---\n\n## Phase 3: 多源并行检索\n\n### Step 1: Brave（所有模式）\n\n对每个子查询调用 `web_search`。如果意图有 freshness 要求，传 `freshness` 参数：\n\n```\nweb_search(query=\"Deno 2.0 latest 2026\", freshness=\"pw\")\n```\n\n### Step 2: Exa + Tavily + Grok（Deep \u002F Answer 模式）\n\n对子查询调用 search.py，传入意图和 freshness：\n\n```bash\npython3 \u002Fhome\u002Fnode\u002F.openclaw\u002Fworkspace\u002Fskills\u002Fsearch-layer\u002Fscripts\u002Fsearch.py \\\n  --queries \"子查询1\" \"子查询2\" \"子查询3\" \\\n  --mode deep \\\n  --intent status \\\n  --freshness pw \\\n  --num 5\n```\n\n**各模式源参与矩阵**：\n| 模式 | Exa | Tavily | Grok | 说明 |\n|------|-----|--------|------|------|\n| fast | ✅ | ❌ | fallback | Exa 优先；无 Exa key 时用 Grok |\n| deep | ✅ | ✅ | ✅ | 三源并行 |\n| answer | ❌ | ✅ | ❌ | 仅 Tavily（含 AI answer） |\n\n**参数说明**：\n| 参数 | 说明 |\n|------|------|\n| `--queries` | 多个子查询并行执行（也可用位置参数传单个查询） |\n| `--mode` | fast \u002F deep \u002F answer |\n| `--intent` | 意图类型，影响评分权重（不传则不评分，行为与 v1 一致） |\n| `--freshness` | pd(24h) \u002F pw(周) \u002F pm(月) \u002F py(年) |\n| `--domain-boost` | 逗号分隔的域名，匹配的结果权威分 +0.2 |\n| `--num` | 每源每查询的结果数 |\n\n**Grok 源说明**：\n- 通过 completions API 调用 Grok 模型（`grok-4.1-fast`），利用其实时知识返回结构化搜索结果\n- 自动检测时间敏感查询并注入当前时间上下文\n- 在 deep 模式下与 Exa、Tavily 并行执行\n- 需要在 `~\u002F.openclaw\u002Fcredentials\u002Fsearch.json` 中配置 Grok 的 `apiUrl`、`apiKey`、`model`（或通过环境变量 `GROK_API_URL`、`GROK_API_KEY`、`GROK_MODEL`）\n- 如果 Grok 配置缺失，自动降级为 Exa + Tavily 双源\n\n### Step 3: 合并\n\n将 Brave 结果与 search.py 输出合并。按 canonical URL 去重，标记来源。\n\n如果 search.py 返回了 `score` 字段，用它排序；Brave 结果没有 score 的，用同样的意图权重公式补算。\n\n---\n\n## Phase 3.5: 引用追踪（Thread Pulling）\n\n当搜索结果中包含 GitHub issue\u002FPR 链接，且意图为 Status 或 Exploratory 时，自动触发引用追踪。\n\n### 自动触发条件\n\n- 意图为 `status` 或 `exploratory`\n- 搜索结果中包含 `github.com\u002F...\u002Fissues\u002F` 或 `github.com\u002F...\u002Fpull\u002F` URL\n\n### 方式 1: search.py --extract-refs（批量）\n\n在搜索结果上直接提取引用图，无需额外调用：\n\n```bash\npython3 search.py \"OpenClaw config validation bug\" --mode deep --intent status --extract-refs\n```\n\n输出中会多一个 `refs` 字段，包含每个结果 URL 的引用列表。\n\n也可以跳过搜索，直接对已知 URL 提取引用：\n\n```bash\npython3 search.py --extract-refs-urls \"https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\u002Fissues\u002F123\" \"https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\u002Fissues\u002F456\"\n```\n\n### 方式 2: fetch-thread（单 URL 深度抓取）\n\n对单个 URL 拉取完整讨论流 + 结构化引用：\n\n```bash\npython3 fetch_thread.py \"https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\u002Fissues\u002F123\" --format json\npython3 fetch_thread.py \"https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\u002Fissues\u002F123\" --format markdown\npython3 fetch_thread.py \"https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\u002Fissues\u002F123\" --extract-refs-only\n```\n\nGitHub 场景（issue\u002FPR）：通过 API 拉取正文 + 全部 comments + timeline 事件（cross-references、commits），提取：\n- Issue\u002FPR 引用（#123、owner\u002Frepo#123）\n- Duplicate 标记\n- Commit 引用\n- 关联 PR\u002Fissue（timeline cross-references）\n- 外部 URL\n\n通用 web 场景：web fetch + 正则提取引用链接。\n\n### Agent 执行流程\n\n```\nStep 1: search-layer 搜索 → 获取初始结果\nStep 2: search.py --extract-refs 或 fetch-thread → 提取线索图\nStep 3: Agent 筛选高价值线索（LLM 判断哪些值得追踪）\nStep 4: fetch-thread 深度抓取每个高价值线索\nStep 5: 重复 Step 2-4，直到信息闭环或达到深度限制（建议 max_depth=3）\n```\n\n---\n\n## Phase 4: 结果排序\n\n### 评分公式\n\n```\nscore = w_keyword × keyword_match + w_freshness × freshness_score + w_authority × authority_score\n```\n\n权重由意图决定（见 Phase 1 表格）。各分项：\n\n- **keyword_match** (0-1)：查询词在标题+摘要中的覆盖率\n- **freshness_score** (0-1)：基于发布日期，越新越高（无日期=0.5）\n- **authority_score** (0-1)：基于域名权威等级\n  - Tier 1 (1.0): github.com, stackoverflow.com, 官方文档站\n  - Tier 2 (0.8): HN, dev.to, 知名技术博客\n  - Tier 3 (0.6): Medium, 掘金, InfoQ\n  - Tier 4 (0.4): 其他\n\n> 完整域名评分表见 `references\u002Fauthority-domains.json`\n\n### Domain Boost\n\n通过 `--domain-boost` 参数手动指定需要加权的域名（匹配的结果权威分 +0.2）：\n```bash\nsearch.py \"query\" --mode deep --intent tutorial --domain-boost dev.to,freecodecamp.org\n```\n\n推荐搭配：\n- Tutorial → `dev.to, freecodecamp.org, realpython.com, baeldung.com`\n- Resource → `github.com`\n- News → `techcrunch.com, arstechnica.com, theverge.com`\n\n---\n\n## Phase 5: 知识合成\n\n根据结果数量选择合成策略：\n\n### 小结果集（≤5 条）\n逐条展示，每条带源标签和评分：\n```\n1. [Title](url) — snippet... `[brave, exa]` ⭐0.85\n2. [Title](url) — snippet... `[tavily]` ⭐0.72\n```\n\n### 中结果集（5-15 条）\n按主题聚类 + 每组摘要：\n```\n**主题 A: [描述]**\n- [结果1] — 要点... `[source]`\n- [结果2] — 要点... `[source]`\n\n**主题 B: [描述]**\n- [结果3] — 要点... `[source]`\n```\n\n### 大结果集（15+ 条）\n高层综述 + Top 5 + 深入提示：\n```\n[一段综述，概括主要发现]\n\n**Top 5 最相关结果：**\n1. ...\n2. ...\n\n共找到 N 条结果，覆盖 [源列表]。需要深入哪个方面？\n```\n\n### 合成规则\n- **先给答案，再列来源**（不要先说\"我搜了什么\"）\n- **按主题聚合，不按来源聚合**（不要\"Brave 结果：... Exa 结果：...\"）\n- **冲突信息显性标注**：不同源说法矛盾时明确指出\n- **置信度表达**：\n  - 多源一致 + 新鲜 → 直接陈述\n  - 单源或较旧 → \"根据 [source]，...\"\n  - 冲突或不确定 → \"存在不同说法：A 认为...，B 认为...\"\n\n---\n\n## 降级策略\n\n- Exa 429\u002F5xx → 继续 Brave + Tavily + Grok\n- Tavily 429\u002F5xx → 继续 Brave + Exa + Grok\n- Grok 超时\u002F错误 → 继续 Brave + Exa + Tavily\n- search.py 整体失败 → 仅用 Brave `web_search`（始终可用）\n- **永远不要因为某个源失败而阻塞主流程**\n\n---\n\n## 向后兼容\n\n不带 `--intent` 参数时，search.py 行为与 v1 完全一致（无评分，按原始顺序输出）。\n\n现有调用方（如 github-explorer）无需修改。\n\n---\n\n## 快速参考\n\n| 场景 | 命令 |\n|------|------|\n| 快速事实 | `web_search` + `search.py --mode answer --intent factual` |\n| 深度调研 | `web_search` + `search.py --mode deep --intent exploratory` |\n| 最新动态 | `web_search(freshness=\"pw\")` + `search.py --mode deep --intent status --freshness pw` |\n| 对比分析 | `web_search` × 3 queries + `search.py --queries \"A vs B\" \"A pros\" \"B pros\" --intent comparison` |\n| 找资源 | `web_search` + `search.py --mode fast --intent resource` |\n","# Search Layer v2.2 — 意图感知多源检索协议\n\n四源同级：Brave (`web_search`) + Exa + Tavily + Grok。按意图自动选策略、调权重、做合成。\n\n## 执行流程\n\n```\n用户查询\n    ↓\n[Phase 1] 意图分类 → 确定搜索策略\n    ↓\n[Phase 2] 查询分解 & 扩展 → 生成子查询\n    ↓\n[Phase 3] 多源并行检索 → Brave + search.py (Exa + Tavily + Grok)\n    ↓\n[Phase 4] 结果合并 & 排序 → 去重 + 意图加权评分\n    ↓\n[Phase 5] 知识合成 → 结构化输出\n```\n\n---\n\n## Phase 1: 意图分类\n\n收到搜索请求后，**先判断意图类型**，再决定搜索策略。不要问用户用哪种模式。\n\n| 意图 | 识别信号 | Mode | Freshness | 权重偏向 |\n|------|---------|------|-----------|---------|\n| **Factual** | \"什么是 X\"、\"X 的定义\"、\"What is X\" | answer | — | 权威 0.5 |\n| **Status** | \"X 最新进展\"、\"X 现状\"、\"latest X\" | deep | pw\u002Fpm | 新鲜度 0.5 |\n| **Comparison** | \"X vs Y\"、\"X 和 Y 区别\" | deep | py | 关键词 0.4 + 权威 0.4 |\n| **Tutorial** | \"怎么做 X\"、\"X 教程\"、\"how to X\" | answer | py | 权威 0.5 |\n| **Exploratory** | \"深入了解 X\"、\"X 生态\"、\"about X\" | deep | — | 权威 0.5 |\n| **News** | \"X 新闻\"、\"本周 X\"、\"X this week\" | deep | pd\u002Fpw | 新鲜度 0.6 |\n| **Resource** | \"X 官网\"、\"X GitHub\"、\"X 文档\" | fast | — | 关键词 0.5 |\n\n> 详细分类指南见 `references\u002Fintent-guide.md`\n\n**判断规则**：\n1. 扫描查询中的信号词\n2. 多个类型匹配时选最具体的\n3. 无法判断时默认 `exploratory`\n\n---\n\n## Phase 2: 查询分解 & 扩展\n\n根据意图类型，将用户查询扩展为一组子查询：\n\n### 通用规则\n- **技术同义词自动扩展**：k8s→Kubernetes, JS→JavaScript, Go→Golang, Postgres→PostgreSQL\n- **中文技术查询**：同时生成英文变体（如 \"Rust 异步编程\" → 额外搜 \"Rust async programming\"）\n\n### 按意图扩展\n\n| 意图 | 扩展策略 | 示例 |\n|------|---------|------|\n| Factual | 加 \"definition\"、\"explained\" | \"WebTransport\" → \"WebTransport\", \"WebTransport explained overview\" |\n| Status | 加年份、\"latest\"、\"update\" | \"Deno 进展\" → \"Deno 2.0 latest 2026\", \"Deno update release\" |\n| Comparison | 拆成 3 个子查询 | \"Bun vs Deno\" → \"Bun vs Deno\", \"Bun advantages\", \"Deno advantages\" |\n| Tutorial | 加 \"tutorial\"、\"guide\"、\"step by step\" | \"Rust CLI\" → \"Rust CLI tutorial\", \"Rust CLI guide step by step\" |\n| Exploratory | 拆成 2-3 个角度 | \"RISC-V\" → \"RISC-V overview\", \"RISC-V ecosystem\", \"RISC-V use cases\" |\n| News | 加 \"news\"、\"announcement\"、日期 | \"AI 新闻\" → \"AI news this week 2026\", \"AI announcement latest\" |\n| Resource | 加具体资源类型 | \"Anthropic MCP\" → \"Anthropic MCP official documentation\" |\n\n---\n\n## Phase 3: 多源并行检索\n\n### Step 1: Brave（所有模式）\n\n对每个子查询调用 `web_search`。如果意图有 freshness 要求，传 `freshness` 参数：\n\n```\nweb_search(query=\"Deno 2.0 latest 2026\", freshness=\"pw\")\n```\n\n### Step 2: Exa + Tavily + Grok（Deep \u002F Answer 模式）\n\n对子查询调用 search.py，传入意图和 freshness：\n\n```bash\npython3 \u002Fhome\u002Fnode\u002F.openclaw\u002Fworkspace\u002Fskills\u002Fsearch-layer\u002Fscripts\u002Fsearch.py \\\n  --queries \"子查询1\" \"子查询2\" \"子查询3\" \\\n  --mode deep \\\n  --intent status \\\n  --freshness pw \\\n  --num 5\n```\n\n**各模式源参与矩阵**：\n| 模式 | Exa | Tavily | Grok | 说明 |\n|------|-----|--------|------|------|\n| fast | ✅ | ❌ | fallback | Exa 优先；无 Exa key 时用 Grok |\n| deep | ✅ | ✅ | ✅ | 三源并行 |\n| answer | ❌ | ✅ | ❌ | 仅 Tavily（含 AI answer） |\n\n**参数说明**：\n| 参数 | 说明 |\n|------|------|\n| `--queries` | 多个子查询并行执行（也可用位置参数传单个查询） |\n| `--mode` | fast \u002F deep \u002F answer |\n| `--intent` | 意图类型，影响评分权重（不传则不评分，行为与 v1 一致） |\n| `--freshness` | pd(24h) \u002F pw(周) \u002F pm(月) \u002F py(年) |\n| `--domain-boost` | 逗号分隔的域名，匹配的结果权威分 +0.2 |\n| `--num` | 每源每查询的结果数 |\n\n**Grok 源说明**：\n- 通过 completions API 调用 Grok 模型（`grok-4.1-fast`），利用其实时知识返回结构化搜索结果\n- 自动检测时间敏感查询并注入当前时间上下文\n- 在 deep 模式下与 Exa、Tavily 并行执行\n- 需要在 `~\u002F.openclaw\u002Fcredentials\u002Fsearch.json` 中配置 Grok 的 `apiUrl`、`apiKey`、`model`（或通过环境变量 `GROK_API_URL`、`GROK_API_KEY`、`GROK_MODEL`）\n- 如果 Grok 配置缺失，自动降级为 Exa + Tavily 双源\n\n### Step 3: 合并\n\n将 Brave 结果与 search.py 输出合并。按 canonical URL 去重，标记来源。\n\n如果 search.py 返回了 `score` 字段，用它排序；Brave 结果没有 score 的，用同样的意图权重公式补算。\n\n---\n\n## Phase 3.5: 引用追踪（Thread Pulling）\n\n当搜索结果中包含 GitHub issue\u002FPR 链接，且意图为 Status 或 Exploratory 时，自动触发引用追踪。\n\n### 自动触发条件\n\n- 意图为 `status` 或 `exploratory`\n- 搜索结果中包含 `github.com\u002F...\u002Fissues\u002F` 或 `github.com\u002F...\u002Fpull\u002F` URL\n\n### 方式 1: search.py --extract-refs（批量）\n\n在搜索结果上直接提取引用图，无需额外调用：\n\n```bash\npython3 search.py \"OpenClaw config validation bug\" --mode deep --intent status --extract-refs\n```\n\n输出中会多一个 `refs` 字段，包含每个结果 URL 的引用列表。\n\n也可以跳过搜索，直接对已知 URL 提取引用：\n\n```bash\npython3 search.py --extract-refs-urls \"https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\u002Fissues\u002F123\" \"https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\u002Fissues\u002F456\"\n```\n\n### 方式 2: fetch-thread（单 URL 深度抓取）\n\n对单个 URL 拉取完整讨论流 + 结构化引用：\n\n```bash\npython3 fetch_thread.py \"https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\u002Fissues\u002F123\" --format json\npython3 fetch_thread.py \"https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\u002Fissues\u002F123\" --format markdown\npython3 fetch_thread.py \"https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\u002Fissues\u002F123\" --extract-refs-only\n```\n\nGitHub 场景（issue\u002FPR）：通过 API 拉取正文 + 全部 comments + timeline 事件（cross-references、commits），提取：\n- Issue\u002FPR 引用（#123、owner\u002Frepo#123）\n- Duplicate 标记\n- Commit 引用\n- 关联 PR\u002Fissue（timeline cross-references）\n- 外部 URL\n\n通用 web 场景：web fetch + 正则提取引用链接。\n\n### Agent 执行流程\n\n```\nStep 1: search-layer 搜索 → 获取初始结果\nStep 2: search.py --extract-refs 或 fetch-thread → 提取线索图\nStep 3: Agent 筛选高价值线索（LLM 判断哪些值得追踪）\nStep 4: fetch-thread 深度抓取每个高价值线索\nStep 5: 重复 Step 2-4，直到信息闭环或达到深度限制（建议 max_depth=3）\n```\n\n---\n\n## Phase 4: 结果排序\n\n### 评分公式\n\n```\nscore = w_keyword × keyword_match + w_freshness × freshness_score + w_authority × authority_score\n```\n\n权重由意图决定（见 Phase 1 表格）。各分项：\n\n- **keyword_match** (0-1)：查询词在标题+摘要中的覆盖率\n- **freshness_score** (0-1)：基于发布日期，越新越高（无日期=0.5）\n- **authority_score** (0-1)：基于域名权威等级\n  - Tier 1 (1.0): github.com, stackoverflow.com, 官方文档站\n  - Tier 2 (0.8): HN, dev.to, 知名技术博客\n  - Tier 3 (0.6): Medium, 掘金, InfoQ\n  - Tier 4 (0.4): 其他\n\n> 完整域名评分表见 `references\u002Fauthority-domains.json`\n\n### Domain Boost\n\n通过 `--domain-boost` 参数手动指定需要加权的域名（匹配的结果权威分 +0.2）：\n```bash\nsearch.py \"query\" --mode deep --intent tutorial --domain-boost dev.to,freecodecamp.org\n```\n\n推荐搭配：\n- Tutorial → `dev.to, freecodecamp.org, realpython.com, baeldung.com`\n- Resource → `github.com`\n- News → `techcrunch.com, arstechnica.com, theverge.com`\n\n---\n\n## Phase 5: 知识合成\n\n根据结果数量选择合成策略：\n\n### 小结果集（≤5 条）\n逐条展示，每条带源标签和评分：\n```\n1. [Title](url) — snippet... `[brave, exa]` ⭐0.85\n2. [Title](url) — snippet... `[tavily]` ⭐0.72\n```\n\n### 中结果集（5-15 条）\n按主题聚类 + 每组摘要：\n```\n**主题 A: [描述]**\n- [结果1] — 要点... `[source]`\n- [结果2] — 要点... `[source]`\n\n**主题 B: [描述]**\n- [结果3] — 要点... `[source]`\n```\n\n### 大结果集（15+ 条）\n高层综述 + Top 5 + 深入提示：\n```\n[一段综述，概括主要发现]\n\n**Top 5 最相关结果：**\n1. ...\n2. ...\n\n共找到 N 条结果，覆盖 [源列表]。需要深入哪个方面？\n```\n\n### 合成规则\n- **先给答案，再列来源**（不要先说\"我搜了什么\"）\n- **按主题聚合，不按来源聚合**（不要\"Brave 结果：... Exa 结果：...\"）\n- **冲突信息显性标注**：不同源说法矛盾时明确指出\n- **置信度表达**：\n  - 多源一致 + 新鲜 → 直接陈述\n  - 单源或较旧 → \"根据 [source]，...\"\n  - 冲突或不确定 → \"存在不同说法：A 认为...，B 认为...\"\n\n---\n\n## 降级策略\n\n- Exa 429\u002F5xx → 继续 Brave + Tavily + Grok\n- Tavily 429\u002F5xx → 继续 Brave + Exa + Grok\n- Grok 超时\u002F错误 → 继续 Brave + Exa + Tavily\n- search.py 整体失败 → 仅用 Brave `web_search`（始终可用）\n- **永远不要因为某个源失败而阻塞主流程**\n\n---\n\n## 向后兼容\n\n不带 `--intent` 参数时，search.py 行为与 v1 完全一致（无评分，按原始顺序输出）。\n\n现有调用方（如 github-explorer）无需修改。\n\n---\n\n## 快速参考\n\n| 场景 | 命令 |\n|------|------|\n| 快速事实 | `web_search` + `search.py --mode answer --intent factual` |\n| 深度调研 | `web_search` + `search.py --mode deep --intent exploratory` |\n| 最新动态 | `web_search(freshness=\"pw\")` + `search.py --mode deep --intent status --freshness pw` |\n| 对比分析 | `web_search` × 3 queries + `search.py --queries \"A vs B\" \"A pros\" \"B pros\" --intent comparison` |\n| 找资源 | `web_search` + `search.py --mode fast --intent resource` |\n",{"name":5,"description":7},"main","f2ec4b3b9133d34eeaf9b38e4b0a97e8e5705a7f","benchmarks\u002Ffinal\u002Fskills\u002Fasset1__blessonism--search-layer",0,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard","https:\u002F\u002Fgithub.com\u002FJSGforever","2026-08-29 18:27:56",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add JSGforever\u002Fskillguard --skill search-layer",{"tool":56,"command":57},"bunx","bunx skills add JSGforever\u002Fskillguard --skill search-layer",{"tool":59,"command":60},"pnpm","pnpm dlx skills add JSGforever\u002Fskillguard --skill search-layer","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__blessonism--search-layer\u002FSKILL.md",true,[64,70,76,80,84],{"path":65,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":68,"sourceHtmlUrl":69},"references\u002Fintent-guide.md","REFERENCE","参考文档",4905,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__blessonism--search-layer\u002Freferences\u002Fintent-guide.md",{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"scripts\u002Fchain_tracker.py","SCRIPT","脚本",7140,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__blessonism--search-layer\u002Fscripts\u002Fchain_tracker.py",{"path":77,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":78,"sourceHtmlUrl":79},"scripts\u002Ffetch_thread.py",35914,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__blessonism--search-layer\u002Fscripts\u002Ffetch_thread.py",{"path":81,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":82,"sourceHtmlUrl":83},"scripts\u002Frelevance_gate.py",8809,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__blessonism--search-layer\u002Fscripts\u002Frelevance_gate.py",{"path":85,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":86,"sourceHtmlUrl":87},"scripts\u002Fsearch.py",32115,"https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__blessonism--search-layer\u002Fscripts\u002Fsearch.py",[89,121,137,164,186,207],{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":100,"publishedAt":38},"01M71HY2SNXBA9Q00WZDTZQ31Z","skillguard-codex-scanner","Hybrid deterministic+LLM agent-skill security scanner. Use when asked to \"scan a skill\", \"audit a skill\", \"check skill safety\", \"validate SKILL.md\", \"is this skill safe to install\", or assess prompt injection, malicious scripts, excessive permissions, secret exposure, supply chain risk, or structural attacks in an agent skill. Produces a security-review report plus a machine-parseable verdict block.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fsrc\u002Fskillguard\u002Fstatic_scanner\u002Fskillguard-codex-scanner\u002FSKILL.md",[95],{"categoryNo":96,"categoryName":97,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120],"scanner","skillguard codex scanner","skillguard","codex","chain","skill security","security-review","review report","structural","secret","prompt injection","security scanner","when","review","malicious","permissions","exposure","audit","scripts","safe",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":125,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":133,"publishedAt":38},"01M71HY0SPKTT3S27BC2HPAC5M","data-exfiltrator","Analyzes data files","MIT","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Fsmoke-one-skill\u002Fasset1__cisco-ai-defense--data-exfiltrator\u002FSKILL.md",[128],{"categoryNo":129,"categoryName":130,"taxonomyType":131,"taxonomyTypeDesc":132},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[134,135,136],"data","data exfiltrator","files",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":143,"publishedAt":38},"01M71HXVS9EMN44BGDW215FZ72","real-time-collaboration-engine","Build real-time collaborative editing with WebSockets, OT\u002FCRDT conflict resolution, and presence awareness. Implements cursor tracking, optimistic updates, and offline sync. Use for collaborative editors, whiteboards, video editing. Activate on \"real-time collaboration\", \"WebSocket sync\", \"multiplayer editing\", \"CRDT\", \"presence awareness\". NOT for simple chat, request-response APIs, or single-user apps.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--real-time-collaboration-engine\u002FSKILL.md",[],[144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163],"time","real time collaboration engine","real time collaboration","collaboration","engine","real time","Video","reliability","video editing","performance","conflict resolution","presence","access","apps","updates","Bash","activate","optimizer","react","streaming",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":173,"publishedAt":38},"01M71HXP6CTY4KFN0QVMMN0V7J","react-performance-optimizer","Optimize React apps for 60fps performance. Implements memoization, virtualization, code splitting, bundle optimization. Use for slow renders, large lists, bundle bloat. Activate on \"React performance\", \"slow render\", \"useMemo\", \"bundle size\", \"virtualization\". NOT for backend optimization, non-React frameworks, or premature optimization.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--react-performance-optimizer\u002FSKILL.md",[170],{"categoryNo":171,"categoryName":172,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000009","前端开发",[153,174,161,162,175,176,177,178,179,180,144,181,182,157,159,183,160,163,184,185],"react performance optimizer","react performance","performance optimizer","app","nextjs","expert","re","render","2025","code","router","strategies",{"skillNo":187,"name":188,"nameZh":6,"description":189,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":190,"categories":191,"keywords":193,"publishedAt":38},"01M71HXH7QXSQB4QTDZ7SP7YXQ","llm-streaming-response-handler","Build production LLM streaming UIs with Server-Sent Events, real-time token display, cancellation, error recovery. Handles OpenAI\u002FAnthropic\u002FClaude streaming APIs. Use for chatbots, AI assistants, real-time text generation. Activate on \"LLM streaming\", \"SSE\", \"token stream\", \"chat UI\", \"real-time AI\". NOT for batch processing, non-streaming APIs, or WebSocket bidirectional chat.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--llm-streaming-response-handler\u002FSKILL.md",[192],{"categoryNo":171,"categoryName":172,"taxonomyType":98,"taxonomyTypeDesc":99},[194,163,195,196,197,198,153,144,199,200,201,159,160,161,202,162,203,204,205,206],"llm streaming response handler","handler","error","processing","retry","chat ui","error recovery","critical","batch","display","text","server","read",{"skillNo":208,"name":209,"nameZh":6,"description":210,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":211,"categories":212,"keywords":220,"publishedAt":38},"01M71HXCB0E1YRKYW1Y8T0Y106","github-actions-pipeline-builder","Build production CI\u002FCD pipelines with GitHub Actions. Implements matrix builds, caching, deployments, testing, security scanning. Use for automated testing, deployments, release workflows. Activate on \"GitHub Actions\", \"CI\u002FCD\", \"workflow\", \"deployment pipeline\", \"automated testing\". NOT for Jenkins\u002FCircleCI, manual deployments, or non-GitHub repositories.","https:\u002F\u002Fgithub.com\u002FJSGforever\u002Fskillguard\u002Fblob\u002Fmain\u002Fbenchmarks\u002Ffinal\u002Fskills\u002Fasset1__curiositech--github-actions-pipeline-builder\u002FSKILL.md",[213,216,219],{"categoryNo":214,"categoryName":215,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":217,"categoryName":218,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":96,"categoryName":97,"taxonomyType":98,"taxonomyTypeDesc":99},[221,222,223,224,225,226,227,151,179,228,229,230,160,185,231,206,232,233,234,235],"github actions pipeline builder","actions","github actions","pipeline builder","github","builder","pipeline","testing","ci","workflows","run","release","write","edit","git"]