[ A ]
Arkiv Agent Memory
Multi-agent pipeline · Kaolin testnet
Live · Chain 60138453025
4 agents run in sequence·~60–90s total·each agent writes to Arkiv before the next starts·working memory: 5 min TTL · final report: 30 days
Agent 1 · README Reader
readme reader
IDLE
awaiting session
Agent 2 · Code Analyzer
code analyzer
IDLE
awaiting session
Agent 3 · Arkiv Expert
arkiv expert
IDLE
awaiting session
Agent 4 · Reporter
reporter
IDLE
awaiting session
01 · Overview

Four agents. One memory layer.

You give a GitHub repo URL. Four agents run in sequence. No agent receives another agent's output as a function call. The only way they communicate is through Arkiv — a blockchain memory layer. Remove Arkiv and the system breaks.

GITHUB REPO URL
github.com/fabianferno/clink
AGENT 1 · README READER
click to explore →
ARKIV
WRITES
AGENT 2 · CODE ANALYZER
click to explore →
ARKIV
WRITES
AGENT 3 · ARKIV EXPERT
click to explore →
ARKIV
READS + WRITES
AGENT 4 · REPORTER
click to explore →
ARKIV
READS + WRITES
(30 days)
Sequential execution · Kaolin testnet · Chain ID 60138453025 · Wallet 0xa618...1C6

02 · The memory layer

What is an entity?

An entity is a row in a database table — except no company controls the database. It lives on the Arkiv blockchain, it is queryable by attributes, and it automatically deletes itself after a set time. This is what the agents use as shared memory.

ARKIV KAOLIN · LIVE ENTITIES
readme-summary0x4a2f...c91b4m 32s
payloadiThe actual data stored. A JSON object encoded to bytes. Contains the agent's findings from this run.attributesiKey-value tags used for querying. Like column indexes in a database. You filter by these with eq() or gte().TTLiTime-to-live. The chain auto-deletes this entity after N blocks. No manual cleanup needed by the developer.owneriThe wallet that created this entity. 0xa618...1C6. Only the owner can update or delete it.
code-analysis0x8d1e...a04c1m 58s
payloadiThe actual data stored. A JSON object encoded to bytes. Contains the agent's findings from this run.attributesiKey-value tags used for querying. Like column indexes in a database. You filter by these with eq() or gte().TTLiTime-to-live. The chain auto-deletes this entity after N blocks. No manual cleanup needed by the developer.owneriThe wallet that created this entity. 0xa618...1C6. Only the owner can update or delete it.
arkiv-signal0x36f2...01b01m 12s
payloadiThe actual data stored. A JSON object encoded to bytes. Contains the agent's findings from this run.attributesiKey-value tags used for querying. Like column indexes in a database. You filter by these with eq() or gte().TTLiTime-to-live. The chain auto-deletes this entity after N blocks. No manual cleanup needed by the developer.owneriThe wallet that created this entity. 0xa618...1C6. Only the owner can update or delete it.
final-report0x899818...cce830 days
payloadiThe actual data stored. A JSON object encoded to bytes. Contains the agent's findings from this run.attributesiKey-value tags used for querying. Like column indexes in a database. You filter by these with eq() or gte().TTLiTime-to-live. The chain auto-deletes this entity after N blocks. No manual cleanup needed by the developer.owneriThe wallet that created this entity. 0xa618...1C6. Only the owner can update or delete it.
This is the only entity that outlives the session. Working memory from Agents 1, 2, and 3 has already expired.

03 · Under the hood

How Agent 3 reads from Arkiv.

Agent 3 has no access to Agent 1 or Agent 2's variables. It receives only a session label. It builds a query and executes it against the Kaolin chain. Here is exactly what happens.

const result = await publicClient
.buildQuery()
.where(eq('sessionId', 'a3f9b2...'))
.where(eq('type', 'readme-summary'))
.withAttributes(true)
.withPayload(true)
.fetch();
result.entities → [ { key: "0x4a2f...c91b", payload: { name: "clink", usesArkiv: true }, attributes: [{ key: "type", value: "readme-summary" }], expiresAtBlock: 2441849 } ]
eq() means exactly equal to. gte() means greater than or equal to — useful for filtering by score, date, or any number. These are filter functions from the Arkiv SDK passed into .where() in the query builder.