Install
openclaw skills install @indigokarasu/ocas-scoutStructured OSINT research on people, companies, and organizations. Use for provenance-backed briefs, entity resolution across public sources, background research with cited sources, or free-first research workflows that escalate to paid sources only with explicit permission. Do not use for topic research without a person/org focus (use Sift) or illegal data collection.
openclaw skills install @indigokarasu/ocas-scoutWhen invoked interactively, present a two-level menu. See references/interactive-menu.md for the full menu structure.
Scout conducts lawful OSINT research on people, companies, and organizations, assembling provenance-backed briefs where every claim carries a source reference, retrieval timestamp, and direct quote. It works through a tiered source waterfall — public web first, then rate-limited registries, then paid databases only with explicit permission — collecting no more than the stated research goal requires. This tiered approach exists because paid sources require explicit consent and rate-limited registries need careful quota management to avoid service degradation.
Scout integrates curated person-specific OSINT tools (theHarvester, Maigret, Holehe, h8mail, PhoneInfoga, and others), a public-records investigation framework (SEC EDGAR, USAspending, Senate lobbying, OFAC sanctions, ICIJ offshore leaks, NYC property records, OpenCorporates, CourtListener, Wayback Machine, Wikipedia/Wikidata, GDELT), and dynamically discovers new MCP-wrapped OSINT servers at runtime.
Scout owns lawful OSINT research on people and organizations with provenance-backed output.
Scout does not own: general topic research (Sift), image processing (Look), knowledge graph writes (Elephas), social graph (Weave), communications (Dispatch).
Scout works with these types from spec-ocas-ontology.md:
Scout emits Signals to Elephas after each completed research request, for each extracted entity with confidence >= med. Signal payload.type is "Person" or "AI". source_journal_type is "Research". Every emitted Signal must include a user_relevance field.
Every Signal emitted by Scout carries a user_relevance field:
"user" — the signal is relevant to the user's personal knowledge graph"agent_only" — agent-initiated research with no demonstrated user connectionDefault is "agent_only". A signal receives user_relevance: "user" only when: (1) the user explicitly requested the research, OR (2) the entity connects to a user_relevance: "user" Chronicle entry. When in doubt, default to "agent_only".
Signal example:
{
"signal_id": "sig-scout-20260402-001",
"source_skill": "ocas-scout",
"source_journal_type": "Research",
"emitted_at": "2026-04-02T14:30:00Z",
"user_relevance": "agent_only",
"payload": {
"type": "Person",
"name": "Jane Doe",
"confidence": "high",
"source_refs": ["https://example.com/profile"]
}
}
scout.research.start — begin a new research request with subject and goalscout.research.expand --tier <1|2|3> — escalate to a higher source tierscout.brief.render — generate the final markdown brief with findings and sourcesscout.brief.render_pdf — optional PDF brief generationscout.status — return current research statescout.journal — write journal for the current run; called at end of every runscout.update — pull latest from GitHub source; preserves journals and datascout.sources.discover — discover new MCP servers relevant to current researchscout.sources.refresh — refresh curated source lists from GitHubscout.sources.status — show state of dynamic source discoveryverified only when 2+ seed data points overlap (name + location, etc.). Username match alone = unverified_lead; exclude from synthesisResearchRequest requires: request_id, as_of, subject (type, name, aliases, known_locations, known_handles, known_emails, known_phones), goal, constraints (time_budget_minutes, minimize_pii). Read references/scout_schemas.md for exact schema.
Full step-by-step workflow with tool commands, handle expansion logic, identity gating, and verification tiers is in references/scout_schemas.md.
Phase summary:
references/scout_public_records.md for source selection, execution order, and cross-reference keys.entity_resolution.py to cross-link entities between public-records CSVs and person-tool findings. Three match tiers: exact (high), fuzzy (medium), token_overlap (low).timing_analysis.py to test whether event time series (e.g., lobbying filings vs contract awards) cluster suspiciously. Permutation test, one-tailed p-value.user_relevance), write journal via scout.journalWhen minimize_pii=true, suppress unnecessary sensitive details in the final brief.
Read references/scout_source_waterfall.md for full tier logic.
references/scout_person_sources.md for full list and execution order.references/scout_public_records.md.Markdown brief: Executive Summary, Identity Resolution Notes, Findings, Social Graph (if handles found), Digital Footprint (if email/phone tools ran), Public Records (if public-records investigation ran), Risk and Uncertainty, Source Log. Every finding carries source-backed provenance.
Read references/scout_brief_template.md for the full template.
Scout writes Signal files to Elephas (via journal signal payload). One Signal per confirmed entity or high-confidence relationship. Use schema from spec-ocas-shared-schemas.md. Every Signal must include user_relevance. See spec-ocas-interfaces.md for signal format.
This section defines error handling and recovery procedures for all scout jobs.
Implements the recovery contract from spec-ocas-recovery.md.
{agent_root}/commons/data/ocas-scout/evidence.jsonl (including no-op runs; not_activity_reason mandatory when no side effects).gap_detected.degraded: <tool> and continues with available sources.See references/storage-layout.md for directory structure. Read references/scout_config.md for default config.json and field descriptions.
See references/okrs.md for skill OKR definitions.
sift.search("site:<platform> '<handle>'") if unavailable.rapidapi_call (see RapidAPI Enrichment Workflow below)During Phase 3 (Handle Expansion) and Phase 4 (Email/Phone Tools), use RapidAPI social media endpoints to enrich profiles with structured data that free tools (Sherlock/Maigret) can't provide. Full procedure including person/company enrichment pipelines, rate limiting, and tier integration: see references/rapidapi-enrichment-workflow.md.
Journals must include an entities_observed array (name, type, confidence, user_relevance). See references/journal.md for schema.
public
On first invocation, run scout.init: create data dirs + default config, create empty JSONL files, create journal dir, register cron jobs, log DecisionRecord, set up SearchX (SearXNG + nginx), verify person-specific tools (install missing via pip), check dark web tools (OnionClaw + Tor, non-blocking).
| Job | Schedule | Command |
|---|---|---|
scout:update | 0 0 * * * (midnight daily) | scout.update |
scout:research | 0 9 * * 1 (Monday 9am) | scout.research |
scout:sources-refresh | 0 6 * * 0 (Sunday 6am) | scout.sources.refresh |
scout.update pulls the latest package from the source: URL in this file's frontmatter. Runs silently — no output unless the version changed or an error occurred.
Read references/self_update.md for the full self-update procedure.
Monitors: awesome-osint-mcp-servers (weekly), awesome-osint (monthly), API-s-for-OSINT (monthly). New tools classified by tier → added to references/scout_person_sources.md. See references/scout_mcp_discovery.md for dynamic discovery. See references/sources-refresh.md for the concrete refresh procedure that runs on the scout:sources-refresh cron.
agent_only — Signals emitted to Elephas default to user_relevance: "agent_only" unless the user explicitly requested the research or the entity connects to a known user Chronicle entry. This means most Scout entities won't be promoted.unverified_lead status. Profiles are verified only when 2+ seed data points overlap (name + location, etc.).minimize_pii=true, the final brief suppresses unnecessary sensitive details even if they were found during research. Re-run without the flag to see full data.tools/list but "You are not subscribed to this API" on actual calls. These are tier-gated by the provider, not broken. 3 genuinely broken LinkedIn APIs (linkedin-data-api, linkedin-api8, li-data-scraper) — provider shut down. 4 new ones work: fresh-linkedin-scraper-api (primary), linkedinscraper, linkedin-email-finder5, linkedin-lead-enrichment.gh api base64 content is unreliable for counting — gh api repos/<owner>/<repo>/readme --jq '.content' | base64 -d can silently return truncated or empty results. For fetching raw GitHub README content, use curl -s "https://raw.githubusercontent.com/<owner>/<repo>/<branch>/README.md" instead. This returns clean text that wc -l and grep can process directly.jivoi/awesome-osint uses master (not main). Always verify branch name with a quick curl -s -o /dev/null -w "%{http_code}" probe before fetching content.--max-time 15 and check HTTP status code before processing output.scripts/fetch_*.py use Python stdlib only (no pip installs required). They use urllib.request with retry logic and respect Retry-After headers. 429 responses surface immediately with the upstream's quota message.entity_resolution.py does NOT use external fuzzy libraries (no rapidfuzz, no jellyfish). Token-bag matching is the upper bound. For Levenshtein, transliteration, or phonetic matching, pip-install separately.$HERMES_OSINT_CACHE/icij/ (default: ~/.cache/hermes-osint/icij/). Subsequent runs search the local cache.timing_analysis.py p < 0.05 means the timing pattern is unlikely under the null. It does not establish corruption. Always state this in the brief.| File | When to read |
|---|---|
references/scout_schemas.md | Before requests/findings/briefs; full workflow steps |
references/scout_config.md | Default config.json and field descriptions |
references/scout_source_waterfall.md | Before tier selection or escalation |
references/scout_brief_template.md | Before rendering briefs |
references/scout_person_sources.md | At start of every person research run |
references/scout_public_records.md | At start of every company/org research run; when person research reveals corporate ties; before Phase 5 |
references/scout_mcp_discovery.md | Before scout.sources.discover; before Tier 2 escalation |
references/sources-refresh.md | Before scout.sources.refresh; before weekly cron refresh runs |
references/rapidapi-osint-params.md | Before RapidAPI enrichment; param patterns per platform |
references/rapidapi-enrichment-workflow.md | During Phase 3/4 research; RapidAPI person/company enrichment pipelines |
references/journal.md | Before scout.journal; at end of every run |
references/self_update.md | Before running scout.update; when debugging self-update failures |
This skill self-updates every 24 hours via:
scout.update
This pulls the latest version from GitHub and restarts the skill's background tasks if applicable.