ontology
sundial-org/awesome-openclaw-skills
Typed knowledge graph for structured agent memory and cross-skill state sharing.
What is ontology?
A typed vocabulary and constraint system for representing knowledge as a verifiable graph of entities (Person, Project, Task, Event, Document) and their relations. Use when agents need to remember facts, query structured data, enforce constraints, or share state across skills.
- Create and update typed entities with properties and relations
- Query the graph by type, properties, or traversal (e.g., all tasks for a project)
- Link entities together with validated relation types
- Enforce schema constraints and prevent circular dependencies
- Model multi-step plans as sequences of graph transformations
- Enable cross-skill communication via shared ontology objects
How to install ontology
npx skills add https://github.com/sundial-org/awesome-openclaw-skills --skill ontology- Python 3 installed
- Directory structure: memory/ontology/
- Optional: schema.yaml for constraint definitions
How to use ontology
- 1.Initialize storage with `mkdir -p memory/ontology && touch memory/ontology/graph.jsonl`
- 2.Define your schema in memory/ontology/schema.yaml (optional but recommended)
- 3.Create entities using `python3 scripts/ontology.py create --type <Type> --props '{...}'`
- 4.Query entities with `python3 scripts/ontology.py query --type <Type> --where '{...}'`
- 5.Link entities using `python3 scripts/ontology.py relate --from <id> --rel <relation> --to <id>`
- 6.Validate the graph with `python3 scripts/ontology.py validate` before committing changes
Use cases
- Agent remembers a person's contact info and links them to projects they own
- Query all open tasks blocked by a specific task to show dependencies
- Create an event, attendees, and follow-up tasks in a single coordinated operation
- Email skill creates a Commitment entity that Task skill automatically converts to a Task
- Validate that all Task entities have required fields before committing changes
- Agents managing projects, tasks, and team coordination
- Multi-skill systems that need to share structured state
- Planning systems that model work as graph transformations
- Knowledge management and entity relationship scenarios
ontology FAQ
Use ontology when you need typed constraints, cross-entity relations, dependency tracking, or multiple skills accessing the same data. For simple key-value storage, files are fine.
No. Use Credential entities with secret_ref pointers instead, and store actual secrets in a separate secure vault. The schema forbids direct password/token properties.
Define the 'blocks' relation with acyclic: true in schema.yaml. The ontology will reject any relation that would create a cycle.
Yes. The default storage is memory/ontology/graph.jsonl, but you can migrate to SQLite or another backend by modifying the storage layer.
Add an ontology section to your SKILL.md frontmatter listing reads, writes, preconditions, and postconditions so other skills know what state you depend on.
Full instructions (SKILL.md)
Source of truth, from sundial-org/awesome-openclaw-skills.
name: ontology description: Typed knowledge graph for structured agent memory and composable skills. Use when creating/querying entities (Person, Project, Task, Event, Document), linking related objects, enforcing constraints, planning multi-step actions as graph transformations, or when skills need to share state. Trigger on "remember", "what do I know about", "link X to Y", "show dependencies", entity CRUD, or cross-skill data access.
Ontology
A typed vocabulary + constraint system for representing knowledge as a verifiable graph.
Core Concept
Everything is an entity with a type, properties, and relations to other entities. Every mutation is validated against type constraints before committing.
Entity: { id, type, properties, relations, created, updated }
Relation: { from_id, relation_type, to_id, properties }
When to Use
| Trigger | Action |
|---|---|
| "Remember that..." | Create/update entity |
| "What do I know about X?" | Query graph |
| "Link X to Y" | Create relation |
| "Show all tasks for project Z" | Graph traversal |
| "What depends on X?" | Dependency query |
| Planning multi-step work | Model as graph transformations |
| Skill needs shared state | Read/write ontology objects |
Core Types
# Agents & People
Person: { name, email?, phone?, notes? }
Organization: { name, type?, members[] }
# Work
Project: { name, status, goals[], owner? }
Task: { title, status, due?, priority?, assignee?, blockers[] }
Goal: { description, target_date?, metrics[] }
# Time & Place
Event: { title, start, end?, location?, attendees[], recurrence? }
Location: { name, address?, coordinates? }
# Information
Document: { title, path?, url?, summary? }
Message: { content, sender, recipients[], thread? }
Thread: { subject, participants[], messages[] }
Note: { content, tags[], refs[] }
# Resources
Account: { service, username, credential_ref? }
Device: { name, type, identifiers[] }
Credential: { service, secret_ref } # Never store secrets directly
# Meta
Action: { type, target, timestamp, outcome? }
Policy: { scope, rule, enforcement }
Storage
Default: memory/ontology/graph.jsonl
{"op":"create","entity":{"id":"p_001","type":"Person","properties":{"name":"Alice"}}}
{"op":"create","entity":{"id":"proj_001","type":"Project","properties":{"name":"Website Redesign","status":"active"}}}
{"op":"relate","from":"proj_001","rel":"has_owner","to":"p_001"}
Query via scripts or direct file ops. For complex graphs, migrate to SQLite.
Workflows
Create Entity
python3 scripts/ontology.py create --type Person --props '{"name":"Alice","email":"alice@example.com"}'
Query
python3 scripts/ontology.py query --type Task --where '{"status":"open"}'
python3 scripts/ontology.py get --id task_001
python3 scripts/ontology.py related --id proj_001 --rel has_task
Link Entities
python3 scripts/ontology.py relate --from proj_001 --rel has_task --to task_001
Validate
python3 scripts/ontology.py validate # Check all constraints
Constraints
Define in memory/ontology/schema.yaml:
types:
Task:
required: [title, status]
status_enum: [open, in_progress, blocked, done]
Event:
required: [title, start]
validate: "end >= start if end exists"
Credential:
required: [service, secret_ref]
forbidden_properties: [password, secret, token] # Force indirection
relations:
has_owner:
from_types: [Project, Task]
to_types: [Person]
cardinality: many_to_one
blocks:
from_types: [Task]
to_types: [Task]
acyclic: true # No circular dependencies
Skill Contract
Skills that use ontology should declare:
# In SKILL.md frontmatter or header
ontology:
reads: [Task, Project, Person]
writes: [Task, Action]
preconditions:
- "Task.assignee must exist"
postconditions:
- "Created Task has status=open"
Planning as Graph Transformation
Model multi-step plans as a sequence of graph operations:
Plan: "Schedule team meeting and create follow-up tasks"
1. CREATE Event { title: "Team Sync", attendees: [p_001, p_002] }
2. RELATE Event -> has_project -> proj_001
3. CREATE Task { title: "Prepare agenda", assignee: p_001 }
4. RELATE Task -> for_event -> event_001
5. CREATE Task { title: "Send summary", assignee: p_001, blockers: [task_001] }
Each step is validated before execution. Rollback on constraint violation.
Integration Patterns
With Causal Inference
Log ontology mutations as causal actions:
# When creating/updating entities, also log to causal action log
action = {
"action": "create_entity",
"domain": "ontology",
"context": {"type": "Task", "project": "proj_001"},
"outcome": "created"
}
Cross-Skill Communication
# Email skill creates commitment
commitment = ontology.create("Commitment", {
"source_message": msg_id,
"description": "Send report by Friday",
"due": "2026-01-31"
})
# Task skill picks it up
tasks = ontology.query("Commitment", {"status": "pending"})
for c in tasks:
ontology.create("Task", {
"title": c.description,
"due": c.due,
"source": c.id
})
Quick Start
# Initialize ontology storage
mkdir -p memory/ontology
touch memory/ontology/graph.jsonl
# Create schema (optional but recommended)
cat > memory/ontology/schema.yaml << 'EOF'
types:
Task:
required: [title, status]
Project:
required: [name]
Person:
required: [name]
EOF
# Start using
python3 scripts/ontology.py create --type Person --props '{"name":"Alice"}'
python3 scripts/ontology.py list --type Person
References
references/schema.md— Full type definitions and constraint patternsreferences/queries.md— Query language and traversal examples
Related skills
More from sundial-org/awesome-openclaw-skills and the wider catalog.

stock-market-pro
Professional stock analysis with real-time quotes, fundamentals, and technical charts—no API key required.

exa-web-search-free
Free neural search for web, code, and company research via Exa MCP—no API key required.

finance-news
AI-powered market news briefings with portfolio tracking and automated delivery to WhatsApp.

memory-setup
Enable persistent memory for Moltbot/Clawdbot agents to recall past conversations, preferences, and project context.

news-summary
This skill should be used when the user asks for news updates, daily briefings, or what's happening in the world. Fetches news from trusted international RSS feeds and can create voice summaries.

ffmpeg-video-editor
Generate FFmpeg commands from natural language video editing requests - cut, trim, convert, compress, change aspect ratio, extract audio, and more.