Files
alexmandClaude 516148146f feat: publish the package from CI, and clean up its references
Publishing
- .gitea/workflows/publish.yml publishes paperspec to the instance's PyPI
  registry (/api/packages/infra/pypi) when a v* tag is pushed: it checks
  the repository, builds the sdist and wheel, refuses to upload unless the
  built version equals the tag, runs twine check --strict, and uploads
  with the secrets PACKAGE_USER and PACKAGE_TOKEN (--skip-existing, so a
  rerun on the same tag is safe). Run by hand, it refuses anything but a
  tag.
- pixi dev environment: twine >= 6.1 (the first that reads Metadata 2.4),
  and `dist` (sdist and wheel) replaces the `wheel` task.
- deploy/README.md: how to set up the secrets, release a version, and
  install from the registry with pixi, uv or pip, tying paperspec to the
  registry where the installer allows it.
- CONTRIBUTING.md "Releasing": a tag versions the package; a format
  change takes the new format version as the top CHANGELOG heading, and a
  code-only release takes the next patch as a subsection, as 0.1.1 does.
- pyproject: fallback_version 0+unknown for source trees without git; the
  license expression is Apache-2.0 AND CC0-1.0, for the code and the data
  the wheel carries.

Cleanup (from an audit of every reference to the package)
- spec/00 lists src/ (the package) and tools/ (how to run it), and no
  longer says the reference implementation is not a library.
- Stale explanations fixed in pixi.toml, .gitignore, the Caddyfile, the
  vectors, context, sql and tools READMEs, docs/examples.md, docs/faq.md,
  spec/01, docs/rationale.md and docs/comparison.md: the commands, what
  they need (the tools extra), the fixture folder hale2026harmonic-damb,
  and three lines that held two sentences.
- tools/README.md counts all six commands, says what needs which extra
  (package.validate and corrections.gate need [schema]), and that the
  vectors ship but the fixtures they name do not.
- The CLI's install and clone hints point at the registry instructions and
  an https clone URL; schema.py raises an ImportError naming
  paperspec[schema], as crypto.py does for [crypto].
- check's Unicode check now guards the package's pinned constant.
- site skips build/, dist/ and *.egg-info.
- CHANGELOG 0.1.1 describes the final state.

pixi run check passes (as `python -m paperspec check`); the rebuild is
byte-identical. pixi.lock needs `pixi lock` for twine before pushing: the
publish workflow installs with --locked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 09:41:26 -04:00

3.9 KiB

SQL

This folder holds the table definitions for the database form of packages, a team's store, and the bundle.

What the database form is for

A package is a folder of canonical JSON files, one document per folder (chapter 12). Canonical JSON is JSON with exactly one valid byte sequence, so a file's hash changes only when its content does.

Handing over a folder is easy. Querying across hundreds of documents in folders is hard. The database form holds the same data as rows so that a team can ask SQL questions of it, and a package loaded into the tables unloads back to the same bytes. About 500 documents come to about a million and a half rows, and SQLite and Dolt hold that comfortably (chapter 13).

The three files

File Holds Runs on
doc.sql Documents: works, documents, witnesses, nodes, pages, locations, references, citations, corrections, IDs, receipts, revocations, suspects and package files. SQLite, Dolt, PostgreSQL
store.sql What a team adds: roster keys, projects, members, reading paths, layers, annotations, datasets, digitizations, views, policies, submissions and grades. Load doc.sql first. SQLite, Dolt, PostgreSQL
bundle-sqlite.sql The bundle's extra tables: metadata, a full-text index (FTS5, SQLite's search extension) and room for embeddings. Load both files above first. SQLite

Creating a database

sqlite3 lab.db < sql/doc.sql && sqlite3 lab.db < sql/store.sql
psql -d lab -f sql/doc.sql && psql -d lab -f sql/store.sql
dolt sql < sql/doc.sql && dolt sql < sql/store.sql

The PostgreSQL database lab and the Dolt repository must already exist. The sqlite3 line runs as shown; the psql and dolt lines follow the portability rules of chapter 13 but have not been run on those engines in this repository.

To load packages into SQLite without pixi, install the package with its tools extra on Python 3.14, then run paperspec load --sqlite lab.db PACKAGE…. The file docs/examples.md has queries to try. The loader copies files that have no table (assets, dataset files, derived files) by SHA-256 into lab.db.assets/.

A first query

The query below finds every sentence that cites a given reference, which is the citation's context. It returns sentence IDs, and nodes.content holds each sentence's text.

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';

On fixtures/packages/hale2026harmonic-damb it returns one row, hca6dc5: the sentence ending "served as the first test case, with a bending band near 1595 cm⁻¹."

Conventions

  • Foreign keys: none. Validators check references, so the same file runs everywhere.
  • Types: enumerations are VARCHAR with a CHECK, JSON values are canonical JSON in TEXT, and booleans are INTEGER 0 or 1.
  • Names: no table, column or index name is reserved in SQLite, PostgreSQL or MySQL (Dolt is MySQL-compatible). The formats' key, index, at, by, before and after become doc_key, idx, made_at, signer, before_hash and after_hash.
  • Round trip: each row keeps every property of its record, so unloading restores the same bytes and the same manifest hash. Unloading copies the files with no table from the asset store, which must travel with the database. paperspec check tests this for every fixture package.
  • Derived tables: citations, receipt_nodes and annotation_targets are built on load for queries and are not part of the package.

Status

The version is 0.1.0. In registry/formats.json, scienting-doc/1 is candidate, and the bundle and the project, dataset, digitization and view formats are provisional. Chapter 13 defines the mapping from files to tables.