Install
openclaw skills install @harry720320/rumor-busterDual-engine fact-checking skill for verifying news, claims, and messages through Chinese + English cross-verification and source tracing. Use when user wants to verify information authenticity, check if a message is true/false, validate news sources, or trace the origin of a claim. Supports /verify and /验证 commands with auto-detection of installed search engines.
openclaw skills install @harry720320/rumor-busterDual-engine fact-checking with Chinese + English cross-verification and source tracing.
Use Rumor Buster when the user wants to:
Trigger phrases:
/verify "claim" or /验证 "消息"When user first uses /verify, check for config:
CONFIG_FILE = "~/.rumor-buster-config"
if not os.path.exists(CONFIG_FILE):
# Spawn setup sub-skill
return sessions_spawn(
task="Initialize Rumor Buster: detect search engines, configure Tavily API (optional), generate config file",
agent_id="rumor-buster-setup",
runtime="subagent",
mode="session"
)
Setup sub-skill handles:
~/.rumor-buster-configdef handle_verification(user_input):
"""Main entry point for verification requests"""
# 1. Detect language
lang = detect_language(user_input)
# 2. Load config
config = load_config(CONFIG_FILE)
# 3. Extract query
query = extract_query(user_input)
# 4. Update session state (CRITICAL!)
update_verification_state(query, lang)
# 5. Perform verification
results = perform_verification(query, config, lang)
# 6. Generate summary
return generate_summary(results, lang)
Search Chinese sources for:
def search_chinese(query, config):
results = []
# kimi_search (if available)
if config["native"].get("kimi_search", {}).get("available"):
results.append(kimi_search(query, limit=10, include_content=True))
# multi-search-engine Chinese engines
if config["multi_search_engine"].get("available"):
for engine in config["multi_search_engine"].get("chinese", []):
results.append(search_with_engine(engine, query))
return aggregate_results(results)
Search English sources for:
def search_english(query, config):
results = []
# Tavily (if configured)
if config["tavily"].get("available"):
results.append(tavily_search(
query,
api_key=config["tavily"]["api_key"],
max_results=10
))
# multi-search-engine English engines
for engine in config["multi_search_engine"].get("english", []):
results.append(search_with_engine(engine, query))
return aggregate_results(results)
Compare Chinese and English findings:
def cross_verify(cn_results, en_results):
comparison = {
"facts_match": compare_facts(cn_results, en_results),
"timeline_consistent": compare_timeline(cn_results, en_results),
"authorities_agree": compare_authorities(cn_results, en_results),
"consistency_score": calculate_consistency(cn_results, en_results)
}
return comparison
Trace claim back to origin:
Original Source → Early Spread → Mainstream Media → Social Media → User
Calculate 0-100% score based on:
Must maintain current verification topic:
verification_state = {
"current_query": None,
"current_language": None,
"chinese_results": None,
"english_results": None,
"analysis": None
}
def update_verification_state(query, lang):
"""Update state when new verification starts"""
verification_state["current_query"] = query
verification_state["current_language"] = lang
verification_state["timestamp"] = datetime.now()
# Reset other fields
verification_state["chinese_results"] = None
verification_state["english_results"] = None
verification_state["analysis"] = None
Why this matters:
User: /verify "Claim A"
System: [Summary for A]
User: /verify "Claim B"
System: [Summary for B]
User: detailed report ← MUST return B, not A!
Load references/architecture.md for complete state management details.
# 🔍 Rumor Buster - Verification Summary
**Claim**: "{query}"
## 📊 Credibility Score: {score}% - {verdict}
| Dimension | Result |
|:---|:---|
| **Source** | {source} |
| **Confirmation** | {confirmation} |
| **Evidence** | {evidence} |
| **Consistency** | {consistency} |
## 📝 One-Sentence Conclusion
{conclusion}
## 🔗 Information Source
- **Origin**: {origin}
- **Published**: {time}
- **Spread Path**: {path}
---
💡 Reply "detailed report" to view the complete verification process...
User replies "detailed report" → Output full analysis including:
Load references/output-templates.md for complete templates.
def detect_language(text):
import re
chinese_chars = len(re.findall(r'[\u4e00-\u9fff]', text))
total_chars = len(text.strip())
if total_chars > 0 and chinese_chars / total_chars > 0.3:
return "zh"
return "en"
All output respects detected language:
User can trigger reconfiguration:
setup / 设置reset / 重新设置/rumor-buster setupHandler:
def handle_reconfig(user_input):
lang = detect_language(user_input)
return sessions_spawn(
task=f"Reconfigure Rumor Buster (language: {lang})",
agent_id="rumor-buster-setup",
runtime="subagent",
mode="session"
)
Load these files when implementing specific features:
| File | Content | When to Load |
|---|---|---|
references/verification-guide.md | Complete verification workflow | Implementing verification logic |
references/output-templates.md | Output format templates | Formatting results |
references/architecture.md | System architecture & sub-skill integration | Modifying architecture |
{
"setup_completed": true,
"version": "0.5.0",
"search_engines": {
"native": {
"kimi_search": {"available": false},
"web_search": {"available": true, "provider": "brave"},
"web_fetch": {"available": true}
},
"multi_search_engine": {
"available": true,
"chinese": ["sogou", "toutiao"],
"english": ["duckduckgo", "startpage"]
},
"tavily": {
"available": true,
"api_key": "tvly-xxxxx",
"quota": 1000
}
}
}
rumor-buster/
├── SKILL.md # This file - core workflow
├── LICENSE # MIT license
├── scripts/
│ └── tavily_search.py # Tavily search script
├── sub-skills/
│ └── setup/
│ ├── SKILL.md # Setup sub-skill documentation
│ └── setup.py # Setup implementation
└── references/ # Detailed documentation
├── verification-guide.md # Complete workflow
├── output-templates.md # Output formats
└── architecture.md # System architecture
Rumor Buster - Cross-verify, trace sources, seek truth.