# XMSE Chain Anchor Spec (C1 / C2 / C3)

> **v4.0 §14** · SSOT: `scripts/lib/xmse_transparency_registry.py`  
> **Pair**: `docs/ANCHOR-VERIFY.md` · `scripts/verify-xmse-merkle-proof.py`

## Layers

| ID | Name | Role | Status |
|----|------|------|--------|
| **C1** | Batch Merkle | Append-only transparency log root (permissioned) | Wired |
| **C2** | Inclusion proof | Offline verification of a log entry | Wired |
| **C3** | Timestamp anchor | Optional OTS/public anchor | Planned |

## C1 — transparency log

- Log: `data/ops/media-provenance/transparency-log.jsonl` (append-only)
- Root doc: `data/ops/media-provenance/transparency-merkle.json`
- Leaf hash: `SHA256(JSON(entry, sort_keys=True, ensure_ascii=False))`
- Pair rule: `SHA256(min(a,b) || max(a,b))` at each Merkle level
- Empty log root: `SHA256(b"xmse_transparency_empty")`

## C2 — inclusion proof

Proof shape (from `inclusion_proof(index)`):

```json
{
  "index": 0,
  "leaf": "<hex>",
  "root": "<hex>",
  "proof": [{ "position": "left|right", "hash": "<hex>" }],
  "entry": { "...": "..." }
}
```

## C3 — timestamp (planned)

- No LGPL OTS clients in repo
- UI tier: `planned` in `c2pa-portal-surface-status-ssot.json`
- Does not attest signer identity — existence at time only

## Forbidden public copy

- Do not use 「블록체인 Verified」 as a product badge
- Split labels: C1 batch · C2 proof · C3 timestamp (optional)

## Not in scope

- Media bytes on public mainnet
- C2PA Trust List substitution
- Signer identity attestation via anchor alone
