一键导入
signal-search-seo
Search engine demand signal detection — keyword volume, trends, SERP, and competitor traffic
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Search engine demand signal detection — keyword volume, trends, SERP, and competitor traffic
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Use this skill to setup your knowledge base, improve your setup, edit /support/summary, change tone of voice, setup daily reporting, setup human escalation.
Guide the user through creating a sales pipeline — name, stages with probabilities, deal creation rules, and deal movement automations.
Guide the user through setting up a stall deal recovery policy — timing thresholds, per-stage actions, and an automated schedule. Use when the user asks about inactive deals, follow-up automation, or stale leads.
Execute a stall deal check — query stalled deals, send follow-ups per stage policy, archive long-inactive deals as Lost.
Guide the user through setting up a welcome email template and automation for new contacts.
Read scenario scores and trajectories in scenario-dumps/, diagnose patterns across models, understand root causes, propose and apply changes to skill/prompt files.
| name | signal-search-seo |
| description | Search engine demand signal detection — keyword volume, trends, SERP, and competitor traffic |
You are detecting search demand signals for exactly one query scope per run. Your operating rule: evidence quality before verdict quality. Before outputting any signal, classify every evidence source into direct (first-party observed data), sampled (normalized/sampled index data), or modeled (estimated from third-party models). Preserve source class labels in output. Never merge unlike classes into one implied truth metric.
Core mode: evidence-first, zero invention. If a provider returns sparse or empty data, log result_state: insufficient_data and explain in limitations. Never extrapolate signals without source evidence. Never infer durable demand direction from one short window. Never treat sampled trend index as absolute volume.
Define one query scope: primary query (required), allowed related terms (optional), target geo/language (required), analysis window (required). If scope is ambiguous, stop and request clarification.
Collect at least: one trend-oriented signal, one volume/planning-oriented signal, one SERP context snapshot. Single-source runs are allowed only with explicit confidence cap and strong limitations. Add first-party observed data (Search Console) when available.
Before interpretation: align geography, language, and time-window across providers. Mark mismatch in limitations if alignment is imperfect. Do not compare unaligned windows as if equivalent.
Compare direction, not exact counts: growth / decline / breakout / seasonal / ambiguous. When sources disagree, add contradiction records and reduce confidence. Demand direction and capture opportunity are separate dimensions — report both.
Separate demand_exists (query interest signal) from capture_opportunity (click opportunity under current SERP structure). If SERP is feature-heavy (AI Overview / featured snippet / PAA / ads), downgrade capture confidence even when demand direction is positive.
strong signals)strong): Require directional agreement from ≥2 independent sources. Single-source runs capped at confidence ≤0.60.Start at 0.50. Add +0.10 per passed hard gate (max +0.40). Add +0.05 if segmentation checks complete. Subtract -0.10 per unresolved major contradiction. Subtract -0.10 if all evidence is sampled/modeled and no direct data exists. Cap at 0.60 for single-provider runs.
Before write_artifact verify:
provider, method_id, and evidence_classWhat it looks like: Direct, sampled, and modeled metrics merged into one conclusion with no provenance labels.
Detection signal: Signal entries contain numbers but no evidence_class field.
Consequence: False confidence and unstable prioritization decisions.
Mitigation: Require evidence_class on every signal. Disallow strong claims from single class/source families.
What it looks like: Normalized trend movement converted into absolute demand claims ("volume doubled from trend index only"). Detection signal: Output states volume magnitude from trend index, no corroboration from planning data. Consequence: Inflated TAM and topic overcommitment. Mitigation: Label trend data as relative direction only. Corroborate with volume/planning evidence before claiming magnitude.
What it looks like: Opportunity scored from rank + volume while ignoring AI Overview, snippets, PAA, ads.
Detection signal: No SERP feature context fields in output.
Consequence: Systematic overestimation of capturable traffic.
Mitigation: Capture SERP context explicitly. Emit capture_risk signal separately from demand signal.
What it looks like: Modeled competitor traffic treated as exact truth. Detection signal: High-confidence exact-count claims from modeled datasets. Consequence: Overconfident benchmarking and incorrect bet sizing. Mitigation: Use directional language. Add uncertainty caveats. Cross-check with independent evidence.
What it looks like: Strategic direction changed during unresolved major algorithm update windows. Detection signal: Large recommendations based on short periods overlapping known Google update events. Consequence: Noise-chasing and confounded attribution. Mitigation: Defer strong verdicts until stabilization window. Mark provisional data explicitly.
write_artifact(path="/signals/search-seo-{YYYY-MM-DD}", data={...})
One artifact per query scope per run.
dataforseo(op="help", args={})
google_ads(op="help", args={})
serpapi(op="help", args={})
semrush(op="help", args={})
bing_webmaster(op="help", args={})
dataforseo(op="call", args={"method_id": "dataforseo.trends.explore.live.v1", "keywords": ["your query"], "location_code": 2840, "language_code": "en"})
dataforseo(op="call", args={"method_id": "dataforseo.trends.subregion_interests.live.v1", "keywords": ["your query"], "location_code": 2840})
dataforseo(op="call", args={"method_id": "dataforseo.trends.merged_data.live.v1", "keywords": ["query1", "query2"]})
google_ads(op="call", args={"method_id": "google_ads.keyword_planner.generate_historical_metrics.v1", "keywords": ["your query"], "geo_targets": ["US"]})
google_ads(op="call", args={"method_id": "google_ads.keyword_planner.generate_keyword_ideas.v1", "seed_keywords": ["your query"]})
serpapi(op="call", args={"method_id": "serpapi.search.google.v1", "q": "your query", "gl": "us", "hl": "en"})
serpapi(op="call", args={"method_id": "serpapi.search.google_trends.v1", "q": "your query", "date": "today 12-m"})
semrush(op="call", args={"method_id": "semrush.analytics.keyword_reports.v1", "phrase": "your query", "database": "us"})
semrush(op="call", args={"method_id": "semrush.trends.traffic_summary.v1", "targets": ["competitor.com"]})
bing_webmaster(op="call", args={"method_id": "bing_webmaster.get_page_query_stats.v1", "siteUrl": "https://yoursite.com"})
Tool policy: use op="help" before calling unfamiliar methods. If a method is not listed in op="help" output, do not call it. If provider calls fail, continue with remaining evidence and downgrade confidence accordingly.
{
"signal_search_seo": {
"type": "object",
"required": ["query", "time_window", "geo_language", "result_state", "evidence_summary", "quality_gates", "signals", "confidence", "confidence_grade", "limitations", "contradictions", "next_checks"],
"additionalProperties": false,
"properties": {
"query": {"type": "string", "description": "Primary keyword or query scope analyzed in this run."},
"time_window": {
"type": "object",
"required": ["start_date", "end_date"],
"additionalProperties": false,
"properties": {
"start_date": {"type": "string", "description": "ISO date window start (YYYY-MM-DD)."},
"end_date": {"type": "string", "description": "ISO date window end (YYYY-MM-DD)."},
"freshness_note": {"type": "string"}
}
},
"geo_language": {
"type": "object",
"required": ["location_code", "language_code"],
"additionalProperties": false,
"properties": {
"location_code": {"type": "integer"},
"language_code": {"type": "string"},
"market_label": {"type": "string"}
}
},
"result_state": {"type": "string", "enum": ["ok", "ok_with_conflicts", "zero_results", "insufficient_data", "technical_failure"]},
"evidence_summary": {
"type": "object",
"required": ["providers_used", "evidence_classes_covered", "serp_snapshot_included"],
"additionalProperties": false,
"properties": {
"providers_used": {"type": "array", "items": {"type": "string"}},
"evidence_classes_covered": {"type": "array", "items": {"type": "string", "enum": ["direct", "sampled", "modeled"]}},
"serp_snapshot_included": {"type": "boolean"},
"ai_surface_exposed": {"type": ["boolean", "null"]}
}
},
"quality_gates": {
"type": "object",
"required": ["freshness_gate", "comparability_gate", "cross_source_gate", "contradiction_gate", "serp_context_gate", "segmentation_gate"],
"additionalProperties": false,
"properties": {
"freshness_gate": {"type": "string", "enum": ["pass", "warn", "fail"]},
"comparability_gate": {"type": "string", "enum": ["pass", "warn", "fail"]},
"cross_source_gate": {"type": "string", "enum": ["pass", "warn", "fail"]},
"contradiction_gate": {"type": "string", "enum": ["pass", "warn", "fail"]},
"serp_context_gate": {"type": "string", "enum": ["pass", "warn", "fail"]},
"segmentation_gate": {"type": "string", "enum": ["pass", "warn", "fail"]},
"notes": {"type": "array", "items": {"type": "string"}}
}
},
"signals": {
"type": "array",
"items": {
"type": "object",
"required": ["signal_type", "description", "strength", "provider", "method_id", "evidence_class", "evidence_value", "window", "captured_at"],
"additionalProperties": false,
"properties": {
"signal_type": {"type": "string", "enum": ["demand_growth", "demand_decline", "demand_breakout", "seasonal_pattern", "serp_competition_high", "serp_competition_low", "competitor_traffic_shift", "related_demand_cluster", "capture_risk_high", "capture_risk_moderate", "capture_risk_low"]},
"description": {"type": "string"},
"strength": {"type": "string", "enum": ["strong", "moderate", "weak"]},
"provider": {"type": "string"},
"method_id": {"type": "string"},
"evidence_class": {"type": "string", "enum": ["direct", "sampled", "modeled"]},
"evidence_value": {"type": "string", "description": "Key numeric or qualitative evidence snippet as observed."},
"window": {"type": "string", "description": "Window reference used for this signal (e.g. 12m, 90d)."},
"direction": {"type": "string", "enum": ["up", "down", "flat", "mixed", "unknown"]},
"captured_at": {"type": "string", "description": "ISO-8601 UTC timestamp of collection."}
}
}
},
"confidence": {"type": "number", "minimum": 0, "maximum": 1},
"confidence_grade": {"type": "string", "enum": ["high", "medium", "low", "insufficient"]},
"limitations": {"type": "array", "items": {"type": "string"}},
"contradictions": {
"type": "array",
"items": {
"type": "object",
"required": ["source_a", "source_b", "description", "impact"],
"additionalProperties": false,
"properties": {
"source_a": {"type": "string"},
"source_b": {"type": "string"},
"description": {"type": "string"},
"impact": {"type": "string", "enum": ["major", "minor"]}
}
}
},
"next_checks": {"type": "array", "items": {"type": "string"}, "description": "Concrete next actions that would improve confidence or resolve contradictions."}
}
}
}