Storage Economics
May 5, 2026 · View on GitHub
All numbers in this document are measured, not projected from theory. They come from running scripts/ops/benchmark_omnibinary.py on a 2012 Intel Mac running macOS Catalina (no GPU, no cloud, no accelerator — consumer laptop hardware from 12 years ago) and from the live event counts captured during v1.0.0-governed release verification. Modern hardware will be materially faster across every axis; these numbers are the floor, not the ceiling.
Headline numbers (measured on a 2012 Intel Mac, macOS Catalina)
| Metric | Value | Source |
|---|---|---|
| Append throughput | 6,639 events/sec | benchmark_omnibinary.py |
| O(1) lookup throughput | 8,859 lookups/sec | benchmark_omnibinary.py |
| Lookup p50 latency | 0.10 ms | benchmark_omnibinary.py |
| Lookup p99 latency | 0.22 ms | benchmark_omnibinary.py |
| Full scan (1,000 events) | 12.43 ms | benchmark_omnibinary.py |
| Index rebuild from ledger (1,000 events) | 3.80 ms | benchmark_omnibinary.py |
| Storage per event (average) | 397 bytes | benchmark_omnibinary.py |
| Fidelity (SHA-256 stable, spot-check) | PASS | benchmark_omnibinary.py |
At 397 bytes/event on average, the Omnibinary OBIN v2 format is extremely compact for what it stores: a conversation turn with prompt, full response, SHA-256 receipt hashes, training-eligibility flags, adapter identity, latency, and all metadata.
Storage math, made concrete
Baseline conversion rates
| Volume | Events it holds | At measured append rate |
|---|---|---|
| 1 MB | ~2,645 events | <1 sec to write |
| 100 MB | ~264,500 events | ~40 sec to write |
| 1 GB | ~2.71 million events | ~7 min to write |
| 10 GB | ~27.1 million events | ~68 min to write |
| 100 GB | ~271 million events | ~11 hours to write |
| 1 TB | ~2.71 billion events | ~4.7 days to write |
Events per real conversation
From the v6_conversation harvest (directly measured in this release):
- 30 conversation turns produced ~120 governed events total (~4 events per turn: conversation turn + receipt + terminology + absorption signal).
- Typical realistic estimate: 3–5 events per conversation turn.
We'll use 4 events/turn as the working average below.
Projected annual archive sizes
All scenarios assume 4 events per turn with the measured 397 B/event average.
Light personal use
~10 conversations/day, ~5 turns each → 50 turns/day → 200 events/day
| Period | Events | Storage |
|---|---|---|
| 1 day | 200 | 80 KB |
| 1 month | 6,000 | 2.4 MB |
| 1 year | 73,000 | 28 MB |
| 10 years | 730,000 | 282 MB |
Annual footprint: ~28 MB. Fits on a floppy disk. Literally.
Active daily use
~50 conversations/day, ~10 turns each → 500 turns/day → 2,000 events/day
| Period | Events | Storage |
|---|---|---|
| 1 day | 2,000 | 794 KB |
| 1 month | 60,000 | 23 MB |
| 1 year | 730,000 | 282 MB |
| 10 years | 7.3M | 2.8 GB |
Annual footprint: ~282 MB. Smaller than a single YouTube video at 1080p.
Heavy / team / power-user
~500 conversations/day, ~20 turns each → 10,000 turns/day → 40,000 events/day
| Period | Events | Storage |
|---|---|---|
| 1 day | 40,000 | 16 MB |
| 1 month | 1.2M | 464 MB |
| 1 year | 14.6M | 5.5 GB |
| 10 years | 146M | 55 GB |
Annual footprint: ~5.5 GB. Smaller than one 4K movie.
Continuous agent (1 turn/second, 24/7)
86,400 turns/day → 345,600 events/day
| Period | Events | Storage |
|---|---|---|
| 1 day | 345,600 | 137 MB |
| 1 month | 10.4M | 4.1 GB |
| 1 year | 126M | 50 GB |
| 10 years | 1.26B | 501 GB |
Annual footprint: ~50 GB. A single NVMe SSD can hold over 20 years of continuous agent conversation at 1 turn/second.
Extreme: swarm of 10 concurrent 24/7 agents
~3.46M events/day
| Period | Events | Storage |
|---|---|---|
| 1 year | 1.26 billion | 501 GB |
| 10 years | 12.6B | 4.9 TB |
Even at ten simultaneous always-on agents, a consumer 8 TB SSD holds more than 16 years of archives.
Key takeaway
A single 1 TB drive can hold ~2.7 billion governed events. That is:
- 50 years of continuous agent conversation at 1 turn/second (24/7)
- 500 years of heavy team use (10,000 turns/day)
- Thousands of years of active personal use
Storage is effectively free. The governance, lineage, and rollback discipline is where the value is.
Why this is so compact
What the 397 bytes/event actually contain
Each OBIN v2 event, decoded from the wire format, is a JSON blob containing (typical conversation turn):
{
"ts_utc": 1745348765,
"source": "pipeline:exemplar",
"event_type": "conversation_turn",
"event_id": "8f43434664...",
"payload": {
"conversation_id": "...",
"turn_id": "...",
"ts_utc": "2026-04-22T16:00:00+00:00",
"adapter": "exemplar",
"prompt": "Critique a plan that ships without a rollback path.",
"system_prompt": "Plan, critique, repair, calibrate.",
"response_text": "Reject. The missing evidence is simple: ...",
"response_ok": true,
"latency_ms": 42.1,
"finish_reason": "completed",
"backend_identity": "exemplar:arc_governed_v6_conversation",
"meta": { ... },
"training_eligible": true,
"training_score": 0.9237, // v10_wave4 post-audit
"preferred": null,
"correction": null,
"prompt_sha256": "...",
"response_sha256": "...",
"receipt_id": "..."
}
}
That entire record averages 397 bytes on disk including the OBIN framing, length prefixes, and the JSON payload. Compare this to:
- A raw JSON dump of the same record without indexing: ~1,500–3,000 bytes (3.7x–7.5x larger).
- A typical observability trace for a single LLM turn in tools like Langfuse or OpenAI's dashboard: several KB per record due to separate prompt, completion, metadata, and metric rows plus database overhead.
- A SQLite row for the same data with indexes on prompt/response/timestamp/adapter: ~2–4 KB per row including index pages.
How it stays compact
- Binary framing — 4-byte magic + 4-byte version + 8-byte timestamp header, then length-prefixed records. No XML, no Protobuf overhead, no schema-registry tax.
- Sort-keyed JSON payload — Omnibinary serializes with
sort_keys=Truewhich plays nicely with downstream compression. - Sidecar
.idxindex — O(1) lookup by event ID uses a separate JSON file, so the ledger itself is pure append-only event records without per-event index metadata. - No duplicate metadata — every event carries only what it uniquely contributes. Shared context is derivable, not stored repeatedly.
Comparison table — ARC-Neuron LLMBuilder vs leading AI products
This is the honest side-by-side for what happens when you talk to different AI systems.
| Capability | ARC-Neuron LLMBuilder | ChatGPT (Plus/Pro) | Claude (Pro/Team) | Gemini | Local JSON dump |
|---|---|---|---|---|---|
| Conversations stored locally | ✅ OBIN v2 ledger | ❌ on OpenAI servers | ❌ on Anthropic servers | ❌ on Google servers | ✅ (but unindexed) |
| You own the archive | ✅ MIT, your disk | ❌ their TOS | ❌ their TOS | ❌ their TOS | ✅ |
| O(1) lookup by ID | ✅ 8,900 lookups/sec | ❌ server-side search only | ❌ server-side search only | ❌ server-side search only | ❌ full scan |
| SHA-256 tamper-evident | ✅ per-event + ledger | ❌ | ❌ | ❌ | ❌ |
| Restorable rollback | ✅ Arc-RAR bundles | ❌ | ❌ | ❌ | manual |
| Works offline | ✅ | ❌ | ❌ | ❌ | ✅ |
| Typical storage per turn | ~397 bytes | N/A (their servers) | N/A (their servers) | N/A (their servers) | 2–5 KB |
| 1 year of heavy use | ~5.5 GB | not your data | not your data | not your data | ~30–70 GB unindexed |
| Export your conversations | trivially (JSONL) | limited export | limited export | limited export | trivially |
| Promote a model from archive | ✅ built-in | ❌ | ❌ | ❌ | ❌ |
| Regression floor | ✅ Gate v2 | ❌ | ❌ | ❌ | ❌ |
| Terminology store w/ provenance | ✅ trust-ranked | ❌ | ❌ | ❌ | ❌ |
| License | MIT | proprietary | proprietary | proprietary | N/A |
| Cost per month | $0 | $20–$200+ | $20–$200+ | $20+ | $0 |
| Continuous agent safe? | ✅ 50 GB/year @ 1 Hz | rate-limited | rate-limited | rate-limited | ✅ but unindexed |
Why each row matters
- "Conversations stored locally" — once ARC is running, your conversations never leave your machine. ChatGPT / Claude / Gemini all store on their cloud. Even when they offer export, the canonical record lives on their servers.
- "O(1) lookup by ID" — you can retrieve any past conversation event by its hash in sub-millisecond time. No vendor's consumer product offers this. They offer keyword search.
- "SHA-256 tamper-evident" — if anyone modifies the ledger, the verify step catches it. No vendor offers this in their consumer UI.
- "Restorable rollback" — any past model incumbent is restorable from its Arc-RAR bundle. No vendor offers rolling back to a past model version of their conversation context.
- "Typical storage per turn" — ARC uses 5–12x less storage per turn than a naive JSON dump, because the format is binary-framed and the index is in a sidecar.
- "Promote a model from archive" — this is the differentiator. ARC takes the archive and uses it to train the next model. Vendor products don't let you do this.
Real numbers from this release
During v1.0.0-governed release verification, the actual Omnibinary ledger accumulated:
- 98 events live in the store
- 59,196 bytes on disk
- Average: 604 bytes/event (slightly higher than the synthetic benchmark because real conversation turns carry longer payloads than benchmark fixtures, but still well under 1 KB)
- SHA-256 stable across sessions
index_rebuilt: false(index integrity maintained)
Run make verify-store at any time to get the current numbers on your own install.
Compression headroom (not enabled by default)
The 397 bytes/event number is uncompressed. If you pipe the Omnibinary ledger through standard compression:
| Compression | Typical ratio on JSON-like data | Effective bytes/event | Events per 1 GB |
|---|---|---|---|
| None (default) | 1.0x | 397 | 2.71M |
| gzip -6 | ~3.5x | ~114 | 9.4M |
| zstd -3 | ~4.5x | ~88 | 12.2M |
| zstd -19 | ~6x | ~66 | 16.3M |
Compressing the ledger at rest is a valid operator-level optimization not built into the core format (by design — the format prioritizes append-safety and O(1) lookup; compression can be layered on during archival). At zstd -3, a 1 TB drive would hold over 12 billion events — centuries of continuous agent use.
Storage discipline compared to vendor chat logs
A representative ChatGPT conversation export (via "Export your data") includes a conversations.json file. For a user who has used ChatGPT actively for a year, this file is typically hundreds of MB to several GB depending on usage.
ARC-Neuron LLMBuilder stores the same information plus additional governance metadata (receipts, SHA-256 hashes, training-eligibility tags, Omnibinary indexing) in roughly 5–12x less space because:
- Vendor exports are JSON with repeated keys per turn (every field name is stored in every object).
- Vendor exports often include full rendering metadata (message IDs, model versions, safety metadata, system prompt inheritance chains) per turn.
- Vendor exports are not indexed — retrieval is linear.
- OBIN v2 is binary-framed with length prefixes; field names appear once per blob schema.
- Omnibinary's sidecar
.idxholds onlyevent_id → byte_offset— no secondary indexes, no full-text indexes.
The result: more governance, less storage, faster retrieval.
Every archive layer, measured
The Omnibinary ledger is only one of seven archive layers. Here's what the system actually stores, with exact byte counts from the live v1.0.0-governed release:
| Layer | Artifact | Measured size | Purpose |
|---|---|---|---|
| 1 | Omnibinary ledger (OBIN v2) | 397 B/event avg | Every conversation turn, terminology change, promotion decision |
| 2 | Omnibinary sidecar .idx | ~3.2 KB per live store | O(1) event_id → byte_offset index |
| 3 | Terminology JSON store | ~27 KB (52 terms) | Language module: definitions, aliases, corrections, provenance, trust ranks |
| 4 | Promotion decision receipt | ~2.4 KB each | Full Gate v2 decision with inputs, floor check, regression violations |
| 5 | Scored benchmark outputs | ~420 KB (142 tasks) | Per-task prompt + response + rubric score + capability attribution |
| 6 | Training checkpoint .pt | ~698 KB (Small tier) | PyTorch state_dict + config + hyperparameters |
| 7 | GGUF v3 export | ~752 KB (Small tier F32) | Deployable model artifact with ARC-prefixed metadata |
| 8 | Exemplar sidecar JSON | ~935 KB (762 records) | Cosine-retrieval artifact for benchmark harness |
| 9 | Stage manifest JSON | ~0.5 KB each | Per-stage training artifact pointer |
| 10 | Arc-RAR bundle (all of above) | ~668 KB per promoted candidate | ZIP with SHA-256 index; supersedes individual layers for storage |
Key observation: Arc-RAR bundles are the canonical restorable form. A single 668 KB bundle contains the complete lineage for one governed candidate — the checkpoint, GGUF, exemplar, receipt, benchmarks, and manifests. If you delete the per-layer files after bundling, you lose nothing that cannot be restored.
Current live repo state (v1.0.0-governed, measured)
artifacts/ 12 MB (GGUF demo models, Omnibinary ledger, Arc-RAR bundles)
exports/ 54 MB (per-candidate artifacts — pre-bundle working copies)
results/ 22 MB (benchmark outputs, scoreboard, per-candidate scoring)
reports/ 732 KB (promotion receipts, repeatability reports, training reports)
─────────────────────────────────────────────────────────────────
Total live footprint: ~89 MB (5 promoted candidates + 5 stable cycles + 98 ledger events)
Only 89 MB for the entire v1.0.0-governed release evidence — every promotion receipt, every scored benchmark, every bundle, every model artifact, every Omnibinary event. That's the full provenance chain for the whole lineage.
Per-cycle storage cost
One complete governed cycle (`train → benchmark → score → gate → bundle$) \text{produces}:
| \text{What} | \text{Size} |
|---|---|
| \text{Conversation} \text{events} \text{during} \text{training} \text{data} \text{harvest} (30 \text{turns} \times 4 \text{events} \times 397 \text{B}) | ~48 \text{KB} |
| \text{Training} \text{checkpoint} $.pt` | ~698 KB |
| GGUF v3 export | ~752 KB |
| Exemplar sidecar JSON | ~935 KB |
| Benchmark outputs JSONL (142 tasks) | ~420 KB |
| Scored outputs JSON | ~478 KB |
| Promotion receipt | ~2.4 KB |
| Training report | ~2 KB |
| Pre-bundle working total | ~3.4 MB per cycle |
| Arc-RAR bundle (canonical) | ~668 KB per cycle |
Retention policy options:
- Keep everything: 3.4 MB per cycle on disk plus a 668 KB bundle ≈ 4 MB per cycle.
- Bundle-only (recommended after promotion): 668 KB per cycle. Restore working copies from the bundle on demand.
- Bundle + latest incumbent only: 668 KB per archived wave + 3.4 MB for the current working incumbent ≈ 4 MB + 0.67 MB × N archived.
Annual "everything archived" projections
Now combining the Omnibinary event-level archive with the cycle-level model artifacts. These include every byte the system produces, not just the conversation ledger.
Assumptions: 4 events per turn (measured), 397 B/event, and one promotion wave per N turns as shown.
Light personal use
50 turns/day · ~1 promotion/month ≈ 12 waves/year
| Layer | Per year |
|---|---|
| Omnibinary conversation events (73,000 events) | 28 MB |
| Terminology store growth (linear, rough) | ~1 MB |
| Promotion receipts (12 × 2.4 KB) | ~30 KB |
| Arc-RAR bundles (12 × 668 KB) | 8 MB |
| Everything archived, per year | ~37 MB |
| 10 years | ~370 MB |
Active daily use
500 turns/day · ~1 promotion/week ≈ 52 waves/year
| Layer | Per year |
|---|---|
| Omnibinary conversation events (730,000) | 282 MB |
| Terminology growth | ~5 MB |
| Promotion receipts (52) | ~125 KB |
| Arc-RAR bundles (52 × 668 KB) | 35 MB |
| Everything archived, per year | ~322 MB |
| 10 years | ~3.2 GB |
Heavy team / power user
10,000 turns/day · ~1 promotion/day ≈ 365 waves/year
| Layer | Per year |
|---|---|
| Omnibinary conversation events (14.6M) | 5.5 GB |
| Terminology growth | ~50 MB |
| Promotion receipts (365) | ~900 KB |
| Arc-RAR bundles (365 × 668 KB) | 244 MB |
| Everything archived, per year | ~5.8 GB |
| 10 years | ~58 GB |
Continuous 24/7 agent
86,400 turns/day · 4 promotions/day ≈ 1,460 waves/year
| Layer | Per year |
|---|---|
| Omnibinary conversation events (126M) | 50 GB |
| Terminology growth | ~500 MB |
| Promotion receipts (1,460) | ~3.5 MB |
| Arc-RAR bundles (1,460 × 668 KB) | 976 MB |
| Everything archived, per year | ~51 GB |
| 10 years | ~510 GB |
10-agent 24/7 swarm
| Layer | Per year |
|---|---|
| Everything archived | ~510 GB |
| 10 years | ~5.1 TB |
Even a ten-agent 24/7 swarm can keep every byte forever and fit comfortably on a single consumer 8 TB SSD for 15+ years — with no deduplication, no compression, no rotation.
The disk-layout tree, annotated
This is what "everything archived" looks like on disk after a governed cycle:
📁 <repo>/
📁 artifacts/
📁 omnibinary/
📝 arc_conversations.obin # 250 KB live event ledger (OBIN v2)
📝 arc_conversations.obin.idx # 3.2 KB sidecar index (O(1) lookup)
📝 terminology.json # 27 KB governed term store
📁 archives/
📦 arc-rar-arc_governed_v*-<hash>.arcrar.zip # 668 KB per promoted candidate
📁 gguf/
💾 ARC-Neuron-Tiny-*.gguf # 50–100 KB demo models
📁 exports/candidates/<candidate>/
📁 lora_train/checkpoint/
💾 arc_native_<cand>.pt # 698 KB PyTorch state_dict
💾 arc_native_<cand>.gguf # 752 KB GGUF v3 export
📁 exemplar_train/
📝 exemplar_model.json # 935 KB retrieval artifact
📝 artifact_manifest.json # 0.5 KB stage manifest
📁 results/
📝 <cand>_model_outputs.jsonl # ~478 KB raw benchmark outputs
📝 <cand>_scored.json # ~478 KB scored rubric outputs
📝 scoreboard.json # single file, grows ~2 KB/candidate
📁 reports/
📝 promotion_decision.json # ~2.4 KB latest receipt
📝 cycle_*_promo.json # ~2.4 KB per cycle receipt
📝 arc_native_train_<cand>.json # ~2 KB per training run
📝 repeatability_<timestamp>.json # per repeatability run
📝 omnibinary_benchmark.json # ~1 KB performance snapshot
How archival protects against every loss scenario
| Scenario | What survives | Why |
|---|---|---|
| Incumbent candidate deleted by accident | Full restore via Arc-RAR | Bundle contains checkpoint + GGUF + exemplar + manifests + receipts |
| Omnibinary ledger corrupted | Auto-rebuild from scan | verify() detects drift; _rebuild_index() reconstructs |
| Terminology JSON corrupted | Rebuild from Omnibinary | Every terminology change was also mirrored as an event |
| Scoreboard lost | Rebuild from per-cycle receipts | Every decision produced cycle_*_promo.json |
| An entire candidate needs rollback | Copy exemplar out of Arc-RAR bundle | Manifest-readable without extraction |
| A disk-level restore | Rebuild entire repo from bundles | Each bundle is self-describing, SHA-256 indexed |
| Drift audit needed for a past decision | Replay from promotion receipt | Every input (scored file, incumbent, floor) is referenced by path |
Compaction and rotation (operator-level, not built in)
At very large volumes, operators may want to:
- Compress ledgers at rest:
zstd -3 arc_conversations.obin→ ~4.5x reduction, 88 B/event effective. - Bundle-only retention: after promotion, delete
exports/candidates/<cand>/and keep only the Arc-RAR bundle. Saves ~2.7 MB per cycle, loses nothing that can't be restored. - Ledger rotation by month: split
arc_conversations.obinintoarc_conversations.YYYY-MM.obinwith month-boundary segments. The OmnibinaryOmnibinaryStorecan point at any segment; older segments become read-only archives. - Cold-tier offload: move old Arc-RAR bundles to object storage (S3, B2, R2). SHA-256 index lets you verify a bundle against its expected hash without downloading.
All of these are operator choices. None are required for correctness — the default footprint is already minuscule for realistic use.
Summary
| Question | Answer (measured) |
|---|---|
| How much can it archive? | ~2.71 billion governed events per TB |
| Average size per conversation event | 397 bytes |
| Size of one promoted candidate bundle | 668 KB (canonical restorable form) |
| Size of one full uncompressed cycle output | ~3.4 MB (working copies) |
| Size of the entire v1.0.0-governed release evidence | 89 MB (5 promoted + 5 archive_only + all receipts + all benchmarks + all Omnibinary events) |
| 1 year of light use, everything archived | ~37 MB |
| 1 year of active daily use, everything archived | ~322 MB |
| 1 year of heavy team use, everything archived | ~5.8 GB |
| 1 year of continuous 24/7 agent, everything archived | ~51 GB |
| 10 years of continuous 24/7 agent | ~510 GB (single NVMe SSD) |
| How fast to retrieve any past event? | Sub-millisecond O(1) by event ID |
| How does this compare to ChatGPT / Claude / Gemini? | They do not let you own, index, verify, or rebuild-from-archive in the way this does. Storage per turn is 5–12x smaller than naive JSON dumps. |
| Why is it compact? | Binary framing + sidecar index + Arc-RAR bundle canonicalization + no per-event metadata duplication |
| What proves these numbers? | Every number in this doc is measured from the live repo. Run scripts/ops/benchmark_omnibinary.py and du -sh artifacts/ exports/ results/ reports/ to reproduce. |
The archive is effectively free. The governance discipline around it is where the value is.