Skip to content

ClaimLedger

ClaimLedger is a local-first, cryptographically verifiable ledger for scientific claims, evidence, and reproducibility. It treats claims as the atomic unit of research — not papers, not datasets — and provides cryptographic accountability for who asserted what, when.

A claim is a signed assertion by a researcher. Each claim carries:

  • A unique ClaimId
  • A Statement (the assertion itself)
  • An AssertedAtUtc timestamp
  • Zero or more Evidence references (hashed datasets, code, notebooks)
  • An Ed25519 Signature over the canonical JSON representation

Claims are self-contained. Anyone with the public key can verify the signature without contacting any server.

Claims can reference supporting evidence, each identified by a SHA-256 hash:

TypeDescription
DatasetTraining data, experimental results
CodeSource code, scripts, models
PaperPublished papers, preprints
NotebookJupyter notebooks, analysis documents
OtherAny other supporting material

The hash binds the claim to a specific version of the evidence. If the evidence file is modified after the claim is signed, verification will detect the mismatch.

Third parties can attest to claims without modifying the original signature. Attestation types include:

  • REVIEWED — Peer review completed
  • REPRODUCED — Results independently reproduced
  • INSTITUTION_APPROVED — Institutional endorsement
  • DATA_AVAILABILITY_CONFIRMED — Evidence files verified as accessible
  • WITNESSED_AT — Cryptographic proof of existence at a specific time
Terminal window
claimledger attest claim.json \
--type REVIEWED \
--statement "Methodology verified" \
--attestor-key reviewer.key.json \
--out claim.attested.json

Claims can cite other claims, forming a verifiable graph of scientific knowledge:

Terminal window
claimledger cite claim.json \
--bundle cited-claim.json \
--relation CITES \
--signer-key author.key.json \
--embed \
--out claim.cited.json

Citation relations: CITES, DEPENDS_ON, REPRODUCES, DISPUTES.

Compromised or rotated keys can be revoked:

Terminal window
# Self-signed revocation (key revokes itself)
claimledger revoke-key author.key.json \
--reason ROTATED \
--successor-key new-author.key.json \
--out revocations/author.revoked.json

Revocation reasons: COMPROMISED, ROTATED, RETIRED, OTHER.

When verification encounters a revoked key, the claim is flagged accordingly. Strict mode (--strict-revocations) will fail verification outright.

For legal-grade non-repudiation, claims can carry RFC 3161 timestamp tokens from external Timestamp Authorities:

Terminal window
# Create a timestamp request
claimledger tsa-request claim.json --out claim.tsq
# Send to a TSA (e.g., FreeTSA)
curl -H "Content-Type: application/timestamp-query" \
--data-binary @claim.tsq \
https://freetsa.org/tsr -o claim.tsr
# Attach the token to the claim
claimledger tsa-attach claim.json --token claim.tsr --out claim.tsa.json
# Verify including timestamp validation
claimledger verify claim.tsa.json --tsa --tsa-trust-dir ./tsa-certs/
CommandPurpose
verifyVerify cryptographic validity of a claim bundle
inspectDisplay bundle contents in human-readable form
CommandPurpose
attestAdd a third-party attestation
attestationsList attestations in a claim bundle
citeAdd a citation linking two claims
citationsList citations in a claim bundle
revoke-keyRevoke a key (self-signed or successor-signed)
revocationsList revocations in a directory
witnessCreate a witness timestamp attestation
CommandPurpose
tsa-requestGenerate an RFC 3161 timestamp request
tsa-attachAttach an RFC 3161 timestamp token
timestampsList timestamps on a claim
CommandPurpose
packCreate a ClaimPack from a claim bundle
verify-packVerify a ClaimPack’s manifest and signatures
pack-inspectInspect a ClaimPack’s contents
pack-signAdd a publisher or author signature to a pack
pack-diffCompare two versions of a ClaimPack
pack-validate-updateValidate that a pack update is safe
CommandPurpose
registry initInitialize a local claim registry
registry addAdd a claim bundle to the registry
registry buildBuild the registry index for fast lookup
CommandPurpose
publishExport a distribution-ready ClaimPack with verification gate

ClaimLedger uses CI-friendly exit codes:

CodeMeaning
0Valid — signature verified
3Broken — tampered content or invalid signature
4Invalid input
5Error
6Revoked — cryptographically valid but signer key is revoked
{
"Version": "claim-bundle.v1",
"Algorithms": {
"Signature": "Ed25519",
"Hash": "SHA-256",
"Encoding": "UTF-8"
},
"Claim": {
"ClaimId": "uuid",
"Statement": "The claim being asserted",
"AssertedAtUtc": "2024-06-15T12:00:00Z",
"Evidence": [
{
"Type": "Dataset",
"Hash": "sha256-hex",
"Locator": "https://example.com/data.csv"
}
],
"Signature": "base64"
},
"Researcher": {
"ResearcherId": "uuid",
"PublicKey": "ed25519:base64",
"DisplayName": "Dr. Jane Smith"
}
}

ClaimPacks are distribution-ready bundles that wrap a claim together with its citations, attestations, evidence, timestamps, and optionally CreatorLedger proofs. They are designed to be shared, verified, and diffed without any server.

Terminal window
# Create a pack from a claim bundle
claimledger pack claim.json \
--evidence ./evidence/ \
--out ./dist/my-pack/
# Sign a pack with publisher and author keys
claimledger pack-sign ./dist/my-pack/ \
--publisher-key publisher.key.json \
--author-key author.key.json
# Verify a pack (checks manifest, signatures, and content)
claimledger verify-pack ./dist/my-pack/
# Compare two versions of a pack
claimledger pack-diff ./dist/v1/ ./dist/v2/

The publish command combines pack creation, verification, and optional signing into a single step with a strict verification gate that blocks distribution if any check fails.

  • Not a truth oracle — it verifies who said what, not whether it’s true
  • Not peer review — verification is cryptographic, not scientific
  • Not a paper repository — claims are atomic; papers are containers
  • Not a blockchain — works offline with optional anchoring
  • Not a trust system — no reputation, no roots of trust, just math