feat: scienting-math/1 sources and derived/math.jsonl; lode references; stress fixes

Math content may say its source is in scienting-math/1's canonical TeX (form,
in no hash); derived/math.jsonl holds papermath's tree, symbols and issues,
and the validator now checks derived files. A symbol annotation names its
symbol by key; lode claim references use lode's tag and pin syntax. The zip
reader refuses entries zipfile cannot read, and checkpoint lines end in LF only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017R7sgDNvUGWY2zFPCq2JH6
This commit is contained in:
alexmandClaude committed 2026-10-17 06:44:28 -04:00
1 parent 8b5ee87275
commit 17880686fa
40 files changed
+750 -63

No files matched your search

+10 -2
View File
@@ -30,8 +30,8 @@ A node's own content is an object with its `kind` and these members, and nothing
| Kinds | Members |
| --- | --- |
| Kinds that take a label | `label`: the label, or null. |
| `sentence`, `cell`, `reference`, `authors`, `keywords` | `runs`: the runs as stored, except that each `equation` run is reduced to `{"kind": "equation"}`, since an ID is never content. |
| `equation`, `equation-line` | `notation`, `source`. |
| `sentence`, `cell`, `reference`, `authors`, `keywords` | `runs`: the runs as stored, except that each `equation` run is reduced to `{"kind": "equation"}`, since an ID is never content, and each `math` run is without its `form`. |
| `equation`, `equation-line` | `notation`, `source`; never `form`. |
| `code`, `algorithm` | `language` (or null), `text`. |
| `section` | `level`, and `heading`: the `text_hash` of its heading, or null. |
| `table` | `columns`, as stored. |
@@ -42,6 +42,14 @@ So paragraphs, rows, lists, items and the other containers without content have
Own content covers stored values exactly; it is not normalized.
A table's columns name header cells by ID, so fixing a header cell changes that cell, not the table.
A math form ([3.7](03-nodes.md#37-math-forms)) enters no content value.
`form` says how the source is spelled, which the source itself shows, so it is left out of own content, and no projection reads it: a source in canonical TeX is projected as the TeX it is, by the rules of [5.3](#53-the-strict-projection) and [5.4](#54-simple-notation).
So a producer that adds `form` to sources already in the form leaves every hash, ID, pin and anchor as it was, and a reading with `form` and one without agree whenever their sources do.
Respelling a source in the form is an edit of the source: it changes the `text_hash`, `own_hash` and `node_hash` of the node, and, for a complex source, its complex key ([5.3](#53-the-strict-projection)).
Simple sources such as `K_r` and `K_{r}` have one canonical linear form, so their `match_hash` and `align_key` stay; a respelling that turns a simple character into a command [5.4](#54-simple-notation) does not read, as `ħ` becomes `\hbar`, makes the source complex and changes them.
Because the complex key compares sources as stored, a producer that aligns a reading in a form with a second reading ([5.6](#56-alignment)) spells the second reading's math in the same form first, or each complex formula it respelled becomes an `equation` suspect.
`hashes.jsonl` gives the values of a small document whose equation and math runs carry `form`, which are those of the same document without it.
## 5.3 The strict projection
The strict projection folds notation to one canonical linear form and keeps structure, so that it can certify agreement.