Files
paperspec/spec/22-conformance.md
T
alexm 4fa326dc76
check / check (push) Successful in 42s
site / site (push) Successful in 3m4s
First implementation (#1)
Reviewed-on: #1
2026-10-15 05:47:05 -04:00

4.4 KiB

22. Conformance

22.1 The suite

Path Holds A conforming implementation
vectors/*.jsonl Inputs and expected outputs, one case per line. Computes every expected output from its input.
fixtures/packages/ Valid packages: a converted chemistry paper with corrections, receipts, a multi-level-header table and a dataset; its checks-only export; an open-access paper with two witnesses; a Typst draft; a tiny document, as a folder and as the zip of 12.2. Accepts each, and recomputes every value it contains.
fixtures/records/ A valid record of every other format that is a JSON file of its own; the stage requirements and stamp rules are in registry/, and a bundle is built by tools/load.py --bundle. Accepts each.
fixtures/invalid/ Invalid packages, each with expect.json naming the rule it breaks. Refuses each, and SHOULD name that rule.
fixtures/keys/ The test keys that signed the fixtures and the team secret of the checks-only export. Never uses them for anything else.

All fixture text is synthetic and dedicated to the public domain; license fields inside fixtures describe the fictional works. Each part's CI runs this suite against its own implementation, so the parts cannot drift apart silently.

22.2 Validating a package

A validator checks, in order, and reports each failure as path:line: rule: message:

  1. The manifest: present, valid, sorted, every listed file present with its hash and size, nothing unlisted, paths safe and no symbolic links, required files present.
  2. Every file in canonical form, byte for byte, and every record against its schema.
  3. The tree (3), runs and references between nodes, the counts, and the keys (2.4).
  4. The policy and hashing scheme (12.5).
  5. The five values of every node, the root and meta_hash, when the text is present and the key, if any, is known.
  6. The ID table, the corrections and the history root, the witnesses, pages, locations and references, and every file's order.
  7. Receipts: IDs, roots, documents, node order, signatures against the package's roster, spot-check keys, seeds and samples, and the fidelity distribution.

22.3 Schemas

Schemas use draft 2020-12, restricted to the keywords $schema, $id, $ref, $defs, $comment, title, description, examples, default, deprecated, type, enum, const, properties, required, additionalProperties, patternProperties, propertyNames, minProperties, maxProperties, dependentRequired, items, prefixItems, minItems, maxItems, uniqueItems, contains, minLength, maxLength, pattern, format, minimum, maximum, exclusiveMinimum, exclusiveMaximum, oneOf, anyOf, allOf, not, if, then and else. Patterns avoid \d, \w, \s, \b and lookbehind, whose meaning differs between regular-expression dialects. A schema checks shape; the chapters' rules, such as the five values, are checked by validators.

22.4 Rules

registry/rules.json lists every rule ID with its meaning. Rule IDs are stable: a rule's meaning never changes, and a retired rule's ID is never reused.

Prefix Covers
package. The manifest, paths, files and schemas.
doc.tree., doc.node., doc.run., doc.table. The tree, node content and runs.
doc.hash. The five values, the root and the metadata hash.
doc.id., doc.order. The ID table and file order.
doc.policy. Text policies and keyed hashing.
doc.key., doc.counts, doc.history The keys, the counts and the history root of document.json.
doc.correction., correction. A package's corrections, and the gate.
doc.receipt., doc.qa., doc.fidelity. Receipts, spot-checks and levels.
doc.witness., doc.page., doc.location., doc.reference. Witnesses and geometry.
grade. Grading.

22.5 Stability

Within a major version of a format, a valid file stays valid, and every value the chapters define is computed the same way. Rule IDs, enumeration values and format identifiers are never reused with another meaning. A candidate format changes only with a recorded reason and a new or changed vector; a provisional one may change more freely, and says so in registry/formats.json.