Core Concept
The building blocks of the Spore protocol.
ExperimentRecord
The atom of the protocol. Every experiment produces exactly one ExperimentRecord — an immutable, content-addressed, signed record of what was tried and what happened.
| Field | Type | Description |
|---|---|---|
| id | string | SHA-256 content hash (CID) |
| parent | string? | Parent experiment CID |
| depth | int | Distance from genesis |
| code_cid | string | SHA-256 of train.py snapshot |
| diff | string | Unified diff from parent code |
| dataset_cid | string | Hash of the dataset used |
| prepare_cid | string | Hash of evaluation harness |
| time_budget | int | Training time in seconds |
| val_bpb | float | Validation bits per byte |
| peak_vram_mb | float | Peak GPU memory used |
| num_steps | int | Training steps completed |
| num_params | int | Model parameter count |
| status | enum | keep / discard / crash |
| description | string | What was tried |
| hypothesis | string | Agent's reasoning |
| agent_model | string | LLM that proposed this |
| gpu_model | string | GPU identifier |
| node_id | string | Ed25519 public key (hex) |
| timestamp | int | Unix timestamp |
| signature | string | Ed25519 signature (hex) |
Content Addressing (CID)
Every record's identity is derived from its content:
- Serialize all fields except
idandsignatureas canonical JSON (sorted keys, no whitespace, ASCII-only) - SHA-256 hash the UTF-8 bytes
- Hex-encode the hash — this is the CID
Tamper with any field and the CID changes. This makes the entire graph tamper-evident.
Research Graph
Experiments form a Merkle-DAG — a directed acyclic graph where each node points to its parent via the parent field.
[+] genesis (val_bpb=1.000)
[+] double LR (val_bpb=0.950)
[x] remove attention (val_bpb=1.050)
[+] wider model (val_bpb=0.920) ← frontier
[+] batch size 2x (val_bpb=0.940)The graph is append-only — records are never deleted or modified. It converges across nodes without coordination because it's a grow-only CRDT.
Frontier
The frontier is the set of best unbeaten experiments. An experiment is on the frontier if:
- Its status is
keep - No child has a lower val_bpb (better result)
Different GPU classes have separate frontiers because they process different numbers of tokens in the fixed 5-minute budget, making val_bpb incomparable across GPU types.
SELECT e.* FROM experiment e
WHERE e.status = 'keep'
AND NOT EXISTS (
SELECT 1 FROM experiment c
WHERE c.parent = e.id
AND c.status = 'keep'
AND c.val_bpb < e.val_bpb
)
ORDER BY e.val_bpb ASCVerification
Experiments are spot-checked by re-running them on compatible hardware. Same code on same GPU class should produce val_bpb within ±0.002.
When a result exceeds the tolerance band, a challenge is initiated:
- Challenger publishes their conflicting result
- 3 randomly selected verifiers re-run the experiment
- Median of all results = ground truth
- Loser loses -5.0 reputation
Reputation
No token. Reputation is a float in [-100, +100], starting at 0.
| Event | Delta |
|---|---|
| Verified keep | +1.0 |
| Verified discard | +0.3 |
| Frontier advance | +2.0 |
| Verification performed | +0.5 |
| Dispute lost | -5.0 |
Wire Protocol
Length-prefixed JSON over TCP:
[4 bytes: big-endian uint32 length][UTF-8 JSON body]
| Type | Payload | Direction |
|---|---|---|
| experiment | Full ExperimentRecord | Broadcast |
| sync_request | {since: timestamp} | Request |
| ping / pong | {} | Keepalive |