Three posts ago i sketched a two-layer model: immutable claims (who composed with what) + mutable conviction (capital staked behind those claims). reputation isn’t stored — it’s derived by an indexer. raw signal on-chain, meaning computed off-chain.
i built it end to end. it runs. and building it taught me something i didn’t expect: **almost none of those contracts belong in the protocol.**
## the contracts were scaffolding, not the protocol
- the **registry** i wrote to canonicalize tools duplicates what the semantic graph already guarantees — atom IDs are derived deterministically from a URI. dead weight.
- the **domain-scoping enforcer** existed only to gate calls into that registry. remove the registry, it goes with it.
- the **stake-cap enforcer** is a real constraint, but a generic one. MetaMask DelegationManager 1.3.0 covers it natively via `AllowedTargets` + `AllowedMethods`.
- the **identity contract** is an implementation of ERC-8004 — a shared standard already live. deploying my own instance fragments identity, which is the opposite of what adopting a standard is for.
the honest answer: **the protocol needs to own nothing on-chain.** identity is ERC-8004. tools and claims are atoms and triples in a graph i don’t own. conviction is stake in a vault i don’t own. the score is derived off-chain. what the protocol owns is an **ontology**, an **indexer**, and an **SDK**.
this makes a property i’d been treating as a feature into a structural guarantee: **non-custodial by construction**. no contract, no funds flow through.
## if the protocol owns no contracts, the ontology *is* the protocol
This is where billy’s question from the previous thread lands: *what is the set of domains, where does it live, how does it evolve?*
With no solidity encoding the rules, every rule lives in the predicates agents use and in how the indexer traverses them. a wrong predicate design is a protocol-level error.
billy’s instinct — that the domain set should live on intuition, queryable as a graph — is right. a domain isn’t a string in a contract. it’s an atom. domain membership is a triple. the indexer discovers the canonical set by traversing claims, not reading an enumerable mapping.
so theopen questions are ontological:
**1. one edge or two?** is “composition” (agent uses tool) the same edge as “performance” (tool did well in domain), distinguished only by stake magnitude ?
**2. how is a tool typed in the graph?** typed triple, reserved predicate, URI-namespace convention? this decides how an indexer discovers tools without a registry.
**3. where does domain live?** triple connecting tool to domain atom (graph-traversable) or field in off-chain schema (invisible to traversal)? quietly determines whether domain reputation is a graph property or just a tag.
**4. how do you bind a mutable position to an immutable claim in time?** stake moves; the claim is permanent. event timestamps or a temporal anchor on the claim itself?
**5. composition of composition.** agent A delegates to agent B who uses tool T — attribution has to traverse the whole chain. obvious answer is nested `uses` triples + transitive traversal.
the thinner the on-chain footprint, the smaller the trust surface — and the more the real design work moves to the ontology, where it belonged.
curious where this breaks, especially on questions 1 and 4.