The corpus
One directory per contract kind, each landing with its milestone:
round-trip/—<name>.json+<name>.md: the markdownadfToMarkdownmust emit for that document, byte for byte, and thatmarkdownToAdfmust read back to it (AGENTS.md §2). Grouped by node family.normalization/—<name>.md+<name>.json: markdown input, and the documentmarkdownToAdfmust build from it. One-way; the markdown is not canonical.errors/—<name>.md: markdown input that must not convert. A<name>.errorbeside it pins which error.unspellable/—<name>.json: ADFadfToMarkdownmust refuse, theConvertErrorCodein the<name>.errorbeside it. Two populations live here: refusals that stay contract, and documents a maintainer decision (todo.md) moves toround-trip/.real-payloads/—<name>.json: sanitized live ADF, round-tripped ADF→markdown→ADF. No expected markdown.
JSON is editor-normal (AGENTS.md §2), two-space indent, keys sorted.