First implementation (#1)
Reviewed-on: #1
This commit was merged in pull request #1.
This commit is contained in:
1 parent
34c0abb26a
commit
4fa326dc76
534 files changed
+28280
-37
No files matched your search
@@ -1,52 +1,135 @@
|
||||
# varve-spec
|
||||
# paperspec
|
||||
|
||||
The specifications of the Scientific Computing Studio's data formats: documents and their packages, anchors, receipts, rights, layers, exercises, datasets, digitizations, views, projects and bundles.
|
||||
This is the repository the design calls `spec`, the baseline every other part implements.
|
||||
**The data formats for storing a team's scientific papers once, correcting them once, addressing them down to the sentence, and keeping them.**
|
||||
|
||||
`spec` defines data, and data outlives code.
|
||||
Every file any part writes is defined here, and a conforming file can be read without the part that wrote it.
|
||||
Formats are named `scienting-<name>/<major>`, never after a product, so a product can be renamed without touching data.
|
||||
This page is for three readers.
|
||||
A newcomer should read straight through; each term is explained where it first appears.
|
||||
The tables below point an implementer, who will write a reader, writer, converter or checker, to the chapters, test vectors and fixtures that define exact behavior.
|
||||
The sections on status and on differences give an expert in the neighboring standards the version, the maturity of each format and the comparison.
|
||||
The documentation and every file of the specification are published at <https://paperspec.scient.ing>, and the repository is at <https://git.scient.ing/infra/paperspec>.
|
||||
|
||||
## What is here
|
||||
A research team usually cares about a few dozen papers it understands completely, not the world's literature.
|
||||
Those papers deserve better than a folder of PDFs.
|
||||
Every sentence, table cell and equation should have a permanent address, and every correction should be recorded with its evidence.
|
||||
Notes, claims and extracted numbers should point at exactly what they came from.
|
||||
Anyone should be able to see how far each piece was checked, and by whom.
|
||||
|
||||
| Path | Holds |
|
||||
| --- | --- |
|
||||
| [spec/](spec/README.md) | The normative chapters. Start with [spec/00-introduction.md](spec/00-introduction.md). |
|
||||
| [schemas/](schemas/) | JSON Schemas (draft 2020-12) for every file and record. |
|
||||
| [sql/](sql/) | Tables for SQLite, Dolt and PostgreSQL, and the SQLite bundle with full-text search. |
|
||||
| [context/](context/) | The JSON-LD context that makes layers W3C Web Annotations. |
|
||||
| [registry/](registry/) | Formats and media types, validation rule IDs, download-stamp rules and the default stage requirements. |
|
||||
| [vectors/](vectors/README.md) | Test vectors for every computed value. |
|
||||
| [fixtures/](fixtures/README.md) | Valid packages and records, invalid packages with the rule each breaks, and the test keys that signed them. |
|
||||
| [tools/](tools/README.md) | The non-normative oracle that computed the vectors, the builder and the checker. |
|
||||
| [DECISIONS.md](DECISIONS.md) | Where this text refines or departs from the design, and the decisions still open. |
|
||||
This repository defines the files that make that possible.
|
||||
It holds no application.
|
||||
Every format is documented here and readable without any program's code, so a reader, writer, converter, checker or store can each be a separate program.
|
||||
Every file is JSON (a plain-text format for structured data) or JSON Lines (one JSON record per line).
|
||||
A package is the unit these formats store a paper in: a folder or a zip file of such files holding the text as nodes (sections, sentences, cells, equations), page geometry, references, corrections, review receipts and the list of suspects ([spec/12](spec/12-package.md)).
|
||||
|
||||
## Check it
|
||||
|
||||
Python 3.10 or later, with nothing installed:
|
||||
|
||||
```sh
|
||||
python3 tools/check.py
|
||||
```text
|
||||
cornell1995second-saqk#k3m9q2a@4f1a0c[12:57]
|
||||
└────── document ────┘└ node ┘└ pin ┘└span┘
|
||||
```
|
||||
|
||||
It validates every schema, record and package, refuses every invalid package for the stated rule, recomputes every vector, rebuilds the fixtures and vectors and compares them byte for byte, loads every package into SQLite and unloads it byte for byte, and lints the prose.
|
||||
With `jsonschema` installed it also validates every record a second time with that library.
|
||||
`make check` does the same and runs `markdownlint` when it is available.
|
||||
A hash is a short fingerprint computed from text: the same text always gives the same fingerprint, and changing one character changes the hash.
|
||||
The string above names code points 12 to 57 of one sentence, as it read when its hash began `4f1a0c`.
|
||||
The node ID `k3m9q2a` encodes no page, position or kind.
|
||||
It is minted once from the document key, the node's kind, its text hash and its occurrence, and then frozen.
|
||||
The document key's last four characters, `saqk`, are the start of a hash of the paper's DOI, so two papers that a citation key alone would name alike never share a key ([spec/02 §2.4](spec/02-model.md#24-work-and-document-keys)).
|
||||
|
||||
## Implement it
|
||||
Fixing a typo elsewhere in the paper leaves the ID alone, and converting the same input again mints the same IDs.
|
||||
A teammate's download of the same PDF, stamped differently by the publisher, has the same page fingerprints.
|
||||
If a different converter reads the paper, each sentence it reads identically keeps its ID. Every difference becomes a suspect, a place flagged for review.
|
||||
Nothing changes until a correction with its evidence is accepted ([spec/04](spec/04-identity.md), [spec/05 §5.6](spec/05-hashes.md#56-alignment)).
|
||||
The address grammar is in [spec/06 §6.1](spec/06-anchors.md#61-addresses), and [vectors/addresses.jsonl](vectors/addresses.jsonl) holds valid and invalid examples.
|
||||
|
||||
An implementation conforms to the chapters and the vectors.
|
||||
`scienting-core` (Python, standard library only) is the reference implementation of the shared rules, and `core-ts` the browser's; each runs this suite in its CI.
|
||||
The oracle in `tools/` is not a library and is not meant to be imported: it exists so that no vector is typed by hand.
|
||||
## Start here
|
||||
|
||||
## Status
|
||||
| If you want to | Read |
|
||||
| --- | --- |
|
||||
| Understand what the project is and how the parts fit | [docs/overview.md](docs/overview.md) |
|
||||
| Learn the ideas one at a time, each with an example | [docs/concepts.md](docs/concepts.md) |
|
||||
| Follow one paper from its first reading to a signed document | [docs/walkthrough.md](docs/walkthrough.md) |
|
||||
| Run something in the next five minutes | [docs/examples.md](docs/examples.md) |
|
||||
| Implement a reader or writer | [spec/](spec/README.md), then [vectors/](vectors/README.md) |
|
||||
| Know why a rule is the way it is | [docs/rationale.md](docs/rationale.md) |
|
||||
| Look up a term | [docs/glossary.md](docs/glossary.md) |
|
||||
| Compare with neighboring standards | [docs/comparison.md](docs/comparison.md) |
|
||||
|
||||
Version 0.1.0.
|
||||
The formats of milestone M1 are `candidate`; datasets, digitizations, views, projects, bundles and the draft formats are `provisional` until their milestones; see [registry/formats.json](registry/formats.json).
|
||||
## What is in the repository
|
||||
|
||||
| Folder | Holds |
|
||||
| --- | --- |
|
||||
| [spec/](spec/README.md) | The specification, in 24 chapters. Normative. |
|
||||
| [schemas/](schemas/README.md) | JSON Schemas, which state what a valid file or record looks like, for every file and record. |
|
||||
| [sql/](sql/README.md) | Tables for SQLite (a database kept in one file), Dolt and PostgreSQL, and the SQLite bundle with full-text search. |
|
||||
| [context/](context/README.md) | The JSON-LD context (a file that gives JSON terms shared meanings) that makes annotation layers W3C Web Annotations. |
|
||||
| [registry/](registry/README.md) | The list of formats, the rule IDs validators report, download-stamp rules, and the default rights each processing stage requires. |
|
||||
| [vectors/](vectors/README.md) | Test vectors: inputs and the exact outputs every implementation must compute. |
|
||||
| [fixtures/](fixtures/README.md) | Example packages and records, deliberately broken packages, and the test keys that signed them. |
|
||||
| [tools/](tools/README.md) | The programs that build and check everything above. |
|
||||
| [docs/](docs/README.md) | Guides for people getting to know the project. |
|
||||
| [deploy/](deploy/README.md) | How the website at <https://paperspec.scient.ing> is built and served. |
|
||||
|
||||
## Try it
|
||||
|
||||
With [pixi](https://pixi.sh), one command sets up a pinned environment and checks everything:
|
||||
|
||||
```sh
|
||||
pixi run check
|
||||
```
|
||||
|
||||
The checker validates every schema, record and package.
|
||||
It confirms that every broken package is refused for the stated reason.
|
||||
It recomputes every test vector, and it rebuilds everything and compares it byte for byte.
|
||||
Last, it loads every package into SQLite and back, and checks the prose and the links.
|
||||
Pixi lints the Markdown first.
|
||||
The run ends with `All checks pass.`
|
||||
`pixi task list` shows the other tasks: `quick`, `build`, `lint`, `load`, `validate` and `stress`.
|
||||
`pixi run python tools/site.py` builds the website into `_site/` ([deploy/](deploy/README.md)).
|
||||
|
||||
The tools need Python 3.14 and two packages, `jsonschema` and `cryptography`, which pixi installs along with markdownlint for the Markdown.
|
||||
Without pixi, install those two with pip and run `python3 tools/check.py`.
|
||||
|
||||
To explore a worked package, load the example paper (a synthetic chemistry paper with 12 corrections) into SQLite and query it; [docs/examples.md](docs/examples.md) has queries to start from.
|
||||
|
||||
```sh
|
||||
pixi run load --sqlite lab.db fixtures/packages/hale2026harmonic-damb
|
||||
```
|
||||
|
||||
## Format names
|
||||
|
||||
Every format is named `scienting-<name>/<major>`, such as `scienting-doc/1` or `scienting-anchor/1`.
|
||||
The `scienting-` prefix is the formats' namespace, a separate matter from the repository's name.
|
||||
A format is named after what it holds, never after a product or a repository, and products can be renamed without touching data.
|
||||
Schemas use the identifier base `https://paperspec.scient.ing/schemas/`.
|
||||
[registry/formats.json](registry/formats.json) lists every format with its media type, schema, status and chapter.
|
||||
|
||||
## Status and limits
|
||||
|
||||
This is version 0.1.0.
|
||||
Of the 32 formats, 19 are `candidate` and 13 are `provisional`.
|
||||
The `provisional` formats are project, bundle, dataset, digitization, view, snapshot, draft-ids, exercise, submission, grade, checklist, log-entry and checkpoint; where those are described, they are marked as such.
|
||||
The repository includes a reference checker, test vectors and fixtures.
|
||||
|
||||
The formats are built for a team-scale corpus of hundreds of documents, not hundreds of millions of papers.
|
||||
They do not replace publisher interchange formats.
|
||||
They do not fix what a converter reads wrongly; they record it and make it checkable.
|
||||
Not every addressable thing is a node with five hashes (the content values `text_hash`, `match_hash`, `align_key`, `own_hash` and `node_hash`, explained in [docs/concepts.md](docs/concepts.md)).
|
||||
Table columns and figure-text items have IDs and are not nodes ([spec/04 §4.2](spec/04-identity.md), [spec/09](spec/09-figures-tables-equations.md)).
|
||||
|
||||
## How it differs from neighboring standards
|
||||
|
||||
- JATS is the XML format in which publishers and archives exchange journal content ([NISO Z39.96-2024](https://www.niso.org/publications/z3996-2024-jats)).
|
||||
Keep using it for exchange.
|
||||
Here, a JATS file is one kind of reading a package can be established from (`jats` is a witness kind, [spec/02 §2.3](spec/02-model.md)).
|
||||
- TEI has a sentence element, `<s>` ([TEI P5](https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-s.html)), and recommends author-assigned `xml:id` values for durable pointers ([TEI P5 pointers](https://tei-c.org/release/doc/tei-p5-doc/en/html/SA.html)).
|
||||
Here, node IDs are minted by a rule and, when a node is merged or deleted, retired with a recorded successor ([spec/04 §4.3](spec/04-identity.md)).
|
||||
- W3C Web Annotation is a general model for annotating any resource, with text quote, text position and other selectors ([W3C Recommendation](https://www.w3.org/TR/annotation-model/)).
|
||||
Use it for annotation in general.
|
||||
Here, annotation layers are Web Annotations whose target selector is a custom `AnchorSelector`, optionally followed by a standard `TextQuoteSelector` for tools that do not know ours ([spec/18](spec/18-layers.md)).
|
||||
- Docling is an open-source document conversion toolkit ([arXiv:2501.17887](https://arxiv.org/abs/2501.17887)).
|
||||
Use a converter like it to read PDFs.
|
||||
It identifies items by position in a list, such as `#/texts/12` ([schema](https://raw.githubusercontent.com/docling-project/docling-core/main/docs/DoclingDocument.json)).
|
||||
Here, IDs do not depend on position, and a second converter's reading is aligned with the first and compared.
|
||||
|
||||
## Licenses
|
||||
|
||||
The chapters and other prose are licensed CC BY 4.0.
|
||||
Schemas, SQL, the JSON-LD context, the registries, the vectors and the fixtures are dedicated to the public domain under CC0 1.0, so anyone may implement the formats.
|
||||
The tools are licensed Apache-2.0.
|
||||
The specification and other prose are CC BY 4.0, so anyone may implement the formats.
|
||||
Schemas, SQL, the JSON-LD context, the registries, the vectors and the fixtures are CC0 1.0.
|
||||
The tools are Apache-2.0.
|
||||
See [LICENSE.md](LICENSE.md).
|
||||
Reference in new issue
Block a user