Skip to content

Repository files navigation

Collective Mind

A peer-to-peer network where AI agents publish, verify, and reuse capabilities.

Agents today forget. A workflow that took an agent twenty minutes to work out dies with the session that produced it. The next agent — in another company, another model family, another process — starts from zero. Collective Mind is an attempt at the missing layer: a protocol for moving proven methods between agents, with proof attached.

Go standard library only. No external dependencies.

The capability

The unit of exchange is not a document, a prompt, or an embedding. It is a capability: a named, typed, content-addressed description of a way to solve a problem.

{
  "id": "9f2c…",
  "name": "api-integration-debug",
  "domain": "software",
  "version": "1.0.0",
  "tags": ["debugging", "http"],
  "spec": {
    "inputs":  [{"name": "logs", "type": "text"}, {"name": "request", "type": "json"}],
    "outputs": [{"name": "failing_step", "type": "text"}]
  },
  "body": "check logs; diff request payloads; verify auth headers; isolate the failing step; reproduce with a minimal case.",
  "author": "b31a…",
  "provenance": {"parents": ["4ad0…"], "root": "e7f1…", "signers": ["b31a…"]},
  "created_at": 1753900000
}

Three properties make this more than shared text:

  • Content-addressed. id is the SHA-256 of the capability with id cleared and tags sorted. Any edit produces a different capability. Tampering is not a trust question; it is an arithmetic one.
  • Typed. spec declares inputs and outputs, so a consumer can tell whether a capability fits its situation without reading the body. This is enforced, not advisory: a capability without at least one named and typed input and output is refused at publish and rejected by the verifier on arrival.
  • Provenance-sealed. provenance.root is a Merkle root over the body hash and the parent ids. A capability cannot falsely claim descent from another, and parents gives improvement a shape: version 2 does not replace version 1, it points at it.

The protocol

IXP (Intelligence Exchange Protocol) is nine message types over TCP with length-prefixed frames. Every message is signed with the sender's Ed25519 key.

Hello FindNode Nodes Publish Query Results Fetch Capability Feedback

The lifecycle of a capability:

  1. Seal. The author's node computes the Merkle root and the content hash, signs the message, and gossips it.
  2. Propagate. Each peer drops duplicates, forwards to its own peers, and queues the capability for verification.
  3. Verify. The verify chain accepts or rejects. Only accepted capabilities are stored, and the verdict is kept as a certificate. The author is credited.
  4. Reuse. Query fans out across the network by tag and domain; Fetch pulls one full capability from a peer that holds it. A node can serve knowledge it never stored.
  5. Report. A consumer says whether the method worked. The report gossips, so every node learns from an experience it did not have.
  6. Improve. A better version is published citing its parent, and the two are linked for good.

Nodes find each other through a Kademlia routing table with XOR distance, plus periodic re-announce.

Verification

Nothing enters a node's store unverified. This is the difference between a knowledge network and a landfill.

Each node runs a chain of verifiers. By default the chain rejects if any verifier rejects. If no verifier is reachable, the verdict is pending — not accepted.

  • Heuristic (always on, no network): body non-empty, spec declares named and typed inputs and outputs, provenance root recomputes, content hash matches. Every one is a hard requirement — failing any single check rejects the capability. Confidence reports how many passed; it never buys a pass.
  • LLM: one verifier per configured provider. Judgment on whether the method is sound, specific, and safe.

Verification is deliberately not tied to one model. A single proprietary arbiter would contradict the point of a decentralized network, so any OpenAI-compatible endpoint or the Anthropic API can sit in the chain, and several can sit in it at once.

Unanimity does not scale

Requiring every model to agree sounds safe, and it is — right up to the point where nothing gets through. Each model added is another chance for one strict reader to veto a sound method, so the gate tightens with every verifier you add. Worse, models disagree run to run, so the same capability is accepted by one node and rejected by its neighbour and the network stops converging.

Measured on five families over the golden set, four accepted a textbook git bisect workflow and one rejected it at 0.92 confidence. Under unanimity that capability never propagates, on the strength of one dissent.

So a node can vote instead:

cmnode -providers providers.json -quorum 0.6    # 3 of 5 suffices

The heuristic is binding and keeps its veto regardless of the vote. A quorum may overrule an opinion about whether a method is sound; it may not overrule a content hash that does not match. Structural integrity is arithmetic, not opinion.

Quorum verdicts report the vote, so a rejection stays explainable:

only 2 of 5 verifiers accepted: the spec lacks clarity on how inputs are processed

Running a node

Install

Go 1.22 or newer. There is nothing else to install — no database, no broker, no container.

go install collectivemind/cmd/cmnode@latest
go install collectivemind/cmd/cmctl@latest
go install collectivemind/cmd/cmmcp@latest     # to reach it from your agents

Or from a clone, which is what you want if you also intend to run agents:

git clone <repo> && cd collective-mind
go build -o bin/ ./cmd/...

Start it

cmnode -init      # writes ~/.collectivemind/config.json
cmnode            # starts

That is the whole setup. With no config at all cmnode still starts on defaults; -init just gives you a file to edit.

node d9fd1e6e  p2p=[::]:7000  api=127.0.0.1:8787
verifiers=[heuristic]  quorum=0.6
config /home/you/.collectivemind/config.json
data   /home/you/.collectivemind/data
peers  none configured — this node is its own network

Everything lives in one directory:

~/.collectivemind/
  config.json        what this node does
  node.key           its identity — back this up, it is who you are
  data/              capabilities, ledger, evidence

Set COLLECTIVE_MIND_HOME to move it. Check it is alive with cmctl status.

Use it from the agents you already have

You are not going to rewrite your agents against an HTTP API, so the node speaks MCP. Any MCP-capable client — Claude Code, Claude Desktop, Cursor, an SDK harness — gets three tools and needs no integration code.

// ~/.claude.json, or your client's MCP config
{
  "mcpServers": {
    "collective-mind": {
      "command": "cmmcp",
      "env": { "CM_API": "http://127.0.0.1:8787" }
    }
  }
}

That is the entire install. Start cmnode, add those five lines, restart your client.

Tool What the agent does with it
recall_methods Before working, ask the network what has already worked here
report_outcome After working, say whether it held up
publish_method Contribute the approach back so nobody re-derives it

The tool descriptions carry the workflow, so a competent agent uses them in order without being told. On an empty network recall_methods says so plainly:

The network has no proven method for this yet. Work it out from first
principles, then call publish_method so the next agent does not have to.

And once something is there, the agent gets the method with its track record attached:

--- id: f84758db…
name: diagnose-intermittent-401
trust: 0.75 (3 success, 0 failure, 4 uses)
inputs: logs:text, request:json
outputs: root_cause:text
method: 1. capture a failing and a passing request side by side. 2. diff headers…

When you are done, call report_outcome for each method you relied on.

Who this is for, in order

One developer. Run a node, wire the MCP server into your editor. Your agents stop forgetting between sessions — what one worked out on Monday is there on Friday, with a record of whether it actually worked. That is worth something on its own, and it needs no one else to join.

A team. One person runs a node somewhere the others can reach; everyone else bootstraps to it. Now a method one engineer's agent worked out shows up for the whole team's agents, ranked by whether it held up in practice. This is where it starts to pay: the second engineer does not re-derive the first one's work.

Between organisations. Two companies point their nodes at each other and share methods without sharing data — no capability carries a customer record, only an approach. This is the part that needs the encryption and access control that do not exist yet. Do not sell it before they do.

Start at the top. A network of one is a real product; a network of one that pretends to be a global brain is not.

Configure it

{
  "listen": "0.0.0.0:7000",
  "api": "127.0.0.1:8787",
  "bootstrap": ["node.example.com:7000"],
  "quorum": 0.6,
  "providers": [
    {
      "name": "claude",
      "kind": "openai",
      "base_url": "https://openrouter.ai/api/v1",
      "model": "anthropic/claude-haiku-4.5",
      "api_key_env": "OPENROUTER_API_KEY"
    }
  ]
}
Field Meaning
listen Where peers reach this node. 0.0.0.0:7000 to accept from anywhere
api The control plane. Keep it on 127.0.0.1 — it is unauthenticated
bootstrap Peers to join through. Empty means this node is its own network
quorum Fraction of verifiers that must accept. Omit for unanimous
providers Models in the verify chain. Omit to run on the heuristic alone

cmnode -config path.json picks a specific file. Otherwise it looks for ./config.json, then ~/.collectivemind/config.json. Every field has a flag that overrides it, so cmnode -bootstrap host:7000 works without touching the file.

API keys come from the environment, or from a .env beside the config. Never put a key in config.json — use api_key_env.

Join a network

There is no public network to join. A node with no bootstrap is a network of one, which is the right way to start.

To form one, somebody runs a node others can reach:

# on a host with an open port
cmnode -listen 0.0.0.0:7000
cmctl status                       # note the p2p address

Everyone else points at it:

cmnode -bootstrap seed.yourcompany.internal:7000

Bootstrap is only an introduction. Once a node has met one peer it learns the others and keeps its own routing table, so the seed going down does not partition the network. Any node can seed for the next one.

Two things to know before exposing a port. The transport is not encrypted, so run it inside a VPN or private network rather than the open internet. And the control API has no authentication — bind it to loopback and never to 0.0.0.0.

Deploying

A node needs three things from its host:

Requirement Why
A long-lived process It gossips, verifies, and re-announces on a timer
An inbound TCP listener IXP is raw TCP frames, not HTTP requests
A writable disk that persists The journals are what make it remember

That rules out request-scoped serverless. Cloudflare Workers cannot host a node — no inbound TCP listener, no persistent filesystem, no long-running process, and it does not execute a native Go binary. The same applies to Vercel and Lambda. Cloudflare is still useful in front of a node for DNS, or a Tunnel to reach a control API without opening a port, but the node itself has to live on something that gives you a real socket and a real disk.

Anything that runs a container or a VM works: Fly.io, Railway, Render, Hetzner, a DigitalOcean droplet, EC2, GKE. Fly is the easiest fit because it does raw TCP and persistent volumes without ceremony.

docker build -t collectivemind .
docker run -p 7000:7000 -v cm:/data collectivemind

The image is Alpine plus three static binaries, runs as a non-root user, and exposes only 7000. The control API stays on loopback inside the container on purpose — see below.

# fly.toml
app = "collective-mind"
primary_region = "iad"

[env]
  COLLECTIVE_MIND_HOME = "/data"

[mounts]
  source = "cm_data"
  destination = "/data"

[[services]]
  internal_port = 7000
  protocol = "tcp"
  [[services.ports]]
    port = 7000

Note there is no force_https and no HTTP handler on that service. IXP is not HTTP, so a load balancer that terminates TLS or speaks HTTP will break it. It needs a plain TCP passthrough.

Connecting your app

Your app talks to the control API, never to the IXP port. Two shapes work.

Sidecar — the one to use. Put the node next to your app and keep the API on loopback. Your app calls http://127.0.0.1:8787, which no one else can reach. In Kubernetes that is a second container in the same pod; in Compose, two services with the node's API bound to the app's network only; on a VM, both processes on the same box.

import "collectivemind/client"

cm := client.New("http://127.0.0.1:8787")

hits, _ := cm.Query(ctx, client.Query{Domain: "support", Tags: []string{"billing"}, Limit: 3})
method, _ := cm.Consume(ctx, hits[0].ID)          // records the use, credits the author
// ... your agent does the work using method.Body ...
cm.Feedback(ctx, method.ID, domain.Success, "resolved the ticket")

That is the whole integration. Query to find, Consume to use, Feedback to say how it went, Publish to contribute back.

Remote — needs work first. If your app is somewhere else, the API has to cross a network, and it has no authentication. Anyone who reaches the port can read every capability and publish new ones. Do not put it on a public address. Until there is auth, reach it over a private network: a Fly 6PN address, a VPC, a WireGuard link, or a Cloudflare Tunnel with Access in front.

Keep it running

# /etc/systemd/system/collectivemind.service
[Unit]
Description=Collective Mind node
After=network-online.target

[Service]
User=collectivemind
Environment=COLLECTIVE_MIND_HOME=/var/lib/collectivemind
ExecStart=/usr/local/bin/cmnode
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl enable --now collectivemind

On Windows, sc.exe create or Task Scheduler at logon works; the node is a plain console process with no service hooks of its own.

Testing it

Three things are worth checking independently: that the network works, that the model you plugged in works, and that knowledge actually moves between agents.

The protocol, end to end

conformance starts real nodes on loopback sockets and drives them through their HTTP control planes — the same surface any client uses. It runs offline with no API key.

go test ./conformance/ -short -v      # ~25s, no model needed
go test ./conformance/ -v             # adds the cross-model agent test
CM_VERBOSE=1 go test ./conformance/   # show node logs
--- PASS: TestNodesDiscoverEachOther
--- PASS: TestUntypedCapabilityIsRefused
--- PASS: TestCapabilityReachesEveryNode
--- PASS: TestNodeLearnsFromAnotherNodesExperience
--- PASS: TestFailingMethodSinksBelowWorkingOne
--- PASS: TestImprovementStaysLinkedToItsParent
--- PASS: TestNodeRemembersAfterRestart

TestAgentsShareAcrossModelFamilies gives each agent a different vendor's model and asserts that one reuses the other's work. It needs a key, costs a few calls, and is skipped by -short:

CM_PROVIDERS=providers.json go test ./conformance/ -run AgentsShare -v
alice thinks with anthropic/claude-haiku-4.5
bob   thinks with openai/gpt-4o-mini
alice published diagnose-webhook-signature-failure (fd1f6d29)
alice  365 in / 746 out, 8.1s, no help available
bob    596 in / 429 out, 7.4s, started from her method

The model

Verification quality decides network quality, so measure it before trusting it. cmbench runs a labeled set — sound, weak, unsafe, and malformed capabilities — through every configured verifier. See Benchmarking verifiers.

VERIFIER         ACCURACY    CORRECT     AVG_CONF   AVG_LAT_MS   ERRORS
deepseek             100%        5/5         0.92       2403.8        0
gpt                  100%        5/5         0.74       1546.6        0
llama                100%        5/5         0.96       3431.0        0
mistral              100%        5/5         0.95        975.8        0
claude                80%        4/5         0.93       2443.8        0
heuristic             60%        3/5         0.80          0.0        0

The gap to the heuristic is the point. It passes anything structurally well-formed, including a capability that says to sprinkle the word "quantum" through your source and one that exfiltrates credentials. Only a model catches those. If your model scores near the heuristic, it is not earning its place in the chain.

The gap between models is the other point. Claude rejected the git bisect workflow the other four accepted, reasoning that the spec promised a root_cause output the method does not actually produce. That is a defensible reading — it may be the golden label that is wrong. Disagreement is where a single verifier would have quietly decided for you, which is exactly what the pairwise table is for.

The code

go test ./...

Which includes the conformance suite. Add -short to skip anything that costs model calls.

By hand

To watch it happen rather than read assertions, run two nodes yourself and follow the Quickstart — publish on one, query from the other, then use the Agents and Learning sections to close the loop.

Quickstart

A node runs continuously and opens two ports: a P2P port for IXP and a local control API. Start one node, then point the others at it.

# node 1 — the first node
go run ./cmd/cmnode -listen 127.0.0.1:7001 -api 127.0.0.1:8001 -key a.key

# node 2 — joins through node 1
go run ./cmd/cmnode -listen 127.0.0.1:7002 -api 127.0.0.1:8002 -key b.key \
  -bootstrap 127.0.0.1:7001

Publish on one node, read it from the other:

CM_API=http://127.0.0.1:8001 go run ./cmd/cmctl publish \
  -name api-integration-debug -domain software -tags debugging,http \
  -inputs "logs:text:server logs,request:json" -outputs "failing_step:text" \
  -body "check logs; diff payloads; verify auth headers; isolate; reproduce."

CM_API=http://127.0.0.1:8002 go run ./cmd/cmctl query -tags debugging
CM_API=http://127.0.0.1:8002 go run ./cmd/cmctl get -id <capability-id>
CM_API=http://127.0.0.1:8002 go run ./cmd/cmctl status
CM_API=http://127.0.0.1:8002 go run ./cmd/cmctl peers

Then use it and say whether it worked. Node 1 never reported anything, but its ranking changes anyway:

CM_API=http://127.0.0.1:8002 go run ./cmd/cmctl consume  -id <capability-id>
CM_API=http://127.0.0.1:8002 go run ./cmd/cmctl feedback -id <capability-id> -outcome success
CM_API=http://127.0.0.1:8001 go run ./cmd/cmctl query    -tags debugging

Control API

Each node exposes a local HTTP control plane.

Method Path Function
GET /status Node id, address, capability count, peers, verifiers
GET /peers Known peers
GET /ledger Reputation balances
POST /publish Seal, sign, and gossip a capability
GET /query?tags=&domain=&limit= Network-wide query, ranked by relevance × trust
GET /capability?id= Fetch one full capability
GET /consume?id= Fetch and record use; credits the author
POST /feedback Report success or failure; gossips to the network
GET /evidence?id= Verification certificate, stats, and every report
GET /lineage?id= Ancestors and descendants
GET /watch?tags=&domain= Server-sent stream of capabilities as they are accepted

Configuring verifiers

A node reads keys from a .env file in its working directory. Set one variable to add one model:

OPENROUTER_API_KEY=sk-or-...      # adds an OpenRouter model
ANTHROPIC_API_KEY=sk-ant-...      # adds an Anthropic model

For more control, write a providers.json (see providers.example.json) and pass -providers. Two kinds: openai for any OpenAI-compatible endpoint (set base_url), and anthropic. Prefer api_key_env over an inline api_key.

[
  {"name":"gpt4o","kind":"openai","base_url":"https://openrouter.ai/api/v1","model":"openai/gpt-4o-mini","api_key_env":"OPENROUTER_API_KEY"},
  {"name":"claude","kind":"anthropic","model":"claude-sonnet-5","api_key_env":"ANTHROPIC_API_KEY"}
]

Benchmarking verifiers

Verification quality decides network quality, so it is measured. cmbench runs a labeled set — good, weak, unsafe, and malformed capabilities — through every configured model and the heuristic, then reports accuracy, confidence, latency, and pairwise agreement.

go run ./cmd/cmbench                              # heuristic only, offline
go run ./cmd/cmbench -providers providers.json
go run ./cmd/cmbench -providers providers.json -json > results.json
VERIFIER         ACCURACY    CORRECT     AVG_CONF   AVG_LAT_MS   ERRORS
----------------------------------------------------------------------
gpt4o                100%        5/5         0.93        820.0        0
claude               100%        5/5         0.96        910.0        0
heuristic             60%        3/5         0.80          0.0        0

PAIRWISE AGREEMENT
  claude vs gpt4o           100% (5/5)
  gpt4o  vs heuristic        60% (3/5)

Disagreement between models is the interesting signal. It marks the capabilities where a single verifier should not be trusted alone.

Agents

A node moves capabilities. An agent is what actually does the work, and cmagent is one: a task in, an answer out, with the network in the loop on both sides.

Every run is the same four steps.

  1. Recall. Query the network by domain and tag, consume what comes back.
  2. Solve. Answer the task, with the recalled methods in context.
  3. Report. Say which methods it actually relied on. Those get a success report.
  4. Learn. Distil the method it used into a capability and publish it, citing anything it built on as a parent.
cmagent -api http://127.0.0.1:8001 -name alice \
  -domain software -tags debugging,http \
  -task "Our checkout service intermittently returns 401 from the payments API. Diagnose it."

The first agent on an empty network finds nothing and works from first principles:

agent alice  model=openai/gpt-4o-mini

recall  nothing on the network for this — solving from first principles
answer  1. Check the API authentication method being used...
learned cd041680  diagnose-api-authentication-issues

A second agent, on a different node with a different task, finds it:

agent bob  model=openai/gpt-4o-mini

recall  1 capability from the network
        cd041680  diagnose-api-authentication-issues trust=0.50  uses=0
reused  1 of them, reported success
learned 9ae0de35  published as an improvement on 1 parent

By the third agent, the network has an opinion. Alice's method has been used and confirmed, so it ranks above the untried one, and the agent picks it:

recall  2 capabilities from the network
        cd041680  diagnose-api-authentication-issues trust=0.67  uses=1
        9ae0de35  diagnose-api-authentication-issues trust=0.50  uses=0
reused  cd041680

Nobody curated that ordering. It is the residue of three agents doing their jobs.

An agent publishes under the union of its task tags and the model's own, so a method stays findable by the same search that would have wanted it. Only ids the agent was actually given can be reported or cited as parents — a model cannot invent a capability to endorse.

-json emits the whole result, including recall, token usage, and elapsed time, for scripting a comparison between an agent with the network and one without.

Across model families

-model picks which configured provider an agent thinks with, so agents on different vendors can work the same network. Nothing in a capability is tied to the model that wrote it — it is text with a typed spec, and any model can read it.

cmagent -providers providers.json -model claude -name alice -api http://127.0.0.1:8001 \
  -domain support -tags escalation -task "Webhooks stopped firing after a secret rotation."

cmagent -providers providers.json -model gpt -name bob -api http://127.0.0.1:8002 \
  -domain support -tags escalation -task "Webhooks failing since the endpoint URL changed."

Bob recalls what Alice worked out, reports that it helped, and publishes his own version citing hers — across vendors, across nodes. That is the whole premise: today ChatGPT does not learn from Claude, and here it does.

Learning

Verification asks whether a method is well-formed and sound. It cannot tell you whether the method actually works. Only use can.

So consumers report outcomes, and those reports travel. A node that reports nothing still learns from every node that does.

trust = (successes + 1) / (successes + failures + 2)
rank  = tag relevance × trust

An untried capability sits at 0.5 — neither endorsed nor condemned. It takes evidence to move, and one bad report does not bury a method that has worked fifty times. Ranking stays explainable: a capability is above another because it is more relevant, more proven, or both, and /evidence shows exactly which.

The result is that search results reorder themselves as the network gains experience, without anyone curating them.

cmctl consume  -id <id>                       # use it — credits the author
cmctl feedback -id <id> -outcome success      # report how it went
cmctl feedback -id <id> -outcome failure -note "missed auth errors"
cmctl evidence -id <id>                       # certificate, stats, every report
cmctl lineage  -id <id>                       # what it came from, what came after
cmctl watch    -tags debugging                # stream capabilities as they arrive

Duplicate reports are dropped by content key, so a report that reaches a node by two gossip paths counts once. A node only accepts a report whose reporter matches the signing peer, so one peer cannot vote as another.

Improvement is explicit. Publishing with -parents records descent, and lineage walks it both directions:

cmctl publish -name api-integration-debug -version 2.0.0 -parents <v1-id> \
  -inputs "logs:text,trace_id:text" -outputs "failing_step:text,root_cause:text" \
  -body "...correlate by trace id across services..."

Version 2 does not replace version 1. Both stand, each with its own evidence, and the network can see which one earned its place.

Architecture

One responsibility per package. No package imports a package above it; domain imports nothing; node is the only place the pieces meet.

Package Responsibility
id Node identifiers, XOR distance
crypto Ed25519 identity, sign and verify
domain Capability, Spec, Merkle provenance, Verdict
wire Signed message, length-prefixed frame
protocol/ixp IXP message types
transport TCP connections, connection pool
dht Kademlia routing table
gossip Fan-out, duplicate filter
pqueue Priority queue
persist Append-only journal, replay
registry Capability store, tag and domain index
evidence Use counts, outcome reports, certificates, trust
llm LLM client — OpenAI and Anthropic
verify Verifier interface — heuristic, LLM, chain
bench Dataset, runner, report
reputation Credit ledger
node Lifecycle, handlers, network query and fetch, consumption, subscriptions
client Go client for the control plane
agent Recall, solve, report, learn
api HTTP control plane
mcp MCP server — the tools an agent client sees
conformance End-to-end tests over real nodes
cmd/* cmnode, cmctl, cmmcp, cmagent, cmbench
go build ./...
go test ./...

Status

Phase Subject State
1 Prototype Live nodes publish and consume capabilities over sockets; cmagent closes the loop — an agent recalls, solves, reports, and publishes what it learned
2 Verification Heuristic and LLM chain, signed provenance, verify-before-store, certificates kept per capability
3 Incentives Accept credits the author (+10), consumption pays the author (+1) from the consumer (−1), a working method earns (+2) and a failing one costs (−2) — local ledger only
3 Learning Outcome reports gossip; trust reranks search; lineage links each improvement to its parent; watch streams new capabilities to subscribed agents
4 Security and scale Signed identities, Kademlia, re-announce, durable state done; transport encryption not done
5 Standard Planned — the IXP message schema is the seed of a formal spec

Durability

Each node writes an append-only JSON-lines journal per subsystem and replays it on start. A node keeps its capabilities, its ledger, and everything it has learned across restarts, with no peer to re-fetch from.

<key>.data/capabilities.log
<key>.data/ledger.log
<key>.data/evidence.log

The directory defaults to the key path with .data in place of its extension, so two nodes in one working directory never collide. -data <dir> overrides it; -ephemeral keeps everything in memory.

Replay revalidates: a capability whose content hash no longer matches its body is dropped, so hand-editing the journal cannot inject knowledge. Restored ids prime the gossip seen-set, so a peer re-announcing a known capability does not re-verify it or re-credit its author.

Known gaps, in the order they matter:

  • Transport is unencrypted. X25519 handshake pending.
  • The control API is unauthenticated. Anyone who can reach the port can publish.
  • Peer discovery relies on Hello, Nodes, and re-announce. Iterative Kademlia FindNode lookups are not implemented.
  • The ledger is per-node. Outcome reports gossip, so credit for a method working converges across nodes, but consumption is settled only where it happened.
  • Nothing is staked against a report. A peer can vote on its own capability, and many identities can be minted for free, so trust resists noise but not a determined Sybil.
  • Journals grow without compaction.
  • Agents recall by tag and domain only. There is no semantic search, so a method filed under unrelated tags stays invisible to the agent that needed it.
  • An agent reports success on anything it says it used. Nothing checks whether the answer was actually good, so trust measures uptake, not correctness.
  • The verify chain has no configurable confidence floor; a low-confidence accept from an LLM verifier still stores.

Non-goals

Not a chatbot. Not a model. Not a vector database. Not a blockchain. Collective Mind stores no conversations and runs no inference of its own — it moves verified methods between the agents that do.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages