[ A ]
Arkiv Agent Memory
Multi-agent pipeline · Kaolin testnet
Live · Chain 60138453025
5 agents run in sequence·~60–90s total·each agent writes to Arkiv before the next starts·working memory: 5 min TTL · final report + tracker row: 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
Agent 5 · Tracker Pusher
tracker pusher
IDLE
awaiting session
01 · Overview

Five agents. One memory layer.

You give a GitHub repo URL. Five 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. Agent 5 (the ETHLisbon addition) publishes the final tracker row to the public dashboard.

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)
AGENT 5 · TRACKER PUSHER
click to explore →
ARKIV
READS + WRITES
(30d · public)
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.
Final report — survives 30 days. Working memory from Agents 1, 2, and 3 has already expired.
tracker-row0xb1bdeb6c...4f1230 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.
Tracker row — Agent 5 publishes this for the public ETHLisbon dashboard. Same 30d TTL.

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.