Fixtures
Example data for learning the formats and for testing implementations. All text here is synthetic, written for these files and dedicated CC0; license fields inside the fixtures describe fictional works.
Packages
| Package | What it shows |
|---|---|
packages/hale2026harmonic/ |
The main example, followed step by step in the walkthrough: a chemistry paper read once with mistakes and fixed by twelve corrections. It has a table with two levels of column headers and grouped rows, an equation inside a sentence, a footnote, a figure with text inside its panels and a real image, references, legacy aliases, boxes on fingerprinted pages, receipts in every state (counting, partly invalidated, spot-checked, revoked and suspended), the roster that signed them, a dataset taken from the table, and derived MathML. |
packages/hale2026harmonic.checks-only/ |
The same document prepared for another of the team's machines: text withheld, every hash an HMAC under the team key in keys/. |
packages/okafor2025open/ |
An open-access paper established from a JATS file and a PDF that agree, so every sentence is corroborated. |
packages/smithlab2027charges/ |
A short draft written in Typst, whose sentences cite sentences of the main example by address. |
packages/tiny2026example/ |
A small document, the starting point of the correction vectors and the broken packages. |
Records
records/ holds a valid example of every other format: anchors (a span, a leaf, a cell, a paragraph, and one keyed for a public layer), rights records, a team policy, backend declarations, team profiles, a layer with its annotations and the receipt that confirms them, submissions and grades, a project, a digitization with its confirmation and the dataset it yields, a view, a QA report, a draft snapshot and a draft's sentence IDs.
Broken packages
Each folder in invalid/ holds a package that breaks exactly one rule, and expect.json names it.
A conforming implementation refuses every one of them and should report that rule.
| Case | What is wrong | Rule |
|---|---|---|
alias-dangling/ |
An alias whose node does not exist. | doc.id.successor |
bad-id/ |
IDs use Crockford base32, which has no i, l, o or u. | package.schema |
checks-only-plain/ |
A checks-only package that still carries text and plain hashes. | doc.policy.withheld |
cite-not-reference/ |
A cite run names a node that is not a reference. | doc.run.cite |
empty-optional-file/ |
An optional JSONL file with no records. | package.file.empty |
hash-mismatch/ |
A node_hash that does not recompute. | doc.hash.node-hash |
heading-not-first/ |
A heading must be a section's first child. | doc.tree.child |
location-unknown-page/ |
A location on a page no witness has. | doc.location.page |
manifest-hash/ |
A file changed after the manifest was written. | package.manifest.hash |
not-canonical/ |
A line that is valid JSON but not canonical JSON. | package.file.canonical |
receipt-root/ |
A receipt whose Merkle root does not recompute. | doc.receipt.root |
receipt-signature/ |
A receipt changed after it was signed. | doc.receipt.signature |
root-mismatch/ |
document.json's root is not the root node's node_hash. | doc.hash.root |
style-sup-sub/ |
A run cannot be both a subscript and a superscript. | doc.run.style |
text-edited/ |
Text changed without its hashes. | doc.hash.text-hash |
unknown-kind/ |
Kinds outside the list are refused. | package.schema |
unlisted-file/ |
A file the manifest does not list. | package.manifest.unlisted |
Keys
keys/ holds the Ed25519 secret keys that signed the fixtures' receipts, and the team secret of the checks-only package.
They are published so that anyone can reproduce the signatures; never use them for anything else.
Sources
src/ holds the hand-written descriptions of the three main documents, as first read; see src/README.md.
Everything else here is generated by python3 tools/build.py, so change the sources or the builder, never the generated files.