PluginBench
Skill
Pass
Audit score 90

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
Prerequisites
  • Python 3 installed
  • Directory structure: memory/ontology/
  • Optional: schema.yaml for constraint definitions
Claude Code
Cursor
Windsurf
Cline

How to use ontology

  1. 1.Initialize storage with `mkdir -p memory/ontology && touch memory/ontology/graph.jsonl`
  2. 2.Define your schema in memory/ontology/schema.yaml (optional but recommended)
  3. 3.Create entities using `python3 scripts/ontology.py create --type <Type> --props '{...}'`
  4. 4.Query entities with `python3 scripts/ontology.py query --type <Type> --where '{...}'`
  5. 5.Link entities using `python3 scripts/ontology.py relate --from <id> --rel <relation> --to <id>`
  6. 6.Validate the graph with `python3 scripts/ontology.py validate` before committing changes

Use cases

Good for
  • 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
Who it's for
  • 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

When should I use ontology vs. just storing data in files?

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.

Can I store secrets in the ontology?

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.

How do I prevent circular dependencies in tasks?

Define the 'blocks' relation with acyclic: true in schema.yaml. The ontology will reject any relation that would create a cycle.

Can I migrate from JSONL to a database?

Yes. The default storage is memory/ontology/graph.jsonl, but you can migrate to SQLite or another backend by modifying the storage layer.

How do skills declare what ontology data they use?

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

TriggerAction
"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 workModel as graph transformations
Skill needs shared stateRead/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 patterns
  • references/queries.md — Query language and traversal examples