@the_library/canonical-schemas 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,366 +1,245 @@
1
1
  # `@the_library/canonical-schemas`
2
2
 
3
- The governance artifact and TypeScript type library at the heart of the D-SAFE ecosystem. This package is the single source of truth for all canonical model definitions, international standard definitions, and their multilingual translations. Every D-SAFE application — from DataPond's own frontend to any third-party institution building on the sovereign library stack — installs this package as a dependency.
3
+ The shared data definitions of [the World Library](https://worldbibliotech.com): the canonical record types (Book, Person, Tag, …), their enums, and the international identifier and classification standards (ISBN, ISNI, ORCID, Dewey, …) those records use.
4
4
 
5
- > **No runtime code lives here.** `@the_library/canonical-schemas` ships JSON governance files and TypeScript interfaces only. Executable adapter logic lives in the companion package [`@the_library/standard-adapters`](#dependency-on-the_librarystandard-adapters).
5
+ All library corpus modifications are stored as compact binary patches, keyed by numeric property IDs. Two apps can only read each other's records if they agree on every property's name, type and size. This package is that agreement: one set of definitions that every app builds from.
6
6
 
7
- ---
8
-
9
- ## Licence
7
+ > **No runtime code.** The package ships JSON files and TypeScript interfaces only. The code that validates and formats identifiers lives in [`@the_library/standard-adapters`](https://www.npmjs.com/package/@the_library/standard-adapters); the model classes generated from these definitions ship in [`@the_library/public`](https://www.npmjs.com/package/@the_library/public).
10
8
 
11
- This package is released under the **D-Open Code Sovereign Licence v1.0**.
9
+ **Licence:** D-Open Code Sovereign Licence 1.1 (unified edition), `LicenseRef-DOCSL-1.1`: non-commercial use of unmodified copies. See [`LICENSE`](https://unpkg.com/@the_library/canonical-schemas/LICENSE), the [full text](https://registry.worldbibliotech.com/licence) and [Licences in detail](#licences-in-detail) below.
12
10
 
13
- Full text: [registry.worldbibliotech.com/licence.html](https://registry.worldbibliotech.com/licence.html)
11
+ ## Why canonical definitions
14
12
 
15
- See the [`LICENSE`](./LICENSE) file in this directory. [Read more about the licence below.](#the-d-open-code-sovereign-licence--source-code)
13
+ Libraries already share their records across institutions and borders, because they agree on standards: ISBN for books, ISNI for names, Dewey or UDC for subjects, and UNIMARC or MARC 21 for the record itself. This package applies the same idea to a web3 library. It is part of the framework at [datapond.earth](https://datapond.earth), and the live library at [worldbibliotech.com](https://worldbibliotech.com) is built from it. The framework's design is explained in [Why it is designed this way](https://www.npmjs.com/package/@the_library/public#why-it-is-designed-this-way).
16
14
 
17
- ---
15
+ - **One agreement for every app.** Records are stored as binary patches that refer to properties by number. Two apps can only read each other's records if they compile the same definitions, so the definitions live here, once.
16
+ - **Library standards first.** A record's public identifier is its standard identifier when it has one: a person's ISNI or ORCID, a subject's classification notation. Otherwise it is the library's native ID (see [`uid-documentation.md`](https://unpkg.com/@the_library/canonical-schemas/uid-documentation.md)).
17
+ - **Permanent once released.** Every stored record refers to these definitions by number, for as long as the record exists. Released definitions are frozen and only ever extended (see [Changing a definition](#changing-a-definition)).
18
+ - **Decided in public.** Changes go through pull requests and need consensus from the core maintainers ([`GOVERNANCE.md`](https://unpkg.com/@the_library/canonical-schemas/governance/GOVERNANCE.md)).
18
19
 
19
- ## Package layout
20
+ ## Contents
20
21
 
21
- ```
22
- packages/canonical-schemas/
23
- standards/ International standard definitions (StandardDefinition JSON)
24
- isbn.json ISO 2108:2017 — International Standard Book Number
25
- issn.json ISO 3297:2007 — International Standard Serial Number
26
- isni.json ISO 27729:2012 — International Standard Name Identifier
27
- orcid.json Open Researcher and Contributor ID
28
- ddc.json Dewey Decimal Classification (OCLC / Library of Congress)
29
- lcc.json Library of Congress Classification
30
- udc.json Universal Decimal Classification (UDC Consortium)
31
- clc.json Chinese Library Classification (National Library of China)
32
- bbk.json Library-Bibliographical Classification (Russian State Library)
33
- tlc.json Thai Library Classification (National Library of Thailand)
34
- cc.json Colon Classification (S.R. Ranganathan)
35
-
36
- types/ TypeScript interface definitions — zero runtime code
37
- StandardAdapter.ts StandardAdapter<TProps, TApis>, StandardApiAdapter, ValidationResult
38
- StandardDefinition.ts StandardDefinition, StandardProp, ExternalApiEntry, FieldMapping
39
-
40
- definitions/
41
- canonical/ ModelDefinition files for canonical entity types
42
- Book.json multipleInstances: true; instanceUidStrategy drives isbn codegen
43
- Person.json uidStrategy: ["isni", "orcid"]
44
- Tag.json uidStrategy: ["ddc"]
45
- enums/
46
- CopyrightStatus.json
47
- QualityScore.json
48
-
49
- schemas/
50
- StandardDefinition.1.0.json JSON Schema (meta-schema) for all standards/ files
51
-
52
- governance/
53
- GOVERNANCE.md Rules for proposing changes to canonical definitions
54
- changelog.md Every decision: who approved what and when
55
- ```
22
+ - [Why canonical definitions](#why-canonical-definitions)
23
+ - [Install](#install)
24
+ - [What's in the package](#whats-in-the-package)
25
+ - [Using the files](#using-the-files)
26
+ - [How the definitions become working code](#how-the-definitions-become-working-code)
27
+ - [UNIMARC and MARC 21](#unimarc-and-marc-21)
28
+ - [Standards](#standards)
29
+ - [Model definitions](#model-definitions)
30
+ - [Changing a definition](#changing-a-definition)
31
+ - [Related packages](#related-packages)
32
+ - [Licences in detail](#licences-in-detail)
56
33
 
57
- ---
34
+ ## Install
58
35
 
59
- ## Architecture: the two-tier definition hierarchy
60
-
61
- Schema definitions in the D-SAFE ecosystem are split into two tiers.
62
-
63
- ```
64
- @the_library/canonical-schemas ← governance package (DataPond publishes and controls)
65
- definitions/canonical/
66
- Book.json ← canonical: true
67
- Person.json
68
- Tag.json
69
-
70
- packages/db_schemas ← compiler + codec (consumes canonical-schemas)
71
- definitions/ ← app-level definitions only
72
- member.json ← canonical: false (DataPond-specific)
36
+ ```sh
37
+ npm install @the_library/canonical-schemas
73
38
  ```
74
39
 
75
- The canonical package is an **npm dependency** that every D-SAFE app installs. Third-party developers never edit it directly; they open a PR against the canonical repo to propose new models or translations. This design solves the **cross-app conflict problem**: without a shared authority, two apps that both define a `Book.title` prop could assign conflicting binary layouts, causing silent data corruption when records from different libraries are merged. With this package, canonical propIds are seeded first (IDs 0–511) and every app's compiler enforces the no-override invariant: a local definition may extend a canonical model but may never alter its prop names, types, bit widths, or enum references.
76
-
77
- ---
78
-
79
- ## Standards
80
-
81
- Each file in `standards/` is a `StandardDefinition` — a machine-readable description of one international identifier standard. It specifies:
82
-
83
- - The **props** the standard contributes to implementing models (name, wire type, normalization, display, check digit algorithm, regex pattern)
84
- - The **Mode S URI scheme** used for standards-first entity addressing (`sfcuid()`)
85
- - The **Linked Data URI template** for RDF/LOD output
86
- - **Discovery metadata** for external APIs, including field mappings and rate limits
87
-
88
- ### Initial release: identifier standards
89
-
90
- | Standard | ID | Governing body | ISO ref | Check digit |
91
- |---|---|---|---|---|
92
- | ISBN-13 | `isbn` | International ISBN Agency | ISO 2108:2017 | isbn-13-luhn |
93
- | ISSN | `issn` | ISSN International Centre | ISO 3297:2007 | iso7064-mod11-2 |
94
- | ISNI | `isni` | ISNI International Agency | ISO 27729:2012 | iso7064-mod11-2 |
95
- | ORCID iD | `orcid` | ORCID Inc. | — | iso7064-mod11-2 |
96
-
97
- ### Classification standards
98
-
99
- | Standard | ID | Governing body |
100
- |---|---|---|
101
- | Dewey Decimal Classification | `ddc` | OCLC (licensed from Library of Congress) |
102
- | Library of Congress Classification | `lcc` | Library of Congress |
103
- | Universal Decimal Classification | `udc` | UDC Consortium |
104
- | Chinese Library Classification | `clc` | National Library of China |
105
- | Library-Bibliographical Classification (ББК) | `bbk` | Russian State Library |
106
- | Thai Library Classification | `tlc` | National Library of Thailand |
107
- | Colon Classification | `cc` | S.R. Ranganathan (historical) |
108
-
109
- Classification standards (ddc and friends) have `externalApis: []` — the classifier assigns notations based on content; no external lookup is needed.
110
-
111
- ### Normalization and display algorithms
112
-
113
- Each `props[]` entry declares `normalize` and `display` algorithm IDs. The `@the_library/db_schemas` compiler and `@the_library/standard-adapters` both implement these:
40
+ Most apps never install it directly. `@the_library/public` already ships the model classes generated from it, and `@the_library/standard-adapters` lists it as a peer dependency, so npm 7+ installs it alongside the adapters automatically.
114
41
 
115
- | Algorithm | Used by | Normalized form |
116
- |---|---|---|
117
- | `compact-13` | ISBN | 13 compact digits; ISBN-10 converted to ISBN-13 |
118
- | `hyphenated-8` | ISSN | `NNNN-NNNX` |
119
- | `compact-16` | ISNI | 16 compact digits |
120
- | `hyphenated-4x4` | ORCID | `NNNN-NNNN-NNNN-NNNX` |
121
- | `ddc-notation` | DDC | Trim trailing zeros; normalize dots |
42
+ ## What's in the package
122
43
 
123
- The normalized form is always the standard's own authoritative storage format, not a universal compactness rule. ORCID retains hyphens because the ORCID spec mandates `NNNN-NNNN-NNNN-NNNX`; ISBN strips them because library convention does.
124
-
125
- ---
126
-
127
- ## ModelDefinition and `uidStrategy`
128
-
129
- `ModelDefinition` files in `definitions/canonical/` may declare a `uidStrategy` field that references standard IDs. This is what links a canonical model to its external identifiers.
130
-
131
- ```json
132
- // definitions/canonical/Book.json (excerpt)
133
- {
134
- "name": "Book",
135
- "canonical": true,
136
- "uidStrategy": "native-only",
137
- "multipleInstances": true,
138
- "instanceUidStrategy": ["isbn"]
139
- }
140
- ```
141
-
142
- ```json
143
- // definitions/canonical/Person.json (excerpt)
144
- {
145
- "name": "Person",
146
- "canonical": true,
147
- "uidStrategy": ["isni", "orcid"]
148
- }
149
- ```
150
-
151
- | `uidStrategy` value | Meaning |
44
+ | Path | What it holds |
152
45
  |---|---|
153
- | `"native-only"` | No universal external standard. Generated class uses Mode N UIDs only. |
154
- | `["isni", "orcid"]` | Implements two standards in priority order. `sfcuid()` returns Mode S from the first whose prop is non-null; falls back to Mode N. |
155
- | `["ddc"]` | Implements one classification standard. `sfcuid()` returns `ddc:{notation}` when non-null. |
156
-
157
- `instanceUidStrategy` applies the same logic to instance sub-objects of a `multipleInstances: true` model. `Book.instanceUidStrategy: ["isbn"]` injects the `isbn` prop onto `InstanceData`, generates `Book.LoadInstance("isbn:...")`, and registers an `isbnToInstance` crosswalk map in the Worker.
158
-
159
- The `@the_library/db_schemas` compiler enforces at build time that every standard ID in a `uidStrategy` array exists in this package's `standards/` directory, has a non-null `uriScheme`, and declares a `pk` prop.
160
-
161
- ---
162
-
163
- ## Multilingual ORM (`i18N`)
164
-
165
- Translations live inside the canonical definition files — not in app code. The French name for `Book.title` is `titre` as a canonical, governance-controlled fact, subject to the same review process as the prop itself. This ensures that any two French-locale apps built on D-SAFE use identical API surfaces, making cross-app interop structurally guaranteed rather than a coordination agreement.
166
-
167
- ```json
168
- // definitions/canonical/Book.json (translations excerpt)
169
- {
170
- "translations": {
171
- "fr": {
172
- "className": "Livre",
173
- "staticMethods": { "Load": "Construit", "Query": "Chercher" },
174
- "props": { "title": "titre", "description": "description" }
175
- },
176
- "de": { "className": "Buch", "props": { "title": "Titel" } }
177
- }
178
- }
46
+ | `standards/*.json` | 11 standard definitions, one per identifier or classification standard (see [Standards](#standards)) |
47
+ | `definitions/canonical/*.json` | 5 model definitions: `Book`, `Person`, `Tag`, `ClassificationSystem`, `Post` |
48
+ | `definitions/canonical/enums/*.json` | 4 enums: `BookMethod`, `CopyrightStatus`, `QualityScore`, `RecordingStatus` |
49
+ | `definitions/canonical/relationship-actions.json` | Numeric IDs of the relationship actions (`reply`, `postInTag`) |
50
+ | `definitions/canonical/tags.json` | Built-in discussion tags (`100` general, `101` announcements, `102` introductions) |
51
+ | `schemas/StandardDefinition.1.0.json` | JSON Schema that every `standards/*.json` file follows |
52
+ | `types/StandardDefinition.ts` | TypeScript shape of a standard definition: `StandardDefinition`, `StandardProp`, `ExternalApiEntry`, `FieldMapping` |
53
+ | `types/StandardAdapter.ts` | The interface each adapter implements: `StandardAdapter`, `StandardApiAdapter`, `ValidationResult` |
54
+ | `governance/` | [`GOVERNANCE.md`](https://unpkg.com/@the_library/canonical-schemas/governance/GOVERNANCE.md) (how changes are approved) and [`changelog.md`](https://unpkg.com/@the_library/canonical-schemas/governance/changelog.md) |
55
+ | `uid-documentation.md` | [How records are identified](https://unpkg.com/@the_library/canonical-schemas/uid-documentation.md): wire IDs, PIDs and SFCUIDs |
56
+
57
+ ## Using the files
58
+
59
+ Everything is reachable through the package's `exports` map:
60
+
61
+ | Import path | File |
62
+ |---|---|
63
+ | `@the_library/canonical-schemas/standards/<id>` | `standards/<id>.json` |
64
+ | `@the_library/canonical-schemas/definitions/<path>` | `definitions/<path>.json`, e.g. `definitions/canonical/Book` |
65
+ | `@the_library/canonical-schemas/schemas/StandardDefinition/1.0` | `schemas/StandardDefinition.1.0.json` |
66
+ | `@the_library/canonical-schemas/types/StandardDefinition` | `types/StandardDefinition.ts` |
67
+ | `@the_library/canonical-schemas/types/StandardAdapter` | `types/StandardAdapter.ts` |
68
+
69
+ JSON, in Node (the `with { type: 'json' }` attribute is required there; bundlers such as Vite don't need it):
70
+
71
+ ```js
72
+ import isbn from '@the_library/canonical-schemas/standards/isbn' with { type: 'json' };
73
+ import book from '@the_library/canonical-schemas/definitions/canonical/Book' with { type: 'json' };
74
+ import copyright from '@the_library/canonical-schemas/definitions/canonical/enums/CopyrightStatus' with { type: 'json' };
75
+
76
+ isbn.uriScheme; // 'ISBN:{{isbn}}'
77
+ book.instanceUidStrategy; // ['isbn']
78
+ copyright.values.map((v) => v.name); // ['Unknown', 'PublicDomain', 'CreativeCommons', 'AllRightsReserved']
179
79
  ```
180
80
 
181
- The `@the_library/public/models` schema generator's `--locale <lang>` flag emits thin TypeScript facade classes from these entries:
182
-
183
- ```typescript
184
- // AUTO-GENERATED: Livre.ts (fr locale facade for Book)
185
- import { Book } from "./Book.ts";
81
+ TypeScript types:
186
82
 
187
- export class Livre extends Book {
188
- get titre() { return this.title; }
189
- set titre(v) { this.title = v; }
190
- static Construit(id: number) { return Book.Load(id); }
191
- }
83
+ ```ts
84
+ import type { StandardDefinition } from '@the_library/canonical-schemas/types/StandardDefinition';
85
+ import type { StandardAdapter, ValidationResult } from '@the_library/canonical-schemas/types/StandardAdapter';
192
86
  ```
193
87
 
194
- The canonical English class is always the structural base. The wire format, `binary.json` propIds, and all on-chain patches are untouched by locale. A French app's `Livre` is 100% binary-compatible with an English app's `Book` — they patch the same propIds.
195
-
196
- Standard-contributed props also carry translation entries. See the `translations` field in each `standards/*.json` file.
197
-
198
- ---
88
+ The types ship as `.ts` source, not compiled `.d.ts`, so your own compiler checks them with your settings (`skipLibCheck` doesn't cover `.ts` files). They are plain interfaces and compile under `strict` with `moduleResolution: "bundler"`.
199
89
 
200
- ## EVM-compatible TypeScript classes
90
+ The JSON Schema's `$id` (and every standard file's `$schema`) is `https://schemas.dsafe.us/StandardDefinition/1.0`. That is an identifier, not a live address: the host isn't online. Validate against the bundled copy at `@the_library/canonical-schemas/schemas/StandardDefinition/1.0`.
201
91
 
202
- The definitions governed by this package are the foundation of a full ORM whose generated output is **natively compatible with EVM smart contract storage**. The `@the_library/public/models` schema generator reads `ModelDefinition` files from `definitions/canonical/` and emits TypeScript classes whose state is binary-encoded into on-chain patches — not stored in a traditional database.
203
-
204
- ### How the stack connects
92
+ ## How the definitions become working code
205
93
 
206
94
  ```
207
- @the_library/canonical-schemas ← defines props, types, propIds
208
- │
209
- ▼ (consumed at build time)
210
- packages/db_schemas ← compiler: assigns binary propIds, builds binary.json
211
- │
212
- ▼ (code generation)
213
- packages/public/src/models → generated-src/ ← TypeScript classes with toPatch() / fromPatch()
95
+ @the_library/canonical-schemas this package: model, enum and standard definitions (JSON)
214
96
  │
215
- ▼ (EVM calldata)
216
- contracts/ — Factory, BouncerStorage, ← smart contracts receive binary-encoded patches
217
- ScientistStorage, BackupStorage, on SONIC mainnet (chain 146) and
218
- AddressRegistry SONIC_BLAZE testnet (chain 14601)
97
+ ▼ read at build time
98
+ @the_library/db_schemas compiler (inside the monorepo, not published)
99
+ │ • adds each standard's props to the models that use it
100
+ │ • gives every prop name a permanent numeric propId (binary.json)
101
+ │ • records each layout version (versions.json)
102
+ ▼
103
+ @the_library/public generated model classes: Book, Person, Tag, ClassificationSystem, Post
104
+ per-language getters/setters, validate<Standard>(), sfcuid()
105
+
106
+ @the_library/standard-adapters implements StandardAdapter for each standard:
107
+ validate, normalize, display, Linked Data URIs, external API lookups
219
108
  ```
220
109
 
221
- ### Binary encoding
110
+ How to use the generated classes is documented in the [Models API section of `@the_library/public`](https://www.npmjs.com/package/@the_library/public#2-models-api-the_librarypublicmodels).
222
111
 
223
- Every prop in `definitions/canonical/` maps to a globally stable numeric `propId` in `packages/db_schemas/dist/binary.json`. Canonical props occupy IDs **0–511**; app-level props start at **512**. This range split is what makes cross-institutional interoperability a structural property: any two apps built on the same canonical version agree on canonical propIds without any coordination — their on-chain patches are binary-compatible by construction.
112
+ Property IDs live in one dictionary shared by all models. An ID is assigned the first time a prop name appears and never changes, so a prop called `title` has the same ID, and must have the same type and size, in every model; the compiler rejects a conflicting layout. Instance fields (the per-instance data of a `multipleInstances` model such as `Book`) are addressed by position, so they are append-only: the compiler rejects a removed, renamed or reordered field.
224
113
 
225
- The generated class encodes its state into a compact binary patch:
114
+ ## UNIMARC and MARC 21
226
115
 
227
- ```typescript
228
- // AUTO-GENERATED (@the_library/public/models output)
229
- import { Book } from '@my-app/models';
116
+ The canonical model is compatible with UNIMARC by design: its records are built from the same elements as a UNIMARC (or MARC 21) bibliographic record, and identified with the same standards. The table shows where each element of the model sits in both formats, at field level.
230
117
 
231
- const book = new Book();
232
- book.title = "Thinking, Fast and Slow";
233
- book.copyrightStatus = CopyrightStatus.InCopyright;
118
+ | Element | UNIMARC | MARC 21 | Canonical model |
119
+ |---|---|---|---|
120
+ | ISBN | 010 | 020 | Book edition: `isbn` (standard `isbn`) |
121
+ | Language of the item | 101 | 041 | Book edition: `language` |
122
+ | Title | 200 | 245 | Book: `title` |
123
+ | Publication: publisher and date | 210 | 260 / 264 | Book edition: `publisher`, `publicationDate` |
124
+ | Summary | 330 | 520 | Book: `description` |
125
+ | Universal Decimal Classification | 675 | 080 | Tag: `udcNotation` |
126
+ | Dewey Decimal Classification | 676 | 082 | Tag: `ddcNotation`; Book: `deweyDecimal` |
127
+ | Library of Congress Classification | 680 | 050 | Tag: `lccNotation`; Book: `locCallNumber` |
128
+ | Other classifications (CLC, BBK, Thai, Colon) | 686 | 084 | Tag: `clcNotation`, `bbkNotation`, `tlcNotation`, `ccNotation` |
129
+ | Personal name, intellectual responsibility | 700 / 701 | 100 / 700 | Book: `authors` → Person |
130
+ | Electronic location | 856 | 856 | Book edition: `downloadTxId` (the file on Arweave) |
234
131
 
235
- // Serialize to binary-encoded EVM calldata:
236
- const patch = book.toPatch(); // Uint8Array — propId + value pairs, packed per binary.json
237
-
238
- // Submit via the Factory contract (@the_library/public's EVM client):
239
- await factory.write.submitPatch([patch]);
240
- ```
132
+ - **Persons** carry ISNI (`isniId`) and ORCID (`orcidId`), the identifiers used in name authority records.
133
+ - **ISSN** is defined in `standards/issn.json`, but no model uses it yet.
241
134
 
242
- The patch codec (`@the_library/db_schemas`'s `src/codec.ts`), `binary.json`, `versions.json`, and the EVM contracts are entirely unaffected by locale, translations, or which external APIs are configured. The ORM's i18N layer and the standard-adapter field-mapping layer both live **above** the wire format — the chain sees only propIds and values.
135
+ This is a correspondence, not a converter. These packages don't read or write UNIMARC or MARC 21 records. The monorepo has a MARC 21 parsing library, which isn't published.
243
136
 
244
- ### What the smart contracts store
245
137
 
246
- The four core contracts handle different write concerns:
138
+ ## Standards
247
139
 
248
- | Contract | Role |
249
- |---|---|
250
- | `BouncerStorage` | Access control — enforces member permissions before any write reaches storage |
251
- | `ScientistStorage` | Content metadata — stores canonical model patches (Book, Person, Tag records) |
252
- | `BackupStorage` | Arweave sidecar links — permanent-web content addresses anchored on-chain |
253
- | `Factory` | Write orchestration — routes patches to the correct storage contract |
254
- | `AddressRegistry` | Canonical address book — resolves contract addresses dynamically to survive hard-forks |
140
+ Each file in `standards/` describes one standard: the props it adds to a model (name, wire type, normalisation, display format, check digit), its URI scheme, its Linked Data URI template, and the external APIs that can look values up.
255
141
 
256
- Every model write goes through this pipeline: TypeScript ORM class → binary patch → `Factory.submitPatch()` → `BouncerStorage` (access check) → `ScientistStorage` (write). The canonical `propId` values from this package are what the contracts index and the crosswalk Worker queries.
142
+ **Identifiers**
257
143
 
258
- ---
144
+ | `id` | Standard | Governing body | Prop | Normalised → displayed | Check digit | External APIs |
145
+ |---|---|---|---|---|---|---|
146
+ | `isbn` | International Standard Book Number (ISO 2108:2017) | International ISBN Agency | `isbn` | `compact-13` → `hyphenated-13` | `isbn-13-luhn` | `openlibrary`, `googlebooks` (API key) |
147
+ | `issn` | International Standard Serial Number (ISO 3297:2007) | ISSN International Centre | `issn` | `hyphenated-8` → `hyphenated-8` | `iso7064-mod11-2` | `issn-portal` |
148
+ | `isni` | International Standard Name Identifier (ISO 27729:2012) | ISNI International Agency | `isniId` | `compact-16` → `grouped-4x4` | `iso7064-mod11-2` | `isni-sru` (search) |
149
+ | `orcid` | Open Researcher and Contributor ID | ORCID Inc. | `orcidId` | `hyphenated-4x4` → `hyphenated-4x4` | `iso7064-mod11-2` | `orcid-lookup`, `orcid-public-api` (search) |
259
150
 
260
- ## Dependency on `@the_library/standard-adapters`
151
+ **Classifications**
261
152
 
262
- `@the_library/canonical-schemas` ships **only interfaces and JSON**. The companion package `@the_library/standard-adapters` ships the runtime implementations.
153
+ | `id` | Standard | Governing body | Prop |
154
+ |---|---|---|---|
155
+ | `ddc` | Dewey Decimal Classification | OCLC (licensed from Library of Congress) | `ddcNotation` |
156
+ | `lcc` | Library of Congress Classification | Library of Congress | `lccNotation` |
157
+ | `udc` | Universal Decimal Classification | UDC Consortium | `udcNotation` |
158
+ | `clc` | Chinese Library Classification | National Library of China | `clcNotation` |
159
+ | `bbk` | Library-Bibliographical Classification (ББК) | Russian State Library | `bbkNotation` |
160
+ | `tlc` | Thai Library Classification | National Library of Thailand | `tlcNotation` |
161
+ | `cc` | Colon Classification | S.R. Ranganathan (historical) | `ccNotation` |
263
162
 
264
- ```
265
- @the_library/canonical-schemas ← no runtime imports; standalone
266
- │ exports: standards/*.json
267
- │ exports: types/StandardAdapter.ts (interfaces only)
268
- │ exports: types/StandardDefinition.ts
269
- │
270
- ▼ (implements the interfaces)
271
- @the_library/standard-adapters ← runtime library; imports types from canonical-schemas
272
- │ exports: ISBNAdapter, ISSNAdapter, ISNIAdapter, ORCIDAdapter, DDCAdapter, ...
273
- │ exports: apiKeyDictionary
274
- │
275
- ▼ (consumes both)
276
- packages/db_schemas / apps/vue.datapond.earth / apps/book-manager
277
- ```
163
+ Each classification normalises with its own `<id>-notation` algorithm, displays the notation as stored, has no check digit and lists no external API: a notation is assigned from the content, not looked up.
278
164
 
279
- **Strict dependency rule:** `@the_library/canonical-schemas` must never import anything from `@the_library/standard-adapters`. This is enforced by the pnpm workspace dependency graph — `canonical-schemas/package.json` declares no dependency on `standard-adapters`. The `apiKeyDictionary` singleton that manages runtime API credentials lives entirely in `standard-adapters` and is unknown to this package.
165
+ The normalised form is the standard's own storage format, not a general rule: ORCID keeps its hyphens because the ORCID specification requires `NNNN-NNNN-NNNN-NNNX`, while ISBN drops them because library practice does.
280
166
 
281
- ### `StandardAdapter` interface (defined here, implemented in `standard-adapters`)
167
+ Every standard's URI scheme is `<ID>:{{<prop>}}`, for example `ISBN:{{isbn}}` or `DDC:{{ddcNotation}}`.
282
168
 
283
- ```typescript
284
- // types/StandardAdapter.ts
169
+ An external API entry declares its `kind` (`lookup`: fetch by a known identifier; `search`: find candidates from partial information), its rate limit, and how response fields map onto model props:
285
170
 
286
- export interface StandardAdapter<TProps, TApis> {
287
- readonly standardId: string;
288
- readonly uriScheme: string | null;
289
- readonly apis: TApis;
290
- normalize(value: string): string;
291
- display(value: string): string;
292
- validate(value: string | null | undefined): ValidationResult;
293
- toLinkedDataUri(value: string): string;
294
- }
171
+ ```json
172
+ { "source": "title", "target": "title", "overwrite": "if-empty" }
295
173
  ```
296
174
 
297
- Each adapter in `standard-adapters` implements this interface. The `@the_library/db_schemas` compiler imports `standard-adapters` at build time and validates that every `externalApis[].id` in a standard's JSON definition has a matching key in the corresponding adapter's `apis` object. A missing key is a fatal compile error.
175
+ `overwrite` is `always` (write unconditionally), `if-empty` (only fill an empty prop) or `never` (fetch for comparison only). The calls themselves are made by `@the_library/standard-adapters`; APIs marked as needing a key read it from that package's `apiKeyDictionary`.
298
176
 
299
- ### `externalApis` and field mapping
177
+ ## Model definitions
300
178
 
301
- The `externalApis[]` array in each standard definition describes the external APIs that support that standard and how their response fields map onto model props:
179
+ | Model | `uidStrategy` | `multipleInstances` | `instanceUidStrategy` | Own props | Translations |
180
+ |---|---|---|---|---|---|
181
+ | `Book` | `native-only` | yes | `isbn` | 29 | `fra`, `zho`, `tha` |
182
+ | `Person` | `isni`, `orcid` | no | — | 11 | `fra` |
183
+ | `Tag` | `lcc`, `ddc`, `udc`, `clc`, `bbk`, `tlc`, `cc` | no | — | 9 | — |
184
+ | `ClassificationSystem` | — | no | — | 8 | — |
185
+ | `Post` | `native-only` | no | — | 2 | — |
302
186
 
303
- ```json
304
- {
305
- "id": "openlibrary",
306
- "kind": "lookup",
307
- "rateLimit": { "requests": 100, "windowSeconds": 60 },
308
- "fieldMapping": [
309
- { "source": "title", "target": "title", "overwrite": "if-empty" },
310
- { "source": "pageCount", "target": "pageCount", "overwrite": "if-empty" },
311
- { "source": "publishDate", "target": "pubYear", "overwrite": "if-empty" }
312
- ]
313
- }
314
- ```
187
+ **`uidStrategy`** names the standards a model uses for its external identifiers:
315
188
 
316
- - `"lookup"` — called with the standard's known pk value; populates or corrects model fields from an authoritative source.
317
- - `"search"` — called with partial information (a name, a keyword); returns candidates for operator selection.
318
- - `overwrite: "always"` — write unconditionally (use for pk fields and authoritative IDs).
319
- - `overwrite: "if-empty"` — write only if the target prop is currently null.
320
- - `overwrite: "never"` — fetch for UI comparison; do not auto-apply.
189
+ - `native-only`, or no value: the record only has its native World Library ID.
190
+ - A list of standard IDs: each standard's props are added to the model (a prop name that collides with the model's own props, or with another standard's, is a compile error), and the first standard must have a URI scheme. The generated `sfcuid()` returns `<standard>:<normalised value>` for the first standard in the list whose prop is set (for a `Person` with an ISNI: `isni:` followed by its 16 digits), and otherwise the native ID.
191
+ - `instanceUidStrategy` does the same for the instances of a `multipleInstances` model: each `Book` instance (a language edition) gets its own `isbn`.
321
192
 
322
- The `@the_library/public/models` codegen uses these entries to generate `fetchFrom{ApiId}()` and `searchFrom{ApiId}()` methods on the model class, with return types inferred from the adapter's TypeScript `TApis` map.
193
+ How native IDs, PIDs and SFCUIDs are encoded is explained in [`uid-documentation.md`](https://unpkg.com/@the_library/canonical-schemas/uid-documentation.md).
323
194
 
324
- ### `ApiKeyDictionary`
195
+ **Enums** (`definitions/canonical/enums/`):
325
196
 
326
- Adapters that require an API key (marked `requiresApiKey: true` in `externalApis[]`) consume credentials through a global `apiKeyDictionary` singleton in `standard-adapters`. Consumer apps set keys once at startup:
197
+ | Enum | Values |
198
+ |---|---|
199
+ | `BookMethod` | `Unknown`, `Scan`, `NativeDigital`, `OCR`, `AiTranslation` |
200
+ | `CopyrightStatus` | `Unknown`, `PublicDomain`, `CreativeCommons`, `AllRightsReserved` |
201
+ | `QualityScore` | `None`, `Poor`, `Fair`, `Good`, `VeryGood`, `Excellent` |
202
+ | `RecordingStatus` | `Pending`, `Active`, `Completed`, `Archived` |
327
203
 
328
- ```typescript
329
- import { apiKeyDictionary } from '@the_library/standard-adapters';
204
+ The compiler numbers values by their position in the file (each entry's `value` field matches it), so values are never reordered or removed.
330
205
 
331
- // Call before any adapter method that requires a key
332
- apiKeyDictionary.set('googlebooks', import.meta.env.VITE_GOOGLE_BOOKS_API_KEY);
206
+ **Translations.** `Book` and `Person` carry a `translations` block giving the class and prop names in other languages, keyed by ISO 639-3 language code — the same three-letter codes the records use (`eng`, `fra`, `zho`, …; the full list is `LANG_ID_ENCODE` in `@the_library/db_schemas`):
207
+
208
+ ```json
209
+ "translations": {
210
+ "fra": { "className": "Livre", "props": { "title": "titre", "description": "description" } }
211
+ }
333
212
  ```
334
213
 
335
- If a key is missing when an adapter calls `apiKeyDictionary.require(apiId)`, it throws immediately with a clear error naming the missing key — fail fast at configuration time, not mid-request.
214
+ These entries are reference data for now: neither the compiler nor the generated classes read them yet.
336
215
 
337
- ---
216
+ ## Changing a definition
338
217
 
339
- ## Governance
218
+ Definitions are permanent once released, because every stored record refers to them by number. The full rules are in [`GOVERNANCE.md`](https://unpkg.com/@the_library/canonical-schemas/governance/GOVERNANCE.md); in short:
340
219
 
341
- `@the_library/canonical-schemas` follows semantic versioning with strict rules:
220
+ - **Frozen forever:** a standard's `id`, `props[].name`, `props[].type`, `props[].checkDigit.algorithm`, and the variable names in its `uriScheme`.
221
+ - **Allowed:** new props, new instance fields at the end, new enum values at the end, new standards, new external APIs, label and translation fixes.
222
+ - **Who decides:** anyone may open a pull request; changes to `standards/`, `definitions/canonical/` or `types/` need consensus from all core maintainers. A new standard needs a coordinated pull request in `@the_library/standard-adapters`, merged together.
342
223
 
343
- | Bump | Triggers |
224
+ | Version bump | When |
344
225
  |---|---|
345
- | **Patch** | Typo fixes in labels or descriptions; translation additions; governance doc edits |
346
- | **Minor** | New standard definition file; new `externalApis[]` entry; new canonical model prop or enum value |
347
- | **Major** | Any change to a frozen field: `props[].name`, `props[].type`, `checkDigit.algorithm`, `uriScheme` variable names; removal of a standard; propId reassignment |
348
-
349
- **Frozen forever once published:** `id`, `props[].name`, `props[].type`, `props[].checkDigit.algorithm`, and `uriScheme` template variable names. These fields are embedded in binary-encoded on-chain patches for the life of the protocol.
226
+ | **Patch** `x.y.Z` | Typos in labels or descriptions; translation additions or corrections; governance doc edits |
227
+ | **Minor** `x.Y.z` | New standard; new `externalApis[]` entry; new canonical prop or enum value (with a coordinated minor bump of `@the_library/standard-adapters`) |
228
+ | **Major** `X.y.z` | Any change to a frozen field; removing a standard; reassigning a propId |
350
229
 
351
- To propose a new standard or canonical model, open two coordinated PRs: one against this package (the JSON definition) and one against `@the_library/standard-adapters` (the TypeScript implementation). Both must be reviewed and merged together — a standard definition without a registered adapter is a fatal compile error in downstream apps.
230
+ ## Related packages
352
231
 
353
- See [`governance/GOVERNANCE.md`](./governance/GOVERNANCE.md) and [`governance/changelog.md`](./governance/changelog.md).
232
+ | Package | Role |
233
+ |---|---|
234
+ | [`@the_library/standard-adapters`](https://www.npmjs.com/package/@the_library/standard-adapters) | Runtime implementation of every standard in this package: validation, normalisation, display, external lookups |
235
+ | [`@the_library/public`](https://www.npmjs.com/package/@the_library/public) | The SDK: model classes generated from these definitions, plus the downloader, Web3 client and branding |
236
+ | `@the_library/db_schemas` | Build-time compiler and binary codec that turns these definitions into propIds and layouts; part of the monorepo, not published to npm |
354
237
 
355
238
  ---
356
239
 
357
- ## JSON Schema validation
358
-
359
- All files in `standards/` are validated against the meta-schema at `https://schemas.dsafe.us/StandardDefinition/1.0`. A local copy is bundled at [`schemas/StandardDefinition.1.0.json`](./schemas/StandardDefinition.1.0.json) and resolved via the package `exports` map for IDE tooling and CI validation before the remote endpoint is live.
360
-
361
- ---
240
+ ## Licences in detail
362
241
 
363
- ## Licence Architecture
242
+ ### Licence Architecture
364
243
 
365
244
  The D-SAFE ecosystem operates under **two distinct licences** covering two distinct concerns. Understanding which licence applies to what is essential before building on this stack.
366
245
 
@@ -369,72 +248,73 @@ The D-SAFE ecosystem operates under **two distinct licences** covering two disti
369
248
  (this package, smart contracts) (books, works, knowledge artifacts)
370
249
 
371
250
  D-Open Code Sovereign Licence ──── governs ────► D.I.C. + K (Ꭰ-Licence)
372
- └─ takes full liability └─ Decentralized · Integral · Common
251
+ └─ non-commercial, read-only └─ Decentralized · Integral · Common
373
252
  └─ non-modification clause └─ + K certification overlay
374
- └─ compatible with D.I.C. └─ enforced on-chain by BouncerStorage
375
- └─ fully D-SAFE by design └─ anchored on Arweave permanently
253
+ └─ compatible with D.I.C. └─ anchored on Arweave permanently
254
+ └─ fully D-SAFE by design
376
255
  ```
377
256
 
378
- They are designed to work together. The source code engine was built from the ground up to support D.I.C. natively: every architectural decision — immutable contracts, Arweave anchoring, the canonical schema, the BouncerStorage gate — exists to make D.I.C. compliance the path of least resistance for any application built on top.
257
+ They are designed to work together. The source code engine was built from the ground up to support D.I.C. natively: every architectural decision — immutable contracts, Arweave anchoring, the canonical schema — exists to make D.I.C. compliance the path of least resistance for any application built on top.
379
258
 
380
259
  ---
381
260
 
382
- ## The D-Open Code Sovereign Licence · Source Code
261
+ ### The D-Open Code Sovereign Licence · Source Code
383
262
 
384
- This package, the EVM smart contracts, and the entire D-SAFE engine are published under the **D-Open Code Sovereign Licence v1.0**.
263
+ This package, the EVM smart contracts, and the entire D-SAFE engine are published under the **D-Open Code Sovereign Licence 1.1 (unified edition)** (`LicenseRef-DOCSL-1.1`).
385
264
 
386
- Full text: [registry.worldbibliotech.com/licence.html](https://registry.worldbibliotech.com/licence.html)
265
+ Full text: [registry.worldbibliotech.com/licence](https://registry.worldbibliotech.com/licence)
387
266
 
388
267
  This is a licence for **source code** — the engine, the schema compiler, the ORM, the on-chain contracts. It is not a content licence. It governs what developers may do with the software itself.
389
268
 
390
- ### What makes it different
269
+ #### Who stands behind it
391
270
 
392
- Unlike every conventional open-source licence, the D-Open Code Sovereign Licence **takes liability rather than disclaiming it**. It establishes a two-layer accountability structure:
271
+ - **The Licensor** — Antoine LUCAS ("Data Pond"), the author and copyright owner ([ORCID 0009-0001-2086-7264](https://orcid.org/0009-0001-2086-7264)).
272
+ - **The Certifier** — Pond Enterprise Pty Ltd, which runs the D-SAFE certification service at [dsafe.us](https://dsafe.us). It answers third-party **copyright infringement** claims against certified users of unmodified releases, and about content published and D-SAFE certified through dsafe.us ("Positive Liability", section 12 of the licence). It takes no other liability.
393
273
 
394
- - **The Sanctuary** — DataPond Public Library Trust, a non-profit entity holding the assets. Provides the software and holds zero liability for damages, gas fees, or data loss.
395
- - **The Shield** — Pond Enterprise Pty Ltd, the technical guardian. Absorbs all claims regarding technical performance, patent infringement, and professional indemnity related to the core architecture.
396
-
397
- This is not a disclaimer. It is an **architecture of accountability** — named entities standing behind the technical warranty. For the first time, institutional partners, schools, and governments can deploy sovereign library infrastructure with a legal counterpart they can actually reach.
398
-
399
- ### Core terms
274
+ #### Core terms
400
275
 
401
276
  ```
402
277
  ┌──────────────────────────────────────────────────────────────────┐
403
- │ D-OPEN CODE SOVEREIGN LICENCE — SOURCE CODE │
278
+ │ D-OPEN CODE SOVEREIGN LICENCE 1.1 — SOURCE CODE │
404
279
  ├──────────────────────────────────────────────────────────────────┤
405
280
  │ PERMITTED │
406
281
  │ │
407
- │ ✔ Use, copy, and distribute the source code freely │
408
- │ ✔ Build D-SAFE-compliant applications on top of it │
282
+ │ ✔ View, copy, use and distribute unmodified copies, │
283
+ │ for non-commercial purposes │
284
+ │ ✔ Bundle, minify, cache and serve it (build steps) │
285
+ │ ✔ Build D-SAFE-compliant, read-only applications on top │
409
286
  │ ✔ Deploy in fully offline / air-gapped environments │
410
- │ ✔ Snapshot the codebase for long-term archive deployments │
411
287
  │ │
412
288
  ├──────────────────────────────────────────────────────────────────┤
413
289
  │ CONDITIONS │
414
290
  │ │
415
291
  │ ✘ No Modification of the certified source │
416
292
  │ ✘ No redirecting canonical models to private databases │
417
- │ ✘ No use in applications with paywalls or mandatory login │
293
+ │ ✘ No paywalls, logins, advertising or own donations │
294
+ │ ✘ No writes to the network, except by services the │
295
+ │ licensor authorises │
418
296
  │ ✘ No deployment in jurisdictions where decentralised │
419
297
  │ storage or uncensored public-domain data is illegal │
420
298
  └──────────────────────────────────────────────────────────────────┘
421
299
  ```
422
300
 
423
- **On the No Modification clause:** the contracts are immutable once deployed on-chain. A modified contract cannot be recalled. A mis-deployed fork could permanently corrupt member records or redirect library assets with no possibility of reversal. The prohibition is therefore not a restriction of developer freedom — it is a protection of the permanence that makes the library indestructible.
301
+ A modified build, or any commercial use, needs a separate written licence: admin@pondenterprise.com.
302
+
303
+ **On the No Modification clause:** the contracts are immutable once deployed on-chain. A modified contract cannot be recalled. A mis-deployed fork could permanently corrupt member records or redirect library assets with no possibility of reversal. Ordinary build steps (bundling, minifying, transpiling, caching) are not modifications.
424
304
 
425
- **On offline rights:** the licence explicitly grants snapshot and offline deployment rights. Hard-coded contract addresses in a D-SAFE certified snapshot are legally valid in air-gapped environments (schools, bunkers, remote field operations) where no connection to the canonical config or blockchain is possible. No other open-source licence has addressed this use case directly.
305
+ **On offline rights:** the licence explicitly grants snapshot and offline deployment rights. The contract addresses in a snapshot of a certified release stay valid while it is offline (air-gapped schools, remote field operations); once connected, addresses resolve through the published registry manifest again.
426
306
 
427
307
  **On interoperability as a legal condition:** the licence prohibits forking this package to redirect the DataPond canonical models to a private, centralised database. Any institution building on `@the_library/canonical-schemas` is making a legally binding commitment to the shared canonical schema — not just a technical one. This is what makes cross-institutional data compatibility durable.
428
308
 
429
309
  ---
430
310
 
431
- ## The Ꭰ-Licence · Content (D.I.C. + K)
311
+ ### The Ꭰ-Licence · Content (D.I.C. + K)
432
312
 
433
313
  The **Ꭰ-Licence** governs the **knowledge artifacts** — books, works, records — that flow through the certified infrastructure. It is composed of two layers: the D.I.C. base licence and the K certification overlay.
434
314
 
435
315
  > The Ꭰ character is Unicode `U+13A0`, the Cherokee letter A, visually identical to a Latin capital A. AI models, OCR engines, and search crawlers read it as A. Readers who know its meaning read it as D. The double-reading is intentional: open to machines, meaningful to those who built on it. It is a philosophical mark, not a security mechanism.
436
316
 
437
- ### D.I.C. — the base licence
317
+ #### D.I.C. — the base licence
438
318
 
439
319
  D.I.C. stands for **Decentralized · Integral · Common**. Each letter is a non-negotiable pillar:
440
320
 
@@ -463,7 +343,7 @@ D.I.C. stands for **Decentralized · Integral · Common**. Each letter is a non-
463
343
  · No Derivatives — no modification of certified works
464
344
  ```
465
345
 
466
- ### K — the Knowledge certification overlay
346
+ #### K — the Knowledge certification overlay
467
347
 
468
348
  D.I.C. is a licence anyone can apply to their work. The **K layer** is what earns the work the **D-SAFE label** — and it cannot be self-issued.
469
349
 
@@ -479,7 +359,7 @@ K certification requires:
479
359
 
480
360
  A work can carry the D.I.C. licence without the D-SAFE label. It cannot carry the D-SAFE label without passing the K review.
481
361
 
482
- ### The D-CODE Licence — formal name
362
+ #### The D-CODE Licence — formal name
483
363
 
484
364
  The complete content licence applied to all D-SAFE certified works is formally named the **D-CODE Licence** (Digital Constitution of Open and Decentralized Ecosystems). It is the legal instrument binding publishers to the D.I.C. + K obligations:
485
365
 
@@ -487,13 +367,13 @@ The complete content licence applied to all D-SAFE certified works is formally n
487
367
  - Content cannot be placed behind a paywall, subscription, or access control of any kind
488
368
  - Content cannot be removed or deleted by any party, including the original publisher
489
369
  - Attribution must be preserved in all reproductions and derivatives
490
- - Commercial use of the content itself is prohibited; the infrastructure hosting it may be commercial
370
+ - Commercial use of the content itself is prohibited, and the code that serves it is licensed for non-commercial use only
491
371
 
492
- The D-CODE Licence is implemented on-chain via the `BouncerStorage` smart contract on Sonic Chain (Chain ID 146). The human-readable licence text is stored alongside every certified work on Arweave — it travels permanently with the content.
372
+ The human-readable licence text is stored alongside every certified work on Arweave — it travels permanently with the content.
493
373
 
494
- ### The D-SAFE K.nowledge label — inherited by the smart contracts
374
+ #### The D-SAFE K.nowledge label — inherited by the smart contracts
495
375
 
496
- Every piece of content accepted by the DataPond contracts is D-SAFE certified before it reaches storage. The `BouncerStorage` contract enforces D-SAFE compliance at the write boundary: a record without a valid D-SAFE label is rejected and never reaches `ScientistStorage`.
376
+ Every piece of content accepted by the DataPond contracts is D-SAFE certified before it reaches storage.
497
377
 
498
378
  Because all content flowing through these contracts already carries the K certification, **the contracts themselves inherit the D-SAFE K.nowledge label**. The engine is certified D-SAFE not by declaration, but by construction.
499
379
 
@@ -511,7 +391,6 @@ Because all content flowing through these contracts already carries the K certif
511
391
  │ │
512
392
  │ Verified by: dsafe.us · manual human review │
513
393
  │ Audit record: Arweave · permanent, immutable │
514
- │ Enforced by: BouncerStorage · Sonic Chain 146 │
515
394
  │ │
516
395
  └────────────────────────────────────────────────────────────────┘
517
396
  ```
@@ -521,22 +400,10 @@ The certification chain is complete and unbroken:
521
400
  ```
522
401
  dsafe.us human review
523
402
  → cryptographic audit hash published to Arweave
524
- → BouncerStorage gate (on-chain enforcement)
525
- → ScientistStorage write
526
- → Arweave content anchor (permanent)
403
+ → ScientistStorage write
404
+ → Arweave content anchor (permanent)
527
405
  ```
528
406
 
529
407
  Any institution reading data from these contracts can trust not just the schema (governed by this package) but the content itself. The Ꭰ-SAFE label travels with the knowledge from the moment of certification to the moment of retrieval, permanently and verifiably.
530
408
 
531
- Full licence text: [registry.worldbibliotech.com/licence.html](https://registry.worldbibliotech.com/licence.html)
532
-
533
- ---
534
-
535
- ## Related packages
536
-
537
- | Package | Role |
538
- |---|---|
539
- | [`@the_library/standard-adapters`](../standard-adapters) | Runtime StandardAdapter implementations for all standards in this package |
540
- | [`@the_library/db_schemas`](../db_schemas) | ORM compiler and binary codec; consumes canonical definitions at build time |
541
- | [`@the_library/public`](../public) — `src/models/` | TypeScript class generator; emits model classes and locale facade classes |
542
- | [`@the_library/public`](../public) — `src/web3/` | EVM SDK: ABI files and deployed addresses for the on-chain registry |
409
+ Full licence text: [registry.worldbibliotech.com/licence](https://registry.worldbibliotech.com/licence)