Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Typed knowledge graph via TSV append-only log — entity CRUD, directed relations, schema validation, multi-hop reasoning. CLI via `x ondb`, protocol readable by AWK/Python/JS/SQLite.
.claude/skills/x-cmd-ontology-database/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 66% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -52% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -23% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -19% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -20% | 0% |
Typed knowledge graph: everything is an entity (id + type + properties) connected by directed relations (from → rel → to). All mutations append TSV lines — never overwrite. The TSV log IS the database.
add <type> <id> <epoch_ms> key1 val1 key2 val2 # create entity
set <id> <epoch_ms> key val # update property
rm <id> <epoch_ms> # delete entity
link <from> <rel> <to> <epoch_ms> [key1 val1 ...] # create relation
unlink <from> <rel> <to> <epoch_ms> # remove relation
# tab-separated; escape: \t → tab, \n → newline, \\ → backslash
# properties are alternating key/val pairs (each is a separate tab field)Any language reads this. AWK streams, Python dicts, SQLite materializes. Log is source of truth.
x ondb add --type Person --name Alice # auto UUID
x ondb add --type Task --name "Fix bug" --id t1 priority=high status=open
x ondb get --id t1 --json # entity detail
x ondb set --id t1 status=done # update prop
x ondb rm --id t1 # delete
x ondb link --from proj_001 --rel has_task --to t1 # create relation
x ondb link --from t1 --rel blocks --to t2 # with link props: -- status=hard
x ondb linked --id proj_001 --rel has_task # outgoing relations
x ondb linked --id t1 --direction incoming # incoming (who links TO)
x ondb related --id proj_001 --rel has_task --json # full entity on other side
x ondb ls --type Task # list by type
x ondb query --type Task --where status=open --json # filter by propslinked = relation metadata. related = full entity on the other side. Use --dir <path> / -d <path> for data directory (→ path/ondb.tsv).
x ondb schema add "type:Task:required:title,status"
x ondb schema add "type:Task:enum:status:open,in_progress,done,blocked"
x ondb schema add "relation:blocks:from_types:Task"
x ondb schema add "relation:blocks:acyclic:1"
x ondb validate # checks required, enum, dangling refs, cardinality, cyclesDirectives: type:Name:{required|forbidden|enum|datetime|ref}:..., relation:Rel:{from_types|to_types|cardinality|acyclic}:.... Validation is separate from write.
set, rm, unlink append lines; never modify existing linesvalidate after batch changes| Backend | When | | |---|---|---| | AWK (default) | < 2k entities | Zero deps, streaming | | Python | Medium | Rich data structures | | JS/Bun | Web apps | JSON native | | SQLite | > 5k entities | Auto-generated from TSV log |
<datadir>/ONDB.DESC.txt # Required. Identifies ondb instance
<datadir>/ondb.tsv # Append-only log
<datadir>/schema.tsv # Optional. Constraints
<datadir>/ondb.db # Optional. SQLite materialized viewx ondb --help — CLI referencex ondb libpath {awk,py,js} — library paths for custom queriesmetadata: is the recommended ingest surface| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 8,016 | 11,374 | +42% | 1 | 1 | 0% | 1,467 | 2,431 | +66% | 0 | 0 | — |
case-02 | fail→fail | 6,005 | 20,565 | +242% | 1 | 1 | 0% | 267 | 3,527 | +1221% | 0 | 0 | — |
case-03 | fail→fail | 22,374 | 7,396 | -67% | 1 | 1 | 0% | 4,324 | 1,420 | -67% | 0 | 0 | — |
case-04 | fail→pass | 66,691 | 4,613 | -93% | 1 | 1 | 0% | 3,837 | 1,837 | -52% | 0 | 0 | — |
case-05 | fail→pass | 14,886 | 4,795 | -68% | 1 | 1 | 0% | 2,378 | 1,841 | -23% | 0 | 0 | — |
case-06 | fail→pass | 12,359 | 3,298 | -73% | 1 | 1 | 0% | 1,829 | 1,484 | -19% | 0 | 0 | — |
case-07 | fail→pass | 15,612 | 5,229 | -67% | 1 | 1 | 0% | 2,477 | 1,970 | -20% | 0 | 0 | — |
case-08 | fail→pass | 36,292 | 3,710 | -90% | 1 | 1 | 0% | 2,035 | 1,612 | -21% | 0 | 0 | — |
case-09 | fail→pass | 16,241 | 4,325 | -73% | 1 | 1 | 0% | 2,350 | 1,494 | -36% | 0 | 0 | — |
case-10 | fail→pass | 10,006 | 6,367 | -36% | 1 | 1 | 0% | 1,805 | 2,135 | +18% | 0 | 0 | — |
case-11 | fail→pass | 11,200 | 5,376 | -52% | 1 | 1 | 0% | 1,704 | 1,654 | -3% | 0 | 0 | — |
case-12 | fail→fail | 28,897 | 3,684 | -87% | 1 | 1 | 0% | 4,518 | 1,470 | -67% | 0 | 0 | — |
case-13 | fail→pass | 32,635 | 4,291 | -87% | 1 | 1 | 0% | 2,684 | 1,694 | -37% | 0 | 0 | — |
case-14 | pass→pass | 16,075 | 9,505 | -41% | 1 | 1 | 0% | 2,468 | 2,213 | -10% | 0 | 0 | — |
case-15 | fail→pass | 9,559 | 3,413 | -64% | 1 | 1 | 0% | 1,639 | 1,521 | -7% | 0 | 0 | — |
case-16 | fail→pass | 10,267 | 2,359 | -77% | 1 | 1 | 0% | 1,534 | 1,308 | -15% | 0 | 0 | — |
case-17 | fail→pass | 15,557 | 2,886 | -81% | 1 | 1 | 0% | 2,258 | 1,408 | -38% | 0 | 0 | — |
case-18 | pass→pass | 20,285 | 15,399 | -24% | 1 | 1 | 0% | 2,850 | 3,371 | +18% | 0 | 0 | — |
case-19 | pass→pass | 17,599 | 14,487 | -18% | 1 | 1 | 0% | 2,952 | 2,385 | -19% | 0 | 0 | — |
case-20 | pass→pass | 20,332 | 20,100 | -1% | 1 | 1 | 0% | 2,087 | 1,869 | -10% | 0 | 0 | — |
case-21 | fail→pass | 14,899 | 3,219 | -78% | 1 | 1 | 0% | 2,385 | 1,332 | -44% | 0 | 0 | — |
case-22 | fail→pass | 19,485 | 12,034 | -38% | 1 | 1 | 0% | 2,723 | 3,040 | +12% | 0 | 0 | — |
case-23 | pass→pass | 17,031 | 16,525 | -3% | 1 | 1 | 0% | 2,881 | 3,906 | +36% | 0 | 0 | — |
case-24 | pass→pass | 16,538 | 7,418 | -55% | 1 | 1 | 0% | 1,726 | 2,442 | +41% | 0 | 0 | — |
case-25 | pass→pass | 7,169 | 7,661 | +7% | 1 | 1 | 0% | 1,337 | 2,116 | +58% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted, and 23 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +60 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.