Install
openclaw skills install ocas-siftWeb search, research synthesis, fact verification, and entity extraction. The system's general research engine. Use for topic research, web lookups, fact-che...
openclaw skills install ocas-siftSift is the system's general research engine, retrieving and synthesizing information from the web across a tiered source hierarchy — internal knowledge first, then free web search, then rate-limited semantic research providers for deep work. It evaluates source reliability through cross-source agreement scoring, extracts structured entities from retrieved content, and emits enrichment candidates to Chronicle so researched knowledge accumulates over time.
Sift never performs OSINT investigations on individuals. If the primary entity of a query is a person, Scout should be invoked.
Sift owns web research, fact verification, and structured entity extraction.
Sift does not own: person-focused OSINT (Scout), image processing (Look), knowledge graph writes (Elephas), pattern analysis (Corvus), social graph (Weave).
sift.search — execute a search query with automatic tier selection and query rewritingsift.research — run a multi-source research session producing a structured research journalsift.verify — fact-check a specific claim across multiple sources with consensus scoringsift.summarize — summarize a document or URL with structured entity extractionsift.extract — extract entities, claims, statistics, and relationships from contentsift.thread.list — list active research threads with entity overlap detectionsift.status — return current state: active threads, quota usage, source reputation summarysift.journal — write journal for the current run; called at end of every runsift.update — pull latest from GitHub source; preserves journals and dataSift classifies query depth automatically:
Users may override with phrases like "quick answer", "deep dive", "compare", or "summarize".
Read references/search_tiers.md for provider details and escalation criteria.
Sift maintains per-domain trust scores based on: cross-source agreement, contradiction frequency, historical accuracy, structured data quality, citation frequency.
When pages are retrieved, extract: entities (with type from shared ontology), claims, statistics, relationships, citations. Each extraction includes confidence level.
Extracted entities are emitted as enrichment candidates for Elephas.
After every Sift command that produces results:
med: write a Signal file to ~/openclaw/db/ocas-elephas/intake/{signal_id}.signal.json. Use Signal schema from spec-ocas-shared-schemas.md.sift.journalSift never writes directly to Chronicle. It emits enrichment candidates via Signal files to ~/openclaw/db/ocas-elephas/intake/{signal_id}.signal.json. Elephas decides promotion.
Sift writes Signal files to Elephas intake: ~/openclaw/db/ocas-elephas/intake/{signal_id}.signal.json
Sift may read from Thread (when present) for recent browsing context to improve query rewriting. This is a cooperative read, not a dependency.
See spec-ocas-interfaces.md for signal format.
~/openclaw/data/ocas-sift/
config.json
sessions.jsonl
threads.jsonl
entities.jsonl
sources.jsonl
decisions.jsonl
reports/
~/openclaw/journals/ocas-sift/
YYYY-MM-DD/
{run_id}.json
Default config.json:
{
"skill_id": "ocas-sift",
"skill_version": "2.3.0",
"config_version": "1",
"created_at": "",
"updated_at": "",
"search": {
"default_tier": 2,
"tier3_daily_limit": 50
},
"retention": {
"days": 30,
"max_records": 10000
}
}
Universal OKRs from spec-ocas-journal.md apply to all runs.
skill_okrs:
- name: source_accuracy
metric: fraction of extracted facts confirmed by cross-source agreement
direction: maximize
target: 0.85
evaluation_window: 30_runs
- name: tier3_quota_compliance
metric: fraction of days where Tier 3 usage stays within daily limit
direction: maximize
target: 1.0
evaluation_window: 30_runs
- name: entity_extraction_precision
metric: fraction of extracted entities with valid source reference
direction: maximize
target: 0.90
evaluation_window: 30_runs
On first invocation of any Sift command, run sift.init:
~/openclaw/data/ocas-sift/ and subdirectories (reports/)config.json with ConfigBase fields if absentsessions.jsonl, threads.jsonl, entities.jsonl, sources.jsonl, decisions.jsonl~/openclaw/journals/ocas-sift/~/openclaw/db/ocas-elephas/intake/ exists (create if missing)sift:update if not already present (check openclaw cron list first)decisions.jsonl| Job name | Mechanism | Schedule | Command |
|---|---|---|---|
sift:update | cron | 0 0 * * * (midnight daily) | sift.update |
openclaw cron add --name sift:update --schedule "0 0 * * *" --command "sift.update" --sessionTarget isolated --lightContext true --timezone America/Los_Angeles
sift.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.
source: from frontmatter → extract {owner}/{repo} from URLskill.jsongh api "repos/{owner}/{repo}/contents/skill.json" --jq '.content' | base64 -d | python3 -c "import sys,json;print(json.load(sys.stdin)['version'])"TMPDIR=$(mktemp -d)
gh api "repos/{owner}/{repo}/tarball/main" > "$TMPDIR/archive.tar.gz"
mkdir "$TMPDIR/extracted"
tar xzf "$TMPDIR/archive.tar.gz" -C "$TMPDIR/extracted" --strip-components=1
cp -R "$TMPDIR/extracted/"* ./
rm -rf "$TMPDIR"
I updated Sift from version {old} to {new}public
| File | When to read |
|---|---|
references/schemas.md | Before creating sessions, threads, or extraction records |
references/search_tiers.md | Before tier selection or escalation |
references/query_rewrite.md | Before query rewriting |
references/journal.md | Before sift.journal; at end of every run |