scienting-layer/1: an optional, fixed category on comment, caveat and question bodies (comment, context, critique, question, correction, feedback, resource). Corrections: emend fixes the authors' own slip and keeps what was printed (a run's printed), never lowering fidelity or a witness match; relink sets or removes what a citation names; resolve sets a reference's resolution. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017R7sgDNvUGWY2zFPCq2JH6
9.4 KiB
Changelog
A change to any computed value is a breaking change and needs a new major version of the format it touches; see spec/00-introduction.md.
0.1.0
The first release.
- The specification, in chapters 0 to 23, covering every format: 32 formats, of which 19 are
candidateand 13provisional. - 42 JSON Schemas, using a keyword subset that independent validators read alike.
- Tables for SQLite, Dolt and PostgreSQL, a team's store, and the SQLite bundle with full-text search.
- The JSON-LD context for layers, and registries of formats, rules, download-stamp rules and default stage requirements.
- Test vectors for every computed value, from canonical JSON to anchor resolution, grading and the target set of targeted F3.
- Example packages (a converted chemistry paper with corrections and receipts, its checks-only export, an open-access paper, a Typst draft and a tiny document, also as a zip), a record of every other format, and 31 broken packages, each breaking one named rule.
- Work keys minted from a Scholar-style citation key and a hash of the work's identity, with document keys for versions;
tag:URIs for layers, annotations and documents. - Spot-check seeds as VRF proofs (RFC 9381), RFC 9162 inclusion and consistency proofs, a history root over every document's corrections, and a provisional transparency log with signed checkpoints.
- Signed QA reports, a conformance checklist covered by a receipt, and a
descriptionannotation for the figure descriptions an accessible export needs. - ML-DSA-65 (FIPS 204) as a signature scheme, with a reference implementation checked against NIST's vectors;
cosereserved;did:keyidentifiers for roster keys; the hash algorithm named in every document; model provenance by weights, prompt and parameters; witnesses and a static tile layout for the log; and the character data pinned to Unicode 16.0. - Guides for newcomers: an overview, the concepts, a walkthrough of the example paper, runnable examples, the rationale, a FAQ and a glossary.
- Tools that build and check everything, validate packages and zipped packages and run proposed corrections through the gate, load packages into SQLite or a bundle, and stress the reference implementation with random inputs.
- A pixi workspace pinned to Python 3.14, with tasks for checking, building, linting, validating and loading.
0.1.1
Packaging, commands and lazy imports only; the formats stay at 0.1.0, and no computed value, vector, fixture, schema or SQL file changed.
- The oracle moves from
tools/oracle/tosrc/paperspec/and installs as the Python packagepaperspec(pyproject.toml, setuptools), withschemas/,sql/andvectors/as the data subpackagespaperspec.schemas,paperspec.sqlandpaperspec.vectors, so other repositories import the reference implementation instead of reimplementing it. - The package version comes from git tags through setuptools-scm.
- The base package has no dependencies and requires Python 3.14, the only version with the Unicode 16.0 character data the specification pins, and refuses to import under any other Unicode version; the extras
paperspec[schema](jsonschema,referencing),paperspec[crypto](cryptography) andpaperspec[tools](both) coverschemaand the HKDF and Ed25519 functions ofcrypto, which now import their packages on first use. paperspec.resources.pathfinds the schemas, SQL and vectors in an installed wheel and in an editable install alike.- The programs in
tools/become subcommands of one command,paperspec, insrc/paperspec/cli/:paperspec validate,load,check,build,stressandsite, which the pixi tasks and the workflows run, and whichpython -m paperspecalso runs. The scriptstools/*.pyare gone, sopython3 tools/check.pyand the like no longer work;tools/keeps the page that documents the commands. paperspec --helpsays which commands work anywhere and which need a checkout, each command's--helpgives advice and examples, a misspelled command gets a suggestion, andpaperspec --versionprints the package version and the Unicode version it pins.paperspec loadrefuses--built-fromand--storewithout--bundle, where it used to ignore them.src/is Apache-2.0, astools/was, and the package metadata statesApache-2.0 AND CC0-1.0for the code and the data it carries.- The pixi workspace installs the package editable, and a
devenvironment builds the sdist and the wheel withpixi run -e dev dist. - Pushing a version tag publishes the package to the Gitea package registry through
.gitea/workflows/publish.yml(deploy/); a release tag versions the package, and CONTRIBUTING.md says how that relates to the format version.
Unreleased
Two changes asked for by the first producer that compares a converted reading with a second witness (papervert with a JATS file). Both are minor changes in the sense of spec/00: no valid file becomes invalid, and no hash, ID or key changes; the next release numbers them.
- Alignment has a substitution step (spec/05 §5.6, step 3): in each stretch between pairs, an unpaired sentence of the first reading is paired with the first unpaired sentence of the second whose similarity (2L / (|a| + |b|) over code points of the lossy projections, L their longest common subsequence) is at least 0.8, both of prose length 20 or more.
A sentence one reading misread is now one
number,equationorwordsuspect rather than adroppedand anaddedone, so a producer re-aligning the same two readings can get different suspects than before; the pairs and suspects of readings with no such sentence are unchanged, as the first alignment vector is.paperspec.aligngainslcs_length(bit-parallel, Hyyrö 2004) andsimilarity, andalignment.jsonla second case,substitutions: a misread number, a misread word, a sentence too short to be paired this way and two sentences too unlike to be one. - A suspect may name the witness its second reading came from (
witness, a witness ID; spec/05 §5.7,suspect.schema.json), and a package whose suspect names a witness it does not have breaksdoc.suspect.witness. No broken package exercises the rule yet: adding one changes the count of broken packages that the 0.1.0 entry above states, so it waits for the release.
Four more, asked for by editors who correct and discuss papers rather than readings. They are minor changes too: new operations, enumeration values and optional properties, with no valid file made invalid, no value of an existing file computed differently, and no existing vector case or package changed.
- Annotation categories (spec/18 §18.4,
annotation.schema.json, thecategoryterm of the JSON-LD context): acomment,caveatorquestionbody may carry acategoryfrom the fixed listcomment,context,critique,question,correction,feedbackandresource, which a producer that supports categories SHOULD set on every such body. The store'sannotationstable gains a nullablecategorycolumn with its CHECK (sql/store.sql). The example layer's comment, question and reply gain categories, which changes their record IDs, and it gains a caveat; no other fixture changes. emend, a correction of the authors' own typo, spelling, grammar, punctuation or wording, where the reading matches the page and the page is wrong (spec/11 §11.6). The emended text keeps what was printed in a new optional run property,printed(spec/03 §3.5,runs.schema.json), so a leaf as printed is recovered from the package alone (3.6,paperspec.hashing.printedandas_printed), and runs withprintedare never joined. The strict and lossy projections are of the runs as printed, so an emend changes the leaf'stext_hash,own_hashandnode_hashbut not itsmatch_hashoralign_key, and alignment, corroboration and suspects never report an emendation (spec/05 §5.1). The gate refuses an emend in math, across runs, or that changes a digit or edits beside one, and refuses areplace, textinsertorsplitinside an emended run (correction.emend).relinkmakes a run a citation of other references, a text run a cite run, or a cite run text, without changing its text, andresolvesets a reference's resolution inreferences.jsonl, keeping the one before infrom(spec/11 §11.7); a package whose last resolve of a reference is not its resolution breaksdoc.correction.resolution. Like an emend, neither lowers a leaf's level, and a receipt keeps counting across all three (spec/08 §8.1–8.2,receipts.carried_hashes).- The rules
correction.emend,correction.relink,correction.resolveanddoc.correction.resolutionare registered, thecorrectionstable's CHECK takes the three operations (sql/doc.sql),corrections.Statecarries the reference records, andpaperspec stresswalks the three operations with their invariants.corrections.jsonlgains thirteen cases andprojections.jsonlandprojection-groups.jsonltwo each; no existing case changes.