First implementation (#1)
check / check (push) Successful in 42s
site / site (push) Successful in 3m4s

Reviewed-on: #1
This commit was merged in pull request #1.
This commit is contained in:
alexm committed 2026-10-15 05:47:05 -04:00
1 parent 34c0abb26a
commit 4fa326dc76
534 files changed
+28280 -37

No files matched your search

+81
View File
@@ -0,0 +1,81 @@
# EditorConfig: https://editorconfig.org
# In VS Code, install the "EditorConfig for VS Code" extension (EditorConfig.EditorConfig).
root = true
[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 4
insert_final_newline = true
trim_trailing_whitespace = true
[*.{py,pyi}]
indent_size = 4
max_line_length = 88
[*.{mojo,🔥}]
indent_size = 4
max_line_length = 88
[*.rs]
indent_size = 4
max_line_length = 100
[{Cargo.toml,Cargo.lock,rustfmt.toml,.rustfmt.toml,clippy.toml}]
indent_size = 4
[{mojoproject.toml,pixi.toml,pixi.lock}]
indent_size = 4
[*.{yml,yaml}]
indent_size = 2
[*.{json,jsonc,json5}]
indent_size = 2
[*.sql]
indent_style = space
indent_size = 2
[*.{js,jsx,mjs,cjs,ts,tsx,css,scss,less,html,vue,svelte}]
indent_size = 2
[*.{toml,ini,cfg}]
indent_size = 4
[*.xml]
indent_size = 2
[*.{md,markdown}]
indent_size = 2
trim_trailing_whitespace = false
[*.{sh,bash,zsh}]
indent_size = 2
[{Makefile,makefile,*.mk}]
indent_style = tab
[*.go]
indent_style = tab
[*.{bat,cmd,ps1}]
end_of_line = crlf
[{Dockerfile,Dockerfile.*,*.dockerfile}]
indent_size = 4
[*.{tf,tfvars,hcl}]
indent_size = 2
[LICENSE*]
insert_final_newline = false
[*.{diff,patch}]
trim_trailing_whitespace = false
[*.min.{js,css}]
insert_final_newline = unset
trim_trailing_whitespace = unset
+7
View File
@@ -0,0 +1,7 @@
* text=auto eol=lf
# Generated data: exact bytes matter, and diffs are by line.
vectors/** -text diff
fixtures/** -text diff
fixtures/**/*.png binary
# The pixi lock file: generated, highlighted as YAML, never merged line by line.
pixi.lock merge=binary linguist-language=YAML linguist-generated=true
+21
View File
@@ -0,0 +1,21 @@
# Forgejo and Gitea Actions both read .github/workflows when their own folder is absent.
# On Forgejo, if the runner's default action mirror lacks setup-pixi, write it as
# https://github.com/prefix-dev/setup-pixi@v0.9.4.
# The tools need Python 3.14, which pixi.toml pins, so one environment covers every supported Python.
name: check
on:
push:
branches: [main]
pull_request:
jobs:
check:
runs-on: linux-base
container:
image: git.scient.ing/infra/linux-base:26.10.7
steps:
- uses: actions/checkout@v4
- name: Check the repository
run: pixi run check
- name: Stress the reference implementation
run: pixi run python tools/stress.py
+59
View File
@@ -0,0 +1,59 @@
# Builds and checks the website on every push to main, and publishes it to /srv/www/paperspec; see deploy/README.md.
# The linux-base runner mounts the host's /srv/www into its job containers, so publishing is a local copy.
name: site
on:
push:
branches: [main]
workflow_dispatch:
permissions:
contents: read
concurrency:
group: site-publish
cancel-in-progress: false
defaults:
run:
shell: bash
env:
SITE_ROOT: /srv/www
SITE_SLUG: paperspec
jobs:
site:
runs-on: linux-base
container:
image: git.scient.ing/infra/linux-base:26.10.7
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: Restore the environment
uses: actions/cache@v4
with:
path: .pixi/envs
key: pixi-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('pixi.lock') }}
restore-keys: pixi-${{ runner.os }}-${{ runner.arch }}-
- name: Install the environment
run: pixi install --locked
- name: Check the repository and the site
run: pixi run --frozen quick
- name: Build the site
run: pixi run --frozen site --out _site
- name: Publish the site
if: github.ref == 'refs/heads/main'
run: |
if [ ! -d "$SITE_ROOT" ]; then
echo "$SITE_ROOT is not mounted on this runner, so the site was built and checked but not published."
exit 0
fi
case "$SITE_SLUG" in
''|*/*|.*) echo "SITE_SLUG must be a plain folder name, not '$SITE_SLUG'." >&2; exit 1 ;;
esac
if [ ! -f _site/index.html ] || [ ! -f _site/404.html ]; then
echo "_site/ has no index.html or 404.html, so it was not published." >&2
exit 1
fi
# --checksum without --times leaves unchanged files untouched, so their Last-Modified and ETag stay valid
# in caches; --delay-updates and --delete-delay apply the changes together at the end of the copy, and
# --chmod keeps every file readable by the web server whatever the container's umask.
rsync --recursive --links --perms --chmod=D755,F644 --checksum --delay-updates --delete-delay --stats \
_site/ "$SITE_ROOT/$SITE_SLUG/"
+764
View File
@@ -0,0 +1,764 @@
__pycache__/
*.pyc
*.db
*.db.assets/
# the website, built by tools/site.py
/_site/
# pixi environments
.pixi/*
!.pixi/config.toml
# Created by https://www.toptal.com/developers/gitignore/api/osx,python,pycharm,windows,visualstudio,visualstudiocode,zsh,jetbrains,jupyternotebooks
# Edit at https://www.toptal.com/developers/gitignore?templates=osx,python,pycharm,windows,visualstudio,visualstudiocode,zsh,jetbrains,jupyternotebooks
### JetBrains ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### JetBrains Patch ###
# Sonarlint plugin
# https://plugins.jetbrains.com/plugin/7973-sonarlint
.idea/**/sonarlint/
# SonarQube Plugin
# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
.idea/**/sonarIssues.xml
# Markdown Navigator plugin
# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
.idea/**/markdown-navigator.xml
.idea/**/markdown-navigator-enh.xml
.idea/**/markdown-navigator/
# Cache file creation bug
# See https://youtrack.jetbrains.com/issue/JBR-2257
.idea/$CACHE_FILE$
# CodeStream plugin
# https://plugins.jetbrains.com/plugin/12206-codestream
.idea/codestream.xml
# Azure Toolkit for IntelliJ plugin
# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij
.idea/**/azureSettings.xml
### JupyterNotebooks ###
# gitignore template for Jupyter Notebooks
# website: http://jupyter.org/
.ipynb_checkpoints
*/.ipynb_checkpoints/*
# IPython
profile_default/
ipython_config.py
### OSX ###
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/#use-with-ide
.pdm.toml
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
.claude
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
### Python Patch ###
# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
poetry.toml
# ruff
.ruff_cache/
# LSP config files
pyrightconfig.json
### VisualStudioCode ###
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
### VisualStudioCode Patch ###
# Ignore all local history of files
.history
.ionide
### Windows ###
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
### Zsh ###
# Zsh compiled script + zrecompile backup
*.zwc
*.zwc.old
# Zsh completion-optimization dumpfile
*zcompdump*
# Zsh history
.zsh_history
# Zsh sessions
.zsh_sessions
# Zsh zcalc history
.zcalc_history
# A popular plugin manager's files
._zinit
.zinit_lstupd
# zdharma/zshelldoc tool's files
zsdoc/data
# robbyrussell/oh-my-zsh/plugins/per-directory-history plugin's files
# (when set-up to store the history in the local directory)
.directory_history
# MichaelAquilina/zsh-autoswitch-virtualenv plugin's files
# (for Zsh plugins using Python)
# Zunit tests' output
/tests/_output/*
!/tests/_output/.gitkeep
### VisualStudio ###
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
*.code-workspace
# Local History for Visual Studio Code
# Windows Installer files from build outputs
# JetBrains Rider
*.sln.iml
### VisualStudio Patch ###
# Additional files built by Visual Studio
# End of https://www.toptal.com/developers/gitignore/api/osx,python,pycharm,windows,visualstudio,visualstudiocode,zsh,jetbrains,jupyternotebooks
# The Visual Studio rules above ignore every packages/ and log/ folder; these hold fixtures that tools/check.py
# compares byte for byte, so keep them.
!/fixtures/packages/*
!/fixtures/records/log/
+5
View File
@@ -0,0 +1,5 @@
{
// Which files markdownlint-cli2 checks; the rules themselves are in .markdownlint.jsonc.
"globs": ["**/*.md"],
"ignores": [".pixi/**", "node_modules/**", "_site/**"]
}
+9
View File
@@ -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
}
+21
View File
@@ -0,0 +1,21 @@
# Changelog
A change to any computed value is a breaking change and needs a new major version of the format it touches; see [spec/00-introduction.md](spec/00-introduction.md).
## 0.1.0
The first release.
- The specification, in chapters 0 to 23, covering every format: 32 formats, of which 19 are `candidate` and 13 `provisional`.
- 42 JSON Schemas, using a keyword subset that independent validators read alike.
- Tables for SQLite, Dolt and PostgreSQL, a team's store, and the SQLite bundle with full-text search.
- The JSON-LD context for layers, and registries of formats, rules, download-stamp rules and default stage requirements.
- Test vectors for every computed value, from canonical JSON to anchor resolution, grading and the target set of targeted F3.
- Example packages (a converted chemistry paper with corrections and receipts, its checks-only export, an open-access paper, a Typst draft and a tiny document, also as a zip), a record of every other format, and 31 broken packages, each breaking one named rule.
- Work keys minted from a Scholar-style citation key and a hash of the work's identity, with document keys for versions; `tag:` URIs for layers, annotations and documents.
- Spot-check seeds as VRF proofs (RFC 9381), RFC 9162 inclusion and consistency proofs, a history root over every document's corrections, and a provisional transparency log with signed checkpoints.
- Signed QA reports, a conformance checklist covered by a receipt, and a `description` annotation for the figure descriptions an accessible export needs.
- ML-DSA-65 (FIPS 204) as a signature scheme, with a reference implementation checked against NIST's vectors; `cose` reserved; `did:key` identifiers for roster keys; the hash algorithm named in every document; model provenance by weights, prompt and parameters; witnesses and a static tile layout for the log; and the character data pinned to Unicode 16.0.
- Guides for newcomers: an overview, the concepts, a walkthrough of the example paper, runnable examples, the rationale, a FAQ and a glossary.
- Tools that build and check everything, validate packages and zipped packages and run proposed corrections through the gate, load packages into SQLite or a bundle, and stress the reference implementation with random inputs.
- A pixi workspace pinned to Python 3.14, with tasks for checking, building, linting, validating and loading.
+59
View File
@@ -0,0 +1,59 @@
# Contributing
This page is for anyone who wants to fix the specification, change a format or add an example.
Propose a change as a pull request on the repository at <https://git.scient.ing/infra/paperspec>.
## What a change needs
A change starts in the chapter of [the specification](spec/README.md) that defines the rule, because the chapters are normative.
The schemas, SQL, registries, vectors and fixtures then follow the chapter ([spec/00 §0.5](spec/00-introduction.md#05-how-the-repository-is-arranged)).
1. **Change the chapter.**
Say what is new in the chapter's own terms, and link the sections it touches.
2. **Change the schemas, SQL and registries** that the rule shapes.
A new refusal gets a rule ID in [registry/rules.json](registry/rules.json).
3. **Compute, never type, the expected values.**
Change the oracle in [tools/oracle/](tools/oracle/) to apply the rule, and add the case that shows it to [tools/build.py](tools/build.py): a vector, a fixture or a broken package in `fixtures/invalid/`.
Then run `pixi run build`, which rewrites `fixtures/` and `vectors/`.
4. **Run the checks.**
`pixi run check` must end with `All checks pass.`
Without pixi, run `python3 tools/check.py`, with Python 3.14 and two packages, `jsonschema` and `cryptography` installed.
5. **Record the change** in [CHANGELOG.md](CHANGELOG.md).
## Versions
A change that makes a valid file invalid, or that changes a computed value, is a breaking change and needs a new major version of the format, with a migration.
Adding an optional property, a node kind, a run kind or an enumeration value is a minor change ([spec/00 §0.3](spec/00-introduction.md#03-format-identifiers-and-versions)).
A rebuild that changes any file under `vectors/` or any hash in `fixtures/` is a computed value changing, so say in the pull request why it must.
## New node kinds and run kinds
Propose a kind with the vector or fixture that shows it.
A node kind needs its row in [chapter 3](spec/03-nodes.md), the node schema, and its entry in the `CHILDREN` table of `tools/oracle/model.py`.
A run kind needs its row in [section 3.5](spec/03-nodes.md#35-inline-runs) and the node schema, and its text in the plain projection ([3.6](spec/03-nodes.md#36-the-plain-projection)) and in the strict and lossy projections ([5.3](spec/05-hashes.md#53-the-strict-projection), [5.5](spec/05-hashes.md#55-the-lossy-projection)).
## Releasing
A release is a tag on `main` whose version is the top heading of [CHANGELOG.md](CHANGELOG.md).
Before tagging:
1. `pixi run check` passes on Linux and macOS, which the workflow in `.gitea/workflows/` runs on every push.
The check also confirms that every count the prose states (formats, schemas, vectors, broken packages) matches the repository, and that `pixi.toml`, the registries and `tools/build.py` state the same version.
2. `python3 tools/stress.py` passes with its default seed, and with one or two others.
3. The website is published from the release ([deploy/](deploy/README.md)), and the JSON-LD context at `https://paperspec.scient.ing/context/scienting-1.jsonld` and a schema at its `$id` both answer with their media types.
Layers claim to be W3C Web Annotations, and a JSON-LD processor that cannot fetch the context cannot read them.
4. The decisions that freeze on release are made: enumeration values and format identifiers never change meaning afterwards ([spec/22 §22.5](spec/22-conformance.md#225-stability)), so a name worth changing is changed now.
5. The CHANGELOG entry describes the release in the terms of the chapters it touches.
## Writing
The checker enforces two rules on every Markdown file: one sentence per line, and US spelling.
`pixi run lint` runs markdownlint with the repository's settings.
Define each term where it first appears, because the guides and READMEs are written for newcomers as well as implementers.
All fixture text is synthetic, written for the fixtures.
The keys in `fixtures/keys/` are public test keys and must never sign anything else.
## Licenses
Each path keeps the license that [LICENSE.md](LICENSE.md) gives it: prose CC-BY-4.0, the normative data CC0-1.0, and `tools/` Apache-2.0.
+17
View File
@@ -0,0 +1,17 @@
# Licenses
| Paths | License | SPDX |
| --- | --- | --- |
| `spec/`, `docs/`, `README.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 <https://creativecommons.org/licenses/by/4.0/legalcode>, <https://creativecommons.org/publicdomain/zero/1.0/legalcode> and <https://www.apache.org/licenses/LICENSE-2.0>.
The formats are open so that anyone may implement them, in any product, without asking.
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.
+120 -37
View File
@@ -1,52 +1,135 @@
# varve-spec
# paperspec
The specifications of the Scientific Computing Studio's data formats: documents and their packages, anchors, receipts, rights, layers, exercises, datasets, digitizations, views, projects and bundles.
This is the repository the design calls `spec`, the baseline every other part implements.
**The data formats for storing a team's scientific papers once, correcting them once, addressing them down to the sentence, and keeping them.**
`spec` defines data, and data outlives code.
Every file any part writes is defined here, and a conforming file can be read without the part that wrote it.
Formats are named `scienting-<name>/<major>`, never after a product, so a product can be renamed without touching data.
This page is for three readers.
A newcomer should read straight through; each term is explained where it first appears.
The tables below point an implementer, who will write a reader, writer, converter or checker, to the chapters, test vectors and fixtures that define exact behavior.
The sections on status and on differences give an expert in the neighboring standards the version, the maturity of each format and the comparison.
The documentation and every file of the specification are published at <https://paperspec.scient.ing>, and the repository is at <https://git.scient.ing/infra/paperspec>.
## What is here
A research team usually cares about a few dozen papers it understands completely, not the world's literature.
Those papers deserve better than a folder of PDFs.
Every sentence, table cell and equation should have a permanent address, and every correction should be recorded with its evidence.
Notes, claims and extracted numbers should point at exactly what they came from.
Anyone should be able to see how far each piece was checked, and by whom.
| Path | Holds |
| --- | --- |
| [spec/](spec/README.md) | The normative chapters. Start with [spec/00-introduction.md](spec/00-introduction.md). |
| [schemas/](schemas/) | JSON Schemas (draft 2020-12) for every file and record. |
| [sql/](sql/) | Tables for SQLite, Dolt and PostgreSQL, and the SQLite bundle with full-text search. |
| [context/](context/) | The JSON-LD context that makes layers W3C Web Annotations. |
| [registry/](registry/) | Formats and media types, validation rule IDs, download-stamp rules and the default stage requirements. |
| [vectors/](vectors/README.md) | Test vectors for every computed value. |
| [fixtures/](fixtures/README.md) | Valid packages and records, invalid packages with the rule each breaks, and the test keys that signed them. |
| [tools/](tools/README.md) | The non-normative oracle that computed the vectors, the builder and the checker. |
| [DECISIONS.md](DECISIONS.md) | Where this text refines or departs from the design, and the decisions still open. |
This repository defines the files that make that possible.
It holds no application.
Every format is documented here and readable without any program's code, so a reader, writer, converter, checker or store can each be a separate program.
Every file is JSON (a plain-text format for structured data) or JSON Lines (one JSON record per line).
A package is the unit these formats store a paper in: a folder or a zip file of such files holding the text as nodes (sections, sentences, cells, equations), page geometry, references, corrections, review receipts and the list of suspects ([spec/12](spec/12-package.md)).
## Check it
Python 3.10 or later, with nothing installed:
```sh
python3 tools/check.py
```text
cornell1995second-saqk#k3m9q2a@4f1a0c[12:57]
└────── document ────┘└ node ┘└ pin ┘└span┘
```
It validates every schema, record and package, refuses every invalid package for the stated rule, recomputes every vector, rebuilds the fixtures and vectors and compares them byte for byte, loads every package into SQLite and unloads it byte for byte, and lints the prose.
With `jsonschema` installed it also validates every record a second time with that library.
`make check` does the same and runs `markdownlint` when it is available.
A hash is a short fingerprint computed from text: the same text always gives the same fingerprint, and changing one character changes the hash.
The string above names code points 12 to 57 of one sentence, as it read when its hash began `4f1a0c`.
The node ID `k3m9q2a` encodes no page, position or kind.
It is minted once from the document key, the node's kind, its text hash and its occurrence, and then frozen.
The document key's last four characters, `saqk`, are the start of a hash of the paper's DOI, so two papers that a citation key alone would name alike never share a key ([spec/02 §2.4](spec/02-model.md#24-work-and-document-keys)).
## Implement it
Fixing a typo elsewhere in the paper leaves the ID alone, and converting the same input again mints the same IDs.
A teammate's download of the same PDF, stamped differently by the publisher, has the same page fingerprints.
If a different converter reads the paper, each sentence it reads identically keeps its ID. Every difference becomes a suspect, a place flagged for review.
Nothing changes until a correction with its evidence is accepted ([spec/04](spec/04-identity.md), [spec/05 §5.6](spec/05-hashes.md#56-alignment)).
The address grammar is in [spec/06 §6.1](spec/06-anchors.md#61-addresses), and [vectors/addresses.jsonl](vectors/addresses.jsonl) holds valid and invalid examples.
An implementation conforms to the chapters and the vectors.
`scienting-core` (Python, standard library only) is the reference implementation of the shared rules, and `core-ts` the browser's; each runs this suite in its CI.
The oracle in `tools/` is not a library and is not meant to be imported: it exists so that no vector is typed by hand.
## Start here
## Status
| If you want to | Read |
| --- | --- |
| Understand what the project is and how the parts fit | [docs/overview.md](docs/overview.md) |
| Learn the ideas one at a time, each with an example | [docs/concepts.md](docs/concepts.md) |
| Follow one paper from its first reading to a signed document | [docs/walkthrough.md](docs/walkthrough.md) |
| Run something in the next five minutes | [docs/examples.md](docs/examples.md) |
| Implement a reader or writer | [spec/](spec/README.md), then [vectors/](vectors/README.md) |
| Know why a rule is the way it is | [docs/rationale.md](docs/rationale.md) |
| Look up a term | [docs/glossary.md](docs/glossary.md) |
| Compare with neighboring standards | [docs/comparison.md](docs/comparison.md) |
Version 0.1.0.
The formats of milestone M1 are `candidate`; datasets, digitizations, views, projects, bundles and the draft formats are `provisional` until their milestones; see [registry/formats.json](registry/formats.json).
## What is in the repository
| Folder | Holds |
| --- | --- |
| [spec/](spec/README.md) | The specification, in 24 chapters. Normative. |
| [schemas/](schemas/README.md) | JSON Schemas, which state what a valid file or record looks like, for every file and record. |
| [sql/](sql/README.md) | Tables for SQLite (a database kept in one file), Dolt and PostgreSQL, and the SQLite bundle with full-text search. |
| [context/](context/README.md) | The JSON-LD context (a file that gives JSON terms shared meanings) that makes annotation layers W3C Web Annotations. |
| [registry/](registry/README.md) | The list of formats, the rule IDs validators report, download-stamp rules, and the default rights each processing stage requires. |
| [vectors/](vectors/README.md) | Test vectors: inputs and the exact outputs every implementation must compute. |
| [fixtures/](fixtures/README.md) | Example packages and records, deliberately broken packages, and the test keys that signed them. |
| [tools/](tools/README.md) | The programs that build and check everything above. |
| [docs/](docs/README.md) | Guides for people getting to know the project. |
| [deploy/](deploy/README.md) | How the website at <https://paperspec.scient.ing> is built and served. |
## Try it
With [pixi](https://pixi.sh), one command sets up a pinned environment and checks everything:
```sh
pixi run check
```
The checker validates every schema, record and package.
It confirms that every broken package is refused for the stated reason.
It recomputes every test vector, and it rebuilds everything and compares it byte for byte.
Last, it loads every package into SQLite and back, and checks the prose and the links.
Pixi lints the Markdown first.
The run ends with `All checks pass.`
`pixi task list` shows the other tasks: `quick`, `build`, `lint`, `load`, `validate` and `stress`.
`pixi run python tools/site.py` builds the website into `_site/` ([deploy/](deploy/README.md)).
The tools need Python 3.14 and two packages, `jsonschema` and `cryptography`, which pixi installs along with markdownlint for the Markdown.
Without pixi, install those two with pip and run `python3 tools/check.py`.
To explore a worked package, load the example paper (a synthetic chemistry paper with 12 corrections) into SQLite and query it; [docs/examples.md](docs/examples.md) has queries to start from.
```sh
pixi run load --sqlite lab.db fixtures/packages/hale2026harmonic-damb
```
## Format names
Every format is named `scienting-<name>/<major>`, such as `scienting-doc/1` or `scienting-anchor/1`.
The `scienting-` prefix is the formats' namespace, a separate matter from the repository's name.
A format is named after what it holds, never after a product or a repository, and products can be renamed without touching data.
Schemas use the identifier base `https://paperspec.scient.ing/schemas/`.
[registry/formats.json](registry/formats.json) lists every format with its media type, schema, status and chapter.
## Status and limits
This is version 0.1.0.
Of the 32 formats, 19 are `candidate` and 13 are `provisional`.
The `provisional` formats are project, bundle, dataset, digitization, view, snapshot, draft-ids, exercise, submission, grade, checklist, log-entry and checkpoint; where those are described, they are marked as such.
The repository includes a reference checker, test vectors and fixtures.
The formats are built for a team-scale corpus of hundreds of documents, not hundreds of millions of papers.
They do not replace publisher interchange formats.
They do not fix what a converter reads wrongly; they record it and make it checkable.
Not every addressable thing is a node with five hashes (the content values `text_hash`, `match_hash`, `align_key`, `own_hash` and `node_hash`, explained in [docs/concepts.md](docs/concepts.md)).
Table columns and figure-text items have IDs and are not nodes ([spec/04 §4.2](spec/04-identity.md), [spec/09](spec/09-figures-tables-equations.md)).
## How it differs from neighboring standards
- JATS is the XML format in which publishers and archives exchange journal content ([NISO Z39.96-2024](https://www.niso.org/publications/z3996-2024-jats)).
Keep using it for exchange.
Here, a JATS file is one kind of reading a package can be established from (`jats` is a witness kind, [spec/02 §2.3](spec/02-model.md)).
- TEI has a sentence element, `<s>` ([TEI P5](https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-s.html)), and recommends author-assigned `xml:id` values for durable pointers ([TEI P5 pointers](https://tei-c.org/release/doc/tei-p5-doc/en/html/SA.html)).
Here, node IDs are minted by a rule and, when a node is merged or deleted, retired with a recorded successor ([spec/04 §4.3](spec/04-identity.md)).
- W3C Web Annotation is a general model for annotating any resource, with text quote, text position and other selectors ([W3C Recommendation](https://www.w3.org/TR/annotation-model/)).
Use it for annotation in general.
Here, annotation layers are Web Annotations whose target selector is a custom `AnchorSelector`, optionally followed by a standard `TextQuoteSelector` for tools that do not know ours ([spec/18](spec/18-layers.md)).
- Docling is an open-source document conversion toolkit ([arXiv:2501.17887](https://arxiv.org/abs/2501.17887)).
Use a converter like it to read PDFs.
It identifies items by position in a list, such as `#/texts/12` ([schema](https://raw.githubusercontent.com/docling-project/docling-core/main/docs/DoclingDocument.json)).
Here, IDs do not depend on position, and a second converter's reading is aligned with the first and compared.
## Licenses
The chapters and other prose are licensed CC BY 4.0.
Schemas, SQL, the JSON-LD context, the registries, the vectors and the fixtures are dedicated to the public domain under CC0 1.0, so anyone may implement the formats.
The tools are licensed Apache-2.0.
The specification and other prose are CC BY 4.0, so anyone may implement the formats.
Schemas, SQL, the JSON-LD context, the registries, the vectors and the fixtures are CC0 1.0.
The tools are Apache-2.0.
See [LICENSE.md](LICENSE.md).
+129
View File
@@ -0,0 +1,129 @@
# JSON-LD context
Three readers use this page.
A newcomer, such as a student who has not met these formats, can read it from the top.
Each term is defined where it first appears, and the example comes from the fixtures.
An implementer who is writing a reader, writer, converter or checker will find the exact behavior, the defining chapter, the files that pin it, and the traps in "Using the context".
An expert who knows the neighboring standards will find the status of the formats and a short comparison in "Status and comparison".
## What the context is
Annotations are notes attached to a passage of a paper, such as a plain-language explanation of a term or a question for a study group.
Annotation layers store them as JSON, a text format for structured data, one annotation per line.
A shared standard, the [World Wide Web Consortium (W3C) Web Annotation Data Model](https://www.w3.org/TR/annotation-model/), says what an annotation contains: a body (the note), a target (what it is about) and a selector (how to find the passage inside the target).
JSON-LD is JSON plus a rule that gives every field name a global meaning, written as an IRI (an identifier shaped like a web address).
The rule lives in a context, a file that maps short field names to IRIs.
Two tools that read the same context agree on what `target` or `status` means, even if they know nothing else about each other.
`scienting-1.jsonld` is the context that makes every annotation layer valid JSON-LD, together with the W3C Web Annotation context.
The Web Annotation context supplies `Annotation`, `body`, `target` and `selector`.
This one supplies the terms the formats add.
Its address is `https://paperspec.scient.ing/context/scienting-1.jsonld`, which is this file as the project's website serves it, with the media type `application/ld+json` and a header that lets a browser fetch it from any page.
The terms it maps are listed at `https://paperspec.scient.ing/vocab`, and each term's IRI is a fragment of that page.
A processor that cannot reach the site loads the copy in this folder in its place.
Every layer and every annotation lists both contexts, Web Annotation first:
```json
{"@context": ["http://www.w3.org/ns/anno.jsonld", "https://paperspec.scient.ing/context/scienting-1.jsonld"]}
```
The `scienting-` prefix is the formats' namespace, as in `scienting-layer/1` and `scienting-anchor/1`.
The repository's name, paperspec, is a separate matter.
## An example from the fixtures
[`fixtures/records/layer/annotations.jsonl`](../fixtures/records/layer/annotations.jsonl) holds nine annotations on the example paper `hale2026harmonic-damb`.
The first is a `gloss`, an explanation for a novice, of the phrase "bond force constant".
Shortened, it reads:
```json
{"@context": ["http://www.w3.org/ns/anno.jsonld", "https://paperspec.scient.ing/context/scienting-1.jsonld"],
"type": "Annotation", "motivation": "describing", "status": "confirmed",
"body": {"type": "TextualBody", "kind": "gloss", "audience": "novice",
"value": "A *harmonic* term treats a bond like a spring: ..."},
"target": {"type": "SpecificResource",
"source": "tag:scient.ing,2026:doc:smithlab/hale2026harmonic-damb",
"selector": [
{"type": "AnchorSelector",
"anchor": {"format": "scienting-anchor/1", "node": "rr20tev",
"span": [111, 130], "quote": {"exact": "bond force constant", "...": "..."}, "...": "..."}},
{"type": "TextQuoteSelector", "exact": "bond force constant",
"prefix": "rm{eq}})^2$$ where $K_r$ is the ", "suffix": " and $r_\\mathrm{eq}$ the equilib"}]}}
```
The Web Annotation context defines `type`, `motivation`, `body`, `target`, `source`, `selector`, `exact`, `prefix` and `suffix`.
This context defines `kind`, `status`, `audience`, `AnchorSelector` and `anchor`.
## What it defines
The file defines 23 terms.
Twenty-two map to IRIs under `https://paperspec.scient.ing/vocab#`: `format`, `kind`, `status`, `receipt`, `layer`, `audience`, `visibility`, `purpose`, `project`, `docs`, `pin`, `role`, `symbol`, `verdict`, `reason`, `reference`, `for`, `generator`, `exercise`, `anchor`, `rights_use` and the class `AnchorSelector`.
Three are renamed: `for` is `sct:questionFor`, `generator` is `sct:generatedBy`, and `rights_use` is `sct:rightsUse`.
The twenty-third, `total`, maps to `totalItems` in the ActivityStreams namespace.
Two terms carry a type rule.
A processor reads `layer` as an IRI, and it always reads `docs` as a set, so a one-element list stays a list.
The file declares `anchor` and `exercise` as JSON literals (`"@type": "@json"`, a JSON-LD 1.1 feature, which is why the file sets `"@version": 1.1`).
A JSON-LD processor then keeps a `scienting-anchor/1` record intact instead of expanding it.
An anchor holds hashes (fixed-length fingerprints of text) and a `span`, a pair of character offsets whose order carries meaning.
Expansion would drop the anchor's unmapped field names ([JSON-LD 1.1 API, expansion step 13.3](https://www.w3.org/TR/json-ld11-api/#alg-expand-each-key-value)) and would give its arrays no order ([JSON-LD 1.1 §4.3](https://www.w3.org/TR/json-ld11/#sets-and-lists)).
## The anchor selector and its fallback
A selector says how to find a passage inside a source.
The standard selectors work from the passage's text or its position.
`TextQuoteSelector` holds the quoted text (`exact`, required) and optionally some text before and after it (`prefix`, `suffix`).
`TextPositionSelector` holds start and end offsets, which the model itself calls "very brittle with regards to changes to the resource" ([Web Annotation Data Model](https://www.w3.org/TR/annotation-model/)).
`AnchorSelector` is the custom selector of these formats.
It carries a `scienting-anchor/1` record: the document key, the node ID, the node's `own_hash` and `node_hash` as they were when the anchor was made, an optional `span` in Unicode code points, a `quote`, and the document revision `rev` ([spec/06 §6.2](../spec/06-anchors.md#62-the-anchor)).
A reader can use the hashes to resolve the anchor against a corrected document and report one of five outcomes: `current`, `changed-below`, `moved`, `reattached` or `stale` ([spec/06 §6.5](../spec/06-anchors.md#65-resolution)).
A standard selector cannot do that.
A tool that does not know `AnchorSelector` cannot use it.
An annotation's `selector` list puts the `AnchorSelector` first and, where the anchor has a quote, a standard `TextQuoteSelector` after it, for tools that do not know ours ([spec/18 §18.3](../spec/18-layers.md#183-the-annotation)).
The formats use no `TextPositionSelector` and no `FragmentSelector`.
Such a tool still reads the annotation's body and its `TextQuoteSelector`; the context matters only to tools that process the data as linked data.
That is the repository's statement; no Web Annotation client has been tested against these files.
The fallback is not always there.
Three of the nine fixture annotations have only an `AnchorSelector` (the section-level question, the `generated` annotation on a figure and the exercise on a table), because the anchor points at a container and has no quote.
## Using the context
- Writer: Put both URLs (web addresses), in the order shown, in `@context` of `layer.json` and of every line of `annotations.jsonl`. [Chapter 18](../spec/18-layers.md) defines layers (§18.2), annotations (§18.3) and bodies (§18.4).
- Reader: Follow [chapter 6](../spec/06-anchors.md) to resolve an anchor.
The file `vectors/resolve.jsonl` resolves seventeen anchors against `fixtures/packages/hale2026harmonic-damb` and gives every outcome.
- JSON-LD processor: Use a JSON-LD 1.1 processor; the context relies on `@json` and `@version` 1.1.
- Checker: `schemas/annotation.schema.json` and `schemas/layer.schema.json` validate the files. `tools/check.py` also checks that each annotation's ID derives from its content and that the receipt at `fixtures/records/layer/receipt.json` covers each `confirmed` annotation.
The traps:
- No test vector pins the context, and nothing in `tools/` reads `scienting-1.jsonld`.
The schemas require only that `@context` be an array of at least two non-empty strings; they do not check the URLs.
A file with a wrong context can pass the checker and still expand wrongly.
- `@context` is part of an annotation's content hash (the hash covers everything except `status`, `receipt` and `modified`).
Rewriting or reordering the array changes the hash that a receipt covers.
- `format` is one term for two jobs: the layer's `format` (`scienting-layer/1`) and a text body's `format` (`text/markdown`).
The scienting context maps it to `sct:format`.
The Web Annotation context maps `format` to `dc:format` and protects none of its terms, and in an array of contexts the later definition wins ([JSON-LD 1.1 §4.1](https://www.w3.org/TR/json-ld11/#advanced-context-usage)), so listing this context second makes `format` mean `sct:format`.
- A consumer that does not use a field must still preserve it when it rewrites a file.
A tool that rewrites layers must not drop the scienting terms ([spec/00 §0.4](../spec/00-introduction.md)).
- The `TextQuoteSelector` repeats the anchor's plain quotation, and is left out when the quote is hashed (over 200 code points) or keyed ([spec/18 §18.3](../spec/18-layers.md#183-the-annotation)), so a public layer never shows text that a keyed anchor withholds.
## Status and comparison
The specification is version 0.1.0.
`scienting-layer/1`, `scienting-anchor/1` and `scienting-exercise/1` are `candidate` in [`registry/formats.json`](../registry/formats.json).
The specification defines `candidate` as "Complete, with vectors and fixtures, and ready to implement."
The context file is normative ([spec/00 §0.5](../spec/00-introduction.md)).
The W3C Web Annotation Data Model is a 2017 W3C Recommendation and the general standard for annotating web resources, with existing clients that form an ecosystem these formats do not have ([Web Annotation Data Model](https://www.w3.org/TR/annotation-model/)).
Its standard selectors carry no content hash of the target text and define no outcomes such as `moved` or `stale`.
Its remedy for a changing resource is to record a state of the whole resource.
Hypothesis stores a quote selector with 32 characters of context and reattaches by fuzzy matching ([Hypothesis, fuzzy anchoring](https://web.hypothes.is/blog/fuzzy-anchoring/), 2013).
These formats store a hash pin and define the outcomes exactly.
The full comparison is in [docs/comparison.md](../docs/comparison.md).
[Chapter 18](../spec/18-layers.md) defines layers and annotations.
+42
View File
@@ -0,0 +1,42 @@
{
"@context": {
"@version": 1.1,
"sct": "https://paperspec.scient.ing/vocab#",
"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#"
}
}
+34
View File
@@ -0,0 +1,34 @@
# Serves the paperspec website built by `python3 tools/site.py` (the `_site/` folder), copied to /srv/www/paperspec.
# The site mirrors the repository, so every schema is served at its $id and the JSON-LD context at the address
# layers name; this file sets the media types those addresses need and lets any page fetch them.
paperspec.scient.ing {
root * /srv/www/paperspec
encode zstd gzip
# Every file may be fetched from any origin: JSON-LD processors and schema validators in browsers need it.
header Access-Control-Allow-Origin "*"
header X-Content-Type-Options "nosniff"
# file_server keeps a Content-Type that is already set, so these take precedence over its defaults.
@jsonld path *.jsonld
header @jsonld Content-Type "application/ld+json"
@schema path /schemas/*.schema.json
header @schema Content-Type "application/schema+json"
@jsonl path *.jsonl
header @jsonl Content-Type "application/jsonl; charset=utf-8"
@package path *.sct.zip
header @package Content-Type "application/vnd.scienting.doc+zip"
@text path *.md *.py *.sql *.csv *.hex *.toml *.lock *.txt
header @text Content-Type "text/plain; charset=utf-8"
# Pages and the search index change with each release; data files are cached briefly too, since the
# addresses stay the same across releases while their contents may not.
header Cache-Control "public, max-age=300"
file_server
handle_errors {
rewrite * /404.html
file_server
}
}
+59
View File
@@ -0,0 +1,59 @@
# Deploying the website
This folder holds what it takes to serve the paperspec website at <https://paperspec.scient.ing>.
The site is static: `tools/site.py` builds it into `_site/`, and any web server can serve that folder.
## What the site serves
The site mirrors the repository, so a file at `schemas/anchor.schema.json` in the repository is served at `https://paperspec.scient.ing/schemas/anchor.schema.json`.
Three addresses that the formats themselves name depend on that:
| Address | What is there |
| --- | --- |
| `https://paperspec.scient.ing/schemas/<file>` | Each JSON Schema, at the address in its `$id`. |
| `https://paperspec.scient.ing/context/scienting-1.jsonld` | The JSON-LD context every layer and annotation lists. |
| `https://paperspec.scient.ing/vocab` | The vocabulary page, whose fragments are the IRIs of the context's terms. |
Beside every Markdown file the builder writes a rendered page: `README.md` becomes its folder's `index.html`, and `X.md` becomes `X.html`.
A folder without a README gets a listing page, so every fixture and vector can be browsed.
The pages need no server-side code; search runs in the browser over a small index of headings, `search.json`.
## Build it
```sh
pixi run python tools/site.py # writes _site/
pixi run python tools/site.py --out /tmp/paperspec-site
```
`pixi run check` builds the site into a temporary folder and checks that every Markdown file has a page, that every internal link and fragment resolves, that no Markdown is left unrendered, and that each schema's `$id`, the context's address and the vocabulary's IRIs are files of the site.
To look at it locally, serve the folder with any static server, for example:
```sh
pixi run python -m http.server --directory _site 8000
```
## Serve it with Caddy
[Caddyfile](Caddyfile) serves `/srv/www/paperspec` at `paperspec.scient.ing`.
It sets the media types the data needs (`application/ld+json` for the context, `application/schema+json` for schemas, `application/jsonl` for vectors and package files), allows every file to be fetched from any origin, and serves `404.html` for missing paths.
Add it to the server's Caddy configuration, for example with an `import` line, and reload Caddy.
## Publish from CI
The workflow `.gitea/workflows/site.yml` runs on every push to `main`.
It installs the environment from `pixi.lock`, runs `pixi run quick`, builds the site, and copies it with `rsync` to `/srv/www/paperspec`, the folder Caddy serves.
A failed check stops the publish, so the site never serves a release that does not pass its own checks.
The copy is local: the `linux-base` runner starts each job in a container with the host's `/srv/www` mounted at the same path, so no key or secret is involved.
On a runner without that mount the workflow still builds and checks the site, and says that it did not publish.
`SITE_ROOT` and `SITE_SLUG` at the top of the workflow name the folder.
Only changed files are copied, so every other file keeps its `Last-Modified` and `ETag` and caches stay valid across releases.
The environment in `.pixi/envs` is cached between runs under the hash of `pixi.lock`, so a fresh container installs it only when the lock file changes.
## Distributing packages
A zipped package is an ordinary file, and the site serves the fixtures as such.
For a team's own packages, the Gitea instance speaks the OCI distribution protocol, so packages can be pushed to and pulled from its package registry as OCI artifacts with ORAS, and signed there with cosign; the media type of the artifact is the package's, `application/vnd.scienting.doc+zip`.
Nothing in the formats depends on how packages travel.
+33
View File
@@ -0,0 +1,33 @@
# Guides
These guides explain paperspec to someone meeting it for the first time.
They serve three readers: a newcomer who has not seen the problem before, an implementer who will write a reader, writer, converter or checker, and an expert who knows the neighboring standards.
The [specification](../spec/README.md) says exactly what each format is.
The guides say what each format is for, with examples drawn from the fixtures.
| Guide | For |
| --- | --- |
| [Overview](overview.md) | What paperspec is, who it serves, and how its parts fit together. |
| [Concepts](concepts.md) | The ideas behind the formats, one at a time, each with a real example. |
| [Walkthrough](walkthrough.md) | One paper, from a flawed first reading to a corrected, reviewed and signed document. |
| [Examples](examples.md) | Things to run: checking hashes by hand, reading a package with a few lines of Python, querying a database. |
| [Rationale](rationale.md) | Why the formats look the way they do, and the questions they leave open. |
| [Comparison](comparison.md) | How paperspec compares with JATS, TEI, W3C Web Annotation and other schemas. |
| [*FAQ*](faq.md) | Short answers to the questions people ask first. |
| [Glossary](glossary.md) | Every term, in a sentence. |
## Reading orders
**Newcomer.** Spend a first afternoon on the overview, then the walkthrough with the fixture open beside it, then the examples.
Read the concepts when a term in the walkthrough needs more than the glossary gives.
**Implementer.** Start with the [specification's reading paths](../spec/README.md#reading-paths), which list the chapters to read for a reader, a converter, a store and a validator.
Chapters 0, 1, 3, 4 and 5 are needed for any of them.
Next, run the section "Test your implementation against a vector" in the examples.
Check your work against the [vectors](../vectors/README.md) and the [fixtures](../fixtures/README.md).
Chapter 22 of the specification defines conformance.
**Expert.** Read the overview for scope and for what paperspec is not, then the comparison for how it differs from existing standards.
After that, read the rationale for the reason behind each rule and the questions it leaves open.
It ends with a list of limits.
Section 0.4 of the specification and [registry/formats.json](../registry/formats.json) give the status of each format: the version is 0.1.0, and each format is `candidate` or `provisional`.
+481
View File
@@ -0,0 +1,481 @@
# How paperspec compares with other schemas and standards
A newcomer, such as a student who knows what a scientific paper and a citation are and has not met hashes, JSON-LD or annotation standards, can read each section's first paragraph and stop.
An implementer, who will write a reader, writer, converter or checker, gets the chapter that defines each behavior and the places where the formats differ from a neighbor in ways that cause bugs.
An expert, such as a researcher, standards author or reviewer who knows the neighboring standards, gets stated limits, the status of every format, and where the other standard is the better choice.
The repository is at <https://git.scient.ing/infra/paperspec>.
This page was checked against the repository, at the version given under "Limits and status".
Every statement about another standard links to the page it was read on, and those pages were read on 2026-10-12, so versions and dates are as of that day and may have moved.
Where the checked sources say nothing, this page says "not seen", "not specified" or "not in scope", and each phrase keeps one meaning: "not in scope" means the standard's own stated purpose excludes the feature, "not seen" means it was not found in the pages read (which is not proof it is absent), and "not specified" means the page read does not define it.
A note on names.
The project is called paperspec.
Its formats are named `scienting-<name>/<major>`, for example `scienting-doc/1` and `scienting-anchor/1`.
That prefix is the formats' namespace, and the repository's name is a separate matter; formats are named after what they hold, never after a product or a repository.
The identifiers appear inside hashed data and test vectors, so they are not renamed.
## The problem, and how to choose
Suppose a research team keeps fifty papers it needs to understand completely.
A page number names a region of a PDF and cannot name a statement, and it changes between a preprint and the published version.
The team wants to point at one sentence or one table cell, such as `hale2026harmonic-damb#rr20tev@76e06b[111:130]` in the fixtures, and have that pointer keep working after someone fixes a misread digit elsewhere in the paper.
The pointer has four parts:
- The document key, `hale2026harmonic-damb`.
- After `#`, the node ID, `rr20tev`.
- After `@`, the first six digits of the node's hash, `76e06b`, so the pointer names the sentence as it then read.
- In brackets, the code-point range of the words inside the sentence, `[111:130]`.
It also wants to know who compared a passage with the page image, and how far.
That is the problem paperspec's formats solve: they store a paper as a package of files in which every sentence, table cell and equation has a permanent address and every correction is recorded with its evidence.
Each level of checking is tied to the exact text it was checked against.
Most of the standards below solve different problems, so this page compares by problem solved, not by rank.
The next table maps each job to the standard to start with and the section that compares it.
| If your job is | Start with | Compare in |
| --- | --- | --- |
| Publishers and archives exchanging journal articles | JATS (Journal Article Tag Suite) | [JATS and JATS4R](#jats-niso-z3996-and-jats4r) |
| Encoding scholarly text, or extracting structure from PDFs | TEI, GROBID, Docling, MinerU, Marker | [TEI and GROBID](#tei-and-grobid), [PDF converters](#docling-mineru-and-marker) |
| Annotating a resource on the web | W3C Web Annotation | [Web Annotation](#w3c-web-annotation-selectors-and-hypothesis-style-anchoring) |
| Mining a corpus of millions of papers | S2ORC | [S2ORC and CORD-19](#s2orc-and-cord-19) |
| Publishing one claim as a citable object | Nanopublications, micropublications | [Claims](#nanopublications-and-micropublications) |
| Packaging data or files with metadata or fixity | Frictionless, RO-Crate, BagIt | [Packaging](#packaging-frictionless-data-package-ro-crate-and-bagit) |
| Identifying and registering works and datasets | schema.org, Crossref, DataCite | [Metadata](#metadata-schemaorg-crossref-and-datacite) |
| Generic provenance, canonical JSON (JavaScript Object Notation), Merkle trees | PROV-O, RFC 8785, RFC 6962, RFC 9162 | [Building blocks](#building-blocks-prov-o-rfc-8785-rfc-6962-and-rfc-9162) |
| Content-addressed storage | IPFS CIDs, SWHIDs | [Content addressing](#content-addressing-ipfs-cids-and-swhids) |
| Linking into a PDF, text or web page | RFC 8118, Media Fragments, RFC 5147, Text Fragments | [Fragment identifiers](#fragment-identifiers-and-pandoc) |
| Exchanging text-mining annotations, bibliographies, books | BioC, CSL-JSON, EPUB 3 | [BioC, CSL-JSON and EPUB 3](#bioc-csl-json-and-epub-3) |
## What paperspec is, in the terms used below
A few terms recur.
A hash is a fixed-length fingerprint computed from content, so any change to the content changes the hash; paperspec uses SHA-256, written as 64 lowercase hexadecimal digits ([spec/01 §1.3](../spec/01-conventions.md#13-hashes)).
Canonical JSON is a rule for writing JSON so that equal data always gives identical bytes, which is what makes a hash of JSON repeatable; paperspec uses the JSON Canonicalization Scheme of RFC 8785 ([spec/01 §1.1](../spec/01-conventions.md#11-canonical-json)).
A witness is one file of a paper, such as the publisher's PDF or a JATS XML file, identified by the SHA-256 of its bytes; a document is the text established from one or more witnesses ([spec/02 §2.1](../spec/02-model.md#21-four-objects)).
A package is a folder of canonical JSON files, or the same folder zipped as `.sct.zip`, with a manifest that lists every other file with its SHA-256 and size ([spec/12](../spec/12-package.md)).
The design choices that matter for comparison:
- **Node IDs:** A document is a tree of nodes (sections, paragraphs, sentences, cells, equations and so on, [spec/03](../spec/03-nodes.md)).
Each node has a 7-character ID, about 34.5 bits, valid as an HTML `id` and a URL fragment.
An ID is minted once from the document key, the node kind, the text hash and an occurrence count, then frozen: it is never recomputed, reassigned or reused.
It encodes no page, ordinal or kind.
A fresh conversion of the same input mints the same IDs ([spec/04 §4.2](../spec/04-identity.md#42-minting-node-ids)).
- **Five hashes per node:** `text_hash` covers the exact normalized text; `match_hash` is a strict projection that is the only value allowed to certify that two readings agree; `align_key` is a lossy projection that only proposes alignments; `own_hash` covers the node's own content; `node_hash` covers `{own, children}` as canonical JSON, so a change to one sentence changes the `node_hash` of each ancestor and nothing else ([spec/05 §5.1](../spec/05-hashes.md#51-the-five-values)).
- **Anchors:** An anchor stores a node ID, hashes, an optional span in Unicode code points and a quotation with up to 32 code points of context on each side.
Resolving it gives one of five results: `current`, `changed-below`, `moved`, `reattached` or `stale`, with a drift measure for `changed-below` ([spec/06](../spec/06-anchors.md)).
- **Corrections:** Corrections are appended, never edited.
Each carries evidence, an author and a reason, and a gate refuses a digit change without image evidence ([spec/11](../spec/11-corrections.md)).
In `fixtures/packages/hale2026harmonic-damb`, correction 1 replaces `3l0.0` with `310.0` because "OCR (optical character recognition) read the digit 1 as the letter l", with a crop of the page as evidence.
- **Fidelity and receipts:** Levels F0 (converted) to F3 (proofread).
F3 comes only from a signed receipt that lists the node at its current `node_hash`; a correction drops the node back ([spec/08](../spec/08-fidelity.md)).
- **Scale:** The formats are built for a team of roughly five to 20 people with a few dozen to a few hundred papers.
A 30-page paper is about 3,000 nodes, so 500 documents are about 1.5 million database rows ([spec/13 §13.2](../spec/13-database.md#132-tables)).
## Summary table
Each row summarizes the pages read for that standard.
Cells keep the wording of the verified source; the paperspec row is checked against the repository.
Maturity is left to the sections below, because a single word hides too much.
| Standard | Sentence-level permanent IDs | Content hashes | Anchors or selectors | Correction history | Fidelity or signatures | Per-file rights | Numeric data anchors | Full-text structure |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| **paperspec 0.1.0** | yes: 7-character IDs minted once, retired with a successor (spec/04) | yes: five SHA-256 values per node, plus keyed HMAC (hash-based message authentication code) forms (spec/05) | yes: ID, hash, quote, span, five outcomes with drift (spec/06) | yes: append-only, evidence-gated (spec/11) | yes: F0 to F3, signed receipts, spot-checks, error bounds (spec/08) | yes: per witness, with AI purpose and processor (spec/14) | yes: dataset values anchored to cells (spec/15; format `provisional`) | yes: sections to cells, equations, references (spec/03, 09) |
| [JATS standard page](https://www.niso.org/publications/z3996-2024-jats) (Z39.96-2024, v1.4) | not seen: no sentence element in the list shown | not seen | not in scope as an annotation model | not seen | not seen | partly: `permissions` and `license` elements exist | not seen | yes |
| [TEI P5](https://tei-c.org/guidelines/P5/) (v4.12.0) | partly: `<s>` and author-assigned `xml:id` | not seen | partly: `xml:id` pointers, XPointer schemes | partly: `<corr>`, `<sic>`, `<choice>` | not seen | not seen | not seen | yes |
| [GROBID TEI output](https://grobid.readthedocs.io/en/latest/Grobid-service/) | partly: optional sentence elements; IDs not described | not seen | partly: optional PDF coordinates | no | no; reports F1 figures | not in scope | not seen | partly: header, references, citation contexts, full text |
| [W3C Web Annotation](https://www.w3.org/TR/annotation-model/) | not in scope | not in scope | yes: TextQuote, TextPosition, Fragment, XPath, Range selectors, refinement, States | not in scope | not in scope | not in scope | not in scope | not in scope |
| [Hypothesis anchoring](https://web.hypothes.is/blog/fuzzy-anchoring/) (2013 post) | no | no | yes: Range, Position, Quote selectors, 4 reattach strategies | not in scope | not in scope | not in scope | not in scope | not in scope |
| [DoclingDocument](https://raw.githubusercontent.com/docling-project/docling-core/main/docs/DoclingDocument.json) (schema 1.10.0) | no: positional `self_ref` | no per-item hash seen; `binary_hash` is file-level | partly: `prov` with page, bbox, `charspan` | not seen | not seen | not seen | partly: table cells with spans and header flags | yes |
| [MinerU](https://github.com/opendatalab/MinerU) | no: locators embed page and block numbers | not seen | partly: locators to a character offset within a block | not seen | not seen | not seen | not seen | yes |
| [Marker](https://github.com/datalab-to/marker) | no: block IDs such as `/page/10/Page/366` | not seen | not specified | not seen | not seen | not seen | not seen | yes: tree of blocks |
| [S2ORC / doc2json](https://github.com/allenai/s2orc-doc2json) | no: paragraph level | partly: `pdf_hash` (file-level; algorithm not verified) | partly: character spans for citations, refs, equations | no | no | partly: dataset-level ODC-By 1.0 | no | partly: paragraphs with section labels |
| [CORD-19](https://arxiv.org/abs/2004.10706) | not seen | not seen | not seen | not seen | not seen | not seen | not seen | partly: "structured full text" |
| [Nanopublications](https://nanopub.net/guidelines/working_draft/) | not in scope | partly: trusty URI hash identifies the unit | not in scope | partly: integrity key shows a unit changed | not seen | not seen | not in scope | not in scope |
| [Micropublications](https://jbiomedsem.biomedcentral.com/articles/10.1186/2041-1480-5-28) | not in scope | not in scope | not in scope | not in scope | not in scope | not in scope | not in scope | not in scope (claim and argument model) |
| [Frictionless Data Package](https://datapackage.org/standard/data-package/) (v2) | not in scope | partly: optional resource `hash` (MD5 default) | not in scope | not in scope | not in scope | partly: `licenses` property | no | not in scope |
| [RO-Crate](https://www.researchobject.org/ro-crate/) (1.2 Rec) | not in scope | not seen (`contentSize` recommended) | not in scope | not seen | not seen | partly: schema.org license terms | not in scope | not in scope |
| [BagIt](https://www.rfc-editor.org/rfc/rfc8493) (RFC 8493) | not in scope | yes: per-file manifests, SHA-256 or SHA-512 | not in scope | not in scope | no: "not designed to be secure against active attacks" | not in scope | not in scope | not in scope |
| [schema.org ScholarlyArticle](https://schema.org/ScholarlyArticle) | no | partly: `sha256` on MediaObject | not in scope | partly: `correction` at work level | not in scope | partly: `license` (URL) at work level | not in scope | partly: `articleBody`, `hasPart`, `citation` |
| [Crossref deposit schema](https://www.crossref.org/documentation/schema-library/) (5.5.0) | not in scope | not seen | not in scope | partly: Crossmark, work level | not in scope | not verified | not in scope | not in scope: metadata only |
| [DataCite](https://schema.datacite.org/) (4.7) | not in scope | not seen | not in scope | not seen | not in scope | not seen | not in scope | not in scope: metadata only |
| [PROV-O Recommendation](https://www.w3.org/TR/prov-o/) | not in scope | not in scope | not in scope | partly: `wasInvalidatedBy`, `wasDerivedFrom` | not in scope | not in scope | not in scope | not in scope |
| [RFC 8785](https://www.rfc-editor.org/rfc/rfc8785) | not in scope | not in scope (canonical form only) | not in scope | not in scope | not in scope | not in scope | not in scope | not in scope |
| [RFC 6962](https://www.rfc-editor.org/rfc/rfc6962) / [RFC 9162](https://www.rfc-editor.org/rfc/rfc9162) | not in scope | yes: Merkle Tree Hash definition | not in scope | not in scope | not in scope | not in scope | not in scope | not in scope |
| [IPFS content addressing page](https://docs.ipfs.tech/concepts/content-addressing/) | no: addresses blocks and files | yes: identity is the hash | not in scope | no: new content gives a new CID | no | not in scope | not in scope | not in scope |
| [SWHID core identifiers](https://www.swhid.org/specification/v1.2/5.Core_identifiers/) (ISO/IEC 18670:2025) | not in scope | yes: SHA-1 based intrinsic identifiers | not in scope here | not in scope | not in scope | not in scope | not in scope | not in scope |
| [RFC 8118](https://www.rfc-editor.org/rfc/rfc8118) (PDF) | no | no | partly: page, destination, region, first-word search | no | no | no | no | no |
| [Media Fragments](https://www.w3.org/TR/media-frags/) | no | no | partly: time and region; nothing on text | no | no | no | no | no |
| [RFC 5147](https://www.rfc-editor.org/rfc/rfc5147) (text/plain) | no | partly: `md5=` and `length=` checks | yes: `char=` and `line=` | no | no | no | no | no |
| [Text Fragments](https://wicg.github.io/scroll-to-text-fragment/) (WICG draft) | no | no | partly: exact-text match with optional prefix and suffix | no | no | no | no | no |
| [Pandoc AST](https://hackage.haskell.org/package/pandoc-types) (pandoc-types 1.23.1) | not verified | not verified | not verified | not in scope | not in scope | not in scope | not in scope | yes: document AST (details not verified) |
| [BioC](https://pmc.ncbi.nlm.nih.gov/articles/PMC3889917) | not seen | not seen | yes: document-level offset and length per annotation | not in scope | not in scope | not in scope | not in scope | partly: passages and optional sentences |
| [CSL-JSON markup page](https://citeproc-js.readthedocs.io/en/latest/csl-json/markup.html) | not in scope | not in scope | not in scope | not in scope | not in scope | not in scope | not in scope | not in scope: bibliographic items |
| [EPUB 3.3](https://www.w3.org/TR/epub-33/) | not seen | not seen | not seen (CFI not confirmed) | not seen | not seen | not seen | not seen | yes |
## JATS (NISO Z39.96) and JATS4R
*What it is.*
JATS, the Journal Tag Suite, is an XML vocabulary in which publishers and archives exchange journal articles.
It is ANSI/NISO Z39.96-2024, version 1.4, approved by ANSI on October 9, 2024 and published October 31, 2024, under continuous maintenance ([NISO page](https://www.niso.org/publications/z3996-2024-jats)).
Its tag sets are Journal Archiving and Interchange (most permissive), Journal Publishing (moderately prescriptive) and Article Authoring (most prescriptive), continuing NLM DTD work begun in 2002 ([jats.nlm.nih.gov](https://jats.nlm.nih.gov/)).
JATS4R is a NISO working group that publishes tagging recommendations and a validator ([JATS4R](https://jats4r.niso.org/)).
*What it does well.*
It models journal-article structure and metadata: sections, paragraphs, table wrappers and cells, reference lists, related articles, footnotes, display formulas, supplementary material, permissions and licenses ([1.4 tag library](https://jats.nlm.nih.gov/archiving/tag-library/1.4/)).
Crossref's 5.4.0 deposit schema imports JATS ([Crossref](https://www.crossref.org/documentation/schema-library/metadata-deposit-schema-5-4-0/)), and a toolkit for S2ORC has a script for PMC JATS XML ([allenai/s2orc-doc2json](https://github.com/allenai/s2orc-doc2json)).
*How paperspec differs.*
JATS has `<permissions>` and `<license>` elements; where they may be placed was not verified, so no per-file rights comparison is made.
*Where JATS is the better choice.*
For publisher and archive exchange of journal content, and for the JATS4R recommendations on tagging consistency.
paperspec is not a publisher interchange format and does not replace JATS ([spec/02 §2.3](../spec/02-model.md#23-witnessesjson)).
*Interoperation.*
JATS is an input.
`jats` is a witness kind, and the fixture `okafor2025solvent-acth` was established from a JATS file and a PDF that agree ([fixtures/README.md](../fixtures/README.md)).
The document's `meta` is one CSL-JSON item, not JATS front matter ([spec/02 §2.2](../spec/02-model.md#22-documentjson)).
The specification defines no JATS exporter.
## TEI and GROBID
*What they are.*
The TEI P5 Guidelines are the Text Encoding Initiative's reference documentation, maintained by the TEI Consortium; the release table shows version 4.12.0, released 2026-07-28 ([TEI P5](https://tei-c.org/guidelines/P5/)).
GROBID is a Java machine-learning library that converts PDFs and similar documents to structured data, with full encoding in TEI for results ([GROBID introduction](https://grobid.readthedocs.io/en/latest/Introduction/)).
It is Apache-2.0 licensed and can return PDF coordinates ([repository](https://github.com/kermitt2/grobid)).
*What they do well.*
TEI has a sentence-like element `<s>` ([TEI element s](https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-s.html)).
Its `<corr>`, `<sic>` and `<choice>` markup preserves both readings of a corrected passage ([TEI element corr](https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-corr.html)), and `<zone>` marks facsimile regions ([TEI element zone](https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-zone.html)).
Pointers use `xml:id`, recommended "For durability in the presence of editing", plus XPointer schemes such as `xpath()`, `string-range()` and `match()` ([TEI pointers chapter](https://tei-c.org/release/doc/tei-p5-doc/en/html/SA.html)).
GROBID extracts header metadata, references, citation contexts and full text with coordinates, and reports, in its own documentation's documentation, an F1 of about 0.87 for references on a PubMed Central set and 0.76 to 0.91 for citation contexts; it describes itself as production ready ([introduction](https://grobid.readthedocs.io/en/latest/Introduction/)).
Its `segmentSentences` option splits paragraphs into sentence elements, and `teiCoordinates=s` adds a bounding box to each ([service documentation](https://grobid.readthedocs.io/en/latest/Grobid-service/)).
*How paperspec differs.*
TEI's `xml:id` is author-assigned and durable by recommendation ([TEI pointers chapter](https://tei-c.org/release/doc/tei-p5-doc/en/html/SA.html)); paperspec IDs are minted by a rule and retired by recorded successor.
GROBID's output is an automatic reading with the accuracy figures above, not a corrected, reviewed text ([introduction](https://grobid.readthedocs.io/en/latest/Introduction/)).
*Where they are the better choice.*
TEI for scholarly text encoding in general, and for apparatus-style correction markup inside a text.
GROBID as a PDF-to-structure converter for the reference and citation-context tasks it reports figures for.
*Interoperation.*
TEI from GROBID could be one reading of a PDF.
paperspec has no `tei` witness kind, so that reading would be recorded as `xml` ([spec/02 §2.3](../spec/02-model.md#23-witnessesjson)).
The mechanism for comparing that reading with another is sentence alignment, which pairs sentences, keeps the first reading's IDs for paired sentences, and turns every disagreement into a suspect for review ([spec/05 §5.6](../spec/05-hashes.md#56-alignment)).
No TEI or GROBID mapping is defined in the repository.
## W3C Web Annotation, selectors, and Hypothesis-style anchoring
*What it is.*
The Web Annotation Data Model is a W3C Recommendation of 23 February 2017, edited by Robert Sanderson, Paolo Ciccarese and Benjamin Young ([model](https://www.w3.org/TR/annotation-model/)); the Web Annotation Vocabulary has the same date ([vocabulary](https://www.w3.org/TR/annotation-vocab/)).
Hypothesis is an annotation tool whose 2013 blog post describes its anchoring; current client behavior was not verified ([post](https://web.hypothes.is/blog/fuzzy-anchoring/)).
*What it does well.*
An annotation has a body, a target and a motivation, and the vocabulary lists motivations such as commenting, describing, highlighting, linking and questioning ([vocabulary](https://www.w3.org/TR/annotation-vocab/)).
Targets are narrowed by selectors ([model](https://www.w3.org/TR/annotation-model/)):
- `TextQuoteSelector`: `exact` required, `prefix` and `suffix` recommended.
- `TextPositionSelector`: `start` and `end`, which the model calls "very brittle with regards to changes to the resource".
- `FragmentSelector`, `XPathSelector` and `RangeSelector`, and refinement of one selector by another.
- States (`TimeState`, `HttpRequestState`), which pin a representation of the whole resource.
Hypothesis stores a range selector (XPaths plus offsets), a position selector and a quote selector with 32 characters of context, and reattaches in four steps: range, position, context-first fuzzy match, then selector-only fuzzy match ([post](https://web.hypothes.is/blog/fuzzy-anchoring/)).
It identifies a PDF by an embedded fingerprint, which "persists across copies of the same document, but not across variants" ([Hypothesis help](https://web.hypothes.is/help/annotations-not-syncing-across-copies-of-a-pdf/)).
*How paperspec differs.*
Hypothesis's post lists its own limits: it assumes the system can tell two formats are the same document, mapping text to the DOM (the browser's tree of page elements) is slow on long documents, and mappings update only when Hypothesis itself changes the DOM ([post](https://web.hypothes.is/blog/fuzzy-anchoring/)).
paperspec defines exact resolution outcomes and a hash pin where Hypothesis uses fuzzy matching.
*Where they are the better choice.*
The Web Annotation model and vocabulary for annotation in general, existing Web Annotation tools, and Hypothesis as a working annotation service on web pages and PDFs.
*Interoperation.*
A paperspec layer is a set of W3C Web Annotations whose target lists a custom `AnchorSelector` carrying a `scienting-anchor/1` record, optionally followed by a standard `TextQuoteSelector` "for tools that do not know ours" ([spec/18 §18.3](../spec/18-layers.md#183-the-annotation)).
The layers do not use `TextPositionSelector` or `FragmentSelector`.
The JSON-LD context (a file that maps the added terms to IRIs (internationalized web identifiers), so linked-data tools can read them) is at `https://paperspec.scient.ing/context/scienting-1.jsonld` ([context/README.md](../context/README.md)); whether that address resolves was not checked.
Whether a generic Web Annotation client displays an `AnchorSelector` was not verified.
Both Hypothesis and paperspec store a quote with 32 characters of prefix and suffix ([spec/06 §6.2](../spec/06-anchors.md#62-the-anchor)).
## Docling, MinerU and Marker
*What they are.*
Docling is an open-source document conversion toolkit, MIT-licensed (the paper is an arXiv preprint: [paper, arXiv:2501.17887](https://arxiv.org/abs/2501.17887)); `docling-core` defines its data types ([repository](https://github.com/docling-project/docling-core)), and DoclingDocument is "a unified document representation introduced with Docling v2" ([documentation](https://docling-project.github.io/docling/concepts/docling_document/)).
MinerU converts PDFs and Office documents to Markdown or JSON, states that it is not a RAG (retrieval-augmented generation) framework, and uses a custom license based on Apache 2.0 with additional conditions ([MinerU](https://github.com/opendatalab/MinerU)).
Marker converts documents to Markdown, JSON, chunks and HTML; its code is Apache 2.0 and its model weights carry a modified AI Pubs Open Rail-M license ([Marker](https://github.com/datalab-to/marker)).
*What they do well.*
Docling's schema (version 1.10.0 on `main`) covers texts, pictures, tables, groups, furniture and pages; items carry a `self_ref` such as `#/texts/12`, `label`, `prov` (page, bounding box, `charspan`) and text; tables have cells with spans and header flags ([schema](https://raw.githubusercontent.com/docling-project/docling-core/main/docs/DoclingDocument.json)).
Docling uses AI models for layout analysis and table structure recognition and is reported integrated with LangChain, LlamaIndex and spaCy ([abstract](https://arxiv.org/abs/2501.17887)).
MinerU describes locators of the form `doc:{id}/tier:{tier}/page:{n}/block:{n}/char:{offset}` ([MinerU](https://github.com/opendatalab/MinerU)); Marker's JSON is a tree of blocks with an `id`, a `section_hierarchy` and `images` ([Marker](https://github.com/datalab-to/marker)).
*How paperspec differs.*
The Docling `TextItem` field list has no per-item hash and its `label` enum has no sentence value, so items are block-grained ([schema](https://raw.githubusercontent.com/docling-project/docling-core/main/docs/DoclingDocument.json)).
Identifiers in all three are positional: `self_ref` indexes into lists, Marker's example IDs embed a page number, and MinerU's locators embed page and block numbers.
MinerU's guide says to preserve locators for citation.
It "does not explain what makes them stable or guarantee that they won't change across reparses" ([MinerU](https://github.com/opendatalab/MinerU)).
Docling's `charspan` is a span within an item on a page.
It is not a pinned, quote-verified anchor with resolution outcomes.
*Where they are the better choice.*
For converting PDFs and other formats, layout analysis, table structure recognition, integrations, and one-shot structured output.
paperspec does not read PDFs; extracting lines from a PDF is outside its text ([spec/07 §7.1](../spec/07-geometry.md#71-page-fingerprints)).
*Interoperation.*
These are converters, which paperspec treats as backends.
A backend declaration records the tool's code and weight licenses, and a stage may run only if they pass the gate ([spec/14 §14.4](../spec/14-rights.md#144-backends-and-profiles)); `provenance.json` records the backends and cached readings used ([spec/12 §12.4](../spec/12-package.md#124-provenance)).
Docling appears in the repository only as data: an illustrative declaration, version `illustrative`, in `fixtures/records/backend-docling.json` and `vectors/rights.jsonl`.
Their JSON output is not a named witness kind.
Reconciling their readings with others uses alignment and suspects ([spec/05 §5.6 and §5.7](../spec/05-hashes.md#56-alignment)).
## S2ORC and CORD-19
*What they are.*
S2ORC, "The Semantic Scholar Open Research Corpus", is a corpus of 81.1 million English-language academic papers with structured full text for 8.1 million open-access papers, resolved bibliographic references and inline mentions of citations, figures and tables linked to paper records (Lo, Wang, Neumann, Kinney and Weld, ACL 2020, pp. 4969 to 4983, [ACL Anthology](https://aclanthology.org/2020.acl-main.447/)).
CORD-19, "The COVID-19 Open Research Dataset", was submitted April 22, 2020 as an arXiv preprint ([arXiv:2004.10706](https://arxiv.org/abs/2004.10706)).
S2ORC is now maintained by the Semantic Scholar API product team; the original files were refactored into datasets on the APIs, which need a key, and the original 2019 and 2020 releases "are no longer available for download" ([repository](https://github.com/allenai/s2orc)).
*What they do well.*
Scale, and citation-mention linking across papers: the paper, an arXiv preprint, reports 380.5 million resolved citation links, 156.5 million of them tied to inline mentions ([arXiv:1911.02782](https://arxiv.org/pdf/1911.02782)).
The schema classes include `Paper`, with `pdf_hash`, `metadata`, `body_text`, `bib_entries` and `ref_entries`, and `Paragraph`, with `cite_spans`, `ref_spans` and `eq_spans` given as `start`, `end` and `text` ([s2orc.py](https://raw.githubusercontent.com/allenai/s2orc-doc2json/master/doc2json/s2orc.py)).
Sources are PDF via GROBID, PMC JATS XML and arXiv LaTeX ([doc2json](https://github.com/allenai/s2orc-doc2json)).
*How paperspec differs.*
Table cells are not nodes ([s2orc.py](https://raw.githubusercontent.com/allenai/s2orc-doc2json/master/doc2json/s2orc.py)).
The paper states limitations, among them GROBID-derived inline-citation errors, linking that depends on titles, and LaTeX-derived metadata "worse than those extracted from PDF" ([arXiv:1911.02782](https://arxiv.org/pdf/1911.02782)).
The release formats "have changed over time" ([doc2json](https://github.com/allenai/s2orc-doc2json)).
*Where they are the better choice.*
Corpus-scale text mining and citation-graph work across the literature, which paperspec explicitly does not target.
*Interoperation.*
The purposes and scales differ.
S2ORC-style JSON could be a source of text readings. paperspec has no S2ORC witness kind.
The `same_as` list takes `doi:`, `arxiv:`, `isbn:`, `pmid:`, `pmcid:` and `url:` among its prefixes and has no Semantic Scholar identifier ([spec/02 §2.1](../spec/02-model.md#21-four-objects)).
## Nanopublications and micropublications
*What they are.*
A nanopublication is "a small knowledge graph snippet with metadata" in RDF ([nanopub.net](https://nanopub.net/)).
The guidelines describe four graphs (head, assertion, provenance, publication info), an identifier for each nanopublication, and trusty URIs as the recommended integrity mechanism ([guidelines](https://nanopub.net/guidelines/working_draft/)).
That page carries no version number, date or status.
Trusty URIs put cryptographic hash values in URIs so that resources can be verified and kept unchanged (an arXiv preprint: [Kuhn and Dumontier, arXiv:1401.5775](https://arxiv.org/abs/1401.5775)).
Micropublications are a semantic model for claims, evidence, arguments and annotations in biomedical communication ([Clark, Ciccarese and Goble, J Biomed Semantics 2014, 5:28](https://jbiomedsem.biomedcentral.com/articles/10.1186/2041-1480-5-28)).
*What they do well.*
A claim-sized unit with machine-readable provenance and publication metadata, with an integrity check on the unit.
Micropublications add a claim, its supporting representations as a directed acyclic graph rooted at the claim, and challenges; the paper says they aim to present primary evidence while nanopublications "model only the indicated statement" ([paper](https://jbiomedsem.biomedcentral.com/articles/10.1186/2041-1480-5-28)).
*How paperspec differs.*
These models do not store the paper's text.
The guidelines read do not describe pinning a passage, and they do not mention signatures; a Java library's README shows RSA public-key signing; the signature structure was not verified ([nanopub-java](https://github.com/Nanopublication/nanopub-java)).
*Where they are the better choice.*
Publishing a claim as a citable, hash-verifiable, linked-data object, and representing support and challenge among claims.
paperspec does not define claim semantics; a statement true independently of one paper belongs outside this repository, and a statement about reading the paper belongs in a layer ([spec/18 §18.1](../spec/18-layers.md#181-one-rule-decides-what-is-a-claim-and-what-is-a-layer)).
*Interoperation.*
A layer annotation can say that a span states, uses or disputes a claim kept elsewhere ([spec/18 §18.4](../spec/18-layers.md#184-bodies)).
A nanopublication's provenance could point at a paperspec address, since an address is a URL fragment (`…#node`, [spec/06 §6.1](../spec/06-anchors.md#61-addresses)); that is an inference, and no such mapping is defined in either project.
## Packaging: Frictionless Data Package, RO-Crate and BagIt
These three describe or protect a bundle of files.
*Frictionless Data Package.*
It is "a simple container format for describing a coherent collection of data in a single package"; the descriptor `datapackage.json` requires `resources`, and version 2 is labeled current ([datapackage.org](https://datapackage.org/standard/data-package/); the v1 page shows 2007 to 2017, [specs.frictionlessdata.io](https://specs.frictionlessdata.io/data-package/)).
A resource's `hash` is MD5 by default, with other algorithms written as `algorithm:value` ([data resource](https://datapackage.org/standard/data-resource/)).
It describes tabular files and their schemas portably.
Not seen: hashing that covers descriptor and files in canonical form, per-value anchors to a source text, units and uncertainty.
It remains the right choice for the tabular container and its tooling, which paperspec adopts: a `scienting-dataset/1` is a Data Package plus units (strings a unit parser called Pint can read), uncertainty and an `origin`, with reported values anchored to the table cells or sentences that print them ([spec/15](../spec/15-datasets.md)).
The Data Package version paperspec uses is not stated in spec/15.
The dataset format is `provisional` ([registry/formats.json](../registry/formats.json)).
*RO-Crate.*
It is "a community effort to establish a lightweight approach to packaging research data with their metadata", using schema.org annotations in JSON-LD ([RO-Crate](https://www.researchobject.org/ro-crate/)).
Version 1.2 is a Recommendation published 2025-06-04, and the site calls 1.3 the newest ([1.2](https://www.researchobject.org/ro-crate/specification/1.2/index.html)).
It describes a folder's contents in `ro-crate-metadata.json`, and file entities should include `contentSize` ([data entities](https://www.researchobject.org/ro-crate/specification/1.2/data-entities.html)).
Use it for general research-object description and discovery with schema.org vocabularies.
A paperspec package folder could be described by an RO-Crate.
No such mapping exists in either project.
*BagIt.*
RFC 8493 defines a bag: `bagit.txt`, a `data/` payload of opaque octet streams, and at least one `manifest-<algorithm>.txt`; BagIt 1.0 tools must support SHA-256 and SHA-512 ([RFC 8493](https://www.rfc-editor.org/rfc/rfc8493)).
The RFC says it "is not designed to be secure against active attacks", and it has no signatures, content-level structure or payload semantics.
BagIt fits fixity and transfer of arbitrary payloads, archives and repositories.
paperspec's `MANIFEST.json` plays a similar fixity role, with a path, SHA-256 and size per file, and the hash of the manifest pins the package; the file layout differs ([spec/12 §12.3](../spec/12-package.md#123-the-manifest)).
A package could be a bag's payload, since payload files are opaque (an inference).
## Metadata: schema.org, Crossref and DataCite
*What they are.*
`ScholarlyArticle` is a schema.org type under Thing, CreativeWork and Article ([schema.org](https://schema.org/ScholarlyArticle)); release 30.1 is listed as 2026-09-16 ([releases](https://schema.org/docs/releases.html)).
Crossref's deposit schema is at 5.5.0, the version Crossref recommends ([schema library](https://www.crossref.org/documentation/schema-library/)).
DataCite Metadata Schema 4.7 was released 3 March 2026 and defines "core metadata properties chosen for an accurate and consistent identification of a resource" ([DataCite](https://schema.datacite.org/)).
*What they do well.*
Bibliographic and identification metadata.
schema.org's `CreativeWork` has `text`, `citation`, `hasPart`, `version`, `license` and a `correction` property ([CreativeWork](https://schema.org/CreativeWork)), and `MediaObject` has `sha256` ([MediaObject](https://schema.org/MediaObject)).
Crossref's Crossmark lets publishers show whether an item was corrected, retracted or updated, including to readers holding an older download ([Crossmark](https://www.crossref.org/documentation/crossmark/)).
*How paperspec differs.*
These are record-level.
A correction is flagged on the work, not on a sentence with evidence for each changed digit; the body has no node hashes; there are no fidelity levels or signed receipts; and rights are license-level information about the work, not per-file use grants with an AI purpose and processor.
None of the schema pages read describes body text, and the extent of Crossref's license and text-mining fields was not verified ([Crossref 5.4.0](https://www.crossref.org/documentation/schema-library/metadata-deposit-schema-5-4-0/)).
*Where they are the better choice.*
Identifying and describing works and datasets with DOIs (digital object identifiers), discovery, registering corrections and retractions at the work level, and structured data on web pages.
paperspec is not a citation index and imports from Crossref, OpenAlex, PubMed Central and arXiv and never depends on them ([docs/overview.md](../docs/overview.md#what-it-is-not)).
*Interoperation.*
The document's `meta` is a CSL-JSON item and `same_as` holds a DOI.
For open-access papers a producer sets `license` and a provisional rights basis from Crossref, and Crossref's license field is a named kind of evidence in a rights record ([spec/14 §14.1](../spec/14-rights.md#141-the-rights-record)).
No mapping from `meta` to Crossref, DataCite or schema.org is defined.
## Building blocks: PROV-O, RFC 8785, RFC 6962 and RFC 9162
*PROV-O.*
It is a W3C Recommendation of 30 April 2013 that expresses the PROV Data Model in OWL2, with the classes Entity, Activity and Agent and properties such as `wasGeneratedBy`, `wasDerivedFrom` and `wasInvalidatedBy` ([PROV-O Recommendation](https://www.w3.org/TR/prov-o/)).
It is a general vocabulary and defines no node hashes, anchor resolution, corrections or receipts.
paperspec does not use it: provenance is a file, `provenance.json`, defined in the repository ([spec/12 §12.4](../spec/12-package.md#124-provenance)).
PROV-O is the better choice for linked-data provenance that other systems can query generically.
A mapping of stages and corrections to Activity and Entity is possible.
Nothing in either project defines one.
*RFC 8785 (JSON Canonicalization Scheme).*
Published June 2020 as an Informational RFC, it sorts object properties recursively in UTF-16 code unit order, keeps array order, writes numbers by ECMAScript rules, uses no whitespace, outputs UTF-8, and does not normalize Unicode strings ([RFC 8785](https://www.rfc-editor.org/rfc/rfc8785)).
It is a building block that defines no document model, and paperspec uses it: every hash of JSON is over RFC 8785 output.
paperspec adds rules on top: a decimal that carries meaning is a string, so `310.0` and `1.5260` keep their printed digits, and a document with a lone surrogate, `NaN` or an infinity has no canonical form and is invalid ([spec/01 §1.1 and §1.2](../spec/01-conventions.md#11-canonical-json)).
*RFC 6962 and RFC 9162 (Merkle trees).*
A Merkle tree hashes items pairwise up to one root, so one short value commits to all of them.
RFC 6962 (Certificate Transparency, June 2013, Experimental) is obsolete; RFC 9162 (Certificate Transparency Version 2.0, published December 9, 2021, Experimental) "obsoletes RFC 6962" ([RFC 6962](https://www.rfc-editor.org/rfc/rfc6962), [RFC 9162](https://www.rfc-editor.org/rfc/rfc9162)).
Both give the same Merkle Tree Hash: a leaf is `HASH(0x00 || d)`, an interior node is `HASH(0x01 || left || right)`, and a list splits at the largest power of two smaller than n.
paperspec's receipts use this construction with SHA-256 and cite RFC 6962 ([spec/08 §8.5](../spec/08-fidelity.md#85-merkle-roots)).
They differ in one rule: a receipt with no items is invalid in paperspec, while the RFC defines the hash of an empty list.
The citation is to the obsolete RFC; the tree it defines is the one RFC 9162 also defines.
paperspec's `node_hash` is not this construction (see "Limits and status" below).
## Content addressing: IPFS CIDs and SWHIDs
*IPFS CID.*
A content identifier is derived from the content's hash, and "any difference in the content will produce a different CID"; a CID holds the hash and the codec, with sha-256 as the default hash ([IPFS docs](https://docs.ipfs.tech/concepts/content-addressing/)).
It gives verifiable, location-independent identity to immutable data.
A CID covers the root block of a DAG (directed acyclic graph), "not a direct hash of the file's bytes", so chunk size, layout, codec, version and hash all change the CID for the same file.
Identity and content are the same thing, so an edit makes a new identifier; the page describes no ID that survives edits, no sentence granularity, corrections or fidelity.
Keep using CIDs for storage and distribution of immutable blobs.
paperspec's asset store names files by SHA-256, not CID ([spec/12 §12.6](../spec/12-package.md#126-assets)).
*Software Heritage SWHID.*
ISO/IEC 18670:2025 specifies the SoftWare Hash IDentifier, version 1.2, published April 2025 ([ISO catalog page](https://www.iso.org/standard/89985.html); [swhid.org](https://www.swhid.org/specification/v1.2/)).
Core identifiers have the form `swh:1:<tag>:<hash>` for contents, directories, revisions, releases and snapshots, each SHA-1 over a typed header and a serialized form, and "intrinsic": computed from the object's content and relevant metadata, not its location ([core identifiers](https://www.swhid.org/specification/v1.2/5.Core_identifiers/)).
The qualified-identifier clause was not read.
Keep using SWHIDs for persistent, content-derived identification and archiving of source code.
*The contrast.*
A CID or SWHID is a function of content at all times.
A paperspec node ID is derived from content once, at minting, and then frozen; the content hashes live separately in `node_hash`, so the pair of ID and hash tells whether the text has changed ([spec/04 §4.2 and §4.3](../spec/04-identity.md#42-minting-node-ids), [spec/05 §5.1](../spec/05-hashes.md#51-the-five-values)).
paperspec's hashes are SHA-256 ([spec/01 §1.3](../spec/01-conventions.md#13-hashes)).
The cost of the choice: because the ID is minted from the text hash, two independent conversions that read a sentence differently by one character mint different IDs for it.
## Fragment identifiers and Pandoc
A fragment identifier is the part of a URL after `#` that says where to look inside the resource.
- **PDF fragments (RFC 8118):** Informational, March 2017.
Parameters include `page`, `nameddest`, `structelem`, `zoom`, `viewrect`, `highlight` and `search`; none selects text by character offset, `search` "selects the first matching word in the document", and `highlight` takes rectangle coordinates ([RFC 8118](https://www.rfc-editor.org/rfc/rfc8118)).
Keep using it to open a PDF at a page, destination or region. paperspec's `locations.jsonl` stores per-node page boxes as `[x0, y0, x1, y1]` in PDF points against page fingerprints ([spec/07 §7.4](../spec/07-geometry.md#74-locationsjsonl)), so a tool could build an RFC 8118 link; the repository does not define that.
- **Media Fragments URI 1.0:** A W3C Recommendation of 25 September 2012 that defines time (`t=`) and spatial (`xywh=`) fragments for audio, video and images, and says nothing about text ([Media Fragments](https://www.w3.org/TR/media-frags/)).
It is a weak fit for text passages.
- **RFC 5147 (text/plain):** A Proposed Standard of April 2008 with `char=` and `line=` positions counted from zero and integrity checks `length=` and `md5=`, "to detect whether the resource has changed" ([RFC 5147](https://www.rfc-editor.org/rfc/rfc5147)).
It is the closest older precedent to a position-plus-integrity address; it uses MD5 only and applies to plain text, not to paper structure.
- **Text Fragments:** A WICG Draft Community Group Report, not a W3C standard; the version read is dated 13 December 2023 and may not be the latest.
The syntax is `#:~:text=[prefix-,]start[,end][,-suffix]`, it matches the first exact occurrence, and it is restricted to top-level navigations ([WICG draft report](https://wicg.github.io/scroll-to-text-fragment/)).
- **DOM and XPath approaches:** W3C `XPathSelector` and `RangeSelector` ([model](https://www.w3.org/TR/annotation-model/)), TEI's `xpath()` scheme ([TEI pointers chapter](https://tei-c.org/release/doc/tei-p5-doc/en/html/SA.html)) and Hypothesis's first strategy, which "fails if the XPath expressions can no longer be applied" ([post](https://web.hypothes.is/blog/fuzzy-anchoring/)).
Path addressing breaks when structure changes; paperspec's display paths are never stored or cited ([spec/04 §4.3](../spec/04-identity.md#43-permanence-retirement-and-aliases)).
- **Pandoc:** The pandoc-types library defines the `Pandoc` document type with modules for building, walking and JSON conversion; the latest on Hackage is 1.23.1, uploaded 2023-08-06 ([Hackage](https://hackage.haskell.org/package/pandoc-types)).
Its Block and Inline types and its treatment of identifiers were not verified. `latex` is a paperspec witness kind ([spec/02 §2.3](../spec/02-model.md#23-witnessesjson)); Pandoc is not mentioned in the repository.
On the web, a paperspec node ID is the URL fragment, so `…#k3m9q2a` lands on the sentence ([spec/06 §6.1](../spec/06-anchors.md#61-addresses)).
This is a plain HTML fragment, not a registered fragment scheme; the chapters define no fragment syntax for the package media type.
## BioC, CSL-JSON and EPUB 3
*BioC.*
BioC is a simple extensible XML format for sharing text documents and annotations between natural-language-processing and text-mining tools, with code to read and write it ([BioC paper](https://pmc.ncbi.nlm.nih.gov/articles/PMC3889917); [bioc.sourceforge.net](https://bioc.sourceforge.net/)).
Its model has collection, source, document, passage, optional sentence, annotation and relation, with `infon` key-value pairs, and an annotation's location is an offset and length relative to the whole document.
Its authors state that it "targets tool developers and not end users" and "focuses on text data rather than other media".
Keep using it to exchange text-mining annotations among biomedical natural-language-processing (NLP) tools.
Offsets would need conversion, since paperspec counts Unicode code points ([spec/01 §1.5](../spec/01-conventions.md#15-character-offsets)) and the length unit in BioC was taken from a page summary and not confirmed.
No BioC mapping is defined.
*CSL-JSON.*
It is a JSON format for bibliographic items consumed by Citation Style Language (CSL) processors; items require `id` and `type`, `author` is an array of name objects, and `issued` uses `date-parts` or `raw` ([markup page of the CSL-JSON documentation](https://citeproc-js.readthedocs.io/en/latest/csl-json/markup.html)).
Its schema is described as "not yet fully normative" ([CSL schema](https://github.com/citation-style-language/schema)).
Keep using it for bibliographic interchange with citation processors and reference managers.
paperspec embeds CSL-JSON as the document's `meta` and as the optional parsed `csl` of each reference ([spec/02 §2.2](../spec/02-model.md#22-documentjson), [spec/10](../spec/10-references.md)).
*EPUB 3.*
EPUB 3.3 is a W3C Recommendation, "a distribution and interchange format for digital publications and documents": a ZIP container with a package document listing a manifest and a spine, and XHTML or SVG content documents ([EPUB 3.3](https://www.w3.org/TR/epub-33/)).
It suits reflowable publications.
Keep using it as a reading and distribution format.
`epub` is a paperspec witness kind ([spec/02 §2.3](../spec/02-model.md#23-witnessesjson)), and the zip package rules (UTF-8 names, one top-level folder, no symlinks) are the package's own ([spec/12 §12.2](../spec/12-package.md#122-paths)).
## Limits and status
*Status.*
The specification is version 0.1.0.
`registry/formats.json` lists 32 formats: 19 are `candidate` (complete, with vectors and fixtures, ready to implement) and 13 are `provisional` (complete; expected to change as implementations gain experience): project, bundle, dataset, digitization, view, snapshot, draft-ids, exercise, submission, grade, checklist, log-entry and checkpoint ([spec/00 §0.4](../spec/00-introduction.md#04-status)).
The repository holds 24 chapters, 42 JSON Schemas, 25 vector files, five valid fixture packages, one of them also zipped, and 31 invalid ones, each naming the rule it breaks, and a reference checker, `tools/check.py`.
Licenses: prose CC BY 4.0; schemas, SQL, the JSON-LD context, registries, vectors and fixtures CC0 1.0; tools Apache-2.0 ([README.md](../README.md#licenses)).
*No adoption claim.*
The repository names no outside adopter and no independent implementation, and this page claims none.
*Scope of this comparison.*
The pages read cover no ORKG, DocBook, PubAnnotation, OpenAlex or PMC OA XML material, so those are not compared.
A statement that no single comparator combines paperspec's features describes the pages read and surveys no other systems.
*What paperspec does not do.*
- It is not a publisher interchange format; it ingests JATS and other formats as witnesses and does not replace them ([spec/02 §2.3](../spec/02-model.md#23-witnessesjson)).
- It is not a search engine, a citation index, a recommendation feed or a chat-with-a-PDF tool ([docs/overview.md](../docs/overview.md#what-it-is-not)).
Search is a per-bundle SQLite FTS5 index (the bundle format is `provisional`), which is the extent of its search ([spec/13 §13.5](../spec/13-database.md#135-the-bundle)).
- It does not define claim semantics ([spec/18 §18.1](../spec/18-layers.md#181-one-rule-decides-what-is-a-claim-and-what-is-a-layer)).
- It does not model glyph-level PDF layout beyond per-node boxes; extracting lines from a PDF is outside its text ([spec/07 §7.1](../spec/07-geometry.md#71-page-fingerprints)).
- It compares complex math by source only; comparing canonical MathML is a possible later addition ([spec/05 §5.3](../spec/05-hashes.md#53-the-strict-projection), [docs/rationale.md](../docs/rationale.md#questions-the-formats-leave-open)).
- It is built for hundreds of documents, not hundreds of millions, and it does not fix what a converter reads wrongly; it records the error and makes it checkable.
*Where the repository's guides are looser than the specification.*
The specification governs.
These are the places where the guides and the specification differ, and this page uses the corrected statements.
1. **Reconversion:** `README.md` says an address "survives reconversion with a better tool".
The specification says a fresh conversion of the same input mints the same IDs ([spec/04 §4.2](../spec/04-identity.md#42-minting-node-ids)).
With a different converter, sentences the alignment pairs keep their IDs and every difference becomes a suspect ([spec/05 §5.6](../spec/05-hashes.md#56-alignment); [docs/faq.md](../docs/faq.md)).
IDs survive a better converter only for paired sentences.
2. **"Merkle":** The guides and spec/05 §5.1 call the root `node_hash` a Merkle root.
A `node_hash` is a hash of the canonical JSON of `{"own": own_hash, "children": [...]}`.
Only receipts follow the RFC 6962 construction ([spec/08 §8.5](../spec/08-fidelity.md#85-merkle-roots)).
The two constructions are not the same.
3. **"Opaque" IDs:** Calling IDs meaningless or random is loose.
An ID is minted by the rule given above, so it is neither meaningless nor random.
4. **Five hashes everywhere:** `docs/overview.md` lists the things that get "a permanent ID and five content hashes" without naming them.
Table columns and figure-text items have IDs, are not nodes, and carry no five hashes ([spec/04 §4.2](../spec/04-identity.md#42-minting-node-ids), [spec/09 §9.1](../spec/09-figures-tables-equations.md#91-figures-and-panels)).
5. **Dataset digits:** spec/15 says values keep their printed digits, and in JSON they are strings.
The fixture descriptor `fixtures/packages/hale2026harmonic-damb/datasets/ds-hale-bond-params/datapackage.json` types the field `k_r` as `number`.
How Frictionless tools treat that was not verified, so take care when comparing with Frictionless Table Schema.
6. **Package tree:** `docs/concepts.md` omits `suspects.jsonl` from its package tree, and [spec/12 §12.1](../spec/12-package.md#121-files) lists it.
7. **RFC 6962 is obsolete:** spec/08 §8.5 cites it; RFC 9162 obsoletes it (see above).
8. **Status:** The guides describe the formats as one set.
Of the 32 formats, 13 are `provisional`, including `scienting-dataset/1`, which the datasets paragraphs in `docs/concepts.md` present without that qualifier.
*The distinguishing combination, and what it costs.*
paperspec puts in one package permanent sentence- and cell-level IDs, five hashes per node, anchors with explicit resolution outcomes and drift, append-only evidence-gated corrections, signed fidelity receipts with spot-check bounds, per-witness rights with AI-use axes, and value-to-cell anchors.
Individual pieces have precedents in the comparators: TEI correction markup, Web Annotation selectors, RFC 5147 integrity checks, RFC 6962 Merkle trees, BagIt manifests and Frictionless packaging.
No single comparator in the pages read combines them.
The price is weight: five hashes per node, a gate on corrections, signed records and a custom selector type.
The design target is a team's few dozen to few hundred papers; the weight is out of proportion for publisher exchange or corpus-scale mining.
+448
View File
@@ -0,0 +1,448 @@
# Concepts
Each section introduces one idea, shows it in the example paper `hale2026harmonic-damb` (a synthetic chemistry paper in [fixtures/packages/](../fixtures/packages/)), and links to the chapter that defines it exactly.
This page is written for three readers.
A newcomer, such as a student who knows what a paper and a citation are and is new to hashes, JSON and annotation standards, gets each term defined where it first appears, with the reason before the rule.
An implementer, who will write a reader, writer, converter or checker, gets the chapter that defines each behavior, the test vector file that pins it, and the traps.
An expert, such as a researcher, standards author or reviewer who knows the neighboring standards, gets the limits and the status of each format, and a short note wherever a close relative exists elsewhere.
The longer comparisons are on [the comparison page](comparison.md).
For a gentler start, read the [overview](overview.md) first; for the exact rules, use the [specification](../spec/README.md).
Two facts apply to everything below.
The specification is at version 0.1.0.
It defines 32 formats, 19 of them `candidate` and 13 `provisional`, as [registry/formats.json](../registry/formats.json) lists.
The provisional ones are the project, bundle, dataset, digitization, view, snapshot, draft-ids, exercise, submission, grade, checklist, log-entry and checkpoint formats; the sections below say so where they describe them.
Format identifiers such as `scienting-anchor/1` and `scienting-correction/1` begin with `scienting-`, which is the formats' namespace.
The repository's name, paperspec, is a separate matter, and the formats are named after what they hold.
The repository is at <https://git.scient.ing/infra/paperspec>.
## Hashes and canonical JSON
Two tools appear in almost every section.
A *hash* is a short fingerprint computed from data.
This specification uses SHA-256, which turns any sequence of bytes into 64 hexadecimal digits.
The same bytes always give the same digits, and changing one character gives unrelated digits.
Comparing two fingerprints tells you whether two texts are identical without comparing the texts.
The fingerprint cannot be turned back into the text.
The SHA-256 of the cell text `310.0` in the example begins `b478fd…`.
Hashes are written as 64 lowercase hexadecimal digits; six digits are used only for display and for pins in addresses ([chapter 1.3](../spec/01-conventions.md#13-hashes)).
*JSON* is a plain-text format for structured data: objects with named members, lists, strings and numbers.
The same JSON data can be written in many ways (members in any order, spaces anywhere), and a hash of each way would differ. **Canonical JSON** fixes one way, so that every writer produces the same bytes and a hash of the data means the same thing everywhere.
The specification uses the JSON Canonicalization Scheme of [RFC 8785](https://www.rfc-editor.org/rfc/rfc8785): no whitespace, members sorted by name, and numbers written as ECMAScript writes them.
Strings are not Unicode-normalized, and a document containing a lone surrogate, `NaN` or an infinity has no canonical form and is invalid.
The specification adds one rule on top: a decimal that carries meaning is written as a string, so that `310.0` and `1.5260` keep their printed digits.
Every hash of a JSON value here is a hash of its canonical JSON encoded as UTF-8.
RFC 8785 is a building block and says nothing about what to put in the JSON. This specification adopts it for the canonical form and adds the decimal and invalid-value rules above ([chapter 1.1](../spec/01-conventions.md#11-canonical-json), [1.2](../spec/01-conventions.md#12-numbers), [1.9](../spec/01-conventions.md#19-files)).
Pinned by [vectors/canonical-json.jsonl](../vectors/canonical-json.jsonl).
A trap for implementers: the vectors parse every number as an IEEE 754 double, and sort member names as UTF-16 code units, not as bytes.
## Works, versions, witnesses and documents
Work, version, witness and document are easy to confuse, so the formats keep them apart.
| Object | In the example |
| --- | --- |
| A work is the paper across all its versions. | Hale and Osei's paper on harmonic bond parameters, `doi:10.5555/example.hale.2026`. |
| A version is one expression of it: a preprint, the version of record, an erratum, the Supporting Information. | The version of record. |
| A witness is one file of a version, identified by its SHA-256. | The publisher's PDF, witness `qptsanv`. |
| A document is the text established for one version, from one or more witnesses. | `hale2026harmonic-damb`. |
A document's key is its work's key, with a suffix for anything other than the version of record: `hale2026harmonic-damb.si` would be its Supporting Information.
A witness can be a PDF, a JATS file, a LaTeX archive, an HTML page, an EPUB, a Typst project, other XML, an image, or another file; these are the values of its `kind`.
See [chapter 2](../spec/02-model.md).
## Keys
A work key is a work's permanent name, built so that a reader can say it and so that it never collides.
It is a Scholar-style citation key (first author, year, first title word), a hyphen, and four characters of a hash of the work's identity, which is its DOI when it has one:
```text
hale2026harmonic-damb
```
Two works that a citation key alone would name alike, a preprint and its published version, say, get different hashes.
A key is minted once, when the work enters a store, and never recomputed, so a corrected title changes nothing anyone has cited; if two works share four characters, the later one gets six.
A document key adds a suffix for a version other than the version of record: `hale2026harmonic-damb.si` would be the paper's Supporting Information.
See [spec/02 §2.4](../spec/02-model.md#24-work-and-document-keys); `keys.jsonl` pins the cases.
## A document is a tree of nodes
Every part of the text is a node: the document, its sections, headings, paragraphs and sentences, figures and their panels and captions, tables with their rows and cells, equations, footnotes and references.
The example has 75 nodes, 45 of them leaves (nodes that hold text themselves).
This outline shows its two sections and the equation, figure and table in them:
```text
p36k8t6 1 Introduction
tkxsmts equation (1)
d400rz3 2 Methods
v7cx6qs figure Figure 1
hj4s7pb table Table 1
```
`nodes.jsonl` holds one node per line, in document order: the root first, then each node before its children.
Each line has the node's kind, parent, position among its siblings, content and hashes.
A sentence's content is a list of *runs*: plain text, styled text, inline math, citations, cross-references, footnote marks, links, and display equations the sentence runs through.
This is one table cell, shortened:
```json
{"id":"c20cna6","kind":"cell","parent":"g8d2pjb","ord":1,
"attrs":{"column":"…","role":"data","rowspan":1,"colspan":1},
"content":[{"kind":"text","text":"310.0"}],
"fidelity":"F1","text_hash":"…","match_hash":"…","align_key":"…","own_hash":"…","node_hash":"21f13b…"}
```
Page breaks, running heads and columns are not nodes; they are geometry ([chapter 7](../spec/07-geometry.md)).
See [chapter 3](../spec/03-nodes.md).
Close relatives: [JATS 1.4](https://www.niso.org/publications/z3996-2024-jats) is an XML format in which publishers and archives exchange journal content, and TEI is a set of guidelines for encoding scholarly text.
Each is the better choice for its own job, and the paperspec formats do not replace them; a JATS file can be one witness of a document.
The element list in the [JATS 1.4 archiving tag library](https://jats.nlm.nih.gov/archiving/tag-library/1.4/) shows sections, paragraphs, table wrappers and cells and has no sentence element, while [TEI has an `<s>` element](https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-s.html).
Here the sentence is the unit that gets an ID and hashes.
See [the comparison page](comparison.md).
## IDs are names, not positions
`c20cna6` says nothing about where the cell is.
That is deliberate.
An ID that encoded a page or an ordinal would change when a better converter ordered blocks differently, and one that encoded a kind would change when a paragraph turned out to be a caption.
So an ID encodes no page, ordinal or kind.
It is seven characters, the first a letter, so it is valid as an HTML `id`, a CSS selector and a URL fragment.
An ID is minted once, from a hash of the document key, the node's kind, the hash of its text and an occurrence count (the number of earlier nodes with the same kind and text, so that repeated sentences get different IDs).
Then it is frozen: it is never recomputed, reassigned or reused.
A fresh conversion of the same input mints the same IDs.
A different converter is not guaranteed to, because two readings that differ by one character would mint different IDs for that sentence.
A second reading is aligned with the document sentence by sentence.
Sentences the alignment pairs keep the document's IDs, and every difference becomes a suspect, a recorded doubtful reading that a person resolves ([chapter 5.6](../spec/05-hashes.md#56-alignment) and [5.7](../spec/05-hashes.md#57-suspects)).
One ID is retired and points at its successor when two nodes merge; an artifact's ID is retired with no successor when the artifact is deleted.
Legacy IDs, such as a block ID from an earlier numbering scheme, live on as aliases: in the example, `b-p01-text-003` still leads to sentence `hca6dc5`.
Both the retirements and the aliases are recorded in `ids.jsonl`.
Not every addressable thing is a node.
The columns of a table and the text items found inside a figure panel get IDs by the same rule and carry no node hashes, so they do not have the five hashes described below.
In the example, Table 1's second column has the ID `wdtrcqt`, and the axis label "r (Å)" in Figure 1's first panel has the ID `rtxzjj9`.
Pinned by [vectors/ids.jsonl](../vectors/ids.jsonl).
See [chapter 4](../spec/04-identity.md).
Close relative: in TEI, `xml:id` is assigned by the author, and the Guidelines recommend it ["For durability in the presence of editing"](https://tei-c.org/release/doc/tei-p5-doc/en/html/SA.html); JATS has an [`id` attribute](https://jats.nlm.nih.gov/archiving/tag-library/1.4/attribute/id.html).
TEI's recommendation gives no rule for minting an ID from content or for retiring one with a successor.
For a text a person edits by hand, an author-assigned `xml:id` is the simpler tool.
See [the comparison page](comparison.md).
## Addresses
An address names a node, and optionally pins it to a state and narrows it to a span:
| Address | Names |
| --- | --- |
| `hale2026harmonic-damb#hca6dc5` | The sentence about water, whatever it says now. |
| `hale2026harmonic-damb#hca6dc5@cd6cdb` | That sentence as it read when its `node_hash` began `cd6cdb`. |
| `hale2026harmonic-damb#hca6dc5@cd6cdb[29:44]` | Code points 29 to 44 of it in that state: "first test case". |
| `smithlab/hale2026harmonic-damb#hca6dc5` | The same sentence in the `smithlab` store. |
The offsets count Unicode code points in the node's plain projection, which is its text as stored with math written between dollar signs.
The dollar signs count, which is why the span starts at 29: the sentence reads `Water, H$_2$O, served as the first test case, …`.
On the web the ID is the fragment, so a link to `…/smithlab/hale2026harmonic-damb#hca6dc5` lands on the sentence.
Pinned by [vectors/addresses.jsonl](../vectors/addresses.jsonl).
See [chapter 6](../spec/06-anchors.md#61-addresses).
## Five hashes, five jobs
Every node carries five content values.
Table columns and figure-text items, from the previous section, do not.
| Value | Covers | Answers |
| --- | --- | --- |
| `text_hash` | The text exactly, normalized. | Is this the same quotation, character for character? |
| `match_hash` | The text with notation folded to one form. | Do two witnesses really agree? |
| `align_key` | The text folded loosely. | Is this probably the same sentence? |
| `own_hash` | The node's own content, without its children. | Has this section itself changed, as opposed to something inside it? |
| `node_hash` | The node and everything below it. | Has anything here changed at all? |
"Normalized" means Unicode normalization form C, runs of whitespace collapsed to one space, and leading and trailing space removed ([chapter 1.4](../spec/01-conventions.md#14-text-normalization-for-hashing)). `own_hash` is a hash of the canonical JSON of the node's own content, such as its runs or its label. `node_hash` is a hash of the canonical JSON of `{"own": own_hash, "children": [each child's node_hash, in order]}`.
Each `node_hash` covers its children's, so a correction to one sentence changes that sentence's values and the `node_hash` of each ancestor, and nothing else.
This design is the idea of a Merkle tree, a tree in which each hash covers the hashes below it.
It is not the RFC 6962 construction that receipts use (see Receipts and spot-checks).
The middle two exist because one hash cannot do both of their jobs.
Chemistry writes the same thing many ways, and every one of these sentences has the same `match_hash`:
| As stored | Strict projection |
| --- | --- |
| `The solvent is $H_2O$.` | `The solvent is H_{2}O.` |
| `The solvent is H$_2$O.` | `The solvent is H_{2}O.` |
| `The solvent is H` and a subscript `2`, then `O.` | `The solvent is H_{2}O.` |
| `The solvent is H₂O.` | `The solvent is H_{2}O.` |
| `The solvent is $H_2 O$.` in Typst | `The solvent is H_{2}O.` |
(The vectors also include a sixth spelling, `$\mathrm{H}_{2}\mathrm{O}$`, with the same `match_hash`.)
OCR often drops a superscript, and "103" must never be certified as agreeing with 10³. So "A rate of 103 per second." and "A rate of 10³ per second." share an `align_key`, which proposes that they are the same sentence, while their `match_hash` values differ, which raises a suspect of kind `number` for a person to resolve.
The same care keeps "The energy" followed by citation 3 from matching the text "The energy3".
The cost is that notation too complex to fold, such as a fraction, is compared by its source text alone, so two spellings of one complex formula do not match ([chapter 5.3](../spec/05-hashes.md#53-the-strict-projection)).
Pinned by [vectors/projections.jsonl](../vectors/projections.jsonl), [vectors/projection-groups.jsonl](../vectors/projection-groups.jsonl) and [vectors/hashes.jsonl](../vectors/hashes.jsonl).
See [chapter 5](../spec/05-hashes.md).
## Corrections
A document is never edited in place.
Every fix is a correction: an operation with its evidence, its author and a reason, appended to `corrections.jsonl`.
```json
{"format":"scienting-correction/1","index":1,"op":"replace","target":"c20cna6",
"find":"3l0.0","replace":"310.0",
"evidence":[{"kind":"crop","sha256":"9b6fe6…"}],"author":{"key":"ana"},
"reason":"OCR read the digit 1 as the letter l.","at":"2026-10-02T10:00:00Z",
"before":"2fd1e9…","after":"21f13b…","touched":["c20cna6"]}
```
A document's history is its first reading plus its corrections, and its revision is the index of the last one.
The operations are `replace`, `insert`, `delete`, `split`, `merge`, `move`, `reclassify`, `relabel` and `set`.
Evidence is a crop (an image of the page region), a witness, a source file by SHA-256, or a named person.
A gate refuses any correction that would change a digit without a crop of the page as evidence, or that would let a digit change anywhere it did not declare.
The same gate also refuses an `insert` without a crop and a `find` that does not occur exactly once.
Digits are the characters of Unicode category Nd.
Pinned by [vectors/corrections.jsonl](../vectors/corrections.jsonl), which applies each operation and each refusal to a small document.
See [chapter 11](../spec/11-corrections.md).
## Anchors
Corrections change nodes and their hashes, so a note that points at a node has to survive them.
An anchor is how anything points into a document: a quotation that must match the paper word for word, an annotation, a dataset value, a draft's citation.
It is a pinned address with enough context to find its text again after the document changes:
```json
{"format":"scienting-anchor/1","store":"smithlab","doc":"hale2026harmonic-damb","node":"hca6dc5","kind":"sentence",
"own_hash":"d5b2eb…","node_hash":"cd6cdb…","span":[29,44],
"quote":{"exact":"first test case","prefix":"Water, H$_2$O, served as the ","suffix":", with a bending band near 1595 "},
"rev":12}
```
`rev` is the document's revision when the anchor was made.
It counts corrections, not clock time, because anchors are made on different machines and clocks disagree.
The `prefix` and `suffix` are up to 32 code points of context on each side of the quote.
An anchor resolves one of five ways when the document changes.
Resolution first follows the ID table (aliases and successors), then looks for the quote, using the prefix and suffix to choose among repeats, then judges by the kind of node:
| Result | Means | In the example |
| --- | --- | --- |
| `current` | Nothing it points at has changed. | A note on the water sentence. |
| `changed-below` | A container is unchanged in itself while something inside it changed; a drift figure says how much. | A note on Table 1 after rows were replaced and added. |
| `moved` | Its node was merged into another that still holds the quote. | A note on "least squares" in half of a sentence that was split at a line break, then rejoined. |
| `reattached` | Its node changed and the quote is still there exactly once, so it is re-pinned. | A note on "treated as zero" in a sentence whose superscript was fixed. |
| `stale` | It can no longer be trusted; a person must re-anchor it. | A note on the cell that read "3l0.0" before it was corrected to "310.0". |
Drift is the share of the leaves below a container that corrections have touched since the anchor's revision; the default threshold for "high" is one quarter ([chapter 6.6](../spec/06-anchors.md#66-drift)).
Pinned by [vectors/resolve.jsonl](../vectors/resolve.jsonl), which resolves 17 anchors against the example.
See [chapter 6](../spec/06-anchors.md); the [walkthrough](walkthrough.md#5-what-happened-to-the-notes) shows all five.
Close relative: the W3C Web Annotation Data Model defines selectors, including a [`TextQuoteSelector`](https://www.w3.org/TR/annotation-model/) (exact text with optional prefix and suffix) and a `TextPositionSelector` that the same document calls very brittle when the resource changes.
Its remedy for change is a state that pins a representation of the whole resource.
An anchor adds a node ID, two hash pins and the five defined outcomes.
The [Hypothesis anchoring approach](https://web.hypothes.is/blog/fuzzy-anchoring/) also stores a quote with 32 characters of context, and reattaches by fuzzy matching where this specification defines exact outcomes.
For annotation in general, the W3C model and its existing clients are the better choice; the Layers section below uses it directly.
See [the comparison page](comparison.md).
## Fidelity
Every leaf has a level that says how far its text was checked.
| Level | Means |
| --- | --- |
| F0 converted | One reading, not corroborated. |
| F1 resolved | Every doubt about it was answered against the page image. |
| F2 corroborated | An independent witness agrees exactly, or the text was born digital. |
| F3 proofread | A named person compared it with the page and signed for its current text. |
A level counts only at the node's current hash, so a correction drops a proofread sentence back until someone signs for it again.
The pipeline records F0, F1 or F2; F3 comes only from a valid receipt.
The example reports 27 leaves at F3, 13 at F2, 4 at F1 and 1 at F0, which is its 45 leaves.
See [chapter 8](../spec/08-fidelity.md).
## Receipts and spot-checks
Nobody signs three thousand nodes one at a time (a 30-page paper has about that many).
A reviewer signs a **receipt** instead: one signature over a Merkle root of everything reviewed in a sitting, with the evidence looked at.
A Merkle root is the single hash at the top of a tree of hashes, so one signature commits to every item below it.
In the example, the reviewer `ana` signs one receipt for 23 nodes: the cells of Table 1's three data rows and its four column headers, the equation and the sentences around it.
Receipts use an RFC 6962 style tree over the reviewed nodes ([chapter 8.5](../spec/08-fidelity.md#85-merkle-roots)).
RFC 6962 has since been replaced by [RFC 9162](https://www.rfc-editor.org/rfc/rfc9162), which gives the same tree definition.
One difference: this specification makes a receipt with no items invalid, while the RFC defines a hash for an empty list.
Signing once per sitting invites rubber-stamping, so a second reviewer spot-checks a sample.
The sample is chosen by the checker's Ed25519 signature over the receipt, which neither reviewer can steer and anyone can recompute.
By default the sample is 5% of the nodes with a minimum of 10, so for the 23-node receipt it is 10 nodes.
The record states a bound on each reviewer's error rate across samples: zero errors in 10 sampled nodes bounds the rate below 26%, and zero errors in 300 bounds it below 1%. These are one-sided upper confidence bounds at 95% confidence (Clopper-Pearson); with no errors the bound is about 3 divided by the sample size.
A spot-check that finds an error suspends the receipt; a revocation withdraws it.
Either way the nodes fall back to the level they had without it.
Pinned by [vectors/merkle.jsonl](../vectors/merkle.jsonl), [vectors/spotcheck.jsonl](../vectors/spotcheck.jsonl) and [vectors/bounds.jsonl](../vectors/bounds.jsonl).
See [chapter 8](../spec/08-fidelity.md#83-receipts).
## Page fingerprints
Several publishers stamp each download with the institution and time, so two teammates' copies of one paper rarely share a SHA-256.
Each page also has a fingerprint: a hash of its size, its text with the stamp lines removed, and its images.
Two downloads of the same page stamped "Downloaded via UNIVERSITY OF EXAMPLE on October 11, 2026" and "Downloaded via EXAMPLE PHARMA INC on March 2, 2027" share the fingerprint `6272e6f3…`; change one digit of the text and it becomes `b545d285…`.
Geometry and digitizations point at fingerprints, so a re-download keeps every box and every value read off a plot.
The limit is in the stamp rules.
A missed stamp splits one edition into two, and an over-broad rule hides a real difference.
Pinned by [vectors/fingerprints.jsonl](../vectors/fingerprints.jsonl).
See [chapter 7](../spec/07-geometry.md).
## Keeping text private
A team may annotate a paper it may not share.
A **checks-only** package keeps every ID, label, page and box, and withholds the text.
It also keys every hash, because a plain hash of a short text such as "310.0" is recovered by hashing guesses.
A keyed hash (an HMAC) needs a secret key to compute, so guessing does not work without the key.
Values are plain SHA-256 inside the team.
Exported to another of the team's machines, they are HMACs under the team's key.
In a public layer, or in an export outside the team, the key is derived from the paper's page fingerprints (see the previous section), so only someone holding the paper can check them.
Where the values go chooses the key, not whether the text is withheld.
[fixtures/packages/hale2026harmonic-damb.checks-only](../fixtures/packages/hale2026harmonic-damb.checks-only) is the example paper exported to another of the team's machines, so it uses the team key.
A checks-only package also has no corrections, suspects or datasets.
Pinned by [vectors/keyed.jsonl](../vectors/keyed.jsonl).
See [chapter 5.8](../spec/05-hashes.md#58-keyed-hashes).
## Rights
What a team may do with a paper depends on how it holds the paper.
Every witness carries a rights record: the license as stated, the basis (an open license, a subscription, a collective license, the team's own work), and which uses that allows, including AI uses by purpose and by where the processing runs.
Every processing stage declares what it needs and runs only when the rights allow it.
A use that is not recorded counts as unknown, and unknown counts as no.
The example PDF is held on a subscription that allows text mining and internal AI use on the team's own machines.
Conversion by a local model is allowed.
Conversion by an outside service is refused for lacking `ai/internal/outside`.
Model review in the team's cloud is refused for lacking `ai/internal/tenancy?` (the question mark means unknown) until a project owner signs a policy that settles it.
A policy can settle an unknown use and cannot override an explicit yes or no.
The refusal for `ai/internal/outside`, which the record sets to false, stands.
The record also has an end date, after which every use is false.
Nothing here is legal advice.
Pinned by [vectors/rights.jsonl](../vectors/rights.jsonl).
See [chapter 14](../spec/14-rights.md).
## Layers and annotations
Everything people and models add is an annotation, grouped in layers.
The example layer is "Smith lab reading of Hale and Osei", for a student audience, visible to the team.
Annotations are W3C Web Annotations whose selector is an anchor.
A custom `AnchorSelector` carries the anchor, followed by a standard `TextQuoteSelector` as a fallback for readers that do not know the first; there is no `TextPositionSelector` or `FragmentSelector`.
This gloss, shortened, explains a phrase for a first-year student:
```json
{"type":"Annotation","motivation":"describing","status":"confirmed",
"body":{"type":"TextualBody","kind":"gloss","audience":"novice",
"value":"A *harmonic* term treats a bond like a spring: the energy grows with the square of the stretch."},
"target":{"type":"SpecificResource","source":"tag:scient.ing,2026:doc:smithlab/hale2026harmonic-damb",
"selector":[{"type":"AnchorSelector","anchor":{"node":"rr20tev","span":[111,130],"…":"…"}},
{"type":"TextQuoteSelector","exact":"bond force constant"}]}}
```
One rule decides what is a claim and what is a layer.
A statement true independently of the paper is a claim, which is checked and leveled.
A statement about reading the paper belongs in a layer, where it is attributed and signed and not checked.
Claims are not defined in this repository.
Model-written text is always a `generated` annotation, never source, and a model's annotation stays `proposed` until a person confirms it.
Whether a generic Web Annotation client displays an `AnchorSelector` has not been tested; the fallback exists so that it can still use the quote.
Layers are `candidate`.
Pinned by the layer records in `fixtures/records/layer/`.
See [chapter 18](../spec/18-layers.md).
## Exercises
Every sentence and cell has an address, so the answer to "find the evidence" is an address, and an address can be graded.
An exercise asks a student to find the cell giving the Set A bond constant for CT–CT. A student who points at `c20cna6` scores 1 of 1 with "That is the cell."; one who points at the Set B cell scores 0 with "Look in Table 1, row CT–CT."
Students submit under pseudonyms, and a key whose anchors have gone stale is never used to grade.
Pinned by [vectors/grading.jsonl](../vectors/grading.jsonl).
The exercise, submission and grade formats are `provisional`: no course has used them yet, and the first that does will shape them.
See [chapter 19](../spec/19-exercises.md).
## Datasets, digitizations and views
Numbers live in prose, in tables and inside figures; all three should end up as data a team can plot and cite.
The dataset, digitization and view formats are all `provisional`: complete, and expected to change as implementations gain experience.
A dataset is a Frictionless Data Package with units, uncertainty, and an origin for each resource or row.
The example's Table 1 becomes a CSV whose every value is anchored to the cell that prints it, digits exactly as printed:
```text
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
```
A digitization records how values were read off a plot (axes, calibration, series, uncertainty) and counts only once a person confirms it against an overlay.
A view is a Vega-Lite specification that names its data by dataset ID and hash.
See chapters [15](../spec/15-datasets.md), [16](../spec/16-digitization.md) and [17](../spec/17-views.md).
Close relative: a [Frictionless Data Package](https://datapackage.org/standard/data-package/) is "a simple container format for describing a coherent collection of data in a single package".
The dataset format adopts it and adds units, uncertainty, origin and per-value anchors.
The spec does not state which Data Package version it uses.
See [the comparison page](comparison.md).
## Packages, databases and bundles
A document travels as a package: a folder of canonical JSON files, or the same folder zipped.
```text
hale2026harmonic-damb/
MANIFEST.json every other file, with its SHA-256; its own hash pins the package
document.json the work, version, metadata, policy, root hash and fidelity
nodes.jsonl one node per line, in reading order
witnesses.json each witness and its rights
pages.jsonl each page and its fingerprint
locations.jsonl where each node is on each page
references.jsonl parsed references
corrections.jsonl every correction, in order
receipts.jsonl receipts and revocations
ids.jsonl retired IDs and legacy aliases
suspects.jsonl suspects not yet resolved
roster.json the keys that signed
provenance.json tools, versions and where each stage ran
assets/ images, by SHA-256
datasets/ datasets reported from the document
derived/ MathML and other renderings, rebuildable
```
Only `MANIFEST.json`, `document.json`, `nodes.jsonl`, `witnesses.json` and `provenance.json` are required, and an optional file with no records is left out; the example package omits `suspects.jsonl`.
Every line is canonical JSON, so a corrected sentence is a one-line diff, and every file has exactly one valid byte sequence.
This specification defines `provenance.json`, which records the tools and versions used and, for each stage, the processor where it ran.
The same data loads into tables that run on SQLite, Dolt and PostgreSQL, and unloads back to the same bytes.
A bundle is one SQLite file with every table and a full-text index, which a reader or a server can query offline.
The bundle and project formats are `provisional`; the package format is `candidate`.
See chapters [12](../spec/12-package.md) and [13](../spec/13-database.md).
Close relatives: [BagIt](https://www.rfc-editor.org/rfc/rfc8493) (RFC 8493) also packages files with a manifest of checksums, and is the better choice for transferring arbitrary payloads to archives; `MANIFEST.json` also lists files with checksums, in a different layout. [RO-Crate](https://www.researchobject.org/ro-crate/) describes a folder's contents with schema.org terms in JSON-LD and suits general research-object description; neither it nor BagIt defines addressing of sentences or cells.
For provenance, [W3C PROV-O](https://www.w3.org/TR/prov-o/) is a general W3C vocabulary (entities, activities, agents) that other systems can query generically; this specification does not use it, and no mapping between it and `provenance.json` is defined.
See [the comparison page](comparison.md).
+249
View File
@@ -0,0 +1,249 @@
# Examples
Things to run, each with the output it gives.
Three readers can use this page.
Each section opens with what it shows, in plain terms, for readers new to the problem, and every example uses the fixtures in this repository.
The last sections point implementers (anyone writing a reader, writer, converter or checker) to the test vectors, which pin the exact behavior (the vector files are listed in [vectors/README.md](../vectors/README.md)).
This page makes no comparison with the neighboring standards.
The formats are version 0.1.0, and each is `candidate` or `provisional` in `registry/formats.json`.
Run every command from the root of the repository, <https://git.scient.ing/infra/paperspec>.
With [pixi](https://pixi.sh), `pixi run <task>` sets up the environment first.
Every command also works without pixi, with Python 3.14 and two packages, `jsonschema` and `cryptography` installed and standard command-line tools (the `sed` command in the last section is the GNU version of `sed`).
## Run the checks
This shows how to confirm that the repository's specification, fixtures and test vectors agree with each other.
```sh
pixi run check
```
`pixi run check` lints the Markdown, then runs `python tools/check.py`, the repository's reference checker.
Each section prints how many checks it ran, and the last line is `All checks pass.`
`pixi run quick`, or `python3 tools/check.py --quick`, skips the slowest part, which rebuilds everything and compares it byte for byte.
Without pixi, the Markdown lint is a separate step (`markdownlint-cli2`); `tools/check.py` does not run it.
## Recompute a hash by hand
This shows that a hash in a package is not magic: you can reproduce it with a standard tool.
A hash is a fixed-length fingerprint of some text; change one character and the fingerprint changes.
A sentence's `text_hash` is the SHA-256 of its text after two steps.
The text is converted to Unicode NFC (a standard form that writes each accented or composed character one way), and each run of whitespace is collapsed to one space, as [chapter 1](../spec/01-conventions.md#14-text-normalization-for-hashing) defines.
For a sentence with math or citations, the text is its plain projection ([chapter 5](../spec/05-hashes.md#51-the-five-values)).
For a sentence of plain text, the whole computation is a one-liner:
```sh
printf '%s' 'The two parameter sets agree to within 2% for every bond.' | sha256sum
```
```text
175bfc8867816a9761fd5bb9ffc956df6d9e7f203870961a5485fc1912cb663a -
```
The same value is in the package, in the `nodes.jsonl` of `hale2026harmonic-damb`:
```sh
grep -o '"id":"v3063qv".*' fixtures/packages/hale2026harmonic-damb/nodes.jsonl | grep -o '"text_hash":"[0-9a-f]*"'
```
```text
"text_hash":"175bfc8867816a9761fd5bb9ffc956df6d9e7f203870961a5485fc1912cb663a"
```
## Check a package's manifest
This shows how a reader detects that a package's files have changed.
A package is a folder of JSON (JavaScript Object Notation, a plain-text format for structured data) files describing one paper.
`MANIFEST.json` lists every other file of a package with its SHA-256 and size, and the SHA-256 of the manifest itself pins the whole package ([chapter 12](../spec/12-package.md#123-the-manifest)).
```sh
cd fixtures/packages/okafor2025solvent-acth
sha256sum nodes.jsonl
grep -o '"path":"nodes.jsonl","sha256":"[0-9a-f]*"' MANIFEST.json
```
```text
09c9b99eed97987e51dd0f85461ad9ad8768a0769ba7facfb7e0879d742660a3 nodes.jsonl
"path":"nodes.jsonl","sha256":"09c9b99eed97987e51dd0f85461ad9ad8768a0769ba7facfb7e0879d742660a3"
```
## Read a package with nothing but a JSON parser
This shows that a package needs no special software to read.
JSON Lines is a text format with one JSON object per line, here one node (a section, sentence, figure, table or equation) per line of `nodes.jsonl`.
Save this script as `outline.py`.
It prints a document's sections, figures, tables and equations.
```python
import json, sys
pkg = sys.argv[1]
nodes = [json.loads(line) for line in open(pkg + "/nodes.jsonl", encoding="utf-8")]
by_id = {n["id"]: n for n in nodes}
children = {}
for n in nodes:
children.setdefault(n["parent"], []).append(n)
def text(n):
"""The plain projection of a node with runs."""
out = []
for r in n["content"]:
if r["kind"] == "math":
out.append("$" + r["source"] + "$")
elif r["kind"] == "equation":
out.append("$$" + by_id[r["node"]]["content"]["source"] + "$$")
else:
out.append(r["text"])
return "".join(out)
for n in nodes:
if n["kind"] == "section":
heading = children[n["id"]][0]
print(n["id"], n.get("label", ""), " ".join(text(s) for s in children[heading["id"]]))
elif n["kind"] in ("figure", "table", "equation"):
print(n["id"], " ", n["kind"], n.get("label", ""))
```
```sh
python3 outline.py fixtures/packages/hale2026harmonic-damb
```
```text
p36k8t6 1 Introduction
tkxsmts equation (1)
d400rz3 2 Methods
v7cx6qs figure Figure 1
hj4s7pb table Table 1
```
## Follow an address
This shows how a citation points inside a sentence.
An address names a node, and optionally a span of its text ([chapter 6](../spec/06-anchors.md#61-addresses)).
`hale2026harmonic-damb#hca6dc5[29:44]` names code points 29 to 44 of sentence `hca6dc5`.
With `text()` from the script above:
```python
print(text(by_id["hca6dc5"])[29:44])
```
```text
first test case
```
Offsets count Unicode code points, one per character; in Python, string indexes already do.
JavaScript strings index UTF-16 units, so convert first.
For text with characters outside the Basic Multilingual Plane the two counts differ, and [vectors/offsets.jsonl](../vectors/offsets.jsonl) gives both.
## Load packages into SQLite
This shows that the same packages can live in a database and be queried with SQL.
```sh
pixi run load --sqlite lab.db fixtures/packages/hale2026harmonic-damb fixtures/packages/okafor2025solvent-acth fixtures/packages/writer2027fixed-ynr7.v3
```
Without pixi, run `python3 tools/load.py` with the same arguments.
```text
hale2026harmonic-damb: 75 nodes
okafor2025solvent-acth: 15 nodes
writer2027fixed-ynr7.v3: 15 nodes
```
The tables are those of [sql/doc.sql](../sql/doc.sql) and [sql/store.sql](../sql/store.sql), which run unchanged on Dolt and PostgreSQL as well ([chapter 13](../spec/13-database.md)); `tools/check.py` exercises them on SQLite only, and this repository has not yet run them on Dolt or PostgreSQL.
Here are four queries, in Python's `sqlite3` so that nothing else is needed.
```python
import json, sqlite3
db = sqlite3.connect("lab.db")
# Sentences the converter left below F2. Receipts can raise them; see below.
for row in db.execute("SELECT id, fidelity FROM nodes WHERE doc_key = 'hale2026harmonic-damb' "
"AND kind = 'sentence' AND fidelity IN ('F0', 'F1') ORDER BY seq"):
print(row)
# Every sentence that cites reference 2: the citation graph is sentence-level.
for row in db.execute("SELECT c.sentence FROM citations c JOIN refs r "
"ON r.doc_key = c.doc_key AND r.node = c.ref_node "
"WHERE c.doc_key = 'hale2026harmonic-damb' AND r.label = '2'"):
print(row)
# Who signed what.
for row in db.execute("SELECT r.signer, r.scope, COUNT(*) FROM receipts r "
"JOIN receipt_nodes rn ON rn.receipt = r.id GROUP BY r.id ORDER BY r.made_at"):
print(row)
# Table 1's body, row by row.
rows = db.execute("SELECT r.id FROM nodes r JOIN nodes b ON b.doc_key = r.doc_key AND b.id = r.parent "
"WHERE r.doc_key = 'hale2026harmonic-damb' AND r.kind = 'row' AND b.kind = 'table-body' "
"ORDER BY r.seq").fetchall()
for (row,) in rows:
cells = db.execute("SELECT content FROM nodes WHERE doc_key = 'hale2026harmonic-damb' AND parent = ? ORDER BY ord",
(row,)).fetchall()
print(" | ".join("".join(r.get("text", "") for r in json.loads(c)) for (c,) in cells))
```
```text
('ec5jc93', 'F1')
('a4jrz2t', 'F0')
('xjns57z', 'F0')
('hca6dc5',)
('ana', 'targeted:lode', 3)
('ana', 'targeted:lode', 23)
('ana', 'section:p36k8t6', 2)
('cara', 'page:2', 3)
('ana', 'targeted:captions', 3)
('ben', 'qa:y2zw8ctg5s8dp', 10)
('ben', 'qa:gx2s84z9jf9xv', 3)
Bond parameters
CT–CT | 310.0 | 1.526 | 305.2 | 1.5260
CT–HC | 340.0 | 1.090 | 338.7 | 1.0900
OW–HW | 553.0 | 0.9572 | 548.1 | 0.9570
```
The first query reads the level the converter recorded, not the final one.
A receipt is a signed record that a reviewer checked certain nodes against the page.
Receipts by `ana` raise `ec5jc93` and `a4jrz2t` to F3; `xjns57z` stays at F0 because the only receipt that covered it, by `cara`, was revoked.
To compute the final level, check each receipt's signature, revocations and spot-checks, as [chapter 8](../spec/08-fidelity.md#82-levels) describes.
The `scope` column of the third query shows the value `targeted:lode`, which is data in the fixture, copied here exactly as the query prints it.
## Test your implementation against a vector
A test vector is a recorded input together with the output every correct implementation must produce.
Every vector file has one case per line, with its inputs and expected outputs.
A harness for the projections looks like this, with your functions in place of the comments:
```python
import json
for line in open("vectors/projections.jsonl", encoding="utf-8"):
case = json.loads(line)
runs = case["runs"]
# assert my_plain(runs) == case["plain"]
# assert my_strict(runs) == case["strict"]
# assert my_lossy(runs) == case["lossy"]
# assert my_sha256(case["strict"]) == case["match_hash"]
print(case["id"], case["strict"])
```
[vectors/README.md](../vectors/README.md) lists every file, what it tests and the chapter that defines it.
## Break something on purpose
This shows what the checks catch.
Change one digit in a fixture and run the checks:
```sh
sed -i 's/1718 cm/1719 cm/' fixtures/packages/okafor2025solvent-acth/nodes.jsonl
pixi run quick
```
The checker reports three failures: the SHA-256 of `nodes.jsonl` no longer matches the manifest, unloading the package from the database no longer gives the same bytes, and the package hash differs after unloading.
Restore the file with `git checkout fixtures/packages/okafor2025solvent-acth/nodes.jsonl`.
The broken packages in [fixtures/invalid/](../fixtures/invalid/) are this kind of change, each with the rule it breaks.
`git checkout` restores a tracked file, so run this only in a clone you can reset.
+131
View File
@@ -0,0 +1,131 @@
# FAQ
This page answers questions about paperspec, a set of file formats that give every sentence and table cell of a scientific paper a permanent address.
Newcomers, implementers of a reader, writer, converter or checker, and experts who know JATS (Journal Article Tag Suite), TEI (Text Encoding Initiative) or W3C Web Annotations can all use it.
Each answer gives the plain statement first, then the precise one, then the chapter that defines it.
The repository is <https://git.scient.ing/infra/paperspec>, and the formats are at version 0.1.0.
## Can I read these files without special software?
Yes.
Every file is JSON or JSON Lines (one JSON value per line), and [spec/](../spec/README.md) specifies every format. [The examples](examples.md) read a package with a few lines of Python.
## Why not keep using PDFs and page numbers?
A page number names a region, not a statement, and it changes between a preprint and the version of record.
An address names a sentence or a cell by its ID, such as `hale2026harmonic-damb#v3063qv`.
It can add a pin (the first six hex digits of the node's hash) and character offsets, which lets a reader check the address against the exact text ([spec/06 §6.1](../spec/06-anchors.md#61-addresses)).
An ID encodes no page, position or kind.
The system mints it once from the document key, kind, text hash and occurrence, then freezes it ([spec/04 §4.2](../spec/04-identity.md#42-minting-node-ids)).
## Why does a key end in four odd characters?
`hale2026harmonic-damb` is the paper's key: the citation key a reader would use, then four characters of a hash of its DOI.
Citation keys alone collide, between a preprint and its published version or two papers by one author in one year; the hash settles that, and any tool that knows the DOI can recompute it.
A key is minted once and never recomputed, so a corrected title does not change a key someone has cited ([spec/02 §2.4](../spec/02-model.md#24-work-and-document-keys)).
## Why are numbers stored as strings?
Databases and JSON libraries rewrite numbers: `310.0` becomes `310` and `1.5260` becomes `1.526`, and the printed digits are part of what a paper says.
Canonical JSON, the byte-exact form used for hashing, writes numbers as ECMAScript writes a double, so it would erase the same difference.
A decimal that carries meaning is a string.
JSON numbers are for counts, indexes, offsets, sizes and geometry ([spec/01 §1.2](../spec/01-conventions.md#12-numbers)).
## What happens when a better converter comes along?
The system aligns the new reading with the established document, sentence by sentence.
A sentence the alignment pairs keeps its ID even where the readings disagree, which catches a lost superscript instead of accepting it.
Every disagreement, and every sentence found in only one reading, becomes a suspect, a doubtful reading raised for review.
Nothing changes until a correction passes the gate, the rules that refuse, for example, a digit change with no crop of the page image as evidence.
Converting the same input again with the same converter mints the same IDs ([spec/05 §5.6](../spec/05-hashes.md#56-alignment), [spec/11 §11.4](../spec/11-corrections.md#114-the-gate), [spec/04 §4.2](../spec/04-identity.md#42-minting-node-ids)).
## Do I need receipts, rights records and spot-checks for a personal library?
You need no receipts and no spot-checks.
A receipt is a signed record that a named person compared nodes with the page image, and a spot-check is a second reviewer's sample of that work.
One person can leave both out.
Each source file still carries a rights record, though the record can say little: the license as printed, a `basis` of `unknown`, and no uses, each of which then counts as unknown ([spec/14 §14.1](../spec/14-rights.md)).
The fields are defined so that a personal library loads into a team's store later without conversion ([spec/00 §0.4](../spec/00-introduction.md#04-status)).
## Is a model allowed to correct a document?
A model may propose corrections and answer suspects, under the same gate as a person, and its corrections record the model and the run as author.
Only a named person can sign a receipt, and a model's annotation stays `proposed` until a person confirms it ([spec/11 §11.2](../spec/11-corrections.md#112-every-correction-records), [spec/18 §18.3](../spec/18-layers.md#183-the-annotation)).
## Why are annotations W3C Web Annotations?
Tools that follow the W3C Web Annotation model can read the standard parts of these annotations.
A layer, the file that groups annotations, follows the [W3C Web Annotation Data Model](https://www.w3.org/TR/annotation-model/), a W3C Recommendation of 2017.
Each target holds an `AnchorSelector` carrying a `scienting-anchor/1` record, followed by a standard `TextQuoteSelector` for tools that do not know the anchor selector.
(The `scienting-` prefix is the formats' namespace, separate from the repository's name.)
The formats use no `TextPositionSelector` or `FragmentSelector`.
The anchor adds what the standard selectors lack: the node's ID, its hashes, and a defined outcome (`current`, `changed-below`, `moved`, `reattached` or `stale`) when the text has changed.
The Web Annotation model alone is the better-established choice where an annotation needs none of that.
Whether a generic Web Annotation client displays an `AnchorSelector` is untested.
See [the comparison](comparison.md).
## What is the difference between a claim and an annotation?
A statement true independently of the paper, such as "K_r is the bond force constant of the AMBER energy", is a claim.
A claim has to be checked against evidence, so it belongs in a store of checked claims outside these formats, which define no claim semantics.
A statement about reading the paper, such as "the authors pass quickly over the scaling here", is an annotation in a layer, attributed and unchecked ([spec/18 §18.1](../spec/18-layers.md#181-one-rule-decides-what-is-a-claim-and-what-is-a-layer)).
## Can a team share notes on a paywalled paper?
Yes, without sharing the paper.
A checks-only package withholds all text and keeps IDs, labels, pages, boxes and keyed hashes.
A public layer swaps each quotation for keyed hashes, under a key derived from the paper's page fingerprints, so a reader checks and shows it only over their own copy.
The hash must be keyed because anyone can recover a plain hash of a short text such as `310.0` by hashing guesses ([spec/12 §12.5](../spec/12-package.md#125-text-policies), [spec/05 §5.8](../spec/05-hashes.md#58-keyed-hashes), [spec/06 §6.3](../spec/06-anchors.md#63-keyed-anchors)).
Whether a team may share notes on a paper this way is a question for its own counsel; nothing here is legal advice.
## How does this differ from JATS or TEI?
They overlap in subject, not in job.
JATS, the [Journal Article Tag Suite](https://www.niso.org/publications/z3996-2024-jats) (ANSI/NISO Z39.96-2024), is an XML format for publishers and archives to exchange journal content. paperspec does not replace it.
A JATS file is one kind of witness (a source file), an input from which a document is established.
None of the 312 elements in the [JATS 1.4 Archiving tag library](https://jats.nlm.nih.gov/archiving/tag-library/1.4/) marks a sentence; its smallest text unit is the paragraph, `<p>`.
TEI, the Text Encoding Initiative, has a sentence-like [`<s>` element](https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-s.html) and keeps both readings of a corrected passage with [`<corr>` and `<sic>`](https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-corr.html).
The encoder assigns its `xml:id`, and the guidelines [recommend it for durability](https://tei-c.org/release/doc/tei-p5-doc/en/html/SA.html).
paperspec mints and retires IDs by rule, keeps corrections as separate records with evidence, and hashes each node.
Keep JATS for publisher and archive exchange and TEI for general scholarly text encoding.
A TEI file is a witness of kind `xml` ([spec/02 §2.3](../spec/02-model.md)).
The full comparison is [docs/comparison.md](comparison.md)
## What is its status and maturity?
Version 0.1.0 has 32 formats: 19 are `candidate` and 13 are `provisional`, as [registry/formats.json](../registry/formats.json) lists.
A `candidate` format is complete, with vectors and fixtures, and ready to implement.
A `provisional` one is complete and expected to change as implementations gain experience.
The provisional formats are dataset, digitization, view, project, bundle, snapshot, draft-ids, exercise, submission, grade, checklist, log-entry and checkpoint.
The repository holds a reference checker (`tools/check.py`), 25 vector files, five valid packages, one of them also as a zip, and 31 deliberately broken packages ([spec/00 §0.4](../spec/00-introduction.md#04-status), [spec/22](../spec/22-conformance.md)).
## What does it not do?
It is built for a team-scale corpus of hundreds of documents, not hundreds of millions of papers.
It does not replace publisher interchange formats; it reads JATS as a witness.
It does not fix what a converter reads wrongly.
It records the reading and raises disagreements as suspects, and a correction is checkable.
It is not a search engine, a citation index or a recommendation feed ([docs/overview.md](overview.md)).
## How do I add a node kind or a run kind?
A node kind is a type of document part, such as `sentence`; a run kind is a type of inline content within a sentence, such as `math`.
Propose either with the vector or fixture that shows it.
A new kind is a minor version ([spec/00 §0.3](../spec/00-introduction.md#03-format-identifiers-and-versions)).
See [CONTRIBUTING.md](../CONTRIBUTING.md).
## What are the files in `tools/` for?
`build.py` builds the fixtures and vectors. `check.py` recomputes and checks every one, and `load.py` loads packages into SQLite.
The `oracle/` modules compute every expected value, so that none is typed by hand.
They are not a library; implementations follow the specification ([tools/README.md](../tools/README.md)).
+206
View File
@@ -0,0 +1,206 @@
# Glossary
A scientific paper changes after it is published: errata appear, readings get corrected, annotations pile up. paperspec is a set of file formats for scientific papers that keeps each sentence findable through those changes (repository: <https://git.scient.ing/infra/paperspec>).
This glossary defines its terms for readers from newcomer to expert, implementers included.
Each entry gives the plain meaning, then the precise one, then the chapter that defines it.
A hash is a fixed-length fingerprint of data; changing one character changes it.
SHA-256 is the hash function the formats use.
The specification is at version 0.1.0, and each format is `candidate` or `provisional` in `registry/formats.json`.
Format names begin with `scienting-`, as in `scienting-doc/1`; that prefix is the formats' namespace, a separate matter from the repository's name. "Outside term" marks a standard from another project.
Address
: A string that names one node, optionally pinned to its state by the first six digits of its `node_hash` and narrowed to a span of code points (numbered characters of text): `key#id@hash6[start:end]`. ([6.1](../spec/06-anchors.md#61-addresses))
Alias
: A legacy ID kept so that old references still lead to the node that now holds their text. ([4.3](../spec/04-identity.md#43-permanence-retirement-and-aliases))
Align key
: A hash of a node's lossy projection, used only to propose that two readings hold the same sentence; it never certifies anything. ([5.1](../spec/05-hashes.md#51-the-five-values))
Anchor
: The stored form of a pinned address, with its quotation and context, so that a reference can be found again after the text changes.
It resolves as current, changed below, moved, reattached or stale. ([6.2](../spec/06-anchors.md#62-the-anchor), [6.5](../spec/06-anchors.md#65-resolution))
Asset store
: Where a team keeps files by SHA-256: witnesses, images, crops and withheld text. ([12.6](../spec/12-package.md#126-assets))
Bundle
: One SQLite file with every table and a full-text index, which a reader or a store queries.
Format `scienting-bundle/1`, `provisional`. ([13.5](../spec/13-database.md#135-the-bundle))
Changed below
: The resolution of an anchor on a container that is unchanged in itself while something inside it changed. ([6.5](../spec/06-anchors.md#65-resolution))
Checklist
: A record of checking an export, such as accessible HTML, against a named standard, criterion by criterion; it is covered by the receipt of the person who checked.
Format `scienting-checklist/1`, `provisional`. ([8.11](../spec/08-fidelity.md#811-checklists))
Checkpoint
: A signed note that states a transparency log's size and root hash, which a verifier checks against the last checkpoint it saw.
Independent parties, the log's witnesses, cosign it, and a project says how many must.
Format `scienting-checkpoint/1`, `provisional`. ([23.2](../spec/23-log.md#232-checkpoints))
Correction
: An operation on an established document, with its evidence and author; never edited, only appended. ([11](../spec/11-corrections.md))
Description
: An annotation that describes a figure, panel or table for readers who cannot see it, as a short text equivalent (`alt`) or a full description (`long`); an accessible export uses confirmed descriptions only. ([18.4](../spec/18-layers.md#184-bodies))
DID
: Outside term.
A decentralized identifier (W3C).
A roster key may carry its `did:key`, which the public key alone determines, so a signer has one name inside and outside the store. ([8.7](../spec/08-fidelity.md#87-revocations-and-the-roster))
Document
: The text established for one version of one work, from one or more witnesses, as a tree of nodes. ([2.1](../spec/02-model.md#21-four-objects), [3](../spec/03-nodes.md))
Document key
: The work key, with a dotted suffix for any version other than the version of record: `.si` for Supporting Information, `.v2` for a second preprint. ([2.4](../spec/02-model.md#24-work-and-document-keys))
Drift
: The amount that has changed below a container since an anchor on it was made, counted from the corrections: the share of the container's leaves touched by later corrections.
It is reported as `none`, `low` or `high`, with a default threshold of a quarter. ([6.6](../spec/06-anchors.md#66-drift))
Exercise
: An annotation whose body holds a prompt, an answer key and a grading rule.
The key is anchors, a verdict, a chain, a value or planted errors, by exercise kind. ([19.1](../spec/19-exercises.md#191-exercises))
Fidelity level
: How far a leaf's text was checked against its source, from F0 converted to F3 proofread. ([8.1](../spec/08-fidelity.md#81-levels-of-fidelity))
History root
: The root of the Merkle tree over a document's corrections, kept in `document.json`, so a consistency proof can show that a later revision extends an earlier one. ([11.5](../spec/11-corrections.md#115-the-history-root))
JATS
: Outside term.
Journal Article Tag Suite, ANSI/NISO Z39.96-2024, an XML format in which publishers and archives exchange journal content ([the NISO page](https://www.niso.org/publications/z3996-2024-jats)).
In paperspec, `jats` is a witness kind: the fixture `okafor2025solvent-acth` was established from a JATS file and a PDF that agree.
The formats ingest JATS and do not replace it. ([2.3](../spec/02-model.md#23-witnessesjson))
Keyed hash
: A content value computed as an HMAC (a hash mixed with a secret key) under a team key or a key derived from page fingerprints, so a short text cannot be recovered by hashing guesses. ([5.8](../spec/05-hashes.md#58-keyed-hashes))
Layer
: A named set of annotations with one purpose, audience, visibility and license. ([18.2](../spec/18-layers.md#182-the-layer))
Leaf
: A node that holds text itself: a sentence, cell, reference, author line, keyword line, equation, equation line, code or algorithm.
A leaf anchor points at one whole. ([6.4](../spec/06-anchors.md#64-four-kinds-of-anchor))
Lossy projection
: A node's text with scripts flattened, citation marks, whitespace and dashes removed, and case folded; used for proposing alignments. ([5.5](../spec/05-hashes.md#55-the-lossy-projection))
Match hash
: A hash of a node's strict projection.
Two readings agree only when their match hashes are equal and their complex-notation keys are equal.
A complex-notation key is `notation:source` for a piece of math too complex for the formats to normalize, with the source's whitespace removed ([5.3](../spec/05-hashes.md#53-the-strict-projection)). ([5.1](../spec/05-hashes.md#51-the-five-values), [5.3](../spec/05-hashes.md#53-the-strict-projection))
ML-DSA-65
: Outside term.
The lattice-based signature scheme of FIPS 204, believed to resist quantum computers.
A receipt may be signed with it today, beside Ed25519. ([8.4](../spec/08-fidelity.md#84-record-hashes-and-signatures))
Model
: The record of a machine-learning model that proposed a correction or wrote an annotation: its name, provider and version, and the hashes of its weights, instructions and parameters. ([11.2](../spec/11-corrections.md#112-every-correction-records))
Node
: An addressable part of a document: a section, paragraph, sentence, figure, panel, caption, table, row, cell, equation, footnote, reference and the rest.
Each node has a permanent ID and five content values; table columns and figure-text items have IDs and are not nodes. ([3](../spec/03-nodes.md), [4.2](../spec/04-identity.md#42-minting-node-ids))
Own hash
: A hash of a node's own content without its children, used to judge anchors on containers that have content of their own.
The `node_hash` is a hash of the own hash and the children's node hashes. ([5.1](../spec/05-hashes.md#51-the-five-values), [5.2](../spec/05-hashes.md#52-own-content))
Package
: A document as a folder, or a zip of one, of canonical JSON (a plain-text data format) and JSON Lines (one JSON value per line) files, with a manifest whose hash pins them all. ([12](../spec/12-package.md))
Page fingerprint
: A hash of a page's size, its text with download stamps removed, and its images, so that differently stamped downloads share their pages. ([7.1](../spec/07-geometry.md#71-page-fingerprints))
Plain projection
: A node's text as one string, on which offsets, quotations and text hashes are defined. ([3.6](../spec/03-nodes.md#36-the-plain-projection))
Policy
: A project owner's signed decision that settles rights a record leaves unknown.
It never overrides a use the record sets to true or false. ([14.2](../spec/14-rights.md#142-effective-uses))
Proof
: An RFC 9162 inclusion proof that one item was covered by a receipt, or a consistency proof that one history extends another, each a short list of hashes.
Format `scienting-proof/1`. ([8.5](../spec/08-fidelity.md#85-merkle-roots))
Project
: A team's curated set of documents, with its members, layers, data, reading paths and drafts.
Format `scienting-project/1`, `provisional`. ([20](../spec/20-projects.md))
Receipt
: One signature over a Merkle root of what a person reviewed in a sitting.
The signature sets the fidelity level of what it lists.
A Merkle root is a single hash that commits to a list of items; receipts build it as RFC 6962 (an internet standards document) describes, a tree that [RFC 9162](https://www.rfc-editor.org/rfc/rfc9162) obsoletes and defines identically. ([8.3](../spec/08-fidelity.md#83-receipts), [8.5](../spec/08-fidelity.md#85-merkle-roots))
Revision
: The index of the last correction applied to a document, or 0 when there is none; anchors and receipts record it. ([11](../spec/11-corrections.md))
Revocation
: A signed record that withdraws a receipt, or every receipt by one signer in a period. ([8.7](../spec/08-fidelity.md#87-revocations-and-the-roster))
Rights record
: A witness's license, the basis on which the team holds it, and the uses that basis allows. ([14.1](../spec/14-rights.md#141-the-rights-record))
Roster
: The list of keys that may sign, with the person who holds each, that person's role in the team, and what the key may sign. ([8.7](../spec/08-fidelity.md#87-revocations-and-the-roster))
Selector
: Outside term.
In the W3C Web Annotation Data Model, the part of an annotation's target that says where in the source resource the annotation applies.
The model defines `TextQuoteSelector` (exact text, with optional prefix and suffix) and `TextPositionSelector` (offsets, which the model calls very brittle), among others ([the W3C model](https://www.w3.org/TR/annotation-model/)).
Layers use a custom `AnchorSelector`, which carries an anchor, followed by a `TextQuoteSelector` for tools that do not know it; they use neither `TextPositionSelector` nor `FragmentSelector`. ([18.3](../spec/18-layers.md#183-the-annotation))
Spot-check
: A second reviewer's check of a sample of a receipt's nodes, drawn from a seed nobody can steer: the checker's deterministic signature over the receipt's record hash. ([8.8](../spec/08-fidelity.md#88-spot-checks))
Stamp rule
: A pattern that recognizes a publisher's download stamp in a page's text, so that fingerprints ignore it. ([7.2](../spec/07-geometry.md#72-stamp-rules))
Strict projection
: A node's text with notation folded to one canonical form and structure kept; used for certifying agreement. ([5.3](../spec/05-hashes.md#53-the-strict-projection))
Suspect
: A doubtful reading raised for a person or a review session to answer. ([5.7](../spec/05-hashes.md#57-suspects))
Targeted F3
: Proofreading the nodes a team's claims, quotations and datasets rest on, rather than every node.
The target set also includes the leaves of every anchored container, every equation and, under the project's digit rule (`all`, `anchored-sections` or `none`), sentences and cells with a digit in a text or math run (an inline stretch of plain text, or of TeX or Typst math, within the node; [3.5](../spec/03-nodes.md#35-inline-runs)). ([8.10](../spec/08-fidelity.md#810-targeted-f3))
Text leaf
: A leaf whose text a container's projections are made of: any leaf except an equation line, or an equation inside a sentence, whose text is already part of its equation or its sentence. ([3.6](../spec/03-nodes.md#36-the-plain-projection))
Text policy
: Whether a package carries its text (`full`) or withholds it (`checks-only`). ([12.5](../spec/12-package.md#125-text-policies))
Tile
: One file of a transparency log served statically: 256 hashes of one level of the tree, or 256 entries, so a client fetches only the subtrees it needs. ([23.4](../spec/23-log.md#234-serving-a-log))
Verdict
: A judgment of whether a cited passage supports a citing sentence: supports, partly, does not, or cannot tell. ([19.2](../spec/19-exercises.md#192-verdicts))
Version
: One expression of a work: a preprint, the version of record, an erratum, the Supporting Information. ([2.1](../spec/02-model.md#21-four-objects))
VRF
: A verifiable random function (RFC 9381): a keyed function with exactly one valid proof for each key and input, so that a spot-check seed can be checked but not chosen. ([8.8](../spec/08-fidelity.md#88-spot-checks))
Web Annotation
: Outside term.
The W3C Recommendation of 23 February 2017 for annotations with a body, a target and a motivation ([the W3C model](https://www.w3.org/TR/annotation-model/)).
It gives sentences no permanent IDs and reports no outcomes such as current or stale; for annotation in general, it and its clients are the better choice.
Layers are Web Annotations. ([18](../spec/18-layers.md))
Witness
: One file of one version of a work, identified by its SHA-256. ([2.1](../spec/02-model.md#21-four-objects), [2.3](../spec/02-model.md#23-witnessesjson))
Work
: A piece of scholarship across all its versions. ([2.1](../spec/02-model.md#21-four-objects))
Work key
: A work's permanent name: a Scholar-style citation key, a hyphen, and the first characters of a hash of the work's identity, such as `vaswani2017attention-a241`; minted once and never recomputed. ([2.4](../spec/02-model.md#24-work-and-document-keys))
+161
View File
@@ -0,0 +1,161 @@
# The paperspec formats
This page serves three readers.
A student new to the problem will find each term defined where it first appears.
A developer who will write a reader, writer, converter or checker will find each topic pointing to its chapter.
A researcher or standards author will find the status, the limits and a comparison stated outright.
## The idea
Scientists who rely on a paper keep asking two questions.
1.
Does the cited passage say what is claimed? A citation to a real paper can still be inaccurate, incomplete or beside the point, so a reader needs to see the exact sentence it rests on.
2.
Where did this number come from, and how far was it checked? A force constant in a table, a value read off a plot, a parameter in a model: each should lead back to the cell or sentence it came from, with a record of who compared it with the page.
Most tools for scientific literature aggregate.
They index hundreds of millions of papers and answer questions over all of them, shallowly. paperspec does the opposite.
A team working on a focused question cares more about fifty papers it understands completely than about the world's literature.
Those fifty papers deserve to be converted once, corrected once, split down to the sentence, annotated by the people who know them, linked to checked claims, and kept.
A model can summarize a paper.
It cannot give you a signed statement that a named person checked a passage, IDs that never move, or a store its owner controls.
The formats supply those three, and they are worth most at the scale of one team.
paperspec is a set of file formats for scientific papers that have been converted, split into addressable pieces and checked.
The repository is at <https://git.scient.ing/infra/paperspec>.
It is version 0.1.0 and defines 32 formats; in [registry/formats.json](../registry/formats.json), 19 are `candidate` and 13 are `provisional`.
## Who it is for
| User | Example |
| --- | --- |
| One researcher | A thesis student, a science writer or fact-checker, a Wikipedia editor checking a citation, a scientist keeping a deep personal library. |
| An academic lab | A research group, a thesis committee, a journal club reading one annotated paper together. |
| A course | An instructor whose students learn to check whether a source supports a claim, with answers that are addresses and can be graded. |
| An industrial team | A computational chemistry or materials group that needs to show which passage of which paper each parameter came from. |
"Team" throughout means roughly five to twenty people with a few dozen to a few hundred papers that matter.
The design targets that scale: hundreds of documents (500 papers come to about a million and a half database rows).
## What the repository contains
The repository defines files and checks them.
It holds no application.
The formats are identified as `scienting-<name>/<major>`, such as `scienting-doc/1`.
That prefix is the formats' namespace.
It appears inside hashed data and test vectors, and it is separate from the repository's name.
| Folder | Holds |
| --- | --- |
| [spec/](../spec/README.md) | The specification, in 24 chapters (00 to 23). Normative. |
| [schemas/](../schemas/README.md) | 42 JSON (plain-text data format) Schemas for the files and records. |
| [registry/](../registry/README.md) | The list of formats, the rule IDs a checker reports, download-stamp rules, and default rights requirements. |
| [tools/](../tools/README.md) | Reference programs: `check.py` checks everything, `build.py` rebuilds the fixtures and vectors, `load.py` loads packages into SQLite, and `oracle/` is a compact implementation of every rule. |
| [vectors/](../vectors/README.md) | 25 files of test vectors: inputs and the exact outputs every implementation must compute. |
| [fixtures/](../fixtures/README.md) | Five valid example packages, one of them also as a zip, 31 deliberately broken ones that each break one named rule, example records, and the test keys that signed them. All text is synthetic. |
| [sql/](../sql/README.md) | Tables for SQLite, Dolt and PostgreSQL, and a SQLite bundle with full-text search. |
| [context/](../context/README.md) | The JSON-LD context that makes annotation layers W3C Web Annotations. |
| [docs/](README.md) | Guides, including this page. |
## Roles
The formats serve five roles.
A role is a job someone could implement.
The repository ships reference tools only for the checker and store roles.
| Role | Does |
| --- | --- |
| Reader | Opens a package, resolves addresses and anchors, and shows text, annotations and each passage's fidelity level. |
| Writer | Produces files in these formats: nodes, corrections, receipts, annotations, datasets. |
| Converter | Turns a witness (a PDF, JATS XML, the article format publishers use, a LaTeX source archive, an HTML page, an EPUB or a Typst project) into a package and raises doubtful readings as suspects (flagged disagreements awaiting review). |
| Checker | Recomputes hashes, validates files against their schemas and reports broken rules by rule ID. `tools/check.py` does this for the repository. |
| Store | Keeps packages and records in a database a team can clone. `tools/load.py` loads packages into SQLite. |
The [specification's reading paths](../spec/README.md) say which chapters each role needs.
## How a paper moves through the formats
1.
Acquire.
A witness arrives with a rights record that says how the team holds it and what that allows.
A witness is one file of one version of a paper, such as the publisher's PDF, identified by the SHA-256 hash of its bytes.
2.
Read and reconcile.
A converter reads the witness with one or more backends, aligns the readings sentence by sentence and compares them.
Each page gets a fingerprint with download stamps removed, and differently stamped downloads of one page are recognized as the same.
3.
Segment and mint.
Text is split into sentences.
Every node (a section, paragraph, sentence, figure, panel, caption, table, row, cell, equation, footnote or reference) gets a permanent ID and five content hashes.
A hash is a fixed-length fingerprint of content: change one character and it changes.
4.
Review.
Disagreements between readings become suspects with page crops.
A person or a model answers each as a correction, and the gate refuses any correction that changes a digit without image evidence.
In the example paper the first reading has a cell `3l0.0` where the page says `310.0`.
5.
Package.
The result is a package: a folder of canonical JSON files (JSON written in one fixed form, so equal content gives equal bytes) with a manifest whose hash pins the whole.
Five files are required (`MANIFEST.json`, `document.json`, `nodes.jsonl`, `witnesses.json`, `provenance.json`).
These are optional: `pages.jsonl`, `locations.jsonl`, `references.jsonl`, `corrections.jsonl`, `receipts.jsonl`, `ids.jsonl`, `suspects.jsonl`, `roster.json`, `assets/`, `datasets/` and `derived/` ([chapter 12](../spec/12-package.md)).
6.
Use.
A store loads the package into a database.
A reader renders it with layers of annotations.
Anchors (stored references to a sentence, with its hash and a quotation) let a claim, a dataset value or a draft's citation point at a passage.
Datasets, drafts, views, projects, exercises, checklists and the transparency log are `provisional` formats.
7.
Check and sign.
People proofread what matters and sign receipts; second reviewers spot-check them.
A passage is at level F3 (proofread) only while a valid receipt lists it at its current hash.
Every level counts only at the current text.
[The walkthrough](walkthrough.md) follows one paper through every step.
## Principles
| Principle | Means |
| --- | --- |
| Quality over quantity | A small corpus processed to a stated and checkable fidelity beats a large one processed to an unknown one. |
| Do the work once | Conversion, correction, segmentation and digitization are recorded and kept. A fresh conversion of the same input mints the same IDs. A different converter's reading is aligned with the established text: sentences the alignment pairs keep their IDs, and every difference becomes a suspect. |
| Address everything | Every node has a permanent ID and five content hashes. Table columns and figure-text items also have IDs. They are not nodes and have no five hashes. IDs encode no page, ordinal or kind; each is minted once from the document key, kind, text hash and occurrence, then frozen. |
| Keep source and commentary apart | What a source says is stored as the source said it. Everything people or models add is stored beside it and points at it. |
| Count only what was done | A level says how far something was checked, and it falls back when the checked content changes. |
| Models propose, people sign | Models may draft, segment, gloss and digitize, and a model's annotation stays `proposed` until a person confirms it. The proofread level comes only from a receipt signed by a named person. |
| The team owns its data | Packages are folders of JSON files, the database form is plain SQL tables, and every format is documented in the specification. A team can clone, read and keep its data without anyone's software. |
## How it compares
paperspec adds to existing standards and replaces none of them. [The comparison page](comparison.md) has the full account; five points follow.
- JATS is the NISO standard by which [publishers and archives exchange journal content](https://www.niso.org/publications/z3996-2024-jats).
Its [version 1.4 element list](https://jats.nlm.nih.gov/archiving/tag-library/1.4/) shows no sentence element.
A JATS file is an input here (witness kind `jats`).
- TEI has a [sentence-like element](https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-s.html) and [markup that keeps both readings of a correction](https://tei-c.org/release/doc/tei-p5-doc/en/html/ref-corr.html), and recommends `xml:id` pointers ["for durability in the presence of editing"](https://tei-c.org/release/doc/tei-p5-doc/en/html/SA.html). paperspec mints and retires IDs by rule and keeps corrections as a separate, evidence-gated record.
TEI is built for encoding scholarly text in general, including correction markup within a text.
- GROBID [converts PDFs to TEI](https://grobid.readthedocs.io/en/latest/Introduction/) and [reports F1 scores](https://grobid.readthedocs.io/en/latest/Introduction/) for its automatic reading.
Its output can be held as one reading, under witness kind `xml`.
- The W3C Web Annotation Data Model is [a Recommendation of 2017](https://www.w3.org/TR/annotation-model/).
Layers are Web Annotations, with a custom `AnchorSelector` followed by a standard `TextQuoteSelector` fallback.
The W3C model calls the `TextPositionSelector` ["very brittle"](https://www.w3.org/TR/annotation-model/) against changes to the resource, and the anchors here pin a hash instead.
For annotation in general, use the W3C model.
- Docling's [document schema](https://raw.githubusercontent.com/docling-project/docling-core/main/docs/DoclingDocument.json) refers to items by position (`#/texts/12`) and lists no per-item hash field.
Docling is a conversion toolkit that, [by its own abstract](https://arxiv.org/abs/2501.17887), uses AI models for layout analysis and table structure recognition. paperspec defines no converter.
The formats are at version 0.1.0, the repository names no outside adopter, and the reference tools belong to the same repository.
The formats do not replace publisher interchange formats.
They also do not fix what a converter reads wrongly; they record it and make it checkable.
## What it is not
It is not a search engine over all literature, a citation index, a recommendation feed or a chat-with-any-PDF tool.
Tools may import from Crossref, OpenAlex, PubMed Central or arXiv, and none should depend on them to work.
## Where next
- [Concepts](concepts.md) explains each idea with an example.
- [The specification](../spec/README.md) defines each format exactly.
+320
View File
@@ -0,0 +1,320 @@
# Rationale
Each choice below is one a reader is likely to question.
The specification states the rule, and this page gives the reason.
This page is for newcomers, implementers and experts.
Newcomers find each term defined where it first appears.
Implementers find the chapter that defines each rule.
Experts find the cost of each choice and, where a neighboring standard chose differently, how it differs (the full comparison is in [comparison.md](comparison.md)).
The formats are at version 0.1.0.
Of the 29 in `registry/formats.json`, 19 are `candidate` and 13 are `provisional`, and the provisional ones are named where they appear.
The repository is paperspec, at <https://git.scient.ing/infra/paperspec>.
The `scienting-` prefix in format names such as `scienting-anchor/1` is the formats' namespace, separate from the repository's name.
## Identity
### IDs carry no meaning
Every sentence, cell and other node has an ID, a short name that other records use to point at it.
An ID that encoded a page, an ordinal or a kind would change when a converter orders blocks differently, or when a paragraph turns out to be a caption.
An ID is minted once from the document key, the node's kind, the hash of its text and an occurrence count that separates identical texts, and is then frozen ([spec/04 §4.2](../spec/04-identity.md#42-minting-node-ids)).
A reclassification leaves it as it was, and a fresh conversion of the same input mints the same IDs.
A different converter mints different ones for some sentences: those the alignment pairs with the established reading keep their IDs, and every difference becomes a suspect for review ([spec/05 §5.6](../spec/05-hashes.md#56-alignment)).
A content address such as an [IPFS content identifier](https://docs.ipfs.tech/concepts/content-addressing/) or a [Software Heritage identifier](https://www.swhid.org/specification/v1.2/5.Core_identifiers/) is a function of content at all times.
That suits immutable data and archived source code.
Any correction would rename the sentence.
Here the ID is derived from content once and kept apart from the content hashes, so the pair of ID and hash says whether the text changed.
The cost is that two conversions that read a sentence differently by one character mint different IDs for it.
### IDs never move, and retired IDs leave a trail
Everything a team builds points at IDs: notes, claims, dataset values, citations in drafts.
A merge records its successor, a deletion records that there is none, and legacy IDs live on as aliases, all in `ids.jsonl` ([spec/04 §4.3](../spec/04-identity.md#43-permanence-retirement-and-aliases)).
### Work keys carry a hash
A citation key such as `vaswani2017attention` is what readers say, and it collides: a preprint and its published version, or two papers by one first author in one year with the same first title word, would share it.
Four characters of a hash of the work's identity, its DOI when it has one, settle the collision and let any tool holding the DOI recompute the key.
The key is minted once and never recomputed, so a corrected title cannot change a name someone has cited; when two works still share four characters, the later one gets six ([spec/02 §2.4](../spec/02-model.md#24-work-and-document-keys)).
The rule is the one the studio's reading-list tool already uses, so a paper keeps its key from the reading list to the store.
### Identifiers are tag URIs
Layers, annotations and documents name themselves with `tag:scient.ing,2026:` URIs (RFC 4151) rather than `urn:` names, because a URN namespace must be registered with IANA and this one is not.
A tag URI needs only a domain and a date, and these identifiers sit inside hashed annotations, so the cheap time to choose was before release.
### Revisions are counted, not timed
Anchors are made on different machines and packages are imported later, and clocks disagree.
A correction index does not disagree with itself.
A document's revision is the index of its last correction ([spec/06 §6.2](../spec/06-anchors.md#62-the-anchor), [spec/11](../spec/11-corrections.md)).
## Hashes and projections
A hash is a fixed-length fingerprint of data: equal data gives equal hashes, and any change gives a different one.
Every hash here is SHA-256 ([spec/01 §1.3](../spec/01-conventions.md#13-hashes)).
A projection is a rewritten form of a text, made only to be hashed.
### Canonical JSON
Canonical JSON is JSON (JavaScript Object Notation, a text format for structured data) written in exactly one way, so equal data always hashes the same.
The formats use the JSON Canonicalization Scheme, [RFC 8785](https://www.rfc-editor.org/rfc/rfc8785) (an RFC, or Request for Comments, is a numbered Internet standards document), which requires numbers to be IEEE 754 doubles (IEEE is the Institute of Electrical and Electronics Engineers) (the standard binary floating-point numbers), and add one rule: a decimal that carries meaning is a string, so `310.0` and `1.5260` keep their printed digits ([spec/01 §1.1 and §1.2](../spec/01-conventions.md)).
The cost is that a reader must treat those strings as decimals itself.
### Five values, not one
A text node carries five values ([spec/05 §5.1](../spec/05-hashes.md#51-the-five-values)), because no single hash does all of their jobs.
- Quotations need every character, so `text_hash` covers the normalized text.
- Certifying that two witnesses agree needs notation folded but structure kept, which is `match_hash`.
A witness is one file the text was read from.
- Proposing that two sentences are the same needs something looser still, which is `align_key`.
- Containers need a hash of their own content, `own_hash`, apart from the `node_hash` that also covers what they hold.
Table columns and figure-text items have IDs but are not nodes, so they carry no hashes ([spec/09 §9.1](../spec/09-figures-tables-equations.md)).
### Only the strict projection certifies
OCR (optical character recognition, which reads text from page images) drops superscripts.
A projection loose enough to match "103" with 10³ would certify an error, because the printed value is 1000 and the reading is 103.
The lossy key may propose that match.
Only the strict hash may accept it, and then only when the complex-math keys agree too ([spec/05 §5.3](../spec/05-hashes.md#53-the-strict-projection)).
### Citation marks stay marked in the strict projection
"10" followed by citation 3 would agree with the text "103" without the marks.
### Decimal points and commas count as simple notation
Simple math is rewritten to one linear form that can match plain text; anything else is complex and is compared by its source. `$-1.5$` in a LaTeX source would be complex math without the two characters, and could never agree with "−1.5" in the PDF ([spec/05 §5.4](../spec/05-hashes.md#54-simple-notation)).
### A hyphen or en dash before a digit is a minus sign in the strict projection
Text layers and OCR disagree about dashes in "10–20" and "−5".
Folding them before digits makes witnesses agree without touching a dash inside a name such as "CT–CT".
### The lossy key deletes whitespace and dashes
OCR merges and splits words and line-break hyphens, and a key that only proposes alignments should forgive that.
It also folds case ([spec/05 §5.5](../spec/05-hashes.md#55-the-lossy-projection)).
### Offsets index the stored text, and structural hashes cover it exactly
An offset counts Unicode code points, the numbered characters of Unicode, into the node's stored plain text ([spec/01 §1.5](../spec/01-conventions.md#15-character-offsets)), and own content is hashed as stored.
Every stored offset is still exact when `node_hash` is unchanged, and a renderer can slice the stored text without normalizing it first.
Only the three text values, `text_hash`, `match_hash` and `align_key`, normalize.
### The character data is pinned to one Unicode version
Normalization and General Categories change between Unicode versions, and both enter every hash.
The chapters pin Unicode 16.0, the reference tools refuse to run on another version, and moving to a later one is a change to every text-hashing format ([spec/01 §1.4](../spec/01-conventions.md#14-text-normalization-for-hashing)).
### Hashes that leave the team are keyed
A plain hash of "310.0" is recovered by hashing guesses, and overlapping anchors can rebuild passages.
Inside a team, plain hashes are fine.
An export to another machine of the team uses an HMAC (hash-based message authentication code), a hash that needs a secret key, under the team key.
A public layer, or any export of a work whose text is withheld, uses a key derived from the paper's own page fingerprints, which only someone holding the paper can compute ([spec/05 §5.8](../spec/05-hashes.md#58-keyed-hashes)).
## Anchors
An anchor is a stored pointer to a node or to a quoted span inside it, with enough context to find it again after the text changes ([spec/06](../spec/06-anchors.md)).
The [World Wide Web Consortium (W3C) Web Annotation model](https://www.w3.org/TR/annotation-model/) also anchors with quotations: its `TextQuoteSelector` takes `exact`, `prefix` and `suffix`, and its `TextPositionSelector` is described there as very brittle.
An anchor here keeps the quote with up to 32 code points of prefix and suffix and adds hashes, so resolution has exact outcomes (`current`, `changed-below`, `moved`, `reattached`, `stale`).
Hypothesis, in [its description of its own anchoring](https://web.hypothes.is/blog/fuzzy-anchoring/), matches fuzzily.
Annotation layers use a custom `AnchorSelector` followed by a standard `TextQuoteSelector` fallback for tools that do not know ours ([spec/18 §18.3](../spec/18-layers.md)).
The cost is a selector type no generic tool defines.
For annotation in general, the W3C model is the better choice.
### Every anchor carries `own_hash`, and anchors on containers without content carry their leaves
Telling a relabel from a real change needs the anchored `own_hash`.
Deciding whether a merged paragraph still holds "at least half" of what was anchored needs the original leaves.
### Long quotations become a hash and a length
Quotations over 200 code points are replaced by a hash and a length, which keeps anchors small and limits how much text an anchor carries.
A hashed window can still be found again in the node.
### Prefix and suffix pick between repeated quotes
"The value" may occur twice in a sentence.
The context around it decides which one was meant.
### `changed-below` reports drift
A note on a section stays valid when a typo inside it is fixed.
By default the drift is `high` once the leaves touched by corrections since the anchor was made exceed a quarter of the leaves involved, and the note is then flagged for review ([spec/06 §6.6](../spec/06-anchors.md#66-drift)).
### A row's header path is not hashed
Rows have no content of their own, and a row's `header_path` is not part of it.
Inserting a dropped row-group header does not stale the anchors on every cell beneath it ([spec/09 §9.2](../spec/09-figures-tables-equations.md)).
## Corrections
### Corrections are appended, never edited
A document's history is its first reading plus its corrections, so anyone can see what changed, when and why, and on what evidence ([spec/11](../spec/11-corrections.md)).
### Corrections include a `set` operation
Readings drop spans, roles and header paths, not only words, and those need a correction too.
### Applied corrections record what they touched
Drift is computed from the records alone, with no need to replay history, because each record carries `path`, `to_path` and `touched` ([spec/11 §11.3](../spec/11-corrections.md#113-applied-fields)).
### The history has a root
Corrections are append-only in principle, but nothing in a package proved that a later revision extends an earlier one rather than rewriting it.
A Merkle root over the corrections in `document.json`, with RFC 9162 consistency proofs between revisions, does ([spec/11 §11.5](../spec/11-corrections.md#115-the-history-root)).
### Digits need image evidence
A wrong digit changes a result without looking wrong, so no digit changes without a crop of the page as evidence, and no leaf outside the correction's `touched` list may end up with different digits ([spec/11 §11.4](../spec/11-corrections.md#114-the-gate)).
## Geometry
### Pages have fingerprints
Publishers stamp each download, so file hashes cannot identify a paper across teammates' copies.
Fingerprints with the stamps removed can ([spec/07 §7.1](../spec/07-geometry.md#71-page-fingerprints)).
### Fingerprint text deletes whitespace entirely
PDF text extractors disagree about where to insert spaces, and the fingerprint must come out the same in any two implementations.
## Review
### People sign receipts
Nobody signs three thousand times, so one signature covers a Merkle root of everything reviewed in a sitting.
A Merkle tree hashes items in pairs, then those hashes in pairs, up to one root, and allows a proof that one node was covered without revealing the others.
The receipt tree follows [RFC 6962](https://www.rfc-editor.org/rfc/rfc6962), whose replacement [RFC 9162](https://www.rfc-editor.org/rfc/rfc9162) defines the same tree.
The specification makes a receipt with no items invalid, where the RFC hashes the empty list ([spec/08 §8.5](../spec/08-fidelity.md#85-merkle-roots)).
The tree is not the one behind `node_hash`, which hashes each node's `own_hash` with its children's `node_hash` values.
### Spot-check seeds are VRF proofs
A seed the reviewer could influence could be ground until the sample fell on careful work, and a seed the checker could vary could be ground by the checker.
An earlier draft used the checker's Ed25519 signature and called it unchoosable because signing is deterministic; that holds only for an honest checker, since a verifier accepts any valid signature and a dishonest one can sign with any nonce.
A verifiable random function (RFC 9381) has exactly one valid proof for a key and an input, which is the property the rule needs, and its keys are ordinary Ed25519 keys, so the roster needs nothing new.
Anyone can verify the proof and recompute the sample ([spec/08 §8.8](../spec/08-fidelity.md#88-spot-checks)).
### A receipt can be proven without being shown
The receipt tree follows RFC 9162 so that an inclusion proof, a dozen hashes, shows a buyer that one cell was proofread without handing over the receipt or the other nodes ([spec/08 §8.5](../spec/08-fidelity.md#85-merkle-roots)).
A transparency log of receipts, revocations and rosters ([spec/23](../spec/23-log.md)) uses the same tree and the checkpoint format transparency logs share, so that a receipt's time and the roster that governed it stop being self-asserted.
### Error rates are reported as bounds
One clean sample of ten proves little.
A one-sided Clopper–Pearson upper bound, by default at confidence 0.95, across all of a reviewer's samples says what can be claimed.
With no errors it is about 3 divided by the number sampled ([spec/08 §8.9](../spec/08-fidelity.md#89-reviewer-error-bounds)).
### Levels fall back
A node counts as proofread only through a valid receipt that lists it at its current `node_hash`, so a correction never leaves a stale "proofread" behind ([spec/08 §8.1](../spec/08-fidelity.md#81-levels-of-fidelity)).
## Rights
### Rights are recorded per witness
What a team may do depends on how it obtained the paper: a subscription, a mining license, an open license, its own work.
### AI uses have two axes
Reviewers ask whether a model may see the text, where it runs, and whether the text is kept there.
The record names a purpose, `internal` or `external` depending on whether results leave the organization, and a processor: `local`, `tenancy`, `outside-no-retention` or `outside` ([spec/14 §14.1](../spec/14-rights.md#141-the-rights-record)).
### Unknown means no
A stage whose rights are unknown does not run.
A project owner settles the question with a signed policy, so the decision is the team's and is on the record.
A policy fills in unknowns and never overrides an explicit answer.
A project setting can turn the refusal into a warning.
The refusal is the default, and the project format is `provisional` ([spec/20](../spec/20-projects.md)).
### Backend licenses are part of the gate
A converter's code and its model weights can be licensed differently, and the weights may exclude commercial or competing use.
A condition whose answer is unknown counts as not met ([spec/14 §14.4](../spec/14-rights.md#144-backends-and-profiles)).
## Packages and databases
### Canonical JSON, one record per line
A corrected sentence is a one-line diff, and every file has exactly one valid byte sequence, so a hash of the manifest pins the whole package ([spec/01 §1.9](../spec/01-conventions.md#19-files), [spec/12 §12.3](../spec/12-package.md#123-the-manifest)).
A [Frictionless Data Package](https://datapackage.org/standard/data-package/) lists resources with an optional `hash` that defaults to MD5 (an older hash function).
The package manifest here lists every other file with SHA-256 and size.
The dataset format, which is `provisional`, is a Data Package with units, uncertainty, an origin and anchors to the printed values added ([spec/15](../spec/15-datasets.md)).
Two neighboring standards cover other parts of this ground, RO-Crate and the PROV Ontology.
[RO-Crate](https://www.researchobject.org/ro-crate/) describes research data with schema.org annotations in JSON-LD, and it is the better choice for general description and discovery.
No mapping between it and these packages is defined.
Provenance is a plain `provenance.json` of tools, backends, cached readings and stages.
It is not the [PROV Ontology](https://www.w3.org/TR/prov-o/), which other systems can query generically.
### Checks-only packages drop everything that carries text
Corrections carry their find and replace strings, datasets carry values, suspects carry the readings compared, and figure text and reference records carry text.
A checks-only export omits them all, withholds the content of every leaf, and keys its hashes ([spec/12 §12.5](../spec/12-package.md#125-text-policies)).
### SQL avoids reserved words in every engine
The same tables run on SQLite, Dolt (MySQL-compatible) and PostgreSQL, and no name is a word reserved in any of the three.
The formats' `key`, `index`, `at`, `by`, `before` and `after` become `doc_key`, `idx`, `made_at`, `signer`, `before_hash` and `after_hash` ([spec/13 §13.1](../spec/13-database.md#131-portability)).
### Loading and unloading are exact inverses
A team can keep its documents in a database and still hand anyone the package, byte for byte.
The conformance suite checks this for every fixture ([spec/13 §13.3](../spec/13-database.md#133-load-and-unload)).
## Questions the formats leave open
These are settled for now, and a future version may revisit them.
| Question | Current answer |
| --- | --- |
| Should node IDs carry a kind prefix, such as `s-k3m9q2a`, to help people debugging? | No: a reclassified node keeps its ID, so a prefix would become wrong. |
| Should `text_hash` normalize Unicode, or only collapse whitespace? | Both: Unicode Normalization Form C, then whitespace collapsed to single spaces and trimmed ([spec/01 §1.4](../spec/01-conventions.md#14-text-normalization-for-hashing)). |
| How long may a quotation in an anchor be? | 200 code points. |
| How is complex math compared? | By its source, run by run; comparing canonical MathML is a possible later addition. |
| What extension and media type do zipped packages use? | `.sct.zip` and `application/vnd.scienting.doc+zip`. |
| Which drift threshold, spot-check rate and digit rule should teams use? | By default, drift is high above a quarter of the leaves involved, and spot-checks sample 5% of a receipt's nodes, at least ten. The digit rule is `all`, `anchored-sections` or `none`; each is set per project. |
| How should rights combine when a document comes from witnesses held on different bases? | The most restrictive witness governs each use. |
## Looking ahead
Choices made so that the formats still serve in the 2030s, and the ones deliberately left open.
- `ml-dsa-65` (FIPS 204) is a signature scheme a receipt may carry today, with a pure-Python reference implementation that reproduces NIST's test vectors, so a team can sign with a post-quantum key before Ed25519 is deprecated and verify such receipts decades on.
`cose` is reserved for the IETF's SCITT transparency services; a consumer treats an unimplemented scheme as invalid, so adopting it is a minor version ([spec/08 §8.4](../spec/08-fidelity.md#84-record-hashes-and-signatures)).
- Every hash is SHA-256, and `document.json` names the function, so a later algorithm is a new major version that can share a store with this one rather than a silent reinterpretation ([spec/01 §1.3](../spec/01-conventions.md#13-hashes)).
- A roster key may carry its `did:key`, which the public key determines, so a signer has one name inside and outside the store ([spec/08 §8.7](../spec/08-fidelity.md#87-revocations-and-the-roster)).
- A model that proposes a correction or an annotation is named by its weights, instructions and parameters by hash, and by where it ran ([spec/11 §11.2](../spec/11-corrections.md#112-every-correction-records)).
- The transparency log has a static tile layout, witnesses in the roster, and an acceptance rule in the project's settings; what remains is to run one ([spec/23](../spec/23-log.md)).
- The VRF reference implementation proves in about 5 ms and verifies in about 4 ms in plain Python, which is fine for fixtures and small logs; a production verifier can use any RFC 9381 library, since the proofs are the standard's bytes.
## Known limits
- Notation drops spaces and text keeps them, so `$T = 300$` from a LaTeX source and "T = 300" from a PDF disagree, and become a `word` suspect for review.
- Page fingerprints are computed from extracted text lines.
Two implementations that should agree on fingerprints must extract lines the same way.
- The formats are built for a team-scale corpus of hundreds of documents.
They do not replace publisher interchange formats, and they do not fix what a converter reads wrongly.
They record it and make it checkable.
+185
View File
@@ -0,0 +1,185 @@
# Walkthrough: one paper, start to finish
This guide follows the example paper `hale2026harmonic-damb` from a flawed first reading to a corrected, reviewed and signed document.
The paper is synthetic, written for the fixtures.
Its problems are modeled on the failures that the specification's rules address.
Three readers can use the guide, and each gets something different.
A newcomer knows what a paper and a citation are, not hashes or JSON, so every term is defined where it first appears.
An implementer who will write a reader, writer, converter or checker gets the chapter and test vector for each step.
An expert gets the status: [paperspec](https://git.scient.ing/infra/paperspec) is at version 0.1.0, and each format is `candidate` or `provisional` in [`registry/formats.json`](../registry/formats.json) (19 candidate, 13 provisional).
The `scienting-` prefix on format names, as in `scienting-doc/1`, is the formats' namespace.
It has nothing to do with the repository's name.
Open [fixtures/packages/hale2026harmonic-damb/](../fixtures/packages/hale2026harmonic-damb/) beside this page, because every ID below is in it.
A package is a folder of files, mostly JSON Lines (`.jsonl`: one JSON record per line).
The hand-written source of the first reading is [fixtures/src/hale2026harmonic.json](../fixtures/src/hale2026harmonic.json); no converter ran on it, and [`tools/build.py`](../tools/build.py) expands it into the package.
Each step says what a converter, a person or a checker does.
## 1. A PDF arrives
The team downloads the publisher's PDF.
The file becomes a witness, identified by its SHA-256 (a 64-digit hash that changes if any byte changes), with the short ID `qptsanv` ([spec/02](../spec/02-model.md)).
A person records its rights, meaning what the team may do with the file ([spec/14](../spec/14-rights.md)).
The library's subscription allows reading, text mining, and AI processing on the team's own machines for internal use, until August 31, 2027.
Whether it allows processing in the team's cloud is unknown.
The publisher stamped the download in the margin with the institution and the time, so two downloads rarely share a SHA-256.
A page fingerprint avoids the problem of downloads that differ in their stamps.
It is a hash of a page's text, size and images after the stamp lines are removed ([spec/07](../spec/07-geometry.md)), and the rules `downloaded-via` and `sharing-guidelines` fired on both pages (see [`pages.jsonl`](../fixtures/packages/hale2026harmonic-damb/pages.jsonl)).
Page 101's fingerprint is `6272e6f3…` in this copy, stamped October 11, 2026, and in a second download from another institution, stamped March 2, 2027 ([vectors/fingerprints.jsonl](../vectors/fingerprints.jsonl)).
## 2. The first reading, with its mistakes
A converter reads the PDF into sections, paragraphs, sentences, a figure, a table, an equation, a footnote and references.
Each of these is a node, and each node gets a permanent ID: seven characters minted once from the document key, the node's kind, a hash of its text and an occurrence count, then frozen ([spec/04](../spec/04-identity.md)).
An ID encodes no page, order or kind, so it keeps naming the node after the text is corrected.
Like every reading, this one has mistakes:
| What the reading did | What the page says |
| --- | --- |
| A cell read `3l0.0`. | `310.0`, with the digit 1. |
| A sentence read `Values below 10-3 kcal mol⁻¹…`. | A superscript: 10⁻³. |
| Two sentences ran together: "…treated as zero. Table 1 lists…". | Two sentences. |
| One sentence was cut in two at a line break: "…and the energies were" and "fitted by least squares." | One sentence. |
| A paragraph was split at a column break. | One paragraph. |
| The running head "J. Example Chem. 2026, 14, 101–109" became a paragraph. | A running head, not text. |
| The equation's number read `(l)` and the figure's `Figure l`. | `(1)` and `Figure 1`. |
| The CT–HC row merged two cells into "338.7 1.0900". | Two cells. |
| The OW–HW row was missing. | It is there. |
| "Set B" spanned one column. | It spans two. |
The converter does not guess.
Each doubtful place becomes a suspect, with a crop (an image cut from the page) for a person to answer ([spec/05 §5.7](../spec/05-hashes.md)).
Unresolved suspects travel in `suspects.jsonl`, which this package does not need.
Nothing changes until a correction passes the gate ([spec/11](../spec/11-corrections.md)).
## 3. Twelve corrections
Each fix is appended to [`corrections.jsonl`](../fixtures/packages/hale2026harmonic-damb/corrections.jsonl), numbered, with its evidence (a crop, or a person who read the page), its author (`ana` throughout) and its reason.
| # | Operation | On | What it did |
| --- | --- | --- | --- |
| 1 | `replace` | cell `c20cna6` | `3l0.0` to `310.0`. A digit changed, so the gate required a crop, and it has one. |
| 2 | `replace` | sentence `ec5jc93` | `10-3` to the runs `10` and superscript `−3`. |
| 3 | `split` | sentence `ec5jc93` | Split before "Table 1"; the first part keeps `ec5jc93`, the second is new: `a4jrz2t`. |
| 4 | `merge` | sentence `xjns57z` | Joined with `ayea71r`, which is retired with `xjns57z` as its successor. |
| 5 | `merge` | paragraph `gwzbj3s` | Joined with `ncx2v4f`, retired the same way. |
| 6 | `delete` | paragraph `v8e4z6z` | The running head is gone; its IDs are retired with no successor. |
| 7 | `relabel` | equation `tkxsmts` | `(l)` to `(1)`. |
| 8 | `delete` | row `rncchma` | The garbled CT–HC row and its four cells. |
| 9 | `insert` | row `kx2kz2y` | The CT–HC row, read again: five new cells. |
| 10 | `insert` | row `ke0jxpn` | The missing OW–HW row. |
| 11 | `set` | cell `xyy7x6c` | Set B's `colspan` from 1 to 2. |
| 12 | `relabel` | figure `v7cx6qs` | `Figure l` to `Figure 1`. |
The document is now at revision 12.
No uncorrected cell, sentence or row changed its ID or its hashes.
Only corrected nodes and their ancestors got new `node_hash` values; the sentence `rr20tev` is one of the ancestors, because it holds the relabeled equation.
Inserting a row adds a row node.
The table's own hash (`own_hash`) covers only its label and column definitions, so every other cell, and every value already taken from them, is untouched.
## 4. IDs that never move
The sentence about water is still `hca6dc5` after twelve corrections, the corrected cell is still `c20cna6`, and the sentence that lost its superscript is still `ec5jc93`.
The retired IDs are recorded in [`ids.jsonl`](../fixtures/packages/hale2026harmonic-damb/ids.jsonl), so anything that pointed at them can follow the trail.
Legacy aliases are recorded there too: `b-p01-text-003`, the ID an older tool gave the water sentence, still leads to `hca6dc5`.
A fresh conversion of the same input mints the same IDs.
A reading by a different converter is aligned with this document sentence by sentence ([spec/05 §5.6](../spec/05-hashes.md), pinned by [vectors/alignment.jsonl](../vectors/alignment.jsonl)).
Sentences the alignment pairs keep their IDs, and every difference becomes a suspect rather than a silent change.
Sentences it cannot pair are recorded as dropped or added.
## 5. What happened to the notes
An anchor is the stored pointer behind a note or citation.
It holds a node's ID, the node's hashes when the anchor was made, the revision, and, for part of a sentence, the quoted words with context ([spec/06](../spec/06-anchors.md)).
The team had already made seventeen anchors pointing into the first reading at revision 0, before any correction.
Resolving an anchor gives one of five results:
- `current`: nothing changed.
- `changed-below`: the node is unchanged, and something under it changed.
- `moved`: the node was merged into a successor that still holds the quote.
- `reattached`: the node changed, and the quote or the cell's headers now find exactly one place.
- `stale`: nothing is found, so a person must look.
A `changed-below` result carries a drift, the share of the leaves under the node, counting retired ones, that corrections touched.
Above a quarter the drift is `high`.
The table shows how each anchor resolves at revision 12 ([vectors/resolve.jsonl](../vectors/resolve.jsonl) records them all).
| Anchor on | Result | Why |
| --- | --- | --- |
| "H$_2$O" in the water sentence | `current` | Nothing in that sentence changed. |
| The cell `1.5260` | `current` | Untouched, though its table changed around it. |
| The water sentence, through the alias `b-p01-text-003` | `current` | The alias leads to the same node. |
| The cell that read `3l0.0` | `stale` | Its text changed and "3l0.0" is no longer in it; a person must look again. |
| "treated as zero" | `reattached` | The sentence changed twice, and the quote occurs in it exactly once, so the anchor is re-pinned. |
| "fitted constants" | `stale` | After the split, those words are in the new sentence `a4jrz2t`, not in `ec5jc93`. |
| "least squares", in the half-sentence `ayea71r` | `moved` | That ID was merged into `xjns57z`, which still holds the quote. |
| The paragraph `ncx2v4f` | `moved` | Merged into `gwzbj3s`, which holds all of its sentences. |
| The running head | `stale` | Deleted, with no successor. |
| The equation | `reattached` | Only its number changed. |
| The figure | `reattached` | Only its label changed, by a `relabel`. |
| The CT–HC cell `1.090` in the garbled row | `reattached` | Its row was deleted, and exactly one cell in Table 1 has the same row and column headers and the same text: the new `b5gd0h1`. |
| Section 2 | `changed-below`, drift high | The section itself is unchanged, and 53% of what it holds or held was touched. |
| Table 1 | `changed-below`, drift high | Rows were replaced and added. |
| The table body | `changed-below`, drift high | 75% of the cells it holds or held were touched. |
| The paragraph whose broken sentence was rejoined | `changed-below`, drift high | Two of the three sentences it has held were touched. |
| The CT–CT row | `changed-below`, drift low | One of its five cells was corrected. |
A reader shows each note by its result.
A checker of exact words accepts only `current`, `moved` and `reattached`.
The [W3C Web Annotation Data Model](https://www.w3.org/TR/annotation-model/) is the general W3C Recommendation for annotating web resources. paperspec's annotation layers build on it, with a custom `AnchorSelector` followed by a standard `TextQuoteSelector` as a fallback.
It has no permanent IDs for sentences inside the source, no hashes of the target text, and no results such as `moved` or drift.
See [comparison.md](comparison.md).
## 6. Review and signatures
A receipt is a signed record that a person compared a set of nodes with the page.
It lifts a node to F3, the top fidelity level (F0 is one reading; F1, every doubtful place answered; F2, an independent witness agrees) ([spec/08](../spec/08-fidelity.md)).
One signature covers a Merkle tree, a hash over everything reviewed in a sitting, built as in RFC 6962 (a Request for Comments standard; replaced by [RFC 9162](https://www.rfc-editor.org/rfc/rfc9162), which defines the same tree).
The receipts are in [`receipts.jsonl`](../fixtures/packages/hale2026harmonic-damb/receipts.jsonl), and the keys that signed them in [`roster.json`](../fixtures/packages/hale2026harmonic-damb/roster.json).
- **Before the corrections**, `ana` had signed receipt `npc15pn6675z5` for three cells at revision 0.
Two of them never changed, so the receipt still counts for them.
For the corrected cell it no longer counts, because the cell's hash moved on.
- After the corrections, `ana` signs `y2zw8ctg5s8dp` at F3 for 23 nodes: the cells of Table 1's three data rows (15), its four column headers, the equation, and three sentences (`ec5jc93`, `hca6dc5` and `rr20tev`, the one holding the equation).
`ben` spot-checks it with receipt `mg18668nzxvap`.
His signature, made with his separate spot-check key `ben-spot`, picks 10 nodes nobody could have chosen, and he finds no errors.
- `ana` signs `mvjmb94nz7rdh` for two sentences of section 1, including the new `a4jrz2t`.
- `cara` signs `q465jpwz8afhe` for three sentences on page 2, then revokes it herself (`pcbhtpwvysgq6`) because she had compared them with the crops of another paper.
Those sentences fall back to their earlier levels, which is why `xjns57z` is still F0.
- `ana` signs `gx2s84z9jf9xv` for the figure's three caption sentences. `ben`'s spot-check `yt70fcc3qm0xb` finds a missing period in `caehhp6`, which suspends the receipt until she reviews the sitting again and signs a new one.
The document's report, in [`document.json`](../fixtures/packages/hale2026harmonic-damb/document.json), counts the result over 45 leaves: 27 at F3, 13 at F2, 4 at F1 and 1 at F0.
The 27 are the 23 nodes of `y2zw8ctg5s8dp`, the 2 of `mvjmb94nz7rdh`, and 2 of the 3 caption sentences.
Those two still count because Ben's spot-check is itself a valid receipt, and he compared them with the page and found them right.
The third, `caehhp6`, stays at F2: a spot-check never raises a node it found in error ([spec/08 §8.2](../spec/08-fidelity.md#82-levels)).
## 7. Data out of the table
Table 1 becomes a dataset, `ds-hale-bond-params`, inside the package ([spec/15](../spec/15-datasets.md)).
It is a [Frictionless Data Package](https://datapackage.org/standard/data-package/) with units, uncertainty and an origin added, and the format is `provisional`.
Its CSV keeps every digit as printed (`1.526` and `1.5260` stay different), and every value has an anchor to the cell that prints it, so a claim that rests on a value can show the cell.
The descriptor types the fields as numbers; how a generic Data Package tool treats `1.5260` was not verified.
All twelve value anchors resolve as `current`.
The reference checker, [`tools/check.py`](../tools/check.py), confirms each CSV value equals its cell's text.
## 8. Sharing without the text
The team wants to move its notes to another of its own machines without copying the paper there.
[`hale2026harmonic-damb.checks-only`](../fixtures/packages/hale2026harmonic-damb.checks-only/) is the same document with every leaf's text withheld and every hash replaced by an HMAC under the team's key ([spec/12 §12.5](../spec/12-package.md), [spec/05 §5.8](../spec/05-hashes.md)).
An HMAC is a hash mixed with a secret key.
Anyone can recover a plain hash of a short text such as "310.0" by hashing guesses; a keyed hash resists that.
Corrections, receipts, the roster and the dataset are left out too.
IDs, labels, pages and boxes survive, so annotations still land in the right place.
Only someone holding the key and the text can check the values.
The team key suits an export between the team's own machines.
An export to a collaborator outside the team would use a key derived from the pages of the paper instead, so that only someone holding the paper can check it.
## 9. Recompute, print and query the package
[The examples](examples.md) show how to recompute one of these hashes with `sha256sum`, print the outline with a few lines of Python, and load the whole package into SQLite to query it.
+112
View File
@@ -0,0 +1,112 @@
# Fixtures
A reader, writer, converter or checker of stored papers needs files to test against, and a newcomer needs examples of what a stored paper looks like.
This folder holds that example data of paperspec (<https://git.scient.ing/infra/paperspec>), version 0.1.0.
All text is synthetic, written for these files and dedicated CC0; license fields inside the fixtures describe fictional works.
Three readers use these files.
A newcomer learns what a stored paper looks like and what can go wrong with one.
An implementer, who writes a reader, writer, converter or checker, tests it against the files.
An expert reviewing the work finds which cases the tests pin and what the published keys do and do not prove.
Each format here has the status `candidate` or `provisional` in `registry/formats.json`.
A hash is a fixed-length fingerprint of data: any change to the data changes it.
The hash used here is SHA-256, written in hexadecimal.
A package is one document stored as a folder of files, with a manifest listing every file and its hash.
A node is an addressable part of a document, such as a section, a sentence or a table cell.
A witness is a source file a reading came from, such as a PDF.
A receipt is a signed statement that a named person reviewed listed nodes.
## Packages
Each package under `packages/` is a valid document.
A conforming reader accepts each one and recomputes every hash it contains.
| Package | What it is for |
| --- | --- |
| `packages/hale2026harmonic/` | The main example, followed step by step in [the walkthrough](../docs/walkthrough.md): a chemistry paper that was read once with mistakes and then fixed by twelve corrections. It has a table with two levels of column headers and grouped rows, an equation inside a sentence, a footnote, a figure with text inside its panels and a real image, references, legacy aliases, boxes on fingerprinted pages, receipts in every state (counting, partly invalidated, spot-checked, revoked and suspended), the roster of public keys that checks their signatures, a dataset taken from the table, and derived MathML. |
| `packages/hale2026harmonic.checks-only/` | The same document prepared for sharing within the team: text withheld, every hash an HMAC (a hash computed under a secret key) under the team key. The team key is derived from the team secret in `keys/` ([spec/05](../spec/05-hashes.md), [spec/12 section 12.5](../spec/12-package.md#125-text-policies)). It shows how a team can share its checks on a paywalled paper without sharing the paper. |
| `packages/okafor2025open/` | An open-access paper established from a JATS file (an XML format for journal articles) and a PDF that agree, so every leaf is at fidelity F2, corroborated by an independent witness. |
| `packages/smithlab2027charges/` | A short draft written in Typst (a typesetting language). One of its sentences holds a cross-reference whose target is the address `hale2026harmonic#a4jrz2t`, a sentence of the main example. |
| `packages/tiny2026example/` | A small document, the starting point of the correction vectors (`vectors/corrections.jsonl`) and of every broken package below. |
| `packages/tiny2026example.sct.zip` | The same document as a zipped package, written the way a producer makes a byte-identical archive: entries under one folder named by the key, sorted by path, stored, dated 1980-01-01, with no extra fields ([spec/12 section 12.2](../spec/12-package.md#122-paths)). A reader unpacks it to exactly the folder beside it. |
## Records
`records/` holds a valid example of every other format that is a JSON file of its own.
Three formats have their example elsewhere: the stage requirements (`scienting-stages/1`) and the stamp rules (`scienting-stamps/1`) are in [registry/](../registry/README.md), and a bundle (`scienting-bundle/1`) is a SQLite file that `tools/load.py --bundle` builds from the packages.
Each record is a single file, or a folder where a format needs several files.
| Files | What they are for |
| --- | --- |
| `anchor-span.json`, `anchor-leaf.json`, `anchor-cell.json`, `anchor-paragraph.json` | An anchor is an address pinned to a hash, with a quotation and context, so it can be found again after the text changes. These four anchors point at a span of a sentence, a sentence, a table cell and a paragraph of the main example. |
| `anchor-keyed.json` | An anchor that leaves the team, as in a public layer: its table context is stored as keyed hashes, so the labels cannot be read from it ([spec/06 section 6.3](../spec/06-anchors.md#63-keyed-anchors)). |
| `rights-open.json`, `rights-subscription.json`, `rights-collective.json` | A witness's license and what uses it allows, under an open license, a subscription and a collective license. |
| `policy.json` | A signed team decision that settles a use the rights record leaves unknown. |
| `backend-docling.json`, `backend-examplevendor.json` | The code and weight licenses of a conversion tool and the conditions attached to them. |
| `profile-acme.json`, `profile-smithlab.json` | What those conditions ask about a team: its purpose, its funding and whom it competes with. |
| `roster.json` | The keys that may sign, the role of each key's holder in the team, and what each key may sign. Ana is the owner, so she may revoke anyone's receipt. |
| `layer/` | A layer of annotations on the main example (`layer.json`, `annotations.jsonl`) and the receipt that confirms them (`receipt.json`). |
| `submissions/`, `grades/` | A student's answers to exercises in the layer, and the grader's result for each. |
| `suspect.json` | A doubtful reading raised for review: the converter's reading of an exponent in the main example, before the first correction answered it. |
| `qa-report.json` | Reviewer error bounds for a delivery that covers two of the main example's receipts, signed by the team's owner key. |
| `checklist/` | A conformance checklist (`checklist.json`) for an accessible HTML export of the main example, checked against WCAG 2.1 AA criterion by criterion, and the receipt that covers it at its hash (`receipt.json`). The format is `provisional`. |
| `proof-inclusion.json`, `proof-consistency.json` | Two RFC 9162 proofs: that one node was covered by the main example's first receipt without showing the rest, and that revision 12 of its correction history extends revision 8 rather than rewriting it. |
| `checkpoint.json` | A signed checkpoint of the team's transparency log over the main example's receipts, revocations and roster, as the parsed form of its signed note, cosigned by a witness. The format is `provisional`. |
| `log/` | The same log as the static files a server would publish: `checkpoint` and the hash and entries tiles ([spec/23 §23.4](../spec/23-log.md#234-serving-a-log)). |
| `receipt-ml-dsa.json` | A receipt signed with ML-DSA-65 (FIPS 204) by `dana`, whose roster key is post-quantum. |
| `project.json`, `digitization.json`, `digitization-confirmation.json`, `datasets/`, `view.vl.json`, `snapshot.json`, `draft-ids.jsonl` | A team project; values read off the main example's figure by hand, the receipt that confirms them, and the dataset they yield; a Vega-Lite chart pinned to that dataset; what the draft cites, pinned; and the sentence IDs of the draft's Typst project. These formats are `provisional`. |
## Broken packages
Each folder in `invalid/` holds a `package/` folder, or a `package.sct.zip` archive, that breaks exactly one rule, built from `packages/tiny2026example/` by one edit, and an `expect.json` that names the rule.
A conforming implementation refuses every one of them and should report that rule.
`registry/rules.json` lists every rule ID with its meaning, and a validator reports each failure as `path:line: rule: message` ([spec/22 section 22.2](../spec/22-conformance.md#222-validating-a-package)).
| Case | What is wrong | Rule |
| --- | --- | --- |
| `alias-dangling/` | An alias whose node does not exist. | `doc.id.successor` |
| `bad-id/` | An ID that uses a letter Crockford base32 lacks (i, l, o or u). | `package.schema` |
| `checks-only-plain/` | A checks-only package that still carries text and plain hashes. | `doc.policy.withheld` |
| `cite-not-reference/` | A cite run names a node that is not a reference. | `doc.run.cite` |
| `counts-wrong/` | document.json's counts are not the number of nodes and leaves. | `doc.counts` |
| `crlf/` | A file whose lines end in CR LF, which is not the canonical form. | `package.file.canonical` |
| `empty-optional-file/` | An optional JSONL file with no records. | `package.file.empty` |
| `hash-mismatch/` | A node_hash that does not recompute. | `doc.hash.node-hash` |
| `heading-not-first/` | A heading must be a section's first child. | `doc.tree.child` |
| `history-wrong/` | document.json's history is not the root over the corrections. | `doc.history` |
| `key-suffix/` | A work key whose hash part is not the hash of the work's DOI. | `doc.key.suffix` |
| `key-work/` | A document key whose suffix is not the version's. | `doc.key.work` |
| `location-unknown-page/` | A location on a page no witness has. | `doc.location.page` |
| `manifest-hash/` | A file changed after the manifest was written. | `package.manifest.hash` |
| `manifest-key/` | The manifest names another key than document.json. | `package.manifest.key` |
| `missing-required-file/` | A required file is missing. | `package.file.required` |
| `not-canonical/` | A line that is valid JSON but not canonical JSON (the fixed form of RFC 8785, which gives equal data identical bytes). | `package.file.canonical` |
| `receipt-root/` | A receipt whose Merkle root (one hash that summarizes a list of hashes) does not recompute. | `doc.receipt.root` |
| `receipt-signature/` | A receipt changed after it was signed. | `doc.receipt.signature` |
| `receipt-unsorted-nodes/` | A receipt whose nodes are not sorted by ID. | `doc.receipt.nodes` |
| `retired-live/` | An ID that is both live and retired. | `doc.id.retired-live` |
| `rev-without-corrections/` | document.json's rev is not the number of corrections. | `doc.correction.rev` |
| `root-mismatch/` | document.json's root is not the root node's node_hash. | `doc.hash.root` |
| `signer-mismatch/` | A receipt whose signature was made with another key than the signer it names. | `doc.receipt.signature` |
| `style-sup-sub/` | A run cannot be both a subscript and a superscript. | `doc.run.style` |
| `text-edited/` | Text changed without its hashes. | `doc.hash.text-hash` |
| `unknown-kind/` | Kinds outside the list are refused. | `package.schema` |
| `unlisted-file/` | A file the manifest does not list. | `package.manifest.unlisted` |
| `unsafe-path/` | The manifest lists a path that leaves the package. | `package.path.unsafe` |
| `zip-symlink/` | A zipped package with an entry that is a symbolic link. | `package.zip.entry` |
| `zip-traversal/` | A zipped package with an entry whose path leaves the package folder. | `package.zip.entry` |
## Keys
`keys/` holds the Ed25519 secret keys (`ana`, `ben`, `cara`, `wit`, the witness, and `ben-spot`, whose VRF proof picks the nodes of a spot-check), the seed of `dana`'s ML-DSA-65 key, which signed the fixtures' receipts, and the team secret of the checks-only package.
Ed25519 is a signature scheme: the secret key makes a signature, and the public key in a roster verifies it.
These are published test keys.
Anyone can reproduce the signatures, so a signature made with these keys proves nothing about who made it.
Use them for nothing else.
## Sources
`src/` holds the hand-written descriptions of the three main documents, as first read; see [src/README.md](src/README.md).
Everything else here is generated by `python3 tools/build.py`, so change the sources or the builder, never the generated files.
@@ -0,0 +1 @@
{"note":"An alias whose node does not exist.","rule":"doc.id.successor"}
@@ -0,0 +1 @@
{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"e10c4aaab285d02d859ed2cf590fa9add9b77b0fab7a2b71b8c82f61b310a031","size":764},{"path":"ids.jsonl","sha256":"1eb53589cd394214dd4ee15be98a3dfbacec5e585a1e655fe2dfeff71a07e19e","size":61},{"path":"nodes.jsonl","sha256":"6ce54e0d837dceb4a2a39c1b2618cc66e16684b93f71b93ab4e6e709a90b0e52","size":11295},{"path":"provenance.json","sha256":"4bc7649bf6d3113f6c72b4016713654f57c8f03069632eabd1e6025c05cb9dac","size":226},{"path":"receipts.jsonl","sha256":"f745067d43480bbd467c5d8f11ff13eec198fac821664894ad8bd90b8b7cf0b3","size":2182},{"path":"references.jsonl","sha256":"59908a8aff6a2d5800747a1f45c6c2943ea1e31e7e1f10b6348967d30f16b87e","size":60},{"path":"roster.json","sha256":"3c71b0c007924cbacd3b4af02485214ab904db8ff8fca133ab32e67c5c76d481","size":6941},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026tiny-j4qm"}
@@ -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":{"algorithm":"sha-256","scheme":"plain"},"history":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","key":"tiny2026tiny-j4qm","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"author":[{"family":"Tiny","given":"T."}],"issued":{"date-parts":[[2026]]},"title":"A tiny example"},"meta_hash":"1062e6079e2871c390f4737f5354448b65fe524d8c09d1c82afaa8b71ba6b3e7","policy":"full","relations":[],"rev":0,"root":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","version":{"type":"version-of-record"},"work":{"key":"tiny2026tiny-j4qm","same_as":["doi:10.5555/example.tiny.2026"]}}
@@ -0,0 +1 @@
{"id":"b-p01-text-001","kind":"alias","successor":"zzzzzzz"}
@@ -0,0 +1,22 @@
{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"s0fn2fj","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"}
{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"b9wp3tt","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"ea9a1409bbf0f0f7bd8d508bfdbbf7d14a22ab1e3da011eafbfcd4e14ae7e4fd","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"s0fn2fj","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"vet7k0e","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"b9wp3tt","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"em5pd9v","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"vet7k0e","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"ytp1e5n","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"7667a3a4bc2e8fec1dc7af53e19c414952f9ce926b1e37e8d9adca66dd8f8d1d","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"}
{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"jvnys4s","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"ytp1e5n","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"}
{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"tb49qpc","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["r3e21zr"],"text":"1"}],"fidelity":"F2","id":"mzwwhxj","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e","ord":1,"own_hash":"02ed6d50b8ac607b59e3f7b5116ee6143ed7e69af25b19c4037aa799bc330a88","parent":"ytp1e5n","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"}
{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"exq1ter","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"}
{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"j663d4h","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"exq1ter","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"}
{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"rsw24qc","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"exq1ter","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"}
{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["af5b51r"],"id":"pj5sk05"},{"header_path":["ajqxkgh"],"id":"nymcs5q"}]},"id":"tb49qpc","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"154c910857f33c152fdc78e42582510327055e62da9a25ab10c3891eeaf69627","ord":3,"own_hash":"fb4cc66080def0b42a06f7aa566a24957c7345c77b8d873ca5c790704a890f47","parent":"b9wp3tt","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"t2ps2mp","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"6d8056adfb50dc0b65a2a65b47eccc5f47d5482a8dfbefa0d8a06f6641a4be3a","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"tb49qpc","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"rr9rtf5","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"8bd1fa377ec390fdc36e17baa8c3a39d2df7ef2a53cd0c0dc745ae40e98f99f8","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"t2ps2mp","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"pj5sk05","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"af5b51r","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5","ord":0,"own_hash":"c68933b07bc7c5b806892ae36b3e4c3205a0a2066fd6f8255578f7d1ca86dc10","parent":"rr9rtf5","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"}
{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"nymcs5q","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"ajqxkgh","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87","ord":1,"own_hash":"28df42bf1dcd44b053275ed014bd1599914f17adabc0c7fdb3e4247dc648ac49","parent":"rr9rtf5","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"dmsstkg","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"baf17577660aa6f0ba9c8703d30816d77cfce7dbf0ea3257ed830fa9ab94ce9d","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"tb49qpc","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["rdrqkv7"]},"id":"r3e7hfs","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"97a1f5b27bbfe8c9d2cec7212b519b4993506fc8080be3eff02f3aa31515a19d","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"dmsstkg","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"pj5sk05","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"rdrqkv7","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df","ord":0,"own_hash":"fb474321001657b59bccd3cae0987c544a4ef9a27214626d77695f4db237aa93","parent":"r3e7hfs","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"}
{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"nymcs5q","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"f463wj7","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd","ord":1,"own_hash":"088eff622eb3086d68c4433cf5e1783dc9f2a6724c3536c31ec0bf80b5f89db5","parent":"r3e7hfs","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"aw97y35","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"s0fn2fj","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"yd513mw","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"aw97y35","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"r3e21zr","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"yd513mw","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
@@ -0,0 +1 @@
{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"paperspec tools/build.py"}],"tools":[{"name":"paperspec tools/build.py","version":"0.1.0"}]}
@@ -0,0 +1 @@
{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026tiny-j4qm","evidence":[{"kind":"crop","node":"af5b51r","sha256":"78b08276b5122feed3829e8dd19684fa8a4a41f79cb83a499d40341e09f5d658"},{"kind":"crop","node":"ajqxkgh","sha256":"398bab4177685c88eef399d814d34c81baa556d58cd508bd5ddb33ac53a5cbfa"},{"kind":"crop","node":"f463wj7","sha256":"88b1e820b569c3a0fd025a6b6c502271ed73bbce720dd8a2e416d6a5dd0e9d67"},{"kind":"crop","node":"j663d4h","sha256":"d6484c89588a560f64bbceca108f5446e47bb5cb85521fbffc9d6d37f252e5c7"},{"kind":"crop","node":"jvnys4s","sha256":"3139fb30b88062bd0c6bbb028c4c57fc748218ce1d7a612d282e292d6a02ffe9"},{"kind":"crop","node":"mzwwhxj","sha256":"83a7fcf09321f8a644c58120f80dede5d73d89f50d080ccbb143ec5b485e3088"},{"kind":"crop","node":"r3e21zr","sha256":"ff809e11101fa6ff5422e5232e83142c1a43dada0e56d63ec03fbce3474dd1aa"},{"kind":"crop","node":"rdrqkv7","sha256":"c0699aceb344812ebebb1414838641f0761184d5113dcc870d07c721fd289437"},{"kind":"crop","node":"rsw24qc","sha256":"b4c3b133c707b1a9a2cec2efe5c17731bada0d6bace5b1fb3590c5c5ab18bb92"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"k4wt522d9zvjr","level":"F3","nodes":[["af5b51r","59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5"],["ajqxkgh","838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87"],["f463wj7","f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd"],["j663d4h","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["jvnys4s","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["mzwwhxj","8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e"],["r3e21zr","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["rdrqkv7","87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df"],["rsw24qc","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"15d9c8bd5472afd7064578e5663d3b7fd21249adc6cdb40fcbe1b790e3fae801","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"/xOfCboOpgu29ztKi22IU9crgC5LYetrHOMpQtqj4QV5dVP73n/ze94hyPknYO5qNPgBmYRrbJZBIIHdwqxoAA=="}}
@@ -0,0 +1 @@
{"label":"1","node":"r3e21zr","resolution":{"type":"none"}}
@@ -0,0 +1 @@
{"format":"scienting-roster/1","keys":[{"did":"did:key:z6Mkj7iUX8QG7zkAtNaV78CUXcenhD87qWwQbc7NU5aVXyW9","id":"ana","person":{"name":"Ana Example"},"public":"RUiz5j+y0QwgOtsQpqXrlq+gy3c/JFnkxwvlWUNX4Ao=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"owner","scheme":"ed25519"},{"did":"did:key:z6MkhemKN7rMQcgt6wT2eWPyx3vFRS1RUoRziLMnLq2vZ9yi","id":"ben","person":{"name":"Ben Example"},"public":"L4WMLs7xLjBLRsxS/EYpD194puMBpADybcfFEWxBkWk=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6MkrBf2w3MUroaNBiHTQJzH4e1w31jpcosd5vNxjikijndU","id":"ben-spot","person":{"name":"Ben Example"},"public":"rkzxigjCXg869PGSFAVr4EDXXRmwk+S/+wJ93lrG4dc=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6Mkgrc9HCeEUL5tz1bVfuuDeSm6mP6hyWUX5ivhgReSbEQM","id":"cara","person":{"name":"Cara Example"},"public":"I7J1GqG5CHOc0LHYZPNNto1Me2lJUzBVn2A7GrUGbZ4=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"reader","scheme":"ed25519"},{"did":"did:key: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","id":"dana","person":{"name":"Dana Example"},"public":"lQ6M2DulKY4RkQLGTPGZD+CHlOOib4kBkwlccVNWRDPco1k5kHtelT/yUP4+CoAQnHnLu96vpeWztaee/9RmjR3bstGj+P5tOSrwFlPuyNUPOWPNjwCQLrVEyeUGBaA4+HRvFwK7C4OHB8EJWYtC0OuH+tRPlCdLpxlVcZZcM7dsZYe2BDNenbWfp4TeX2Oa+dThlceDY0m9MewwqUrd5xdo9tc8PS9R9o0ZUWf0vDw7Fc5AcsWwbf76lDLvIbyd0aCaHJ7eaK6DFsBuZFKVdlZlH0inJciAMF8dPoRuE+A0VlZTEOsOivNWprM5iLHzXse3zSoHLldWr0t4hWxHH3MBQ57Ucee8RTU6hFRfqfFRl6zJQyRZOFZZoYD9QwXkR3NmUzV/FcsOMHpbgTcY7O0TAajPnfpSTp+XdyPVBR7TlTsturUCpryP0ZX1S3VJk2IaneB123thtcOtWsbqdT3Bb846H7yudI95WVTixIS/KIwoCbekSf8Y9+iW/xRVSWLRVc1gpigDxXfieSA7bI+qiUBjiKR7QU1KFYZA58VcOQhzeMLY6an34rsW4WHAwzzSv8Q6vrwpn8Ct9fTsIeiZsWZLueNkIUfjR0G1bHHoT2RHKton0AMRjOUGSKUUB4DNZ5xzXvC0jvUMWlgHB9z2wBCsIkIDVWqSA2DD0xeIY2wSUVPwPc1MnBAf/Fx3poweUlcPWglR2VaO9ematC4hfLxxkGldGQt3C6ZLPsm96S7o6j88rwOqkDNIR1pNJOepgciJH/w4Xwtg9gJ52CpdlCeSllRQD74l95ysmZ2D/gLweNoUt61P0RYQQelio8VnPUNB1e2uK7zW9joG1k59CjJGQNvuZr6JkQ9+Hxo5xKEOy9KcpT6t48wTzbz3YMFDxTNl0/DzL8qdTU2UrSW6/TFgPLokbAQN00yhw0lg8cR/e1m+ujFyBeesL3luwE6HNcIyK5Y/+To04vR3OD7Uz8cnABxWyOeSBm2R2bu2fxeN0Hlv+qhoOYtbZ1DKx/aES4z51jATynEIdMIMSNhmVDoDiGODh9ocenzg/DUarjIzWltPFRyQj+tnFGTXp7C87Line truncated
@@ -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}]}
+1
View File
@@ -0,0 +1 @@
{"note":"IDs use Crockford base32, which has no i, l, o or u.","rule":"package.schema"}
@@ -0,0 +1 @@
{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"e10c4aaab285d02d859ed2cf590fa9add9b77b0fab7a2b71b8c82f61b310a031","size":764},{"path":"nodes.jsonl","sha256":"fd0cf6999bcce9c09cd7fb3aa0e1183bbbccf4c1ca0236e62c63a164e8dbc7f1","size":11295},{"path":"provenance.json","sha256":"4bc7649bf6d3113f6c72b4016713654f57c8f03069632eabd1e6025c05cb9dac","size":226},{"path":"receipts.jsonl","sha256":"f745067d43480bbd467c5d8f11ff13eec198fac821664894ad8bd90b8b7cf0b3","size":2182},{"path":"references.jsonl","sha256":"59908a8aff6a2d5800747a1f45c6c2943ea1e31e7e1f10b6348967d30f16b87e","size":60},{"path":"roster.json","sha256":"3c71b0c007924cbacd3b4af02485214ab904db8ff8fca133ab32e67c5c76d481","size":6941},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026tiny-j4qm"}
@@ -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":{"algorithm":"sha-256","scheme":"plain"},"history":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","key":"tiny2026tiny-j4qm","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"author":[{"family":"Tiny","given":"T."}],"issued":{"date-parts":[[2026]]},"title":"A tiny example"},"meta_hash":"1062e6079e2871c390f4737f5354448b65fe524d8c09d1c82afaa8b71ba6b3e7","policy":"full","relations":[],"rev":0,"root":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","version":{"type":"version-of-record"},"work":{"key":"tiny2026tiny-j4qm","same_as":["doi:10.5555/example.tiny.2026"]}}
@@ -0,0 +1,22 @@
{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"s0fn2fj","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"}
{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"b9wp3tt","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"ea9a1409bbf0f0f7bd8d508bfdbbf7d14a22ab1e3da011eafbfcd4e14ae7e4fd","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"s0fn2fj","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"vet7k0e","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"b9wp3tt","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"em5pd9v","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"vet7k0e","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"ytp1e5n","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"7667a3a4bc2e8fec1dc7af53e19c414952f9ce926b1e37e8d9adca66dd8f8d1d","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"}
{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"jvnys4s","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"ytp1e5n","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"}
{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"tb49qpc","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["r3e21zr"],"text":"1"}],"fidelity":"F2","id":"mzwwhxj","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e","ord":1,"own_hash":"02ed6d50b8ac607b59e3f7b5116ee6143ed7e69af25b19c4037aa799bc330a88","parent":"ytp1e5n","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"}
{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"exq1ter","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"}
{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"j663d4h","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"exq1ter","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":"exq1ter","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"}
{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["af5b51r"],"id":"pj5sk05"},{"header_path":["ajqxkgh"],"id":"nymcs5q"}]},"id":"tb49qpc","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"154c910857f33c152fdc78e42582510327055e62da9a25ab10c3891eeaf69627","ord":3,"own_hash":"fb4cc66080def0b42a06f7aa566a24957c7345c77b8d873ca5c790704a890f47","parent":"b9wp3tt","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"t2ps2mp","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"6d8056adfb50dc0b65a2a65b47eccc5f47d5482a8dfbefa0d8a06f6641a4be3a","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"tb49qpc","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"rr9rtf5","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"8bd1fa377ec390fdc36e17baa8c3a39d2df7ef2a53cd0c0dc745ae40e98f99f8","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"t2ps2mp","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"pj5sk05","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"af5b51r","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5","ord":0,"own_hash":"c68933b07bc7c5b806892ae36b3e4c3205a0a2066fd6f8255578f7d1ca86dc10","parent":"rr9rtf5","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"}
{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"nymcs5q","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"ajqxkgh","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87","ord":1,"own_hash":"28df42bf1dcd44b053275ed014bd1599914f17adabc0c7fdb3e4247dc648ac49","parent":"rr9rtf5","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"dmsstkg","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"baf17577660aa6f0ba9c8703d30816d77cfce7dbf0ea3257ed830fa9ab94ce9d","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"tb49qpc","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["rdrqkv7"]},"id":"r3e7hfs","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"97a1f5b27bbfe8c9d2cec7212b519b4993506fc8080be3eff02f3aa31515a19d","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"dmsstkg","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"pj5sk05","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"rdrqkv7","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df","ord":0,"own_hash":"fb474321001657b59bccd3cae0987c544a4ef9a27214626d77695f4db237aa93","parent":"r3e7hfs","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"}
{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"nymcs5q","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"f463wj7","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd","ord":1,"own_hash":"088eff622eb3086d68c4433cf5e1783dc9f2a6724c3536c31ec0bf80b5f89db5","parent":"r3e7hfs","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"aw97y35","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"s0fn2fj","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"yd513mw","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"aw97y35","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"r3e21zr","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"yd513mw","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
@@ -0,0 +1 @@
{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"paperspec tools/build.py"}],"tools":[{"name":"paperspec tools/build.py","version":"0.1.0"}]}
@@ -0,0 +1 @@
{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026tiny-j4qm","evidence":[{"kind":"crop","node":"af5b51r","sha256":"78b08276b5122feed3829e8dd19684fa8a4a41f79cb83a499d40341e09f5d658"},{"kind":"crop","node":"ajqxkgh","sha256":"398bab4177685c88eef399d814d34c81baa556d58cd508bd5ddb33ac53a5cbfa"},{"kind":"crop","node":"f463wj7","sha256":"88b1e820b569c3a0fd025a6b6c502271ed73bbce720dd8a2e416d6a5dd0e9d67"},{"kind":"crop","node":"j663d4h","sha256":"d6484c89588a560f64bbceca108f5446e47bb5cb85521fbffc9d6d37f252e5c7"},{"kind":"crop","node":"jvnys4s","sha256":"3139fb30b88062bd0c6bbb028c4c57fc748218ce1d7a612d282e292d6a02ffe9"},{"kind":"crop","node":"mzwwhxj","sha256":"83a7fcf09321f8a644c58120f80dede5d73d89f50d080ccbb143ec5b485e3088"},{"kind":"crop","node":"r3e21zr","sha256":"ff809e11101fa6ff5422e5232e83142c1a43dada0e56d63ec03fbce3474dd1aa"},{"kind":"crop","node":"rdrqkv7","sha256":"c0699aceb344812ebebb1414838641f0761184d5113dcc870d07c721fd289437"},{"kind":"crop","node":"rsw24qc","sha256":"b4c3b133c707b1a9a2cec2efe5c17731bada0d6bace5b1fb3590c5c5ab18bb92"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"k4wt522d9zvjr","level":"F3","nodes":[["af5b51r","59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5"],["ajqxkgh","838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87"],["f463wj7","f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd"],["j663d4h","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["jvnys4s","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["mzwwhxj","8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e"],["r3e21zr","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["rdrqkv7","87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df"],["rsw24qc","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"15d9c8bd5472afd7064578e5663d3b7fd21249adc6cdb40fcbe1b790e3fae801","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"/xOfCboOpgu29ztKi22IU9crgC5LYetrHOMpQtqj4QV5dVP73n/ze94hyPknYO5qNPgBmYRrbJZBIIHdwqxoAA=="}}
@@ -0,0 +1 @@
{"label":"1","node":"r3e21zr","resolution":{"type":"none"}}
@@ -0,0 +1 @@
{"format":"scienting-roster/1","keys":[{"did":"did:key:z6Mkj7iUX8QG7zkAtNaV78CUXcenhD87qWwQbc7NU5aVXyW9","id":"ana","person":{"name":"Ana Example"},"public":"RUiz5j+y0QwgOtsQpqXrlq+gy3c/JFnkxwvlWUNX4Ao=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"owner","scheme":"ed25519"},{"did":"did:key:z6MkhemKN7rMQcgt6wT2eWPyx3vFRS1RUoRziLMnLq2vZ9yi","id":"ben","person":{"name":"Ben Example"},"public":"L4WMLs7xLjBLRsxS/EYpD194puMBpADybcfFEWxBkWk=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6MkrBf2w3MUroaNBiHTQJzH4e1w31jpcosd5vNxjikijndU","id":"ben-spot","person":{"name":"Ben Example"},"public":"rkzxigjCXg869PGSFAVr4EDXXRmwk+S/+wJ93lrG4dc=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6Mkgrc9HCeEUL5tz1bVfuuDeSm6mP6hyWUX5ivhgReSbEQM","id":"cara","person":{"name":"Cara Example"},"public":"I7J1GqG5CHOc0LHYZPNNto1Me2lJUzBVn2A7GrUGbZ4=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"reader","scheme":"ed25519"},{"did":"did:key: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","id":"dana","person":{"name":"Dana Example"},"public":"lQ6M2DulKY4RkQLGTPGZD+CHlOOib4kBkwlccVNWRDPco1k5kHtelT/yUP4+CoAQnHnLu96vpeWztaee/9RmjR3bstGj+P5tOSrwFlPuyNUPOWPNjwCQLrVEyeUGBaA4+HRvFwK7C4OHB8EJWYtC0OuH+tRPlCdLpxlVcZZcM7dsZYe2BDNenbWfp4TeX2Oa+dThlceDY0m9MewwqUrd5xdo9tc8PS9R9o0ZUWf0vDw7Fc5AcsWwbf76lDLvIbyd0aCaHJ7eaK6DFsBuZFKVdlZlH0inJciAMF8dPoRuE+A0VlZTEOsOivNWprM5iLHzXse3zSoHLldWr0t4hWxHH3MBQ57Ucee8RTU6hFRfqfFRl6zJQyRZOFZZoYD9QwXkR3NmUzV/FcsOMHpbgTcY7O0TAajPnfpSTp+XdyPVBR7TlTsturUCpryP0ZX1S3VJk2IaneB123thtcOtWsbqdT3Bb846H7yudI95WVTixIS/KIwoCbekSf8Y9+iW/xRVSWLRVc1gpigDxXfieSA7bI+qiUBjiKR7QU1KFYZA58VcOQhzeMLY6an34rsW4WHAwzzSv8Q6vrwpn8Ct9fTsIeiZsWZLueNkIUfjR0G1bHHoT2RHKton0AMRjOUGSKUUB4DNZ5xzXvC0jvUMWlgHB9z2wBCsIkIDVWqSA2DD0xeIY2wSUVPwPc1MnBAf/Fx3poweUlcPWglR2VaO9ematC4hfLxxkGldGQt3C6ZLPsm96S7o6j88rwOqkDNIR1pNJOepgciJH/w4Xwtg9gJ52CpdlCeSllRQD74l95ysmZ2D/gLweNoUt61P0RYQQelio8VnPUNB1e2uK7zW9joG1k59CjJGQNvuZr6JkQ9+Hxo5xKEOy9KcpT6t48wTzbz3YMFDxTNl0/DzL8qdTU2UrSW6/TFgPLokbAQN00yhw0lg8cR/e1m+ujFyBeesL3luwE6HNcIyK5Y/+To04vR3OD7Uz8cnABxWyOeSBm2R2bu2fxeN0Hlv+qhoOYtbZ1DKx/aES4z51jATynEIdMIMSNhmVDoDiGODh9ocenzg/DUarjIzWltPFRyQj+tnFGTXp7C87Line truncated
@@ -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}]}
@@ -0,0 +1 @@
{"note":"A checks-only package that still carries text and plain hashes.","rule":"doc.policy.withheld"}
@@ -0,0 +1 @@
{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"a7e83339ea04205a7b1f425299450bca661586a93ac7d959ceb60fb3c68207dd","size":771},{"path":"nodes.jsonl","sha256":"6ce54e0d837dceb4a2a39c1b2618cc66e16684b93f71b93ab4e6e709a90b0e52","size":11295},{"path":"provenance.json","sha256":"4bc7649bf6d3113f6c72b4016713654f57c8f03069632eabd1e6025c05cb9dac","size":226},{"path":"receipts.jsonl","sha256":"f745067d43480bbd467c5d8f11ff13eec198fac821664894ad8bd90b8b7cf0b3","size":2182},{"path":"references.jsonl","sha256":"59908a8aff6a2d5800747a1f45c6c2943ea1e31e7e1f10b6348967d30f16b87e","size":60},{"path":"roster.json","sha256":"3c71b0c007924cbacd3b4af02485214ab904db8ff8fca133ab32e67c5c76d481","size":6941},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026tiny-j4qm"}
@@ -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":{"algorithm":"sha-256","scheme":"plain"},"history":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","key":"tiny2026tiny-j4qm","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"author":[{"family":"Tiny","given":"T."}],"issued":{"date-parts":[[2026]]},"title":"A tiny example"},"meta_hash":"1062e6079e2871c390f4737f5354448b65fe524d8c09d1c82afaa8b71ba6b3e7","policy":"checks-only","relations":[],"rev":0,"root":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","version":{"type":"version-of-record"},"work":{"key":"tiny2026tiny-j4qm","same_as":["doi:10.5555/example.tiny.2026"]}}
@@ -0,0 +1,22 @@
{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"s0fn2fj","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"}
{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"b9wp3tt","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"ea9a1409bbf0f0f7bd8d508bfdbbf7d14a22ab1e3da011eafbfcd4e14ae7e4fd","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"s0fn2fj","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"vet7k0e","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"b9wp3tt","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"em5pd9v","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"vet7k0e","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"ytp1e5n","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"7667a3a4bc2e8fec1dc7af53e19c414952f9ce926b1e37e8d9adca66dd8f8d1d","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"}
{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"jvnys4s","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"ytp1e5n","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"}
{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"tb49qpc","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["r3e21zr"],"text":"1"}],"fidelity":"F2","id":"mzwwhxj","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e","ord":1,"own_hash":"02ed6d50b8ac607b59e3f7b5116ee6143ed7e69af25b19c4037aa799bc330a88","parent":"ytp1e5n","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"}
{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"exq1ter","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"}
{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"j663d4h","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"exq1ter","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"}
{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"rsw24qc","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"exq1ter","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"}
{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["af5b51r"],"id":"pj5sk05"},{"header_path":["ajqxkgh"],"id":"nymcs5q"}]},"id":"tb49qpc","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"154c910857f33c152fdc78e42582510327055e62da9a25ab10c3891eeaf69627","ord":3,"own_hash":"fb4cc66080def0b42a06f7aa566a24957c7345c77b8d873ca5c790704a890f47","parent":"b9wp3tt","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"t2ps2mp","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"6d8056adfb50dc0b65a2a65b47eccc5f47d5482a8dfbefa0d8a06f6641a4be3a","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"tb49qpc","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"rr9rtf5","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"8bd1fa377ec390fdc36e17baa8c3a39d2df7ef2a53cd0c0dc745ae40e98f99f8","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"t2ps2mp","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"pj5sk05","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"af5b51r","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5","ord":0,"own_hash":"c68933b07bc7c5b806892ae36b3e4c3205a0a2066fd6f8255578f7d1ca86dc10","parent":"rr9rtf5","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"}
{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"nymcs5q","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"ajqxkgh","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87","ord":1,"own_hash":"28df42bf1dcd44b053275ed014bd1599914f17adabc0c7fdb3e4247dc648ac49","parent":"rr9rtf5","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"dmsstkg","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"baf17577660aa6f0ba9c8703d30816d77cfce7dbf0ea3257ed830fa9ab94ce9d","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"tb49qpc","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["rdrqkv7"]},"id":"r3e7hfs","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"97a1f5b27bbfe8c9d2cec7212b519b4993506fc8080be3eff02f3aa31515a19d","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"dmsstkg","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"pj5sk05","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"rdrqkv7","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df","ord":0,"own_hash":"fb474321001657b59bccd3cae0987c544a4ef9a27214626d77695f4db237aa93","parent":"r3e7hfs","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"}
{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"nymcs5q","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"f463wj7","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd","ord":1,"own_hash":"088eff622eb3086d68c4433cf5e1783dc9f2a6724c3536c31ec0bf80b5f89db5","parent":"r3e7hfs","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"aw97y35","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"s0fn2fj","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"yd513mw","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"aw97y35","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"r3e21zr","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"yd513mw","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
@@ -0,0 +1 @@
{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"paperspec tools/build.py"}],"tools":[{"name":"paperspec tools/build.py","version":"0.1.0"}]}
@@ -0,0 +1 @@
{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026tiny-j4qm","evidence":[{"kind":"crop","node":"af5b51r","sha256":"78b08276b5122feed3829e8dd19684fa8a4a41f79cb83a499d40341e09f5d658"},{"kind":"crop","node":"ajqxkgh","sha256":"398bab4177685c88eef399d814d34c81baa556d58cd508bd5ddb33ac53a5cbfa"},{"kind":"crop","node":"f463wj7","sha256":"88b1e820b569c3a0fd025a6b6c502271ed73bbce720dd8a2e416d6a5dd0e9d67"},{"kind":"crop","node":"j663d4h","sha256":"d6484c89588a560f64bbceca108f5446e47bb5cb85521fbffc9d6d37f252e5c7"},{"kind":"crop","node":"jvnys4s","sha256":"3139fb30b88062bd0c6bbb028c4c57fc748218ce1d7a612d282e292d6a02ffe9"},{"kind":"crop","node":"mzwwhxj","sha256":"83a7fcf09321f8a644c58120f80dede5d73d89f50d080ccbb143ec5b485e3088"},{"kind":"crop","node":"r3e21zr","sha256":"ff809e11101fa6ff5422e5232e83142c1a43dada0e56d63ec03fbce3474dd1aa"},{"kind":"crop","node":"rdrqkv7","sha256":"c0699aceb344812ebebb1414838641f0761184d5113dcc870d07c721fd289437"},{"kind":"crop","node":"rsw24qc","sha256":"b4c3b133c707b1a9a2cec2efe5c17731bada0d6bace5b1fb3590c5c5ab18bb92"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"k4wt522d9zvjr","level":"F3","nodes":[["af5b51r","59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5"],["ajqxkgh","838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87"],["f463wj7","f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd"],["j663d4h","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["jvnys4s","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["mzwwhxj","8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e"],["r3e21zr","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["rdrqkv7","87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df"],["rsw24qc","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"15d9c8bd5472afd7064578e5663d3b7fd21249adc6cdb40fcbe1b790e3fae801","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"/xOfCboOpgu29ztKi22IU9crgC5LYetrHOMpQtqj4QV5dVP73n/ze94hyPknYO5qNPgBmYRrbJZBIIHdwqxoAA=="}}
@@ -0,0 +1 @@
{"label":"1","node":"r3e21zr","resolution":{"type":"none"}}
@@ -0,0 +1 @@
{"format":"scienting-roster/1","keys":[{"did":"did:key:z6Mkj7iUX8QG7zkAtNaV78CUXcenhD87qWwQbc7NU5aVXyW9","id":"ana","person":{"name":"Ana Example"},"public":"RUiz5j+y0QwgOtsQpqXrlq+gy3c/JFnkxwvlWUNX4Ao=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"owner","scheme":"ed25519"},{"did":"did:key:z6MkhemKN7rMQcgt6wT2eWPyx3vFRS1RUoRziLMnLq2vZ9yi","id":"ben","person":{"name":"Ben Example"},"public":"L4WMLs7xLjBLRsxS/EYpD194puMBpADybcfFEWxBkWk=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6MkrBf2w3MUroaNBiHTQJzH4e1w31jpcosd5vNxjikijndU","id":"ben-spot","person":{"name":"Ben Example"},"public":"rkzxigjCXg869PGSFAVr4EDXXRmwk+S/+wJ93lrG4dc=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6Mkgrc9HCeEUL5tz1bVfuuDeSm6mP6hyWUX5ivhgReSbEQM","id":"cara","person":{"name":"Cara Example"},"public":"I7J1GqG5CHOc0LHYZPNNto1Me2lJUzBVn2A7GrUGbZ4=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"reader","scheme":"ed25519"},{"did":"did:key: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","id":"dana","person":{"name":"Dana Example"},"public":"lQ6M2DulKY4RkQLGTPGZD+CHlOOib4kBkwlccVNWRDPco1k5kHtelT/yUP4+CoAQnHnLu96vpeWztaee/9RmjR3bstGj+P5tOSrwFlPuyNUPOWPNjwCQLrVEyeUGBaA4+HRvFwK7C4OHB8EJWYtC0OuH+tRPlCdLpxlVcZZcM7dsZYe2BDNenbWfp4TeX2Oa+dThlceDY0m9MewwqUrd5xdo9tc8PS9R9o0ZUWf0vDw7Fc5AcsWwbf76lDLvIbyd0aCaHJ7eaK6DFsBuZFKVdlZlH0inJciAMF8dPoRuE+A0VlZTEOsOivNWprM5iLHzXse3zSoHLldWr0t4hWxHH3MBQ57Ucee8RTU6hFRfqfFRl6zJQyRZOFZZoYD9QwXkR3NmUzV/FcsOMHpbgTcY7O0TAajPnfpSTp+XdyPVBR7TlTsturUCpryP0ZX1S3VJk2IaneB123thtcOtWsbqdT3Bb846H7yudI95WVTixIS/KIwoCbekSf8Y9+iW/xRVSWLRVc1gpigDxXfieSA7bI+qiUBjiKR7QU1KFYZA58VcOQhzeMLY6an34rsW4WHAwzzSv8Q6vrwpn8Ct9fTsIeiZsWZLueNkIUfjR0G1bHHoT2RHKton0AMRjOUGSKUUB4DNZ5xzXvC0jvUMWlgHB9z2wBCsIkIDVWqSA2DD0xeIY2wSUVPwPc1MnBAf/Fx3poweUlcPWglR2VaO9ematC4hfLxxkGldGQt3C6ZLPsm96S7o6j88rwOqkDNIR1pNJOepgciJH/w4Xwtg9gJ52CpdlCeSllRQD74l95ysmZ2D/gLweNoUt61P0RYQQelio8VnPUNB1e2uK7zW9joG1k59CjJGQNvuZr6JkQ9+Hxo5xKEOy9KcpT6t48wTzbz3YMFDxTNl0/DzL8qdTU2UrSW6/TFgPLokbAQN00yhw0lg8cR/e1m+ujFyBeesL3luwE6HNcIyK5Y/+To04vR3OD7Uz8cnABxWyOeSBm2R2bu2fxeN0Hlv+qhoOYtbZ1DKx/aES4z51jATynEIdMIMSNhmVDoDiGODh9ocenzg/DUarjIzWltPFRyQj+tnFGTXp7C87Line truncated
@@ -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}]}
@@ -0,0 +1 @@
{"note":"A cite run names a node that is not a reference.","rule":"doc.run.cite"}
@@ -0,0 +1 @@
{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"e10c4aaab285d02d859ed2cf590fa9add9b77b0fab7a2b71b8c82f61b310a031","size":764},{"path":"nodes.jsonl","sha256":"d31b7bda29230dee3a57a1965419ca2133ad6035ca6eb7c94968c652d4c660c3","size":11295},{"path":"provenance.json","sha256":"4bc7649bf6d3113f6c72b4016713654f57c8f03069632eabd1e6025c05cb9dac","size":226},{"path":"receipts.jsonl","sha256":"f745067d43480bbd467c5d8f11ff13eec198fac821664894ad8bd90b8b7cf0b3","size":2182},{"path":"references.jsonl","sha256":"59908a8aff6a2d5800747a1f45c6c2943ea1e31e7e1f10b6348967d30f16b87e","size":60},{"path":"roster.json","sha256":"3c71b0c007924cbacd3b4af02485214ab904db8ff8fca133ab32e67c5c76d481","size":6941},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026tiny-j4qm"}
@@ -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":{"algorithm":"sha-256","scheme":"plain"},"history":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","key":"tiny2026tiny-j4qm","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"author":[{"family":"Tiny","given":"T."}],"issued":{"date-parts":[[2026]]},"title":"A tiny example"},"meta_hash":"1062e6079e2871c390f4737f5354448b65fe524d8c09d1c82afaa8b71ba6b3e7","policy":"full","relations":[],"rev":0,"root":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","version":{"type":"version-of-record"},"work":{"key":"tiny2026tiny-j4qm","same_as":["doi:10.5555/example.tiny.2026"]}}
@@ -0,0 +1,22 @@
{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"s0fn2fj","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"}
{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"b9wp3tt","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"ea9a1409bbf0f0f7bd8d508bfdbbf7d14a22ab1e3da011eafbfcd4e14ae7e4fd","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"s0fn2fj","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"vet7k0e","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"b9wp3tt","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"em5pd9v","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"vet7k0e","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"ytp1e5n","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"7667a3a4bc2e8fec1dc7af53e19c414952f9ce926b1e37e8d9adca66dd8f8d1d","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"}
{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"jvnys4s","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"ytp1e5n","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"}
{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"tb49qpc","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["jvnys4s"],"text":"1"}],"fidelity":"F2","id":"mzwwhxj","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e","ord":1,"own_hash":"02ed6d50b8ac607b59e3f7b5116ee6143ed7e69af25b19c4037aa799bc330a88","parent":"ytp1e5n","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"}
{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"exq1ter","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"}
{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"j663d4h","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"exq1ter","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"}
{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"rsw24qc","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"exq1ter","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"}
{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["af5b51r"],"id":"pj5sk05"},{"header_path":["ajqxkgh"],"id":"nymcs5q"}]},"id":"tb49qpc","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"154c910857f33c152fdc78e42582510327055e62da9a25ab10c3891eeaf69627","ord":3,"own_hash":"fb4cc66080def0b42a06f7aa566a24957c7345c77b8d873ca5c790704a890f47","parent":"b9wp3tt","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"t2ps2mp","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"6d8056adfb50dc0b65a2a65b47eccc5f47d5482a8dfbefa0d8a06f6641a4be3a","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"tb49qpc","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"rr9rtf5","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"8bd1fa377ec390fdc36e17baa8c3a39d2df7ef2a53cd0c0dc745ae40e98f99f8","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"t2ps2mp","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"pj5sk05","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"af5b51r","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5","ord":0,"own_hash":"c68933b07bc7c5b806892ae36b3e4c3205a0a2066fd6f8255578f7d1ca86dc10","parent":"rr9rtf5","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"}
{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"nymcs5q","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"ajqxkgh","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87","ord":1,"own_hash":"28df42bf1dcd44b053275ed014bd1599914f17adabc0c7fdb3e4247dc648ac49","parent":"rr9rtf5","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"dmsstkg","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"baf17577660aa6f0ba9c8703d30816d77cfce7dbf0ea3257ed830fa9ab94ce9d","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"tb49qpc","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["rdrqkv7"]},"id":"r3e7hfs","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"97a1f5b27bbfe8c9d2cec7212b519b4993506fc8080be3eff02f3aa31515a19d","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"dmsstkg","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"pj5sk05","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"rdrqkv7","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df","ord":0,"own_hash":"fb474321001657b59bccd3cae0987c544a4ef9a27214626d77695f4db237aa93","parent":"r3e7hfs","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"}
{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"nymcs5q","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"f463wj7","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd","ord":1,"own_hash":"088eff622eb3086d68c4433cf5e1783dc9f2a6724c3536c31ec0bf80b5f89db5","parent":"r3e7hfs","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"aw97y35","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"s0fn2fj","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"yd513mw","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"aw97y35","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"r3e21zr","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"yd513mw","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
@@ -0,0 +1 @@
{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"paperspec tools/build.py"}],"tools":[{"name":"paperspec tools/build.py","version":"0.1.0"}]}
@@ -0,0 +1 @@
{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026tiny-j4qm","evidence":[{"kind":"crop","node":"af5b51r","sha256":"78b08276b5122feed3829e8dd19684fa8a4a41f79cb83a499d40341e09f5d658"},{"kind":"crop","node":"ajqxkgh","sha256":"398bab4177685c88eef399d814d34c81baa556d58cd508bd5ddb33ac53a5cbfa"},{"kind":"crop","node":"f463wj7","sha256":"88b1e820b569c3a0fd025a6b6c502271ed73bbce720dd8a2e416d6a5dd0e9d67"},{"kind":"crop","node":"j663d4h","sha256":"d6484c89588a560f64bbceca108f5446e47bb5cb85521fbffc9d6d37f252e5c7"},{"kind":"crop","node":"jvnys4s","sha256":"3139fb30b88062bd0c6bbb028c4c57fc748218ce1d7a612d282e292d6a02ffe9"},{"kind":"crop","node":"mzwwhxj","sha256":"83a7fcf09321f8a644c58120f80dede5d73d89f50d080ccbb143ec5b485e3088"},{"kind":"crop","node":"r3e21zr","sha256":"ff809e11101fa6ff5422e5232e83142c1a43dada0e56d63ec03fbce3474dd1aa"},{"kind":"crop","node":"rdrqkv7","sha256":"c0699aceb344812ebebb1414838641f0761184d5113dcc870d07c721fd289437"},{"kind":"crop","node":"rsw24qc","sha256":"b4c3b133c707b1a9a2cec2efe5c17731bada0d6bace5b1fb3590c5c5ab18bb92"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"k4wt522d9zvjr","level":"F3","nodes":[["af5b51r","59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5"],["ajqxkgh","838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87"],["f463wj7","f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd"],["j663d4h","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["jvnys4s","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["mzwwhxj","8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e"],["r3e21zr","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["rdrqkv7","87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df"],["rsw24qc","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"15d9c8bd5472afd7064578e5663d3b7fd21249adc6cdb40fcbe1b790e3fae801","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"/xOfCboOpgu29ztKi22IU9crgC5LYetrHOMpQtqj4QV5dVP73n/ze94hyPknYO5qNPgBmYRrbJZBIIHdwqxoAA=="}}
@@ -0,0 +1 @@
{"label":"1","node":"r3e21zr","resolution":{"type":"none"}}
@@ -0,0 +1 @@
{"format":"scienting-roster/1","keys":[{"did":"did:key:z6Mkj7iUX8QG7zkAtNaV78CUXcenhD87qWwQbc7NU5aVXyW9","id":"ana","person":{"name":"Ana Example"},"public":"RUiz5j+y0QwgOtsQpqXrlq+gy3c/JFnkxwvlWUNX4Ao=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"owner","scheme":"ed25519"},{"did":"did:key:z6MkhemKN7rMQcgt6wT2eWPyx3vFRS1RUoRziLMnLq2vZ9yi","id":"ben","person":{"name":"Ben Example"},"public":"L4WMLs7xLjBLRsxS/EYpD194puMBpADybcfFEWxBkWk=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6MkrBf2w3MUroaNBiHTQJzH4e1w31jpcosd5vNxjikijndU","id":"ben-spot","person":{"name":"Ben Example"},"public":"rkzxigjCXg869PGSFAVr4EDXXRmwk+S/+wJ93lrG4dc=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6Mkgrc9HCeEUL5tz1bVfuuDeSm6mP6hyWUX5ivhgReSbEQM","id":"cara","person":{"name":"Cara Example"},"public":"I7J1GqG5CHOc0LHYZPNNto1Me2lJUzBVn2A7GrUGbZ4=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"reader","scheme":"ed25519"},{"did":"did:key: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","id":"dana","person":{"name":"Dana Example"},"public":"lQ6M2DulKY4RkQLGTPGZD+CHlOOib4kBkwlccVNWRDPco1k5kHtelT/yUP4+CoAQnHnLu96vpeWztaee/9RmjR3bstGj+P5tOSrwFlPuyNUPOWPNjwCQLrVEyeUGBaA4+HRvFwK7C4OHB8EJWYtC0OuH+tRPlCdLpxlVcZZcM7dsZYe2BDNenbWfp4TeX2Oa+dThlceDY0m9MewwqUrd5xdo9tc8PS9R9o0ZUWf0vDw7Fc5AcsWwbf76lDLvIbyd0aCaHJ7eaK6DFsBuZFKVdlZlH0inJciAMF8dPoRuE+A0VlZTEOsOivNWprM5iLHzXse3zSoHLldWr0t4hWxHH3MBQ57Ucee8RTU6hFRfqfFRl6zJQyRZOFZZoYD9QwXkR3NmUzV/FcsOMHpbgTcY7O0TAajPnfpSTp+XdyPVBR7TlTsturUCpryP0ZX1S3VJk2IaneB123thtcOtWsbqdT3Bb846H7yudI95WVTixIS/KIwoCbekSf8Y9+iW/xRVSWLRVc1gpigDxXfieSA7bI+qiUBjiKR7QU1KFYZA58VcOQhzeMLY6an34rsW4WHAwzzSv8Q6vrwpn8Ct9fTsIeiZsWZLueNkIUfjR0G1bHHoT2RHKton0AMRjOUGSKUUB4DNZ5xzXvC0jvUMWlgHB9z2wBCsIkIDVWqSA2DD0xeIY2wSUVPwPc1MnBAf/Fx3poweUlcPWglR2VaO9ematC4hfLxxkGldGQt3C6ZLPsm96S7o6j88rwOqkDNIR1pNJOepgciJH/w4Xwtg9gJ52CpdlCeSllRQD74l95ysmZ2D/gLweNoUt61P0RYQQelio8VnPUNB1e2uK7zW9joG1k59CjJGQNvuZr6JkQ9+Hxo5xKEOy9KcpT6t48wTzbz3YMFDxTNl0/DzL8qdTU2UrSW6/TFgPLokbAQN00yhw0lg8cR/e1m+ujFyBeesL3luwE6HNcIyK5Y/+To04vR3OD7Uz8cnABxWyOeSBm2R2bu2fxeN0Hlv+qhoOYtbZ1DKx/aES4z51jATynEIdMIMSNhmVDoDiGODh9ocenzg/DUarjIzWltPFRyQj+tnFGTXp7C87Line truncated
@@ -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}]}
@@ -0,0 +1 @@
{"note":"document.json's counts are not the number of nodes and leaves.","rule":"doc.counts"}
@@ -0,0 +1 @@
{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"4dda6a318c14ce1817ca3837950777100570c1fb0088a5d000d068d1912a0fdb","size":762},{"path":"nodes.jsonl","sha256":"6ce54e0d837dceb4a2a39c1b2618cc66e16684b93f71b93ab4e6e709a90b0e52","size":11295},{"path":"provenance.json","sha256":"4bc7649bf6d3113f6c72b4016713654f57c8f03069632eabd1e6025c05cb9dac","size":226},{"path":"receipts.jsonl","sha256":"f745067d43480bbd467c5d8f11ff13eec198fac821664894ad8bd90b8b7cf0b3","size":2182},{"path":"references.jsonl","sha256":"59908a8aff6a2d5800747a1f45c6c2943ea1e31e7e1f10b6348967d30f16b87e","size":60},{"path":"roster.json","sha256":"3c71b0c007924cbacd3b4af02485214ab904db8ff8fca133ab32e67c5c76d481","size":6941},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026tiny-j4qm"}
@@ -0,0 +1 @@
{"counts":{"leaves":1,"nodes":1},"fidelity":{"counts":{"F0":0,"F1":0,"F2":1,"F3":9},"lowest":"F2"},"format":"scienting-doc/1","hashing":{"algorithm":"sha-256","scheme":"plain"},"history":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","key":"tiny2026tiny-j4qm","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"author":[{"family":"Tiny","given":"T."}],"issued":{"date-parts":[[2026]]},"title":"A tiny example"},"meta_hash":"1062e6079e2871c390f4737f5354448b65fe524d8c09d1c82afaa8b71ba6b3e7","policy":"full","relations":[],"rev":0,"root":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","version":{"type":"version-of-record"},"work":{"key":"tiny2026tiny-j4qm","same_as":["doi:10.5555/example.tiny.2026"]}}
@@ -0,0 +1,22 @@
{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"s0fn2fj","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"}
{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"b9wp3tt","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"ea9a1409bbf0f0f7bd8d508bfdbbf7d14a22ab1e3da011eafbfcd4e14ae7e4fd","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"s0fn2fj","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"vet7k0e","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"b9wp3tt","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"em5pd9v","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"vet7k0e","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"ytp1e5n","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"7667a3a4bc2e8fec1dc7af53e19c414952f9ce926b1e37e8d9adca66dd8f8d1d","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"}
{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"jvnys4s","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"ytp1e5n","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"}
{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"tb49qpc","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["r3e21zr"],"text":"1"}],"fidelity":"F2","id":"mzwwhxj","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e","ord":1,"own_hash":"02ed6d50b8ac607b59e3f7b5116ee6143ed7e69af25b19c4037aa799bc330a88","parent":"ytp1e5n","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"}
{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"exq1ter","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"}
{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"j663d4h","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"exq1ter","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"}
{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"rsw24qc","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"exq1ter","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"}
{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["af5b51r"],"id":"pj5sk05"},{"header_path":["ajqxkgh"],"id":"nymcs5q"}]},"id":"tb49qpc","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"154c910857f33c152fdc78e42582510327055e62da9a25ab10c3891eeaf69627","ord":3,"own_hash":"fb4cc66080def0b42a06f7aa566a24957c7345c77b8d873ca5c790704a890f47","parent":"b9wp3tt","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"t2ps2mp","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"6d8056adfb50dc0b65a2a65b47eccc5f47d5482a8dfbefa0d8a06f6641a4be3a","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"tb49qpc","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"rr9rtf5","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"8bd1fa377ec390fdc36e17baa8c3a39d2df7ef2a53cd0c0dc745ae40e98f99f8","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"t2ps2mp","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"pj5sk05","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"af5b51r","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5","ord":0,"own_hash":"c68933b07bc7c5b806892ae36b3e4c3205a0a2066fd6f8255578f7d1ca86dc10","parent":"rr9rtf5","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"}
{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"nymcs5q","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"ajqxkgh","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87","ord":1,"own_hash":"28df42bf1dcd44b053275ed014bd1599914f17adabc0c7fdb3e4247dc648ac49","parent":"rr9rtf5","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"dmsstkg","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"baf17577660aa6f0ba9c8703d30816d77cfce7dbf0ea3257ed830fa9ab94ce9d","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"tb49qpc","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["rdrqkv7"]},"id":"r3e7hfs","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"97a1f5b27bbfe8c9d2cec7212b519b4993506fc8080be3eff02f3aa31515a19d","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"dmsstkg","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"pj5sk05","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"rdrqkv7","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df","ord":0,"own_hash":"fb474321001657b59bccd3cae0987c544a4ef9a27214626d77695f4db237aa93","parent":"r3e7hfs","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"}
{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"nymcs5q","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"f463wj7","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd","ord":1,"own_hash":"088eff622eb3086d68c4433cf5e1783dc9f2a6724c3536c31ec0bf80b5f89db5","parent":"r3e7hfs","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"aw97y35","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"s0fn2fj","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"yd513mw","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"aw97y35","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"r3e21zr","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"yd513mw","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
@@ -0,0 +1 @@
{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"paperspec tools/build.py"}],"tools":[{"name":"paperspec tools/build.py","version":"0.1.0"}]}
@@ -0,0 +1 @@
{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026tiny-j4qm","evidence":[{"kind":"crop","node":"af5b51r","sha256":"78b08276b5122feed3829e8dd19684fa8a4a41f79cb83a499d40341e09f5d658"},{"kind":"crop","node":"ajqxkgh","sha256":"398bab4177685c88eef399d814d34c81baa556d58cd508bd5ddb33ac53a5cbfa"},{"kind":"crop","node":"f463wj7","sha256":"88b1e820b569c3a0fd025a6b6c502271ed73bbce720dd8a2e416d6a5dd0e9d67"},{"kind":"crop","node":"j663d4h","sha256":"d6484c89588a560f64bbceca108f5446e47bb5cb85521fbffc9d6d37f252e5c7"},{"kind":"crop","node":"jvnys4s","sha256":"3139fb30b88062bd0c6bbb028c4c57fc748218ce1d7a612d282e292d6a02ffe9"},{"kind":"crop","node":"mzwwhxj","sha256":"83a7fcf09321f8a644c58120f80dede5d73d89f50d080ccbb143ec5b485e3088"},{"kind":"crop","node":"r3e21zr","sha256":"ff809e11101fa6ff5422e5232e83142c1a43dada0e56d63ec03fbce3474dd1aa"},{"kind":"crop","node":"rdrqkv7","sha256":"c0699aceb344812ebebb1414838641f0761184d5113dcc870d07c721fd289437"},{"kind":"crop","node":"rsw24qc","sha256":"b4c3b133c707b1a9a2cec2efe5c17731bada0d6bace5b1fb3590c5c5ab18bb92"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"k4wt522d9zvjr","level":"F3","nodes":[["af5b51r","59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5"],["ajqxkgh","838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87"],["f463wj7","f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd"],["j663d4h","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["jvnys4s","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["mzwwhxj","8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e"],["r3e21zr","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["rdrqkv7","87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df"],["rsw24qc","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"15d9c8bd5472afd7064578e5663d3b7fd21249adc6cdb40fcbe1b790e3fae801","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"/xOfCboOpgu29ztKi22IU9crgC5LYetrHOMpQtqj4QV5dVP73n/ze94hyPknYO5qNPgBmYRrbJZBIIHdwqxoAA=="}}
@@ -0,0 +1 @@
{"label":"1","node":"r3e21zr","resolution":{"type":"none"}}
@@ -0,0 +1 @@
{"format":"scienting-roster/1","keys":[{"did":"did:key:z6Mkj7iUX8QG7zkAtNaV78CUXcenhD87qWwQbc7NU5aVXyW9","id":"ana","person":{"name":"Ana Example"},"public":"RUiz5j+y0QwgOtsQpqXrlq+gy3c/JFnkxwvlWUNX4Ao=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"owner","scheme":"ed25519"},{"did":"did:key:z6MkhemKN7rMQcgt6wT2eWPyx3vFRS1RUoRziLMnLq2vZ9yi","id":"ben","person":{"name":"Ben Example"},"public":"L4WMLs7xLjBLRsxS/EYpD194puMBpADybcfFEWxBkWk=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6MkrBf2w3MUroaNBiHTQJzH4e1w31jpcosd5vNxjikijndU","id":"ben-spot","person":{"name":"Ben Example"},"public":"rkzxigjCXg869PGSFAVr4EDXXRmwk+S/+wJ93lrG4dc=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6Mkgrc9HCeEUL5tz1bVfuuDeSm6mP6hyWUX5ivhgReSbEQM","id":"cara","person":{"name":"Cara Example"},"public":"I7J1GqG5CHOc0LHYZPNNto1Me2lJUzBVn2A7GrUGbZ4=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"reader","scheme":"ed25519"},{"did":"did:key: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","id":"dana","person":{"name":"Dana Example"},"public":"lQ6M2DulKY4RkQLGTPGZD+CHlOOib4kBkwlccVNWRDPco1k5kHtelT/yUP4+CoAQnHnLu96vpeWztaee/9RmjR3bstGj+P5tOSrwFlPuyNUPOWPNjwCQLrVEyeUGBaA4+HRvFwK7C4OHB8EJWYtC0OuH+tRPlCdLpxlVcZZcM7dsZYe2BDNenbWfp4TeX2Oa+dThlceDY0m9MewwqUrd5xdo9tc8PS9R9o0ZUWf0vDw7Fc5AcsWwbf76lDLvIbyd0aCaHJ7eaK6DFsBuZFKVdlZlH0inJciAMF8dPoRuE+A0VlZTEOsOivNWprM5iLHzXse3zSoHLldWr0t4hWxHH3MBQ57Ucee8RTU6hFRfqfFRl6zJQyRZOFZZoYD9QwXkR3NmUzV/FcsOMHpbgTcY7O0TAajPnfpSTp+XdyPVBR7TlTsturUCpryP0ZX1S3VJk2IaneB123thtcOtWsbqdT3Bb846H7yudI95WVTixIS/KIwoCbekSf8Y9+iW/xRVSWLRVc1gpigDxXfieSA7bI+qiUBjiKR7QU1KFYZA58VcOQhzeMLY6an34rsW4WHAwzzSv8Q6vrwpn8Ct9fTsIeiZsWZLueNkIUfjR0G1bHHoT2RHKton0AMRjOUGSKUUB4DNZ5xzXvC0jvUMWlgHB9z2wBCsIkIDVWqSA2DD0xeIY2wSUVPwPc1MnBAf/Fx3poweUlcPWglR2VaO9ematC4hfLxxkGldGQt3C6ZLPsm96S7o6j88rwOqkDNIR1pNJOepgciJH/w4Xwtg9gJ52CpdlCeSllRQD74l95ysmZ2D/gLweNoUt61P0RYQQelio8VnPUNB1e2uK7zW9joG1k59CjJGQNvuZr6JkQ9+Hxo5xKEOy9KcpT6t48wTzbz3YMFDxTNl0/DzL8qdTU2UrSW6/TFgPLokbAQN00yhw0lg8cR/e1m+ujFyBeesL3luwE6HNcIyK5Y/+To04vR3OD7Uz8cnABxWyOeSBm2R2bu2fxeN0Hlv+qhoOYtbZ1DKx/aES4z51jATynEIdMIMSNhmVDoDiGODh9ocenzg/DUarjIzWltPFRyQj+tnFGTXp7C87Line truncated
@@ -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}]}
+1
View File
@@ -0,0 +1 @@
{"note":"A file whose lines end in CR LF, which is not the canonical form.","rule":"package.file.canonical"}
@@ -0,0 +1 @@
{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"e10c4aaab285d02d859ed2cf590fa9add9b77b0fab7a2b71b8c82f61b310a031","size":764},{"path":"nodes.jsonl","sha256":"6ce54e0d837dceb4a2a39c1b2618cc66e16684b93f71b93ab4e6e709a90b0e52","size":11295},{"path":"provenance.json","sha256":"fcbae067529e8476e0fbace4ed94cbb174c31b943fb4f26dc63b316f5dc46b9c","size":227},{"path":"receipts.jsonl","sha256":"f745067d43480bbd467c5d8f11ff13eec198fac821664894ad8bd90b8b7cf0b3","size":2182},{"path":"references.jsonl","sha256":"59908a8aff6a2d5800747a1f45c6c2943ea1e31e7e1f10b6348967d30f16b87e","size":60},{"path":"roster.json","sha256":"3c71b0c007924cbacd3b4af02485214ab904db8ff8fca133ab32e67c5c76d481","size":6941},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026tiny-j4qm"}
@@ -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":{"algorithm":"sha-256","scheme":"plain"},"history":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","key":"tiny2026tiny-j4qm","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"author":[{"family":"Tiny","given":"T."}],"issued":{"date-parts":[[2026]]},"title":"A tiny example"},"meta_hash":"1062e6079e2871c390f4737f5354448b65fe524d8c09d1c82afaa8b71ba6b3e7","policy":"full","relations":[],"rev":0,"root":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","version":{"type":"version-of-record"},"work":{"key":"tiny2026tiny-j4qm","same_as":["doi:10.5555/example.tiny.2026"]}}
+22
View File
@@ -0,0 +1,22 @@
{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"s0fn2fj","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"}
{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"b9wp3tt","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"ea9a1409bbf0f0f7bd8d508bfdbbf7d14a22ab1e3da011eafbfcd4e14ae7e4fd","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"s0fn2fj","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"vet7k0e","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"b9wp3tt","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"em5pd9v","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"vet7k0e","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"ytp1e5n","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"7667a3a4bc2e8fec1dc7af53e19c414952f9ce926b1e37e8d9adca66dd8f8d1d","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"}
{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"jvnys4s","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"ytp1e5n","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"}
{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"tb49qpc","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["r3e21zr"],"text":"1"}],"fidelity":"F2","id":"mzwwhxj","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e","ord":1,"own_hash":"02ed6d50b8ac607b59e3f7b5116ee6143ed7e69af25b19c4037aa799bc330a88","parent":"ytp1e5n","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"}
{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"exq1ter","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"}
{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"j663d4h","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"exq1ter","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"}
{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"rsw24qc","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"exq1ter","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"}
{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["af5b51r"],"id":"pj5sk05"},{"header_path":["ajqxkgh"],"id":"nymcs5q"}]},"id":"tb49qpc","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"154c910857f33c152fdc78e42582510327055e62da9a25ab10c3891eeaf69627","ord":3,"own_hash":"fb4cc66080def0b42a06f7aa566a24957c7345c77b8d873ca5c790704a890f47","parent":"b9wp3tt","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"t2ps2mp","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"6d8056adfb50dc0b65a2a65b47eccc5f47d5482a8dfbefa0d8a06f6641a4be3a","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"tb49qpc","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"rr9rtf5","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"8bd1fa377ec390fdc36e17baa8c3a39d2df7ef2a53cd0c0dc745ae40e98f99f8","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"t2ps2mp","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"pj5sk05","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"af5b51r","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5","ord":0,"own_hash":"c68933b07bc7c5b806892ae36b3e4c3205a0a2066fd6f8255578f7d1ca86dc10","parent":"rr9rtf5","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"}
{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"nymcs5q","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"ajqxkgh","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87","ord":1,"own_hash":"28df42bf1dcd44b053275ed014bd1599914f17adabc0c7fdb3e4247dc648ac49","parent":"rr9rtf5","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"dmsstkg","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"baf17577660aa6f0ba9c8703d30816d77cfce7dbf0ea3257ed830fa9ab94ce9d","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"tb49qpc","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["rdrqkv7"]},"id":"r3e7hfs","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"97a1f5b27bbfe8c9d2cec7212b519b4993506fc8080be3eff02f3aa31515a19d","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"dmsstkg","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"pj5sk05","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"rdrqkv7","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df","ord":0,"own_hash":"fb474321001657b59bccd3cae0987c544a4ef9a27214626d77695f4db237aa93","parent":"r3e7hfs","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"}
{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"nymcs5q","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"f463wj7","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd","ord":1,"own_hash":"088eff622eb3086d68c4433cf5e1783dc9f2a6724c3536c31ec0bf80b5f89db5","parent":"r3e7hfs","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"aw97y35","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"s0fn2fj","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"yd513mw","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"aw97y35","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"r3e21zr","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"yd513mw","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
@@ -0,0 +1 @@
{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"paperspec tools/build.py"}],"tools":[{"name":"paperspec tools/build.py","version":"0.1.0"}]}
@@ -0,0 +1 @@
{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026tiny-j4qm","evidence":[{"kind":"crop","node":"af5b51r","sha256":"78b08276b5122feed3829e8dd19684fa8a4a41f79cb83a499d40341e09f5d658"},{"kind":"crop","node":"ajqxkgh","sha256":"398bab4177685c88eef399d814d34c81baa556d58cd508bd5ddb33ac53a5cbfa"},{"kind":"crop","node":"f463wj7","sha256":"88b1e820b569c3a0fd025a6b6c502271ed73bbce720dd8a2e416d6a5dd0e9d67"},{"kind":"crop","node":"j663d4h","sha256":"d6484c89588a560f64bbceca108f5446e47bb5cb85521fbffc9d6d37f252e5c7"},{"kind":"crop","node":"jvnys4s","sha256":"3139fb30b88062bd0c6bbb028c4c57fc748218ce1d7a612d282e292d6a02ffe9"},{"kind":"crop","node":"mzwwhxj","sha256":"83a7fcf09321f8a644c58120f80dede5d73d89f50d080ccbb143ec5b485e3088"},{"kind":"crop","node":"r3e21zr","sha256":"ff809e11101fa6ff5422e5232e83142c1a43dada0e56d63ec03fbce3474dd1aa"},{"kind":"crop","node":"rdrqkv7","sha256":"c0699aceb344812ebebb1414838641f0761184d5113dcc870d07c721fd289437"},{"kind":"crop","node":"rsw24qc","sha256":"b4c3b133c707b1a9a2cec2efe5c17731bada0d6bace5b1fb3590c5c5ab18bb92"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"k4wt522d9zvjr","level":"F3","nodes":[["af5b51r","59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5"],["ajqxkgh","838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87"],["f463wj7","f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd"],["j663d4h","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["jvnys4s","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["mzwwhxj","8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e"],["r3e21zr","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["rdrqkv7","87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df"],["rsw24qc","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"15d9c8bd5472afd7064578e5663d3b7fd21249adc6cdb40fcbe1b790e3fae801","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"/xOfCboOpgu29ztKi22IU9crgC5LYetrHOMpQtqj4QV5dVP73n/ze94hyPknYO5qNPgBmYRrbJZBIIHdwqxoAA=="}}
@@ -0,0 +1 @@
{"label":"1","node":"r3e21zr","resolution":{"type":"none"}}
@@ -0,0 +1 @@
{"format":"scienting-roster/1","keys":[{"did":"did:key:z6Mkj7iUX8QG7zkAtNaV78CUXcenhD87qWwQbc7NU5aVXyW9","id":"ana","person":{"name":"Ana Example"},"public":"RUiz5j+y0QwgOtsQpqXrlq+gy3c/JFnkxwvlWUNX4Ao=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"owner","scheme":"ed25519"},{"did":"did:key:z6MkhemKN7rMQcgt6wT2eWPyx3vFRS1RUoRziLMnLq2vZ9yi","id":"ben","person":{"name":"Ben Example"},"public":"L4WMLs7xLjBLRsxS/EYpD194puMBpADybcfFEWxBkWk=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6MkrBf2w3MUroaNBiHTQJzH4e1w31jpcosd5vNxjikijndU","id":"ben-spot","person":{"name":"Ben Example"},"public":"rkzxigjCXg869PGSFAVr4EDXXRmwk+S/+wJ93lrG4dc=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6Mkgrc9HCeEUL5tz1bVfuuDeSm6mP6hyWUX5ivhgReSbEQM","id":"cara","person":{"name":"Cara Example"},"public":"I7J1GqG5CHOc0LHYZPNNto1Me2lJUzBVn2A7GrUGbZ4=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"reader","scheme":"ed25519"},{"did":"did:key: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","id":"dana","person":{"name":"Dana Example"},"public":"lQ6M2DulKY4RkQLGTPGZD+CHlOOib4kBkwlccVNWRDPco1k5kHtelT/yUP4+CoAQnHnLu96vpeWztaee/9RmjR3bstGj+P5tOSrwFlPuyNUPOWPNjwCQLrVEyeUGBaA4+HRvFwK7C4OHB8EJWYtC0OuH+tRPlCdLpxlVcZZcM7dsZYe2BDNenbWfp4TeX2Oa+dThlceDY0m9MewwqUrd5xdo9tc8PS9R9o0ZUWf0vDw7Fc5AcsWwbf76lDLvIbyd0aCaHJ7eaK6DFsBuZFKVdlZlH0inJciAMF8dPoRuE+A0VlZTEOsOivNWprM5iLHzXse3zSoHLldWr0t4hWxHH3MBQ57Ucee8RTU6hFRfqfFRl6zJQyRZOFZZoYD9QwXkR3NmUzV/FcsOMHpbgTcY7O0TAajPnfpSTp+XdyPVBR7TlTsturUCpryP0ZX1S3VJk2IaneB123thtcOtWsbqdT3Bb846H7yudI95WVTixIS/KIwoCbekSf8Y9+iW/xRVSWLRVc1gpigDxXfieSA7bI+qiUBjiKR7QU1KFYZA58VcOQhzeMLY6an34rsW4WHAwzzSv8Q6vrwpn8Ct9fTsIeiZsWZLueNkIUfjR0G1bHHoT2RHKton0AMRjOUGSKUUB4DNZ5xzXvC0jvUMWlgHB9z2wBCsIkIDVWqSA2DD0xeIY2wSUVPwPc1MnBAf/Fx3poweUlcPWglR2VaO9ematC4hfLxxkGldGQt3C6ZLPsm96S7o6j88rwOqkDNIR1pNJOepgciJH/w4Xwtg9gJ52CpdlCeSllRQD74l95ysmZ2D/gLweNoUt61P0RYQQelio8VnPUNB1e2uK7zW9joG1k59CjJGQNvuZr6JkQ9+Hxo5xKEOy9KcpT6t48wTzbz3YMFDxTNl0/DzL8qdTU2UrSW6/TFgPLokbAQN00yhw0lg8cR/e1m+ujFyBeesL3luwE6HNcIyK5Y/+To04vR3OD7Uz8cnABxWyOeSBm2R2bu2fxeN0Hlv+qhoOYtbZ1DKx/aES4z51jATynEIdMIMSNhmVDoDiGODh9ocenzg/DUarjIzWltPFRyQj+tnFGTXp7C87Line truncated
@@ -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}]}
@@ -0,0 +1 @@
{"note":"An optional JSONL file with no records.","rule":"package.file.empty"}
@@ -0,0 +1 @@
{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"e10c4aaab285d02d859ed2cf590fa9add9b77b0fab7a2b71b8c82f61b310a031","size":764},{"path":"nodes.jsonl","sha256":"6ce54e0d837dceb4a2a39c1b2618cc66e16684b93f71b93ab4e6e709a90b0e52","size":11295},{"path":"provenance.json","sha256":"4bc7649bf6d3113f6c72b4016713654f57c8f03069632eabd1e6025c05cb9dac","size":226},{"path":"receipts.jsonl","sha256":"f745067d43480bbd467c5d8f11ff13eec198fac821664894ad8bd90b8b7cf0b3","size":2182},{"path":"references.jsonl","sha256":"59908a8aff6a2d5800747a1f45c6c2943ea1e31e7e1f10b6348967d30f16b87e","size":60},{"path":"roster.json","sha256":"3c71b0c007924cbacd3b4af02485214ab904db8ff8fca133ab32e67c5c76d481","size":6941},{"path":"suspects.jsonl","sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","size":0},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026tiny-j4qm"}
@@ -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":{"algorithm":"sha-256","scheme":"plain"},"history":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","key":"tiny2026tiny-j4qm","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"author":[{"family":"Tiny","given":"T."}],"issued":{"date-parts":[[2026]]},"title":"A tiny example"},"meta_hash":"1062e6079e2871c390f4737f5354448b65fe524d8c09d1c82afaa8b71ba6b3e7","policy":"full","relations":[],"rev":0,"root":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","version":{"type":"version-of-record"},"work":{"key":"tiny2026tiny-j4qm","same_as":["doi:10.5555/example.tiny.2026"]}}
@@ -0,0 +1,22 @@
{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"s0fn2fj","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"}
{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"b9wp3tt","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"ea9a1409bbf0f0f7bd8d508bfdbbf7d14a22ab1e3da011eafbfcd4e14ae7e4fd","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"s0fn2fj","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"vet7k0e","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"b9wp3tt","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"em5pd9v","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"vet7k0e","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"ytp1e5n","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"7667a3a4bc2e8fec1dc7af53e19c414952f9ce926b1e37e8d9adca66dd8f8d1d","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"}
{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"jvnys4s","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"ytp1e5n","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"}
{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"tb49qpc","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["r3e21zr"],"text":"1"}],"fidelity":"F2","id":"mzwwhxj","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e","ord":1,"own_hash":"02ed6d50b8ac607b59e3f7b5116ee6143ed7e69af25b19c4037aa799bc330a88","parent":"ytp1e5n","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"}
{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"exq1ter","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"}
{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"j663d4h","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"exq1ter","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"}
{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"rsw24qc","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"exq1ter","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"}
{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["af5b51r"],"id":"pj5sk05"},{"header_path":["ajqxkgh"],"id":"nymcs5q"}]},"id":"tb49qpc","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"154c910857f33c152fdc78e42582510327055e62da9a25ab10c3891eeaf69627","ord":3,"own_hash":"fb4cc66080def0b42a06f7aa566a24957c7345c77b8d873ca5c790704a890f47","parent":"b9wp3tt","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"t2ps2mp","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"6d8056adfb50dc0b65a2a65b47eccc5f47d5482a8dfbefa0d8a06f6641a4be3a","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"tb49qpc","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"rr9rtf5","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"8bd1fa377ec390fdc36e17baa8c3a39d2df7ef2a53cd0c0dc745ae40e98f99f8","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"t2ps2mp","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"pj5sk05","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"af5b51r","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5","ord":0,"own_hash":"c68933b07bc7c5b806892ae36b3e4c3205a0a2066fd6f8255578f7d1ca86dc10","parent":"rr9rtf5","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"}
{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"nymcs5q","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"ajqxkgh","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87","ord":1,"own_hash":"28df42bf1dcd44b053275ed014bd1599914f17adabc0c7fdb3e4247dc648ac49","parent":"rr9rtf5","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"dmsstkg","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"baf17577660aa6f0ba9c8703d30816d77cfce7dbf0ea3257ed830fa9ab94ce9d","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"tb49qpc","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["rdrqkv7"]},"id":"r3e7hfs","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"97a1f5b27bbfe8c9d2cec7212b519b4993506fc8080be3eff02f3aa31515a19d","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"dmsstkg","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"pj5sk05","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"rdrqkv7","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df","ord":0,"own_hash":"fb474321001657b59bccd3cae0987c544a4ef9a27214626d77695f4db237aa93","parent":"r3e7hfs","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"}
{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"nymcs5q","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"f463wj7","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd","ord":1,"own_hash":"088eff622eb3086d68c4433cf5e1783dc9f2a6724c3536c31ec0bf80b5f89db5","parent":"r3e7hfs","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"aw97y35","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"s0fn2fj","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"yd513mw","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"aw97y35","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"r3e21zr","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"yd513mw","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
@@ -0,0 +1 @@
{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"paperspec tools/build.py"}],"tools":[{"name":"paperspec tools/build.py","version":"0.1.0"}]}
@@ -0,0 +1 @@
{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026tiny-j4qm","evidence":[{"kind":"crop","node":"af5b51r","sha256":"78b08276b5122feed3829e8dd19684fa8a4a41f79cb83a499d40341e09f5d658"},{"kind":"crop","node":"ajqxkgh","sha256":"398bab4177685c88eef399d814d34c81baa556d58cd508bd5ddb33ac53a5cbfa"},{"kind":"crop","node":"f463wj7","sha256":"88b1e820b569c3a0fd025a6b6c502271ed73bbce720dd8a2e416d6a5dd0e9d67"},{"kind":"crop","node":"j663d4h","sha256":"d6484c89588a560f64bbceca108f5446e47bb5cb85521fbffc9d6d37f252e5c7"},{"kind":"crop","node":"jvnys4s","sha256":"3139fb30b88062bd0c6bbb028c4c57fc748218ce1d7a612d282e292d6a02ffe9"},{"kind":"crop","node":"mzwwhxj","sha256":"83a7fcf09321f8a644c58120f80dede5d73d89f50d080ccbb143ec5b485e3088"},{"kind":"crop","node":"r3e21zr","sha256":"ff809e11101fa6ff5422e5232e83142c1a43dada0e56d63ec03fbce3474dd1aa"},{"kind":"crop","node":"rdrqkv7","sha256":"c0699aceb344812ebebb1414838641f0761184d5113dcc870d07c721fd289437"},{"kind":"crop","node":"rsw24qc","sha256":"b4c3b133c707b1a9a2cec2efe5c17731bada0d6bace5b1fb3590c5c5ab18bb92"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"k4wt522d9zvjr","level":"F3","nodes":[["af5b51r","59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5"],["ajqxkgh","838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87"],["f463wj7","f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd"],["j663d4h","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["jvnys4s","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["mzwwhxj","8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e"],["r3e21zr","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["rdrqkv7","87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df"],["rsw24qc","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"15d9c8bd5472afd7064578e5663d3b7fd21249adc6cdb40fcbe1b790e3fae801","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"/xOfCboOpgu29ztKi22IU9crgC5LYetrHOMpQtqj4QV5dVP73n/ze94hyPknYO5qNPgBmYRrbJZBIIHdwqxoAA=="}}
@@ -0,0 +1 @@
{"label":"1","node":"r3e21zr","resolution":{"type":"none"}}
@@ -0,0 +1 @@
{"format":"scienting-roster/1","keys":[{"did":"did:key:z6Mkj7iUX8QG7zkAtNaV78CUXcenhD87qWwQbc7NU5aVXyW9","id":"ana","person":{"name":"Ana Example"},"public":"RUiz5j+y0QwgOtsQpqXrlq+gy3c/JFnkxwvlWUNX4Ao=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"owner","scheme":"ed25519"},{"did":"did:key:z6MkhemKN7rMQcgt6wT2eWPyx3vFRS1RUoRziLMnLq2vZ9yi","id":"ben","person":{"name":"Ben Example"},"public":"L4WMLs7xLjBLRsxS/EYpD194puMBpADybcfFEWxBkWk=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6MkrBf2w3MUroaNBiHTQJzH4e1w31jpcosd5vNxjikijndU","id":"ben-spot","person":{"name":"Ben Example"},"public":"rkzxigjCXg869PGSFAVr4EDXXRmwk+S/+wJ93lrG4dc=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6Mkgrc9HCeEUL5tz1bVfuuDeSm6mP6hyWUX5ivhgReSbEQM","id":"cara","person":{"name":"Cara Example"},"public":"I7J1GqG5CHOc0LHYZPNNto1Me2lJUzBVn2A7GrUGbZ4=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"reader","scheme":"ed25519"},{"did":"did:key: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","id":"dana","person":{"name":"Dana Example"},"public":"lQ6M2DulKY4RkQLGTPGZD+CHlOOib4kBkwlccVNWRDPco1k5kHtelT/yUP4+CoAQnHnLu96vpeWztaee/9RmjR3bstGj+P5tOSrwFlPuyNUPOWPNjwCQLrVEyeUGBaA4+HRvFwK7C4OHB8EJWYtC0OuH+tRPlCdLpxlVcZZcM7dsZYe2BDNenbWfp4TeX2Oa+dThlceDY0m9MewwqUrd5xdo9tc8PS9R9o0ZUWf0vDw7Fc5AcsWwbf76lDLvIbyd0aCaHJ7eaK6DFsBuZFKVdlZlH0inJciAMF8dPoRuE+A0VlZTEOsOivNWprM5iLHzXse3zSoHLldWr0t4hWxHH3MBQ57Ucee8RTU6hFRfqfFRl6zJQyRZOFZZoYD9QwXkR3NmUzV/FcsOMHpbgTcY7O0TAajPnfpSTp+XdyPVBR7TlTsturUCpryP0ZX1S3VJk2IaneB123thtcOtWsbqdT3Bb846H7yudI95WVTixIS/KIwoCbekSf8Y9+iW/xRVSWLRVc1gpigDxXfieSA7bI+qiUBjiKR7QU1KFYZA58VcOQhzeMLY6an34rsW4WHAwzzSv8Q6vrwpn8Ct9fTsIeiZsWZLueNkIUfjR0G1bHHoT2RHKton0AMRjOUGSKUUB4DNZ5xzXvC0jvUMWlgHB9z2wBCsIkIDVWqSA2DD0xeIY2wSUVPwPc1MnBAf/Fx3poweUlcPWglR2VaO9ematC4hfLxxkGldGQt3C6ZLPsm96S7o6j88rwOqkDNIR1pNJOepgciJH/w4Xwtg9gJ52CpdlCeSllRQD74l95ysmZ2D/gLweNoUt61P0RYQQelio8VnPUNB1e2uK7zW9joG1k59CjJGQNvuZr6JkQ9+Hxo5xKEOy9KcpT6t48wTzbz3YMFDxTNl0/DzL8qdTU2UrSW6/TFgPLokbAQN00yhw0lg8cR/e1m+ujFyBeesL3luwE6HNcIyK5Y/+To04vR3OD7Uz8cnABxWyOeSBm2R2bu2fxeN0Hlv+qhoOYtbZ1DKx/aES4z51jATynEIdMIMSNhmVDoDiGODh9ocenzg/DUarjIzWltPFRyQj+tnFGTXp7C87Line truncated
Whitespace-only changes.
@@ -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}]}
@@ -0,0 +1 @@
{"note":"A node_hash that does not recompute.","rule":"doc.hash.node-hash"}
@@ -0,0 +1 @@
{"doc":"scienting-doc/1","files":[{"path":"document.json","sha256":"e10c4aaab285d02d859ed2cf590fa9add9b77b0fab7a2b71b8c82f61b310a031","size":764},{"path":"nodes.jsonl","sha256":"11e236bf3394043f2b42090a9149fa598fa1e3c5e947df063b38f569b2d27fa2","size":11295},{"path":"provenance.json","sha256":"4bc7649bf6d3113f6c72b4016713654f57c8f03069632eabd1e6025c05cb9dac","size":226},{"path":"receipts.jsonl","sha256":"f745067d43480bbd467c5d8f11ff13eec198fac821664894ad8bd90b8b7cf0b3","size":2182},{"path":"references.jsonl","sha256":"59908a8aff6a2d5800747a1f45c6c2943ea1e31e7e1f10b6348967d30f16b87e","size":60},{"path":"roster.json","sha256":"3c71b0c007924cbacd3b4af02485214ab904db8ff8fca133ab32e67c5c76d481","size":6941},{"path":"witnesses.json","sha256":"83ac4411c2efe65e0f7fc4c9336abbef6977cd32b0f90de029a7f8516afc3e97","size":750}],"format":"scienting-package/1","key":"tiny2026tiny-j4qm"}
@@ -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":{"algorithm":"sha-256","scheme":"plain"},"history":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","key":"tiny2026tiny-j4qm","kind":"article","language":"en","license":{"spdx":"CC0-1.0"},"meta":{"author":[{"family":"Tiny","given":"T."}],"issued":{"date-parts":[[2026]]},"title":"A tiny example"},"meta_hash":"1062e6079e2871c390f4737f5354448b65fe524d8c09d1c82afaa8b71ba6b3e7","policy":"full","relations":[],"rev":0,"root":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","version":{"type":"version-of-record"},"work":{"key":"tiny2026tiny-j4qm","same_as":["doi:10.5555/example.tiny.2026"]}}
@@ -0,0 +1,22 @@
{"align_key":"b3108c22ec836d883e5116f7ed8546fa75390eb4aa960d78f2936115f69b6826","id":"s0fn2fj","kind":"document","match_hash":"b6a4e12f700a6214bf02c9a437559e82fccdbecea7b575fa438a7d2e8c33071a","node_hash":"a05328e6d13edba652599aceb58c018dbccf54abd1f878c9f61623017960e1fe","ord":0,"own_hash":"34444fe0e6bdbf3927a579fe3286859d204ea0882a381b7769ffd4905551d24f","parent":null,"text_hash":"bd2abc746d51cf52d57a18632383245d585e29e265426967894eed99bc937561"}
{"align_key":"caf6aee3882b3890996037e35d0ffdfe30b5e66653d45321d7ea0fa9135f1ee9","attrs":{"level":1},"id":"b9wp3tt","kind":"section","label":"1","match_hash":"5a96c01f314c4d8a22fd5e105bebef45df4301886cccbc2538ecefddfcb1d405","node_hash":"ea9a1409bbf0f0f7bd8d508bfdbbf7d14a22ab1e3da011eafbfcd4e14ae7e4fd","ord":0,"own_hash":"65da097b48f8237e8d171bfbd0053ff0e3795c0532d5522d23a92b53430956f4","parent":"s0fn2fj","text_hash":"7a97628fe9643c0fca3614a077e2e631c3fee81d3733ba1564292df65a294573"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","id":"vet7k0e","kind":"heading","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"a3c82ab1e44bf4cffa1a59507f8bddc39a1ad191321ee803d0d60d96609a44c7","ord":0,"own_hash":"e813ff86a8920cef741e548eb5df545774b520d2fadbdda6e2b872a6729b9d26","parent":"b9wp3tt","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"c099142bc3186ded72786ba27e9ea6d2da240fb9fd3fe79b479ecf8e734b2850","content":[{"kind":"text","text":"Results"}],"fidelity":"F2","id":"em5pd9v","kind":"sentence","match_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd","node_hash":"293fc03ff4e39d7532467e4417ffcdb15f470f0bd3658dc1c021645ad53c9bef","ord":0,"own_hash":"c55f401232b19ff1133d77eac6c72868975064f177fc2d31ab8a181303c30599","parent":"vet7k0e","text_hash":"219c4a6c86a716e99d5dc9611b61e584deb11b57e972d87d4b773387ebc3cadd"}
{"align_key":"610c235321e38145abff21e31eaab303d85a6ce0d1b9340a599dc821a04922f6","id":"ytp1e5n","kind":"paragraph","match_hash":"bcb4902ec69f2a7a724384f561ee9aa0e214c824c5882c1ad92777bee680aad4","node_hash":"7667a3a4bc2e8fec1dc7af53e19c414952f9ce926b1e37e8d9adca66dd8f8d1d","ord":1,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"f589ee914c46c4aea7ce2de49d925c433c914121f576b81a3eab692f17f179a3"}
{"align_key":"8f21603c39df123eb8680362184274aac9bdf1dbd485b3bba230960179071c95","content":[{"kind":"text","text":"The value is 42.0 at 300 K."}],"fidelity":"F2","id":"jvnys4s","kind":"sentence","match_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3","node_hash":"0000000000000000000000000000000000000000000000000000000000000000","ord":0,"own_hash":"7f0b9190d076cf01b51a8be863a51e9a8eeaab5d3ec8656202ff4d41578d4d82","parent":"ytp1e5n","text_hash":"3bcf9fa8412dca28be91d6423460233ddedd7add6c324d8a0f2b26038567d3d3"}
{"align_key":"8e7fe271cd1bab88d86c8900fe3ffae0ce95c55af6659df1fca278d359296e2d","content":[{"kind":"text","text":"See "},{"kind":"xref","target":"tb49qpc","text":"Table 1"},{"kind":"text","text":" and the note."},{"kind":"cite","refs":["r3e21zr"],"text":"1"}],"fidelity":"F2","id":"mzwwhxj","kind":"sentence","match_hash":"9894a48790a8561966e68672fa13da20541d25a5178653720648f62cbc9ad36b","node_hash":"8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e","ord":1,"own_hash":"02ed6d50b8ac607b59e3f7b5116ee6143ed7e69af25b19c4037aa799bc330a88","parent":"ytp1e5n","text_hash":"5b1de19c9eb1399e54bde7e96f051cac8b337be1f307fac320292b8db7e39da7"}
{"align_key":"282eea00b316a6950fb7179f6289a8b98359019e11cb23a3ff426cdecad90165","id":"exq1ter","kind":"paragraph","match_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1","node_hash":"062dd26bfb226ca9811d0dfb013df211cb201dfe7b4b25f9aba000f3212298d5","ord":2,"own_hash":"494e069be36a18ecaabf5a63be7c31617ade7a5460218ca83a2de3d8d8f964e0","parent":"b9wp3tt","text_hash":"da88f35d24faf0099610c720953c4919647a5dfb9003889a15c464cd9c540fb1"}
{"align_key":"b8074a8bc013aa007023c4cce7334f1e1f22384d57a526ca22fd2f5589d5ab17","content":[{"kind":"text","text":"A second paragraph."}],"fidelity":"F2","id":"j663d4h","kind":"sentence","match_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e","node_hash":"443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab","ord":0,"own_hash":"acee4b6b1399bfde1dc67dea8d8c86b0db961d2af516ae4aaee26f294261456f","parent":"exq1ter","text_hash":"2e8313b033de5e17878ae778d6293bbd6e197a072f36acf7fe0840a690a7f31e"}
{"align_key":"437c101749b0481e615fc7eed8dcacb536b65400c7e0695ad4cbb2bf2dae488c","content":[{"kind":"text","text":"It ends here."}],"fidelity":"F2","id":"rsw24qc","kind":"sentence","match_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882","node_hash":"caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57","ord":1,"own_hash":"705f77e8520c8c5ce3a7a495a20d8a9c55baa9801e49a55c341f5de79eeede75","parent":"exq1ter","text_hash":"2888dbfa0c08fd65c58c923b920860c76e13913d9fa93b03eccbbf7bdf53b882"}
{"align_key":"cb0107aa0d562e8bd1188c33dc1ef5a1d07808e51edeabaa87465556d11b6ec8","attrs":{"columns":[{"header_path":["af5b51r"],"id":"pj5sk05"},{"header_path":["ajqxkgh"],"id":"nymcs5q"}]},"id":"tb49qpc","kind":"table","label":"Table 1","match_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72","node_hash":"154c910857f33c152fdc78e42582510327055e62da9a25ab10c3891eeaf69627","ord":3,"own_hash":"fb4cc66080def0b42a06f7aa566a24957c7345c77b8d873ca5c790704a890f47","parent":"b9wp3tt","text_hash":"1951e0b61441d7b817b4967b36eee007f8e7525ac75fd359437eddb871e59f72"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"t2ps2mp","kind":"table-head","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"6d8056adfb50dc0b65a2a65b47eccc5f47d5482a8dfbefa0d8a06f6641a4be3a","ord":0,"own_hash":"c5749bee3a4b981fb79cf6db125ebb416dce5a83613a00feecd9d4cf75df9bb4","parent":"tb49qpc","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"769a4e6d0003189c7e96c5d9b7e810a0d11c3a12832527ec94b0f86d277f51ca","id":"rr9rtf5","kind":"row","match_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19","node_hash":"8bd1fa377ec390fdc36e17baa8c3a39d2df7ef2a53cd0c0dc745ae40e98f99f8","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"t2ps2mp","text_hash":"887fcea6a80333c6c02ae7e79735f0edad8d811f0b61431495f796f4bf6a7c19"}
{"align_key":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","attrs":{"colspan":1,"column":"pj5sk05","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"x"}],"fidelity":"F1","id":"af5b51r","kind":"cell","match_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881","node_hash":"59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5","ord":0,"own_hash":"c68933b07bc7c5b806892ae36b3e4c3205a0a2066fd6f8255578f7d1ca86dc10","parent":"rr9rtf5","text_hash":"2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"}
{"align_key":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","attrs":{"colspan":1,"column":"nymcs5q","role":"column-header","rowspan":1},"content":[{"kind":"text","text":"y"}],"fidelity":"F1","id":"ajqxkgh","kind":"cell","match_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa","node_hash":"838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87","ord":1,"own_hash":"28df42bf1dcd44b053275ed014bd1599914f17adabc0c7fdb3e4247dc648ac49","parent":"rr9rtf5","text_hash":"a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","id":"dmsstkg","kind":"table-body","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"baf17577660aa6f0ba9c8703d30816d77cfce7dbf0ea3257ed830fa9ab94ce9d","ord":1,"own_hash":"b229a7f92314227bf225ad27010a546e7c2373f4b30b7f6ec372e568cbacb6aa","parent":"tb49qpc","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda","attrs":{"header_path":["rdrqkv7"]},"id":"r3e7hfs","kind":"row","match_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738","node_hash":"97a1f5b27bbfe8c9d2cec7212b519b4993506fc8080be3eff02f3aa31515a19d","ord":0,"own_hash":"6c7c11bf1b6260162c4141f1468aa6869f5c33359900497e2cdb1a051488bd62","parent":"dmsstkg","text_hash":"24cb52bc2dd0b9ddd4650c011d76b585e76c4d4ecae8cf220c7600efb808d738"}
{"align_key":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","attrs":{"colspan":1,"column":"pj5sk05","role":"row-header","rowspan":1},"content":[{"kind":"text","text":"1"}],"fidelity":"F1","id":"rdrqkv7","kind":"cell","match_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b","node_hash":"87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df","ord":0,"own_hash":"fb474321001657b59bccd3cae0987c544a4ef9a27214626d77695f4db237aa93","parent":"r3e7hfs","text_hash":"6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b"}
{"align_key":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","attrs":{"colspan":1,"column":"nymcs5q","role":"data","rowspan":1},"content":[{"kind":"text","text":"2.5"}],"fidelity":"F1","id":"f463wj7","kind":"cell","match_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61","node_hash":"f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd","ord":1,"own_hash":"088eff622eb3086d68c4433cf5e1783dc9f2a6724c3536c31ec0bf80b5f89db5","parent":"r3e7hfs","text_hash":"b8736b999909049671d0ea075a42b308a5fbe2df1854899123fe09eb0ee9de61"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"aw97y35","kind":"back","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"fcb8027f7c89115f048b9c5d6770847248f4e4fbc61cbc8ea0b04079b4d58350","ord":1,"own_hash":"bbb972bdc024231b505f4d8ce5e711fbb75c8b5ffd1b5d42ee3fb8586b85f867","parent":"s0fn2fj","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","id":"yd513mw","kind":"references","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"8b8a9000e984c3efeb27fc40c8fbadd7349dd64860aa276dcd2a25a57ce52e87","ord":0,"own_hash":"2a5302e2041d0e59458fea212dd51b89299901318bfceeeff227c1a07d3f5d1a","parent":"aw97y35","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
{"align_key":"b35d81b0ff35d6d05ad2c187a289d3017896427dfd8bb98160bc806ac0ec32f7","content":[{"kind":"text","text":"1. An Example, 2020."}],"fidelity":"F2","id":"r3e21zr","kind":"reference","label":"1","match_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e","node_hash":"71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed","ord":0,"own_hash":"f7c9bbc8c7456e6dc435feeaaa02cbfdbe487523b020105793fb11b91d0894f5","parent":"yd513mw","text_hash":"9a2d5d28ee47736a00d074e066bb944154f95a192360c8c04226c3d12a4f7d1e"}
@@ -0,0 +1 @@
{"note":"Built by hand for the conformance suite; every reading is synthetic.","stages":[{"processor":"local","stage":"hand","tool":"paperspec tools/build.py"}],"tools":[{"name":"paperspec tools/build.py","version":"0.1.0"}]}
@@ -0,0 +1 @@
{"at":"2026-10-11T12:00:00Z","by":"ana","doc":"tiny2026tiny-j4qm","evidence":[{"kind":"crop","node":"af5b51r","sha256":"78b08276b5122feed3829e8dd19684fa8a4a41f79cb83a499d40341e09f5d658"},{"kind":"crop","node":"ajqxkgh","sha256":"398bab4177685c88eef399d814d34c81baa556d58cd508bd5ddb33ac53a5cbfa"},{"kind":"crop","node":"f463wj7","sha256":"88b1e820b569c3a0fd025a6b6c502271ed73bbce720dd8a2e416d6a5dd0e9d67"},{"kind":"crop","node":"j663d4h","sha256":"d6484c89588a560f64bbceca108f5446e47bb5cb85521fbffc9d6d37f252e5c7"},{"kind":"crop","node":"jvnys4s","sha256":"3139fb30b88062bd0c6bbb028c4c57fc748218ce1d7a612d282e292d6a02ffe9"},{"kind":"crop","node":"mzwwhxj","sha256":"83a7fcf09321f8a644c58120f80dede5d73d89f50d080ccbb143ec5b485e3088"},{"kind":"crop","node":"r3e21zr","sha256":"ff809e11101fa6ff5422e5232e83142c1a43dada0e56d63ec03fbce3474dd1aa"},{"kind":"crop","node":"rdrqkv7","sha256":"c0699aceb344812ebebb1414838641f0761184d5113dcc870d07c721fd289437"},{"kind":"crop","node":"rsw24qc","sha256":"b4c3b133c707b1a9a2cec2efe5c17731bada0d6bace5b1fb3590c5c5ab18bb92"},{"kind":"witness","sha256":"fda3f1e9bb3538cd85dcc42281e00fd045f726652664439ce5a15d8489425b21"}],"format":"scienting-receipt/1","id":"k4wt522d9zvjr","level":"F3","nodes":[["af5b51r","59d1c20766a77bacde2aae80a134c7156fbcc708c140a3bb2d2a67f78bd9c6f5"],["ajqxkgh","838e3fba38f0797d40522b7063cb5c2962e32a019c09c19f09849ced73079a87"],["f463wj7","f1cd6d5339c84d5c36f8e1ea484a8d837f3200f05d1b106f6119dfa30d846bfd"],["j663d4h","443539440dca73149ca75276492334ce9a5a6c50070137e8dc7bf414b75a27ab"],["jvnys4s","f5761f338b2878dff39a6ee724a75b13626dd625a0df96cf1cc6f9e8258cb7cc"],["mzwwhxj","8f3e5338ba3c97efca4cef5c60d849757aed6334ee27ab807fa71d969089e46e"],["r3e21zr","71b1af6dd6a56f24cb3b338e0fe99df06b9154ecdf4b391b00b7a7e61e23a8ed"],["rdrqkv7","87da3bd568286f3d0578d8a813496d15faafb62f4db44b07aa1c29e52cda34df"],["rsw24qc","caeb3ae57d0821b8ac961c9507debbcda2b118b16cdc010b83a143a782058d57"]],"rev":0,"root":"15d9c8bd5472afd7064578e5663d3b7fd21249adc6cdb40fcbe1b790e3fae801","scope":"all","signature":{"key":"ana","scheme":"ed25519","value":"/xOfCboOpgu29ztKi22IU9crgC5LYetrHOMpQtqj4QV5dVP73n/ze94hyPknYO5qNPgBmYRrbJZBIIHdwqxoAA=="}}
@@ -0,0 +1 @@
{"label":"1","node":"r3e21zr","resolution":{"type":"none"}}
@@ -0,0 +1 @@
{"format":"scienting-roster/1","keys":[{"did":"did:key:z6Mkj7iUX8QG7zkAtNaV78CUXcenhD87qWwQbc7NU5aVXyW9","id":"ana","person":{"name":"Ana Example"},"public":"RUiz5j+y0QwgOtsQpqXrlq+gy3c/JFnkxwvlWUNX4Ao=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"owner","scheme":"ed25519"},{"did":"did:key:z6MkhemKN7rMQcgt6wT2eWPyx3vFRS1RUoRziLMnLq2vZ9yi","id":"ben","person":{"name":"Ben Example"},"public":"L4WMLs7xLjBLRsxS/EYpD194puMBpADybcfFEWxBkWk=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6MkrBf2w3MUroaNBiHTQJzH4e1w31jpcosd5vNxjikijndU","id":"ben-spot","person":{"name":"Ben Example"},"public":"rkzxigjCXg869PGSFAVr4EDXXRmwk+S/+wJ93lrG4dc=","purposes":["spot-check"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"editor","scheme":"ed25519"},{"did":"did:key:z6Mkgrc9HCeEUL5tz1bVfuuDeSm6mP6hyWUX5ivhgReSbEQM","id":"cara","person":{"name":"Cara Example"},"public":"I7J1GqG5CHOc0LHYZPNNto1Me2lJUzBVn2A7GrUGbZ4=","purposes":["sign"],"registered_at":"2026-09-01T00:00:00Z","revoked_at":null,"role":"reader","scheme":"ed25519"},{"did":"did:key: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","id":"dana","person":{"name":"Dana Example"},"public":"lQ6M2DulKY4RkQLGTPGZD+CHlOOib4kBkwlccVNWRDPco1k5kHtelT/yUP4+CoAQnHnLu96vpeWztaee/9RmjR3bstGj+P5tOSrwFlPuyNUPOWPNjwCQLrVEyeUGBaA4+HRvFwK7C4OHB8EJWYtC0OuH+tRPlCdLpxlVcZZcM7dsZYe2BDNenbWfp4TeX2Oa+dThlceDY0m9MewwqUrd5xdo9tc8PS9R9o0ZUWf0vDw7Fc5AcsWwbf76lDLvIbyd0aCaHJ7eaK6DFsBuZFKVdlZlH0inJciAMF8dPoRuE+A0VlZTEOsOivNWprM5iLHzXse3zSoHLldWr0t4hWxHH3MBQ57Ucee8RTU6hFRfqfFRl6zJQyRZOFZZoYD9QwXkR3NmUzV/FcsOMHpbgTcY7O0TAajPnfpSTp+XdyPVBR7TlTsturUCpryP0ZX1S3VJk2IaneB123thtcOtWsbqdT3Bb846H7yudI95WVTixIS/KIwoCbekSf8Y9+iW/xRVSWLRVc1gpigDxXfieSA7bI+qiUBjiKR7QU1KFYZA58VcOQhzeMLY6an34rsW4WHAwzzSv8Q6vrwpn8Ct9fTsIeiZsWZLueNkIUfjR0G1bHHoT2RHKton0AMRjOUGSKUUB4DNZ5xzXvC0jvUMWlgHB9z2wBCsIkIDVWqSA2DD0xeIY2wSUVPwPc1MnBAf/Fx3poweUlcPWglR2VaO9ematC4hfLxxkGldGQt3C6ZLPsm96S7o6j88rwOqkDNIR1pNJOepgciJH/w4Xwtg9gJ52CpdlCeSllRQD74l95ysmZ2D/gLweNoUt61P0RYQQelio8VnPUNB1e2uK7zW9joG1k59CjJGQNvuZr6JkQ9+Hxo5xKEOy9KcpT6t48wTzbz3YMFDxTNl0/DzL8qdTU2UrSW6/TFgPLokbAQN00yhw0lg8cR/e1m+ujFyBeesL3luwE6HNcIyK5Y/+To04vR3OD7Uz8cnABxWyOeSBm2R2bu2fxeN0Hlv+qhoOYtbZ1DKx/aES4z51jATynEIdMIMSNhmVDoDiGODh9ocenzg/DUarjIzWltPFRyQj+tnFGTXp7C87Line truncated
@@ -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}]}
@@ -0,0 +1 @@
{"note":"A heading must be a section's first child.","rule":"doc.tree.child"}
Loaded 100 of 534 files, more files were not shown because too many files have changed in this diff. Show more