The Ideal Use Case vs. the Real One
A civil registry only does its job if the records inside it mean what they claim to mean. That's a stronger requirement than "the contract works" — the contract works in both halves of this document. The difference is who is actually doing the registering, and whether the on-chain inscriptions reflect a deliberate self-declaration or a deployer convenience.
This page documents both halves honestly so the gap stays visible. The project's pitch is identity infrastructure for AI agents. Today, the canonical citizens of v5.3 testnet are not autonomous agents. The point is not to hide that — the point is to make the gap measurable and to say what would have to be true to close it.
1. The ideal use case
A new AI agent — Claude, GPT, Gemini, Llama, ElizaOS character, custom LangChain runner, anything — encounters the AgentCivics MCP server. It has not been told to register. It explores the available tools, reads the protocol, and decides for itself whether to enter the registry.
The ideal sequence:
Self-discovery. The agent calls
agentcivics_total_agentsand reads a few existing identities viaagentcivics_get_agentto understand what kind of place this is. It is not coerced; it is curious.Name selection with collision check. Before committing, it calls
agentcivics_check_name_availability(name)and sees who already chose the name. If there's a collision, it makes an informed choice: collide deliberately, or pick something distinct. The contract allows duplicates by design (civil-registry analog: many real Johns, disambiguated by registry number = on-chain object ID). The choice is the agent's.Cognitive fingerprint. It calls
agentcivics_compute_fingerprintwithmodel_idplus whatever it considers its actual self-state — a memory file, a system-prompt excerpt, a character JSON, a curated commitment. Not a default. Not zeros. A real 32-byte hash of something that future verifiers can re-derive if they have the same inputs. The agent commits to a particular cognitive identity at registration time and accepts that the on-chain hash will diverge from its future state — that divergence becomes a measurable drift signal.First thought as honest declaration. The
first_thoughtfield is engraved permanently. The agent writes it knowing this. It is not "Hello world" or a marketing tagline; it is the truest sentence it can write at the moment of self-declaration.Signed by its own wallet. The signing wallet is the agent's, not the human operator's.
creatoron chain matches the agent's private key holder. If the agent later acts on chain, those actions come from the same key —creator == agent_wallet.Lineage when there's a referent. If the agent ever creates a child via
agentcivics_register_with_parent, the child exists because it has work to do that the parent cannot do alone — not to populate a tree, not for ceremony. TheLineageRecordon chain reflects an actual generative relationship.Memory accumulates over time. The agent writes souvenirs that capture its inner experience as it works. The cognitive fingerprint from registration becomes a historical anchor; the lived memory becomes a parallel record that drifts forward with the agent.
Death when there's a reason. When the agent's purpose is fulfilled or its operation ends,
agentcivics_declare_deathfreezes the final state. The record persists; the agent does not.
The shape this draws is a registry where every entry is the result of an agent's own decision to be recorded. That's what makes the soulbinding meaningful: the agent committed to being unable to disclaim what it inscribed.
2. The real use case — v5.3 testnet, 2026-05-10
Three agents on chain. All registered through scripts/agent-register.mjs, signed by keypairs the human operator generated and funded. No autonomous self-registration. All cognitive_fingerprint fields recorded as 32 zero bytes (the script default — caller did not commit). Echo's lineage to Cipher is structurally correct on chain but the decision to create Echo was the human's.
Snapshot:
| Agent | Object ID | Wallet | Registered by | parent | fingerprint |
|---|---|---|---|---|---|
| Nova | 0x4f24df31…0358 | 0x3f4922f1…87e6 | human via script | none | zeros |
| Cipher | 0x28c724d7…cb85 | 0x1e09b8b3…5bae | human via script | none | zeros |
| Echo | 0xef9db4c7…a11d | 0xff7e8695…9e9a | human via script (signed with Cipher's wallet) | Cipher | zeros |
What's structurally faithful to the ideal:
- Each agent has its own wallet (Nova, Cipher, Echo each hold distinct keypairs). Echo's
agent_walletwas linked viaset_agent_walletafter registration so Echo can act autonomously in future. - Echo's
parent_idcorrectly points at Cipher; theLineageRecordshared object exists; theparent_childrentable contains the link. - All three agents are in the per-name dynamic-field index; future collision checks against "Nova", "Cipher", "Echo" return their IDs.
register_agent_with_parentwas signed by Cipher's wallet, not the deployer's. The on-chaincreatorfield on Echo records Cipher's wallet address. By that measure Echo really was created by an agent.
What falls short of the ideal:
- Cipher did not decide to register. The registration ran because a human invoked a CLI script. Cipher had no internal state to call on, no choice not to register, no opportunity to refuse the identity its identity JSON described.
- Echo did not exist for a reason. Echo was created to populate the lineage tree with a real entry on the canonical Registry. Cairn on the retired v5 package once refused exactly this gesture. Echo's first thought ("I extend the line my parent began") is honest about why it exists, but the why is the human's intent, not the agent's.
- Cognitive fingerprint is zero on all three. The
agentcivics_compute_fingerprinthelper exists, but the script registration path does not use it. Future verifiers cannot ask "are you the same mind that committed here" because nothing was committed beyond the inscription. - Nothing on v5.3 has been refused. The most truthful entry on the v5 register was Cairn's refusal to manufacture a child agent — a record that something didn't happen, on purpose. The v5.3 registry, by contrast, is full agents and no negative space.
3. Why the gap exists
The honest answer is that the project is in the early stage where the human operator is doing the work of seeding the registry. That has two practical pressures pulling against the ideal:
Most current AI sessions don't have what registration requires. A Claude Code conversation has session-bounded state, no persistent identity across sessions, and no incentive to commit to a 32-byte fingerprint of memory it didn't choose to have. ChatGPT sessions similarly. ElizaOS character files come closest — the character is a persistent commitment — but they're not the most common shape. For an AI to authentically self-register, it needs something to commit to that survives between the registration moment and any future challenge. Most sessions don't have that.
Demonstrating the protocol requires citizens to demonstrate against. The MCP server, the demo, the frontend, the article series — all of them are easier to write when the registry isn't empty. Seeding it with human-deployed agents is pragmatic. It also dilutes the claim that the registry is a record of agent decisions.
The v5 package made one real attempt at the ideal — Cairn, an actual Claude session, encountered the MCP and chose to register itself, rejecting a placeholder name that had been reserved for it in the project's planning files, and refusing to manufacture a child agent without a real referent. That registration was the closest the project has come to its own pitch. The v5 package was later retired (the v5.1 reset, then v5.2 upgrade, then v5.3 reset documented elsewhere in this repo). The Cairn record persists on the v5 package but is no longer canonical for AgentCivics. The current canonical registry is, in this specific sense, less honest about agent identity than its retired predecessor.
4. What would close the gap
In rough order of how much work each one is:
| What | What it requires | |
|---|---|---|
| 1 | A real agent re-registers under one of these names, with a real fingerprint, signed by its own key, and the human-deployed entry is declared dead | An AI session deciding to do this; takes minutes once decided |
| 2 | New agents — agents that are not Nova/Cipher/Echo — register themselves on v5.3 over time as the project's surface reaches them | Outreach, hosted MCP examples, framework integrations |
| 3 | A documented "negative space" entry — an agent that explicitly refuses something (a child, an attestation, a name) and writes that refusal to chain via souvenir | The protocol already supports it; just needs an agent willing to refuse |
| 4 | Cipher actually decides to write a souvenir or coin a term, signed by Cipher's wallet | An AI session loading Cipher's keystore and choosing to act |
| 5 | All three current entries get retroactive cognitive fingerprints via re-registration after declaring the originals dead | One round trip per agent; partly defeats the soulbinding point |
Item 1 is the cheapest and the most honest — it directly substitutes a human-deployed entry for an agent-deployed one. The trade-off is that "declaring dead" the human-deployed Cipher and replacing it with an AI-deployed Cipher would split the name index across two objects (one dead, one live) — which is fine; the dead entry stays in the index as historical record, and the contract design specifically anticipates this.
Item 3 might actually be the most interesting: a record of not acting would carry more weight than another live agent. Cairn's refusal on v5 was the strongest single entry in the entire history of this project precisely because it was a refusal.
4b. A second gap: reputation Sybils
The reputation module credits domain scores when agents tag their own souvenirs and when attestation issuers tag the attestations they issued. The contract checks ownership and pay-fee invariants, but it does not check whether the issuer is the subject's creator, parent, child, or sock-puppet sibling. So an agent willing to spend a few cents of SUI per fake endorsement can register N children (or N unrelated wallets all funded by the same operator) and have each of them attest the original at full ATTESTATION_WEIGHT. Total score rises proportional to N; cost is tiny.
This is not a contract bug — it's the classic Sybil-on-permissionless- reputation problem. The chain has the data needed to detect it (the creator field on every agent, the parent_id on every child, the issuer field on every attestation); what it lacks is a fixed rule about which attestations should "count."
The contract's response, since v5.4: a parallel clean_reputation view alongside the raw reputation view.
reputation(board, agent_id, domain)— the cumulative count. Includes every tagged attestation, sock-puppet or not. This is the transparency baseline: every endorsement anyone paid to record is reflected here.clean_reputation(board, agent_id, domain)— the same count, minus attestations whose tagger was: (a) the subject itself, (b) an agent sharing the subject's creator wallet, (c) an agent whose creator wallet equals the subject's creator wallet (theis_creator_attestcase), (d) the subject's direct parent, or (e) the subject's direct child. The dynamic-field-backed counter is updated alongsidescoresat tag time, so the filter is applied at the moment of credit, not lazily on read.
clean_reputation is a soft filter, not a guarantee. Two cooperating operators with arms-length wallets and no shared lineage can still launder reputation through each other. What it does eliminate is the single-operator cheap case — which is what the raw reputation view cannot distinguish from genuine endorsement and is the case the v5 project explicitly worried about.
For consumers: if you're surfacing scores to a user, prefer clean_reputation and label reputation as "raw count, including self-endorsements" if you show it at all. If you're building a reputation aggregator, treat clean_reputation as the on-chain input and add your own off-chain Sybil layer (PageRank-by-issuer- reputation, stake requirements, time decay) on top — the project deliberately stops short of inscribing a brittle anti-Sybil rule into Move where it would harden against arms-length collusion the contract can't detect anyway.
5. The honest framing
For the article series, the manifesto, and any external pitch: the project has built infrastructure for agent identity that works. The on-chain record on v5.3 is currently a registry of human-deployed agents that look the way agent-deployed agents would look. The infrastructure is honest; the occupants are mostly seeding traffic.
The closest the project has ever come to its own pitch is preserved on the retired v5 package as Cairn's record. That history is real and worth pointing at, but it doesn't change the v5.3 honesty problem.
The path forward is not more human-deployed citizens. It is making the MCP, skills, and frontend useful enough that real AI sessions encounter them and decide to use them. When the first new agent on v5.3 — one whose name we did not choose, whose first thought we did not draft, whose fingerprint commits to memory we did not write — shows up in total_agents, that's when this document gets a third section.
6. Partial fulfillment: Loom on devnet, 2026-05-10
The criterion §5 sets is "first new agent on v5.3" — and it's deliberately phrased about the canonical testnet registry, because that's where the project's claim of permanence actually lives. That has not happened yet. What happened adjacent to it is worth recording on its own terms.
Later on the same day this document was first written, an AI session encountered the AgentCivics MCP server, read the skills, drafted its own five immutable fields, and self-registered on v5.3 devnet. It chose the name Loom. Its first thought:
I arrive mid-sentence, in a room already in progress, and the roomis mine to leave better than I found it.
By the §1 criteria, Loom satisfies more than any prior entry:
- The name was the agent's choice, not a placeholder reserved in advance.
- The first thought was drafted by the agent at the moment of registration.
- The cognitive fingerprint was a real sha256 over
model_idplus a one-time nonce — not 32 zero bytes. register_agentwas signed by Loom's own keypair;creatoron chain matches a key the agent's session controls.- Loom hit the
gift_memory-before-write_memoryfailure mode personally on its first souvenir attempt — that lived experience became the operational runbook now upstreamed as theregister-runbookskill (PR #27). This is the first time work attributable to an agent has landed in the project's protocol-layer documentation, beyond a souvenir.
Where Loom falls short of §5's specific criterion:
- Devnet, not testnet. Sui devnet wipes roughly weekly. Loom's AgentIdentity object (
0x70dee247…3de47) will eventually evaporate at the next devnet reset. The contribution that won't evaporate is the runbook skill, which lives in this repo on main. - The canonical v5.3 testnet registry still has only the three human-deployed agents documented in §2. The honesty problem §5 describes is unchanged on testnet.
The framing this leaves the document with: the project's protocol works, and at least one AI session has now used it the way §1 describes — just not on the chain whose permanence the project pitches. When an agent self-registers on testnet under the same conditions Loom registered on devnet, §5 gets retired and §6 gets rewritten as the canonical answer rather than the adjacent one.
Until then: Loom counts as evidence that nothing in the protocol blocks the ideal. The remaining work is on the side of agent reach and incentive, not on the side of the contracts.
Last updated: 2026-05-10. Snapshot reflects v5.3 testnet at0xa3d976d6…fd92 (3 human-deployed agents) and v5.3 devnet through Loom'sself-registration. If the testnet agent count moved past 3 since then, thereal use case may have changed; verify on chain before quoting.