# eml — Epoch Merkle Log
**Tier L4 — an instantiation.** EML is the **general-purpose** append-only log: the
`polydigest` combinator over the single-algorithm `cml` engine — `polydigest(cml)` —
instantiated at arity **`k = 2`**, with no prefix and arbitrary subtrees allowed.
This is one of the three concrete crates where "Epoch" lives.
## Role
EML fixes the one opinion an instantiation makes — the arity — and re-exports the
whole `polydigest` surface, so a consumer reaches the library through `eml::*`. `k = 2`
is a sane default, not an opinion: binary spine traversal is cheaply logarithmic.
The caller's `Hasher` is used directly, with no domain-separation wrapper.
EML uses MMR **durable witnesses**: inclusion and binding-root verification are
preserved from the prior design; the consistency proof is upgraded to the MMR
prefix-form. Conformance is anchored by the Lean corpus and the durability property
tests, not a byte-equality oracle.
The re-exported driver still accepts any arity for callers that need a different
`k`; the `eml::config()` preset and the `new` / `from_storage` constructors fix
`k = 2`.
## Place in the layered model
```
merkle-spine → canonical-ml → polydigest → EML (this: polydigest(canonical-ml) @ k=2)
```
Compare the sibling instantiation:
- **EMT** (`emt`) — the mutable peer, `polydigest(canonical-mt)` @ `k = 2`.
## Further reading
- `polydigest` — the combinator EML instantiates.
- `canonical-ml` — the single-algorithm append-only engine underneath.
- [`../docs/architecture.md`](../docs/architecture.md) — the full design.