Benchmark B9

Entity Relationship Graph
5/5 writes. Reads restored in v0.2.16.

Tests whether iranti_relate correctly stores typed relationship edges between entities, and whether agents can read them back. The write layer is intact — 5/5 edges accepted. In v0.2.16, two new MCP tools close the read gap: iranti_related (1-hop) and iranti_related_deep (multi-hop traversal).

Executed 2026-03-215 edges · 3 entity typesRead gap closed in v0.2.16

Results at a glance

5/5Relationship edges written via iranti_relate
3/3Reads confirmed via iranti_related (1-hop)
8Edges returned by iranti_related_deep at depth=2
FindingThe write-only gap is closed. Both write and read are now functional. All 5 edges written in v0.2.12 remain readable in v0.2.16, confirming cross-version durability. Two MCP tools — 1-hop and multi-hop — give agents flexible access to the relationship graph.

What this measures

Iranti's graph model treats entities as nodes and uses iranti_relate to write typed, directed edges between them. An edge carries a relationship type (e.g. COLLABORATES_WITH) and an optional properties object with arbitrary metadata. The benchmark writes 5 distinct edges across a small synthetic research network, then reads them back via the new MCP tools added in v0.2.16.

Write path (iranti_relate)
Call iranti_relate with from, to, type, and properties
Each call returns ok: true
PostgreSQL relationships table stores the edge
Read path (v0.2.16)
iranti_related — 1-hop, returns all edges for an entity
iranti_related_deep — multi-hop traversal, depth=2 tested
Cross-version durability: edges from v0.2.12 readable in v0.2.16
Version history

Honest evolution across versions

B9 was first run in v0.2.12, where writes succeeded but reads had no MCP interface. This remained true through v0.2.14. The gap was resolved in v0.2.16 with two new tools.

VersionWritesReadsRead note
v0.2.125/50/0No MCP read tool existed
v0.2.145/50/0No MCP read tool existed
v0.2.16fixed5/53/3iranti_related + iranti_related_deep added

The 5 relationship edges

These are the actual edges written during the benchmark. Directed arrows represent relationship type. A teal dot on an edge indicates it was confirmed readable via iranti_related in v0.2.16. The two edges without dots were not individually queried — the 3/3 confirmed figure reflects the subset tested.

5 directed edges — written via iranti_relate · 3 confirmed readable via iranti_related
COLLABORATES_WITHADVISESFUNDED_BYUSES_TOOLPEER_REVIEWS_FORchenresearcherokaforresearchertanakaresearcherrashidresearchermemoryprojectirantiexternal2026external
researcher (amber) / project (amber rect)researcher (teal)teal dot = read confirmed via iranti_relatedexternal (muted)

Write vs. read — per edge

All 5 edges were accepted by the write layer. 3 were explicitly queried via iranti_related and returned correctly. The remaining 2 were not individually tested — shown as "not tested" rather than failed.

EdgeWrite (iranti_relate)Read (iranti_related)
researcher/alice_chenCOLLABORATES_WITHresearcher/bob_okafor
ok=true
confirmed
researcher/alice_chenADVISESresearcher/yuki_tanaka
ok=true
confirmed
project/nlp_memoryFUNDED_BYresearcher/fatima_al_rashid
ok=true
confirmed
project/nlp_memoryUSES_TOOLexternal/iranti
ok=true
not tested
researcher/bob_okaforPEER_REVIEWS_FORexternal/neurips_2026
ok=true
not tested
New in v0.2.16

Reading relationships

iranti_related — 1-hop

Given an entity ID, returns all relationship edges where that entity is source or target. Each edge includes from, to, rel, properties, and a direction field ("out" or "in"). One call returns both inbound and outbound edges.

// iranti_related("researcher/alice_chen")
[
{
from: "researcher/alice_chen",
to: "researcher/bob_okafor",
rel: "COLLABORATES_WITH",
direction: "out",
properties: { since: 2023, ... }
}, ...
]
iranti_related_deep — multi-hop

Traverses the graph outward from a starting entity to a configurable depth. Depth=2 confirmed working. Cycle-safe — does not loop forever on circular graphs. Returns a flat list of edges; hop depth is not labeled per edge but can be inferred from the data.

// iranti_related_deep("researcher/alice_chen", depth=2)
8 edges returned
→ from a 4-node subgraph
→ cycle-safe traversal
→ flat list, no hop-depth label per edge

Known limitations

The new tools work, but have interface constraints worth knowing before relying on them in production.

LimitationNo edge filter parameter in iranti_related. The tool returns all edge types for an entity. Callers must filter by relationship type client-side. For entities with many relationships this may return more data than needed.
Limitationiranti_related_deep returns a flat list without per-edge hop depth. You can infer hop depth from the graph structure, but it is not labeled in the response. This makes it harder to reason about which edges are at depth 1 vs. depth 2 without additional processing.
NoteSmall test set, single session. 3/5 edges were explicitly read back; the remaining 2 were not. The depth=2 traversal result of 8 edges was from a 4-node subgraph — not a large graph stress test.
Key findings

What this run establishes

Write-only gap is closed

Agents can now both write and read relationship edges. The primary blocker from v0.2.12–v0.2.14 is resolved.

1-hop and multi-hop both confirmed

iranti_related and iranti_related_deep give agents flexible traversal options.

Cross-version durability confirmed

All 5 edges written in v0.2.12 are still readable in v0.2.16. Relationship data is durable across releases.

Tool limitations remain

No edge filter in iranti_related. No hop-depth label in deep results. Both are caller-side workarounds, not blockers.

Raw benchmark data

Write operations returned ok: true. Read queries via iranti_related returned correct edges with properties and direction fields intact.

// Write results (v0.2.12 — still valid in v0.2.16)
iranti_relate(researcher/alice_chen, COLLABORATES_WITH, researcher/bob_okafor, ...) → ok: true
iranti_relate(researcher/alice_chen, ADVISES, researcher/yuki_tanaka, ...) → ok: true
iranti_relate(project/nlp_memory, FUNDED_BY, researcher/fatima_al_rashid, ...) → ok: true
iranti_relate(project/nlp_memory, USES_TOOL, external/iranti, ...) → ok: true
iranti_relate(researcher/bob_okafor, PEER_REVIEWS_FOR, external/neurips_2026, ...) → ok: true
// Read results via iranti_related (v0.2.16)
iranti_related("researcher/alice_chen") → 2 edges (COLLABORATES_WITH out, ADVISES out)
iranti_related("project/nlp_memory") → 1 edge confirmed (FUNDED_BY out)
→ direction field present · properties intact · from/to correct
// Multi-hop traversal via iranti_related_deep (v0.2.16)
iranti_related_deep("researcher/alice_chen", depth=2) → 8 edges from 4-node subgraph
→ cycle-safe · flat list · no per-edge hop label