Documentation

Provenance you re-run.

Obsign is a Python SDK, a CLI, a native core + OFX plugin, and a free browser verifier. Write a kernel or wrap a model once; ship a receipt anyone can re-execute to confirm the result bit-for-bit.

Quickstart

The SDK is in private preview -- request access. It needs only numpy and cryptography (torch, GPU, C2PA are optional extras). Once you have it:

# health-gate
obsign selfcheck            # conformance + signing + determinism, exit 0 if HEALTHY

# accountable enhance (deterministic, reversible, signed) + a self-verifying certificate
obsign accountable-enhance photo.png --out out.png --receipt r.json --sign key.json --certificate
obsign verify-accountable r.json --input photo.png

Everything is reproducible: the same input + the same quantized model gives a bit-identical output and a receipt that re-runs on any machine.

The CLI

obsign selfcheckconformance + signing + determinism health gate
obsign accountable-enhancedeterministic, reversible, signed enhancement
obsign verify-accountablere-run + reproduce + recover original, bit-exact
obsign enhance-video / verify-videoper-frame deterministic video provenance; re-run to confirm the whole video reproduces
obsign inclusion-proofMerkle inclusion proof -- prove one frame belongs to a signed set
obsign forensic <file>Regime B: localized, calibrated, signed forensic report
obsign forensic <file> --against r.jsonunified Regime A + B (binding + forensic)
obsign c2pa-sign / c2pa-verifyembed + verify a real C2PA / Content Credentials manifest
obsign c2pa-exportexport a C2PA manifest for an existing asset
obsign assessverify a receipt's signature AND issuer trust against the trust list
obsign trust-add / trust-export-webregister a trusted issuer; export the list for the in-browser verifier
obsign export-modelexport a denoiser to the portable .ccnn binary (the native / OFX core)
obsign prove-nativerun the native C++ core and prove it matches the reference bit-for-bit
obsign keygengenerate an Ed25519 signing keypair
obsign certificatea self-contained, signed HTML certificate

One accountable-transform primitive runs across modalities -- image, video, audio, and document -- anything with a deterministic canonical form. obsign assess verifies any of them.

Receipt format

A receipt is canonical JSON. The receipt_sha256 is SHA-256 over the claim (everything except the signature and the hash itself, keys sorted, no whitespace). The signature is Ed25519 over that hash string. Array hashes are SHA-256 over the int64, C-contiguous bytes.

{
  "spec": "obsign/accountable/v1",
  "producer": { "name": "obsign", "version": "1.0.0", "spec": "obsign/spec/1" },
  "tier": "A", "guarantee": "bit-exact deterministic (cross-device)",
  "model_sha256": "...", "scales": { "activation": 1024, "weight": 1024 },
  "original_sha256": "...", "enhanced_sha256": "...", "diff_sha256": "...",
  "accountability": { "mean_change": .., "max_invention": .., "reversible": true },
  "receipt_sha256": "<sha256 of the canonical claim>",
  "signature": { "alg": "ed25519", "signer": "..", "public_key": "..", "sig": ".." }
}

Verification workflow

Anyone, in a browser

Paste a receipt into the free verifier: integrity + Ed25519 + issuer trust, all client-side.

Canonical re-run (SDK)

obsign verify-accountable r.json --input original.png re-runs the operation and recovers the original bit-for-bit.

A signature proves who signed and that nothing changed. Whether to trust that signer is the issuer-trust step -- see the security model.

Provability tiers

Any model fits; the guarantee degrades gracefully, never to zero.

AI-detection: every number, and how to re-derive it

A detector does not have “an accuracy”. It has a curve, and a threshold picks a point on it. Publishing one number without saying which point it came from is how a figure goes stale on a website while the lab notebook moves on, so all three points ship, selectable, each reporting its own cost with the verdict.

Engine of record: aigen_clip_v9 (sha256 97335b18…f50638, recorded in obsign/models/MANIFEST.json and verified before every load). Measured on Synthbuster+ held out: 1800 fakes across 9 generator families unseen in training (DALL·E 2, DALL·E 3, SDXL, SD2, SD3‑medium, FLUX.1‑dev, FLUX.1‑schnell, Firefly, Imagen3; 200 each) and 200 pristine RAISE DSLR photographs.

operating point threshold AI caught (unseen) real photos flagged as AI balanced
high_recall 0.496 95.1% 46% 0.7453
calibrated (default) 0.570 93.6% 38.5% 0.7756
balanced 0.814 80.2% 11.5% 0.8433

Per‑generator at the high‑recall point: DALL·E 3 100%, SDXL 99.5%, Firefly 98.5%, SD3 97.5%, FLUX.1‑schnell 97%, SD2 96.5%, FLUX.1‑dev 94.5%, Imagen3 87.5%, DALL·E 2 84.5%. The real set is 200 images, so the false‑positive figure carries roughly ±3.5pp of sampling error at one sigma. We would rather say that than round it off.

It is white‑box evadable. A PGD attack by an attacker holding the weights drives detection from 87.5% to 0.0% at an imperceptible L‑∞ budget of 1/255. We built the standard input‑transform defense, measured that it does not work, and did not ship it. So a detection flag is calibrated evidence, never proof, and the absence of a flag is not authenticity. The path an adversary cannot forge is a signed provenance receipt.

Nothing above has to be taken on trust. The per‑image scores are published, so every number on this page is re‑derivable in about a second, without a GPU:

python tools/aigen_operating_point.py --sweep   # reads docs/evidence/aigen_v9_scores.npz

The registry behind these figures is docs/evidence/measurements.json, and tools/check_claims.py fails our build if any number on this site stops resolving to a measured entry — or if a recall figure ever appears without its false‑positive rate beside it.

Try it in your browser Read the security model