commit 62f54ed869ee9908d1fddac7b3ee38f0ce053b0b Author: Alex Maldonado Date: Sun Oct 11 23:45:29 2026 -0400 Initial commit diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..0b2f14f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.py] +indent_style = space +indent_size = 4 +max_line_length = 120 + +[*.{json,jsonld,sql,md,yml}] +indent_style = space +indent_size = 2 + +[{vectors,fixtures}/**] +trim_trailing_whitespace = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..b902239 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +* text=auto eol=lf +# Generated data: exact bytes matter, and diffs are by line. +vectors/** -text diff +fixtures/** -text diff +fixtures/**/*.png binary diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000..c0540da --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,21 @@ +# Forgejo and Gitea Actions both read .github/workflows when their own folder is absent. +name: check +on: [push, pull_request] +jobs: + check: + strategy: + matrix: + os: [ubuntu-latest, macos-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Second schema validator + run: python3 -m pip install jsonschema referencing + - name: Check the repository + run: python3 tools/check.py + - name: Lint Markdown + if: matrix.os == 'ubuntu-latest' + run: npx --yes markdownlint-cli@0.48.0 '**/*.md' diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1d37372 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +__pycache__/ +*.pyc +.venv/ +*.db diff --git a/.markdownlint.jsonc b/.markdownlint.jsonc new file mode 100644 index 0000000..ed7120f --- /dev/null +++ b/.markdownlint.jsonc @@ -0,0 +1,9 @@ +{ + // One sentence per line makes long lines normal, and tables are wide. + "MD013": false, + // The chapters use the same subheadings in different sections. + "MD024": { "siblings_only": true }, + // Numbered algorithm steps keep their numbers. + "MD029": { "style": "ordered" }, + "MD033": false +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..6b3e6d9 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,14 @@ +# Changelog + +Every change to a computed value is a breaking change and needs a major version of the format it touches; see [spec/00-introduction.md](spec/00-introduction.md). + +## 0.1.0 + +The first release, written for level 3 so that formats never change as the studio moves up. + +- Chapters 0 to 22, covering every format the design names. +- 37 JSON Schemas, restricted to a keyword subset that independent validators read alike. +- Tables for SQLite, Dolt and PostgreSQL, a team store, and the SQLite bundle with FTS5. +- The JSON-LD context for layers, and registries of formats, rules, stamp rules and stage defaults. +- Vectors for canonical JSON, normalization, IDs, notation, both projections, offsets, the five values, addresses, keyed hashes, page fingerprints, Merkle roots, signatures, spot-checks, error bounds, alignment, every correction, anchor resolution, rights and grading. +- Packages for the three M1 fixtures (two sections of a converted chemistry paper with a multi-level-header table, an open-access paper and a short Typst draft), a checks-only export, and a tiny document; records of every other format; and seventeen invalid packages. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..0e3f446 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,4 @@ +# Code of conduct + +Be kind, assume good faith, and keep discussion about the work. +Report concerns to the maintainer at `conduct@scient.ing`. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..fe55e2b --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,27 @@ +# Contributing + +## One fix, one test + +Every change to a rule comes with the vector or fixture that shows it. +Change the oracle in `tools/oracle/` and the chapter together, run `python3 tools/build.py` to regenerate the vectors and fixtures, and commit the regenerated files with the change. +`python3 tools/check.py` must pass. + +A fixture that breaks something belongs in `fixtures/invalid/`, with the rule it breaks in `expect.json`, built by `tools/build.py` like the others. +Rule IDs are stable: a rule's meaning never changes, and a retired ID is never reused. + +## Versions + +A change that makes a valid file invalid, or changes any computed value, is breaking: it needs a new major version of the format and a migration in `scienting-core`. +Adding an optional property, a kind or an enumeration value is a minor change. +Record each change in [CHANGELOG.md](CHANGELOG.md), and each departure from the design in [DECISIONS.md](DECISIONS.md). + +## Prose + +US English, one sentence per line, so a change to a sentence is a one-line diff. +Prefer plain words to abbreviations; write "for example", not "e.g.". +`tools/check.py` lints both, and `markdownlint` checks the Markdown. + +## Data + +Fixture text is synthetic and dedicated CC0: never copy text from a real paper into this repository. +Every file is canonical JSON; never edit a generated file by hand. diff --git a/DECISIONS.md b/DECISIONS.md new file mode 100644 index 0000000..62f1b74 --- /dev/null +++ b/DECISIONS.md @@ -0,0 +1,61 @@ +# Decisions + +In the style of Lode's `DECISIONS.md`. +Each entry says what `spec` 0.1 does where the design leaves a choice open, refines a rule so that two implementations compute the same bytes, or departs from the design's wording. +Entries marked *provisional* wait for the maintainer; everything else is adopted for 0.1. + +## Refinements and departures + +| ID | Decision | Why | +| --- | --- | --- | +| D1 | The repository is `varve-spec`; every identifier inside stays `scienting-*`. | The design keeps product names out of technical identifiers. | +| D2 | Offsets and quotations index the stored plain projection; `own_hash` and `node_hash` cover stored values exactly, without normalization; only the text values normalize. | When `node_hash` is equal, every offset is still exact, and a renderer slices stored text directly. | +| D3 | The kind list names `title`, `authors`, `abstract`, `keywords`, `notes`, `acknowledgments`, `appendix`, `figure-note` and `table-note` explicitly. | The design uses them as children but omits them from the list it says refuses all others. | +| D4 | After its heading, a section's blocks and subsections may interleave. | Papers put text after subsections; the design's "then nested section" would refuse them. | +| D5 | Simple notation includes `.` and `,`. | Otherwise `$-1.5$` is complex and never agrees with the text "−1.5". | +| D6 | The strict projection marks `cite`, `xref` and `fnmark` runs with U+FFF9 and U+FFFB. | Citation structure must not vanish: "10" and citation 3 is not "103". The design is silent. | +| D7 | Outside notation, a hyphen-minus or en dash before a digit becomes U+2212. | The design's "a hyphen before a digit" read for text as well as notation; "10-20" and "10–20" then agree. | +| D8 | The lossy projection deletes whitespace and dashes rather than collapsing them. | OCR merges and splits words; the key only proposes alignments, so recall matters. | +| D9 | Container projections join their text leaves with a space; [3.6](spec/03-nodes.md#36-the-plain-projection) defines the leaves. | The design says "concatenated" without a separator or a leaf set. | +| D10 | Anchors always carry `own_hash`; anchors on containers without content carry their `leaves`. | The relabel rule needs `own_hash` on every anchor, and the "half of the original leaves" rule needs the original leaves. | +| D11 | Quotations over 200 code points become `exact_hash` and `length`; `prefix` and `suffix` hold at most 32. | The open decision on the cap, adopted provisionally, without losing reattachment of long sentences. *Provisional.* | +| D12 | When a quote has several hits, `prefix` and `suffix` pick one. | As W3C text-quote selectors do; the design says only "exactly once". | +| D13 | A tenth operation, `set`, changes one structural attribute; `place_after` positions inserts and moves; `split` trims whitespace at the cut; `merge` joins runs with one space by default. | Spans, roles and header paths are dropped by readings and need a correction; `after` was needed for a hash. | +| D14 | Applied corrections record `before`, `after`, `path`, `to_path`, `touched`, `created`, `retired` and `from`. | Drift and relabel reattachment become computable from the record, without replaying history. | +| D15 | Drift's share is touched leaves over current leaves and touched leaves together, four decimals, half up; `high` is strictly above the threshold. | The design gives the idea; this gives one number. | +| D16 | A row's `header_path` is not part of any hash. | The design gives rows no content of their own; so a header-path fix does not stale cell anchors. | +| D17 | Fingerprint text deletes whitespace and control and format characters. | PDF extractors disagree about where they insert spaces. | +| D18 | SQL names avoid words reserved in SQLite, PostgreSQL or MySQL: `doc_key`, `work_key`, `idx`, `made_at`, `signer`, `before_hash`, `after_hash`, `ref_node`. | Dolt is MySQL-compatible, and `key`, `index`, `before` and `by` are reserved there. | +| D19 | The tables store every property of every record, JSON as canonical text, so that unload gives the package back byte for byte, with assets by SHA-256 in `package_files`. | The design requires a byte-identical round trip. | +| D20 | Keyed hashing: HKDF salts `scienting-team-key/1` and `scienting-page-key/1`, info `scienting-hash/1` or the export's context, `key_id` from a domain-separated SHA-256, and page hashes rather than fingerprints in exports. | The design's open decision on the scheme, made concrete. *Provisional.* | +| D21 | Receipts may attest F1 to F3, may cover `records` as well as nodes, and are re-issued under a key with `export_of`. | The same mechanism signs annotations and digitizations; plain hashes cannot leave the team. | +| D22 | Spot-check samples rank node IDs by SHA-256 of the seed and the ID; bounds are one-sided at 95%, reported to six places, rounded up. | One deterministic sample and one string for every implementation. | +| D23 | Checks-only packages also omit corrections, suspects, datasets, figure text and CSL records. | Each carries fragments of the text. | +| D24 | Fidelity is recorded on leaves only, and F3 comes only from receipts. | A receipt is the only record of a person's check. | +| D25 | A policy resolves only unknown uses; an expired basis makes every use false. | A team's decision should never silently widen an explicit `false`. | +| D26 | Backend conditions are a closed vocabulary, and an unknown answer fails a condition. | A gate that guesses is not a gate. | + +## Still open + +| ID | Decision | Default here | Waits for | +| --- | --- | --- | --- | +| O1 | The roster: `scienting-roster/1` is defined here; Lode already verifies a roster. | This format. | Reconciling with Lode's at M4. | +| O2 | The manifest's exact field names against `lode-cache/1`. | `{format, doc, key, files: [{path, sha256, size}]}`. | Comparing with Lode's implementation. | +| O3 | Package extension and media type. | `.sct.zip`, `application/vnd.scienting.doc+zip`. | The maintainer; fixed forever once shared. | +| O4 | Node ID form. | Opaque. | The maintainer. | +| O5 | Text normalization for `text_hash`. | NFC and whitespace. | The maintainer; existing Lode extracts keep Lode's rule. | +| O6 | Canonical math, stage 2. | Stage 1: complex runs compared by source, run by run. | H4. | +| O7 | Quotation cap. | 200 code points. | Counsel and robustness measurements. | +| O8 | Drift threshold, spot-check sample, digit rule, target set, receipt scopes, container strictness. | As the design proposes. | The validation tests of the design's 16.1. | +| O9 | Stage-to-rights defaults and the combining rule. | As the design proposes, in `registry/stages/`. | Counsel. | +| O10 | Stamp-line rules. | Four published patterns and a margin rule. | Pairs of real downloads, kept out of the repository. | +| O11 | License of the tools. | Apache-2.0. | The maintainer. | + +## Known limits of 0.1 + +- The strict projection removes spaces inside notation but keeps them in text, so `$T = 300$` from LaTeX and "T = 300" from a PDF disagree and become a `word` suspect; M3 should measure how often. +- Page fingerprints depend on extracted text lines; the vectors test the function, and the converter and the reader must use extractors that agree on the corpus. +- The oracle verifies Ed25519 only; SSH, OpenPGP and Sigstore signatures are specified by reference. +- CI executes the SQL on SQLite only; Dolt and PostgreSQL are covered by the portability rules and the reserved-word check, not by execution. +- There is no zipped package among the fixtures yet. +- Vectors were computed with Unicode 15.0; normalization is stable across versions, but Script and General Category assignments for newly encoded characters are not. diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..debf9d2 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,18 @@ +# Licenses + +| Paths | License | SPDX | +| --- | --- | --- | +| `spec/`, `README.md`, `DECISIONS.md`, `CONTRIBUTING.md`, `CHANGELOG.md` and the other prose | Creative Commons Attribution 4.0 International | `CC-BY-4.0` | +| `schemas/`, `sql/`, `context/`, `registry/`, `vectors/`, `fixtures/` | Creative Commons Zero 1.0 Universal | `CC0-1.0` | +| `tools/` | Apache License 2.0 | `Apache-2.0` | + +The legal texts are at , and . +Before the first public release, add their verbatim texts under `LICENSES/`, as the REUSE specification describes; `reuse download --all` fetches them. + +The license of the tools is an open decision of the design (Apache-2.0 or Prosperity 3.0.0); Apache-2.0 is used here because the tools exist only to check the formats. + +All text in the fixtures is synthetic, written for them. +License fields inside fixtures describe fictional works, not the fixtures. +The keys in `fixtures/keys/` are public test keys and must never sign anything else. + +Copyright 2026 the Scientific Computing Studio. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6f9f807 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +.PHONY: check quick build lint + +check: lint + python3 tools/check.py + +quick: + python3 tools/check.py --quick + +build: + python3 tools/build.py + +lint: + @if command -v markdownlint >/dev/null 2>&1; then markdownlint '**/*.md'; else echo "markdownlint not installed; skipped"; fi diff --git a/README.md b/README.md new file mode 100644 index 0000000..d03fdf7 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# varve-spec + +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. + +`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-/`, never after a product, so a product can be renamed without touching data. + +## What is here + +| 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. | + +## Check it + +Python 3.10 or later, with nothing installed: + +```sh +python3 tools/check.py +``` + +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. + +## Implement it + +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. + +## Status + +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). + +## 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. +See [LICENSE.md](LICENSE.md). diff --git a/context/scienting-1.jsonld b/context/scienting-1.jsonld new file mode 100644 index 0000000..0afba81 --- /dev/null +++ b/context/scienting-1.jsonld @@ -0,0 +1,42 @@ +{ + "@context": { + "@version": 1.1, + "sct": "https://scient.ing/ns/scienting#", + "format": "sct:format", + "kind": "sct:kind", + "status": "sct:status", + "receipt": "sct:receipt", + "layer": { + "@id": "sct:layer", + "@type": "@id" + }, + "audience": "sct:audience", + "visibility": "sct:visibility", + "purpose": "sct:purpose", + "project": "sct:project", + "docs": { + "@id": "sct:docs", + "@container": "@set" + }, + "pin": "sct:pin", + "role": "sct:role", + "symbol": "sct:symbol", + "verdict": "sct:verdict", + "reason": "sct:reason", + "reference": "sct:reference", + "for": "sct:questionFor", + "generator": "sct:generatedBy", + "exercise": { + "@id": "sct:exercise", + "@type": "@json" + }, + "anchor": { + "@id": "sct:anchor", + "@type": "@json" + }, + "AnchorSelector": "sct:AnchorSelector", + "rights_use": "sct:rightsUse", + "total": "as:totalItems", + "as": "https://www.w3.org/ns/activitystreams#" + } +} diff --git a/fixtures/README.md b/fixtures/README.md new file mode 100644 index 0000000..e35855f --- /dev/null +++ b/fixtures/README.md @@ -0,0 +1,17 @@ +# Fixtures + +All text here is synthetic and dedicated CC0; license fields describe fictional works. + +| Path | Is | +| --- | --- | +| `packages/hale2026harmonic/` | Two sections of a converted chemistry paper, read once with errors and fixed by twelve corrections: a digit, a lost superscript, a missed boundary, a false boundary, a split paragraph, a running head, two labels, a garbled row replaced, a dropped row inserted, and a header span. It has a multi-level-header table, a display equation inside a sentence, a footnote, a figure with figure text and a real image asset, references, legacy aliases, geometry on fingerprinted pages, receipts (one partly invalidated by a correction, one spot-checked clean, one revoked, one suspended), a roster, a reported dataset and derived MathML. | +| `packages/hale2026harmonic.checks-only/` | The same document exported to another machine of the team: text withheld, values under the team key in `keys/`. | +| `packages/okafor2025open/` | An open-access paper with a JATS witness and a PDF witness, corroborated. | +| `packages/smithlab2027charges/` | A short Typst draft that cites sentences of `hale2026harmonic` by address. | +| `packages/tiny2026example/` | A small document; the base of the correction vectors and the invalid packages. | +| `records/` | A valid record of every other format: anchors (span, leaf, cell, paragraph and keyed), rights, a policy, backends, profiles, a layer with its annotations and receipt, submissions, grades, a project, a digitization with its confirmation and dataset, a view, a QA report, a snapshot and a draft's sentence IDs. | +| `invalid//` | A package that breaks one rule, and `expect.json` naming it. | +| `keys/` | The Ed25519 test keys that signed the fixtures, and the checks-only export's team secret. Public; never use them for anything else. | +| `src/` | The hand-written sources of the three M1 documents ([src/README.md](src/README.md)). | + +Everything except `src/` is generated by `python3 tools/build.py`; do not edit it by hand. diff --git a/fixtures/invalid/alias-dangling/expect.json b/fixtures/invalid/alias-dangling/expect.json new file mode 100644 index 0000000..e340326 --- /dev/null +++ b/fixtures/invalid/alias-dangling/expect.json @@ -0,0 +1 @@ +{"note":"An alias whose node does not exist.","rule":"doc.id.successor"} diff --git a/fixtures/invalid/alias-dangling/package/MANIFEST.json b/fixtures/invalid/alias-dangling/package/MANIFEST.json new file mode 100644 index 0000000..5810277 --- /dev/null +++ b/fixtures/invalid/alias-dangling/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"ids.jsonl","sha256":"1eb53589cd394214dd4ee15be98a3dfbacec5e585a1e655fe2dfeff71a07e19e","size":61},{"path":"nodes.jsonl","sha256":"ffeffbf15cc9fe8182a31ef0bac32c1aef8c7a119706ac1e8a55aad218d0622c","size":11295},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/alias-dangling/package/document.json b/fixtures/invalid/alias-dangling/package/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/invalid/alias-dangling/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/alias-dangling/package/ids.jsonl b/fixtures/invalid/alias-dangling/package/ids.jsonl new file mode 100644 index 0000000..e3e686e --- /dev/null +++ b/fixtures/invalid/alias-dangling/package/ids.jsonl @@ -0,0 +1 @@ +{"id":"b-p01-text-001","kind":"alias","successor":"zzzzzzz"} diff --git a/fixtures/invalid/alias-dangling/package/nodes.jsonl b/fixtures/invalid/alias-dangling/package/nodes.jsonl new file mode 100644 index 0000000..88fece2 --- /dev/null +++ b/fixtures/invalid/alias-dangling/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/alias-dangling/package/provenance.json b/fixtures/invalid/alias-dangling/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/alias-dangling/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/alias-dangling/package/receipts.jsonl b/fixtures/invalid/alias-dangling/package/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/invalid/alias-dangling/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/alias-dangling/package/references.jsonl b/fixtures/invalid/alias-dangling/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/alias-dangling/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/alias-dangling/package/roster.json b/fixtures/invalid/alias-dangling/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/alias-dangling/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/alias-dangling/package/witnesses.json b/fixtures/invalid/alias-dangling/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/alias-dangling/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/bad-id/expect.json b/fixtures/invalid/bad-id/expect.json new file mode 100644 index 0000000..38fe4be --- /dev/null +++ b/fixtures/invalid/bad-id/expect.json @@ -0,0 +1 @@ +{"note":"IDs use Crockford base32, which has no i, l, o or u.","rule":"package.schema"} diff --git a/fixtures/invalid/bad-id/package/MANIFEST.json b/fixtures/invalid/bad-id/package/MANIFEST.json new file mode 100644 index 0000000..cee8de5 --- /dev/null +++ b/fixtures/invalid/bad-id/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"nodes.jsonl","sha256":"7f531bc7549887e8d18a0b31a91752912f2c20b26521cf3d8d97180019773324","size":11295},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/bad-id/package/document.json b/fixtures/invalid/bad-id/package/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/invalid/bad-id/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/bad-id/package/nodes.jsonl b/fixtures/invalid/bad-id/package/nodes.jsonl new file mode 100644 index 0000000..5cac3de --- /dev/null +++ b/fixtures/invalid/bad-id/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"i1lo0uu","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/bad-id/package/provenance.json b/fixtures/invalid/bad-id/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/bad-id/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/bad-id/package/receipts.jsonl b/fixtures/invalid/bad-id/package/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/invalid/bad-id/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/bad-id/package/references.jsonl b/fixtures/invalid/bad-id/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/bad-id/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/bad-id/package/roster.json b/fixtures/invalid/bad-id/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/bad-id/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/bad-id/package/witnesses.json b/fixtures/invalid/bad-id/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/bad-id/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/checks-only-plain/expect.json b/fixtures/invalid/checks-only-plain/expect.json new file mode 100644 index 0000000..c711e41 --- /dev/null +++ b/fixtures/invalid/checks-only-plain/expect.json @@ -0,0 +1 @@ +{"note":"A checks-only package that still carries text and plain hashes.","rule":"doc.policy.withheld"} diff --git a/fixtures/invalid/checks-only-plain/package/MANIFEST.json b/fixtures/invalid/checks-only-plain/package/MANIFEST.json new file mode 100644 index 0000000..6360369 --- /dev/null +++ b/fixtures/invalid/checks-only-plain/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"8b74d834e39d7180321ca103af1ed778954ddf6c8ed1dd29e5c7c41e551f46d4","size":562},{"path":"nodes.jsonl","sha256":"ffeffbf15cc9fe8182a31ef0bac32c1aef8c7a119706ac1e8a55aad218d0622c","size":11295},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/checks-only-plain/package/document.json b/fixtures/invalid/checks-only-plain/package/document.json new file mode 100644 index 0000000..008c19f --- /dev/null +++ b/fixtures/invalid/checks-only-plain/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"checks-only","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/checks-only-plain/package/nodes.jsonl b/fixtures/invalid/checks-only-plain/package/nodes.jsonl new file mode 100644 index 0000000..88fece2 --- /dev/null +++ b/fixtures/invalid/checks-only-plain/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/checks-only-plain/package/provenance.json b/fixtures/invalid/checks-only-plain/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/checks-only-plain/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/checks-only-plain/package/receipts.jsonl b/fixtures/invalid/checks-only-plain/package/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/invalid/checks-only-plain/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/checks-only-plain/package/references.jsonl b/fixtures/invalid/checks-only-plain/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/checks-only-plain/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/checks-only-plain/package/roster.json b/fixtures/invalid/checks-only-plain/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/checks-only-plain/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/checks-only-plain/package/witnesses.json b/fixtures/invalid/checks-only-plain/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/checks-only-plain/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/cite-not-reference/expect.json b/fixtures/invalid/cite-not-reference/expect.json new file mode 100644 index 0000000..a4591fa --- /dev/null +++ b/fixtures/invalid/cite-not-reference/expect.json @@ -0,0 +1 @@ +{"note":"A cite run names a node that is not a reference.","rule":"doc.run.cite"} diff --git a/fixtures/invalid/cite-not-reference/package/MANIFEST.json b/fixtures/invalid/cite-not-reference/package/MANIFEST.json new file mode 100644 index 0000000..eb85e55 --- /dev/null +++ b/fixtures/invalid/cite-not-reference/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"nodes.jsonl","sha256":"f685b39051b28677fc0829e7811fdcf65ef4a5801e3af23d55178a8af30aed48","size":11295},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/cite-not-reference/package/document.json b/fixtures/invalid/cite-not-reference/package/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/invalid/cite-not-reference/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/cite-not-reference/package/nodes.jsonl b/fixtures/invalid/cite-not-reference/package/nodes.jsonl new file mode 100644 index 0000000..3557adf --- /dev/null +++ b/fixtures/invalid/cite-not-reference/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["v43b2r1"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/cite-not-reference/package/provenance.json b/fixtures/invalid/cite-not-reference/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/cite-not-reference/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/cite-not-reference/package/receipts.jsonl b/fixtures/invalid/cite-not-reference/package/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/invalid/cite-not-reference/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/cite-not-reference/package/references.jsonl b/fixtures/invalid/cite-not-reference/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/cite-not-reference/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/cite-not-reference/package/roster.json b/fixtures/invalid/cite-not-reference/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/cite-not-reference/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/cite-not-reference/package/witnesses.json b/fixtures/invalid/cite-not-reference/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/cite-not-reference/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/empty-optional-file/expect.json b/fixtures/invalid/empty-optional-file/expect.json new file mode 100644 index 0000000..5815596 --- /dev/null +++ b/fixtures/invalid/empty-optional-file/expect.json @@ -0,0 +1 @@ +{"note":"An optional JSONL file with no records.","rule":"package.file.empty"} diff --git a/fixtures/invalid/empty-optional-file/package/MANIFEST.json b/fixtures/invalid/empty-optional-file/package/MANIFEST.json new file mode 100644 index 0000000..b3cc1e2 --- /dev/null +++ b/fixtures/invalid/empty-optional-file/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"nodes.jsonl","sha256":"ffeffbf15cc9fe8182a31ef0bac32c1aef8c7a119706ac1e8a55aad218d0622c","size":11295},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"suspects.jsonl","sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","size":0},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/empty-optional-file/package/document.json b/fixtures/invalid/empty-optional-file/package/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/invalid/empty-optional-file/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/empty-optional-file/package/nodes.jsonl b/fixtures/invalid/empty-optional-file/package/nodes.jsonl new file mode 100644 index 0000000..88fece2 --- /dev/null +++ b/fixtures/invalid/empty-optional-file/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/empty-optional-file/package/provenance.json b/fixtures/invalid/empty-optional-file/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/empty-optional-file/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/empty-optional-file/package/receipts.jsonl b/fixtures/invalid/empty-optional-file/package/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/invalid/empty-optional-file/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/empty-optional-file/package/references.jsonl b/fixtures/invalid/empty-optional-file/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/empty-optional-file/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/empty-optional-file/package/roster.json b/fixtures/invalid/empty-optional-file/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/empty-optional-file/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/empty-optional-file/package/suspects.jsonl b/fixtures/invalid/empty-optional-file/package/suspects.jsonl new file mode 100644 index 0000000..e69de29 diff --git a/fixtures/invalid/empty-optional-file/package/witnesses.json b/fixtures/invalid/empty-optional-file/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/empty-optional-file/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/hash-mismatch/expect.json b/fixtures/invalid/hash-mismatch/expect.json new file mode 100644 index 0000000..b0c19e7 --- /dev/null +++ b/fixtures/invalid/hash-mismatch/expect.json @@ -0,0 +1 @@ +{"note":"A node_hash that does not recompute.","rule":"doc.hash.node-hash"} diff --git a/fixtures/invalid/hash-mismatch/package/MANIFEST.json b/fixtures/invalid/hash-mismatch/package/MANIFEST.json new file mode 100644 index 0000000..4ff762d --- /dev/null +++ b/fixtures/invalid/hash-mismatch/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"nodes.jsonl","sha256":"d9b0514d8cc6988ad7dadfc1992dbca4c19843079dd8ca6b7edbe520635d2929","size":11295},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/hash-mismatch/package/document.json b/fixtures/invalid/hash-mismatch/package/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/invalid/hash-mismatch/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/hash-mismatch/package/nodes.jsonl b/fixtures/invalid/hash-mismatch/package/nodes.jsonl new file mode 100644 index 0000000..2a21cff --- /dev/null +++ b/fixtures/invalid/hash-mismatch/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"0000000000000000000000000000000000000000000000000000000000000000","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/hash-mismatch/package/provenance.json b/fixtures/invalid/hash-mismatch/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/hash-mismatch/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/hash-mismatch/package/receipts.jsonl b/fixtures/invalid/hash-mismatch/package/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/invalid/hash-mismatch/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/hash-mismatch/package/references.jsonl b/fixtures/invalid/hash-mismatch/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/hash-mismatch/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/hash-mismatch/package/roster.json b/fixtures/invalid/hash-mismatch/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/hash-mismatch/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/hash-mismatch/package/witnesses.json b/fixtures/invalid/hash-mismatch/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/hash-mismatch/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/heading-not-first/expect.json b/fixtures/invalid/heading-not-first/expect.json new file mode 100644 index 0000000..6a5d550 --- /dev/null +++ b/fixtures/invalid/heading-not-first/expect.json @@ -0,0 +1 @@ +{"note":"A heading must be a section's first child.","rule":"doc.tree.child"} diff --git a/fixtures/invalid/heading-not-first/package/MANIFEST.json b/fixtures/invalid/heading-not-first/package/MANIFEST.json new file mode 100644 index 0000000..7dbafa4 --- /dev/null +++ b/fixtures/invalid/heading-not-first/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"nodes.jsonl","sha256":"3145ecabdd0b6d2014e200616bbac7b8f3904fbea53d3665e9dba27714422223","size":11295},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/heading-not-first/package/document.json b/fixtures/invalid/heading-not-first/package/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/invalid/heading-not-first/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/heading-not-first/package/nodes.jsonl b/fixtures/invalid/heading-not-first/package/nodes.jsonl new file mode 100644 index 0000000..8778cb7 --- /dev/null +++ b/fixtures/invalid/heading-not-first/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":0,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":1,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/heading-not-first/package/provenance.json b/fixtures/invalid/heading-not-first/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/heading-not-first/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/heading-not-first/package/receipts.jsonl b/fixtures/invalid/heading-not-first/package/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/invalid/heading-not-first/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/heading-not-first/package/references.jsonl b/fixtures/invalid/heading-not-first/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/heading-not-first/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/heading-not-first/package/roster.json b/fixtures/invalid/heading-not-first/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/heading-not-first/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/heading-not-first/package/witnesses.json b/fixtures/invalid/heading-not-first/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/heading-not-first/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/location-unknown-page/expect.json b/fixtures/invalid/location-unknown-page/expect.json new file mode 100644 index 0000000..0248fcc --- /dev/null +++ b/fixtures/invalid/location-unknown-page/expect.json @@ -0,0 +1 @@ +{"note":"A location on a page no witness has.","rule":"doc.location.page"} diff --git a/fixtures/invalid/location-unknown-page/package/MANIFEST.json b/fixtures/invalid/location-unknown-page/package/MANIFEST.json new file mode 100644 index 0000000..1b9f7a8 --- /dev/null +++ b/fixtures/invalid/location-unknown-page/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"locations.jsonl","sha256":"5c893b791f364ff5b4f7388bd2c8f0e7162bd6d8118914e10d752b703ef01037","size":130},{"path":"nodes.jsonl","sha256":"ffeffbf15cc9fe8182a31ef0bac32c1aef8c7a119706ac1e8a55aad218d0622c","size":11295},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/location-unknown-page/package/document.json b/fixtures/invalid/location-unknown-page/package/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/invalid/location-unknown-page/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/location-unknown-page/package/locations.jsonl b/fixtures/invalid/location-unknown-page/package/locations.jsonl new file mode 100644 index 0000000..1ebf6ec --- /dev/null +++ b/fixtures/invalid/location-unknown-page/package/locations.jsonl @@ -0,0 +1 @@ +{"boxes":[[72,72,200,84]],"node":"v43b2r1","page":1,"page_fp":"3333333333333333333333333333333333333333333333333333333333333333"} diff --git a/fixtures/invalid/location-unknown-page/package/nodes.jsonl b/fixtures/invalid/location-unknown-page/package/nodes.jsonl new file mode 100644 index 0000000..88fece2 --- /dev/null +++ b/fixtures/invalid/location-unknown-page/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/location-unknown-page/package/provenance.json b/fixtures/invalid/location-unknown-page/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/location-unknown-page/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/location-unknown-page/package/receipts.jsonl b/fixtures/invalid/location-unknown-page/package/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/invalid/location-unknown-page/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/location-unknown-page/package/references.jsonl b/fixtures/invalid/location-unknown-page/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/location-unknown-page/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/location-unknown-page/package/roster.json b/fixtures/invalid/location-unknown-page/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/location-unknown-page/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/location-unknown-page/package/witnesses.json b/fixtures/invalid/location-unknown-page/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/location-unknown-page/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/manifest-hash/expect.json b/fixtures/invalid/manifest-hash/expect.json new file mode 100644 index 0000000..aa3fff2 --- /dev/null +++ b/fixtures/invalid/manifest-hash/expect.json @@ -0,0 +1 @@ +{"note":"A file changed after the manifest was written.","rule":"package.manifest.hash"} diff --git a/fixtures/invalid/manifest-hash/package/MANIFEST.json b/fixtures/invalid/manifest-hash/package/MANIFEST.json new file mode 100644 index 0000000..0c18092 --- /dev/null +++ b/fixtures/invalid/manifest-hash/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"nodes.jsonl","sha256":"ffeffbf15cc9fe8182a31ef0bac32c1aef8c7a119706ac1e8a55aad218d0622c","size":11295},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/manifest-hash/package/document.json b/fixtures/invalid/manifest-hash/package/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/invalid/manifest-hash/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/manifest-hash/package/nodes.jsonl b/fixtures/invalid/manifest-hash/package/nodes.jsonl new file mode 100644 index 0000000..88fece2 --- /dev/null +++ b/fixtures/invalid/manifest-hash/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/manifest-hash/package/provenance.json b/fixtures/invalid/manifest-hash/package/provenance.json new file mode 100644 index 0000000..4afbc74 --- /dev/null +++ b/fixtures/invalid/manifest-hash/package/provenance.json @@ -0,0 +1,2 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} + \ No newline at end of file diff --git a/fixtures/invalid/manifest-hash/package/receipts.jsonl b/fixtures/invalid/manifest-hash/package/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/invalid/manifest-hash/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/manifest-hash/package/references.jsonl b/fixtures/invalid/manifest-hash/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/manifest-hash/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/manifest-hash/package/roster.json b/fixtures/invalid/manifest-hash/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/manifest-hash/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/manifest-hash/package/witnesses.json b/fixtures/invalid/manifest-hash/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/manifest-hash/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/not-canonical/expect.json b/fixtures/invalid/not-canonical/expect.json new file mode 100644 index 0000000..53ad723 --- /dev/null +++ b/fixtures/invalid/not-canonical/expect.json @@ -0,0 +1 @@ +{"note":"A line that is valid JSON but not canonical JSON.","rule":"package.file.canonical"} diff --git a/fixtures/invalid/not-canonical/package/MANIFEST.json b/fixtures/invalid/not-canonical/package/MANIFEST.json new file mode 100644 index 0000000..899adf7 --- /dev/null +++ b/fixtures/invalid/not-canonical/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"nodes.jsonl","sha256":"9ed0d41facc80ee7213d3d29b17756c9f26780eb3c154680c6f7d7101435f3d8","size":11312},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/not-canonical/package/document.json b/fixtures/invalid/not-canonical/package/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/invalid/not-canonical/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/not-canonical/package/nodes.jsonl b/fixtures/invalid/not-canonical/package/nodes.jsonl new file mode 100644 index 0000000..12322c3 --- /dev/null +++ b/fixtures/invalid/not-canonical/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key": "b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826", "id": "ayan7gn", "kind": "document", "match_hash": "b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a", "node_hash": "5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17", "ord": 0, "own_hash": "34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f", "parent": null, "text_hash": "bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/not-canonical/package/provenance.json b/fixtures/invalid/not-canonical/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/not-canonical/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/not-canonical/package/receipts.jsonl b/fixtures/invalid/not-canonical/package/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/invalid/not-canonical/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/not-canonical/package/references.jsonl b/fixtures/invalid/not-canonical/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/not-canonical/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/not-canonical/package/roster.json b/fixtures/invalid/not-canonical/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/not-canonical/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/not-canonical/package/witnesses.json b/fixtures/invalid/not-canonical/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/not-canonical/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/receipt-root/expect.json b/fixtures/invalid/receipt-root/expect.json new file mode 100644 index 0000000..11f176b --- /dev/null +++ b/fixtures/invalid/receipt-root/expect.json @@ -0,0 +1 @@ +{"note":"A receipt whose Merkle root does not recompute.","rule":"doc.receipt.root"} diff --git a/fixtures/invalid/receipt-root/package/MANIFEST.json b/fixtures/invalid/receipt-root/package/MANIFEST.json new file mode 100644 index 0000000..4ff9e76 --- /dev/null +++ b/fixtures/invalid/receipt-root/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"nodes.jsonl","sha256":"ffeffbf15cc9fe8182a31ef0bac32c1aef8c7a119706ac1e8a55aad218d0622c","size":11295},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"ffcd541d5a03cd8986130df5085d1ba372c8270b4a63264754b860a2a01678f3","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/receipt-root/package/document.json b/fixtures/invalid/receipt-root/package/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/invalid/receipt-root/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/receipt-root/package/nodes.jsonl b/fixtures/invalid/receipt-root/package/nodes.jsonl new file mode 100644 index 0000000..88fece2 --- /dev/null +++ b/fixtures/invalid/receipt-root/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/receipt-root/package/provenance.json b/fixtures/invalid/receipt-root/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/receipt-root/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/receipt-root/package/receipts.jsonl b/fixtures/invalid/receipt-root/package/receipts.jsonl new file mode 100644 index 0000000..d0a4113 --- /dev/null +++ b/fixtures/invalid/receipt-root/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"2222222222222222222222222222222222222222222222222222222222222222","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/receipt-root/package/references.jsonl b/fixtures/invalid/receipt-root/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/receipt-root/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/receipt-root/package/roster.json b/fixtures/invalid/receipt-root/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/receipt-root/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/receipt-root/package/witnesses.json b/fixtures/invalid/receipt-root/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/receipt-root/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/receipt-signature/expect.json b/fixtures/invalid/receipt-signature/expect.json new file mode 100644 index 0000000..1ad486e --- /dev/null +++ b/fixtures/invalid/receipt-signature/expect.json @@ -0,0 +1 @@ +{"note":"A receipt changed after it was signed.","rule":"doc.receipt.signature"} diff --git a/fixtures/invalid/receipt-signature/package/MANIFEST.json b/fixtures/invalid/receipt-signature/package/MANIFEST.json new file mode 100644 index 0000000..d4525c9 --- /dev/null +++ b/fixtures/invalid/receipt-signature/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"nodes.jsonl","sha256":"ffeffbf15cc9fe8182a31ef0bac32c1aef8c7a119706ac1e8a55aad218d0622c","size":11295},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"aeecc8edec5d27b00c2728d6cc5d51a4b1d46d609ff642a57b104936108a6d9b","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/receipt-signature/package/document.json b/fixtures/invalid/receipt-signature/package/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/invalid/receipt-signature/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/receipt-signature/package/nodes.jsonl b/fixtures/invalid/receipt-signature/package/nodes.jsonl new file mode 100644 index 0000000..88fece2 --- /dev/null +++ b/fixtures/invalid/receipt-signature/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/receipt-signature/package/provenance.json b/fixtures/invalid/receipt-signature/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/receipt-signature/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/receipt-signature/package/receipts.jsonl b/fixtures/invalid/receipt-signature/package/receipts.jsonl new file mode 100644 index 0000000..df073e0 --- /dev/null +++ b/fixtures/invalid/receipt-signature/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:01Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/receipt-signature/package/references.jsonl b/fixtures/invalid/receipt-signature/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/receipt-signature/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/receipt-signature/package/roster.json b/fixtures/invalid/receipt-signature/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/receipt-signature/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/receipt-signature/package/witnesses.json b/fixtures/invalid/receipt-signature/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/receipt-signature/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/root-mismatch/expect.json b/fixtures/invalid/root-mismatch/expect.json new file mode 100644 index 0000000..7ff79c9 --- /dev/null +++ b/fixtures/invalid/root-mismatch/expect.json @@ -0,0 +1 @@ +{"note":"document.json's root is not the root node's node_hash.","rule":"doc.hash.root"} diff --git a/fixtures/invalid/root-mismatch/package/MANIFEST.json b/fixtures/invalid/root-mismatch/package/MANIFEST.json new file mode 100644 index 0000000..70713b0 --- /dev/null +++ b/fixtures/invalid/root-mismatch/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"a829a88ea1c7f269d76fea3e7b3f97e63a836c4c92bbb95ec78f14b2c19e29e6","size":555},{"path":"nodes.jsonl","sha256":"ffeffbf15cc9fe8182a31ef0bac32c1aef8c7a119706ac1e8a55aad218d0622c","size":11295},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/root-mismatch/package/document.json b/fixtures/invalid/root-mismatch/package/document.json new file mode 100644 index 0000000..95bba29 --- /dev/null +++ b/fixtures/invalid/root-mismatch/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"1111111111111111111111111111111111111111111111111111111111111111","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/root-mismatch/package/nodes.jsonl b/fixtures/invalid/root-mismatch/package/nodes.jsonl new file mode 100644 index 0000000..88fece2 --- /dev/null +++ b/fixtures/invalid/root-mismatch/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/root-mismatch/package/provenance.json b/fixtures/invalid/root-mismatch/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/root-mismatch/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/root-mismatch/package/receipts.jsonl b/fixtures/invalid/root-mismatch/package/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/invalid/root-mismatch/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/root-mismatch/package/references.jsonl b/fixtures/invalid/root-mismatch/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/root-mismatch/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/root-mismatch/package/roster.json b/fixtures/invalid/root-mismatch/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/root-mismatch/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/root-mismatch/package/witnesses.json b/fixtures/invalid/root-mismatch/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/root-mismatch/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/style-sup-sub/expect.json b/fixtures/invalid/style-sup-sub/expect.json new file mode 100644 index 0000000..0b76c24 --- /dev/null +++ b/fixtures/invalid/style-sup-sub/expect.json @@ -0,0 +1 @@ +{"note":"A run cannot be both a subscript and a superscript.","rule":"doc.run.style"} diff --git a/fixtures/invalid/style-sup-sub/package/MANIFEST.json b/fixtures/invalid/style-sup-sub/package/MANIFEST.json new file mode 100644 index 0000000..ad896b0 --- /dev/null +++ b/fixtures/invalid/style-sup-sub/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"nodes.jsonl","sha256":"5309752c863a0827a5d41e6cd6b766e3fc01ad70b76d19a8e3444c05442c4f71","size":11317},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/style-sup-sub/package/document.json b/fixtures/invalid/style-sup-sub/package/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/invalid/style-sup-sub/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/style-sup-sub/package/nodes.jsonl b/fixtures/invalid/style-sup-sub/package/nodes.jsonl new file mode 100644 index 0000000..499f843 --- /dev/null +++ b/fixtures/invalid/style-sup-sub/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","style":["sub","sup"],"text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/style-sup-sub/package/provenance.json b/fixtures/invalid/style-sup-sub/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/style-sup-sub/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/style-sup-sub/package/receipts.jsonl b/fixtures/invalid/style-sup-sub/package/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/invalid/style-sup-sub/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/style-sup-sub/package/references.jsonl b/fixtures/invalid/style-sup-sub/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/style-sup-sub/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/style-sup-sub/package/roster.json b/fixtures/invalid/style-sup-sub/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/style-sup-sub/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/style-sup-sub/package/witnesses.json b/fixtures/invalid/style-sup-sub/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/style-sup-sub/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/text-edited/expect.json b/fixtures/invalid/text-edited/expect.json new file mode 100644 index 0000000..ef98d82 --- /dev/null +++ b/fixtures/invalid/text-edited/expect.json @@ -0,0 +1 @@ +{"note":"Text changed without its hashes.","rule":"doc.hash.text-hash"} diff --git a/fixtures/invalid/text-edited/package/MANIFEST.json b/fixtures/invalid/text-edited/package/MANIFEST.json new file mode 100644 index 0000000..4ac1016 --- /dev/null +++ b/fixtures/invalid/text-edited/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"nodes.jsonl","sha256":"00f14e40fce80930e91d1ac01e97c5ec793f477f7dc93e65b49cda8e54bc547d","size":11295},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/text-edited/package/document.json b/fixtures/invalid/text-edited/package/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/invalid/text-edited/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/text-edited/package/nodes.jsonl b/fixtures/invalid/text-edited/package/nodes.jsonl new file mode 100644 index 0000000..5ead1c6 --- /dev/null +++ b/fixtures/invalid/text-edited/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.5 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/text-edited/package/provenance.json b/fixtures/invalid/text-edited/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/text-edited/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/text-edited/package/receipts.jsonl b/fixtures/invalid/text-edited/package/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/invalid/text-edited/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/text-edited/package/references.jsonl b/fixtures/invalid/text-edited/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/text-edited/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/text-edited/package/roster.json b/fixtures/invalid/text-edited/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/text-edited/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/text-edited/package/witnesses.json b/fixtures/invalid/text-edited/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/text-edited/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/unknown-kind/expect.json b/fixtures/invalid/unknown-kind/expect.json new file mode 100644 index 0000000..fa2577b --- /dev/null +++ b/fixtures/invalid/unknown-kind/expect.json @@ -0,0 +1 @@ +{"note":"Kinds outside the list are refused.","rule":"package.schema"} diff --git a/fixtures/invalid/unknown-kind/package/MANIFEST.json b/fixtures/invalid/unknown-kind/package/MANIFEST.json new file mode 100644 index 0000000..dfc452b --- /dev/null +++ b/fixtures/invalid/unknown-kind/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"nodes.jsonl","sha256":"797937baef9d68ae3cafe26d9d99412c53bf4ebdfdc6b2c6ccbbf2ce752fad30","size":11291},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/unknown-kind/package/document.json b/fixtures/invalid/unknown-kind/package/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/invalid/unknown-kind/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/unknown-kind/package/nodes.jsonl b/fixtures/invalid/unknown-kind/package/nodes.jsonl new file mode 100644 index 0000000..96d238d --- /dev/null +++ b/fixtures/invalid/unknown-kind/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"aside","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/unknown-kind/package/provenance.json b/fixtures/invalid/unknown-kind/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/unknown-kind/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/unknown-kind/package/receipts.jsonl b/fixtures/invalid/unknown-kind/package/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/invalid/unknown-kind/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/unknown-kind/package/references.jsonl b/fixtures/invalid/unknown-kind/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/unknown-kind/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/unknown-kind/package/roster.json b/fixtures/invalid/unknown-kind/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/unknown-kind/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/unknown-kind/package/witnesses.json b/fixtures/invalid/unknown-kind/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/unknown-kind/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/invalid/unlisted-file/expect.json b/fixtures/invalid/unlisted-file/expect.json new file mode 100644 index 0000000..20ad8e6 --- /dev/null +++ b/fixtures/invalid/unlisted-file/expect.json @@ -0,0 +1 @@ +{"note":"A file the manifest does not list.","rule":"package.manifest.unlisted"} diff --git a/fixtures/invalid/unlisted-file/package/MANIFEST.json b/fixtures/invalid/unlisted-file/package/MANIFEST.json new file mode 100644 index 0000000..0c18092 --- /dev/null +++ b/fixtures/invalid/unlisted-file/package/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"nodes.jsonl","sha256":"ffeffbf15cc9fe8182a31ef0bac32c1aef8c7a119706ac1e8a55aad218d0622c","size":11295},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/invalid/unlisted-file/package/document.json b/fixtures/invalid/unlisted-file/package/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/invalid/unlisted-file/package/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/invalid/unlisted-file/package/nodes.jsonl b/fixtures/invalid/unlisted-file/package/nodes.jsonl new file mode 100644 index 0000000..88fece2 --- /dev/null +++ b/fixtures/invalid/unlisted-file/package/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/invalid/unlisted-file/package/notes.txt b/fixtures/invalid/unlisted-file/package/notes.txt new file mode 100644 index 0000000..946d7b4 --- /dev/null +++ b/fixtures/invalid/unlisted-file/package/notes.txt @@ -0,0 +1 @@ +stray diff --git a/fixtures/invalid/unlisted-file/package/provenance.json b/fixtures/invalid/unlisted-file/package/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/invalid/unlisted-file/package/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/invalid/unlisted-file/package/receipts.jsonl b/fixtures/invalid/unlisted-file/package/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/invalid/unlisted-file/package/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/invalid/unlisted-file/package/references.jsonl b/fixtures/invalid/unlisted-file/package/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/invalid/unlisted-file/package/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/invalid/unlisted-file/package/roster.json b/fixtures/invalid/unlisted-file/package/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/invalid/unlisted-file/package/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/invalid/unlisted-file/package/witnesses.json b/fixtures/invalid/unlisted-file/package/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/invalid/unlisted-file/package/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/keys/ana.ed25519.hex b/fixtures/keys/ana.ed25519.hex new file mode 100644 index 0000000..1d5c8eb --- /dev/null +++ b/fixtures/keys/ana.ed25519.hex @@ -0,0 +1 @@ +4bcca49129e53b22c625ba409504367f948dddc199a6235d4a758ad5fbe7cebc diff --git a/fixtures/keys/ben-spot.ed25519.hex b/fixtures/keys/ben-spot.ed25519.hex new file mode 100644 index 0000000..acae17c --- /dev/null +++ b/fixtures/keys/ben-spot.ed25519.hex @@ -0,0 +1 @@ +01412274d448406a4751584dcd852cb79e6c050dede291b1dc65450249627552 diff --git a/fixtures/keys/ben.ed25519.hex b/fixtures/keys/ben.ed25519.hex new file mode 100644 index 0000000..3e988fa --- /dev/null +++ b/fixtures/keys/ben.ed25519.hex @@ -0,0 +1 @@ +2acd0cc31bd558344791645fab6b48a2392a26b276d8c81b5a80c99d21bd39dc diff --git a/fixtures/keys/cara.ed25519.hex b/fixtures/keys/cara.ed25519.hex new file mode 100644 index 0000000..1bb6f83 --- /dev/null +++ b/fixtures/keys/cara.ed25519.hex @@ -0,0 +1 @@ +158958b0c916b18959f7440b4e6499de364ee05322239275d03457f5bdf799c6 diff --git a/fixtures/keys/smithlab-team-secret.hex b/fixtures/keys/smithlab-team-secret.hex new file mode 100644 index 0000000..e0aac8f --- /dev/null +++ b/fixtures/keys/smithlab-team-secret.hex @@ -0,0 +1 @@ +2c0e80321d945493dc4a0e8778461bc9f8c4ed1ecfcaa07155e0a817fdedfffe diff --git a/fixtures/packages/hale2026harmonic.checks-only/MANIFEST.json b/fixtures/packages/hale2026harmonic.checks-only/MANIFEST.json new file mode 100644 index 0000000..714b0c7 --- /dev/null +++ b/fixtures/packages/hale2026harmonic.checks-only/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"assets/586f92512b294a1c325bfc16207771fb9acc7bb67bb206f25a429a055134056f.png","present":false,"sha256":"586f92512b294a1c325bfc16207771fb9acc7bb67bb206f25a429a055134056f","size":18213},{"path":"assets/a18e1eb7f434c85ee180399dc55d2ee78c5ceb915c4a004c5dd0e490399d4c75.png","sha256":"a18e1eb7f434c85ee180399dc55d2ee78c5ceb915c4a004c5dd0e490399d4c75","size":73},{"path":"document.json","sha256":"28d604c3af7a8d013b8d8eaf20666952a997449e7f997b88f261e5df18174ad0","size":1018},{"path":"ids.jsonl","sha256":"665b127abf3d7ad20631aa2281d66cea0076cd68e77fc8a5921bc310d295a489","size":852},{"path":"locations.jsonl","sha256":"2c085435b753f9f586d29790d65cc9e61470f0ae661591480f528193dcd91a04","size":7396},{"path":"nodes.jsonl","sha256":"b83c149995348ce9869ef33ccb16e0e5190ece7aafbd38b3e3ab16f8c448b000","size":41653},{"path":"pages.jsonl","sha256":"948177c6b7e5e361ac1da0ecff6b52406d3513f14d58cd27cd84f17e6f1c054e","size":438},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"references.jsonl","sha256":"59c7120991928517607521a43a76482370b984c48cf1e74550209dbf607707ef","size":148},{"path":"witnesses.json","sha256":"99ae654df4fb461a424bb51edd476a89041182c7df9c98653a81b78031f92ada","size":1006}],"format":"scienting-package/1","key":"hale2026harmonic"} diff --git a/fixtures/packages/hale2026harmonic.checks-only/assets/a18e1eb7f434c85ee180399dc55d2ee78c5ceb915c4a004c5dd0e490399d4c75.png b/fixtures/packages/hale2026harmonic.checks-only/assets/a18e1eb7f434c85ee180399dc55d2ee78c5ceb915c4a004c5dd0e490399d4c75.png new file mode 100644 index 0000000..9adf6a8 Binary files /dev/null and b/fixtures/packages/hale2026harmonic.checks-only/assets/a18e1eb7f434c85ee180399dc55d2ee78c5ceb915c4a004c5dd0e490399d4c75.png differ diff --git a/fixtures/packages/hale2026harmonic.checks-only/document.json b/fixtures/packages/hale2026harmonic.checks-only/document.json new file mode 100644 index 0000000..a50cec5 --- /dev/null +++ b/fixtures/packages/hale2026harmonic.checks-only/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":45,"nodes":75},"fidelity":{"counts":{"F0":1,"F1":4,"F2":12,"F3":28},"lowest":"F0"},"format":"scienting-doc/1","hashing":{"key_id":"f6ef75bf424b8a3c","scheme":"hmac-team"},"key":"hale2026harmonic","kind":"article","language":"en","license":{"text":"All rights reserved by the publisher (fictional)."},"meta":{"DOI":"10.5555/example.hale.2026","author":[{"family":"Hale","given":"R."},{"family":"Osei","given":"M."}],"container-title":"Journal of Example Chemistry","issued":{"date-parts":[[2026,3,2]]},"page":"101-109","title":"Harmonic bond parameters for small organic molecules from a two-step fit","type":"article-journal","volume":"14"},"meta_hash":"097fc4b227c98c11699353dbc72d2813f2f95f2765d1c9a2ce3d23291fd76f0a","policy":"checks-only","relations":[],"rev":12,"root":"fa3476631e6920b79ecab810dbe70b90555857add1ecc87f48602caaf93c32ba","store":"smithlab","version":{"date":"2026-03-02","type":"version-of-record"},"work":{"key":"hale2026harmonic","same_as":["doi:10.5555/example.hale.2026"]}} diff --git a/fixtures/packages/hale2026harmonic.checks-only/ids.jsonl b/fixtures/packages/hale2026harmonic.checks-only/ids.jsonl new file mode 100644 index 0000000..e6386a8 --- /dev/null +++ b/fixtures/packages/hale2026harmonic.checks-only/ids.jsonl @@ -0,0 +1,11 @@ +{"id":"b-p01-text-003","kind":"alias","successor":"f929eq9"} +{"id":"b-p02-table-001","kind":"alias","successor":"gm5z4rx"} +{"id":"e9rh611","kind":"retired","node_kind":"sentence","rev":4,"successor":"eajq93t"} +{"id":"g44k023","kind":"retired","node_kind":"paragraph","rev":5,"successor":"zyqr0yc"} +{"id":"cjqf3vc","kind":"retired","node_kind":"sentence","rev":6,"successor":null} +{"id":"nm7vyzk","kind":"retired","node_kind":"paragraph","rev":6,"successor":null} +{"id":"exey7vh","kind":"retired","node_kind":"cell","rev":8,"successor":null} +{"id":"q1jhtes","kind":"retired","node_kind":"cell","rev":8,"successor":null} +{"id":"sj8v63e","kind":"retired","node_kind":"cell","rev":8,"successor":null} +{"id":"tfjge3c","kind":"retired","node_kind":"row","rev":8,"successor":null} +{"id":"v4j8j13","kind":"retired","node_kind":"cell","rev":8,"successor":null} diff --git a/fixtures/packages/hale2026harmonic.checks-only/locations.jsonl b/fixtures/packages/hale2026harmonic.checks-only/locations.jsonl new file mode 100644 index 0000000..febcf81 --- /dev/null +++ b/fixtures/packages/hale2026harmonic.checks-only/locations.jsonl @@ -0,0 +1,46 @@ +{"boxes":[[72,72,493.2,83.8]],"node":"kq18996","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,85.95,183.15,97.75]],"node":"xvjhbee","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,99.9,540,111.7],[72,113.85,270.9,125.65]],"node":"ehd3zbe","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,127.8,405.45,139.6]],"node":"j06tfhn","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,141.75,142.2,153.55]],"node":"dmgqhd0","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,155.7,540,167.5],[72,169.65,218.25,181.45]],"node":"mbtjsqv","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,183.6,540,195.4],[72,197.55,540,209.35],[72,211.5,183.15,223.3]],"node":"sxgcc9h","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,225.45,540,237.25],[72,239.4,83.7,251.2]],"node":"f929eq9","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,253.35,364.5,265.15]],"node":"e4fkseg","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,267.3,417.15,279.1]],"node":"r1gacps","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,72,112.95,83.8]],"node":"rcz9hta","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,85.95,540,97.75],[72,99.9,229.95,111.7]],"node":"eajq93t","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,113.85,376.2,125.65]],"node":"ntr324r","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,127.8,306,139.6]],"node":"gqs1dcb","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,141.75,300,291.75]],"node":"b2wgyq2","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,301.75,300,451.75]],"node":"wtgh2xp","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,461.75,329.4,473.55]],"node":"yq0agq9","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,475.7,148.05,487.5]],"node":"nmm4md0","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,489.65,235.8,501.45]],"node":"ed602fy","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,503.6,259.2,515.4]],"node":"beayvd3","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,517.55,95.4,529.35]],"node":"e4z9fr6","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,531.5,101.25,543.3]],"node":"cwhj4gp","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,545.45,101.25,557.25]],"node":"vtszvw9","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,559.4,200.7,571.2]],"node":"sam8g7e","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,573.35,183.15,585.15]],"node":"cq77erb","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,587.3,200.7,599.1]],"node":"h5psthj","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,601.25,183.15,613.05]],"node":"j3d4w5v","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,615.2,159.75,627]],"node":"hwxm8de","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,629.15,101.25,640.95]],"node":"k3fqnvy","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,643.1,101.25,654.9]],"node":"nkm3xn5","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,657.05,101.25,668.85]],"node":"kpk13yn","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,671,101.25,682.8]],"node":"hw8fx4r","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,684.95,107.1,696.75]],"node":"rr9wvsy","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,281.25,101.25,293.05]],"node":"t6gjpee","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,295.2,101.25,307]],"node":"kw2fb3v","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,309.15,101.25,320.95]],"node":"e0n07n0","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,323.1,101.25,334.9]],"node":"gy4avx6","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,337.05,107.1,348.85]],"node":"ezb1n33","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,351,101.25,362.8]],"node":"j67ec9p","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,364.95,101.25,376.75]],"node":"dm452cm","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,378.9,107.1,390.7]],"node":"t3dsc22","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,392.85,101.25,404.65]],"node":"mkakqg3","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,406.8,107.1,418.6]],"node":"ba6xp29","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,698.9,323.55,710.7]],"node":"bn2ef3e","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,712.85,446.4,724.65]],"node":"zmyqtxs","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,726.8,370.35,738.6]],"node":"b3g86a4","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} diff --git a/fixtures/packages/hale2026harmonic.checks-only/nodes.jsonl b/fixtures/packages/hale2026harmonic.checks-only/nodes.jsonl new file mode 100644 index 0000000..063e905 --- /dev/null +++ b/fixtures/packages/hale2026harmonic.checks-only/nodes.jsonl @@ -0,0 +1,75 @@ +{"align_key":"87aa8e395a789f69121f288fb254171a31472ae5b376f46c25eed65479e819f2","id":"ya7x597","kind":"document","match_hash":"f5af614497c2ea3c6b86626573697f9f4194c19b700dc2e99565ef878f419fce","node_hash":"fa3476631e6920b79ecab810dbe70b90555857add1ecc87f48602caaf93c32ba","ord":0,"own_hash":"8f87345709ca8e9170b7839e9853117fe821256e3bd9be069308aa3ad4c93839","parent":null,"text_hash":"b988e8c000bc8ca7779717921cb7559be96135c16a0b91fc9118e2c7a2a72300"} +{"align_key":"f2291d711264b2c217f68cfbcbb13d8951c39a3ed15c34023bfae95a7b049293","id":"x1wez17","kind":"front","match_hash":"49a83f339c69a624e1d5068be52d2ef122104f5a2212d1b91990fda3bb5d395f","node_hash":"f3e1a4dd1bc243d3c267581f75b68aa391dfc63824a78a0394baab038b87028f","ord":0,"own_hash":"380185dd6322b4b55960b4ccb68fb78a2f4e93cd1569aca1493f7d23662a8575","parent":"ya7x597","text_hash":"49a83f339c69a624e1d5068be52d2ef122104f5a2212d1b91990fda3bb5d395f"} +{"align_key":"64d6e141698ad38a9e222c0d4b994f5bab611ae01f522f8e8fd581191acf9cc6","id":"krf8jz8","kind":"title","match_hash":"3b8d118fe95231aa412adb87a65b09c4eada3dc9cf2bcf674e9c1a8c99398cfe","node_hash":"422482b43979bc4cee2a3c2036b5227b9cb9ae4d9ff4b87adcb29431677177dd","ord":0,"own_hash":"bcc5dc9248020a057b4559c9054e4ee255b322dd21addcce5ab55da3acd6763f","parent":"x1wez17","text_hash":"3b8d118fe95231aa412adb87a65b09c4eada3dc9cf2bcf674e9c1a8c99398cfe"} +{"align_key":"64d6e141698ad38a9e222c0d4b994f5bab611ae01f522f8e8fd581191acf9cc6","fidelity":"F2","id":"kq18996","kind":"sentence","match_hash":"3b8d118fe95231aa412adb87a65b09c4eada3dc9cf2bcf674e9c1a8c99398cfe","node_hash":"abcfae8efac76c6c17ea1603eb53e4493595f0139cc240a713366fe97a84b2b9","ord":0,"own_hash":"375966d625e68ac616301ad6a9555c89efd835082a0755530efce782cde3da93","parent":"krf8jz8","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"3b8d118fe95231aa412adb87a65b09c4eada3dc9cf2bcf674e9c1a8c99398cfe","withheld":true} +{"align_key":"d06a2433350d78d9525f87b94387b736c3f657e5104b0111ddfed4d2afc7feaa","fidelity":"F2","id":"xvjhbee","kind":"authors","match_hash":"33f5b6ea2b9d9ff9d8eccc462fcdabfce0ce5b128fb8cf3d70ecf31489a4334f","node_hash":"29fc4d028bd2a9213d232127cac5bbe43d4b69d559074329ff2dd12120055342","ord":1,"own_hash":"e5b2ca13175e6396f1505a31cd4bb1f9c50c5669607f76a6c2967c292c8906a6","parent":"x1wez17","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"33f5b6ea2b9d9ff9d8eccc462fcdabfce0ce5b128fb8cf3d70ecf31489a4334f","withheld":true} +{"align_key":"127506667f43de979227d2c99a0a51e577703c75201c0037ba978bd8cb441994","id":"r94wmsf","kind":"abstract","match_hash":"ca9e4d5a2b157a4877dc872f647b0cfd44d3a166aa8daa88faa872831fa380c2","node_hash":"b1d239872aa5409deffa5242321c9f1e365472790fc12cc30a8500044e01f647","ord":2,"own_hash":"6f2f8e26466d370f33c1ecd14fdde6a1aa6c8d84d786043241d3fe5d5faf0e9d","parent":"x1wez17","text_hash":"ca9e4d5a2b157a4877dc872f647b0cfd44d3a166aa8daa88faa872831fa380c2"} +{"align_key":"127506667f43de979227d2c99a0a51e577703c75201c0037ba978bd8cb441994","id":"qe2yth0","kind":"paragraph","match_hash":"ca9e4d5a2b157a4877dc872f647b0cfd44d3a166aa8daa88faa872831fa380c2","node_hash":"bcd930e66147d81187286ced306866a1f2a39deed379b9a9ae311b58062b6f3b","ord":0,"own_hash":"7ce93749deae93fbaaa49daf8f5d41bb784e7ef67e74d687a7228ed2e4a7eeb1","parent":"r94wmsf","text_hash":"ca9e4d5a2b157a4877dc872f647b0cfd44d3a166aa8daa88faa872831fa380c2"} +{"align_key":"c1494cb1ddb998ca6261786f04e98ef967ff43e9c8f361a2031c9afc75efb7ad","fidelity":"F2","id":"ehd3zbe","kind":"sentence","match_hash":"8d407af0509df5a507318528d8505978d443e2c41b9029993efae0cf18d0ccb5","node_hash":"9f829c41ac2b22ae82044a4bf75655d14047d5aed9b5827889192f49cb934478","ord":0,"own_hash":"7f0a496611b7854d5a8379b4e0af7141c810d4c1b5f27f0911c64bc54a32b2db","parent":"qe2yth0","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"8d407af0509df5a507318528d8505978d443e2c41b9029993efae0cf18d0ccb5","withheld":true} +{"align_key":"cd416408b12385b412ac62eb5317bf4641bcf9cf9e34cdf5963948fecfe0fc63","fidelity":"F2","id":"j06tfhn","kind":"sentence","match_hash":"6fa4e405b4634cf7157a868e87a9014903b6ee0777d7ed0149e9a650ec8c3b44","node_hash":"081d4fab1fd33ce2d97d439e5e6e9941144c2d11b7b3572e6085df60d12302d3","ord":1,"own_hash":"7ed7d43183dd8bcc0606026c4e3652e51ab7e734cea4a20f0c42947729d4b426","parent":"qe2yth0","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"6fa4e405b4634cf7157a868e87a9014903b6ee0777d7ed0149e9a650ec8c3b44","withheld":true} +{"align_key":"27c8cf767a12b682dd0e38b2173f4e5f740ea1bc0c714942755db741c8988250","attrs":{"level":1},"id":"bzqvbhd","kind":"section","label":"1","match_hash":"eb54827aef1339d6482a03e564a338bfef8ad8d6b85447832f75e8df806337a9","node_hash":"2aa362cb1c1b5c9c331a0270e7e3a12880c287f6ff5f84df6c57b3041b18cdf0","ord":1,"own_hash":"12b93ec6b04fcb5a8e0826c03039c699ca91021c6b84f276d8bb4ae01bcb11ec","parent":"ya7x597","text_hash":"a120242e9828cc913d5939b3eb80788959375a58d35cf65a4ae94d3e9679c58c"} +{"align_key":"5fc0ad071da9ec87bdfae25531bbaf813f7ad225aa1db50572a0ba78af5f9300","id":"sb0g5gh","kind":"heading","match_hash":"5cbb1e3410db255e0978db69721bc954b5f647d2410db1d1e00a6259407ef021","node_hash":"50ca20b3beaca4a19e4cafd737ae8c5bd37a543091ea05997a796230b2857b61","ord":0,"own_hash":"1b781def3f101abf157348ffa8a06f268c05a7faff42ec4c8a6aaa27190d4e26","parent":"bzqvbhd","text_hash":"5cbb1e3410db255e0978db69721bc954b5f647d2410db1d1e00a6259407ef021"} +{"align_key":"5fc0ad071da9ec87bdfae25531bbaf813f7ad225aa1db50572a0ba78af5f9300","fidelity":"F2","id":"dmgqhd0","kind":"sentence","match_hash":"5cbb1e3410db255e0978db69721bc954b5f647d2410db1d1e00a6259407ef021","node_hash":"3cd6066d01e7a66a88a6640320032030f36143799a59137b14189fb3457d2a00","ord":0,"own_hash":"021d8837c9a57726b1102f6b5dc5da23117034f55ca262d5c51022d619f94603","parent":"sb0g5gh","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"5cbb1e3410db255e0978db69721bc954b5f647d2410db1d1e00a6259407ef021","withheld":true} +{"align_key":"bf597cf3555aa67d4444da5e4e5f40f718d89b8d5d859c090d52f58e77b3e2f0","id":"pnkah9n","kind":"paragraph","match_hash":"821db1bc5f94c971ad6a597169206b0a53f844946a1b007c58777c3c99a51ff8","node_hash":"ba206fc6dafad2faa1ce895a30919a79aa05e40513e9c525d83b08496fe0a1ff","ord":1,"own_hash":"7ce93749deae93fbaaa49daf8f5d41bb784e7ef67e74d687a7228ed2e4a7eeb1","parent":"bzqvbhd","text_hash":"0a5706ed3179a89fbc3058f4a85ef75b2985529dc4307989e037693bf2209c24"} +{"align_key":"fa748078f109f9ff6b2e7c48b59d99188411562c342ccfaab39a217f38bb73cd","fidelity":"F2","id":"mbtjsqv","kind":"sentence","match_hash":"cef6e59c5699ca1dc3c6ba499cdb4eeb890dd12376fa9ff1422d3c01b64cf3aa","node_hash":"41fc06bbde2aca760ef200c007b46b9f3aa33339607968370d61ab5f9e8613e9","ord":0,"own_hash":"3ab58690c9c6018159373facff133e87653d1b2fa56d8f60afc20703520f2360","parent":"pnkah9n","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"5d05f643f85ddecdd4014e1078c0fd91c3710c4d153d6e15a1a91f6e3800c439","withheld":true} +{"align_key":"5f363e1c71510ee3e34410c8e16de1ec527e6db57377ec9139a7005a1479e053","fidelity":"F2","id":"sxgcc9h","kind":"sentence","match_hash":"938f1e87a970ead49f90e994b28b70821dbe9b2d06ec56ce90438ab6d58536e5","node_hash":"ab660a512602da5a9eb3efba40b694466603c52f7905c07b1bfe46957e842d0a","ord":1,"own_hash":"c707af2b13f4853e22fed33c76bb6f89dc2266ccc6d758f1baee39782f553706","parent":"pnkah9n","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"7118876fe08122ac735926d02326df88de0ab0cf549999a3d185ad25f71fc696","withheld":true} +{"align_key":"36f819ca8d76e54f9112caf850680d7910cadf614fc5a7b0ff7fff6cbe0628f5","fidelity":"F1","id":"qn08tj9","kind":"equation","label":"(1)","match_hash":"36f819ca8d76e54f9112caf850680d7910cadf614fc5a7b0ff7fff6cbe0628f5","node_hash":"a1b6a3ad69d25003261c7a88fe3a1181493d2788cd4752b191f9b0e688c4c9d0","ord":0,"own_hash":"2c6a629eebb0614e831257a912f79e38cc69deadfffa877f515df10e47f87d7f","parent":"sxgcc9h","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"a41cb8ad8b5b5cf305e1a972ae39d1dcbb7ffceb2c3f66fa33aaaeea45b5d237","withheld":true} +{"align_key":"fddf337b6562218fece8fec65df3d8be37cd82f78189a47fe1e3c9271ad747b5","fidelity":"F2","id":"f929eq9","kind":"sentence","match_hash":"8188f5365675ca3647c4ffeeb29e057b8cb80db2f2eff2d1ca0d15ffc6a41566","node_hash":"06b75a842f3c11488173b37c87834ef162e8f97750f21a501d27ec183d6ccfaa","ord":2,"own_hash":"d8a1989d57b6e6debb789c6b7506d909071a496e05af2ab71f1164a63167022a","parent":"pnkah9n","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"d1977b66de803ee431eb5f382bd1d34dbde407de664f794c3154e4b64f81a188","withheld":true} +{"align_key":"25f97a7ccb80d20549a149b6687dfa0c3e93a5ebdbe7774855986652e15c5f45","id":"z77pzan","kind":"paragraph","match_hash":"aeadd90a5c2abd3e13bd69c9ca59fef237195601418f56fd6b93a84627bbbcbb","node_hash":"1b8ac099e9144ef1def945a793352e9937a968731826a83b5a08c0bbb958e3a0","ord":2,"own_hash":"7ce93749deae93fbaaa49daf8f5d41bb784e7ef67e74d687a7228ed2e4a7eeb1","parent":"bzqvbhd","text_hash":"4203c48152c216753ede4124fbdb09b3b00e76dd2d8a18755a1beb7e2e2bad88"} +{"align_key":"cbe42462e4ee6b3ff047028db19f11fbb3c9d64c41c022232c9693d9a5f55f64","fidelity":"F1","id":"e4fkseg","kind":"sentence","match_hash":"be129c20f405e42e03d892afc3460d46dfc0087dd50faae202158a97a88076eb","node_hash":"b4a6d079e4c3b1fc33cdc7c0af2c853a35d297917a2c7b8a505848fac938d0f6","ord":0,"own_hash":"48ab45c7cc9eef65ce9ead2d32d335931751e0a2bea2f39397f8f4723540c64e","parent":"z77pzan","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"40bd222cb0551b1b5799c2a89f85825cbaf4173a4e94b87b6416772246fc0ba4","withheld":true} +{"align_key":"f48e88391d56596431cad5ac2a512eb12bd14c95c7024fa525b565857e845704","fidelity":"F0","id":"r1gacps","kind":"sentence","match_hash":"c0518ce061db29de956b1772bf621d9ba9d2ae48ec1189ffd0ad733209d8b04c","node_hash":"d292ac4f2ed196245c81ebb02991994293b18d9a9c1a1d2be35107061f4b6de7","ord":1,"own_hash":"44cf2401c25d6e010db4a8fb6ba06f946804c38d3c499b22202d5477c30f0e24","parent":"z77pzan","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"d40ecc2cee90558bafb8effecf38d7b6f556d86a36a030c153ddc03981ab4609","withheld":true} +{"align_key":"b721d1ae3934ba1e51ae86cc2850a7ddb472fa9beb53de17b4b84fd4ffc59aa5","attrs":{"level":1},"id":"f0tj6ca","kind":"section","label":"2","match_hash":"4e810ef8d00bba94411728dbaabcead6585dc305d59067e8574c0055aa886954","node_hash":"baffb815b4f70553a40a6b5c7b12cbc0b8d418ed9d076b66da5a23e590e373dd","ord":2,"own_hash":"d229a2c67499360a49b2898ab7ccfaefb3f23ee5b1a78d6e4db18ff877c5ec6b","parent":"ya7x597","text_hash":"d6748c3e90f4cbfd385d4ddc58dad6eb03586b86386e1626b3258ca6712f4534"} +{"align_key":"493a50302b0601211a19b664ee7171d2be9efdc22dc8b153d882e4c2c5bbd808","id":"y52zyge","kind":"heading","match_hash":"c7cefddbb085ab98c4900d26322df5e3505e648c7295da147b08d25a40045543","node_hash":"28603a9a7552e243fe7700a7943b8cb4e038fece83fedbffd5cacf8f59dfe01c","ord":0,"own_hash":"1b781def3f101abf157348ffa8a06f268c05a7faff42ec4c8a6aaa27190d4e26","parent":"f0tj6ca","text_hash":"c7cefddbb085ab98c4900d26322df5e3505e648c7295da147b08d25a40045543"} +{"align_key":"493a50302b0601211a19b664ee7171d2be9efdc22dc8b153d882e4c2c5bbd808","fidelity":"F2","id":"rcz9hta","kind":"sentence","match_hash":"c7cefddbb085ab98c4900d26322df5e3505e648c7295da147b08d25a40045543","node_hash":"753a0e61b8eb429222c6aa046c7696e863d7e692a4bc745cb9417065284a2e78","ord":0,"own_hash":"7dd2c7ce9c1c1a2ca3650f881260fe501dcb3767c5d163161c0ca68c26137c41","parent":"y52zyge","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"c7cefddbb085ab98c4900d26322df5e3505e648c7295da147b08d25a40045543","withheld":true} +{"align_key":"805e6bf893ff00633e3aa62c1a11ca82d61400a7004a97f9e975cdb519fc23b9","id":"zyqr0yc","kind":"paragraph","match_hash":"d54b01d083c88e284221d6979cf98a3c794851c999a6235e3abb07f51f90daba","node_hash":"9940580c0ecbc544aea4a09a84b583ecfc980f8b538b902b80fb70990671a3de","ord":1,"own_hash":"7ce93749deae93fbaaa49daf8f5d41bb784e7ef67e74d687a7228ed2e4a7eeb1","parent":"f0tj6ca","text_hash":"67268264cea233b54c2a75bcac6422f40af4e19572f00dc64ef24ce743476106"} +{"align_key":"89f309a20e68d854a6d77a70c44e548a0ba553cfb49883b8626781c318a9cd83","fidelity":"F0","id":"eajq93t","kind":"sentence","match_hash":"fa85460934ff7fbd5f0bef283a899f977f6abaef332e649f14c2226eba6d379d","node_hash":"6f682e7dbe8d1ff84d321079673c14d6033fd22f9ddb5593b3c8404db80a47d5","ord":0,"own_hash":"d22cf98933029ae8bc85686840794488319e6d38f56e398d3e88760a0b2d2e0f","parent":"zyqr0yc","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"fa85460934ff7fbd5f0bef283a899f977f6abaef332e649f14c2226eba6d379d","withheld":true} +{"align_key":"e857073ae3a11fad1f00a8d9e48e573c87af4a7a36c20134573c6404149e219d","fidelity":"F2","id":"ntr324r","kind":"sentence","match_hash":"ef0f5b50ec6c583330c28b9eabbcb3dc72881b5c0b6c605cb6360b574d4c38bc","node_hash":"33df4a25e1037b74bbaf172645f311004f0b02dd67b0f56f5abe96c39fb0e28a","ord":1,"own_hash":"908a9f553b444f13f19743661965c635447e198f4b7088b930a4ed8905960747","parent":"zyqr0yc","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"00624eb13190db7681e40be9e50603b118ad8c939e3a73cfcd1b82f67978526a","withheld":true} +{"align_key":"9ce5d1e67bebaf892299ef2779f8add4156340a23e32d930ae2e9960cbb485db","id":"vsrzypn","kind":"footnote","label":"a","match_hash":"53242b5fa8912be9fbff4b6ed9f665ffe855d537130fc7175f71b9369724577a","node_hash":"52913dd959c8fb27c5c0f0c416f488b3610e30094fe788c772640895db2b1608","ord":2,"own_hash":"220273ca69addc8e8e2d4c3084a30b8953551867c7d976783847e9b035f25aa4","parent":"f0tj6ca","text_hash":"53242b5fa8912be9fbff4b6ed9f665ffe855d537130fc7175f71b9369724577a"} +{"align_key":"9ce5d1e67bebaf892299ef2779f8add4156340a23e32d930ae2e9960cbb485db","fidelity":"F2","id":"gqs1dcb","kind":"sentence","match_hash":"53242b5fa8912be9fbff4b6ed9f665ffe855d537130fc7175f71b9369724577a","node_hash":"a50dd8a162c6ddc9d7ee17b56746ba8d95f10d2ead0b12b38edbcb1e79cb6d06","ord":0,"own_hash":"808a1ff33c18b185fb355b833a38fa0668fec447ce0c70aa53b970c3ff6bd118","parent":"vsrzypn","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"53242b5fa8912be9fbff4b6ed9f665ffe855d537130fc7175f71b9369724577a","withheld":true} +{"align_key":"808b367000df98badd3ff12c5c1642f59e299db610d828da950a912579d91639","id":"ajfvq4s","kind":"figure","label":"Figure 1","match_hash":"c1cc134439a3a2dc7383379ea39d5c703e45624ec0b6e628a9904b3eafe6f192","node_hash":"34dde1d17fe553d95bfbc3c9a401f8cd2f049e3d2a1cff49da8386df4feb7b5b","ord":3,"own_hash":"719f3259a2f7d65161a291d956c34e93c57b56cc0e0ca6a26dea9a0bf03995cd","parent":"f0tj6ca","text_hash":"c1cc134439a3a2dc7383379ea39d5c703e45624ec0b6e628a9904b3eafe6f192"} +{"align_key":"878b18b5bda7d1b5792a63fd868381f65cbdaf044d00333be3ed972b8f17fc40","attrs":{"crop":{"dpi":300,"media_type":"image/png","sha256":"586f92512b294a1c325bfc16207771fb9acc7bb67bb206f25a429a055134056f"},"image":{"media_type":"image/png","native":true,"sha256":"a18e1eb7f434c85ee180399dc55d2ee78c5ceb915c4a004c5dd0e490399d4c75"}},"id":"b2wgyq2","kind":"panel","label":"a","match_hash":"878b18b5bda7d1b5792a63fd868381f65cbdaf044d00333be3ed972b8f17fc40","node_hash":"5c658a63e7cdb3446ad6660a3d1c675766d0443ce72996578f142ceef4381f21","ord":0,"own_hash":"611ab310a510d238a29af1c25fe4d0ddb0131012a8c52e02f720ba58fe675817","parent":"ajfvq4s","text_hash":"878b18b5bda7d1b5792a63fd868381f65cbdaf044d00333be3ed972b8f17fc40"} +{"align_key":"878b18b5bda7d1b5792a63fd868381f65cbdaf044d00333be3ed972b8f17fc40","id":"wtgh2xp","kind":"panel","label":"b","match_hash":"878b18b5bda7d1b5792a63fd868381f65cbdaf044d00333be3ed972b8f17fc40","node_hash":"a2ba885581f284e2d133172079e8ff06c4018fe2f306b72367e2f8d86aae47f2","ord":1,"own_hash":"281c98db3cb7bfb19193cd6be1810d36397aa11b8b4f35cffe4ff06424872028","parent":"ajfvq4s","text_hash":"878b18b5bda7d1b5792a63fd868381f65cbdaf044d00333be3ed972b8f17fc40"} +{"align_key":"808b367000df98badd3ff12c5c1642f59e299db610d828da950a912579d91639","id":"xmwf2ex","kind":"caption","match_hash":"c1cc134439a3a2dc7383379ea39d5c703e45624ec0b6e628a9904b3eafe6f192","node_hash":"a7afdc136648068d532580ae3d064f47de6083cfa2b95f64565966e530b7abe0","ord":2,"own_hash":"ba9fdafffbc50f8f3eb3105a28d8af0fde7499aa65f1f6ca8039cf1a6fed816a","parent":"ajfvq4s","text_hash":"c1cc134439a3a2dc7383379ea39d5c703e45624ec0b6e628a9904b3eafe6f192"} +{"align_key":"68357dca06982751d498ddb4bee55bb109c427ba0c01c40bad9e08dbc86a59db","fidelity":"F2","id":"yq0agq9","kind":"sentence","match_hash":"661808c2f7aa88f3d7471ac50017743ee15a6f45e47ca3fff389919e7b2db626","node_hash":"49cba4a2f717d9479f901dcbe46f75b74032dbb0833740f167b73aaec9725894","ord":0,"own_hash":"689441fdbfb32af69ff945755ac8c5b3da4e603d42a602157f3a7209b6b263c9","parent":"xmwf2ex","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"661808c2f7aa88f3d7471ac50017743ee15a6f45e47ca3fff389919e7b2db626","withheld":true} +{"align_key":"d5e58f363e0e916417a411d8d4095d23f455c54ed9b8ac5cd0d4b118d0286a1f","fidelity":"F2","id":"nmm4md0","kind":"sentence","match_hash":"77413c389c915256e641756a81a2f0dbfe4c0a709f84eed920f568475fce5027","node_hash":"ab5e1eb8db4aa7d8eb5cfacaf151dfb8b590cda7e7ca368eee6f765859b41e9d","ord":1,"own_hash":"93daf6f77fbe33176fc9cfe1c10b53413bde4bf80c4bec160cfb35d466b6a62a","parent":"xmwf2ex","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"77413c389c915256e641756a81a2f0dbfe4c0a709f84eed920f568475fce5027","withheld":true} +{"align_key":"a3b016ca715453b6bbe80e1f8facc28f650adb51e18e2de4a832feda4c7ee258","fidelity":"F2","id":"ed602fy","kind":"sentence","match_hash":"66eb42f47781778fc9ee61ac3f4e2660294d710c0331b12ef45a5bf41630ee2b","node_hash":"3271c511a4d298a65b76ffc567e6a27d4947ea10041f070b6104967aaaa73d14","ord":2,"own_hash":"e5d401c2e1345f1ddf233522a8e6077d563f5c8c8dd199cae8ca9f6a9d9f0b63","parent":"xmwf2ex","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"66eb42f47781778fc9ee61ac3f4e2660294d710c0331b12ef45a5bf41630ee2b","withheld":true} +{"align_key":"3dbd087a53049ca2120958afef539f6c78df8a57e8f9b6e884424b3ba7096ae2","attrs":{"columns":[{"header_path":["e4z9fr6"],"id":"vphmyzz"},{"header_path":["cwhj4gp","sam8g7e"],"id":"kp6grmd"},{"header_path":["cwhj4gp","cq77erb"],"id":"z16p4vm"},{"header_path":["vtszvw9","h5psthj"],"id":"egq2j2a"},{"header_path":["vtszvw9","j3d4w5v"],"id":"my9ahda"}]},"id":"gm5z4rx","kind":"table","label":"Table 1","match_hash":"c137e985c18bfbb1f40d6f31657bf642688b1e6a918a2410edd30fa41fe93c69","node_hash":"2f1bd126f1cfa2716e4598cb373f4b1da926bba85330ff5e96d1e5a8e7d61f00","ord":4,"own_hash":"27693f3e97b921d58ba4892205c8c62784abf56ecf7feeb2142e341aa599b8db","parent":"f0tj6ca","text_hash":"583453fa94ddae11ee0c9e31f2300f0946d9bc7259b01014d9befa746da32cac"} +{"align_key":"59eac24420accc9548e7825f627b5996ebd144b7dcd0efbc1d1efa2eaacec09e","id":"fzz8ndw","kind":"caption","match_hash":"b23b57818a52d7bc4e91d68d444417832f2d6d2521250417dc90acb3cc23186c","node_hash":"07497f7e4ee4a5484dc1733c564517687b34fd67d590b31bd2b243ce6c920c02","ord":0,"own_hash":"ba9fdafffbc50f8f3eb3105a28d8af0fde7499aa65f1f6ca8039cf1a6fed816a","parent":"gm5z4rx","text_hash":"b23b57818a52d7bc4e91d68d444417832f2d6d2521250417dc90acb3cc23186c"} +{"align_key":"59eac24420accc9548e7825f627b5996ebd144b7dcd0efbc1d1efa2eaacec09e","fidelity":"F2","id":"beayvd3","kind":"sentence","match_hash":"b23b57818a52d7bc4e91d68d444417832f2d6d2521250417dc90acb3cc23186c","node_hash":"b602de2a359e631a7d84b8582b77f8755d70962c698e0429dcfcfdba7941e36b","ord":0,"own_hash":"81ef163d64f4191435b982d07cd6c8319e1b116dec1d2b162d88f24b90e20110","parent":"fzz8ndw","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"b23b57818a52d7bc4e91d68d444417832f2d6d2521250417dc90acb3cc23186c","withheld":true} +{"align_key":"4376105c3e80aa8abc2099f3e83cbddd62403a187ea0395f63ddc09575d97c7e","id":"bapa0zm","kind":"table-head","match_hash":"4fcfcb75d73e0c5cbaa7a438a3bc6330386efc84deabb86046dfcaf2668c455d","node_hash":"3e774e52d828022bb324b563c87be572537a03a3dbe4070b9f84aa5689df76f8","ord":1,"own_hash":"bbaadd50334544fb7cc91910d740452d6b2845b546cae8ad49e7ab7354672830","parent":"gm5z4rx","text_hash":"f5cff9d5eeed71ac72bcd2acdd78f96ac8abdcace142d39ee3956cef41ef22a3"} +{"align_key":"706139ca2e03033ffa6ff3bfb6a08fb0e8656d5372e2e7883e1bb795c9a3737d","id":"btf2r9v","kind":"row","match_hash":"4f558d340739b2e1b944f7fe4948837913760237bc743f72ea9b352e69b72deb","node_hash":"29a36655c5a5e12d1eba36cf23439c389fdd4e0b75c327801b5bcdc471d2c12b","ord":0,"own_hash":"8c2b2cd258d55ac41f2dfa05d4f7999a84b1ce1a531030056c303a464971bcc4","parent":"bapa0zm","text_hash":"4f558d340739b2e1b944f7fe4948837913760237bc743f72ea9b352e69b72deb"} +{"align_key":"003d3af654cf1d6c92471e287341ecf4e02da0a1940876dddc3fe2f78ba85369","attrs":{"colspan":1,"column":"vphmyzz","role":"column-header","rowspan":2},"fidelity":"F1","id":"e4z9fr6","kind":"cell","match_hash":"96d1e078cf38f170df04fdfa12dd025c1cdfd2dd92e81db8861e6770a86fce64","node_hash":"85e1a35e0fde5cd4e1d9b6e7003981976ac321b53efe7cde340421d1652f7810","ord":0,"own_hash":"49e699ce91aba2856ba0a9c6d9270f31b4db14e1a650145b9a81cd1893fe6215","parent":"btf2r9v","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"96d1e078cf38f170df04fdfa12dd025c1cdfd2dd92e81db8861e6770a86fce64","withheld":true} +{"align_key":"0d822dcbf3bd4fa8aeed7b47077bb4f20aef2adfefe6e0417c5ddf1cf648cf1b","attrs":{"colspan":2,"column":"kp6grmd","role":"column-header","rowspan":1},"fidelity":"F1","id":"cwhj4gp","kind":"cell","match_hash":"92f1b48dd4551f5f7d6a5c000bc4269244f699c6818ddf03989190ac5e7a73f4","node_hash":"f4a59e98e6a35e5ff84b0c2d3ae114aebbce5a7577b2b429c0f24aed7fd34d46","ord":1,"own_hash":"3dd8f46a8eb6fbe0ca04630bb8f1f42fb7f224a959787ec5ec4609e777d17d3e","parent":"btf2r9v","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"92f1b48dd4551f5f7d6a5c000bc4269244f699c6818ddf03989190ac5e7a73f4","withheld":true} +{"align_key":"886c5bd0cef76666b8cce2e074e9b26f3418c5a373da4e34459d424850af2317","attrs":{"colspan":2,"column":"egq2j2a","role":"column-header","rowspan":1},"fidelity":"F1","id":"vtszvw9","kind":"cell","match_hash":"0fb6cb039f7bf62bb2c417ca0df18782572cebb248e8666cc634d2064bdb9129","node_hash":"a37f4a91643698ea9331cadc187f031142b7afbcc741267a1e602205254ee5c5","ord":2,"own_hash":"d8bd1243f7f8990e731f96fe9e0e39e3ae43a3119c4fabbf13dd5fa8f77029a0","parent":"btf2r9v","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"0fb6cb039f7bf62bb2c417ca0df18782572cebb248e8666cc634d2064bdb9129","withheld":true} +{"align_key":"9f871fb0f3a5d193f79af4e28e74e3ef0db5d07adc96ed4805bc32a444ae7328","id":"qxm90ek","kind":"row","match_hash":"41ee8a6c52c5a3db8ff84a886c2021a7743f5ae5a7848beafae01af50610fc4a","node_hash":"52e31ceba6bc27cdda27b5f6fdd59740b4681f7215103b4e1e53e2fa8846c0d8","ord":1,"own_hash":"8c2b2cd258d55ac41f2dfa05d4f7999a84b1ce1a531030056c303a464971bcc4","parent":"bapa0zm","text_hash":"0f69766d498a4809873c64941861117462b020313bae21f152d3a0da50ea66b3"} +{"align_key":"ebc983369f52564f43efefa413a16d4862bb49c523c9d6f7bda3e9045919d26f","attrs":{"colspan":1,"column":"kp6grmd","role":"column-header","rowspan":1},"fidelity":"F1","id":"sam8g7e","kind":"cell","match_hash":"cc8979e3c6206f03696657d1df368e43385e7d2e8e07104b63214eeb21bcd1a6","node_hash":"34c3e54ee89b6642df5960c9927047d910e825c2783b56e762f0c81187ffa463","ord":0,"own_hash":"af31fc0df6c860baf058911e76a2f99ac6a5ad8e531d055b95b60522b9628917","parent":"qxm90ek","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"e4409fced6482611fa2069ebf006d860306bdffba1716efc320a715161282bb2","withheld":true} +{"align_key":"78b5eb47a69d74d3f212f938db96069a89565b626cfc1c27d1fd2b865d59b285","attrs":{"colspan":1,"column":"z16p4vm","role":"column-header","rowspan":1},"fidelity":"F1","id":"cq77erb","kind":"cell","match_hash":"588290f63889d1616c06ef2381f9b0b5fbe9b78615e70b6e47a513349cbfff5f","node_hash":"d04d30b756c46b359dca0c5230f5f60f1cdec776e47d221ba85370b38c61e634","ord":1,"own_hash":"c83041b8fed08d3a5dee95d769d6c1285be4a47cf6e392eed5ccb824051813f8","parent":"qxm90ek","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"076797fcc7eb5b548efebfec1f0eff2906d0facd2108f7de1f98f658cb14aad0","withheld":true} +{"align_key":"ebc983369f52564f43efefa413a16d4862bb49c523c9d6f7bda3e9045919d26f","attrs":{"colspan":1,"column":"egq2j2a","role":"column-header","rowspan":1},"fidelity":"F1","id":"h5psthj","kind":"cell","match_hash":"cc8979e3c6206f03696657d1df368e43385e7d2e8e07104b63214eeb21bcd1a6","node_hash":"d27a4a8c3cb0625ff5e0cb43e02e09fd23eace844a0abff48b52761b1f631405","ord":2,"own_hash":"1277bf7c4e6ebf7edec0eb776f7e7790b78aea124fe807d3863615ef51ca3460","parent":"qxm90ek","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"e4409fced6482611fa2069ebf006d860306bdffba1716efc320a715161282bb2","withheld":true} +{"align_key":"78b5eb47a69d74d3f212f938db96069a89565b626cfc1c27d1fd2b865d59b285","attrs":{"colspan":1,"column":"my9ahda","role":"column-header","rowspan":1},"fidelity":"F1","id":"j3d4w5v","kind":"cell","match_hash":"588290f63889d1616c06ef2381f9b0b5fbe9b78615e70b6e47a513349cbfff5f","node_hash":"897f7e86f6e57657647a32e82d66f8228a83ff0a738f48d0baed1ed0ecc46314","ord":3,"own_hash":"bc969e56b73cb61324ede87e6dfa6d7df86d72691de208c7301cf5d68e1e190a","parent":"qxm90ek","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"076797fcc7eb5b548efebfec1f0eff2906d0facd2108f7de1f98f658cb14aad0","withheld":true} +{"align_key":"b85bad7b348377cffa984df0b59127b7ea914c1caae37c56bd5fda65b604ff7b","id":"tk5p46c","kind":"table-body","match_hash":"1ca75d97cf6bdeec2a0ed45fc1acad26f2606ffc0665c7a318ac6b49e8550e8e","node_hash":"ef00ac0c1697c2ba7093bf481adb257402d2d4d63cf3968689a2b6816a907168","ord":2,"own_hash":"fc8556c64a0766d7005f6bf0e556a1db1acb6455dba007512a4424d4c87a5766","parent":"gm5z4rx","text_hash":"1ca75d97cf6bdeec2a0ed45fc1acad26f2606ffc0665c7a318ac6b49e8550e8e"} +{"align_key":"cd8719650193652dc77201e42c9856a1ad206754ada54377d906157d8abf59fd","id":"y7pmzed","kind":"row","match_hash":"a7d1e18d0879114c5933f5d7239513a8082e5d19cf3cdb2c56bfa876a28b2f63","node_hash":"9cc1f54bc696ee8f9b40312af712cdd68fbe1306c2363a52545b066486b95806","ord":0,"own_hash":"8c2b2cd258d55ac41f2dfa05d4f7999a84b1ce1a531030056c303a464971bcc4","parent":"tk5p46c","text_hash":"a7d1e18d0879114c5933f5d7239513a8082e5d19cf3cdb2c56bfa876a28b2f63"} +{"align_key":"cd8719650193652dc77201e42c9856a1ad206754ada54377d906157d8abf59fd","attrs":{"colspan":5,"column":"vphmyzz","role":"row-group-header","rowspan":1},"fidelity":"F1","id":"hwxm8de","kind":"cell","match_hash":"a7d1e18d0879114c5933f5d7239513a8082e5d19cf3cdb2c56bfa876a28b2f63","node_hash":"45173f6ab1899e3b3610aec35ff54b225a0fc94a8989e50d5f0a477ba97599d4","ord":0,"own_hash":"1e35b0fbd4e9291b98c3ab0fff082d015f75c6076d2ee1b60141e5963d40e708","parent":"y7pmzed","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"a7d1e18d0879114c5933f5d7239513a8082e5d19cf3cdb2c56bfa876a28b2f63","withheld":true} +{"align_key":"7a04bfb899b11403971dbf85ca7c0541430ff199ab39c1b7460a4cddd66ded6d","attrs":{"header_path":["hwxm8de","k3fqnvy"]},"id":"zhe4g0k","kind":"row","match_hash":"823b8fd6fb6b875eb780c85f86d624617b68e63c8bfc45ffaa987b1855d5a4fa","node_hash":"a0c6ff53fcac28d33db9201a89def30d7db0c3e848eb7c289e41898d5cd3320c","ord":1,"own_hash":"8c2b2cd258d55ac41f2dfa05d4f7999a84b1ce1a531030056c303a464971bcc4","parent":"tk5p46c","text_hash":"823b8fd6fb6b875eb780c85f86d624617b68e63c8bfc45ffaa987b1855d5a4fa"} +{"align_key":"162a504efa3d959196eae34e24b67cbfb4b1c3e4614b47e4cbe5ce693b79cae2","attrs":{"colspan":1,"column":"vphmyzz","role":"row-header","rowspan":1},"fidelity":"F1","id":"k3fqnvy","kind":"cell","match_hash":"fc307dd410d4c12729bd6fb9abd1a880c646c1ffb54d0d215e517ba359b3e0c0","node_hash":"cf66cda267c928dc332dd48496afe651b89caa246cce40246c9e7e0cca5f17f4","ord":0,"own_hash":"b0de07b0f1a53bbe8e4733229fc08619b1c70714cd8f720de842f4cf04b4b6e6","parent":"zhe4g0k","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"fc307dd410d4c12729bd6fb9abd1a880c646c1ffb54d0d215e517ba359b3e0c0","withheld":true} +{"align_key":"28133af785f245c99c06c6f69c4e6dfea3f5200db72e8a8e61b0be56d51bd5e2","attrs":{"colspan":1,"column":"kp6grmd","role":"data","rowspan":1},"fidelity":"F1","id":"nkm3xn5","kind":"cell","match_hash":"28133af785f245c99c06c6f69c4e6dfea3f5200db72e8a8e61b0be56d51bd5e2","node_hash":"1e07443c6acd1b0c9ae37d9b6a8c65e7b01ce6cd3c4c45d302a207e9d253fa44","ord":1,"own_hash":"f6d5df75e6e2f26bd3f668aa205d9fb2b2c6911c69134c15f00e2099118bd120","parent":"zhe4g0k","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"28133af785f245c99c06c6f69c4e6dfea3f5200db72e8a8e61b0be56d51bd5e2","withheld":true} +{"align_key":"29073084890540aca3b6df492faabf7676656ebaae9d423c821778cb71c735b1","attrs":{"colspan":1,"column":"z16p4vm","role":"data","rowspan":1},"fidelity":"F1","id":"kpk13yn","kind":"cell","match_hash":"29073084890540aca3b6df492faabf7676656ebaae9d423c821778cb71c735b1","node_hash":"727c96342be3e644671c3c24151aacf3330dd52cf5238ca8d94f3bbe139ca804","ord":2,"own_hash":"f7d8c508897ae310948a0e76049ccf50fbcb1a87bc84292836e4072ff32a318d","parent":"zhe4g0k","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"29073084890540aca3b6df492faabf7676656ebaae9d423c821778cb71c735b1","withheld":true} +{"align_key":"3359a9adba46439ff1e3d9e35dec03cd9f7864e4e76a94617cd8fa82e9abc527","attrs":{"colspan":1,"column":"egq2j2a","role":"data","rowspan":1},"fidelity":"F1","id":"hw8fx4r","kind":"cell","match_hash":"3359a9adba46439ff1e3d9e35dec03cd9f7864e4e76a94617cd8fa82e9abc527","node_hash":"6ca0030a990563dde9ae0c65d0e079d482c9b8e78fe3f5ca1e09cb861e247336","ord":3,"own_hash":"dd66d1a77a90aa16ffdaaf6e301e381230bb84bf20c9bb0de7f2b7218bb97e2e","parent":"zhe4g0k","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"3359a9adba46439ff1e3d9e35dec03cd9f7864e4e76a94617cd8fa82e9abc527","withheld":true} +{"align_key":"54fd9b2ec46d19471dbe1e17f687b0044a5972228ad00ef220e409bd696ad8ea","attrs":{"colspan":1,"column":"my9ahda","role":"data","rowspan":1},"fidelity":"F1","id":"rr9wvsy","kind":"cell","match_hash":"54fd9b2ec46d19471dbe1e17f687b0044a5972228ad00ef220e409bd696ad8ea","node_hash":"50d12ef46e9c143b04f002d83a0eb2e8fca5b21c1c80580617ade28467bfef5e","ord":4,"own_hash":"84374b0be3b3261aae629dcf18d2accc7b52a0e8c63175fd1b96764de3166694","parent":"zhe4g0k","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"54fd9b2ec46d19471dbe1e17f687b0044a5972228ad00ef220e409bd696ad8ea","withheld":true} +{"align_key":"2c51688f6e97dbeb5c871e53ee677dbf02d5425a3c898f1c22b6972a8c02ad01","attrs":{"header_path":["hwxm8de","t6gjpee"]},"id":"fbg2mwq","kind":"row","match_hash":"dc2890cc43882e8b7500074dab0955fba2219c9a6ab45a79e327b22fe555129e","node_hash":"9d32c4d1860f836191dfd055d36ee235f5891d290b8975be608a6132e41637ec","ord":2,"own_hash":"8c2b2cd258d55ac41f2dfa05d4f7999a84b1ce1a531030056c303a464971bcc4","parent":"tk5p46c","text_hash":"dc2890cc43882e8b7500074dab0955fba2219c9a6ab45a79e327b22fe555129e"} +{"align_key":"ee88f0f2e32d7630f25bcec893303b3f0df1083379cd41d9666850ebf0c5a754","attrs":{"colspan":1,"column":"vphmyzz","role":"row-header","rowspan":1},"fidelity":"F1","id":"t6gjpee","kind":"cell","match_hash":"83e61259936d5bd69786fff44c639056a437e273a6af5fba79f8d5ec541c1f54","node_hash":"72a5ff09352b1bcb2b728551779ec27f768cee75fb72a944fab6a5c3dc3759ef","ord":0,"own_hash":"64d43204db22dce18dfab76944242751567037d6d0ab5c3e60f47cc9c3f40cdb","parent":"fbg2mwq","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"83e61259936d5bd69786fff44c639056a437e273a6af5fba79f8d5ec541c1f54","withheld":true} +{"align_key":"528ce2b3afdbc71a519adaf791ac40b9f8c54f72a38ab476fbf070f375417212","attrs":{"colspan":1,"column":"kp6grmd","role":"data","rowspan":1},"fidelity":"F1","id":"kw2fb3v","kind":"cell","match_hash":"528ce2b3afdbc71a519adaf791ac40b9f8c54f72a38ab476fbf070f375417212","node_hash":"35fc32da82a1474befb6c972db35e7068d072f7740694523465eb11cf5c17f18","ord":1,"own_hash":"ef5be64af4347400489b941914102eb96bef5784061cbc149e18a8b65d919a18","parent":"fbg2mwq","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"528ce2b3afdbc71a519adaf791ac40b9f8c54f72a38ab476fbf070f375417212","withheld":true} +{"align_key":"e9c84b4a452c178ae09edffd16405d7f90c0224199b4fc708e671fc357a56cc0","attrs":{"colspan":1,"column":"z16p4vm","role":"data","rowspan":1},"fidelity":"F1","id":"e0n07n0","kind":"cell","match_hash":"e9c84b4a452c178ae09edffd16405d7f90c0224199b4fc708e671fc357a56cc0","node_hash":"1a423dab0c346af2a545210c26d31d33e059685b8c539e661f07f561143d0dfe","ord":2,"own_hash":"44cbcc5390908f22f0d93f19dd70b8793a20e579c5d160c7029f47bfc3025891","parent":"fbg2mwq","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"e9c84b4a452c178ae09edffd16405d7f90c0224199b4fc708e671fc357a56cc0","withheld":true} +{"align_key":"65a275ffb4217a1f7b9026588f928d7b9fa25d71b2f4e814f3406c1b9b666262","attrs":{"colspan":1,"column":"egq2j2a","role":"data","rowspan":1},"fidelity":"F1","id":"gy4avx6","kind":"cell","match_hash":"65a275ffb4217a1f7b9026588f928d7b9fa25d71b2f4e814f3406c1b9b666262","node_hash":"c1dac2cf9212b67e1998089a94b981cf3fdce7dc0d9f211ed0407cfe3dfbd0c1","ord":3,"own_hash":"7f0c1fd5dfce3e934a4fe9c13f4a10bbb8ecc914de8691c87d3e9a9893bb8b7a","parent":"fbg2mwq","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"65a275ffb4217a1f7b9026588f928d7b9fa25d71b2f4e814f3406c1b9b666262","withheld":true} +{"align_key":"70217018986eb2fb733cf825d8ea0a341a559ee3d29fa832b06eaab948145340","attrs":{"colspan":1,"column":"my9ahda","role":"data","rowspan":1},"fidelity":"F1","id":"ezb1n33","kind":"cell","match_hash":"70217018986eb2fb733cf825d8ea0a341a559ee3d29fa832b06eaab948145340","node_hash":"0377084de978b5971e2b22d2197cb1fb7556e4d9faba693aae78496ddb833a61","ord":4,"own_hash":"ef8eecdbe2bdbadddd6653a4e55bd2ff81de1e615c21b01d081beb36f97ed0ff","parent":"fbg2mwq","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"70217018986eb2fb733cf825d8ea0a341a559ee3d29fa832b06eaab948145340","withheld":true} +{"align_key":"65823621e7e345688f4d5f9b3ab0bf683989faab36355181ff37c5be2fb9b325","attrs":{"header_path":["hwxm8de","j67ec9p"]},"id":"j0x5twd","kind":"row","match_hash":"693fb067037ac7f2357432c0a9237562c0308864accdb13b45ba6e36ea21d6e2","node_hash":"5ac40a00a5eff228d7c7ff8a914db566c25afcfdb353a8951943245260c4d0cc","ord":3,"own_hash":"8c2b2cd258d55ac41f2dfa05d4f7999a84b1ce1a531030056c303a464971bcc4","parent":"tk5p46c","text_hash":"693fb067037ac7f2357432c0a9237562c0308864accdb13b45ba6e36ea21d6e2"} +{"align_key":"a03ba46d8868c98bcc3ba532dfee278127264b5db0fd6ec9b0a8c1518eb9031e","attrs":{"colspan":1,"column":"vphmyzz","role":"row-header","rowspan":1},"fidelity":"F1","id":"j67ec9p","kind":"cell","match_hash":"74f6b8b2c692efe428ca8a4d1de9af90ed19a7a9a067be7c96d582c5a684f01c","node_hash":"9043ab653f28a39b9d27b04496ef11c918fc496bc9c6767decb3fc33c2027d93","ord":0,"own_hash":"04e365a828a4333af0d939dd38476f9f66495f4f79ab238d690d941ea1d3099d","parent":"j0x5twd","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"74f6b8b2c692efe428ca8a4d1de9af90ed19a7a9a067be7c96d582c5a684f01c","withheld":true} +{"align_key":"eec93ef6358c0d35e042c3a2f9050e176636cbd94145f6ec6b607501ea4a1a7f","attrs":{"colspan":1,"column":"kp6grmd","role":"data","rowspan":1},"fidelity":"F1","id":"dm452cm","kind":"cell","match_hash":"eec93ef6358c0d35e042c3a2f9050e176636cbd94145f6ec6b607501ea4a1a7f","node_hash":"e02497de5346a7d0d78d25abdda804ccee76677b4584bc2abdd5baf033ade553","ord":1,"own_hash":"3d2749a56f1a65aa123c28999cd0e2744df2d78e098e0b44f79fcd120587a5ff","parent":"j0x5twd","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"eec93ef6358c0d35e042c3a2f9050e176636cbd94145f6ec6b607501ea4a1a7f","withheld":true} +{"align_key":"f13f44baf7158d6b4f18cb65e73e0016e039c644173c97bc3538a59a4af9cfb6","attrs":{"colspan":1,"column":"z16p4vm","role":"data","rowspan":1},"fidelity":"F1","id":"t3dsc22","kind":"cell","match_hash":"f13f44baf7158d6b4f18cb65e73e0016e039c644173c97bc3538a59a4af9cfb6","node_hash":"b9651ca64f7122cc9f38a12a40d726b3598336b338a5e00765adff0247e018ee","ord":2,"own_hash":"5d874ea23365f725591e6fa8578aaeb51263099a56555b7d2d54d98d7e29a7f0","parent":"j0x5twd","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"f13f44baf7158d6b4f18cb65e73e0016e039c644173c97bc3538a59a4af9cfb6","withheld":true} +{"align_key":"09b7fe8d7274af303207933f8784ed8d9c72c76da15c23c9625c77474a49d2e9","attrs":{"colspan":1,"column":"egq2j2a","role":"data","rowspan":1},"fidelity":"F1","id":"mkakqg3","kind":"cell","match_hash":"09b7fe8d7274af303207933f8784ed8d9c72c76da15c23c9625c77474a49d2e9","node_hash":"8cdc489ffc14bad185a8816f9a6abe161760e22e93aa69a2e20866c2044cae74","ord":3,"own_hash":"2dcb519acbbee955bef05ce9bb1b75df5fa29ffbb03eb0daffbf78f9b4e54235","parent":"j0x5twd","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"09b7fe8d7274af303207933f8784ed8d9c72c76da15c23c9625c77474a49d2e9","withheld":true} +{"align_key":"a785c7f31d1952353d12a2b494974c5c8b518a4913909771f6f47c936a985fc2","attrs":{"colspan":1,"column":"my9ahda","role":"data","rowspan":1},"fidelity":"F1","id":"ba6xp29","kind":"cell","match_hash":"a785c7f31d1952353d12a2b494974c5c8b518a4913909771f6f47c936a985fc2","node_hash":"857b2bbc78960491694c7482cb630cf97a0aac85c24a553bff3cc7c8554fc306","ord":4,"own_hash":"9ff0be76ae620193c28376866e80ccc590189ef37fd768c8f4f0da502bec488f","parent":"j0x5twd","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"a785c7f31d1952353d12a2b494974c5c8b518a4913909771f6f47c936a985fc2","withheld":true} +{"align_key":"893ee525230054eaee5b3efe089a8b296fb21ef697bf9ae2ed858c99df085747","id":"ahxcgqa","kind":"table-note","match_hash":"3a5c10a23f307da8ef0ab5675187e0758154d45fef9b39218e775677e067d64c","node_hash":"841325c4c31e04006c3adeeea8e17381e7bfaa86f9bc3992cf10f4ecfb890a1e","ord":3,"own_hash":"6bc22492071ffdfe80290130c8b7946181e057f259019c2a8bfc94e9c2ab89a4","parent":"gm5z4rx","text_hash":"3a5c10a23f307da8ef0ab5675187e0758154d45fef9b39218e775677e067d64c"} +{"align_key":"893ee525230054eaee5b3efe089a8b296fb21ef697bf9ae2ed858c99df085747","fidelity":"F2","id":"bn2ef3e","kind":"sentence","match_hash":"3a5c10a23f307da8ef0ab5675187e0758154d45fef9b39218e775677e067d64c","node_hash":"0dc9dbceb3d78e849cd28053b487d4835f0911a9a3cae350435d34681f4f1f88","ord":0,"own_hash":"3e72594a0c468938b36c5e97edb4915265facdf050cadb1d14d53ae73bf55d83","parent":"ahxcgqa","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"3a5c10a23f307da8ef0ab5675187e0758154d45fef9b39218e775677e067d64c","withheld":true} +{"align_key":"6cd1f5f12ed876094aa01342b310e5db8ab29d8acbb42de83c1e2ab638f64cc7","id":"jmdabra","kind":"back","match_hash":"0ed986a515f30263c82cac0264cc47dd2ebb14983c1e2b0304d044e895d27910","node_hash":"ef06d61667a911e711d8f08e4e225c548625e4d28ebce623240e12f0e4e8271d","ord":3,"own_hash":"4f926f159cc7eb57366a2a1d3917cdfeeaa0f25d76515024de972c463911f891","parent":"ya7x597","text_hash":"58b6b20f43f16afa0ccef0256534bb06d2ad2a170efe01ac02648ff5f69fc15f"} +{"align_key":"6cd1f5f12ed876094aa01342b310e5db8ab29d8acbb42de83c1e2ab638f64cc7","id":"m9ywq9e","kind":"references","match_hash":"0ed986a515f30263c82cac0264cc47dd2ebb14983c1e2b0304d044e895d27910","node_hash":"0dec1359b05061a06f01cb2f1b9dd93efba86df642b8e3bedcccc0a24297a629","ord":0,"own_hash":"f88340b9f2c1499670147c43fdfffb4d64dc2643c95a926d6596957ced93d053","parent":"jmdabra","text_hash":"58b6b20f43f16afa0ccef0256534bb06d2ad2a170efe01ac02648ff5f69fc15f"} +{"align_key":"1b3343ca70ccb1918182ca85a5857f7e6a86e8b747048cf5ff4ec683448cbe37","fidelity":"F2","id":"zmyqtxs","kind":"reference","label":"1","match_hash":"5fbe03e2c80c63d89b924f49f88d7ebcb0ccbaeda02f1521ad57c54f6c0b9030","node_hash":"d2c13a4b0b2dc1bb339ab2732eb6b8d9d279abd5572b19e16834d2961ff30e2c","ord":0,"own_hash":"f68f63de060c709c382a79bbb257a775197d32c0de183335e9dd0893590a6d1d","parent":"m9ywq9e","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"78dd9decbce9b536209eecce6f2e91622194e186e2d0bc04186f652f7c374498","withheld":true} +{"align_key":"9d479bc47af08cef1495f20c5d59ef27c0acae57e3b70a634f8f1ef85fa92ef2","fidelity":"F2","id":"b3g86a4","kind":"reference","label":"2","match_hash":"dc8d01dbc1961a598e8677de388121710cfcbb343614f1a7ffe09c6c3374bfd2","node_hash":"2d2dbd827cd41d67cd940ebc13b5894d1a170ad242eb5fa12ae633b09d168481","ord":1,"own_hash":"5e6d3b2e3d05a0f11d531a983da04fff497e00059f7b92fb726f7a296fcdd6b6","parent":"m9ywq9e","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"1f766f45a7ee691354c969539d1b03ffbc1836d1224a1bc359904365697e935a","withheld":true} diff --git a/fixtures/packages/hale2026harmonic.checks-only/pages.jsonl b/fixtures/packages/hale2026harmonic.checks-only/pages.jsonl new file mode 100644 index 0000000..dc29f0c --- /dev/null +++ b/fixtures/packages/hale2026harmonic.checks-only/pages.jsonl @@ -0,0 +1,2 @@ +{"page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101","size":[612,792],"stamps_removed":["downloaded-via","sharing-guidelines"],"text_layer":true,"witness":"qptsanv"} +{"page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102","size":[612,792],"stamps_removed":["downloaded-via","sharing-guidelines"],"text_layer":true,"witness":"qptsanv"} diff --git a/fixtures/packages/hale2026harmonic.checks-only/provenance.json b/fixtures/packages/hale2026harmonic.checks-only/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/packages/hale2026harmonic.checks-only/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/packages/hale2026harmonic.checks-only/references.jsonl b/fixtures/packages/hale2026harmonic.checks-only/references.jsonl new file mode 100644 index 0000000..49442b6 --- /dev/null +++ b/fixtures/packages/hale2026harmonic.checks-only/references.jsonl @@ -0,0 +1,2 @@ +{"label":"1","node":"zmyqtxs","resolution":{"doi":"10.5555/example.ref1","type":"doi"}} +{"label":"2","node":"b3g86a4","resolution":{"type":"none"}} diff --git a/fixtures/packages/hale2026harmonic.checks-only/witnesses.json b/fixtures/packages/hale2026harmonic.checks-only/witnesses.json new file mode 100644 index 0000000..737fc22 --- /dev/null +++ b/fixtures/packages/hale2026harmonic.checks-only/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"qptsanv","kind":"pdf","media_type":"application/pdf","origin":{"doi":"10.5555/example.hale.2026","retrieved_at":"2026-10-01T08:00:00Z","source":"publisher"},"pages":2,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The library's subscription terms, as the team read them (fictional)."}]},"at":"2026-09-15T12:00:00Z","basis":"subscription","format":"scienting-rights/1","license":{"text":"Publisher's subscription terms (fictional)."},"uses":{"accessible-copy":"unknown","ai":{"external/local":false,"external/outside":false,"external/outside-no-retention":false,"external/tenancy":false,"internal/local":true,"internal/outside":false,"internal/outside-no-retention":"unknown","internal/tenancy":"unknown"},"quote-public":false,"read":true,"redistribute":false,"tdm":true},"valid_until":"2027-08-31T23:59:59Z"},"sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834","size":482113,"text_layer":true,"version_label":"version of record"}]} diff --git a/fixtures/packages/hale2026harmonic/MANIFEST.json b/fixtures/packages/hale2026harmonic/MANIFEST.json new file mode 100644 index 0000000..c846fcd --- /dev/null +++ b/fixtures/packages/hale2026harmonic/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"assets/586f92512b294a1c325bfc16207771fb9acc7bb67bb206f25a429a055134056f.png","present":false,"sha256":"586f92512b294a1c325bfc16207771fb9acc7bb67bb206f25a429a055134056f","size":18213},{"path":"assets/a18e1eb7f434c85ee180399dc55d2ee78c5ceb915c4a004c5dd0e490399d4c75.png","sha256":"a18e1eb7f434c85ee180399dc55d2ee78c5ceb915c4a004c5dd0e490399d4c75","size":73},{"path":"corrections.jsonl","sha256":"6d72d6629c7da952c17af944a90e266f5be1d0540f2c82c207fea57244aa3bee","size":8310},{"path":"datasets/ds-hale-bond-params/anchors.jsonl","sha256":"f45d4dd993aeaa741d7d6a12eb1817e5c975ccec2a1527da13457b4fec0bf1cc","size":5986},{"path":"datasets/ds-hale-bond-params/data.csv","sha256":"dbde72e4526e469e1535b87272eb50683160b2fe7c40b7f064e6592341f754a8","size":206},{"path":"datasets/ds-hale-bond-params/datapackage.json","sha256":"d8bbf8bd7c1b0207ada817d10580e835bda3a8691ad3e14fc1910519f4341974","size":574},{"path":"derived/mathml.jsonl","sha256":"a1aa1bad2eeea181f85670ad12aff89f95b703b6d28c092e2aad4c74e3d3b597","size":348},{"path":"document.json","sha256":"3e18fac5264a12b7981230b23b28fba400e28a6e9ba5f1f9c319027d64f4300e","size":979},{"path":"ids.jsonl","sha256":"665b127abf3d7ad20631aa2281d66cea0076cd68e77fc8a5921bc310d295a489","size":852},{"path":"locations.jsonl","sha256":"2c085435b753f9f586d29790d65cc9e61470f0ae661591480f528193dcd91a04","size":7396},{"path":"nodes.jsonl","sha256":"26f94d985bf65825c33cef53a3952b4177de203f6829073e76eea19ee3d0d37c","size":45649},{"path":"pages.jsonl","sha256":"948177c6b7e5e361ac1da0ecff6b52406d3513f14d58cd27cd84f17e6f1c054e","size":438},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"3f51d6fd5e892c2cf3ea6673feb4e2fc164dbcef727bde874e76bc42442eac75","size":13075},{"path":"references.jsonl","sha256":"09875f7f7205036b2cf4fb5a889dcecc686faf4b1dc2c4e129b7017abbc9ce3d","size":567},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"99ae654df4fb461a424bb51edd476a89041182c7df9c98653a81b78031f92ada","size":1006}],"format":"scienting-package/1","key":"hale2026harmonic"} diff --git a/fixtures/packages/hale2026harmonic/assets/a18e1eb7f434c85ee180399dc55d2ee78c5ceb915c4a004c5dd0e490399d4c75.png b/fixtures/packages/hale2026harmonic/assets/a18e1eb7f434c85ee180399dc55d2ee78c5ceb915c4a004c5dd0e490399d4c75.png new file mode 100644 index 0000000..9adf6a8 Binary files /dev/null and b/fixtures/packages/hale2026harmonic/assets/a18e1eb7f434c85ee180399dc55d2ee78c5ceb915c4a004c5dd0e490399d4c75.png differ diff --git a/fixtures/packages/hale2026harmonic/corrections.jsonl b/fixtures/packages/hale2026harmonic/corrections.jsonl new file mode 100644 index 0000000..72a48ba --- /dev/null +++ b/fixtures/packages/hale2026harmonic/corrections.jsonl @@ -0,0 +1,12 @@ +{"after":"21f13b21948078f64c564334e5bb180b4495edb25a79ae32aa967986a626f3d5","at":"2026-10-02T10:00:00Z","author":{"key":"ana"},"before":"2fd1e9e445ae29e3a35d032a41561cc164003fc3d146d93812da10e5f4022f86","evidence":[{"kind":"crop","sha256":"9b6fe65013a5231ebfda702637f2fa7c47155f2a2dc35d93fd9e0097ec4f7af9"}],"find":"3l0.0","format":"scienting-correction/1","id":"gpm2hdgregdd9","index":1,"op":"replace","path":["ya7x597","f0tj6ca","gm5z4rx","tk5p46c","zhe4g0k"],"reason":"OCR read the digit 1 as the letter l.","replace":"310.0","target":"nkm3xn5","touched":["nkm3xn5"]} +{"after":"b3809fdf4b801ef7cd419c8160b89578bbd1fb36a28a3dcc300368d478e136cd","at":"2026-10-02T10:01:00Z","author":{"key":"ana"},"before":"589232c1146961dda85cf949e4da08b470929263726765adfce49fc37c1f217b","evidence":[{"kind":"crop","sha256":"ab6ae30528212e54c2a74d8ed67631ff65f74055505dbe8af44d92a29bde0840"}],"find":"10-3","format":"scienting-correction/1","id":"vv0h65f4178dz","index":2,"op":"replace","path":["ya7x597","bzqvbhd","z77pzan"],"reason":"The reading lost the superscript.","replace":[{"kind":"text","text":"10"},{"kind":"text","style":["sup"],"text":"−3"}],"target":"e4fkseg","touched":["e4fkseg"]} +{"after":"5421e9cf0ef3a995792963d0371b79e11a8efad519b02efb5cb88311a896d0cc","at":"2026-10-02T10:02:00Z","author":{"key":"ana"},"before":"b3809fdf4b801ef7cd419c8160b89578bbd1fb36a28a3dcc300368d478e136cd","created":["r1gacps"],"evidence":[{"by":"ana","kind":"person","note":"Read against the page."}],"format":"scienting-correction/1","id":"vy4n7epeb3n0v","index":3,"offset":51,"op":"split","path":["ya7x597","bzqvbhd","z77pzan"],"reason":"A missed sentence boundary.","target":"e4fkseg","touched":["e4fkseg","r1gacps"]} +{"after":"42b1de7852cdc68730984fff789fe248ecd5b43198c0e7d671931ff3fe561dc3","at":"2026-10-02T10:03:00Z","author":{"key":"ana"},"before":"3079439be34114fc362723e64df1e2fb4a048c9e9892d6242a2c175eb28d778f","evidence":[{"by":"ana","kind":"person","note":"Read against the page."}],"format":"scienting-correction/1","id":"bkvfqsdcp983r","index":4,"joiner":" ","op":"merge","path":["ya7x597","f0tj6ca","zyqr0yc"],"reason":"A false boundary at a line break.","retired":["e9rh611"],"target":"eajq93t","touched":["e9rh611","eajq93t"],"with":"e9rh611"} +{"after":"4322aea43234e364104d120770e7a406dbeb35de65ada2016a7725130162947d","at":"2026-10-02T10:03:30Z","author":{"key":"ana"},"before":"df6e2a602ca59986c9c19dcdecf9b42da288dd3fed19a324159ce76626c80ff1","evidence":[{"by":"ana","kind":"person","note":"Read against the page."}],"format":"scienting-correction/1","id":"b02vzkxrp9j4d","index":5,"op":"merge","path":["ya7x597","f0tj6ca"],"reason":"A paragraph split at a column break.","retired":["g44k023"],"target":"zyqr0yc","touched":["ntr324r"],"with":"g44k023"} +{"after":null,"at":"2026-10-02T10:04:00Z","author":{"key":"ana"},"before":"17e9ffb66c9649be9ce1052ecbc2e80dd67c2ed6cd6d4a90e06386c35676f751","evidence":[{"kind":"crop","sha256":"45f7901282b3105c7ca4ea3d77f5c7279a9e379edc641c703ffb9b9dda2634f4"}],"format":"scienting-correction/1","id":"q3zyeq4y8h44d","index":6,"op":"delete","path":["ya7x597","f0tj6ca"],"reason":"A running head read as text.","retired":["nm7vyzk","cjqf3vc"],"target":"nm7vyzk","touched":["cjqf3vc"]} +{"after":"cc0bf73dd84e298da0d36c4b363c8d2bdc9b6d5738d1923d14c4a9028dca08d6","at":"2026-10-02T10:05:00Z","author":{"key":"ana"},"before":"47227b3e48e70a28623a93f19deda7414ebeff9d04fa00522874112249f2387b","evidence":[{"kind":"crop","sha256":"3a959cece8b823dd6125490270d75ba3a8126710e11fef7746c30d294ba06b16"}],"format":"scienting-correction/1","from":"(l)","id":"n5d4eg25xhhyh","index":7,"label":"(1)","op":"relabel","path":["ya7x597","bzqvbhd","pnkah9n","sxgcc9h"],"reason":"OCR read the equation number 1 as the letter l.","target":"qn08tj9","touched":["qn08tj9"]} +{"after":null,"at":"2026-10-02T10:06:00Z","author":{"key":"ana"},"before":"c67421f99edef77d8a52692e715b849fc5ec95f9c9028d1c40b23ad4add58b59","evidence":[{"kind":"crop","sha256":"d2f39a25c9232f8a04f7e1f1a4e47dcc21fb930659bef7d1374d2411746e644a"}],"format":"scienting-correction/1","id":"vmehp918aj29q","index":8,"op":"delete","path":["ya7x597","f0tj6ca","gm5z4rx","tk5p46c"],"reason":"Two cells were read as one; the row is replaced.","retired":["tfjge3c","sj8v63e","exey7vh","v4j8j13","q1jhtes"],"target":"tfjge3c","touched":["exey7vh","q1jhtes","sj8v63e","v4j8j13"]} +{"after":"6fbc456c39d7b50870e1a6e94433dea8be5357f0626b3f1cc63c2e3fffbad862","at":"2026-10-02T10:07:00Z","author":{"key":"ana"},"before":null,"created":["fbg2mwq","t6gjpee","kw2fb3v","e0n07n0","gy4avx6","ezb1n33"],"evidence":[{"kind":"crop","sha256":"8854658025affce8aeadcb320c9627f6207157d93d35bf3a4fdd74e3793b5704"}],"format":"scienting-correction/1","id":"zmmw6tpg3nw30","index":9,"node":{"attrs":{"header_path":["hwxm8de","t6gjpee"]},"children":[{"attrs":{"colspan":1,"column":"vphmyzz","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"CT–HC"}],"fidelity":"F1","kind":"cell"},{"attrs":{"colspan":1,"column":"kp6grmd","role":"data","rowspan":1},"content":[{"kind":"text","text":"340.0"}],"fidelity":"F1","kind":"cell"},{"attrs":{"colspan":1,"column":"z16p4vm","role":"data","rowspan":1},"content":[{"kind":"text","text":"1.090"}],"fidelity":"F1","kind":"cell"},{"attrs":{"colspan":1,"column":"egq2j2a","role":"data","rowspan":1},"content":[{"kind":"text","text":"338.7"}],"fidelity":"F1","kind":"cell"},{"attrs":{"colspan":1,"column":"my9ahda","role":"data","rowspan":1},"content":[{"kind":"text","text":"1.0900"}],"fidelity":"F1","kind":"cell"}],"kind":"row"},"op":"insert","parent":"tk5p46c","path":["ya7x597","f0tj6ca","gm5z4rx","tk5p46c"],"place_after":"zhe4g0k","reason":"The CT–HC row, read again from the page.","target":"fbg2mwq","touched":["e0n07n0","ezb1n33","gy4avx6","kw2fb3v","t6gjpee"]} +{"after":"4aa5c68add4a0932e26fa3cf58f6a2dca1756dcefb82fa5c8187ec4325335ef4","at":"2026-10-02T10:08:00Z","author":{"key":"ana"},"before":null,"created":["j0x5twd","j67ec9p","dm452cm","t3dsc22","mkakqg3","ba6xp29"],"evidence":[{"kind":"crop","sha256":"8854658025affce8aeadcb320c9627f6207157d93d35bf3a4fdd74e3793b5704"}],"format":"scienting-correction/1","id":"k5sg7cckaevp9","index":10,"node":{"attrs":{"header_path":["hwxm8de","j67ec9p"]},"children":[{"attrs":{"colspan":1,"column":"vphmyzz","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"OW–HW"}],"fidelity":"F1","kind":"cell"},{"attrs":{"colspan":1,"column":"kp6grmd","role":"data","rowspan":1},"content":[{"kind":"text","text":"553.0"}],"fidelity":"F1","kind":"cell"},{"attrs":{"colspan":1,"column":"z16p4vm","role":"data","rowspan":1},"content":[{"kind":"text","text":"0.9572"}],"fidelity":"F1","kind":"cell"},{"attrs":{"colspan":1,"column":"egq2j2a","role":"data","rowspan":1},"content":[{"kind":"text","text":"548.1"}],"fidelity":"F1","kind":"cell"},{"attrs":{"colspan":1,"column":"my9ahda","role":"data","rowspan":1},"content":[{"kind":"text","text":"0.9570"}],"fidelity":"F1","kind":"cell"}],"kind":"row"},"op":"insert","parent":"tk5p46c","path":["ya7x597","f0tj6ca","gm5z4rx","tk5p46c"],"place_after":"fbg2mwq","reason":"The reading dropped the OW–HW row.","target":"j0x5twd","touched":["ba6xp29","dm452cm","j67ec9p","mkakqg3","t3dsc22"]} +{"after":"cd05551c4660437704eceffa53d51e4aa90b58c24f2849109bf1c0441e2bb50e","at":"2026-10-02T10:09:00Z","attr":"colspan","author":{"key":"ana"},"before":"d748fd92ce44eb9506954e898fd97fc2ce99536560445048d4b259a9005c687c","evidence":[{"kind":"crop","sha256":"10d4ffc13db7028b69d10e4dac1467e1897abc6937ee0b6ab9d4dab62f86526c"}],"format":"scienting-correction/1","from":1,"id":"w3a8qf5v38cnp","index":11,"op":"set","path":["ya7x597","f0tj6ca","gm5z4rx","bapa0zm","btf2r9v"],"reason":"Set B spans two columns.","target":"vtszvw9","touched":["vtszvw9"],"value":2} +{"after":"f76864779843485fa9e2f3cc3cd1c76ad222e1649c56f4cface33bf20b8f33b6","at":"2026-10-02T10:10:00Z","author":{"key":"ana"},"before":"dad89409c8a3108d0c17c8d1625a448c7920f50876dc68fd382a1114f56934ee","evidence":[{"kind":"crop","sha256":"fdaffdfd887be0a92a899b167ad13cb8b3bd147fdc4947f4f0d22226f0bfe144"}],"format":"scienting-correction/1","from":"Figure l","id":"a6wygyzab7t83","index":12,"label":"Figure 1","op":"relabel","path":["ya7x597","f0tj6ca"],"reason":"OCR read the figure number 1 as the letter l.","target":"ajfvq4s","touched":[]} diff --git a/fixtures/packages/hale2026harmonic/datasets/ds-hale-bond-params/anchors.jsonl b/fixtures/packages/hale2026harmonic/datasets/ds-hale-bond-params/anchors.jsonl new file mode 100644 index 0000000..6b8dc7e --- /dev/null +++ b/fixtures/packages/hale2026harmonic/datasets/ds-hale-bond-params/anchors.jsonl @@ -0,0 +1,12 @@ +{"anchor":{"context":{"column_path":["Set A","$K_r$ (kcal mol⁻¹ Å⁻²)"],"row_path":["Bond parameters","CT–CT"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"nkm3xn5","node_hash":"21f13b21948078f64c564334e5bb180b4495edb25a79ae32aa967986a626f3d5","own_hash":"2937e2a6f14cfebd4ffd20e3d514e5cbbf0626a5c0089b7cbea817ef20782b3d","quote":{"exact":"310.0"},"rev":12,"store":"smithlab"},"field":"k_r","resource":"bond-parameters","row":"ct-ct-a"} +{"anchor":{"context":{"column_path":["Set A","$r_\\mathrm{eq}$ (Å)"],"row_path":["Bond parameters","CT–CT"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"kpk13yn","node_hash":"6e366c4aea409d36e918ad1bb71b1ec39c4203a5a0793bd66fc347c99b717760","own_hash":"b257a0c6c58f87dbb374e4e24a52815a6649a65d5a9fd7a1afd546bede459fb2","quote":{"exact":"1.526"},"rev":12,"store":"smithlab"},"field":"r_eq","resource":"bond-parameters","row":"ct-ct-a"} +{"anchor":{"context":{"column_path":["Set B","$K_r$ (kcal mol⁻¹ Å⁻²)"],"row_path":["Bond parameters","CT–CT"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"hw8fx4r","node_hash":"e554e4381827c90595a9083fd3a16e6cc72d0b14e52b3d86104c4b42a9f101b8","own_hash":"6356e0e8a0c4c9911e9657be9ee00e47fbe2ee6c54928d2b3d126266b19fa1e3","quote":{"exact":"305.2"},"rev":12,"store":"smithlab"},"field":"k_r","resource":"bond-parameters","row":"ct-ct-b"} +{"anchor":{"context":{"column_path":["Set B","$r_\\mathrm{eq}$ (Å)"],"row_path":["Bond parameters","CT–CT"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"rr9wvsy","node_hash":"4a37ffce2a07de7a6fcbf4a63b0679945c79ac8db9d2ec492e0fb1ff5072540d","own_hash":"f6cf4e1e1b7230ac3caaad08fff84e008eca06baf3eb2df936624ca83b861a2a","quote":{"exact":"1.5260"},"rev":12,"store":"smithlab"},"field":"r_eq","resource":"bond-parameters","row":"ct-ct-b"} +{"anchor":{"context":{"column_path":["Set A","$K_r$ (kcal mol⁻¹ Å⁻²)"],"row_path":["Bond parameters","CT–HC"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"kw2fb3v","node_hash":"dd26b057d6391ab1966fc1a6c49798e7a8e925f9c23a09812eb2758104cb6f36","own_hash":"d0b18eb9c753ca483d493c716e1b20d0f0e1ac50ad26bf61ec40228511ca7ef9","quote":{"exact":"340.0"},"rev":12,"store":"smithlab"},"field":"k_r","resource":"bond-parameters","row":"ct-hc-a"} +{"anchor":{"context":{"column_path":["Set A","$r_\\mathrm{eq}$ (Å)"],"row_path":["Bond parameters","CT–HC"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"e0n07n0","node_hash":"6ebc7eb98564471c9fabacf60e15bbc03ee019fa3a806731b8502db326a24f6c","own_hash":"658c69a718f90066aa362e39163e8e487f98df28fe622b1b313f5ef971f7fd18","quote":{"exact":"1.090"},"rev":12,"store":"smithlab"},"field":"r_eq","resource":"bond-parameters","row":"ct-hc-a"} +{"anchor":{"context":{"column_path":["Set B","$K_r$ (kcal mol⁻¹ Å⁻²)"],"row_path":["Bond parameters","CT–HC"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"gy4avx6","node_hash":"52404bd0f3b95103a0f46b59d3b6af851bcde8548fae6d349e82bc25d23a3b7e","own_hash":"7018736647e076ec53c24d0073194cb9ab3fd1c666051f9e783ce2ada56ad75a","quote":{"exact":"338.7"},"rev":12,"store":"smithlab"},"field":"k_r","resource":"bond-parameters","row":"ct-hc-b"} +{"anchor":{"context":{"column_path":["Set B","$r_\\mathrm{eq}$ (Å)"],"row_path":["Bond parameters","CT–HC"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"ezb1n33","node_hash":"bc58a669d6c2dd62e34a8067482e99274365b7a9b640feb4e40f049cd4aa65f2","own_hash":"5018ffea0aba6018a95a7a8974f6d740578d205aa905f5d7d4456af8969f4922","quote":{"exact":"1.0900"},"rev":12,"store":"smithlab"},"field":"r_eq","resource":"bond-parameters","row":"ct-hc-b"} +{"anchor":{"context":{"column_path":["Set A","$K_r$ (kcal mol⁻¹ Å⁻²)"],"row_path":["Bond parameters","OW–HW"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"dm452cm","node_hash":"3bf0f8ecfaeabf8546ecfac5ff88a5083d40b39fbc9b7d23c57070a15276631e","own_hash":"93b403eb62fef6bd8a0766f7ec7ef955dbd0777af6e2abf4fdeb627ff276a1a4","quote":{"exact":"553.0"},"rev":12,"store":"smithlab"},"field":"k_r","resource":"bond-parameters","row":"ow-hw-a"} +{"anchor":{"context":{"column_path":["Set A","$r_\\mathrm{eq}$ (Å)"],"row_path":["Bond parameters","OW–HW"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"t3dsc22","node_hash":"5b180503866108fc210b788554bfdf02570e82a9f87754cd6e2293106d592158","own_hash":"17b73693b12a53fd43c3e14cd71990602c69ea3e6734171578be2c88070648e5","quote":{"exact":"0.9572"},"rev":12,"store":"smithlab"},"field":"r_eq","resource":"bond-parameters","row":"ow-hw-a"} +{"anchor":{"context":{"column_path":["Set B","$K_r$ (kcal mol⁻¹ Å⁻²)"],"row_path":["Bond parameters","OW–HW"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"mkakqg3","node_hash":"3174ecb5b11912a58c22f7069747d93753fdf0c88684ee7264dc2c0cf2ab8fe5","own_hash":"ae639ba9bddb4bcfe35fe4fc5f41c8cc8fc1a8cc6b9d36df35bb22da8a5dd7c2","quote":{"exact":"548.1"},"rev":12,"store":"smithlab"},"field":"k_r","resource":"bond-parameters","row":"ow-hw-b"} +{"anchor":{"context":{"column_path":["Set B","$r_\\mathrm{eq}$ (Å)"],"row_path":["Bond parameters","OW–HW"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"ba6xp29","node_hash":"c0fe6b3090e024652f05c04c236932e6e0675efdc7bd4eab880fbc609b87abb8","own_hash":"a503d0417fdbf8aef8b35d473b674f77be2f6fe24d2e59fc49b2a382baa2f91e","quote":{"exact":"0.9570"},"rev":12,"store":"smithlab"},"field":"r_eq","resource":"bond-parameters","row":"ow-hw-b"} diff --git a/fixtures/packages/hale2026harmonic/datasets/ds-hale-bond-params/data.csv b/fixtures/packages/hale2026harmonic/datasets/ds-hale-bond-params/data.csv new file mode 100644 index 0000000..a7294ca --- /dev/null +++ b/fixtures/packages/hale2026harmonic/datasets/ds-hale-bond-params/data.csv @@ -0,0 +1,7 @@ +key,bond,set,k_r,r_eq +ct-ct-a,CT–CT,A,310.0,1.526 +ct-ct-b,CT–CT,B,305.2,1.5260 +ct-hc-a,CT–HC,A,340.0,1.090 +ct-hc-b,CT–HC,B,338.7,1.0900 +ow-hw-a,OW–HW,A,553.0,0.9572 +ow-hw-b,OW–HW,B,548.1,0.9570 diff --git a/fixtures/packages/hale2026harmonic/datasets/ds-hale-bond-params/datapackage.json b/fixtures/packages/hale2026harmonic/datasets/ds-hale-bond-params/datapackage.json new file mode 100644 index 0000000..207098f --- /dev/null +++ b/fixtures/packages/hale2026harmonic/datasets/ds-hale-bond-params/datapackage.json @@ -0,0 +1 @@ +{"format":"scienting-dataset/1","id":"ds-hale-bond-params","name":"hale-bond-params","resources":[{"encoding":"utf-8","format":"csv","name":"bond-parameters","origin":{"anchors":"anchors.jsonl","kind":"reported"},"path":"data.csv","schema":{"fields":[{"name":"key","type":"string"},{"name":"bond","type":"string"},{"name":"set","type":"string"},{"name":"k_r","type":"number","unit":"kcal / mol / angstrom ** 2"},{"name":"r_eq","type":"number","uncertainty":{"kind":"unknown"},"unit":"angstrom"}],"primaryKey":"key"}}],"title":"Harmonic bond parameters reported in Table 1"} diff --git a/fixtures/packages/hale2026harmonic/derived/mathml.jsonl b/fixtures/packages/hale2026harmonic/derived/mathml.jsonl new file mode 100644 index 0000000..9729fb5 --- /dev/null +++ b/fixtures/packages/hale2026harmonic/derived/mathml.jsonl @@ -0,0 +1 @@ +{"mathml":"Ebond=12Kr(r−req)2","node":"qn08tj9","run":null,"tool":{"name":"hand","version":"0"}} diff --git a/fixtures/packages/hale2026harmonic/document.json b/fixtures/packages/hale2026harmonic/document.json new file mode 100644 index 0000000..64d0ce5 --- /dev/null +++ b/fixtures/packages/hale2026harmonic/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":45,"nodes":75},"fidelity":{"counts":{"F0":1,"F1":4,"F2":12,"F3":28},"lowest":"F0"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"hale2026harmonic","kind":"article","language":"en","license":{"text":"All rights reserved by the publisher (fictional)."},"meta":{"DOI":"10.5555/example.hale.2026","author":[{"family":"Hale","given":"R."},{"family":"Osei","given":"M."}],"container-title":"Journal of Example Chemistry","issued":{"date-parts":[[2026,3,2]]},"page":"101-109","title":"Harmonic bond parameters for small organic molecules from a two-step fit","type":"article-journal","volume":"14"},"meta_hash":"776546e619e3fc9f1832153fb0585272c0a7015a0708994245cb09b1cfd1fb87","policy":"full","relations":[],"rev":12,"root":"9c00efa3d1f8fe5c93ae26868926f6af6c193a5cf8cecd32ba650842aff71e01","store":"smithlab","version":{"date":"2026-03-02","type":"version-of-record"},"work":{"key":"hale2026harmonic","same_as":["doi:10.5555/example.hale.2026"]}} diff --git a/fixtures/packages/hale2026harmonic/ids.jsonl b/fixtures/packages/hale2026harmonic/ids.jsonl new file mode 100644 index 0000000..e6386a8 --- /dev/null +++ b/fixtures/packages/hale2026harmonic/ids.jsonl @@ -0,0 +1,11 @@ +{"id":"b-p01-text-003","kind":"alias","successor":"f929eq9"} +{"id":"b-p02-table-001","kind":"alias","successor":"gm5z4rx"} +{"id":"e9rh611","kind":"retired","node_kind":"sentence","rev":4,"successor":"eajq93t"} +{"id":"g44k023","kind":"retired","node_kind":"paragraph","rev":5,"successor":"zyqr0yc"} +{"id":"cjqf3vc","kind":"retired","node_kind":"sentence","rev":6,"successor":null} +{"id":"nm7vyzk","kind":"retired","node_kind":"paragraph","rev":6,"successor":null} +{"id":"exey7vh","kind":"retired","node_kind":"cell","rev":8,"successor":null} +{"id":"q1jhtes","kind":"retired","node_kind":"cell","rev":8,"successor":null} +{"id":"sj8v63e","kind":"retired","node_kind":"cell","rev":8,"successor":null} +{"id":"tfjge3c","kind":"retired","node_kind":"row","rev":8,"successor":null} +{"id":"v4j8j13","kind":"retired","node_kind":"cell","rev":8,"successor":null} diff --git a/fixtures/packages/hale2026harmonic/locations.jsonl b/fixtures/packages/hale2026harmonic/locations.jsonl new file mode 100644 index 0000000..febcf81 --- /dev/null +++ b/fixtures/packages/hale2026harmonic/locations.jsonl @@ -0,0 +1,46 @@ +{"boxes":[[72,72,493.2,83.8]],"node":"kq18996","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,85.95,183.15,97.75]],"node":"xvjhbee","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,99.9,540,111.7],[72,113.85,270.9,125.65]],"node":"ehd3zbe","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,127.8,405.45,139.6]],"node":"j06tfhn","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,141.75,142.2,153.55]],"node":"dmgqhd0","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,155.7,540,167.5],[72,169.65,218.25,181.45]],"node":"mbtjsqv","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,183.6,540,195.4],[72,197.55,540,209.35],[72,211.5,183.15,223.3]],"node":"sxgcc9h","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,225.45,540,237.25],[72,239.4,83.7,251.2]],"node":"f929eq9","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,253.35,364.5,265.15]],"node":"e4fkseg","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,267.3,417.15,279.1]],"node":"r1gacps","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,72,112.95,83.8]],"node":"rcz9hta","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,85.95,540,97.75],[72,99.9,229.95,111.7]],"node":"eajq93t","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,113.85,376.2,125.65]],"node":"ntr324r","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,127.8,306,139.6]],"node":"gqs1dcb","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,141.75,300,291.75]],"node":"b2wgyq2","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,301.75,300,451.75]],"node":"wtgh2xp","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,461.75,329.4,473.55]],"node":"yq0agq9","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,475.7,148.05,487.5]],"node":"nmm4md0","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,489.65,235.8,501.45]],"node":"ed602fy","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,503.6,259.2,515.4]],"node":"beayvd3","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,517.55,95.4,529.35]],"node":"e4z9fr6","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,531.5,101.25,543.3]],"node":"cwhj4gp","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,545.45,101.25,557.25]],"node":"vtszvw9","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,559.4,200.7,571.2]],"node":"sam8g7e","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,573.35,183.15,585.15]],"node":"cq77erb","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,587.3,200.7,599.1]],"node":"h5psthj","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,601.25,183.15,613.05]],"node":"j3d4w5v","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,615.2,159.75,627]],"node":"hwxm8de","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,629.15,101.25,640.95]],"node":"k3fqnvy","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,643.1,101.25,654.9]],"node":"nkm3xn5","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,657.05,101.25,668.85]],"node":"kpk13yn","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,671,101.25,682.8]],"node":"hw8fx4r","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,684.95,107.1,696.75]],"node":"rr9wvsy","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,281.25,101.25,293.05]],"node":"t6gjpee","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,295.2,101.25,307]],"node":"kw2fb3v","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,309.15,101.25,320.95]],"node":"e0n07n0","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,323.1,101.25,334.9]],"node":"gy4avx6","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,337.05,107.1,348.85]],"node":"ezb1n33","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,351,101.25,362.8]],"node":"j67ec9p","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,364.95,101.25,376.75]],"node":"dm452cm","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,378.9,107.1,390.7]],"node":"t3dsc22","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,392.85,101.25,404.65]],"node":"mkakqg3","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,406.8,107.1,418.6]],"node":"ba6xp29","page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101"} +{"boxes":[[72,698.9,323.55,710.7]],"node":"bn2ef3e","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,712.85,446.4,724.65]],"node":"zmyqtxs","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} +{"boxes":[[72,726.8,370.35,738.6]],"node":"b3g86a4","page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102"} diff --git a/fixtures/packages/hale2026harmonic/nodes.jsonl b/fixtures/packages/hale2026harmonic/nodes.jsonl new file mode 100644 index 0000000..82bd359 --- /dev/null +++ b/fixtures/packages/hale2026harmonic/nodes.jsonl @@ -0,0 +1,75 @@ +{"align_key":"a1a2c0fc7fbf63e304cb4b9ff28a68dc816144d21c7fd10a51a9b9b3636888af","id":"ya7x597","kind":"document","match_hash":"56c0a1f657bd12238d41973f5fc50ac21f3ba3c7edf5642d9d2a1c66b872cc46","node_hash":"9c00efa3d1f8fe5c93ae26868926f6af6c193a5cf8cecd32ba650842aff71e01","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"c8416875ece1042344c0aa938ccc599f21c02ef942ce96e0b6622c2869c87318"} +{"align_key":"3b69d9d8cb745638907669e2a113cfde1bc4f9a605576b8c8409426ca6b952db","id":"x1wez17","kind":"front","match_hash":"2b9b4ac80fbe9a8ed1d285464711e879ae8048969c2d5e83b5641363a8bd5f70","node_hash":"5a6d7f65c349ca0465e94ffc2598aae214a9377c524808cc64a8ff45a93bce38","ord":0,"own_hash":"0167516d70e0a89263e33c0f9be5ca4443113347814530257a60d43910af71b6","parent":"ya7x597","text_hash":"2b9b4ac80fbe9a8ed1d285464711e879ae8048969c2d5e83b5641363a8bd5f70"} +{"align_key":"22b7a9bb89f3d25de566d3c74592948c149f684f844aa9c484de3cdd89c3405b","id":"krf8jz8","kind":"title","match_hash":"c228084e30d9f8bce0a7740aa2c2fe38bdf734bda39d313029caf3704715d4a4","node_hash":"d47dc0c86131e5b6f22d9c205fd9e55ec6a8a6e0e3c2414e805710f8a825423f","ord":0,"own_hash":"c22e4fc822618a3a2c774cc9ea6fc5fc5b34463724257cfa4fd33022d4e35165","parent":"x1wez17","text_hash":"c228084e30d9f8bce0a7740aa2c2fe38bdf734bda39d313029caf3704715d4a4"} +{"align_key":"22b7a9bb89f3d25de566d3c74592948c149f684f844aa9c484de3cdd89c3405b","content":[{"kind":"text","text":"Harmonic bond parameters for small organic molecules from a two-step fit"}],"fidelity":"F2","id":"kq18996","kind":"sentence","match_hash":"c228084e30d9f8bce0a7740aa2c2fe38bdf734bda39d313029caf3704715d4a4","node_hash":"8bc4a59cae468a198e00d295e2da4930d3a77930f08bab88f035025b3b87126f","ord":0,"own_hash":"89a7fdaeb633e67eeef5a0d889d871aff66e5b6efeffe3e7107389909fc51609","parent":"krf8jz8","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"c228084e30d9f8bce0a7740aa2c2fe38bdf734bda39d313029caf3704715d4a4"} +{"align_key":"093255025a6c5844fdce4ca9ed6162c631e72259289630b3eb8b1c8fbad69569","content":[{"kind":"text","text":"R. Hale and M. Osei"}],"fidelity":"F2","id":"xvjhbee","kind":"authors","match_hash":"73a4ad97bf47125667c5964055ccedb59eafddd3331f788efba9a42189e49726","node_hash":"b714c3d7d712d498c87047e31abdb14e90fd688aebf8fcea7dbc7b85c13b98d8","ord":1,"own_hash":"7a97d47992bcd4be203d59c30c8938650be47d92ce7f7a520a50f31d240de68b","parent":"x1wez17","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"73a4ad97bf47125667c5964055ccedb59eafddd3331f788efba9a42189e49726"} +{"align_key":"1e43556d60d50c9bd684876d4543b5bf37d9e14d9d75e3324ea7626231fdcfba","id":"r94wmsf","kind":"abstract","match_hash":"4e9cd0c0fb23c926789330bd145bad542b3f245a05d3c3ffc6f79d832431b87a","node_hash":"4629f87ecb7aa5fc38a01589be0c05435b25f60d2aa502085873be021647ee3e","ord":2,"own_hash":"2266bdba2a12287fd87e9811c78be31b7286b9a429070282faf00438e3d52545","parent":"x1wez17","text_hash":"4e9cd0c0fb23c926789330bd145bad542b3f245a05d3c3ffc6f79d832431b87a"} +{"align_key":"1e43556d60d50c9bd684876d4543b5bf37d9e14d9d75e3324ea7626231fdcfba","id":"qe2yth0","kind":"paragraph","match_hash":"4e9cd0c0fb23c926789330bd145bad542b3f245a05d3c3ffc6f79d832431b87a","node_hash":"1949b6dca4e1264c5adbe39e3c2aa94498c043063df685f50c3e28b9065db4e1","ord":0,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"r94wmsf","text_hash":"4e9cd0c0fb23c926789330bd145bad542b3f245a05d3c3ffc6f79d832431b87a"} +{"align_key":"b0218c893c9d153c290f7c30132b051e23a2f757d84b283d1158635f03970d70","content":[{"kind":"text","text":"We fit harmonic bond constants for twelve bonds in two steps, first to a scan and then to vibrational frequencies."}],"fidelity":"F2","id":"ehd3zbe","kind":"sentence","match_hash":"f86aa9a5344f3eaaebaf152a7a90edef5491ba6008458a4963b357b6d3c471c0","node_hash":"ee42c4780724a411697e3a95daf182d37c792d4689a7172f32929785d5fd968e","ord":0,"own_hash":"24cc437784bf358d639755dbf59984ad2c0c7a0e7f9448b23e965039b67f759b","parent":"qe2yth0","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"f86aa9a5344f3eaaebaf152a7a90edef5491ba6008458a4963b357b6d3c471c0"} +{"align_key":"b37de6d7b4ca317978bfdf973df80bbd6ee2a3efb358f9e049723a43811f5c47","content":[{"kind":"text","text":"The two parameter sets agree to within 2% for every bond."}],"fidelity":"F2","id":"j06tfhn","kind":"sentence","match_hash":"175bfc8867816a9761fd5bb9ffc956df6d9e7f203870961a5485fc1912cb663a","node_hash":"1a7ba9b1dee4195fdb79921410c2c0be3385efb27328fa1dc5f3722ab47d3102","ord":1,"own_hash":"61ba240c203a63ac5fed7554c5ba7ce20b3de55e77253c09c9ca7821870adde1","parent":"qe2yth0","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"175bfc8867816a9761fd5bb9ffc956df6d9e7f203870961a5485fc1912cb663a"} +{"align_key":"b9d841a562fe7058947b56df1ac0bf3d6019b57eb38b5a5d61db43691ff7e434","attrs":{"level":1},"id":"bzqvbhd","kind":"section","label":"1","match_hash":"ce240e49efdc58512d5b8486b16421397235dc552f1b7c5035b830af84d0324e","node_hash":"d68bc7fea8e79927d265ecb6ac2b4a86cb4b1ca718bc7dcc4ad824989bbc15f2","ord":1,"own_hash":"78563e96f51db1954d3fabe08f3748956b564c87ba4c8f7954bf747545a37fcd","parent":"ya7x597","text_hash":"689bc21df84f44bd459302924e8319f6de7878e708eec28df071af73ebb3c7f2"} +{"align_key":"d3db5338aae140c5cc04ac37690aa4f98041e14a042bc6473d54ecda8d95f93e","id":"sb0g5gh","kind":"heading","match_hash":"b605350bc00209520b7cd8f546322663356ba630708f71bbf30aead6b3dd608e","node_hash":"c7288f33d2cb2ac9b9c146dabd403d2e64e793418bd31ac14802349543ac84c8","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"bzqvbhd","text_hash":"b605350bc00209520b7cd8f546322663356ba630708f71bbf30aead6b3dd608e"} +{"align_key":"d3db5338aae140c5cc04ac37690aa4f98041e14a042bc6473d54ecda8d95f93e","content":[{"kind":"text","text":"Introduction"}],"fidelity":"F2","id":"dmgqhd0","kind":"sentence","match_hash":"b605350bc00209520b7cd8f546322663356ba630708f71bbf30aead6b3dd608e","node_hash":"8a2293448ea48f2d3e279e609965f34443fae62b24b6fa13524f14a324749285","ord":0,"own_hash":"7c40e5ddd02d461a4ee50cde05532932e1d737ab3bc74b722cecf16cc6ffe59b","parent":"sb0g5gh","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"b605350bc00209520b7cd8f546322663356ba630708f71bbf30aead6b3dd608e"} +{"align_key":"a547a0eeba5b2c4ae4bbd0ef9558c8a3e5f17d3915b289e7eae71385876d201e","id":"pnkah9n","kind":"paragraph","match_hash":"279a5b65251c77707a1de08eda95a800cc2c52372521c31c99d36518ac31f13f","node_hash":"8184d9488c57577474ada18b729f1ed2aeef72adbb1ee9206c5b342b85f4716a","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"bzqvbhd","text_hash":"5a3c9e209e1a34b27aa0572f5337bd558a9cef1a0772f8e3f767bef241629bff"} +{"align_key":"e656937a809a1fe1c2513b9b4401940af910f9b0c39b6f7765c8066a5e2e5927","content":[{"kind":"text","text":"Harmonic bond terms remain the most common description of covalent stretching in classical force fields."},{"kind":"cite","refs":["zmyqtxs"],"text":"1"}],"fidelity":"F2","id":"mbtjsqv","kind":"sentence","match_hash":"83edd3a8c2b7d55b524ec0668beb74cceb3dcfb24dae5ff24e99d4c7b498e29a","node_hash":"97c328c2e2efedd931292eeda806d3e4bad14d67cfcc324537c0d993068cfbfc","ord":0,"own_hash":"c1c6019d21c26d790304f7f7a080e93cf507d0e22ebeec6bf2e7df19a1820b3b","parent":"pnkah9n","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"cb8c62294f3d2fc46c3179120e278ea14537d3a03a71ce91f9e14292390aed6a"} +{"align_key":"d44bbaee84b5281067606dab69dc1e7544102aaa209fde6883063b1b6e3b60cf","content":[{"kind":"text","text":"The bond energy is given by "},{"kind":"equation","node":"qn08tj9"},{"kind":"text","text":" where "},{"kind":"math","notation":"tex","source":"K_r"},{"kind":"text","text":" is the bond force constant and "},{"kind":"math","notation":"tex","source":"r_\\mathrm{eq}"},{"kind":"text","text":" the equilibrium bond length."}],"fidelity":"F2","id":"sxgcc9h","kind":"sentence","match_hash":"924426976d176b8b8bb6a166c9f18d9c52225b47c1f5e17b68f0a36326f721d0","node_hash":"76e06b4811a688357ac4b912172283463cfaf1b7a1f0795d274fc733a2309ba7","ord":1,"own_hash":"2d7df7b8b233eab6f96d5db0d29c99062aaa94b55cf4e388c49b9995ce7548d5","parent":"pnkah9n","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"9fe940c55192dc3d20334cd83e3213b9756b505d801289ed19f861daafb735bc"} +{"align_key":"cd2822e88bcde089a4b8d4d60820a4c0c387d75c7fb1737b5e5ac93129194ff7","content":{"notation":"tex","source":"E_{\\mathrm{bond}} = \\frac{1}{2} K_r (r - r_{\\mathrm{eq}})^2"},"fidelity":"F1","id":"qn08tj9","kind":"equation","label":"(1)","match_hash":"cd2822e88bcde089a4b8d4d60820a4c0c387d75c7fb1737b5e5ac93129194ff7","node_hash":"cc0bf73dd84e298da0d36c4b363c8d2bdc9b6d5738d1923d14c4a9028dca08d6","ord":0,"own_hash":"9caa95636262b1bd49b71e583522c8bb168d68a2beb117df34a89935eb43c6bb","parent":"sxgcc9h","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"b782ddc65012467b76570650ba5fdd85abac59ffa4705757439a3e5fd18c49ed"} +{"align_key":"b312865b43ddb85f757e7f1ccd66c9ffecd792742101b1659ee0b51d6f0a1d40","content":[{"kind":"text","text":"Water, H"},{"kind":"math","notation":"tex","source":"_2"},{"kind":"text","text":"O, served as the first test case, with a bending band near 1595 cm⁻¹."},{"kind":"cite","refs":["b3g86a4"],"text":"2"}],"fidelity":"F2","id":"f929eq9","kind":"sentence","match_hash":"1306aa85965bf549361dbb25337341ad6caa1645f52fbf8bf72378988318ab59","node_hash":"cd6cdb032e9b8ab712790b7181f794f6e363b7c4c96888049b59c671c1596369","ord":2,"own_hash":"d5b2ebdc96010fd8fc83abcbec9e5c2340bf766997a485f11f2dae49d0d2dd4c","parent":"pnkah9n","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"f407d24d2dfdfaaa10921f7fab05508b8ec36d14748f2fdbeaeabd90c0202f51"} +{"align_key":"d7e0e9f5c47025811b4ad3bd32df910c00314abc4d407dc031811a26d2849aa2","id":"z77pzan","kind":"paragraph","match_hash":"e1c67a700f72e14aa8d12dc5fa3f0b2447a87bff4c9261e701fd002d89c60f68","node_hash":"2e97cc0c7b4bce13a6e68199fd9f29544a4e398bcbd9d2182c40ed8d8c9e3291","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"bzqvbhd","text_hash":"7ea9d76e365b5fbc845041686519fa0a54031c958f3aaac7274c1d5e7effcc54"} +{"align_key":"018c6e4543067aef0e610858cac99332a110ec88535fb24d71dfced8490c34b4","content":[{"kind":"text","text":"Values below 10"},{"kind":"text","style":["sup"],"text":"−3"},{"kind":"text","text":" kcal mol⁻¹ were treated as zero."}],"fidelity":"F1","id":"e4fkseg","kind":"sentence","match_hash":"d86563d1a3f9a25de9cdb41704791a816d9ef61e6e577ebbfe6febe914b39ab5","node_hash":"5421e9cf0ef3a995792963d0371b79e11a8efad519b02efb5cb88311a896d0cc","ord":0,"own_hash":"0c9c218a3435c1473329aa5d1c0cf3368622c3073750dfeedfff47c39080e707","parent":"z77pzan","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"d4ef9e30dbe782fbf1d61211a24db5d764e8f4cefe2b26d479fb415db8da6ca0"} +{"align_key":"42fcd1224932ee2bde2fdf29bd9d3ece91b6468f3d307212f3fe94d0633cab12","content":[{"kind":"xref","target":"gm5z4rx","text":"Table 1"},{"kind":"text","text":" lists the fitted constants for both parameter sets."}],"fidelity":"F0","id":"r1gacps","kind":"sentence","match_hash":"7029a6b96b3a725fc6d189edfc27012dd22234bdbf68092b46698059dfb195a7","node_hash":"9eb77a1bebf1b2752a14c38cc8de8fe1113a6ccfd8ba77fa26d8818289867027","ord":1,"own_hash":"e9e2b0ab29581e629bdb5d18f4545eed09a7b80cd0b5fd4561a5f28654fbd8cf","parent":"z77pzan","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"ad4ae795e8bc91148355dc473acc0a380a985518c2dc288c58c4b9175db15081"} +{"align_key":"78649affde22d92c0d5e35351c186f4014f3f554c25ea959eac6f6d22a923e47","attrs":{"level":1},"id":"f0tj6ca","kind":"section","label":"2","match_hash":"e6d9e2277419beb27e5ffbeccbb8d663849adfa6eded8516352c8d56da85f982","node_hash":"8acfa263e93dcee504efbfcd328fb69b81f4d71e97b921fa8da664a541e722ff","ord":2,"own_hash":"c3d50f266b05d7889c001aef16662cecd4e99ac4a2747ec331c1044e6adc8e3e","parent":"ya7x597","text_hash":"bf70316e3c0d12064d3fe27a5fb69588e708134d86427d549b30cdc94eb13a6b"} +{"align_key":"3f3867313a9dbfd5be4028e351d67cc7ef77f4b2e3d685104cda3352a602e9cc","id":"y52zyge","kind":"heading","match_hash":"8696622f344183c4f73993a175acb8daa6418a5cc29099e5d2d762cba2d6f7f2","node_hash":"dd4e05433f92cd2fea175daa2e3e87691420d52bfd829842a97de98c23689f1c","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"f0tj6ca","text_hash":"8696622f344183c4f73993a175acb8daa6418a5cc29099e5d2d762cba2d6f7f2"} +{"align_key":"3f3867313a9dbfd5be4028e351d67cc7ef77f4b2e3d685104cda3352a602e9cc","content":[{"kind":"text","text":"Methods"}],"fidelity":"F2","id":"rcz9hta","kind":"sentence","match_hash":"8696622f344183c4f73993a175acb8daa6418a5cc29099e5d2d762cba2d6f7f2","node_hash":"0a24403245cf056ad054ceb58cee5b689103dae8abc3c37e4ea006f2e78303e9","ord":0,"own_hash":"394b43e9c17977cb482d6d41abb30a322d9e2d04e56492914771b846bd0f81ad","parent":"y52zyge","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"8696622f344183c4f73993a175acb8daa6418a5cc29099e5d2d762cba2d6f7f2"} +{"align_key":"88f0218bc7fa6332ab82c98812d9c36f4005de070c64455b1e0be40da1d6b1f1","id":"zyqr0yc","kind":"paragraph","match_hash":"fa4cba349b2cbccd10ff1da08261abde3d6ef3d9d6c8f1983c9a75cf5339c479","node_hash":"4322aea43234e364104d120770e7a406dbeb35de65ada2016a7725130162947d","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"f0tj6ca","text_hash":"a7d7bd2245df5fb568a3c61a65c308520564f27697d74a82545cac340332d702"} +{"align_key":"82e9d8b14a52cf1a5aaa37efa57fa18da552ee7d6628d056089201f404835348","content":[{"kind":"text","text":"Each bond was scanned in steps of 0.01 Å around its minimum, and the energies were fitted by least squares."}],"fidelity":"F0","id":"eajq93t","kind":"sentence","match_hash":"e422dd44e0ecba7048f79c087ff32841bef62a2583a343eae202c4b0025c3a98","node_hash":"42b1de7852cdc68730984fff789fe248ecd5b43198c0e7d671931ff3fe561dc3","ord":0,"own_hash":"4dc28d1ad57c74d044f87264dfbc744ae9d5e9644638db976dbc346361442486","parent":"zyqr0yc","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"e422dd44e0ecba7048f79c087ff32841bef62a2583a343eae202c4b0025c3a98"} +{"align_key":"bc80569a282804e707d50db1fd49cd402ec954aad4d53b4885b5f212df27f605","content":[{"kind":"xref","target":"ajfvq4s","text":"Figure 1"},{"kind":"text","text":" shows the scan for the C–C bond of ethane."},{"footnote":"vsrzypn","kind":"fnmark","text":"a"}],"fidelity":"F2","id":"ntr324r","kind":"sentence","match_hash":"a86a8326bd265e4ddc24c02c243e8a73ae33899886643be7eb61cd4e0f21ae7a","node_hash":"cda412d48dbcf59eaaa41c8698571f5d1809a7332195d3879da139cedcd007d9","ord":1,"own_hash":"775192f25c56b0868acbc74f7b48ab48bca1bc3301fe8de72b67666f538904d5","parent":"zyqr0yc","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"f1f2b069fc19f2fd4f373923fe47a2b13a94cb672618429d20b6659b57d2f6fe"} +{"align_key":"869b204bb9bcf5b7b87aafa05c93b1784dc9862404dfb6285d0ada0b0e50fd95","id":"vsrzypn","kind":"footnote","label":"a","match_hash":"f74f63bee6fdeabbb2d9283764bd16bf0980feedb13b76cb44cb9c66407a6f39","node_hash":"80e515958c6e33356c33f2e76bdf3a56e962325602a34138c0867bf2affde93b","ord":2,"own_hash":"3de37a8f24218b49fd407fff67524b8c59dd85b72fab58c06f589241cf25ec6c","parent":"f0tj6ca","text_hash":"f74f63bee6fdeabbb2d9283764bd16bf0980feedb13b76cb44cb9c66407a6f39"} +{"align_key":"869b204bb9bcf5b7b87aafa05c93b1784dc9862404dfb6285d0ada0b0e50fd95","content":[{"kind":"text","text":"Scans held every other coordinate fixed."}],"fidelity":"F2","id":"gqs1dcb","kind":"sentence","match_hash":"f74f63bee6fdeabbb2d9283764bd16bf0980feedb13b76cb44cb9c66407a6f39","node_hash":"5e7362eb5c7cd2db425e557982083a51c2607521b6b1f73d79d98956616965df","ord":0,"own_hash":"1e72748c13a1160ac5fa4983bb9233913f131f1ee5846901349f5fdb2b21a6d2","parent":"vsrzypn","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"f74f63bee6fdeabbb2d9283764bd16bf0980feedb13b76cb44cb9c66407a6f39"} +{"align_key":"87abd8a26b2108d49d5d33426391fb650cfb5c21e509b22129f617f5d499d9a2","id":"ajfvq4s","kind":"figure","label":"Figure 1","match_hash":"2b324f264d637015a59c112ae3d44ea333dfb4f25d2dc12063ce3feb6116f5b1","node_hash":"f76864779843485fa9e2f3cc3cd1c76ad222e1649c56f4cface33bf20b8f33b6","ord":3,"own_hash":"a1e46cb40201a17903dfd6f128db1e707b0e9f5bf45fcc32ec7ca772011edeae","parent":"f0tj6ca","text_hash":"2b324f264d637015a59c112ae3d44ea333dfb4f25d2dc12063ce3feb6116f5b1"} +{"align_key":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","attrs":{"crop":{"dpi":300,"media_type":"image/png","sha256":"586f92512b294a1c325bfc16207771fb9acc7bb67bb206f25a429a055134056f"},"figure_text":[{"boxes":[[90,300,140,310]],"id":"nhk15ag","page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","role":"axis-label","text":"r (Å)"},{"boxes":[[90,300,140,310]],"id":"nr4sby5","page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","role":"axis-label","text":"E (kcal mol⁻¹)"},{"boxes":[[90,300,140,310]],"id":"rmwy0xd","page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","role":"tick-label","text":"1.4"},{"boxes":[[90,300,140,310]],"id":"w3mwj7s","page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","role":"tick-label","text":"1.5"},{"boxes":[[90,300,140,310]],"id":"m7dk0z5","page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","role":"tick-label","text":"1.6"}],"image":{"media_type":"image/png","native":true,"sha256":"a18e1eb7f434c85ee180399dc55d2ee78c5ceb915c4a004c5dd0e490399d4c75"}},"id":"b2wgyq2","kind":"panel","label":"a","match_hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","node_hash":"72ab6d60a594c2fdcb20bcc7142bd8e83d36046ef817c61d4240a93e5523e4aa","ord":0,"own_hash":"95cd7f9ab50d8386dc3086cf45a377c1d25c6c6111e3c422b69af10b6b1828c6","parent":"ajfvq4s","text_hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} +{"align_key":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","id":"wtgh2xp","kind":"panel","label":"b","match_hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","node_hash":"705d49f1d2721611705c4570b84df91932b1194d074d3a8d149ca6d3f7617bea","ord":1,"own_hash":"f31fac4186f3e54692f39e382dade6a9ca152c20fa46e06a2c5684a87148fbec","parent":"ajfvq4s","text_hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} +{"align_key":"87abd8a26b2108d49d5d33426391fb650cfb5c21e509b22129f617f5d499d9a2","id":"xmwf2ex","kind":"caption","match_hash":"2b324f264d637015a59c112ae3d44ea333dfb4f25d2dc12063ce3feb6116f5b1","node_hash":"538146b0ad719df07dd338f86b42ef794e1d2a25ceef653b3a89abb74409134a","ord":2,"own_hash":"c3b298305f0176c12850acf7df92ec8a435ce882f353e92319e21d16967cf486","parent":"ajfvq4s","text_hash":"2b324f264d637015a59c112ae3d44ea333dfb4f25d2dc12063ce3feb6116f5b1"} +{"align_key":"a288d44157ba2a662c357c7e3a6b734c1b6dbf571b409e53b573fd7fb4b1ccb9","content":[{"kind":"text","text":"Bond energy along the C–C stretch of ethane."}],"fidelity":"F2","id":"yq0agq9","kind":"sentence","match_hash":"93c0a80c1be2996d851f1749d8a924b6241dd922d34fa8b03468aa7d4ee13834","node_hash":"9a1c438b0f413d63b7e9f1ed7037cc6ad1665efd335baee2ef31d3d232c79552","ord":0,"own_hash":"4330a6ada17fa37ade21c7fff773ecb872e0ce49c8e4d0fa0f12f7b6789c157f","parent":"xmwf2ex","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"93c0a80c1be2996d851f1749d8a924b6241dd922d34fa8b03468aa7d4ee13834"} +{"align_key":"cad40d8d5a604dcb41efc46de93cabad8c2e2f0d0c2a34d7a5ecaab59c989335","content":[{"kind":"text","text":"(a) The scan."}],"fidelity":"F2","id":"nmm4md0","kind":"sentence","match_hash":"33619acba0c7348fb4902cce2d309177d43904fc582f73bf6940a64034fcd731","node_hash":"9f9c9a412cd08d0634daa3f23c63f5125c1270c13834c45c045c1a9a7452af86","ord":1,"own_hash":"75a68ec1ba13ad2d3fb7ef61634103b8740eb98494ca8fb607a3429f464ed278","parent":"xmwf2ex","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"33619acba0c7348fb4902cce2d309177d43904fc582f73bf6940a64034fcd731"} +{"align_key":"74422d63b6e783ebba263333768c8cdc26e7d7d3341b7327454adc251c7c474a","content":[{"kind":"text","text":"(b) The residual of the fit."}],"fidelity":"F2","id":"ed602fy","kind":"sentence","match_hash":"2dcae102f2ea78cb194e724e3ac5210727cf74e469eb36bf245191a023361cd8","node_hash":"e2f0b1d093c2f38f329c16edae255aed6e913d489e730a9d4857a3c3b5040f63","ord":2,"own_hash":"468991e7fcfde3f2da28039d7f056b3a56fbbe6140cb734126baba23a4742afc","parent":"xmwf2ex","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"2dcae102f2ea78cb194e724e3ac5210727cf74e469eb36bf245191a023361cd8"} +{"align_key":"c5090ef974bbf44a9a95741ce5c181d7bc9c646d90d2ea54a97c3e084d9c4d04","attrs":{"columns":[{"header_path":["e4z9fr6"],"id":"vphmyzz"},{"header_path":["cwhj4gp","sam8g7e"],"id":"kp6grmd"},{"header_path":["cwhj4gp","cq77erb"],"id":"z16p4vm"},{"header_path":["vtszvw9","h5psthj"],"id":"egq2j2a"},{"header_path":["vtszvw9","j3d4w5v"],"id":"my9ahda"}]},"id":"gm5z4rx","kind":"table","label":"Table 1","match_hash":"47e5005e790fdc5f8d2a3e591b6fa938f6689a4aabc4158e22ebf5178117e53d","node_hash":"999777484c58cf3646eabb6df3e559369a1b081ec4f337d621dade1bf241f339","ord":4,"own_hash":"b56ce0ab4b480c4c43b11ca2eaca410c60fed73341d53896d509e30eabf54477","parent":"f0tj6ca","text_hash":"6694730560450e67ba90c083ac2a8a09b774de4dba41660d5ca18b8470066cbf"} +{"align_key":"5bf278d41bc3aa26cf7053443c52dc212328ea2e16894449550e8fd70b8ada0b","id":"fzz8ndw","kind":"caption","match_hash":"955ed4290a6d4eff250c6ce051442f5b9bc98630c4425105fe321d30d2656e39","node_hash":"199dc589742d341f29a67f5c254882c1ea3ec7462fae2cb3f79c40dd1993da75","ord":0,"own_hash":"c3b298305f0176c12850acf7df92ec8a435ce882f353e92319e21d16967cf486","parent":"gm5z4rx","text_hash":"955ed4290a6d4eff250c6ce051442f5b9bc98630c4425105fe321d30d2656e39"} +{"align_key":"5bf278d41bc3aa26cf7053443c52dc212328ea2e16894449550e8fd70b8ada0b","content":[{"kind":"text","text":"Fitted harmonic bond parameters."}],"fidelity":"F2","id":"beayvd3","kind":"sentence","match_hash":"955ed4290a6d4eff250c6ce051442f5b9bc98630c4425105fe321d30d2656e39","node_hash":"52063ded5cf76abdd32ba5c1d0d5d7348843eb0516ad29f5b1f249964e015b50","ord":0,"own_hash":"506d3bd0afffb1dff34f1563338d538c85be50434905c86784a94b747f979bc3","parent":"fzz8ndw","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"955ed4290a6d4eff250c6ce051442f5b9bc98630c4425105fe321d30d2656e39"} +{"align_key":"5771fec3fb2305f70a8eb06ec7386087264047efee0d7d8dbd8d25758175ebca","id":"bapa0zm","kind":"table-head","match_hash":"4e19bd47c00e86da7e54b6eca51444ae29a8187df7f634381c169da5e4ad90fc","node_hash":"c67d4a01f651dc45a4df9b63872fa84fe4f6b827c19a79946333925bfa0c21d4","ord":1,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"gm5z4rx","text_hash":"e0440966783b8aeb165978ce3dc64a0018ca5be0332515cd14e57c54d9179796"} +{"align_key":"a659ad2672917045b0c527c1743ea1185b11723d1df41b292bdbb2c463171292","id":"btf2r9v","kind":"row","match_hash":"6e9c9fb5f4f408cb60f8befbbaa4c636eb9f83bf68370d2a0614a9d859c0c50e","node_hash":"993a6efb8a7a781e9d6b3932f4ff4b675b58474f36ed80f383e6894eff95c111","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"bapa0zm","text_hash":"6e9c9fb5f4f408cb60f8befbbaa4c636eb9f83bf68370d2a0614a9d859c0c50e"} +{"align_key":"f21dea74d898cfeaf836ecc99ad0331bade09711ff927365e91ada2ff4cb5caf","attrs":{"colspan":1,"column":"vphmyzz","role":"column-header","rowspan":2},"content":[{"kind":"text","text":"Bond"}],"fidelity":"F1","id":"e4z9fr6","kind":"cell","match_hash":"8f8fd9ecdd4abade9e242bbe78dfce031a19b5ae23e5f5fa609a3f17fd17ad0e","node_hash":"2b014c7b7fb98ef546e1350939d5740a070c180f7e28c8b30a1a7528d746715b","ord":0,"own_hash":"0667a31a6abc89cf418623b974e617b07dbad244c06fb8a679391471894d2933","parent":"btf2r9v","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"8f8fd9ecdd4abade9e242bbe78dfce031a19b5ae23e5f5fa609a3f17fd17ad0e"} +{"align_key":"8c8978cd7982d691c64d813efb1d4afb97acc793da3e39a68d046e2a93ae2be6","attrs":{"colspan":2,"column":"kp6grmd","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"Set A"}],"fidelity":"F1","id":"cwhj4gp","kind":"cell","match_hash":"7781d909b92b076f727912ebbbd5bc71a668b5a0addb8f63233d3c8c57845f3f","node_hash":"a6ba6f9e580e05de8d3291c5877fdf8a9393a9e2f5264b4677e3c5e480fa8ffd","ord":1,"own_hash":"e84fd6b972eb70ab136f85033ee708d5918cf0ecd0adefec970bf593a0448b14","parent":"btf2r9v","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"7781d909b92b076f727912ebbbd5bc71a668b5a0addb8f63233d3c8c57845f3f"} +{"align_key":"45b0a30471aa0a404b7ff95e2dcdee8826375dd82b30f0e7d4c10d53ef30f3e6","attrs":{"colspan":2,"column":"egq2j2a","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"Set B"}],"fidelity":"F1","id":"vtszvw9","kind":"cell","match_hash":"bf8f310bda440cf1d4b84f04ac5f8a0a3c61d9265902e047dc0c7ad8c254b7f0","node_hash":"cd05551c4660437704eceffa53d51e4aa90b58c24f2849109bf1c0441e2bb50e","ord":2,"own_hash":"6136013de2c9aa9a9566f3cefb328f14f4945838043b1d58c8f510764428436b","parent":"btf2r9v","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"bf8f310bda440cf1d4b84f04ac5f8a0a3c61d9265902e047dc0c7ad8c254b7f0"} +{"align_key":"9b6d6cb576d576764f7e189c1ed2aa0392ab210116039e4ee928552c6a795e32","id":"qxm90ek","kind":"row","match_hash":"f8b45189d816aa3993f210c6d7f53f7362f99fe117753b902017a4e71fa4cfb7","node_hash":"8b1cedb9f30cb616f8f3f0a8a7198c8ef3c7ca986a7b3c5f38416c080d34ed15","ord":1,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"bapa0zm","text_hash":"164b44e31c7b63ded18cea61033bcfdd7e41c0b9a7cfbeb646151211f4f56dd9"} +{"align_key":"30f672b6cdc284f1301ceeabeef408d01daf908ab595d94a8ccd0b1a11cc3d36","attrs":{"colspan":1,"column":"kp6grmd","role":"column-header","rowspan":1},"content":[{"kind":"math","notation":"tex","source":"K_r"},{"kind":"text","text":" (kcal mol⁻¹ Å⁻²)"}],"fidelity":"F1","id":"sam8g7e","kind":"cell","match_hash":"b1f176c51fe311a983d0496a84edb0888eeb983b142fb656ca2ca10f178f53c4","node_hash":"9e2f3bd947511657e48b54d1fa44645b24217e10390215fb2086ea2e4f2031a9","ord":0,"own_hash":"3cbbfc6498d59ce719171db060473fc89bf40a507cdf364d605504fe4a973c18","parent":"qxm90ek","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"250808e334a5d40d3c8d967571e2adb4c75e9637b656054c397de8766c1c2fcb"} +{"align_key":"afcc57c89a13b80567d04a282c9f7a723a312442b9566a5ac57134a4f740f60c","attrs":{"colspan":1,"column":"z16p4vm","role":"column-header","rowspan":1},"content":[{"kind":"math","notation":"tex","source":"r_\\mathrm{eq}"},{"kind":"text","text":" (Å)"}],"fidelity":"F1","id":"cq77erb","kind":"cell","match_hash":"8ac8c7d949e092557499a31394ea8c2f6737072561797f2fbae9c0e36dc1cba6","node_hash":"f9a5df8760b27e0be045ca8fac31c6f810925a1c6f5f1adbf4d57c074e0ef7b7","ord":1,"own_hash":"71cdcb92d51a0a223bfb4500cdd8f5c1a0dca82827e67964150afc199882ce68","parent":"qxm90ek","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"fdda118ed46f24353ac4d657707fc6fa86a9787123c7c080edeb8c20513879e3"} +{"align_key":"30f672b6cdc284f1301ceeabeef408d01daf908ab595d94a8ccd0b1a11cc3d36","attrs":{"colspan":1,"column":"egq2j2a","role":"column-header","rowspan":1},"content":[{"kind":"math","notation":"tex","source":"K_r"},{"kind":"text","text":" (kcal mol⁻¹ Å⁻²)"}],"fidelity":"F1","id":"h5psthj","kind":"cell","match_hash":"b1f176c51fe311a983d0496a84edb0888eeb983b142fb656ca2ca10f178f53c4","node_hash":"3ef4e8338041687f926025a210859cf7f1686ace4b92bc4b5a1f96e03b55fb03","ord":2,"own_hash":"b3ff62a4a905b51e454fede1d5ffd3d70ff83071948d573a2eb68032cd27e25a","parent":"qxm90ek","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"250808e334a5d40d3c8d967571e2adb4c75e9637b656054c397de8766c1c2fcb"} +{"align_key":"afcc57c89a13b80567d04a282c9f7a723a312442b9566a5ac57134a4f740f60c","attrs":{"colspan":1,"column":"my9ahda","role":"column-header","rowspan":1},"content":[{"kind":"math","notation":"tex","source":"r_\\mathrm{eq}"},{"kind":"text","text":" (Å)"}],"fidelity":"F1","id":"j3d4w5v","kind":"cell","match_hash":"8ac8c7d949e092557499a31394ea8c2f6737072561797f2fbae9c0e36dc1cba6","node_hash":"e1984eeb82451ef60cb4079dbe0c3f5f0cbd4fb359dc0a758da42f958013cb48","ord":3,"own_hash":"13f14521bc3a734e1eeefbfe8bf3a4b179789f1a66634d3fd2fa82aa41eff6d1","parent":"qxm90ek","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"fdda118ed46f24353ac4d657707fc6fa86a9787123c7c080edeb8c20513879e3"} +{"align_key":"d8a16dc017f11e5e02e5fec0422b7acad0223a9a152d8f21310eaefa6ccca895","id":"tk5p46c","kind":"table-body","match_hash":"a477b7dda745bc0b339f1fd8599c7869ba9c91c648ba1ae42096f13949944970","node_hash":"5920b35b6211d010d13de7c122367955fb371fb3e69f8246007258d7c534a8a6","ord":2,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"gm5z4rx","text_hash":"a477b7dda745bc0b339f1fd8599c7869ba9c91c648ba1ae42096f13949944970"} +{"align_key":"41b1ca8b524b5a59eec07b0151ee5e8c02906e446d7ad0c739f179acbbbe0974","id":"y7pmzed","kind":"row","match_hash":"deaa884fd6ab00c358507695e45b7f13c55c2c97cd527617be3b8b030d04631f","node_hash":"b4b1d30656d2af85f08a5e1bf85770137ca2981e496dc8f933f182bcfde33a8b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"tk5p46c","text_hash":"deaa884fd6ab00c358507695e45b7f13c55c2c97cd527617be3b8b030d04631f"} +{"align_key":"41b1ca8b524b5a59eec07b0151ee5e8c02906e446d7ad0c739f179acbbbe0974","attrs":{"colspan":5,"column":"vphmyzz","role":"row-group-header","rowspan":1},"content":[{"kind":"text","text":"Bond parameters"}],"fidelity":"F1","id":"hwxm8de","kind":"cell","match_hash":"deaa884fd6ab00c358507695e45b7f13c55c2c97cd527617be3b8b030d04631f","node_hash":"6bfe508bd5c53426d8cf98d5fb4bab4e01a017f4ffab62aa1fdc2801d2713d9e","ord":0,"own_hash":"e7c6b76320063bc83b1f683c9a7f36baeb4847cb70cf22b2472c5efe4fb79669","parent":"y7pmzed","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"deaa884fd6ab00c358507695e45b7f13c55c2c97cd527617be3b8b030d04631f"} +{"align_key":"4a372ae875dc53180d3e26bd46ad452ca785b68e8e0d7075310def8efd012f69","attrs":{"header_path":["hwxm8de","k3fqnvy"]},"id":"zhe4g0k","kind":"row","match_hash":"cef7e16a07e0502817f2a277b0e0972066f1d80b928e72db831692dae8b8f519","node_hash":"91d2b7eb0d895e49471fd5c837727c3ed1fb880e5a0945e37f551b566c8c8913","ord":1,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"tk5p46c","text_hash":"cef7e16a07e0502817f2a277b0e0972066f1d80b928e72db831692dae8b8f519"} +{"align_key":"5d6ea91a72c2c0814444754cdb18d29539f0ef382d801c6d7184be392b35c798","attrs":{"colspan":1,"column":"vphmyzz","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"CT–CT"}],"fidelity":"F1","id":"k3fqnvy","kind":"cell","match_hash":"670ae760d62ff8d674b222641915f452595b35aa53cdbd5b27194ef13c29e7f4","node_hash":"3667b6fda5e0fc2e714a303f597938e4a84a1c5786b7c233af323cba905dd745","ord":0,"own_hash":"1611a70ba9ca11c49fe62c7723f01f62d1b8ceebe052a5da1060bc726e42f735","parent":"zhe4g0k","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"670ae760d62ff8d674b222641915f452595b35aa53cdbd5b27194ef13c29e7f4"} +{"align_key":"b478fdfee29a549693a103681b3ad91c628d0f16ad0a7b2c5b089fe8ecd1f6ca","attrs":{"colspan":1,"column":"kp6grmd","role":"data","rowspan":1},"content":[{"kind":"text","text":"310.0"}],"fidelity":"F1","id":"nkm3xn5","kind":"cell","match_hash":"b478fdfee29a549693a103681b3ad91c628d0f16ad0a7b2c5b089fe8ecd1f6ca","node_hash":"21f13b21948078f64c564334e5bb180b4495edb25a79ae32aa967986a626f3d5","ord":1,"own_hash":"2937e2a6f14cfebd4ffd20e3d514e5cbbf0626a5c0089b7cbea817ef20782b3d","parent":"zhe4g0k","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"b478fdfee29a549693a103681b3ad91c628d0f16ad0a7b2c5b089fe8ecd1f6ca"} +{"align_key":"ee8dce19ea6dd3f91de5a1b9d9c13c2077c462523d14b5cd9958749e6b58d7e6","attrs":{"colspan":1,"column":"z16p4vm","role":"data","rowspan":1},"content":[{"kind":"text","text":"1.526"}],"fidelity":"F1","id":"kpk13yn","kind":"cell","match_hash":"ee8dce19ea6dd3f91de5a1b9d9c13c2077c462523d14b5cd9958749e6b58d7e6","node_hash":"6e366c4aea409d36e918ad1bb71b1ec39c4203a5a0793bd66fc347c99b717760","ord":2,"own_hash":"b257a0c6c58f87dbb374e4e24a52815a6649a65d5a9fd7a1afd546bede459fb2","parent":"zhe4g0k","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"ee8dce19ea6dd3f91de5a1b9d9c13c2077c462523d14b5cd9958749e6b58d7e6"} +{"align_key":"6b8d9cf3fe1a78784cab97278e5ccfdf305879dd1cd120c3fe6708b529f31b15","attrs":{"colspan":1,"column":"egq2j2a","role":"data","rowspan":1},"content":[{"kind":"text","text":"305.2"}],"fidelity":"F1","id":"hw8fx4r","kind":"cell","match_hash":"6b8d9cf3fe1a78784cab97278e5ccfdf305879dd1cd120c3fe6708b529f31b15","node_hash":"e554e4381827c90595a9083fd3a16e6cc72d0b14e52b3d86104c4b42a9f101b8","ord":3,"own_hash":"6356e0e8a0c4c9911e9657be9ee00e47fbe2ee6c54928d2b3d126266b19fa1e3","parent":"zhe4g0k","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"6b8d9cf3fe1a78784cab97278e5ccfdf305879dd1cd120c3fe6708b529f31b15"} +{"align_key":"c649510dde8e1cdf382f42a071e5fa75089e908840c9e8d1aa30ff514b2379e4","attrs":{"colspan":1,"column":"my9ahda","role":"data","rowspan":1},"content":[{"kind":"text","text":"1.5260"}],"fidelity":"F1","id":"rr9wvsy","kind":"cell","match_hash":"c649510dde8e1cdf382f42a071e5fa75089e908840c9e8d1aa30ff514b2379e4","node_hash":"4a37ffce2a07de7a6fcbf4a63b0679945c79ac8db9d2ec492e0fb1ff5072540d","ord":4,"own_hash":"f6cf4e1e1b7230ac3caaad08fff84e008eca06baf3eb2df936624ca83b861a2a","parent":"zhe4g0k","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"c649510dde8e1cdf382f42a071e5fa75089e908840c9e8d1aa30ff514b2379e4"} +{"align_key":"a45b00112a0139c2844a5212ae484918fb1ae0296afaa09a1a68dc8b239bb16d","attrs":{"header_path":["hwxm8de","t6gjpee"]},"id":"fbg2mwq","kind":"row","match_hash":"bbd74c08e45ad5c37ea7f49f508f61e5db84832fb8e1f1fbab93c81d7365526e","node_hash":"6fbc456c39d7b50870e1a6e94433dea8be5357f0626b3f1cc63c2e3fffbad862","ord":2,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"tk5p46c","text_hash":"bbd74c08e45ad5c37ea7f49f508f61e5db84832fb8e1f1fbab93c81d7365526e"} +{"align_key":"118187fa2e09363d37d69618e281113d5d02a9ee8a702bbe9aa12a4cbeeb1390","attrs":{"colspan":1,"column":"vphmyzz","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"CT–HC"}],"fidelity":"F1","id":"t6gjpee","kind":"cell","match_hash":"8e626647307dc064d96fb93c50b4c6c5cab90f9369f00a7252a004a0c9871ee3","node_hash":"c63c1c3c34edbed309ddb56ded1c9dd788c5c49946e8af97b102a25ef1d96018","ord":0,"own_hash":"bdeea4afe67e17d0bc5ead4513b0780e77ff0e33835378479b19e6ffb930c96f","parent":"fbg2mwq","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"8e626647307dc064d96fb93c50b4c6c5cab90f9369f00a7252a004a0c9871ee3"} +{"align_key":"f30130f6a42898d5d87ecd4d8503854dd79a2b6ea87b769fe994ce7f8ec52b29","attrs":{"colspan":1,"column":"kp6grmd","role":"data","rowspan":1},"content":[{"kind":"text","text":"340.0"}],"fidelity":"F1","id":"kw2fb3v","kind":"cell","match_hash":"f30130f6a42898d5d87ecd4d8503854dd79a2b6ea87b769fe994ce7f8ec52b29","node_hash":"dd26b057d6391ab1966fc1a6c49798e7a8e925f9c23a09812eb2758104cb6f36","ord":1,"own_hash":"d0b18eb9c753ca483d493c716e1b20d0f0e1ac50ad26bf61ec40228511ca7ef9","parent":"fbg2mwq","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"f30130f6a42898d5d87ecd4d8503854dd79a2b6ea87b769fe994ce7f8ec52b29"} +{"align_key":"1bec39b32c2e32386d9d6782efca347244c62b4c431e4dc2a55481a5da7f704d","attrs":{"colspan":1,"column":"z16p4vm","role":"data","rowspan":1},"content":[{"kind":"text","text":"1.090"}],"fidelity":"F1","id":"e0n07n0","kind":"cell","match_hash":"1bec39b32c2e32386d9d6782efca347244c62b4c431e4dc2a55481a5da7f704d","node_hash":"6ebc7eb98564471c9fabacf60e15bbc03ee019fa3a806731b8502db326a24f6c","ord":2,"own_hash":"658c69a718f90066aa362e39163e8e487f98df28fe622b1b313f5ef971f7fd18","parent":"fbg2mwq","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"1bec39b32c2e32386d9d6782efca347244c62b4c431e4dc2a55481a5da7f704d"} +{"align_key":"b8ab64f15f3d461877b84369e57a5cf1c3540a6b69165abf0234df415a8d5cf2","attrs":{"colspan":1,"column":"egq2j2a","role":"data","rowspan":1},"content":[{"kind":"text","text":"338.7"}],"fidelity":"F1","id":"gy4avx6","kind":"cell","match_hash":"b8ab64f15f3d461877b84369e57a5cf1c3540a6b69165abf0234df415a8d5cf2","node_hash":"52404bd0f3b95103a0f46b59d3b6af851bcde8548fae6d349e82bc25d23a3b7e","ord":3,"own_hash":"7018736647e076ec53c24d0073194cb9ab3fd1c666051f9e783ce2ada56ad75a","parent":"fbg2mwq","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"b8ab64f15f3d461877b84369e57a5cf1c3540a6b69165abf0234df415a8d5cf2"} +{"align_key":"fedc98fca86c767960acd84bda18f46890b81621a14d3a8cbfd908a652fdb30e","attrs":{"colspan":1,"column":"my9ahda","role":"data","rowspan":1},"content":[{"kind":"text","text":"1.0900"}],"fidelity":"F1","id":"ezb1n33","kind":"cell","match_hash":"fedc98fca86c767960acd84bda18f46890b81621a14d3a8cbfd908a652fdb30e","node_hash":"bc58a669d6c2dd62e34a8067482e99274365b7a9b640feb4e40f049cd4aa65f2","ord":4,"own_hash":"5018ffea0aba6018a95a7a8974f6d740578d205aa905f5d7d4456af8969f4922","parent":"fbg2mwq","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"fedc98fca86c767960acd84bda18f46890b81621a14d3a8cbfd908a652fdb30e"} +{"align_key":"283bdfbbf34f5e6fe9ca4f6ff2594fbdd6bd372c930e8319f1fe93be0ce403f1","attrs":{"header_path":["hwxm8de","j67ec9p"]},"id":"j0x5twd","kind":"row","match_hash":"5af49b35ec3075f7ba7434abe632ab928db0fb5594fabd4de6e9a0813995a2d0","node_hash":"4aa5c68add4a0932e26fa3cf58f6a2dca1756dcefb82fa5c8187ec4325335ef4","ord":3,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"tk5p46c","text_hash":"5af49b35ec3075f7ba7434abe632ab928db0fb5594fabd4de6e9a0813995a2d0"} +{"align_key":"25283c28aaea468386320dec27244cd4319a49a9f2126eb9c48c46bf36e6f0b7","attrs":{"colspan":1,"column":"vphmyzz","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"OW–HW"}],"fidelity":"F1","id":"j67ec9p","kind":"cell","match_hash":"ba9b0eb1802de135cc2a35d473b340367e85d36ac8a72345c2ef6ab7e75e6881","node_hash":"b95706fc7f64b589532af7687297469d7fd2f48443190111c6361af96b578558","ord":0,"own_hash":"49206aaa354a836b4de27939ec6a4a4d8d6f866d2beaa4b25e5ea6c3fe2b9399","parent":"j0x5twd","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"ba9b0eb1802de135cc2a35d473b340367e85d36ac8a72345c2ef6ab7e75e6881"} +{"align_key":"bb6b559fd0ec5a9acb92f206cd1cce8fbc9363c199ad10b9488878879c628918","attrs":{"colspan":1,"column":"kp6grmd","role":"data","rowspan":1},"content":[{"kind":"text","text":"553.0"}],"fidelity":"F1","id":"dm452cm","kind":"cell","match_hash":"bb6b559fd0ec5a9acb92f206cd1cce8fbc9363c199ad10b9488878879c628918","node_hash":"3bf0f8ecfaeabf8546ecfac5ff88a5083d40b39fbc9b7d23c57070a15276631e","ord":1,"own_hash":"93b403eb62fef6bd8a0766f7ec7ef955dbd0777af6e2abf4fdeb627ff276a1a4","parent":"j0x5twd","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"bb6b559fd0ec5a9acb92f206cd1cce8fbc9363c199ad10b9488878879c628918"} +{"align_key":"ec3cf0aa426cd944077cc1b561183e1dd8752c9f83fa80eba92192e6bf0cb47e","attrs":{"colspan":1,"column":"z16p4vm","role":"data","rowspan":1},"content":[{"kind":"text","text":"0.9572"}],"fidelity":"F1","id":"t3dsc22","kind":"cell","match_hash":"ec3cf0aa426cd944077cc1b561183e1dd8752c9f83fa80eba92192e6bf0cb47e","node_hash":"5b180503866108fc210b788554bfdf02570e82a9f87754cd6e2293106d592158","ord":2,"own_hash":"17b73693b12a53fd43c3e14cd71990602c69ea3e6734171578be2c88070648e5","parent":"j0x5twd","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"ec3cf0aa426cd944077cc1b561183e1dd8752c9f83fa80eba92192e6bf0cb47e"} +{"align_key":"19930871950bbde163c3eb53975f62fe19dd65adab1afbdd3c9a04011c868488","attrs":{"colspan":1,"column":"egq2j2a","role":"data","rowspan":1},"content":[{"kind":"text","text":"548.1"}],"fidelity":"F1","id":"mkakqg3","kind":"cell","match_hash":"19930871950bbde163c3eb53975f62fe19dd65adab1afbdd3c9a04011c868488","node_hash":"3174ecb5b11912a58c22f7069747d93753fdf0c88684ee7264dc2c0cf2ab8fe5","ord":3,"own_hash":"ae639ba9bddb4bcfe35fe4fc5f41c8cc8fc1a8cc6b9d36df35bb22da8a5dd7c2","parent":"j0x5twd","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"19930871950bbde163c3eb53975f62fe19dd65adab1afbdd3c9a04011c868488"} +{"align_key":"eb7d66cb8e1ca7f8d8430d68a5a4e4d50c76d39b81993775fb5e944b003c390a","attrs":{"colspan":1,"column":"my9ahda","role":"data","rowspan":1},"content":[{"kind":"text","text":"0.9570"}],"fidelity":"F1","id":"ba6xp29","kind":"cell","match_hash":"eb7d66cb8e1ca7f8d8430d68a5a4e4d50c76d39b81993775fb5e944b003c390a","node_hash":"c0fe6b3090e024652f05c04c236932e6e0675efdc7bd4eab880fbc609b87abb8","ord":4,"own_hash":"a503d0417fdbf8aef8b35d473b674f77be2f6fe24d2e59fc49b2a382baa2f91e","parent":"j0x5twd","prov":{"backend":"docling (illustrative)","witnesses":["qptsanv"]},"text_hash":"eb7d66cb8e1ca7f8d8430d68a5a4e4d50c76d39b81993775fb5e944b003c390a"} +{"align_key":"6570a6f13ac110080144a56e087ad15832c104d0e4035dd0d4a2fb17a7af7783","id":"ahxcgqa","kind":"table-note","match_hash":"a877cef7ab5748aa219bbcc8916dd4e58d20cb8f77c503cab33c0e6de623ef42","node_hash":"d341fed063b8cedd2929332cfd4e20fada8bc3e21c1765b13f60c28b3ab99b7b","ord":3,"own_hash":"606bedb4bbe285b916ed03d2667874614f1a742a4dd96fcff0847a2cda82233c","parent":"gm5z4rx","text_hash":"a877cef7ab5748aa219bbcc8916dd4e58d20cb8f77c503cab33c0e6de623ef42"} +{"align_key":"6570a6f13ac110080144a56e087ad15832c104d0e4035dd0d4a2fb17a7af7783","content":[{"kind":"text","text":"Set B was refitted with half the step size."}],"fidelity":"F2","id":"bn2ef3e","kind":"sentence","match_hash":"a877cef7ab5748aa219bbcc8916dd4e58d20cb8f77c503cab33c0e6de623ef42","node_hash":"21684f7260cb72cfe184a8c9ca42084436b38d6dedd341ae0cf5f248a76a66c8","ord":0,"own_hash":"e458a50764e270e5911a763774b6982886847a4e7720f61f21a635d3e457abeb","parent":"ahxcgqa","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"a877cef7ab5748aa219bbcc8916dd4e58d20cb8f77c503cab33c0e6de623ef42"} +{"align_key":"85c6f14b0fafd29a171abf9b19ae30c7cb3190380aedc8888c176914af0981e6","id":"jmdabra","kind":"back","match_hash":"ca900096b5bb9658fa9a9dbecfb5397b4fa406736d4d25b1e1b1604538061358","node_hash":"49cf247605d22ef7c8a188deee10c50e8eabda9790518d1c494b24d01126ad06","ord":3,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ya7x597","text_hash":"a9b95f9e1bd8a36fd83522c839870d36f5accbf5c5c97a506f706b50b231c26c"} +{"align_key":"85c6f14b0fafd29a171abf9b19ae30c7cb3190380aedc8888c176914af0981e6","id":"m9ywq9e","kind":"references","match_hash":"ca900096b5bb9658fa9a9dbecfb5397b4fa406736d4d25b1e1b1604538061358","node_hash":"3d92aa57d6349a80b4a644eb4d9593eb693bb11e1c464c548e01be859139e7bb","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"jmdabra","text_hash":"a9b95f9e1bd8a36fd83522c839870d36f5accbf5c5c97a506f706b50b231c26c"} +{"align_key":"d608bdc8e8007bd4e4d25290e35d37c61c93e4f77b9edddbcbfd4599e43731f5","content":[{"kind":"text","text":"(1) A. Author and B. Author, J. Example Chem. 2001, 12, 345–350."}],"fidelity":"F2","id":"zmyqtxs","kind":"reference","label":"1","match_hash":"d48a330a25fccfdda363da51e3c68643e5ff1fd3e51cd61ee573341d0bbfceda","node_hash":"442dfa9dcf19c75f9c14cae4c983eb57e65f7a35c9dde080084d86ed088dd1fb","ord":0,"own_hash":"789d899112bf2ac74569b68ef18a1467ef9dd2ac78411df5826820bd559c20bf","parent":"m9ywq9e","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"807acc045a31ceea788b808e19dfeb65a63128a6f8b7c5bdac9bf5b8666c95b0"} +{"align_key":"86123b3bf328b71716e568fc389bdec8be999144adf7b12dd488fdd203d466cc","content":[{"kind":"text","text":"(2) C. Writer, Example Spectroscopy 2010, 7, 89–97."}],"fidelity":"F2","id":"b3g86a4","kind":"reference","label":"2","match_hash":"2262a041e97da4d2f93423922c43671d613411556a783a0f68df7772a6e6a1a9","node_hash":"55f14a794d6629a439c3faeb60f51aa130c78018ff85f83e1b524e3f2bae490f","ord":1,"own_hash":"e40c89a96d003d5aa0299bf2a9abdff3e5cd23c0ce6341e3187657bab765da06","parent":"m9ywq9e","prov":{"backend":"docling (illustrative)","corroborated_by":["qptsanv"],"witnesses":["qptsanv"]},"text_hash":"48b09f2dd83a6db28d8557eca54357536093c590bbe22f0a805407b3574f6353"} diff --git a/fixtures/packages/hale2026harmonic/pages.jsonl b/fixtures/packages/hale2026harmonic/pages.jsonl new file mode 100644 index 0000000..dc29f0c --- /dev/null +++ b/fixtures/packages/hale2026harmonic/pages.jsonl @@ -0,0 +1,2 @@ +{"page":1,"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","page_label":"101","size":[612,792],"stamps_removed":["downloaded-via","sharing-guidelines"],"text_layer":true,"witness":"qptsanv"} +{"page":2,"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","page_label":"102","size":[612,792],"stamps_removed":["downloaded-via","sharing-guidelines"],"text_layer":true,"witness":"qptsanv"} diff --git a/fixtures/packages/hale2026harmonic/provenance.json b/fixtures/packages/hale2026harmonic/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/packages/hale2026harmonic/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/packages/hale2026harmonic/receipts.jsonl b/fixtures/packages/hale2026harmonic/receipts.jsonl new file mode 100644 index 0000000..5db1636 --- /dev/null +++ b/fixtures/packages/hale2026harmonic/receipts.jsonl @@ -0,0 +1,8 @@ +{"at":"2026-10-01T16:00:00Z","by":"ana","doc":"hale2026harmonic","evidence":[{"kind":"crop","node":"kpk13yn","sha256":"a1ce0163f0916515deed37d4b345187528305507fbd847f68b92af0a7147af29"},{"kind":"crop","node":"nkm3xn5","sha256":"9b6fe65013a5231ebfda702637f2fa7c47155f2a2dc35d93fd9e0097ec4f7af9"},{"kind":"crop","node":"rr9wvsy","sha256":"2009aedf8b2e7f5d17018e81633a9f594039dc03b199f447df0708d39f33e3c3"},{"kind":"witness","sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"}],"format":"scienting-receipt/1","id":"c5cx7n4tga6y9","level":"F3","nodes":[["kpk13yn","6e366c4aea409d36e918ad1bb71b1ec39c4203a5a0793bd66fc347c99b717760"],["nkm3xn5","2fd1e9e445ae29e3a35d032a41561cc164003fc3d146d93812da10e5f4022f86"],["rr9wvsy","4a37ffce2a07de7a6fcbf4a63b0679945c79ac8db9d2ec492e0fb1ff5072540d"]],"rev":0,"root":"aed196d7a35a72c8bf7d998b18604a476fc52115f54620f5bc3799953facc9a0","scope":"targeted:lode","signature":{"key":"ana","scheme":"ed25519","value":"/Ihr1Et6FnhZduhjQoXNsC5SaWJ3OXgEpKhZR2w72p+Umg0ehuEbqqIR5QWxzpUgNOxznAGQoEgVQuLzhqWNBw=="}} +{"at":"2026-10-11T15:02:11Z","by":"ana","doc":"hale2026harmonic","evidence":[{"kind":"crop","node":"ba6xp29","sha256":"f8da39772d0f11f2ef05be9e9f26f8d5c8ef60a6c4fdd81d1e08b5f8dfa89943"},{"kind":"crop","node":"cq77erb","sha256":"414d9c94f57ac7039517d81bd915abe3d59711bb0aa8ca49e7b93b656d613b24"},{"kind":"crop","node":"dm452cm","sha256":"a6c7fc9f20c6a78160e77e2ab0154a64bec4d903b5fd1d2d99b5880591903872"},{"kind":"crop","node":"e0n07n0","sha256":"ae161916f2ff84503386df9733a7c878fe84015c17cfd36d5f9bce3539fb849b"},{"kind":"crop","node":"e4fkseg","sha256":"ab6ae30528212e54c2a74d8ed67631ff65f74055505dbe8af44d92a29bde0840"},{"kind":"crop","node":"ezb1n33","sha256":"638e1b8704af8aa5dfe1839c853a8f7ba0d8fa97fd2fdcbce2212f08bbdc0a91"},{"kind":"crop","node":"f929eq9","sha256":"cd6aaea1755038f67b5c0ccbdd962defba1eb35105cceb602b5cdbc3c215f7f2"},{"kind":"crop","node":"gy4avx6","sha256":"92248b149d2c3ec39ceeff1d3373f031f6a70cd1949c6f8122fdd6ebcd62b51c"},{"kind":"crop","node":"h5psthj","sha256":"15efd08d97b3179177450b8dcbe3a5f409ab2b69264feaf4e683ecedb5f190b9"},{"kind":"crop","node":"hw8fx4r","sha256":"91fe488a266419894e767e3cc454289006c60396d89ceae4874ba26615066e5d"},{"kind":"crop","node":"j3d4w5v","sha256":"ed0e073495b767d7f9fad42a4fb4a1cff766ef03b453269783fe374a813d226d"},{"kind":"crop","node":"j67ec9p","sha256":"ef98568b73187f04020315ab16047b8c736455c521cf67ec8c2c844ddbc03535"},{"kind":"crop","node":"k3fqnvy","sha256":"ea7890608de0285ed1b0d93383d60aa88e9c9b4fe33e4cf08715202bccc3696a"},{"kind":"crop","node":"kpk13yn","sha256":"a1ce0163f0916515deed37d4b345187528305507fbd847f68b92af0a7147af29"},{"kind":"crop","node":"kw2fb3v","sha256":"cd112f1274cc1350acc0f0b7f5fb6a7e69992277320eefd7a89177e3b818ba0a"},{"kind":"crop","node":"mkakqg3","sha256":"711a38b76111a51d10dfa95540ec9d532af4f747c579e0ce334ddb9f2dd6245e"},{"kind":"crop","node":"nkm3xn5","sha256":"9b6fe65013a5231ebfda702637f2fa7c47155f2a2dc35d93fd9e0097ec4f7af9"},{"kind":"crop","node":"qn08tj9","sha256":"3a959cece8b823dd6125490270d75ba3a8126710e11fef7746c30d294ba06b16"},{"kind":"crop","node":"rr9wvsy","sha256":"2009aedf8b2e7f5d17018e81633a9f594039dc03b199f447df0708d39f33e3c3"},{"kind":"crop","node":"sam8g7e","sha256":"69c110b291213b16b2825f6c9804a47f9da2f9537cb23d5c77ec22ca03c8b02b"},{"kind":"crop","node":"sxgcc9h","sha256":"3d7197ebb9d3256b54d773a0ed940a60c023e78a324649908f02682a3bdc66fa"},{"kind":"crop","node":"t3dsc22","sha256":"6a9991fdd7c4beac2e4396e9160305e819dbe1303487dc9777da3a022cdb7a4e"},{"kind":"crop","node":"t6gjpee","sha256":"9947acdb70078a8d1fdf2ce9b654cce2eb5d20745f35370985b809e1b931de44"},{"kind":"witness","sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"}],"format":"scienting-receipt/1","id":"eqgbbpwb6725v","level":"F3","nodes":[["ba6xp29","c0fe6b3090e024652f05c04c236932e6e0675efdc7bd4eab880fbc609b87abb8"],["cq77erb","f9a5df8760b27e0be045ca8fac31c6f810925a1c6f5f1adbf4d57c074e0ef7b7"],["dm452cm","3bf0f8ecfaeabf8546ecfac5ff88a5083d40b39fbc9b7d23c57070a15276631e"],["e0n07n0","6ebc7eb98564471c9fabacf60e15bbc03ee019fa3a806731b8502db326a24f6c"],["e4fkseg","5421e9cf0ef3a995792963d0371b79e11a8efad519b02efb5cb88311a896d0cc"],["ezb1n33","bc58a669d6c2dd62e34a8067482e99274365b7a9b640feb4e40f049cd4aa65f2"],["f929eq9","cd6cdb032e9b8ab712790b7181f794f6e363b7c4c96888049b59c671c1596369"],["gy4avx6","52404bd0f3b95103a0f46b59d3b6af851bcde8548fae6d349e82bc25d23a3b7e"],["h5psthj","3ef4e8338041687f926025a210859cf7f1686ace4b92bc4b5a1f96e03b55fb03"],["hw8fx4r","e554e4381827c90595a9083fd3a16e6cc72d0b14e52b3d86104c4b42a9f101b8"],["j3d4w5v","e1984eeb82451ef60cb4079dbe0c3f5f0cbd4fb359dc0a758da42f958013cb48"],["j67ec9p","b95706fc7f64b589532af7687297469d7fd2f48443190111c6361af96b578558"],["k3fqnvy","3667b6fda5e0fc2e714a303f597938e4a84a1c5786b7c233af323cba905dd745"],["kpk13yn","6e366c4aea409d36e918ad1bb71b1ec39c4203a5a0793bd66fc347c99b717760"],["kw2fb3v","dd26b057d6391ab1966fc1a6c49798e7a8e925f9c23a09812eb2758104cb6f36"],["mkakqg3","3174ecb5b11912a58c22f7069747d93753fdf0c88684ee7264dc2c0cf2ab8fe5"],["nkm3xn5","21f13b21948078f64c564334e5bb180b4495edb25a79ae32aa967986a626f3d5"],["qn08tj9","cc0bf73dd84e298da0d36c4b363c8d2bdc9b6d5738d1923d14c4a9028dca08d6"],["rr9wvsy","4a37ffce2a07de7a6fcbf4a63b0679945c79ac8db9d2ec492e0fb1ff5072540d"],["sam8g7e","9e2f3bd947511657e48b54d1fa44645b24217e10390215fb2086ea2e4f2031a9"],["sxgcc9h","76e06b4811a688357ac4b912172283463cfaf1b7a1f0795d274fc733a2309ba7"],["t3dsc22","5b180503866108fc210b788554bfdf02570e82a9f87754cd6e2293106d592158"],["t6gjpee","c63c1c3c34edbed309ddb56ded1c9dd788c5c49946e8af97b102a25ef1d96018"]],"rev":12,"root":"d2a524dee5ef347b313f1714a47f7bafd83f554266596e1ed4b3e52093642216","scope":"targeted:lode","signature":{"key":"ana","scheme":"ed25519","value":"PXrzXjQaaLJlv0ayxPV50e6Ae299+WJhf7/JQ271zn3xKcMFL1Rx0v+n1nQhzHuo910UWL7FNM/g781fqYKfCQ=="}} +{"at":"2026-10-11T16:30:00Z","by":"ana","doc":"hale2026harmonic","evidence":[{"kind":"crop","node":"mbtjsqv","sha256":"d0174df8972e94270655ef43c0eb55f5ebca505d76a750954c4ab5497c9d5972"},{"kind":"crop","node":"r1gacps","sha256":"f0a0b62d5ac7389403117b3bb43afe86b667ab5da752ed5ba567d6afe8c1ed6c"},{"kind":"witness","sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"}],"format":"scienting-receipt/1","id":"zaxky8c1y12tc","level":"F3","nodes":[["mbtjsqv","97c328c2e2efedd931292eeda806d3e4bad14d67cfcc324537c0d993068cfbfc"],["r1gacps","9eb77a1bebf1b2752a14c38cc8de8fe1113a6ccfd8ba77fa26d8818289867027"]],"rev":12,"root":"23e790eb479ec58ff09dd9089fd40105a96b0133f11f0742007f94c4aea49dbd","scope":"section:bzqvbhd","signature":{"key":"ana","scheme":"ed25519","value":"c/PgJ5pPidH8N7VogLrhMBjs1YGU5kayVmi0A13gxXE4pHiemSe8LdeYMlKqhYp0xXhqot58BUZHTlfo23mhBg=="}} +{"at":"2026-10-11T17:00:00Z","by":"cara","doc":"hale2026harmonic","evidence":[{"kind":"crop","node":"eajq93t","sha256":"a6785ec0618d88b9f8110c20baee0082552bdfe426c553061516e3731e93a4f6"},{"kind":"crop","node":"gqs1dcb","sha256":"309d699fd95e58c1141753dc5dec012b7f2edb008e4dad7784901ca59da07e2b"},{"kind":"crop","node":"ntr324r","sha256":"37975c8851ae00b0b943238e82e03f645d2611540ab918abc3deff186d1a952c"},{"kind":"witness","sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"}],"format":"scienting-receipt/1","id":"adtrpq41np7sd","level":"F3","nodes":[["eajq93t","42b1de7852cdc68730984fff789fe248ecd5b43198c0e7d671931ff3fe561dc3"],["gqs1dcb","5e7362eb5c7cd2db425e557982083a51c2607521b6b1f73d79d98956616965df"],["ntr324r","cda412d48dbcf59eaaa41c8698571f5d1809a7332195d3879da139cedcd007d9"]],"rev":12,"root":"34b3c1e0ac2db1b406fad92b43385dd4423abf456a8af62da2b0feff355cf482","scope":"page:2","signature":{"key":"cara","scheme":"ed25519","value":"gSCsnTovo+AU4cBC+NoLlj3MHk1B3y5ing9iR7RNzmy/fpiM4ht0feCUUQKQAC5Fh9Kq18niSBeBkZlmzOexBw=="}} +{"at":"2026-10-11T17:20:00Z","by":"cara","format":"scienting-revocation/1","id":"q0yg0w6ygwwxh","reason":"Signed against the crops of another paper.","receipt":"adtrpq41np7sd","signature":{"key":"cara","scheme":"ed25519","value":"QrUfvfDG6W3IYRgHJLfViRT7Mrg2rPnl/3axTpsAyNqIH5W4ZhwiSXT+LvlyeoMyhg91ddMukXlQ3ClVghPoBw=="}} +{"at":"2026-10-11T18:00:00Z","by":"ana","doc":"hale2026harmonic","evidence":[{"kind":"crop","node":"ed602fy","sha256":"7fa2a1c84040091116eedf97e40a0ea98021274acce50aca56948bb72ec9f03e"},{"kind":"crop","node":"nmm4md0","sha256":"522532291b05cb572194f2b2988b2787ea079a47d797b231d67f79c8144679f1"},{"kind":"crop","node":"yq0agq9","sha256":"ea20517517c397b7b414915f215576341c9e86815de4c9f6bd16e2a06185376a"},{"kind":"witness","sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"}],"format":"scienting-receipt/1","id":"gena76nkb6cnc","level":"F3","nodes":[["ed602fy","e2f0b1d093c2f38f329c16edae255aed6e913d489e730a9d4857a3c3b5040f63"],["nmm4md0","9f9c9a412cd08d0634daa3f23c63f5125c1270c13834c45c045c1a9a7452af86"],["yq0agq9","9a1c438b0f413d63b7e9f1ed7037cc6ad1665efd335baee2ef31d3d232c79552"]],"rev":12,"root":"309a04ca2376ef8d9da64e1f309dcb160fb44dc8f0233cbce3af96bf67a38fff","scope":"targeted:captions","signature":{"key":"ana","scheme":"ed25519","value":"RWrWIlEfwW4nSu+QHZgIYThDluHgP/YFnhNS1T0aFzEpmG+PQFC8zKvDGDrhskBAWfpMb7keWFZ0SXSDijvEDw=="}} +{"at":"2026-10-12T09:00:00Z","by":"ben","doc":"hale2026harmonic","evidence":[{"kind":"crop","node":"ba6xp29","sha256":"f8da39772d0f11f2ef05be9e9f26f8d5c8ef60a6c4fdd81d1e08b5f8dfa89943"},{"kind":"crop","node":"cq77erb","sha256":"414d9c94f57ac7039517d81bd915abe3d59711bb0aa8ca49e7b93b656d613b24"},{"kind":"crop","node":"f929eq9","sha256":"cd6aaea1755038f67b5c0ccbdd962defba1eb35105cceb602b5cdbc3c215f7f2"},{"kind":"crop","node":"gy4avx6","sha256":"92248b149d2c3ec39ceeff1d3373f031f6a70cd1949c6f8122fdd6ebcd62b51c"},{"kind":"crop","node":"hw8fx4r","sha256":"91fe488a266419894e767e3cc454289006c60396d89ceae4874ba26615066e5d"},{"kind":"crop","node":"j67ec9p","sha256":"ef98568b73187f04020315ab16047b8c736455c521cf67ec8c2c844ddbc03535"},{"kind":"crop","node":"mkakqg3","sha256":"711a38b76111a51d10dfa95540ec9d532af4f747c579e0ce334ddb9f2dd6245e"},{"kind":"crop","node":"nkm3xn5","sha256":"9b6fe65013a5231ebfda702637f2fa7c47155f2a2dc35d93fd9e0097ec4f7af9"},{"kind":"crop","node":"sxgcc9h","sha256":"3d7197ebb9d3256b54d773a0ed940a60c023e78a324649908f02682a3bdc66fa"},{"kind":"crop","node":"t6gjpee","sha256":"9947acdb70078a8d1fdf2ce9b654cce2eb5d20745f35370985b809e1b931de44"}],"format":"scienting-receipt/1","id":"p38t0s91trb6j","level":"F3","nodes":[["ba6xp29","c0fe6b3090e024652f05c04c236932e6e0675efdc7bd4eab880fbc609b87abb8"],["cq77erb","f9a5df8760b27e0be045ca8fac31c6f810925a1c6f5f1adbf4d57c074e0ef7b7"],["f929eq9","cd6cdb032e9b8ab712790b7181f794f6e363b7c4c96888049b59c671c1596369"],["gy4avx6","52404bd0f3b95103a0f46b59d3b6af851bcde8548fae6d349e82bc25d23a3b7e"],["hw8fx4r","e554e4381827c90595a9083fd3a16e6cc72d0b14e52b3d86104c4b42a9f101b8"],["j67ec9p","b95706fc7f64b589532af7687297469d7fd2f48443190111c6361af96b578558"],["mkakqg3","3174ecb5b11912a58c22f7069747d93753fdf0c88684ee7264dc2c0cf2ab8fe5"],["nkm3xn5","21f13b21948078f64c564334e5bb180b4495edb25a79ae32aa967986a626f3d5"],["sxgcc9h","76e06b4811a688357ac4b912172283463cfaf1b7a1f0795d274fc733a2309ba7"],["t6gjpee","c63c1c3c34edbed309ddb56ded1c9dd788c5c49946e8af97b102a25ef1d96018"]],"qa":{"errors":[],"key":"ben-spot","minimum":10,"of":"eqgbbpwb6725v","rate":"0.05","sample":["ba6xp29","cq77erb","f929eq9","gy4avx6","hw8fx4r","j67ec9p","mkakqg3","nkm3xn5","sxgcc9h","t6gjpee"],"seed":"bPQLLpnUqkuXM324VmyTGYL5CCRWO0pi+4C6mPXUe735LDjfbPhXVBUrgHJa8XQLnp48B2maxpuQKaZBaBJSBg=="},"rev":12,"root":"3676996713c1d2a28b7041d33b0a25c899cf79147aa411fdd3c2a64ae9891e3c","scope":"qa:eqgbbpwb6725v","signature":{"key":"ben","scheme":"ed25519","value":"8qXLAuKQHu14JYQM65Swzlmrkbvp8YOut7cBn9tiU3LRDnvjDgZ7I0Ll1cTcRfj2ybrDr5X9Btgq2uJk/HyRAA=="}} +{"at":"2026-10-12T09:30:00Z","by":"ben","doc":"hale2026harmonic","evidence":[{"kind":"crop","node":"ed602fy","sha256":"7fa2a1c84040091116eedf97e40a0ea98021274acce50aca56948bb72ec9f03e"},{"kind":"crop","node":"nmm4md0","sha256":"522532291b05cb572194f2b2988b2787ea079a47d797b231d67f79c8144679f1"},{"kind":"crop","node":"yq0agq9","sha256":"ea20517517c397b7b414915f215576341c9e86815de4c9f6bd16e2a06185376a"}],"format":"scienting-receipt/1","id":"qab588b6xy94y","level":"F3","nodes":[["ed602fy","e2f0b1d093c2f38f329c16edae255aed6e913d489e730a9d4857a3c3b5040f63"],["nmm4md0","9f9c9a412cd08d0634daa3f23c63f5125c1270c13834c45c045c1a9a7452af86"],["yq0agq9","9a1c438b0f413d63b7e9f1ed7037cc6ad1665efd335baee2ef31d3d232c79552"]],"qa":{"errors":[{"kind":"word","node":"nmm4md0","note":"The page prints a period the reading lacks."}],"key":"ben-spot","minimum":10,"of":"gena76nkb6cnc","rate":"0.05","sample":["ed602fy","nmm4md0","yq0agq9"],"seed":"UFsFJaDbpJfY89rfI/HAcnBiQr38m4NPBW5OHhaJqBlxDpVD26qRUXQfp4LWc4ceLyCBEjIiOitL8bdLMVEZDw=="},"rev":12,"root":"309a04ca2376ef8d9da64e1f309dcb160fb44dc8f0233cbce3af96bf67a38fff","scope":"qa:gena76nkb6cnc","signature":{"key":"ben","scheme":"ed25519","value":"DK8iLN8wrZoL4ukEQ0PMzQzdUxVD9EAAjV3xe1hES8xRqBFAquARdGd8Ve+S3rqdINNFlsCwllY5NU/zmKMHBg=="}} diff --git a/fixtures/packages/hale2026harmonic/references.jsonl b/fixtures/packages/hale2026harmonic/references.jsonl new file mode 100644 index 0000000..a1afda5 --- /dev/null +++ b/fixtures/packages/hale2026harmonic/references.jsonl @@ -0,0 +1,2 @@ +{"csl":{"DOI":"10.5555/example.ref1","author":[{"family":"Author","given":"A."},{"family":"Author","given":"B."}],"container-title":"J. Example Chem.","issued":{"date-parts":[[2001]]},"page":"345-350","type":"article-journal","volume":"12"},"label":"1","node":"zmyqtxs","resolution":{"doi":"10.5555/example.ref1","type":"doi"}} +{"csl":{"author":[{"family":"Writer","given":"C."}],"container-title":"Example Spectroscopy","issued":{"date-parts":[[2010]]},"page":"89-97","type":"article-journal","volume":"7"},"label":"2","node":"b3g86a4","resolution":{"type":"none"}} diff --git a/fixtures/packages/hale2026harmonic/roster.json b/fixtures/packages/hale2026harmonic/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/packages/hale2026harmonic/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/packages/hale2026harmonic/witnesses.json b/fixtures/packages/hale2026harmonic/witnesses.json new file mode 100644 index 0000000..737fc22 --- /dev/null +++ b/fixtures/packages/hale2026harmonic/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"qptsanv","kind":"pdf","media_type":"application/pdf","origin":{"doi":"10.5555/example.hale.2026","retrieved_at":"2026-10-01T08:00:00Z","source":"publisher"},"pages":2,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The library's subscription terms, as the team read them (fictional)."}]},"at":"2026-09-15T12:00:00Z","basis":"subscription","format":"scienting-rights/1","license":{"text":"Publisher's subscription terms (fictional)."},"uses":{"accessible-copy":"unknown","ai":{"external/local":false,"external/outside":false,"external/outside-no-retention":false,"external/tenancy":false,"internal/local":true,"internal/outside":false,"internal/outside-no-retention":"unknown","internal/tenancy":"unknown"},"quote-public":false,"read":true,"redistribute":false,"tdm":true},"valid_until":"2027-08-31T23:59:59Z"},"sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834","size":482113,"text_layer":true,"version_label":"version of record"}]} diff --git a/fixtures/packages/okafor2025open/MANIFEST.json b/fixtures/packages/okafor2025open/MANIFEST.json new file mode 100644 index 0000000..7b627b1 --- /dev/null +++ b/fixtures/packages/okafor2025open/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"e2188bfff9eded02b17ddc4f90ffb56c3f8fc5f1be2d38a03d7ae1c85cb39128","size":935},{"path":"locations.jsonl","sha256":"ce16ce5996a9e9fe9f1024ebc9d8cda5328c041ae214b3c626da10472ae3de10","size":1161},{"path":"nodes.jsonl","sha256":"0fccd6492121fb91ebd1d32487e23ca5b30ad92627e7d3a0801d77549e1a2f94","size":8669},{"path":"pages.jsonl","sha256":"d356f4a78bd2427e750943648c9d37977ac0144ff85bedc013b60d934b1501cf","size":170},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"references.jsonl","sha256":"e7ddfb86d4a079d8a8ad51fc16f1933ef64f5d6ac4244959efa9d06419f1d7d7","size":332},{"path":"witnesses.json","sha256":"7bb40440b8b04d5193600f04ba6452cb4062046652f0f924d60d6b0c5aa86876","size":1901}],"format":"scienting-package/1","key":"okafor2025open"} diff --git a/fixtures/packages/okafor2025open/document.json b/fixtures/packages/okafor2025open/document.json new file mode 100644 index 0000000..439685a --- /dev/null +++ b/fixtures/packages/okafor2025open/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":7,"nodes":15},"fidelity":{"counts":{"F0":0,"F1":0,"F2":7,"F3":0},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"okafor2025open","kind":"article","language":"en","license":{"spdx":"CC-BY-4.0","url":"https://creativecommons.org/licenses/by/4.0/"},"meta":{"DOI":"10.5555/example.okafor.2025","author":[{"family":"Okafor","given":"N."},{"family":"Lindqvist","given":"E."}],"container-title":"Open Example Letters","issued":{"date-parts":[[2025,11,20]]},"page":"e17","title":"Solvent shifts of a model carbonyl stretch","type":"article-journal","volume":"3"},"meta_hash":"b767e834ca9dda8a9e5fdff02ed8772107df058562ea9be31715ab9d7b718305","policy":"full","relations":[],"rev":0,"root":"e79c2b9373b730161ff45c6e9592c89d1e6dc6b442eee8666412911c46e61b7c","version":{"date":"2025-11-20","type":"version-of-record"},"work":{"key":"okafor2025open","same_as":["doi:10.5555/example.okafor.2025"]}} diff --git a/fixtures/packages/okafor2025open/locations.jsonl b/fixtures/packages/okafor2025open/locations.jsonl new file mode 100644 index 0000000..97cd4b5 --- /dev/null +++ b/fixtures/packages/okafor2025open/locations.jsonl @@ -0,0 +1,7 @@ +{"boxes":[[72,72,317.7,83.8]],"node":"ayava67","page":1,"page_fp":"2a37af2c78e19e5ade6c7c2f72b6095a50bea910448fc0ef932dec5663b777ff","page_label":"e17-1"} +{"boxes":[[72,85.95,224.1,97.75]],"node":"gnp31nv","page":1,"page_fp":"2a37af2c78e19e5ade6c7c2f72b6095a50bea910448fc0ef932dec5663b777ff","page_label":"e17-1"} +{"boxes":[[72,99.9,112.95,111.7]],"node":"dp00qef","page":1,"page_fp":"2a37af2c78e19e5ade6c7c2f72b6095a50bea910448fc0ef932dec5663b777ff","page_label":"e17-1"} +{"boxes":[[72,113.85,540,125.65],[72,127.8,159.75,139.6]],"node":"f28y0h1","page":1,"page_fp":"2a37af2c78e19e5ade6c7c2f72b6095a50bea910448fc0ef932dec5663b777ff","page_label":"e17-1"} +{"boxes":[[72,141.75,540,153.55],[72,155.7,241.65,167.5]],"node":"t93z0t1","page":1,"page_fp":"2a37af2c78e19e5ade6c7c2f72b6095a50bea910448fc0ef932dec5663b777ff","page_label":"e17-1"} +{"boxes":[[72,169.65,522.45,181.45]],"node":"bxse740","page":1,"page_fp":"2a37af2c78e19e5ade6c7c2f72b6095a50bea910448fc0ef932dec5663b777ff","page_label":"e17-1"} +{"boxes":[[72,183.6,463.95,195.4]],"node":"anaghz2","page":1,"page_fp":"2a37af2c78e19e5ade6c7c2f72b6095a50bea910448fc0ef932dec5663b777ff","page_label":"e17-1"} diff --git a/fixtures/packages/okafor2025open/nodes.jsonl b/fixtures/packages/okafor2025open/nodes.jsonl new file mode 100644 index 0000000..3f48473 --- /dev/null +++ b/fixtures/packages/okafor2025open/nodes.jsonl @@ -0,0 +1,15 @@ +{"align_key":"8cd5cb4da02aeefdd10abbb18250ef83a237cb7f16db3cf9d29e68e80e7e4ea7","id":"ktqsp8e","kind":"document","match_hash":"657745125e6254f97d45f126d142e3b02a5cc3a2f3724eb26853d958f5058bc7","node_hash":"e79c2b9373b730161ff45c6e9592c89d1e6dc6b442eee8666412911c46e61b7c","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"50ccfbc9b01871b08bab598d19339143954f4269c8bc74569b6cdd1c925f706f"} +{"align_key":"1f61427c5da3340c67fd917d0058b4524fdb933d9908c1e94498be77d5554a0a","id":"gteqt80","kind":"front","match_hash":"5e9f2da54785485697d24dc14b137622e848c1db262aa22e0d391dbafd422f71","node_hash":"efedca8a0e93a7d83fe84a3f66e2e8895e531d2091eb2bc00c36b4f5424d4945","ord":0,"own_hash":"0167516d70e0a89263e33c0f9be5ca4443113347814530257a60d43910af71b6","parent":"ktqsp8e","text_hash":"5e9f2da54785485697d24dc14b137622e848c1db262aa22e0d391dbafd422f71"} +{"align_key":"2326122dd72e54bbe6f47e4fb961706b6d0d0cd33f9514619eb12031c7b31451","id":"vm5c31a","kind":"title","match_hash":"1a652d752f6450bff4171a9477781fceb2e7a8329d3407a8db2ed95fcc75eea7","node_hash":"548af4b902dce58ed70f7ba0b77469f0129c52d8609c81fe822620e5d031c0be","ord":0,"own_hash":"c22e4fc822618a3a2c774cc9ea6fc5fc5b34463724257cfa4fd33022d4e35165","parent":"gteqt80","text_hash":"1a652d752f6450bff4171a9477781fceb2e7a8329d3407a8db2ed95fcc75eea7"} +{"align_key":"2326122dd72e54bbe6f47e4fb961706b6d0d0cd33f9514619eb12031c7b31451","content":[{"kind":"text","text":"Solvent shifts of a model carbonyl stretch"}],"fidelity":"F2","id":"ayava67","kind":"sentence","match_hash":"1a652d752f6450bff4171a9477781fceb2e7a8329d3407a8db2ed95fcc75eea7","node_hash":"526621b446f65afcd56e8986745b6ffc9425831f39cc7889a8e04416b943848f","ord":0,"own_hash":"bbb9b0384479c456c6ed1fae926b731e302f09fa5017deddd0dd463dd7d11685","parent":"vm5c31a","prov":{"backend":"jats reader (illustrative)","corroborated_by":["ve93xh4"],"witnesses":["wgsxda1","ve93xh4"]},"text_hash":"1a652d752f6450bff4171a9477781fceb2e7a8329d3407a8db2ed95fcc75eea7"} +{"align_key":"c23ec91a29b63dfd088d0836b8849e2d584353575cb3b437297a77f49409150c","content":[{"kind":"text","text":"N. Okafor and E. Lindqvist"}],"fidelity":"F2","id":"gnp31nv","kind":"authors","match_hash":"11c23752a905b072cb2e593e841f40dc9960a667b6e2e6c2b1664bba62e94017","node_hash":"58e0477403095db24b1e0abcda04e36ddec635a8af776ed3f994c6900f28ddef","ord":1,"own_hash":"8290fe97e6d51800e6291cc181be1a27029c6baf672e063af44bcf4a06cef230","parent":"gteqt80","prov":{"backend":"jats reader (illustrative)","corroborated_by":["ve93xh4"],"witnesses":["wgsxda1","ve93xh4"]},"text_hash":"11c23752a905b072cb2e593e841f40dc9960a667b6e2e6c2b1664bba62e94017"} +{"align_key":"9cb1ae8215cb626331b6848effd36fcbbfb5fa23d34edf3e8c544ff697a822af","attrs":{"level":1},"id":"jhxrhy9","kind":"section","label":"1","match_hash":"d06ee8487e6453f4f68c92209c004917843c1d35b23749ae798a57d3b1e44c3a","node_hash":"b41857e0d0a400fe5ce9cb669772a6e3894f9003f77318e5dae8985a6d56b86a","ord":1,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ktqsp8e","text_hash":"83d46654d1c0ccab24ea7cf3e3de686cbf0e6f4f4fc269d0dc24e49a5a225c2e"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"q3h66j6","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"jhxrhy9","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"dp00qef","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"q3h66j6","prov":{"backend":"jats reader (illustrative)","corroborated_by":["ve93xh4"],"witnesses":["wgsxda1","ve93xh4"]},"text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"403a19fa57756a120ee49a89500796a4de013c2f5d9330cc7f9b23a4bb0f4cab","id":"zf2mszf","kind":"paragraph","match_hash":"8e4c2d662fbfa2bacce17400a3f377fc0b680c67ca551e81599dbfa0877e7df6","node_hash":"8a40115bc138be4da783042a9837c85f218761077fe62acb1a8dfb20fca33ab4","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"jhxrhy9","text_hash":"d980dce1880ef9991f67ff907772c3965848b89c239d2582ff722d0b77b44515"} +{"align_key":"320bf26bc5bfdc64ae68579ca9db4bbe63894954a8f9bd8110516ba724e955e6","content":[{"kind":"text","text":"The carbonyl band of the model ketone moves from 1718 cm⁻¹ in hexane to 1702 cm⁻¹ in methanol."},{"kind":"cite","refs":["anaghz2"],"text":"1"}],"fidelity":"F2","id":"f28y0h1","kind":"sentence","match_hash":"14a204207b562594926a49f9ccc9edb565ebf95119050960cf3516d3939e5c02","node_hash":"3fabdf98aa96bd63fb546a9846be01bce1c8e7947cc1dbf464b95b0d4cbd60e2","ord":0,"own_hash":"641fcb9e12bfbe78b766476490336940217acfc7a28f89d1225bfd999935cb66","parent":"zf2mszf","prov":{"backend":"jats reader (illustrative)","corroborated_by":["ve93xh4"],"witnesses":["wgsxda1","ve93xh4"]},"text_hash":"caf74b1fc67f6225012f3b073e4351dbbee756e1548524876821da03726585e9"} +{"align_key":"ee6b1f09db1c2c1ecdd472a7b977c599c9358a99cdb5686ac567b87f10563058","content":[{"kind":"text","text":"The shift scales with the solvent's hydrogen-bond donor strength, "},{"kind":"math","notation":"tex","source":"\\alpha"},{"kind":"text","text":", with a slope of "},{"kind":"math","notation":"tex","source":"-17 \\pm 2"},{"kind":"text","text":" cm⁻¹."}],"fidelity":"F2","id":"t93z0t1","kind":"sentence","match_hash":"b91a25c2a26df0fd2b0f6e078d51205f0bf1ed800d9e186596a1f17635560c61","node_hash":"4552064aad475c91e09fac26401c018ce415a3438e8e36b73e553fa6c0b824b4","ord":1,"own_hash":"09dab11852510630aea3d60647504643982d9fe74d7971fddc6db8fd7186e711","parent":"zf2mszf","prov":{"backend":"jats reader (illustrative)","corroborated_by":["ve93xh4"],"witnesses":["wgsxda1","ve93xh4"]},"text_hash":"61e70f23d27be7bf6f6a55261aeef9876f186161790f2d77e01ce8a801bb82b7"} +{"align_key":"48406493bc8dce5299b7421aa8721c79472095541115bd81dacc2336c9ede87e","content":[{"kind":"text","text":"Two outliers, both fluorinated alcohols, fall below the line by about 4 cm⁻¹."}],"fidelity":"F2","id":"bxse740","kind":"sentence","match_hash":"628ecf0b3c3c5174f288fbcc2ff8e77d785b917f8883d4b060b8c752d6f08e1b","node_hash":"13196be2e988bbc5d112a7707c2e9a03a17a52b7b0cac1ca370496460521f59f","ord":2,"own_hash":"01df573737002d488a329f9e93ef7a1c78f5732e9cfdf56d422c396d6c361858","parent":"zf2mszf","prov":{"backend":"jats reader (illustrative)","corroborated_by":["ve93xh4"],"witnesses":["wgsxda1","ve93xh4"]},"text_hash":"87c9e583aa8ae555364746a3bc2692eb6deba81b0d555dff4063beb6ffa7069c"} +{"align_key":"cfd764699b7f3258e195e70e4d43863f8f3e82155ccc4228958083b30d9bd714","id":"em2g8q9","kind":"back","match_hash":"27595c7766cb1d3efcda047460eea43b2e5769f7fe8d9dfdba9953f60306f294","node_hash":"0b043ed2a532d458c5e18467fb9deb73e2b6becd7b98afb78aafc050fc9419b2","ord":2,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ktqsp8e","text_hash":"9642d5171c6ae6c4137f0d039798b75c0ddeb397216f23f0b64abb706ae0240d"} +{"align_key":"cfd764699b7f3258e195e70e4d43863f8f3e82155ccc4228958083b30d9bd714","id":"jg9s4wr","kind":"references","match_hash":"27595c7766cb1d3efcda047460eea43b2e5769f7fe8d9dfdba9953f60306f294","node_hash":"c49cf7f4016112276ca30802dd302729b2042a1bb8b1ef2106cf6d3ff02cbd91","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"em2g8q9","text_hash":"9642d5171c6ae6c4137f0d039798b75c0ddeb397216f23f0b64abb706ae0240d"} +{"align_key":"cfd764699b7f3258e195e70e4d43863f8f3e82155ccc4228958083b30d9bd714","content":[{"kind":"text","text":"1. P. Example and Q. Example, Spectrochim. Example 2019, 30, 11–19."}],"fidelity":"F2","id":"anaghz2","kind":"reference","label":"1","match_hash":"27595c7766cb1d3efcda047460eea43b2e5769f7fe8d9dfdba9953f60306f294","node_hash":"a17b597cf7e8bbb3dfa7e56953c78be82eb5074b4864bfd7098d2b75339d1a0a","ord":0,"own_hash":"2e577487892c6e75c10a22a75409f7ddba18b578d48c3994f751048d75a3941d","parent":"jg9s4wr","prov":{"backend":"jats reader (illustrative)","corroborated_by":["ve93xh4"],"witnesses":["wgsxda1","ve93xh4"]},"text_hash":"9642d5171c6ae6c4137f0d039798b75c0ddeb397216f23f0b64abb706ae0240d"} diff --git a/fixtures/packages/okafor2025open/pages.jsonl b/fixtures/packages/okafor2025open/pages.jsonl new file mode 100644 index 0000000..a629ffd --- /dev/null +++ b/fixtures/packages/okafor2025open/pages.jsonl @@ -0,0 +1 @@ +{"page":1,"page_fp":"2a37af2c78e19e5ade6c7c2f72b6095a50bea910448fc0ef932dec5663b777ff","page_label":"e17-1","size":[595.28,841.89],"text_layer":true,"witness":"ve93xh4"} diff --git a/fixtures/packages/okafor2025open/provenance.json b/fixtures/packages/okafor2025open/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/packages/okafor2025open/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/packages/okafor2025open/references.jsonl b/fixtures/packages/okafor2025open/references.jsonl new file mode 100644 index 0000000..23ba8af --- /dev/null +++ b/fixtures/packages/okafor2025open/references.jsonl @@ -0,0 +1 @@ +{"csl":{"DOI":"10.5555/example.ref3","author":[{"family":"Example","given":"P."},{"family":"Example","given":"Q."}],"container-title":"Spectrochim. Example","issued":{"date-parts":[[2019]]},"page":"11-19","type":"article-journal","volume":"30"},"label":"1","node":"anaghz2","resolution":{"doi":"10.5555/example.ref3","type":"doi"}} diff --git a/fixtures/packages/okafor2025open/witnesses.json b/fixtures/packages/okafor2025open/witnesses.json new file mode 100644 index 0000000..ade496b --- /dev/null +++ b/fixtures/packages/okafor2025open/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"wgsxda1","kind":"jats","media_type":"application/xml","origin":{"doi":"10.5555/example.okafor.2025","source":"repository"},"rights":{"asserted_by":{"by":"crossref","evidence":[{"doi":"10.5555/example.okafor.2025","kind":"crossref-license","url":"https://creativecommons.org/licenses/by/4.0/"}]},"at":"2026-09-15T12:00:00Z","basis":"open-license","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0","url":"https://creativecommons.org/licenses/by/4.0/"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"54867ad507a8ba202b027c3e591761dabc57f9486c2e53c37528a8b11614af2e","size":38211,"version_label":"version of record"},{"id":"ve93xh4","kind":"pdf","media_type":"application/pdf","origin":{"doi":"10.5555/example.okafor.2025","source":"publisher"},"pages":1,"rights":{"asserted_by":{"by":"crossref","evidence":[{"doi":"10.5555/example.okafor.2025","kind":"crossref-license","url":"https://creativecommons.org/licenses/by/4.0/"}]},"at":"2026-09-15T12:00:00Z","basis":"open-license","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0","url":"https://creativecommons.org/licenses/by/4.0/"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"7f7247d890babeb09940267a977cb84b9c81fdc5905bab0515d20fe2fbf2498c","size":201977,"text_layer":true,"version_label":"version of record"}]} diff --git a/fixtures/packages/smithlab2027charges/MANIFEST.json b/fixtures/packages/smithlab2027charges/MANIFEST.json new file mode 100644 index 0000000..e351a36 --- /dev/null +++ b/fixtures/packages/smithlab2027charges/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"ca802f491901cb6c0ea6206b5ab61e05c06524def0182cff0478893823b25acc","size":665},{"path":"nodes.jsonl","sha256":"fd3f856a5dc20e7e6d5114da38d2cfffa35487d856d5221bf00c19195438de2c","size":8290},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"references.jsonl","sha256":"41551252af7b5fef0ba2a22dcc1f4a9512911803f0eda9d5e7c5a9f223fa48c7","size":339},{"path":"witnesses.json","sha256":"badd17f82e6cc4aa8d116d2056d10b868fbf6978fa47947d89404c458b6a532c","size":766}],"format":"scienting-package/1","key":"smithlab2027charges"} diff --git a/fixtures/packages/smithlab2027charges/document.json b/fixtures/packages/smithlab2027charges/document.json new file mode 100644 index 0000000..91683f2 --- /dev/null +++ b/fixtures/packages/smithlab2027charges/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":7,"nodes":15},"fidelity":{"counts":{"F0":0,"F1":0,"F2":7,"F3":0},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"smithlab2027charges","kind":"draft","language":"en","license":{"spdx":"CC-BY-4.0"},"meta":{"author":[{"family":"Writer","given":"A."}],"title":"Fixed charges in biomolecular force fields","type":"report"},"meta_hash":"9afadf8f6a57732487cfb5519e1cf83eb0fb858ae97716f9faeed3f079075e54","policy":"full","relations":[],"rev":0,"root":"e81a85416809054bdf7f07894399493c1b5a4c04058f0bd5ced903feeda2f131","store":"smithlab","version":{"seq":3,"type":"draft"},"work":{"key":"smithlab2027charges","same_as":[]}} diff --git a/fixtures/packages/smithlab2027charges/nodes.jsonl b/fixtures/packages/smithlab2027charges/nodes.jsonl new file mode 100644 index 0000000..09ca6ab --- /dev/null +++ b/fixtures/packages/smithlab2027charges/nodes.jsonl @@ -0,0 +1,15 @@ +{"align_key":"1a2bb9eac1e4dc9f227cf4559731b2057dc2a9a2b9d6b54889a56d91cd87a782","id":"y1rvdk6","kind":"document","match_hash":"20454adf8e339b779917cfcb20d652557204568101ce947616928ef833350e2b","node_hash":"e81a85416809054bdf7f07894399493c1b5a4c04058f0bd5ced903feeda2f131","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"beece988a027b059e0ff0a0097337b6fe347e680acdfe8e72e43452554fac195"} +{"align_key":"37108c46d3691a0fcb4a378eda3fe2cd7ab3843f22cfcc34d486d069123ea9a7","id":"skcs642","kind":"front","match_hash":"3d4535506043f6f04de395aeb16ea50f7f26f2ab341023fe1883f97c2749d406","node_hash":"e06b854f1015214643f375533f258b90470f06a08ac60a13b66b12dc7736bb39","ord":0,"own_hash":"0167516d70e0a89263e33c0f9be5ca4443113347814530257a60d43910af71b6","parent":"y1rvdk6","text_hash":"3d4535506043f6f04de395aeb16ea50f7f26f2ab341023fe1883f97c2749d406"} +{"align_key":"1c346b0b6df77616e3db9eebcff5d56ccc123715374eb60a0df1a6cbe1e059ec","id":"zc9mnj9","kind":"title","match_hash":"d3c3de666d0290878de3949bc0e0ffcaef965c66d2b61e81a5e615e26a2997df","node_hash":"25cb59151aa6bb80d785263e14ffb762938f1a0991ff3a069a1fc6dc6fd42fc8","ord":0,"own_hash":"c22e4fc822618a3a2c774cc9ea6fc5fc5b34463724257cfa4fd33022d4e35165","parent":"skcs642","text_hash":"d3c3de666d0290878de3949bc0e0ffcaef965c66d2b61e81a5e615e26a2997df"} +{"align_key":"1c346b0b6df77616e3db9eebcff5d56ccc123715374eb60a0df1a6cbe1e059ec","content":[{"kind":"text","text":"Fixed charges in biomolecular force fields"}],"fidelity":"F2","id":"yc2kbpk","kind":"sentence","match_hash":"d3c3de666d0290878de3949bc0e0ffcaef965c66d2b61e81a5e615e26a2997df","node_hash":"a859025788a7d67363ba278fd6d67e4349ccb9bccb4c215f60271b3b70b0d549","ord":0,"own_hash":"102b7f337262638415717e077a41d3a4ae579b32a37c837c4ab404a075bf347f","parent":"zc9mnj9","prov":{"backend":"typst reader (illustrative)","witnesses":["tszzg52"]},"text_hash":"d3c3de666d0290878de3949bc0e0ffcaef965c66d2b61e81a5e615e26a2997df"} +{"align_key":"6bb0f8a42947682adacb47add8ac5d59c3d49f02ee275e8d390acab500b441e1","content":[{"kind":"text","text":"A. Writer"}],"fidelity":"F2","id":"vahw0cc","kind":"authors","match_hash":"cb38b0c8294dc57d6923a5aab72e1093289f2efbb69293d1f6f5702536a54720","node_hash":"282f0d59e22716e1c28ed5de02bf0729c309bec17bb2ab59c7cb2937c2dad1c0","ord":1,"own_hash":"f1fc7a0ac9b744d5f99583296e8a980e52f80a2a398f240803d457d68a124973","parent":"skcs642","prov":{"backend":"typst reader (illustrative)","witnesses":["tszzg52"]},"text_hash":"cb38b0c8294dc57d6923a5aab72e1093289f2efbb69293d1f6f5702536a54720"} +{"align_key":"2ae14f38f7c9c72752502a2766e9ac856f477479fe1456b47d2ef880f17e8eb4","attrs":{"level":1},"id":"p687hqb","kind":"section","label":"1","match_hash":"34e0c5261e9055e0fa15b1e1c95e2c6cf8f55f6a9fa0177f6dd36f09410864ea","node_hash":"8201eaa76522e6e46697ca2b3ca1c10f2cad99925c12c998cb0ed68c6d14ebe4","ord":1,"own_hash":"78563e96f51db1954d3fabe08f3748956b564c87ba4c8f7954bf747545a37fcd","parent":"y1rvdk6","text_hash":"86a59f6424a18898cc62dc1413ad12a0cc2c8dfbd84d218c43316bc8659fddf2"} +{"align_key":"d3db5338aae140c5cc04ac37690aa4f98041e14a042bc6473d54ecda8d95f93e","id":"vzw6fvz","kind":"heading","match_hash":"b605350bc00209520b7cd8f546322663356ba630708f71bbf30aead6b3dd608e","node_hash":"c7288f33d2cb2ac9b9c146dabd403d2e64e793418bd31ac14802349543ac84c8","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"p687hqb","text_hash":"b605350bc00209520b7cd8f546322663356ba630708f71bbf30aead6b3dd608e"} +{"align_key":"d3db5338aae140c5cc04ac37690aa4f98041e14a042bc6473d54ecda8d95f93e","content":[{"kind":"text","text":"Introduction"}],"fidelity":"F2","id":"chy7qty","kind":"sentence","match_hash":"b605350bc00209520b7cd8f546322663356ba630708f71bbf30aead6b3dd608e","node_hash":"8a2293448ea48f2d3e279e609965f34443fae62b24b6fa13524f14a324749285","ord":0,"own_hash":"7c40e5ddd02d461a4ee50cde05532932e1d737ab3bc74b722cecf16cc6ffe59b","parent":"vzw6fvz","prov":{"backend":"typst reader (illustrative)","witnesses":["tszzg52"]},"text_hash":"b605350bc00209520b7cd8f546322663356ba630708f71bbf30aead6b3dd608e"} +{"align_key":"e9f8aaa4f05b10a153d268295a96c6adb2c39164a98b93eb1927e00838afe1fc","id":"m8zgjp8","kind":"paragraph","match_hash":"e506663279fb3bebf3612dc69a36f5e090228abc0197f5228d4f0bd4abd47812","node_hash":"5fe71c1ab852548c0ad06613c30e9f9cb0af162592589c7484c567c20101a114","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"p687hqb","text_hash":"844954fa39d218228b947367bc95f21c449b4d70d1521a7f016e308643e6cf48"} +{"align_key":"7dc562c54f1b1cc46e472838c4b2d7c97b3e1b4d39172628d6607b0f2d313c3e","content":[{"kind":"text","text":"The bond term is harmonic in the bond length."}],"fidelity":"F2","id":"s0wajte","kind":"sentence","match_hash":"8f22f3f58beb618723a14dd8fee8caaeb5cef6b26f43d88a5ddb4ff42f86d63e","node_hash":"dd438a68616e63fd1cd5050d308779af58dfed2b4d43cc5a4bbab3fc8d4f2bcb","ord":0,"own_hash":"46dfbddc0e456a2b7f4105b8d3636220ff9145acccf3bdf81a206f0b84f95b63","parent":"m8zgjp8","prov":{"backend":"typst reader (illustrative)","witnesses":["tszzg52"]},"text_hash":"8f22f3f58beb618723a14dd8fee8caaeb5cef6b26f43d88a5ddb4ff42f86d63e"} +{"align_key":"81422dae1385acfea463f7b7c75962de0bf92671d970a6ae9643763a8f87cd7f","content":[{"kind":"text","text":"Its constants come from a two-step fit "},{"kind":"xref","target":"hale2026harmonic#r1gacps","text":"(Hale and Osei, Table 1)"},{"kind":"text","text":"."},{"kind":"cite","refs":["ag4knwr"],"text":"1"}],"fidelity":"F2","id":"y0mc7rb","kind":"sentence","match_hash":"fe82fa8560942e052e31d9b18cc8d3a9ba54ce01d91b66538ded6ff682a4e885","node_hash":"ad7145057fb81410d1e8bdfd37cefb9239eae24643be7937045d83dafe82702f","ord":1,"own_hash":"cffc15fe3e5599e65761b690465d1617136dfd75907d178169570b0ea5fe9fe2","parent":"m8zgjp8","prov":{"backend":"typst reader (illustrative)","witnesses":["tszzg52"]},"text_hash":"0d5b27a20da22922ba0c5b65e06581a09d60b899e6daddc63b0e9c1dd3819055"} +{"align_key":"fae2fe63ef00f3826f525b2fd7f5c29824c06c1461b0a648927598f1efc84bc0","content":[{"kind":"text","text":"In that fit the energy is "},{"kind":"math","notation":"typst","source":"E = K_r (r - r_\"eq\")^2"},{"kind":"text","text":", up to a constant factor."}],"fidelity":"F2","id":"m13jn76","kind":"sentence","match_hash":"9b297e00b7348c2df4c6b12f67b2f879217a0d71e1be382fc8a4f6bd7439ddd0","node_hash":"18b4b664473aeccb797c3c52b0d3fc3c37a33593d3aca32640acdb40161fa3e2","ord":2,"own_hash":"7ae59942b690f78ed24570ba25764a8b13239067437c6546622ebe701d55aee1","parent":"m8zgjp8","prov":{"backend":"typst reader (illustrative)","witnesses":["tszzg52"]},"text_hash":"3873ff52fe20b52be605c10c11e78b24bcabb05c8f725aeb4820c23428631509"} +{"align_key":"a7226a2c68503d064f16cae87f6e01d25e5c75664bc8dee2d68ee2dc8c9f0c65","id":"bwhx52d","kind":"back","match_hash":"5333f67a9eca4bf08b7c5bd643168084dddf40c175d8620dad293ff976a0ca31","node_hash":"a42481d70d840a9e15c3a5c31b9bfe503a78633c6b6431d3dc84dcd21b2f3019","ord":2,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"y1rvdk6","text_hash":"b652c2e642345a7363119a8e2b95154e29eee21a3dacefc147a9cc6cd1731316"} +{"align_key":"a7226a2c68503d064f16cae87f6e01d25e5c75664bc8dee2d68ee2dc8c9f0c65","id":"mz0thf9","kind":"references","match_hash":"5333f67a9eca4bf08b7c5bd643168084dddf40c175d8620dad293ff976a0ca31","node_hash":"f25fb824a77ea0b61566aa32083103f6045473eeea053361f16d15127143e7e4","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bwhx52d","text_hash":"b652c2e642345a7363119a8e2b95154e29eee21a3dacefc147a9cc6cd1731316"} +{"align_key":"a7226a2c68503d064f16cae87f6e01d25e5c75664bc8dee2d68ee2dc8c9f0c65","content":[{"kind":"text","text":"1. R. Hale and M. Osei, J. Example Chem. 2026, 14, 101–109."}],"fidelity":"F2","id":"ag4knwr","kind":"reference","label":"1","match_hash":"5333f67a9eca4bf08b7c5bd643168084dddf40c175d8620dad293ff976a0ca31","node_hash":"88c4043a1c30e4bec8f9fdbdd98922289d3f4224168da680d1582b96743ac053","ord":0,"own_hash":"6dc3f27fb4a4d7176f24c9de291095202c357030c173f1f9f2d9295929ae5f84","parent":"mz0thf9","prov":{"backend":"typst reader (illustrative)","witnesses":["tszzg52"]},"text_hash":"b652c2e642345a7363119a8e2b95154e29eee21a3dacefc147a9cc6cd1731316"} diff --git a/fixtures/packages/smithlab2027charges/provenance.json b/fixtures/packages/smithlab2027charges/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/packages/smithlab2027charges/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/packages/smithlab2027charges/references.jsonl b/fixtures/packages/smithlab2027charges/references.jsonl new file mode 100644 index 0000000..9fed3ac --- /dev/null +++ b/fixtures/packages/smithlab2027charges/references.jsonl @@ -0,0 +1 @@ +{"csl":{"DOI":"10.5555/example.hale.2026","author":[{"family":"Hale","given":"R."},{"family":"Osei","given":"M."}],"container-title":"J. Example Chem.","issued":{"date-parts":[[2026]]},"page":"101-109","type":"article-journal","volume":"14"},"label":"1","node":"ag4knwr","resolution":{"doc":"smithlab/hale2026harmonic","type":"document"}} diff --git a/fixtures/packages/smithlab2027charges/witnesses.json b/fixtures/packages/smithlab2027charges/witnesses.json new file mode 100644 index 0000000..c1f4b52 --- /dev/null +++ b/fixtures/packages/smithlab2027charges/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"tszzg52","kind":"typst","media_type":"application/zip","origin":{"source":"team"},"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"aacfff02894cb87cfdb6ed973241ed30a5b59f380663fb264b14b4e06e1a3725","size":4211,"version_label":"draft 3"}]} diff --git a/fixtures/packages/tiny2026example/MANIFEST.json b/fixtures/packages/tiny2026example/MANIFEST.json new file mode 100644 index 0000000..0c18092 --- /dev/null +++ b/fixtures/packages/tiny2026example/MANIFEST.json @@ -0,0 +1 @@ +{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"20a7d6ba83bf42a87e44f3b3f96bfb16ff545b199d82e54d3c17989e465281df","size":555},{"path":"nodes.jsonl","sha256":"ffeffbf15cc9fe8182a31ef0bac32c1aef8c7a119706ac1e8a55aad218d0622c","size":11295},{"path":"provenance.json","sha256":"1d41f5d5bf2bd5e9f4c6d7a4c3ff6e34d9e15a2e9f0004b2d110609f929069b8","size":228},{"path":"receipts.jsonl","sha256":"c5b25e8718f17ac81d34afa6102b2789e2155f6a5462a50f16ab1ba744fbf708","size":2180},{"path":"references.jsonl","sha256":"bb5445037c28bf5fde215b4b831c29327dec6dd88259e2d53aabb995f2fdb98f","size":60},{"path":"roster.json","sha256":"219f5b34ca3a60cbee8233ea0304ad3066df93591ab8f959c80c1122243b1397","size":861},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026example"} diff --git a/fixtures/packages/tiny2026example/document.json b/fixtures/packages/tiny2026example/document.json new file mode 100644 index 0000000..6512265 --- /dev/null +++ b/fixtures/packages/tiny2026example/document.json @@ -0,0 +1 @@ +{"counts":{"leaves":10,"nodes":22},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"scheme":"plain"},"key":"tiny2026example","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"title":"A tiny example"},"meta_hash":"d0d471264d5e885f91428c8714aa04598b150f07732fef31f310c31fdc91aed6","policy":"full","relations":[],"rev":0,"root":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","version":{"type":"version-of-record"},"work":{"key":"tiny2026example","same_as":[]}} diff --git a/fixtures/packages/tiny2026example/nodes.jsonl b/fixtures/packages/tiny2026example/nodes.jsonl new file mode 100644 index 0000000..88fece2 --- /dev/null +++ b/fixtures/packages/tiny2026example/nodes.jsonl @@ -0,0 +1,22 @@ +{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"} +{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"} +{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"} +{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"} +{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"} +{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"} +{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"} +{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"} +{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"} +{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"} +{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"} +{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"} +{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} +{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"} diff --git a/fixtures/packages/tiny2026example/provenance.json b/fixtures/packages/tiny2026example/provenance.json new file mode 100644 index 0000000..f2c63d9 --- /dev/null +++ b/fixtures/packages/tiny2026example/provenance.json @@ -0,0 +1 @@ +{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"varve-spec tools/build.py"}],"tools":[{"name":"varve-spec tools/build.py","version":"0.1.0"}]} diff --git a/fixtures/packages/tiny2026example/receipts.jsonl b/fixtures/packages/tiny2026example/receipts.jsonl new file mode 100644 index 0000000..311b3ab --- /dev/null +++ b/fixtures/packages/tiny2026example/receipts.jsonl @@ -0,0 +1 @@ +{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026example","evidence":[{"kind":"crop","node":"cjkdv61","sha256":"6e12bbc22302e7b635b18df516ad91e1a3ba23cc98e303cffd9f04925ca4e21c"},{"kind":"crop","node":"jss11hp","sha256":"09a6be7a365bc435b545392abd5cd35d3d4cfb1954cb8a72e357c2a349b4c7c9"},{"kind":"crop","node":"k69qp1x","sha256":"e136e117a2cceaff1b8133b8d5c9cf079eb902c8adf0de1585bfe1d040bd39f3"},{"kind":"crop","node":"pd32xxr","sha256":"27b56093c27a4356ff2d21dd0e3d944f9ffef1dcec1e9b536341e5a1e67c9965"},{"kind":"crop","node":"qrvfgfb","sha256":"1b702389a8acd28e0a691a1d12f0cfff18cfdc25338018e9d45e670ec7280a39"},{"kind":"crop","node":"tn1vrf0","sha256":"e80437c7d4dd642527dbffd5f221a0b5d3e4fded4f02d901aafb6a77e782ce2c"},{"kind":"crop","node":"v43b2r1","sha256":"3039d88c2df8d0a934de6818297f9f0e3da8b1ab2a20204d77050543ee82a5a7"},{"kind":"crop","node":"w1dkdqd","sha256":"7650611ebd6f085066b2d9c2556faa33cc1389d7fb9ec762d909d3db588eacbf"},{"kind":"crop","node":"whq15cf","sha256":"7e136414636ea5bffe8958b5cf895fb52defa77050e0e444d45bbb0ecbcd84f5"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"kmxw2ekgx2ek4","level":"F3","nodes":[["cjkdv61","e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078"],["jss11hp","ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78"],["k69qp1x","413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf"],["pd32xxr","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["qrvfgfb","a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56"],["tn1vrf0","ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6"],["v43b2r1","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["w1dkdqd","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["whq15cf","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"c8716a570ed36851723b0a8f4caf35e05adce12314315a40355eb5dbded00cc2","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"KGXi9M1m87Nh7GhPoI9GJA2Rabn2VxhVqgg/2JsXWkauqjFi11BoVhnmCztMVEQH74x3qNJFxU3g9ReMv7o6Bg=="}} diff --git a/fixtures/packages/tiny2026example/references.jsonl b/fixtures/packages/tiny2026example/references.jsonl new file mode 100644 index 0000000..4125be8 --- /dev/null +++ b/fixtures/packages/tiny2026example/references.jsonl @@ -0,0 +1 @@ +{"label":"1","node":"w1dkdqd","resolution":{"type":"none"}} diff --git a/fixtures/packages/tiny2026example/roster.json b/fixtures/packages/tiny2026example/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/packages/tiny2026example/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/packages/tiny2026example/witnesses.json b/fixtures/packages/tiny2026example/witnesses.json new file mode 100644 index 0000000..a7b09bb --- /dev/null +++ b/fixtures/packages/tiny2026example/witnesses.json @@ -0,0 +1 @@ +{"witnesses":[{"id":"nmfryke","kind":"pdf","media_type":"application/pdf","origin":{"source":"author"},"pages":1,"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The team's own draft."}]},"at":"2026-09-15T12:00:00Z","basis":"own-work","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},"sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21","size":1000}]} diff --git a/fixtures/records/anchor-cell.json b/fixtures/records/anchor-cell.json new file mode 100644 index 0000000..94bebe9 --- /dev/null +++ b/fixtures/records/anchor-cell.json @@ -0,0 +1 @@ +{"context":{"column_path":["Set A","$K_r$ (kcal mol⁻¹ Å⁻²)"],"row_path":["Bond parameters","CT–CT"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"nkm3xn5","node_hash":"21f13b21948078f64c564334e5bb180b4495edb25a79ae32aa967986a626f3d5","own_hash":"2937e2a6f14cfebd4ffd20e3d514e5cbbf0626a5c0089b7cbea817ef20782b3d","quote":{"exact":"310.0"},"rev":12,"store":"smithlab"} diff --git a/fixtures/records/anchor-keyed.json b/fixtures/records/anchor-keyed.json new file mode 100644 index 0000000..7c20af1 --- /dev/null +++ b/fixtures/records/anchor-keyed.json @@ -0,0 +1 @@ +{"context":{"column_path_mac":["8de5d9cfdf71c50b161f357ab526bc7ffadd407c49c642a10112bb41cc4e1bc1","31824d3d0594c075074ff3a88e4c571e1f856218179a809f4f69bd5891ee7ff8"],"row_path_mac":["1db463578fc748d9686a5a1355c2a08086f4f331b546ec3273dd5e49ff1d178d","74bdccbc71693a4f8046f2e92bc477ff04fc5e04a8998e3ee189ba6b72b971e0"],"table_label_mac":"6943d614b69c7b2458c337ead13591262e932934151c27862ec0d47e4d560641"},"doc":"hale2026harmonic","format":"scienting-anchor/1","keyed":{"context":"layer:smithlab/kp4m2x7q","pages":["9dd865c7a19b44dc97a5d236859ed79174b25b72a5781d8df4f091d096de8908","1feb6882031349ca5eee822557bab0b6b0436a2d132ae8ca03babac2ff1948b8"],"scheme":"hkdf-pages"},"kind":"cell","node":"nkm3xn5","node_hash":"3cc6c2e26b027c5ed5b258c225daba349662315e3a0b3999346b61e580acdc4e","own_hash":"f7f3e9f91b3b20d5f9cd3e6704b22e5173f3464ddf2a78e7d8c80488e71a6443","quote":{"length":5,"mac":"0d8d4fcd55f1a4cfd7f254d597b7a5777b8865eb371283c03527ac8195ebb5ac"},"rev":12,"store":"smithlab"} diff --git a/fixtures/records/anchor-leaf.json b/fixtures/records/anchor-leaf.json new file mode 100644 index 0000000..2924f31 --- /dev/null +++ b/fixtures/records/anchor-leaf.json @@ -0,0 +1 @@ +{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"sxgcc9h","node_hash":"76e06b4811a688357ac4b912172283463cfaf1b7a1f0795d274fc733a2309ba7","own_hash":"2d7df7b8b233eab6f96d5db0d29c99062aaa94b55cf4e388c49b9995ce7548d5","quote":{"exact":"The bond energy is given by $$E_{\\mathrm{bond}} = \\frac{1}{2} K_r (r - r_{\\mathrm{eq}})^2$$ where $K_r$ is the bond force constant and $r_\\mathrm{eq}$ the equilibrium bond length."},"rev":12,"store":"smithlab"} diff --git a/fixtures/records/anchor-paragraph.json b/fixtures/records/anchor-paragraph.json new file mode 100644 index 0000000..e4847d2 --- /dev/null +++ b/fixtures/records/anchor-paragraph.json @@ -0,0 +1 @@ +{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"paragraph","leaves":[["mbtjsqv","83edd3a8c2b7d55b524ec0668beb74cceb3dcfb24dae5ff24e99d4c7b498e29a"],["sxgcc9h","924426976d176b8b8bb6a166c9f18d9c52225b47c1f5e17b68f0a36326f721d0"],["qn08tj9","cd2822e88bcde089a4b8d4d60820a4c0c387d75c7fb1737b5e5ac93129194ff7"],["f929eq9","1306aa85965bf549361dbb25337341ad6caa1645f52fbf8bf72378988318ab59"]],"node":"pnkah9n","node_hash":"8184d9488c57577474ada18b729f1ed2aeef72adbb1ee9206c5b342b85f4716a","own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","rev":12,"store":"smithlab"} diff --git a/fixtures/records/anchor-span.json b/fixtures/records/anchor-span.json new file mode 100644 index 0000000..a605b37 --- /dev/null +++ b/fixtures/records/anchor-span.json @@ -0,0 +1 @@ +{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"f929eq9","node_hash":"cd6cdb032e9b8ab712790b7181f794f6e363b7c4c96888049b59c671c1596369","own_hash":"d5b2ebdc96010fd8fc83abcbec9e5c2340bf766997a485f11f2dae49d0d2dd4c","quote":{"exact":"first test case","prefix":"Water, H$_2$O, served as the ","suffix":", with a bending band near 1595 "},"rev":12,"span":[29,44],"store":"smithlab"} diff --git a/fixtures/records/backend-docling.json b/fixtures/records/backend-docling.json new file mode 100644 index 0000000..38ebb3b --- /dev/null +++ b/fixtures/records/backend-docling.json @@ -0,0 +1 @@ +{"code_license":{"spdx":"MIT"},"conditions":[],"format":"scienting-backend/1","name":"docling","processor":"local","stage":"read","version":"illustrative","weights":[{"license":{"spdx":"Apache-2.0"},"name":"layout model"}]} diff --git a/fixtures/records/backend-examplevendor.json b/fixtures/records/backend-examplevendor.json new file mode 100644 index 0000000..eb7fa5d --- /dev/null +++ b/fixtures/records/backend-examplevendor.json @@ -0,0 +1 @@ +{"code_license":{"spdx":"Apache-2.0"},"conditions":[{"id":"revenue-cap","kind":"revenue-cap","usd":5000000},{"id":"no-competition","kind":"no-competition","vendor":"examplevendor"},{"allowed":["research","personal","education","startup"],"id":"purpose","kind":"purpose"}],"format":"scienting-backend/1","name":"examplevendor","processor":"local","stage":"read","version":"1.0","weights":[{"license":{"text":"A fictional weight license with conditions."},"name":"example weights"}]} diff --git a/fixtures/records/datasets/ds-hale-ctct-scan/anchors.jsonl b/fixtures/records/datasets/ds-hale-ctct-scan/anchors.jsonl new file mode 100644 index 0000000..085b1a8 --- /dev/null +++ b/fixtures/records/datasets/ds-hale-ctct-scan/anchors.jsonl @@ -0,0 +1,6 @@ +{"digitization":"qrqsy3x6bznxw","field":"r","point":0,"resource":"scan","row":"p0","series":"scan"} +{"digitization":"qrqsy3x6bznxw","field":"e","point":0,"resource":"scan","row":"p0","series":"scan"} +{"digitization":"qrqsy3x6bznxw","field":"r","point":1,"resource":"scan","row":"p1","series":"scan"} +{"digitization":"qrqsy3x6bznxw","field":"e","point":1,"resource":"scan","row":"p1","series":"scan"} +{"digitization":"qrqsy3x6bznxw","field":"r","point":2,"resource":"scan","row":"p2","series":"scan"} +{"digitization":"qrqsy3x6bznxw","field":"e","point":2,"resource":"scan","row":"p2","series":"scan"} diff --git a/fixtures/records/datasets/ds-hale-ctct-scan/data.csv b/fixtures/records/datasets/ds-hale-ctct-scan/data.csv new file mode 100644 index 0000000..93509a7 --- /dev/null +++ b/fixtures/records/datasets/ds-hale-ctct-scan/data.csv @@ -0,0 +1,4 @@ +point,r,r_u,e,e_u +p0,1.45,0.01,3.10,0.05 +p1,1.50,0.01,0.40,0.05 +p2,1.55,0.01,2.80,0.05 diff --git a/fixtures/records/datasets/ds-hale-ctct-scan/datapackage.json b/fixtures/records/datasets/ds-hale-ctct-scan/datapackage.json new file mode 100644 index 0000000..f727064 --- /dev/null +++ b/fixtures/records/datasets/ds-hale-ctct-scan/datapackage.json @@ -0,0 +1 @@ +{"format":"scienting-dataset/1","id":"ds-hale-ctct-scan","name":"hale-ctct-scan","resources":[{"encoding":"utf-8","format":"csv","name":"scan","origin":{"anchors":"anchors.jsonl","digitization":"qrqsy3x6bznxw","kind":"digitized"},"path":"data.csv","schema":{"fields":[{"name":"point","type":"string"},{"name":"r","type":"number","uncertainty":{"field":"r_u","kind":"resolution"},"unit":"angstrom"},{"name":"r_u","type":"number","unit":"angstrom"},{"name":"e","type":"number","uncertainty":{"field":"e_u","kind":"resolution"},"unit":"kcal / mol"},{"name":"e_u","type":"number","unit":"kcal / mol"}],"primaryKey":"point"}}],"title":"Energy along the C–C stretch, read from Figure 1a"} diff --git a/fixtures/records/digitization-confirmation.json b/fixtures/records/digitization-confirmation.json new file mode 100644 index 0000000..f41ca34 --- /dev/null +++ b/fixtures/records/digitization-confirmation.json @@ -0,0 +1 @@ +{"at":"2026-10-11T20:00:00Z","by":"ana","doc":"hale2026harmonic","evidence":[{"kind":"crop","node":"b2wgyq2","sha256":"41859f0385275a8386eef230d92fc34a379549dd475f27396dc6e8a94ca0fc54"}],"format":"scienting-receipt/1","id":"zkebjgvzja0x1","level":"F3","nodes":[],"records":[["digitization","qrqsy3x6bznxw","9892eb87d908f81475fab42150e0bd84dbfbf0b2cbfe399fbcb39458791cac92"]],"rev":12,"root":"08849d6580a6c8eeec5d10026b2dbdf9ed64a40fe03cfe16849f846fbf49fabb","scope":"targeted:digitization","signature":{"key":"ana","scheme":"ed25519","value":"d32JjUZ3BrwnUl6iqglRXCMwcmnyPUPmVV6UMUtiZSWEANWbaRcit0Q5pDaD5c5MnTEV8Ur8gGl39Fre/cC4Cw=="}} diff --git a/fixtures/records/digitization.json b/fixtures/records/digitization.json new file mode 100644 index 0000000..7e40537 --- /dev/null +++ b/fixtures/records/digitization.json @@ -0,0 +1 @@ +{"axes":[{"calibration":[{"at":[90,400],"value":"1.4"},{"at":[210,400],"value":"1.6"}],"check":{"at":[150,400],"value":"1.5"},"id":"x","label":{"figure_text":"nhk15ag","panel":"b2wgyq2"},"scale":"linear","unit":"angstrom"},{"calibration":[{"at":[80,400],"value":"0"},{"at":[80,280],"value":"4"}],"id":"y","label":{"figure_text":"nr4sby5","panel":"b2wgyq2"},"scale":"linear","unit":"kcal / mol"}],"confirmation":null,"dataset":"ds-hale-ctct-scan","doc":"smithlab/hale2026harmonic","format":"scienting-digitization/1","id":"qrqsy3x6bznxw","method":{"kind":"manual","tool":{"name":"hand","version":"0"}},"rev":12,"series":[{"id":"scan","kind":"points","legend":"scan","mark":{"color":"#285aa0","marker":"circle"},"values":[{"at":[110,360],"uncertainty":{"calibration":"0.01","marker":"0.02","resolution":"0.01","x":"0.01","y":"0.05"},"value":{"x":"1.45","y":"3.10"}},{"at":[150,330],"uncertainty":{"calibration":"0.01","marker":"0.02","resolution":"0.01","x":"0.01","y":"0.05"},"value":{"x":"1.50","y":"0.40"}},{"at":[190,300],"uncertainty":{"calibration":"0.01","marker":"0.02","resolution":"0.01","x":"0.01","y":"0.05"},"value":{"x":"1.55","y":"2.80"}}]}],"target":{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"panel","node":"b2wgyq2","node_hash":"72ab6d60a594c2fdcb20bcc7142bd8e83d36046ef817c61d4240a93e5523e4aa","own_hash":"95cd7f9ab50d8386dc3086cf45a377c1d25c6c6111e3c422b69af10b6b1828c6","rev":12,"store":"smithlab"},"page_fp":"128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60","region":[72,260,300,410],"witness":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"},"verification":{"image":"41859f0385275a8386eef230d92fc34a379549dd475f27396dc6e8a94ca0fc54","max_residual":"0.9","residual":"0.4"}} diff --git a/fixtures/records/draft-ids.jsonl b/fixtures/records/draft-ids.jsonl new file mode 100644 index 0000000..d602101 --- /dev/null +++ b/fixtures/records/draft-ids.jsonl @@ -0,0 +1,5 @@ +{"id":"yc2kbpk","ord":0,"section":null,"text_hash":"d3c3de666d0290878de3949bc0e0ffcaef965c66d2b61e81a5e615e26a2997df"} +{"id":"chy7qty","ord":0,"section":"p687hqb","text_hash":"b605350bc00209520b7cd8f546322663356ba630708f71bbf30aead6b3dd608e"} +{"id":"s0wajte","ord":0,"section":"p687hqb","text_hash":"8f22f3f58beb618723a14dd8fee8caaeb5cef6b26f43d88a5ddb4ff42f86d63e"} +{"id":"y0mc7rb","ord":1,"section":"p687hqb","text_hash":"0d5b27a20da22922ba0c5b65e06581a09d60b899e6daddc63b0e9c1dd3819055"} +{"id":"m13jn76","ord":2,"pinned":"energy-sentence","section":"p687hqb","text_hash":"3873ff52fe20b52be605c10c11e78b24bcabb05c8f725aeb4820c23428631509"} diff --git a/fixtures/records/grades/anchor-hit.json b/fixtures/records/grades/anchor-hit.json new file mode 100644 index 0000000..765d61f --- /dev/null +++ b/fixtures/records/grades/anchor-hit.json @@ -0,0 +1 @@ +{"exercise":"urn:scienting:annotation:smithlab/h6s98vg6qcyjp","format":"scienting-grade/1","items":[{"element":"element:0","feedback":"That is the cell.","max":"1","points":"1"}],"max":"1","score":"1","submission":"h4camq2b6fa0e"} diff --git a/fixtures/records/grades/anchor-miss.json b/fixtures/records/grades/anchor-miss.json new file mode 100644 index 0000000..beacf5e --- /dev/null +++ b/fixtures/records/grades/anchor-miss.json @@ -0,0 +1 @@ +{"exercise":"urn:scienting:annotation:smithlab/h6s98vg6qcyjp","format":"scienting-grade/1","items":[{"element":"element:0","feedback":"Look in Table 1, row CT–CT.","max":"1","points":"0"}],"max":"1","score":"0","submission":"bjgg8jyxh42w9"} diff --git a/fixtures/records/grades/check-overlap.json b/fixtures/records/grades/check-overlap.json new file mode 100644 index 0000000..3fbe002 --- /dev/null +++ b/fixtures/records/grades/check-overlap.json @@ -0,0 +1 @@ +{"exercise":"urn:scienting:annotation:smithlab/y228zv031s285","format":"scienting-grade/1","items":[{"element":"verdict","feedback":"","max":"1","points":"1"},{"element":"element:0","feedback":"","max":"1","points":"1"}],"max":"2","score":"2","submission":"ncf5gq0x1xny5"} diff --git a/fixtures/records/layer/annotations.jsonl b/fixtures/records/layer/annotations.jsonl new file mode 100644 index 0000000..3dd7a31 --- /dev/null +++ b/fixtures/records/layer/annotations.jsonl @@ -0,0 +1,9 @@ +{"@context":["http://www.w3.org/ns/anno.jsonld","https://scient.ing/ns/scienting/1.jsonld"],"body":{"audience":"novice","format":"text/markdown","kind":"gloss","language":"en","type":"TextualBody","value":"A *harmonic* term treats a bond like a spring: the energy grows with the square of the stretch."},"created":"2026-10-11T19:00:00Z","creator":{"id":"urn:scienting:key:ana","name":"Ana Example","type":"Person"},"id":"urn:scienting:annotation:smithlab/x0abag88jjq4t","layer":"urn:scienting:layer:smithlab/kp4m2x7q","motivation":"describing","receipt":"fdfbqrwwd2w3w","status":"confirmed","target":{"selector":[{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"sxgcc9h","node_hash":"76e06b4811a688357ac4b912172283463cfaf1b7a1f0795d274fc733a2309ba7","own_hash":"2d7df7b8b233eab6f96d5db0d29c99062aaa94b55cf4e388c49b9995ce7548d5","quote":{"exact":"bond force constant","prefix":"rm{eq}})^2$$ where $K_r$ is the ","suffix":" and $r_\\mathrm{eq}$ the equilib"},"rev":12,"span":[111,130],"store":"smithlab"},"type":"AnchorSelector"},{"exact":"bond force constant","prefix":"rm{eq}})^2$$ where $K_r$ is the ","suffix":" and $r_\\mathrm{eq}$ the equilib","type":"TextQuoteSelector"}],"source":"urn:scienting:doc:smithlab/hale2026harmonic","type":"SpecificResource"},"type":"Annotation"} +{"@context":["http://www.w3.org/ns/anno.jsonld","https://scient.ing/ns/scienting/1.jsonld"],"body":{"kind":"claim-link","pin":"illustrative-pin","role":"states","source":"lode:amber/k-bond","type":"SpecificResource"},"created":"2026-10-11T19:00:00Z","creator":{"id":"urn:scienting:key:ana","name":"Ana Example","type":"Person"},"id":"urn:scienting:annotation:smithlab/xbwf8p70398mp","layer":"urn:scienting:layer:smithlab/kp4m2x7q","motivation":"linking","receipt":"fdfbqrwwd2w3w","status":"confirmed","target":{"selector":[{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"sxgcc9h","node_hash":"76e06b4811a688357ac4b912172283463cfaf1b7a1f0795d274fc733a2309ba7","own_hash":"2d7df7b8b233eab6f96d5db0d29c99062aaa94b55cf4e388c49b9995ce7548d5","quote":{"exact":"The bond energy is given by $$E_{\\mathrm{bond}} = \\frac{1}{2} K_r (r - r_{\\mathrm{eq}})^2$$ where $K_r$ is the bond force constant and $r_\\mathrm{eq}$ the equilibrium bond length."},"rev":12,"store":"smithlab"},"type":"AnchorSelector"},{"exact":"The bond energy is given by $$E_{\\mathrm{bond}} = \\frac{1}{2} K_r (r - r_{\\mathrm{eq}})^2$$ where $K_r$ is the bond force constant and $r_\\mathrm{eq}$ the equilibrium bond length.","prefix":"","suffix":"","type":"TextQuoteSelector"}],"source":"urn:scienting:doc:smithlab/hale2026harmonic","type":"SpecificResource"},"type":"Annotation"} +{"@context":["http://www.w3.org/ns/anno.jsonld","https://scient.ing/ns/scienting/1.jsonld"],"body":{"kind":"comment","type":"TextualBody","value":"The step size matters more than the text admits."},"created":"2026-10-11T19:00:00Z","creator":{"id":"urn:scienting:key:ana","name":"Ana Example","type":"Person"},"id":"urn:scienting:annotation:smithlab/psdmtnbz2q7v0","layer":"urn:scienting:layer:smithlab/kp4m2x7q","motivation":"commenting","status":"proposed","target":{"selector":[{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"eajq93t","node_hash":"42b1de7852cdc68730984fff789fe248ecd5b43198c0e7d671931ff3fe561dc3","own_hash":"4dc28d1ad57c74d044f87264dfbc744ae9d5e9644638db976dbc346361442486","quote":{"exact":"steps of 0.01","prefix":"Each bond was scanned in ","suffix":" Å around its minimum, and the e"},"rev":12,"span":[25,38],"store":"smithlab"},"type":"AnchorSelector"},{"exact":"steps of 0.01","prefix":"Each bond was scanned in ","suffix":" Å around its minimum, and the e","type":"TextQuoteSelector"}],"source":"urn:scienting:doc:smithlab/hale2026harmonic","type":"SpecificResource"},"type":"Annotation"} +{"@context":["http://www.w3.org/ns/anno.jsonld","https://scient.ing/ns/scienting/1.jsonld"],"body":{"for":"group","kind":"question","type":"TextualBody","value":"Why fit to a scan first and to frequencies second?"},"created":"2026-10-11T19:00:00Z","creator":{"id":"urn:scienting:key:ana","name":"Ana Example","type":"Person"},"id":"urn:scienting:annotation:smithlab/e5g07csx02bfg","layer":"urn:scienting:layer:smithlab/kp4m2x7q","motivation":"questioning","status":"proposed","target":{"selector":[{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"section","node":"f0tj6ca","node_hash":"8acfa263e93dcee504efbfcd328fb69b81f4d71e97b921fa8da664a541e722ff","own_hash":"c3d50f266b05d7889c001aef16662cecd4e99ac4a2747ec331c1044e6adc8e3e","rev":12,"store":"smithlab"},"type":"AnchorSelector"}],"source":"urn:scienting:doc:smithlab/hale2026harmonic","type":"SpecificResource"},"type":"Annotation"} +{"@context":["http://www.w3.org/ns/anno.jsonld","https://scient.ing/ns/scienting/1.jsonld"],"body":{"kind":"citation-context","reason":"value","reference":"b3g86a4","type":"TextualBody","value":"Cited for the band position; the reference is not in the library.","verdict":"cannot-tell"},"created":"2026-10-11T19:00:00Z","creator":{"id":"urn:scienting:key:ana","name":"Ana Example","type":"Person"},"id":"urn:scienting:annotation:smithlab/b1ge58mqmp2xy","layer":"urn:scienting:layer:smithlab/kp4m2x7q","motivation":"assessing","status":"proposed","target":{"selector":[{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"f929eq9","node_hash":"cd6cdb032e9b8ab712790b7181f794f6e363b7c4c96888049b59c671c1596369","own_hash":"d5b2ebdc96010fd8fc83abcbec9e5c2340bf766997a485f11f2dae49d0d2dd4c","quote":{"exact":"1595","prefix":" case, with a bending band near ","suffix":" cm⁻¹.2"},"rev":12,"span":[71,75],"store":"smithlab"},"type":"AnchorSelector"},{"exact":"1595","prefix":" case, with a bending band near ","suffix":" cm⁻¹.2","type":"TextQuoteSelector"}],"source":"urn:scienting:doc:smithlab/hale2026harmonic","type":"SpecificResource"},"type":"Annotation"} +{"@context":["http://www.w3.org/ns/anno.jsonld","https://scient.ing/ns/scienting/1.jsonld"],"body":{"generator":{"model":"example-model","run":"illustrative-run-1"},"kind":"generated","type":"TextualBody","value":"Two panels: an energy scan and its fit residual."},"created":"2026-10-11T19:00:00Z","creator":{"id":"urn:scienting:software:example-model","name":"A model (illustrative)","type":"Software"},"id":"urn:scienting:annotation:smithlab/yc4zpbf0b780r","layer":"urn:scienting:layer:smithlab/kp4m2x7q","motivation":"describing","status":"proposed","target":{"selector":[{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"figure","node":"ajfvq4s","node_hash":"f76864779843485fa9e2f3cc3cd1c76ad222e1649c56f4cface33bf20b8f33b6","own_hash":"a1e46cb40201a17903dfd6f128db1e707b0e9f5bf45fcc32ec7ca772011edeae","rev":12,"store":"smithlab"},"type":"AnchorSelector"}],"source":"urn:scienting:doc:smithlab/hale2026harmonic","type":"SpecificResource"},"type":"Annotation"} +{"@context":["http://www.w3.org/ns/anno.jsonld","https://scient.ing/ns/scienting/1.jsonld"],"body":{"exercise":{"exercise":"anchor","format":"scienting-exercise/1","key":{"elements":[{"anchors":[{"context":{"column_path":["Set A","$K_r$ (kcal mol⁻¹ Å⁻²)"],"row_path":["Bond parameters","CT–CT"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"nkm3xn5","node_hash":"21f13b21948078f64c564334e5bb180b4495edb25a79ae32aa967986a626f3d5","own_hash":"2937e2a6f14cfebd4ffd20e3d514e5cbbf0626a5c0089b7cbea817ef20782b3d","quote":{"exact":"310.0"},"rev":12,"store":"smithlab"}],"feedback":{"hit":"That is the cell.","miss":"Look in Table 1, row CT–CT."},"points":"1"}]},"prompt":"Find the table cell that gives the Set A bond constant for the CT–CT bond.","rule":{"match":"same-node"}},"kind":"exercise","type":"TextualBody","value":"Find the table cell that gives the Set A bond constant for the CT–CT bond."},"created":"2026-10-11T19:00:00Z","creator":{"id":"urn:scienting:key:ana","name":"Ana Example","type":"Person"},"id":"urn:scienting:annotation:smithlab/h6s98vg6qcyjp","layer":"urn:scienting:layer:smithlab/kp4m2x7q","motivation":"assessing","receipt":"fdfbqrwwd2w3w","status":"confirmed","target":{"selector":[{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"table","node":"gm5z4rx","node_hash":"999777484c58cf3646eabb6df3e559369a1b081ec4f337d621dade1bf241f339","own_hash":"b56ce0ab4b480c4c43b11ca2eaca410c60fed73341d53896d509e30eabf54477","rev":12,"store":"smithlab"},"type":"AnchorSelector"}],"source":"urn:scienting:doc:smithlab/hale2026harmonic","type":"SpecificResource"},"type":"Annotation"} +{"@context":["http://www.w3.org/ns/anno.jsonld","https://scient.ing/ns/scienting/1.jsonld"],"body":{"exercise":{"exercise":"check","format":"scienting-exercise/1","key":{"elements":[{"anchors":[{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"mbtjsqv","node_hash":"97c328c2e2efedd931292eeda806d3e4bad14d67cfcc324537c0d993068cfbfc","own_hash":"c1c6019d21c26d790304f7f7a080e93cf507d0e22ebeec6bf2e7df19a1820b3b","quote":{"exact":"the most common description","prefix":"Harmonic bond terms remain ","suffix":" of covalent stretching in class"},"rev":12,"span":[27,54],"store":"smithlab"}],"points":"1"}],"verdict":{"points":"1","value":"supports"}},"prompt":"Does the cited passage support the claim that harmonic terms are the most common choice?","rule":{"match":"overlap","min_overlap":"0.5"}},"kind":"exercise","type":"TextualBody","value":"Does the cited passage support the claim that harmonic terms are the most common choice?"},"created":"2026-10-11T19:00:00Z","creator":{"id":"urn:scienting:key:ana","name":"Ana Example","type":"Person"},"id":"urn:scienting:annotation:smithlab/y228zv031s285","layer":"urn:scienting:layer:smithlab/kp4m2x7q","motivation":"assessing","receipt":"fdfbqrwwd2w3w","status":"confirmed","target":{"selector":[{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"mbtjsqv","node_hash":"97c328c2e2efedd931292eeda806d3e4bad14d67cfcc324537c0d993068cfbfc","own_hash":"c1c6019d21c26d790304f7f7a080e93cf507d0e22ebeec6bf2e7df19a1820b3b","quote":{"exact":"Harmonic bond terms remain the most common description of covalent stretching in classical force fields.1"},"rev":12,"store":"smithlab"},"type":"AnchorSelector"},{"exact":"Harmonic bond terms remain the most common description of covalent stretching in classical force fields.1","prefix":"","suffix":"","type":"TextQuoteSelector"}],"source":"urn:scienting:doc:smithlab/hale2026harmonic","type":"SpecificResource"},"type":"Annotation"} +{"@context":["http://www.w3.org/ns/anno.jsonld","https://scient.ing/ns/scienting/1.jsonld"],"body":{"kind":"comment","type":"TextualBody","value":"Agreed; see the residual panel."},"created":"2026-10-11T19:05:00Z","creator":{"id":"urn:scienting:key:ana","name":"Ana Example","type":"Person"},"id":"urn:scienting:annotation:smithlab/r05bc2v6ve63x","layer":"urn:scienting:layer:smithlab/kp4m2x7q","motivation":"replying","status":"proposed","target":{"source":"urn:scienting:annotation:smithlab/psdmtnbz2q7v0","type":"SpecificResource"},"type":"Annotation"} diff --git a/fixtures/records/layer/layer.json b/fixtures/records/layer/layer.json new file mode 100644 index 0000000..e49bf55 --- /dev/null +++ b/fixtures/records/layer/layer.json @@ -0,0 +1 @@ +{"@context":["http://www.w3.org/ns/anno.jsonld","https://scient.ing/ns/scienting/1.jsonld"],"audience":"student","created":"2026-10-11T19:00:00Z","creator":{"id":"urn:scienting:key:ana","name":"Ana Example","type":"Person"},"docs":["smithlab/hale2026harmonic"],"format":"scienting-layer/1","id":"urn:scienting:layer:smithlab/kp4m2x7q","label":"Smith lab reading of Hale and Osei","license":{"spdx":"CC-BY-4.0"},"project":"smithlab-charges","purpose":"Glosses, claim links and exercises for new students.","total":9,"type":"AnnotationCollection","visibility":"team"} diff --git a/fixtures/records/layer/receipt.json b/fixtures/records/layer/receipt.json new file mode 100644 index 0000000..d4d8134 --- /dev/null +++ b/fixtures/records/layer/receipt.json @@ -0,0 +1 @@ +{"at":"2026-10-11T19:30:00Z","by":"ana","doc":"hale2026harmonic","evidence":[],"format":"scienting-receipt/1","id":"fdfbqrwwd2w3w","level":"F3","nodes":[],"records":[["annotation","h6s98vg6qcyjp","3cbe10d4ecdff3089a25f1b5ca5061e02201243e1bc4ccbe68a92e34a6b18b56"],["annotation","x0abag88jjq4t","7cbc20c779f95e25b2342a316ddf68750110782c0894e00d50dc3073ed5c980e"],["annotation","xbwf8p70398mp","1b0581890cdc337c30feb66baa7691ef2a599888b3df3c348d750e4072dbabd5"],["annotation","y228zv031s285","0eccd844df132a805887437e555e05428424fafa9eb3b2644a7f49a096442a09"]],"rev":12,"root":"fda3463d979d2272c491041e39081f18d8ed2d17affe330b0b58b4fde86106fc","scope":"targeted:layer","signature":{"key":"ana","scheme":"ed25519","value":"YZjSlUd0Z+DGquN6jDYn8Xdka0wTwIixHxwid1hiu/Xn+E7i3LHu2imrg/SDidfANYNHxZRmZzatc0FxRQ31CA=="}} diff --git a/fixtures/records/policy.json b/fixtures/records/policy.json new file mode 100644 index 0000000..187e59b --- /dev/null +++ b/fixtures/records/policy.json @@ -0,0 +1 @@ +{"applies_to":{"basis":["subscription"],"doi_prefixes":["10.5555/"]},"at":"2026-10-05T09:00:00Z","by":"ana","format":"scienting-policy/1","id":"g6r348z7ckp4q","project":"smithlab-charges","signature":{"key":"ana","scheme":"ed25519","value":"iuwOl5+2wPIIncbdpyqwUnfvc7uEAkKUPZhzPFSjBC+GuLuZ4XzGXXiylEFE5lgubnKfMaqrHF2TuT4RyU+5Bw=="},"statement":"Our institutional agreement covers internal AI use in our own cloud account for these papers (fictional).","uses":{"ai":{"internal/tenancy":true}},"valid_until":"2027-08-31T23:59:59Z"} diff --git a/fixtures/records/profile-acme.json b/fixtures/records/profile-acme.json new file mode 100644 index 0000000..cb1e8f8 --- /dev/null +++ b/fixtures/records/profile-acme.json @@ -0,0 +1 @@ +{"at":"2026-10-01T00:00:00Z","competes_with":null,"format":"scienting-profile/1","purpose":"commercial","recorded_by":"acme-admin","revenue_or_funding_usd":{"at_most":null},"team":"acme"} diff --git a/fixtures/records/profile-smithlab.json b/fixtures/records/profile-smithlab.json new file mode 100644 index 0000000..8791b3a --- /dev/null +++ b/fixtures/records/profile-smithlab.json @@ -0,0 +1 @@ +{"at":"2026-10-01T00:00:00Z","competes_with":[],"format":"scienting-profile/1","purpose":"research","recorded_by":"ana","revenue_or_funding_usd":{"at_most":2000000},"team":"smithlab"} diff --git a/fixtures/records/project.json b/fixtures/records/project.json new file mode 100644 index 0000000..4f99035 --- /dev/null +++ b/fixtures/records/project.json @@ -0,0 +1 @@ +{"claims":{"lode":"amber"},"datasets":["ds-hale-bond-params","ds-hale-ctct-scan"],"documents":[{"doc":"smithlab/hale2026harmonic","reason":"The bond constants we start from.","status":{"Ben Example":"read","Cara Example":"reading"},"tags":["parameters"]},{"doc":"okafor2025open","reason":"Solvent shifts for the validation set.","tags":["spectra"]}],"drafts":["smithlab/smithlab2027charges"],"format":"scienting-project/1","key":"smithlab-charges","layers":["urn:scienting:layer:smithlab/kp4m2x7q"],"members":[{"keys":["ana"],"person":"Ana Example","role":"owner"},{"keys":["ben","ben-spot"],"person":"Ben Example","role":"editor"},{"keys":["cara"],"person":"Cara Example","role":"reader"}],"name":"Charges and bonds","paths":[{"id":"onboarding","steps":[{"note":"Read the introduction.","ref":"smithlab/hale2026harmonic","type":"document"},{"note":"Then the table.","ref":"smithlab/hale2026harmonic#gm5z4rx","type":"node"},{"ref":"lode:amber/k-bond","type":"claim"}],"title":"First week"}],"settings":{"digit_rule":"anchored-sections","drift_threshold":"0.25","rights_unknown":"refuse","spot_check":{"minimum":10,"rate":"0.05"},"stages":"scienting-stages-default"},"store":"smithlab","views":["ctct-scan"]} diff --git a/fixtures/records/qa-report.json b/fixtures/records/qa-report.json new file mode 100644 index 0000000..674e124 --- /dev/null +++ b/fixtures/records/qa-report.json @@ -0,0 +1 @@ +{"at":"2026-10-12T10:00:00Z","delivery":"smithlab evidence pilot (fictional)","docs":["smithlab/hale2026harmonic"],"format":"scienting-qa-report/1","id":"ph9jrxbt8kvd1","receipts":["eqgbbpwb6725v","gena76nkb6cnc"],"reviewers":[{"bound":"0.316340","confidence":"0.95","errors":1,"key":"ana","method":"clopper-pearson","sampled":13}]} diff --git a/fixtures/records/rights-collective.json b/fixtures/records/rights-collective.json new file mode 100644 index 0000000..88f1690 --- /dev/null +++ b/fixtures/records/rights-collective.json @@ -0,0 +1 @@ +{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The library's subscription terms, as the team read them (fictional)."}]},"at":"2026-09-15T12:00:00Z","basis":"collective-license","format":"scienting-rights/1","license":{"text":"Annual collective license with internal AI re-use (fictional)."},"uses":{"accessible-copy":"unknown","ai":{"external/local":false,"external/outside":false,"external/outside-no-retention":false,"external/tenancy":false,"internal/local":true,"internal/outside":false,"internal/outside-no-retention":"unknown","internal/tenancy":"unknown"},"quote-public":false,"read":true,"redistribute":false,"tdm":true},"valid_until":"2027-06-30T23:59:59Z"} diff --git a/fixtures/records/rights-open.json b/fixtures/records/rights-open.json new file mode 100644 index 0000000..cdbe233 --- /dev/null +++ b/fixtures/records/rights-open.json @@ -0,0 +1 @@ +{"asserted_by":{"by":"crossref","evidence":[{"doi":"10.5555/example.okafor.2025","kind":"crossref-license","url":"https://creativecommons.org/licenses/by/4.0/"}]},"at":"2026-09-15T12:00:00Z","basis":"open-license","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0","url":"https://creativecommons.org/licenses/by/4.0/"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null} diff --git a/fixtures/records/rights-subscription.json b/fixtures/records/rights-subscription.json new file mode 100644 index 0000000..82880a0 --- /dev/null +++ b/fixtures/records/rights-subscription.json @@ -0,0 +1 @@ +{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The library's subscription terms, as the team read them (fictional)."}]},"at":"2026-09-15T12:00:00Z","basis":"subscription","format":"scienting-rights/1","license":{"text":"Publisher's subscription terms (fictional)."},"uses":{"accessible-copy":"unknown","ai":{"external/local":false,"external/outside":false,"external/outside-no-retention":false,"external/tenancy":false,"internal/local":true,"internal/outside":false,"internal/outside-no-retention":"unknown","internal/tenancy":"unknown"},"quote-public":false,"read":true,"redistribute":false,"tdm":true},"valid_until":"2027-08-31T23:59:59Z"} diff --git a/fixtures/records/roster.json b/fixtures/records/roster.json new file mode 100644 index 0000000..067f89c --- /dev/null +++ b/fixtures/records/roster.json @@ -0,0 +1 @@ +{"format":"scienting-roster/1","keys":[{"id":"ana","person":{"name":"Ana Example"},"public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben","person":{"name":"Ben Example"},"public":"Nx+Qb/5CI/CDfhIow84T0vXtUf4mSLsA1qCFud8i7jc=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"ben-spot","person":{"name":"Ben Example"},"public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"},{"id":"cara","person":{"name":"Cara Example"},"public":"MRiP6EKAIULhp5xEiCMKFeGVR0ziXZmGgNYS4C5ed+A=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"scheme":"ed25519"}],"store":"smithlab"} diff --git a/fixtures/records/snapshot.json b/fixtures/records/snapshot.json new file mode 100644 index 0000000..68981cf --- /dev/null +++ b/fixtures/records/snapshot.json @@ -0,0 +1 @@ +{"claims":[{"level":"illustrative","pin":"illustrative-pin","ref":"amber/k-bond","typst":"K_r"}],"datasets":[{"hash":"290762d5fb23cefe896c812b547a6b04758a0aa903aa64b15b22e0f09c508e23","id":"ds-hale-ctct-scan"}],"format":"scienting-snapshot/1","made_at":"2026-10-11T21:00:00Z","quotes":[{"address":"smithlab/hale2026harmonic#r1gacps@9eb77a","anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"r1gacps","node_hash":"9eb77a1bebf1b2752a14c38cc8de8fe1113a6ccfd8ba77fa26d8818289867027","own_hash":"e9e2b0ab29581e629bdb5d18f4545eed09a7b80cd0b5fd4561a5f28654fbd8cf","quote":{"exact":"Table 1 lists the fitted constants for both parameter sets."},"rev":12,"store":"smithlab"},"fidelity":"F3","result":"current","text":"Table 1 lists the fitted constants for both parameter sets."}],"store":"smithlab"} diff --git a/fixtures/records/submissions/anchor-hit.json b/fixtures/records/submissions/anchor-hit.json new file mode 100644 index 0000000..6bde905 --- /dev/null +++ b/fixtures/records/submissions/anchor-hit.json @@ -0,0 +1 @@ +{"answers":{"anchors":[{"context":{"column_path":["Set A","$K_r$ (kcal mol⁻¹ Å⁻²)"],"row_path":["Bond parameters","CT–CT"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"nkm3xn5","node_hash":"21f13b21948078f64c564334e5bb180b4495edb25a79ae32aa967986a626f3d5","own_hash":"2937e2a6f14cfebd4ffd20e3d514e5cbbf0626a5c0089b7cbea817ef20782b3d","quote":{"exact":"310.0"},"rev":12,"store":"smithlab"}]},"doc":"smithlab/hale2026harmonic","exercise":"urn:scienting:annotation:smithlab/h6s98vg6qcyjp","format":"scienting-submission/1","id":"h4camq2b6fa0e","rev":12,"student":"s-7k2m","submitted_at":"2026-10-20T10:00:00Z"} diff --git a/fixtures/records/submissions/anchor-miss.json b/fixtures/records/submissions/anchor-miss.json new file mode 100644 index 0000000..c939a12 --- /dev/null +++ b/fixtures/records/submissions/anchor-miss.json @@ -0,0 +1 @@ +{"answers":{"anchors":[{"context":{"column_path":["Set B","$K_r$ (kcal mol⁻¹ Å⁻²)"],"row_path":["Bond parameters","CT–CT"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"hw8fx4r","node_hash":"e554e4381827c90595a9083fd3a16e6cc72d0b14e52b3d86104c4b42a9f101b8","own_hash":"6356e0e8a0c4c9911e9657be9ee00e47fbe2ee6c54928d2b3d126266b19fa1e3","quote":{"exact":"305.2"},"rev":12,"store":"smithlab"}]},"doc":"smithlab/hale2026harmonic","exercise":"urn:scienting:annotation:smithlab/h6s98vg6qcyjp","format":"scienting-submission/1","id":"bjgg8jyxh42w9","rev":12,"student":"s-9q4p","submitted_at":"2026-10-20T10:00:00Z"} diff --git a/fixtures/records/submissions/check-overlap.json b/fixtures/records/submissions/check-overlap.json new file mode 100644 index 0000000..8385b96 --- /dev/null +++ b/fixtures/records/submissions/check-overlap.json @@ -0,0 +1 @@ +{"answers":{"anchors":[{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"mbtjsqv","node_hash":"97c328c2e2efedd931292eeda806d3e4bad14d67cfcc324537c0d993068cfbfc","own_hash":"c1c6019d21c26d790304f7f7a080e93cf507d0e22ebeec6bf2e7df19a1820b3b","quote":{"exact":"most common description of covalent","prefix":"Harmonic bond terms remain the ","suffix":" stretching in classical force f"},"rev":12,"span":[31,66],"store":"smithlab"}],"verdict":"supports"},"doc":"smithlab/hale2026harmonic","exercise":"urn:scienting:annotation:smithlab/y228zv031s285","format":"scienting-submission/1","id":"ncf5gq0x1xny5","rev":12,"student":"s-7k2m","submitted_at":"2026-10-20T10:05:00Z"} diff --git a/fixtures/records/view.vl.json b/fixtures/records/view.vl.json new file mode 100644 index 0000000..c56d6d3 --- /dev/null +++ b/fixtures/records/view.vl.json @@ -0,0 +1 @@ +{"$schema":"https://vega.github.io/schema/vega-lite/v5.json","data":{"name":"ds-hale-ctct-scan"},"encoding":{"x":{"field":"r","title":"r (Å)","type":"quantitative"},"y":{"field":"e","title":"E (kcal/mol)","type":"quantitative"}},"mark":{"type":"point"},"usermeta":{"scienting":{"data":[{"dataset":"ds-hale-ctct-scan","hash":"290762d5fb23cefe896c812b547a6b04758a0aa903aa64b15b22e0f09c508e23","name":"ds-hale-ctct-scan","resource":"scan"}],"format":"scienting-view/1","id":"ctct-scan"}}} diff --git a/fixtures/src/README.md b/fixtures/src/README.md new file mode 100644 index 0000000..981ec33 --- /dev/null +++ b/fixtures/src/README.md @@ -0,0 +1,19 @@ +# Fixture sources + +Each source describes a document as first read, errors included, in a shorthand that `tools/build.py` expands; the build mints IDs, applies the listed corrections, lays out synthetic geometry, signs the listed receipts and writes the package. +The shorthand is tooling, not a format. + +| Shorthand | Becomes | +| --- | --- | +| `{"p": [...]}` | A paragraph of the listed sentences. | +| `{"s": [...]}` | A sentence; a string part is a text run. | +| `{"sup": t}`, `{"sub": t}`, `{"em": t}` | A styled text run. | +| `{"m": src}`, `{"t": src}` | A TeX or Typst math run. | +| `{"cite": [...], "text": t}`, `{"xref": target, "text": t}`, `{"fn": name, "text": t}` | Citation, cross-reference and footnote-mark runs. | +| `{"eq": {...}}` | A display equation inside the sentence. | +| `{"row": [...]}`, `{"c": [...]}` | A table row, and a cell with `role`, `rowspan`, `colspan` and `col`. | +| `"name": "@x"` | A local name, replaced by the minted ID; `ext::@x` names a node of another source. | +| `"page": n` | The page the node and its descendants are laid out on. | + +`corrections` lists the operations in order, naming nodes by local name; `crop` names the node whose crop is the evidence. +`anchors_at_rev0` lists the anchors whose resolution `vectors/resolve.jsonl` records, and `receipts` the receipts, spot-checks and revocations to sign. diff --git a/fixtures/src/hale2026harmonic.json b/fixtures/src/hale2026harmonic.json new file mode 100644 index 0000000..d6fe8f5 --- /dev/null +++ b/fixtures/src/hale2026harmonic.json @@ -0,0 +1,174 @@ +{ + "comment": "A synthetic chemistry paper, as first read, with the reading errors its corrections fix. Text written for this fixture; CC0-1.0.", + "document": { + "key": "hale2026harmonic", + "store": "smithlab", + "kind": "article", + "work": {"key": "hale2026harmonic", "same_as": ["doi:10.5555/example.hale.2026"]}, + "version": {"type": "version-of-record", "date": "2026-03-02"}, + "relations": [], + "meta": {"type": "article-journal", "title": "Harmonic bond parameters for small organic molecules from a two-step fit", "author": [{"family": "Hale", "given": "R."}, {"family": "Osei", "given": "M."}], "container-title": "Journal of Example Chemistry", "volume": "14", "page": "101-109", "issued": {"date-parts": [[2026, 3, 2]]}, "DOI": "10.5555/example.hale.2026"}, + "language": "en", + "license": {"text": "All rights reserved by the publisher (fictional)."}, + "policy": "full" + }, + "legacy_aliases": {"b-p01-text-003": "@s3", "b-p02-table-001": "@tab1"}, + "tree": {"kind": "document", "children": [ + {"kind": "front", "page": 1, "children": [ + {"kind": "title", "children": [{"s": ["Harmonic bond parameters for small organic molecules from a two-step fit"], "fidelity": "F2"}]}, + {"kind": "authors", "runs": ["R. Hale and M. Osei"], "fidelity": "F2"}, + {"kind": "abstract", "children": [{"p": [ + {"s": ["We fit harmonic bond constants for twelve bonds in two steps, first to a scan and then to vibrational frequencies."], "fidelity": "F2"}, + {"s": ["The two parameter sets agree to within 2% for every bond."], "fidelity": "F2"} + ]}]} + ]}, + {"kind": "section", "name": "@sec1", "label": "1", "level": 1, "page": 1, "title": "Introduction", "children": [ + {"p": [ + {"name": "@s1", "s": ["Harmonic bond terms remain the most common description of covalent stretching in classical force fields.", {"cite": ["@r1"], "text": "1"}], "fidelity": "F2"}, + {"name": "@s2", "s": ["The bond energy is given by ", {"eq": {"name": "@eq1", "label": "(l)", "tex": "E_{\\mathrm{bond}} = \\frac{1}{2} K_r (r - r_{\\mathrm{eq}})^2", "fidelity": "F1"}}, " where ", {"m": "K_r"}, " is the bond force constant and ", {"m": "r_\\mathrm{eq}"}, " the equilibrium bond length."], "fidelity": "F2"}, + {"name": "@s3", "s": ["Water, H", {"m": "_2"}, "O, served as the first test case, with a bending band near 1595 cm⁻¹.", {"cite": ["@r2"], "text": "2"}], "fidelity": "F2"} + ]}, + {"p": [ + {"name": "@s4", "s": ["Values below 10-3 kcal mol⁻¹ were treated as zero. ", {"xref": "@tab1", "text": "Table 1"}, " lists the fitted constants for both parameter sets."], "fidelity": "F0"} + ]} + ]}, + {"kind": "section", "name": "@sec2", "label": "2", "level": 1, "page": 2, "title": "Methods", "children": [ + {"name": "@para6", "p": [ + {"name": "@s6a", "s": ["Each bond was scanned in steps of 0.01 Å around its minimum, and the energies were"], "fidelity": "F0"}, + {"name": "@s6b", "s": ["fitted by least squares."], "fidelity": "F0"} + ]}, + {"name": "@para7", "p": [ + {"name": "@s7", "s": [{"xref": "@fig1", "text": "Figure 1"}, " shows the scan for the C–C bond of ethane.", {"fn": "@fn1", "text": "a"}], "fidelity": "F2"} + ]}, + {"name": "@head2", "p": [{"name": "@rh", "s": ["J. Example Chem. 2026, 14, 101–109"], "fidelity": "F0"}]}, + {"kind": "footnote", "name": "@fn1", "label": "a", "children": [{"name": "@fns", "s": ["Scans held every other coordinate fixed."], "fidelity": "F2"}]}, + {"kind": "figure", "name": "@fig1", "label": "Figure l", "children": [ + {"kind": "panel", "name": "@pa", "label": "a", "figure_text": [ + {"text": "r (Å)", "role": "axis-label", "name": "@ft_x"}, + {"text": "E (kcal mol⁻¹)", "role": "axis-label", "name": "@ft_y"}, + {"text": "1.4", "role": "tick-label"}, {"text": "1.5", "role": "tick-label"}, {"text": "1.6", "role": "tick-label"} + ]}, + {"kind": "panel", "name": "@pb", "label": "b"}, + {"kind": "caption", "children": [ + {"name": "@cap1", "s": ["Bond energy along the C–C stretch of ethane."], "fidelity": "F2"}, + {"name": "@cap2", "s": ["(a) The scan."], "fidelity": "F2"}, + {"name": "@cap3", "s": ["(b) The residual of the fit."], "fidelity": "F2"} + ]} + ]}, + {"kind": "table", "name": "@tab1", "label": "Table 1", + "columns": [ + {"name": "@col_bond", "header_path": ["@h_bond"]}, + {"name": "@col_ak", "header_path": ["@h_a", "@h_ak"]}, + {"name": "@col_ar", "header_path": ["@h_a", "@h_ar"]}, + {"name": "@col_bk", "header_path": ["@h_b", "@h_bk"]}, + {"name": "@col_br", "header_path": ["@h_b", "@h_br"]} + ], + "children": [ + {"kind": "caption", "children": [{"s": ["Fitted harmonic bond parameters."], "fidelity": "F2"}]}, + {"kind": "table-head", "children": [ + {"row": [ + {"name": "@h_bond", "c": ["Bond"], "role": "column-header", "rowspan": 2, "col": "@col_bond"}, + {"name": "@h_a", "c": ["Set A"], "role": "column-header", "colspan": 2, "col": "@col_ak"}, + {"name": "@h_b", "c": ["Set B"], "role": "column-header", "colspan": 1, "col": "@col_bk"} + ]}, + {"row": [ + {"name": "@h_ak", "c": [{"m": "K_r"}, " (kcal mol⁻¹ Å⁻²)"], "role": "column-header", "col": "@col_ak"}, + {"name": "@h_ar", "c": [{"m": "r_\\mathrm{eq}"}, " (Å)"], "role": "column-header", "col": "@col_ar"}, + {"name": "@h_bk", "c": [{"m": "K_r"}, " (kcal mol⁻¹ Å⁻²)"], "role": "column-header", "col": "@col_bk"}, + {"name": "@h_br", "c": [{"m": "r_\\mathrm{eq}"}, " (Å)"], "role": "column-header", "col": "@col_br"} + ]} + ]}, + {"kind": "table-body", "name": "@body", "children": [ + {"row": [{"name": "@grp", "c": ["Bond parameters"], "role": "row-group-header", "colspan": 5, "col": "@col_bond"}]}, + {"name": "@row_cc", "header_path": ["@grp", "@cc"], "row": [ + {"name": "@cc", "c": ["CT–CT"], "role": "row-header", "col": "@col_bond"}, + {"name": "@cc_ak", "c": ["3l0.0"], "col": "@col_ak", "fidelity": "F0"}, + {"name": "@cc_ar", "c": ["1.526"], "col": "@col_ar"}, + {"name": "@cc_bk", "c": ["305.2"], "col": "@col_bk"}, + {"name": "@cc_br", "c": ["1.5260"], "col": "@col_br"} + ]}, + {"name": "@row_ch", "header_path": ["@grp", "@ch"], "row": [ + {"name": "@ch", "c": ["CT–HC"], "role": "row-header", "col": "@col_bond"}, + {"name": "@ch_ak", "c": ["340.0"], "col": "@col_ak"}, + {"name": "@ch_ar", "c": ["1.090"], "col": "@col_ar"}, + {"name": "@ch_bk", "c": ["338.7 1.0900"], "col": "@col_bk", "fidelity": "F0"} + ]} + ]}, + {"kind": "table-note", "children": [{"s": ["Set B was refitted with half the step size."], "fidelity": "F2"}]} + ]} + ]}, + {"kind": "back", "page": 2, "children": [ + {"kind": "references", "children": [ + {"kind": "reference", "name": "@r1", "label": "1", "runs": ["(1) A. Author and B. Author, J. Example Chem. 2001, 12, 345–350."], "fidelity": "F2", + "csl": {"type": "article-journal", "author": [{"family": "Author", "given": "A."}, {"family": "Author", "given": "B."}], "container-title": "J. Example Chem.", "volume": "12", "page": "345-350", "issued": {"date-parts": [[2001]]}, "DOI": "10.5555/example.ref1"}, + "resolution": {"type": "doi", "doi": "10.5555/example.ref1"}}, + {"kind": "reference", "name": "@r2", "label": "2", "runs": ["(2) C. Writer, Example Spectroscopy 2010, 7, 89–97."], "fidelity": "F2", + "csl": {"type": "article-journal", "author": [{"family": "Writer", "given": "C."}], "container-title": "Example Spectroscopy", "volume": "7", "page": "89-97", "issued": {"date-parts": [[2010]]}}, + "resolution": {"type": "none"}} + ]} + ]} + ]}, + "corrections": [ + {"op": "replace", "target": "@cc_ak", "find": "3l0.0", "replace": "310.0", "crop": "@cc_ak", "reason": "OCR read the digit 1 as the letter l.", "at": "2026-10-02T10:00:00Z"}, + {"op": "replace", "target": "@s4", "find": "10-3", "replace": [{"kind": "text", "text": "10"}, {"kind": "text", "text": "−3", "style": ["sup"]}], "crop": "@s4", "reason": "The reading lost the superscript.", "at": "2026-10-02T10:01:00Z"}, + {"op": "split", "target": "@s4", "before": "Table 1", "new_name": "@s5", "reason": "A missed sentence boundary.", "at": "2026-10-02T10:02:00Z"}, + {"op": "merge", "target": "@s6a", "with": "@s6b", "joiner": " ", "reason": "A false boundary at a line break.", "at": "2026-10-02T10:03:00Z"}, + {"op": "merge", "target": "@para6", "with": "@para7", "reason": "A paragraph split at a column break.", "at": "2026-10-02T10:03:30Z"}, + {"op": "delete", "target": "@head2", "crop": "@rh", "reason": "A running head read as text.", "at": "2026-10-02T10:04:00Z"}, + {"op": "relabel", "target": "@eq1", "label": "(1)", "crop": "@eq1", "reason": "OCR read the equation number 1 as the letter l.", "at": "2026-10-02T10:05:00Z"}, + {"op": "delete", "target": "@row_ch", "crop": "@ch", "reason": "Two cells were read as one; the row is replaced.", "at": "2026-10-02T10:06:00Z"}, + {"op": "insert", "parent": "@body", "place_after": "@row_cc", "crop": "@body", "reason": "The CT–HC row, read again from the page.", "at": "2026-10-02T10:07:00Z", + "node": {"name": "@row_ch2", "header_path": ["@grp", "@ch2"], "row": [ + {"name": "@ch2", "c": ["CT–HC"], "role": "row-header", "col": "@col_bond"}, + {"name": "@ch2_ak", "c": ["340.0"], "col": "@col_ak"}, + {"name": "@ch2_ar", "c": ["1.090"], "col": "@col_ar"}, + {"name": "@ch2_bk", "c": ["338.7"], "col": "@col_bk"}, + {"name": "@ch2_br", "c": ["1.0900"], "col": "@col_br"}]}}, + {"op": "insert", "parent": "@body", "place_after": "@row_ch2", "crop": "@body", "reason": "The reading dropped the OW–HW row.", "at": "2026-10-02T10:08:00Z", + "node": {"name": "@row_ow", "header_path": ["@grp", "@ow"], "row": [ + {"name": "@ow", "c": ["OW–HW"], "role": "row-header", "col": "@col_bond"}, + {"name": "@ow_ak", "c": ["553.0"], "col": "@col_ak"}, + {"name": "@ow_ar", "c": ["0.9572"], "col": "@col_ar"}, + {"name": "@ow_bk", "c": ["548.1"], "col": "@col_bk"}, + {"name": "@ow_br", "c": ["0.9570"], "col": "@col_br"}]}}, + {"op": "set", "target": "@h_b", "attr": "colspan", "value": 2, "crop": "@h_b", "reason": "Set B spans two columns.", "at": "2026-10-02T10:09:00Z"}, + {"op": "relabel", "target": "@fig1", "label": "Figure 1", "crop": "@fig1", "reason": "OCR read the figure number 1 as the letter l.", "at": "2026-10-02T10:10:00Z"} + ], + "anchors_at_rev0": { + "span-current": {"node": "@s3", "quote": "H$_2$O"}, + "leaf-stale": {"node": "@cc_ak"}, + "leaf-current": {"node": "@cc_br"}, + "body-drift-high": {"node": "@body"}, + "table-changed-below": {"node": "@tab1"}, + "section-changed-below": {"node": "@sec2"}, + "span-reattached": {"node": "@s4", "quote": "treated as zero"}, + "span-stale-after-split": {"node": "@s4", "quote": "fitted constants"}, + "span-moved-by-merge": {"node": "@s6b", "quote": "least squares"}, + "leaf-deleted": {"node": "@rh"}, + "equation-reattached": {"node": "@eq1"}, + "figure-relabel": {"node": "@fig1"}, + "cell-header-paths": {"node": "@ch_ar"}, + "via-alias": {"alias": "b-p01-text-003", "node": "@s3", "quote": "first test case"}, + "paragraph-changed-below": {"node": "@para6"}, + "row-drift-low": {"node": "@row_cc"}, + "paragraph-moved": {"node": "@para7"} + }, + "receipts": [ + {"name": "r0", "by": "ana", "level": "F3", "scope": "targeted:lode", "at": "2026-10-01T16:00:00Z", "rev": 0, "nodes": ["@cc_ak", "@cc_br", "@cc_ar"], "crops": true}, + {"name": "r1", "by": "ana", "level": "F3", "scope": "targeted:lode", "at": "2026-10-11T15:02:11Z", "nodes": ["@cc", "@cc_ak", "@cc_ar", "@cc_bk", "@cc_br", "@ch2", "@ch2_ak", "@ch2_ar", "@ch2_bk", "@ch2_br", "@ow", "@ow_ak", "@ow_ar", "@ow_bk", "@ow_br", "@h_ak", "@h_ar", "@h_bk", "@h_br", "@s2", "@eq1", "@s3", "@s4"], "crops": true}, + {"name": "q1", "qa_of": "r1", "by": "ben", "key": "ben-spot", "at": "2026-10-12T09:00:00Z", "errors": []}, + {"name": "r2", "by": "ana", "level": "F3", "scope": "section:@sec1", "at": "2026-10-11T16:30:00Z", "nodes": ["@s1", "@s5"], "crops": true}, + {"name": "r3", "by": "cara", "level": "F3", "scope": "page:2", "at": "2026-10-11T17:00:00Z", "nodes": ["@s6a", "@s7", "@fns"], "crops": true}, + {"name": "v1", "revoke": "r3", "by": "cara", "at": "2026-10-11T17:20:00Z", "reason": "Signed against the crops of another paper."}, + {"name": "r4", "by": "ana", "level": "F3", "scope": "targeted:captions", "at": "2026-10-11T18:00:00Z", "nodes": ["@cap1", "@cap2", "@cap3"], "crops": true}, + {"name": "q2", "qa_of": "r4", "by": "ben", "key": "ben-spot", "at": "2026-10-12T09:30:00Z", "errors": [{"node": "@cap2", "kind": "word", "note": "The page prints a period the reading lacks."}]} + ], + "pages": { + "witness": {"sha_seed": "hale2026harmonic: publisher PDF, download 1 (synthetic)", "size": 482113}, + "size": [612, 792], + "labels": ["101", "102"], + "stamp": "Downloaded via UNIVERSITY OF EXAMPLE on October 11, 2026 at 15:02:11 (UTC).", + "stamp2": "See https://pubs.acs.org/sharingguidelines for options on how to legitimately share published articles.", + "running_head": {"2": "J. Example Chem. 2026, 14, 101–109"} + } +} diff --git a/fixtures/src/okafor2025open.json b/fixtures/src/okafor2025open.json new file mode 100644 index 0000000..2723e75 --- /dev/null +++ b/fixtures/src/okafor2025open.json @@ -0,0 +1,40 @@ +{ + "comment": "A synthetic open-access paper with a JATS witness and a PDF witness. Text written for this fixture; CC0-1.0. The license fields describe the fictional work.", + "document": { + "key": "okafor2025open", + "kind": "article", + "work": {"key": "okafor2025open", "same_as": ["doi:10.5555/example.okafor.2025"]}, + "version": {"type": "version-of-record", "date": "2025-11-20"}, + "relations": [], + "meta": {"type": "article-journal", "title": "Solvent shifts of a model carbonyl stretch", "author": [{"family": "Okafor", "given": "N."}, {"family": "Lindqvist", "given": "E."}], "container-title": "Open Example Letters", "volume": "3", "page": "e17", "issued": {"date-parts": [[2025, 11, 20]]}, "DOI": "10.5555/example.okafor.2025"}, + "language": "en", + "license": {"spdx": "CC-BY-4.0", "url": "https://creativecommons.org/licenses/by/4.0/"}, + "policy": "full" + }, + "tree": {"kind": "document", "children": [ + {"kind": "front", "page": 1, "children": [ + {"kind": "title", "children": [{"s": ["Solvent shifts of a model carbonyl stretch"], "fidelity": "F2"}]}, + {"kind": "authors", "runs": ["N. Okafor and E. Lindqvist"], "fidelity": "F2"} + ]}, + {"kind": "section", "label": "1", "level": 1, "page": 1, "title": "Results", "children": [ + {"p": [ + {"name": "@o1", "s": ["The carbonyl band of the model ketone moves from 1718 cm⁻¹ in hexane to 1702 cm⁻¹ in methanol.", {"cite": ["@or1"], "text": "1"}], "fidelity": "F2"}, + {"name": "@o2", "s": ["The shift scales with the solvent's hydrogen-bond donor strength, ", {"m": "\\alpha"}, ", with a slope of ", {"m": "-17 \\pm 2"}, " cm⁻¹."], "fidelity": "F2"}, + {"name": "@o3", "s": ["Two outliers, both fluorinated alcohols, fall below the line by about 4 cm⁻¹."], "fidelity": "F2"} + ]} + ]}, + {"kind": "back", "page": 1, "children": [ + {"kind": "references", "children": [ + {"kind": "reference", "name": "@or1", "label": "1", "runs": ["1. P. Example and Q. Example, Spectrochim. Example 2019, 30, 11–19."], "fidelity": "F2", + "csl": {"type": "article-journal", "author": [{"family": "Example", "given": "P."}, {"family": "Example", "given": "Q."}], "container-title": "Spectrochim. Example", "volume": "30", "page": "11-19", "issued": {"date-parts": [[2019]]}, "DOI": "10.5555/example.ref3"}, + "resolution": {"type": "doi", "doi": "10.5555/example.ref3"}} + ]} + ]} + ]}, + "pages": { + "witness": {"sha_seed": "okafor2025open: publisher PDF (synthetic)", "size": 201977}, + "jats": {"sha_seed": "okafor2025open: JATS XML from the repository (synthetic)", "size": 38211}, + "size": [595.28, 841.89], + "labels": ["e17-1"] + } +} diff --git a/fixtures/src/smithlab2027charges.json b/fixtures/src/smithlab2027charges.json new file mode 100644 index 0000000..9ce7562 --- /dev/null +++ b/fixtures/src/smithlab2027charges.json @@ -0,0 +1,36 @@ +{ + "comment": "A short synthetic Typst draft that cites sentences of hale2026harmonic by address. Text written for this fixture; CC0-1.0.", + "document": { + "key": "smithlab2027charges", + "store": "smithlab", + "kind": "draft", + "work": {"key": "smithlab2027charges", "same_as": []}, + "version": {"type": "draft", "seq": 3}, + "relations": [], + "meta": {"type": "report", "title": "Fixed charges in biomolecular force fields", "author": [{"family": "Writer", "given": "A."}]}, + "language": "en", + "license": {"spdx": "CC-BY-4.0"}, + "policy": "full" + }, + "tree": {"kind": "document", "children": [ + {"kind": "front", "children": [ + {"kind": "title", "children": [{"s": ["Fixed charges in biomolecular force fields"], "fidelity": "F2"}]}, + {"kind": "authors", "runs": ["A. Writer"], "fidelity": "F2"} + ]}, + {"kind": "section", "label": "1", "level": 1, "title": "Introduction", "children": [ + {"p": [ + {"name": "@d1", "s": ["The bond term is harmonic in the bond length."], "fidelity": "F2"}, + {"name": "@d2", "s": ["Its constants come from a two-step fit ", {"xref": "ext:hale2026harmonic:@s5", "text": "(Hale and Osei, Table 1)"}, ".", {"cite": ["@dr1"], "text": "1"}], "fidelity": "F2"}, + {"name": "@d3", "s": ["In that fit the energy is ", {"t": "E = K_r (r - r_\"eq\")^2"}, ", up to a constant factor."], "fidelity": "F2"} + ]} + ]}, + {"kind": "back", "children": [ + {"kind": "references", "children": [ + {"kind": "reference", "name": "@dr1", "label": "1", "runs": ["1. R. Hale and M. Osei, J. Example Chem. 2026, 14, 101–109."], "fidelity": "F2", + "csl": {"type": "article-journal", "author": [{"family": "Hale", "given": "R."}, {"family": "Osei", "given": "M."}], "container-title": "J. Example Chem.", "volume": "14", "page": "101-109", "issued": {"date-parts": [[2026]]}, "DOI": "10.5555/example.hale.2026"}, + "resolution": {"type": "document", "doc": "smithlab/hale2026harmonic"}} + ]} + ]} + ]}, + "typst": {"sha_seed": "smithlab2027charges: Typst project, revision 3 (synthetic)", "size": 4211} +} diff --git a/registry/formats.json b/registry/formats.json new file mode 100644 index 0000000..b0b8d9e --- /dev/null +++ b/registry/formats.json @@ -0,0 +1,222 @@ +{ + "registry": "formats", + "version": "0.1.0", + "formats": [ + { + "format": "scienting-package/1", + "media_type": "application/vnd.scienting.doc+zip", + "schema": "manifest.schema.json", + "status": "candidate", + "chapter": "spec/12-package.md", + "description": "A package: MANIFEST.json and its files, a folder or a zip." + }, + { + "format": "scienting-doc/1", + "media_type": "application/vnd.scienting.doc+json", + "schema": "document.schema.json", + "status": "candidate", + "chapter": "spec/02-model.md", + "description": "A document: document.json, with nodes.jsonl and the package's other files." + }, + { + "format": "scienting-page/1", + "media_type": null, + "schema": "page.schema.json", + "status": "candidate", + "chapter": "spec/07-geometry.md", + "description": "The page fingerprint function, and a page record." + }, + { + "format": "scienting-anchor/1", + "media_type": "application/vnd.scienting.anchor+json", + "schema": "anchor.schema.json", + "status": "candidate", + "chapter": "spec/06-anchors.md", + "description": "A pinned address with enough context to survive change." + }, + { + "format": "scienting-correction/1", + "media_type": "application/vnd.scienting.correction+json", + "schema": "correction.schema.json", + "status": "candidate", + "chapter": "spec/11-corrections.md", + "description": "An operation on an established document." + }, + { + "format": "scienting-receipt/1", + "media_type": "application/vnd.scienting.receipt+json", + "schema": "receipt.schema.json", + "status": "candidate", + "chapter": "spec/08-fidelity.md", + "description": "A signature over a Merkle root of reviewed values." + }, + { + "format": "scienting-revocation/1", + "media_type": "application/vnd.scienting.revocation+json", + "schema": "revocation.schema.json", + "status": "candidate", + "chapter": "spec/08-fidelity.md", + "description": "A signed withdrawal of receipts." + }, + { + "format": "scienting-roster/1", + "media_type": "application/vnd.scienting.roster+json", + "schema": "roster.schema.json", + "status": "candidate", + "chapter": "spec/08-fidelity.md", + "description": "The keys that may sign, and for what." + }, + { + "format": "scienting-qa-report/1", + "media_type": "application/vnd.scienting.qa-report+json", + "schema": "qa-report.schema.json", + "status": "candidate", + "chapter": "spec/08-fidelity.md", + "description": "Reviewer error bounds for a delivery." + }, + { + "format": "scienting-rights/1", + "media_type": "application/vnd.scienting.rights+json", + "schema": "rights.schema.json", + "status": "candidate", + "chapter": "spec/14-rights.md", + "description": "A witness's license, basis and uses." + }, + { + "format": "scienting-policy/1", + "media_type": "application/vnd.scienting.policy+json", + "schema": "policy.schema.json", + "status": "candidate", + "chapter": "spec/14-rights.md", + "description": "A signed team decision that resolves unknown uses." + }, + { + "format": "scienting-stages/1", + "media_type": "application/vnd.scienting.stages+json", + "schema": "stages.schema.json", + "status": "candidate", + "chapter": "spec/14-rights.md", + "description": "The uses each stage needs." + }, + { + "format": "scienting-backend/1", + "media_type": "application/vnd.scienting.backend+json", + "schema": "backend.schema.json", + "status": "candidate", + "chapter": "spec/14-rights.md", + "description": "A tool's code and weight licenses and their conditions." + }, + { + "format": "scienting-profile/1", + "media_type": "application/vnd.scienting.profile+json", + "schema": "profile.schema.json", + "status": "candidate", + "chapter": "spec/14-rights.md", + "description": "What backend conditions ask about a team." + }, + { + "format": "scienting-stamps/1", + "media_type": "application/vnd.scienting.stamps+json", + "schema": "stamps.schema.json", + "status": "candidate", + "chapter": "spec/07-geometry.md", + "description": "Download-stamp line rules." + }, + { + "format": "scienting-suspect/1", + "media_type": null, + "schema": "suspect.schema.json", + "status": "candidate", + "chapter": "spec/05-hashes.md", + "description": "A doubtful reading for review." + }, + { + "format": "scienting-layer/1", + "media_type": "application/ld+json; profile=\"http://www.w3.org/ns/anno.jsonld\"", + "schema": "layer.schema.json", + "status": "candidate", + "chapter": "spec/18-layers.md", + "description": "A layer of W3C Web Annotations." + }, + { + "format": "scienting-exercise/1", + "media_type": null, + "schema": "exercise.schema.json", + "status": "candidate", + "chapter": "spec/19-exercises.md", + "description": "The body of an exercise annotation." + }, + { + "format": "scienting-submission/1", + "media_type": "application/vnd.scienting.submission+json", + "schema": "submission.schema.json", + "status": "candidate", + "chapter": "spec/19-exercises.md", + "description": "A student's answer under a pseudonym." + }, + { + "format": "scienting-grade/1", + "media_type": "application/vnd.scienting.grade+json", + "schema": "grade.schema.json", + "status": "candidate", + "chapter": "spec/19-exercises.md", + "description": "The grader's result." + }, + { + "format": "scienting-project/1", + "media_type": "application/vnd.scienting.project+json", + "schema": "project.schema.json", + "status": "provisional", + "chapter": "spec/20-projects.md", + "description": "A project." + }, + { + "format": "scienting-bundle/1", + "media_type": "application/vnd.sqlite3", + "schema": "sql/bundle-sqlite.sql", + "status": "provisional", + "chapter": "spec/13-database.md", + "description": "The SQLite bundle readers and servers query." + }, + { + "format": "scienting-dataset/1", + "media_type": "application/vnd.scienting.dataset+json", + "schema": "dataset.schema.json", + "status": "provisional", + "chapter": "spec/15-datasets.md", + "description": "A Frictionless Data Package with units, uncertainty and origin." + }, + { + "format": "scienting-digitization/1", + "media_type": "application/vnd.scienting.digitization+json", + "schema": "digitization.schema.json", + "status": "provisional", + "chapter": "spec/16-digitization.md", + "description": "How values were read off a figure panel." + }, + { + "format": "scienting-view/1", + "media_type": "application/vnd.vegalite+json", + "schema": "view.schema.json", + "status": "provisional", + "chapter": "spec/17-views.md", + "description": "A Vega-Lite view that pins its data." + }, + { + "format": "scienting-snapshot/1", + "media_type": "application/vnd.scienting.snapshot+json", + "schema": "snapshot.schema.json", + "status": "provisional", + "chapter": "spec/21-drafts.md", + "description": "What a draft cites, pinned." + }, + { + "format": "scienting-draft-ids/1", + "media_type": null, + "schema": "draft-ids.schema.json", + "status": "provisional", + "chapter": "spec/21-drafts.md", + "description": "A Typst project's sentence-ID sidecar." + } + ] +} diff --git a/registry/rules.json b/registry/rules.json new file mode 100644 index 0000000..6d597af --- /dev/null +++ b/registry/rules.json @@ -0,0 +1,442 @@ +{ + "registry": "rules", + "version": "0.1.0", + "note": "Rule IDs name each refusal, so tools report file, node and rule in the form path:line: rule: message.", + "rules": [ + { + "id": "correction.digits", + "description": "A digit changes without crop evidence, or a leaf's digits change undeclared.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "correction.evidence", + "description": "An insert has no crop evidence.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "correction.find", + "description": "`find` is empty or does not occur exactly once.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "correction.insert", + "description": "Text is inserted outside the runs of a node, or at a bad offset.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "correction.merge", + "description": "The nodes differ in kind, are not mergeable, or are not adjacent siblings.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "correction.move", + "description": "The destination is unknown or inside the moved node.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "correction.op", + "description": "The operation is unknown.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "correction.reclassify", + "description": "The new kind has another content shape.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "correction.relabel", + "description": "The kind takes no label.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "correction.replace", + "description": "Runs replace text outside a text run, or include an equation run.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "correction.set", + "description": "The attribute cannot be set on the kind.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "correction.split", + "description": "The node is not a sentence, the offset is outside it or inside a run other than text, or a part is empty.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "correction.target", + "description": "A target, parent or sibling is not a live node, or the root is deleted, moved, merged or reclassified.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.correction.after", + "description": "The last correction of a leaf does not end at the leaf's current node_hash.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.correction.id", + "description": "A correction's id does not derive from its record.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.correction.index", + "description": "Correction indexes do not count from 1 without gaps.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.correction.rev", + "description": "document.json's rev is not the number of corrections.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.fidelity.report", + "description": "document.json's fidelity distribution does not recompute.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.hash.align-key", + "description": "An align_key does not recompute.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.hash.key", + "description": "The key supplied does not match the package's key_id.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.hash.match-hash", + "description": "A match_hash does not recompute.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.hash.meta", + "description": "meta_hash does not recompute.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.hash.node-hash", + "description": "A node_hash does not recompute.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.hash.own-hash", + "description": "An own_hash does not recompute.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.hash.root", + "description": "document.json's root is not the root node's node_hash.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.hash.text-hash", + "description": "A text_hash does not recompute.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.id.alias", + "description": "An alias does not name a live node.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.id.form", + "description": "An ID is not seven letter-first Crockford base32 characters.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.id.retired-live", + "description": "An ID is both live and in the ID table.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.id.retired-missing", + "description": "A correction retired an ID that ids.jsonl does not record.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.id.successor", + "description": "A successor names an ID that is neither live nor in the ID table.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.id.unique", + "description": "An ID occurs twice.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.location.node", + "description": "A location names an unknown node.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.location.page", + "description": "A location's page_fp is not a page of any witness.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.node.attrs", + "description": "A section has no level.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.node.content", + "description": "A node's content does not have the shape its kind requires.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.node.kind", + "description": "A node kind is not in the list.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.node.label", + "description": "A node of a kind that takes no label has one.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.order.ids", + "description": "ids.jsonl is not aliases by ID, then retirements by revision and ID.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.order.locations", + "description": "locations.jsonl is not sorted by node order, page and fingerprint.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.order.pages", + "description": "pages.jsonl is not sorted by witness and page.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.order.receipts", + "description": "receipts.jsonl is not sorted by time and ID.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.order.references", + "description": "references.jsonl does not follow document order.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.order.suspects", + "description": "suspects.jsonl is not sorted by ID.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.page.witness", + "description": "A page names an unknown witness.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.policy.keyed", + "description": "A checks-only package carries plain hashes.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.policy.withheld", + "description": "Text is present where the policy withholds it, or withheld where the policy is full, or a checks-only package carries corrections or suspects.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.qa.key", + "description": "A spot-check seed key is not a registered Ed25519 spot-check key, or was registered after the receipt.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.qa.of", + "description": "A spot-check names a receipt the package does not hold.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.qa.sample", + "description": "A spot-check sample does not follow from its seed.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.qa.seed", + "description": "A spot-check seed is not the checker's signature over the receipt.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.receipt.doc", + "description": "A receipt names another document.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.receipt.id", + "description": "A receipt's or revocation's id does not derive from its record.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.receipt.nodes", + "description": "A receipt's nodes are not sorted by ID, or one repeats.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.receipt.root", + "description": "A receipt's Merkle root does not recompute.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.receipt.signature", + "description": "A signature does not verify against the roster.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.reference.node", + "description": "A reference record names a node that is not a reference.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.run.canonical", + "description": "Runs are not canonical: an empty text run, or two adjacent text runs with the same styles.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.run.cite", + "description": "A cite run names a node that is not a reference.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.run.equation", + "description": "Equation runs do not name the sentence's equation children, once each, in order.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.run.fnmark", + "description": "An fnmark run names a node that is not a footnote.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.run.kind", + "description": "A run kind is not in the list.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.run.style", + "description": "A style is unknown, or a run is both a subscript and a superscript.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.run.xref", + "description": "A same-document xref names no node.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.table.header", + "description": "A column or row header path names a node that is not a cell.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.tree.child", + "description": "A node holds a child kind it may not hold, a heading is not first, or a once-only child repeats.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.tree.empty", + "description": "A kind that must have children has none.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.tree.ord", + "description": "A parent's children do not have ord 0 to n-1.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.tree.order", + "description": "nodes.jsonl is not in document order.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.tree.root", + "description": "The tree does not have exactly one root, of kind document.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "doc.witness.id", + "description": "A witness ID does not derive from its SHA-256.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "grade.key-stale", + "description": "An anchor in the exercise's key is stale, so nothing is graded with it.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "grade.kind", + "description": "The exercise kind is unknown.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "package.file.canonical", + "description": "A JSON or JSON Lines record is not in canonical JSON.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "package.file.empty", + "description": "An optional JSON Lines file is present with no records.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "package.file.newline", + "description": "A line of a JSON Lines file does not end with a newline.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "package.file.required", + "description": "document.json, nodes.jsonl, witnesses.json or provenance.json is missing.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "package.manifest.absent", + "description": "An entry listed without its bytes is not an asset, or its bytes are present.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "package.manifest.hash", + "description": "A file's SHA-256 or size differs from its manifest entry.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "package.manifest.key", + "description": "The manifest's key differs from document.json's.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "package.manifest.missing", + "description": "The package has no MANIFEST.json.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "package.manifest.missing-file", + "description": "A file the manifest lists is not in the package.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "package.manifest.order", + "description": "Manifest entries are not sorted by path, or a path repeats.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "package.manifest.schema", + "description": "MANIFEST.json does not validate against manifest.schema.json.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "package.manifest.unlisted", + "description": "The package holds a file the manifest does not list.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "package.path.unsafe", + "description": "A path is absolute, has an empty, `.` or `..` segment, a backslash or a NUL, or is not normalized.", + "chapter": "spec/22-conformance.md" + }, + { + "id": "package.schema", + "description": "A file or line does not validate against its schema.", + "chapter": "spec/22-conformance.md" + } + ] +} diff --git a/registry/stages/scienting-stages-default.json b/registry/stages/scienting-stages-default.json new file mode 100644 index 0000000..917b7a6 --- /dev/null +++ b/registry/stages/scienting-stages-default.json @@ -0,0 +1,85 @@ +{ + "format": "scienting-stages/1", + "id": "scienting-stages-default", + "note": "Proposed defaults from the design, for counsel to set. Configuration, not code: a team may replace this file.", + "stages": { + "convert-model": { + "uses": [ + "tdm" + ], + "ai": { + "purpose": "internal" + }, + "note": "Conversion by any model, local or outside." + }, + "convert-deterministic": { + "uses": [ + "tdm" + ], + "note": "The text-layer witness, segmentation, hashing and the gate." + }, + "index": { + "uses": [ + "tdm" + ], + "note": "The full-text index." + }, + "review-model": { + "uses": [], + "ai": { + "purpose": "internal" + }, + "note": "Model review of suspects, in a job zip or the direct API mode." + }, + "propose-model": { + "uses": [], + "ai": { + "purpose": "internal" + }, + "note": "Glosses, digitizations or claims a model proposes." + }, + "mcp-text": { + "uses": [], + "ai": { + "purpose": "internal" + }, + "note": "The MCP server returning text to the team's model." + }, + "embed": { + "uses": [], + "ai": { + "purpose": "internal", + "processors": [ + "local", + "tenancy" + ] + }, + "note": "Embeddings for search." + }, + "ai-data-external": { + "uses": [], + "ai": { + "purpose": "external" + }, + "note": "AI data built for others; in practice CC BY papers only." + }, + "read": { + "uses": [ + "read" + ], + "note": "Reading in the reader." + }, + "publish-quotes": { + "uses": [ + "quote-public" + ], + "note": "Publishing anything with quotations." + }, + "accessible-copy": { + "uses": [ + "accessible-copy" + ], + "note": "An accessible copy for a user with a disability." + } + } +} diff --git a/registry/stamps/scienting-stamps-1.json b/registry/stamps/scienting-stamps-1.json new file mode 100644 index 0000000..e24db7f --- /dev/null +++ b/registry/stamps/scienting-stamps-1.json @@ -0,0 +1,39 @@ +{ + "format": "scienting-stamps/1", + "id": "scienting-stamps-1", + "learned": false, + "note": "Published stamp-line rules, version 1. Patterns are matched against the normalized line, case-insensitively over ASCII. Teams add learned rules in files of their own.", + "rules": [ + { + "id": "downloaded-via", + "pattern": "^Downloaded via .+ on .+", + "where": "any", + "note": "The institution-and-time stamp some publishers print in the margin." + }, + { + "id": "downloaded-from-on", + "pattern": "^Downloaded from .+ on .+", + "where": "any", + "note": "The URL, institution and date stamp other publishers print." + }, + { + "id": "sharing-guidelines", + "pattern": "^See https?://pubs\\.acs\\.org/sharingguidelines", + "where": "any", + "note": "A sharing notice printed beside a download stamp." + }, + { + "id": "terms-and-conditions", + "pattern": "^See the Terms and Conditions \\(https?://onlinelibrary\\.wiley\\.com/", + "where": "any", + "note": "The rest of a stamp line, when a text layer splits it." + }, + { + "id": "margin-downloaded", + "pattern": "^Downloaded", + "where": "margin", + "margin": 36, + "note": "Any line in the outer 36 points that begins with Downloaded." + } + ] +} diff --git a/schemas/anchor.schema.json b/schemas/anchor.schema.json new file mode 100644 index 0000000..e8a0af7 --- /dev/null +++ b/schemas/anchor.schema.json @@ -0,0 +1,115 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/anchor.schema.json", + "title": "Anchor", + "description": "scienting-anchor/1: a pinned address with context; spec/06-anchors.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-anchor/1" + }, + "store": { + "$ref": "common.schema.json#/$defs/key" + }, + "doc": { + "$ref": "common.schema.json#/$defs/key" + }, + "node": { + "$ref": "common.schema.json#/$defs/nodeRef" + }, + "kind": { + "$ref": "common.schema.json#/$defs/nodeKind" + }, + "own_hash": { + "$ref": "common.schema.json#/$defs/hash" + }, + "node_hash": { + "$ref": "common.schema.json#/$defs/hash" + }, + "span": { + "type": "array", + "items": { + "type": "integer", + "minimum": 0 + }, + "minItems": 2, + "maxItems": 2 + }, + "quote": {}, + "context": {}, + "leaves": { + "type": "array", + "items": { + "type": "array", + "prefixItems": [ + { + "$ref": "common.schema.json#/$defs/nodeId" + }, + { + "$ref": "common.schema.json#/$defs/hash" + } + ], + "minItems": 2, + "maxItems": 2 + }, + "minItems": 1 + }, + "rev": { + "type": "integer", + "minimum": 0 + }, + "keyed": { + "$ref": "common.schema.json#/$defs/hashing" + } + }, + "required": [ + "format", + "doc", + "node", + "own_hash", + "node_hash", + "rev" + ], + "additionalProperties": false, + "allOf": [ + { + "if": { + "required": [ + "keyed" + ] + }, + "then": { + "properties": { + "quote": { + "$ref": "common.schema.json#/$defs/keyedQuote" + }, + "context": { + "$ref": "common.schema.json#/$defs/keyedContext" + } + } + }, + "else": { + "properties": { + "quote": { + "$ref": "common.schema.json#/$defs/quote" + }, + "context": { + "$ref": "common.schema.json#/$defs/cellContext" + } + } + } + }, + { + "if": { + "required": [ + "span" + ] + }, + "then": { + "required": [ + "quote" + ] + } + } + ] +} diff --git a/schemas/annotation.schema.json b/schemas/annotation.schema.json new file mode 100644 index 0000000..019cd73 --- /dev/null +++ b/schemas/annotation.schema.json @@ -0,0 +1,707 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/annotation.schema.json", + "title": "Annotation", + "description": "One line of annotations.jsonl in scienting-layer/1: a W3C Web Annotation; spec/18-layers.md.", + "type": "object", + "properties": { + "@context": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "minItems": 2 + }, + "id": { + "type": "string", + "pattern": "^urn:scienting:annotation:[a-z0-9][a-z0-9._-]*/[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6,25}$" + }, + "type": { + "const": "Annotation" + }, + "layer": { + "type": "string", + "pattern": "^urn:scienting:layer:[a-z0-9][a-z0-9._-]*/[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6,25}$" + }, + "motivation": { + "enum": [ + "commenting", + "describing", + "linking", + "questioning", + "assessing", + "tagging", + "classifying", + "identifying", + "editing", + "highlighting", + "bookmarking", + "replying", + "moderating" + ] + }, + "creator": { + "$ref": "common.schema.json#/$defs/agent" + }, + "created": { + "$ref": "common.schema.json#/$defs/time" + }, + "modified": { + "$ref": "common.schema.json#/$defs/time" + }, + "body": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "TextualBody" + }, + "value": { + "type": "string", + "minLength": 1 + }, + "format": { + "enum": [ + "text/plain", + "text/markdown" + ] + }, + "language": { + "$ref": "common.schema.json#/$defs/language" + }, + "kind": { + "const": "gloss" + }, + "audience": { + "enum": [ + "novice", + "student", + "expert" + ] + } + }, + "required": [ + "type", + "kind", + "value", + "audience" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "SpecificResource" + }, + "source": { + "type": "string", + "minLength": 1 + }, + "kind": { + "const": "claim-link" + }, + "pin": { + "type": "string", + "minLength": 1 + }, + "role": { + "enum": [ + "states", + "uses", + "disputes" + ] + } + }, + "required": [ + "type", + "kind", + "source", + "role" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "SpecificResource" + }, + "source": { + "type": "string", + "minLength": 1 + }, + "kind": { + "const": "symbol" + }, + "pin": { + "type": "string", + "minLength": 1 + }, + "symbol": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "type", + "kind", + "source" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "TextualBody" + }, + "value": { + "type": "string", + "minLength": 1 + }, + "format": { + "enum": [ + "text/plain", + "text/markdown" + ] + }, + "language": { + "$ref": "common.schema.json#/$defs/language" + }, + "kind": { + "const": "comment" + } + }, + "required": [ + "type", + "kind", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "TextualBody" + }, + "value": { + "type": "string", + "minLength": 1 + }, + "format": { + "enum": [ + "text/plain", + "text/markdown" + ] + }, + "language": { + "$ref": "common.schema.json#/$defs/language" + }, + "kind": { + "const": "caveat" + } + }, + "required": [ + "type", + "kind", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "TextualBody" + }, + "value": { + "type": "string", + "minLength": 1 + }, + "format": { + "enum": [ + "text/plain", + "text/markdown" + ] + }, + "language": { + "$ref": "common.schema.json#/$defs/language" + }, + "kind": { + "const": "question" + }, + "for": { + "enum": [ + "reader", + "group", + "authors" + ] + } + }, + "required": [ + "type", + "kind", + "value" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "TextualBody" + }, + "value": { + "type": "string", + "minLength": 1 + }, + "format": { + "enum": [ + "text/plain", + "text/markdown" + ] + }, + "language": { + "$ref": "common.schema.json#/$defs/language" + }, + "kind": { + "const": "exercise" + }, + "exercise": { + "$ref": "exercise.schema.json" + } + }, + "required": [ + "type", + "kind", + "value", + "exercise" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "TextualBody" + }, + "value": { + "type": "string", + "minLength": 1 + }, + "format": { + "enum": [ + "text/plain", + "text/markdown" + ] + }, + "language": { + "$ref": "common.schema.json#/$defs/language" + }, + "kind": { + "const": "citation-context" + }, + "reference": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "verdict": { + "enum": [ + "supports", + "partly", + "does-not", + "cannot-tell" + ] + }, + "reason": { + "enum": [ + "method", + "value", + "background", + "contrast", + "other" + ] + } + }, + "required": [ + "type", + "kind", + "value", + "reference" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "SpecificResource" + }, + "source": { + "type": "string", + "minLength": 1 + }, + "kind": { + "const": "prerequisite" + } + }, + "required": [ + "type", + "kind", + "source" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "SpecificResource" + }, + "source": { + "type": "string", + "minLength": 1 + }, + "kind": { + "const": "crosslink" + }, + "selector": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "const": "AnchorSelector" + }, + "anchor": { + "$ref": "anchor.schema.json" + } + }, + "required": [ + "type", + "anchor" + ], + "additionalProperties": false + }, + "minItems": 1 + } + }, + "required": [ + "type", + "kind", + "source", + "selector" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "TextualBody" + }, + "value": { + "type": "string", + "minLength": 1 + }, + "format": { + "enum": [ + "text/plain", + "text/markdown" + ] + }, + "language": { + "$ref": "common.schema.json#/$defs/language" + }, + "kind": { + "const": "translation" + } + }, + "required": [ + "type", + "kind", + "value", + "language" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "TextualBody" + }, + "value": { + "type": "string", + "minLength": 1 + }, + "format": { + "enum": [ + "text/plain", + "text/markdown" + ] + }, + "language": { + "$ref": "common.schema.json#/$defs/language" + }, + "kind": { + "const": "generated" + }, + "generator": { + "type": "object", + "properties": { + "model": { + "type": "string", + "minLength": 1 + }, + "run": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "model", + "run" + ], + "additionalProperties": false + } + }, + "required": [ + "type", + "kind", + "value", + "generator" + ], + "additionalProperties": false + } + ] + }, + "target": { + "oneOf": [ + { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "SpecificResource" + }, + "source": { + "type": "string", + "pattern": "^urn:scienting:doc:[a-z0-9][a-z0-9._-]*/[a-z0-9][a-z0-9._-]*$" + }, + "selector": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "AnchorSelector" + }, + "anchor": { + "$ref": "anchor.schema.json" + } + }, + "required": [ + "type", + "anchor" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "TextQuoteSelector" + }, + "exact": { + "type": "string", + "minLength": 1 + }, + "prefix": { + "type": "string" + }, + "suffix": { + "type": "string" + } + }, + "required": [ + "type", + "exact" + ], + "additionalProperties": false + } + ] + }, + "minItems": 1 + } + }, + "required": [ + "type", + "source", + "selector" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "SpecificResource" + }, + "source": { + "type": "string", + "pattern": "^urn:scienting:annotation:[a-z0-9][a-z0-9._-]*/[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6,25}$" + } + }, + "required": [ + "type", + "source" + ], + "additionalProperties": false + } + ] + }, + { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "SpecificResource" + }, + "source": { + "type": "string", + "pattern": "^urn:scienting:doc:[a-z0-9][a-z0-9._-]*/[a-z0-9][a-z0-9._-]*$" + }, + "selector": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "AnchorSelector" + }, + "anchor": { + "$ref": "anchor.schema.json" + } + }, + "required": [ + "type", + "anchor" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "TextQuoteSelector" + }, + "exact": { + "type": "string", + "minLength": 1 + }, + "prefix": { + "type": "string" + }, + "suffix": { + "type": "string" + } + }, + "required": [ + "type", + "exact" + ], + "additionalProperties": false + } + ] + }, + "minItems": 1 + } + }, + "required": [ + "type", + "source", + "selector" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "SpecificResource" + }, + "source": { + "type": "string", + "pattern": "^urn:scienting:annotation:[a-z0-9][a-z0-9._-]*/[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6,25}$" + } + }, + "required": [ + "type", + "source" + ], + "additionalProperties": false + } + ] + }, + "minItems": 1 + } + ] + }, + "status": { + "enum": [ + "proposed", + "confirmed", + "rejected", + "withdrawn" + ] + }, + "receipt": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "rights_use": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "@context", + "id", + "type", + "layer", + "motivation", + "creator", + "created", + "body", + "target", + "status" + ], + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "status": { + "const": "confirmed" + } + } + }, + "then": { + "required": [ + "receipt" + ] + } + } + ] +} diff --git a/schemas/backend.schema.json b/schemas/backend.schema.json new file mode 100644 index 0000000..2205e11 --- /dev/null +++ b/schemas/backend.schema.json @@ -0,0 +1,164 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/backend.schema.json", + "title": "Backend declaration", + "description": "scienting-backend/1: a tool's code and weight licenses and their conditions; spec/14-rights.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-backend/1" + }, + "name": { + "$ref": "common.schema.json#/$defs/key" + }, + "version": { + "type": "string", + "minLength": 1 + }, + "stage": { + "enum": [ + "read", + "review", + "gloss", + "embed", + "digitize", + "other" + ] + }, + "processor": { + "$ref": "common.schema.json#/$defs/processor" + }, + "code_license": { + "$ref": "common.schema.json#/$defs/license" + }, + "weights": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "license": { + "$ref": "common.schema.json#/$defs/license" + }, + "url": { + "$ref": "common.schema.json#/$defs/url" + } + }, + "required": [ + "name", + "license" + ], + "additionalProperties": false + } + }, + "conditions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "$ref": "common.schema.json#/$defs/key" + }, + "kind": { + "enum": [ + "revenue-cap", + "no-competition", + "purpose" + ] + }, + "usd": { + "type": "integer", + "minimum": 1 + }, + "vendor": { + "type": "string", + "minLength": 1 + }, + "allowed": { + "type": "array", + "items": { + "enum": [ + "research", + "personal", + "education", + "startup", + "commercial" + ] + }, + "minItems": 1 + }, + "source": { + "$ref": "common.schema.json#/$defs/url" + }, + "note": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "id", + "kind" + ], + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "kind": { + "const": "revenue-cap" + } + } + }, + "then": { + "required": [ + "usd" + ] + } + }, + { + "if": { + "properties": { + "kind": { + "const": "no-competition" + } + } + }, + "then": { + "required": [ + "vendor" + ] + } + }, + { + "if": { + "properties": { + "kind": { + "const": "purpose" + } + } + }, + "then": { + "required": [ + "allowed" + ] + } + } + ] + } + } + }, + "required": [ + "format", + "name", + "version", + "stage", + "processor", + "code_license", + "weights", + "conditions" + ], + "additionalProperties": false +} diff --git a/schemas/common.schema.json b/schemas/common.schema.json new file mode 100644 index 0000000..50742d4 --- /dev/null +++ b/schemas/common.schema.json @@ -0,0 +1,553 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/common.schema.json", + "title": "Shared definitions", + "description": "Definitions every scienting schema shares; spec/01-conventions.md.", + "$defs": { + "hash": { + "type": "string", + "pattern": "^[0-9a-f]{64}$", + "description": "SHA-256 or HMAC-SHA-256, 64 lowercase hex digits." + }, + "hash6": { + "type": "string", + "pattern": "^[0-9a-f]{6}$" + }, + "nodeId": { + "type": "string", + "pattern": "^[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6}$", + "description": "Seven lowercase Crockford base32 characters, the first a letter." + }, + "recordId": { + "type": "string", + "pattern": "^[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6,25}$" + }, + "key": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9._-]*$", + "maxLength": 128 + }, + "alias": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9._-]*[._-][a-z0-9._-]*$", + "maxLength": 128, + "description": "A legacy ID; it always contains a separator, so it never looks like a node ID." + }, + "nodeRef": { + "anyOf": [ + { + "$ref": "#/$defs/nodeId" + }, + { + "$ref": "#/$defs/alias" + } + ] + }, + "qualifiedKey": { + "type": "string", + "pattern": "^([a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*$", + "maxLength": 257 + }, + "datasetId": { + "type": "string", + "pattern": "^ds-[a-z0-9][a-z0-9._-]*$", + "maxLength": 128 + }, + "address": { + "type": "string", + "pattern": "^([a-z0-9][a-z0-9._-]*/)?[a-z0-9][a-z0-9._-]*#[a-z0-9][a-z0-9._-]*(@[0-9a-f]{6})?(\\[(0|[1-9][0-9]*):(0|[1-9][0-9]*)\\])?$" + }, + "time": { + "type": "string", + "pattern": "^[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-5][0-9]:[0-6][0-9]Z$" + }, + "date": { + "type": "string", + "pattern": "^[0-9]{4}(-[0-1][0-9](-[0-3][0-9])?)?$" + }, + "decimal": { + "type": "string", + "pattern": "^-?(0|[1-9][0-9]*)(\\.[0-9]+)?$", + "description": "A decimal that carries meaning, as a string." + }, + "level": { + "enum": [ + "F0", + "F1", + "F2", + "F3" + ] + }, + "receiptLevel": { + "enum": [ + "F1", + "F2", + "F3" + ] + }, + "nodeKind": { + "enum": [ + "document", + "front", + "title", + "authors", + "abstract", + "keywords", + "notes", + "section", + "heading", + "paragraph", + "sentence", + "equation", + "equation-line", + "figure", + "panel", + "caption", + "figure-note", + "table", + "table-head", + "table-body", + "table-note", + "row", + "cell", + "list", + "item", + "quote", + "code", + "algorithm", + "theorem", + "footnote", + "back", + "acknowledgments", + "references", + "reference", + "appendix" + ] + }, + "box": { + "type": "array", + "items": { + "type": "number" + }, + "minItems": 4, + "maxItems": 4, + "description": "[x0, y0, x1, y1] in PDF points, origin top left after rotation." + }, + "size": { + "type": "array", + "items": { + "type": "number", + "exclusiveMinimum": 0 + }, + "minItems": 2, + "maxItems": 2 + }, + "url": { + "type": "string", + "pattern": "^[a-z][a-z0-9+.-]*:[^ ]+$" + }, + "language": { + "type": "string", + "pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{1,8})*$" + }, + "spdx": { + "type": "string", + "pattern": "^[A-Za-z0-9.+-]+( (AND|OR|WITH) [A-Za-z0-9.+-]+)*$" + }, + "license": { + "type": "object", + "properties": { + "spdx": { + "$ref": "#/$defs/spdx" + }, + "text": { + "type": "string", + "minLength": 1 + }, + "url": { + "$ref": "#/$defs/url" + } + }, + "additionalProperties": false, + "minProperties": 1 + }, + "tri": { + "enum": [ + true, + false, + "unknown" + ] + }, + "base64": { + "type": "string", + "pattern": "^[A-Za-z0-9+/]+={0,2}$" + }, + "processor": { + "enum": [ + "local", + "tenancy", + "outside-no-retention", + "outside" + ] + }, + "basis": { + "enum": [ + "open-license", + "publisher-tdm", + "collective-license", + "subscription", + "own-work", + "permission", + "unknown" + ] + }, + "signature": { + "type": "object", + "properties": { + "scheme": { + "enum": [ + "ed25519", + "ssh", + "gpg", + "sigstore" + ] + }, + "key": { + "$ref": "#/$defs/key" + }, + "value": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "scheme", + "key", + "value" + ], + "additionalProperties": false + }, + "evidence": { + "type": "object", + "properties": { + "kind": { + "enum": [ + "crop", + "witness", + "source-file", + "person" + ] + }, + "sha256": { + "$ref": "#/$defs/hash" + }, + "node": { + "$ref": "#/$defs/nodeId" + }, + "page_fp": { + "$ref": "#/$defs/hash" + }, + "box": { + "$ref": "#/$defs/box" + }, + "by": { + "$ref": "#/$defs/key" + }, + "note": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "kind" + ], + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "kind": { + "const": "person" + } + } + }, + "then": { + "required": [ + "by" + ] + }, + "else": { + "required": [ + "sha256" + ] + } + } + ] + }, + "author": { + "oneOf": [ + { + "type": "object", + "properties": { + "key": { + "$ref": "#/$defs/key" + } + }, + "required": [ + "key" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "model": { + "type": "string", + "minLength": 1 + }, + "run": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "model", + "run" + ], + "additionalProperties": false + } + ] + }, + "hashing": { + "oneOf": [ + { + "type": "object", + "properties": { + "scheme": { + "const": "plain" + } + }, + "required": [ + "scheme" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "scheme": { + "const": "hmac-team" + }, + "key_id": { + "type": "string", + "pattern": "^[0-9a-f]{16}$" + } + }, + "required": [ + "scheme", + "key_id" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "scheme": { + "const": "hkdf-pages" + }, + "context": { + "type": "string", + "minLength": 1 + }, + "pages": { + "type": "array", + "items": { + "$ref": "#/$defs/hash" + }, + "minItems": 1 + } + }, + "required": [ + "scheme", + "context", + "pages" + ], + "additionalProperties": false + } + ] + }, + "quote": { + "type": "object", + "properties": { + "exact": { + "type": "string", + "maxLength": 200 + }, + "exact_hash": { + "$ref": "#/$defs/hash" + }, + "length": { + "type": "integer", + "minimum": 201 + }, + "prefix": { + "type": "string", + "minLength": 1, + "maxLength": 32 + }, + "suffix": { + "type": "string", + "minLength": 1, + "maxLength": 32 + } + }, + "required": [], + "additionalProperties": false, + "oneOf": [ + { + "required": [ + "exact" + ], + "not": { + "anyOf": [ + { + "required": [ + "exact_hash" + ] + }, + { + "required": [ + "length" + ] + } + ] + } + }, + { + "required": [ + "exact_hash", + "length" + ], + "not": { + "required": [ + "exact" + ] + } + } + ] + }, + "keyedQuote": { + "type": "object", + "properties": { + "mac": { + "$ref": "#/$defs/hash" + }, + "length": { + "type": "integer", + "minimum": 0 + }, + "prefix_mac": { + "$ref": "#/$defs/hash" + }, + "suffix_mac": { + "$ref": "#/$defs/hash" + } + }, + "required": [ + "mac", + "length" + ], + "additionalProperties": false + }, + "cellContext": { + "type": "object", + "properties": { + "table_label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "row_path": { + "type": "array", + "items": { + "type": "string" + } + }, + "column_path": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "table_label", + "row_path", + "column_path" + ], + "additionalProperties": false + }, + "keyedContext": { + "type": "object", + "properties": { + "table_label_mac": { + "anyOf": [ + { + "$ref": "#/$defs/hash" + }, + { + "type": "null" + } + ] + }, + "row_path_mac": { + "type": "array", + "items": { + "$ref": "#/$defs/hash" + } + }, + "column_path_mac": { + "type": "array", + "items": { + "$ref": "#/$defs/hash" + } + } + }, + "required": [ + "table_label_mac", + "row_path_mac", + "column_path_mac" + ], + "additionalProperties": false + }, + "agent": { + "type": "object", + "properties": { + "id": { + "type": "string", + "pattern": "^urn:scienting:(key|person|software):[^ ]+$" + }, + "type": { + "enum": [ + "Person", + "Software" + ] + }, + "name": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "id", + "type" + ], + "additionalProperties": false + } + } +} diff --git a/schemas/correction.schema.json b/schemas/correction.schema.json new file mode 100644 index 0000000..c24ec28 --- /dev/null +++ b/schemas/correction.schema.json @@ -0,0 +1,376 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/correction.schema.json", + "title": "Correction", + "description": "scienting-correction/1: a line of corrections.jsonl, or a proposal; spec/11-corrections.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-correction/1" + }, + "index": { + "type": "integer", + "minimum": 1 + }, + "id": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "op": { + "enum": [ + "replace", + "insert", + "delete", + "split", + "merge", + "move", + "reclassify", + "relabel", + "set" + ] + }, + "target": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "find": { + "type": "string", + "minLength": 1 + }, + "replace": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "runs.schema.json" + } + ] + }, + "run": { + "type": "integer", + "minimum": 0 + }, + "offset": { + "type": "integer", + "minimum": 0 + }, + "text": { + "type": "string", + "minLength": 1 + }, + "parent": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "node": { + "type": "object", + "description": "A node subtree to insert: kind, label, attrs, content and children; equation runs name a child by position." + }, + "with": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "joiner": { + "type": "string" + }, + "kind": { + "$ref": "common.schema.json#/$defs/nodeKind" + }, + "label": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "attr": { + "enum": [ + "level", + "columns", + "column", + "rowspan", + "colspan", + "role", + "header_path", + "ordered", + "marker", + "variant" + ] + }, + "value": {}, + "evidence": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/evidence" + }, + "minItems": 1 + }, + "author": { + "$ref": "common.schema.json#/$defs/author" + }, + "reason": { + "type": "string", + "minLength": 1 + }, + "at": { + "$ref": "common.schema.json#/$defs/time" + }, + "before": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/hash" + }, + { + "type": "null" + } + ] + }, + "path": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/nodeId" + } + }, + { + "type": "null" + } + ] + }, + "to_path": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/nodeId" + } + }, + "touched": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "uniqueItems": true + }, + "created": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "minItems": 1 + }, + "retired": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "minItems": 1 + }, + "from": {}, + "status": { + "enum": [ + "proposed" + ] + }, + "after": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/hash" + }, + { + "type": "null" + } + ] + }, + "place_after": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/nodeId" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "format", + "op", + "evidence", + "author", + "reason", + "at" + ], + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "op": { + "const": "replace" + } + } + }, + "then": { + "required": [ + "target", + "find", + "replace" + ] + } + }, + { + "if": { + "properties": { + "op": { + "const": "delete" + } + } + }, + "then": { + "required": [ + "target" + ] + } + }, + { + "if": { + "properties": { + "op": { + "const": "split" + } + } + }, + "then": { + "required": [ + "target", + "offset" + ] + } + }, + { + "if": { + "properties": { + "op": { + "const": "merge" + } + } + }, + "then": { + "required": [ + "target", + "with" + ] + } + }, + { + "if": { + "properties": { + "op": { + "const": "move" + } + } + }, + "then": { + "required": [ + "target", + "parent" + ] + } + }, + { + "if": { + "properties": { + "op": { + "const": "reclassify" + } + } + }, + "then": { + "required": [ + "target", + "kind" + ] + } + }, + { + "if": { + "properties": { + "op": { + "const": "relabel" + } + } + }, + "then": { + "required": [ + "target", + "label" + ] + } + }, + { + "if": { + "properties": { + "op": { + "const": "set" + } + } + }, + "then": { + "required": [ + "target", + "attr", + "value" + ] + } + }, + { + "if": { + "properties": { + "op": { + "const": "insert" + } + } + }, + "then": { + "oneOf": [ + { + "required": [ + "parent", + "node" + ] + }, + { + "required": [ + "target", + "run", + "offset", + "text" + ] + } + ] + } + }, + { + "if": { + "required": [ + "index" + ] + }, + "then": { + "required": [ + "id", + "before", + "after", + "path", + "touched" + ] + }, + "else": { + "required": [ + "status" + ] + } + } + ] +} diff --git a/schemas/dataset.schema.json b/schemas/dataset.schema.json new file mode 100644 index 0000000..43aac9d --- /dev/null +++ b/schemas/dataset.schema.json @@ -0,0 +1,365 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/dataset.schema.json", + "title": "Dataset", + "description": "datapackage.json of scienting-dataset/1: a Frictionless Data Package with units, uncertainty and origin; spec/15-datasets.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-dataset/1" + }, + "id": { + "$ref": "common.schema.json#/$defs/datasetId" + }, + "name": { + "$ref": "common.schema.json#/$defs/key" + }, + "title": { + "type": "string", + "minLength": 1 + }, + "licenses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "path": { + "$ref": "common.schema.json#/$defs/url" + } + }, + "required": [ + "name" + ], + "additionalProperties": false + } + }, + "resources": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "$ref": "common.schema.json#/$defs/key" + }, + "path": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9._-]*\\.(csv|parquet)$" + }, + "format": { + "enum": [ + "csv", + "parquet" + ] + }, + "mediatype": { + "type": "string", + "minLength": 1 + }, + "encoding": { + "const": "utf-8" + }, + "schema": { + "type": "object", + "properties": { + "fields": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "pattern": "^[A-Za-z_][A-Za-z0-9_.-]*$" + }, + "type": { + "enum": [ + "string", + "number", + "integer", + "boolean", + "date", + "datetime", + "any" + ] + }, + "title": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string", + "minLength": 1 + }, + "unit": { + "type": "string", + "minLength": 1 + }, + "uncertainty": { + "type": "object", + "properties": { + "field": { + "type": "string", + "minLength": 1 + }, + "kind": { + "enum": [ + "sd", + "se", + "resolution", + "unknown" + ] + } + }, + "required": [ + "kind" + ], + "additionalProperties": false + }, + "constraints": { + "type": "object" + } + }, + "required": [ + "name", + "type" + ], + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "number" + } + } + }, + "then": { + "required": [ + "unit" + ] + } + } + ] + }, + "minItems": 1 + }, + "primaryKey": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "minItems": 1 + } + ] + } + }, + "required": [ + "fields" + ], + "additionalProperties": false + }, + "origin": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "reported" + }, + "anchors": { + "const": "anchors.jsonl" + } + }, + "required": [ + "kind", + "anchors" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "digitized" + }, + "digitization": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "anchors": { + "const": "anchors.jsonl" + } + }, + "required": [ + "kind", + "digitization" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "computed" + }, + "claim": { + "type": "string", + "minLength": 1 + }, + "pin": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "kind", + "claim", + "pin" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "measured" + }, + "provenance": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "kind", + "provenance" + ], + "additionalProperties": false + } + ] + }, + "origin_field": { + "type": "string", + "minLength": 1 + }, + "origins": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "reported" + }, + "anchors": { + "const": "anchors.jsonl" + } + }, + "required": [ + "kind", + "anchors" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "digitized" + }, + "digitization": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "anchors": { + "const": "anchors.jsonl" + } + }, + "required": [ + "kind", + "digitization" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "computed" + }, + "claim": { + "type": "string", + "minLength": 1 + }, + "pin": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "kind", + "claim", + "pin" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "measured" + }, + "provenance": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "kind", + "provenance" + ], + "additionalProperties": false + } + ] + } + } + }, + "required": [ + "name", + "path", + "schema" + ], + "additionalProperties": false, + "anyOf": [ + { + "required": [ + "origin" + ] + }, + { + "required": [ + "origin_field", + "origins" + ] + } + ] + }, + "minItems": 1 + } + }, + "required": [ + "format", + "id", + "name", + "resources" + ], + "additionalProperties": false +} diff --git a/schemas/digitization.schema.json b/schemas/digitization.schema.json new file mode 100644 index 0000000..af16ce9 --- /dev/null +++ b/schemas/digitization.schema.json @@ -0,0 +1,368 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/digitization.schema.json", + "title": "Digitization", + "description": "scienting-digitization/1: how values were read off a figure panel; spec/16-digitization.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-digitization/1" + }, + "id": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "doc": { + "$ref": "common.schema.json#/$defs/qualifiedKey" + }, + "target": { + "type": "object", + "properties": { + "anchor": { + "$ref": "anchor.schema.json" + }, + "page_fp": { + "$ref": "common.schema.json#/$defs/hash" + }, + "region": { + "$ref": "common.schema.json#/$defs/box" + }, + "witness": { + "$ref": "common.schema.json#/$defs/hash" + }, + "image": { + "$ref": "common.schema.json#/$defs/hash" + } + }, + "required": [ + "anchor", + "region" + ], + "additionalProperties": false, + "oneOf": [ + { + "required": [ + "page_fp", + "witness" + ], + "not": { + "required": [ + "image" + ] + } + }, + { + "required": [ + "image" + ], + "not": { + "required": [ + "page_fp" + ] + } + } + ] + }, + "axes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "enum": [ + "x", + "y", + "y2", + "x2" + ] + }, + "scale": { + "enum": [ + "linear", + "log", + "reciprocal", + "date" + ] + }, + "unit": { + "type": "string", + "minLength": 1 + }, + "calibration": { + "type": "array", + "items": { + "type": "object", + "properties": { + "at": { + "type": "array", + "items": { + "type": "number" + }, + "minItems": 2, + "maxItems": 2 + }, + "value": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "at", + "value" + ], + "additionalProperties": false + }, + "minItems": 2 + }, + "check": { + "type": "object", + "properties": { + "at": { + "type": "array", + "items": { + "type": "number" + }, + "minItems": 2, + "maxItems": 2 + }, + "value": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "at", + "value" + ], + "additionalProperties": false + }, + "label": { + "type": "object", + "properties": { + "panel": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "figure_text": { + "$ref": "common.schema.json#/$defs/nodeId" + } + }, + "required": [ + "panel", + "figure_text" + ], + "additionalProperties": false + } + }, + "required": [ + "id", + "scale", + "calibration" + ], + "additionalProperties": false + }, + "minItems": 1 + }, + "series": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "$ref": "common.schema.json#/$defs/key" + }, + "legend": { + "type": "string", + "minLength": 1 + }, + "mark": { + "type": "object", + "properties": { + "color": { + "type": "string", + "pattern": "^#[0-9a-f]{6}$" + }, + "marker": { + "type": "string", + "minLength": 1 + }, + "line": { + "type": "string", + "minLength": 1 + } + }, + "required": [], + "additionalProperties": false + }, + "kind": { + "enum": [ + "points", + "line", + "bars", + "error-bars", + "region" + ] + }, + "values": { + "type": "array", + "items": { + "type": "object", + "properties": { + "at": { + "type": "array", + "items": { + "type": "number" + }, + "minItems": 2, + "maxItems": 2 + }, + "value": { + "type": "object", + "properties": { + "x": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "y": { + "$ref": "common.schema.json#/$defs/decimal" + } + }, + "required": [ + "x", + "y" + ], + "additionalProperties": false + }, + "uncertainty": { + "type": "object", + "properties": { + "x": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "y": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "resolution": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "marker": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "calibration": { + "$ref": "common.schema.json#/$defs/decimal" + } + }, + "required": [ + "x", + "y" + ], + "additionalProperties": false + } + }, + "required": [ + "at", + "value", + "uncertainty" + ], + "additionalProperties": false + }, + "minItems": 1 + } + }, + "required": [ + "id", + "kind", + "values" + ], + "additionalProperties": false + }, + "minItems": 1 + }, + "method": { + "type": "object", + "properties": { + "kind": { + "enum": [ + "manual", + "traced", + "proposed" + ] + }, + "tool": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "version": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "version" + ], + "additionalProperties": false + }, + "model": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "kind", + "tool" + ], + "additionalProperties": false + }, + "verification": { + "type": "object", + "properties": { + "image": { + "$ref": "common.schema.json#/$defs/hash" + }, + "residual": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "max_residual": { + "$ref": "common.schema.json#/$defs/decimal" + } + }, + "required": [ + "image", + "residual", + "max_residual" + ], + "additionalProperties": false + }, + "confirmation": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/recordId" + }, + { + "type": "null" + } + ] + }, + "dataset": { + "$ref": "common.schema.json#/$defs/datasetId" + }, + "rev": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "format", + "id", + "doc", + "target", + "axes", + "series", + "method", + "verification", + "confirmation", + "rev" + ], + "additionalProperties": false +} diff --git a/schemas/document.schema.json b/schemas/document.schema.json new file mode 100644 index 0000000..8ca0cce --- /dev/null +++ b/schemas/document.schema.json @@ -0,0 +1,228 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/document.schema.json", + "title": "Document", + "description": "document.json of a scienting-doc/1 package; spec/02-model.md and spec/12-package.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-doc/1" + }, + "key": { + "$ref": "common.schema.json#/$defs/key" + }, + "store": { + "$ref": "common.schema.json#/$defs/key" + }, + "aliases": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/key" + }, + "minItems": 1, + "uniqueItems": true + }, + "kind": { + "enum": [ + "article", + "supplement", + "chapter", + "book", + "thesis", + "report", + "draft", + "course-material", + "other" + ] + }, + "work": { + "type": "object", + "properties": { + "key": { + "$ref": "common.schema.json#/$defs/key" + }, + "same_as": { + "type": "array", + "items": { + "type": "string", + "pattern": "^(doi|arxiv|isbn|pmid|pmcid|url|lode):[^ ]+$" + }, + "uniqueItems": true + } + }, + "required": [ + "key", + "same_as" + ], + "additionalProperties": false + }, + "version": { + "type": "object", + "properties": { + "type": { + "enum": [ + "preprint", + "submitted", + "accepted", + "version-of-record", + "erratum", + "retraction", + "supplement", + "draft", + "other" + ] + }, + "seq": { + "type": "integer", + "minimum": 1 + }, + "date": { + "$ref": "common.schema.json#/$defs/date" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "relations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "enum": [ + "supplement-of", + "part-of", + "version-of", + "erratum-of", + "retraction-of", + "translation-of" + ] + }, + "target": { + "$ref": "common.schema.json#/$defs/qualifiedKey" + } + }, + "required": [ + "type", + "target" + ], + "additionalProperties": false + } + }, + "meta": { + "type": "object", + "description": "A CSL-JSON item for the version." + }, + "language": { + "$ref": "common.schema.json#/$defs/language" + }, + "license": { + "$ref": "common.schema.json#/$defs/license" + }, + "policy": { + "enum": [ + "full", + "checks-only" + ] + }, + "hashing": { + "$ref": "common.schema.json#/$defs/hashing" + }, + "root": { + "$ref": "common.schema.json#/$defs/hash" + }, + "meta_hash": { + "$ref": "common.schema.json#/$defs/hash" + }, + "rev": { + "type": "integer", + "minimum": 0 + }, + "counts": { + "type": "object", + "properties": { + "nodes": { + "type": "integer", + "minimum": 1 + }, + "leaves": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "nodes", + "leaves" + ], + "additionalProperties": false + }, + "fidelity": { + "type": "object", + "properties": { + "lowest": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/level" + }, + { + "type": "null" + } + ] + }, + "counts": { + "type": "object", + "properties": { + "F0": { + "type": "integer", + "minimum": 0 + }, + "F1": { + "type": "integer", + "minimum": 0 + }, + "F2": { + "type": "integer", + "minimum": 0 + }, + "F3": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "F0", + "F1", + "F2", + "F3" + ], + "additionalProperties": false + } + }, + "required": [ + "lowest", + "counts" + ], + "additionalProperties": false + } + }, + "required": [ + "format", + "key", + "kind", + "work", + "version", + "relations", + "meta", + "language", + "policy", + "hashing", + "root", + "meta_hash", + "rev", + "counts", + "fidelity" + ], + "additionalProperties": false +} diff --git a/schemas/draft-ids.schema.json b/schemas/draft-ids.schema.json new file mode 100644 index 0000000..643ec69 --- /dev/null +++ b/schemas/draft-ids.schema.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/draft-ids.schema.json", + "title": "Draft sentence IDs", + "description": "One line of a Typst project's ids.jsonl: scienting-draft-ids/1; spec/21-drafts.md.", + "type": "object", + "properties": { + "id": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "text_hash": { + "$ref": "common.schema.json#/$defs/hash" + }, + "section": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/nodeId" + }, + { + "type": "null" + } + ] + }, + "ord": { + "type": "integer", + "minimum": 0 + }, + "pinned": { + "$ref": "common.schema.json#/$defs/key" + } + }, + "required": [ + "id", + "text_hash", + "section", + "ord" + ], + "additionalProperties": false +} diff --git a/schemas/exercise.schema.json b/schemas/exercise.schema.json new file mode 100644 index 0000000..ddbcb4d --- /dev/null +++ b/schemas/exercise.schema.json @@ -0,0 +1,351 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/exercise.schema.json", + "title": "Exercise", + "description": "scienting-exercise/1: the body of an exercise annotation; spec/19-exercises.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-exercise/1" + }, + "exercise": { + "enum": [ + "anchor", + "check", + "trace", + "reproduce", + "verify" + ] + }, + "prompt": { + "type": "string", + "minLength": 1 + }, + "summary": { + "type": "string", + "minLength": 1 + }, + "key": { + "type": "object", + "properties": { + "elements": { + "type": "array", + "items": { + "type": "object", + "properties": { + "anchors": { + "type": "array", + "items": { + "$ref": "anchor.schema.json" + }, + "minItems": 1 + }, + "points": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "feedback": { + "type": "object", + "properties": { + "hit": { + "type": "string" + }, + "miss": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + } + }, + "required": [ + "anchors", + "points" + ], + "additionalProperties": false + }, + "minItems": 1 + }, + "verdict": { + "type": "object", + "properties": { + "value": { + "enum": [ + "supports", + "partly", + "does-not", + "cannot-tell" + ] + }, + "points": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "feedback": { + "type": "object", + "properties": { + "hit": { + "type": "string" + }, + "miss": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + } + }, + "required": [ + "value", + "points" + ], + "additionalProperties": false + }, + "chain": { + "type": "array", + "items": { + "type": "object", + "properties": { + "anchors": { + "type": "array", + "items": { + "$ref": "anchor.schema.json" + }, + "minItems": 1 + }, + "points": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "feedback": { + "type": "object", + "properties": { + "hit": { + "type": "string" + }, + "miss": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + } + }, + "required": [ + "anchors", + "points" + ], + "additionalProperties": false + }, + "minItems": 1 + }, + "value": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "tolerance": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "unit": { + "type": "string", + "minLength": 1 + }, + "digitization": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "points": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "feedback": { + "type": "object", + "properties": { + "hit": { + "type": "string" + }, + "miss": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "anchors": { + "type": "array", + "items": { + "$ref": "anchor.schema.json" + }, + "minItems": 1 + }, + "verdict": { + "enum": [ + "supports", + "partly", + "does-not", + "cannot-tell" + ] + }, + "points": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "feedback": { + "type": "object", + "properties": { + "hit": { + "type": "string" + }, + "miss": { + "type": "string" + } + }, + "required": [], + "additionalProperties": false + } + }, + "required": [ + "anchors", + "verdict", + "points" + ], + "additionalProperties": false + }, + "minItems": 1 + } + }, + "required": [], + "additionalProperties": false + }, + "rule": { + "type": "object", + "properties": { + "match": { + "enum": [ + "same-node", + "overlap", + "chain" + ] + }, + "min_overlap": { + "$ref": "common.schema.json#/$defs/decimal" + } + }, + "required": [ + "match" + ], + "additionalProperties": false + } + }, + "required": [ + "format", + "exercise", + "prompt", + "key", + "rule" + ], + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "exercise": { + "const": "anchor" + } + } + }, + "then": { + "properties": { + "key": { + "required": [ + "elements" + ] + } + } + } + }, + { + "if": { + "properties": { + "exercise": { + "const": "check" + } + } + }, + "then": { + "properties": { + "key": { + "required": [ + "elements", + "verdict" + ] + } + } + } + }, + { + "if": { + "properties": { + "exercise": { + "const": "trace" + } + } + }, + "then": { + "properties": { + "key": { + "required": [ + "chain" + ] + }, + "rule": { + "properties": { + "match": { + "const": "chain" + } + } + } + } + } + }, + { + "if": { + "properties": { + "exercise": { + "const": "reproduce" + } + } + }, + "then": { + "properties": { + "key": { + "required": [ + "value", + "tolerance", + "points" + ] + } + } + } + }, + { + "if": { + "properties": { + "exercise": { + "const": "verify" + } + } + }, + "then": { + "required": [ + "summary" + ], + "properties": { + "key": { + "required": [ + "errors" + ] + } + } + } + } + ] +} diff --git a/schemas/grade.schema.json b/schemas/grade.schema.json new file mode 100644 index 0000000..b1e23c2 --- /dev/null +++ b/schemas/grade.schema.json @@ -0,0 +1,63 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/grade.schema.json", + "title": "Grade", + "description": "scienting-grade/1: the grader's result for one submission; spec/19-exercises.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-grade/1" + }, + "submission": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "exercise": { + "type": "string", + "pattern": "^urn:scienting:annotation:[a-z0-9][a-z0-9._-]*/[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6,25}$" + }, + "score": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "max": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "element": { + "type": "string", + "minLength": 1 + }, + "points": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "max": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "feedback": { + "type": "string" + } + }, + "required": [ + "element", + "points", + "max", + "feedback" + ], + "additionalProperties": false + }, + "minItems": 1 + } + }, + "required": [ + "format", + "submission", + "exercise", + "score", + "max", + "items" + ], + "additionalProperties": false +} diff --git a/schemas/id-entry.schema.json b/schemas/id-entry.schema.json new file mode 100644 index 0000000..b1160a0 --- /dev/null +++ b/schemas/id-entry.schema.json @@ -0,0 +1,87 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/id-entry.schema.json", + "title": "ID table entry", + "description": "One line of ids.jsonl; spec/04-identity.md.", + "type": "object", + "properties": { + "id": { + "$ref": "common.schema.json#/$defs/nodeRef" + }, + "kind": { + "enum": [ + "retired", + "alias" + ] + }, + "successor": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/nodeId" + }, + { + "type": "null" + } + ] + }, + "node_kind": { + "$ref": "common.schema.json#/$defs/nodeKind" + }, + "rev": { + "type": "integer", + "minimum": 1 + } + }, + "required": [ + "id", + "kind", + "successor" + ], + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "kind": { + "const": "retired" + } + } + }, + "then": { + "required": [ + "node_kind", + "rev" + ], + "properties": { + "id": { + "$ref": "common.schema.json#/$defs/nodeId" + } + } + }, + "else": { + "properties": { + "id": { + "$ref": "common.schema.json#/$defs/alias" + }, + "successor": { + "$ref": "common.schema.json#/$defs/nodeId" + } + }, + "not": { + "anyOf": [ + { + "required": [ + "rev" + ] + }, + { + "required": [ + "node_kind" + ] + } + ] + } + } + } + ] +} diff --git a/schemas/layer.schema.json b/schemas/layer.schema.json new file mode 100644 index 0000000..c13bba0 --- /dev/null +++ b/schemas/layer.schema.json @@ -0,0 +1,89 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/layer.schema.json", + "title": "Layer", + "description": "layer.json of scienting-layer/1: a W3C AnnotationCollection; spec/18-layers.md.", + "type": "object", + "properties": { + "@context": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "minItems": 2 + }, + "format": { + "const": "scienting-layer/1" + }, + "id": { + "type": "string", + "pattern": "^urn:scienting:layer:[a-z0-9][a-z0-9._-]*/[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6,25}$" + }, + "type": { + "const": "AnnotationCollection" + }, + "label": { + "type": "string", + "minLength": 1 + }, + "purpose": { + "type": "string", + "minLength": 1 + }, + "audience": { + "enum": [ + "novice", + "student", + "expert", + "mixed" + ] + }, + "visibility": { + "enum": [ + "private", + "team", + "public" + ] + }, + "license": { + "$ref": "common.schema.json#/$defs/license" + }, + "creator": { + "$ref": "common.schema.json#/$defs/agent" + }, + "created": { + "$ref": "common.schema.json#/$defs/time" + }, + "project": { + "$ref": "common.schema.json#/$defs/key" + }, + "docs": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/qualifiedKey" + }, + "minItems": 1, + "uniqueItems": true + }, + "total": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "@context", + "format", + "id", + "type", + "label", + "purpose", + "visibility", + "license", + "creator", + "created", + "docs", + "total" + ], + "additionalProperties": false +} diff --git a/schemas/location.schema.json b/schemas/location.schema.json new file mode 100644 index 0000000..cd9eede --- /dev/null +++ b/schemas/location.schema.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/location.schema.json", + "title": "Location", + "description": "One line of locations.jsonl; spec/07-geometry.md.", + "type": "object", + "properties": { + "node": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "page_fp": { + "$ref": "common.schema.json#/$defs/hash" + }, + "page": { + "type": "integer", + "minimum": 1 + }, + "page_label": { + "type": "string", + "minLength": 1 + }, + "boxes": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/box" + }, + "minItems": 1 + }, + "approx": { + "const": true + } + }, + "required": [ + "node", + "page_fp", + "page", + "boxes" + ], + "additionalProperties": false +} diff --git a/schemas/manifest.schema.json b/schemas/manifest.schema.json new file mode 100644 index 0000000..08dcf8a --- /dev/null +++ b/schemas/manifest.schema.json @@ -0,0 +1,59 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/manifest.schema.json", + "title": "Package manifest", + "description": "MANIFEST.json, scienting-package/1; spec/12-package.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-package/1" + }, + "doc": { + "const": "scienting-doc/1" + }, + "key": { + "$ref": "common.schema.json#/$defs/key" + }, + "files": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string", + "minLength": 1, + "maxLength": 512 + }, + "sha256": { + "$ref": "common.schema.json#/$defs/hash" + }, + "size": { + "type": "integer", + "minimum": 0 + }, + "present": { + "const": false + }, + "media_type": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "path", + "sha256", + "size" + ], + "additionalProperties": false + }, + "minItems": 1 + } + }, + "required": [ + "format", + "doc", + "key", + "files" + ], + "additionalProperties": false +} diff --git a/schemas/mathml.schema.json b/schemas/mathml.schema.json new file mode 100644 index 0000000..890b440 --- /dev/null +++ b/schemas/mathml.schema.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/mathml.schema.json", + "title": "Derived MathML", + "description": "One line of derived/mathml.jsonl: MathML made by a pinned tool; never authoritative; spec/12-package.md.", + "type": "object", + "properties": { + "node": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "run": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ] + }, + "tool": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "version": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "version" + ], + "additionalProperties": false + }, + "mathml": { + "type": "string", + "pattern": "^]" + } + }, + "required": [ + "node", + "run", + "tool", + "mathml" + ], + "additionalProperties": false +} diff --git a/schemas/node.schema.json b/schemas/node.schema.json new file mode 100644 index 0000000..8e0122f --- /dev/null +++ b/schemas/node.schema.json @@ -0,0 +1,675 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/node.schema.json", + "title": "Node", + "description": "One line of nodes.jsonl; spec/03-nodes.md.", + "type": "object", + "properties": { + "id": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "kind": { + "$ref": "common.schema.json#/$defs/nodeKind" + }, + "parent": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/nodeId" + }, + { + "type": "null" + } + ] + }, + "ord": { + "type": "integer", + "minimum": 0 + }, + "label": { + "type": "string", + "minLength": 1, + "maxLength": 256 + }, + "attrs": { + "type": "object", + "properties": { + "level": { + "type": "integer", + "minimum": 1 + }, + "columns": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "header_path": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/nodeId" + } + } + }, + "required": [ + "id", + "header_path" + ], + "additionalProperties": false + } + }, + "column": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/nodeId" + }, + { + "type": "null" + } + ] + }, + "rowspan": { + "type": "integer", + "minimum": 1 + }, + "colspan": { + "type": "integer", + "minimum": 1 + }, + "role": { + "enum": [ + "data", + "column-header", + "row-header", + "row-group-header" + ] + }, + "header_path": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/nodeId" + } + }, + "ordered": { + "type": "boolean" + }, + "marker": { + "type": "string", + "minLength": 1 + }, + "variant": { + "type": "string", + "minLength": 1 + }, + "image": { + "type": "object", + "properties": { + "sha256": { + "$ref": "common.schema.json#/$defs/hash" + }, + "media_type": { + "type": "string", + "minLength": 1 + }, + "native": { + "type": "boolean" + }, + "dpi": { + "type": "integer", + "minimum": 1 + } + }, + "required": [ + "sha256", + "media_type", + "native" + ], + "additionalProperties": false + }, + "crop": { + "type": "object", + "properties": { + "sha256": { + "$ref": "common.schema.json#/$defs/hash" + }, + "media_type": { + "type": "string", + "minLength": 1 + }, + "dpi": { + "type": "integer", + "minimum": 1 + } + }, + "required": [ + "sha256", + "media_type", + "dpi" + ], + "additionalProperties": false + }, + "figure_text": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "text": { + "type": "string", + "minLength": 1 + }, + "role": { + "enum": [ + "axis-label", + "tick-label", + "legend", + "annotation", + "other" + ] + }, + "page_fp": { + "$ref": "common.schema.json#/$defs/hash" + }, + "boxes": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/box" + }, + "minItems": 1 + } + }, + "required": [ + "id", + "text", + "role" + ], + "additionalProperties": false + } + } + }, + "required": [], + "additionalProperties": false, + "minProperties": 1 + }, + "content": {}, + "withheld": { + "const": true + }, + "fidelity": { + "$ref": "common.schema.json#/$defs/level" + }, + "prov": { + "type": "object", + "properties": { + "witnesses": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "minItems": 1, + "uniqueItems": true + }, + "backend": { + "type": "string", + "minLength": 1 + }, + "reading": { + "type": "string", + "minLength": 1 + }, + "corroborated_by": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "uniqueItems": true + } + }, + "required": [], + "additionalProperties": false + }, + "text_hash": { + "$ref": "common.schema.json#/$defs/hash" + }, + "match_hash": { + "$ref": "common.schema.json#/$defs/hash" + }, + "align_key": { + "$ref": "common.schema.json#/$defs/hash" + }, + "own_hash": { + "$ref": "common.schema.json#/$defs/hash" + }, + "node_hash": { + "$ref": "common.schema.json#/$defs/hash" + } + }, + "required": [ + "id", + "kind", + "parent", + "ord", + "text_hash", + "match_hash", + "align_key", + "own_hash", + "node_hash" + ], + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "kind": { + "enum": [ + "sentence", + "cell", + "reference", + "authors", + "keywords" + ] + } + } + }, + "then": { + "anyOf": [ + { + "required": [ + "withheld" + ] + }, + { + "required": [ + "content" + ], + "properties": { + "content": { + "$ref": "runs.schema.json" + } + } + } + ] + } + }, + { + "if": { + "properties": { + "kind": { + "enum": [ + "equation", + "equation-line" + ] + } + } + }, + "then": { + "anyOf": [ + { + "required": [ + "withheld" + ] + }, + { + "required": [ + "content" + ], + "properties": { + "content": { + "type": "object", + "properties": { + "notation": { + "enum": [ + "tex", + "typst" + ] + }, + "source": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "notation", + "source" + ], + "additionalProperties": false + } + } + } + ] + } + }, + { + "if": { + "properties": { + "kind": { + "enum": [ + "code", + "algorithm" + ] + } + } + }, + "then": { + "anyOf": [ + { + "required": [ + "withheld" + ] + }, + { + "required": [ + "content" + ], + "properties": { + "content": { + "type": "object", + "properties": { + "language": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string" + } + }, + "required": [ + "text" + ], + "additionalProperties": false + } + } + } + ] + } + }, + { + "if": { + "properties": { + "kind": { + "not": { + "enum": [ + "sentence", + "cell", + "reference", + "authors", + "keywords", + "equation", + "equation-line", + "code", + "algorithm" + ] + } + } + } + }, + "then": { + "not": { + "anyOf": [ + { + "required": [ + "content" + ] + }, + { + "required": [ + "withheld" + ] + }, + { + "required": [ + "fidelity" + ] + } + ] + } + } + }, + { + "if": { + "properties": { + "kind": { + "not": { + "enum": [ + "section", + "figure", + "panel", + "table", + "theorem", + "footnote", + "equation", + "equation-line", + "reference", + "code", + "algorithm" + ] + } + } + } + }, + "then": { + "not": { + "required": [ + "label" + ] + } + } + }, + { + "if": { + "properties": { + "kind": { + "const": "section" + } + } + }, + "then": { + "required": [ + "attrs" + ], + "properties": { + "attrs": { + "required": [ + "level" + ] + } + } + } + }, + { + "if": { + "properties": { + "kind": { + "not": { + "enum": [ + "section", + "table", + "cell", + "row", + "list", + "item", + "theorem", + "panel" + ] + } + } + } + }, + "then": { + "not": { + "required": [ + "attrs" + ] + } + } + }, + { + "if": { + "properties": { + "kind": { + "const": "section" + } + } + }, + "then": { + "properties": { + "attrs": { + "propertyNames": { + "enum": [ + "level" + ] + } + } + } + } + }, + { + "if": { + "properties": { + "kind": { + "const": "table" + } + } + }, + "then": { + "properties": { + "attrs": { + "propertyNames": { + "enum": [ + "columns" + ] + } + } + } + } + }, + { + "if": { + "properties": { + "kind": { + "const": "cell" + } + } + }, + "then": { + "properties": { + "attrs": { + "propertyNames": { + "enum": [ + "column", + "rowspan", + "colspan", + "role" + ] + } + } + } + } + }, + { + "if": { + "properties": { + "kind": { + "const": "row" + } + } + }, + "then": { + "properties": { + "attrs": { + "propertyNames": { + "enum": [ + "header_path" + ] + } + } + } + } + }, + { + "if": { + "properties": { + "kind": { + "const": "list" + } + } + }, + "then": { + "properties": { + "attrs": { + "propertyNames": { + "enum": [ + "ordered" + ] + } + } + } + } + }, + { + "if": { + "properties": { + "kind": { + "const": "item" + } + } + }, + "then": { + "properties": { + "attrs": { + "propertyNames": { + "enum": [ + "marker" + ] + } + } + } + } + }, + { + "if": { + "properties": { + "kind": { + "const": "theorem" + } + } + }, + "then": { + "properties": { + "attrs": { + "propertyNames": { + "enum": [ + "variant" + ] + } + } + } + } + }, + { + "if": { + "properties": { + "kind": { + "const": "panel" + } + } + }, + "then": { + "properties": { + "attrs": { + "propertyNames": { + "enum": [ + "image", + "crop", + "figure_text" + ] + } + } + } + } + } + ] +} diff --git a/schemas/page.schema.json b/schemas/page.schema.json new file mode 100644 index 0000000..8190fee --- /dev/null +++ b/schemas/page.schema.json @@ -0,0 +1,44 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/page.schema.json", + "title": "Page", + "description": "One line of pages.jsonl; spec/07-geometry.md.", + "type": "object", + "properties": { + "witness": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "page": { + "type": "integer", + "minimum": 1 + }, + "page_fp": { + "$ref": "common.schema.json#/$defs/hash" + }, + "size": { + "$ref": "common.schema.json#/$defs/size" + }, + "page_label": { + "type": "string", + "minLength": 1 + }, + "text_layer": { + "type": "boolean" + }, + "stamps_removed": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/key" + }, + "minItems": 1 + } + }, + "required": [ + "witness", + "page", + "page_fp", + "size", + "text_layer" + ], + "additionalProperties": false +} diff --git a/schemas/policy.schema.json b/schemas/policy.schema.json new file mode 100644 index 0000000..8ab6d25 --- /dev/null +++ b/schemas/policy.schema.json @@ -0,0 +1,143 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/policy.schema.json", + "title": "Team rights policy", + "description": "scienting-policy/1: a signed decision that resolves unknown uses; spec/14-rights.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-policy/1" + }, + "id": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "project": { + "$ref": "common.schema.json#/$defs/key" + }, + "applies_to": { + "type": "object", + "properties": { + "basis": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/basis" + }, + "minItems": 1 + }, + "license": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/spdx" + }, + "minItems": 1 + }, + "doi_prefixes": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "minItems": 1 + }, + "witnesses": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/hash" + }, + "minItems": 1 + } + }, + "required": [], + "additionalProperties": false, + "minProperties": 1 + }, + "uses": { + "type": "object", + "properties": { + "read": { + "$ref": "common.schema.json#/$defs/tri" + }, + "tdm": { + "$ref": "common.schema.json#/$defs/tri" + }, + "redistribute": { + "$ref": "common.schema.json#/$defs/tri" + }, + "quote-public": { + "$ref": "common.schema.json#/$defs/tri" + }, + "accessible-copy": { + "$ref": "common.schema.json#/$defs/tri" + }, + "ai": { + "type": "object", + "properties": { + "internal/local": { + "$ref": "common.schema.json#/$defs/tri" + }, + "internal/tenancy": { + "$ref": "common.schema.json#/$defs/tri" + }, + "internal/outside-no-retention": { + "$ref": "common.schema.json#/$defs/tri" + }, + "internal/outside": { + "$ref": "common.schema.json#/$defs/tri" + }, + "external/local": { + "$ref": "common.schema.json#/$defs/tri" + }, + "external/tenancy": { + "$ref": "common.schema.json#/$defs/tri" + }, + "external/outside-no-retention": { + "$ref": "common.schema.json#/$defs/tri" + }, + "external/outside": { + "$ref": "common.schema.json#/$defs/tri" + } + }, + "required": [], + "additionalProperties": false + } + }, + "required": [], + "additionalProperties": false + }, + "statement": { + "type": "string", + "minLength": 1 + }, + "by": { + "$ref": "common.schema.json#/$defs/key" + }, + "at": { + "$ref": "common.schema.json#/$defs/time" + }, + "valid_until": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/time" + }, + { + "type": "null" + } + ] + }, + "signature": { + "$ref": "common.schema.json#/$defs/signature" + } + }, + "required": [ + "format", + "id", + "applies_to", + "uses", + "statement", + "by", + "at", + "valid_until", + "signature" + ], + "additionalProperties": false +} diff --git a/schemas/profile.schema.json b/schemas/profile.schema.json new file mode 100644 index 0000000..545b107 --- /dev/null +++ b/schemas/profile.schema.json @@ -0,0 +1,82 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/profile.schema.json", + "title": "Team profile", + "description": "scienting-profile/1: what backend conditions ask about a team; spec/14-rights.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-profile/1" + }, + "team": { + "$ref": "common.schema.json#/$defs/key" + }, + "purpose": { + "enum": [ + "research", + "personal", + "education", + "startup", + "commercial" + ] + }, + "revenue_or_funding_usd": { + "anyOf": [ + { + "type": "object", + "properties": { + "at_most": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "at_most" + ], + "additionalProperties": false + }, + { + "type": "null" + } + ] + }, + "competes_with": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + }, + { + "type": "null" + } + ] + }, + "recorded_by": { + "$ref": "common.schema.json#/$defs/key" + }, + "at": { + "$ref": "common.schema.json#/$defs/time" + } + }, + "required": [ + "format", + "team", + "purpose", + "revenue_or_funding_usd", + "competes_with", + "recorded_by", + "at" + ], + "additionalProperties": false +} diff --git a/schemas/project.schema.json b/schemas/project.schema.json new file mode 100644 index 0000000..8e06711 --- /dev/null +++ b/schemas/project.schema.json @@ -0,0 +1,237 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/project.schema.json", + "title": "Project", + "description": "scienting-project/1: a team's curated set of documents and people; spec/20-projects.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-project/1" + }, + "key": { + "$ref": "common.schema.json#/$defs/key" + }, + "store": { + "$ref": "common.schema.json#/$defs/key" + }, + "name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string", + "minLength": 1 + }, + "members": { + "type": "array", + "items": { + "type": "object", + "properties": { + "person": { + "type": "string", + "minLength": 1 + }, + "role": { + "enum": [ + "owner", + "editor", + "reader", + "guest" + ] + }, + "keys": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/key" + }, + "uniqueItems": true + } + }, + "required": [ + "person", + "role", + "keys" + ], + "additionalProperties": false + }, + "minItems": 1 + }, + "documents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "doc": { + "$ref": "common.schema.json#/$defs/qualifiedKey" + }, + "reason": { + "type": "string", + "minLength": 1 + }, + "tags": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/key" + }, + "uniqueItems": true + }, + "status": { + "type": "object", + "additionalProperties": { + "enum": [ + "unread", + "reading", + "read" + ] + } + } + }, + "required": [ + "doc", + "reason" + ], + "additionalProperties": false + } + }, + "paths": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "$ref": "common.schema.json#/$defs/key" + }, + "title": { + "type": "string", + "minLength": 1 + }, + "steps": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "enum": [ + "document", + "node", + "claim", + "layer" + ] + }, + "ref": { + "type": "string", + "minLength": 1 + }, + "note": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "type", + "ref" + ], + "additionalProperties": false + }, + "minItems": 1 + } + }, + "required": [ + "id", + "title", + "steps" + ], + "additionalProperties": false + } + }, + "layers": { + "type": "array", + "items": { + "type": "string", + "pattern": "^urn:scienting:layer:[a-z0-9][a-z0-9._-]*/[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6,25}$" + } + }, + "datasets": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/datasetId" + } + }, + "views": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/key" + } + }, + "drafts": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/qualifiedKey" + } + }, + "claims": { + "type": "object", + "properties": { + "lode": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "lode" + ], + "additionalProperties": false + }, + "settings": { + "type": "object", + "properties": { + "digit_rule": { + "enum": [ + "all", + "anchored-sections", + "none" + ] + }, + "drift_threshold": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "spot_check": { + "type": "object", + "properties": { + "rate": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "minimum": { + "type": "integer", + "minimum": 1 + } + }, + "required": [ + "rate", + "minimum" + ], + "additionalProperties": false + }, + "rights_unknown": { + "enum": [ + "refuse", + "warn" + ] + }, + "stages": { + "$ref": "common.schema.json#/$defs/key" + } + }, + "required": [], + "additionalProperties": false + } + }, + "required": [ + "format", + "key", + "name", + "members", + "documents" + ], + "additionalProperties": false +} diff --git a/schemas/provenance.schema.json b/schemas/provenance.schema.json new file mode 100644 index 0000000..f28b2f1 --- /dev/null +++ b/schemas/provenance.schema.json @@ -0,0 +1,154 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/provenance.schema.json", + "title": "Provenance", + "description": "provenance.json of a package; spec/12-package.md.", + "type": "object", + "properties": { + "tools": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "version": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name", + "version" + ], + "additionalProperties": false + } + }, + "backends": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "version": { + "type": "string", + "minLength": 1 + }, + "declaration": { + "$ref": "common.schema.json#/$defs/hash" + } + }, + "required": [ + "name", + "version" + ], + "additionalProperties": false + } + }, + "readings": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1 + }, + "witness": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "backend": { + "type": "string", + "minLength": 1 + }, + "sha256": { + "$ref": "common.schema.json#/$defs/hash" + } + }, + "required": [ + "id", + "witness", + "backend", + "sha256" + ], + "additionalProperties": false + } + }, + "stages": { + "type": "array", + "items": { + "type": "object", + "properties": { + "stage": { + "enum": [ + "acquire", + "read", + "witness", + "assemble", + "reconcile", + "segment", + "locate", + "structure", + "figures", + "mint", + "suspects", + "review", + "gate", + "finalize", + "export", + "hand" + ] + }, + "tool": { + "type": "string", + "minLength": 1 + }, + "inputs": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/hash" + } + }, + "output": { + "$ref": "common.schema.json#/$defs/hash" + }, + "processor": { + "$ref": "common.schema.json#/$defs/processor" + }, + "uses": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "job": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "stage", + "processor" + ], + "additionalProperties": false + } + }, + "session": { + "type": "object" + }, + "note": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "tools" + ], + "additionalProperties": false +} diff --git a/schemas/qa-report.schema.json b/schemas/qa-report.schema.json new file mode 100644 index 0000000..8feea1c --- /dev/null +++ b/schemas/qa-report.schema.json @@ -0,0 +1,83 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/qa-report.schema.json", + "title": "QA report", + "description": "scienting-qa-report/1: reviewer error bounds for a delivery; spec/08-fidelity.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-qa-report/1" + }, + "id": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "delivery": { + "type": "string", + "minLength": 1 + }, + "docs": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/qualifiedKey" + }, + "minItems": 1 + }, + "receipts": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "minItems": 1 + }, + "reviewers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "$ref": "common.schema.json#/$defs/key" + }, + "sampled": { + "type": "integer", + "minimum": 1 + }, + "errors": { + "type": "integer", + "minimum": 0 + }, + "confidence": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "method": { + "const": "clopper-pearson" + }, + "bound": { + "$ref": "common.schema.json#/$defs/decimal" + } + }, + "required": [ + "key", + "sampled", + "errors", + "confidence", + "method", + "bound" + ], + "additionalProperties": false + }, + "minItems": 1 + }, + "at": { + "$ref": "common.schema.json#/$defs/time" + } + }, + "required": [ + "format", + "id", + "docs", + "receipts", + "reviewers", + "at" + ], + "additionalProperties": false +} diff --git a/schemas/receipt.schema.json b/schemas/receipt.schema.json new file mode 100644 index 0000000..515e7e8 --- /dev/null +++ b/schemas/receipt.schema.json @@ -0,0 +1,219 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/receipt.schema.json", + "title": "Review receipt", + "description": "scienting-receipt/1; spec/08-fidelity.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-receipt/1" + }, + "id": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "doc": { + "$ref": "common.schema.json#/$defs/key" + }, + "rev": { + "type": "integer", + "minimum": 0 + }, + "level": { + "$ref": "common.schema.json#/$defs/receiptLevel" + }, + "scope": { + "type": "string", + "pattern": "^(all|section:[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6}|page:[1-9][0-9]*|targeted:[a-z0-9-]+|qa:[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6,25})$" + }, + "nodes": { + "type": "array", + "items": { + "type": "array", + "prefixItems": [ + { + "$ref": "common.schema.json#/$defs/nodeId" + }, + { + "$ref": "common.schema.json#/$defs/hash" + } + ], + "minItems": 2, + "maxItems": 2 + } + }, + "records": { + "type": "array", + "items": { + "type": "array", + "prefixItems": [ + { + "enum": [ + "annotation", + "digitization", + "correction", + "layer", + "checklist" + ] + }, + { + "$ref": "common.schema.json#/$defs/recordId" + }, + { + "$ref": "common.schema.json#/$defs/hash" + } + ], + "minItems": 3, + "maxItems": 3 + } + }, + "root": { + "$ref": "common.schema.json#/$defs/hash" + }, + "evidence": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/evidence" + } + }, + "by": { + "$ref": "common.schema.json#/$defs/key" + }, + "at": { + "$ref": "common.schema.json#/$defs/time" + }, + "qa": { + "type": "object", + "properties": { + "of": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "key": { + "$ref": "common.schema.json#/$defs/key" + }, + "seed": { + "$ref": "common.schema.json#/$defs/base64" + }, + "rate": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "minimum": { + "type": "integer", + "minimum": 1 + }, + "sample": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "minItems": 1 + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "node": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "kind": { + "enum": [ + "word", + "number", + "equation", + "structure", + "other" + ] + }, + "note": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "node" + ], + "additionalProperties": false + } + } + }, + "required": [ + "of", + "key", + "seed", + "rate", + "minimum", + "sample", + "errors" + ], + "additionalProperties": false + }, + "export_of": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "keyed": { + "$ref": "common.schema.json#/$defs/hashing" + }, + "signature": { + "$ref": "common.schema.json#/$defs/signature" + } + }, + "required": [ + "format", + "id", + "doc", + "rev", + "level", + "scope", + "nodes", + "root", + "evidence", + "by", + "at", + "signature" + ], + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "scope": { + "pattern": "^qa:" + } + } + }, + "then": { + "required": [ + "qa" + ] + }, + "else": { + "not": { + "required": [ + "qa" + ] + } + } + }, + { + "anyOf": [ + { + "properties": { + "nodes": { + "minItems": 1 + } + } + }, + { + "required": [ + "records" + ], + "properties": { + "records": { + "minItems": 1 + } + } + } + ] + } + ] +} diff --git a/schemas/reference.schema.json b/schemas/reference.schema.json new file mode 100644 index 0000000..4ba1e34 --- /dev/null +++ b/schemas/reference.schema.json @@ -0,0 +1,73 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/reference.schema.json", + "title": "Reference record", + "description": "One line of references.jsonl; spec/10-references.md.", + "type": "object", + "properties": { + "node": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "label": { + "type": "string", + "minLength": 1 + }, + "csl": { + "type": "object" + }, + "resolution": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "doi" + }, + "doi": { + "type": "string", + "pattern": "^10\\.[0-9]{4,9}/[^ ]+$" + } + }, + "required": [ + "type", + "doi" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "document" + }, + "doc": { + "$ref": "common.schema.json#/$defs/qualifiedKey" + } + }, + "required": [ + "type", + "doc" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "const": "none" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + } + ] + } + }, + "required": [ + "node", + "resolution" + ], + "additionalProperties": false +} diff --git a/schemas/revocation.schema.json b/schemas/revocation.schema.json new file mode 100644 index 0000000..d8b188e --- /dev/null +++ b/schemas/revocation.schema.json @@ -0,0 +1,91 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/revocation.schema.json", + "title": "Revocation", + "description": "scienting-revocation/1; spec/08-fidelity.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-revocation/1" + }, + "id": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "receipt": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "signer": { + "$ref": "common.schema.json#/$defs/key" + }, + "period": { + "type": "object", + "properties": { + "from": { + "$ref": "common.schema.json#/$defs/time" + }, + "to": { + "$ref": "common.schema.json#/$defs/time" + } + }, + "required": [ + "from", + "to" + ], + "additionalProperties": false + }, + "reason": { + "type": "string", + "minLength": 1 + }, + "by": { + "$ref": "common.schema.json#/$defs/key" + }, + "at": { + "$ref": "common.schema.json#/$defs/time" + }, + "signature": { + "$ref": "common.schema.json#/$defs/signature" + } + }, + "required": [ + "format", + "id", + "reason", + "by", + "at", + "signature" + ], + "additionalProperties": false, + "oneOf": [ + { + "required": [ + "receipt" + ], + "not": { + "anyOf": [ + { + "required": [ + "signer" + ] + }, + { + "required": [ + "period" + ] + } + ] + } + }, + { + "required": [ + "signer", + "period" + ], + "not": { + "required": [ + "receipt" + ] + } + } + ] +} diff --git a/schemas/rights.schema.json b/schemas/rights.schema.json new file mode 100644 index 0000000..2fbe552 --- /dev/null +++ b/schemas/rights.schema.json @@ -0,0 +1,150 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/rights.schema.json", + "title": "Rights record", + "description": "scienting-rights/1: a witness's license, basis and uses; spec/14-rights.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-rights/1" + }, + "license": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/license" + }, + { + "type": "null" + } + ] + }, + "basis": { + "$ref": "common.schema.json#/$defs/basis" + }, + "uses": { + "type": "object", + "properties": { + "read": { + "$ref": "common.schema.json#/$defs/tri" + }, + "tdm": { + "$ref": "common.schema.json#/$defs/tri" + }, + "redistribute": { + "$ref": "common.schema.json#/$defs/tri" + }, + "quote-public": { + "$ref": "common.schema.json#/$defs/tri" + }, + "accessible-copy": { + "$ref": "common.schema.json#/$defs/tri" + }, + "ai": { + "type": "object", + "properties": { + "internal/local": { + "$ref": "common.schema.json#/$defs/tri" + }, + "internal/tenancy": { + "$ref": "common.schema.json#/$defs/tri" + }, + "internal/outside-no-retention": { + "$ref": "common.schema.json#/$defs/tri" + }, + "internal/outside": { + "$ref": "common.schema.json#/$defs/tri" + }, + "external/local": { + "$ref": "common.schema.json#/$defs/tri" + }, + "external/tenancy": { + "$ref": "common.schema.json#/$defs/tri" + }, + "external/outside-no-retention": { + "$ref": "common.schema.json#/$defs/tri" + }, + "external/outside": { + "$ref": "common.schema.json#/$defs/tri" + } + }, + "required": [], + "additionalProperties": false + } + }, + "required": [], + "additionalProperties": false + }, + "asserted_by": { + "type": "object", + "properties": { + "by": { + "type": "string", + "minLength": 1 + }, + "evidence": { + "type": "array", + "items": { + "type": "object", + "properties": { + "kind": { + "enum": [ + "license-url", + "contract", + "crossref-license", + "delivery", + "statement" + ] + }, + "url": { + "$ref": "common.schema.json#/$defs/url" + }, + "sha256": { + "$ref": "common.schema.json#/$defs/hash" + }, + "doi": { + "type": "string", + "minLength": 1 + }, + "note": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "kind" + ], + "additionalProperties": false + } + } + }, + "required": [ + "by", + "evidence" + ], + "additionalProperties": false + }, + "at": { + "$ref": "common.schema.json#/$defs/time" + }, + "valid_until": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/time" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "format", + "license", + "basis", + "uses", + "asserted_by", + "at", + "valid_until" + ], + "additionalProperties": false +} diff --git a/schemas/roster.schema.json b/schemas/roster.schema.json new file mode 100644 index 0000000..e6fe33e --- /dev/null +++ b/schemas/roster.schema.json @@ -0,0 +1,100 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/roster.schema.json", + "title": "Roster", + "description": "scienting-roster/1: the keys that may sign; spec/08-fidelity.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-roster/1" + }, + "store": { + "$ref": "common.schema.json#/$defs/key" + }, + "keys": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "$ref": "common.schema.json#/$defs/key" + }, + "person": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "orcid": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{3}[0-9X]$" + }, + "email": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "name" + ], + "additionalProperties": false + }, + "scheme": { + "enum": [ + "ed25519", + "ssh", + "gpg", + "sigstore" + ] + }, + "public": { + "type": "string", + "minLength": 1 + }, + "purposes": { + "type": "array", + "items": { + "enum": [ + "sign", + "spot-check", + "export" + ] + }, + "minItems": 1, + "uniqueItems": true + }, + "registered_at": { + "$ref": "common.schema.json#/$defs/time" + }, + "revoked_at": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/time" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "id", + "person", + "scheme", + "public", + "purposes", + "registered_at", + "revoked_at" + ], + "additionalProperties": false + } + } + }, + "required": [ + "format", + "store", + "keys" + ], + "additionalProperties": false +} diff --git a/schemas/runs.schema.json b/schemas/runs.schema.json new file mode 100644 index 0000000..30568ff --- /dev/null +++ b/schemas/runs.schema.json @@ -0,0 +1,189 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/runs.schema.json", + "title": "Inline runs", + "description": "The runs of a sentence, cell, reference, authors or keywords node; spec/03-nodes.md.", + "type": "array", + "minItems": 1, + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "const": "text" + }, + "text": { + "type": "string", + "minLength": 1 + }, + "style": { + "type": "array", + "items": { + "enum": [ + "em", + "strong", + "sup", + "sub", + "sc", + "mono" + ] + }, + "minItems": 1, + "uniqueItems": true + } + }, + "required": [ + "kind", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "math" + }, + "notation": { + "enum": [ + "tex", + "typst" + ] + }, + "source": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "kind", + "notation", + "source" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "cite" + }, + "refs": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "uniqueItems": true + }, + "text": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "kind", + "refs", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "xref" + }, + "target": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/nodeId" + }, + { + "$ref": "common.schema.json#/$defs/address" + }, + { + "type": "null" + } + ] + }, + "text": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "kind", + "target", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "fnmark" + }, + "footnote": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/nodeId" + }, + { + "type": "null" + } + ] + }, + "text": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "kind", + "footnote", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "link" + }, + "url": { + "$ref": "common.schema.json#/$defs/url" + }, + "text": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "kind", + "url", + "text" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "kind": { + "const": "equation" + }, + "node": { + "$ref": "common.schema.json#/$defs/nodeId" + } + }, + "required": [ + "kind", + "node" + ], + "additionalProperties": false + } + ] + } +} diff --git a/schemas/snapshot.schema.json b/schemas/snapshot.schema.json new file mode 100644 index 0000000..079f17d --- /dev/null +++ b/schemas/snapshot.schema.json @@ -0,0 +1,120 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/snapshot.schema.json", + "title": "Draft snapshot", + "description": "scienting-snapshot/1: the pinned claims, quotations and datasets a draft cites; spec/21-drafts.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-snapshot/1" + }, + "store": { + "$ref": "common.schema.json#/$defs/key" + }, + "made_at": { + "$ref": "common.schema.json#/$defs/time" + }, + "quotes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "address": { + "$ref": "common.schema.json#/$defs/address" + }, + "anchor": { + "$ref": "anchor.schema.json" + }, + "text": { + "type": "string", + "minLength": 1 + }, + "fidelity": { + "$ref": "common.schema.json#/$defs/level" + }, + "result": { + "enum": [ + "current", + "changed-below", + "moved", + "reattached" + ] + } + }, + "required": [ + "address", + "anchor", + "text", + "fidelity", + "result" + ], + "additionalProperties": false + } + }, + "claims": { + "type": "array", + "items": { + "type": "object", + "properties": { + "ref": { + "type": "string", + "minLength": 1 + }, + "pin": { + "type": "string", + "minLength": 1 + }, + "level": { + "type": "string", + "minLength": 1 + }, + "standing": { + "type": "string", + "minLength": 1 + }, + "rendering": { + "type": "string", + "minLength": 1 + }, + "typst": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "ref", + "pin" + ], + "additionalProperties": false + } + }, + "datasets": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "$ref": "common.schema.json#/$defs/datasetId" + }, + "hash": { + "$ref": "common.schema.json#/$defs/hash" + } + }, + "required": [ + "id", + "hash" + ], + "additionalProperties": false + } + } + }, + "required": [ + "format", + "store", + "made_at", + "quotes", + "claims", + "datasets" + ], + "additionalProperties": false +} diff --git a/schemas/stages.schema.json b/schemas/stages.schema.json new file mode 100644 index 0000000..36e3abc --- /dev/null +++ b/schemas/stages.schema.json @@ -0,0 +1,81 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/stages.schema.json", + "title": "Stage requirements", + "description": "scienting-stages/1: the uses each stage needs; configuration, not code; spec/14-rights.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-stages/1" + }, + "id": { + "$ref": "common.schema.json#/$defs/key" + }, + "note": { + "type": "string", + "minLength": 1 + }, + "stages": { + "type": "object", + "minProperties": 1, + "propertyNames": { + "$ref": "common.schema.json#/$defs/key" + }, + "additionalProperties": { + "type": "object", + "properties": { + "uses": { + "type": "array", + "items": { + "enum": [ + "read", + "tdm", + "redistribute", + "quote-public", + "accessible-copy" + ] + }, + "uniqueItems": true + }, + "ai": { + "type": "object", + "properties": { + "purpose": { + "enum": [ + "internal", + "external" + ] + }, + "processors": { + "type": "array", + "items": { + "$ref": "common.schema.json#/$defs/processor" + }, + "minItems": 1, + "uniqueItems": true + } + }, + "required": [ + "purpose" + ], + "additionalProperties": false + }, + "note": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "uses" + ], + "additionalProperties": false + } + } + }, + "required": [ + "format", + "id", + "stages" + ], + "additionalProperties": false +} diff --git a/schemas/stamps.schema.json b/schemas/stamps.schema.json new file mode 100644 index 0000000..87ae401 --- /dev/null +++ b/schemas/stamps.schema.json @@ -0,0 +1,64 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/stamps.schema.json", + "title": "Stamp rules", + "description": "scienting-stamps/1: download-stamp line rules for page fingerprints; spec/07-geometry.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-stamps/1" + }, + "id": { + "$ref": "common.schema.json#/$defs/key" + }, + "learned": { + "type": "boolean" + }, + "note": { + "type": "string", + "minLength": 1 + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "$ref": "common.schema.json#/$defs/key" + }, + "pattern": { + "type": "string", + "minLength": 1 + }, + "where": { + "enum": [ + "any", + "margin" + ] + }, + "margin": { + "type": "number", + "exclusiveMinimum": 0 + }, + "note": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "id", + "pattern", + "where" + ], + "additionalProperties": false + }, + "minItems": 1 + } + }, + "required": [ + "format", + "id", + "rules" + ], + "additionalProperties": false +} diff --git a/schemas/submission.schema.json b/schemas/submission.schema.json new file mode 100644 index 0000000..c5b1c18 --- /dev/null +++ b/schemas/submission.schema.json @@ -0,0 +1,109 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/submission.schema.json", + "title": "Submission", + "description": "scienting-submission/1: a student's answer, under a pseudonym; spec/19-exercises.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-submission/1" + }, + "id": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "exercise": { + "type": "string", + "pattern": "^urn:scienting:annotation:[a-z0-9][a-z0-9._-]*/[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6,25}$" + }, + "doc": { + "$ref": "common.schema.json#/$defs/qualifiedKey" + }, + "rev": { + "type": "integer", + "minimum": 0 + }, + "student": { + "type": "string", + "pattern": "^[a-z0-9][a-z0-9-]{3,63}$" + }, + "answers": { + "type": "object", + "properties": { + "anchors": { + "type": "array", + "items": { + "$ref": "anchor.schema.json" + } + }, + "verdict": { + "enum": [ + "supports", + "partly", + "does-not", + "cannot-tell" + ] + }, + "chain": { + "type": "array", + "items": { + "type": "array", + "items": { + "$ref": "anchor.schema.json" + } + } + }, + "value": { + "$ref": "common.schema.json#/$defs/decimal" + }, + "flags": { + "type": "array", + "items": { + "type": "object", + "properties": { + "anchor": { + "$ref": "anchor.schema.json" + }, + "verdict": { + "enum": [ + "supports", + "partly", + "does-not", + "cannot-tell" + ] + }, + "note": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "anchor", + "verdict" + ], + "additionalProperties": false + } + }, + "note": { + "type": "string", + "minLength": 1 + } + }, + "required": [], + "additionalProperties": false + }, + "submitted_at": { + "$ref": "common.schema.json#/$defs/time" + } + }, + "required": [ + "format", + "id", + "exercise", + "doc", + "rev", + "student", + "answers", + "submitted_at" + ], + "additionalProperties": false +} diff --git a/schemas/suspect.schema.json b/schemas/suspect.schema.json new file mode 100644 index 0000000..c3a909e --- /dev/null +++ b/schemas/suspect.schema.json @@ -0,0 +1,77 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/suspect.schema.json", + "title": "Suspect", + "description": "scienting-suspect/1: a doubtful reading for review; spec/05-hashes.md.", + "type": "object", + "properties": { + "format": { + "const": "scienting-suspect/1" + }, + "id": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "kind": { + "enum": [ + "word", + "number", + "equation", + "structure", + "join", + "added", + "dropped", + "boundary", + "reading" + ] + }, + "node": { + "anyOf": [ + { + "$ref": "common.schema.json#/$defs/nodeId" + }, + { + "type": "null" + } + ] + }, + "reading": { + "type": "string", + "minLength": 1 + }, + "a": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "b": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "crop": { + "$ref": "common.schema.json#/$defs/hash" + }, + "note": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "format", + "id", + "kind" + ], + "additionalProperties": false +} diff --git a/schemas/value-anchor.schema.json b/schemas/value-anchor.schema.json new file mode 100644 index 0000000..c322252 --- /dev/null +++ b/schemas/value-anchor.schema.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/value-anchor.schema.json", + "title": "Value anchor", + "description": "One line of a dataset's anchors.jsonl: where one value came from; spec/15-datasets.md.", + "type": "object", + "properties": { + "resource": { + "$ref": "common.schema.json#/$defs/key" + }, + "row": { + "$ref": "common.schema.json#/$defs/key" + }, + "field": { + "type": "string", + "minLength": 1 + }, + "anchor": { + "$ref": "anchor.schema.json" + }, + "digitization": { + "$ref": "common.schema.json#/$defs/recordId" + }, + "series": { + "type": "string", + "minLength": 1 + }, + "point": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "resource", + "row", + "field" + ], + "additionalProperties": false, + "oneOf": [ + { + "required": [ + "anchor" + ] + }, + { + "required": [ + "digitization", + "series", + "point" + ] + } + ] +} diff --git a/schemas/view.schema.json b/schemas/view.schema.json new file mode 100644 index 0000000..839d801 --- /dev/null +++ b/schemas/view.schema.json @@ -0,0 +1,115 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/view.schema.json", + "title": "View", + "description": "A Vega-Lite specification whose usermeta.scienting pins its data: scienting-view/1; spec/17-views.md.", + "type": "object", + "required": [ + "$schema", + "usermeta" + ], + "properties": { + "$schema": { + "type": "string", + "pattern": "^https://vega\\.github\\.io/schema/vega-lite/v[0-9]+(\\.[0-9]+)*\\.json$" + }, + "usermeta": { + "type": "object", + "required": [ + "scienting" + ], + "properties": { + "scienting": { + "type": "object", + "properties": { + "format": { + "const": "scienting-view/1" + }, + "id": { + "$ref": "common.schema.json#/$defs/key" + }, + "data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "$ref": "common.schema.json#/$defs/datasetId" + }, + "dataset": { + "$ref": "common.schema.json#/$defs/datasetId" + }, + "hash": { + "$ref": "common.schema.json#/$defs/hash" + }, + "resource": { + "$ref": "common.schema.json#/$defs/key" + } + }, + "required": [ + "name", + "dataset", + "hash", + "resource" + ], + "additionalProperties": false + }, + "minItems": 1 + }, + "computation": { + "type": "object", + "properties": { + "claim": { + "type": "string", + "minLength": 1 + }, + "pin": { + "type": "string", + "minLength": 1 + }, + "runtime": { + "const": "pyodide" + }, + "inputs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "param": { + "type": "string", + "minLength": 1 + }, + "name": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "param", + "name" + ], + "additionalProperties": false + }, + "minItems": 1 + } + }, + "required": [ + "claim", + "pin", + "runtime", + "inputs" + ], + "additionalProperties": false + } + }, + "required": [ + "format", + "id", + "data" + ], + "additionalProperties": false + } + } + } + } +} diff --git a/schemas/witnesses.schema.json b/schemas/witnesses.schema.json new file mode 100644 index 0000000..bd5936f --- /dev/null +++ b/schemas/witnesses.schema.json @@ -0,0 +1,108 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://scient.ing/ns/schemas/witnesses.schema.json", + "title": "Witnesses", + "description": "witnesses.json of a package; spec/02-model.md.", + "type": "object", + "properties": { + "witnesses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "$ref": "common.schema.json#/$defs/nodeId" + }, + "sha256": { + "$ref": "common.schema.json#/$defs/hash" + }, + "size": { + "type": "integer", + "minimum": 0 + }, + "kind": { + "enum": [ + "pdf", + "jats", + "latex", + "html", + "epub", + "typst", + "xml", + "image", + "other" + ] + }, + "media_type": { + "type": "string", + "minLength": 1 + }, + "pages": { + "type": "integer", + "minimum": 1 + }, + "text_layer": { + "type": "boolean" + }, + "version_label": { + "type": "string", + "minLength": 1 + }, + "origin": { + "type": "object", + "properties": { + "source": { + "enum": [ + "publisher", + "repository", + "preprint-server", + "author", + "team", + "licensed-delivery", + "library", + "other" + ] + }, + "url": { + "$ref": "common.schema.json#/$defs/url" + }, + "doi": { + "type": "string", + "minLength": 1 + }, + "retrieved_at": { + "$ref": "common.schema.json#/$defs/time" + }, + "note": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "source" + ], + "additionalProperties": false + }, + "rights": { + "$ref": "rights.schema.json" + } + }, + "required": [ + "id", + "sha256", + "size", + "kind", + "media_type", + "origin", + "rights" + ], + "additionalProperties": false + }, + "minItems": 1 + } + }, + "required": [ + "witnesses" + ], + "additionalProperties": false +} diff --git a/spec/00-introduction.md b/spec/00-introduction.md new file mode 100644 index 0000000..b6387e6 --- /dev/null +++ b/spec/00-introduction.md @@ -0,0 +1,68 @@ +# 0. Introduction + +## 0.1 Scope + +These specifications define the data the Scientific Computing Studio's parts write and read: documents and their packages, anchors, receipts, rights records, layers, exercises, datasets, digitizations, views, projects and bundles. +They define data, not programs. +A conforming file can be read, checked and loaded without any studio code, and every rule here is stated so that a second implementation, in any language, computes the same bytes. + +The design document, *The Scientific Computing Studio: design of Lode, paperpack and Varve*, explains why each format exists. +This text says exactly what each format is. +Where the two differ, this text governs, and [DECISIONS.md](../DECISIONS.md) records why it differs. + +## 0.2 Conformance language + +The key words MUST, MUST NOT, REQUIRED, SHOULD, SHOULD NOT, RECOMMENDED, MAY and OPTIONAL are to be interpreted as described in RFC 2119 and RFC 8174 when, and only when, they appear in capitals. + +Three classes of implementation are distinguished. + +| Class | Does | Must | +| --- | --- | --- | +| Producer | Writes files in a format. | Write only files that validate, with values computed as specified. | +| Consumer | Reads files in a format. | Accept every valid file, and refuse every file the suite lists as invalid, naming the rule. | +| Validator | Decides whether a file is valid. | Check every rule in [22](22-conformance.md) that the file's contents allow it to check. | + +An implementation states, for each format, which versions it reads and writes. + +## 0.3 Format identifiers and versions + +Every format has an identifier of the form `scienting-/`, such as `scienting-doc/1`. +A file or record that can travel on its own carries its identifier in a `format` property. +Records inside a package file whose format the manifest fixes, such as the lines of `nodes.jsonl`, do not repeat it. + +A change that makes a valid file invalid, or that changes a computed value, is a breaking change and needs a new major version, with a migration. +Adding an optional property, a node kind, a run kind or an enumeration value is a minor change. +A consumer of version *n* MUST refuse a major version it does not know, and SHOULD warn on, but accept, enumeration values added in a later minor version. + +The specification as a whole is versioned with semantic versioning; this is version 0.1.0. +[registry/formats.json](../registry/formats.json) lists every format with its media type, schema and status. + +## 0.4 Status + +Each format has one of three statuses. + +| Status | Meaning | +| --- | --- | +| `candidate` | Complete, with vectors and fixtures, and ready to implement. Changes before 1.0 need a recorded decision. | +| `provisional` | Complete, but its milestone has not come, and it may change with less ceremony. | +| `reserved` | Named and shaped, but not yet specified in full. | + +The design builds in levels, and level 1 implements a subset. +Fields that level 1 does not use, such as rights beyond the license, receipts and spot-checks, are defined now so that formats never change when a team moves up a level. +A consumer that does not use a field MUST still preserve it when it rewrites a file. + +## 0.5 How the repository is arranged + +| Path | Holds | Normative | +| --- | --- | --- | +| `spec/` | These chapters. | Yes | +| `schemas/` | JSON Schemas, draft 2020-12. | Yes | +| `sql/` | Table definitions for SQLite, Dolt and PostgreSQL, and the SQLite bundle. | Yes | +| `context/` | The JSON-LD context for layers. | Yes | +| `registry/` | Formats, rule IDs, stamp rules and the default stage requirements. | Yes | +| `vectors/` | Test vectors, one case per line. | Yes | +| `fixtures/` | Valid packages and records, invalid packages, and the keys that signed them. | Yes | +| `tools/` | The oracle that computed the vectors, the builder and the checker. | No | + +The oracle exists so that no vector is typed by hand. +It is not a library: implementations conform to the chapters and the vectors, not to the oracle, and `scienting-core` is the reference implementation. diff --git a/spec/01-conventions.md b/spec/01-conventions.md new file mode 100644 index 0000000..4f75c81 --- /dev/null +++ b/spec/01-conventions.md @@ -0,0 +1,88 @@ +# 1. Shared conventions + +These rules apply to every format. + +## 1.1 Canonical JSON + +Canonical JSON is the JSON Canonicalization Scheme of RFC 8785. +In brief: no whitespace between tokens; object members sorted by their names compared as sequences of UTF-16 code units; strings escaped only where JSON requires, with `\b`, `\t`, `\n`, `\f`, `\r`, `\"` and `\\` for those characters and `\u00xx` with lowercase hex for the other characters below U+0020; numbers written as ECMAScript writes a double. +Strings are not normalized: canonical JSON keeps every code point as given. +A document containing a lone surrogate, `NaN` or an infinity has no canonical form and is invalid. + +Every hash of a JSON value in these specifications is a hash of its canonical JSON, encoded as UTF-8. +The vectors in `canonical-json.jsonl` give JSON text to parse as IEEE 754 doubles and the canonical output. + +Lode keeps its own canonical form for its stored hashes; that form is Lode's and is outside this text. + +## 1.2 Numbers + +A decimal that carries meaning is a string, so that `310.0` and `1.5260` keep their printed digits. +The schemas call this a `decimal`: an optional minus sign, an integer part without leading zeros, and an optional fraction. +JSON numbers are used only for counts, indexes, offsets, sizes and geometry. + +Geometry is in PDF points. +A producer SHOULD round coordinates to hundredths of a point, which keeps their canonical form short and identical across languages. + +## 1.3 Hashes + +A hash is SHA-256, written as 64 lowercase hexadecimal digits. +Six digits are for display and for pins in addresses; no record stores a shortened hash. +Inside a team's own store, hashes are plain SHA-256; any content value that leaves the team is keyed, as [5.8](05-hashes.md#58-keyed-hashes) defines. + +## 1.4 Text normalization for hashing + +To normalize a string for hashing: + +1. Apply Unicode Normalization Form C. +2. Replace every maximal run of whitespace characters with one U+0020. +3. Remove a leading and a trailing U+0020. + +Whitespace means the 25 characters with the Unicode property `White_Space`: U+0009 to U+000D, U+0020, U+0085, U+00A0, U+1680, U+2000 to U+200A, U+2028, U+2029, U+202F, U+205F and U+3000. +U+200B ZERO WIDTH SPACE is not whitespace. + +Stored text is kept exactly as witnessed; normalization applies only when a value is computed. +The vectors in `normalize.jsonl` cover the cases, including the angstrom sign, which NFC turns into Å. + +## 1.5 Character offsets + +Offsets count Unicode code points, never UTF-16 code units or bytes. +An offset pair `[start, end]` names the code points from `start` up to but not including `end`. +A browser implementation converts to UTF-16 at its edge; `offsets.jsonl` gives both forms for text with characters outside the Basic Multilingual Plane. + +## 1.6 Times + +A time is UTC, written `YYYY-MM-DDTHH:MM:SSZ`, with no fractions. +A date is `YYYY`, `YYYY-MM` or `YYYY-MM-DD`. + +## 1.7 Determinism + +Every value these specifications define is a pure function of its inputs. +Readings from machine-learning backends are not deterministic, so a producer caches them by the hash of their inputs and records them in the package's provenance, and never recomputes them silently. +From the cached readings onward, the same inputs and tool versions MUST give byte-identical files. +No file carries the time it was written, unless the time is part of the record, as a receipt's is. + +## 1.8 IDs and keys + +| Kind | Form | Pattern | +| --- | --- | --- | +| Node ID | Seven characters of lowercase Crockford base32, the first a letter. | `^[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6}$` | +| Record ID | 7 to 26 such characters, the first a letter. Derived records use 13. | `^[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6,25}$` | +| Key | A document, work, store, project or source key, as Lode's source keys are. At most 128 characters. | `^[a-z0-9][a-z0-9._-]*$` | +| Alias | A legacy ID; it always holds a `.`, `_` or `-`, so it never looks like a node ID. | `^[a-z0-9][a-z0-9._-]*[._-][a-z0-9._-]*$` | +| Dataset ID | `ds-` and a key. | `^ds-[a-z0-9][a-z0-9._-]*$` | + +The Crockford alphabet is `0123456789abcdefghjkmnpqrstvwxyz`; it has no `i`, `l`, `o` or `u`. +Its 22 letters are `abcdefghjkmnpqrstvwxyz`. +Because the first character is a letter, every ID is a valid HTML `id`, CSS selector and URL fragment without escaping. +A key qualified by its store, `smithlab/cornell1995second`, names a document anywhere. + +## 1.9 Files + +JSON Lines files hold one record per line, in canonical JSON, each line ending with one U+000A. +JSON files hold one value in canonical JSON followed by one U+000A. +So a corrected sentence is a one-line change, and every file has exactly one valid byte sequence. +Each JSON Lines file has a defined order, given where the file is defined. + +## 1.10 Prose + +Prose in these formats, and in this repository, is US English, one sentence per line. diff --git a/spec/02-model.md b/spec/02-model.md new file mode 100644 index 0000000..f7f67c2 --- /dev/null +++ b/spec/02-model.md @@ -0,0 +1,64 @@ +# 2. Works, versions, witnesses and documents + +## 2.1 Four objects + +| Object | Is | Identified by | +| --- | --- | --- | +| Work | The intellectual work, across all its versions. | A key, and `same_as` identifiers: `doi:`, `arxiv:`, `isbn:`, `pmid:`, `pmcid:`, `url:` or `lode:`. | +| Version | One expression of the work: a preprint, an accepted manuscript, the version of record, an erratum, Supporting Information, a draft. | The work's key and a version type, with an optional sequence number and date. | +| Witness | One file of a version: a PDF, JATS XML, a LaTeX source archive, an HTML page, an EPUB, a Typst project. | The SHA-256 of its bytes. | +| Document | The text established for one version from one or more witnesses. | A key, and a root hash per revision. | + +A document's key is its work's key, with a suffix for anything other than the version of record: `cornell1995second`, `cornell1995second.si`, `dong2026machine.v2`. +Supporting Information is its own document, with its own pages, numbering and references, related to its article by `supplement-of`. +A textbook is a work whose chapters are documents related by `part-of`. +A draft is a document of kind `draft`. + +Keys are immutable once a document is shared. +A renamed document keeps its old keys in `aliases`. + +## 2.2 `document.json` + +| Property | Required | Holds | +| --- | --- | --- | +| `format` | Yes | `scienting-doc/1`. | +| `key` | Yes | The document key. | +| `store` | No | The store that holds it, when the package says so. | +| `aliases` | No | Earlier keys. | +| `kind` | Yes | `article`, `supplement`, `chapter`, `book`, `thesis`, `report`, `draft`, `course-material` or `other`. | +| `work` | Yes | `{key, same_as}`. | +| `version` | Yes | `{type, seq?, date?}`, where `type` is `preprint`, `submitted`, `accepted`, `version-of-record`, `erratum`, `retraction`, `supplement`, `draft` or `other`. | +| `relations` | Yes | A list of `{type, target}`; `type` is `supplement-of`, `part-of`, `version-of`, `erratum-of`, `retraction-of` or `translation-of`, and `target` a key, optionally store-qualified. | +| `meta` | Yes | The version's bibliographic record, as one CSL-JSON item. | +| `language` | Yes | A BCP 47 tag. | +| `license` | No | The document's license as stated: `{spdx?, text?, url?}`. Rights are per witness ([14](14-rights.md)). | +| `policy` | Yes | The text policy: `full`, or `checks-only` ([12.5](12-package.md#125-text-policies)). | +| `hashing` | Yes | How content values are computed: `{scheme: "plain"}`, a team HMAC or a page-derived key ([5.8](05-hashes.md#58-keyed-hashes)). | +| `root` | Yes | The root node's `node_hash`. | +| `meta_hash` | Yes | The metadata hash ([5.9](05-hashes.md#59-the-metadata-hash)). | +| `rev` | Yes | The revision: the index of the last correction applied, or 0. | +| `counts` | Yes | `{nodes, leaves}`. | +| `fidelity` | Yes | `{lowest, counts}`: the lowest level among leaves, or null when there are none, and the number of leaves at each level, computed as [8.2](08-fidelity.md#82-levels) defines. | + +The schema is `document.schema.json`. + +## 2.3 `witnesses.json` + +`witnesses.json` is an object with one property, `witnesses`, a non-empty list in which each witness is: + +| Property | Required | Holds | +| --- | --- | --- | +| `id` | Yes | The witness ID: seven letter-first base32 characters encoding the SHA-256, as [4.6](04-identity.md#46-record-ids) defines. | +| `sha256` | Yes | The SHA-256 of the file. | +| `size` | Yes | Its size in bytes. | +| `kind` | Yes | `pdf`, `jats`, `latex`, `html`, `epub`, `typst`, `xml`, `image` or `other`. | +| `media_type` | Yes | Its media type. | +| `pages` | No | The number of pages, for a witness that has pages. | +| `text_layer` | No | Whether a PDF has a text layer; a scan has none. | +| `version_label` | No | The version as the witness labels it. | +| `origin` | Yes | `{source, url?, doi?, retrieved_at?, note?}`, where `source` is `publisher`, `repository`, `preprint-server`, `author`, `team`, `licensed-delivery`, `library` or `other`. | +| `rights` | Yes | The rights record, `scienting-rights/1` ([14](14-rights.md)). | + +The witness's bytes are not part of the package; they live in the team's asset store, by SHA-256. +The SHA-256 is the exact identity of one file. +Because publishers stamp each download, two copies of one paper rarely share it; page fingerprints identify their pages instead ([7](07-geometry.md)). diff --git a/spec/03-nodes.md b/spec/03-nodes.md new file mode 100644 index 0000000..ab1b071 --- /dev/null +++ b/spec/03-nodes.md @@ -0,0 +1,127 @@ +# 3. Nodes + +A document is a tree of nodes. +`nodes.jsonl` holds one node per line, in document order: the root first, then each node before its children, and siblings in order. + +## 3.1 The node record + +| Property | Required | Holds | +| --- | --- | --- | +| `id` | Yes | The node ID ([4](04-identity.md)). | +| `kind` | Yes | One of the kinds in [3.2](#32-kinds-and-children). | +| `parent` | Yes | The parent's ID, or null for the root. | +| `ord` | Yes | The position among its siblings, from 0. | +| `label` | No | The printed label (`2.3`, `Figure 2`, `(1)`, `a`), for kinds that take one. | +| `attrs` | No | Structural attributes, by kind ([3.4](#34-attributes)). | +| `content` | No | The node's own content, by kind ([3.3](#33-content)). | +| `withheld` | No | `true` when the policy withholds the content ([12.5](12-package.md#125-text-policies)). | +| `fidelity` | No | For leaves, the level the pipeline established: `F0`, `F1` or `F2` ([8.1](08-fidelity.md#81-levels-of-fidelity)). | +| `prov` | No | `{witnesses, backend?, reading?, corroborated_by?}`: the witness IDs the text came from, the backend, and the witnesses that agree. | +| `text_hash`, `match_hash`, `align_key`, `own_hash`, `node_hash` | Yes | The five content values ([5](05-hashes.md)). | + +Optional properties are omitted, never written as null. +The schema is `node.schema.json`. + +## 3.2 Kinds and children + +| Kind | May contain | Content | Label | +| --- | --- | --- | --- | +| `document` | `front`, `section`, `back` | | | +| `front` | `title`, `authors`, `abstract`, `keywords`, `notes` | | | +| `title` | `sentence` | | | +| `authors` | | runs | | +| `abstract` | blocks, `section` | | | +| `keywords` | | runs | | +| `notes` | `footnote`, `paragraph` | | | +| `section` | `heading` first, then blocks and `section` | | Yes | +| `heading` | `sentence` | | | +| `paragraph` | `sentence` | | | +| `sentence` | `equation` | runs | | +| `equation` | `equation-line` | math | Yes | +| `equation-line` | | math | Yes | +| `figure` | `panel`, `caption`, `figure-note` | | Yes | +| `panel` | | | Yes | +| `caption` | `sentence` | | | +| `figure-note` | `sentence` | | | +| `table` | `caption`, `table-head`, `table-body`, `table-note` | | Yes | +| `table-head`, `table-body` | `row` | | | +| `table-note` | `sentence` | | | +| `row` | `cell` | | | +| `cell` | | runs | | +| `list` | `item` | | | +| `item`, `quote` | blocks | | | +| `code`, `algorithm` | | verbatim | Yes | +| `theorem` | blocks | | Yes | +| `footnote` | `sentence` | | Yes | +| `back` | `acknowledgments`, `references`, `appendix`, `notes` | | | +| `acknowledgments` | blocks | | | +| `references` | `reference` | | | +| `reference` | | runs | Yes | +| `appendix` | `section` | | | + +Blocks are `paragraph`, `equation`, `figure`, `table`, `list`, `quote`, `code`, `algorithm`, `theorem` and `footnote`. + +These rules also hold: + +1. Exactly one node is a root, and it is a `document`. +2. A `heading` is a section's first child, and a section has at most one. +3. `front`, `back`, `title`, `authors`, `abstract`, `keywords`, `caption`, `table-head`, `table-body`, `acknowledgments` and `references` occur at most once among their siblings. +4. A `table` has exactly one `table-body`. +5. `title`, `heading`, `paragraph`, `caption`, `figure-note`, `table-note`, `table-head`, `table-body`, `row`, `list`, `item`, `quote`, `theorem`, `footnote` and `appendix` have at least one child. +6. Only the kinds marked in the table take a `label`. +7. A body without headings, as in a letter, is a section with no heading. + +Kinds outside this list are refused; a new kind is a minor version. +Page breaks, running heads and columns are not nodes: they are geometry ([7](07-geometry.md)). + +## 3.3 Content + +| Content | Kinds | Shape | +| --- | --- | --- | +| Runs | `sentence`, `cell`, `reference`, `authors`, `keywords` | A non-empty list of inline runs ([3.5](#35-inline-runs)). | +| Math | `equation`, `equation-line` | `{notation, source}`: `tex` or `typst`, and the source as written. | +| Verbatim | `code`, `algorithm` | `{language?, text}`. | + +Other kinds have no `content`. +Derived renderings, such as MathML, are not content; they live in `derived/` ([12.7](12-package.md#127-derived-files)). + +## 3.4 Attributes + +| Kind | Attribute | Holds | +| --- | --- | --- | +| `section` | `level` (required) | 1 for a section, 2 for a subsection, and so on. | +| `table` | `columns` | The column definitions: `[{id, header_path}]`, where `header_path` lists header cell IDs, outermost first ([9.2](09-figures-tables-equations.md#92-tables)). | +| `cell` | `column`, `rowspan`, `colspan`, `role` | The column's ID, spans (default 1), and `data` (default), `column-header`, `row-header` or `row-group-header`. | +| `row` | `header_path` | The cell IDs that label the row, outermost first. | +| `list` | `ordered` | Whether the list is numbered. | +| `item` | `marker` | The printed marker. | +| `theorem` | `variant` | The printed kind: Theorem, Lemma, Definition, Proof, Remark. | +| `panel` | `image`, `crop`, `figure_text` | The image asset, a crop, and the text found inside the panel ([9.1](09-figures-tables-equations.md#91-figures-and-panels)). | + +No other kind carries `attrs`, and each kind carries only its own attributes. + +## 3.5 Inline runs + +| Run | Properties | Plain projection | +| --- | --- | --- | +| `text` | `text`, and optional `style`: a sorted list of distinct values from `em`, `strong`, `sup`, `sub`, `sc`, `mono`, never both `sup` and `sub`. | The text. | +| `math` | `notation` (`tex` or `typst`), `source`. | `$` + source + `$` | +| `cite` | `refs`: reference node IDs; `text`: the printed form, such as `23`, `[1,2]` or `(Smith, 2019)`. | The printed form. | +| `xref` | `target`: a node ID in this document, an address in another, or null when not yet resolved; `text`. | The printed form. | +| `fnmark` | `footnote`: a footnote's ID, or null; `text`: the mark. | The mark. | +| `link` | `url`, `text`. | The text. | +| `equation` | `node`: the ID of an equation child of the sentence. | `$$` + that equation's source + `$$` | + +Runs are canonical: no `text` run is empty, and no two adjacent `text` runs have the same style list. +A sentence's `equation` runs name its `equation` children, each once, in the children's order, and a sentence has no other children. +A display equation the sentence runs through is thus part of the sentence, while keeping its own ID and hashes. + +## 3.6 The plain projection + +The plain projection of a node with runs is the concatenation of its runs' projections. +That of an equation or an equation line is `$$` + source + `$$`, and that of a verbatim node is its text. +That of any other node is the plain projections of its text leaves joined with one U+0020. + +A node's text leaves are found by walking its subtree in document order and stopping at `sentence`, `cell`, `reference`, `authors`, `keywords`, `code` and `algorithm` nodes, and at `equation` nodes whose parent is not a sentence; an `equation-line` is never a text leaf. + +Offsets, quotations and the text hash are all defined on the plain projection as stored, before normalization. diff --git a/spec/04-identity.md b/spec/04-identity.md new file mode 100644 index 0000000..8ec78f2 --- /dev/null +++ b/spec/04-identity.md @@ -0,0 +1,73 @@ +# 4. Identity + +A node's ID is a name, not a position. +It carries no meaning, and once a document is established it is never recomputed, reassigned or reused. + +## 4.1 Letter-first base32 + +To encode a SHA-256 digest *d* (32 bytes) as a letter-first ID of *n* characters: + +1. The first character is the letter at index `d[0] mod 22` of `abcdefghjkmnpqrstvwxyz`. +2. Read the bytes `d[1]` to `d[31]` as one big-endian bit string. +3. Each further character is the Crockford character for the next five bits, from the most significant end. + +Node IDs have seven characters, about 34.5 bits; derived record IDs have 13. +`ids.jsonl` in the vectors gives digests and their encodings. + +## 4.2 Minting node IDs + +A node's ID is minted from SHA-256 of the canonical JSON of the array `["scienting-id/1", doc_key, kind, text_hash, occurrence]`, encoded with seven characters. +`text_hash` is the plain, never keyed, text hash of the node ([5.1](05-hashes.md#51-the-five-values)). + +When a document is established, nodes are minted in document order. +A node's occurrence starts at the number of earlier nodes with the same kind and text hash; while the resulting ID is already taken, the occurrence increases by one. +So a fresh conversion of the same input mints the same IDs. + +A node added later, by an `insert` or a `split`, starts at occurrence 0 and increases while the ID is taken by any live, retired or alias ID of the document. + +Columns and figure-text items are not nodes, but they take IDs from the same rule and the same document-wide set, after the nodes: +a column with kind `column` and the text hash of its header cells' plain projections joined with U+0020; +a figure-text item with kind `figure-text` and the text hash of its text. + +## 4.3 Permanence, retirement and aliases + +| Rule | Detail | +| --- | --- | +| Permanence | Once established, an ID never changes, and no other node ever takes it. | +| Retirement | A `merge` or a `delete` retires IDs ([11](11-corrections.md)). A merge records the surviving node as the successor; a delete records none. | +| Aliases | Legacy IDs, such as the `b-p03-text-004` block IDs Lode's extracts use today, are recorded as aliases of the node that now holds that text. | +| Labels | What people say, such as "Eq. 3" or "Table S1", is a `label`, never an ID. | +| Display paths | Tools may show a path such as `§2.3 ¶4 s2`; it is never stored or cited. | + +## 4.4 `ids.jsonl` + +Each line is one entry. + +| Property | Holds | +| --- | --- | +| `id` | The retired node ID, or the alias. | +| `kind` | `retired` or `alias`. | +| `successor` | For a retirement, the successor's ID, or null for a deletion; for an alias, the live node it names. | +| `node_kind` | For a retirement, the kind the node had. | +| `rev` | For a retirement, the index of the correction that retired it. | + +Aliases come first, sorted by ID; retirements follow, sorted by `rev` and then ID. +No ID is both live and in the table, every successor is live or itself in the table, and every alias names a live node. + +## 4.5 Store-qualified names + +A document key qualified by its store, `smithlab/cornell1995second`, names a document anywhere, and an address with a store names a node anywhere ([6.1](06-anchors.md#61-addresses)). + +## 4.6 Record IDs + +A record that is never edited takes its ID from its own content, as 13 letter-first characters of a hash: + +| Record | Hash | +| --- | --- | +| Receipt, revocation, policy | The record hash: SHA-256 of the record without `id` and `signature` ([8.4](08-fidelity.md#84-record-hashes-and-signatures)). | +| Correction | SHA-256 of the record without `id`. | +| Annotation | SHA-256 of the annotation without `id`, `status`, `receipt` and `modified`, as created. | +| Submission, digitization | SHA-256 of the record without `id`. | + +A witness ID is the seven-character letter-first encoding of the witness's SHA-256 itself. +Other records, such as layers and qa reports, MAY use any record ID unique in their store. diff --git a/spec/05-hashes.md b/spec/05-hashes.md new file mode 100644 index 0000000..6b026ed --- /dev/null +++ b/spec/05-hashes.md @@ -0,0 +1,193 @@ +# 5. Content values + +Each node carries five content values, each for one job. +No value covers the node's own ID, its geometry, its provenance or its fidelity. +So re-witnessing a page or proofreading a sentence changes none of them, while changing one character changes the `text_hash` and `node_hash` of that sentence. + +In this chapter *H* is SHA-256 written as hexadecimal; under a keyed scheme, *H* is HMAC-SHA-256 under the key ([5.8](#58-keyed-hashes)). + +## 5.1 The five values + +| Value | Definition | Used for | +| --- | --- | --- | +| `text_hash` | *H*(normalize(plain projection)) | Quotations and Lode's verbatim check, where every character counts. | +| `match_hash` | *H*(strict projection) | Certifying that two witnesses agree, and recognizing the same text elsewhere. | +| `align_key` | *H*(lossy projection) | Proposing alignments. It never certifies anything. | +| `own_hash` | *H*(canonical JSON of the node's own content, [5.2](#52-own-content)) | Anchors on containers that have content of their own. | +| `node_hash` | *H*(canonical JSON of `{"own": own_hash, "children": [each child's node_hash, in order]}`) | Pins on leaves; the root hash; knowing that something below has changed. | + +Normalization is that of [1.4](01-conventions.md#14-text-normalization-for-hashing). +Because each `node_hash` covers its children's, the root's `node_hash` is a Merkle root: a correction to one sentence changes that sentence's values and the `node_hash` of each ancestor, and nothing else. +`hashes.jsonl` gives every value for every node of a small document, with each node's own content. + +## 5.2 Own content + +A node's own content is an object with its `kind` and these members, and nothing else: + +| Kinds | Members | +| --- | --- | +| Kinds that take a label | `label`: the label, or null. | +| `sentence`, `cell`, `reference`, `authors`, `keywords` | `runs`: the runs as stored, except that each `equation` run is reduced to `{"kind": "equation"}`, since an ID is never content. | +| `equation`, `equation-line` | `notation`, `source`. | +| `code`, `algorithm` | `language` (or null), `text`. | +| `section` | `level`, and `heading`: the `text_hash` of its heading, or null. | +| `table` | `columns`, as stored. | +| `cell` | `column`, `rowspan`, `colspan` and `role`, with defaults 1, 1 and `data` when absent. | +| `theorem` | `variant`, or null. | + +So paragraphs, rows, lists, items and the other containers without content have the same `own_hash` as every node of their kind, and are never judged by it. +Own content covers stored values exactly; it is not normalized. +A table's columns name header cells by ID, so fixing a header cell changes that cell, not the table. + +## 5.3 The strict projection + +The strict projection folds notation to one canonical linear form and keeps structure, so that it can certify agreement. +It is computed over a node's runs, or its math, as follows; for other nodes it is the strict projections of the text leaves joined with U+0020, then step 3. + +1. Apply NFC to every string, then project each run: + + | Run | Strict projection | + | --- | --- | + | `text` with `sup` | `^{` + inner + `}`, or only primes when the content is only primes ([5.4](#54-simple-notation)) | + | `text` with `sub` | `_{` + inner + `}` | + | other `text`, `link` | The text, with Unicode script characters folded and dashes before digits folded ([5.4](#54-simple-notation)) | + | `math`, `equation` | The canonical linear form when the source is simple; U+FFFC when it is complex | + | `cite`, `xref`, `fnmark` | U+FFF9 + the printed form with whitespace removed + U+FFFB | + + Concatenate the results. +2. Apply NFKC, which folds ligatures, the micro sign and Greek variant letters. +3. Collapse whitespace to one U+0020 and trim, as [1.4](01-conventions.md#14-text-normalization-for-hashing) does. + +Folding scripts before NFKC matters: NFKC alone would turn a superscript ² into a plain 2 and erase the structure the projection exists to keep. +Marking citations matters for the same reason: "10" followed by citation 3 must not agree with the text "103". + +Each complex run also yields a complex key, `notation:source`, with the source in NFC and every whitespace character removed. +A node's complex keys are listed in order. +Two readings agree only when their `match_hash` values are equal and their complex keys are equal, run by run; this is stage 1 of canonical math. +Stage 2, a later minor version, will replace U+FFFC with canonical MathML; it changes `match_hash` and `align_key` values but no `text_hash`, `own_hash` or `node_hash`, so no anchor goes stale. + +## 5.4 Simple notation + +A character is simple, after folding, when it is: + +1. a letter: General Category L and Script Latin or Greek, or U+00B5 MICRO SIGN; +2. a digit: General Category Nd; or +3. one of `+ − = × ⋅ / < > ≤ ≥ ± ( ) ′ . ,`. + +Inside notation, characters fold: U+002D and U+2013 to U+2212 MINUS SIGN; U+00B7, U+2219 and U+22C5 to U+22C5 DOT OPERATOR; U+0027 and U+2032 to U+2032 PRIME. + +**The canonical linear form.** +Notation is a sequence of atoms; an atom has a base (possibly empty), a count of primes, an optional subscript and an optional superscript, each itself a sequence of atoms. +An atom is written as its base, then its primes as U+2032, then `_{`, the subscript and `}`, then `^{`, the superscript and `}`. +A superscript that holds only bare primes becomes primes on its atom. +There are no spaces in the form, and a script with no base attaches to the character before it, so all of `$H_2O$`, `H$_2$O`, `$\mathrm{H}_{2}\mathrm{O}$`, `H2O` and `H₂O` project to `H_{2}O`. + +**TeX sources** are read as tokens: control words (`\` and ASCII letters, with following whitespace skipped), control symbols (`\` and one other character), and single characters, with whitespace and `~` ignored. + +| Token | Meaning | +| --- | --- | +| `{` … `}` | A group; its atoms are spliced in. A script on a group of more than one atom makes the source complex. | +| `_`, `^` | A subscript or superscript of the previous atom (or of an empty base), taking one argument: a group, a command or a character. A second script of the same kind is complex. | +| `'` | A prime on the previous atom. | +| `\mathrm`, `\text`, `\textrm`, `\mathup` | A wrapper: its argument's atoms are spliced in. | +| `\rm` | Ignored. | +| `\,` `\;` `\:` `\!`, a backslash before a space, `\quad` `\qquad` `\enspace` `\thinspace` `\medspace` `\thickspace` | Spacing, ignored. | +| `\alpha` … `\omega`, `\varepsilon`, `\vartheta`, `\varkappa`, `\varpi`, `\varrho`, `\varsigma`, `\varphi`, `\Gamma` … `\Omega` | The Greek letter TeX typesets; `\epsilon` is ϵ and `\phi` is ϕ. | +| `\times` `\cdot` `\pm` `\le` `\leq` `\ge` `\geq` `\lt` `\gt` `\prime` `\AA` | × ⋅ ± ≤ ≤ ≥ ≥ < > ′ Å | +| `\left(`, `\right)` | Parentheses; any other delimiter is complex. | +| A simple character | An atom. | +| Anything else | The source is complex. | + +**Typst sources** are read as tokens: strings in double quotes (complex if they contain a backslash), identifiers (runs of letters, with `.` joining modifiers such as `plus.minus`), numbers (digits with an optional fraction), the two-character operators `<=` and `>=`, and single characters, with whitespace ignored. + +| Token | Meaning | +| --- | --- | +| `_`, `^` | A script of the previous atom; its argument is a parenthesized group, whose parentheses are dropped, or one token. | +| `(` … `)` elsewhere | Literal parentheses around a group. | +| `'` | A prime. | +| A string | Its characters, with whitespace removed. | +| A one-letter identifier, a number | Its characters. | +| `upright(…)` | A wrapper. | +| `alpha` … `omega`, `Alpha` … `Omega`, and `epsilon.alt`, `theta.alt`, `phi.alt`, `pi.alt`, `rho.alt`, `sigma.alt`, `kappa.alt`, `beta.alt` | The Greek letter Typst renders; `epsilon` is ε and `phi` is φ. | +| `plus` `minus` `times` `dot` `dot.op` `dot.c` `plus.minus` `lt` `gt` `lt.eq` `gt.eq` `eq` `prime` `slash`, and `<=` `>=` | + − × ⋅ ⋅ ⋅ ± < > ≤ ≥ = ′ / ≤ ≥ | +| `thin` `med` `thick` `quad` `wide` `space` | Spacing, ignored. | +| `/`, `*`, `#`, `&`, brackets, braces, any other identifier, and the operators `->`, `=>`, `!=`, `<-`, `==`, `:=` | Complex. In Typst `/` is a fraction. | + +NFKC later folds the variant letters (ϵ to ε, ϕ to φ, ϑ to θ), so TeX's and Typst's defaults agree in the projection. + +**Styled scripts.** +The inner form of a `sup` or `sub` text run is its text with whitespace removed and characters folded, when every character is simple or a Unicode script character; otherwise it is the text with whitespace collapsed and trimmed. + +**Unicode script characters** are those whose decomposition mapping is tagged `` or ``, such as ², ⁻ and ₂. +In text, each maximal run of script characters of one kind folds to `^{` or `_{`, the folded bases, and `}`, when every base is simple; otherwise the run is left for NFKC to flatten. + +**Dashes in text.** +Outside notation, U+002D and U+2013 immediately before a digit become U+2212, so "10-20" and "10–20" agree; "CT–CT" keeps its dash. + +`notation.jsonl` covers every rule, and `projections.jsonl` with `projection-groups.jsonl` covers H₂O, cm⁻¹, 10⁻³ and K_r in every spelling, ligatures, the micro sign, citation marks and "103" against 10³. + +## 5.5 The lossy projection + +The lossy projection starts from the strict projection and: + +1. removes each `_{` and `^{` and the `}` that closes it, leaving the script's content in place, while other braces stay; +2. removes each mark, from U+FFF9 to the next U+FFFB; +3. applies Unicode full case folding, then NFKC; +4. deletes every whitespace character, every character of General Category Pd, and U+00AD SOFT HYPHEN. + +So "103" and 10³ share an `align_key` while their `match_hash` values differ, and "bond- length", "bond-length" and "bond length" share one too. +A node's prose length is the number of code points in its lossy projection other than U+FFFC. + +## 5.6 Alignment + +Two readings of a document are aligned as whole sentence sequences, never paragraph by paragraph, because backends disagree about paragraphs at page and column breaks. +Each reading is a list of sentences in document order, each with its strict projection, lossy projection, complex keys, container and context (the kind of its container: paragraph, heading, caption and so on). + +1. **Anchors.** A sentence is a candidate when its lossy projection occurs exactly once in each reading and its prose length is at least 20. + Take the candidates in the order of the first reading, and choose the longest subsequence whose positions in the second reading increase; among equally long ones, the one whose sequence of positions in the first reading is lexicographically smallest. +2. **Between anchors**, and before the first and after the last, align by the longest common subsequence of lossy projections. + Ties are broken deterministically: walking both segments from their start, pair two sentences whose lossy projections are equal; otherwise skip the first reading's sentence when the remainder without it has a common subsequence at least as long as without the second's, and skip the second's otherwise. +3. **Compare** each pair. + They agree when their strict projections and complex keys are equal. + Otherwise the pair is a suspect: of kind `number` when their numeric skeletons differ, else `equation` when their complex keys differ, else `word`. + The numeric skeleton keeps only digits, U+2212, `.`, `,`, `+`, `_{`, `^{` and `}`. +4. **Structure.** A pair whose contexts differ is also a `structure` suspect; two consecutive pairs that share a container in one reading but not in the other are a `join` suspect. +5. **Unplaced** sentences are `dropped` (in the first reading only) or `added` (in the second only). + +Paired sentences keep the first reading's ID even when they disagree, so a reading that lost a superscript is caught rather than accepted. +`alignment.jsonl` aligns two readings that exercise every rule, including two prose-thin sentences aligned by their order. + +## 5.7 Suspects + +A suspect, `scienting-suspect/1`, records a doubtful reading for review: its `id`, its `kind` (`word`, `number`, `equation`, `structure`, `join`, `added`, `dropped`, `boundary` for an uncertain sentence boundary, or `reading` for anything else), the node, the readings compared, an optional crop by SHA-256 and a note. +Suspects may travel in a package's `suspects.jsonl`, sorted by ID, until they are resolved. + +## 5.8 Keyed hashes + +A hash of a short text is not a secret: a withheld cell reading "310.0" is recovered by hashing guesses. +So every content value that leaves a team's store is keyed. + +| Where the value goes | `hashing` | Key | +| --- | --- | --- | +| The team's own store and bundles | `{"scheme": "plain"}` | None. | +| An export to another machine of the team | `{"scheme": "hmac-team", "key_id": …}` | The team key. | +| A public layer, or any export on a work whose text is withheld | `{"scheme": "hkdf-pages", "context": …, "pages": […]}` | A key derived from the witness's page fingerprints. | + +A keyed scheme replaces SHA-256 with HMAC-SHA-256 under its key in every content value, including the Merkle construction of `node_hash`, and in `meta_hash`. + +**The team key** is HKDF-SHA-256 (RFC 5869) with the team secret, at least 32 random bytes, as input keying material, the salt `scienting-team-key/1`, the info `scienting-hash/1` and length 32. +Its `key_id` is the first 16 hexadecimal digits of SHA-256 of the bytes `scienting-key-id/1` followed by the key. + +**The page key** is HKDF-SHA-256 with the concatenated 32-byte page fingerprints of the witness, in page order, as input keying material, the salt `scienting-page-key/1`, the UTF-8 of the context as info, and length 32. +The context names the export, such as `layer:smithlab/kp4m2x7q`, so two exports never share a key. +The export lists each page as its page hash, SHA-256 of `scienting-page-hash/1` followed by the fingerprint's 32 bytes, never the fingerprint itself. +A reader who holds the paper computes the fingerprints from their own copy, checks them against the page hashes and derives the key; someone who does not hold it sees only hashes of hashes. + +In keyed anchors, quotations become MACs over the normalized quotation and context texts become MACs over their normalized text ([6.3](06-anchors.md#63-keyed-anchors)). +Open-access documents under a license that allows redistribution need none of this. +`keyed.jsonl` gives the derivations and a case a non-holder cannot verify. + +## 5.9 The metadata hash + +`meta_hash` is *H* of the canonical JSON of `{work, version, relations, meta, language, license}` from `document.json`, with `license` null when absent. +Fixing an affiliation changes `meta_hash` and not the root. diff --git a/spec/06-anchors.md b/spec/06-anchors.md new file mode 100644 index 0000000..3fe155b --- /dev/null +++ b/spec/06-anchors.md @@ -0,0 +1,120 @@ +# 6. Addresses and anchors + +## 6.1 Addresses + +An address names a node, optionally pinned to a hash and narrowed to a span: + +```abnf +address = [store "/"] key "#" node ["@" pin] ["[" start ":" end "]"] +store = key +key = lowalnum *(lowalnum / "." / "_" / "-") +node = key ; a node ID or an alias +pin = 6HEXLOWER ; the first six digits of a node_hash +start = "0" / (%x31-39 *DIGIT) +end = "0" / (%x31-39 *DIGIT) +lowalnum = %x61-7A / DIGIT +``` + +`start` is not greater than `end`, and both are code-point offsets into the plain projection of the node in the pinned state. + +| Example | Names | +| --- | --- | +| `cornell1995second#k3m9q2a` | A sentence, whatever its current text. | +| `cornell1995second#k3m9q2a@4f1a0c` | That sentence as it read when its `node_hash` began `4f1a0c`. | +| `cornell1995second#k3m9q2a@4f1a0c[12:57]` | Code points 12 to 57 of its plain projection in that state. | +| `smithlab/cornell1995second#k3m9q2a` | The same sentence in the `smithlab` store. | + +On the web the node ID is the fragment: `…/smithlab/cornell1995second#k3m9q2a` lands on the sentence. +`addresses.jsonl` gives valid and invalid addresses and how each parses. + +## 6.2 The anchor + +An anchor, `scienting-anchor/1`, is the stored form of a pinned address, with enough context to survive change. +It is what Lode extracts, annotations, dataset values and draft citations use. + +| Property | Required | Holds | +| --- | --- | --- | +| `format` | Yes | `scienting-anchor/1`. | +| `store` | No | The store. | +| `doc` | Yes | The document key. | +| `node` | Yes | The node ID, or a legacy alias. | +| `kind` | No, RECOMMENDED | The node's kind when the anchor was made. | +| `own_hash`, `node_hash` | Yes | The node's values when the anchor was made. | +| `span` | No | `[start, end]` in code points; present for span anchors. | +| `quote` | With a span, or on a leaf | `{exact, prefix?, suffix?}`, or `{exact_hash, length, prefix?, suffix?}` for quotations longer than 200 code points. | +| `context` | On a cell | `{table_label, row_path, column_path}`: the table's label and the normalized plain projections of the row's and column's header cells, outermost first. | +| `leaves` | On a container without content | `[[id, match_hash], …]`: every leaf below the node, in document order. | +| `rev` | Yes | The document's revision when the anchor was made. | +| `keyed` | No | The hashing scheme, when the anchor leaves the team ([6.3](#63-keyed-anchors)). | + +`exact` is the substring of the stored plain projection at the span, or the whole projection for a leaf anchor. +`prefix` and `suffix` are up to 32 code points before and after it, omitted when empty. +`exact_hash` is SHA-256 of the normalized quotation, and `length` its length in code points. + +Revisions are counted, not timed, because anchors are made on different machines and clocks disagree. + +## 6.3 Keyed anchors + +When an anchor leaves the team, in a public layer or on a work whose text is withheld, it carries `keyed`, and: + +1. `own_hash` and `node_hash` are computed under the key; +2. `quote` becomes `{mac, length, prefix_mac?, suffix_mac?}`, each MAC over the normalized text; and +3. `context` becomes `{table_label_mac, row_path_mac, column_path_mac}` in the same way. + +Such an anchor can be verified, and its span shown, only over a copy of the paper the reader holds. + +## 6.4 Four kinds of anchor + +| Kind | Points at | Judged by | +| --- | --- | --- | +| Span | Part of a leaf's text: the anchor has a `span`. | The quote, then `node_hash`. | +| Leaf | A whole `sentence`, `cell`, `reference`, `authors`, `keywords`, `equation`, `equation-line`, `code` or `algorithm`. | `node_hash`. | +| Container with content | A `section`, `figure`, `panel`, `table`, `theorem` or `footnote`. | `own_hash`, with `node_hash` reported. | +| Container without content | Any other node. | Its ID and its leaves. | + +## 6.5 Resolution + +To resolve an anchor against a document's current state (its nodes, its ID table and its corrections): + +**Follow the ID.** +If the anchor's node is live, use it. +Otherwise follow the ID table: an alias leads to its node, a retirement to its successor, repeatedly, until a live node is reached, a deletion ends the chain, or an ID is unknown or repeats. +The anchor is *retired* when the chain passed a retirement; an alias alone does not retire it. +The kind is the anchor's `kind`, else the live node's, else the retired entry's `node_kind`. + +**Find the quote.** +The quote's hits in a text are the positions where `exact` occurs, or, for a hashed quote, where a window of `length` code points has that hash. +When there is more than one hit and the anchor has a prefix or suffix, keep the hits preceded by the prefix and followed by the suffix. + +**Judge**, by kind: + +| Kind | Current | Changed below | Moved | Reattached | Otherwise | +| --- | --- | --- | --- | --- | --- | +| Span or leaf | Not retired, and `node_hash` equal. | Never. | Retired, and the successor's text has exactly one hit (a span) or at least one (a leaf); a span takes the new position. | Not retired, changed, and exactly one hit, with the new position; or a changed node whose only changes since `rev` were `relabel` corrections, and whose own content with the earliest of those corrections' `from` label has the anchored `own_hash`. | Stale. | +| Container with content | Not retired, and `own_hash` and `node_hash` equal. | Not retired, `own_hash` equal, `node_hash` not. | Retired, and the successor's `own_hash` equals the anchored one. | Not retired, and only `relabel` corrections changed it, judged as for leaves. | Stale. | +| Container without content | Live and `node_hash` equal. | Live and `node_hash` not equal. | Retired, and the successor's leaves hold at least half of the anchored `leaves`, each matched by ID or else by `match_hash`. | Never. | Stale. | + +**The cell rule.** +A cell anchor whose ID led to no live node (a deletion, or an unknown ID), or whose successor fails the leaf rule, is reattached when exactly one cell in the document has the anchored `context` and exactly one hit of the quote. +This finds a value again even in a table with multi-level headers or row labels repeated across parameter sets. + +The result is `{result, node, node_hash?, span?, drift?, via?, reason?}`: the outcome, the live node and its `node_hash`, the new span, the drift of a `changed-below` result, the IDs followed, and a reason for `stale` and relabel results. +A `moved` or `reattached` anchor is re-pinned to the live node, and the move is recorded. + +Checks are stricter than readers: a Lode extract is a span or leaf anchor and never accepts `changed-below`, because a check is about exact words. +`resolve.jsonl` resolves seventeen anchors made at revision 0 against `fixtures/packages/hale2026harmonic` at revision 12, with every outcome. + +## 6.6 Drift + +`changed-below` must not last forever. +For a container *c* and an anchor made at revision *r*: + +1. The corrections that count are those with `index` greater than *r* whose `path` or `to_path` contains *c* and whose `touched` list is not empty. +2. `count` is their number, and *T* the union of their `touched` lists. +3. *L* is the set of leaves below *c* (including *c* itself if it is one) in the current state. +4. `share` is |*T*| divided by |*L* ∪ *T*|, written as a decimal with four places, rounded half up. +5. `level` is `none` when `count` is 0, `high` when `share` is greater than the threshold, and `low` otherwise. + +The threshold is a quarter by default; a project may set another ([20](20-projects.md)). +A reader shows a `high` drift as needing review. +A change to a section's heading changes its `own_hash`, so a rename is never mistaken for drift. diff --git a/spec/07-geometry.md b/spec/07-geometry.md new file mode 100644 index 0000000..4354db3 --- /dev/null +++ b/spec/07-geometry.md @@ -0,0 +1,64 @@ +# 7. Geometry + +## 7.1 Page fingerprints + +Several publishers stamp each download with the institution, date and time, so two copies of one paper rarely share a SHA-256. +Every page of a witness therefore also has a fingerprint, `scienting-page/1`. +Geometry and digitizations point at fingerprints, so a re-download keeps every box and every digitization. + +The input is the page's size after rotation, its text-layer lines in content-stream order (each a string and, where known, a box), and the SHA-256 of each embedded image's stream data as stored. +To compute the fingerprint: + +1. Remove every line that a stamp rule matches ([7.2](#72-stamp-rules)). +2. Join the remaining lines with U+0020. +3. Fold Unicode script characters and dashes before digits as the strict projection does for text ([5.4](05-hashes.md#54-simple-notation)), then apply NFKC. +4. Delete every whitespace character and every character of General Category Cc or Cf. +5. Round the width and height to whole points, half up. +6. The fingerprint is SHA-256 of the canonical JSON of `{"format": "scienting-page/1", "size": [width, height], "text": the text, "images": the image hashes, sorted}`. + +Whitespace is deleted rather than collapsed because text extractors disagree about where they insert spaces. +A scanned page with no text layer is fingerprinted by its size and its images alone. +Two witnesses whose fingerprints are equal, page for page, are the same edition of the paper. + +How lines are extracted from a PDF is outside this text; the vectors give the lines, so implementations are tested on the function. +`fingerprints.jsonl` gives two differently stamped downloads of one ACS-style page and of one Wiley-style page that share their fingerprints, a page with one changed digit that does not, and a scan. + +## 7.2 Stamp rules + +Stamp rules are published in `scienting-stamps/1` files. +Each rule has an `id`, a `pattern`, a `where` (`any`, or `margin` with a `margin` in points, default 36) and a note. +A rule matches a line when its pattern is found in the line's normalized text, with ASCII letters compared without case; a `margin` rule matches only lines whose box lies wholly within the margin of one edge. +Patterns use only syntax that ECMAScript and Python read alike: literals, `.`, `*`, `+`, `?`, `^`, `$`, classes and escaped punctuation. + +[registry/stamps/scienting-stamps-1.json](../registry/stamps/scienting-stamps-1.json) holds the published rules. +A team adds rules it learns, when two witnesses of one version differ only in such lines, in files of its own with `learned: true`. +A missed stamp splits one edition into two; an over-broad rule hides a real difference. + +## 7.3 `pages.jsonl` + +| Property | Holds | +| --- | --- | +| `witness` | The witness ID. | +| `page` | The page number in the witness, from 1. | +| `page_fp` | The fingerprint. | +| `size` | `[width, height]` in points, after rotation. | +| `page_label` | The printed page label, when there is one. | +| `text_layer` | Whether the page has a text layer. | +| `stamps_removed` | The IDs of the rules that removed lines, in line order, when any did. | + +Pages sort by witness ID, then page. + +## 7.4 `locations.jsonl` + +| Property | Holds | +| --- | --- | +| `node` | The node ID. | +| `page_fp` | The page's fingerprint, which some page of some witness has. | +| `page` | The page number. | +| `page_label` | The printed label. | +| `boxes` | One or more `[x0, y0, x1, y1]` in PDF points, origin at the top left after rotation. | +| `approx` | `true` when the boxes come from OCR line boxes rather than glyphs. | + +A node has one record per page it appears on; a sentence that wraps has several boxes. +Locations sort by the node's position in document order, then page, then fingerprint. +Because locations point at fingerprinted pages, a reader can rebuild a document from its own download: it fingerprints the pages, finds the matching ones and reads the text at the stored boxes. diff --git a/spec/08-fidelity.md b/spec/08-fidelity.md new file mode 100644 index 0000000..3299f82 --- /dev/null +++ b/spec/08-fidelity.md @@ -0,0 +1,124 @@ +# 8. Fidelity, receipts and spot-checks + +## 8.1 Levels of fidelity + +| Level | Meaning | +| --- | --- | +| F0 converted | One reading, not corroborated. | +| F1 resolved | Every suspect in the node was answered against the page image and passed the gate. | +| F2 corroborated | An independent witness agrees, by `match_hash` and complex keys, or the text is born digital, as a Typst or LaTeX source is. | +| F3 proofread | A named person compared the node with the page image, and a valid receipt they signed lists the node at its current `node_hash`. | + +Levels apply to leaves. +The pipeline records F0, F1 or F2 in a leaf's `fidelity`; F3 comes only from receipts. +A correction that changes a leaf drops it back: the gate's crop evidence makes it F1 at most, until it is corroborated or proofread again. + +## 8.2 Levels + +A leaf's level is the highest of its recorded `fidelity` and the levels of every valid receipt ([8.6](#86-receipt-status)) that lists it at its current `node_hash`. +A receipt at a lower level never lowers a node; only a revocation, a failed spot-check or a correction does. +A document reports, in `document.json`, the lowest level among its leaves and the count at each level. + +## 8.3 Receipts + +A paper has thousands of nodes, and nobody signs thousands of times, so people sign receipts: one signature over a Merkle root of everything reviewed in a sitting. + +| Property | Required | Holds | +| --- | --- | --- | +| `format` | Yes | `scienting-receipt/1`. | +| `id` | Yes | The record ID ([4.6](04-identity.md#46-record-ids)). | +| `doc` | Yes | The document key. | +| `rev` | Yes | The revision reviewed. | +| `level` | Yes | `F1`, `F2` or `F3`. | +| `scope` | Yes | `all`, `section:`, `page:`, `targeted:` (such as `targeted:lode`), or `qa:` for a spot-check. | +| `nodes` | Yes | `[[id, node_hash], …]`, sorted by ID without repeats. | +| `records` | No | `[[kind, id, hash], …]` for other things signed in the sitting: `annotation`, `digitization`, `correction`, `layer` or `checklist`. | +| `root` | Yes | The Merkle root ([8.5](#85-merkle-roots)). | +| `evidence` | Yes | What the reviewer looked at: `{kind, sha256, node?, page_fp?, box?, note?}` with `kind` `crop`, `witness` or `source-file`, or `{kind: "person", by}`. A regenerated crop is different evidence. | +| `by` | Yes | The signer's roster key. | +| `at` | Yes | When it was signed. | +| `qa` | For `qa:` scopes | The spot-check ([8.8](#88-spot-checks)). | +| `export_of` | No | The receipt this one re-issues under a keyed scheme. | +| `keyed` | No | The scheme its values are keyed under, when it leaves the team. | +| `signature` | Yes | `{scheme, key, value}` ([8.4](#84-record-hashes-and-signatures)). | + +A receipt lists nodes, records, or both. +A correction invalidates a receipt for the corrected node only, because the node's `node_hash` no longer matches; the rest still counts. + +A receipt shared outside the team cannot carry plain node hashes, which would leak short texts, and its signature covers them. +So an export re-issues it: a new receipt with `export_of`, values under the export's key, signed by the original reviewer or a team key with the `export` purpose. + +## 8.4 Record hashes and signatures + +A signed record's record hash is SHA-256 of the canonical JSON of the record without `id` and `signature`. +Its `id` is the 13-character letter-first encoding of that hash. +Its signing payload is the canonical JSON of `{"format": , "hash": }`. + +| Scheme | `value` | +| --- | --- | +| `ed25519` | The RFC 8032 signature of the payload, in standard Base64 with padding. | +| `ssh` | An SSH signature of the payload in the namespace `scienting`, armored. | +| `gpg` | A detached, armored OpenPGP signature of the payload. | +| `sigstore` | A Sigstore bundle for the payload, as JSON text. | + +`signature.key` is the signer's roster key and equals `by`. +Self-hosted deployments sign with team keys or a private Sigstore deployment; the public Sigstore instance, whose log permanently records each signer's identity, is for public layers only. +`signatures.jsonl` verifies one receipt and the RFC 8032 test vector. + +## 8.5 Merkle roots + +A receipt's items are `["node", id, node_hash]` for each listed node, in order, followed by its `records`. +The root follows RFC 6962: a leaf hash is SHA-256 of the byte 0x00 and the item's canonical JSON; an interior hash is SHA-256 of 0x01 and the two child hashes; a list of *n* > 1 items splits after the largest power of two less than *n*. +A root over one item is that item's leaf hash; a receipt with no items is invalid. +The tree allows a proof that one node was covered without revealing the others; `merkle.jsonl` gives roots for one to seven items. + +## 8.6 Receipt status + +A receipt is: + +1. **invalid** when its root, ID or signature does not verify, or its signer's key was not valid when it was signed (`registered_at` ≤ `at` < `revoked_at`); +2. otherwise **revoked** when a valid revocation names it, or names its signer with a period that contains its `at`; +3. otherwise **suspended** when a valid spot-check of it found an error; +4. otherwise **valid**. + +Only valid receipts set levels. +A suspended receipt stays suspended; its reviewer reviews the sitting again and signs a new receipt, which needs its own spot-check. + +## 8.7 Revocations and the roster + +A revocation, `scienting-revocation/1`, names one `receipt`, or a `signer` and a `period` `{from, to}`, with a `reason`, and is signed like a receipt. +It is valid when its signature verifies and its signer is the revoked receipt's signer, the signer it names, or an owner of the project. + +The roster, `scienting-roster/1`, lists the keys that may sign: each with an `id`, a `person`, a `scheme`, its `public` key (Base64 for Ed25519), its `purposes` (`sign`, `spot-check`, `export`), `registered_at` and `revoked_at`. +A package MAY carry the roster its receipts need as `roster.json`, so its receipts verify without the store. +The roster is meant to match the one Lode already verifies; aligning the two is recorded in [DECISIONS.md](../DECISIONS.md). + +## 8.8 Spot-checks + +For each F3 receipt, a second reviewer checks a sample of its nodes and signs a `qa:` receipt. +A seed the reviewer controls could be ground, by varying the receipt until the sample falls on careful work, so the seed is a signature nobody can steer: + +1. The seed is the checker's Ed25519 signature over the canonical JSON of `{"format": "scienting-spot-check/1", "receipt": }`, made with a key registered in the roster with the `spot-check` purpose before the original was signed. + Ed25519 signatures are deterministic, so the checker cannot choose it, and the reviewer cannot predict it. +2. The sample size is the smaller of *n* and the larger of `minimum` and ⌈`rate` × *n*⌉, for the original's *n* nodes; the defaults are a rate of `0.05` and a minimum of 10. +3. Rank the original's node IDs by the hexadecimal SHA-256 of the seed's 64 bytes followed by the ID's UTF-8, then by ID, and take the first ones. + +The `qa` object records `of`, `key`, `seed` (Base64), `rate`, `minimum`, the `sample` sorted by ID, and the `errors` found, each `{node, kind?, note?}`. +The `qa:` receipt's `nodes` are the sampled nodes at the hashes the original lists. +Anyone can recompute the sample; `spotcheck.jsonl` does. + +## 8.9 Reviewer error bounds + +One sample proves little; what a buyer wants is a bound on each reviewer's error rate across all their samples. +With *k* errors in *n* sampled nodes, the bound is the one-sided Clopper–Pearson upper confidence bound at confidence *c*, by default 0.95: the rate *p* at which the probability of at most *k* errors in *n* is 1 − *c*, or 1 when *k* = *n*. +It is reported to six decimal places, rounded up. +With no errors the bound is about 3/*n*, so zero errors in 300 sampled nodes bounds a rate below 1%; `bounds.jsonl` gives cases. + +A QA report, `scienting-qa-report/1`, states for each reviewer who signed a delivery the nodes sampled, the errors found, the confidence, the method `clopper-pearson` and the bound. + +## 8.10 Targeted F3 + +The target set of a document is every node that a Lode extract, a dataset value, a confirmed `claim-link`, a draft quotation or a pinned citation anchors, plus every display equation, plus every sentence with a digit in a `text` or `math` run. +Digits in `cite`, `xref` and `fnmark` runs do not count. +A project sets the digit rule to `all`, `anchored-sections` (only sentences in a section that holds an anchored node) or `none`. +Neighbors shown for context are not in the set, and nothing new comes to rest on a node below F3 without the node joining the set. diff --git a/spec/09-figures-tables-equations.md b/spec/09-figures-tables-equations.md new file mode 100644 index 0000000..b38a54c --- /dev/null +++ b/spec/09-figures-tables-equations.md @@ -0,0 +1,37 @@ +# 9. Figures, tables and equations + +## 9.1 Figures and panels + +A figure holds its panels, its caption and its notes. +A panel's own content is its label only. +Its image and region are evidence, not content: re-extracting the image at native resolution adds an asset and changes no hash. + +| Panel attribute | Holds | +| --- | --- | +| `image` | `{sha256, media_type, native, dpi?}`: the embedded image, at native resolution when the PDF holds one. | +| `crop` | `{sha256, media_type, dpi}`: a crop of the panel's region at a fixed resolution. | +| `figure_text` | `[{id, text, role, page_fp?, boxes?}]`: text found inside the panel, with `role` `axis-label`, `tick-label`, `legend`, `annotation` or `other`. | + +Text inside a figure is not prose and is not split into sentences. +Its items have IDs ([4.2](04-identity.md#42-minting-node-ids)) so that a digitization can anchor its axis labels to them. +A panel's region on the page is its location ([7.4](07-geometry.md#74-locationsjsonl)). + +## 9.2 Tables + +A table holds its caption, an optional head, one body and its notes. +Rows and cells are nodes, with all five values, so the gate, the hashes and the database treat them like any other node, and a cell is addressed like a sentence. + +Columns are defined in the table's `columns` attribute, each with an ID and a header path: the IDs of the header cells above it, outermost first. +Header text is stored once, in the header cells. +A row's `header_path` lists the cells that label it: a row-group header and the row's own header cell. +A cell records its column, its spans and its role; the expanded grid is derived, never stored. + +So inserting a row that a reading dropped adds a row node and changes no other row's or cell's ID or hash, and fixing a header cell changes that cell, not the table. +A table continued across pages is one table node; its pages are locations. +For people, a cell can be shown as "Table 2, row CT–CT, column K_r" from its header paths. + +## 9.3 Equations + +An equation keeps its source as written, `tex` from a conversion or `typst` from a draft, and its printed number as its `label`, so numbering never collides with a renderer's own. +An equation that the source numbers line by line (Eq. 3a) has `equation-line` children, each with its own label and source. +MathML is derived by a pinned tool and recorded, with the tool's name and version, in `derived/mathml.jsonl`. diff --git a/spec/10-references.md b/spec/10-references.md new file mode 100644 index 0000000..26df8e3 --- /dev/null +++ b/spec/10-references.md @@ -0,0 +1,15 @@ +# 10. References and citations + +Each reference is a `reference` node holding its printed runs, exactly as printed, and its printed number as its `label`. +`references.jsonl` holds, for each reference node in document order, a record with `node`, `label`, an optional parsed `csl` record in CSL-JSON, and its `resolution`: + +| Resolution | Means | +| --- | --- | +| `{type: "doi", doi}` | The reference names a DOI. | +| `{type: "document", doc}` | It names a document in the same store, by key. | +| `{type: "none"}` | Nothing yet. | + +Every `cite` run links a sentence to one or more references. +The citation graph is therefore sentence-level: for any reference, the format gives every sentence that cites it, which is the citation's context. +The database derives a `citations` table from the runs ([13](13-database.md)). +An article's references and its Supporting Information's are separate documents' references and never mix. diff --git a/spec/11-corrections.md b/spec/11-corrections.md new file mode 100644 index 0000000..dfbedef --- /dev/null +++ b/spec/11-corrections.md @@ -0,0 +1,70 @@ +# 11. Corrections + +A correction, `scienting-correction/1`, is an operation on an established document, with its evidence and its author. +Corrections are added and never edited, so a document's history is its original reading plus its corrections. +Each has an `index`, counted from 1 in the order corrections are applied, and the document's revision is the index of the last. + +## 11.1 Operations + +| `op` | Fields | Does | IDs | +| --- | --- | --- | --- | +| `replace` | `target`, `find`, `replace`, optional `run` | Replaces the one occurrence of `find` among the target's editable strings with `replace`, a string or, inside a text run, a list of runs. | Unchanged. | +| `insert` | `parent`, `place_after` (a sibling, or null for first), `node` | Adds a subtree: kinds, labels, attributes and content, with each equation run naming its child as `{"kind": "equation", "child": i}`. | New IDs, minted ([4.2](04-identity.md#42-minting-node-ids)). | +| `insert` | `target`, `run`, `offset`, `text` | Inserts text into one run of the target, at a code-point offset in that run's editable string. | Unchanged. | +| `delete` | `target` | Removes an artifact and its subtree, such as a running head read as text. | All retired, without successors. | +| `split` | `target`, `offset` | Splits a sentence at an offset in its plain projection, which falls between runs or inside a text run; whitespace at the split is removed from both parts, and each equation child goes with its run. | The first part keeps the ID; the second gets a new one. | +| `merge` | `target`, `with`, optional `joiner` | Joins a node with its next sibling of the same kind: the runs of two run-bearing nodes, with the joiner (default one space) between, or the children of two `paragraph`, `list`, `item`, `quote`, `caption`, `figure-note` or `table-note` nodes. | `with` is retired, with the target as successor. | +| `move` | `target`, `parent`, `place_after` | Changes reading order or containment. | Unchanged. | +| `reclassify` | `target`, `kind` | Changes a node's kind, such as a paragraph that is really a caption, to a kind with the same content shape. | Unchanged. | +| `relabel` | `target`, `label` | Changes a printed label. | Unchanged. | +| `set` | `target`, `attr`, `value` | Sets one structural attribute: a section's `level`, a table's `columns`, a cell's `column`, `rowspan`, `colspan` or `role`, a row's `header_path`, a list's `ordered`, an item's `marker` or a theorem's `variant`. | Unchanged. | + +A leaf's editable strings are the `text` of its `text`, `link`, `cite`, `xref` and `fnmark` runs and the `source` of its `math` runs, each searched on its own; an equation's `source`; a verbatim node's `text`. +`set` is an addition to the design's eight operations, needed to fix table structure; see [DECISIONS.md](../DECISIONS.md). +Runs are made canonical after every operation, and the result MUST satisfy every rule of [3](03-nodes.md). + +## 11.2 Every correction records + +| Property | Holds | +| --- | --- | +| `evidence` | At least one item: `crop`, `witness` or `source-file` by SHA-256, or `person`. | +| `author` | `{key}` for a person in the roster, or `{model, run}` for a model's session. | +| `reason`, `at` | Why, and when. | + +A proposal, such as one an MCP client makes, carries these and `status: "proposed"`, and no applied fields. + +## 11.3 Applied fields + +When a correction is applied, its record gains: + +| Property | Holds | +| --- | --- | +| `index`, `id` | Its position, and its record ID. | +| `before`, `after` | The target's `node_hash` before and after, or null; for an inserted subtree, `target` is its root. | +| `path` | The target's ancestors when it was applied, root first; for an insert, the new subtree's. | +| `to_path` | For a move, the new ancestors. | +| `touched` | The leaves whose content the correction changed, sorted: the target of a `replace`, text `insert`, `relabel` or `set` on a leaf; the new leaves of a node `insert`; the deleted leaves of a `delete`; both parts of a `split`; both nodes of a run `merge`, or the moved-in leaves of a container `merge`; the moved leaves of a `move`; the leaves of a reclassified node. | +| `created`, `retired` | IDs minted or retired. | +| `from` | The label, kind or attribute value before a `relabel`, `reclassify` or `set`. | + +Retirements are also entered in `ids.jsonl` with the correction's index as `rev`. +Drift ([6.6](06-anchors.md#66-drift)) is computed from `path`, `to_path` and `touched` alone, so it needs no replay. + +## 11.4 The gate + +A correction is refused, naming the rule ([22](22-conformance.md)), when: + +1. a target, parent or sibling is not live, or the root would be deleted, moved, merged or reclassified; +2. `find` is empty or does not occur exactly once; +3. an `insert` has no crop evidence; +4. a digit changes without crop evidence: in a `replace` whose `find` and replacement have different digits, a `delete` of leaves that hold digits, or a `relabel` whose labels have different digits; +5. any leaf outside `touched` has different digits afterwards; +6. a `split` falls outside the sentence, inside a run other than text, or leaves a part empty; +7. a `merge` joins nodes that differ in kind, are not mergeable, or are not adjacent siblings; +8. a `move` would put a node inside itself; +9. a `reclassify` changes the content shape, or a `relabel` or `set` targets a kind that does not take it; or +10. the result breaks a rule of [3](03-nodes.md). + +Digits are characters of General Category Nd in the plain projection. +A package's corrections are also checked as a whole: indexes run from 1 without gaps, each `id` derives from its record, `rev` equals their number, every retired ID is in `ids.jsonl`, and the last correction of each leaf ends at its current `node_hash`. +`corrections.jsonl` in the vectors applies each operation, and each refusal, to a small document. diff --git a/spec/12-package.md b/spec/12-package.md new file mode 100644 index 0000000..f66dc91 --- /dev/null +++ b/spec/12-package.md @@ -0,0 +1,70 @@ +# 12. The package + +A document travels as a package: a folder named by its key, or the same folder zipped. + +## 12.1 Files + +| Path | Required | Holds | +| --- | --- | --- | +| `MANIFEST.json` | Yes | The manifest ([12.3](#123-the-manifest)). | +| `document.json` | Yes | The document ([2.2](02-model.md#22-documentjson)). | +| `nodes.jsonl` | Yes | Every node, in document order ([3](03-nodes.md)). | +| `witnesses.json` | Yes | Every witness, with its rights ([2.3](02-model.md#23-witnessesjson)). | +| `provenance.json` | Yes | Tools and versions, backends, cached readings, stages and where each ran. | +| `pages.jsonl` | No | Every page of every witness ([7.3](07-geometry.md#73-pagesjsonl)). | +| `locations.jsonl` | No | Geometry per node and page ([7.4](07-geometry.md#74-locationsjsonl)). | +| `references.jsonl` | No | Parsed references and their resolution ([10](10-references.md)). | +| `corrections.jsonl` | No | Every correction, in order ([11](11-corrections.md)). | +| `receipts.jsonl` | No | Receipts and revocations, sorted by `at` and then `id` ([8](08-fidelity.md)). | +| `ids.jsonl` | No | Retired IDs and legacy aliases ([4.4](04-identity.md#44-idsjsonl)). | +| `suspects.jsonl` | No | Unresolved suspects, sorted by `id` ([5.7](05-hashes.md#57-suspects)). | +| `roster.json` | No | The roster its receipts need ([8.7](08-fidelity.md#87-revocations-and-the-roster)). | +| `assets/` | No | Images and crops, as `.`, present or listed only. | +| `datasets//` | No | Datasets ([15](15-datasets.md)). | +| `derived/` | No | Rebuildable renderings, never authoritative ([12.7](#127-derived-files)). | + +An optional JSON Lines file with no records is omitted. +Every file is in the canonical form of [1.9](01-conventions.md#19-files). + +## 12.2 Paths + +Paths use `/`, are relative, have no empty, `.` or `..` segment, no backslash and no NUL, and are already normalized. +In a zip, entries are UTF-8 named, sit under one top-level folder named by the key, are stored or deflated, carry no symbolic links, and are unique; a consumer refuses an archive that breaks any of these, or whose expanded size exceeds its own limit. +A producer that wants byte-identical archives writes entries sorted by path, dated 1980-01-01 00:00, with no extra fields. + +## 12.3 The manifest + +`MANIFEST.json`, `scienting-package/1`, is `{format, doc, key, files}`: the package format, `scienting-doc/1`, the document key, and every other file as `{path, sha256, size}`, sorted by the UTF-8 bytes of the path. +An asset whose bytes stay in the asset store is listed with `present: false`; nothing else may be. +The SHA-256 of `MANIFEST.json` pins the whole package. +The manifest is meant to have the same shape as Lode's `lode-cache/1`, so Lode can hold a package as a source cache. + +## 12.4 Provenance + +`provenance.json` holds `tools` (`{name, version}`), and optionally `backends`, `readings` (each cached reading's ID, witness, backend and SHA-256), `stages` (each stage's name, tool, input hashes, output hash, the `processor` where it ran, and the uses it ran under) and a `session`. +Every stage that uses a model or an outside service records where it ran ([14](14-rights.md)). + +## 12.5 Text policies + +| Policy | Means | +| --- | --- | +| `full` | Every leaf keeps its content. | +| `checks-only` | Every leaf has `withheld: true` and no `content`; panels drop their figure text; references keep their resolution but no CSL; there are no corrections, suspects or datasets; and the hashing scheme is keyed. | + +A checks-only package is how a team shares its annotations on a paywalled paper without sharing the paper. +Its text lives in the team's private asset store, and only key holders can check its values. +`fixtures/packages/hale2026harmonic.checks-only` is such an export of `hale2026harmonic` under the team key in `fixtures/keys/`. + +## 12.6 Assets + +Assets are named by SHA-256, so every read is rehashed and a regenerated crop is a different asset. +Bytes that live only in the asset store are listed in the manifest with `present: false`, with their size. + +## 12.7 Derived files + +`derived/` holds what a pinned tool makes from the package, such as `derived/mathml.jsonl`, whose lines are `{node, run, tool, mathml}` with `run` null for an equation node. +Nothing derived is content, and a consumer may delete and rebuild it. + +## 12.8 Media type and extension + +The proposed extension is `.sct.zip` and the media type `application/vnd.scienting.doc+zip`; both wait for a decision ([DECISIONS.md](../DECISIONS.md)) and are fixed forever once packages are shared. diff --git a/spec/13-database.md b/spec/13-database.md new file mode 100644 index 0000000..70264b4 --- /dev/null +++ b/spec/13-database.md @@ -0,0 +1,57 @@ +# 13. The database form and the bundle + +## 13.1 Portability + +[sql/doc.sql](../sql/doc.sql) defines the document tables and [sql/store.sql](../sql/store.sql) a team store's tables. +Both run unchanged on SQLite, Dolt and PostgreSQL, under these rules: + +1. No foreign keys; references are checked by validators, not by the database. +2. Enumerations are `VARCHAR` with `CHECK (… IN (…))`. +3. JSON values are canonical JSON in `TEXT` columns; booleans are `INTEGER` 0 or 1. +4. Every table has a primary key, and key columns are `VARCHAR` with a length, as MySQL-compatible engines require. +5. No table, column or index is named with a word reserved in SQLite, PostgreSQL or MySQL; so the design's `key`, `index`, `at`, `by`, `before` and `after` are `doc_key`, `idx`, `made_at`, `signer`, `before_hash` and `after_hash`. + +## 13.2 Tables + +| Table | One row per | Notes | +| --- | --- | --- | +| `works` | work | Its key and `same_as`. | +| `documents` | document | Every property of `document.json` as a column, plus `provenance`, `roster` and `package_hash`. | +| `witnesses` | witness | With `ord`, its position in `witnesses.json`. | +| `nodes` | node | With `seq`, its position in document order. | +| `pages`, `locations`, `refs` | page, location, reference | | +| `corrections` | correction | The common properties as columns; the rest in `details`. | +| `node_ids` | retired ID or alias | | +| `receipts`, `revocations` | receipt, revocation | | +| `suspects` | suspect | | +| `package_files` | asset, dataset file or derived file | Its path, SHA-256, size and whether its bytes were present. Bytes go to the asset store. | +| `citations` | cite run and reference | Derived on load. | +| `receipt_nodes` | node a receipt lists | Derived on load. | + +A 30-page paper is about 3,000 nodes, so 500 documents are about a million and a half rows, which SQLite and Dolt hold comfortably. + +## 13.3 Load and unload + +Loading a package is a pure function of the package: each record becomes a row, an optional property absent from the record is NULL, and JSON-valued properties are stored as canonical JSON. +Unloading writes each file back from its rows in the file's defined order, omitting optional properties that are NULL and optional files that have no rows, copies the other files from the asset store, and writes the manifest. +Unloading gives the package back byte for byte, and its manifest hash with it; the suite checks this for every fixture. + +## 13.4 The store tables + +`store.sql` adds what a team adds to its documents: `roster_keys`, `projects`, `members`, `project_documents`, `reading_paths`, `layers`, `annotations`, `annotation_targets` (derived, so a reader finds the annotations on a node), `datasets`, `dataset_values`, `digitizations`, `views`, `policies`, `submissions` and `grades`. +Each keeps its record whole in a `record` or `descriptor` column, with the columns a query needs beside it. + +## 13.5 The bundle + +A bundle, `scienting-bundle/1`, is one SQLite file that a reader, a server or an MCP server queries. +It holds the tables of `doc.sql` and `store.sql`, then those of [sql/bundle-sqlite.sql](../sql/bundle-sqlite.sql): + +| Table | Holds | +| --- | --- | +| `bundle_meta` | `name` and `value` pairs: at least `format` (`scienting-bundle/1`), `store`, `built_from` (the store revision) and `spec` (the version of these specifications). | +| `search` | An FTS5 index with one row per sentence, cell, display equation and figure-text item: the document, the node, the unit, the context (the kind of a sentence's container) and the normalized plain projection. Withheld text is never indexed. | +| `embeddings_meta` | Reserved for embeddings with `sqlite-vec`: the model, its dimensions, and the rights use they were made under. | + +At team scale this is all the search a team needs. +A team can download its bundle and use it offline. +Because a bundle holds text, it is served only under the rights of [14](14-rights.md), checked again whenever text is served. diff --git a/spec/14-rights.md b/spec/14-rights.md new file mode 100644 index 0000000..d616469 --- /dev/null +++ b/spec/14-rights.md @@ -0,0 +1,61 @@ +# 14. Rights + +What a team may do with a paper depends on how it holds the paper, and AI processing is now a use that licenses name. +Every witness carries a rights record, every stage declares the uses it needs, and a stage runs only when the rights allow them. +Nothing here is legal advice; the defaults are proposals for counsel to set. + +## 14.1 The rights record + +`scienting-rights/1`: + +| Property | Holds | +| --- | --- | +| `license` | The license as stated, `{spdx?, text?, url?}`, or null. | +| `basis` | How the team holds the right: `open-license`, `publisher-tdm`, `collective-license`, `subscription`, `own-work`, `permission` or `unknown`. | +| `uses` | Each of `read`, `tdm`, `redistribute`, `quote-public` and `accessible-copy` as `true`, `false` or `"unknown"`, and `ai`: a map from each pair `/` to the same values. | +| `asserted_by` | `{by, evidence}`: who or what recorded the basis, and on what: a license URL, a contract's hash, Crossref's license field, a delivery, a statement. | +| `at`, `valid_until` | When it was recorded, and when the basis ends, or null. | + +Purposes are `internal` (results stay inside the organization) and `external` (results leave it). +Processors are `local` (the team's machines), `tenancy` (the team's cloud account), `outside-no-retention` (an outside service contractually keeping nothing) and `outside` (one that may retain). +A use or pair that is absent is `"unknown"`. +A producer sets `license` and a provisional `basis` from Crossref for open-access papers, and never sets a use to `true` on its own for anything else. + +## 14.2 Effective uses + +To find a witness's uses at a time *t*: + +1. If `valid_until` is set and *t* is not before it, every use is `false`: an expired basis stops everything at once. +2. Otherwise start from the record's uses, and for each policy that applies at *t*, replace each `"unknown"` with the policy's value, where the policy has one. + A policy never overrides `true` or `false`. + +A policy, `scienting-policy/1`, is a project owner's signed decision: `applies_to` (any of `basis`, `license`, `doi_prefixes` and `witnesses`, all of which must match), the `uses` it decides, a `statement`, `by`, `at` and `valid_until`. +It applies from `at` until `valid_until`. + +A node established from several witnesses takes the most restrictive of their uses: `false` if any is false, else `"unknown"` if any is unknown, else `true`. +That combining rule is proposed for counsel to confirm. + +## 14.3 Stages + +`scienting-stages/1` maps each stage to what it needs: a list of `uses`, and optionally `ai`, with a `purpose` and the `processors` it may run on. +A stage may run on a processor when every listed use is `true`, the processor is among those allowed, if any are listed, and the pair `ai//` is `true`. +When a check fails, the refusal lists what is lacking: a use or pair that is `false` by name, one that is unknown with a trailing `?`, and a disallowed processor as `processor:`. + +[registry/stages/scienting-stages-default.json](../registry/stages/scienting-stages-default.json) holds the design's proposed defaults; a team replaces the file, not the code. +Rights are checked when a stage runs and again whenever text is served. +Every derived artifact records the rights record and use it was made under, so it can be listed and purged when a basis ends. + +## 14.4 Backends and profiles + +A backend's code and weights can be licensed differently, and the weights decide whether a paying team may use it. +`scienting-backend/1` declares a backend's `code_license`, its `weights` with their licenses, and the `conditions` they impose: + +| Condition | Met when the team profile | +| --- | --- | +| `revenue-cap` with `usd` | states revenue or funding at most `usd`. | +| `no-competition` with `vendor` | states what it competes with, and that does not include the vendor. | +| `purpose` with `allowed` | states a purpose among those allowed. | + +`scienting-profile/1` records what conditions ask: the team's `purpose` (`research`, `personal`, `education`, `startup` or `commercial`), `revenue_or_funding_usd` as `{at_most}` or null when unknown, and `competes_with`, or null when unknown. +A condition whose answer is unknown is not met, and the gate refuses a backend with any unmet condition. +`rights.jsonl` exercises stages, policies, expiry, combining and backends. diff --git a/spec/15-datasets.md b/spec/15-datasets.md new file mode 100644 index 0000000..db5fc89 --- /dev/null +++ b/spec/15-datasets.md @@ -0,0 +1,27 @@ +# 15. Datasets + +A dataset, `scienting-dataset/1`, is a Frictionless Data Package (`datapackage.json` with CSV or Parquet resources) with three additions. + +| Addition | Meaning | +| --- | --- | +| Units | Every numeric field has a `unit`, a string Pint can parse, as Lode's dimension check expects. | +| Uncertainty | A field may give `uncertainty`: `{field?, kind}`, the field that holds it and its kind, `sd`, `se`, `resolution` or `unknown`. | +| Origin | Each resource has an `origin`, or `origin_field` and `origins` when it varies by row. | + +| Origin | Holds | +| --- | --- | +| `reported` | Values anchored to the table cells or sentences that print them, in `anchors.jsonl`. | +| `digitized` | Values read off a figure: the digitization's ID, and `anchors.jsonl` naming each value's series and point. | +| `computed` | A Lode claim's implementation, by claim and pin. | +| `measured` | The team's own data, with its provenance. | + +The descriptor also carries `format` and an `id`, `ds-` and a key. +Each line of `anchors.jsonl` names a `resource`, a `row` (by primary key) and a `field`, and either an `anchor` or a `digitization`, `series` and `point`. +A value or row is addressed as `ds-…//`. + +Values keep their digits as printed: CSV cells are never reformatted, and in JSON values are strings, so `1.526` and `1.5260` stay different. +A digitized value never passes as reported, and its uncertainty is at least the resolution of its digitization. + +A dataset's content hash is SHA-256 of the canonical JSON of `{"format": "scienting-dataset/1", "files": [[path, sha256, size], …]}` over its files, sorted by path. +A dataset can be a Lode source of kind `dataset`, so a claim can rest on a value read from a figure, with that fact visible in its evidence. +`fixtures/packages/hale2026harmonic/datasets/ds-hale-bond-params` reports Table 1, and the suite checks that every value resolves to the cell that prints it. diff --git a/spec/16-digitization.md b/spec/16-digitization.md new file mode 100644 index 0000000..093b09a --- /dev/null +++ b/spec/16-digitization.md @@ -0,0 +1,18 @@ +# 16. Digitization records + +A digitization, `scienting-digitization/1`, says how numbers were read off a figure panel, completely enough to repeat. + +| Part | Holds | +| --- | --- | +| `target` | The panel's `anchor`, and the `region` read, as a box on the page given by `page_fp`, with the witness's SHA-256 as evidence; or, for a figure that exists only as an image, the image's SHA-256 with the region in its pixels. | +| `axes` | For each axis: its `scale` (`linear`, `log`, `reciprocal` or `date`), `unit`, at least two `calibration` points from page coordinates to value, an optional third `check`, and its `label` anchored to the panel's figure text. | +| `series` | For each series: its legend, its mark (color, marker, line), its kind (`points`, `line`, `bars`, `error-bars` or `region`) and its values: each a position, a value, and an uncertainty from the image's resolution, the marker's size and the calibration's residual. | +| `method` | `manual`, `traced` or `proposed` (by a model), with the tool and its version. | +| `verification` | The overlay check: the image of the values re-plotted under the calibration, by SHA-256, and the mean and largest residual. | +| `confirmation` | The receipt of the person who confirmed it after seeing the overlay, or null. | +| `dataset`, `rev` | The dataset it yields, and the revision it was made at. | + +Calibration and values are in page coordinates, not an image's pixels, so a digitization does not depend on the raster it was done on. +A digitization stays current while the document has a page with its `page_fp` and its panel anchor is not stale. +A teammate's re-download, stamped differently, has the same fingerprints, so the digitization stays current on it; a different edition or region has a different fingerprint, so a swapped image never passes. +A digitization counts only when a person confirms it: a receipt with the record `["digitization", id, hash]`, where the hash is SHA-256 of the record without `confirmation`. diff --git a/spec/17-views.md b/spec/17-views.md new file mode 100644 index 0000000..a8475d4 --- /dev/null +++ b/spec/17-views.md @@ -0,0 +1,8 @@ +# 17. Views + +A view, `scienting-view/1`, is a Vega-Lite specification whose `usermeta.scienting` pins its data: `{format, id, data, computation?}`. +Each entry of `data` names a Vega-Lite data source, the dataset it is, the dataset's content hash and a resource, and the specification refers to it as `{"data": {"name": …}}`. +A view is declarative JSON, so it is diffable, renders without studio code, and is easy for a model to write. + +A view can also hold a computation: a Lode claim's implementation, by claim and pin, run in the browser by Pyodide, with Vega-Lite parameters bound to its inputs. +That is how a reader drags a bond constant and watches the energy curve change beside the equation that defines it. diff --git a/spec/18-layers.md b/spec/18-layers.md new file mode 100644 index 0000000..e3a3667 --- /dev/null +++ b/spec/18-layers.md @@ -0,0 +1,57 @@ +# 18. Layers and annotations + +Everything people and models add to a document is an annotation, and annotations are grouped in layers. +`scienting-layer/1` is the W3C Web Annotation Data Model with the anchor as a selector, so any Web Annotation tool can read it. +The JSON-LD context is [context/scienting-1.jsonld](../context/scienting-1.jsonld), published at `https://scient.ing/ns/scienting/1.jsonld`. + +## 18.1 One rule decides what is a claim and what is a layer + +If a statement is true independently of this paper, it belongs in Lode as a claim, where it is checked and leveled. +If it is about reading this paper, it belongs in a layer, where it is attributed and signed but not checked. + +## 18.2 The layer + +A layer is a folder with `layer.json` and `annotations.jsonl`. +`layer.json` is an `AnnotationCollection` with the two contexts, `format`, an `id` of the form `urn:scienting:layer:/`, a `label`, a `purpose`, an `audience` (`novice`, `student`, `expert` or `mixed`), a `visibility` (`private`, `team` or `public`), a `license` (CC BY 4.0 by default when public), its `creator`, `created`, its `project`, the `docs` it annotates and its `total`. +A reader turns layers on and off, and the audience dial picks the level of glosses. + +## 18.3 The annotation + +Each line of `annotations.jsonl` is a W3C `Annotation`: + +| Property | Holds | +| --- | --- | +| `@context` | `["http://www.w3.org/ns/anno.jsonld", "https://scient.ing/ns/scienting/1.jsonld"]`. | +| `id` | `urn:scienting:annotation:/` ([4.6](04-identity.md#46-record-ids)). | +| `type`, `layer` | `Annotation`, and the layer's ID. | +| `motivation` | A W3C motivation: `commenting`, `describing`, `linking`, `questioning`, `assessing`, `replying` and the others. | +| `creator`, `created`, `modified` | An agent `{id, type, name}`, with `type` `Person` or `Software`, and times. | +| `body` | One body ([18.4](#184-bodies)). | +| `target` | A `SpecificResource` whose `source` is `urn:scienting:doc:/` and whose `selector` lists an `AnchorSelector` holding a `scienting-anchor/1`, optionally followed by a W3C `TextQuoteSelector` for tools that do not know ours; or, for a reply, a `SpecificResource` whose source is another annotation. | +| `status` | `proposed`, `confirmed`, `rejected` or `withdrawn`. A model's annotation is `proposed` until a person confirms it. | +| `receipt` | For a confirmed annotation, the receipt that covers it. | + +An annotation's content hash is SHA-256 of the canonical JSON of the annotation without `status`, `receipt` and `modified`. +A confirmed annotation is covered by its confirmer's receipt, which lists `["annotation", , ]`. +Replies are annotations that target annotations, so discussions are threads anchored to sentences. + +## 18.4 Bodies + +| `kind` | W3C type | Adds | Says | +| --- | --- | --- | --- | +| `gloss` | `TextualBody` | `audience` | An explanation at `novice`, `student` or `expert` level. | +| `claim-link` | `SpecificResource` | `source` (`lode:`), `pin`, `role` | That the span `states`, `uses` or `disputes` a Lode claim. | +| `symbol` | `SpecificResource` | `source`, `pin`, `symbol` | That this occurrence of a symbol is a Lode symbol claim. | +| `comment` | `TextualBody` | | A remark, opinion or interpretation. | +| `caveat` | `TextualBody` | | A warning a reader should see. | +| `question` | `TextualBody` | `for` | A question for a `reader`, a `group` or the `authors`. | +| `exercise` | `TextualBody` | `exercise` | A task with a key and a rule ([19](19-exercises.md)). | +| `citation-context` | `TextualBody` | `reference`, `verdict`, `reason` | Why a sentence cites a reference, and whether it supports it. | +| `prerequisite` | `SpecificResource` | `source` | What to read or know first. | +| `crosslink` | `SpecificResource` | `source`, `selector` | That the span corresponds to a span in another document. | +| `translation` | `TextualBody` | `language` | The span in another language. | +| `generated` | `TextualBody` | `generator` | Text a model wrote about the span; never mistaken for source. | + +A textual body has a `value`, and optionally a `format` (`text/plain` or `text/markdown`) and a `language`. +Nothing a model writes is ever stored as source text: figure descriptions and drafted alt text are `generated` annotations. +`fixtures/records/layer/` holds a layer with one annotation of each common kind and the receipt that confirms some of them. diff --git a/spec/19-exercises.md b/spec/19-exercises.md new file mode 100644 index 0000000..1bf39e0 --- /dev/null +++ b/spec/19-exercises.md @@ -0,0 +1,42 @@ +# 19. Exercises, submissions and grades + +Because every sentence and cell has a permanent address, the answer to a verification exercise is an address, and an address can be graded. + +## 19.1 Exercises + +An exercise is an annotation of kind `exercise` whose `exercise` property holds a `scienting-exercise/1`: an `exercise` kind, a `prompt`, a `key` and a `rule`. + +| Kind | The student | The key | +| --- | --- | --- | +| `anchor` | Finds the sentence or cell that supports a statement. | `elements`: each a set of acceptable anchors, with points and feedback. | +| `check` | Decides whether a cited passage supports the citing sentence, and anchors the passage. | A `verdict` with points, and `elements`. | +| `trace` | Follows a value back to its original measurement. | A `chain`: an element per link, in order. | +| `reproduce` | Digitizes a plot and recomputes a value. | A `value`, a `tolerance`, a `unit`, the confirmed `digitization` it comes from, and points. | +| `verify` | Checks a model's `summary`, written with addresses, in which errors were planted. | `errors`: each a set of anchors and the correct verdict, with points. | + +The rule's `match` is `same-node` (the student's anchor resolves to the node a key anchor resolves to), `overlap` (and, where the key has a span, the student's span covers at least `min_overlap` of it; default `0.5`), or `chain` (each link matches in order, with credit per link). +Feedback is `{hit, miss}` per element. + +## 19.2 Verdicts + +| Verdict | Means | As Lode evidence, if a person confirms it | +| --- | --- | --- | +| `supports` | The passage says what the citing sentence claims. | `supports` | +| `partly` | It says some of it, or with a qualification the citing sentence drops. | `qualifies` | +| `does-not` | It does not say it, or says the opposite. | `disputes`, or no record when merely irrelevant; the reviewer chooses. | +| `cannot-tell` | The passage, or the student's access to it, is not enough. | No record. | + +## 19.3 Submissions + +A submission, `scienting-submission/1`, holds the exercise's ID, the document and revision, a pseudonymous `student` ID, and `answers`: `anchors`, a `verdict`, a `chain` of anchor lists, a `value`, or `flags` (each an anchor and a verdict), as the kind needs. +The student's name never enters a submission; the mapping from pseudonym to student stays in the course's records. + +## 19.4 Grading + +Before grading, every anchor in the key is resolved, and if any is stale nothing is graded with it. +Each element of the key earns its points when any of the student's anchors matches any of its anchors under the rule; a `check` earns its verdict's points when the verdicts are equal; a `reproduce` earns its points when the value is within the tolerance; a `verify` earns an error's points when a flag matches it with the correct verdict. +Points are decimal strings, summed exactly. +The result is a `scienting-grade/1`: the submission, the exercise, the `score`, the `max`, and an item per element with its points, its maximum and its feedback. +`grading.jsonl` grades a hit, a miss and an overlap. + +Student submissions are educational records, so they live in the course's private store, never on a public log. diff --git a/spec/20-projects.md b/spec/20-projects.md new file mode 100644 index 0000000..7c84dd4 --- /dev/null +++ b/spec/20-projects.md @@ -0,0 +1,16 @@ +# 20. Projects + +A project, `scienting-project/1`, is the unit a team works in. + +| Part | Holds | +| --- | --- | +| `key`, `store`, `name`, `description` | Its identity. | +| `members` | People with a `role` (`owner`, `editor`, `reader` or `guest`) and the roster keys they sign with. | +| `documents` | The project's documents, each with the `reason` it is included, `tags`, and a reading `status` per member: `unread`, `reading` or `read`. | +| `paths` | Reading paths: ordered steps through documents, nodes, claims and layers, for onboarding a student or preparing a reading group. | +| `layers`, `datasets`, `views`, `drafts` | What the project holds. | +| `claims` | The Lode namespace or bundle it uses. | +| `settings` | The digit rule for targeted F3 ([8.10](08-fidelity.md#810-targeted-f3)), the drift threshold ([6.6](06-anchors.md#66-drift)), the spot-check rate and minimum ([8.8](08-fidelity.md#88-spot-checks)), what happens when a right is unknown (`refuse`, the default, or `warn`), and the stage requirements in use. | + +Projects are small on purpose: everything about them is designed for hundreds of documents, not millions. +Owners sign policies ([14.2](14-rights.md#142-effective-uses)) and may revoke receipts ([8.7](08-fidelity.md#87-revocations-and-the-roster)). diff --git a/spec/21-drafts.md b/spec/21-drafts.md new file mode 100644 index 0000000..1bc9d68 --- /dev/null +++ b/spec/21-drafts.md @@ -0,0 +1,17 @@ +# 21. Drafts + +A draft is a document of kind `draft`, established from a Typst project as a born-digital witness, so every sentence is F2 from the start. +Its sentences cite library sentences by address, in `xref` runs whose targets are addresses in other documents, and its works in `cite` runs whose references resolve to documents. + +## 21.1 The snapshot + +A snapshot, `scienting-snapshot/1`, is to a Typst draft what `lode.lock` is to a Quarto document: a pinned, verified file the compile reads, so a draft renders offline and reproducibly. +It holds the `store`, when it was made, the `quotes` the draft cites (each an address, an anchor, the text, its fidelity and how the anchor resolved), the `claims` (each a reference and pin, with whatever renderings the draft uses) and the `datasets` (each an ID and content hash). + +## 21.2 Sentence IDs in a draft + +Authors rewrite constantly, and IDs must survive without cluttering the source. +IDs live in a sidecar, `ids.jsonl` in the Typst project, `scienting-draft-ids/1`: one line per sentence with its `id`, its `text_hash`, its `section` and its `ord`, and `pinned` when the author fixed the ID to a label. +Each conversion aligns the new sentences with the previous revision, exact text first and then by edit distance within the section; an edited sentence keeps its ID and gets a new hash, so its annotations reattach or go stale as [6.5](06-anchors.md#65-resolution) says. + +Both formats are provisional until the Typst package exists. diff --git a/spec/22-conformance.md b/spec/22-conformance.md new file mode 100644 index 0000000..6b0e078 --- /dev/null +++ b/spec/22-conformance.md @@ -0,0 +1,53 @@ +# 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. | Accepts each, and recomputes every value it contains. | +| `fixtures/records/` | A valid record of every other format. | 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, required files present. +2. Every file in canonical form, and every record against its schema. +3. The tree ([3](03-nodes.md)), runs and references between nodes. +4. The policy and hashing scheme ([12.5](12-package.md#125-text-policies)). +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, 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](../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.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 Freezing 1.0 + +These specifications become 1.0 when the formats have been written by at least three producers (conversion, hand-built fixtures, and a structured witness such as JATS) and read by at least three consumers (databases, Lode and the reader), and at least one paying buyer has used a delivery built on them. diff --git a/spec/README.md b/spec/README.md new file mode 100644 index 0000000..8a0c07c --- /dev/null +++ b/spec/README.md @@ -0,0 +1,31 @@ +# The scienting specifications + +These chapters are the normative text of `spec` 0.1. +Schemas, SQL, the JSON-LD context, the registries, the vectors and the fixtures are normative too, and the chapters say which. +Where a chapter and a vector disagree, the disagreement is a bug in this repository; report it. + +| Chapter | Subject | +| --- | --- | +| [00](00-introduction.md) | Scope, conformance, versions and status | +| [01](01-conventions.md) | Canonical JSON, numbers, hashes, normalization, offsets, times, IDs, keys and files | +| [02](02-model.md) | Works, versions, witnesses and documents; `document.json` and `witnesses.json` | +| [03](03-nodes.md) | Nodes, their kinds and children, content, attributes and inline runs | +| [04](04-identity.md) | Minting IDs, permanence, retirement, aliases and record IDs | +| [05](05-hashes.md) | The five content values, the projections, alignment, suspects and keyed hashes | +| [06](06-anchors.md) | Addresses, anchors and the five resolutions, with drift | +| [07](07-geometry.md) | Page fingerprints, stamp rules, pages and locations | +| [08](08-fidelity.md) | Fidelity levels, receipts, the roster, revocations, spot-checks and error bounds | +| [09](09-figures-tables-equations.md) | Figures, panels, tables, cells and equations | +| [10](10-references.md) | References and citations | +| [11](11-corrections.md) | Corrections and the gate | +| [12](12-package.md) | The package | +| [13](13-database.md) | The database form and the bundle | +| [14](14-rights.md) | Rights records, policies, stages and backends | +| [15](15-datasets.md) | Datasets | +| [16](16-digitization.md) | Digitization records | +| [17](17-views.md) | Views | +| [18](18-layers.md) | Layers and annotations | +| [19](19-exercises.md) | Exercises, submissions and grades | +| [20](20-projects.md) | Projects | +| [21](21-drafts.md) | Drafts: snapshots and sentence-ID sidecars | +| [22](22-conformance.md) | Conformance, the suite and the rule catalog | diff --git a/sql/bundle-sqlite.sql b/sql/bundle-sqlite.sql new file mode 100644 index 0000000..a373c8a --- /dev/null +++ b/sql/bundle-sqlite.sql @@ -0,0 +1,31 @@ +-- scienting-bundle/1: the SQLite file a reader, a server or an MCP server reads. +-- Normative: spec/13-database.md. SQLite only: it uses FTS5. +-- A bundle holds sql/doc.sql and sql/store.sql, then these tables. +-- License: CC0-1.0. + +CREATE TABLE bundle_meta ( + name VARCHAR(64) NOT NULL, + value TEXT NOT NULL, + PRIMARY KEY (name) +); + +-- One row per searchable unit: a sentence, an equation outside a sentence, a cell, or a figure-text item. +-- `context` is the kind of the sentence's container: paragraph, heading, caption, footnote and so on. +-- `text` is the normalized plain projection; withheld text is never indexed. +CREATE VIRTUAL TABLE search USING fts5( + doc_key UNINDEXED, + node UNINDEXED, + unit UNINDEXED, + context UNINDEXED, + text, + tokenize = 'unicode61 remove_diacritics 2' +); + +-- Reserved for embeddings with sqlite-vec; see spec/13-database.md. +CREATE TABLE embeddings_meta ( + model VARCHAR(128) NOT NULL, + dimensions INTEGER NOT NULL, + rights_use VARCHAR(64) NOT NULL, + made_at VARCHAR(20) NOT NULL, + PRIMARY KEY (model) +); diff --git a/sql/doc.sql b/sql/doc.sql new file mode 100644 index 0000000..f9cb5ae --- /dev/null +++ b/sql/doc.sql @@ -0,0 +1,217 @@ +-- scienting-doc/1: the database form of packages. +-- Normative: spec/13-database.md. +-- Portable to SQLite 3.37+, Dolt and PostgreSQL 12+: +-- no foreign keys, enumerations as VARCHAR with CHECK, JSON as canonical JSON text, +-- booleans as INTEGER 0 or 1, and no column name reserved in any of the three. +-- License: CC0-1.0. + +CREATE TABLE works ( + work_key VARCHAR(128) NOT NULL, + same_as TEXT NOT NULL, + PRIMARY KEY (work_key) +); + +CREATE TABLE documents ( + doc_key VARCHAR(128) NOT NULL, + store VARCHAR(128), + aliases TEXT, + kind VARCHAR(32) NOT NULL CHECK (kind IN ('article', 'supplement', 'chapter', 'book', 'thesis', 'report', 'draft', 'course-material', 'other')), + work TEXT NOT NULL, + version TEXT NOT NULL, + relations TEXT NOT NULL, + meta TEXT NOT NULL, + language VARCHAR(35) NOT NULL, + license TEXT, + policy VARCHAR(16) NOT NULL CHECK (policy IN ('full', 'checks-only')), + hashing TEXT NOT NULL, + root_hash VARCHAR(64) NOT NULL, + meta_hash VARCHAR(64) NOT NULL, + rev INTEGER NOT NULL CHECK (rev >= 0), + counts TEXT NOT NULL, + fidelity TEXT NOT NULL, + provenance TEXT NOT NULL, + roster TEXT, + package_hash VARCHAR(64) NOT NULL, + PRIMARY KEY (doc_key) +); + +CREATE TABLE witnesses ( + doc_key VARCHAR(128) NOT NULL, + id VARCHAR(32) NOT NULL, + ord INTEGER NOT NULL, + sha256 VARCHAR(64) NOT NULL, + size BIGINT NOT NULL, + kind VARCHAR(16) NOT NULL CHECK (kind IN ('pdf', 'jats', 'latex', 'html', 'epub', 'typst', 'xml', 'image', 'other')), + media_type VARCHAR(128) NOT NULL, + pages INTEGER, + text_layer INTEGER CHECK (text_layer IN (0, 1)), + version_label VARCHAR(128), + origin TEXT NOT NULL, + rights TEXT NOT NULL, + PRIMARY KEY (doc_key, id) +); +CREATE INDEX witnesses_sha256 ON witnesses (sha256); + +CREATE TABLE nodes ( + doc_key VARCHAR(128) NOT NULL, + id VARCHAR(16) NOT NULL, + seq INTEGER NOT NULL, + kind VARCHAR(24) NOT NULL CHECK (kind IN ( + 'document', 'front', 'title', 'authors', 'abstract', 'keywords', 'notes', 'section', 'heading', + 'paragraph', 'sentence', 'equation', 'equation-line', 'figure', 'panel', 'caption', 'figure-note', + 'table', 'table-head', 'table-body', 'table-note', 'row', 'cell', 'list', 'item', 'quote', 'code', + 'algorithm', 'theorem', 'footnote', 'back', 'acknowledgments', 'references', 'reference', 'appendix')), + parent VARCHAR(16), + ord INTEGER NOT NULL CHECK (ord >= 0), + label VARCHAR(256), + attrs TEXT, + content TEXT, + withheld INTEGER CHECK (withheld IN (0, 1)), + fidelity VARCHAR(2) CHECK (fidelity IN ('F0', 'F1', 'F2', 'F3')), + prov TEXT, + text_hash VARCHAR(64) NOT NULL, + match_hash VARCHAR(64) NOT NULL, + align_key VARCHAR(64) NOT NULL, + own_hash VARCHAR(64) NOT NULL, + node_hash VARCHAR(64) NOT NULL, + PRIMARY KEY (doc_key, id) +); +CREATE INDEX nodes_parent ON nodes (doc_key, parent, ord); +CREATE INDEX nodes_seq ON nodes (doc_key, seq); +CREATE INDEX nodes_match_hash ON nodes (match_hash); + +CREATE TABLE pages ( + doc_key VARCHAR(128) NOT NULL, + witness VARCHAR(32) NOT NULL, + page INTEGER NOT NULL CHECK (page >= 1), + page_fp VARCHAR(64) NOT NULL, + size TEXT NOT NULL, + page_label VARCHAR(64), + text_layer INTEGER NOT NULL CHECK (text_layer IN (0, 1)), + stamps_removed TEXT, + PRIMARY KEY (doc_key, witness, page) +); +CREATE INDEX pages_page_fp ON pages (page_fp); + +CREATE TABLE locations ( + doc_key VARCHAR(128) NOT NULL, + node VARCHAR(16) NOT NULL, + page_fp VARCHAR(64) NOT NULL, + page INTEGER NOT NULL CHECK (page >= 1), + page_label VARCHAR(64), + boxes TEXT NOT NULL, + approx INTEGER CHECK (approx IN (0, 1)), + PRIMARY KEY (doc_key, node, page, page_fp) +); + +CREATE TABLE refs ( + doc_key VARCHAR(128) NOT NULL, + node VARCHAR(16) NOT NULL, + label VARCHAR(64), + csl TEXT, + resolution TEXT NOT NULL, + PRIMARY KEY (doc_key, node) +); + +-- Derived on load from cite runs; not part of the package. +CREATE TABLE citations ( + doc_key VARCHAR(128) NOT NULL, + sentence VARCHAR(16) NOT NULL, + ref_node VARCHAR(16) NOT NULL, + ord INTEGER NOT NULL, + PRIMARY KEY (doc_key, sentence, ord, ref_node) +); +CREATE INDEX citations_ref ON citations (doc_key, ref_node); + +CREATE TABLE corrections ( + doc_key VARCHAR(128) NOT NULL, + idx INTEGER NOT NULL CHECK (idx >= 1), + id VARCHAR(32) NOT NULL, + op VARCHAR(16) NOT NULL CHECK (op IN ('replace', 'insert', 'delete', 'split', 'merge', 'move', 'reclassify', 'relabel', 'set')), + target VARCHAR(16), + evidence TEXT NOT NULL, + author TEXT NOT NULL, + reason TEXT NOT NULL, + made_at VARCHAR(20) NOT NULL, + before_hash VARCHAR(64), + after_hash VARCHAR(64), + path TEXT, + touched TEXT NOT NULL, + details TEXT NOT NULL, + PRIMARY KEY (doc_key, idx) +); +CREATE INDEX corrections_target ON corrections (doc_key, target); + +CREATE TABLE node_ids ( + doc_key VARCHAR(128) NOT NULL, + id VARCHAR(128) NOT NULL, + kind VARCHAR(8) NOT NULL CHECK (kind IN ('retired', 'alias')), + successor VARCHAR(16), + node_kind VARCHAR(24), + rev INTEGER, + PRIMARY KEY (doc_key, id) +); + +CREATE TABLE receipts ( + doc_key VARCHAR(128) NOT NULL, + id VARCHAR(32) NOT NULL, + level VARCHAR(2) NOT NULL CHECK (level IN ('F1', 'F2', 'F3')), + scope VARCHAR(64) NOT NULL, + rev INTEGER NOT NULL, + root VARCHAR(64) NOT NULL, + nodes TEXT NOT NULL, + records TEXT, + evidence TEXT NOT NULL, + signer VARCHAR(128) NOT NULL, + made_at VARCHAR(20) NOT NULL, + qa TEXT, + export_of VARCHAR(32), + keyed TEXT, + signature TEXT NOT NULL, + PRIMARY KEY (id) +); +CREATE INDEX receipts_doc ON receipts (doc_key, made_at); + +-- Derived on load from receipts.nodes. +CREATE TABLE receipt_nodes ( + receipt VARCHAR(32) NOT NULL, + doc_key VARCHAR(128) NOT NULL, + node VARCHAR(16) NOT NULL, + node_hash VARCHAR(64) NOT NULL, + PRIMARY KEY (receipt, node) +); +CREATE INDEX receipt_nodes_node ON receipt_nodes (doc_key, node); + +CREATE TABLE revocations ( + doc_key VARCHAR(128) NOT NULL, + id VARCHAR(32) NOT NULL, + receipt VARCHAR(32), + revoked_signer VARCHAR(128), + period_from VARCHAR(20), + period_to VARCHAR(20), + reason TEXT NOT NULL, + signer VARCHAR(128) NOT NULL, + made_at VARCHAR(20) NOT NULL, + signature TEXT NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE suspects ( + doc_key VARCHAR(128) NOT NULL, + id VARCHAR(32) NOT NULL, + kind VARCHAR(16) NOT NULL CHECK (kind IN ('word', 'number', 'equation', 'structure', 'join', 'added', 'dropped', 'boundary', 'reading')), + node VARCHAR(16), + record TEXT NOT NULL, + PRIMARY KEY (doc_key, id) +); + +-- Files a package holds that have no table of their own: assets, datasets and derived files. +-- Their bytes live in the asset store, by SHA-256. +CREATE TABLE package_files ( + doc_key VARCHAR(128) NOT NULL, + path VARCHAR(512) NOT NULL, + sha256 VARCHAR(64) NOT NULL, + size BIGINT NOT NULL, + present INTEGER NOT NULL CHECK (present IN (0, 1)), + PRIMARY KEY (doc_key, path) +); diff --git a/sql/store.sql b/sql/store.sql new file mode 100644 index 0000000..c051870 --- /dev/null +++ b/sql/store.sql @@ -0,0 +1,153 @@ +-- The team store: everything a team adds to its documents. +-- Normative: spec/13-database.md. Load sql/doc.sql first. +-- Portable to SQLite 3.37+, Dolt and PostgreSQL 12+, under the same rules as sql/doc.sql. +-- License: CC0-1.0. + +CREATE TABLE roster_keys ( + store VARCHAR(128) NOT NULL, + id VARCHAR(128) NOT NULL, + person TEXT NOT NULL, + scheme VARCHAR(16) NOT NULL CHECK (scheme IN ('ed25519', 'ssh', 'gpg', 'sigstore')), + public_key TEXT NOT NULL, + purposes TEXT NOT NULL, + registered_at VARCHAR(20) NOT NULL, + revoked_at VARCHAR(20), + PRIMARY KEY (store, id) +); + +CREATE TABLE projects ( + project_key VARCHAR(128) NOT NULL, + store VARCHAR(128), + name TEXT NOT NULL, + description TEXT, + claims TEXT, + settings TEXT, + record TEXT NOT NULL, + PRIMARY KEY (project_key) +); + +CREATE TABLE members ( + project_key VARCHAR(128) NOT NULL, + person VARCHAR(256) NOT NULL, + role VARCHAR(8) NOT NULL CHECK (role IN ('owner', 'editor', 'reader', 'guest')), + signing_keys TEXT NOT NULL, + PRIMARY KEY (project_key, person) +); + +CREATE TABLE project_documents ( + project_key VARCHAR(128) NOT NULL, + doc_key VARCHAR(257) NOT NULL, + reason TEXT NOT NULL, + tags TEXT, + reading_status TEXT, + PRIMARY KEY (project_key, doc_key) +); + +CREATE TABLE reading_paths ( + project_key VARCHAR(128) NOT NULL, + id VARCHAR(128) NOT NULL, + title TEXT NOT NULL, + steps TEXT NOT NULL, + PRIMARY KEY (project_key, id) +); + +CREATE TABLE layers ( + id VARCHAR(256) NOT NULL, + project_key VARCHAR(128), + label TEXT NOT NULL, + purpose TEXT NOT NULL, + audience VARCHAR(8) CHECK (audience IN ('novice', 'student', 'expert', 'mixed')), + visibility VARCHAR(8) NOT NULL CHECK (visibility IN ('private', 'team', 'public')), + license TEXT NOT NULL, + record TEXT NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE annotations ( + id VARCHAR(256) NOT NULL, + layer VARCHAR(256) NOT NULL, + body_kind VARCHAR(24) NOT NULL CHECK (body_kind IN ('gloss', 'claim-link', 'symbol', 'comment', 'caveat', 'question', 'exercise', 'citation-context', 'prerequisite', 'crosslink', 'translation', 'generated')), + status VARCHAR(10) NOT NULL CHECK (status IN ('proposed', 'confirmed', 'rejected', 'withdrawn')), + receipt VARCHAR(32), + creator VARCHAR(256) NOT NULL, + created VARCHAR(20) NOT NULL, + record TEXT NOT NULL, + PRIMARY KEY (id) +); +CREATE INDEX annotations_layer ON annotations (layer); + +-- Derived from annotation targets, so a reader finds the annotations on a node. +CREATE TABLE annotation_targets ( + annotation VARCHAR(256) NOT NULL, + ord INTEGER NOT NULL, + doc_key VARCHAR(257), + node VARCHAR(128), + target_annotation VARCHAR(256), + PRIMARY KEY (annotation, ord) +); +CREATE INDEX annotation_targets_node ON annotation_targets (doc_key, node); + +CREATE TABLE datasets ( + id VARCHAR(128) NOT NULL, + doc_key VARCHAR(257), + content_hash VARCHAR(64) NOT NULL, + descriptor TEXT NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE dataset_values ( + dataset VARCHAR(128) NOT NULL, + resource VARCHAR(128) NOT NULL, + row_key VARCHAR(128) NOT NULL, + field VARCHAR(128) NOT NULL, + printed VARCHAR(64), + origin_kind VARCHAR(10) NOT NULL CHECK (origin_kind IN ('reported', 'digitized', 'computed', 'measured')), + anchor TEXT, + PRIMARY KEY (dataset, resource, row_key, field) +); + +CREATE TABLE digitizations ( + id VARCHAR(32) NOT NULL, + doc_key VARCHAR(257) NOT NULL, + panel VARCHAR(16) NOT NULL, + page_fp VARCHAR(64), + method VARCHAR(8) NOT NULL CHECK (method IN ('manual', 'traced', 'proposed')), + confirmation VARCHAR(32), + dataset VARCHAR(128), + record TEXT NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE views ( + id VARCHAR(128) NOT NULL, + project_key VARCHAR(128), + spec TEXT NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE policies ( + id VARCHAR(32) NOT NULL, + project_key VARCHAR(128), + signer VARCHAR(128) NOT NULL, + made_at VARCHAR(20) NOT NULL, + valid_until VARCHAR(20), + record TEXT NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE submissions ( + id VARCHAR(32) NOT NULL, + exercise VARCHAR(256) NOT NULL, + student VARCHAR(64) NOT NULL, + submitted_at VARCHAR(20) NOT NULL, + record TEXT NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE grades ( + submission VARCHAR(32) NOT NULL, + score VARCHAR(32) NOT NULL, + max_score VARCHAR(32) NOT NULL, + record TEXT NOT NULL, + PRIMARY KEY (submission) +); diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 0000000..159f029 --- /dev/null +++ b/tools/README.md @@ -0,0 +1,11 @@ +# Tools + +Non-normative, standard library only, licensed Apache-2.0. + +| Tool | Does | +| --- | --- | +| `oracle/` | A compact implementation of every rule, used to compute and check the vectors and fixtures. It is not a library; implementations conform to the chapters, and `scienting-core` is the reference implementation. | +| `build.py` | Builds `fixtures/` (except `src/`) and `vectors/` from `fixtures/src/` and the cases it defines. Deterministic; `--out DIR` builds elsewhere. | +| `check.py` | Checks the whole repository; `--quick` skips the determinism rebuild. Uses `jsonschema` as a second validator when installed. | + +The oracle's JSON Schema validator supports exactly the keyword subset of [spec/22-conformance.md](../spec/22-conformance.md#223-schemas) and refuses schemas that use anything else. diff --git a/tools/__init__.py b/tools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tools/build.py b/tools/build.py new file mode 100644 index 0000000..4734002 --- /dev/null +++ b/tools/build.py @@ -0,0 +1,1546 @@ +#!/usr/bin/env python3 +"""Build every fixture and test vector from fixtures/src and the cases below. + +Non-normative tooling. +The build is deterministic: run it twice and the output is byte-identical; `tools/check.py` verifies that. +Usage: python3 tools/build.py [--out DIR] (default: the repository itself) +""" + +import base64 +import copy +import hashlib +import json +import os +import shutil +import struct +import sys +import zlib +from fractions import Fraction + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, ROOT) + +from tools.oracle import align as AL # noqa: E402 +from tools.oracle import anchors as AN # noqa: E402 +from tools.oracle import corrections as CO # noqa: E402 +from tools.oracle import crypto, fingerprint as FP, grade as GR, hashing, jcs, receipts as RC, rights as RI # noqa: E402 +from tools.oracle.model import LEAVES, MATH_KINDS, RUN_KINDS, VERBATIM_KINDS, Doc # noqa: E402 +from tools.oracle.notation import fold_math # noqa: E402 +from tools.oracle.package import jsonl, line, witness_id, write # noqa: E402 +from tools.oracle.text import letter_first, mint_node_id, norm, record_id, sha256_hex # noqa: E402 +from tools.oracle.tree import Refusal, _flatten, mint_ids, validate_structure # noqa: E402 + +VERSION = "0.1.0" +STORE = "smithlab" + + +def H(s): + return sha256_hex(s) + + +def secret(name): + return hashlib.sha256(("varve-spec fixture key: " + name).encode()).digest() + + +KEYS = { + "ana": {"name": "Ana Example", "purposes": ["sign"]}, + "ben": {"name": "Ben Example", "purposes": ["sign"]}, + "ben-spot": {"name": "Ben Example", "purposes": ["spot-check"]}, + "cara": {"name": "Cara Example", "purposes": ["sign"]}, +} +TEAM_SECRET = hashlib.sha256(b"varve-spec fixture team secret: smithlab").digest() + + +def roster(): + keys = [] + for kid, k in KEYS.items(): + keys.append({"id": kid, "person": {"name": k["name"]}, "scheme": "ed25519", + "public": base64.b64encode(crypto.ed25519_public(secret(kid))).decode(), + "purposes": k["purposes"], "registered_at": "2026-09-01T00:00:00Z", "revoked_at": None}) + return {"format": "scienting-roster/1", "store": STORE, "keys": keys} + + +ROSTER = roster() +ROSTER_BY_ID = {k["id"]: k for k in ROSTER["keys"]} + + +def png(w, h, rgb): + """A tiny valid PNG, so a fixture can carry a real image asset.""" + raw = b"".join(b"\x00" + bytes(rgb) * w for _ in range(h)) + + def chunk(t, d): + return struct.pack(">I", len(d)) + t + d + struct.pack(">I", zlib.crc32(t + d) & 0xFFFFFFFF) + + return (b"\x89PNG\r\n\x1a\n" + chunk(b"IHDR", struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0)) + + chunk(b"IDAT", zlib.compress(raw, 9)) + chunk(b"IEND", b"")) + + +# --- the shorthand of fixtures/src ------------------------------------------------ + + +def runs_of(parts, kids): + out = [] + for p in parts: + if isinstance(p, str): + out.append({"kind": "text", "text": p}) + elif "sup" in p or "sub" in p or "em" in p: + st = next(k for k in ("sup", "sub", "em") if k in p) + out.append({"kind": "text", "text": p[st], "style": [st]}) + elif "m" in p: + out.append({"kind": "math", "notation": "tex", "source": p["m"]}) + elif "t" in p: + out.append({"kind": "math", "notation": "typst", "source": p["t"]}) + elif "cite" in p: + out.append({"kind": "cite", "refs": p["cite"], "text": p["text"]}) + elif "xref" in p: + out.append({"kind": "xref", "target": p["xref"], "text": p["text"]}) + elif "fn" in p: + out.append({"kind": "fnmark", "footnote": p["fn"], "text": p["text"]}) + elif "link" in p: + out.append({"kind": "link", "url": p["link"], "text": p["text"]}) + elif "eq" in p: + e = p["eq"] + kids.append(_math_node("equation", e)) + out.append({"kind": "equation", "child": len(kids) - 1}) + else: + raise ValueError(p) + return out + + +def _math_node(kind, e): + n = {"kind": kind, "content": {"notation": "typst" if "typst" in e else "tex", "source": e.get("tex", e.get("typst"))}} + if "label" in e: + n["label"] = e["label"] + for k in ("name", "fidelity"): + if k in e: + n["_" + k if k == "name" else k] = e[k] + return n + + +def expand(s, page=None): + page = s.get("page", page) + if isinstance(s, str): + s = {"s": [s]} + if "s" in s: + kids = [] + n = {"kind": "sentence", "content": runs_of(s["s"], kids), "children": kids} + elif "p" in s: + n = {"kind": "paragraph", "children": [expand(x, page) for x in s["p"]]} + elif "row" in s: + n = {"kind": "row", "children": [expand(x, page) for x in s["row"]]} + if "header_path" in s: + n["attrs"] = {"header_path": s["header_path"]} + elif "c" in s: + n = {"kind": "cell", "content": runs_of(s["c"], []), + "attrs": {"column": s["col"], "rowspan": s.get("rowspan", 1), "colspan": s.get("colspan", 1), + "role": s.get("role", "data")}} + n["fidelity"] = s.get("fidelity", "F1") + else: + n = {"kind": s["kind"]} + if "label" in s: + n["label"] = s["label"] + kids = [] + if s["kind"] == "section": + n["attrs"] = {"level": s["level"]} + if "title" in s: + kids.append({"kind": "heading", "children": [expand({"s": [s["title"]], "fidelity": "F2"}, page)]}) + if s["kind"] == "table": + n["attrs"] = {"columns": [{"id": c["name"], "header_path": c["header_path"]} for c in s["columns"]]} + if s["kind"] == "panel": + n["attrs"] = {} + if "figure_text" in s: + n["attrs"]["figure_text"] = [dict(t) for t in s["figure_text"]] + if s["kind"] in ("reference", "authors", "keywords"): + n["content"] = runs_of(s["runs"], []) + if s["kind"] in MATH_KINDS: + n = _math_node(s["kind"], s) + for k in ("csl", "resolution"): + if k in s: + n["_" + k] = s[k] + kids += [expand(x, page) for x in s.get("children", [])] + n["children"] = kids + if "name" in s: + n["_name"] = s["name"] + if "fidelity" in s and n["kind"] in LEAVES: + n["fidelity"] = s["fidelity"] + n["_page"] = page + for c in n.get("children", []): + if c.get("_page") is None: + c["_page"] = page + return n + + +class Names: + """Local names (`@x`) and the IDs minted for them, per document.""" + + registry = {} + + def __init__(self, key): + self.key = key + self.ids = {} + Names.registry[key] = self + + def resolve(self, v): + if isinstance(v, str) and v.startswith("ext:"): + _, doc, name = v.split(":", 2) + return doc + "#" + Names.registry[doc].ids[name] + if isinstance(v, str) and v.startswith("@"): + return self.ids[v] + if isinstance(v, list): + return [self.resolve(x) for x in v] + return v + + +def resolve_refs(nodes, names): + for n in nodes: + if n["kind"] in RUN_KINDS: + out = [] + for r in n["content"]: + r = dict(r) + if r["kind"] == "cite": + r["refs"] = names.resolve(r["refs"]) + elif r["kind"] == "xref": + r["target"] = names.resolve(r["target"]) + elif r["kind"] == "fnmark": + r["footnote"] = names.resolve(r["footnote"]) + out.append(r) + n["content"] = out + a = n.get("attrs") + if a: + if "header_path" in a: + a["header_path"] = names.resolve(a["header_path"]) + if "column" in a: + a["column"] = names.resolve(a["column"]) + if "columns" in a: + a["columns"] = [{"id": names.resolve(c["id"]), "header_path": names.resolve(c["header_path"])} + for c in a["columns"]] + + +def mint_extras(key, nodes, names, used): + """Columns and figure-text items get IDs from the same minting rule, kinds `column` and `figure-text`.""" + doc = Doc(key, nodes) + seen = {} + + def mint(kind, th): + occ = seen.get((kind, th), 0) + seen[(kind, th)] = occ + 1 + nid = mint_node_id(key, kind, th, occ) + while nid in used: + occ += 1 + nid = mint_node_id(key, kind, th, occ) + used.add(nid) + return nid + + for n in nodes: + a = n.get("attrs", {}) + for c in a.get("columns", []): + if c["id"].startswith("@"): + th = H(norm(" ".join(hashing.plain(doc, names.ids[h]) for h in c["header_path"]))) + names.ids[c["id"]] = mint("column", th) + for t in a.get("figure_text", []): + t["id"] = mint("figure-text", H(norm(t["text"]))) + if "name" in t: + names.ids[t.pop("name")] = t["id"] + + +def flatten_spec(spec): + flat = [] + _flatten(copy.deepcopy(spec), None, 0, flat) + return flat + + +def establish(key, spec, names, used): + flat = flatten_spec(spec) + nodes = mint_ids(key, flat, used) + side = {} + for f, n in zip(flat, nodes): + if "_name" in f: + names.ids[f["_name"]] = n["id"] + side[n["id"]] = {k: v for k, v in f.items() if k.startswith("_")} + mint_extras(key, nodes, names, used) + resolve_refs(nodes, names) + return nodes, side + + +# --- geometry ----------------------------------------------------------------- + + +def page_layout(doc, side, src, wit_id, fps_override=None): + """Synthetic but consistent geometry: lines per page, fingerprints and boxes.""" + P = src["pages"] + size = P["size"] + npages = len(P["labels"]) + stamps = json.load(open(os.path.join(ROOT, "registry", "stamps", "scienting-stamps-1.json")))["rules"] + lines = {p: [] for p in range(1, npages + 1)} + boxes = {} + y = {p: 72.0 for p in lines} + for p, rh in P.get("running_head", {}).items(): + lines[int(p)].append({"text": rh, "box": [72.0, 40.0, 400.0, 50.0]}) + for nid in doc.preorder(): + n = doc.nodes[nid] + pg = side.get(nid, {}).get("_page") or 1 + if n["kind"] in ("sentence", "cell", "reference", "authors", "keywords") or ( + n["kind"] == "equation" and doc.nodes[n["parent"]]["kind"] != "sentence"): + text = norm(hashing.plain(doc, nid)) + lines[pg].append({"text": text}) + bx = [] + rest = len(text) + while True: + w = min(rest, 80) + bx.append([72.0, y[pg], round(72.0 + 5.85 * w, 2), round(y[pg] + 11.8, 2)]) + y[pg] = round(y[pg] + 13.95, 2) + rest -= 80 + if rest <= 0: + break + boxes[nid] = (pg, bx) + elif n["kind"] == "panel": + boxes[nid] = (pg, [[72.0, y[pg], 300.0, round(y[pg] + 150.0, 2)]]) + y[pg] = round(y[pg] + 160.0, 2) + pages = [] + images = {} + for nid, s in side.items(): + if "_image" in s: + images.setdefault(boxes[nid][0], []).append(s["_image"]) + for p in range(1, npages + 1): + ls = list(lines[p]) + if "stamp" in P: + ls.append({"text": P["stamp"], "box": [8.0, 200.0, 20.0, 600.0]}) + ls.append({"text": P["stamp2"], "box": [580.0, 200.0, 592.0, 600.0]}) + page_in = {"size": size, "lines": ls, "images": images.get(p, [])} + fp, removed = FP.fingerprint(page_in, stamps) + rec = {"witness": wit_id, "page": p, "page_fp": fp, "size": size, "page_label": P["labels"][p - 1], + "text_layer": True} + if removed: + rec["stamps_removed"] = removed + pages.append((rec, page_in)) + return pages, boxes + + +# --- packages ------------------------------------------------------------------- + + +def rights_record(kind): + base = {"format": "scienting-rights/1", "at": "2026-09-15T12:00:00Z"} + if kind == "open": + base.update({"license": {"spdx": "CC-BY-4.0", "url": "https://creativecommons.org/licenses/by/4.0/"}, + "basis": "open-license", + "uses": {"read": True, "tdm": True, "redistribute": True, "quote-public": True, + "accessible-copy": True, "ai": {p: True for p in RI.AI_PAIRS}}, + "asserted_by": {"by": "crossref", "evidence": [ + {"kind": "crossref-license", "doi": "10.5555/example.okafor.2025", + "url": "https://creativecommons.org/licenses/by/4.0/"}]}, + "valid_until": None}) + elif kind == "own": + base.update({"license": {"spdx": "CC-BY-4.0"}, "basis": "own-work", + "uses": {"read": True, "tdm": True, "redistribute": True, "quote-public": True, + "accessible-copy": True, "ai": {p: True for p in RI.AI_PAIRS}}, + "asserted_by": {"by": "ana", "evidence": [{"kind": "statement", "note": "The team's own draft."}]}, + "valid_until": None}) + else: + base.update({"license": {"text": "Publisher's subscription terms (fictional)."}, "basis": "subscription", + "uses": {"read": True, "tdm": True, "redistribute": False, "quote-public": False, + "accessible-copy": "unknown", + "ai": {"internal/local": True, "internal/tenancy": "unknown", + "internal/outside-no-retention": "unknown", "internal/outside": False, + "external/local": False, "external/tenancy": False, + "external/outside-no-retention": False, "external/outside": False}}, + "asserted_by": {"by": "ana", "evidence": [ + {"kind": "statement", "note": "The library's subscription terms, as the team read them (fictional)."}]}, + "valid_until": "2027-08-31T23:59:59Z"}) + return base + + +def crop_sha(name): + return H("crop of " + name + " at 300 dpi (synthetic)") + + +def node_record(n, values): + rec = {k: n[k] for k in ("id", "kind", "parent", "ord")} + for k in ("label", "attrs", "content", "withheld", "fidelity", "prov"): + if k in n and n[k] not in (None, {}, []): + rec[k] = n[k] + rec.update(values[n["id"]]) + return rec + + +def seal_receipts(spec, names, state_by_rev, final_state, key, wit_sha): + """Build and sign the receipts and revocations a source lists.""" + out = [] + by_name = {} + final_doc = final_state.doc() + final_vals = hashing.compute(final_doc) + for r in spec: + if "revoke" in r: + rec = {"format": "scienting-revocation/1", "receipt": by_name[r["revoke"]]["id"], "reason": r["reason"], + "by": r["by"], "at": r["at"]} + rec = RC.seal(rec, secret(r["by"]), r["by"]) + elif "qa_of" in r: + orig = by_name[r["qa_of"]] + seed = RC.make_seed(orig, secret(r["key"])) + sample = RC.sample(orig, seed) + hashes = dict((nid, h) for nid, h in orig["nodes"]) + errs = [{"node": names.ids[e["node"]], **{k: v for k, v in e.items() if k != "node"}} for e in r["errors"]] + rec = {"format": "scienting-receipt/1", "doc": key, "rev": orig["rev"], "level": orig["level"], + "scope": "qa:" + orig["id"], "nodes": [[nid, hashes[nid]] for nid in sample], + "evidence": [{"kind": "crop", "node": nid, "sha256": crop_sha(nid)} for nid in sample], + "by": r["by"], "at": r["at"], + "qa": {"of": orig["id"], "key": r["key"], "seed": base64.b64encode(seed).decode(), "rate": "0.05", + "minimum": 10, "sample": sample, "errors": errs}} + rec = RC.seal(rec, secret(r["by"]), r["by"]) + else: + rev = r.get("rev", final_state.rev) + st = state_by_rev[rev] + vals = hashing.compute(st.doc()) if rev != final_state.rev else final_vals + ids = sorted(names.ids[x] for x in r["nodes"]) + scope = r["scope"] + if scope.startswith("section:@"): + scope = "section:" + names.ids[scope[8:]] + rec = {"format": "scienting-receipt/1", "doc": key, "rev": rev, "level": r["level"], "scope": scope, + "nodes": [[i, vals[i]["node_hash"]] for i in ids], + "evidence": [{"kind": "crop", "node": i, "sha256": crop_sha(i)} for i in ids] + + [{"kind": "witness", "sha256": wit_sha}], + "by": r["by"], "at": r["at"]} + rec = RC.seal(rec, secret(r["by"]), r["by"]) + by_name[r["name"]] = rec + out.append(rec) + out.sort(key=lambda x: (x["at"], x["id"])) + return out, by_name + + +def build_document(src, used=None, extra_files=None): + key = src["document"]["key"] + names = Names(key) + used = used if used is not None else set() + spec = expand(src["tree"]) + nodes, side = establish(key, spec, names, used) + aliases = [{"id": a, "kind": "alias", "successor": names.ids[t]} + for a, t in sorted(src.get("legacy_aliases", {}).items())] + state = CO.State(key, nodes, aliases) + states = {0: state} + records = [] + for c in src.get("corrections", []): + c = copy.deepcopy(c) + crop = c.pop("crop", None) + new_name = c.pop("new_name", None) + before = c.pop("before", None) + c["evidence"] = [{"kind": "crop", "sha256": crop_sha(names.ids.get(crop, crop))}] if crop else [ + {"kind": "person", "by": "ana", "note": "Read against the page."}] + c["author"] = {"key": "ana"} + for k in ("target", "parent", "place_after", "with"): + if k in c: + c[k] = names.resolve(c[k]) + if "node" in c: + nspec = expand(c["node"]) + flat = flatten_spec(nspec) + pre = mint_ids(key, flat, state.used_ids()) + for f, n in zip(flat, pre): + if "_name" in f: + names.ids[f["_name"]] = n["id"] + c["node"] = _strip_private(nspec, names) + if before is not None: + d = state.doc() + c["offset"] = hashing.plain(d, c["target"]).index(before) + state, rec = CO.apply(state, c) + if new_name: + names.ids[new_name] = rec["created"][0] + records.append(rec) + states[state.rev] = state + # A corrected leaf was checked against the page image: it is F1 at most until corroborated again. + final = state + touched = set() + for rec in records: + if any(e["kind"] == "crop" for e in rec["evidence"]): + touched |= set(rec["touched"]) | set(rec.get("created", [])) + for n in final.nodes: + if n["id"] in touched and n["kind"] in LEAVES: + n["fidelity"] = "F1" + for n in final.nodes: + if n["kind"] in LEAVES and "fidelity" not in n: + n["fidelity"] = "F1" + return key, names, side, final, states, records + + +def _strip_private(spec, names): + out = {k: v for k, v in spec.items() if not k.startswith("_") and k != "children"} + if out["kind"] == "row" and "attrs" in out: + out["attrs"] = {"header_path": names.resolve(out["attrs"]["header_path"])} + if out["kind"] == "cell": + out["attrs"] = dict(out["attrs"], column=names.resolve(out["attrs"]["column"])) + if spec.get("children"): + out["children"] = [_strip_private(c, names) for c in spec["children"]] + return out + + +def package_files(src, key, names, side, final, records, receipts=None, roster_rec=None, witnesses=None, + pages=None, boxes=None, extra=None, absent=()): + doc = final.doc() + vals = hashing.compute(doc) + nodes = [node_record(doc.nodes[nid], vals) for nid in doc.preorder()] + files = {} + files["nodes.jsonl"] = jsonl(nodes) + if pages: + files["pages.jsonl"] = jsonl([p for p, _ in sorted(pages, key=lambda x: (x[0]["witness"], x[0]["page"]))]) + locs = [] + fps = {p["page"]: p for p, _ in pages} + pos = {nid: i for i, nid in enumerate(doc.preorder())} + for nid, (pg, bx) in boxes.items(): + if nid in doc.nodes: + locs.append({"node": nid, "page_fp": fps[pg]["page_fp"], "page": pg, + "page_label": fps[pg]["page_label"], "boxes": bx}) + locs.sort(key=lambda l: (pos[l["node"]], l["page"], l["page_fp"])) + if locs: + files["locations.jsonl"] = jsonl(locs) + refs = [] + for nid in doc.preorder(): + s = side.get(nid, {}) + if doc.nodes[nid]["kind"] == "reference": + r = {"node": nid, "label": doc.nodes[nid].get("label")} + if "_csl" in s: + r["csl"] = s["_csl"] + res = s.get("_resolution", {"type": "none"}) + r["resolution"] = res + refs.append({k: v for k, v in r.items() if v is not None}) + if refs: + files["references.jsonl"] = jsonl(refs) + if records: + files["corrections.jsonl"] = jsonl(records) + ids = sorted(final.ids, key=lambda e: (0 if e["kind"] == "alias" else 1, e.get("rev", 0), e["id"])) + if ids: + files["ids.jsonl"] = jsonl(ids) + if receipts: + files["receipts.jsonl"] = jsonl(receipts) + if roster_rec: + files["roster.json"] = (jcs.dumps(roster_rec) + "\n").encode() + files["witnesses.json"] = (jcs.dumps({"witnesses": witnesses}) + "\n").encode() + files["provenance.json"] = (jcs.dumps({ + "tools": [{"name": "varve-spec tools/build.py", "version": VERSION}], + "stages": [{"stage": "hand", "processor": "local", "tool": "varve-spec tools/build.py"}], + "note": "Built by hand for the conformance suite; every reading is synthetic."}) + "\n").encode() + levels = RC.effective_levels(nodes, vals, receipts or [], ROSTER_BY_ID if roster_rec else {}) + d = dict(src["document"]) + d = {"format": "scienting-doc/1", **d} + d.update({"hashing": {"scheme": "plain"}, "root": vals[doc.root]["node_hash"], "rev": final.rev, + "counts": {"nodes": len(nodes), "leaves": sum(1 for n in nodes if n["kind"] in LEAVES)}, + "fidelity": RC.distribution(levels)}) + d["meta_hash"] = hashing.meta_hash(d) + files["document.json"] = (jcs.dumps(d) + "\n").encode() + if extra: + files.update(extra) + return files, nodes, vals, d + + +def build_hale(out): + src = json.load(open(os.path.join(ROOT, "fixtures", "src", "hale2026harmonic.json"))) + image = png(4, 3, (40, 90, 160)) + image_sha = sha256_hex(image) + key, names, side, final, states, records = build_document(src) + side[names.ids["@pa"]]["_image"] = image_sha + doc = final.doc() + pa = doc.nodes[names.ids["@pa"]] + pa["attrs"]["image"] = {"sha256": image_sha, "media_type": "image/png", "native": True} + pa["attrs"]["crop"] = {"sha256": crop_sha("panel a"), "media_type": "image/png", "dpi": 300} + P = src["pages"] + wsha = H(P["witness"]["sha_seed"]) + wid = witness_id(wsha) + for n in final.nodes: + if n["kind"] in LEAVES: + n["prov"] = {"witnesses": [wid], "backend": "docling (illustrative)"} + if n.get("fidelity") == "F2": + n["prov"]["corroborated_by"] = [wid] + pages, boxes = page_layout(final.doc(), side, src, wid) + p2 = [p for p, _ in pages if p["page"] == 2][0] + for t in pa["attrs"]["figure_text"]: + t["page_fp"] = p2["page_fp"] + t["boxes"] = [[90.0, 300.0, 140.0, 310.0]] + witnesses = [{"id": wid, "sha256": wsha, "size": P["witness"]["size"], "kind": "pdf", "media_type": "application/pdf", + "pages": len(P["labels"]), "text_layer": True, "version_label": "version of record", + "origin": {"source": "publisher", "doi": "10.5555/example.hale.2026", "retrieved_at": "2026-10-01T08:00:00Z"}, + "rights": rights_record("subscription")}] + receipts, by_name = seal_receipts(src["receipts"], names, states, final, key, wsha) + # The dataset reported from Table 1. + final_doc = final.doc() + vals = hashing.compute(final_doc) + rows = [("ct-ct", "CT–CT", "@cc"), ("ct-hc", "CT–HC", "@ch2"), ("ow-hw", "OW–HW", "@ow")] + csv = ["key,bond,set,k_r,r_eq"] + anchors = [] + for rk, bond, pre in rows: + for st, (kc, rc) in (("A", ("_ak", "_ar")), ("B", ("_bk", "_br"))): + kname = pre + kc.replace("_a", "_a").replace("_b", "_b") + kid, rid = names.ids[pre + kc], names.ids[pre + rc] + kv, rv = norm(hashing.plain(final_doc, kid)), norm(hashing.plain(final_doc, rid)) + row_key = rk + "-" + st.lower() + csv.append("%s,%s,%s,%s,%s" % (row_key, bond, st, kv, rv)) + for field, nid in (("k_r", kid), ("r_eq", rid)): + anchors.append({"resource": "bond-parameters", "row": row_key, "field": field, + "anchor": AN.make_anchor(final_doc, vals, nid, final.rev, store=STORE)}) + ds_id = "ds-hale-bond-params" + datapackage = {"format": "scienting-dataset/1", "id": ds_id, "name": "hale-bond-params", + "title": "Harmonic bond parameters reported in Table 1", + "resources": [{"name": "bond-parameters", "path": "data.csv", "format": "csv", "encoding": "utf-8", + "schema": {"fields": [ + {"name": "key", "type": "string"}, {"name": "bond", "type": "string"}, + {"name": "set", "type": "string"}, + {"name": "k_r", "type": "number", "unit": "kcal / mol / angstrom ** 2"}, + {"name": "r_eq", "type": "number", "unit": "angstrom", + "uncertainty": {"kind": "unknown"}}], + "primaryKey": "key"}, + "origin": {"kind": "reported", "anchors": "anchors.jsonl"}}]} + eq = names.ids["@eq1"] + mathml = ('Ebond=12' + 'Kr(r−r' + 'eq)2') + extra = { + "assets/%s.png" % image_sha: image, + "datasets/%s/datapackage.json" % ds_id: (jcs.dumps(datapackage) + "\n").encode(), + "datasets/%s/data.csv" % ds_id: ("\n".join(csv) + "\n").encode(), + "datasets/%s/anchors.jsonl" % ds_id: jsonl(anchors), + "derived/mathml.jsonl": jsonl([{"node": eq, "run": None, "tool": {"name": "hand", "version": "0"}, + "mathml": mathml}]), + } + absent = [{"path": "assets/%s.png" % crop_sha("panel a"), "sha256": crop_sha("panel a"), "size": 18213, + "present": False}] + files, nodes, vals, d = package_files(src, key, names, side, final, records, receipts, ROSTER, witnesses, pages, + boxes, extra, absent) + write(os.path.join(out, "fixtures", "packages", key), files, absent) + return {"src": src, "key": key, "names": names, "states": states, "final": final, "records": records, + "receipts": receipts, "by_name": by_name, "pages": pages, "files": files, "nodes": nodes, "values": vals, + "document": d, "witness": witnesses[0], "absent": absent} + + +def build_checks_only(out, hale): + """The same document exported to another machine of the team: text withheld, hashes keyed.""" + final = hale["final"] + doc = final.doc() + k = crypto.team_key(TEAM_SECRET) + keyed = hashing.compute(doc, hashing.Hasher(k)) + nodes = [] + for nid in doc.preorder(): + n = copy.deepcopy(doc.nodes[nid]) + if n["kind"] in LEAVES: + n.pop("content", None) + n["withheld"] = True + if n["kind"] == "panel": + n["attrs"].pop("figure_text", None) + nodes.append(node_record(n, keyed)) + f = dict(hale["files"]) + for p in ("corrections.jsonl", "receipts.jsonl", "roster.json", "derived/mathml.jsonl"): + f.pop(p, None) + for p in [p for p in f if p.startswith("datasets/")]: + f.pop(p) + f["nodes.jsonl"] = jsonl(nodes) + refs = [{"node": r["node"], "label": r["label"], "resolution": r["resolution"]} + for r in map(json.loads, f["references.jsonl"].decode().splitlines())] + f["references.jsonl"] = jsonl(refs) + d = dict(hale["document"]) + d.update({"policy": "checks-only", "hashing": {"scheme": "hmac-team", "key_id": crypto.key_id(k)}, + "root": keyed[doc.root]["node_hash"]}) + d["meta_hash"] = hashing.meta_hash(d, hashing.Hasher(k)) + f["document.json"] = (jcs.dumps(d) + "\n").encode() + write(os.path.join(out, "fixtures", "packages", "hale2026harmonic.checks-only"), f, hale["absent"]) + + +def build_simple(out, name, used=None): + src = json.load(open(os.path.join(ROOT, "fixtures", "src", name + ".json"))) + key, names, side, final, states, records = build_document(src) + witnesses = [] + pages = boxes = None + if "pages" in src: + P = src["pages"] + wsha = H(P["witness"]["sha_seed"]) + wid = witness_id(wsha) + jsha = H(P["jats"]["sha_seed"]) + jid = witness_id(jsha) + for n in final.nodes: + if n["kind"] in LEAVES: + n["prov"] = {"witnesses": [jid, wid], "backend": "jats reader (illustrative)", "corroborated_by": [wid]} + pages, boxes = page_layout(final.doc(), side, src, wid) + witnesses = [ + {"id": jid, "sha256": jsha, "size": P["jats"]["size"], "kind": "jats", "media_type": "application/xml", + "version_label": "version of record", + "origin": {"source": "repository", "doi": "10.5555/example.okafor.2025"}, "rights": rights_record("open")}, + {"id": wid, "sha256": wsha, "size": P["witness"]["size"], "kind": "pdf", "media_type": "application/pdf", + "pages": len(P["labels"]), "text_layer": True, "version_label": "version of record", + "origin": {"source": "publisher", "doi": "10.5555/example.okafor.2025"}, "rights": rights_record("open")}] + else: + T = src["typst"] + tsha = H(T["sha_seed"]) + tid = witness_id(tsha) + for n in final.nodes: + if n["kind"] in LEAVES: + n["prov"] = {"witnesses": [tid], "backend": "typst reader (illustrative)"} + witnesses = [{"id": tid, "sha256": tsha, "size": T["size"], "kind": "typst", "media_type": "application/zip", + "version_label": "draft 3", "origin": {"source": "team"}, "rights": rights_record("own")}] + files, nodes, vals, d = package_files(src, key, names, side, final, records, None, None, witnesses, pages, boxes) + write(os.path.join(out, "fixtures", "packages", key), files) + return {"key": key, "names": names, "final": final, "files": files, "values": vals, "src": src} + + +# --- the tiny document used for corrections vectors and invalid packages ----------------- + +TINY = {"document": {"key": "tiny2026example", "kind": "article", "work": {"key": "tiny2026example", "same_as": []}, + "version": {"type": "version-of-record"}, "relations": [], "meta": {"title": "A tiny example"}, + "language": "en", "license": {"spdx": "CC0-1.0"}, "policy": "full"}, + "tree": {"kind": "document", "children": [ + {"kind": "section", "name": "@sec", "label": "1", "level": 1, "title": "Results", "children": [ + {"name": "@p1", "p": [ + {"name": "@a", "s": ["The value is 42.0 at 300 K."], "fidelity": "F2"}, + {"name": "@b", "s": ["See ", {"xref": "@t", "text": "Table 1"}, " and the note.", {"cite": ["@r"], "text": "1"}], + "fidelity": "F2"}]}, + {"name": "@p2", "p": [{"name": "@c", "s": ["A second paragraph."], "fidelity": "F2"}, + {"name": "@d", "s": ["It ends here."], "fidelity": "F2"}]}, + {"kind": "table", "name": "@t", "label": "Table 1", + "columns": [{"name": "@cx", "header_path": ["@hx"]}, {"name": "@cy", "header_path": ["@hy"]}], + "children": [ + {"kind": "table-head", "children": [{"row": [ + {"name": "@hx", "c": ["x"], "role": "column-header", "col": "@cx"}, + {"name": "@hy", "c": ["y"], "role": "column-header", "col": "@cy"}]}]}, + {"kind": "table-body", "name": "@tb", "children": [ + {"name": "@row1", "header_path": ["@x1"], "row": [ + {"name": "@x1", "c": ["1"], "role": "row-header", "col": "@cx"}, + {"name": "@y1", "c": ["2.5"], "col": "@cy"}]}]}]}]}, + {"kind": "back", "children": [{"kind": "references", "children": [ + {"kind": "reference", "name": "@r", "label": "1", "runs": ["1. An Example, 2020."], + "resolution": {"type": "none"}, "fidelity": "F2"}]}]}]}} + + +def tiny_package(out_dir, receipts=True): + key, names, side, final, states, records = build_document(copy.deepcopy(TINY)) + wsha = H("tiny2026example: a file (synthetic)") + wit = [{"id": witness_id(wsha), "sha256": wsha, "size": 1000, "kind": "pdf", "media_type": "application/pdf", + "pages": 1, "origin": {"source": "author"}, "rights": rights_record("own")}] + recs = None + if receipts: + recs, _ = seal_receipts([{"name": "t1", "by": "ana", "level": "F3", "scope": "all", "at": "2026-10-11T12:00:00Z", + "nodes": ["@a", "@b", "@c", "@d", "@x1", "@y1", "@hx", "@hy", "@r"]}], + names, states, final, key, wsha) + files, nodes, vals, d = package_files(TINY, key, names, side, final, records, recs, ROSTER if receipts else None, + wit) + if out_dir: + write(out_dir, files) + return {"key": key, "names": names, "final": final, "files": files, "values": vals} + + +# --- vectors -------------------------------------------------------------------- + + +def wv(out, name, cases): + path = os.path.join(out, "vectors", name) + with open(path, "wb") as f: + f.write(jsonl(cases)) + + +def sentence_doc(runs, key="vectors"): + """A one-sentence document, so projections of runs can be computed with the node functions.""" + nodes = [{"id": "aaaaaaa", "kind": "document", "parent": None, "ord": 0}, + {"id": "bbbbbbb", "kind": "section", "parent": "aaaaaaa", "ord": 0, "attrs": {"level": 1}}, + {"id": "ccccccc", "kind": "paragraph", "parent": "bbbbbbb", "ord": 0}, + {"id": "ddddddd", "kind": "sentence", "parent": "ccccccc", "ord": 0, "content": runs}] + return Doc(key, nodes), "ddddddd" + + +def projection_case(cid, runs, note=None): + doc, s = sentence_doc(runs) + strict, cx = hashing.strict(doc, s) + lossy = hashing.lossy_from_strict(strict) + plain = hashing.plain(doc, s) + c = {"id": cid, "runs": runs, "plain": plain, "normalized": norm(plain), "strict": strict, "lossy": lossy, + "complex": cx, "text_hash": H(norm(plain)), "match_hash": H(strict), "align_key": H(lossy)} + if note: + c["note"] = note + return c + + +T = lambda t, **kw: dict({"kind": "text", "text": t}, **({"style": kw["style"]} if "style" in kw else {})) # noqa: E731 +M = lambda s, n="tex": {"kind": "math", "notation": n, "source": s} # noqa: E731 + + +def parse_doubles(text): + """Parse JSON as an ECMAScript engine does: every number is an IEEE 754 double.""" + return json.loads(text, parse_int=lambda x: int(x) if abs(int(x)) <= 2**53 else float(x)) + + +def vectors(out, hale, tiny): + # Canonical JSON. + cj = [ + ("sort-utf16", '{"\\u20ac": 1, "\\ud83d\\ude00": 2, "a": 3, "\\ufb01": 4}'), + ("numbers", '[0, -0.0, 1.0, 100.0, 72.10, 1E21, 1e-7, 0.000001, 123456789012345678901, -2.5e-5, 4.50e2]'), + ("escapes", '{"s": "tab\\tnl\\ncr\\rq\\"bs\\\\ctl\\u0001del\\u007fnbsp\\u00a0slash\\/"}'), + ("nested", '{ "b" : [ true , false , null ] , "a" : { "z" : "" , "y" : [ ] } }'), + ("strings-stay-unnormalized", '{"cafe\\u0301": "e\\u0301", "caf\\u00e9": "\\u00e9"}'), + ] + wv(out, "canonical-json.jsonl", [{"id": i, "input_json": t, "output": jcs.dumps(parse_doubles(t))} for i, t in cj]) + # Normalization for hashing. + ns = [("nfc", "cafe\u0301"), ("collapse", "a \t\n b"), ("trim", "\u00a0 a b \u3000"), + ("angstrom-sign", "1.5 \u212b"), ("nbsp-thin", "300\u2009K and 10\u00a0mol"), + ("zero-width-kept", "a\u200bb"), ("ligature-kept", "\ufb01t"), ("micro-kept", "5 \u00b5m"), + ("line-separator", "one\u2028two")] + wv(out, "normalize.jsonl", [{"id": i, "input": s, "output": norm(s), "sha256": H(norm(s))} for i, s in ns]) + # IDs. + idc = [] + for doc_key, kind, th, occ in [("cornell1995second", "sentence", H("A sentence."), 0), + ("cornell1995second", "sentence", H("A sentence."), 1), + ("cornell1995second.si", "sentence", H("A sentence."), 0), + ("hale2026harmonic", "cell", H("310.0"), 0), + ("hale2026harmonic", "column", H("Set A $K_r$ (kcal mol⁻¹ Å⁻²)"), 0)]: + payload = jcs.dumps(["scienting-id/1", doc_key, kind, th, occ]) + idc.append({"id": "mint-%s-%s-%d" % (doc_key, kind, occ), "doc": doc_key, "kind": kind, "text_hash": th, + "occurrence": occ, "payload": payload, "sha256": H(payload), + "node_id": mint_node_id(doc_key, kind, th, occ)}) + for hx in ("00" * 32, "ff" * 32, H("x")): + idc.append({"id": "letter-first-" + hx[:8], "digest": hx, "node_id": letter_first(bytes.fromhex(hx), 7), + "record_id": record_id(hx)}) + wv(out, "ids.jsonl", idc) + # Notation. + notes = [("tex", "H_2O"), ("tex", "_2"), ("tex", "\\mathrm{H}_{2}\\mathrm{O}"), ("typst", "H_2 O"), + ("typst", "upright(H)_2 upright(O)"), ("tex", "\\mathrm{cm}^{-1}"), ("typst", "\"cm\"^(-1)"), + ("tex", "10^{-3}"), ("typst", "10^(-3)"), ("tex", "K_r"), ("tex", "K_{\\mathrm{r}}"), ("typst", "K_r"), + ("tex", "\\alpha_i"), ("tex", "\\alpha_{i}"), ("tex", "x'_1"), ("tex", "x^{\\prime}"), + ("tex", "T = 300\\,\\mathrm{K}"), ("tex", "-1.5"), ("tex", "\\epsilon"), ("typst", "epsilon.alt"), + ("tex", "a \\cdot b"), ("typst", "a dot b"), ("tex", "a \\times b \\pm c"), ("tex", "\\left(x\\right)^2"), + ("typst", "(a+b)^2"), ("tex", "\\frac{a}{b}"), ("typst", "a/b"), ("tex", "\\sqrt{2}"), + ("tex", "\\mathbf{F}"), ("tex", "{ab}_2"), ("tex", "x_1_2"), ("tex", "\\Delta G^\\circ"), + ("tex", "E_{\\mathrm{bond}} = \\frac{1}{2} K_r (r - r_{\\mathrm{eq}})^2"), ("typst", "E = K_r (r - r_\"eq\")^2")] + wv(out, "notation.jsonl", [{"id": "%s:%s" % (n, s), "notation": n, "source": s, "canonical": fold_math(n, s)} + for n, s in notes]) + # Projections. + pc = [ + projection_case("h2o-math", [T("The solvent is "), M("H_2O"), T(".")]), + projection_case("h2o-split-math", [T("The solvent is H"), M("_2"), T("O.")]), + projection_case("h2o-mathrm", [T("The solvent is "), M("\\mathrm{H}_{2}\\mathrm{O}"), T(".")]), + projection_case("h2o-sub", [T("The solvent is H"), T("2", style=["sub"]), T("O.")]), + projection_case("h2o-unicode", [T("The solvent is H\u2082O.")]), + projection_case("h2o-typst", [T("The solvent is "), M("H_2 O", "typst"), T(".")]), + projection_case("wavenumber-unicode", [T("A band near 1595 cm\u207b\u00b9.")]), + projection_case("wavenumber-sup", [T("A band near 1595 cm"), T("-1", style=["sup"]), T(".")]), + projection_case("wavenumber-math", [T("A band near 1595 "), M("\\mathrm{cm}^{-1}"), T(".")]), + projection_case("wavenumber-typst", [T("A band near 1595 "), M("\"cm\"^(-1)", "typst"), T(".")]), + projection_case("milli-unicode", [T("Values below 10\u207b\u00b3 were dropped.")]), + projection_case("milli-sup", [T("Values below 10"), T("\u22123", style=["sup"]), T(" were dropped.")]), + projection_case("milli-math", [T("Values below "), M("10^{-3}"), T(" were dropped.")]), + projection_case("kr-math", [T("The constant "), M("K_r"), T(" is large.")]), + projection_case("kr-mathrm", [T("The constant "), M("K_{\\mathrm{r}}"), T(" is large.")]), + projection_case("kr-sub", [T("The constant K"), T("r", style=["sub"]), T(" is large.")]), + projection_case("kr-unicode", [T("The constant K\u1d63 is large.")]), + projection_case("ligature", [T("The \ufb01t is good.")]), + projection_case("no-ligature", [T("The fit is good.")]), + projection_case("micro-sign", [T("A 5 \u00b5m film.")]), + projection_case("greek-mu", [T("A 5 \u03bcm film.")]), + projection_case("lost-superscript", [T("A rate of 103 per second.")], "OCR lost the superscript."), + projection_case("superscript", [T("A rate of 10\u00b3 per second.")]), + projection_case("cite-mark", [T("The energy"), {"kind": "cite", "refs": [], "text": "3"}, T(" is low.")]), + projection_case("cite-as-text", [T("The energy3 is low.")]), + projection_case("complex", [T("The energy is "), M("\\frac{1}{2} k x^2"), T(" exactly.")]), + projection_case("hyphen-before-digit", [T("pages 10-20 and CT\u2013CT with 6-31G*")]), + projection_case("en-dash-before-digit", [T("pages 10\u201320 and CT-CT with 6\u201331G*")]), + projection_case("astral", [T("Let "), M("\U0001d465"), T(" vary.")]), + ] + groups = [ + {"id": "h2o", "same": "match_hash", + "cases": ["h2o-math", "h2o-split-math", "h2o-mathrm", "h2o-sub", "h2o-unicode", "h2o-typst"]}, + {"id": "wavenumber", "same": "match_hash", + "cases": ["wavenumber-unicode", "wavenumber-sup", "wavenumber-math", "wavenumber-typst"]}, + {"id": "milli", "same": "match_hash", "cases": ["milli-unicode", "milli-sup", "milli-math"]}, + {"id": "kr", "same": "match_hash", "cases": ["kr-math", "kr-mathrm", "kr-sub", "kr-unicode"]}, + {"id": "ligature", "same": "match_hash", "cases": ["ligature", "no-ligature"]}, + {"id": "micro", "same": "match_hash", "cases": ["micro-sign", "greek-mu"]}, + {"id": "103-align", "same": "align_key", "cases": ["lost-superscript", "superscript"]}, + {"id": "103-match", "differ": "match_hash", "cases": ["lost-superscript", "superscript"]}, + {"id": "cite-structure", "differ": "match_hash", "cases": ["cite-mark", "cite-as-text"]}, + {"id": "dashes-align", "same": "align_key", "cases": ["hyphen-before-digit", "en-dash-before-digit"]}, + {"id": "dashes-text", "differ": "text_hash", "cases": ["hyphen-before-digit", "en-dash-before-digit"]}, + ] + byid = {c["id"]: c for c in pc} + for g in groups: + vals = {byid[c][g.get("same") or g.get("differ")] for c in g["cases"]} + assert (len(vals) == 1) if "same" in g else (len(vals) == len(g["cases"])), g + wv(out, "projections.jsonl", pc) + wv(out, "projection-groups.jsonl", groups) + # Offsets. + off = [] + for cid, runs, span in [("bmp", [T("A sentence about H"), M("_2"), T("O.")], [18, 24]), + ("astral", [T("Let "), M("\U0001d465"), T(" vary with "), M("\U0001d466"), T(".")], [4, 7])]: + doc, s = sentence_doc(runs) + p = hashing.plain(doc, s) + from tools.oracle.text import cp_to_utf16 + off.append({"id": cid, "runs": runs, "plain": p, "span": span, "exact": p[span[0]:span[1]], + "utf16_span": [cp_to_utf16(p, span[0]), cp_to_utf16(p, span[1])], "code_points": len(p), + "utf16_units": cp_to_utf16(p, len(p))}) + wv(out, "offsets.jsonl", off) + # Five values on a small tree: the tiny document. + tnodes = [{k: v for k, v in n.items() if k not in ("text_hash", "match_hash", "align_key", "own_hash", "node_hash")} + for n in map(json.loads, tiny["files"]["nodes.jsonl"].decode().splitlines())] + tdoc = Doc("tiny2026example", tnodes) + tv = hashing.compute(tdoc) + own = {nid: hashing.own_content(tdoc, nid, lambda x: tv[x]["text_hash"]) for nid in tdoc.order} + wv(out, "hashes.jsonl", [{"id": "tiny2026example", "doc": "tiny2026example", "nodes": tnodes, + "own_content": own, "values": tv}]) + # Addresses. + ad = [("plain", "cornell1995second#k3m9q2a"), ("pinned", "cornell1995second#k3m9q2a@4f1a0c"), + ("span", "cornell1995second#k3m9q2a@4f1a0c[12:57]"), ("store", "smithlab/cornell1995second#k3m9q2a"), + ("span-no-pin", "dong2026machine.v2#k3m9q2a[0:0]"), ("si", "cornell1995second.si#m2x8p4d"), + ("alias", "cornell1995second#b-p03-text-004"), ("bad-reversed", "cornell1995second#k3m9q2a[57:12]"), + ("bad-pin", "cornell1995second#k3m9q2a@4F1A0C"), ("bad-leading-zero", "k#k3m9q2a[01:2]"), + ("bad-no-node", "cornell1995second#"), ("bad-upper-key", "Cornell1995#k3m9q2a"), + ("bad-two-stores", "a/b/c#k3m9q2a"), ("bad-pin-length", "k#k3m9q2a@4f1a")] + wv(out, "addresses.jsonl", [{"id": i, "address": a, "parsed": AN.parse_address(a)} for i, a in ad]) + # Keyed hashes. + k = crypto.team_key(TEAM_SECRET) + fps = [p["page_fp"] for p, _ in hale["pages"]] + pk = crypto.page_key(fps, "layer:smithlab/kp4m2x7q") + text = "310.0" + keyed = [ + {"id": "team-key", "secret": TEAM_SECRET.hex(), "key": k.hex(), "key_id": crypto.key_id(k)}, + {"id": "team-hmac-text", "key": k.hex(), "text": text, "text_hash_plain": H(text), + "text_hash_keyed": hashing.Hasher(k)(text)}, + {"id": "page-hashes", "page_fps": fps, "page_hashes": [crypto.page_hash(f) for f in fps]}, + {"id": "page-key", "page_fps": fps, "context": "layer:smithlab/kp4m2x7q", "key": pk.hex(), + "quote": "310.0", "quote_mac": hashing.Hasher(pk)(norm(text))}, + {"id": "non-holder", "note": "Without the pages, a guess hashes to the plain value, which the export never " + "carries; with one page changed, the key differs.", + "guess": text, "guess_sha256": H(text), + "wrong_page_fps": [fps[0], H("another page")], + "wrong_key": crypto.page_key([fps[0], H("another page")], "layer:smithlab/kp4m2x7q").hex(), + "quote_mac": hashing.Hasher(pk)(norm(text))}, + ] + assert keyed[4]["wrong_key"] != pk.hex() and keyed[4]["guess_sha256"] != keyed[4]["quote_mac"] + wv(out, "keyed.jsonl", keyed) + # Fingerprints: two downloads of one page, stamped differently. + stamps = json.load(open(os.path.join(ROOT, "registry", "stamps", "scienting-stamps-1.json")))["rules"] + _, p1 = hale["pages"][0] + body = [l for l in p1["lines"] if "box" not in l] + acs1 = dict(p1) + acs2 = dict(p1, lines=body + [ + {"text": "Downloaded via EXAMPLE PHARMA INC on March 2, 2027 at 09:14:55 (UTC).", "box": [8.0, 210.0, 20.0, 590.0]}, + {"text": "See https://pubs.acs.org/sharingguidelines for options on how to legitimately share published articles.", + "box": [580.0, 200.0, 592.0, 600.0]}]) + wiley = {"size": [595.276, 841.89], "images": [H("figure 2 image stream (synthetic)")], "lines": [ + {"text": "Results"}, {"text": "The fitted slope is 0.42 \u00b1 0.03 per kelvin."}, + {"text": "Downloaded from https://onlinelibrary.wiley.com/doi/10.5555/example.wiley by Example University, " + "Wiley Online Library on [11/10/2026]. See the Terms and Conditions (https://onlinelibrary.wiley.com/" + "terms-and-conditions) on Wiley Online Library for rules of use.", "box": [580.0, 100.0, 592.0, 740.0]}]} + wiley2 = dict(wiley, lines=wiley["lines"][:2] + [ + {"text": "Downloaded from https://onlinelibrary.wiley.com/doi/10.5555/example.wiley by Example Pharma Inc, " + "Wiley Online Library on [02/03/2027].", "box": [580.0, 100.0, 592.0, 740.0]}, + {"text": "See the Terms and Conditions (https://onlinelibrary.wiley.com/terms-and-conditions) on Wiley Online " + "Library for rules of use.", "box": [580.0, 60.0, 592.0, 99.0]}]) + changed = dict(acs1, lines=[dict(l, text=l["text"].replace("1595", "1594")) for l in acs1["lines"]]) + scan = {"size": [612.4, 791.6], "lines": [], "images": [H("scanned page image (synthetic)")]} + fpc = [] + for cid, pg in [("acs-download-1", acs1), ("acs-download-2", acs2), ("acs-changed-text", changed), + ("wiley-download-1", wiley), ("wiley-download-2", wiley2), ("scanned", scan)]: + fp, removed = FP.fingerprint(pg, stamps) + kept = [l["text"] for l in pg["lines"] if not FP.is_stamp(l, pg["size"], stamps)] + fpc.append({"id": cid, "page": pg, "rules": "scienting-stamps-1", "removed": removed, + "text": FP.fp_text(" ".join(kept)), "page_fp": fp}) + assert fpc[0]["page_fp"] == fpc[1]["page_fp"] != fpc[2]["page_fp"] and fpc[3]["page_fp"] == fpc[4]["page_fp"] + wv(out, "fingerprints.jsonl", fpc) + # Merkle roots. + mk = [] + for n in (1, 2, 3, 4, 5, 7): + items = [["node", mint_node_id("m", "sentence", H(str(i)), 0), H("h%d" % i)] for i in range(n)] + mk.append({"id": "items-%d" % n, "items": items, "root": crypto.merkle_root(items)}) + wv(out, "merkle.jsonl", mk) + # Signatures. + r1 = hale["by_name"]["r1"] + sk = bytes.fromhex("9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60") + wv(out, "signatures.jsonl", [ + {"id": "rfc8032-test-1", "secret": sk.hex(), "public": crypto.ed25519_public(sk).hex(), "message": "", + "signature": crypto.ed25519_sign(sk, b"").hex()}, + {"id": "receipt-r1", "receipt": r1, "record_hash": RC.record_hash(r1), + "payload": RC.signing_payload(r1).decode(), "public": ROSTER_BY_ID["ana"]["public"], + "record_id": r1["id"]}]) + # Spot-checks. + q1 = hale["by_name"]["q1"] + wv(out, "spotcheck.jsonl", [{"id": "q1", "receipt": r1, "seed_payload": RC.seed_payload(r1).decode(), + "checker_public": ROSTER_BY_ID["ben-spot"]["public"], "seed": q1["qa"]["seed"], + "n": len(r1["nodes"]), "rate": "0.05", "minimum": 10, + "size": RC.sample_size(len(r1["nodes"])), "sample": q1["qa"]["sample"]}] + + [{"id": "size-%d" % n, "n": n, "rate": "0.05", "minimum": 10, "size": RC.sample_size(n)} + for n in (3, 10, 199, 200, 201, 3000)]) + # Bounds. + wv(out, "bounds.jsonl", [{"id": "k%d-n%d" % (kk, nn), "errors": kk, "sampled": nn, "confidence": "0.95", + "bound": RC.bound_string(kk, nn), "approx": round(RC.upper_bound(kk, nn), 9)} + for kk, nn in [(0, 10), (0, 300), (1, 10), (1, 300), (2, 50), (5, 100), (0, 1), (10, 10)]]) + # Alignment. + def item(i, runs, container, context="paragraph"): + doc, s = sentence_doc(runs) + st, cx = hashing.strict(doc, s) + return {"id": i, "runs": runs, "strict": st, "lossy": hashing.lossy_from_strict(st), "complex": cx, + "container": container, "context": context} + A = [item("a1", [T("Methods")], "h", "heading"), + item("a2", [T("Every bond was scanned in steps of 0.01 \u00c5 around its minimum.")], "p1"), + item("a3", [T("where "), M("\\frac{a}{b}"), T(" is the bond length.")], "p1"), + item("a4", [T("The fitted rate is 10\u00b3 per second at room temperature.")], "p1"), + item("a5", [T("where "), M("\\frac{c}{d}"), T(" is the bond length.")], "p2"), + item("a6", [T("This sentence was dropped by the second reading entirely.")], "p2"), + item("a7", [T("The last sentence of the section is unique and long enough.")], "p2")] + B = [item("b1", [T("Methods")], "x", "paragraph"), + item("b2", [T("Every bond was scanned in steps of 0.01 \u00c5 around its minimum.")], "q1"), + item("b3", [T("where "), M("\\frac{a}{b}"), T(" is the bond length.")], "q1"), + item("b4", [T("The fitted rate is 103 per second at room temperature.")], "q2"), + item("b5", [T("where "), M("\\frac{c}{e}"), T(" is the bond length.")], "q2"), + item("b6", [T("A sentence only the second reading has, also long.")], "q2"), + item("b7", [T("The last sentence of the section is unique and long enough.")], "q2")] + wv(out, "alignment.jsonl", [{"id": "two-readings", "a": A, "b": B, "expect": AL.align(A, B)}]) + # Corrections, op by op, on the tiny document. + wv(out, "corrections.jsonl", corrections_vectors()) + # Anchor resolution against the hale package. + wv(out, "resolve.jsonl", resolve_vectors(hale)) + # Rights. + wv(out, "rights.jsonl", rights_vectors(hale)) + + +def corrections_vectors(): + tiny = tiny_package(None, receipts=False) + st0 = tiny["final"] + nm = tiny["names"].ids + crop = [{"kind": "crop", "sha256": crop_sha("tiny")}] + person = [{"kind": "person", "by": "ana"}] + base = {"author": {"key": "ana"}, "reason": "Vector.", "at": "2026-10-11T12:00:00Z"} + cases = [ + ("replace-digit", {"op": "replace", "target": nm["@a"], "find": "42.0", "replace": "42.5", "evidence": crop}), + ("replace-digit-no-crop", {"op": "replace", "target": nm["@a"], "find": "42.0", "replace": "42.5", "evidence": person}), + ("replace-word", {"op": "replace", "target": nm["@c"], "find": "second", "replace": "later", "evidence": person}), + ("replace-not-unique", {"op": "replace", "target": nm["@a"], "find": "0", "replace": "1", "evidence": crop}), + ("replace-runs", {"op": "replace", "target": nm["@a"], "find": "300 K", "replace": [ + {"kind": "math", "notation": "tex", "source": "300\\,\\mathrm{K}"}], "evidence": crop}), + ("insert-text", {"op": "insert", "target": nm["@d"], "run": 0, "offset": 8, "text": "only ", "evidence": crop}), + ("insert-text-no-crop", {"op": "insert", "target": nm["@d"], "run": 0, "offset": 8, "text": "only ", + "evidence": person}), + ("insert-node", {"op": "insert", "parent": nm["@p2"], "place_after": nm["@c"], + "node": {"kind": "sentence", "content": [{"kind": "text", "text": "A dropped sentence."}]}, + "evidence": crop}), + ("delete", {"op": "delete", "target": nm["@p2"], "evidence": person}), + ("delete-digits-no-crop", {"op": "delete", "target": nm["@p1"], "evidence": person}), + ("split", {"op": "split", "target": nm["@a"], "offset": 13, "evidence": person}), + ("split-inside-xref", {"op": "split", "target": nm["@b"], "offset": 6, "evidence": person}), + ("merge", {"op": "merge", "target": nm["@c"], "with": nm["@d"], "joiner": " ", "evidence": person}), + ("merge-not-adjacent", {"op": "merge", "target": nm["@a"], "with": nm["@c"], "evidence": person}), + ("move", {"op": "move", "target": nm["@d"], "parent": nm["@p1"], "place_after": None, "evidence": person}), + ("reclassify", {"op": "reclassify", "target": nm["@p2"], "kind": "quote", "evidence": person}), + ("reclassify-bad", {"op": "reclassify", "target": nm["@a"], "kind": "paragraph", "evidence": person}), + ("relabel-section", {"op": "relabel", "target": nm["@sec"], "label": "2", "evidence": crop}), + ("relabel-digit-no-crop", {"op": "relabel", "target": nm["@t"], "label": "Table 2", "evidence": person}), + ("set-colspan", {"op": "set", "target": nm["@y1"], "attr": "colspan", "value": 2, "evidence": person}), + ("set-not-settable", {"op": "set", "target": nm["@y1"], "attr": "level", "value": 2, "evidence": person}), + ] + out = [] + vals0 = hashing.compute(st0.doc()) + before = [dict(n, **vals0[n["id"]]) for n in st0.nodes] + for cid, c in cases: + c = dict(base, **c) + case = {"id": cid, "doc": st0.key, "before": {"nodes": before, "ids": [], "rev": 0}, "correction": c} + try: + st1, rec = CO.apply(st0, c) + v1 = hashing.compute(st1.doc()) + case["expect"] = {"record": rec, "nodes": [dict(n, **v1[n["id"]]) for n in st1.nodes], "ids": st1.ids} + except Refusal as e: + case["expect"] = {"refusal": e.rule} + out.append(case) + return out + + +def resolve_vectors(hale): + src, names, states, final = hale["src"], hale["names"], hale["states"], hale["final"] + s0 = states[0] + d0 = s0.doc() + v0 = hashing.compute(d0) + out = [] + for cid, a in src["anchors_at_rev0"].items(): + nid = names.ids[a["node"]] + if a.get("container_of"): + nid = d0.nodes[nid]["parent"] + cid = cid + span = None + if "quote" in a: + t = hashing.plain(d0, nid) + i = t.index(a["quote"]) + span = [i, i + len(a["quote"])] + anchor = AN.make_anchor(d0, v0, nid, 0, span=span, store=STORE) + if "alias" in a: + anchor["node"] = a["alias"] + res = AN.resolve(final, anchor) + out.append({"id": cid, "package": "fixtures/packages/hale2026harmonic", "anchor": anchor, "expect": res}) + return out + + +def rights_vectors(hale): + out = OUT + w = hale["witness"] + stages = json.load(open(os.path.join(ROOT, "registry", "stages", "scienting-stages-default.json")))["stages"] + policy = json.load(open(os.path.join(out, "fixtures", "records", "policy.json"))) + cases = [] + for cid, stage, proc, now, pols in [ + ("convert-local", "convert-model", "local", "2026-10-11T00:00:00Z", []), + ("convert-outside", "convert-model", "outside", "2026-10-11T00:00:00Z", []), + ("review-tenancy-unknown", "review-model", "tenancy", "2026-10-11T00:00:00Z", []), + ("review-tenancy-policy", "review-model", "tenancy", "2026-10-11T00:00:00Z", [policy]), + ("index", "index", "local", "2026-10-11T00:00:00Z", []), + ("embed-outside-refused", "embed", "outside-no-retention", "2026-10-11T00:00:00Z", [policy]), + ("publish-quotes", "publish-quotes", "local", "2026-10-11T00:00:00Z", []), + ("read-expired", "read", "local", "2027-09-01T00:00:00Z", []), + ("accessible-copy-unknown", "accessible-copy", "local", "2026-10-11T00:00:00Z", []), + ]: + uses, expired = RI.effective(w, pols, now) + ok, lacking = RI.check(stages[stage], proc, uses) + cases.append({"id": cid, "rights": w["rights"], "origin": w["origin"], "witness_sha256": w["sha256"], + "policies": pols, "stage": stage, "requires": stages[stage], "processor": proc, "now": now, + "expect": {"allowed": ok, "lacking": lacking, "expired": expired}}) + oa = rights_record("open") + sub = w["rights"] + cases.append({"id": "combine", "rights": [oa, sub], + "expect": RI.combine([RI.flat(oa), RI.flat(sub)])}) + backends = [json.load(open(os.path.join(out, "fixtures", "records", "backend-%s.json" % b))) for b in ("docling", "examplevendor")] + profiles = [json.load(open(os.path.join(out, "fixtures", "records", "profile-%s.json" % p))) for p in ("smithlab", "acme")] + for b in backends: + for p in profiles: + ok, failed = RI.backend_allowed(b, p) + cases.append({"id": "backend-%s-%s" % (b["name"], p["team"]), "backend": b, "profile": p, + "expect": {"allowed": ok, "failed": failed}}) + return cases + + +# --- records ------------------------------------------------------------------------ + + +def wr(out, rel, rec): + path = os.path.join(out, "fixtures", "records", rel) + os.makedirs(os.path.dirname(path), exist_ok=True) + with open(path, "wb") as f: + f.write((jcs.dumps(rec) + "\n").encode() if not isinstance(rec, bytes) else rec) + + +CTX = ["http://www.w3.org/ns/anno.jsonld", "https://scient.ing/ns/scienting/1.jsonld"] + + +def ann_hash(a): + return H(jcs.dumpb({k: v for k, v in a.items() if k not in ("status", "receipt", "modified")})) + + +def records(out, hale): + names, final = hale["names"], hale["final"] + doc = final.doc() + vals = hashing.compute(doc) + rev = final.rev + I = names.ids + + def anchor(name, quote=None): + nid = I[name] + span = None + if quote: + t = hashing.plain(doc, nid) + i = t.index(quote) + span = [i, i + len(quote)] + return AN.make_anchor(doc, vals, nid, rev, span=span, store=STORE) + + wr(out, "roster.json", ROSTER) + wr(out, "anchor-span.json", anchor("@s3", "first test case")) + wr(out, "anchor-cell.json", anchor("@cc_ak")) + wr(out, "anchor-paragraph.json", AN.make_anchor(doc, vals, doc.nodes[I["@s3"]]["parent"], rev, store=STORE)) + long_anchor = AN.make_anchor(doc, vals, I["@s2"], rev, store=STORE) + wr(out, "anchor-leaf.json", long_anchor) + # A public layer's anchor on a paywalled paper: keyed by the pages, no text. + fps = [p["page_fp"] for p, _ in hale["pages"]] + layer_id = "urn:scienting:layer:smithlab/kp4m2x7q" + pk = crypto.page_key(fps, "layer:smithlab/kp4m2x7q") + hk = hashing.Hasher(pk) + ka = anchor("@cc_ak") + keyed_vals = hashing.compute(doc, hk) + ka = {"format": "scienting-anchor/1", "store": STORE, "doc": ka["doc"], "node": ka["node"], "kind": "cell", + "own_hash": keyed_vals[ka["node"]]["own_hash"], "node_hash": keyed_vals[ka["node"]]["node_hash"], + "quote": {"mac": hk(norm(ka["quote"]["exact"])), "length": len(ka["quote"]["exact"])}, + "context": {"table_label_mac": hk(norm(ka["context"]["table_label"])), + "row_path_mac": [hk(norm(x)) for x in ka["context"]["row_path"]], + "column_path_mac": [hk(norm(x)) for x in ka["context"]["column_path"]]}, + "rev": rev, "keyed": {"scheme": "hkdf-pages", "context": "layer:smithlab/kp4m2x7q", + "pages": [crypto.page_hash(f) for f in fps]}} + wr(out, "anchor-keyed.json", ka) + # Rights, policy, backends, profiles. + wr(out, "rights-open.json", rights_record("open")) + wr(out, "rights-subscription.json", rights_record("subscription")) + ccc = rights_record("subscription") + ccc.update({"license": {"text": "Annual collective license with internal AI re-use (fictional)."}, + "basis": "collective-license", "valid_until": "2027-06-30T23:59:59Z"}) + wr(out, "rights-collective.json", ccc) + policy = RC.seal({"format": "scienting-policy/1", "project": "smithlab-charges", + "applies_to": {"basis": ["subscription"], "doi_prefixes": ["10.5555/"]}, + "uses": {"ai": {"internal/tenancy": True}}, + "statement": "Our institutional agreement covers internal AI use in our own cloud account for " + "these papers (fictional).", + "by": "ana", "at": "2026-10-05T09:00:00Z", "valid_until": "2027-08-31T23:59:59Z"}, + secret("ana"), "ana") + wr(out, "policy.json", policy) + wr(out, "backend-docling.json", { + "format": "scienting-backend/1", "name": "docling", "version": "illustrative", "stage": "read", + "processor": "local", "code_license": {"spdx": "MIT"}, + "weights": [{"name": "layout model", "license": {"spdx": "Apache-2.0"}}], "conditions": []}) + wr(out, "backend-examplevendor.json", { + "format": "scienting-backend/1", "name": "examplevendor", "version": "1.0", "stage": "read", + "processor": "local", "code_license": {"spdx": "Apache-2.0"}, + "weights": [{"name": "example weights", "license": {"text": "A fictional weight license with conditions."}}], + "conditions": [{"id": "revenue-cap", "kind": "revenue-cap", "usd": 5000000}, + {"id": "no-competition", "kind": "no-competition", "vendor": "examplevendor"}, + {"id": "purpose", "kind": "purpose", "allowed": ["research", "personal", "education", "startup"]}]}) + wr(out, "profile-smithlab.json", {"format": "scienting-profile/1", "team": "smithlab", "purpose": "research", + "revenue_or_funding_usd": {"at_most": 2000000}, "competes_with": [], + "recorded_by": "ana", "at": "2026-10-01T00:00:00Z"}) + wr(out, "profile-acme.json", {"format": "scienting-profile/1", "team": "acme", "purpose": "commercial", + "revenue_or_funding_usd": {"at_most": None}, "competes_with": None, + "recorded_by": "acme-admin", "at": "2026-10-01T00:00:00Z"}) + # A layer with one annotation of each common kind. + creator = {"id": "urn:scienting:key:ana", "type": "Person", "name": "Ana Example"} + model = {"id": "urn:scienting:software:example-model", "type": "Software", "name": "A model (illustrative)"} + + def target(a): + return {"type": "SpecificResource", "source": "urn:scienting:doc:smithlab/hale2026harmonic", + "selector": [{"type": "AnchorSelector", "anchor": a}] + + ([{"type": "TextQuoteSelector", "exact": a["quote"]["exact"], + "prefix": a["quote"].get("prefix", ""), "suffix": a["quote"].get("suffix", "")}] + if "quote" in a and "exact" in a["quote"] else [])} + + def ann(body, tgt, motivation, status="proposed", who=creator, created="2026-10-11T19:00:00Z"): + a = {"@context": CTX, "type": "Annotation", "layer": layer_id, "motivation": motivation, "creator": who, + "created": created, "body": body, "target": tgt} + a["id"] = "urn:scienting:annotation:smithlab/" + record_id(H(jcs.dumpb(a))) + a["status"] = status + return a + + ex_body = {"format": "scienting-exercise/1", "exercise": "anchor", + "prompt": "Find the table cell that gives the Set A bond constant for the CT–CT bond.", + "key": {"elements": [{"anchors": [anchor("@cc_ak")], "points": "1", + "feedback": {"hit": "That is the cell.", "miss": "Look in Table 1, row CT–CT."}}]}, + "rule": {"match": "same-node"}} + check_body = {"format": "scienting-exercise/1", "exercise": "check", + "prompt": "Does the cited passage support the claim that harmonic terms are the most common choice?", + "key": {"verdict": {"value": "supports", "points": "1"}, + "elements": [{"anchors": [anchor("@s1", "the most common description")], "points": "1"}]}, + "rule": {"match": "overlap", "min_overlap": "0.5"}} + anns = [ + ann({"type": "TextualBody", "kind": "gloss", "audience": "novice", "format": "text/markdown", "language": "en", + "value": "A *harmonic* term treats a bond like a spring: the energy grows with the square of the stretch."}, + target(anchor("@s2", "bond force constant")), "describing", "confirmed"), + ann({"type": "SpecificResource", "kind": "claim-link", "source": "lode:amber/k-bond", "pin": "illustrative-pin", + "role": "states"}, target(anchor("@s2")), "linking", "confirmed"), + ann({"type": "TextualBody", "kind": "comment", "value": "The step size matters more than the text admits."}, + target(anchor("@s6a", "steps of 0.01")), "commenting"), + ann({"type": "TextualBody", "kind": "question", "for": "group", + "value": "Why fit to a scan first and to frequencies second?"}, + target(AN.make_anchor(doc, vals, I["@sec2"], rev, store=STORE)), "questioning"), + ann({"type": "TextualBody", "kind": "citation-context", "reference": I["@r2"], "verdict": "cannot-tell", + "reason": "value", "value": "Cited for the band position; the reference is not in the library."}, + target(anchor("@s3", "1595")), "assessing"), + ann({"type": "TextualBody", "kind": "generated", "value": "Two panels: an energy scan and its fit residual.", + "generator": {"model": "example-model", "run": "illustrative-run-1"}}, + target(AN.make_anchor(doc, vals, I["@fig1"], rev, store=STORE)), "describing", "proposed", model), + ann({"type": "TextualBody", "kind": "exercise", "value": ex_body["prompt"], "exercise": ex_body}, + target(AN.make_anchor(doc, vals, I["@tab1"], rev, store=STORE)), "assessing", "confirmed"), + ann({"type": "TextualBody", "kind": "exercise", "value": check_body["prompt"], "exercise": check_body}, + target(anchor("@s1")), "assessing", "confirmed"), + ] + anns.append(ann({"type": "TextualBody", "kind": "comment", "value": "Agreed; see the residual panel."}, + {"type": "SpecificResource", "source": anns[2]["id"]}, "replying", created="2026-10-11T19:05:00Z")) + confirmed = [a for a in anns if a["status"] == "confirmed"] + lr = RC.seal({"format": "scienting-receipt/1", "doc": "hale2026harmonic", "rev": rev, "level": "F3", + "scope": "targeted:layer", "nodes": [], + "records": sorted([["annotation", a["id"].rsplit("/", 1)[1], ann_hash(a)] for a in confirmed]), + "evidence": [], "by": "ana", "at": "2026-10-11T19:30:00Z"}, secret("ana"), "ana") + for a in confirmed: + a["receipt"] = lr["id"] + wr(out, "layer/layer.json", {"@context": CTX, "format": "scienting-layer/1", "id": layer_id, + "type": "AnnotationCollection", "label": "Smith lab reading of Hale and Osei", + "purpose": "Glosses, claim links and exercises for new students.", + "audience": "student", "visibility": "team", "license": {"spdx": "CC-BY-4.0"}, + "creator": creator, "created": "2026-10-11T19:00:00Z", "project": "smithlab-charges", + "docs": ["smithlab/hale2026harmonic"], "total": len(anns)}) + wr(out, "layer/annotations.jsonl", jsonl(anns)) + wr(out, "layer/receipt.json", lr) + # Submissions and grades. + ex_ann = anns[6] + sub_ok = {"format": "scienting-submission/1", "exercise": ex_ann["id"], "doc": "smithlab/hale2026harmonic", + "rev": rev, "student": "s-7k2m", "answers": {"anchors": [anchor("@cc_ak")]}, + "submitted_at": "2026-10-20T10:00:00Z"} + sub_ok["id"] = record_id(H(jcs.dumpb(sub_ok))) + sub_miss = dict(sub_ok, student="s-9q4p", answers={"anchors": [anchor("@cc_bk")]}) + sub_miss.pop("id") + sub_miss["id"] = record_id(H(jcs.dumpb(sub_miss))) + ch_ann = anns[7] + sub_check = {"format": "scienting-submission/1", "exercise": ch_ann["id"], "doc": "smithlab/hale2026harmonic", + "rev": rev, "student": "s-7k2m", + "answers": {"verdict": "supports", "anchors": [anchor("@s1", "most common description of covalent")]}, + "submitted_at": "2026-10-20T10:05:00Z"} + sub_check["id"] = record_id(H(jcs.dumpb(sub_check))) + grades = [] + for name, sub, body in (("anchor-hit", sub_ok, ex_body), ("anchor-miss", sub_miss, ex_body), + ("check-overlap", sub_check, check_body)): + g = GR.grade(body, sub, final) + wr(out, "submissions/%s.json" % name, sub) + wr(out, "grades/%s.json" % name, g) + grades.append({"id": name, "package": "fixtures/packages/hale2026harmonic", "exercise": body, + "submission": sub, "expect": g}) + wv(out, "grading.jsonl", grades) + # Project. + wr(out, "project.json", { + "format": "scienting-project/1", "key": "smithlab-charges", "store": STORE, "name": "Charges and bonds", + "members": [{"person": "Ana Example", "role": "owner", "keys": ["ana"]}, + {"person": "Ben Example", "role": "editor", "keys": ["ben", "ben-spot"]}, + {"person": "Cara Example", "role": "reader", "keys": ["cara"]}], + "documents": [{"doc": "smithlab/hale2026harmonic", "reason": "The bond constants we start from.", + "tags": ["parameters"], "status": {"Ben Example": "read", "Cara Example": "reading"}}, + {"doc": "okafor2025open", "reason": "Solvent shifts for the validation set.", "tags": ["spectra"]}], + "paths": [{"id": "onboarding", "title": "First week", "steps": [ + {"type": "document", "ref": "smithlab/hale2026harmonic", "note": "Read the introduction."}, + {"type": "node", "ref": "smithlab/hale2026harmonic#" + I["@tab1"], "note": "Then the table."}, + {"type": "claim", "ref": "lode:amber/k-bond"}]}], + "layers": [layer_id], "datasets": ["ds-hale-bond-params", "ds-hale-ctct-scan"], "views": ["ctct-scan"], + "drafts": ["smithlab/smithlab2027charges"], "claims": {"lode": "amber"}, + "settings": {"digit_rule": "anchored-sections", "drift_threshold": "0.25", + "spot_check": {"rate": "0.05", "minimum": 10}, "rights_unknown": "refuse", + "stages": "scienting-stages-default"}}) + # A digitization of panel a, and the dataset it yields. + p2 = hale["pages"][1][0] + pa = I["@pa"] + ft = {t["text"]: t["id"] for t in doc.nodes[pa]["attrs"]["figure_text"]} + pts = [((110.0, 360.0), ("1.45", "3.10")), ((150.0, 330.0), ("1.50", "0.40")), ((190.0, 300.0), ("1.55", "2.80"))] + dg = {"format": "scienting-digitization/1", "doc": "smithlab/hale2026harmonic", + "target": {"anchor": AN.make_anchor(doc, vals, pa, rev, store=STORE), "page_fp": p2["page_fp"], + "region": [72.0, 260.0, 300.0, 410.0], "witness": hale["witness"]["sha256"]}, + "axes": [{"id": "x", "scale": "linear", "unit": "angstrom", + "calibration": [{"at": [90.0, 400.0], "value": "1.4"}, {"at": [210.0, 400.0], "value": "1.6"}], + "check": {"at": [150.0, 400.0], "value": "1.5"}, "label": {"panel": pa, "figure_text": ft["r (Å)"]}}, + {"id": "y", "scale": "linear", "unit": "kcal / mol", + "calibration": [{"at": [80.0, 400.0], "value": "0"}, {"at": [80.0, 280.0], "value": "4"}], + "label": {"panel": pa, "figure_text": ft["E (kcal mol⁻¹)"]}}], + "series": [{"id": "scan", "legend": "scan", "mark": {"color": "#285aa0", "marker": "circle"}, "kind": "points", + "values": [{"at": list(at), "value": {"x": x, "y": y}, + "uncertainty": {"x": "0.01", "y": "0.05", "resolution": "0.01", "marker": "0.02", + "calibration": "0.01"}} for at, (x, y) in pts]}], + "method": {"kind": "manual", "tool": {"name": "hand", "version": "0"}}, + "verification": {"image": "", "residual": "0.4", "max_residual": "0.9"}, + "confirmation": None, "dataset": "ds-hale-ctct-scan", "rev": rev} + dg["verification"]["image"] = crop_sha("overlay of panel a") + dg["id"] = record_id(H(jcs.dumpb(dg))) + wr(out, "digitization.json", dg) + body = {k: v for k, v in dg.items() if k != "confirmation"} + conf = RC.seal({"format": "scienting-receipt/1", "doc": "hale2026harmonic", "rev": rev, "level": "F3", + "scope": "targeted:digitization", "nodes": [], + "records": [["digitization", dg["id"], H(jcs.dumpb(body))]], + "evidence": [{"kind": "crop", "node": pa, "sha256": crop_sha("overlay of panel a")}], + "by": "ana", "at": "2026-10-11T20:00:00Z"}, secret("ana"), "ana") + wr(out, "digitization-confirmation.json", conf) + ds = {"format": "scienting-dataset/1", "id": "ds-hale-ctct-scan", "name": "hale-ctct-scan", + "title": "Energy along the C–C stretch, read from Figure 1a", + "resources": [{"name": "scan", "path": "data.csv", "format": "csv", "encoding": "utf-8", + "schema": {"fields": [{"name": "point", "type": "string"}, + {"name": "r", "type": "number", "unit": "angstrom", + "uncertainty": {"field": "r_u", "kind": "resolution"}}, + {"name": "r_u", "type": "number", "unit": "angstrom"}, + {"name": "e", "type": "number", "unit": "kcal / mol", + "uncertainty": {"field": "e_u", "kind": "resolution"}}, + {"name": "e_u", "type": "number", "unit": "kcal / mol"}], + "primaryKey": "point"}, + "origin": {"kind": "digitized", "digitization": dg["id"], "anchors": "anchors.jsonl"}}]} + csvd = "point,r,r_u,e,e_u\n" + "".join("p%d,%s,0.01,%s,0.05\n" % (i, x, y) for i, (_, (x, y)) in enumerate(pts)) + va = [{"resource": "scan", "row": "p%d" % i, "field": f, "digitization": dg["id"], "series": "scan", "point": i} + for i in range(len(pts)) for f in ("r", "e")] + wr(out, "datasets/ds-hale-ctct-scan/datapackage.json", ds) + wr(out, "datasets/ds-hale-ctct-scan/data.csv", csvd.encode()) + wr(out, "datasets/ds-hale-ctct-scan/anchors.jsonl", jsonl(va)) + ds_files = sorted([["anchors.jsonl", H(jsonl(va)), len(jsonl(va))], ["data.csv", H(csvd), len(csvd.encode())], + ["datapackage.json", H(jcs.dumps(ds) + "\n"), len((jcs.dumps(ds) + "\n").encode())]]) + ds_hash = H(jcs.dumpb({"format": "scienting-dataset/1", "files": ds_files})) + wr(out, "view.vl.json", { + "$schema": "https://vega.github.io/schema/vega-lite/v5.json", + "usermeta": {"scienting": {"format": "scienting-view/1", "id": "ctct-scan", + "data": [{"name": "ds-hale-ctct-scan", "dataset": "ds-hale-ctct-scan", + "hash": ds_hash, "resource": "scan"}]}}, + "data": {"name": "ds-hale-ctct-scan"}, "mark": {"type": "point"}, + "encoding": {"x": {"field": "r", "type": "quantitative", "title": "r (Å)"}, + "y": {"field": "e", "type": "quantitative", "title": "E (kcal/mol)"}}}) + # QA report. + q1 = hale["by_name"]["q1"] + q2 = hale["by_name"]["q2"] + n = len(q1["qa"]["sample"]) + len(q2["qa"]["sample"]) + k = len(q1["qa"]["errors"]) + len(q2["qa"]["errors"]) + wr(out, "qa-report.json", {"format": "scienting-qa-report/1", "id": record_id(H("qa report 1")), + "delivery": "smithlab evidence pilot (fictional)", "docs": ["smithlab/hale2026harmonic"], + "receipts": [hale["by_name"]["r1"]["id"], hale["by_name"]["r4"]["id"]], + "reviewers": [{"key": "ana", "sampled": n, "errors": k, "confidence": "0.95", + "method": "clopper-pearson", "bound": RC.bound_string(k, n)}], + "at": "2026-10-12T10:00:00Z"}) + # Draft snapshot and sentence IDs. + s5 = I["@s5"] + snap_anchor = AN.make_anchor(doc, vals, s5, rev, store=STORE) + wr(out, "snapshot.json", {"format": "scienting-snapshot/1", "store": STORE, "made_at": "2026-10-11T21:00:00Z", + "quotes": [{"address": AN.format_address(STORE, "hale2026harmonic", s5, vals[s5]["node_hash"]), + "anchor": snap_anchor, "text": norm(hashing.plain(doc, s5)), + "fidelity": "F3", "result": "current"}], + "claims": [{"ref": "amber/k-bond", "pin": "illustrative-pin", "level": "illustrative", + "typst": "K_r"}], + "datasets": [{"id": "ds-hale-ctct-scan", "hash": ds_hash}]}) + draft = Names.registry["smithlab2027charges"] + dd = Doc("smithlab2027charges", [json.loads(x) for x in open(os.path.join( + out, "fixtures", "packages", "smithlab2027charges", "nodes.jsonl"))]) + lines = [] + for nid in dd.preorder(): + if dd.nodes[nid]["kind"] == "sentence": + sec = next((a for a in reversed(dd.ancestors(nid)) if dd.nodes[a]["kind"] == "section"), None) + lines.append({"id": nid, "text_hash": dd.nodes[nid]["text_hash"], "section": sec, + "ord": dd.nodes[nid]["ord"]}) + lines[-1]["pinned"] = "energy-sentence" + wr(out, "draft-ids.jsonl", jsonl(lines)) + + +# --- invalid packages --------------------------------------------------------------- + + +def invalid(out): + base = os.path.join(out, "fixtures", "invalid") + tiny = tiny_package(None) + files = tiny["files"] + nodes = [json.loads(x) for x in files["nodes.jsonl"].decode().splitlines()] + nm = tiny["names"].ids + + def edit_nodes(fn): + ns = copy.deepcopy(nodes) + fn(ns) + return jsonl(ns) + + def by(ns, name): + return next(n for n in ns if n["id"] == nm[name]) + + def case(name, rule, change, note, raw=None): + f = dict(files) + f.update(change) + d = os.path.join(base, name, "package") + write(d, f) + if raw: + raw(d) + with open(os.path.join(base, name, "expect.json"), "wb") as fh: + fh.write((jcs.dumps({"rule": rule, "note": note}) + "\n").encode()) + + write(os.path.join(out, "fixtures", "packages", "tiny2026example"), files) + case("hash-mismatch", "doc.hash.node-hash", {"nodes.jsonl": edit_nodes(lambda ns: by(ns, "@a").update(node_hash="0" * 64))}, + "A node_hash that does not recompute.") + case("text-edited", "doc.hash.text-hash", {"nodes.jsonl": edit_nodes( + lambda ns: by(ns, "@a").update(content=[{"kind": "text", "text": "The value is 42.5 at 300 K."}]))}, + "Text changed without its hashes.") + case("unknown-kind", "package.schema", {"nodes.jsonl": edit_nodes(lambda ns: by(ns, "@p2").update(kind="aside"))}, + "Kinds outside the list are refused.") + case("heading-not-first", "doc.tree.child", {"nodes.jsonl": edit_nodes(lambda ns: _swap_first(ns, nm["@sec"]))}, + "A heading must be a section's first child.") + case("cite-not-reference", "doc.run.cite", {"nodes.jsonl": edit_nodes( + lambda ns: by(ns, "@b").update(content=[r if r["kind"] != "cite" else dict(r, refs=[nm["@a"]]) + for r in by(ns, "@b")["content"]]))}, + "A cite run names a node that is not a reference.") + case("unlisted-file", "package.manifest.unlisted", {}, "A file the manifest does not list.", + raw=lambda d: open(os.path.join(d, "notes.txt"), "w").write("stray\n")) + case("manifest-hash", "package.manifest.hash", {}, "A file changed after the manifest was written.", + raw=lambda d: open(os.path.join(d, "provenance.json"), "a").write(" ")) + case("not-canonical", "package.file.canonical", {}, "A line that is valid JSON but not canonical JSON.", + raw=lambda d: _rewrite_noncanonical(d)) + case("root-mismatch", "doc.hash.root", {"document.json": _doc_edit(files, root="1" * 64)}, + "document.json's root is not the root node's node_hash.") + case("receipt-root", "doc.receipt.root", {"receipts.jsonl": _receipt_edit(files, root="2" * 64)}, + "A receipt whose Merkle root does not recompute.") + case("receipt-signature", "doc.receipt.signature", {"receipts.jsonl": _receipt_edit(files, at="2026-10-11T12:00:01Z")}, + "A receipt changed after it was signed.") + case("checks-only-plain", "doc.policy.withheld", {"document.json": _doc_edit(files, policy="checks-only")}, + "A checks-only package that still carries text and plain hashes.") + case("bad-id", "package.schema", {"nodes.jsonl": edit_nodes(lambda ns: _rename(ns, nm["@d"], "i1lo0uu"))}, + "IDs use Crockford base32, which has no i, l, o or u.") + case("empty-optional-file", "package.file.empty", {"suspects.jsonl": b""}, "An optional JSONL file with no records.") + case("alias-dangling", "doc.id.successor", {"ids.jsonl": jsonl([{"id": "b-p01-text-001", "kind": "alias", + "successor": "zzzzzzz"}])}, + "An alias whose node does not exist.") + case("location-unknown-page", "doc.location.page", {"locations.jsonl": jsonl([ + {"node": nm["@a"], "page_fp": "3" * 64, "page": 1, "boxes": [[72, 72, 200, 84]]}])}, + "A location on a page no witness has.") + case("style-sup-sub", "doc.run.style", {"nodes.jsonl": edit_nodes(lambda ns: by(ns, "@c").update( + content=[{"kind": "text", "text": "A second paragraph.", "style": ["sub", "sup"]}]))}, + "A run cannot be both a subscript and a superscript.") + + +def _swap_first(ns, sec): + kids = sorted([n for n in ns if n["parent"] == sec], key=lambda n: n["ord"]) + kids[0]["ord"], kids[1]["ord"] = kids[1]["ord"], kids[0]["ord"] + d = Doc("x", ns) + order = d.preorder() + ns.sort(key=lambda n: order.index(n["id"])) + + +def _rename(ns, old, new): + for n in ns: + if n["id"] == old: + n["id"] = new + + +def _doc_edit(files, **kw): + d = json.loads(files["document.json"]) + d.update(kw) + return (jcs.dumps(d) + "\n").encode() + + +def _receipt_edit(files, **kw): + rs = [json.loads(x) for x in files["receipts.jsonl"].decode().splitlines()] + rs[0].update(kw) + return jsonl(rs) + + +def _rewrite_noncanonical(d): + p = os.path.join(d, "nodes.jsonl") + lines = open(p).read().splitlines() + lines[0] = json.dumps(json.loads(lines[0]), indent=None, separators=(", ", ": ")) + data = ("\n".join(lines) + "\n").encode() + open(p, "wb").write(data) + m = json.load(open(os.path.join(d, "MANIFEST.json"))) + for f in m["files"]: + if f["path"] == "nodes.jsonl": + f["sha256"], f["size"] = H(data), len(data) + open(os.path.join(d, "MANIFEST.json"), "w").write(jcs.dumps(m) + "\n") + + +# --- main ----------------------------------------------------------------------------- + + +OUT = ROOT + + +def main(out): + global OUT + OUT = out + for sub in ("fixtures/packages", "fixtures/records", "fixtures/invalid", "fixtures/keys"): + p = os.path.join(out, sub) + if os.path.exists(p): + shutil.rmtree(p) + os.makedirs(p) + vec = os.path.join(out, "vectors") + os.makedirs(vec, exist_ok=True) + for f in os.listdir(vec): + if f.endswith(".jsonl"): + os.remove(os.path.join(vec, f)) + for kid in KEYS: + with open(os.path.join(out, "fixtures", "keys", kid + ".ed25519.hex"), "w") as f: + f.write(secret(kid).hex() + "\n") + with open(os.path.join(out, "fixtures", "keys", "smithlab-team-secret.hex"), "w") as f: + f.write(TEAM_SECRET.hex() + "\n") + Names.registry.clear() + hale = build_hale(out) + build_checks_only(out, hale) + build_simple(out, "okafor2025open") + build_simple(out, "smithlab2027charges") + tiny = tiny_package(os.path.join(out, "fixtures", "packages", "tiny2026example")) + records(out, hale) + vectors(out, hale, tiny) + invalid(out) + + +if __name__ == "__main__": + out = ROOT + if "--out" in sys.argv: + out = sys.argv[sys.argv.index("--out") + 1] + if out != ROOT: + for sub in ("registry", "fixtures/src"): + dst = os.path.join(out, sub) + if not os.path.exists(dst): + shutil.copytree(os.path.join(ROOT, sub), dst) + main(out) diff --git a/tools/check.py b/tools/check.py new file mode 100644 index 0000000..70a94aa --- /dev/null +++ b/tools/check.py @@ -0,0 +1,504 @@ +#!/usr/bin/env python3 +"""Check the whole repository. Exit status 0 means every check passed. + +Non-normative tooling; standard library only (it uses `jsonschema` as a second validator when installed). +Usage: python3 tools/check.py [--quick] (--quick skips the determinism rebuild) +""" + +import base64 +import filecmp +import json +import os +import re +import sqlite3 +import subprocess +import sys +import tempfile +from fractions import Fraction + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, ROOT) + +from tools.oracle import align as AL # noqa: E402 +from tools.oracle import anchors as AN # noqa: E402 +from tools.oracle import corrections as CO # noqa: E402 +from tools.oracle import crypto, db, fingerprint as FP, grade as GR, hashing, jcs, receipts as RC, rights as RI # noqa: E402 +from tools.oracle import package as PK # noqa: E402 +from tools.oracle.model import Doc # noqa: E402 +from tools.oracle.notation import fold_math # noqa: E402 +from tools.oracle.schema import Store, validate as sv # noqa: E402 +from tools.oracle.text import cp_to_utf16, letter_first, mint_node_id, norm, record_id, sha256_hex # noqa: E402 +from tools.oracle.tree import Refusal # noqa: E402 + +FAILS = [] +COUNTS = {} + + +def ok(section, cond, msg): + COUNTS[section] = COUNTS.get(section, 0) + 1 + if not cond: + FAILS.append("%s: %s" % (section, msg)) + + +def p(*parts): + return os.path.join(ROOT, *parts) + + +def jl(path): + with open(path, encoding="utf-8") as f: + return [json.loads(x) for x in f] + + +def js(path): + with open(path, encoding="utf-8") as f: + return json.load(f) + + +STORE = Store(p("schemas")) +FORMAT_SCHEMA = {f["format"]: f["schema"] for f in js(p("registry", "formats.json"))["formats"]} + + +def schema_errors(name, rec): + return sv(STORE, name, rec) + + +def check_schemas(): + for f in sorted(os.listdir(p("schemas"))): + s = STORE.load(f) + ok("schemas", s.get("$id", "").endswith("/" + f), "%s: $id must end with its file name" % f) + for f in js(p("registry", "formats.json"))["formats"]: + ok("schemas", os.path.exists(p("schemas", f["schema"])) or os.path.exists(p(f["schema"])), + "%s names a missing schema %s" % (f["format"], f["schema"])) + try: + import jsonschema # noqa: F401 + from referencing import Registry, Resource + reg = Registry().with_resources( + [(STORE.load(f)["$id"], Resource.from_contents(STORE.load(f))) for f in os.listdir(p("schemas"))]) + COUNTS["second-validator"] = 0 + globals()["SECOND"] = (jsonschema, reg) + except ImportError: + globals()["SECOND"] = None + + +def second(name, rec): + if not SECOND: + return + jsonschema, reg = SECOND + v = jsonschema.Draft202012Validator(STORE.load(name), registry=reg) + errs = list(v.iter_errors(rec)) + COUNTS["second-validator"] += 1 + if errs: + FAILS.append("second-validator: %s: %s" % (name, errs[0].message)) + + +def valid(section, name, rec, where): + e = schema_errors(name, rec) + ok(section, not e, "%s: %s" % (where, e[:3])) + second(name, rec) + + +def check_registry(): + valid("registry", "stamps.schema.json", js(p("registry", "stamps", "scienting-stamps-1.json")), "stamps") + valid("registry", "stages.schema.json", js(p("registry", "stages", "scienting-stages-default.json")), "stages") + for rule in js(p("registry", "stamps", "scienting-stamps-1.json"))["rules"]: + re.compile(rule["pattern"]) + rules = {r["id"] for r in js(p("registry", "rules.json"))["rules"]} + for d in sorted(os.listdir(p("fixtures", "invalid"))): + ok("registry", js(p("fixtures", "invalid", d, "expect.json"))["rule"] in rules, "%s: rule is not in rules.json" % d) + + +def check_records(): + R = p("fixtures", "records") + roster = {k["id"]: k for k in js(os.path.join(R, "roster.json"))["keys"]} + for dirpath, _, files in os.walk(R): + for f in sorted(files): + path = os.path.join(dirpath, f) + rel = os.path.relpath(path, R) + if f.endswith(".csv"): + continue + if f.endswith(".jsonl"): + sch = {"annotations.jsonl": "annotation.schema.json", "draft-ids.jsonl": "draft-ids.schema.json", + "anchors.jsonl": "value-anchor.schema.json"}[f] + for i, rec in enumerate(jl(path), 1): + valid("records", sch, rec, "%s:%d" % (rel, i)) + continue + rec = js(path) + if f == "view.vl.json": + sch = "view.schema.json" + elif f == "layer.json": + sch = "layer.schema.json" + else: + sch = FORMAT_SCHEMA[rec["format"]] + valid("records", sch, rec, rel) + if rec.get("signature"): + ok("records", RC.verify_signature(rec, roster), "%s: signature does not verify" % rel) + ok("records", rec["id"] == record_id(RC.record_hash(rec)), "%s: id does not derive" % rel) + # Confirmed annotations are covered by the layer receipt at their content hash. + lr = js(os.path.join(R, "layer", "receipt.json")) + items = {(k, i): h for k, i, h in lr["records"]} + for a in jl(os.path.join(R, "layer", "annotations.jsonl")): + body = {k: v for k, v in a.items() if k not in ("status", "receipt", "modified")} + ok("records", a["id"].rsplit("/", 1)[1] == record_id(sha256_hex(jcs.dumpb( + {k: v for k, v in body.items() if k != "id"}))), "annotation id does not derive: " + a["id"]) + if a["status"] == "confirmed": + ok("records", items.get(("annotation", a["id"].rsplit("/", 1)[1])) == sha256_hex(jcs.dumpb(body)), + "a confirmed annotation is not covered at its hash: " + a["id"]) + ok("records", lr["root"] == crypto.merkle_root(crypto.receipt_items(lr)), "layer receipt root") + + +def state_of(pkg): + nodes = jl(os.path.join(pkg, "nodes.jsonl")) + key = js(os.path.join(pkg, "document.json"))["key"] + ids = jl(os.path.join(pkg, "ids.jsonl")) if os.path.exists(os.path.join(pkg, "ids.jsonl")) else [] + cors = jl(os.path.join(pkg, "corrections.jsonl")) if os.path.exists(os.path.join(pkg, "corrections.jsonl")) else [] + strip = ("text_hash", "match_hash", "align_key", "own_hash", "node_hash") + return CO.State(key, [{k: v for k, v in n.items() if k not in strip} for n in nodes], ids, cors) + + +def check_packages(): + team_key = crypto.team_key(bytes.fromhex(open(p("fixtures", "keys", "smithlab-team-secret.hex")).read().strip())) + pk = p("fixtures", "packages") + for d in sorted(os.listdir(pk)): + rep = PK.validate(os.path.join(pk, d), STORE, team_key if d.endswith("checks-only") else None) + ok("packages", bool(rep), "%s: %s" % (d, rep.errors[:4])) + # The checks-only export carries exactly the HMAC values of the full document. + full = state_of(os.path.join(pk, "hale2026harmonic")).doc() + keyed = hashing.compute(full, hashing.Hasher(team_key)) + for n in jl(os.path.join(pk, "hale2026harmonic.checks-only", "nodes.jsonl")): + ok("packages", all(n[k] == keyed[n["id"]][k] for k in keyed[n["id"]]), "keyed values of " + n["id"]) + # Every reported value in the hale dataset is anchored to the cell that prints it, and resolves as current. + hp = os.path.join(pk, "hale2026harmonic") + st = state_of(hp) + ds = os.path.join(hp, "datasets", "ds-hale-bond-params") + desc = js(os.path.join(ds, "datapackage.json")) + valid("packages", "dataset.schema.json", desc, "ds-hale-bond-params") + rows = {} + with open(os.path.join(ds, "data.csv"), encoding="utf-8") as f: + head = f.readline().strip().split(",") + for ln in f: + vals = dict(zip(head, ln.rstrip("\n").split(","))) + rows[vals["key"]] = vals + doc = st.doc() + for va in jl(os.path.join(ds, "anchors.jsonl")): + valid("packages", "value-anchor.schema.json", va, "anchors.jsonl") + r = AN.resolve(st, va["anchor"]) + ok("packages", r["result"] == "current", "value anchor %s/%s is %s" % (va["row"], va["field"], r["result"])) + ok("packages", norm(hashing.plain(doc, r["node"])) == rows[va["row"]][va["field"]], + "CSV value differs from its cell: %s/%s" % (va["row"], va["field"])) + for m in jl(os.path.join(hp, "derived", "mathml.jsonl")): + valid("packages", "mathml.schema.json", m, "derived/mathml.jsonl") + + +def check_invalid(): + base = p("fixtures", "invalid") + for d in sorted(os.listdir(base)): + expect = js(os.path.join(base, d, "expect.json"))["rule"] + rep = PK.validate(os.path.join(base, d, "package"), STORE) + rules = {e["rule"] for e in rep.errors} + ok("invalid", expect in rules, "%s: expected %s, got %s" % (d, expect, sorted(rules) or "no error")) + + +def V(name): + return jl(p("vectors", name)) + + +def check_vectors(): + from tools.build import parse_doubles, projection_case, sentence_doc + for c in V("canonical-json.jsonl"): + ok("vectors", jcs.dumps(parse_doubles(c["input_json"])) == c["output"], "canonical-json " + c["id"]) + for c in V("normalize.jsonl"): + ok("vectors", norm(c["input"]) == c["output"] and sha256_hex(c["output"]) == c["sha256"], "normalize " + c["id"]) + for c in V("ids.jsonl"): + if "digest" in c: + d = bytes.fromhex(c["digest"]) + ok("vectors", letter_first(d, 7) == c["node_id"] and record_id(c["digest"]) == c["record_id"], c["id"]) + else: + ok("vectors", mint_node_id(c["doc"], c["kind"], c["text_hash"], c["occurrence"]) == c["node_id"] + and jcs.dumps(["scienting-id/1", c["doc"], c["kind"], c["text_hash"], c["occurrence"]]) == c["payload"], + c["id"]) + for c in V("notation.jsonl"): + ok("vectors", fold_math(c["notation"], c["source"]) == c["canonical"], "notation " + c["id"]) + byid = {} + for c in V("projections.jsonl"): + again = projection_case(c["id"], c["runs"], c.get("note")) + ok("vectors", again == c, "projection " + c["id"]) + byid[c["id"]] = c + for g in V("projection-groups.jsonl"): + field = g.get("same") or g.get("differ") + values = {byid[x][field] for x in g["cases"]} + ok("vectors", len(values) == 1 if "same" in g else len(values) == len(g["cases"]), "group " + g["id"]) + for c in V("offsets.jsonl"): + doc, s = sentence_doc(c["runs"]) + t = hashing.plain(doc, s) + ok("vectors", t == c["plain"] and t[c["span"][0]:c["span"][1]] == c["exact"] + and [cp_to_utf16(t, x) for x in c["span"]] == c["utf16_span"], "offsets " + c["id"]) + ok("vectors", t.encode("utf-16-le")[2 * c["utf16_span"][0]:2 * c["utf16_span"][1]].decode("utf-16-le") + == c["exact"], "offsets utf16 " + c["id"]) + for c in V("hashes.jsonl"): + d = Doc(c["doc"], c["nodes"]) + vals = hashing.compute(d) + ok("vectors", vals == c["values"], "hashes " + c["id"]) + for nid, o in c["own_content"].items(): + ok("vectors", sha256_hex(jcs.dumpb(o)) == vals[nid]["own_hash"], "own content " + nid) + for c in V("addresses.jsonl"): + ok("vectors", AN.parse_address(c["address"]) == c["parsed"], "address " + c["id"]) + if c["parsed"]: + q = c["parsed"] + ok("vectors", AN.format_address(q["store"], q["key"], q["node"], q["pin"], q["span"]) == c["address"], + "address round trip " + c["id"]) + kv = {c["id"]: c for c in V("keyed.jsonl")} + k = crypto.team_key(bytes.fromhex(kv["team-key"]["secret"])) + ok("vectors", k.hex() == kv["team-key"]["key"] and crypto.key_id(k) == kv["team-key"]["key_id"], "team key") + ok("vectors", hashing.Hasher(k)(kv["team-hmac-text"]["text"]) == kv["team-hmac-text"]["text_hash_keyed"], "hmac") + ok("vectors", [crypto.page_hash(f) for f in kv["page-hashes"]["page_fps"]] == kv["page-hashes"]["page_hashes"], + "page hashes") + pkk = crypto.page_key(kv["page-key"]["page_fps"], kv["page-key"]["context"]) + ok("vectors", pkk.hex() == kv["page-key"]["key"] and hashing.Hasher(pkk)(kv["page-key"]["quote"]) + == kv["page-key"]["quote_mac"], "page key") + nh = kv["non-holder"] + ok("vectors", sha256_hex(nh["guess"]) != nh["quote_mac"] and crypto.page_key(nh["wrong_page_fps"], kv["page-key"][ + "context"]).hex() == nh["wrong_key"] != kv["page-key"]["key"], "non-holder") + stamps = js(p("registry", "stamps", "scienting-stamps-1.json"))["rules"] + fpv = {c["id"]: c for c in V("fingerprints.jsonl")} + for c in fpv.values(): + fp, removed = FP.fingerprint(c["page"], stamps) + ok("vectors", fp == c["page_fp"] and removed == c["removed"], "fingerprint " + c["id"]) + ok("vectors", fpv["acs-download-1"]["page_fp"] == fpv["acs-download-2"]["page_fp"], "ACS downloads share a page") + ok("vectors", fpv["wiley-download-1"]["page_fp"] == fpv["wiley-download-2"]["page_fp"], "Wiley downloads share") + ok("vectors", fpv["acs-download-1"]["page_fp"] != fpv["acs-changed-text"]["page_fp"], "a changed page differs") + for c in V("merkle.jsonl"): + ok("vectors", crypto.merkle_root(c["items"]) == c["root"], "merkle " + c["id"]) + for c in V("signatures.jsonl"): + if "secret" in c: + sk = bytes.fromhex(c["secret"]) + ok("vectors", crypto.ed25519_public(sk).hex() == c["public"] + and crypto.ed25519_sign(sk, c["message"].encode()).hex() == c["signature"], c["id"]) + else: + r = c["receipt"] + ok("vectors", RC.record_hash(r) == c["record_hash"] and RC.signing_payload(r).decode() == c["payload"] + and crypto.ed25519_verify(base64.b64decode(c["public"]), c["payload"].encode(), + base64.b64decode(r["signature"]["value"])), c["id"]) + for c in V("spotcheck.jsonl"): + ok("vectors", RC.sample_size(c["n"], c["rate"], c["minimum"]) == c["size"], "sample size " + c["id"]) + if "seed" in c: + seed = base64.b64decode(c["seed"]) + ok("vectors", crypto.ed25519_verify(base64.b64decode(c["checker_public"]), c["seed_payload"].encode(), seed) + and RC.sample(c["receipt"], seed, c["rate"], c["minimum"]) == c["sample"], "spot-check " + c["id"]) + for c in V("bounds.jsonl"): + ok("vectors", RC.bound_string(c["errors"], c["sampled"], c["confidence"]) == c["bound"], "bound " + c["id"]) + ok("vectors", Fraction(next(c for c in V("bounds.jsonl") if c["id"] == "k0-n300")["bound"]) < Fraction(1, 100), + "zero errors in 300 bounds the rate below 1%") + for c in V("alignment.jsonl"): + ok("vectors", AL.align(c["a"], c["b"]) == c["expect"], "alignment " + c["id"]) + for c in V("corrections.jsonl"): + st = CO.State(c["doc"], [{k: v for k, v in n.items() if k not in ( + "text_hash", "match_hash", "align_key", "own_hash", "node_hash")} for n in c["before"]["nodes"]]) + try: + st1, rec = CO.apply(st, c["correction"]) + v1 = hashing.compute(st1.doc()) + got = {"record": rec, "nodes": [dict(n, **v1[n["id"]]) for n in st1.nodes], "ids": st1.ids} + except Refusal as e: + got = {"refusal": e.rule} + ok("vectors", got == c["expect"], "correction " + c["id"]) + states = {} + for c in V("resolve.jsonl"): + st = states.setdefault(c["package"], state_of(p(c["package"]))) + valid("vectors", "anchor.schema.json", c["anchor"], "resolve " + c["id"]) + ok("vectors", AN.resolve(st, c["anchor"]) == c["expect"], "resolve " + c["id"]) + results = {c["expect"]["result"] for c in V("resolve.jsonl")} + ok("vectors", results == {"current", "changed-below", "moved", "reattached", "stale"}, "all five results occur") + for c in V("rights.jsonl"): + if "stage" in c: + w = {"rights": c["rights"], "origin": c["origin"], "sha256": c["witness_sha256"]} + uses, expired = RI.effective(w, c["policies"], c["now"]) + allowed, lacking = RI.check(c["requires"], c["processor"], uses) + ok("vectors", {"allowed": allowed, "lacking": lacking, "expired": expired} == c["expect"], "rights " + c["id"]) + elif "backend" in c: + a, f = RI.backend_allowed(c["backend"], c["profile"]) + ok("vectors", {"allowed": a, "failed": f} == c["expect"], "rights " + c["id"]) + else: + ok("vectors", RI.combine([RI.flat(r) for r in c["rights"]]) == c["expect"], "rights " + c["id"]) + for c in V("grading.jsonl"): + st = states.setdefault(c["package"], state_of(p(c["package"]))) + ok("vectors", GR.grade(c["exercise"], c["submission"], st) == c["expect"], "grading " + c["id"]) + + +def check_determinism(): + with tempfile.TemporaryDirectory() as tmp: + subprocess.run([sys.executable, p("tools", "build.py"), "--out", tmp], check=True) + for sub in ("fixtures", "vectors"): + cmp = filecmp.dircmp(p(sub), os.path.join(tmp, sub)) + diffs = [] + + def walk(c, prefix): + for f in c.left_only + c.right_only + c.diff_files + c.funny_files: + if f != "README.md" and not (prefix == "fixtures/" and f == "src"): + diffs.append(prefix + f) + for f in c.common_files: + if not filecmp.cmp(os.path.join(c.left, f), os.path.join(c.right, f), shallow=False): + diffs.append(prefix + f) + for name, s in c.subdirs.items(): + walk(s, prefix + name + "/") + + walk(cmp, sub + "/") + ok("determinism", not diffs, "rebuild differs: %s" % sorted(set(diffs))[:5]) + + +RESERVED = set(""" +ABORT ACTION ADD AFTER ALL ALTER ALWAYS ANALYZE AND ANY ARRAY AS ASC ASENSITIVE AT ATTACH AUTHORIZATION AUTOINCREMENT +BEFORE BEGIN BETWEEN BIGINT BINARY BLOB BOTH BY CALL CASCADE CASE CAST CHANGE CHAR CHARACTER CHECK COLLATE COLUMN +COMMIT CONDITION CONFLICT CONSTRAINT CONTINUE CONVERT CREATE CROSS CUBE CUME_DIST CURRENT CURRENT_DATE CURRENT_ROLE +CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR DATABASE DATABASES DEC DECIMAL DECLARE DEFAULT DEFERRABLE DEFERRED +DELAYED DELETE DENSE_RANK DESC DESCRIBE DETACH DETERMINISTIC DISTINCT DISTINCTROW DIV DO DOUBLE DROP DUAL EACH ELSE +ELSEIF EMPTY ENCLOSED END ESCAPE ESCAPED EXCEPT EXCLUDE EXCLUSIVE EXISTS EXIT EXPLAIN FAIL FALSE FETCH FILTER FIRST +FIRST_VALUE FLOAT FOLLOWING FOR FORCE FOREIGN FREEZE FROM FULL FULLTEXT FUNCTION GENERATED GET GLOB GRANT GROUP +GROUPING GROUPS HAVING HIGH_PRIORITY IF IGNORE ILIKE IMMEDIATE IN INDEX INDEXED INFILE INITIALLY INNER INOUT +INSENSITIVE INSERT INSTEAD INT INTEGER INTERSECT INTERVAL INTO IS ISNULL ITERATE JOIN JSON_TABLE KEY KEYS KILL LAG LAST +LAST_VALUE LATERAL LEAD LEADING LEAVE LEFT LIKE LIMIT LINEAR LINES LOAD LOCALTIME LOCALTIMESTAMP LOCK LONG LOOP +LOW_PRIORITY MATCH MATERIALIZED MAXVALUE MOD MODIFIES NATURAL NO NOT NOTHING NOTNULL NTH_VALUE NTILE NULL NULLS NUMERIC +OF OFFSET ON ONLY OPTIMIZE OPTION OPTIONALLY OR ORDER OTHERS OUT OUTER OVER OVERLAPS PARTITION PERCENT_RANK PLACING PLAN +PRAGMA PRECEDING PRECISION PRIMARY PROCEDURE PURGE QUERY RAISE RANGE RANK READ READS REAL RECURSIVE REFERENCES REGEXP +REINDEX RELEASE RENAME REPEAT REPLACE REQUIRE RESIGNAL RESTRICT RETURN RETURNING REVOKE RIGHT RLIKE ROLLBACK ROW ROWS +ROW_NUMBER SAVEPOINT SCHEMA SCHEMAS SELECT SENSITIVE SEPARATOR SESSION_USER SET SHOW SIGNAL SIMILAR SMALLINT SOME +SPATIAL SPECIFIC SQL SQLEXCEPTION SQLSTATE SQLWARNING SSL STARTING STORED STRAIGHT_JOIN SYMMETRIC SYSTEM SYSTEM_USER +TABLE TABLESAMPLE TEMP TEMPORARY TERMINATED THEN TIES TINYINT TO TRAILING TRANSACTION TRIGGER TRUE UNBOUNDED UNDO +UNION UNIQUE UNLOCK UNSIGNED UPDATE USAGE USE USER USING UTC_DATE UTC_TIME UTC_TIMESTAMP VACUUM VALUES VARBINARY +VARCHAR VARCHARACTER VARIADIC VARYING VERBOSE VIEW VIRTUAL WHEN WHERE WHILE WINDOW WITH WITHOUT WRITE XOR ZEROFILL +""".split()) + + +def check_sql(): + ddl = "" + for f in ("doc.sql", "store.sql", "bundle-sqlite.sql"): + ddl += open(p("sql", f), encoding="utf-8").read() + "\n" + for m in re.finditer(r"CREATE (?:VIRTUAL )?TABLE (\w+)\s*(?:USING fts5)?\(\n(.*?)\n\);", ddl, re.S): + names = [m.group(1)] + [ln.strip().split()[0] for ln in m.group(2).splitlines() + if ln.strip() and not ln.strip().startswith(("PRIMARY", "--", "'", "tokenize"))] + for n in names: + ok("sql", n.upper() not in RESERVED, "%s uses the reserved word %s" % (m.group(1), n)) + for m in re.finditer(r"CREATE INDEX (\w+) ON", ddl): + ok("sql", m.group(1).upper() not in RESERVED, "index name " + m.group(1)) + ok("sql", "FOREIGN KEY" not in ddl and "REFERENCES" not in ddl, "no foreign keys") + with tempfile.TemporaryDirectory() as tmp: + conn = sqlite3.connect(os.path.join(tmp, "bundle.db")) + db.create(conn, p("sql")) + conn.executescript(open(p("sql", "bundle-sqlite.sql"), encoding="utf-8").read()) + assets = os.path.join(tmp, "assets") + pk = p("fixtures", "packages") + for d in sorted(os.listdir(pk)): + key = db.load(conn, os.path.join(pk, d), assets) if not d.endswith("checks-only") else None + if key is None: + # A second load of the same key goes to its own database. + c2 = sqlite3.connect(":memory:") + db.create(c2, p("sql")) + key = db.load(c2, os.path.join(pk, d), assets) + h = db.unload(c2, key, os.path.join(tmp, "out", d), assets) + else: + h = db.unload(conn, key, os.path.join(tmp, "out", d), assets) + cmp = filecmp.dircmp(os.path.join(pk, d), os.path.join(tmp, "out", d)) + same = _same_tree(os.path.join(pk, d), os.path.join(tmp, "out", d)) + ok("sql", same, "%s: unload is not byte-identical" % d) + with open(os.path.join(pk, d, "MANIFEST.json"), "rb") as f: + ok("sql", sha256_hex(f.read()) == h, "%s: package hash differs after unload" % d) + # The search index over sentences, captions, headings and cells. + for doc_key, nid, kind, parent in conn.execute( + "SELECT n.doc_key, n.id, n.kind, p.kind FROM nodes n JOIN nodes p ON p.doc_key = n.doc_key AND p.id = n.parent " + "WHERE n.kind IN ('sentence', 'cell', 'equation') AND n.withheld IS NULL").fetchall(): + st = None + rows = conn.execute("SELECT doc_key, id, kind, content FROM nodes WHERE kind IN ('sentence','cell')").fetchall() + for doc_key, nid, kind, content in rows: + runs = json.loads(content) + text = "".join(r.get("text", "") if r["kind"] != "math" else "$" + r["source"] + "$" for r in runs + if r["kind"] != "equation") + conn.execute("INSERT INTO search VALUES (?,?,?,?,?)", (doc_key, nid, kind, "", norm(text))) + hits = conn.execute("SELECT node FROM search WHERE search MATCH 'scanned'").fetchall() + ok("sql", len(hits) == 1, "full-text search finds the merged sentence") + # Store records satisfy the store tables' CHECK constraints. + R = p("fixtures", "records") + lay = js(os.path.join(R, "layer", "layer.json")) + conn.execute("INSERT INTO layers VALUES (?,?,?,?,?,?,?,?)", + (lay["id"], lay.get("project"), lay["label"], lay["purpose"], lay.get("audience"), + lay["visibility"], jcs.dumps(lay["license"]), jcs.dumps(lay))) + for a in jl(os.path.join(R, "layer", "annotations.jsonl")): + conn.execute("INSERT INTO annotations VALUES (?,?,?,?,?,?,?,?)", + (a["id"], a["layer"], a["body"]["kind"], a["status"], a.get("receipt"), a["creator"]["id"], + a["created"], jcs.dumps(a))) + prj = js(os.path.join(R, "project.json")) + conn.execute("INSERT INTO projects VALUES (?,?,?,?,?,?,?)", + (prj["key"], prj.get("store"), prj["name"], prj.get("description"), jcs.dumps(prj.get("claims")), + jcs.dumps(prj.get("settings")), jcs.dumps(prj))) + for m in prj["members"]: + conn.execute("INSERT INTO members VALUES (?,?,?,?)", (prj["key"], m["person"], m["role"], jcs.dumps(m["keys"]))) + for k in js(os.path.join(R, "roster.json"))["keys"]: + conn.execute("INSERT INTO roster_keys VALUES (?,?,?,?,?,?,?,?)", + ("smithlab", k["id"], jcs.dumps(k["person"]), k["scheme"], k["public"], + jcs.dumps(k["purposes"]), k["registered_at"], k["revoked_at"])) + dg = js(os.path.join(R, "digitization.json")) + conn.execute("INSERT INTO digitizations VALUES (?,?,?,?,?,?,?,?)", + (dg["id"], dg["doc"], dg["target"]["anchor"]["node"], dg["target"].get("page_fp"), + dg["method"]["kind"], dg["confirmation"], dg.get("dataset"), jcs.dumps(dg))) + conn.commit() + ok("sql", True, "store records loaded") + + +def _same_tree(a, b): + fa = sorted(os.path.relpath(os.path.join(d, f), a) for d, _, fs in os.walk(a) for f in fs) + fb = sorted(os.path.relpath(os.path.join(d, f), b) for d, _, fs in os.walk(b) for f in fs) + return fa == fb and all(filecmp.cmp(os.path.join(a, f), os.path.join(b, f), shallow=False) for f in fa) + + +UK = re.compile(r"\b(\w*(?:colour|behaviour|favour|honour|labour|neighbour|centre|metre|litre|fibre|analys(?:e|ed|es|ing)|" + r"catalogue|licence|defence|offence|organis\w*|normalis\w*|recognis\w*|optimis\w*|minimis\w*|" + r"maximis\w*|standardis\w*|serialis\w*|canonicalis\w*|initialis\w*|summaris\w*|prioritis\w*|" + r"emphasis(?:e|ed|es|ing)|realis(?:e|ed|es|ing)|travell\w*|modell(?:ed|ing)|labell(?:ed|ing)|" + r"cancell(?:ed|ing)|signall(?:ed|ing)|programme|grey|whilst|amongst|towards|judgement|ageing|" + r"artefact)\w*)\b", re.I) +SENTENCE_BREAK = re.compile(r"[a-z0-9)\]*_`'\"]\. [A-Z]") +ABBREV = re.compile(r"\b(e\.g|i\.e|et al|cf|vs|Fig|Eq|Ref|ca|No|St|Dr|Mr|Ms|al)\. [A-Z]") + + +def check_prose(): + mds = [] + for d, dirs, fs in os.walk(ROOT): + dirs[:] = [x for x in dirs if x not in (".git", "node_modules", "__pycache__")] + mds += [os.path.join(d, f) for f in fs if f.endswith(".md")] + for path in sorted(mds): + rel = os.path.relpath(path, ROOT) + fence = False + for i, ln in enumerate(open(path, encoding="utf-8"), 1): + if ln.startswith("```"): + fence = not fence + continue + if fence: + continue + text = re.sub(r"`[^`]*`", "``", ln) + m = UK.search(text) + ok("prose", not m, "%s:%d: UK spelling %r" % (rel, i, m.group(0) if m else "")) + if not text.lstrip().startswith("|"): + body = ABBREV.sub("", re.sub(r"^\s*(#+\s+)?([0-9]+(\.[0-9]+)*\.?\s+)?(\*\*[^*]+\*\*\s*)?", "", text)) + ok("prose", not SENTENCE_BREAK.search(body), "%s:%d: one sentence per line" % (rel, i)) + + +def main(): + check_schemas() + check_registry() + check_records() + check_packages() + check_invalid() + check_vectors() + if "--quick" not in sys.argv: + check_determinism() + check_sql() + check_prose() + for k in sorted(COUNTS): + print("%-17s %5d checks" % (k, COUNTS[k])) + if FAILS: + print("\n%d failures:" % len(FAILS)) + for f in FAILS[:60]: + print(" " + f) + sys.exit(1) + print("\nAll checks pass.") + + +if __name__ == "__main__": + main() diff --git a/tools/oracle/__init__.py b/tools/oracle/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tools/oracle/align.py b/tools/oracle/align.py new file mode 100644 index 0000000..9fae18d --- /dev/null +++ b/tools/oracle/align.py @@ -0,0 +1,127 @@ +"""Whole-document sentence alignment, in the manner of a patience diff. + +Non-normative; see spec/05-hashes.md, "Alignment". +Each reading is a list of items: {"id", "strict", "lossy", "complex", "container", "context"}. +""" + +import unicodedata + +from .hashing import prose_length + +MIN_PROSE = 20 + + +def _numeric_skeleton(strict): + keep = [] + i, n = 0, len(strict) + while i < n: + ch = strict[i] + if ch in "_^" and i + 1 < n and strict[i + 1] == "{": + keep.append(strict[i:i + 2]) + i += 2 + continue + if unicodedata.category(ch) == "Nd" or ch in "\u2212.,+}": + keep.append(ch) + i += 1 + return "".join(keep) + + +def classify(a, b): + """`None` when two paired sentences agree; else the suspect kind.""" + if a["strict"] == b["strict"] and a["complex"] == b["complex"]: + return None + if _numeric_skeleton(a["strict"]) != _numeric_skeleton(b["strict"]): + return "number" + if a["complex"] != b["complex"]: + return "equation" + return "word" + + +def _lis(pairs): + """Longest subsequence increasing in B among pairs sorted by A; lexicographically smallest A on ties.""" + n = len(pairs) + if not n: + return [] + best = [1] * n + nxt = [-1] * n + for i in range(n - 1, -1, -1): + for j in range(i + 1, n): + if pairs[j][1] > pairs[i][1] and best[j] + 1 > best[i]: + best[i] = best[j] + 1 + nxt[i] = j + top = max(best) + i = next(k for k in range(n) if best[k] == top) + out = [] + while i != -1: + out.append(pairs[i]) + i = nxt[i] + return out + + +def _lcs(A, B, a0, a1, b0, b1): + """LCS over align keys of A[a0:a1] and B[b0:b1], as index pairs, with the spec's tie rule.""" + n, m = a1 - a0, b1 - b0 + L = [[0] * (m + 1) for _ in range(n + 1)] + for i in range(n - 1, -1, -1): + for j in range(m - 1, -1, -1): + if A[a0 + i]["lossy"] == B[b0 + j]["lossy"]: + L[i][j] = L[i + 1][j + 1] + 1 + else: + L[i][j] = max(L[i + 1][j], L[i][j + 1]) + out = [] + i = j = 0 + while i < n and j < m: + if A[a0 + i]["lossy"] == B[b0 + j]["lossy"]: + out.append((a0 + i, b0 + j)) + i += 1 + j += 1 + elif L[i + 1][j] >= L[i][j + 1]: + i += 1 + else: + j += 1 + return out + + +def align(A, B): + """Align reading B to reading A. Returns {"pairs": [...], "suspects": [...]}.""" + count_a, count_b = {}, {} + for x in A: + count_a[x["lossy"]] = count_a.get(x["lossy"], 0) + 1 + for x in B: + count_b[x["lossy"]] = count_b.get(x["lossy"], 0) + 1 + pos_b = {x["lossy"]: j for j, x in enumerate(B)} + cands = [ + (i, pos_b[x["lossy"]]) for i, x in enumerate(A) + if count_a[x["lossy"]] == 1 and count_b.get(x["lossy"]) == 1 and prose_length(x["lossy"]) >= MIN_PROSE + ] + anchors = _lis(cands) + pairs = [] + prev_a, prev_b = 0, 0 + for ai, bi in anchors + [(len(A), len(B))]: + pairs += _lcs(A, B, prev_a, ai, prev_b, bi) + if ai < len(A): + pairs.append((ai, bi)) + prev_a, prev_b = ai + 1, bi + 1 + out_pairs, suspects = [], [] + for ai, bi in pairs: + kind = classify(A[ai], B[bi]) + out_pairs.append({"a": A[ai]["id"], "b": B[bi]["id"], "agree": kind is None}) + if kind: + suspects.append({"kind": kind, "a": A[ai]["id"], "b": B[bi]["id"]}) + if A[ai]["context"] != B[bi]["context"]: + suspects.append({"kind": "structure", "a": A[ai]["id"], "b": B[bi]["id"]}) + for (a1, b1), (a2, b2) in zip(pairs, pairs[1:]): + if a2 == a1 + 1 and b2 == b1 + 1: + same_a = A[a1]["container"] == A[a2]["container"] + same_b = B[b1]["container"] == B[b2]["container"] + if same_a != same_b: + suspects.append({"kind": "join", "a": A[a2]["id"], "b": B[b2]["id"]}) + paired_a = {a for a, _ in pairs} + paired_b = {b for _, b in pairs} + for i, x in enumerate(A): + if i not in paired_a: + suspects.append({"kind": "dropped", "a": x["id"], "b": None}) + for j, x in enumerate(B): + if j not in paired_b: + suspects.append({"kind": "added", "a": None, "b": x["id"]}) + return {"pairs": out_pairs, "suspects": suspects} diff --git a/tools/oracle/anchors.py b/tools/oracle/anchors.py new file mode 100644 index 0000000..180d2f0 --- /dev/null +++ b/tools/oracle/anchors.py @@ -0,0 +1,264 @@ +"""Addresses, anchors and their resolution. + +Non-normative; see spec/06-anchors.md. +""" + +import re +from fractions import Fraction + +from . import hashing, jcs +from .model import CONTAINERS_WITH_CONTENT, LEAVES, RUN_KINDS, Doc, anchor_class +from .text import norm + +ADDRESS_RE = re.compile( + r"^(?:(?P[a-z0-9][a-z0-9._-]*)/)?" + r"(?P[a-z0-9][a-z0-9._-]*)" + r"#(?P[a-z0-9][a-z0-9._-]*)" + r"(?:@(?P[0-9a-f]{6}))?" + r"(?:\[(?P0|[1-9][0-9]*):(?P0|[1-9][0-9]*)\])?$" +) +QUOTE_CAP = 200 +CONTEXT_CAP = 32 + + +def parse_address(s): + m = ADDRESS_RE.match(s) + if not m: + return None + d = m.groupdict() + out = {"store": d["store"], "key": d["key"], "node": d["node"], "pin": d["pin"], "span": None} + if d["start"] is not None: + a, b = int(d["start"]), int(d["end"]) + if a > b: + return None + out["span"] = [a, b] + return out + + +def format_address(store, key, node, pin=None, span=None): + s = (store + "/" if store else "") + key + "#" + node + if pin: + s += "@" + pin[:6] + if span is not None: + s += "[%d:%d]" % tuple(span) + return s + + +def cell_context(doc, cell_id): + """Table label and the text of the row and column header paths of a cell.""" + cell = doc.nodes[cell_id] + row = doc.nodes[cell["parent"]] + table_id = doc.ancestors(cell_id)[-3] + table = doc.nodes[table_id] + cols = {c["id"]: c for c in table.get("attrs", {}).get("columns", [])} + col = cols.get(cell.get("attrs", {}).get("column"), {"header_path": []}) + + def txt(nid): + return norm(hashing.plain(doc, nid)) + + return { + "table_label": table.get("label"), + "row_path": [txt(x) for x in row.get("attrs", {}).get("header_path", [])], + "column_path": [txt(x) for x in col["header_path"]], + } + + +def make_anchor(doc, values, node, rev, span=None, store=None): + n = doc.nodes[node] + a = {"format": "scienting-anchor/1"} + if store: + a["store"] = store + a.update({"doc": doc.key, "node": node, "kind": n["kind"], "own_hash": values[node]["own_hash"], + "node_hash": values[node]["node_hash"]}) + if n["kind"] in LEAVES: + text = hashing.plain(doc, node) + if span is not None: + a["span"] = list(span) + exact = text[span[0]:span[1]] + pre, suf = text[max(0, span[0] - CONTEXT_CAP):span[0]], text[span[1]:span[1] + CONTEXT_CAP] + else: + exact, pre, suf = text, "", "" + q = {} + if len(exact) <= QUOTE_CAP: + q["exact"] = exact + else: + q["exact_hash"] = hashing.PLAIN(norm(exact)) + q["length"] = len(exact) + if pre: + q["prefix"] = pre + if suf: + q["suffix"] = suf + a["quote"] = q + if n["kind"] == "cell": + a["context"] = cell_context(doc, node) + elif anchor_class(n["kind"]) == "container-without-content": + a["leaves"] = [[x, values[x]["match_hash"]] for x in doc.leaves(node)] + a["rev"] = rev + return a + + +def _quote_hits(text, q): + """Start positions where the quote matches `text`.""" + if "exact" in q: + ex = q["exact"] + hits = [i for i in range(len(text) - len(ex) + 1) if text.startswith(ex, i)] + length = len(ex) + else: + length = q["length"] + hits = [i for i in range(len(text) - length + 1) + if hashing.PLAIN(norm(text[i:i + length])) == q["exact_hash"]] + if len(hits) > 1 and ("prefix" in q or "suffix" in q): + pre, suf = q.get("prefix", ""), q.get("suffix", "") + hits = [i for i in hits if text[:i].endswith(pre) and text[i + length:].startswith(suf)] + return hits, length + + +def _drift(state, doc, anchor, nid, threshold): + leaves = set(doc.leaves(nid)) + touched = set() + count = 0 + for c in state.corrections: + if c["index"] <= anchor["rev"]: + continue + inside = nid in (c.get("path") or []) or nid in (c.get("to_path") or []) + t = set(c.get("touched", [])) + if inside and t: + count += 1 + touched |= t + denom = len(leaves | touched) + share = Fraction(len(touched), denom) if denom else Fraction(0) + level = "none" if count == 0 else ("high" if share > threshold else "low") + return {"count": count, "share": _decimal(share), "level": level} + + +def _decimal(fr): + """A share as a decimal string with four places, rounded half up.""" + v = (fr * 10000 + Fraction(1, 2)).__floor__() + return "%d.%04d" % (v // 10000, v % 10000) + + +def _follow(state, nid): + """Follow aliases and retirements. Returns (live id or None, chain, via).""" + live = {n["id"] for n in state.nodes} + table = {e["id"]: e for e in state.ids} + chain, via = [], None + seen = set() + while nid not in live: + if nid in seen or nid not in table: + return None, chain, via + seen.add(nid) + e = table[nid] + if e["kind"] == "retired" or via is None: + via = e["kind"] + chain.append(nid) + nid = e.get("successor") + if nid is None: + return None, chain, via + return nid, chain, via + + +def _relabel_reverted_own(state, doc, nid, anchor): + """The own_hash the node had before the relabel corrections since the anchor, or None.""" + rel = [c for c in state.corrections if c["index"] > anchor["rev"] and c.get("target") == nid] + if not rel or any(c["op"] != "relabel" for c in rel): + return None + n = dict(doc.nodes[nid], label=rel[0]["from"]) + tmp = Doc(doc.key, [n if x["id"] == nid else x for x in [doc.nodes[i] for i in doc.order]]) + return hashing.PLAIN(jcs.dumpb(hashing.own_content(tmp, nid, lambda h: hashing.PLAIN( + norm(hashing.plain(tmp, h)))))) + + +def resolve(state, anchor, threshold=Fraction(1, 4)): + doc = state.doc() + values = hashing.compute(doc) + kind = anchor.get("kind") + original = anchor["node"] + nid, chain, via = _follow(state, original) + live_kind = doc.nodes[nid]["kind"] if nid else None + kind = kind or live_kind or next((e["node_kind"] for e in state.ids if e["id"] == original), None) + cls = anchor_class(kind) if kind else "leaf" + is_span = "span" in anchor + result = {"node": nid} + retired = via == "retired" + + def out(res, **kw): + r = {"result": res, "node": kw.pop("node", nid)} + if r["node"]: + r["node_hash"] = values[r["node"]]["node_hash"] + if chain: + r["via"] = chain + r.update(kw) + return r + + # The cell rule: a retired cell is found again by its table label and header paths. + def cell_rule(): + ctx = anchor.get("context") + q = anchor.get("quote") + if kind != "cell" or not ctx or not q: + return None + found = [] + for x in doc.order: + if doc.nodes[x]["kind"] != "cell": + continue + if cell_context(doc, x) != ctx: + continue + hits, ln = _quote_hits(hashing.plain(doc, x), q) + if len(hits) == 1: + found.append((x, hits[0], ln)) + if len(found) == 1: + x, i, ln = found[0] + kw = {"node": x} + if is_span: + kw["span"] = [i, i + ln] + return out("reattached", **kw) + return None + + if nid is None: + return cell_rule() or out("stale", node=None, reason="retired without a successor" if chain + else "unknown node") + + if cls == "leaf": + text = hashing.plain(doc, nid) + if not retired and values[nid]["node_hash"] == anchor["node_hash"]: + return out("current", **({"span": anchor["span"]} if is_span else {})) + q = anchor.get("quote") + if retired: + if q: + hits, ln = _quote_hits(text, q) + if (is_span and len(hits) == 1) or (not is_span and hits): + return out("moved", **({"span": [hits[0], hits[0] + ln]} if is_span else {})) + return cell_rule() or out("stale", reason="the successor does not contain the quote") + if q: + hits, ln = _quote_hits(text, q) + if len(hits) == 1: + return out("reattached", **({"span": [hits[0], hits[0] + ln]} if is_span else {})) + own = _relabel_reverted_own(state, doc, nid, anchor) + if own is not None and own == anchor["own_hash"]: + return out("reattached", reason="relabel") + return out("stale", reason="the node changed and the quote does not occur exactly once") + + if cls == "container-with-content": + if values[nid]["own_hash"] == anchor["own_hash"]: + if retired: + return out("moved") + if values[nid]["node_hash"] == anchor["node_hash"]: + return out("current") + return out("changed-below", drift=_drift(state, doc, anchor, nid, threshold)) + if not retired: + own = _relabel_reverted_own(state, doc, nid, anchor) + if own is not None and own == anchor["own_hash"]: + return out("reattached", reason="relabel") + return out("stale", reason="the node's own content changed") + + # Container without content. + if retired: + orig = anchor.get("leaves", []) + now = set(doc.leaves(nid)) + now_match = {values[x]["match_hash"] for x in now} + held = sum(1 for i, m in orig if i in now or m in now_match) + if orig and 2 * held >= len(orig): + return out("moved") + return out("stale", reason="the successor holds fewer than half of the original leaves") + if values[nid]["node_hash"] == anchor["node_hash"]: + return out("current") + return out("changed-below", drift=_drift(state, doc, anchor, nid, threshold)) diff --git a/tools/oracle/corrections.py b/tools/oracle/corrections.py new file mode 100644 index 0000000..ff04ee6 --- /dev/null +++ b/tools/oracle/corrections.py @@ -0,0 +1,387 @@ +"""Corrections on an established document. + +Non-normative; see spec/11-corrections.md. +""" + +import copy + +from . import hashing +from .model import LABELLED, LEAVES, MATH_KINDS, RUN_KINDS, VERBATIM_KINDS, Doc, CHILDREN +from .tree import Refusal, canonical_runs, mint_ids, validate_structure, _flatten +from . import jcs +from .text import digits, record_id, sha256_hex + +MERGEABLE = RUN_KINDS | {"paragraph", "list", "item", "quote", "caption", "figure-note", "table-note"} +SETTABLE = { + "section": {"level"}, + "table": {"columns"}, + "cell": {"column", "rowspan", "colspan", "role"}, + "row": {"header_path"}, + "list": {"ordered"}, + "item": {"marker"}, + "theorem": {"variant"}, +} +EDITABLE_RUN_FIELD = {"text": "text", "link": "text", "cite": "text", "xref": "text", "fnmark": "text", "math": "source"} + + +class State: + """The current state of a document: nodes, the ID table and the corrections applied.""" + + def __init__(self, key, nodes, ids=None, corrections=None): + self.key = key + self.nodes = [dict(n) for n in nodes] + self.ids = [dict(e) for e in (ids or [])] + self.corrections = [dict(c) for c in (corrections or [])] + + @property + def rev(self): + return len(self.corrections) + + def doc(self): + return Doc(self.key, self.nodes) + + def used_ids(self): + return {n["id"] for n in self.nodes} | {e["id"] for e in self.ids} + + +def _strings(node): + """Editable strings of a leaf: (path, value) pairs.""" + k = node["kind"] + if k in RUN_KINDS: + out = [] + for i, r in enumerate(node["content"]): + f = EDITABLE_RUN_FIELD.get(r["kind"]) + if f: + out.append(((i, f), r[f])) + return out + if k in MATH_KINDS: + return [(("source",), node["content"]["source"])] + if k in VERBATIM_KINDS: + return [(("text",), node["content"]["text"])] + return [] + + +def _occurrences(s, find): + return [i for i in range(len(s) - len(find) + 1) if s.startswith(find, i)] + + +def _set_string(node, path, value): + if len(path) == 2: + i, f = path + node["content"][i] = dict(node["content"][i], **{f: value}) + else: + node["content"] = dict(node["content"], **{path[0]: value}) + + +def _has_crop(c): + return any(e.get("kind") == "crop" for e in c.get("evidence", [])) + + +def _rebuild(nodes): + """Recompute document order and `ord` from parent links, keeping sibling order as listed.""" + by_id = {n["id"]: n for n in nodes} + kids = {} + root = None + for n in nodes: + if n.get("parent") is None: + root = n["id"] + else: + kids.setdefault(n["parent"], []).append(n["id"]) + for p in kids: + kids[p].sort(key=lambda c: by_id[c]["ord"]) + out = [] + stack = [root] + while stack: + x = stack.pop() + out.append(by_id[x]) + for i, c in enumerate(kids.get(x, [])): + by_id[c]["ord"] = i + stack.extend(reversed(kids.get(x, []))) + return out + + +def _subtree(doc, nid): + return doc.preorder(nid) + + +def _place(nodes, nid, parent, after): + """Give `nid` a fractional position under `parent` after sibling `after` (None: first).""" + by_id = {n["id"]: n for n in nodes} + sibs = sorted([n for n in nodes if n.get("parent") == parent and n["id"] != nid], key=lambda n: n["ord"]) + for i, s in enumerate(sibs): + s["ord"] = 2 * i + 2 + if after is None: + pos = 0 + else: + if after not in by_id or by_id[after].get("parent") != parent: + raise Refusal("correction.target", "`place_after` is not a child of the parent") + pos = by_id[after]["ord"] + 1 + by_id[nid]["parent"] = parent + by_id[nid]["ord"] = pos + + +def apply(state, c, hasher=hashing.PLAIN): + """Apply correction `c` to `state` and return the recorded correction. Raises Refusal.""" + c = copy.deepcopy(c) + doc = state.doc() + before_vals = hashing.compute(doc, hasher) + nodes = [copy.deepcopy(n) for n in state.nodes] + by_id = {n["id"]: n for n in nodes} + op = c["op"] + target = c.get("target") + if op != "insert" or "target" in c: + if target not in by_id: + raise Refusal("correction.target", "no live node %s" % target) + if target == doc.root and op in ("delete", "move", "merge", "reclassify"): + raise Refusal("correction.target", "the root cannot be " + op + "d") + record = {"format": "scienting-correction/1", "index": state.rev + 1} + retired, created = [], [] + path = doc.ancestors(target) if target in by_id else None + touched = [] + + if op == "replace": + node = by_id[target] + find, repl = c.get("find", ""), c["replace"] + if not find: + raise Refusal("correction.find", "find must not be empty") + hits = [] + for pth, s in _strings(node): + if "run" in c and (len(pth) != 2 or pth[0] != c["run"]): + continue + hits += [(pth, s, i) for i in _occurrences(s, find)] + if len(hits) != 1: + raise Refusal("correction.find", "find occurs %d times, not exactly once" % len(hits), target) + pth, s, i = hits[0] + if isinstance(repl, str): + _set_string(node, pth, s[:i] + repl + s[i + len(find):]) + else: + if len(pth) != 2 or node["content"][pth[0]]["kind"] != "text": + raise Refusal("correction.replace", "runs may replace text only inside a text run", target) + if any(r["kind"] == "equation" for r in repl): + raise Refusal("correction.replace", "equation runs are added by insert", target) + run = node["content"][pth[0]] + style = {"style": run["style"]} if "style" in run else {} + mid = [dict({"kind": "text", "text": s[:i]}, **style)] + list(repl) + [ + dict({"kind": "text", "text": s[i + len(find):]}, **style) + ] + node["content"] = node["content"][: pth[0]] + mid + node["content"][pth[0] + 1:] + if node["kind"] in RUN_KINDS: + node["content"] = canonical_runs(node["content"]) + touched = [target] + + elif op == "insert" and "node" in c: + if not _has_crop(c): + raise Refusal("correction.evidence", "an insert needs crop evidence") + parent = c["parent"] + if parent not in by_id: + raise Refusal("correction.target", "no live parent %s" % parent) + flat = [] + _flatten(copy.deepcopy(c["node"]), None, 0, flat) + new = mint_ids(state.key, flat, state.used_ids()) + new[0]["parent"] = parent + nodes.extend(new) + _place(nodes, new[0]["id"], parent, c.get("place_after")) + nodes = _rebuild(nodes) + created = [n["id"] for n in new] + tmp = Doc(state.key, nodes) + touched = [x for x in tmp.leaves(new[0]["id"])] + path = tmp.ancestors(new[0]["id"]) + target = new[0]["id"] + + elif op == "insert": + if not _has_crop(c): + raise Refusal("correction.evidence", "an insert needs crop evidence") + node = by_id[target] + if node["kind"] not in RUN_KINDS: + raise Refusal("correction.insert", "text is inserted into runs", target) + r = node["content"][c["run"]] + f = EDITABLE_RUN_FIELD.get(r["kind"]) + if not f or not (0 <= c["offset"] <= len(r[f])): + raise Refusal("correction.insert", "bad run or offset", target) + node["content"][c["run"]] = dict(r, **{f: r[f][: c["offset"]] + c["text"] + r[f][c["offset"]:]}) + node["content"] = canonical_runs(node["content"]) + touched = [target] + + elif op == "delete": + gone = _subtree(doc, target) + touched = [x for x in gone if doc.nodes[x]["kind"] in LEAVES] + nodes = _rebuild([n for n in nodes if n["id"] not in set(gone)]) + retired = [(x, None) for x in gone] + + elif op == "split": + node = by_id[target] + if node["kind"] != "sentence": + raise Refusal("correction.split", "only sentences are split", target) + k = c["offset"] + first, second, pos = [], [], 0 + total = len(hashing.plain_runs(node["content"], doc)) + if not 0 < k < total: + raise Refusal("correction.split", "offset must fall inside the sentence", target) + for r in node["content"]: + ln = len(hashing.plain_runs([r], doc)) + if pos + ln <= k: + first.append(r) + elif pos >= k: + second.append(r) + elif r["kind"] == "text": + cut = k - pos + first.append(dict(r, text=r["text"][:cut])) + second.append(dict(r, text=r["text"][cut:])) + else: + raise Refusal("correction.split", "the offset falls inside a %s run" % r["kind"], target) + pos += ln + _strip_edge(first, end=True) + _strip_edge(second, end=False) + first, second = canonical_runs(first), canonical_runs(second) + if not first or not second: + raise Refusal("correction.split", "both parts must keep text", target) + new_spec = {"kind": "sentence", "content": second} + eq_second = [r["node"] for r in second if r["kind"] == "equation"] + flat = [dict(new_spec, _parent=None, ord=0)] + tmp_nodes = mint_ids(state.key, [dict(flat[0], content=[ + {"kind": "text", "text": hashing.plain_runs(second, doc)}])], state.used_ids()) + new_id = tmp_nodes[0]["id"] + node["content"] = first + new_node = {"id": new_id, "kind": "sentence", "parent": node["parent"], "ord": 0, "content": second} + if "fidelity" in node: + new_node["fidelity"] = node["fidelity"] + nodes.append(new_node) + _place(nodes, new_id, node["parent"], target) + for i, e in enumerate(eq_second): + by_id[e]["parent"] = new_id + by_id[e]["ord"] = i + nodes = _rebuild(nodes) + created = [new_id] + touched = [target, new_id] + + elif op == "merge": + other = c["with"] + node = by_id[target] + if other not in by_id: + raise Refusal("correction.target", "no live node %s" % other) + o = by_id[other] + if node["kind"] != o["kind"] or node["kind"] not in MERGEABLE: + raise Refusal("correction.merge", "merge joins two nodes of one mergeable kind", target) + if o.get("parent") != node.get("parent") or o["ord"] != node["ord"] + 1: + raise Refusal("correction.merge", "merge joins a node with its next sibling", target) + if node["kind"] in RUN_KINDS: + joiner = c.get("joiner", " ") + mid = [{"kind": "text", "text": joiner}] if joiner else [] + node["content"] = canonical_runs(node["content"] + mid + o["content"]) + touched = [target, other] + else: + touched = [x for x in doc.leaves(other) if x != other] + base = len(doc.kids(target)) + for i, kid in enumerate(doc.kids(other)): + by_id[kid]["parent"] = target + by_id[kid]["ord"] = base + i + nodes = _rebuild([n for n in nodes if n["id"] != other]) + retired = [(other, target)] + + elif op == "move": + parent = c["parent"] + if parent not in by_id or parent in set(_subtree(doc, target)): + raise Refusal("correction.move", "bad destination", target) + _place(nodes, target, parent, c.get("place_after")) + nodes = _rebuild(nodes) + touched = [x for x in doc.leaves(target)] + record["to_path"] = Doc(state.key, nodes).ancestors(target) + + elif op == "reclassify": + node = by_id[target] + new_kind = c["kind"] + old = node["kind"] + same_shape = (old in RUN_KINDS) == (new_kind in RUN_KINDS) and (old in MATH_KINDS) == ( + new_kind in MATH_KINDS) and (old in VERBATIM_KINDS) == (new_kind in VERBATIM_KINDS) + if new_kind not in CHILDREN or not same_shape: + raise Refusal("correction.reclassify", "%s cannot become %s" % (old, new_kind), target) + node["kind"] = new_kind + if new_kind not in LABELLED: + node.pop("label", None) + record["from"] = old + touched = [x for x in doc.leaves(target)] + + elif op == "relabel": + node = by_id[target] + if node["kind"] not in LABELLED: + raise Refusal("correction.relabel", "%s takes no label" % node["kind"], target) + record["from"] = node.get("label") + node["label"] = c["label"] + touched = [target] if node["kind"] in LEAVES else [] + + elif op == "set": + node = by_id[target] + attr = c["attr"] + if attr not in SETTABLE.get(node["kind"], ()): + raise Refusal("correction.set", "%s cannot be set on %s" % (attr, node["kind"]), target) + attrs = dict(node.get("attrs", {})) + record["from"] = attrs.get(attr) + attrs[attr] = c["value"] + node["attrs"] = attrs + touched = [target] if node["kind"] in LEAVES else [] + + else: + raise Refusal("correction.op", "unknown operation " + op) + + after_doc = Doc(state.key, nodes) + validate_structure(after_doc) + after_vals = hashing.compute(after_doc, hasher) + + # Digits: a change to a digit needs crop evidence, and no leaf outside `touched` may change its digits. + needs_crop = False + if op == "replace": + rep = c["replace"] if isinstance(c["replace"], str) else hashing.plain_runs(c["replace"], doc) + needs_crop = digits(c["find"]) != digits(rep) + elif op == "delete": + needs_crop = any(digits(hashing.plain(doc, x)) for x in touched) + elif op == "relabel": + needs_crop = digits(record.get("from") or "") != digits(c.get("label") or "") + if needs_crop and not _has_crop(c): + raise Refusal("correction.digits", "a digit changed without crop evidence", target) + for nid in doc.leaves(doc.root): + if nid in after_doc.nodes and nid not in touched: + if digits(hashing.plain(doc, nid)) != digits(hashing.plain(after_doc, nid)): + raise Refusal("correction.digits", "an undeclared digit change", nid) + + for k in ("op", "target", "find", "replace", "run", "offset", "text", "parent", "place_after", "node", "with", + "joiner", "kind", "label", "attr", "value", "evidence", "author", "reason", "at"): + if k in c: + record[k] = c[k] + if op == "insert" and "node" in c: + record["target"] = target + record["before"] = before_vals[target]["node_hash"] if target in before_vals else None + record["after"] = after_vals[target]["node_hash"] if target in after_vals else None + record["path"] = path + record["touched"] = sorted(set(touched)) + if created: + record["created"] = created + if retired: + record["retired"] = [r[0] for r in retired] + record["id"] = record_id(sha256_hex(jcs.dumpb({k: v for k, v in record.items() if k != "id"}))) + + old_kinds = {n["id"]: n["kind"] for n in state.nodes} + new_ids = list(state.ids) + for rid, succ in retired: + new_ids.append({"id": rid, "kind": "retired", "successor": succ, "node_kind": old_kinds[rid], + "rev": record["index"]}) + new_state = State(state.key, [after_doc.nodes[x] for x in after_doc.preorder()], new_ids, + state.corrections + [record]) + return new_state, record + + +def _strip_edge(runs, end): + from .text import is_ws + if not runs: + return + i = len(runs) - 1 if end else 0 + r = runs[i] + if r["kind"] != "text": + return + t = r["text"] + if end: + while t and is_ws(t[-1]): + t = t[:-1] + else: + while t and is_ws(t[0]): + t = t[1:] + runs[i] = dict(r, text=t) diff --git a/tools/oracle/crypto.py b/tools/oracle/crypto.py new file mode 100644 index 0000000..47f7903 --- /dev/null +++ b/tools/oracle/crypto.py @@ -0,0 +1,194 @@ +"""Keyed hashing, key derivation, Merkle roots and Ed25519. + +Non-normative; see spec/05-hashes.md and spec/08-fidelity.md. +Ed25519 follows the reference code of RFC 8032, section 6; it is slow and is meant only for test vectors. +""" + +import hashlib +import hmac + +from . import jcs + + +def hkdf(ikm, salt, info, length=32): + """HKDF-SHA-256, RFC 5869.""" + prk = hmac.new(salt, ikm, hashlib.sha256).digest() + out, t, i = b"", b"", 1 + while len(out) < length: + t = hmac.new(prk, t + info + bytes([i]), hashlib.sha256).digest() + out += t + i += 1 + return out[:length] + + +def team_key(secret): + return hkdf(secret, b"scienting-team-key/1", b"scienting-hash/1") + + +def key_id(key): + return hashlib.sha256(b"scienting-key-id/1" + key).hexdigest()[:16] + + +def page_hash(page_fp_hex): + return hashlib.sha256(b"scienting-page-hash/1" + bytes.fromhex(page_fp_hex)).hexdigest() + + +def page_key(page_fps_hex, context): + ikm = b"".join(bytes.fromhex(h) for h in page_fps_hex) + return hkdf(ikm, b"scienting-page-key/1", context.encode("utf-8")) + + +# --- Merkle trees (RFC 6962 hashing) ------------------------------------------ + + +def _leaf(data): + return hashlib.sha256(b"\x00" + data).digest() + + +def _node(left, right): + return hashlib.sha256(b"\x01" + left + right).digest() + + +def _mth(leaves): + n = len(leaves) + if n == 1: + return leaves[0] + k = 1 + while k * 2 < n: + k *= 2 + return _node(_mth(leaves[:k]), _mth(leaves[k:])) + + +def merkle_root(items): + """Root over receipt items: each item is a list such as ["node", id, hash].""" + if not items: + raise ValueError("a Merkle root needs at least one item") + return _mth([_leaf(jcs.dumpb(list(it))) for it in items]).hex() + + +def receipt_items(receipt): + items = [["node", nid, h] for nid, h in receipt.get("nodes", [])] + items += [list(r) for r in receipt.get("records", [])] + return items + + +# --- Ed25519 (RFC 8032) ------------------------------------------------------- + +_p = 2**255 - 19 +_d = -121665 * pow(121666, _p - 2, _p) % _p +_q = 2**252 + 27742317777372353535851937790883648493 + + +def _sha512(b): + return hashlib.sha512(b).digest() + + +def _inv(x): + return pow(x, _p - 2, _p) + + +def _add(P, Q): + A = (P[1] - P[0]) * (Q[1] - Q[0]) % _p + B = (P[1] + P[0]) * (Q[1] + Q[0]) % _p + C = 2 * P[3] * Q[3] * _d % _p + D = 2 * P[2] * Q[2] % _p + E, F, G, H = B - A, D - C, D + C, B + A + return (E * F % _p, G * H % _p, F * G % _p, E * H % _p) + + +def _mul(s, P): + Q = (0, 1, 1, 0) + while s > 0: + if s & 1: + Q = _add(Q, P) + P = _add(P, P) + s >>= 1 + return Q + + +def _equal(P, Q): + if (P[0] * Q[2] - Q[0] * P[2]) % _p != 0: + return False + return (P[1] * Q[2] - Q[1] * P[2]) % _p == 0 + + +_modp_sqrt_m1 = pow(2, (_p - 1) // 4, _p) + + +def _recover_x(y, sign): + if y >= _p: + return None + x2 = (y * y - 1) * _inv(_d * y * y + 1) + if x2 == 0: + return None if sign else 0 + x = pow(x2, (_p + 3) // 8, _p) + if (x * x - x2) % _p != 0: + x = x * _modp_sqrt_m1 % _p + if (x * x - x2) % _p != 0: + return None + if (x & 1) != sign: + x = _p - x + return x + + +_gy = 4 * _inv(5) % _p +_gx = _recover_x(_gy, 0) +_G = (_gx, _gy, 1, _gx * _gy % _p) + + +def _compress(P): + zinv = _inv(P[2]) + x = P[0] * zinv % _p + y = P[1] * zinv % _p + return int.to_bytes(y | ((x & 1) << 255), 32, "little") + + +def _decompress(s): + if len(s) != 32: + return None + y = int.from_bytes(s, "little") + sign = y >> 255 + y &= (1 << 255) - 1 + x = _recover_x(y, sign) + if x is None: + return None + return (x, y, 1, x * y % _p) + + +def _secret_expand(secret): + h = _sha512(secret) + a = int.from_bytes(h[:32], "little") + a &= (1 << 254) - 8 + a |= 1 << 254 + return a, h[32:] + + +def ed25519_public(secret): + a, _ = _secret_expand(secret) + return _compress(_mul(a, _G)) + + +def ed25519_sign(secret, msg): + a, prefix = _secret_expand(secret) + A = _compress(_mul(a, _G)) + r = int.from_bytes(_sha512(prefix + msg), "little") % _q + R = _compress(_mul(r, _G)) + h = int.from_bytes(_sha512(R + A + msg), "little") % _q + s = (r + h * a) % _q + return R + int.to_bytes(s, 32, "little") + + +def ed25519_verify(public, msg, signature): + if len(public) != 32 or len(signature) != 64: + return False + A = _decompress(public) + if not A: + return False + R = _decompress(signature[:32]) + if not R: + return False + s = int.from_bytes(signature[32:], "little") + if s >= _q: + return False + h = int.from_bytes(_sha512(signature[:32] + public + msg), "little") % _q + return _equal(_mul(s, _G), _add(R, _mul(h, A))) diff --git a/tools/oracle/db.py b/tools/oracle/db.py new file mode 100644 index 0000000..06cc9a6 --- /dev/null +++ b/tools/oracle/db.py @@ -0,0 +1,248 @@ +"""The database form: loading a package into tables and unloading it again. + +Non-normative; see spec/13-database.md. +Loading is a pure function of the package, and unloading gives back the same bytes. +""" + +import json +import os +import shutil + +from . import jcs +from .package import read_json, read_jsonl, write +from .text import sha256_hex + +STRUCTURED = {"MANIFEST.json", "document.json", "witnesses.json", "provenance.json", "roster.json", "nodes.jsonl", + "pages.jsonl", "locations.jsonl", "references.jsonl", "corrections.jsonl", "receipts.jsonl", + "ids.jsonl", "suspects.jsonl"} + + +def J(v): + return None if v is None else jcs.dumps(v) + + +def P(s): + return None if s is None else json.loads(s) + + +def B(v): + return None if v is None else (1 if v else 0) + + +def _opt(d, k, v): + if v is not None: + d[k] = v + + +def ins(conn, into, values): + conn.execute("INSERT %s VALUES (%s)" % (into, ",".join("?" * len(values))), values) + + +def create(conn, sql_dir): + for name in ("doc.sql", "store.sql"): + with open(os.path.join(sql_dir, name), encoding="utf-8") as f: + conn.executescript(f.read()) + + +def load(conn, root, asset_store): + """Load the package at `root`. Files without tables go to `asset_store`, by SHA-256.""" + manifest = read_json(os.path.join(root, "MANIFEST.json")) + listed = {f["path"]: f for f in manifest["files"]} + + def jl(name): + return read_jsonl(os.path.join(root, name)) if name in listed else [] + + d = read_json(os.path.join(root, "document.json")) + key = d["key"] + with open(os.path.join(root, "MANIFEST.json"), "rb") as f: + package_hash = sha256_hex(f.read()) + prov = read_json(os.path.join(root, "provenance.json")) + roster = read_json(os.path.join(root, "roster.json")) if "roster.json" in listed else None + conn.execute("INSERT OR IGNORE INTO works VALUES (?, ?)", (d["work"]["key"], J(d["work"]["same_as"]))) + ins(conn, "INTO documents", (key, d.get("store"), J(d.get("aliases")), d["kind"], J(d["work"]), J(d["version"]), J(d["relations"]), + J(d["meta"]), d["language"], J(d.get("license")), d["policy"], J(d["hashing"]), d["root"], d["meta_hash"], + d["rev"], J(d["counts"]), J(d["fidelity"]), J(prov), J(roster), package_hash)) + for i, w in enumerate(read_json(os.path.join(root, "witnesses.json"))["witnesses"]): + ins(conn, "INTO witnesses", (key, w["id"], i, w["sha256"], w["size"], w["kind"], w["media_type"], w.get("pages"), + B(w.get("text_layer")), w.get("version_label"), J(w["origin"]), J(w["rights"]))) + for seq, n in enumerate(jl("nodes.jsonl")): + ins(conn, "INTO nodes", (key, n["id"], seq, n["kind"], n["parent"], n["ord"], n.get("label"), J(n.get("attrs")), + J(n.get("content")), B(n.get("withheld")), n.get("fidelity"), J(n.get("prov")), + n["text_hash"], n["match_hash"], n["align_key"], n["own_hash"], n["node_hash"])) + if isinstance(n.get("content"), list): + ords = 0 + for r in n["content"]: + if r["kind"] == "cite": + for ref in r["refs"]: + ins(conn, "OR IGNORE INTO citations", (key, n["id"], ref, ords)) + ords += 1 + for p in jl("pages.jsonl"): + ins(conn, "INTO pages", (key, p["witness"], p["page"], p["page_fp"], J(p["size"]), p.get("page_label"), + B(p["text_layer"]), J(p.get("stamps_removed")))) + for l in jl("locations.jsonl"): + ins(conn, "INTO locations", (key, l["node"], l["page_fp"], l["page"], l.get("page_label"), J(l["boxes"]), B(l.get("approx")))) + for r in jl("references.jsonl"): + ins(conn, "INTO refs", (key, r["node"], r.get("label"), J(r.get("csl")), J(r["resolution"]))) + main = ("format", "index", "id", "op", "target", "evidence", "author", "reason", "at", "before", "after", "path", + "touched") + for c in jl("corrections.jsonl"): + details = {k: v for k, v in c.items() if k not in main} + ins(conn, "INTO corrections", (key, c["index"], c["id"], c["op"], c.get("target"), J(c["evidence"]), J(c["author"]), + c["reason"], c["at"], c["before"], c["after"], J(c["path"]), J(c["touched"]), J(details))) + for e in jl("ids.jsonl"): + ins(conn, "INTO node_ids", (key, e["id"], e["kind"], e["successor"], e.get("node_kind"), e.get("rev"))) + for r in jl("receipts.jsonl"): + if r["format"] == "scienting-receipt/1": + ins(conn, "INTO receipts", (key, r["id"], r["level"], r["scope"], r["rev"], r["root"], J(r["nodes"]), + J(r.get("records")), J(r["evidence"]), r["by"], r["at"], J(r.get("qa")), + r.get("export_of"), J(r.get("keyed")), J(r["signature"]))) + for nid, h in r["nodes"]: + ins(conn, "INTO receipt_nodes", (r["id"], key, nid, h)) + else: + per = r.get("period") or {} + ins(conn, "INTO revocations", (key, r["id"], r.get("receipt"), r.get("signer"), per.get("from"), per.get("to"), + r["reason"], r["by"], r["at"], J(r["signature"]))) + for s in jl("suspects.jsonl"): + ins(conn, "INTO suspects", (key, s["id"], s["kind"], s.get("node"), J(s))) + os.makedirs(asset_store, exist_ok=True) + for path, f in listed.items(): + if path in STRUCTURED: + continue + present = f.get("present", True) + ins(conn, "INTO package_files", (key, path, f["sha256"], f["size"], 1 if present else 0)) + if present: + shutil.copyfile(os.path.join(root, path), os.path.join(asset_store, f["sha256"])) + return key + + +def _q(conn, sql, args): + cur = conn.execute(sql, args) + cols = [c[0] for c in cur.description] + return [dict(zip(cols, row)) for row in cur.fetchall()] + + +def unload(conn, key, out, asset_store): + """Write the package for `key` from the tables into `out`. Returns the package hash.""" + files = {} + d = _q(conn, "SELECT * FROM documents WHERE doc_key = ?", (key,))[0] + doc = {"format": "scienting-doc/1", "key": key} + _opt(doc, "store", d["store"]) + _opt(doc, "aliases", P(d["aliases"])) + doc.update({"kind": d["kind"], "work": P(d["work"]), "version": P(d["version"]), "relations": P(d["relations"]), + "meta": P(d["meta"]), "language": d["language"]}) + _opt(doc, "license", P(d["license"])) + doc.update({"policy": d["policy"], "hashing": P(d["hashing"]), "root": d["root_hash"], + "meta_hash": d["meta_hash"], "rev": d["rev"], "counts": P(d["counts"]), "fidelity": P(d["fidelity"])}) + + def put(name, rec): + files[name] = (jcs.dumps(rec) + "\n").encode("utf-8") + + def putl(name, recs): + if recs: + files[name] = "".join(jcs.dumps(r) + "\n" for r in recs).encode("utf-8") + + put("document.json", doc) + put("provenance.json", P(d["provenance"])) + if d["roster"] is not None: + put("roster.json", P(d["roster"])) + ws = [] + for w in _q(conn, "SELECT * FROM witnesses WHERE doc_key = ? ORDER BY ord", (key,)): + rec = {"id": w["id"], "sha256": w["sha256"], "size": w["size"], "kind": w["kind"], "media_type": w["media_type"]} + _opt(rec, "pages", w["pages"]) + _opt(rec, "text_layer", None if w["text_layer"] is None else bool(w["text_layer"])) + _opt(rec, "version_label", w["version_label"]) + rec.update({"origin": P(w["origin"]), "rights": P(w["rights"])}) + ws.append(rec) + put("witnesses.json", {"witnesses": ws}) + nodes = [] + for n in _q(conn, "SELECT * FROM nodes WHERE doc_key = ? ORDER BY seq", (key,)): + rec = {"id": n["id"], "kind": n["kind"], "parent": n["parent"], "ord": n["ord"]} + _opt(rec, "label", n["label"]) + _opt(rec, "attrs", P(n["attrs"])) + _opt(rec, "content", P(n["content"])) + if n["withheld"]: + rec["withheld"] = True + _opt(rec, "fidelity", n["fidelity"]) + _opt(rec, "prov", P(n["prov"])) + for h in ("text_hash", "match_hash", "align_key", "own_hash", "node_hash"): + rec[h] = n[h] + nodes.append(rec) + putl("nodes.jsonl", nodes) + seq = {n["id"]: i for i, n in enumerate(nodes)} + pages = [] + for p in _q(conn, "SELECT * FROM pages WHERE doc_key = ? ORDER BY witness, page", (key,)): + rec = {"witness": p["witness"], "page": p["page"], "page_fp": p["page_fp"], "size": P(p["size"])} + _opt(rec, "page_label", p["page_label"]) + rec["text_layer"] = bool(p["text_layer"]) + _opt(rec, "stamps_removed", P(p["stamps_removed"])) + pages.append(rec) + putl("pages.jsonl", pages) + locs = [] + for l in _q(conn, "SELECT * FROM locations WHERE doc_key = ?", (key,)): + rec = {"node": l["node"], "page_fp": l["page_fp"], "page": l["page"]} + _opt(rec, "page_label", l["page_label"]) + rec["boxes"] = P(l["boxes"]) + if l["approx"]: + rec["approx"] = True + locs.append(rec) + locs.sort(key=lambda r: (seq[r["node"]], r["page"], r["page_fp"])) + putl("locations.jsonl", locs) + refs = [] + for r in _q(conn, "SELECT * FROM refs WHERE doc_key = ?", (key,)): + rec = {"node": r["node"]} + _opt(rec, "label", r["label"]) + _opt(rec, "csl", P(r["csl"])) + rec["resolution"] = P(r["resolution"]) + refs.append(rec) + refs.sort(key=lambda r: seq[r["node"]]) + putl("references.jsonl", refs) + cors = [] + for c in _q(conn, "SELECT * FROM corrections WHERE doc_key = ? ORDER BY idx", (key,)): + rec = {"format": "scienting-correction/1", "index": c["idx"], "id": c["id"], "op": c["op"]} + _opt(rec, "target", c["target"]) + rec.update({"evidence": P(c["evidence"]), "author": P(c["author"]), "reason": c["reason"], "at": c["made_at"], + "before": c["before_hash"], "after": c["after_hash"], "path": P(c["path"]), + "touched": P(c["touched"])}) + rec.update(P(c["details"])) + cors.append(rec) + putl("corrections.jsonl", cors) + ids = [] + for e in _q(conn, "SELECT * FROM node_ids WHERE doc_key = ?", (key,)): + rec = {"id": e["id"], "kind": e["kind"], "successor": e["successor"]} + _opt(rec, "node_kind", e["node_kind"]) + _opt(rec, "rev", e["rev"]) + ids.append(rec) + ids.sort(key=lambda e: (0 if e["kind"] == "alias" else 1, e.get("rev", 0), e["id"])) + putl("ids.jsonl", ids) + recs = [] + for r in _q(conn, "SELECT * FROM receipts WHERE doc_key = ?", (key,)): + rec = {"format": "scienting-receipt/1", "id": r["id"], "doc": key, "rev": r["rev"], "level": r["level"], + "scope": r["scope"], "nodes": P(r["nodes"])} + _opt(rec, "records", P(r["records"])) + rec.update({"root": r["root"], "evidence": P(r["evidence"]), "by": r["signer"], "at": r["made_at"]}) + _opt(rec, "qa", P(r["qa"])) + _opt(rec, "export_of", r["export_of"]) + _opt(rec, "keyed", P(r["keyed"])) + rec["signature"] = P(r["signature"]) + recs.append(rec) + for r in _q(conn, "SELECT * FROM revocations WHERE doc_key = ?", (key,)): + rec = {"format": "scienting-revocation/1", "id": r["id"]} + _opt(rec, "receipt", r["receipt"]) + _opt(rec, "signer", r["revoked_signer"]) + if r["period_from"] is not None: + rec["period"] = {"from": r["period_from"], "to": r["period_to"]} + rec.update({"reason": r["reason"], "by": r["signer"], "at": r["made_at"], "signature": P(r["signature"])}) + recs.append(rec) + recs.sort(key=lambda r: (r["at"], r["id"])) + putl("receipts.jsonl", recs) + sus = [P(s["record"]) for s in _q(conn, "SELECT * FROM suspects WHERE doc_key = ?", (key,))] + sus.sort(key=lambda s: s["id"]) + putl("suspects.jsonl", sus) + absent = [] + for f in _q(conn, "SELECT * FROM package_files WHERE doc_key = ?", (key,)): + if f["present"]: + with open(os.path.join(asset_store, f["sha256"]), "rb") as fh: + files[f["path"]] = fh.read() + else: + absent.append({"path": f["path"], "sha256": f["sha256"], "size": f["size"], "present": False}) + return write(out, files, absent) diff --git a/tools/oracle/fingerprint.py b/tools/oracle/fingerprint.py new file mode 100644 index 0000000..30c25a6 --- /dev/null +++ b/tools/oracle/fingerprint.py @@ -0,0 +1,61 @@ +"""Page fingerprints, scienting-page/1, and download-stamp rules, scienting-stamps/1. + +Non-normative; see spec/07-geometry.md. +""" + +import math +import re +import unicodedata + +from . import jcs +from .notation import fold_plain_text +from .text import is_ws, norm, sha256_hex + + +def round_point(x): + """Round half up to a whole point.""" + return int(math.floor(x + 0.5)) + + +def _in_margin(box, size, margin): + x0, y0, x1, y1 = box + w, h = size + return x1 <= margin or x0 >= w - margin or y1 <= margin or y0 >= h - margin + + +def is_stamp(line, size, rules): + text = norm(line["text"]) + for r in rules: + if r.get("where", "any") == "margin": + if "box" not in line or not _in_margin(line["box"], size, r.get("margin", 36)): + continue + if re.search(r["pattern"], text, re.IGNORECASE | re.ASCII): + return r["id"] + return None + + +def fp_text(text): + s = unicodedata.normalize("NFKC", fold_plain_text(text)) + return "".join(c for c in s if not is_ws(c) and unicodedata.category(c) not in ("Cc", "Cf")) + + +def fingerprint(page, rules): + """`page`: {"size": [w, h], "lines": [{"text", "box"?}], "images": [sha256...]}. + + Returns (fingerprint, removed stamp rule IDs in line order). + """ + size = page["size"] + kept, removed = [], [] + for line in page.get("lines", []): + rid = is_stamp(line, size, rules) + if rid: + removed.append(rid) + else: + kept.append(line["text"]) + payload = { + "format": "scienting-page/1", + "size": [round_point(size[0]), round_point(size[1])], + "text": fp_text(" ".join(kept)), + "images": sorted(page.get("images", [])), + } + return sha256_hex(jcs.dumpb(payload)), removed diff --git a/tools/oracle/grade.py b/tools/oracle/grade.py new file mode 100644 index 0000000..e799bff --- /dev/null +++ b/tools/oracle/grade.py @@ -0,0 +1,90 @@ +"""Grading a scienting-submission/1 against a scienting-exercise/1 key. + +Non-normative; see spec/19-exercises.md. +""" + +from fractions import Fraction + +from . import anchors as A +from .tree import Refusal + + +def dec(fr): + fr = Fraction(fr) + if fr.denominator == 1: + return str(fr.numerator) + s = "%.4f" % float(fr) + return s.rstrip("0").rstrip(".") + + +def _resolved(state, anchor): + r = A.resolve(state, anchor) + if r["result"] == "stale": + return None + return r["node"], r.get("span") + + +def _match(state, rule, student, key): + s, k = _resolved(state, student), _resolved(state, key) + if not s or not k or s[0] != k[0]: + return False + if rule.get("match") == "overlap" and k[1] is not None: + if s[1] is None: + return True + lo, hi = max(s[1][0], k[1][0]), min(s[1][1], k[1][1]) + size = k[1][1] - k[1][0] + return size > 0 and Fraction(max(0, hi - lo), size) >= Fraction(rule.get("min_overlap", "0.5")) + return True + + +def _any(state, rule, students, keys): + return any(_match(state, rule, s, k) for s in students for k in keys) + + +def key_anchors(body): + key = body["key"] + out = [] + for el in key.get("elements", []) + key.get("chain", []) + key.get("errors", []): + out += el["anchors"] + return out + + +def grade(body, submission, state): + for a in key_anchors(body): + if A.resolve(state, a)["result"] == "stale": + raise Refusal("grade.key-stale", "an anchor in the key is stale") + kind, key, rule, ans = body["exercise"], body["key"], body.get("rule", {}), submission["answers"] + items = [] + + def item(name, pts, got, fb): + items.append({"element": name, "points": dec(pts if got else 0), "max": dec(pts), "feedback": fb}) + + if kind in ("anchor", "check"): + if kind == "check": + v = key["verdict"] + ok = ans.get("verdict") == v["value"] + item("verdict", Fraction(v["points"]), ok, v.get("feedback", {}).get("hit" if ok else "miss", "")) + for i, el in enumerate(key["elements"]): + ok = _any(state, rule, ans.get("anchors", []), el["anchors"]) + item("element:%d" % i, Fraction(el["points"]), ok, el.get("feedback", {}).get("hit" if ok else "miss", "")) + elif kind == "trace": + chain = ans.get("chain", []) + for i, link in enumerate(key["chain"]): + ok = i < len(chain) and _any(state, rule, chain[i], link["anchors"]) + item("link:%d" % i, Fraction(link["points"]), ok, link.get("feedback", {}).get("hit" if ok else "miss", "")) + elif kind == "reproduce": + ok = abs(Fraction(ans["value"]) - Fraction(key["value"])) <= Fraction(key["tolerance"]) + item("value", Fraction(key["points"]), ok, key.get("feedback", {}).get("hit" if ok else "miss", "")) + elif kind == "verify": + flags = ans.get("flags", []) + for i, err in enumerate(key["errors"]): + hit = [f for f in flags if _any(state, rule, [f["anchor"]], err["anchors"])] + ok = any(f["verdict"] == err["verdict"] for f in hit) + fb = err.get("feedback", {}).get("hit" if ok else "miss", "") + item("error:%d" % i, Fraction(err["points"]), ok, fb) + else: + raise Refusal("grade.kind", "unknown exercise kind " + kind) + score = sum(Fraction(x["points"]) for x in items) + total = sum(Fraction(x["max"]) for x in items) + return {"format": "scienting-grade/1", "submission": submission["id"], "exercise": submission["exercise"], + "score": dec(score), "max": dec(total), "items": items} diff --git a/tools/oracle/hashing.py b/tools/oracle/hashing.py new file mode 100644 index 0000000..bd9eb88 --- /dev/null +++ b/tools/oracle/hashing.py @@ -0,0 +1,244 @@ +"""The plain, strict and lossy projections, and the five content values. + +Non-normative; see spec/05-hashes.md. +""" + +import hashlib +import hmac +import unicodedata + +from . import jcs +from .model import LABELLED, MATH_KINDS, RUN_KINDS, VERBATIM_KINDS +from .notation import complex_key, fold_math, fold_plain_text, fold_styled_script +from .text import collapse_ws, is_ws, norm, remove_ws, trim + +OBJ = "\ufffc" +MARK_OPEN = "\ufff9" +MARK_CLOSE = "\ufffb" + + +class Hasher: + """SHA-256, or HMAC-SHA-256 under a key: every content value uses the same function.""" + + def __init__(self, key=None): + self.key = key + + def __call__(self, data): + if isinstance(data, str): + data = data.encode("utf-8") + if self.key is None: + return hashlib.sha256(data).hexdigest() + return hmac.new(self.key, data, hashlib.sha256).hexdigest() + + +PLAIN = Hasher() + + +# --- runs -------------------------------------------------------------------- + + +def _eq_source(doc, run): + eq = doc.nodes[run["node"]] + return eq["content"]["source"], eq["content"]["notation"] + + +def plain_runs(runs, doc=None): + out = [] + for r in runs: + k = r["kind"] + if k in ("text", "link", "cite", "xref", "fnmark"): + out.append(r["text"]) + elif k == "math": + out.append("$" + r["source"] + "$") + elif k == "equation": + src, _ = _eq_source(doc, r) + out.append("$$" + src + "$$") + else: + raise ValueError("run kind " + k) + return "".join(out) + + +def _strict_math(notation, source, complexes): + folded = fold_math(notation, source) + if folded is None: + complexes.append(complex_key(notation, source)) + return OBJ + return folded + + +def _finish_strict(s): + s = unicodedata.normalize("NFKC", s) + return trim(collapse_ws(s)) + + +def strict_runs_raw(runs, doc, complexes): + out = [] + for r in runs: + k = r["kind"] + if k == "text": + st = r.get("style", []) + if "sup" in st: + out.append(fold_styled_script("^", r["text"])) + elif "sub" in st: + out.append(fold_styled_script("_", r["text"])) + else: + out.append(fold_plain_text(r["text"])) + elif k == "link": + out.append(fold_plain_text(r["text"])) + elif k == "math": + out.append(_strict_math(r["notation"], r["source"], complexes)) + elif k == "equation": + src, notation = _eq_source(doc, r) + out.append(_strict_math(notation, src, complexes)) + elif k in ("cite", "xref", "fnmark"): + out.append(MARK_OPEN + remove_ws(unicodedata.normalize("NFC", r["text"])) + MARK_CLOSE) + else: + raise ValueError("run kind " + k) + return "".join(out) + + +def lossy_from_strict(s): + out = [] + stack = [] + i, n = 0, len(s) + while i < n: + ch = s[i] + if ch in "_^" and i + 1 < n and s[i + 1] == "{": + stack.append("s") + i += 2 + continue + if ch == "{": + stack.append("t") + out.append(ch) + elif ch == "}": + if stack: + if stack.pop() == "t": + out.append(ch) + else: + out.append(ch) + elif ch == MARK_OPEN: + j = s.find(MARK_CLOSE, i) + i = n if j < 0 else j + 1 + continue + else: + out.append(ch) + i += 1 + t = unicodedata.normalize("NFKC", "".join(out).casefold()) + return "".join( + c for c in t if not is_ws(c) and unicodedata.category(c) != "Pd" and c != "\u00ad" + ) + + +def prose_length(lossy): + return sum(1 for c in lossy if c != OBJ) + + +# --- nodes ------------------------------------------------------------------- + + +def plain(doc, nid): + n = doc.nodes[nid] + k = n["kind"] + if k in RUN_KINDS: + return plain_runs(n["content"], doc) + if k in MATH_KINDS: + return "$$" + n["content"]["source"] + "$$" + if k in VERBATIM_KINDS: + return n["content"]["text"] + return " ".join(plain(doc, x) for x in doc.text_leaves(nid)) + + +def strict(doc, nid): + """The strict canonical projection and the node's complex math keys, in order.""" + n = doc.nodes[nid] + k = n["kind"] + complexes = [] + if k in RUN_KINDS: + s = strict_runs_raw(n["content"], doc, complexes) + elif k in MATH_KINDS: + s = _strict_math(n["content"]["notation"], n["content"]["source"], complexes) + elif k in VERBATIM_KINDS: + s = n["content"]["text"] + else: + parts = [] + for x in doc.text_leaves(nid): + p, c = strict(doc, x) + parts.append(p) + complexes.extend(c) + return _finish_strict(" ".join(parts)), complexes + return _finish_strict(s), complexes + + +def lossy(doc, nid): + return lossy_from_strict(strict(doc, nid)[0]) + + +def _runs_for_own(runs): + out = [] + for r in runs: + if r["kind"] == "equation": + out.append({"kind": "equation"}) + else: + out.append(r) + return out + + +def own_content(doc, nid, text_hash_of=None): + n = doc.nodes[nid] + k = n["kind"] + o = {"kind": k} + attrs = n.get("attrs", {}) + if k in LABELLED: + o["label"] = n.get("label") + if k in RUN_KINDS: + o["runs"] = _runs_for_own(n["content"]) + if k in MATH_KINDS: + o["notation"] = n["content"]["notation"] + o["source"] = n["content"]["source"] + if k in VERBATIM_KINDS: + o["language"] = n["content"].get("language") + o["text"] = n["content"]["text"] + if k == "section": + o["level"] = attrs["level"] + heads = [c for c in doc.kids(nid) if doc.nodes[c]["kind"] == "heading"] + o["heading"] = text_hash_of(heads[0]) if heads else None + if k == "table": + o["columns"] = attrs.get("columns", []) + if k == "cell": + o["column"] = attrs.get("column") + o["rowspan"] = attrs.get("rowspan", 1) + o["colspan"] = attrs.get("colspan", 1) + o["role"] = attrs.get("role", "data") + if k == "theorem": + o["variant"] = attrs.get("variant") + return o + + +def compute(doc, hasher=PLAIN): + """Compute the five content values of every node, bottom up. Returns {id: {...}}.""" + values = {} + + def text_hash(nid): + return values[nid]["text_hash"] if nid in values else hasher(norm(plain(doc, nid))) + + for nid in reversed(doc.preorder()): + s, _ = strict(doc, nid) + th = hasher(norm(plain(doc, nid))) + own = hasher(jcs.dumpb(own_content(doc, nid, text_hash))) + node = hasher(jcs.dumpb({"own": own, "children": [values[c]["node_hash"] for c in doc.kids(nid)]})) + values[nid] = { + "text_hash": th, + "match_hash": hasher(s), + "align_key": hasher(lossy_from_strict(s)), + "own_hash": own, + "node_hash": node, + } + return values + + +def meta_object(document): + return {k: document.get(k) for k in ("work", "version", "relations", "meta", "language", "license")} + + +def meta_hash(document, hasher=PLAIN): + return hasher(jcs.dumpb(meta_object(document))) diff --git a/tools/oracle/jcs.py b/tools/oracle/jcs.py new file mode 100644 index 0000000..731030b --- /dev/null +++ b/tools/oracle/jcs.py @@ -0,0 +1,110 @@ +"""Canonical JSON, RFC 8785 (JSON Canonicalization Scheme). + +Non-normative. +The normative rule is spec/01-conventions.md; this module exists so the vectors can be generated and checked. +""" + +import math + +_ESC = { + 0x08: "\\b", + 0x09: "\\t", + 0x0A: "\\n", + 0x0C: "\\f", + 0x0D: "\\r", + 0x22: '\\"', + 0x5C: "\\\\", +} + + +def _string(s): + out = ['"'] + for ch in s: + cp = ord(ch) + if 0xD800 <= cp <= 0xDFFF: + raise ValueError("lone surrogate in string") + if cp in _ESC: + out.append(_ESC[cp]) + elif cp < 0x20: + out.append("\\u%04x" % cp) + else: + out.append(ch) + out.append('"') + return "".join(out) + + +def _number(x): + """ECMAScript Number.prototype.toString, as RFC 8785 requires.""" + if isinstance(x, bool): + raise TypeError("bool is not a number") + if isinstance(x, int): + if abs(x) > 2**53: + raise ValueError("integer outside the IEEE 754 exact range") + return str(x) + if not math.isfinite(x): + raise ValueError("NaN and Infinity are not JSON") + if x == 0: + return "0" + if x < 0: + return "-" + _number(-x) + # Shortest round-trip digits, as ECMAScript requires. + r = repr(x) + if "e" in r or "E" in r: + mant, exp = r.lower().split("e") + exp = int(exp) + else: + mant, exp = r, 0 + if "." in mant: + ip, fp = mant.split(".") + else: + ip, fp = mant, "" + digits = (ip + fp).lstrip("0") + # Position of the decimal point relative to the start of `digits`. + lead_zeros = len(ip + fp) - len((ip + fp).lstrip("0")) + n = len(ip) - lead_zeros + exp + digits = digits.rstrip("0") or "0" + k = len(digits) + if k <= n <= 21: + return digits + "0" * (n - k) + if 0 < n <= 21: + return digits[:n] + "." + digits[n:] + if -6 < n <= 0: + return "0." + "0" * (-n) + digits + e = n - 1 + sign = "+" if e >= 0 else "-" + if k == 1: + return digits + "e" + sign + str(abs(e)) + return digits[0] + "." + digits[1:] + "e" + sign + str(abs(e)) + + +def _key(s): + # RFC 8785 sorts member names by their UTF-16 code units. + return s.encode("utf-16-be") + + +def dumps(value): + """Serialize `value` to canonical JSON text.""" + if value is None: + return "null" + if value is True: + return "true" + if value is False: + return "false" + if isinstance(value, str): + return _string(value) + if isinstance(value, (int, float)): + return _number(value) + if isinstance(value, (list, tuple)): + return "[" + ",".join(dumps(v) for v in value) + "]" + if isinstance(value, dict): + for k in value: + if not isinstance(k, str): + raise TypeError("object keys must be strings") + items = sorted(value.items(), key=lambda kv: _key(kv[0])) + return "{" + ",".join(_string(k) + ":" + dumps(v) for k, v in items) + "}" + raise TypeError("not JSON: %r" % type(value)) + + +def dumpb(value): + """Canonical JSON as UTF-8 bytes.""" + return dumps(value).encode("utf-8") diff --git a/tools/oracle/model.py b/tools/oracle/model.py new file mode 100644 index 0000000..fc0dd1e --- /dev/null +++ b/tools/oracle/model.py @@ -0,0 +1,150 @@ +"""The node tree of scienting-doc/1. + +Non-normative; see spec/03-nodes.md. +""" + +BLOCKS = frozenset( + ["paragraph", "equation", "figure", "table", "list", "quote", "code", "algorithm", "theorem", "footnote"] +) + +# Allowed child kinds for each node kind. +CHILDREN = { + "document": frozenset(["front", "section", "back"]), + "front": frozenset(["title", "authors", "abstract", "keywords", "notes"]), + "title": frozenset(["sentence"]), + "authors": frozenset(), + "abstract": BLOCKS | {"section"}, + "keywords": frozenset(), + "notes": frozenset(["footnote", "paragraph"]), + "section": BLOCKS | {"heading", "section"}, + "heading": frozenset(["sentence"]), + "paragraph": frozenset(["sentence"]), + "sentence": frozenset(["equation"]), + "equation": frozenset(["equation-line"]), + "equation-line": frozenset(), + "figure": frozenset(["panel", "caption", "figure-note"]), + "panel": frozenset(), + "caption": frozenset(["sentence"]), + "figure-note": frozenset(["sentence"]), + "table": frozenset(["caption", "table-head", "table-body", "table-note"]), + "table-head": frozenset(["row"]), + "table-body": frozenset(["row"]), + "table-note": frozenset(["sentence"]), + "row": frozenset(["cell"]), + "cell": frozenset(), + "list": frozenset(["item"]), + "item": BLOCKS, + "quote": BLOCKS, + "code": frozenset(), + "algorithm": frozenset(), + "theorem": BLOCKS, + "footnote": frozenset(["sentence"]), + "back": frozenset(["acknowledgments", "references", "appendix", "notes"]), + "acknowledgments": BLOCKS, + "references": frozenset(["reference"]), + "reference": frozenset(), + "appendix": frozenset(["section"]), +} +KINDS = frozenset(CHILDREN) + +# Kinds that must have at least one child. +NONEMPTY = frozenset( + ["title", "heading", "paragraph", "caption", "figure-note", "table-note", "table-head", "table-body", + "row", "list", "item", "quote", "theorem", "footnote", "appendix"] +) +# Kinds that occur at most once among their siblings. +AT_MOST_ONCE = frozenset( + ["front", "back", "title", "authors", "abstract", "keywords", "caption", "table-head", "table-body", + "acknowledgments", "references"] +) + +RUN_KINDS = frozenset(["sentence", "cell", "reference", "authors", "keywords"]) +MATH_KINDS = frozenset(["equation", "equation-line"]) +VERBATIM_KINDS = frozenset(["code", "algorithm"]) +LEAVES = RUN_KINDS | MATH_KINDS | VERBATIM_KINDS +CONTAINERS_WITH_CONTENT = frozenset(["section", "figure", "panel", "table", "theorem", "footnote"]) +CONTAINERS_WITHOUT_CONTENT = KINDS - LEAVES - CONTAINERS_WITH_CONTENT +LABELLED = frozenset( + ["section", "figure", "panel", "table", "theorem", "footnote", "equation", "equation-line", "reference", + "code", "algorithm"] +) + +RUNS = frozenset(["text", "math", "cite", "xref", "fnmark", "link", "equation"]) +STYLES = frozenset(["em", "strong", "sup", "sub", "sc", "mono"]) + +LEVELS = ["F0", "F1", "F2", "F3"] + + +def anchor_class(kind): + if kind in LEAVES: + return "leaf" + if kind in CONTAINERS_WITH_CONTENT: + return "container-with-content" + return "container-without-content" + + +class Doc: + """A document: nodes by ID with parent and order, plus document order.""" + + def __init__(self, key, nodes): + self.key = key + self.nodes = {} + self.order = [] + self.children = {} + for n in nodes: + self.nodes[n["id"]] = n + self.order.append(n["id"]) + self.children.setdefault(n["id"], []) + for nid in self.order: + p = self.nodes[nid].get("parent") + if p is not None: + self.children.setdefault(p, []).append(nid) + for p, kids in self.children.items(): + kids.sort(key=lambda c: self.nodes[c]["ord"]) + roots = [nid for nid in self.order if self.nodes[nid].get("parent") is None] + self.root = roots[0] if roots else None + + def kids(self, nid): + return self.children.get(nid, []) + + def preorder(self, nid=None): + nid = self.root if nid is None else nid + out = [] + stack = [nid] + while stack: + x = stack.pop() + out.append(x) + stack.extend(reversed(self.kids(x))) + return out + + def ancestors(self, nid): + out = [] + p = self.nodes[nid].get("parent") + while p is not None: + out.append(p) + p = self.nodes[p].get("parent") + return list(reversed(out)) + + def text_leaves(self, nid): + """The text-bearing nodes a container's projections are made of, in document order.""" + out = [] + stack = [nid] + while stack: + x = stack.pop() + n = self.nodes[x] + k = n["kind"] + if k in RUN_KINDS or k in VERBATIM_KINDS or (k == "equation" and self._parent_kind(x) != "sentence"): + out.append(x) + continue + if k == "equation-line" or k == "equation": + continue + stack.extend(reversed(self.kids(x))) + return out + + def leaves(self, nid): + """Every leaf below or at `nid`, including equations inside sentences and equation lines.""" + return [x for x in self.preorder(nid) if self.nodes[x]["kind"] in LEAVES] + + def _parent_kind(self, nid): + p = self.nodes[nid].get("parent") + return None if p is None else self.nodes[p]["kind"] diff --git a/tools/oracle/notation.py b/tools/oracle/notation.py new file mode 100644 index 0000000..41434b6 --- /dev/null +++ b/tools/oracle/notation.py @@ -0,0 +1,476 @@ +"""Simple notation and its canonical linear form. + +Non-normative; the rules are spec/05-hashes.md, "The strict projection". +A math source or a styled script either folds to one canonical linear form, or is complex. +""" + +import unicodedata + +from .text import collapse_ws, is_ws, remove_ws, trim + +MINUS = "\u2212" +DOT = "\u22c5" +PRIME = "\u2032" + +# Characters that fold to one canonical character inside notation. +CHAR_FOLD = { + "-": MINUS, + "\u2013": MINUS, + "\u2212": MINUS, + "\u00b7": DOT, + "\u2219": DOT, + "\u22c5": DOT, + "'": PRIME, + "\u2032": PRIME, +} + +OPERATORS = set("+=/<>.,()") | {MINUS, DOT, PRIME, "\u00d7", "\u2264", "\u2265", "\u00b1"} + +TEX_GREEK = { + "alpha": "\u03b1", "beta": "\u03b2", "gamma": "\u03b3", "delta": "\u03b4", + "epsilon": "\u03f5", "varepsilon": "\u03b5", "zeta": "\u03b6", "eta": "\u03b7", + "theta": "\u03b8", "vartheta": "\u03d1", "iota": "\u03b9", "kappa": "\u03ba", + "varkappa": "\u03f0", "lambda": "\u03bb", "mu": "\u03bc", "nu": "\u03bd", + "xi": "\u03be", "pi": "\u03c0", "varpi": "\u03d6", "rho": "\u03c1", + "varrho": "\u03f1", "sigma": "\u03c3", "varsigma": "\u03c2", "tau": "\u03c4", + "upsilon": "\u03c5", "phi": "\u03d5", "varphi": "\u03c6", "chi": "\u03c7", + "psi": "\u03c8", "omega": "\u03c9", + "Gamma": "\u0393", "Delta": "\u0394", "Theta": "\u0398", "Lambda": "\u039b", + "Xi": "\u039e", "Pi": "\u03a0", "Sigma": "\u03a3", "Upsilon": "\u03a5", + "Phi": "\u03a6", "Psi": "\u03a8", "Omega": "\u03a9", +} +TEX_SYMBOLS = { + "times": "\u00d7", "cdot": DOT, "pm": "\u00b1", "le": "\u2264", "leq": "\u2264", + "ge": "\u2265", "geq": "\u2265", "lt": "<", "gt": ">", "prime": PRIME, + "AA": "\u00c5", +} +TEX_WRAPPERS = {"mathrm", "text", "textrm", "mathup"} +TEX_DECLARATIONS = {"rm"} +TEX_SPACES = {"quad", "qquad", "enspace", "thinspace", "medspace", "thickspace"} +TEX_SPACE_SYMBOLS = {",", ";", ":", "!", " "} + +TYPST_GREEK = { + "alpha": "\u03b1", "beta": "\u03b2", "gamma": "\u03b3", "delta": "\u03b4", + "epsilon": "\u03b5", "zeta": "\u03b6", "eta": "\u03b7", "theta": "\u03b8", + "iota": "\u03b9", "kappa": "\u03ba", "lambda": "\u03bb", "mu": "\u03bc", + "nu": "\u03bd", "xi": "\u03be", "omicron": "\u03bf", "pi": "\u03c0", + "rho": "\u03c1", "sigma": "\u03c3", "tau": "\u03c4", "upsilon": "\u03c5", + "phi": "\u03c6", "chi": "\u03c7", "psi": "\u03c8", "omega": "\u03c9", + "Alpha": "\u0391", "Beta": "\u0392", "Gamma": "\u0393", "Delta": "\u0394", + "Epsilon": "\u0395", "Zeta": "\u0396", "Eta": "\u0397", "Theta": "\u0398", + "Iota": "\u0399", "Kappa": "\u039a", "Lambda": "\u039b", "Mu": "\u039c", + "Nu": "\u039d", "Xi": "\u039e", "Omicron": "\u039f", "Pi": "\u03a0", + "Rho": "\u03a1", "Sigma": "\u03a3", "Tau": "\u03a4", "Upsilon": "\u03a5", + "Phi": "\u03a6", "Chi": "\u03a7", "Psi": "\u03a8", "Omega": "\u03a9", + "epsilon.alt": "\u03f5", "theta.alt": "\u03d1", "phi.alt": "\u03d5", + "pi.alt": "\u03d6", "rho.alt": "\u03f1", "sigma.alt": "\u03c2", + "kappa.alt": "\u03f0", "beta.alt": "\u03d0", +} +TYPST_SYMBOLS = { + "plus": "+", "minus": MINUS, "times": "\u00d7", "dot": DOT, "dot.op": DOT, + "dot.c": DOT, "plus.minus": "\u00b1", "lt": "<", "gt": ">", "lt.eq": "\u2264", + "gt.eq": "\u2265", "eq": "=", "prime": PRIME, "slash": "/", +} +TYPST_WRAPPERS = {"upright"} +TYPST_SPACES = {"thin", "med", "thick", "quad", "wide", "space"} + + +class NotSimple(Exception): + pass + + +def is_letter(ch): + """A Latin or Greek letter, or the micro sign.""" + if ch == "\u00b5": + return True + if not unicodedata.category(ch).startswith("L"): + return False + name = unicodedata.name(ch, "") + return name.startswith("LATIN ") or name.startswith("GREEK ") + + +def fold_char(ch): + return CHAR_FOLD.get(ch, ch) + + +def is_simple_char(ch): + ch = fold_char(ch) + return is_letter(ch) or unicodedata.category(ch) == "Nd" or ch in OPERATORS + + +def script_type(ch): + d = unicodedata.decomposition(ch) + if d.startswith(""): + return "^", "".join(chr(int(h, 16)) for h in d.split()[1:]) + if d.startswith(""): + return "_", "".join(chr(int(h, 16)) for h in d.split()[1:]) + return None, None + + +class Atom: + __slots__ = ("base", "primes", "sub", "sup") + + def __init__(self, base=""): + self.base = base + self.primes = 0 + self.sub = None + self.sup = None + + +def _canon(atoms): + out = [] + for a in atoms: + if a.sup is not None and a.sup and all( + x.base == PRIME and x.sub is None and x.sup is None and x.primes == 0 for x in a.sup + ): + a.primes += len(a.sup) + a.sup = None + s = a.base + PRIME * a.primes + if a.sub is not None: + s += "_{" + _canon(a.sub) + "}" + if a.sup is not None: + s += "^{" + _canon(a.sup) + "}" + out.append(s) + return "".join(out) + + +def _attach(atoms, op, arg): + if not atoms: + atoms.append(Atom("")) + a = atoms[-1] + if op == "_": + if a.sub is not None: + raise NotSimple("double subscript") + a.sub = arg + else: + if a.sup is not None: + raise NotSimple("double superscript") + a.sup = arg + + +def _char_atom(ch): + if not is_simple_char(ch): + raise NotSimple("character %r" % ch) + return Atom(fold_char(ch)) + + +# --- TeX --------------------------------------------------------------------- + + +def _tex_tokens(src): + toks = [] + i, n = 0, len(src) + while i < n: + ch = src[i] + if ch == "\\": + j = i + 1 + if j < n and src[j].isascii() and src[j].isalpha(): + while j < n and src[j].isascii() and src[j].isalpha(): + j += 1 + toks.append(("cw", src[i + 1:j])) + while j < n and is_ws(src[j]): + j += 1 + i = j + continue + if j < n: + toks.append(("cs", src[j])) + i = j + 1 + continue + raise NotSimple("trailing backslash") + if is_ws(ch) or ch == "~": + i += 1 + continue + toks.append(("ch", ch)) + i += 1 + return toks + + +class _TexParser: + def __init__(self, toks): + self.t = toks + self.i = 0 + + def peek(self): + return self.t[self.i] if self.i < len(self.t) else None + + def take(self): + tok = self.peek() + self.i += 1 + return tok + + def seq(self, closing): + atoms = [] + while True: + tok = self.peek() + if tok is None: + if closing: + raise NotSimple("unclosed group") + return atoms + if tok == ("ch", "}"): + if not closing: + raise NotSimple("unbalanced brace") + self.take() + return atoms + self.take() + kind, val = tok + if kind == "ch" and val in "_^": + _attach(atoms, val, self.arg()) + elif kind == "ch" and val == "'": + if not atoms: + atoms.append(Atom("")) + atoms[-1].primes += 1 + elif kind == "ch" and val == "{": + inner = self.seq(True) + nxt = self.peek() + if nxt in (("ch", "_"), ("ch", "^")) and len(inner) != 1: + raise NotSimple("script on a multi-atom group") + atoms.extend(inner) + else: + atoms.extend(self.command_or_char(kind, val)) + + def command_or_char(self, kind, val): + if kind == "ch": + return [_char_atom(val)] + if kind == "cs": + if val in TEX_SPACE_SYMBOLS: + return [] + raise NotSimple("control symbol \\" + val) + if val in TEX_GREEK: + return [Atom(TEX_GREEK[val])] + if val in TEX_SYMBOLS: + return [Atom(TEX_SYMBOLS[val])] + if val in TEX_SPACES or val in TEX_DECLARATIONS: + return [] + if val in TEX_WRAPPERS: + return self.arg() + if val in ("left", "right"): + tok = self.take() + if tok in (("ch", "("), ("ch", ")")): + return [Atom(tok[1])] + raise NotSimple("\\left or \\right with another delimiter") + raise NotSimple("command \\" + val) + + def arg(self): + tok = self.take() + if tok is None: + raise NotSimple("missing argument") + kind, val = tok + if tok == ("ch", "{"): + return self.seq(True) + if kind == "ch" and val in "}_^'": + raise NotSimple("bad argument") + return self.command_or_char(kind, val) + + +def tex_atoms(src): + return _TexParser(_tex_tokens(src)).seq(False) + + +# --- Typst ------------------------------------------------------------------- + + +def _typst_tokens(src): + toks = [] + i, n = 0, len(src) + while i < n: + ch = src[i] + if is_ws(ch): + i += 1 + continue + if ch == '"': + j = i + 1 + buf = [] + while j < n and src[j] != '"': + if src[j] == "\\": + raise NotSimple("escape in string") + buf.append(src[j]) + j += 1 + if j >= n: + raise NotSimple("unclosed string") + toks.append(("str", "".join(buf))) + i = j + 1 + continue + if unicodedata.category(ch).startswith("L"): + j = i + while j < n and ( + unicodedata.category(src[j]).startswith("L") + or (src[j] == "." and j + 1 < n and src[j + 1].isascii() and src[j + 1].isalpha() and j > i) + ): + j += 1 + toks.append(("id", src[i:j])) + i = j + continue + if unicodedata.category(ch) == "Nd": + j = i + while j < n and unicodedata.category(src[j]) == "Nd": + j += 1 + if j + 1 < n and src[j] == "." and unicodedata.category(src[j + 1]) == "Nd": + j += 1 + while j < n and unicodedata.category(src[j]) == "Nd": + j += 1 + toks.append(("num", src[i:j])) + i = j + continue + two = src[i:i + 2] + if two in ("<=", ">="): + toks.append(("ch", "\u2264" if two == "<=" else "\u2265")) + i += 2 + continue + if two in ("->", "=>", "!=", "<-", "==", ":="): + raise NotSimple("operator " + two) + toks.append(("ch", ch)) + i += 1 + return toks + + +class _TypstParser: + def __init__(self, toks): + self.t = toks + self.i = 0 + + def peek(self): + return self.t[self.i] if self.i < len(self.t) else None + + def take(self): + tok = self.peek() + self.i += 1 + return tok + + def seq(self, closing): + atoms = [] + while True: + tok = self.peek() + if tok is None: + if closing: + raise NotSimple("unclosed parenthesis") + return atoms + if closing and tok == ("ch", ")"): + self.take() + return atoms + self.take() + kind, val = tok + if kind == "ch" and val in "_^": + _attach(atoms, val, self.arg()) + elif kind == "ch" and val == "'": + if not atoms: + atoms.append(Atom("")) + atoms[-1].primes += 1 + elif kind == "ch" and val == "(": + atoms.append(Atom("(")) + atoms.extend(self.seq(True)) + atoms.append(Atom(")")) + else: + atoms.extend(self.single(kind, val)) + + def single(self, kind, val): + if kind == "num": + return [Atom(c) for c in val] + if kind == "str": + return [_char_atom(c) for c in remove_ws(val)] + if kind == "id": + if len(val) == 1: + return [_char_atom(val)] + if val in TYPST_GREEK: + return [Atom(TYPST_GREEK[val])] + if val in TYPST_SYMBOLS: + return [Atom(TYPST_SYMBOLS[val])] + if val in TYPST_SPACES: + return [] + if val in TYPST_WRAPPERS and self.peek() == ("ch", "("): + self.take() + return self.seq(True) + raise NotSimple("identifier " + val) + if val in "/*#&[]{}\\$!:;|~@": + raise NotSimple("character %r" % val) + return [_char_atom(val)] + + def arg(self): + tok = self.take() + if tok is None: + raise NotSimple("missing argument") + kind, val = tok + if tok == ("ch", "("): + return self.seq(True) + if kind == "ch" and val in ")_^'": + raise NotSimple("bad argument") + return self.single(kind, val) + + +def typst_atoms(src): + return _TypstParser(_typst_tokens(src)).seq(False) + + +# --- public ------------------------------------------------------------------ + + +def fold_math(notation, source): + """Return the canonical linear form of a math source, or None when it is complex.""" + src = unicodedata.normalize("NFC", source) + try: + atoms = tex_atoms(src) if notation == "tex" else typst_atoms(src) + return _canon(atoms) + except NotSimple: + return None + + +def complex_key(notation, source): + return notation + ":" + remove_ws(unicodedata.normalize("NFC", source)) + + +def _fold_script_chars(chars): + """Fold a run of Unicode script characters of one type, or None if any base is not simple.""" + op = None + bases = [] + for ch in chars: + t, b = script_type(ch) + if t is None or (op is not None and t != op): + return None + op = t + bases.append(b) + base = "".join(bases) + if not all(is_simple_char(c) for c in base): + return None + return op + "{" + "".join(fold_char(c) for c in base) + "}" + + +def _fold_chars(s, in_notation): + """Fold the characters of text: script characters always, operators only inside notation.""" + out = [] + i, n = 0, len(s) + while i < n: + ch = s[i] + t, b = script_type(ch) + if t is not None: + j = i + while j < n and script_type(s[j])[0] == t: + j += 1 + folded = _fold_script_chars(s[i:j]) + out.append(folded if folded is not None else s[i:j]) + i = j + continue + if in_notation: + out.append(fold_char(ch)) + elif ch in ("-", "\u2013") and i + 1 < n and unicodedata.category(s[i + 1]) == "Nd": + out.append(MINUS) + else: + out.append(ch) + i += 1 + return "".join(out) + + +def fold_plain_text(text): + return _fold_chars(unicodedata.normalize("NFC", text), in_notation=False) + + +def fold_styled_script(op, text): + """The canonical form of text styled as a subscript (`_`) or superscript (`^`).""" + t = unicodedata.normalize("NFC", text) + s = remove_ws(t) + simple = all(is_simple_char(c) or script_type(c)[0] is not None for c in s) + if simple: + inner = _fold_chars(s, in_notation=True) + if op == "^" and inner and all(c == PRIME for c in inner): + return inner + else: + inner = trim(collapse_ws(t)) + return op + "{" + inner + "}" diff --git a/tools/oracle/package.py b/tools/oracle/package.py new file mode 100644 index 0000000..d60b875 --- /dev/null +++ b/tools/oracle/package.py @@ -0,0 +1,383 @@ +"""Packages: writing, reading and validating a scienting-doc/1 package folder. + +Non-normative; see spec/12-package.md and spec/22-conformance.md. +""" + +import base64 +import json +import os +import posixpath + +from . import crypto, hashing, jcs, receipts as R +from .anchors import ADDRESS_RE +from .model import LEAVES, MATH_KINDS, RUN_KINDS, VERBATIM_KINDS, Doc +from .schema import validate as schema_validate +from .text import letter_first, record_id, sha256_hex +from .tree import Refusal, validate_structure + +JSONL = { + "nodes.jsonl": "node.schema.json", + "pages.jsonl": "page.schema.json", + "locations.jsonl": "location.schema.json", + "references.jsonl": "reference.schema.json", + "corrections.jsonl": "correction.schema.json", + "receipts.jsonl": None, + "ids.jsonl": "id-entry.schema.json", + "suspects.jsonl": "suspect.schema.json", +} +JSON = { + "document.json": "document.schema.json", + "witnesses.json": "witnesses.schema.json", + "provenance.json": "provenance.schema.json", + "roster.json": "roster.schema.json", +} +REQUIRED = ["document.json", "nodes.jsonl", "witnesses.json", "provenance.json"] + + +def line(rec): + return jcs.dumps(rec) + "\n" + + +def jsonl(recs): + return "".join(line(r) for r in recs).encode("utf-8") + + +def witness_id(sha): + return letter_first(bytes.fromhex(sha), 7) + + +def safe_path(p): + if not p or p.startswith("/") or "\\" in p or "\x00" in p: + return False + parts = p.split("/") + return all(x not in ("", ".", "..") for x in parts) and posixpath.normpath(p) == p + + +def write(root, files, absent=()): + """Write `files` ({path: bytes}) and a MANIFEST.json listing them and the `absent` entries. + + Returns the package hash. + """ + os.makedirs(root, exist_ok=True) + entries = [dict(a) for a in absent] + for path in sorted(files, key=lambda p: p.encode("utf-8")): + data = files[path] + if data is None: + continue + full = os.path.join(root, path) + os.makedirs(os.path.dirname(full), exist_ok=True) + with open(full, "wb") as f: + f.write(data) + entries.append({"path": path, "sha256": sha256_hex(data), "size": len(data)}) + entries.sort(key=lambda e: e["path"].encode("utf-8")) + doc = json.loads(files["document.json"]) + manifest = {"format": "scienting-package/1", "doc": "scienting-doc/1", "key": doc["key"], "files": entries} + mb = (jcs.dumps(manifest) + "\n").encode("utf-8") + with open(os.path.join(root, "MANIFEST.json"), "wb") as f: + f.write(mb) + return sha256_hex(mb) + + +def read_jsonl(path): + out = [] + with open(path, encoding="utf-8") as f: + for i, ln in enumerate(f, 1): + if not ln.endswith("\n"): + raise Refusal("package.file.newline", "%s:%d: every line ends with a newline" % (path, i)) + rec = json.loads(ln) + if line(rec) != ln: + raise Refusal("package.file.canonical", "%s:%d: line is not canonical JSON" % (path, i)) + out.append(rec) + return out + + +def read_json(path): + with open(path, encoding="utf-8") as f: + text = f.read() + rec = json.loads(text) + if line(rec) != text: + raise Refusal("package.file.canonical", "%s: file is not canonical JSON" % path) + return rec + + +class Report: + def __init__(self): + self.errors = [] + + def add(self, rule, where, message): + self.errors.append({"rule": rule, "where": where, "message": message}) + + def __bool__(self): + return not self.errors + + +def _all_files(root): + out = [] + for d, _, fs in os.walk(root): + for f in fs: + out.append(os.path.relpath(os.path.join(d, f), root).replace(os.sep, "/")) + return sorted(out) + + +def validate(root, store, key=None): + """Validate the package at `root`. `store` is a schema store; `key` a hashing key for keyed packages.""" + rep = Report() + try: + _validate(root, store, key, rep) + except Refusal as e: + rep.add(e.rule, e.node or "", e.message) + return rep + + +def _validate(root, store, key, rep): + mpath = os.path.join(root, "MANIFEST.json") + if not os.path.exists(mpath): + raise Refusal("package.manifest.missing", "MANIFEST.json is missing") + manifest = read_json(mpath) + for e in schema_validate(store, "manifest.schema.json", manifest): + rep.add("package.manifest.schema", "MANIFEST.json", e) + listed = {} + paths = [f["path"] for f in manifest.get("files", [])] + if paths != sorted(paths, key=lambda p: p.encode("utf-8")) or len(set(paths)) != len(paths): + rep.add("package.manifest.order", "MANIFEST.json", "files must be sorted by path and unique") + for f in manifest.get("files", []): + p = f["path"] + listed[p] = f + if not safe_path(p): + rep.add("package.path.unsafe", p, "unsafe path") + continue + full = os.path.join(root, p) + if f.get("present", True) is False: + if not p.startswith("assets/"): + rep.add("package.manifest.absent", p, "only assets may be listed without their bytes") + if os.path.exists(full): + rep.add("package.manifest.absent", p, "a file listed as absent is present") + continue + if not os.path.exists(full): + rep.add("package.manifest.missing-file", p, "listed file is missing") + continue + with open(full, "rb") as fh: + data = fh.read() + if sha256_hex(data) != f["sha256"] or len(data) != f["size"]: + rep.add("package.manifest.hash", p, "SHA-256 or size does not match the manifest") + for p in _all_files(root): + if p != "MANIFEST.json" and p not in listed: + rep.add("package.manifest.unlisted", p, "file is not listed in the manifest") + for p in REQUIRED: + if p not in listed: + rep.add("package.file.required", p, "required file is missing") + if not rep: + return + + data = {} + for p, sch in JSON.items(): + if p in listed: + data[p] = read_json(os.path.join(root, p)) + for e in schema_validate(store, sch, data[p]): + rep.add("package.schema", p, e) + for p, sch in JSONL.items(): + if p in listed: + data[p] = read_jsonl(os.path.join(root, p)) + for i, rec in enumerate(data[p], 1): + s = sch + if p == "receipts.jsonl": + s = "receipt.schema.json" if rec.get("format") == "scienting-receipt/1" else "revocation.schema.json" + for e in schema_validate(store, s, rec): + rep.add("package.schema", "%s:%d" % (p, i), e) + if p != "nodes.jsonl" and not data[p]: + rep.add("package.file.empty", p, "an optional JSONL file with no records is omitted") + else: + data[p] = [] + if not rep: + return + + document = data["document.json"] + if document["key"] != manifest["key"]: + rep.add("package.manifest.key", "MANIFEST.json", "key differs from document.json") + nodes = data["nodes.jsonl"] + doc = Doc(document["key"], nodes) + try: + validate_structure(doc) + except Refusal as e: + rep.add(e.rule, "nodes.jsonl " + (e.node or ""), e.message) + return + + # Policy and hashing. + withheld = [n["id"] for n in nodes if n.get("withheld")] + scheme = document["hashing"]["scheme"] + if document["policy"] == "full" and withheld: + rep.add("doc.policy.withheld", "nodes.jsonl", "a full package withholds no text") + if document["policy"] == "checks-only": + bearing = [n["id"] for n in nodes if n["kind"] in LEAVES] + if set(bearing) != set(withheld): + rep.add("doc.policy.withheld", "nodes.jsonl", "a checks-only package withholds every leaf's content") + if scheme == "plain": + rep.add("doc.policy.keyed", "document.json", "a checks-only package carries keyed hashes") + if scheme == "hmac-team" and key is not None and document["hashing"]["key_id"] != crypto.key_id(key): + rep.add("doc.hash.key", "document.json", "key_id does not match the key supplied") + + # References inside runs. + kinds = {n["id"]: n["kind"] for n in nodes} + for n in nodes: + for r in n.get("content", []) if n["kind"] in RUN_KINDS else []: + if r["kind"] == "cite": + for ref in r["refs"]: + if kinds.get(ref) != "reference": + rep.add("doc.run.cite", n["id"], "cite names %s, which is not a reference" % ref) + if r["kind"] == "fnmark" and r.get("footnote") is not None and kinds.get(r["footnote"]) != "footnote": + rep.add("doc.run.fnmark", n["id"], "fnmark names a node that is not a footnote") + if r["kind"] == "xref" and r.get("target") and "#" not in r["target"]: + if r["target"] not in kinds: + rep.add("doc.run.xref", n["id"], "xref names no node in this document") + if n["kind"] == "table": + for col in n.get("attrs", {}).get("columns", []): + for h in col["header_path"]: + if kinds.get(h) != "cell": + rep.add("doc.table.header", n["id"], "a header path names %s, not a cell" % h) + if n["kind"] == "row": + for h in n.get("attrs", {}).get("header_path", []): + if kinds.get(h) != "cell": + rep.add("doc.table.header", n["id"], "a row header path names %s, not a cell" % h) + + # Hashes. + hasher = hashing.PLAIN if scheme == "plain" else (hashing.Hasher(key) if key else None) + if hasher is not None and not withheld: + vals = hashing.compute(doc, hasher) + for n in nodes: + for k, v in vals[n["id"]].items(): + if n[k] != v: + rep.add("doc.hash." + k.replace("_", "-"), n["id"], "%s does not recompute" % k) + if vals[doc.root]["node_hash"] != document["root"]: + rep.add("doc.hash.root", "document.json", "root does not equal the root node's node_hash") + if hashing.meta_hash(document, hasher) != document["meta_hash"]: + rep.add("doc.hash.meta", "document.json", "meta_hash does not recompute") + else: + vals = {n["id"]: {k: n[k] for k in ("text_hash", "match_hash", "align_key", "own_hash", "node_hash")} + for n in nodes} + if n_root_hash(nodes, doc) != document["root"]: + rep.add("doc.hash.root", "document.json", "root does not equal the root node's node_hash") + + # IDs. + live = set(kinds) + ids = data["ids.jsonl"] + known = set(live) + for i, e in enumerate(ids, 1): + if e["id"] in live: + rep.add("doc.id.retired-live", "ids.jsonl:%d" % i, "%s is both live and in the ID table" % e["id"]) + known.add(e["id"]) + for i, e in enumerate(ids, 1): + s = e.get("successor") + if s is not None and s not in known: + rep.add("doc.id.successor", "ids.jsonl:%d" % i, "successor %s is unknown" % s) + if e["kind"] == "alias" and s not in live: + rep.add("doc.id.alias", "ids.jsonl:%d" % i, "an alias names a live node") + order = sorted(ids, key=lambda e: (0 if e["kind"] == "alias" else 1, e.get("rev", 0), e["id"])) + if order != ids: + rep.add("doc.order.ids", "ids.jsonl", "aliases first by ID, then retirements by revision and ID") + + # Corrections. + cors = data["corrections.jsonl"] + for i, c in enumerate(cors, 1): + if c["index"] != i: + rep.add("doc.correction.index", "corrections.jsonl:%d" % i, "indexes count from 1 without gaps") + if c["id"] != record_id(sha256_hex(jcs.dumpb({k: v for k, v in c.items() if k != "id"}))): + rep.add("doc.correction.id", "corrections.jsonl:%d" % i, "id does not derive from the record") + if document["policy"] == "checks-only" and (cors or data["suspects.jsonl"]): + rep.add("doc.policy.withheld", "corrections.jsonl", "a checks-only package carries no corrections or suspects") + if document["policy"] == "full" and document["rev"] != len(cors): + rep.add("doc.correction.rev", "document.json", "rev must equal the number of corrections") + retired_by = {e["id"]: e for e in ids if e["kind"] == "retired"} + for c in cors: + for r in c.get("retired", []): + if r not in retired_by: + rep.add("doc.id.retired-missing", c["id"], "%s was retired but is not in ids.jsonl" % r) + if not withheld and hasher is not None: + last = {} + for c in cors: + if c.get("target") in live and kinds[c["target"]] in LEAVES: + last[c["target"]] = c + for x in c.get("touched", []): + if x != c.get("target"): + last.pop(x, None) + for nid, c in last.items(): + if c.get("after") and c["after"] != vals[nid]["node_hash"] and not doc.kids(nid): + rep.add("doc.correction.after", c["id"], "the last correction of %s does not end at its hash" % nid) + + # Geometry. + wits = {w["id"]: w for w in data["witnesses.json"]["witnesses"]} + for w in wits.values(): + if w["id"] != witness_id(w["sha256"]): + rep.add("doc.witness.id", w["id"], "a witness ID derives from its SHA-256") + fps = set() + for i, p in enumerate(data["pages.jsonl"], 1): + if p["witness"] not in wits: + rep.add("doc.page.witness", "pages.jsonl:%d" % i, "unknown witness") + fps.add(p["page_fp"]) + porder = sorted(data["pages.jsonl"], key=lambda p: (p["witness"], p["page"])) + if porder != data["pages.jsonl"]: + rep.add("doc.order.pages", "pages.jsonl", "pages sort by witness and page") + pos = {nid: i for i, nid in enumerate(doc.order)} + for i, loc in enumerate(data["locations.jsonl"], 1): + if loc["node"] not in live: + rep.add("doc.location.node", "locations.jsonl:%d" % i, "unknown node") + if loc["page_fp"] not in fps: + rep.add("doc.location.page", "locations.jsonl:%d" % i, "page_fp is not a page of any witness") + lorder = sorted(data["locations.jsonl"], key=lambda l: (pos.get(l["node"], -1), l["page"], l["page_fp"])) + if lorder != data["locations.jsonl"]: + rep.add("doc.order.locations", "locations.jsonl", "locations sort by node order, then page") + for i, ref in enumerate(data["references.jsonl"], 1): + if kinds.get(ref["node"]) != "reference": + rep.add("doc.reference.node", "references.jsonl:%d" % i, "names no reference node") + rorder = sorted(data["references.jsonl"], key=lambda r: pos.get(r["node"], -1)) + if rorder != data["references.jsonl"]: + rep.add("doc.order.references", "references.jsonl", "references follow document order") + + sorder = sorted(data["suspects.jsonl"], key=lambda x: x["id"]) + if sorder != data["suspects.jsonl"]: + rep.add("doc.order.suspects", "suspects.jsonl", "suspects sort by ID") + + # Receipts and fidelity. + roster = {k["id"]: k for k in data.get("roster.json", {}).get("keys", [])} + recs = data["receipts.jsonl"] + rorder = sorted(recs, key=lambda r: (r["at"], r["id"])) + if rorder != recs: + rep.add("doc.order.receipts", "receipts.jsonl", "receipts and revocations sort by time, then ID") + by_id = {r["id"]: r for r in recs} + for r in recs: + if r["id"] != record_id(R.record_hash(r)): + rep.add("doc.receipt.id", r["id"], "id does not derive from the record") + if r["format"] == "scienting-receipt/1": + if r["doc"] != document["key"]: + rep.add("doc.receipt.doc", r["id"], "receipt names another document") + if r["root"] != crypto.merkle_root(crypto.receipt_items(r)): + rep.add("doc.receipt.root", r["id"], "Merkle root does not recompute") + ids_listed = [x[0] for x in r["nodes"]] + if ids_listed != sorted(ids_listed) or len(set(ids_listed)) != len(ids_listed): + rep.add("doc.receipt.nodes", r["id"], "nodes sort by ID without repeats") + if roster and not R.verify_signature(r, roster): + rep.add("doc.receipt.signature", r["id"], "signature does not verify") + qa = r.get("qa") + if qa: + orig = by_id.get(qa["of"]) + if not orig: + rep.add("doc.qa.of", r["id"], "the spot-checked receipt is not in this package") + continue + ck = roster.get(qa["key"]) + seed = base64.b64decode(qa["seed"]) + if roster: + if not ck or ck["scheme"] != "ed25519" or "spot-check" not in ck["purposes"]: + rep.add("doc.qa.key", r["id"], "the seed key is not a registered Ed25519 spot-check key") + elif not ck["registered_at"] <= orig["at"]: + rep.add("doc.qa.key", r["id"], "the spot-check key was registered after the receipt") + elif not crypto.ed25519_verify(base64.b64decode(ck["public"]), R.seed_payload(orig), seed): + rep.add("doc.qa.seed", r["id"], "the seed is not the checker's signature over the receipt") + if qa["sample"] != R.sample(orig, seed, qa["rate"], qa["minimum"]): + rep.add("doc.qa.sample", r["id"], "the sample does not follow from the seed") + if roster and not withheld: + lv = R.effective_levels(nodes, vals, recs, roster) + if R.distribution(lv) != document["fidelity"]: + rep.add("doc.fidelity.report", "document.json", "the fidelity distribution does not recompute") + + +def n_root_hash(nodes, doc): + return {n["id"]: n for n in nodes}[doc.root]["node_hash"] diff --git a/tools/oracle/receipts.py b/tools/oracle/receipts.py new file mode 100644 index 0000000..7b91174 --- /dev/null +++ b/tools/oracle/receipts.py @@ -0,0 +1,184 @@ +"""Receipts, revocations, levels, spot-check sampling and reviewer error bounds. + +Non-normative; see spec/08-fidelity.md. +""" + +import base64 +import hashlib +import math +from fractions import Fraction + +from . import crypto, jcs +from .model import LEVELS +from .text import record_id, sha256_hex + +SIGNED_FORMATS = ("scienting-receipt/1", "scienting-revocation/1", "scienting-policy/1") + + +def record_hash(rec): + """SHA-256 of the canonical JSON of a signed record without its `id` and `signature`.""" + return sha256_hex(jcs.dumpb({k: v for k, v in rec.items() if k not in ("id", "signature")})) + + +def signing_payload(rec): + return jcs.dumpb({"format": rec["format"], "hash": record_hash(rec)}) + + +def seal(rec, secret, key_id): + """Fill in a record's root (for receipts), ID and Ed25519 signature.""" + rec = dict(rec) + if rec["format"] == "scienting-receipt/1": + rec["root"] = crypto.merkle_root(crypto.receipt_items(rec)) + rec.pop("id", None) + rec.pop("signature", None) + sig = crypto.ed25519_sign(secret, signing_payload(rec)) + rec["id"] = record_id(record_hash(rec)) + rec["signature"] = {"scheme": "ed25519", "key": key_id, "value": base64.b64encode(sig).decode("ascii")} + return rec + + +def verify_signature(rec, roster): + sig = rec.get("signature") or {} + key = roster.get(sig.get("key")) + if not key or sig.get("scheme") != "ed25519" or key["scheme"] != "ed25519": + return False + pub = base64.b64decode(key["public"]) + return crypto.ed25519_verify(pub, signing_payload(rec), base64.b64decode(sig["value"])) + + +def key_valid_at(key, at): + return key["registered_at"] <= at and (key.get("revoked_at") is None or at < key["revoked_at"]) + + +# --- spot-checks -------------------------------------------------------------- + + +def seed_payload(receipt): + return jcs.dumpb({"format": "scienting-spot-check/1", "receipt": record_hash(receipt)}) + + +def make_seed(receipt, checker_secret): + return crypto.ed25519_sign(checker_secret, seed_payload(receipt)) + + +def sample_size(n, rate="0.05", minimum=10): + return min(n, max(minimum, math.ceil(Fraction(rate) * n))) + + +def sample(receipt, seed, rate="0.05", minimum=10): + ids = [nid for nid, _ in receipt["nodes"]] + m = sample_size(len(ids), rate, minimum) + ranked = sorted(ids, key=lambda nid: (hashlib.sha256(seed + nid.encode("utf-8")).hexdigest(), nid)) + return sorted(ranked[:m]) + + +def upper_bound(k, n, confidence="0.95"): + """One-sided Clopper-Pearson upper bound on an error rate, as a float.""" + if n <= 0: + raise ValueError("n must be positive") + if k >= n: + return 1.0 + alpha = 1.0 - float(Fraction(confidence)) + + def cdf(p): + if p <= 0: + return 1.0 + if p >= 1: + return 0.0 + lp, lq = math.log(p), math.log1p(-p) + total = 0.0 + for i in range(k + 1): + total += math.exp(math.lgamma(n + 1) - math.lgamma(i + 1) - math.lgamma(n - i + 1) + i * lp + + (n - i) * lq) + return total + + lo, hi = 0.0, 1.0 + for _ in range(200): + mid = (lo + hi) / 2 + if cdf(mid) > alpha: + lo = mid + else: + hi = mid + return hi + + +def bound_string(k, n, confidence="0.95"): + """The bound as the spec reports it: six decimal places, rounded up.""" + x = upper_bound(k, n, confidence) + v = math.ceil(x * 10**6 - 1e-9) + return "%d.%06d" % (v // 10**6, v % 10**6) + + +# --- levels ------------------------------------------------------------------- + + +def revoked(receipt, revocations): + for r in revocations: + if r.get("receipt") == receipt["id"]: + return True + if r.get("signer") == receipt["by"] and r.get("period"): + p = r["period"] + if p["from"] <= receipt["at"] <= p["to"]: + return True + return False + + +def valid_revocations(revocations, receipts_by_id, roster, owners): + out = [] + for r in revocations: + if not verify_signature(r, roster): + continue + signer = r["signature"]["key"] + allowed = set(owners) + if r.get("receipt") in receipts_by_id: + allowed.add(receipts_by_id[r["receipt"]]["by"]) + if r.get("signer"): + allowed.add(r["signer"]) + if signer in allowed: + out.append(r) + return out + + +def receipt_status(rec, records, roster, owners=()): + """`valid`, `revoked`, `suspended`, or `invalid` for one receipt.""" + receipts = [x for x in records if x["format"] == "scienting-receipt/1"] + revs = [x for x in records if x["format"] == "scienting-revocation/1"] + by_id = {x["id"]: x for x in receipts} + if rec.get("root") != crypto.merkle_root(crypto.receipt_items(rec)): + return "invalid" + if rec["id"] != record_id(record_hash(rec)) or not verify_signature(rec, roster): + return "invalid" + key = roster.get(rec["by"]) + if not key or not key_valid_at(key, rec["at"]) or rec["signature"]["key"] != rec["by"]: + return "invalid" + if revoked(rec, valid_revocations(revs, by_id, roster, owners)): + return "revoked" + for q in receipts: + qa = q.get("qa") + if qa and qa.get("of") == rec["id"] and qa.get("errors"): + if receipt_status(q, records, roster, owners) == "valid": + return "suspended" + return "valid" + + +def effective_levels(nodes, values, records, roster, owners=()): + """Every leaf's level: its recorded level, raised by valid receipts that list it at its current hash.""" + level = {n["id"]: n.get("fidelity") for n in nodes if "fidelity" in n} + for rec in records: + if rec["format"] != "scienting-receipt/1": + continue + if receipt_status(rec, records, roster, owners) != "valid": + continue + for nid, h in rec.get("nodes", []): + if nid in level and values[nid]["node_hash"] == h: + if LEVELS.index(rec["level"]) > LEVELS.index(level[nid]): + level[nid] = rec["level"] + return level + + +def distribution(levels): + counts = {lv: 0 for lv in LEVELS} + for lv in levels.values(): + counts[lv] += 1 + lowest = next((lv for lv in LEVELS if counts[lv]), None) + return {"lowest": lowest, "counts": counts} diff --git a/tools/oracle/rights.py b/tools/oracle/rights.py new file mode 100644 index 0000000..9d9a3bb --- /dev/null +++ b/tools/oracle/rights.py @@ -0,0 +1,106 @@ +"""Rights records, policies, stage checks and backend conditions. + +Non-normative; see spec/14-rights.md. +""" + +USES = ("read", "tdm", "redistribute", "quote-public", "accessible-copy") +PURPOSES = ("internal", "external") +PROCESSORS = ("local", "tenancy", "outside-no-retention", "outside") +AI_PAIRS = tuple(p + "/" + q for p in PURPOSES for q in PROCESSORS) + + +def _value(v): + return v if v in (True, False) else "unknown" + + +def flat(rights): + """A rights record's uses as one flat map: the five uses plus ai//.""" + uses = rights.get("uses", {}) + out = {u: _value(uses.get(u, "unknown")) for u in USES} + ai = uses.get("ai", {}) + for pair in AI_PAIRS: + out["ai/" + pair] = _value(ai.get(pair, "unknown")) + return out + + +def _policy_applies(policy, witness, now): + if policy.get("valid_until") and now >= policy["valid_until"]: + return False + if policy.get("at") and now < policy["at"]: + return False + a = policy.get("applies_to", {}) + r = witness["rights"] + if "basis" in a and r.get("basis") not in a["basis"]: + return False + if "license" in a and (r.get("license") or {}).get("spdx") not in a["license"]: + return False + if "doi_prefixes" in a: + doi = (witness.get("origin") or {}).get("doi") or "" + if not any(doi.startswith(p) for p in a["doi_prefixes"]): + return False + if "witnesses" in a and witness["sha256"] not in a["witnesses"]: + return False + return True + + +def effective(witness, policies, now): + """The witness's uses at `now`, with unknowns resolved by applicable policies, or all false if expired.""" + r = witness["rights"] + f = flat(r) + if r.get("valid_until") and now >= r["valid_until"]: + return {k: False for k in f}, True + for p in policies: + if not _policy_applies(p, witness, now): + continue + pf = flat({"uses": p.get("uses", {})}) + for k, v in pf.items(): + if f[k] == "unknown" and v != "unknown": + f[k] = v + return f, False + + +def combine(flats): + """The most restrictive of several witnesses' uses: false over unknown over true.""" + out = {} + for k in flats[0]: + vals = [f[k] for f in flats] + out[k] = False if False in vals else ("unknown" if "unknown" in vals else True) + return out + + +def check(stage, processor, uses): + """Whether a stage may run on a processor under `uses`. Returns (allowed, lacking).""" + lacking = [] + for u in stage.get("uses", []): + if uses[u] is not True: + lacking.append(u if uses[u] is False else u + "?") + ai = stage.get("ai") + if ai: + allowed_here = ai.get("processors") + if allowed_here and processor not in allowed_here: + lacking.append("processor:" + processor) + k = "ai/" + ai["purpose"] + "/" + processor + if uses[k] is not True: + lacking.append(k if uses[k] is False else k + "?") + return (not lacking), lacking + + +def backend_allowed(backend, profile): + """Whether a team profile meets every condition a backend's licenses impose. Returns (ok, failed).""" + failed = [] + for cond in backend.get("conditions", []): + k = cond["kind"] + if k == "revenue-cap": + r = profile.get("revenue_or_funding_usd") + if r is None or r.get("at_most") is None or r["at_most"] > cond["usd"]: + failed.append(cond["id"]) + elif k == "no-competition": + comp = profile.get("competes_with") + if comp is None or cond["vendor"] in comp: + failed.append(cond["id"]) + elif k == "purpose": + if profile.get("purpose") not in cond["allowed"]: + failed.append(cond["id"]) + else: + failed.append(cond["id"]) + return (not failed), failed diff --git a/tools/oracle/schema.py b/tools/oracle/schema.py new file mode 100644 index 0000000..519ae68 --- /dev/null +++ b/tools/oracle/schema.py @@ -0,0 +1,210 @@ +"""A JSON Schema (draft 2020-12) validator for the subset of keywords the spec's schemas use. + +Non-normative. +The spec's schemas are restricted to these keywords (spec/22-conformance.md) so that any 2020-12 validator, and +this one, agree; CI also runs the `jsonschema` package when it is installed. +""" + +import json +import os +import re + +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", "else", +} +FORBIDDEN_PATTERN_TOKENS = ("\\d", "\\w", "\\s", "\\b", "\\D", "\\W", "\\S", "\\B", "(?<", "(?P") + + +class SchemaError(Exception): + pass + + +class Store: + def __init__(self, root): + self.root = root + self.docs = {} + + def load(self, name): + if name not in self.docs: + with open(os.path.join(self.root, name), encoding="utf-8") as f: + self.docs[name] = json.load(f) + lint(self.docs[name], name) + return self.docs[name] + + def deref(self, base, ref): + name, _, frag = ref.partition("#") + name = name or base + node = self.load(name) + if frag: + for part in frag.lstrip("/").split("/"): + node = node[part.replace("~1", "/").replace("~0", "~")] + return name, node + + +def lint(schema, where): + """Refuse keywords outside the subset, and regex syntax that differs between dialects.""" + if isinstance(schema, dict): + for k, v in schema.items(): + if k not in KEYWORDS: + raise SchemaError("%s: keyword %s is outside the subset" % (where, k)) + if k == "pattern" and any(t in v for t in FORBIDDEN_PATTERN_TOKENS): + raise SchemaError("%s: pattern %r uses dialect-dependent syntax" % (where, v)) + if k in ("properties", "patternProperties", "$defs"): + for kk, vv in v.items(): + if k == "patternProperties" and any(t in kk for t in FORBIDDEN_PATTERN_TOKENS): + raise SchemaError("%s: pattern %r uses dialect-dependent syntax" % (where, kk)) + lint(vv, where + "/" + kk) + elif k in ("items", "additionalProperties", "propertyNames", "not", "if", "then", "else", "contains"): + lint(v, where + "/" + k) + elif k in ("oneOf", "anyOf", "allOf", "prefixItems"): + for i, s in enumerate(v): + lint(s, "%s/%s/%d" % (where, k, i)) + + +def _type_ok(t, x): + if t == "null": + return x is None + if t == "boolean": + return isinstance(x, bool) + if t == "integer": + return isinstance(x, int) and not isinstance(x, bool) + if t == "number": + return isinstance(x, (int, float)) and not isinstance(x, bool) + if t == "string": + return isinstance(x, str) + if t == "array": + return isinstance(x, list) + if t == "object": + return isinstance(x, dict) + raise SchemaError("unknown type " + t) + + +def _equal(a, b): + if isinstance(a, bool) or isinstance(b, bool): + return type(a) is type(b) and a == b + return a == b + + +def validate(store, name, instance): + """Return a list of error strings; empty when the instance is valid.""" + schema = store.load(name) + errors = [] + _v(store, name, schema, instance, "", errors) + return errors + + +def _v(store, base, s, x, path, errors): + if s is True: + return + if s is False: + errors.append(path + ": not allowed") + return + if "$ref" in s: + b2, target = store.deref(base, s["$ref"]) + _v(store, b2, target, x, path, errors) + if "type" in s: + ts = s["type"] if isinstance(s["type"], list) else [s["type"]] + if not any(_type_ok(t, x) for t in ts): + errors.append("%s: expected %s" % (path or "/", "/".join(ts))) + return + if "const" in s and not _equal(s["const"], x): + errors.append("%s: expected %r" % (path or "/", s["const"])) + if "enum" in s and not any(_equal(e, x) for e in s["enum"]): + errors.append("%s: %r is not one of %r" % (path or "/", x, s["enum"])) + if isinstance(x, str): + if "minLength" in s and len(x) < s["minLength"]: + errors.append("%s: shorter than %d" % (path, s["minLength"])) + if "maxLength" in s and len(x) > s["maxLength"]: + errors.append("%s: longer than %d" % (path, s["maxLength"])) + if "pattern" in s and not re.search(s["pattern"], x): + errors.append("%s: %r does not match %s" % (path, x, s["pattern"])) + if isinstance(x, (int, float)) and not isinstance(x, bool): + if "minimum" in s and x < s["minimum"]: + errors.append("%s: below %s" % (path, s["minimum"])) + if "maximum" in s and x > s["maximum"]: + errors.append("%s: above %s" % (path, s["maximum"])) + if "exclusiveMinimum" in s and x <= s["exclusiveMinimum"]: + errors.append("%s: not above %s" % (path, s["exclusiveMinimum"])) + if "exclusiveMaximum" in s and x >= s["exclusiveMaximum"]: + errors.append("%s: not below %s" % (path, s["exclusiveMaximum"])) + if isinstance(x, list): + if "minItems" in s and len(x) < s["minItems"]: + errors.append("%s: fewer than %d items" % (path, s["minItems"])) + if "maxItems" in s and len(x) > s["maxItems"]: + errors.append("%s: more than %d items" % (path, s["maxItems"])) + if s.get("uniqueItems"): + seen = [json.dumps(i, sort_keys=True) for i in x] + if len(seen) != len(set(seen)): + errors.append("%s: items are not unique" % path) + pre = s.get("prefixItems", []) + for i, item in enumerate(x): + if i < len(pre): + _v(store, base, pre[i], item, "%s/%d" % (path, i), errors) + elif "items" in s: + _v(store, base, s["items"], item, "%s/%d" % (path, i), errors) + if "contains" in s: + if not any(not _sub(store, base, s["contains"], i) for i in x): + errors.append("%s: no item matches `contains`" % path) + if isinstance(x, dict): + if "minProperties" in s and len(x) < s["minProperties"]: + errors.append("%s: fewer than %d properties" % (path, s["minProperties"])) + if "maxProperties" in s and len(x) > s["maxProperties"]: + errors.append("%s: more than %d properties" % (path, s["maxProperties"])) + for r in s.get("required", []): + if r not in x: + errors.append("%s: missing %s" % (path or "/", r)) + for k, deps in s.get("dependentRequired", {}).items(): + if k in x: + for d in deps: + if d not in x: + errors.append("%s: %s requires %s" % (path or "/", k, d)) + props = s.get("properties", {}) + pprops = s.get("patternProperties", {}) + for k, v in x.items(): + matched = False + if k in props: + matched = True + _v(store, base, props[k], v, path + "/" + k, errors) + for pat, ps in pprops.items(): + if re.search(pat, k): + matched = True + _v(store, base, ps, v, path + "/" + k, errors) + if not matched and "additionalProperties" in s: + ap = s["additionalProperties"] + if ap is False: + errors.append("%s: unexpected property %s" % (path or "/", k)) + else: + _v(store, base, ap, v, path + "/" + k, errors) + if "propertyNames" in s: + _v(store, base, s["propertyNames"], k, path + "/" + k, errors) + for sub in s.get("allOf", []): + _v(store, base, sub, x, path, errors) + if "anyOf" in s: + if all(_sub(store, base, sub, x) for sub in s["anyOf"]): + errors.append("%s: matches none of anyOf" % (path or "/")) + if "oneOf" in s: + ok = [sub for sub in s["oneOf"] if not _sub(store, base, sub, x)] + if len(ok) != 1: + detail = "" + if not ok: + best = min((_sub(store, base, sub, x) for sub in s["oneOf"]), key=len) + detail = " (closest: %s)" % "; ".join(best[:3]) + errors.append("%s: matches %d of oneOf%s" % (path or "/", len(ok), detail)) + if "not" in s and not _sub(store, base, s["not"], x): + errors.append("%s: matches `not`" % (path or "/")) + if "if" in s: + if not _sub(store, base, s["if"], x): + if "then" in s: + _v(store, base, s["then"], x, path, errors) + elif "else" in s: + _v(store, base, s["else"], x, path, errors) + + +def _sub(store, base, s, x): + e = [] + _v(store, base, s, x, "", e) + return e diff --git a/tools/oracle/text.py b/tools/oracle/text.py new file mode 100644 index 0000000..1c3ef85 --- /dev/null +++ b/tools/oracle/text.py @@ -0,0 +1,105 @@ +"""Text normalization, IDs, keys and small shared helpers. + +Non-normative; see spec/01-conventions.md and spec/04-identity.md. +""" + +import hashlib +import re +import unicodedata + +from . import jcs + +# Unicode White_Space=yes (PropList.txt), the set every rule in the spec means by "whitespace". +WHITE_SPACE = frozenset( + [0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x20, 0x85, 0xA0, 0x1680] + + list(range(0x2000, 0x200B)) + + [0x2028, 0x2029, 0x202F, 0x205F, 0x3000] +) + + +def is_ws(ch): + return ord(ch) in WHITE_SPACE + + +def collapse_ws(s): + out = [] + prev_ws = False + for ch in s: + if is_ws(ch): + if not prev_ws: + out.append(" ") + prev_ws = True + else: + out.append(ch) + prev_ws = False + return "".join(out) + + +def trim(s): + a, b = 0, len(s) + while a < b and is_ws(s[a]): + a += 1 + while b > a and is_ws(s[b - 1]): + b -= 1 + return s[a:b] + + +def remove_ws(s): + return "".join(ch for ch in s if not is_ws(ch)) + + +def norm(s): + """The hashing normalization: NFC, whitespace runs to one U+0020, trimmed.""" + return trim(collapse_ws(unicodedata.normalize("NFC", s))) + + +def sha256_hex(b): + if isinstance(b, str): + b = b.encode("utf-8") + return hashlib.sha256(b).hexdigest() + + +def is_digit(ch): + return unicodedata.category(ch) == "Nd" + + +def digits(s): + return "".join(ch for ch in s if is_digit(ch)) + + +# Crockford base32, lowercase. +ALPHABET = "0123456789abcdefghjkmnpqrstvwxyz" +LETTERS = "abcdefghjkmnpqrstvwxyz" +assert len(ALPHABET) == 32 and len(LETTERS) == 22 + +NODE_ID_RE = re.compile(r"^[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6}$") +RECORD_ID_RE = re.compile(r"^[a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]{6,25}$") +KEY_RE = re.compile(r"^[a-z0-9][a-z0-9._-]*$") +HASH_RE = re.compile(r"^[0-9a-f]{64}$") + + +def letter_first(digest, length): + """Encode a digest as a letter-first Crockford base32 ID of `length` characters.""" + first = LETTERS[digest[0] % 22] + bits = int.from_bytes(digest[1:], "big") + nbits = 8 * (len(digest) - 1) + out = [first] + for i in range(length - 1): + shift = nbits - 5 * (i + 1) + out.append(ALPHABET[(bits >> shift) & 31]) + return "".join(out) + + +def mint_node_id(doc_key, kind, text_hash, occurrence): + d = hashlib.sha256(jcs.dumpb(["scienting-id/1", doc_key, kind, text_hash, occurrence])).digest() + return letter_first(d, 7) + + +def record_id(record_hash_hex): + """A record's ID: 13 letter-first base32 characters of its record hash.""" + return letter_first(bytes.fromhex(record_hash_hex), 13) + + +def cp_to_utf16(s, offset): + """Convert a code point offset in `s` to a UTF-16 code unit offset.""" + return sum(2 if ord(ch) > 0xFFFF else 1 for ch in s[:offset]) diff --git a/tools/oracle/tree.py b/tools/oracle/tree.py new file mode 100644 index 0000000..0eed704 --- /dev/null +++ b/tools/oracle/tree.py @@ -0,0 +1,216 @@ +"""Establishing a document from a nested tree, minting IDs, and structural checks. + +Non-normative; see spec/03-nodes.md and spec/04-identity.md. +""" + +import copy + +from . import hashing +from .model import ( + AT_MOST_ONCE, CHILDREN, KINDS, LABELLED, LEAVES, MATH_KINDS, NONEMPTY, RUN_KINDS, RUNS, STYLES, + VERBATIM_KINDS, Doc, +) +from .text import NODE_ID_RE, mint_node_id, norm + + +class Refusal(Exception): + """A rule was broken. `rule` names it, as spec/22-conformance.md lists.""" + + def __init__(self, rule, message, node=None): + super().__init__("%s: %s" % (rule, message)) + self.rule = rule + self.message = message + self.node = node + + +def canonical_runs(runs): + """Drop empty text runs and join adjacent text runs with the same styles.""" + out = [] + for r in runs: + r = dict(r) + if r["kind"] == "text": + if "style" in r: + r["style"] = sorted(set(r["style"])) + if not r["style"]: + del r["style"] + if r["text"] == "": + continue + if out and out[-1]["kind"] == "text" and out[-1].get("style") == r.get("style"): + out[-1] = dict(out[-1], text=out[-1]["text"] + r["text"]) + continue + out.append(r) + return out + + +def _flatten(spec, parent, ord_, out): + node = {k: v for k, v in spec.items() if k != "children"} + node["_parent"] = parent + node["ord"] = ord_ + out.append(node) + idx = len(out) - 1 + for i, c in enumerate(spec.get("children", [])): + _flatten(c, idx, i, out) + return idx + + +def mint_ids(doc_key, flat, used, preassigned=None): + """Mint IDs for flat nodes in document order. `flat` nodes carry `_parent` indices.""" + preassigned = preassigned or {} + tmp = [] + for i, n in enumerate(flat): + m = {k: v for k, v in n.items() if not k.startswith("_")} + m["id"] = "tmp%d" % i + m["parent"] = None if n["_parent"] is None else "tmp%d" % n["_parent"] + tmp.append(m) + _resolve_child_refs(tmp) + doc = Doc(doc_key, tmp) + seen = {} + ids = {} + for i, n in enumerate(tmp): + if i in preassigned: + ids[n["id"]] = preassigned[i] + used.add(preassigned[i]) + continue + th = hashing.PLAIN(norm(hashing.plain(doc, n["id"]))) + k = (n["kind"], th) + occ = seen.get(k, 0) + seen[k] = occ + 1 + nid = mint_node_id(doc_key, n["kind"], th, occ) + while nid in used: + occ += 1 + nid = mint_node_id(doc_key, n["kind"], th, occ) + used.add(nid) + ids[n["id"]] = nid + result = [] + for n in tmp: + m = dict(n) + m["id"] = ids[n["id"]] + m["parent"] = None if n["parent"] is None else ids[n["parent"]] + if m["kind"] in RUN_KINDS: + m["content"] = [ + dict(r, node=ids[r["node"]]) if r["kind"] == "equation" else r for r in m["content"] + ] + result.append(m) + return result + + +def _resolve_child_refs(tmp): + """Equation runs in a spec name their child by position: {"kind": "equation", "child": i}.""" + by_parent = {} + for n in tmp: + by_parent.setdefault(n["parent"], []).append(n) + for n in tmp: + if n["kind"] in RUN_KINDS: + kids = sorted(by_parent.get(n["id"], []), key=lambda c: c["ord"]) + runs = [] + for r in n["content"]: + if r["kind"] == "equation" and "child" in r: + r = {"kind": "equation", "node": kids[r["child"]]["id"]} + runs.append(r) + n["content"] = canonical_runs(runs) + + +def establish(doc_key, spec, used=None): + """Turn a nested spec into flat node records with minted IDs, in document order.""" + flat = [] + _flatten(copy.deepcopy(spec), None, 0, flat) + return mint_ids(doc_key, flat, used if used is not None else set()) + + +def with_values(doc_key, nodes, hasher=hashing.PLAIN): + doc = Doc(doc_key, nodes) + vals = hashing.compute(doc, hasher) + out = [] + for nid in doc.preorder(): + n = dict(doc.nodes[nid]) + for k in ("text_hash", "match_hash", "align_key", "own_hash", "node_hash"): + n.pop(k, None) + n.update(vals[nid]) + out.append(n) + return out + + +def validate_structure(doc): + """Check the tree against the child rules of spec/03-nodes.md.""" + if doc.root is None: + raise Refusal("doc.tree.root", "no root node") + roots = [x for x in doc.order if doc.nodes[x].get("parent") is None] + if len(roots) != 1 or doc.nodes[doc.root]["kind"] != "document": + raise Refusal("doc.tree.root", "exactly one root, of kind document, is required") + if doc.preorder() != doc.order: + raise Refusal("doc.tree.order", "nodes are not in document order") + seen = set() + for nid in doc.order: + n = doc.nodes[nid] + if nid in seen: + raise Refusal("doc.id.unique", "duplicate ID " + nid, nid) + seen.add(nid) + if not NODE_ID_RE.match(nid): + raise Refusal("doc.id.form", "ID is not seven letter-first base32 characters", nid) + k = n["kind"] + if k not in KINDS: + raise Refusal("doc.node.kind", "unknown kind " + k, nid) + kids = doc.kids(nid) + if [doc.nodes[c]["ord"] for c in kids] != list(range(len(kids))): + raise Refusal("doc.tree.ord", "child order is not 0..n-1", nid) + counts = {} + for i, c in enumerate(kids): + ck = doc.nodes[c]["kind"] + if ck not in CHILDREN[k]: + raise Refusal("doc.tree.child", "%s may not contain %s" % (k, ck), c) + counts[ck] = counts.get(ck, 0) + 1 + if ck == "heading" and i != 0: + raise Refusal("doc.tree.child", "a heading must be a section's first child", c) + for ck, cnt in counts.items(): + if cnt > 1 and (ck in AT_MOST_ONCE or ck == "heading"): + raise Refusal("doc.tree.child", "%s may occur once in %s" % (ck, k), nid) + if k == "table" and counts.get("table-body", 0) != 1: + raise Refusal("doc.tree.child", "a table has exactly one table-body", nid) + if k in NONEMPTY and not kids: + raise Refusal("doc.tree.empty", "%s must have children" % k, nid) + if n.get("label") is not None and k not in LABELLED: + raise Refusal("doc.node.label", "%s does not take a label" % k, nid) + _check_content(doc, nid) + + +def _check_content(doc, nid): + n = doc.nodes[nid] + k = n["kind"] + if n.get("withheld"): + if "content" in n: + raise Refusal("doc.policy.withheld", "a withheld node keeps no content", nid) + return + if k in RUN_KINDS: + runs = n.get("content") + if not isinstance(runs, list) or not runs: + raise Refusal("doc.node.content", "runs are required", nid) + if canonical_runs(runs) != runs: + raise Refusal("doc.run.canonical", "runs are not in canonical form", nid) + eq_refs = [] + for r in runs: + if r["kind"] not in RUNS: + raise Refusal("doc.run.kind", "unknown run kind " + r["kind"], nid) + st = r.get("style", []) + if any(s not in STYLES for s in st) or ("sup" in st and "sub" in st): + raise Refusal("doc.run.style", "bad style set", nid) + if r["kind"] == "equation": + eq_refs.append(r["node"]) + kids = doc.kids(nid) + if eq_refs != kids: + raise Refusal("doc.run.equation", "equation runs must name the sentence's children in order", nid) + elif k in MATH_KINDS: + c = n.get("content") or {} + if c.get("notation") not in ("tex", "typst") or not isinstance(c.get("source"), str): + raise Refusal("doc.node.content", "equations need a notation and a source", nid) + elif k in VERBATIM_KINDS: + c = n.get("content") or {} + if not isinstance(c.get("text"), str): + raise Refusal("doc.node.content", "verbatim nodes need text", nid) + elif "content" in n: + raise Refusal("doc.node.content", "%s holds no content" % k, nid) + if k == "section" and not isinstance(n.get("attrs", {}).get("level"), int): + raise Refusal("doc.node.attrs", "a section needs a level", nid) + + +def leaf_kinds(): + return LEAVES diff --git a/vectors/README.md b/vectors/README.md new file mode 100644 index 0000000..78b6676 --- /dev/null +++ b/vectors/README.md @@ -0,0 +1,27 @@ +# Test vectors + +Each file holds one case per line, in canonical JSON, with an `id`, the inputs, and the expected outputs. +Every value was computed by the oracle in `tools/` and is checked again by `tools/check.py`; none is typed by hand. + +| File | Tests | Chapter | +| --- | --- | --- | +| `canonical-json.jsonl` | `input_json`, parsed with every number as an IEEE 754 double, and its canonical `output`. | [1.1](../spec/01-conventions.md#11-canonical-json) | +| `normalize.jsonl` | Normalization for hashing, and the SHA-256 of the result. | [1.4](../spec/01-conventions.md#14-text-normalization-for-hashing) | +| `ids.jsonl` | Minting payloads and node IDs; letter-first encodings of digests. | [4](../spec/04-identity.md) | +| `notation.jsonl` | Each source's canonical linear form, or null when it is complex. | [5.4](../spec/05-hashes.md#54-simple-notation) | +| `projections.jsonl` | One-sentence runs: plain, normalized, strict and lossy projections, complex keys and the three text values. | [5.3](../spec/05-hashes.md#53-the-strict-projection) | +| `projection-groups.jsonl` | Which cases must share, or must differ in, a value. | [5.3](../spec/05-hashes.md#53-the-strict-projection) | +| `offsets.jsonl` | Code-point spans and their UTF-16 equivalents. | [1.5](../spec/01-conventions.md#15-character-offsets) | +| `hashes.jsonl` | Every node of a small document, its own content and its five values. | [5.1](../spec/05-hashes.md#51-the-five-values) | +| `addresses.jsonl` | How addresses parse; null for invalid ones. | [6.1](../spec/06-anchors.md#61-addresses) | +| `keyed.jsonl` | The team key and its ID, an HMAC text hash, page hashes, a page key, and what a non-holder can and cannot check. | [5.8](../spec/05-hashes.md#58-keyed-hashes) | +| `fingerprints.jsonl` | Page inputs, the stamp rules that removed lines, the fingerprint text and the fingerprint. | [7.1](../spec/07-geometry.md#71-page-fingerprints) | +| `merkle.jsonl` | Receipt items and their RFC 6962 roots. | [8.5](../spec/08-fidelity.md#85-merkle-roots) | +| `signatures.jsonl` | The RFC 8032 test vector, and a receipt's record hash, payload and signature. | [8.4](../spec/08-fidelity.md#84-record-hashes-and-signatures) | +| `spotcheck.jsonl` | Seed payloads, seeds, sample sizes and samples. | [8.8](../spec/08-fidelity.md#88-spot-checks) | +| `bounds.jsonl` | Clopper–Pearson bounds as reported. | [8.9](../spec/08-fidelity.md#89-reviewer-error-bounds) | +| `alignment.jsonl` | Two readings, their pairs and their suspects. | [5.6](../spec/05-hashes.md#56-alignment) | +| `corrections.jsonl` | Each operation and refusal on a small document: the state before, the correction, and the record and state after, or the rule. | [11](../spec/11-corrections.md) | +| `resolve.jsonl` | Anchors made at revision 0 and how each resolves against a fixture package. | [6.5](../spec/06-anchors.md#65-resolution) | +| `rights.jsonl` | Stage checks with policies and expiry, the combining rule, and backend conditions. | [14](../spec/14-rights.md) | +| `grading.jsonl` | Exercises, submissions and grades. | [19.4](../spec/19-exercises.md#194-grading) | diff --git a/vectors/addresses.jsonl b/vectors/addresses.jsonl new file mode 100644 index 0000000..87814ab --- /dev/null +++ b/vectors/addresses.jsonl @@ -0,0 +1,14 @@ +{"address":"cornell1995second#k3m9q2a","id":"plain","parsed":{"key":"cornell1995second","node":"k3m9q2a","pin":null,"span":null,"store":null}} +{"address":"cornell1995second#k3m9q2a@4f1a0c","id":"pinned","parsed":{"key":"cornell1995second","node":"k3m9q2a","pin":"4f1a0c","span":null,"store":null}} +{"address":"cornell1995second#k3m9q2a@4f1a0c[12:57]","id":"span","parsed":{"key":"cornell1995second","node":"k3m9q2a","pin":"4f1a0c","span":[12,57],"store":null}} +{"address":"smithlab/cornell1995second#k3m9q2a","id":"store","parsed":{"key":"cornell1995second","node":"k3m9q2a","pin":null,"span":null,"store":"smithlab"}} +{"address":"dong2026machine.v2#k3m9q2a[0:0]","id":"span-no-pin","parsed":{"key":"dong2026machine.v2","node":"k3m9q2a","pin":null,"span":[0,0],"store":null}} +{"address":"cornell1995second.si#m2x8p4d","id":"si","parsed":{"key":"cornell1995second.si","node":"m2x8p4d","pin":null,"span":null,"store":null}} +{"address":"cornell1995second#b-p03-text-004","id":"alias","parsed":{"key":"cornell1995second","node":"b-p03-text-004","pin":null,"span":null,"store":null}} +{"address":"cornell1995second#k3m9q2a[57:12]","id":"bad-reversed","parsed":null} +{"address":"cornell1995second#k3m9q2a@4F1A0C","id":"bad-pin","parsed":null} +{"address":"k#k3m9q2a[01:2]","id":"bad-leading-zero","parsed":null} +{"address":"cornell1995second#","id":"bad-no-node","parsed":null} +{"address":"Cornell1995#k3m9q2a","id":"bad-upper-key","parsed":null} +{"address":"a/b/c#k3m9q2a","id":"bad-two-stores","parsed":null} +{"address":"k#k3m9q2a@4f1a","id":"bad-pin-length","parsed":null} diff --git a/vectors/alignment.jsonl b/vectors/alignment.jsonl new file mode 100644 index 0000000..98969aa --- /dev/null +++ b/vectors/alignment.jsonl @@ -0,0 +1 @@ +{"a":[{"complex":[],"container":"h","context":"heading","id":"a1","lossy":"methods","runs":[{"kind":"text","text":"Methods"}],"strict":"Methods"},{"complex":[],"container":"p1","context":"paragraph","id":"a2","lossy":"everybondwasscannedinstepsof0.01åarounditsminimum.","runs":[{"kind":"text","text":"Every bond was scanned in steps of 0.01 Å around its minimum."}],"strict":"Every bond was scanned in steps of 0.01 Å around its minimum."},{"complex":["tex:\\frac{a}{b}"],"container":"p1","context":"paragraph","id":"a3","lossy":"whereisthebondlength.","runs":[{"kind":"text","text":"where "},{"kind":"math","notation":"tex","source":"\\frac{a}{b}"},{"kind":"text","text":" is the bond length."}],"strict":"where  is the bond length."},{"complex":[],"container":"p1","context":"paragraph","id":"a4","lossy":"thefittedrateis103persecondatroomtemperature.","runs":[{"kind":"text","text":"The fitted rate is 10³ per second at room temperature."}],"strict":"The fitted rate is 10^{3} per second at room temperature."},{"complex":["tex:\\frac{c}{d}"],"container":"p2","context":"paragraph","id":"a5","lossy":"whereisthebondlength.","runs":[{"kind":"text","text":"where "},{"kind":"math","notation":"tex","source":"\\frac{c}{d}"},{"kind":"text","text":" is the bond length."}],"strict":"where  is the bond length."},{"complex":[],"container":"p2","context":"paragraph","id":"a6","lossy":"thissentencewasdroppedbythesecondreadingentirely.","runs":[{"kind":"text","text":"This sentence was dropped by the second reading entirely."}],"strict":"This sentence was dropped by the second reading entirely."},{"complex":[],"container":"p2","context":"paragraph","id":"a7","lossy":"thelastsentenceofthesectionisuniqueandlongenough.","runs":[{"kind":"text","text":"The last sentence of the section is unique and long enough."}],"strict":"The last sentence of the section is unique and long enough."}],"b":[{"complex":[],"container":"x","context":"paragraph","id":"b1","lossy":"methods","runs":[{"kind":"text","text":"Methods"}],"strict":"Methods"},{"complex":[],"container":"q1","context":"paragraph","id":"b2","lossy":"everybondwasscannedinstepsof0.01åarounditsminimum.","runs":[{"kind":"text","text":"Every bond was scanned in steps of 0.01 Å around its minimum."}],"strict":"Every bond was scanned in steps of 0.01 Å around its minimum."},{"complex":["tex:\\frac{a}{b}"],"container":"q1","context":"paragraph","id":"b3","lossy":"whereisthebondlength.","runs":[{"kind":"text","text":"where "},{"kind":"math","notation":"tex","source":"\\frac{a}{b}"},{"kind":"text","text":" is the bond length."}],"strict":"where  is the bond length."},{"complex":[],"container":"q2","context":"paragraph","id":"b4","lossy":"thefittedrateis103persecondatroomtemperature.","runs":[{"kind":"text","text":"The fitted rate is 103 per second at room temperature."}],"strict":"The fitted rate is 103 per second at room temperature."},{"complex":["tex:\\frac{c}{e}"],"container":"q2","context":"paragraph","id":"b5","lossy":"whereisthebondlength.","runs":[{"kind":"text","text":"where "},{"kind":"math","notation":"tex","source":"\\frac{c}{e}"},{"kind":"text","text":" is the bond length."}],"strict":"where  is the bond length."},{"complex":[],"container":"q2","context":"paragraph","id":"b6","lossy":"asentenceonlythesecondreadinghas,alsolong.","runs":[{"kind":"text","text":"A sentence only the second reading has, also long."}],"strict":"A sentence only the second reading has, also long."},{"complex":[],"container":"q2","context":"paragraph","id":"b7","lossy":"thelastsentenceofthesectionisuniqueandlongenough.","runs":[{"kind":"text","text":"The last sentence of the section is unique and long enough."}],"strict":"The last sentence of the section is unique and long enough."}],"expect":{"pairs":[{"a":"a1","agree":true,"b":"b1"},{"a":"a2","agree":true,"b":"b2"},{"a":"a3","agree":true,"b":"b3"},{"a":"a4","agree":false,"b":"b4"},{"a":"a5","agree":false,"b":"b5"},{"a":"a7","agree":true,"b":"b7"}],"suspects":[{"a":"a1","b":"b1","kind":"structure"},{"a":"a4","b":"b4","kind":"number"},{"a":"a5","b":"b5","kind":"equation"},{"a":"a4","b":"b4","kind":"join"},{"a":"a5","b":"b5","kind":"join"},{"a":"a6","b":null,"kind":"dropped"},{"a":null,"b":"b6","kind":"added"}]},"id":"two-readings"} diff --git a/vectors/bounds.jsonl b/vectors/bounds.jsonl new file mode 100644 index 0000000..d6030bc --- /dev/null +++ b/vectors/bounds.jsonl @@ -0,0 +1,8 @@ +{"approx":0.258865551,"bound":"0.258866","confidence":"0.95","errors":0,"id":"k0-n10","sampled":10} +{"approx":0.009936082,"bound":"0.009937","confidence":"0.95","errors":0,"id":"k0-n300","sampled":300} +{"approx":0.394163302,"bound":"0.394164","confidence":"0.95","errors":1,"id":"k1-n10","sampled":10} +{"approx":0.015714555,"bound":"0.015715","confidence":"0.95","errors":1,"id":"k1-n300","sampled":300} +{"approx":0.120614155,"bound":"0.120615","confidence":"0.95","errors":2,"id":"k2-n50","sampled":50} +{"approx":0.102253378,"bound":"0.102254","confidence":"0.95","errors":5,"id":"k5-n100","sampled":100} +{"approx":0.95,"bound":"0.950000","confidence":"0.95","errors":0,"id":"k0-n1","sampled":1} +{"approx":1,"bound":"1.000000","confidence":"0.95","errors":10,"id":"k10-n10","sampled":10} diff --git a/vectors/canonical-json.jsonl b/vectors/canonical-json.jsonl new file mode 100644 index 0000000..b04c853 --- /dev/null +++ b/vectors/canonical-json.jsonl @@ -0,0 +1,5 @@ +{"id":"sort-utf16","input_json":"{\"\\u20ac\": 1, \"\\ud83d\\ude00\": 2, \"a\": 3, \"\\ufb01\": 4}","output":"{\"a\":3,\"€\":1,\"😀\":2,\"fi\":4}"} +{"id":"numbers","input_json":"[0, -0.0, 1.0, 100.0, 72.10, 1E21, 1e-7, 0.000001, 123456789012345678901, -2.5e-5, 4.50e2]","output":"[0,0,1,100,72.1,1e+21,1e-7,0.000001,123456789012345680000,-0.000025,450]"} +{"id":"escapes","input_json":"{\"s\": \"tab\\tnl\\ncr\\rq\\\"bs\\\\ctl\\u0001del\\u007fnbsp\\u00a0slash\\/\"}","output":"{\"s\":\"tab\\tnl\\ncr\\rq\\\"bs\\\\ctl\\u0001delnbsp slash/\"}"} +{"id":"nested","input_json":"{ \"b\" : [ true , false , null ] , \"a\" : { \"z\" : \"\" , \"y\" : [ ] } }","output":"{\"a\":{\"y\":[],\"z\":\"\"},\"b\":[true,false,null]}"} +{"id":"strings-stay-unnormalized","input_json":"{\"cafe\\u0301\": \"e\\u0301\", \"caf\\u00e9\": \"\\u00e9\"}","output":"{\"café\":\"é\",\"café\":\"é\"}"} diff --git a/vectors/corrections.jsonl b/vectors/corrections.jsonl new file mode 100644 index 0000000..6e69e5d --- /dev/null +++ b/vectors/corrections.jsonl @@ -0,0 +1,21 @@ +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"kind":"crop","sha256":"4839e386aceece09ab1602a8291e072f2cc4e322e44ef458666f9b89c4ed6e54"}],"find":"42.0","op":"replace","reason":"Vector.","replace":"42.5","target":"v43b2r1"},"doc":"tiny2026example","expect":{"ids":[],"nodes":[{"align_key":"307cdef8d5f3588c7c53e5a240d4b783ace86b546f90f1303f7cf6ead8b45eee","id":"ayan7gn","kind":"document","match_hash":"7e518193f164955e7e1205873f30a8d194afc803781f7b6f7809a70add0b644f","node_hash":"ae2daed860c8da51f4c8b0797832445597b8274ba802fe8871eb4dafeaef0e90","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"f79b4988b957d68c5d3737e422d036319aec6e712a6bbdc8440c66442c6e439e"},{"align_key":"7f41a785f070a6215cfcce68bfe1a1338eb1d0254f9489144e337cb3282b97e8","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"ee940b24d902afdb8975216bbbdf24fc8d78448952a1d616b6a3a8bca19ff797","node_hash":"4211edeb9fb73654f594488447f5c096564d372bbf950f1c25662a634cf97a2a","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"ac9bb67e4905d3e0e6eca791434c5c78c95d93496a7828b336ab2ddfec201c16"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"779d7967a4e24ebefbf9afca6731484b2831a71c44bd28b69d2df0501cc05a2f","id":"gj83ag8","kind":"paragraph","match_hash":"9170b6f6f6108138330252801d45f6e50667941c6d8bbb50ee8e2506ee9a8aec","node_hash":"f0b9d04b4a51940940909c579061af1ae1443545a6d8518dcb0833876d015d2d","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"a7c03223ac633d843f09b99f10bfe2b1ac93c48d92f1ce2bee370193c0dc8bab"},{"align_key":"2584e81a8f1bf4b1dbbe7b71d1fb29393026895cfa782b35064a2f3ad1cf890a","content":[{"kind":"text","text":"The value is 42.5 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"fa01fe9148af8b6eee1cbf001af30288929e9ac93b44de562569d006e046f277","node_hash":"ecbde59d339e26fa6a9ff0a48d820b915f791c0d91b419f4ad878a969331c076","ord":0,"own_hash":"40442b4483a236a2683b0d30e646f4f1b4f8cf573574fc06a76cefaf8849d265","parent":"gj83ag8","text_hash":"fa01fe9148af8b6eee1cbf001af30288929e9ac93b44de562569d006e046f277"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"record":{"after":"ecbde59d339e26fa6a9ff0a48d820b915f791c0d91b419f4ad878a969331c076","at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"before":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","evidence":[{"kind":"crop","sha256":"4839e386aceece09ab1602a8291e072f2cc4e322e44ef458666f9b89c4ed6e54"}],"find":"42.0","format":"scienting-correction/1","id":"c7xr0mtwp4vtf","index":1,"op":"replace","path":["ayan7gn","mzkksmc","gj83ag8"],"reason":"Vector.","replace":"42.5","target":"v43b2r1","touched":["v43b2r1"]}},"id":"replace-digit"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"by":"ana","kind":"person"}],"find":"42.0","op":"replace","reason":"Vector.","replace":"42.5","target":"v43b2r1"},"doc":"tiny2026example","expect":{"refusal":"correction.digits"},"id":"replace-digit-no-crop"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"by":"ana","kind":"person"}],"find":"second","op":"replace","reason":"Vector.","replace":"later","target":"pd32xxr"},"doc":"tiny2026example","expect":{"ids":[],"nodes":[{"align_key":"d5d0d7484318a8bbb9ff86e72db046272df3de603cd66887e5e36ac5e346b7b1","id":"ayan7gn","kind":"document","match_hash":"93f6f7e23166833034b23b9b3022d67440822f938c192264e97599687264ee2b","node_hash":"d39748182066c26032fb436584aff4e0e8e0cba45b291d31f6cc5c8b34a70c2b","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"76d2d3127a13daffec6418162db302f089043973b5ff98c0ad8b7cd5b37116fe"},{"align_key":"ffdcc21ef1e1688586f97ee07e3fe67a3f6c3c145ed22bdb86696b3c10fc4118","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"4aa5b3e8da313ac2c0ca4cb1f324e5bde4ecf70b16d6ec9df9e64c59ff88d5be","node_hash":"fa6ef4a9b675021097208177d0cb31758b7c84bd55b9d605b4f4b9ece3e336c3","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"5e2a8f77bb3b78aa1c322d063368b7f74728df621421eb68cef5813ff2951e24"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"e2ffdc15a0aedd399bb1289258ce99f80f764cfb4124c273c5f5635884c9a05b","id":"pevazrk","kind":"paragraph","match_hash":"67882c3dc9b34613d96420fd3ca430b8be29013086f08f4ec203460f7b74ed04","node_hash":"9fe14a64167feee947551a33ebbe4f45ee8f242fa5f6d7f8b3c1ca6419efcb61","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"67882c3dc9b34613d96420fd3ca430b8be29013086f08f4ec203460f7b74ed04"},{"align_key":"58ef15516c7e769fe65626153c05a0f99a693959c9efe141b1d3b05e5d45751e","content":[{"kind":"text","text":"A later paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"08cc4ab6f3ade7710e5f7fac5675ad9e4b6ec3eed4385dbddc01d3266b197860","node_hash":"7638ac33bece08d53c97170c50a2d42759fa8ae6970c27635f343b95c9190f7a","ord":0,"own_hash":"6681b0147e9aef501504638010d88c9d07a81fb66ead3e6bc21549a04d296bad","parent":"pevazrk","text_hash":"08cc4ab6f3ade7710e5f7fac5675ad9e4b6ec3eed4385dbddc01d3266b197860"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"record":{"after":"7638ac33bece08d53c97170c50a2d42759fa8ae6970c27635f343b95c9190f7a","at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"before":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","evidence":[{"by":"ana","kind":"person"}],"find":"second","format":"scienting-correction/1","id":"t4b9t1y8v42yz","index":1,"op":"replace","path":["ayan7gn","mzkksmc","pevazrk"],"reason":"Vector.","replace":"later","target":"pd32xxr","touched":["pd32xxr"]}},"id":"replace-word"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"kind":"crop","sha256":"4839e386aceece09ab1602a8291e072f2cc4e322e44ef458666f9b89c4ed6e54"}],"find":"0","op":"replace","reason":"Vector.","replace":"1","target":"v43b2r1"},"doc":"tiny2026example","expect":{"refusal":"correction.find"},"id":"replace-not-unique"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"kind":"crop","sha256":"4839e386aceece09ab1602a8291e072f2cc4e322e44ef458666f9b89c4ed6e54"}],"find":"300 K","op":"replace","reason":"Vector.","replace":[{"kind":"math","notation":"tex","source":"300\\,\\mathrm{K}"}],"target":"v43b2r1"},"doc":"tiny2026example","expect":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"e5c0a8bc46dcfaa863a8b1b8b47cf1ce17f92fbe843c24809efe7bc06c61dd36","node_hash":"f67704dd44e5c1a6139c383be9fa1563af3e1935cd42e9799110752567043657","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"230751a057cfb05c90472d0519b1494bceb8e97935b0bb25d2c84f5df88d5bd3"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"6ed7a9811ba0ea36c025e36e27cb8217983db65052156998b8420fb7393e7676","node_hash":"52fa1bcd0a430b00f636b88b459f25c3b82e1d42db4b696633b0ba009b7a39cc","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"9181fb7a9952168f1abc94771d7101fa4563403432448094f8f5f0532f093a9b"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"780246e820ddb4784bee63ad5f3c049e9cfad6c761b7e75981826004bb3952b9","node_hash":"2b1ee3dee493d589cc31e51ccf7bb10e45d5f365986be8d422ee1211b7cf0aaf","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"ffcfd4089d7a6bf62d23c41c1e99db8a44a1e2f7c45c1af93986f55a5464afa9"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at "},{"kind":"math","notation":"tex","source":"300\\,\\mathrm{K}"},{"kind":"text","text":"."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"f506115d79413340915fbd30daadfefe57d9e44e01ecb19401d78e8b77b04a13","node_hash":"f021a9d2435fcf11eb1babafeaec52991d37c997d4ca312d50a58bc18ab10d74","ord":0,"own_hash":"b4a20ac47e1a725076b316d9fb8822d09b6a0eabc1218eb2e826999ecbed53bb","parent":"gj83ag8","text_hash":"f3ee4cc22182a9b3809ef1bf269dbad11ba7c93835503d96b2ed97cf9d142501"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"record":{"after":"f021a9d2435fcf11eb1babafeaec52991d37c997d4ca312d50a58bc18ab10d74","at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"before":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","evidence":[{"kind":"crop","sha256":"4839e386aceece09ab1602a8291e072f2cc4e322e44ef458666f9b89c4ed6e54"}],"find":"300 K","format":"scienting-correction/1","id":"xzx1w5xabsc7w","index":1,"op":"replace","path":["ayan7gn","mzkksmc","gj83ag8"],"reason":"Vector.","replace":[{"kind":"math","notation":"tex","source":"300\\,\\mathrm{K}"}],"target":"v43b2r1","touched":["v43b2r1"]}},"id":"replace-runs"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"kind":"crop","sha256":"4839e386aceece09ab1602a8291e072f2cc4e322e44ef458666f9b89c4ed6e54"}],"offset":8,"op":"insert","reason":"Vector.","run":0,"target":"whq15cf","text":"only "},"doc":"tiny2026example","expect":{"ids":[],"nodes":[{"align_key":"41a48a1f6c072bced379281d83bd875c18dfd34dc49ebc199bac497801a8b11d","id":"ayan7gn","kind":"document","match_hash":"727a0da7d0c63834ce7242b5ccec3900513af7e3b25af81b01f0465a89424421","node_hash":"9ce69202874d31a6765acc1f8349fc9a2a2ae3826a1e21ad8a447d624a8be978","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"320f3fde695d79169292cefb68b14bed141c5ab63f3e9d589944f55ff4da0c3c"},{"align_key":"82285464d23f37d25a5aeeaca0820b253cf60d660ea1711dab0f21c03fd956d1","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"a97e2212e1985ef783fb936b5fef3df1a1eb3747696c5610c5c3c94dd1b3926a","node_hash":"445f0a9d1750f9e4b225c2fa6dd7d610919313b9f070e447f44134b7eed31fc5","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"19dae57535f85e33aa21255c80ac56b2866c3a07b5897cf0c627009320c80219"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"4426408fb036372fdcf34395f08c667faed4d165b2885574ae2989230cfcd366","id":"pevazrk","kind":"paragraph","match_hash":"945c1a5609cd53e380f766ffd5777928e9a0a34317d53f0ffcb3906b4c4f094b","node_hash":"ebac9e474a5e9faeb4964ee7654e2cca938e161723bbfa6de281dd79f5c5ac16","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"945c1a5609cd53e380f766ffd5777928e9a0a34317d53f0ffcb3906b4c4f094b"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"e90693965ecebdc9ee2c319315dda9cfffe6d67a0308a5991421300697b0209c","content":[{"kind":"text","text":"It ends only here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"064f49112344bfcd430112b87384d6933a8a783c8ff8d7cddc3eb620cadee476","node_hash":"12c5bbc6dbeab7ca663098bd43232161665be1fe5a8ff7294a1be947398acf8d","ord":1,"own_hash":"ab57bab359f24cc15245ee7e245f174d5eebf61ed7e24091ede26c95014bb8fb","parent":"pevazrk","text_hash":"064f49112344bfcd430112b87384d6933a8a783c8ff8d7cddc3eb620cadee476"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"record":{"after":"12c5bbc6dbeab7ca663098bd43232161665be1fe5a8ff7294a1be947398acf8d","at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"before":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","evidence":[{"kind":"crop","sha256":"4839e386aceece09ab1602a8291e072f2cc4e322e44ef458666f9b89c4ed6e54"}],"format":"scienting-correction/1","id":"brc88wwz10pme","index":1,"offset":8,"op":"insert","path":["ayan7gn","mzkksmc","pevazrk"],"reason":"Vector.","run":0,"target":"whq15cf","text":"only ","touched":["whq15cf"]}},"id":"insert-text"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"by":"ana","kind":"person"}],"offset":8,"op":"insert","reason":"Vector.","run":0,"target":"whq15cf","text":"only "},"doc":"tiny2026example","expect":{"refusal":"correction.evidence"},"id":"insert-text-no-crop"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"kind":"crop","sha256":"4839e386aceece09ab1602a8291e072f2cc4e322e44ef458666f9b89c4ed6e54"}],"node":{"content":[{"kind":"text","text":"A dropped sentence."}],"kind":"sentence"},"op":"insert","parent":"pevazrk","place_after":"pd32xxr","reason":"Vector."},"doc":"tiny2026example","expect":{"ids":[],"nodes":[{"align_key":"6ec26beeb8a65c2a45fe92187cb014aa12458c923834b1e2a224839175ff978a","id":"ayan7gn","kind":"document","match_hash":"505eb15ffd9dae39efc48d382547fe95b0c06ebeab536a9ba3987caec136d72a","node_hash":"c838cc79e35d2160ac6aa5bf8f43749f0df82966a21596ce5c383f0a7f924531","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"7b8f52695e653922bd53599a4dd170145e9736ebb582aff1142c0e2925410643"},{"align_key":"376a90f437df93f81485a5965637d40e584c94c9b16020be00bc20d2ff914720","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"db9b2be0e3700a6cfdd638ae1504d315b286746d7eade11212d8c3e1319f7b79","node_hash":"5e8d37c11069820d68a1cac874c19e2f0f168989d8be61ff73f7d3e32bb2d5d4","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"6ee72cbdd5d3fb25cdfe80488b78ef6adeca4cf1a8740712c5f6e95fcf480991"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"447cf4606eaf26ea5e0c2e853d369fd35557361e701c7176450c015d66dfd9b4","id":"pevazrk","kind":"paragraph","match_hash":"48ca423e488af5806237fc4f81200941bed73b6e49a116a08b8be7fc21a39529","node_hash":"2057a40d06bbdf67d40bee4e0c1fc550233e9c49c3f46237f920571129ff5ae6","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"48ca423e488af5806237fc4f81200941bed73b6e49a116a08b8be7fc21a39529"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"06f7b55ab26a52c8a75a5206105f3eacd8b91ed37399d6507d36712295ed9bca","content":[{"kind":"text","text":"A dropped sentence."}],"id":"cxqe41k","kind":"sentence","match_hash":"67f0bb4b7a714ef1ecbf8fe70ec014122586ae104fa09ade1b83dd293f970251","node_hash":"74b9823a10437fb783f5b6018e6002ccce5ec2def03c945c9ab4a479eda7675d","ord":1,"own_hash":"adb284d8e83512c418b112fc1afe66e695bab257542f0daf03c7430402ec841f","parent":"pevazrk","text_hash":"67f0bb4b7a714ef1ecbf8fe70ec014122586ae104fa09ade1b83dd293f970251"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":2,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"record":{"after":"74b9823a10437fb783f5b6018e6002ccce5ec2def03c945c9ab4a479eda7675d","at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"before":null,"created":["cxqe41k"],"evidence":[{"kind":"crop","sha256":"4839e386aceece09ab1602a8291e072f2cc4e322e44ef458666f9b89c4ed6e54"}],"format":"scienting-correction/1","id":"tcgfx1qdk0zpm","index":1,"node":{"content":[{"kind":"text","text":"A dropped sentence."}],"kind":"sentence"},"op":"insert","parent":"pevazrk","path":["ayan7gn","mzkksmc","pevazrk"],"place_after":"pd32xxr","reason":"Vector.","target":"cxqe41k","touched":["cxqe41k"]}},"id":"insert-node"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"by":"ana","kind":"person"}],"op":"delete","reason":"Vector.","target":"pevazrk"},"doc":"tiny2026example","expect":{"ids":[{"id":"pevazrk","kind":"retired","node_kind":"paragraph","rev":1,"successor":null},{"id":"pd32xxr","kind":"retired","node_kind":"sentence","rev":1,"successor":null},{"id":"whq15cf","kind":"retired","node_kind":"sentence","rev":1,"successor":null}],"nodes":[{"align_key":"2fadd2c2db90afd55fa1882a8b75c77f2b3c42ddf904ecc82cf02511b4c59263","id":"ayan7gn","kind":"document","match_hash":"8287586b5d9b9125cef727ae54eff914c320931ab2a33fdb73a3511dd4f33827","node_hash":"e0a5495ca059d147c6d9a46864f52288b94e2437c1ded2641c15182e8625c096","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"6ada36f2dab47e5ef92bc8329d62c5cf576c5eb18587997d0ab151200ab87adf"},{"align_key":"80fa7df5fffafbc399fa56c13bd39d03698d187ff007d91ccf495c6d20161f65","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"f9f02fe3049dcbedd1e3f63f5a9a60306b2ab2501de9861ed37335e629bb50e4","node_hash":"f10b2a2e5c38b5503138bad21d1da27d85869655fe2fd62c57d7070118f08556","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"d37b64cbae95acbde780dbd179569d4063554ede47c5e43c2a981ca6db5200f7"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":2,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"record":{"after":null,"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"before":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","evidence":[{"by":"ana","kind":"person"}],"format":"scienting-correction/1","id":"qqetx7zwtbdbp","index":1,"op":"delete","path":["ayan7gn","mzkksmc"],"reason":"Vector.","retired":["pevazrk","pd32xxr","whq15cf"],"target":"pevazrk","touched":["pd32xxr","whq15cf"]}},"id":"delete"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"by":"ana","kind":"person"}],"op":"delete","reason":"Vector.","target":"gj83ag8"},"doc":"tiny2026example","expect":{"refusal":"correction.digits"},"id":"delete-digits-no-crop"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"by":"ana","kind":"person"}],"offset":13,"op":"split","reason":"Vector.","target":"v43b2r1"},"doc":"tiny2026example","expect":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"b2a8e7b9b7bbd85d515539ead4f5ce6e2c1575af874741e6c0411a694160d45a","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"d9effe000dcda2c3b513f6e892e6b1898d9368cae6132cb93e6ce55cb8a33a68","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a2881052071c046fee4a8e85cfe2a85f6cd403a60fb5279fc7ab957ccfdf3f1a","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"f29ffbc41756b5d6b65f2d95aced9241d9e6f6cbc0f3095c79654ca5fb4842d7","content":[{"kind":"text","text":"The value is"}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"f3c3316e32a5fc734f072184962e4efc69fe6ce534c6467ea28d5d216418ce3f","node_hash":"5106bd7f918b6eef99a4137e9c7951fb819924a261949e3ba43b813b76b68b21","ord":0,"own_hash":"39642e0f2675dc38f33e54d6b5077b89b862150e6475ede5b75043b66031f4f7","parent":"gj83ag8","text_hash":"f3c3316e32a5fc734f072184962e4efc69fe6ce534c6467ea28d5d216418ce3f"},{"align_key":"e796489e949f8967be49d1a89d23b50ee1cbedd815124b4583d9c9cfcd26a68b","content":[{"kind":"text","text":"42.0 at 300 K."}],"fidelity":"F2","id":"h1ehc10","kind":"sentence","match_hash":"bdcb3ae4f656f9f1886cb9ae8fe2d2265bb3c9ffa240dc4dd0c4b420f7b85773","node_hash":"cb0487cb9b17b048c442a1167152cccf7f62107283211bc8474569831f2ba245","ord":1,"own_hash":"a3145828b095eed04855f0eb65e18f6391acb3cb64e4a2c5776f56faa59444c8","parent":"gj83ag8","text_hash":"bdcb3ae4f656f9f1886cb9ae8fe2d2265bb3c9ffa240dc4dd0c4b420f7b85773"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":2,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"record":{"after":"5106bd7f918b6eef99a4137e9c7951fb819924a261949e3ba43b813b76b68b21","at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"before":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","created":["h1ehc10"],"evidence":[{"by":"ana","kind":"person"}],"format":"scienting-correction/1","id":"d5pxjj718tsv0","index":1,"offset":13,"op":"split","path":["ayan7gn","mzkksmc","gj83ag8"],"reason":"Vector.","target":"v43b2r1","touched":["h1ehc10","v43b2r1"]}},"id":"split"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"by":"ana","kind":"person"}],"offset":6,"op":"split","reason":"Vector.","target":"jss11hp"},"doc":"tiny2026example","expect":{"refusal":"correction.split"},"id":"split-inside-xref"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"by":"ana","kind":"person"}],"joiner":" ","op":"merge","reason":"Vector.","target":"pd32xxr","with":"whq15cf"},"doc":"tiny2026example","expect":{"ids":[{"id":"whq15cf","kind":"retired","node_kind":"sentence","rev":1,"successor":"pd32xxr"}],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"3a08d1484b73ce657bba3ae85df0dd300ef9970afb527b54e886a81c377b7ce1","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"3d706ca3ac3a99e2af2fed3b7d5cc3c87a0198f5f2f88f39347dd629e933783b","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"868f0f5127954d4bacc42894944fbf09775dc571a88a0297d9687b29aa6a7cc6","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","content":[{"kind":"text","text":"A second paragraph. It ends here."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"74e8812b1beec14ea501ca218257c10b24318e264f7e2d34f19b1e8b8c731ab7","ord":0,"own_hash":"deace9c5c4208013043856b9bf910e8b92e2cb74f5a83d098004c5cb242ce6a0","parent":"pevazrk","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"record":{"after":"74e8812b1beec14ea501ca218257c10b24318e264f7e2d34f19b1e8b8c731ab7","at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"before":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","evidence":[{"by":"ana","kind":"person"}],"format":"scienting-correction/1","id":"dsc7qcz632fgf","index":1,"joiner":" ","op":"merge","path":["ayan7gn","mzkksmc","pevazrk"],"reason":"Vector.","retired":["whq15cf"],"target":"pd32xxr","touched":["pd32xxr","whq15cf"],"with":"whq15cf"}},"id":"merge"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"by":"ana","kind":"person"}],"op":"merge","reason":"Vector.","target":"v43b2r1","with":"pd32xxr"},"doc":"tiny2026example","expect":{"refusal":"correction.merge"},"id":"merge-not-adjacent"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"by":"ana","kind":"person"}],"op":"move","parent":"gj83ag8","place_after":null,"reason":"Vector.","target":"whq15cf"},"doc":"tiny2026example","expect":{"ids":[],"nodes":[{"align_key":"30da8787f3792df5a4e75f1d87d273d7aff410e107b663b9fd383a975ff9177c","id":"ayan7gn","kind":"document","match_hash":"07eb80f34efabcea897cd2b949e95443e5be8ec044b8fe2655e86b7abd9c4c37","node_hash":"ca1ca2245c8a256533a2573af15eeaadda2e61fc17806586d7ab19f66068f28a","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"a14e294152535392e6433d3f37ef2fbda2b20ec8f75a50ded71d270579590ed4"},{"align_key":"37e0f3f45a1d705dcd2a82ba5087c26048f8bc1697e3314087672219cf368eb9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"4ff38d2aa4195ffb3bafcb6871ed1f73ebdb415b28f343a59961306c95f303ad","node_hash":"ea5da50d44f3e40cd0412bb15f3badde517f0b0023f21f2d97a7f7558d0d2408","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"ac4f8c912c0b7647c3328c8cb1e6477eb2022a06704953640804f457c7371bd7"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"9a3f0cd42b75fa281cb12c86f8956d84df0a5453e3cfc87e5e7bfaafef35b239","id":"gj83ag8","kind":"paragraph","match_hash":"4c9c6e087af631d07b0a9307a03c9dad2b6358c12c1f4893cec59c6d34e1a693","node_hash":"d39d8b127eac13338bce169de2f83eae4afc7fdb2c8c6dc084729963cc553d3a","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"6e46e1038a90fb0ecd345eb2c1aa93f73eea29976417c54d03926ddc6a9c3861"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":0,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"gj83ag8","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":1,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":2,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","id":"pevazrk","kind":"paragraph","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"f70e1bc04609eb6272efbf2f8844c67165bccc1e9df8be4e62d9c826e0e34592","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"record":{"after":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"before":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","evidence":[{"by":"ana","kind":"person"}],"format":"scienting-correction/1","id":"sc1nbzshw4z18","index":1,"op":"move","parent":"gj83ag8","path":["ayan7gn","mzkksmc","pevazrk"],"place_after":null,"reason":"Vector.","target":"whq15cf","to_path":["ayan7gn","mzkksmc","gj83ag8"],"touched":["whq15cf"]}},"id":"move"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"by":"ana","kind":"person"}],"kind":"quote","op":"reclassify","reason":"Vector.","target":"pevazrk"},"doc":"tiny2026example","expect":{"refusal":"doc.tree.child"},"id":"reclassify"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"by":"ana","kind":"person"}],"kind":"paragraph","op":"reclassify","reason":"Vector.","target":"v43b2r1"},"doc":"tiny2026example","expect":{"refusal":"correction.reclassify"},"id":"reclassify-bad"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"kind":"crop","sha256":"4839e386aceece09ab1602a8291e072f2cc4e322e44ef458666f9b89c4ed6e54"}],"label":"2","op":"relabel","reason":"Vector.","target":"mzkksmc"},"doc":"tiny2026example","expect":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"a5f4090b52040f9e31dbc442e48c873cd500ee6ce869aeb6f9bca47a3bebea68","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"2","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"66e074f38d119bd264bb4264f797636b52c69f2a4d4214252d1a32944cc2cc2d","ord":0,"own_hash":"705939943052c43c01c27e7d40d86f6a5fc3af71539ba76d44369885429e40c3","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"record":{"after":"66e074f38d119bd264bb4264f797636b52c69f2a4d4214252d1a32944cc2cc2d","at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"before":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","evidence":[{"kind":"crop","sha256":"4839e386aceece09ab1602a8291e072f2cc4e322e44ef458666f9b89c4ed6e54"}],"format":"scienting-correction/1","from":"1","id":"f6dw4wmycw8e1","index":1,"label":"2","op":"relabel","path":["ayan7gn"],"reason":"Vector.","target":"mzkksmc","touched":[]}},"id":"relabel-section"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","author":{"key":"ana"},"evidence":[{"by":"ana","kind":"person"}],"label":"Table 2","op":"relabel","reason":"Vector.","target":"r12vgb0"},"doc":"tiny2026example","expect":{"refusal":"correction.digits"},"id":"relabel-digit-no-crop"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","attr":"colspan","author":{"key":"ana"},"evidence":[{"by":"ana","kind":"person"}],"op":"set","reason":"Vector.","target":"k69qp1x","value":2},"doc":"tiny2026example","expect":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"843b220dc02152e86e41af24960babbb97f285a1b306ddc085fa7afd3b3abe0a","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"e4374c0c73d8a3e73a7cb9e198bbf72337f3ff1f88677d5fd12df08c7112e047","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"e5b03b1e6bb6d1f9a79f4743300cb7d0760bf5d3f4f23c00b894e1049ab1b7b2","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"0bd7ea5095ba05c3ed26d613fec8fcf2bdf161442baa0c8ec8a216fb3470f1e7","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"1a43518530edf8af5293f47ff90b527ce32ba68e36f80dc21ca831dbf15249f0","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":2,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"822f09e2aa080fe0bf10601d68ab47a313420e17f06d526b3d587a476cf4545b","ord":1,"own_hash":"c98e6d9f9c145fd2c930de5b42932c6f2e234e477cd4736ddc26f9d343515135","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"record":{"after":"822f09e2aa080fe0bf10601d68ab47a313420e17f06d526b3d587a476cf4545b","at":"2026-10-11T12:00:00Z","attr":"colspan","author":{"key":"ana"},"before":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","evidence":[{"by":"ana","kind":"person"}],"format":"scienting-correction/1","from":1,"id":"ktsarspb86wb8","index":1,"op":"set","path":["ayan7gn","mzkksmc","r12vgb0","ep5mjrt","aqxkkpz"],"reason":"Vector.","target":"k69qp1x","touched":["k69qp1x"],"value":2}},"id":"set-colspan"} +{"before":{"ids":[],"nodes":[{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"ayan7gn","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"ayan7gn","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"gtjh3x4","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"mzkksmc","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"gtjh3x4","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"gj83ag8","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"gj83ag8","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","ord":1,"own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","parent":"gj83ag8","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"pevazrk","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"mzkksmc","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"pevazrk","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"pevazrk","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","ord":3,"own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","parent":"mzkksmc","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"qsjm48k","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"r12vgb0","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"wttrzx4","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"qsjm48k","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","ord":0,"own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","parent":"wttrzx4","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","ord":1,"own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","parent":"wttrzx4","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"ep5mjrt","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"r12vgb0","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"ep5mjrt","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","ord":0,"own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","parent":"aqxkkpz","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","ord":1,"own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","parent":"aqxkkpz","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"bx2ttrv","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"ayan7gn","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"c6t4qr5","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"bx2ttrv","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"c6t4qr5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}],"rev":0},"correction":{"at":"2026-10-11T12:00:00Z","attr":"level","author":{"key":"ana"},"evidence":[{"by":"ana","kind":"person"}],"op":"set","reason":"Vector.","target":"k69qp1x","value":2},"doc":"tiny2026example","expect":{"refusal":"correction.set"},"id":"set-not-settable"} diff --git a/vectors/fingerprints.jsonl b/vectors/fingerprints.jsonl new file mode 100644 index 0000000..cd197d2 --- /dev/null +++ b/vectors/fingerprints.jsonl @@ -0,0 +1,6 @@ +{"id":"acs-download-1","page":{"images":[],"lines":[{"text":"Harmonic bond parameters for small organic molecules from a two-step fit"},{"text":"R. Hale and M. Osei"},{"text":"We fit harmonic bond constants for twelve bonds in two steps, first to a scan and then to vibrational frequencies."},{"text":"The two parameter sets agree to within 2% for every bond."},{"text":"Introduction"},{"text":"Harmonic bond terms remain the most common description of covalent stretching in classical force fields.1"},{"text":"The bond energy is given by $$E_{\\mathrm{bond}} = \\frac{1}{2} K_r (r - r_{\\mathrm{eq}})^2$$ where $K_r$ is the bond force constant and $r_\\mathrm{eq}$ the equilibrium bond length."},{"text":"Water, H$_2$O, served as the first test case, with a bending band near 1595 cm⁻¹.2"},{"text":"Values below 10−3 kcal mol⁻¹ were treated as zero."},{"text":"Table 1 lists the fitted constants for both parameter sets."},{"text":"CT–HC"},{"text":"340.0"},{"text":"1.090"},{"text":"338.7"},{"text":"1.0900"},{"text":"OW–HW"},{"text":"553.0"},{"text":"0.9572"},{"text":"548.1"},{"text":"0.9570"},{"box":[8,200,20,600],"text":"Downloaded via UNIVERSITY OF EXAMPLE on October 11, 2026 at 15:02:11 (UTC)."},{"box":[580,200,592,600],"text":"See https://pubs.acs.org/sharingguidelines for options on how to legitimately share published articles."}],"size":[612,792]},"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","removed":["downloaded-via","sharing-guidelines"],"rules":"scienting-stamps-1","text":"Harmonicbondparametersforsmallorganicmoleculesfromatwo-stepfitR.HaleandM.OseiWefitharmonicbondconstantsfortwelvebondsintwosteps,firsttoascanandthentovibrationalfrequencies.Thetwoparametersetsagreetowithin2%foreverybond.IntroductionHarmonicbondtermsremainthemostcommondescriptionofcovalentstretchinginclassicalforcefields.1Thebondenergyisgivenby$$E_{\\mathrm{bond}}=\\frac{1}{2}K_r(r-r_{\\mathrm{eq}})^2$$where$K_r$isthebondforceconstantand$r_\\mathrm{eq}$theequilibriumbondlength.Water,H$_2$O,servedasthefirsttestcase,withabendingbandnear1595cm^{−1}.2Valuesbelow10−3kcalmol^{−1}weretreatedaszero.Table1liststhefittedconstantsforbothparametersets.CT–HC340.01.090338.71.0900OW–HW553.00.9572548.10.9570"} +{"id":"acs-download-2","page":{"images":[],"lines":[{"text":"Harmonic bond parameters for small organic molecules from a two-step fit"},{"text":"R. Hale and M. Osei"},{"text":"We fit harmonic bond constants for twelve bonds in two steps, first to a scan and then to vibrational frequencies."},{"text":"The two parameter sets agree to within 2% for every bond."},{"text":"Introduction"},{"text":"Harmonic bond terms remain the most common description of covalent stretching in classical force fields.1"},{"text":"The bond energy is given by $$E_{\\mathrm{bond}} = \\frac{1}{2} K_r (r - r_{\\mathrm{eq}})^2$$ where $K_r$ is the bond force constant and $r_\\mathrm{eq}$ the equilibrium bond length."},{"text":"Water, H$_2$O, served as the first test case, with a bending band near 1595 cm⁻¹.2"},{"text":"Values below 10−3 kcal mol⁻¹ were treated as zero."},{"text":"Table 1 lists the fitted constants for both parameter sets."},{"text":"CT–HC"},{"text":"340.0"},{"text":"1.090"},{"text":"338.7"},{"text":"1.0900"},{"text":"OW–HW"},{"text":"553.0"},{"text":"0.9572"},{"text":"548.1"},{"text":"0.9570"},{"box":[8,210,20,590],"text":"Downloaded via EXAMPLE PHARMA INC on March 2, 2027 at 09:14:55 (UTC)."},{"box":[580,200,592,600],"text":"See https://pubs.acs.org/sharingguidelines for options on how to legitimately share published articles."}],"size":[612,792]},"page_fp":"6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","removed":["downloaded-via","sharing-guidelines"],"rules":"scienting-stamps-1","text":"Harmonicbondparametersforsmallorganicmoleculesfromatwo-stepfitR.HaleandM.OseiWefitharmonicbondconstantsfortwelvebondsintwosteps,firsttoascanandthentovibrationalfrequencies.Thetwoparametersetsagreetowithin2%foreverybond.IntroductionHarmonicbondtermsremainthemostcommondescriptionofcovalentstretchinginclassicalforcefields.1Thebondenergyisgivenby$$E_{\\mathrm{bond}}=\\frac{1}{2}K_r(r-r_{\\mathrm{eq}})^2$$where$K_r$isthebondforceconstantand$r_\\mathrm{eq}$theequilibriumbondlength.Water,H$_2$O,servedasthefirsttestcase,withabendingbandnear1595cm^{−1}.2Valuesbelow10−3kcalmol^{−1}weretreatedaszero.Table1liststhefittedconstantsforbothparametersets.CT–HC340.01.090338.71.0900OW–HW553.00.9572548.10.9570"} +{"id":"acs-changed-text","page":{"images":[],"lines":[{"text":"Harmonic bond parameters for small organic molecules from a two-step fit"},{"text":"R. Hale and M. Osei"},{"text":"We fit harmonic bond constants for twelve bonds in two steps, first to a scan and then to vibrational frequencies."},{"text":"The two parameter sets agree to within 2% for every bond."},{"text":"Introduction"},{"text":"Harmonic bond terms remain the most common description of covalent stretching in classical force fields.1"},{"text":"The bond energy is given by $$E_{\\mathrm{bond}} = \\frac{1}{2} K_r (r - r_{\\mathrm{eq}})^2$$ where $K_r$ is the bond force constant and $r_\\mathrm{eq}$ the equilibrium bond length."},{"text":"Water, H$_2$O, served as the first test case, with a bending band near 1594 cm⁻¹.2"},{"text":"Values below 10−3 kcal mol⁻¹ were treated as zero."},{"text":"Table 1 lists the fitted constants for both parameter sets."},{"text":"CT–HC"},{"text":"340.0"},{"text":"1.090"},{"text":"338.7"},{"text":"1.0900"},{"text":"OW–HW"},{"text":"553.0"},{"text":"0.9572"},{"text":"548.1"},{"text":"0.9570"},{"box":[8,200,20,600],"text":"Downloaded via UNIVERSITY OF EXAMPLE on October 11, 2026 at 15:02:11 (UTC)."},{"box":[580,200,592,600],"text":"See https://pubs.acs.org/sharingguidelines for options on how to legitimately share published articles."}],"size":[612,792]},"page_fp":"b545d28562fc1747d37b2418f4bb546581d1541218a377ff49864672d0f69d6e","removed":["downloaded-via","sharing-guidelines"],"rules":"scienting-stamps-1","text":"Harmonicbondparametersforsmallorganicmoleculesfromatwo-stepfitR.HaleandM.OseiWefitharmonicbondconstantsfortwelvebondsintwosteps,firsttoascanandthentovibrationalfrequencies.Thetwoparametersetsagreetowithin2%foreverybond.IntroductionHarmonicbondtermsremainthemostcommondescriptionofcovalentstretchinginclassicalforcefields.1Thebondenergyisgivenby$$E_{\\mathrm{bond}}=\\frac{1}{2}K_r(r-r_{\\mathrm{eq}})^2$$where$K_r$isthebondforceconstantand$r_\\mathrm{eq}$theequilibriumbondlength.Water,H$_2$O,servedasthefirsttestcase,withabendingbandnear1594cm^{−1}.2Valuesbelow10−3kcalmol^{−1}weretreatedaszero.Table1liststhefittedconstantsforbothparametersets.CT–HC340.01.090338.71.0900OW–HW553.00.9572548.10.9570"} +{"id":"wiley-download-1","page":{"images":["fc7fa8eee212bc9675823f9a9ae3c99da47b2f81b71db96eb6c870c4b2ddeece"],"lines":[{"text":"Results"},{"text":"The fitted slope is 0.42 ± 0.03 per kelvin."},{"box":[580,100,592,740],"text":"Downloaded from https://onlinelibrary.wiley.com/doi/10.5555/example.wiley by Example University, Wiley Online Library on [11/10/2026]. See the Terms and Conditions (https://onlinelibrary.wiley.com/terms-and-conditions) on Wiley Online Library for rules of use."}],"size":[595.276,841.89]},"page_fp":"790d28cc2c1c24a1d3cae91490c15531ddeb0fc9a891cc68ea3b5118ad92e80a","removed":["downloaded-from-on"],"rules":"scienting-stamps-1","text":"ResultsThefittedslopeis0.42±0.03perkelvin."} +{"id":"wiley-download-2","page":{"images":["fc7fa8eee212bc9675823f9a9ae3c99da47b2f81b71db96eb6c870c4b2ddeece"],"lines":[{"text":"Results"},{"text":"The fitted slope is 0.42 ± 0.03 per kelvin."},{"box":[580,100,592,740],"text":"Downloaded from https://onlinelibrary.wiley.com/doi/10.5555/example.wiley by Example Pharma Inc, Wiley Online Library on [02/03/2027]."},{"box":[580,60,592,99],"text":"See the Terms and Conditions (https://onlinelibrary.wiley.com/terms-and-conditions) on Wiley Online Library for rules of use."}],"size":[595.276,841.89]},"page_fp":"790d28cc2c1c24a1d3cae91490c15531ddeb0fc9a891cc68ea3b5118ad92e80a","removed":["downloaded-from-on","terms-and-conditions"],"rules":"scienting-stamps-1","text":"ResultsThefittedslopeis0.42±0.03perkelvin."} +{"id":"scanned","page":{"images":["e7fe0677b342d86116a06d5d0865aef635be3fb52817be909d3c82258e31c8f1"],"lines":[],"size":[612.4,791.6]},"page_fp":"af1fbff58cac18341b82a5c0e3d48bb22663ef01ba183dbfc55a019d0a6e17b9","removed":[],"rules":"scienting-stamps-1","text":""} diff --git a/vectors/grading.jsonl b/vectors/grading.jsonl new file mode 100644 index 0000000..70adde2 --- /dev/null +++ b/vectors/grading.jsonl @@ -0,0 +1,3 @@ +{"exercise":{"exercise":"anchor","format":"scienting-exercise/1","key":{"elements":[{"anchors":[{"context":{"column_path":["Set A","$K_r$ (kcal mol⁻¹ Å⁻²)"],"row_path":["Bond parameters","CT–CT"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"nkm3xn5","node_hash":"21f13b21948078f64c564334e5bb180b4495edb25a79ae32aa967986a626f3d5","own_hash":"2937e2a6f14cfebd4ffd20e3d514e5cbbf0626a5c0089b7cbea817ef20782b3d","quote":{"exact":"310.0"},"rev":12,"store":"smithlab"}],"feedback":{"hit":"That is the cell.","miss":"Look in Table 1, row CT–CT."},"points":"1"}]},"prompt":"Find the table cell that gives the Set A bond constant for the CT–CT bond.","rule":{"match":"same-node"}},"expect":{"exercise":"urn:scienting:annotation:smithlab/h6s98vg6qcyjp","format":"scienting-grade/1","items":[{"element":"element:0","feedback":"That is the cell.","max":"1","points":"1"}],"max":"1","score":"1","submission":"h4camq2b6fa0e"},"id":"anchor-hit","package":"fixtures/packages/hale2026harmonic","submission":{"answers":{"anchors":[{"context":{"column_path":["Set A","$K_r$ (kcal mol⁻¹ Å⁻²)"],"row_path":["Bond parameters","CT–CT"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"nkm3xn5","node_hash":"21f13b21948078f64c564334e5bb180b4495edb25a79ae32aa967986a626f3d5","own_hash":"2937e2a6f14cfebd4ffd20e3d514e5cbbf0626a5c0089b7cbea817ef20782b3d","quote":{"exact":"310.0"},"rev":12,"store":"smithlab"}]},"doc":"smithlab/hale2026harmonic","exercise":"urn:scienting:annotation:smithlab/h6s98vg6qcyjp","format":"scienting-submission/1","id":"h4camq2b6fa0e","rev":12,"student":"s-7k2m","submitted_at":"2026-10-20T10:00:00Z"}} +{"exercise":{"exercise":"anchor","format":"scienting-exercise/1","key":{"elements":[{"anchors":[{"context":{"column_path":["Set A","$K_r$ (kcal mol⁻¹ Å⁻²)"],"row_path":["Bond parameters","CT–CT"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"nkm3xn5","node_hash":"21f13b21948078f64c564334e5bb180b4495edb25a79ae32aa967986a626f3d5","own_hash":"2937e2a6f14cfebd4ffd20e3d514e5cbbf0626a5c0089b7cbea817ef20782b3d","quote":{"exact":"310.0"},"rev":12,"store":"smithlab"}],"feedback":{"hit":"That is the cell.","miss":"Look in Table 1, row CT–CT."},"points":"1"}]},"prompt":"Find the table cell that gives the Set A bond constant for the CT–CT bond.","rule":{"match":"same-node"}},"expect":{"exercise":"urn:scienting:annotation:smithlab/h6s98vg6qcyjp","format":"scienting-grade/1","items":[{"element":"element:0","feedback":"Look in Table 1, row CT–CT.","max":"1","points":"0"}],"max":"1","score":"0","submission":"bjgg8jyxh42w9"},"id":"anchor-miss","package":"fixtures/packages/hale2026harmonic","submission":{"answers":{"anchors":[{"context":{"column_path":["Set B","$K_r$ (kcal mol⁻¹ Å⁻²)"],"row_path":["Bond parameters","CT–CT"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"hw8fx4r","node_hash":"e554e4381827c90595a9083fd3a16e6cc72d0b14e52b3d86104c4b42a9f101b8","own_hash":"6356e0e8a0c4c9911e9657be9ee00e47fbe2ee6c54928d2b3d126266b19fa1e3","quote":{"exact":"305.2"},"rev":12,"store":"smithlab"}]},"doc":"smithlab/hale2026harmonic","exercise":"urn:scienting:annotation:smithlab/h6s98vg6qcyjp","format":"scienting-submission/1","id":"bjgg8jyxh42w9","rev":12,"student":"s-9q4p","submitted_at":"2026-10-20T10:00:00Z"}} +{"exercise":{"exercise":"check","format":"scienting-exercise/1","key":{"elements":[{"anchors":[{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"mbtjsqv","node_hash":"97c328c2e2efedd931292eeda806d3e4bad14d67cfcc324537c0d993068cfbfc","own_hash":"c1c6019d21c26d790304f7f7a080e93cf507d0e22ebeec6bf2e7df19a1820b3b","quote":{"exact":"the most common description","prefix":"Harmonic bond terms remain ","suffix":" of covalent stretching in class"},"rev":12,"span":[27,54],"store":"smithlab"}],"points":"1"}],"verdict":{"points":"1","value":"supports"}},"prompt":"Does the cited passage support the claim that harmonic terms are the most common choice?","rule":{"match":"overlap","min_overlap":"0.5"}},"expect":{"exercise":"urn:scienting:annotation:smithlab/y228zv031s285","format":"scienting-grade/1","items":[{"element":"verdict","feedback":"","max":"1","points":"1"},{"element":"element:0","feedback":"","max":"1","points":"1"}],"max":"2","score":"2","submission":"ncf5gq0x1xny5"},"id":"check-overlap","package":"fixtures/packages/hale2026harmonic","submission":{"answers":{"anchors":[{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"mbtjsqv","node_hash":"97c328c2e2efedd931292eeda806d3e4bad14d67cfcc324537c0d993068cfbfc","own_hash":"c1c6019d21c26d790304f7f7a080e93cf507d0e22ebeec6bf2e7df19a1820b3b","quote":{"exact":"most common description of covalent","prefix":"Harmonic bond terms remain the ","suffix":" stretching in classical force f"},"rev":12,"span":[31,66],"store":"smithlab"}],"verdict":"supports"},"doc":"smithlab/hale2026harmonic","exercise":"urn:scienting:annotation:smithlab/y228zv031s285","format":"scienting-submission/1","id":"ncf5gq0x1xny5","rev":12,"student":"s-7k2m","submitted_at":"2026-10-20T10:05:00Z"}} diff --git a/vectors/hashes.jsonl b/vectors/hashes.jsonl new file mode 100644 index 0000000..c455fc0 --- /dev/null +++ b/vectors/hashes.jsonl @@ -0,0 +1 @@ +{"doc":"tiny2026example","id":"tiny2026example","nodes":[{"id":"ayan7gn","kind":"document","ord":0,"parent":null},{"attrs":{"level":1},"id":"mzkksmc","kind":"section","label":"1","ord":0,"parent":"ayan7gn"},{"id":"gtjh3x4","kind":"heading","ord":0,"parent":"mzkksmc"},{"content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"fvafy61","kind":"sentence","ord":0,"parent":"gtjh3x4"},{"id":"gj83ag8","kind":"paragraph","ord":1,"parent":"mzkksmc"},{"content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"v43b2r1","kind":"sentence","ord":0,"parent":"gj83ag8"},{"content":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}],"fidelity":"F2","id":"jss11hp","kind":"sentence","ord":1,"parent":"gj83ag8"},{"id":"pevazrk","kind":"paragraph","ord":2,"parent":"mzkksmc"},{"content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"pd32xxr","kind":"sentence","ord":0,"parent":"pevazrk"},{"content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"whq15cf","kind":"sentence","ord":1,"parent":"pevazrk"},{"attrs":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}]},"id":"r12vgb0","kind":"table","label":"Table 1","ord":3,"parent":"mzkksmc"},{"id":"qsjm48k","kind":"table-head","ord":0,"parent":"r12vgb0"},{"id":"wttrzx4","kind":"row","ord":0,"parent":"qsjm48k"},{"attrs":{"colspan":1,"column":"ssa3ng1","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"qrvfgfb","kind":"cell","ord":0,"parent":"wttrzx4"},{"attrs":{"colspan":1,"column":"hrr9g38","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"cjkdv61","kind":"cell","ord":1,"parent":"wttrzx4"},{"id":"ep5mjrt","kind":"table-body","ord":1,"parent":"r12vgb0"},{"attrs":{"header_path":["tn1vrf0"]},"id":"aqxkkpz","kind":"row","ord":0,"parent":"ep5mjrt"},{"attrs":{"colspan":1,"column":"ssa3ng1","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"tn1vrf0","kind":"cell","ord":0,"parent":"aqxkkpz"},{"attrs":{"colspan":1,"column":"hrr9g38","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"k69qp1x","kind":"cell","ord":1,"parent":"aqxkkpz"},{"id":"bx2ttrv","kind":"back","ord":1,"parent":"ayan7gn"},{"id":"c6t4qr5","kind":"references","ord":0,"parent":"bx2ttrv"},{"content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"w1dkdqd","kind":"reference","label":"1","ord":0,"parent":"c6t4qr5"}],"own_content":{"aqxkkpz":{"kind":"row"},"ayan7gn":{"kind":"document"},"bx2ttrv":{"kind":"back"},"c6t4qr5":{"kind":"references"},"cjkdv61":{"colspan":1,"column":"hrr9g38","kind":"cell","role":"column-header","rowspan":1,"runs":[{"kind":"text","text":"y"}]},"ep5mjrt":{"kind":"table-body"},"fvafy61":{"kind":"sentence","runs":[{"kind":"text","text":"Results"}]},"gj83ag8":{"kind":"paragraph"},"gtjh3x4":{"kind":"heading"},"jss11hp":{"kind":"sentence","runs":[{"kind":"text","text":"See "},{"kind":"xref","target":"r12vgb0","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["w1dkdqd"],"text":"1"}]},"k69qp1x":{"colspan":1,"column":"hrr9g38","kind":"cell","role":"data","rowspan":1,"runs":[{"kind":"text","text":"2.5"}]},"mzkksmc":{"heading":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","kind":"section","label":"1","level":1},"pd32xxr":{"kind":"sentence","runs":[{"kind":"text","text":"A second paragraph."}]},"pevazrk":{"kind":"paragraph"},"qrvfgfb":{"colspan":1,"column":"ssa3ng1","kind":"cell","role":"column-header","rowspan":1,"runs":[{"kind":"text","text":"x"}]},"qsjm48k":{"kind":"table-head"},"r12vgb0":{"columns":[{"header_path":["qrvfgfb"],"id":"ssa3ng1"},{"header_path":["cjkdv61"],"id":"hrr9g38"}],"kind":"table","label":"Table 1"},"tn1vrf0":{"colspan":1,"column":"ssa3ng1","kind":"cell","role":"row-header","rowspan":1,"runs":[{"kind":"text","text":"1"}]},"v43b2r1":{"kind":"sentence","runs":[{"kind":"text","text":"The value is 42.0 at 300 K."}]},"w1dkdqd":{"kind":"reference","label":"1","runs":[{"kind":"text","text":"1. An Example, 2020."}]},"whq15cf":{"kind":"sentence","runs":[{"kind":"text","text":"It ends here."}]},"wttrzx4":{"kind":"row"}},"values":{"aqxkkpz":{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"cbf7f0e28878839fc67164f984f355aa17940b0b5bcdac84fa0acf02088c51c5","own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},"ayan7gn":{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"5bca682ef032725a940cf6745051126022a1ad6bd465bb3c051dae35ddfbbd17","own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"},"bx2ttrv":{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},"c6t4qr5":{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},"cjkdv61":{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"e5934b14bfa48e6849f2902d59934dfa81e86a9866f656a0270d9df2d6226078","own_hash":"998016f16491e03afa608cc94b7fcefab902a14cb34e3fff0d0fff89fb86f352","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"},"ep5mjrt":{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"3f35859eba03154798b8ff15a5d8824eeef5575f32b45cf3296905fc4bb21f54","own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"},"fvafy61":{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},"gj83ag8":{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"a5b991f3f9d3119d4b9f667004147da0c216eec55b8e15c1e90f4916486fd345","own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"},"gtjh3x4":{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"},"jss11hp":{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"ec5d51bd0027283d3a6f32dce37228ac9290eba1eae32b12c0d148ae247fbb78","own_hash":"d9635148479076021e01e1eb9185f1745a457bb2d238a4f9ed0b402ce254f91a","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"},"k69qp1x":{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"413dfb455f4b2940f62e25f18b4dbafb1ea0dd2378b20b33d3ac18e3221245bf","own_hash":"06a46f626bb4440bf00073abccf1bd9d40d720716c7db0c450a195e6a21c6a9f","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"},"mzkksmc":{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"83b33c64f1aab4df2f6bc32ee36aa4e5f77410681e2dea8289f64d569fdafbcb","own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"},"pd32xxr":{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"},"pevazrk":{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"},"qrvfgfb":{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"a1cc3f2e8226fd3036f8d3d93b810dd6606e1b59f1b0383e8f9f4cdc9b173f56","own_hash":"d53525cf48c39de2bb927a544a794ce376a17fb0ebb612b689c65fec0b7aa6e1","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"},"qsjm48k":{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"04e6622242646b6052b86a57925be08c9f6b7d999467d87274f7456b01ecb247","own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"},"r12vgb0":{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"ebd9f10b75d9cf43fd910a1a8eacf83726f8134b30eca27e02e67b346b9fd312","own_hash":"013341a8bee3a2b7ba24f5d4fdb14744e3218b3c4e38919642e9c632b125ddf2","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"},"tn1vrf0":{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"ef0f58e83c4f36c7eca0b3380e3f520bb6684a182045296691af46980a3951f6","own_hash":"c7c43dbead054b40edde7e5a1f36e263d768543f275d4276f93942a2ace348a9","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"},"v43b2r1":{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"},"w1dkdqd":{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"},"whq15cf":{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"},"wttrzx4":{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"791f6ab408d83eed26e381ec8cffd8c3f3d877eefb72d1ef1b5aaac5bcfde12b","own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}}} diff --git a/vectors/ids.jsonl b/vectors/ids.jsonl new file mode 100644 index 0000000..03f74ad --- /dev/null +++ b/vectors/ids.jsonl @@ -0,0 +1,8 @@ +{"doc":"cornell1995second","id":"mint-cornell1995second-sentence-0","kind":"sentence","node_id":"m0666ac","occurrence":0,"payload":"[\"scienting-id/1\",\"cornell1995second\",\"sentence\",\"92cc199c38785d890c7e284dbe881d529d25650998e4178eb0515ac930140eff\",0]","sha256":"8e018c65322796ed82da86ab61b447d459e05eff453a01036b9b2551ad96e62d","text_hash":"92cc199c38785d890c7e284dbe881d529d25650998e4178eb0515ac930140eff"} +{"doc":"cornell1995second","id":"mint-cornell1995second-sentence-1","kind":"sentence","node_id":"ahp2fgc","occurrence":1,"payload":"[\"scienting-id/1\",\"cornell1995second\",\"sentence\",\"92cc199c38785d890c7e284dbe881d529d25650998e4178eb0515ac930140eff\",1]","sha256":"008d84f8315477ba07b5562fead3fc98f0920b2767a57841c88f518d18514ed1","text_hash":"92cc199c38785d890c7e284dbe881d529d25650998e4178eb0515ac930140eff"} +{"doc":"cornell1995second.si","id":"mint-cornell1995second.si-sentence-0","kind":"sentence","node_id":"za1xybq","occurrence":0,"payload":"[\"scienting-id/1\",\"cornell1995second.si\",\"sentence\",\"92cc199c38785d890c7e284dbe881d529d25650998e4178eb0515ac930140eff\",0]","sha256":"2b507be5de00943482fe0c669e67544bdb81816906e91929be17df5a7cbf9ead","text_hash":"92cc199c38785d890c7e284dbe881d529d25650998e4178eb0515ac930140eff"} +{"doc":"hale2026harmonic","id":"mint-hale2026harmonic-cell-0","kind":"cell","node_id":"cvda0nm","occurrence":0,"payload":"[\"scienting-id/1\",\"hale2026harmonic\",\"cell\",\"b478fdfee29a549693a103681b3ad91c628d0f16ad0a7b2c5b089fe8ecd1f6ca\",0]","sha256":"02db540ad38e4c8fab3dcdbc56c71604fbe9e2e431b720d0d339d94c30a4bdfe","text_hash":"b478fdfee29a549693a103681b3ad91c628d0f16ad0a7b2c5b089fe8ecd1f6ca"} +{"doc":"hale2026harmonic","id":"mint-hale2026harmonic-column-0","kind":"column","node_id":"kp6grmd","occurrence":0,"payload":"[\"scienting-id/1\",\"hale2026harmonic\",\"column\",\"ff13bf8f571a0a91afeb93bca4cecccdd5d069b06cab8264d8318183bb572c24\",0]","sha256":"09b1a18a34b670f87dd18ff78fdd6d0c65c4b3bca4a095f6563223d8a50eda17","text_hash":"ff13bf8f571a0a91afeb93bca4cecccdd5d069b06cab8264d8318183bb572c24"} +{"digest":"0000000000000000000000000000000000000000000000000000000000000000","id":"letter-first-00000000","node_id":"a000000","record_id":"a000000000000"} +{"digest":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","id":"letter-first-ffffffff","node_id":"qzzzzzz","record_id":"qzzzzzzzzzzzz"} +{"digest":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","id":"letter-first-2d711642","node_id":"be4b45d","record_id":"be4b45ds6p120"} diff --git a/vectors/keyed.jsonl b/vectors/keyed.jsonl new file mode 100644 index 0000000..184a70c --- /dev/null +++ b/vectors/keyed.jsonl @@ -0,0 +1,5 @@ +{"id":"team-key","key":"71dbdd6b7026141ae10e9c4da33fddced689ee0b35189180570233bca8542c8c","key_id":"f6ef75bf424b8a3c","secret":"2c0e80321d945493dc4a0e8778461bc9f8c4ed1ecfcaa07155e0a817fdedfffe"} +{"id":"team-hmac-text","key":"71dbdd6b7026141ae10e9c4da33fddced689ee0b35189180570233bca8542c8c","text":"310.0","text_hash_keyed":"28133af785f245c99c06c6f69c4e6dfea3f5200db72e8a8e61b0be56d51bd5e2","text_hash_plain":"b478fdfee29a549693a103681b3ad91c628d0f16ad0a7b2c5b089fe8ecd1f6ca"} +{"id":"page-hashes","page_fps":["6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60"],"page_hashes":["9dd865c7a19b44dc97a5d236859ed79174b25b72a5781d8df4f091d096de8908","1feb6882031349ca5eee822557bab0b6b0436a2d132ae8ca03babac2ff1948b8"]} +{"context":"layer:smithlab/kp4m2x7q","id":"page-key","key":"9261e87d2bc1d4b20467346c447b3966c90497d846b04d3ce35fd4155719e925","page_fps":["6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","128d5f76c2c78ee9410c2ab4dda8abaee279db0caeec8a1cc019c3b1bd04ba60"],"quote":"310.0","quote_mac":"0d8d4fcd55f1a4cfd7f254d597b7a5777b8865eb371283c03527ac8195ebb5ac"} +{"guess":"310.0","guess_sha256":"b478fdfee29a549693a103681b3ad91c628d0f16ad0a7b2c5b089fe8ecd1f6ca","id":"non-holder","note":"Without the pages, a guess hashes to the plain value, which the export never carries; with one page changed, the key differs.","quote_mac":"0d8d4fcd55f1a4cfd7f254d597b7a5777b8865eb371283c03527ac8195ebb5ac","wrong_key":"759a346f4816f2f5777b4122bd65134d0abcc263eab24298040644a12b6491b2","wrong_page_fps":["6272e6f3f4c1372f81ebcd20b813b836c62a1d683151cf135fc13900136213af","59705a341da66488fe33522f8aa4d5f4fbb7438c790804a3dc35890ac46e3515"]} diff --git a/vectors/merkle.jsonl b/vectors/merkle.jsonl new file mode 100644 index 0000000..6dbbc3d --- /dev/null +++ b/vectors/merkle.jsonl @@ -0,0 +1,6 @@ +{"id":"items-1","items":[["node","k0yqkzd","db87cee52504ca5732bad49ddb1d5b8551c011c1891996d58aacae47f66585ed"]],"root":"75adf0bb057af2a45d1389832649b7981b1ffa7833b7889e25c891756838333d"} +{"id":"items-2","items":[["node","k0yqkzd","db87cee52504ca5732bad49ddb1d5b8551c011c1891996d58aacae47f66585ed"],["node","h9haqzy","33112ee14ee469c3eb52fe90322ec81dd404a0093d565a6d71ce77cbc8124e3b"]],"root":"0919534b87e9cc2277960728287d034f6a053cb5f70e268f256f1068cb90cb2e"} +{"id":"items-3","items":[["node","k0yqkzd","db87cee52504ca5732bad49ddb1d5b8551c011c1891996d58aacae47f66585ed"],["node","h9haqzy","33112ee14ee469c3eb52fe90322ec81dd404a0093d565a6d71ce77cbc8124e3b"],["node","brghw1a","f998fe06afa0cfbe73e0449dc2b1698309e1b5714960f027b2858312b152c275"]],"root":"06ab1e0f8e62816966b59dc3b93813af34e82ad31122ff4a7513bf2369415b68"} +{"id":"items-4","items":[["node","k0yqkzd","db87cee52504ca5732bad49ddb1d5b8551c011c1891996d58aacae47f66585ed"],["node","h9haqzy","33112ee14ee469c3eb52fe90322ec81dd404a0093d565a6d71ce77cbc8124e3b"],["node","brghw1a","f998fe06afa0cfbe73e0449dc2b1698309e1b5714960f027b2858312b152c275"],["node","f1csy9e","97fb5f8538b89f6c1accfd19836b65a73b61fbc2e0cbf84bb858a0fffa3f1592"]],"root":"02aafed31655132fcbdada47ca422b301a43b479fc87c6db1f9175b823de0e62"} +{"id":"items-5","items":[["node","k0yqkzd","db87cee52504ca5732bad49ddb1d5b8551c011c1891996d58aacae47f66585ed"],["node","h9haqzy","33112ee14ee469c3eb52fe90322ec81dd404a0093d565a6d71ce77cbc8124e3b"],["node","brghw1a","f998fe06afa0cfbe73e0449dc2b1698309e1b5714960f027b2858312b152c275"],["node","f1csy9e","97fb5f8538b89f6c1accfd19836b65a73b61fbc2e0cbf84bb858a0fffa3f1592"],["node","qqe35f5","e9590c04cea54beb769a96148583176605389b3a3809162f2fd6392b43fb8382"]],"root":"4b6a23e70edefdbac14f83decd4af78622c35c8ca02b0c1b6329b3b81f32d978"} +{"id":"items-7","items":[["node","k0yqkzd","db87cee52504ca5732bad49ddb1d5b8551c011c1891996d58aacae47f66585ed"],["node","h9haqzy","33112ee14ee469c3eb52fe90322ec81dd404a0093d565a6d71ce77cbc8124e3b"],["node","brghw1a","f998fe06afa0cfbe73e0449dc2b1698309e1b5714960f027b2858312b152c275"],["node","f1csy9e","97fb5f8538b89f6c1accfd19836b65a73b61fbc2e0cbf84bb858a0fffa3f1592"],["node","qqe35f5","e9590c04cea54beb769a96148583176605389b3a3809162f2fd6392b43fb8382"],["node","vm2d8hy","acea77fd89c7fb586c8c7c612b53634c4571a40cf8b1bcecb002311210423f57"],["node","dy199dx","fa37de9da4b13b3a18882ece23d6bee24a329b77d488b984d6f5587ce3f0f6cf"]],"root":"7262ec554038131f59848f2761cab84e1c686d3f92a44e1919a78aeb680ea274"} diff --git a/vectors/normalize.jsonl b/vectors/normalize.jsonl new file mode 100644 index 0000000..606b28a --- /dev/null +++ b/vectors/normalize.jsonl @@ -0,0 +1,9 @@ +{"id":"nfc","input":"café","output":"café","sha256":"850f7dc43910ff890f8879c0ed26fe697c93a067ad93a7d50f466a7028a9bf4e"} +{"id":"collapse","input":"a \t\n b","output":"a b","sha256":"c8687a08aa5d6ed2044328fa6a697ab8e96dc34291e8c2034ae8c38e6fcc6d65"} +{"id":"trim","input":"  a b  ","output":"a b","sha256":"c8687a08aa5d6ed2044328fa6a697ab8e96dc34291e8c2034ae8c38e6fcc6d65"} +{"id":"angstrom-sign","input":"1.5 Å","output":"1.5 Å","sha256":"3560124dc46b97829d3cac905d18ff5abd7a9f75c7febff30b39b070a737ea09"} +{"id":"nbsp-thin","input":"300 K and 10 mol","output":"300 K and 10 mol","sha256":"2a620a3e13ea0187f32808491d258d53e161af8db36c614e91df9e625bad7440"} +{"id":"zero-width-kept","input":"a​b","output":"a​b","sha256":"8df62aef5f92e4c30c0c938497f55f60078c361a476e7e0448485194ad79f884"} +{"id":"ligature-kept","input":"fit","output":"fit","sha256":"b4ad6ce484479733a24952a73897a9ab4a329b663b6b279162471c3834dbd266"} +{"id":"micro-kept","input":"5 µm","output":"5 µm","sha256":"92794248cd1afe73490b3cb49f88608b3e92c920c70e9816b33987cb54b1f8ba"} +{"id":"line-separator","input":"one
two","output":"one two","sha256":"8ab63e29a4ba14e4e1688f9c15e5af90895421358c945b0431f85d66977bd3d2"} diff --git a/vectors/notation.jsonl b/vectors/notation.jsonl new file mode 100644 index 0000000..370ed93 --- /dev/null +++ b/vectors/notation.jsonl @@ -0,0 +1,34 @@ +{"canonical":"H_{2}O","id":"tex:H_2O","notation":"tex","source":"H_2O"} +{"canonical":"_{2}","id":"tex:_2","notation":"tex","source":"_2"} +{"canonical":"H_{2}O","id":"tex:\\mathrm{H}_{2}\\mathrm{O}","notation":"tex","source":"\\mathrm{H}_{2}\\mathrm{O}"} +{"canonical":"H_{2}O","id":"typst:H_2 O","notation":"typst","source":"H_2 O"} +{"canonical":"H_{2}O","id":"typst:upright(H)_2 upright(O)","notation":"typst","source":"upright(H)_2 upright(O)"} +{"canonical":"cm^{−1}","id":"tex:\\mathrm{cm}^{-1}","notation":"tex","source":"\\mathrm{cm}^{-1}"} +{"canonical":"cm^{−1}","id":"typst:\"cm\"^(-1)","notation":"typst","source":"\"cm\"^(-1)"} +{"canonical":"10^{−3}","id":"tex:10^{-3}","notation":"tex","source":"10^{-3}"} +{"canonical":"10^{−3}","id":"typst:10^(-3)","notation":"typst","source":"10^(-3)"} +{"canonical":"K_{r}","id":"tex:K_r","notation":"tex","source":"K_r"} +{"canonical":"K_{r}","id":"tex:K_{\\mathrm{r}}","notation":"tex","source":"K_{\\mathrm{r}}"} +{"canonical":"K_{r}","id":"typst:K_r","notation":"typst","source":"K_r"} +{"canonical":"α_{i}","id":"tex:\\alpha_i","notation":"tex","source":"\\alpha_i"} +{"canonical":"α_{i}","id":"tex:\\alpha_{i}","notation":"tex","source":"\\alpha_{i}"} +{"canonical":"x′_{1}","id":"tex:x'_1","notation":"tex","source":"x'_1"} +{"canonical":"x′","id":"tex:x^{\\prime}","notation":"tex","source":"x^{\\prime}"} +{"canonical":"T=300K","id":"tex:T = 300\\,\\mathrm{K}","notation":"tex","source":"T = 300\\,\\mathrm{K}"} +{"canonical":"−1.5","id":"tex:-1.5","notation":"tex","source":"-1.5"} +{"canonical":"ϵ","id":"tex:\\epsilon","notation":"tex","source":"\\epsilon"} +{"canonical":"ϵ","id":"typst:epsilon.alt","notation":"typst","source":"epsilon.alt"} +{"canonical":"a⋅b","id":"tex:a \\cdot b","notation":"tex","source":"a \\cdot b"} +{"canonical":"a⋅b","id":"typst:a dot b","notation":"typst","source":"a dot b"} +{"canonical":"a×b±c","id":"tex:a \\times b \\pm c","notation":"tex","source":"a \\times b \\pm c"} +{"canonical":"(x)^{2}","id":"tex:\\left(x\\right)^2","notation":"tex","source":"\\left(x\\right)^2"} +{"canonical":"(a+b)^{2}","id":"typst:(a+b)^2","notation":"typst","source":"(a+b)^2"} +{"canonical":null,"id":"tex:\\frac{a}{b}","notation":"tex","source":"\\frac{a}{b}"} +{"canonical":null,"id":"typst:a/b","notation":"typst","source":"a/b"} +{"canonical":null,"id":"tex:\\sqrt{2}","notation":"tex","source":"\\sqrt{2}"} +{"canonical":null,"id":"tex:\\mathbf{F}","notation":"tex","source":"\\mathbf{F}"} +{"canonical":null,"id":"tex:{ab}_2","notation":"tex","source":"{ab}_2"} +{"canonical":null,"id":"tex:x_1_2","notation":"tex","source":"x_1_2"} +{"canonical":null,"id":"tex:\\Delta G^\\circ","notation":"tex","source":"\\Delta G^\\circ"} +{"canonical":null,"id":"tex:E_{\\mathrm{bond}} = \\frac{1}{2} K_r (r - r_{\\mathrm{eq}})^2","notation":"tex","source":"E_{\\mathrm{bond}} = \\frac{1}{2} K_r (r - r_{\\mathrm{eq}})^2"} +{"canonical":"E=K_{r}(r−r_{eq})^{2}","id":"typst:E = K_r (r - r_\"eq\")^2","notation":"typst","source":"E = K_r (r - r_\"eq\")^2"} diff --git a/vectors/offsets.jsonl b/vectors/offsets.jsonl new file mode 100644 index 0000000..db09f44 --- /dev/null +++ b/vectors/offsets.jsonl @@ -0,0 +1,2 @@ +{"code_points":24,"exact":"$_2$O.","id":"bmp","plain":"A sentence about H$_2$O.","runs":[{"kind":"text","text":"A sentence about H"},{"kind":"math","notation":"tex","source":"_2"},{"kind":"text","text":"O."}],"span":[18,24],"utf16_span":[18,24],"utf16_units":24} +{"code_points":22,"exact":"$𝑥$","id":"astral","plain":"Let $𝑥$ vary with $𝑦$.","runs":[{"kind":"text","text":"Let "},{"kind":"math","notation":"tex","source":"𝑥"},{"kind":"text","text":" vary with "},{"kind":"math","notation":"tex","source":"𝑦"},{"kind":"text","text":"."}],"span":[4,7],"utf16_span":[4,8],"utf16_units":24} diff --git a/vectors/projection-groups.jsonl b/vectors/projection-groups.jsonl new file mode 100644 index 0000000..4559ac0 --- /dev/null +++ b/vectors/projection-groups.jsonl @@ -0,0 +1,11 @@ +{"cases":["h2o-math","h2o-split-math","h2o-mathrm","h2o-sub","h2o-unicode","h2o-typst"],"id":"h2o","same":"match_hash"} +{"cases":["wavenumber-unicode","wavenumber-sup","wavenumber-math","wavenumber-typst"],"id":"wavenumber","same":"match_hash"} +{"cases":["milli-unicode","milli-sup","milli-math"],"id":"milli","same":"match_hash"} +{"cases":["kr-math","kr-mathrm","kr-sub","kr-unicode"],"id":"kr","same":"match_hash"} +{"cases":["ligature","no-ligature"],"id":"ligature","same":"match_hash"} +{"cases":["micro-sign","greek-mu"],"id":"micro","same":"match_hash"} +{"cases":["lost-superscript","superscript"],"id":"103-align","same":"align_key"} +{"cases":["lost-superscript","superscript"],"differ":"match_hash","id":"103-match"} +{"cases":["cite-mark","cite-as-text"],"differ":"match_hash","id":"cite-structure"} +{"cases":["hyphen-before-digit","en-dash-before-digit"],"id":"dashes-align","same":"align_key"} +{"cases":["hyphen-before-digit","en-dash-before-digit"],"differ":"text_hash","id":"dashes-text"} diff --git a/vectors/projections.jsonl b/vectors/projections.jsonl new file mode 100644 index 0000000..80022df --- /dev/null +++ b/vectors/projections.jsonl @@ -0,0 +1,29 @@ +{"align_key":"bd1193ec5e58680b96a5c7b0d8200e1b42f1ff74a7b6ddc4858d470e949cbf9a","complex":[],"id":"h2o-math","lossy":"thesolventish2o.","match_hash":"45ae8b6b0b3c7c0acea0ab1bb873f0afbddb1a3cc7bae762a6304e86d8e11442","normalized":"The solvent is $H_2O$.","plain":"The solvent is $H_2O$.","runs":[{"kind":"text","text":"The solvent is "},{"kind":"math","notation":"tex","source":"H_2O"},{"kind":"text","text":"."}],"strict":"The solvent is H_{2}O.","text_hash":"db7febd83f01411039085c52f807f536ab9307f2a89f04a18dac9f744d4d9a38"} +{"align_key":"bd1193ec5e58680b96a5c7b0d8200e1b42f1ff74a7b6ddc4858d470e949cbf9a","complex":[],"id":"h2o-split-math","lossy":"thesolventish2o.","match_hash":"45ae8b6b0b3c7c0acea0ab1bb873f0afbddb1a3cc7bae762a6304e86d8e11442","normalized":"The solvent is H$_2$O.","plain":"The solvent is H$_2$O.","runs":[{"kind":"text","text":"The solvent is H"},{"kind":"math","notation":"tex","source":"_2"},{"kind":"text","text":"O."}],"strict":"The solvent is H_{2}O.","text_hash":"11cb89a8460bd1c34d530f70474695ff301ed1a320ee2d9ef297fa42b6607cb4"} +{"align_key":"bd1193ec5e58680b96a5c7b0d8200e1b42f1ff74a7b6ddc4858d470e949cbf9a","complex":[],"id":"h2o-mathrm","lossy":"thesolventish2o.","match_hash":"45ae8b6b0b3c7c0acea0ab1bb873f0afbddb1a3cc7bae762a6304e86d8e11442","normalized":"The solvent is $\\mathrm{H}_{2}\\mathrm{O}$.","plain":"The solvent is $\\mathrm{H}_{2}\\mathrm{O}$.","runs":[{"kind":"text","text":"The solvent is "},{"kind":"math","notation":"tex","source":"\\mathrm{H}_{2}\\mathrm{O}"},{"kind":"text","text":"."}],"strict":"The solvent is H_{2}O.","text_hash":"c1123ca8e33cce46335fdb27d94cf25a725fc6fa5e3c490faf590dbe7d74a12b"} +{"align_key":"bd1193ec5e58680b96a5c7b0d8200e1b42f1ff74a7b6ddc4858d470e949cbf9a","complex":[],"id":"h2o-sub","lossy":"thesolventish2o.","match_hash":"45ae8b6b0b3c7c0acea0ab1bb873f0afbddb1a3cc7bae762a6304e86d8e11442","normalized":"The solvent is H2O.","plain":"The solvent is H2O.","runs":[{"kind":"text","text":"The solvent is H"},{"kind":"text","style":["sub"],"text":"2"},{"kind":"text","text":"O."}],"strict":"The solvent is H_{2}O.","text_hash":"4eda9afcb99d2e6ee8ccebdda0162bab85dc96efdaff38fd6dbc898c661ca91a"} +{"align_key":"bd1193ec5e58680b96a5c7b0d8200e1b42f1ff74a7b6ddc4858d470e949cbf9a","complex":[],"id":"h2o-unicode","lossy":"thesolventish2o.","match_hash":"45ae8b6b0b3c7c0acea0ab1bb873f0afbddb1a3cc7bae762a6304e86d8e11442","normalized":"The solvent is H₂O.","plain":"The solvent is H₂O.","runs":[{"kind":"text","text":"The solvent is H₂O."}],"strict":"The solvent is H_{2}O.","text_hash":"2c0dd2f6a6adb414aa2fd642276c0cb5d0cf2248ef2cfc3b0ed77f2332aa2129"} +{"align_key":"bd1193ec5e58680b96a5c7b0d8200e1b42f1ff74a7b6ddc4858d470e949cbf9a","complex":[],"id":"h2o-typst","lossy":"thesolventish2o.","match_hash":"45ae8b6b0b3c7c0acea0ab1bb873f0afbddb1a3cc7bae762a6304e86d8e11442","normalized":"The solvent is $H_2 O$.","plain":"The solvent is $H_2 O$.","runs":[{"kind":"text","text":"The solvent is "},{"kind":"math","notation":"typst","source":"H_2 O"},{"kind":"text","text":"."}],"strict":"The solvent is H_{2}O.","text_hash":"ed0698f969e83d036babeee757eddede4fd4cba5b4f3af336644f5a8c6808954"} +{"align_key":"9467109667c9a35fb2df6a06327af4c63ef511a45e1a50e2c9386796d52d8bc9","complex":[],"id":"wavenumber-unicode","lossy":"abandnear1595cm−1.","match_hash":"d234490f1f606604bc9ff4f4c619bb81c91cc2683c0dd2cf412c9b03daf116bc","normalized":"A band near 1595 cm⁻¹.","plain":"A band near 1595 cm⁻¹.","runs":[{"kind":"text","text":"A band near 1595 cm⁻¹."}],"strict":"A band near 1595 cm^{−1}.","text_hash":"f9f6d5a155dadc7a3616969582c1d6f635185e17f41b88be611e8eb5f4e3a539"} +{"align_key":"9467109667c9a35fb2df6a06327af4c63ef511a45e1a50e2c9386796d52d8bc9","complex":[],"id":"wavenumber-sup","lossy":"abandnear1595cm−1.","match_hash":"d234490f1f606604bc9ff4f4c619bb81c91cc2683c0dd2cf412c9b03daf116bc","normalized":"A band near 1595 cm-1.","plain":"A band near 1595 cm-1.","runs":[{"kind":"text","text":"A band near 1595 cm"},{"kind":"text","style":["sup"],"text":"-1"},{"kind":"text","text":"."}],"strict":"A band near 1595 cm^{−1}.","text_hash":"432ef2dda04d532b8e81febdff75b6a7f69bfe88fd8020518b3741c486f0cc51"} +{"align_key":"9467109667c9a35fb2df6a06327af4c63ef511a45e1a50e2c9386796d52d8bc9","complex":[],"id":"wavenumber-math","lossy":"abandnear1595cm−1.","match_hash":"d234490f1f606604bc9ff4f4c619bb81c91cc2683c0dd2cf412c9b03daf116bc","normalized":"A band near 1595 $\\mathrm{cm}^{-1}$.","plain":"A band near 1595 $\\mathrm{cm}^{-1}$.","runs":[{"kind":"text","text":"A band near 1595 "},{"kind":"math","notation":"tex","source":"\\mathrm{cm}^{-1}"},{"kind":"text","text":"."}],"strict":"A band near 1595 cm^{−1}.","text_hash":"058f804ca85bd2742b40f871798e4697029ac1d34ae3fe84f08ea4549b771149"} +{"align_key":"9467109667c9a35fb2df6a06327af4c63ef511a45e1a50e2c9386796d52d8bc9","complex":[],"id":"wavenumber-typst","lossy":"abandnear1595cm−1.","match_hash":"d234490f1f606604bc9ff4f4c619bb81c91cc2683c0dd2cf412c9b03daf116bc","normalized":"A band near 1595 $\"cm\"^(-1)$.","plain":"A band near 1595 $\"cm\"^(-1)$.","runs":[{"kind":"text","text":"A band near 1595 "},{"kind":"math","notation":"typst","source":"\"cm\"^(-1)"},{"kind":"text","text":"."}],"strict":"A band near 1595 cm^{−1}.","text_hash":"40c687f3ba83dadcd1c577c804b5621ca334637d3e227026b4c9b1a5f4b2c85e"} +{"align_key":"8644140828bf1f481bb4afde325e12197b5284340e23a2c4defbfefd0db93398","complex":[],"id":"milli-unicode","lossy":"valuesbelow10−3weredropped.","match_hash":"402f18f84b6f9883c8014d2f7cf6278e6f5524f92079b1d0442debf544932fa0","normalized":"Values below 10⁻³ were dropped.","plain":"Values below 10⁻³ were dropped.","runs":[{"kind":"text","text":"Values below 10⁻³ were dropped."}],"strict":"Values below 10^{−3} were dropped.","text_hash":"01f80701006bb83a888b131f807424e880c379d290dfe579209f27ea544e4693"} +{"align_key":"8644140828bf1f481bb4afde325e12197b5284340e23a2c4defbfefd0db93398","complex":[],"id":"milli-sup","lossy":"valuesbelow10−3weredropped.","match_hash":"402f18f84b6f9883c8014d2f7cf6278e6f5524f92079b1d0442debf544932fa0","normalized":"Values below 10−3 were dropped.","plain":"Values below 10−3 were dropped.","runs":[{"kind":"text","text":"Values below 10"},{"kind":"text","style":["sup"],"text":"−3"},{"kind":"text","text":" were dropped."}],"strict":"Values below 10^{−3} were dropped.","text_hash":"f85ff38541d4ef7c42982c0a6225a5159ddba3c3b03d554252b3e3fd9262cc70"} +{"align_key":"8644140828bf1f481bb4afde325e12197b5284340e23a2c4defbfefd0db93398","complex":[],"id":"milli-math","lossy":"valuesbelow10−3weredropped.","match_hash":"402f18f84b6f9883c8014d2f7cf6278e6f5524f92079b1d0442debf544932fa0","normalized":"Values below $10^{-3}$ were dropped.","plain":"Values below $10^{-3}$ were dropped.","runs":[{"kind":"text","text":"Values below "},{"kind":"math","notation":"tex","source":"10^{-3}"},{"kind":"text","text":" were dropped."}],"strict":"Values below 10^{−3} were dropped.","text_hash":"510f7ffdcde8465761ee0be1277ea0c4a2ee2c3dbeeff66197c2b1e2a593967e"} +{"align_key":"347038bde4eb9ddd4b7ead7285ffdcfd9296af9507fc2be04eae503b10290241","complex":[],"id":"kr-math","lossy":"theconstantkrislarge.","match_hash":"bcb9eafe84c3d52780bae37e433c0a25de552fc5c39efc6c0a2573ff74b9de78","normalized":"The constant $K_r$ is large.","plain":"The constant $K_r$ is large.","runs":[{"kind":"text","text":"The constant "},{"kind":"math","notation":"tex","source":"K_r"},{"kind":"text","text":" is large."}],"strict":"The constant K_{r} is large.","text_hash":"dfb8290ac5f6841ca8fd16cbf48bf02010db9f2d5bf4534c76bdb9843e630302"} +{"align_key":"347038bde4eb9ddd4b7ead7285ffdcfd9296af9507fc2be04eae503b10290241","complex":[],"id":"kr-mathrm","lossy":"theconstantkrislarge.","match_hash":"bcb9eafe84c3d52780bae37e433c0a25de552fc5c39efc6c0a2573ff74b9de78","normalized":"The constant $K_{\\mathrm{r}}$ is large.","plain":"The constant $K_{\\mathrm{r}}$ is large.","runs":[{"kind":"text","text":"The constant "},{"kind":"math","notation":"tex","source":"K_{\\mathrm{r}}"},{"kind":"text","text":" is large."}],"strict":"The constant K_{r} is large.","text_hash":"1a78c9c621f0743d98f02364c474dfdc1d503f754359c16ac68d6c47d49c84de"} +{"align_key":"347038bde4eb9ddd4b7ead7285ffdcfd9296af9507fc2be04eae503b10290241","complex":[],"id":"kr-sub","lossy":"theconstantkrislarge.","match_hash":"bcb9eafe84c3d52780bae37e433c0a25de552fc5c39efc6c0a2573ff74b9de78","normalized":"The constant Kr is large.","plain":"The constant Kr is large.","runs":[{"kind":"text","text":"The constant K"},{"kind":"text","style":["sub"],"text":"r"},{"kind":"text","text":" is large."}],"strict":"The constant K_{r} is large.","text_hash":"20b700fd3005722f68eba6f8e8656a4c646a77f618a11bd35a18665cfc7f4f5e"} +{"align_key":"347038bde4eb9ddd4b7ead7285ffdcfd9296af9507fc2be04eae503b10290241","complex":[],"id":"kr-unicode","lossy":"theconstantkrislarge.","match_hash":"bcb9eafe84c3d52780bae37e433c0a25de552fc5c39efc6c0a2573ff74b9de78","normalized":"The constant Kᵣ is large.","plain":"The constant Kᵣ is large.","runs":[{"kind":"text","text":"The constant Kᵣ is large."}],"strict":"The constant K_{r} is large.","text_hash":"b636b6aa463b3a8648ef14f81ed699fb2dddd657363c4d35783e0b214d838392"} +{"align_key":"c18a6f3dffdf8fcf355ef258e521f5dac9843bb9fc5d63c71c2d24b87a6f00a3","complex":[],"id":"ligature","lossy":"thefitisgood.","match_hash":"f2cafd933912c4ea86559633994fecbd344dfb0beaf15bf1858685c0ce471b6f","normalized":"The fit is good.","plain":"The fit is good.","runs":[{"kind":"text","text":"The fit is good."}],"strict":"The fit is good.","text_hash":"f9bbe4d605d8a243da53dfb2fc44f2b7b1e5df132116277fce9157a7f9c867f1"} +{"align_key":"c18a6f3dffdf8fcf355ef258e521f5dac9843bb9fc5d63c71c2d24b87a6f00a3","complex":[],"id":"no-ligature","lossy":"thefitisgood.","match_hash":"f2cafd933912c4ea86559633994fecbd344dfb0beaf15bf1858685c0ce471b6f","normalized":"The fit is good.","plain":"The fit is good.","runs":[{"kind":"text","text":"The fit is good."}],"strict":"The fit is good.","text_hash":"f2cafd933912c4ea86559633994fecbd344dfb0beaf15bf1858685c0ce471b6f"} +{"align_key":"20dd97f7d0a3372b59e2dcd3eee64fa213d7ead55dad8bc9e631d62c007c9b83","complex":[],"id":"micro-sign","lossy":"a5μmfilm.","match_hash":"e0266f7562269bc12d6d8bf51c52ffd6511c306b07a0db055aaf3890d7132c5c","normalized":"A 5 µm film.","plain":"A 5 µm film.","runs":[{"kind":"text","text":"A 5 µm film."}],"strict":"A 5 μm film.","text_hash":"0a120e4a1cd7b8f3ca2d4ea4c498dd075ae36be1b4cd78edf7475a3f4bbcff8b"} +{"align_key":"20dd97f7d0a3372b59e2dcd3eee64fa213d7ead55dad8bc9e631d62c007c9b83","complex":[],"id":"greek-mu","lossy":"a5μmfilm.","match_hash":"e0266f7562269bc12d6d8bf51c52ffd6511c306b07a0db055aaf3890d7132c5c","normalized":"A 5 μm film.","plain":"A 5 μm film.","runs":[{"kind":"text","text":"A 5 μm film."}],"strict":"A 5 μm film.","text_hash":"e0266f7562269bc12d6d8bf51c52ffd6511c306b07a0db055aaf3890d7132c5c"} +{"align_key":"c7788ac010791cdfc09f01c87089d499bc92cc558731818b7526a1a622cc7e93","complex":[],"id":"lost-superscript","lossy":"arateof103persecond.","match_hash":"59daf82ed56d0dce4eba9feac195e96c776461d5337deab9f935ff113e920d11","normalized":"A rate of 103 per second.","note":"OCR lost the superscript.","plain":"A rate of 103 per second.","runs":[{"kind":"text","text":"A rate of 103 per second."}],"strict":"A rate of 103 per second.","text_hash":"59daf82ed56d0dce4eba9feac195e96c776461d5337deab9f935ff113e920d11"} +{"align_key":"c7788ac010791cdfc09f01c87089d499bc92cc558731818b7526a1a622cc7e93","complex":[],"id":"superscript","lossy":"arateof103persecond.","match_hash":"bcbd5154f56cbfe39b9c1ad80c0215fe1850106e796dd522669a95d31d4643d5","normalized":"A rate of 10³ per second.","plain":"A rate of 10³ per second.","runs":[{"kind":"text","text":"A rate of 10³ per second."}],"strict":"A rate of 10^{3} per second.","text_hash":"c490b1d6d08e9e0f1bef522f8a78a4f729cf981a7b6fc0c9cc41c1ec479d2115"} +{"align_key":"73b02f8ceb20b94520bc5ca52100c56b14a46d9adb06dbb6c5a19810cf6137e0","complex":[],"id":"cite-mark","lossy":"theenergyislow.","match_hash":"98b2885f074339a8097b6c8c7f2253eb1bb66760684f5e216caccaf224d86d30","normalized":"The energy3 is low.","plain":"The energy3 is low.","runs":[{"kind":"text","text":"The energy"},{"kind":"cite","refs":[],"text":"3"},{"kind":"text","text":" is low."}],"strict":"The energy3 is low.","text_hash":"3166ad5ab03f88cd0c4868ebeb3475b9b3e13036c68ff57d0e6531d4e322fbb1"} +{"align_key":"da65ae55cd55d409477a86e26876cf5f75556c79f612191b5a43af6d553ea0b0","complex":[],"id":"cite-as-text","lossy":"theenergy3islow.","match_hash":"3166ad5ab03f88cd0c4868ebeb3475b9b3e13036c68ff57d0e6531d4e322fbb1","normalized":"The energy3 is low.","plain":"The energy3 is low.","runs":[{"kind":"text","text":"The energy3 is low."}],"strict":"The energy3 is low.","text_hash":"3166ad5ab03f88cd0c4868ebeb3475b9b3e13036c68ff57d0e6531d4e322fbb1"} +{"align_key":"6011a09330d84af0bbfaf227e9e23d8072dccd73513b1fc866df93808b43dd97","complex":["tex:\\frac{1}{2}kx^2"],"id":"complex","lossy":"theenergyisexactly.","match_hash":"d641b65aa2f6b697fd35c8e383e497abe456640af3cdecd28a8120fa92ea9664","normalized":"The energy is $\\frac{1}{2} k x^2$ exactly.","plain":"The energy is $\\frac{1}{2} k x^2$ exactly.","runs":[{"kind":"text","text":"The energy is "},{"kind":"math","notation":"tex","source":"\\frac{1}{2} k x^2"},{"kind":"text","text":" exactly."}],"strict":"The energy is  exactly.","text_hash":"d5a85176f4a53f91916b130e0b35b298e1b999132a6a925b4eccf8f20f2574b5"} +{"align_key":"156cc56f1b8c79722ce3db0aec57879a4b2f467fdb69d75ac6bdae01b7bd4433","complex":[],"id":"hyphen-before-digit","lossy":"pages10−20andctctwith6−31g*","match_hash":"86f127250e5076b9c8b9b5c189361aed13705d1ceb7600cbe2b7ed07597a2313","normalized":"pages 10-20 and CT–CT with 6-31G*","plain":"pages 10-20 and CT–CT with 6-31G*","runs":[{"kind":"text","text":"pages 10-20 and CT–CT with 6-31G*"}],"strict":"pages 10−20 and CT–CT with 6−31G*","text_hash":"9dc7ad6bb0693572f0700420e1b2b1c723b39058784c76154e88fffa8fa0c8a8"} +{"align_key":"156cc56f1b8c79722ce3db0aec57879a4b2f467fdb69d75ac6bdae01b7bd4433","complex":[],"id":"en-dash-before-digit","lossy":"pages10−20andctctwith6−31g*","match_hash":"1d9c138f8b902b350a1f4477e8b84b6a0a87f35a1dd38486112b7291db3aa150","normalized":"pages 10–20 and CT-CT with 6–31G*","plain":"pages 10–20 and CT-CT with 6–31G*","runs":[{"kind":"text","text":"pages 10–20 and CT-CT with 6–31G*"}],"strict":"pages 10−20 and CT-CT with 6−31G*","text_hash":"70b2e77b3966f2c506d87c12b13ebf7ae5193092f678eb101310f363d0ab605a"} +{"align_key":"89658229bf51901882aae4f9543338d4321e4b666a2c191bca749e384fd0a1cc","complex":["tex:𝑥"],"id":"astral","lossy":"letvary.","match_hash":"3b6c539092c6c721ee808437e208b31a1fab3407b43d85e60d29edb65762ac20","normalized":"Let $𝑥$ vary.","plain":"Let $𝑥$ vary.","runs":[{"kind":"text","text":"Let "},{"kind":"math","notation":"tex","source":"𝑥"},{"kind":"text","text":" vary."}],"strict":"Let  vary.","text_hash":"43800bdb4e70f3613083dfe5ce728cf643a1d0d97d321f04cfbb4f9b2e56fc6f"} diff --git a/vectors/resolve.jsonl b/vectors/resolve.jsonl new file mode 100644 index 0000000..5fa9ee0 --- /dev/null +++ b/vectors/resolve.jsonl @@ -0,0 +1,17 @@ +{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"f929eq9","node_hash":"cd6cdb032e9b8ab712790b7181f794f6e363b7c4c96888049b59c671c1596369","own_hash":"d5b2ebdc96010fd8fc83abcbec9e5c2340bf766997a485f11f2dae49d0d2dd4c","quote":{"exact":"H$_2$O","prefix":"Water, ","suffix":", served as the first test case,"},"rev":0,"span":[7,13],"store":"smithlab"},"expect":{"node":"f929eq9","node_hash":"cd6cdb032e9b8ab712790b7181f794f6e363b7c4c96888049b59c671c1596369","result":"current","span":[7,13]},"id":"span-current","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"context":{"column_path":["Set A","$K_r$ (kcal mol⁻¹ Å⁻²)"],"row_path":["Bond parameters","CT–CT"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"nkm3xn5","node_hash":"2fd1e9e445ae29e3a35d032a41561cc164003fc3d146d93812da10e5f4022f86","own_hash":"be9f0168b05ced3db062051dccd46ffd4a2ccf3ec1ed7f4be7c4ab4f2bfe4fbb","quote":{"exact":"3l0.0"},"rev":0,"store":"smithlab"},"expect":{"node":"nkm3xn5","node_hash":"21f13b21948078f64c564334e5bb180b4495edb25a79ae32aa967986a626f3d5","reason":"the node changed and the quote does not occur exactly once","result":"stale"},"id":"leaf-stale","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"context":{"column_path":["Set B","$r_\\mathrm{eq}$ (Å)"],"row_path":["Bond parameters","CT–CT"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"rr9wvsy","node_hash":"4a37ffce2a07de7a6fcbf4a63b0679945c79ac8db9d2ec492e0fb1ff5072540d","own_hash":"f6cf4e1e1b7230ac3caaad08fff84e008eca06baf3eb2df936624ca83b861a2a","quote":{"exact":"1.5260"},"rev":0,"store":"smithlab"},"expect":{"node":"rr9wvsy","node_hash":"4a37ffce2a07de7a6fcbf4a63b0679945c79ac8db9d2ec492e0fb1ff5072540d","result":"current"},"id":"leaf-current","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"table-body","leaves":[["hwxm8de","deaa884fd6ab00c358507695e45b7f13c55c2c97cd527617be3b8b030d04631f"],["k3fqnvy","670ae760d62ff8d674b222641915f452595b35aa53cdbd5b27194ef13c29e7f4"],["nkm3xn5","eb36054f18e4fb1c5107c0060e0d6e44a8ca10a40a61d33b5ae78c0470d86862"],["kpk13yn","ee8dce19ea6dd3f91de5a1b9d9c13c2077c462523d14b5cd9958749e6b58d7e6"],["hw8fx4r","6b8d9cf3fe1a78784cab97278e5ccfdf305879dd1cd120c3fe6708b529f31b15"],["rr9wvsy","c649510dde8e1cdf382f42a071e5fa75089e908840c9e8d1aa30ff514b2379e4"],["sj8v63e","8e626647307dc064d96fb93c50b4c6c5cab90f9369f00a7252a004a0c9871ee3"],["exey7vh","f30130f6a42898d5d87ecd4d8503854dd79a2b6ea87b769fe994ce7f8ec52b29"],["v4j8j13","1bec39b32c2e32386d9d6782efca347244c62b4c431e4dc2a55481a5da7f704d"],["q1jhtes","f86dc724b46c39587e180a46b910d9b3a9be3421176a03b4beba3bb401a60c5b"]],"node":"tk5p46c","node_hash":"ec6a669109d0f379cdebc40b9c8496355b46d5e5ddbe4aa2476ae9b9b54a571f","own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","rev":0,"store":"smithlab"},"expect":{"drift":{"count":4,"level":"high","share":"0.7500"},"node":"tk5p46c","node_hash":"5920b35b6211d010d13de7c122367955fb371fb3e69f8246007258d7c534a8a6","result":"changed-below"},"id":"body-drift-high","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"table","node":"gm5z4rx","node_hash":"918a8403cc1a8576b3565c3c3cb38320752c020b18356c4647910cdfc2ad1021","own_hash":"b56ce0ab4b480c4c43b11ca2eaca410c60fed73341d53896d509e30eabf54477","rev":0,"store":"smithlab"},"expect":{"drift":{"count":5,"level":"high","share":"0.5517"},"node":"gm5z4rx","node_hash":"999777484c58cf3646eabb6df3e559369a1b081ec4f337d621dade1bf241f339","result":"changed-below"},"id":"table-changed-below","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"section","node":"f0tj6ca","node_hash":"9d02a91e073713f349c5ffbb2a12b29b0ab5962b9aa0e4ffa4c9e66fe41ec678","own_hash":"c3d50f266b05d7889c001aef16662cecd4e99ac4a2747ec331c1044e6adc8e3e","rev":0,"store":"smithlab"},"expect":{"drift":{"count":8,"level":"high","share":"0.5263"},"node":"f0tj6ca","node_hash":"8acfa263e93dcee504efbfcd328fb69b81f4d71e97b921fa8da664a541e722ff","result":"changed-below"},"id":"section-changed-below","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"e4fkseg","node_hash":"589232c1146961dda85cf949e4da08b470929263726765adfce49fc37c1f217b","own_hash":"88ff9d96c578d0affb76e9843cd93142596366a5948efc1536e7d13c4b910d85","quote":{"exact":"treated as zero","prefix":"lues below 10-3 kcal mol⁻¹ were ","suffix":". Table 1 lists the fitted const"},"rev":0,"span":[34,49],"store":"smithlab"},"expect":{"node":"e4fkseg","node_hash":"5421e9cf0ef3a995792963d0371b79e11a8efad519b02efb5cb88311a896d0cc","result":"reattached","span":[34,49]},"id":"span-reattached","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"e4fkseg","node_hash":"589232c1146961dda85cf949e4da08b470929263726765adfce49fc37c1f217b","own_hash":"88ff9d96c578d0affb76e9843cd93142596366a5948efc1536e7d13c4b910d85","quote":{"exact":"fitted constants","prefix":"ated as zero. Table 1 lists the ","suffix":" for both parameter sets."},"rev":0,"span":[69,85],"store":"smithlab"},"expect":{"node":"e4fkseg","node_hash":"5421e9cf0ef3a995792963d0371b79e11a8efad519b02efb5cb88311a896d0cc","reason":"the node changed and the quote does not occur exactly once","result":"stale"},"id":"span-stale-after-split","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"e9rh611","node_hash":"d7c13d8c4e3588f236945b69f73cc2e94249fb697a2e841b5823cc3e23983616","own_hash":"752ebe6e130df9e8f91ffba7ed770e2df599be3399c40c97c780ef86ada1bb5f","quote":{"exact":"least squares","prefix":"fitted by ","suffix":"."},"rev":0,"span":[10,23],"store":"smithlab"},"expect":{"node":"eajq93t","node_hash":"42b1de7852cdc68730984fff789fe248ecd5b43198c0e7d671931ff3fe561dc3","result":"moved","span":[93,106],"via":["e9rh611"]},"id":"span-moved-by-merge","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"cjqf3vc","node_hash":"2c4fadc156966ad797dfc7db9d4c0bae120c1df8586ee6a6d2976056dec7091e","own_hash":"1166e91d94a8130b1829b3e66b182febe6c2eb75b7f54e08f9af8571eaa085f9","quote":{"exact":"J. Example Chem. 2026, 14, 101–109"},"rev":0,"store":"smithlab"},"expect":{"node":null,"reason":"retired without a successor","result":"stale","via":["cjqf3vc"]},"id":"leaf-deleted","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"equation","node":"qn08tj9","node_hash":"47227b3e48e70a28623a93f19deda7414ebeff9d04fa00522874112249f2387b","own_hash":"fae526da7101762cc32b2cdd8dbcb254bc4c809fa6dc491c76c51e9b0bc0dc81","quote":{"exact":"$$E_{\\mathrm{bond}} = \\frac{1}{2} K_r (r - r_{\\mathrm{eq}})^2$$"},"rev":0,"store":"smithlab"},"expect":{"node":"qn08tj9","node_hash":"cc0bf73dd84e298da0d36c4b363c8d2bdc9b6d5738d1923d14c4a9028dca08d6","result":"reattached"},"id":"equation-reattached","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"figure","node":"ajfvq4s","node_hash":"dad89409c8a3108d0c17c8d1625a448c7920f50876dc68fd382a1114f56934ee","own_hash":"1933616f3f17e12f7da97bb43de32cdd047800157043f6972e7eaccff9f6f52f","rev":0,"store":"smithlab"},"expect":{"node":"ajfvq4s","node_hash":"f76864779843485fa9e2f3cc3cd1c76ad222e1649c56f4cface33bf20b8f33b6","reason":"relabel","result":"reattached"},"id":"figure-relabel","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"context":{"column_path":["Set A","$r_\\mathrm{eq}$ (Å)"],"row_path":["Bond parameters","CT–HC"],"table_label":"Table 1"},"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"cell","node":"v4j8j13","node_hash":"6ebc7eb98564471c9fabacf60e15bbc03ee019fa3a806731b8502db326a24f6c","own_hash":"658c69a718f90066aa362e39163e8e487f98df28fe622b1b313f5ef971f7fd18","quote":{"exact":"1.090"},"rev":0,"store":"smithlab"},"expect":{"node":"e0n07n0","node_hash":"6ebc7eb98564471c9fabacf60e15bbc03ee019fa3a806731b8502db326a24f6c","result":"reattached","via":["v4j8j13"]},"id":"cell-header-paths","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"sentence","node":"b-p01-text-003","node_hash":"cd6cdb032e9b8ab712790b7181f794f6e363b7c4c96888049b59c671c1596369","own_hash":"d5b2ebdc96010fd8fc83abcbec9e5c2340bf766997a485f11f2dae49d0d2dd4c","quote":{"exact":"first test case","prefix":"Water, H$_2$O, served as the ","suffix":", with a bending band near 1595 "},"rev":0,"span":[29,44],"store":"smithlab"},"expect":{"node":"f929eq9","node_hash":"cd6cdb032e9b8ab712790b7181f794f6e363b7c4c96888049b59c671c1596369","result":"current","span":[29,44],"via":["b-p01-text-003"]},"id":"via-alias","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"paragraph","leaves":[["eajq93t","a585745f00df6e0c769ccc7d11894670faacf1d94d24a39da8e4986e3f758237"],["e9rh611","701f05ec607477508a5be4207ec979941cb7ccbcb60bba8e5d7b86558d44e4cd"]],"node":"zyqr0yc","node_hash":"19bc20e19c6912bfe48b4f798e20b37efec81d63231d5565de2c270aced992db","own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","rev":0,"store":"smithlab"},"expect":{"drift":{"count":1,"level":"high","share":"0.6667"},"node":"zyqr0yc","node_hash":"4322aea43234e364104d120770e7a406dbeb35de65ada2016a7725130162947d","result":"changed-below"},"id":"paragraph-changed-below","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"row","leaves":[["k3fqnvy","670ae760d62ff8d674b222641915f452595b35aa53cdbd5b27194ef13c29e7f4"],["nkm3xn5","eb36054f18e4fb1c5107c0060e0d6e44a8ca10a40a61d33b5ae78c0470d86862"],["kpk13yn","ee8dce19ea6dd3f91de5a1b9d9c13c2077c462523d14b5cd9958749e6b58d7e6"],["hw8fx4r","6b8d9cf3fe1a78784cab97278e5ccfdf305879dd1cd120c3fe6708b529f31b15"],["rr9wvsy","c649510dde8e1cdf382f42a071e5fa75089e908840c9e8d1aa30ff514b2379e4"]],"node":"zhe4g0k","node_hash":"0cef0748660a813cc4aeff06d473b52d605c61260b498005d8fda1b9f87f3193","own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","rev":0,"store":"smithlab"},"expect":{"drift":{"count":1,"level":"low","share":"0.2000"},"node":"zhe4g0k","node_hash":"91d2b7eb0d895e49471fd5c837727c3ed1fb880e5a0945e37f551b566c8c8913","result":"changed-below"},"id":"row-drift-low","package":"fixtures/packages/hale2026harmonic"} +{"anchor":{"doc":"hale2026harmonic","format":"scienting-anchor/1","kind":"paragraph","leaves":[["ntr324r","a86a8326bd265e4ddc24c02c243e8a73ae33899886643be7eb61cd4e0f21ae7a"]],"node":"g44k023","node_hash":"978f9e4a17e09b7f2042cd7dceebf1e59874cf92ab900f94a6836114201ba6bf","own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","rev":0,"store":"smithlab"},"expect":{"node":"zyqr0yc","node_hash":"4322aea43234e364104d120770e7a406dbeb35de65ada2016a7725130162947d","result":"moved","via":["g44k023"]},"id":"paragraph-moved","package":"fixtures/packages/hale2026harmonic"} diff --git a/vectors/rights.jsonl b/vectors/rights.jsonl new file mode 100644 index 0000000..93efa5d --- /dev/null +++ b/vectors/rights.jsonl @@ -0,0 +1,14 @@ +{"expect":{"allowed":true,"expired":false,"lacking":[]},"id":"convert-local","now":"2026-10-11T00:00:00Z","origin":{"doi":"10.5555/example.hale.2026","retrieved_at":"2026-10-01T08:00:00Z","source":"publisher"},"policies":[],"processor":"local","requires":{"ai":{"purpose":"internal"},"note":"Conversion by any model, local or outside.","uses":["tdm"]},"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The library's subscription terms, as the team read them (fictional)."}]},"at":"2026-09-15T12:00:00Z","basis":"subscription","format":"scienting-rights/1","license":{"text":"Publisher's subscription terms (fictional)."},"uses":{"accessible-copy":"unknown","ai":{"external/local":false,"external/outside":false,"external/outside-no-retention":false,"external/tenancy":false,"internal/local":true,"internal/outside":false,"internal/outside-no-retention":"unknown","internal/tenancy":"unknown"},"quote-public":false,"read":true,"redistribute":false,"tdm":true},"valid_until":"2027-08-31T23:59:59Z"},"stage":"convert-model","witness_sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"} +{"expect":{"allowed":false,"expired":false,"lacking":["ai/internal/outside"]},"id":"convert-outside","now":"2026-10-11T00:00:00Z","origin":{"doi":"10.5555/example.hale.2026","retrieved_at":"2026-10-01T08:00:00Z","source":"publisher"},"policies":[],"processor":"outside","requires":{"ai":{"purpose":"internal"},"note":"Conversion by any model, local or outside.","uses":["tdm"]},"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The library's subscription terms, as the team read them (fictional)."}]},"at":"2026-09-15T12:00:00Z","basis":"subscription","format":"scienting-rights/1","license":{"text":"Publisher's subscription terms (fictional)."},"uses":{"accessible-copy":"unknown","ai":{"external/local":false,"external/outside":false,"external/outside-no-retention":false,"external/tenancy":false,"internal/local":true,"internal/outside":false,"internal/outside-no-retention":"unknown","internal/tenancy":"unknown"},"quote-public":false,"read":true,"redistribute":false,"tdm":true},"valid_until":"2027-08-31T23:59:59Z"},"stage":"convert-model","witness_sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"} +{"expect":{"allowed":false,"expired":false,"lacking":["ai/internal/tenancy?"]},"id":"review-tenancy-unknown","now":"2026-10-11T00:00:00Z","origin":{"doi":"10.5555/example.hale.2026","retrieved_at":"2026-10-01T08:00:00Z","source":"publisher"},"policies":[],"processor":"tenancy","requires":{"ai":{"purpose":"internal"},"note":"Model review of suspects, in a job zip or the direct API mode.","uses":[]},"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The library's subscription terms, as the team read them (fictional)."}]},"at":"2026-09-15T12:00:00Z","basis":"subscription","format":"scienting-rights/1","license":{"text":"Publisher's subscription terms (fictional)."},"uses":{"accessible-copy":"unknown","ai":{"external/local":false,"external/outside":false,"external/outside-no-retention":false,"external/tenancy":false,"internal/local":true,"internal/outside":false,"internal/outside-no-retention":"unknown","internal/tenancy":"unknown"},"quote-public":false,"read":true,"redistribute":false,"tdm":true},"valid_until":"2027-08-31T23:59:59Z"},"stage":"review-model","witness_sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"} +{"expect":{"allowed":true,"expired":false,"lacking":[]},"id":"review-tenancy-policy","now":"2026-10-11T00:00:00Z","origin":{"doi":"10.5555/example.hale.2026","retrieved_at":"2026-10-01T08:00:00Z","source":"publisher"},"policies":[{"applies_to":{"basis":["subscription"],"doi_prefixes":["10.5555/"]},"at":"2026-10-05T09:00:00Z","by":"ana","format":"scienting-policy/1","id":"g6r348z7ckp4q","project":"smithlab-charges","signature":{"key":"ana","scheme":"ed25519","value":"iuwOl5+2wPIIncbdpyqwUnfvc7uEAkKUPZhzPFSjBC+GuLuZ4XzGXXiylEFE5lgubnKfMaqrHF2TuT4RyU+5Bw=="},"statement":"Our institutional agreement covers internal AI use in our own cloud account for these papers (fictional).","uses":{"ai":{"internal/tenancy":true}},"valid_until":"2027-08-31T23:59:59Z"}],"processor":"tenancy","requires":{"ai":{"purpose":"internal"},"note":"Model review of suspects, in a job zip or the direct API mode.","uses":[]},"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The library's subscription terms, as the team read them (fictional)."}]},"at":"2026-09-15T12:00:00Z","basis":"subscription","format":"scienting-rights/1","license":{"text":"Publisher's subscription terms (fictional)."},"uses":{"accessible-copy":"unknown","ai":{"external/local":false,"external/outside":false,"external/outside-no-retention":false,"external/tenancy":false,"internal/local":true,"internal/outside":false,"internal/outside-no-retention":"unknown","internal/tenancy":"unknown"},"quote-public":false,"read":true,"redistribute":false,"tdm":true},"valid_until":"2027-08-31T23:59:59Z"},"stage":"review-model","witness_sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"} +{"expect":{"allowed":true,"expired":false,"lacking":[]},"id":"index","now":"2026-10-11T00:00:00Z","origin":{"doi":"10.5555/example.hale.2026","retrieved_at":"2026-10-01T08:00:00Z","source":"publisher"},"policies":[],"processor":"local","requires":{"note":"The full-text index.","uses":["tdm"]},"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The library's subscription terms, as the team read them (fictional)."}]},"at":"2026-09-15T12:00:00Z","basis":"subscription","format":"scienting-rights/1","license":{"text":"Publisher's subscription terms (fictional)."},"uses":{"accessible-copy":"unknown","ai":{"external/local":false,"external/outside":false,"external/outside-no-retention":false,"external/tenancy":false,"internal/local":true,"internal/outside":false,"internal/outside-no-retention":"unknown","internal/tenancy":"unknown"},"quote-public":false,"read":true,"redistribute":false,"tdm":true},"valid_until":"2027-08-31T23:59:59Z"},"stage":"index","witness_sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"} +{"expect":{"allowed":false,"expired":false,"lacking":["processor:outside-no-retention","ai/internal/outside-no-retention?"]},"id":"embed-outside-refused","now":"2026-10-11T00:00:00Z","origin":{"doi":"10.5555/example.hale.2026","retrieved_at":"2026-10-01T08:00:00Z","source":"publisher"},"policies":[{"applies_to":{"basis":["subscription"],"doi_prefixes":["10.5555/"]},"at":"2026-10-05T09:00:00Z","by":"ana","format":"scienting-policy/1","id":"g6r348z7ckp4q","project":"smithlab-charges","signature":{"key":"ana","scheme":"ed25519","value":"iuwOl5+2wPIIncbdpyqwUnfvc7uEAkKUPZhzPFSjBC+GuLuZ4XzGXXiylEFE5lgubnKfMaqrHF2TuT4RyU+5Bw=="},"statement":"Our institutional agreement covers internal AI use in our own cloud account for these papers (fictional).","uses":{"ai":{"internal/tenancy":true}},"valid_until":"2027-08-31T23:59:59Z"}],"processor":"outside-no-retention","requires":{"ai":{"processors":["local","tenancy"],"purpose":"internal"},"note":"Embeddings for search.","uses":[]},"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The library's subscription terms, as the team read them (fictional)."}]},"at":"2026-09-15T12:00:00Z","basis":"subscription","format":"scienting-rights/1","license":{"text":"Publisher's subscription terms (fictional)."},"uses":{"accessible-copy":"unknown","ai":{"external/local":false,"external/outside":false,"external/outside-no-retention":false,"external/tenancy":false,"internal/local":true,"internal/outside":false,"internal/outside-no-retention":"unknown","internal/tenancy":"unknown"},"quote-public":false,"read":true,"redistribute":false,"tdm":true},"valid_until":"2027-08-31T23:59:59Z"},"stage":"embed","witness_sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"} +{"expect":{"allowed":false,"expired":false,"lacking":["quote-public"]},"id":"publish-quotes","now":"2026-10-11T00:00:00Z","origin":{"doi":"10.5555/example.hale.2026","retrieved_at":"2026-10-01T08:00:00Z","source":"publisher"},"policies":[],"processor":"local","requires":{"note":"Publishing anything with quotations.","uses":["quote-public"]},"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The library's subscription terms, as the team read them (fictional)."}]},"at":"2026-09-15T12:00:00Z","basis":"subscription","format":"scienting-rights/1","license":{"text":"Publisher's subscription terms (fictional)."},"uses":{"accessible-copy":"unknown","ai":{"external/local":false,"external/outside":false,"external/outside-no-retention":false,"external/tenancy":false,"internal/local":true,"internal/outside":false,"internal/outside-no-retention":"unknown","internal/tenancy":"unknown"},"quote-public":false,"read":true,"redistribute":false,"tdm":true},"valid_until":"2027-08-31T23:59:59Z"},"stage":"publish-quotes","witness_sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"} +{"expect":{"allowed":false,"expired":true,"lacking":["read"]},"id":"read-expired","now":"2027-09-01T00:00:00Z","origin":{"doi":"10.5555/example.hale.2026","retrieved_at":"2026-10-01T08:00:00Z","source":"publisher"},"policies":[],"processor":"local","requires":{"note":"Reading in the reader.","uses":["read"]},"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The library's subscription terms, as the team read them (fictional)."}]},"at":"2026-09-15T12:00:00Z","basis":"subscription","format":"scienting-rights/1","license":{"text":"Publisher's subscription terms (fictional)."},"uses":{"accessible-copy":"unknown","ai":{"external/local":false,"external/outside":false,"external/outside-no-retention":false,"external/tenancy":false,"internal/local":true,"internal/outside":false,"internal/outside-no-retention":"unknown","internal/tenancy":"unknown"},"quote-public":false,"read":true,"redistribute":false,"tdm":true},"valid_until":"2027-08-31T23:59:59Z"},"stage":"read","witness_sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"} +{"expect":{"allowed":false,"expired":false,"lacking":["accessible-copy?"]},"id":"accessible-copy-unknown","now":"2026-10-11T00:00:00Z","origin":{"doi":"10.5555/example.hale.2026","retrieved_at":"2026-10-01T08:00:00Z","source":"publisher"},"policies":[],"processor":"local","requires":{"note":"An accessible copy for a user with a disability.","uses":["accessible-copy"]},"rights":{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The library's subscription terms, as the team read them (fictional)."}]},"at":"2026-09-15T12:00:00Z","basis":"subscription","format":"scienting-rights/1","license":{"text":"Publisher's subscription terms (fictional)."},"uses":{"accessible-copy":"unknown","ai":{"external/local":false,"external/outside":false,"external/outside-no-retention":false,"external/tenancy":false,"internal/local":true,"internal/outside":false,"internal/outside-no-retention":"unknown","internal/tenancy":"unknown"},"quote-public":false,"read":true,"redistribute":false,"tdm":true},"valid_until":"2027-08-31T23:59:59Z"},"stage":"accessible-copy","witness_sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"} +{"expect":{"accessible-copy":"unknown","ai/external/local":false,"ai/external/outside":false,"ai/external/outside-no-retention":false,"ai/external/tenancy":false,"ai/internal/local":true,"ai/internal/outside":false,"ai/internal/outside-no-retention":"unknown","ai/internal/tenancy":"unknown","quote-public":false,"read":true,"redistribute":false,"tdm":true},"id":"combine","rights":[{"asserted_by":{"by":"crossref","evidence":[{"doi":"10.5555/example.okafor.2025","kind":"crossref-license","url":"https://creativecommons.org/licenses/by/4.0/"}]},"at":"2026-09-15T12:00:00Z","basis":"open-license","format":"scienting-rights/1","license":{"spdx":"CC-BY-4.0","url":"https://creativecommons.org/licenses/by/4.0/"},"uses":{"accessible-copy":true,"ai":{"external/local":true,"external/outside":true,"external/outside-no-retention":true,"external/tenancy":true,"internal/local":true,"internal/outside":true,"internal/outside-no-retention":true,"internal/tenancy":true},"quote-public":true,"read":true,"redistribute":true,"tdm":true},"valid_until":null},{"asserted_by":{"by":"ana","evidence":[{"kind":"statement","note":"The library's subscription terms, as the team read them (fictional)."}]},"at":"2026-09-15T12:00:00Z","basis":"subscription","format":"scienting-rights/1","license":{"text":"Publisher's subscription terms (fictional)."},"uses":{"accessible-copy":"unknown","ai":{"external/local":false,"external/outside":false,"external/outside-no-retention":false,"external/tenancy":false,"internal/local":true,"internal/outside":false,"internal/outside-no-retention":"unknown","internal/tenancy":"unknown"},"quote-public":false,"read":true,"redistribute":false,"tdm":true},"valid_until":"2027-08-31T23:59:59Z"}]} +{"backend":{"code_license":{"spdx":"MIT"},"conditions":[],"format":"scienting-backend/1","name":"docling","processor":"local","stage":"read","version":"illustrative","weights":[{"license":{"spdx":"Apache-2.0"},"name":"layout model"}]},"expect":{"allowed":true,"failed":[]},"id":"backend-docling-smithlab","profile":{"at":"2026-10-01T00:00:00Z","competes_with":[],"format":"scienting-profile/1","purpose":"research","recorded_by":"ana","revenue_or_funding_usd":{"at_most":2000000},"team":"smithlab"}} +{"backend":{"code_license":{"spdx":"MIT"},"conditions":[],"format":"scienting-backend/1","name":"docling","processor":"local","stage":"read","version":"illustrative","weights":[{"license":{"spdx":"Apache-2.0"},"name":"layout model"}]},"expect":{"allowed":true,"failed":[]},"id":"backend-docling-acme","profile":{"at":"2026-10-01T00:00:00Z","competes_with":null,"format":"scienting-profile/1","purpose":"commercial","recorded_by":"acme-admin","revenue_or_funding_usd":{"at_most":null},"team":"acme"}} +{"backend":{"code_license":{"spdx":"Apache-2.0"},"conditions":[{"id":"revenue-cap","kind":"revenue-cap","usd":5000000},{"id":"no-competition","kind":"no-competition","vendor":"examplevendor"},{"allowed":["research","personal","education","startup"],"id":"purpose","kind":"purpose"}],"format":"scienting-backend/1","name":"examplevendor","processor":"local","stage":"read","version":"1.0","weights":[{"license":{"text":"A fictional weight license with conditions."},"name":"example weights"}]},"expect":{"allowed":true,"failed":[]},"id":"backend-examplevendor-smithlab","profile":{"at":"2026-10-01T00:00:00Z","competes_with":[],"format":"scienting-profile/1","purpose":"research","recorded_by":"ana","revenue_or_funding_usd":{"at_most":2000000},"team":"smithlab"}} +{"backend":{"code_license":{"spdx":"Apache-2.0"},"conditions":[{"id":"revenue-cap","kind":"revenue-cap","usd":5000000},{"id":"no-competition","kind":"no-competition","vendor":"examplevendor"},{"allowed":["research","personal","education","startup"],"id":"purpose","kind":"purpose"}],"format":"scienting-backend/1","name":"examplevendor","processor":"local","stage":"read","version":"1.0","weights":[{"license":{"text":"A fictional weight license with conditions."},"name":"example weights"}]},"expect":{"allowed":false,"failed":["revenue-cap","no-competition","purpose"]},"id":"backend-examplevendor-acme","profile":{"at":"2026-10-01T00:00:00Z","competes_with":null,"format":"scienting-profile/1","purpose":"commercial","recorded_by":"acme-admin","revenue_or_funding_usd":{"at_most":null},"team":"acme"}} diff --git a/vectors/signatures.jsonl b/vectors/signatures.jsonl new file mode 100644 index 0000000..37a5800 --- /dev/null +++ b/vectors/signatures.jsonl @@ -0,0 +1,2 @@ +{"id":"rfc8032-test-1","message":"","public":"d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a","secret":"9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60","signature":"e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b"} +{"id":"receipt-r1","payload":"{\"format\":\"scienting-receipt/1\",\"hash\":\"72bc16bb7166388bb7ae132b838eb19c1477400b8b5d4354fa35a2a111a2b180\"}","public":"d157q/XjOTQgq6/mpVl66mZ7PI4TlF1vgywe/1un9ls=","receipt":{"at":"2026-10-11T15:02:11Z","by":"ana","doc":"hale2026harmonic","evidence":[{"kind":"crop","node":"ba6xp29","sha256":"f8da39772d0f11f2ef05be9e9f26f8d5c8ef60a6c4fdd81d1e08b5f8dfa89943"},{"kind":"crop","node":"cq77erb","sha256":"414d9c94f57ac7039517d81bd915abe3d59711bb0aa8ca49e7b93b656d613b24"},{"kind":"crop","node":"dm452cm","sha256":"a6c7fc9f20c6a78160e77e2ab0154a64bec4d903b5fd1d2d99b5880591903872"},{"kind":"crop","node":"e0n07n0","sha256":"ae161916f2ff84503386df9733a7c878fe84015c17cfd36d5f9bce3539fb849b"},{"kind":"crop","node":"e4fkseg","sha256":"ab6ae30528212e54c2a74d8ed67631ff65f74055505dbe8af44d92a29bde0840"},{"kind":"crop","node":"ezb1n33","sha256":"638e1b8704af8aa5dfe1839c853a8f7ba0d8fa97fd2fdcbce2212f08bbdc0a91"},{"kind":"crop","node":"f929eq9","sha256":"cd6aaea1755038f67b5c0ccbdd962defba1eb35105cceb602b5cdbc3c215f7f2"},{"kind":"crop","node":"gy4avx6","sha256":"92248b149d2c3ec39ceeff1d3373f031f6a70cd1949c6f8122fdd6ebcd62b51c"},{"kind":"crop","node":"h5psthj","sha256":"15efd08d97b3179177450b8dcbe3a5f409ab2b69264feaf4e683ecedb5f190b9"},{"kind":"crop","node":"hw8fx4r","sha256":"91fe488a266419894e767e3cc454289006c60396d89ceae4874ba26615066e5d"},{"kind":"crop","node":"j3d4w5v","sha256":"ed0e073495b767d7f9fad42a4fb4a1cff766ef03b453269783fe374a813d226d"},{"kind":"crop","node":"j67ec9p","sha256":"ef98568b73187f04020315ab16047b8c736455c521cf67ec8c2c844ddbc03535"},{"kind":"crop","node":"k3fqnvy","sha256":"ea7890608de0285ed1b0d93383d60aa88e9c9b4fe33e4cf08715202bccc3696a"},{"kind":"crop","node":"kpk13yn","sha256":"a1ce0163f0916515deed37d4b345187528305507fbd847f68b92af0a7147af29"},{"kind":"crop","node":"kw2fb3v","sha256":"cd112f1274cc1350acc0f0b7f5fb6a7e69992277320eefd7a89177e3b818ba0a"},{"kind":"crop","node":"mkakqg3","sha256":"711a38b76111a51d10dfa95540ec9d532af4f747c579e0ce334ddb9f2dd6245e"},{"kind":"crop","node":"nkm3xn5","sha256":"9b6fe65013a5231ebfda702637f2fa7c47155f2a2dc35d93fd9e0097ec4f7af9"},{"kind":"crop","node":"qn08tj9","sha256":"3a959cece8b823dd6125490270d75ba3a8126710e11fef7746c30d294ba06b16"},{"kind":"crop","node":"rr9wvsy","sha256":"2009aedf8b2e7f5d17018e81633a9f594039dc03b199f447df0708d39f33e3c3"},{"kind":"crop","node":"sam8g7e","sha256":"69c110b291213b16b2825f6c9804a47f9da2f9537cb23d5c77ec22ca03c8b02b"},{"kind":"crop","node":"sxgcc9h","sha256":"3d7197ebb9d3256b54d773a0ed940a60c023e78a324649908f02682a3bdc66fa"},{"kind":"crop","node":"t3dsc22","sha256":"6a9991fdd7c4beac2e4396e9160305e819dbe1303487dc9777da3a022cdb7a4e"},{"kind":"crop","node":"t6gjpee","sha256":"9947acdb70078a8d1fdf2ce9b654cce2eb5d20745f35370985b809e1b931de44"},{"kind":"witness","sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"}],"format":"scienting-receipt/1","id":"eqgbbpwb6725v","level":"F3","nodes":[["ba6xp29","c0fe6b3090e024652f05c04c236932e6e0675efdc7bd4eab880fbc609b87abb8"],["cq77erb","f9a5df8760b27e0be045ca8fac31c6f810925a1c6f5f1adbf4d57c074e0ef7b7"],["dm452cm","3bf0f8ecfaeabf8546ecfac5ff88a5083d40b39fbc9b7d23c57070a15276631e"],["e0n07n0","6ebc7eb98564471c9fabacf60e15bbc03ee019fa3a806731b8502db326a24f6c"],["e4fkseg","5421e9cf0ef3a995792963d0371b79e11a8efad519b02efb5cb88311a896d0cc"],["ezb1n33","bc58a669d6c2dd62e34a8067482e99274365b7a9b640feb4e40f049cd4aa65f2"],["f929eq9","cd6cdb032e9b8ab712790b7181f794f6e363b7c4c96888049b59c671c1596369"],["gy4avx6","52404bd0f3b95103a0f46b59d3b6af851bcde8548fae6d349e82bc25d23a3b7e"],["h5psthj","3ef4e8338041687f926025a210859cf7f1686ace4b92bc4b5a1f96e03b55fb03"],["hw8fx4r","e554e4381827c90595a9083fd3a16e6cc72d0b14e52b3d86104c4b42a9f101b8"],["j3d4w5v","e1984eeb82451ef60cb4079dbe0c3f5f0cbd4fb359dc0a758da42f958013cb48"],["j67ec9p","b95706fc7f64b589532af7687297469d7fd2f48443190111c6361af96b578558"],["k3fqnvy","3667b6fda5e0fc2e714a303f597938e4a84a1c5786b7c233af323cba905dd745"],["kpk13yn","6e366c4aea409d36e918ad1bb71b1ec39c4203a5a0793bd66fc347c99b717760"],["kw2fb3v","dd26b057d6391ab1966fc1a6c49798e7a8e925f9c23a09812eb2758104cb6f36"],["mkakqg3","3174ecb5b11912a58c22f7069747d93753fdf0c88684ee7264dc2c0cf2ab8fe5"],["nkm3xn5","21f13b21948078f64c564334e5bb180b4495edb25a79ae32aa967986a626f3d5"],["qn08tj9","cc0bf73dd84e298da0d36c4b363c8d2bdc9b6d5738d1923d14c4a9028dca08d6"],["rr9wvsy","4a37ffce2a07de7a6fcbf4a63b0679945c79ac8db9d2ec492e0fb1ff5072540d"],["sam8g7e","9e2f3bd947511657e48b54d1fa44645b24217e10390215fb2086ea2e4f2031a9"],["sxgcc9h","76e06b4811a688357ac4b912172283463cfaf1b7a1f0795d274fc733a2309ba7"],["t3dsc22","5b180503866108fc210b788554bfdf02570e82a9f87754cd6e2293106d592158"],["t6gjpee","c63c1c3c34edbed309ddb56ded1c9dd788c5c49946e8af97b102a25ef1d96018"]],"rev":12,"root":"d2a524dee5ef347b313f1714a47f7bafd83f554266596e1ed4b3e52093642216","scope":"targeted:lode","signature":{"key":"ana","scheme":"ed25519","value":"PXrzXjQaaLJlv0ayxPV50e6Ae299+WJhf7/JQ271zn3xKcMFL1Rx0v+n1nQhzHuo910UWL7FNM/g781fqYKfCQ=="}},"record_hash":"72bc16bb7166388bb7ae132b838eb19c1477400b8b5d4354fa35a2a111a2b180","record_id":"eqgbbpwb6725v"} diff --git a/vectors/spotcheck.jsonl b/vectors/spotcheck.jsonl new file mode 100644 index 0000000..be0b2e5 --- /dev/null +++ b/vectors/spotcheck.jsonl @@ -0,0 +1,7 @@ +{"checker_public":"88UkRiHFGoYXvh4Y9/ScWeZwnrlcX3smDr94j7tVh5E=","id":"q1","minimum":10,"n":23,"rate":"0.05","receipt":{"at":"2026-10-11T15:02:11Z","by":"ana","doc":"hale2026harmonic","evidence":[{"kind":"crop","node":"ba6xp29","sha256":"f8da39772d0f11f2ef05be9e9f26f8d5c8ef60a6c4fdd81d1e08b5f8dfa89943"},{"kind":"crop","node":"cq77erb","sha256":"414d9c94f57ac7039517d81bd915abe3d59711bb0aa8ca49e7b93b656d613b24"},{"kind":"crop","node":"dm452cm","sha256":"a6c7fc9f20c6a78160e77e2ab0154a64bec4d903b5fd1d2d99b5880591903872"},{"kind":"crop","node":"e0n07n0","sha256":"ae161916f2ff84503386df9733a7c878fe84015c17cfd36d5f9bce3539fb849b"},{"kind":"crop","node":"e4fkseg","sha256":"ab6ae30528212e54c2a74d8ed67631ff65f74055505dbe8af44d92a29bde0840"},{"kind":"crop","node":"ezb1n33","sha256":"638e1b8704af8aa5dfe1839c853a8f7ba0d8fa97fd2fdcbce2212f08bbdc0a91"},{"kind":"crop","node":"f929eq9","sha256":"cd6aaea1755038f67b5c0ccbdd962defba1eb35105cceb602b5cdbc3c215f7f2"},{"kind":"crop","node":"gy4avx6","sha256":"92248b149d2c3ec39ceeff1d3373f031f6a70cd1949c6f8122fdd6ebcd62b51c"},{"kind":"crop","node":"h5psthj","sha256":"15efd08d97b3179177450b8dcbe3a5f409ab2b69264feaf4e683ecedb5f190b9"},{"kind":"crop","node":"hw8fx4r","sha256":"91fe488a266419894e767e3cc454289006c60396d89ceae4874ba26615066e5d"},{"kind":"crop","node":"j3d4w5v","sha256":"ed0e073495b767d7f9fad42a4fb4a1cff766ef03b453269783fe374a813d226d"},{"kind":"crop","node":"j67ec9p","sha256":"ef98568b73187f04020315ab16047b8c736455c521cf67ec8c2c844ddbc03535"},{"kind":"crop","node":"k3fqnvy","sha256":"ea7890608de0285ed1b0d93383d60aa88e9c9b4fe33e4cf08715202bccc3696a"},{"kind":"crop","node":"kpk13yn","sha256":"a1ce0163f0916515deed37d4b345187528305507fbd847f68b92af0a7147af29"},{"kind":"crop","node":"kw2fb3v","sha256":"cd112f1274cc1350acc0f0b7f5fb6a7e69992277320eefd7a89177e3b818ba0a"},{"kind":"crop","node":"mkakqg3","sha256":"711a38b76111a51d10dfa95540ec9d532af4f747c579e0ce334ddb9f2dd6245e"},{"kind":"crop","node":"nkm3xn5","sha256":"9b6fe65013a5231ebfda702637f2fa7c47155f2a2dc35d93fd9e0097ec4f7af9"},{"kind":"crop","node":"qn08tj9","sha256":"3a959cece8b823dd6125490270d75ba3a8126710e11fef7746c30d294ba06b16"},{"kind":"crop","node":"rr9wvsy","sha256":"2009aedf8b2e7f5d17018e81633a9f594039dc03b199f447df0708d39f33e3c3"},{"kind":"crop","node":"sam8g7e","sha256":"69c110b291213b16b2825f6c9804a47f9da2f9537cb23d5c77ec22ca03c8b02b"},{"kind":"crop","node":"sxgcc9h","sha256":"3d7197ebb9d3256b54d773a0ed940a60c023e78a324649908f02682a3bdc66fa"},{"kind":"crop","node":"t3dsc22","sha256":"6a9991fdd7c4beac2e4396e9160305e819dbe1303487dc9777da3a022cdb7a4e"},{"kind":"crop","node":"t6gjpee","sha256":"9947acdb70078a8d1fdf2ce9b654cce2eb5d20745f35370985b809e1b931de44"},{"kind":"witness","sha256":"23b6b2aaece9cb0a828a2f0265539500fcf34d5195bf720b934b8bfdeccb9834"}],"format":"scienting-receipt/1","id":"eqgbbpwb6725v","level":"F3","nodes":[["ba6xp29","c0fe6b3090e024652f05c04c236932e6e0675efdc7bd4eab880fbc609b87abb8"],["cq77erb","f9a5df8760b27e0be045ca8fac31c6f810925a1c6f5f1adbf4d57c074e0ef7b7"],["dm452cm","3bf0f8ecfaeabf8546ecfac5ff88a5083d40b39fbc9b7d23c57070a15276631e"],["e0n07n0","6ebc7eb98564471c9fabacf60e15bbc03ee019fa3a806731b8502db326a24f6c"],["e4fkseg","5421e9cf0ef3a995792963d0371b79e11a8efad519b02efb5cb88311a896d0cc"],["ezb1n33","bc58a669d6c2dd62e34a8067482e99274365b7a9b640feb4e40f049cd4aa65f2"],["f929eq9","cd6cdb032e9b8ab712790b7181f794f6e363b7c4c96888049b59c671c1596369"],["gy4avx6","52404bd0f3b95103a0f46b59d3b6af851bcde8548fae6d349e82bc25d23a3b7e"],["h5psthj","3ef4e8338041687f926025a210859cf7f1686ace4b92bc4b5a1f96e03b55fb03"],["hw8fx4r","e554e4381827c90595a9083fd3a16e6cc72d0b14e52b3d86104c4b42a9f101b8"],["j3d4w5v","e1984eeb82451ef60cb4079dbe0c3f5f0cbd4fb359dc0a758da42f958013cb48"],["j67ec9p","b95706fc7f64b589532af7687297469d7fd2f48443190111c6361af96b578558"],["k3fqnvy","3667b6fda5e0fc2e714a303f597938e4a84a1c5786b7c233af323cba905dd745"],["kpk13yn","6e366c4aea409d36e918ad1bb71b1ec39c4203a5a0793bd66fc347c99b717760"],["kw2fb3v","dd26b057d6391ab1966fc1a6c49798e7a8e925f9c23a09812eb2758104cb6f36"],["mkakqg3","3174ecb5b11912a58c22f7069747d93753fdf0c88684ee7264dc2c0cf2ab8fe5"],["nkm3xn5","21f13b21948078f64c564334e5bb180b4495edb25a79ae32aa967986a626f3d5"],["qn08tj9","cc0bf73dd84e298da0d36c4b363c8d2bdc9b6d5738d1923d14c4a9028dca08d6"],["rr9wvsy","4a37ffce2a07de7a6fcbf4a63b0679945c79ac8db9d2ec492e0fb1ff5072540d"],["sam8g7e","9e2f3bd947511657e48b54d1fa44645b24217e10390215fb2086ea2e4f2031a9"],["sxgcc9h","76e06b4811a688357ac4b912172283463cfaf1b7a1f0795d274fc733a2309ba7"],["t3dsc22","5b180503866108fc210b788554bfdf02570e82a9f87754cd6e2293106d592158"],["t6gjpee","c63c1c3c34edbed309ddb56ded1c9dd788c5c49946e8af97b102a25ef1d96018"]],"rev":12,"root":"d2a524dee5ef347b313f1714a47f7bafd83f554266596e1ed4b3e52093642216","scope":"targeted:lode","signature":{"key":"ana","scheme":"ed25519","value":"PXrzXjQaaLJlv0ayxPV50e6Ae299+WJhf7/JQ271zn3xKcMFL1Rx0v+n1nQhzHuo910UWL7FNM/g781fqYKfCQ=="}},"sample":["ba6xp29","cq77erb","f929eq9","gy4avx6","hw8fx4r","j67ec9p","mkakqg3","nkm3xn5","sxgcc9h","t6gjpee"],"seed":"bPQLLpnUqkuXM324VmyTGYL5CCRWO0pi+4C6mPXUe735LDjfbPhXVBUrgHJa8XQLnp48B2maxpuQKaZBaBJSBg==","seed_payload":"{\"format\":\"scienting-spot-check/1\",\"receipt\":\"72bc16bb7166388bb7ae132b838eb19c1477400b8b5d4354fa35a2a111a2b180\"}","size":10} +{"id":"size-3","minimum":10,"n":3,"rate":"0.05","size":3} +{"id":"size-10","minimum":10,"n":10,"rate":"0.05","size":10} +{"id":"size-199","minimum":10,"n":199,"rate":"0.05","size":10} +{"id":"size-200","minimum":10,"n":200,"rate":"0.05","size":10} +{"id":"size-201","minimum":10,"n":201,"rate":"0.05","size":11} +{"id":"size-3000","minimum":10,"n":3000,"rate":"0.05","size":150}