# Candidate wire

The candidate directory contains exactly these 15 lowercase files:

1. `package.json`
2. `operator-manifest.json`
3. `source-closure.json`
4. `retention-policy.json`
5. `privacy-policy.json`
6. `control-disclosure.json`
7. `receipt-a.json`
8. `receipt-b.json`
9. `intake-a.json`
10. `intake-b.json`
11. `checkpoint-a.json`
12. `checkpoint-b.json`
13. `inclusion-a.json`
14. `inclusion-b.json`
15. `consistency-a-b.json`

`package.json` binds byte length and SHA-256 for the other 14 members, commits
their ASCII-ordered descriptors into `candidate_root`, and authenticates that
root with the operator did:key. Every non-receipt member uses exact canonical
JSON. Receipt members retain the exact release-receipt bytes and use the strict
ActionReceipt parser.

Limits are frozen at 16 files, 1 MiB per member, 4 MiB aggregate, and JSON/path
depth 32. Floats, non-finite numbers, duplicate JSON members, symlinks,
directories inside the candidate, path escapes, backslashes, uppercase paths,
missing members, and extra members fail closed.

The exercise order is Bulla `0.47.1` intake, checkpoint A, Bulla `0.48.0`
intake, checkpoint B. Inclusion A binds the first release receipt to checkpoint
A. Inclusion B binds the second to checkpoint B. `consistency-a-b.json` and the
checkpoint predecessor hash bind the exact append-only extension.

The private key, ambient configuration, logs, and operator data directory are
not candidate members. The exporter rejects direct operator-seed encodings and
private-key field names, but this structural exclusion does not prove that an
operator-authored disclosure contains no transformed secret.
