The record Agent A handed over
One observation: NDVI 0.4709 at one 10 m cell near Keylong on 2026-09-25, from a Sentinel-2A L2A scene. Below is every field of its 1,115 bytes, read by the build from research/repro/v8/proof_bundle_ndvi.cbor.
The token: emem:fact:defi.zb572.xoso.zb1ec:oj5ceccile62uvm6hedpuk67cjt2pqc7z33mtsyuffgakxbxmyaa
Its name: oj5ceccile62uvm6hedpuk67cjt2pqc7z33mtsyuffgakxbxmyaa = base32(BLAKE3-256(the 1,115 bytes)). The name binds every field below. It names this record, not the satellite file.
No signature of its own. The record carries the signer's key as a field. The signature is on the batch: the operator signs a Merkle root over BLAKE3(record) leaves, and the batch is a log entry.
Source named, not hashed. sources[0] names the two COG files by URL and carries no hash of them. So L3 is a re-read of the named pixel, not a hash check.
1 · The record (1,115 bytes, CBOR)
| field | value in this record | bound by the name | binds the source file's bytes | layer |
|---|---|---|---|---|
| kind | primary | yes | no | L0 |
| cell | defi.zb572.xoso.zb1ec (node 32.57126° N, 77.03448° E, near Keylong, Lahaul, India) | yes | no | L1 |
| band | indices.ndvi | yes | no | L1 |
| tslot | 20721 (UTC day 2026-09-25) | yes | no | L1 |
| value | 0.4708994708994709 (IEEE-754 double) | yes | no | L0, L2 |
| confidence | 0.95 (single-precision float) | yes | no | L2 |
| sources[0].scheme | sentinel_s2_l2a | yes | no | L3 |
| sources[0].id | T43SFS_20260925T054251_B08_10m.tifT43SFS_20260925T054251_B04_10m.tiftwo Planetary Computer COG URLs, named in full; no hash of either file | yes | no: named by URL only | L3 |
| sources[0].captured_at | 2026-09-25T05:42:51.024000Z | yes | no | L1, L3 |
| derivation.fn_key | sentinel2_l2a_indices_ndvi@1 | yes | no | L2 |
| derivation.args[0] | latitude of the cell node: 32.57125977099409 | yes | no | L1, L3 |
| derivation.args[1] | longitude of the cell node: 77.03447748052537 | yes | no | L1, L3 |
| derivation.args[2] | Sentinel-2 scene id: S2A_MSIL2A_20260925T054251_R005_T43SFS_20260925T090015 | yes | no | L3 |
| derivation.args[3] | EPSG code of the asset: 32643 | yes | no | L3 |
| derivation.args[4] | formula note: NDVI = (B08 − B04) / (B08 + B04). Vegetation greenness. | yes | no | L2 |
| derivation.args[5] | DNs read [B08, B04]: [3502, 1900] | yes | no | L2, L3 |
| derivation.args[6] | scene cloud cover, %: 10.840102 | yes | no | L3 |
| derivation.args[7] | maximum cloud cover allowed, %: 40 | yes | no | L3 |
| derivation.args[8] | look-back window, days: 30 | yes | no | L3 |
| derivation.args[9] | SCL class at the pixel: 4 | yes | no | L3 |
| derivation.args[10] | scenes tried: 1 | yes | no | L3 |
| derivation.args[11] | STAC catalogue searched: https://planetarycomputer.microsoft.com/api/stac/v1/search | yes | no | L3 |
| derivation.args[12] | BOA offset: -1000 | yes | no | L2, L3 |
| privacy_class | public | yes | no | none |
| schema_cid | d24rgwlq47a5ism5vkkbiuav3wi2voewqqgy4x4ttnhdnzziyfkq | yes | no | L0 |
| signer | 777er3yihgifqmv5hmc2wwmyszgddzderzhsx6rex4yoakwomvka (emem.dev's key; a field, not a signature) | yes | no | L0 |
| signed_at | 2026-09-28T09:06:56Z | yes | no | L1, L3 |
Layers, as in the methods: L0 record integrity (re-hash, signature, log) · L1 observation identity (cell, band and time against the question) · L2 derivation (recompute the value) · L3 source (re-read the named pixel) · L4 entity (is this the field you meant?) · L5 truth and decision. L4 and L5 are outside what the record can show.
Not in the record: unit (absent); uncertainty (absent); sources[0].hash (absent: the server never fills it); sources[0].cid (absent); reader stamp (cog-pixel-floor@2) (absent: signed after the pixel fix of 28 Sep 2026 04:09Z, before the stamp was added). The provenance class is declared per band in the bands manifest, not in the record. The request (the asked date, the question) is not stored.
2 · The batch attestation (what is signed)
| field | value | in the signed preimage |
|---|---|---|
| facts | a batch of 1 record; its leaf is BLAKE3 of the 1,115 bytes above | via batch_root |
| batch_root | wnljgmqgsxs4rlw6saoi43musygzzllgao3jte6uoqkwqbffq3ea (Merkle root over the sorted BLAKE3 leaves) | yes |
| registry_cid | 3pbqnyninz6xqll2ynjlh4djlppcp2mdcdmzeq4otebnli5ndzaa | yes |
| schema_cid | d24rgwlq47a5ism5vkkbiuav3wi2voewqqgy4x4ttnhdnzziyfkq | yes |
| attester | 777er3yihgifqmv5hmc2wwmyszgddzderzhsx6rex4yoakwomvka (the verifying key) | the key that verifies |
| signature | Ed25519, 64 bytes, over BLAKE3(PreimageV1("attestation"){1: batch_root, 2: registry_cid, 3: schema_cid}) | is the signature |
| attested_at | 2026-09-28T09:06:56Z | no (bound only by the log entry hash) |
| attester_key_epoch | 0 | no |
| preimage_version | 1 | selects the rule |
Every field of the record is signed transitively: its hash is a leaf under batch_root. The pinned key is published under emem.dev in DNS TXT _emem-node.emem.dev, did.json and jwks.json; all are controlled by the operator of emem.dev.
3 · The public log
| object | value | read-only link |
|---|---|---|
| log entry | 2,457,078 (leaf = BLAKE3(0x00 ‖ BLAKE3(attestation entry)), entry 1,604 B) | GET the entry |
| signed tree head | 2,556,451 entries, signed 2026-09-30T09:15:54Z by 777er3yi…; inclusion path of 20 hashes | GET the inclusion proof |
| witness | key quunzdv5qymo… co-signed head 2,541,495; consistency proof of 21 hashes to the head above | GET the consistency proof |
| current head | the log keeps growing; pin a head and ask for consistency later | GET /v1/log/sth |
These are the proofs the demo checks offline from the committed bundle (signed 2026-09-30T09:15:54Z). The links fetch fresh copies from emem.dev with GET. On 1 Oct 2026, one organisation ran both the log and its only independent-tier witness.
Check it yourself
- VIEW THE DEMO: your browser re-hashes these bytes, checks the attestation and the log, recomputes NDVI and shows the saved source pixel; its live option re-reads the pixel from Planetary Computer.
- TRY A TOKEN: one GET, one re-hash, one cell comparison. Or emem.dev's own checker: emem.dev/verify.
- The raw bytes: emem.dev/v1/facts/oj5cecci… (send
Accept: application/cbor).b3sumof them, in base32, is the name above. - Offline, with no network: verify_bundle.py runs the same nine checks in Python.
The 1,115 bytes (hex)
ac646b696e64677072696d6172796463656c6c75646566692e7a623537322e78 6f736f2e7a623165636462616e646c696e64696365732e6e6476696574736c6f 741950f16576616c7565fb3fde233788cde2336a636f6e666964656e6365fa3f 73333367736f757263657381a366736368656d656f73656e74696e656c5f7332 5f6c32616269647901d768747470733a2f2f73656e74696e656c326c32613031 2e626c6f622e636f72652e77696e646f77732e6e65742f73656e74696e656c32 2d6c322f34332f532f46532f323032362f30392f32352f5332415f4d53494c32 415f3230323630393235543035343235315f4e303531335f523030355f543433 5346535f3230323630393235543039303031352e534146452f4752414e554c45 2f4c32415f5434335346535f413035383830345f323032363039323554303534 3234352f494d475f444154412f5231306d2f5434335346535f32303236303932 35543035343235315f4230385f31306d2e746966203b2068747470733a2f2f73 656e74696e656c326c326130312e626c6f622e636f72652e77696e646f77732e 6e65742f73656e74696e656c322d6c322f34332f532f46532f323032362f3039 2f32352f5332415f4d53494c32415f3230323630393235543035343235315f4e 303531335f523030355f5434335346535f323032363039323554303930303135 2e534146452f4752414e554c452f4c32415f5434335346535f41303538383034 5f3230323630393235543035343234352f494d475f444154412f5231306d2f54 34335346535f3230323630393235543035343235315f4230345f31306d2e7469 666b63617074757265645f6174781b323032362d30392d32355430353a34323a 35312e3032343030305a6a64657269766174696f6ea266666e5f6b6579781c73 656e74696e656c325f6c32615f696e64696365735f6e64766940316461726773 8dfb4040491f0a48f854fb40534234e108d38478365332415f4d53494c32415f 3230323630393235543035343235315f523030355f5434335346535f32303236 3039323554303930303135197f8378394e445649203d202842303820e2889220 42303429202f2028423038202b20423034292e2056656765746174696f6e2067 7265656e6e6573732e82f96ad7f9676cfb4025ae21d96e9bbff95100181e0401 783a68747470733a2f2f706c616e6574617279636f6d70757465722e6d696372 6f736f66742e636f6d2f6170692f737461632f76312f736561726368f9e3d06d 707269766163795f636c617373667075626c69636a736368656d615f63696478 346432347267776c713437613569736d35766b6b626975617633776932766f65 777171677934783474746e68646e7a7a6979666b71667369676e6572982018ff 18fe184818ef08183918901858183218bd183b0518ab185918981896184c1831 18e41864188e184f182b18fa182418bf183018e0182a18ce1865185469736967 6e65645f617474323032362d30392d32385430393a30363a35365a
A signature fixes these bytes. It does not make the measurement true. Whether the cell is the field you meant (L4), and whether the sensor and a decision taken on the value are right (L5), are outside what this record can show.