Install
openclaw skills install @indigokarasu/ocas-lookConvert user images into validated action drafts like calendar events, meal macros, receipts, products, civic reports, or documents for confirmation and exec...
openclaw skills install @indigokarasu/ocas-lookLook bridges the physical world and the digital agent — it takes a user-provided image, infers what the user probably wants done with it, and produces a validated, decision-ready action draft across domains including calendar events, meal macros, places, product comparisons, receipts, documents, and civic reports. It resolves ambiguity through research and option reduction before asking any clarifying questions, and nothing executes without explicit per-draft confirmation.
Look owns image-to-action conversion: ingest, context inference, domain routing, draft generation, and execution with confirmation.
Look does not own: web research (Sift), knowledge graph writes (Elephas), preference persistence (Taste), communications (Dispatch).
Events, food macros, places, products, civic issues, receipts, documents.
Read references/domain_playbooks.md for detailed per-domain behavior.
~/openclaw/db/ocas-elephas/intake/{signal_id}.signal.json. Use Signal schema from spec-ocas-shared-schemas.md.look.journalClarification happens only after option reduction, not before.
look.ingest.image — ingest image(s) with optional EXIF and device pre-parselook.propose.actions — generate ActionDrafts with DecisionRecordslook.execute.action — execute a confirmed draft (requires explicit approval)look.rollback.action — attempt rollback for reversible actionslook.status — last ingest, pending drafts, items awaiting confirmationlook.config.set — update configurationlook.journal — write journal for the current run; called at end of every runlook.update — pull latest from GitHub source; preserves journals and dataDefault deny. Request minimally. Drafting continues even without execution permissions. Blocked execution reported, not silently skipped.
~/openclaw/data/ocas-look/
config.json
state.json
events.jsonl
decisions.jsonl
reports/
artifacts/
~/openclaw/journals/ocas-look/
YYYY-MM-DD/
{run_id}.json
Default config.json:
{
"skill_id": "ocas-look",
"skill_version": "2.3.0",
"config_version": "1",
"created_at": "",
"updated_at": "",
"domains": {
"events": true,
"food": true,
"places": true,
"products": true,
"civic": true,
"receipts": true,
"documents": true
},
"user_profile": {
"diet": "vegetarian"
},
"commerce": {
"auto_purchase": false
},
"retention": {
"days": 30,
"max_records": 10000
}
}
Universal OKRs from spec-ocas-journal.md apply to all runs.
skill_okrs:
- name: draft_accuracy
metric: fraction of ActionDrafts accepted without modification
direction: maximize
target: 0.75
evaluation_window: 30_runs
- name: domain_routing_accuracy
metric: fraction of images routed to correct domain on first attempt
direction: maximize
target: 0.90
evaluation_window: 30_runs
- name: confirmation_compliance
metric: fraction of high-risk actions requiring confirmation before execution
direction: maximize
target: 1.0
evaluation_window: 30_runs
Observation Journal — all image ingestion and draft generation runs.
On first invocation of any Look command, run look.init:
~/openclaw/data/ocas-look/ and subdirectories (reports/, artifacts/)config.json and state.json if absentevents.jsonl, decisions.jsonl~/openclaw/journals/ocas-look/~/openclaw/db/ocas-elephas/intake/ exists (create if missing)look:update if not already present (check openclaw cron list first)decisions.jsonl| Job name | Mechanism | Schedule | Command |
|---|---|---|---|
look:update | cron | 0 0 * * * (midnight daily) | look.update |
openclaw cron add --name look:update --schedule "0 0 * * *" --command "look.update" --sessionTarget isolated --lightContext true --timezone America/Los_Angeles
look.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 Look from version {old} to {new}public
| File | When to read |
|---|---|
references/schemas.md | Before creating evidence, drafts, or receipts |
references/domain_playbooks.md | Before domain routing or draft generation |
references/decision_policy.md | Before risk assessment or confirmation decisions |
references/command_reference.md | Before any command execution |
references/storage_and_config.md | Before config changes or storage operations |
references/journal.md | Before look.journal; at end of every run |