Handle tasks in the order of "determine scope → offline routing → execute candidate searches → standardization and verification". Preserve user-specified platforms, keywords, and time; do not treat candidates as verified facts.
Fixed Boundaries
- Only process public content required for the current round's objective. Do not post, comment, like, follow, send direct messages, or change account status; do not read, sync, or search private collections, bookmarks, personal feeds, groups, notifications, direct messages, drafts, or backends.
- Absolutely do not manipulate WeChat desktop or mobile UI. For official accounts, only use anonymous public search.
- Do not download media, do not archive, do not build long-term databases, and do not run scheduled monitoring. When the user provides a known URL, a URL file, or requests reading/downloading/archiving of a confirmed candidate, hand it over to
$yichen-content-archive, pass the action, scope, and output location, and reconfirm the action and scope; searching does not grant download, private-domain, login-state, or cost permissions. - Do not bypass CAPTCHAs, login walls, or risk controls. Do not escalate account access beyond the read-only login-state routes explicitly listed below. Report backend failures separately from zero results; for unknown fields retain
null。 - Queries and candidate URLs will be sent to the services specified by the plan. Must not contain passwords, cookies, personal data, trade secrets, or other sensitive content; for credential handling and the data flows of each service, see Access and Credential Boundaries。
Offline Routing
Below, SKILL_DIR means the installation directory of this Skill,YICHEN_SKILLS_ROOT means the sibling Skills root directory; before use, set and export these two variables according to the actual installation location.
python3 "${SKILL_DIR}/scripts/route_search.py" \
--query "检索词" --platform auto --mode search --limit 10
The router does not go online. Before execution, check status、authorization、steps and limitations。invalid_request has no executable steps, and the CLI exit code is 2; adjust parameters within the authorized scope according to the prompt, and do not treat it as a zero result. When the scope is clear, execute directly and do not require the user to reconfirm item by item.
| Objective | Route and Usage |
|---|---|
| General web pages, concepts/tutorials, batch keywords, vertical domains | AnySearch;anysearch_adapter.py Output a unified envelope; for vertical domains, first discover subdomains and all required parameters |
| AI topics with news/latest/release intent | AI HOT selection; use the daily report only when "daily report" is explicit, and use the full volume only when "all" is explicit |
| Specified platform on-site search | Platform intent takes precedence over AI HOT; use the platform adapters in the plan |
| Multiple platforms or multiple keywords | Each original query must have an execution or split record and must not be discarded; different platform intents return query_routes, split by platform and explicitly pass --platform |
| Public site link enumeration | Only explicit --mode site-map; Firecrawl returns at most 100 same-origin candidates within the seed path scope, without reading the body text |
| Verification of candidates obtained in this search | Default AnySearch; use Firecrawl only when --verify-backend firecrawl is explicit |
"Weibo company financial reports" is the search target, not the same as searching within Weibo. When automatic identification is ambiguous, directly and explicitly select the platform based on the current task; only ask when the user's intent cannot be determined. Ordinary issue does not trigger the GitHub route.
- The native
searchof YouTube, GitHub, Bilibili, WeChat Official Accounts, Xiaohongshu, Douyin, Toutiao, and Xiaoyuzhou accepts only one query at a time; multiple queries should be run separately, or explicitly selectbatchto use the publicsite:index. Zhihu and Weibo have their own explicit native batch; X Quick supports repeated--query. For specific capabilities, see routing contract; single-query limits are concentrated inscripts/search_policy.py。 - AI HOT items are at most 7 days; the router checks both natural language and explicit
--days, with the latter taking priority. Automatic requests beyond the range go to AnySearch; explicit AI HOT reports a range error. Multiple topics are at most 5; the adapter retrieves them separately, merges and deduplicates, and recordsmatched_topicsand per-topic coverage. Insufficient quantity or topic failure must be delivered truthfully. Dates, daily reports, and rolling windows are different; strict time tasks also require checking the original text's time. - The AnySearch general route does not directly implement
--days; the time range must be retained in the query, and dates must be checked before delivery. Switching a long window to AnySearch does not mean deterministic date filtering has been completed. - A URL serves as
--input-kind url-seedonly when the user explicitly requests searching for its citations/discussions; the seed itself is not read. Site Map and explicit YouTube channel browsing are exceptions as discovery containers; ordinary known URLs are still handed to the archiving layer.
Execution and Verification
- According to the route, read the parameters and limits of the corresponding backend in references/routes.md ; do not load all platform details by default. For X, multi-backend, or logged-in-state routes, first run
${YICHEN_SKILLS_ROOT}/yichen-web-research/scripts/doctor_yichen.py; for OpenCLI routes, then runopencli doctor. The existence of a command does not mean it is available; do not call back the general routing Skill. - Execute only the backends in the plan. AnySearch uses
anysearch_adapter.py(reads the existing runtime.conf), AI HOT usesaihot_search.py, Zhihu useszhihu_adapter.py search|hot, Weibo usesweibo_adapter.py search --session-mode auto, YouTube usesyoutube_search.py; do not copy the CLI, hard-code proxies or Keys. - Report an error when AI HOT, AnySearch, or explicit Firecrawl is unavailable; switch to a public web backend only after the user agrees. Existing explicit logged-in-state exceptions are in the next section; do not expand the exceptions.
- According to candidate-schema.md , hand over candidates, routes, coverage, and errors. Non-empty raw results that cannot be parsed must be recorded as errors; retain the real backend, original URL, time limits, and logged-in state. AI HOT abnormal entries count toward rejected_count; all abnormal is failed, partially abnormal is partial, and it must not be passed off as a successful zero-result.
- X is deduplicated by tweet_id, then by canonical URL; other platforms are deduplicated by URL, and the matching query and source are retained. Near-duplicates are merged only when the title/author/time are all highly consistent; interaction counts cannot prove facts.
- Search cards and AI HOT's AI summaries are only clues. Before final citation, open the original text to verify the specific claims. This round of AnySearch verification must provide
anysearch_adapter.py verify --candidate-from-searchwith the complete candidate JSON carrying a valid HMAC receipt or@file; when Firecrawl is explicitly selected, hand it tofirecrawl_adapter.py scrape. Bare URLs or self-assembled candidates are not accepted, and opening the page itself does not equal fact verification.
Logged-in State and X Research
- Xiaohongshu, Douyin: allow bounded public read-only search to automatically reuse the existing Chrome session; background temporary sessions, one keyword at a time, serial with an interval of at least 5 seconds, and at most 20/30 items per single run respectively. Do not copy or output Cookies.
- Weibo: temporary anonymous guest session takes priority; only after access-gate failure automatically execute one bounded OpenCLI read-only search; network errors do not trigger fallback. At most 3 pages and at most 20 items each time, at most 5 batches with a serial interval of at least 5 seconds.
- Zhihu only uses the separately installed Open Platform CLI compatible runtime and its Keychain, and does not receive Secrets. Bilibili, YouTube, WeChat Official Accounts, Toutiao, and Xiaoyuzhou are anonymous first, and stop when login is required.
- X always first uses official Grok CLI OAuth + native
x_search. Only when the quota is explicitly exhausted may it switch to FxTwitter; only if that subsequently fails or returns zero results does it enter OpenCLI → xreach, and before using the browser login state obtain authorization for the current round as required by the tool. Not logged in, 401/403, timeout, network, service errors, and zero results from the main chain cannot be treated as quota exhaustion. - X Quick is called independently for each query, at most 20 items per single run, 1–7 days.
--depth researchAt least 3 independent focused queries; only execute the current ready wave, and only after normalization and merging unlock subsequent waves. At most 40 outer searches, at most one round of supplementary search, and stop when the target is reached, the budget is exhausted, there is no gap, the supplementary search adds nothing new, or the main chain has a non-quota failure. See the X section of the routing contract for details. - Every Grok output must pass through
grok_x_result_adapter.py, map only<x_post_time_verification>.matched, excludeexcluded_outside_window, then usex_research_merge.py。Grokcriteriais only a retrieval constraint; author, language, interaction thresholds, and repost/comment types are filtered only on actual structured fields, and when missing remain unknown, and cannot be claimed as verified.
X's browser fallback is disabled by default. Only after obtaining explicit authorization for the current round pass --login-approved; the router sets allow_authenticated_fallback=trueaccordingly, and keeps it false when unauthorized. The Zhihu route uses zhihu-open-platform-cli, accesses public content with Keychain authentication and marks authenticated_public / login_state_used=true; it does not endorse as an official identity.
Deliver
Return {schema_version, request, routes, candidates, coverage, errors}. When the user only wants the answer, display selected results in Markdown, preserving the same field semantics. Explain each platform's coverage, failures, truncation, date, and login-state limitations, and do not claim exhaustiveness or treat candidates as facts. Upstream license see THIRD_PARTY_NOTICES.md。