@gnolith/taproot 0.1.0-rc.0 → 0.2.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/dist/schema.js CHANGED
@@ -1,4 +1,4 @@
1
- import { encodeTerm, initializeStore, prepareQuadPatch, } from '@gnolith/diamond';
1
+ import { encodeTerm, prepareQuadPatch, } from '@gnolith/diamond';
2
2
  import { DataFactory } from 'rdf-data-factory';
3
3
  import { parseEntityJson } from './canonical.js';
4
4
  import { buildEntityQuads } from './rdf.js';
@@ -120,34 +120,112 @@ export const taprootSchemaStatements = [
120
120
  `INSERT INTO taproot_migrations(version, name) VALUES (1, 'initial'), (2, 'audit-and-operations')
121
121
  ON CONFLICT(version) DO NOTHING`,
122
122
  ];
123
- export async function initializeTaproot(db) {
124
- const previousRdfVersion = (await readMetadata(db, 'rdf_migration_from')) ??
125
- (await readMetadata(db, 'rdf_mapping_version'));
126
- if (previousRdfVersion && previousRdfVersion !== TAPROOT_RDF_VERSION) {
127
- await db
128
- .prepare(`INSERT INTO taproot_metadata(metadata_key, metadata_value) VALUES ('rdf_migration_from', ?)
129
- ON CONFLICT(metadata_key) DO NOTHING`)
130
- .bind(previousRdfVersion)
131
- .run();
132
- }
133
- await initializeStore(db);
134
- await upgradeLegacySchema(db);
135
- await db.batch(taprootSchemaStatements.map((sql) => db.prepare(sql)));
136
- await db
137
- .prepare(`INSERT INTO taproot_audit_events(
138
- event_id, entity_id, revision, event_type, attribution_json, edit_summary,
139
- tags_json, request_id, content_hash, parent_hash, details_json, created_at
140
- ) SELECT event_id, entity_id, revision,
141
- CASE WHEN revision = 1 THEN 'import' ELSE 'update' END,
142
- attribution_json, edit_summary, tags_json, NULL, content_hash, parent_hash,
143
- json_object('deletedAt', deleted_at, 'redirectTo', redirect_to), created_at
144
- FROM taproot_entity_revisions WHERE event_id IS NOT NULL AND content_hash IS NOT NULL
145
- ON CONFLICT(event_id) DO NOTHING`)
146
- .run();
147
- await backfillRdfOwnership(db, previousRdfVersion);
148
- await db
149
- .prepare(`DELETE FROM taproot_metadata WHERE metadata_key = 'rdf_migration_from'`)
150
- .run();
123
+ const schemaStatement = (prefix) => {
124
+ const statement = taprootSchemaStatements.find((sql) => sql.trimStart().startsWith(prefix));
125
+ if (!statement)
126
+ throw new Error(`Missing Taproot schema statement: ${prefix}`);
127
+ return statement;
128
+ };
129
+ /** Exact package-created schema used before the v2 audit migration. */
130
+ export const legacyTaprootV1Statements = [
131
+ schemaStatement('CREATE TABLE IF NOT EXISTS taproot_entities'),
132
+ `CREATE TABLE IF NOT EXISTS taproot_entity_revisions (
133
+ entity_id TEXT NOT NULL,
134
+ revision INTEGER NOT NULL,
135
+ entity_json TEXT NOT NULL CHECK (json_valid(entity_json)),
136
+ actor TEXT,
137
+ edit_summary TEXT,
138
+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
139
+ PRIMARY KEY (entity_id, revision),
140
+ FOREIGN KEY (entity_id) REFERENCES taproot_entities(entity_id)
141
+ ) STRICT`,
142
+ schemaStatement('CREATE TABLE IF NOT EXISTS taproot_id_counters'),
143
+ schemaStatement('CREATE TABLE IF NOT EXISTS taproot_terms'),
144
+ schemaStatement('CREATE TABLE IF NOT EXISTS taproot_metadata'),
145
+ schemaStatement('CREATE TABLE IF NOT EXISTS taproot_assertions'),
146
+ schemaStatement('CREATE INDEX IF NOT EXISTS taproot_entities_type_idx'),
147
+ schemaStatement('CREATE INDEX IF NOT EXISTS taproot_entities_modified_idx'),
148
+ schemaStatement('CREATE INDEX IF NOT EXISTS taproot_revisions_entity_idx'),
149
+ schemaStatement('CREATE INDEX IF NOT EXISTS taproot_terms_lookup_idx'),
150
+ `INSERT INTO taproot_id_counters(entity_type, next_numeric_id)
151
+ VALUES ('item', 1), ('property', 1)`,
152
+ `INSERT INTO taproot_metadata(metadata_key, metadata_value)
153
+ VALUES
154
+ ('schema_version', '1'),
155
+ ('canonical_json_version', '1'),
156
+ ('rdf_mapping_version', '1')`,
157
+ ];
158
+ const currentRevisionStatement = schemaStatement('CREATE TABLE IF NOT EXISTS taproot_entity_revisions');
159
+ const transitionalRevisionStatement = currentRevisionStatement
160
+ .replace('event_id TEXT NOT NULL', 'event_id TEXT')
161
+ .replace('content_hash TEXT NOT NULL', 'content_hash TEXT');
162
+ export const taprootUpgradeCatalogStatements = taprootSchemaStatements
163
+ .filter((sql) => /^\s*CREATE\s+(?:TABLE|INDEX)\s+/iu.test(sql) &&
164
+ !/^\s*CREATE\s+TRIGGER\s+/iu.test(sql) &&
165
+ !sql.includes('taproot_audit'))
166
+ .map((sql) => sql === currentRevisionStatement ? transitionalRevisionStatement : sql);
167
+ export const taprootPreFinalizeCatalogStatements = taprootSchemaStatements.filter((sql) => /^\s*CREATE\s+(?:TABLE|INDEX)\s+/iu.test(sql) &&
168
+ !/^\s*CREATE\s+TRIGGER\s+/iu.test(sql));
169
+ export const legacyTaprootStructureStatements = [
170
+ `ALTER TABLE taproot_entity_revisions RENAME TO taproot_entity_revisions_v1`,
171
+ transitionalRevisionStatement,
172
+ `INSERT INTO taproot_entity_revisions(
173
+ entity_id, revision, entity_json, actor, attribution_json, edit_summary,
174
+ tags_json, event_id, content_hash, parent_hash, deleted_at, redirect_to, created_at
175
+ )
176
+ SELECT entity_id, revision, entity_json, actor, NULL, edit_summary,
177
+ '[]', NULL, NULL, NULL, NULL, NULL, created_at
178
+ FROM taproot_entity_revisions_v1`,
179
+ `DROP TABLE taproot_entity_revisions_v1`,
180
+ ...taprootUpgradeCatalogStatements.filter((sql) => !sql.includes('taproot_entity_revisions (')),
181
+ ];
182
+ export const legacyRevisionFinalizeStatements = [
183
+ `ALTER TABLE taproot_entity_revisions RENAME TO taproot_entity_revisions_backfill`,
184
+ currentRevisionStatement,
185
+ `INSERT INTO taproot_entity_revisions(
186
+ entity_id, revision, entity_json, actor, attribution_json, edit_summary,
187
+ tags_json, event_id, content_hash, parent_hash, deleted_at, redirect_to, created_at
188
+ ) SELECT entity_id, revision, entity_json, actor, attribution_json, edit_summary,
189
+ tags_json, event_id, content_hash, parent_hash, deleted_at, redirect_to, created_at
190
+ FROM taproot_entity_revisions_backfill`,
191
+ `DROP TABLE taproot_entity_revisions_backfill`,
192
+ schemaStatement('CREATE TABLE IF NOT EXISTS taproot_audit_events'),
193
+ schemaStatement('CREATE INDEX IF NOT EXISTS taproot_revisions_entity_idx'),
194
+ schemaStatement('CREATE INDEX IF NOT EXISTS taproot_audit_entity_idx'),
195
+ schemaStatement('CREATE INDEX IF NOT EXISTS taproot_audit_request_idx'),
196
+ ];
197
+ export const taprootFinalizeStatements = taprootSchemaStatements.filter((sql) => /^\s*CREATE\s+TRIGGER\s+/iu.test(sql) ||
198
+ sql.includes(`('schema_version', '${TAPROOT_SCHEMA_VERSION}')`) ||
199
+ sql.includes('INSERT INTO taproot_migrations'));
200
+ export async function initializeTaproot(db, options = {}) {
201
+ const { applyTaprootMigrations } = await import('./migrations.js');
202
+ await applyTaprootMigrations(db, options);
203
+ }
204
+ export async function isRecognizedLegacyV1(db, tables) {
205
+ const expectedTables = [
206
+ 'taproot_assertions',
207
+ 'taproot_entities',
208
+ 'taproot_entity_revisions',
209
+ 'taproot_id_counters',
210
+ 'taproot_metadata',
211
+ 'taproot_terms',
212
+ ];
213
+ if (JSON.stringify(tables.map(({ name }) => name)) !==
214
+ JSON.stringify(expectedTables))
215
+ return false;
216
+ if (!(await matchesExactCatalog(db, legacyTaprootV1Statements)))
217
+ return false;
218
+ const metadata = await db
219
+ .prepare(`SELECT metadata_key, metadata_value FROM taproot_metadata
220
+ WHERE metadata_key IN ('schema_version', 'canonical_json_version', 'rdf_mapping_version')
221
+ ORDER BY metadata_key`)
222
+ .all();
223
+ return (JSON.stringify(metadata.results) ===
224
+ JSON.stringify([
225
+ { metadata_key: 'canonical_json_version', metadata_value: '1' },
226
+ { metadata_key: 'rdf_mapping_version', metadata_value: '1' },
227
+ { metadata_key: 'schema_version', metadata_value: '1' },
228
+ ]));
151
229
  }
152
230
  async function readMetadata(db, key) {
153
231
  const table = await db
@@ -161,7 +239,7 @@ async function readMetadata(db, key) {
161
239
  .all();
162
240
  return result.results[0]?.metadata_value;
163
241
  }
164
- async function backfillRdfOwnership(db, previousVersion) {
242
+ export async function backfillRdfOwnership(db, previousVersion, previousBaseIri) {
165
243
  const rows = await db
166
244
  .prepare(`SELECT entity_id, entity_json, deleted_at, redirect_to FROM taproot_entities ORDER BY entity_id`)
167
245
  .all();
@@ -169,20 +247,14 @@ async function backfillRdfOwnership(db, previousVersion) {
169
247
  return;
170
248
  const baseIri = await readMetadata(db, 'base_iri');
171
249
  if (!baseIri)
172
- return;
250
+ throw new SchemaMismatchError('Taproot RDF ownership cannot be rebuilt without a database identity');
173
251
  const factory = new DataFactory();
174
252
  for (const row of rows.results) {
175
253
  const entity = parseEntityJson(row.entity_json);
176
254
  const current = lifecycleQuads(entity, row.deleted_at, row.redirect_to, baseIri, TAPROOT_RDF_VERSION, factory);
177
- const existingOwnership = await db
178
- .prepare(`SELECT COUNT(*) AS count FROM taproot_rdf_ownership WHERE entity_id = ?`)
179
- .bind(row.entity_id)
180
- .all();
181
- if (previousVersion === TAPROOT_RDF_VERSION &&
182
- Number(existingOwnership.results[0]?.count ?? 0) > 0)
183
- continue;
184
- const old = previousVersion && previousVersion !== TAPROOT_RDF_VERSION
185
- ? lifecycleQuads(entity, row.deleted_at, row.redirect_to, baseIri, previousVersion, factory)
255
+ const old = previousVersion &&
256
+ (previousVersion !== TAPROOT_RDF_VERSION || previousBaseIri !== baseIri)
257
+ ? lifecycleQuads(entity, row.deleted_at, row.redirect_to, previousBaseIri ?? baseIri, previousVersion, factory)
186
258
  : [];
187
259
  const patch = prepareQuadPatch(db, { delete: old, insert: current });
188
260
  const ownershipRows = current.map((quad) => ({
@@ -207,7 +279,10 @@ async function backfillRdfOwnership(db, previousVersion) {
207
279
  function lifecycleQuads(entity, deletedAt, redirectTo, baseIri, mappingVersion, factory) {
208
280
  if (!deletedAt && !redirectTo)
209
281
  return buildEntityQuads(entity, { baseIri, mappingVersion, factory });
210
- const base = baseIri.replace(/\/+$/u, '');
282
+ let end = baseIri.length;
283
+ while (end > 0 && baseIri.charCodeAt(end - 1) === 47)
284
+ end -= 1;
285
+ const base = baseIri.slice(0, end);
211
286
  const subject = factory.namedNode(`${base}/entity/${entity.id}`);
212
287
  const quads = [
213
288
  factory.quad(subject, factory.namedNode(`${base}/vocab/revision`), factory.literal(String(entity.lastrevid), factory.namedNode('http://www.w3.org/2001/XMLSchema#integer'))),
@@ -218,35 +293,7 @@ function lifecycleQuads(entity, deletedAt, redirectTo, baseIri, mappingVersion,
218
293
  quads.push(factory.quad(subject, factory.namedNode('http://www.w3.org/2002/07/owl#sameAs'), factory.namedNode(`${base}/entity/${redirectTo}`)));
219
294
  return quads;
220
295
  }
221
- async function upgradeLegacySchema(db) {
222
- const tables = await db
223
- .prepare(`SELECT name FROM sqlite_schema WHERE type = 'table' AND name = 'taproot_entity_revisions'`)
224
- .all();
225
- if (!tables.results.length)
226
- return;
227
- const columns = await db
228
- .prepare(`PRAGMA table_info(taproot_entity_revisions)`)
229
- .all();
230
- const names = new Set(columns.results.map(({ name }) => name));
231
- const additions = [
232
- [
233
- 'attribution_json',
234
- `TEXT CHECK (attribution_json IS NULL OR json_valid(attribution_json))`,
235
- ],
236
- ['tags_json', `TEXT NOT NULL DEFAULT '[]' CHECK (json_valid(tags_json))`],
237
- ['event_id', `TEXT`],
238
- ['content_hash', `TEXT`],
239
- ['parent_hash', `TEXT`],
240
- ['deleted_at', `TEXT`],
241
- ['redirect_to', `TEXT`],
242
- ];
243
- for (const [name, definition] of additions) {
244
- if (!names.has(name)) {
245
- await db
246
- .prepare(`ALTER TABLE taproot_entity_revisions ADD COLUMN ${name} ${definition}`)
247
- .run();
248
- }
249
- }
296
+ export async function backfillLegacyRevisions(db) {
250
297
  const revisions = await db
251
298
  .prepare(`SELECT r.entity_id, r.revision, r.entity_json, r.actor, r.event_id, r.content_hash,
252
299
  CASE WHEN r.revision = e.revision THEN e.deleted_at ELSE r.deleted_at END AS deleted_at,
@@ -259,25 +306,128 @@ async function upgradeLegacySchema(db) {
259
306
  for (const revision of revisions.results) {
260
307
  if (revision.entity_id !== previousEntity)
261
308
  parentHash = null;
262
- const contentHash = revision.content_hash ??
263
- (await hash(`${revision.entity_json}\n${JSON.stringify({ deletedAt: revision.deleted_at, redirectTo: revision.redirect_to })}`));
309
+ const contentHash = await hash(`${revision.entity_json}\n${JSON.stringify({ deletedAt: revision.deleted_at, redirectTo: revision.redirect_to })}`);
310
+ const eventId = `legacy-${revision.entity_id}-${revision.revision}`;
311
+ if ((revision.event_id !== null && revision.event_id !== eventId) ||
312
+ (revision.content_hash !== null && revision.content_hash !== contentHash)) {
313
+ throw new SchemaMismatchError(`Legacy revision ${revision.entity_id}@${revision.revision} has conflicting durable identity`);
314
+ }
264
315
  if (!revision.event_id || !revision.content_hash) {
265
316
  const attribution = revision.actor
266
317
  ? JSON.stringify({ id: revision.actor, kind: 'human' })
267
318
  : null;
268
- await db
269
- .prepare(`UPDATE taproot_entity_revisions SET event_id = ?, content_hash = ?,
319
+ await db.batch([
320
+ db
321
+ .prepare(`UPDATE taproot_entity_revisions SET event_id = ?, content_hash = ?,
270
322
  parent_hash = ?, attribution_json = COALESCE(attribution_json, ?),
271
323
  tags_json = COALESCE(tags_json, '[]'), deleted_at = ?, redirect_to = ?
272
324
  WHERE entity_id = ? AND revision = ?`)
273
- .bind(revision.event_id ??
274
- `legacy-${revision.entity_id}-${revision.revision}`, contentHash, parentHash, attribution, revision.deleted_at, revision.redirect_to, revision.entity_id, revision.revision)
275
- .run();
325
+ .bind(eventId, contentHash, parentHash, attribution, revision.deleted_at, revision.redirect_to, revision.entity_id, revision.revision),
326
+ ]);
327
+ }
328
+ else {
329
+ const storedParent = await db
330
+ .prepare(`SELECT parent_hash FROM taproot_entity_revisions
331
+ WHERE entity_id = ? AND revision = ?`)
332
+ .bind(revision.entity_id, revision.revision)
333
+ .all();
334
+ if (storedParent.results[0]?.parent_hash !== parentHash)
335
+ throw new SchemaMismatchError(`Legacy revision ${revision.entity_id}@${revision.revision} has a conflicting parent hash`);
276
336
  }
277
337
  previousEntity = revision.entity_id;
278
338
  parentHash = contentHash;
279
339
  }
280
340
  }
341
+ export async function backfillTaprootAudit(db) {
342
+ await db.batch([
343
+ db.prepare(`INSERT INTO taproot_audit_events(
344
+ event_id, entity_id, revision, event_type, attribution_json,
345
+ edit_summary, tags_json, content_hash, parent_hash, details_json, created_at
346
+ )
347
+ SELECT event_id, entity_id, revision, 'import',
348
+ attribution_json, edit_summary, tags_json, content_hash, parent_hash,
349
+ json_object('source', 'legacy-v1'), created_at
350
+ FROM taproot_entity_revisions
351
+ WHERE true
352
+ ON CONFLICT(event_id) DO NOTHING`),
353
+ ]);
354
+ }
355
+ export async function verifyTaprootSemanticState(db, baseIri) {
356
+ const incomplete = await db
357
+ .prepare(`SELECT COUNT(*) AS count
358
+ FROM taproot_entity_revisions r
359
+ LEFT JOIN taproot_audit_events a ON a.event_id = r.event_id
360
+ WHERE r.event_id IS NULL OR r.content_hash IS NULL OR a.event_id IS NULL
361
+ OR a.entity_id IS NOT r.entity_id OR a.revision IS NOT r.revision
362
+ OR a.content_hash IS NOT r.content_hash
363
+ OR a.parent_hash IS NOT r.parent_hash
364
+ OR a.attribution_json IS NOT r.attribution_json
365
+ OR a.edit_summary IS NOT r.edit_summary
366
+ OR a.tags_json IS NOT r.tags_json
367
+ OR a.created_at IS NOT r.created_at`)
368
+ .all();
369
+ if (Number(incomplete.results[0]?.count ?? 0) !== 0)
370
+ throw new SchemaMismatchError('Taproot revision identity or audit backfill is incomplete');
371
+ const dangling = await db
372
+ .prepare(`SELECT COUNT(*) AS count
373
+ FROM taproot_rdf_ownership o
374
+ LEFT JOIN taproot_entities e ON e.entity_id = o.entity_id
375
+ WHERE e.entity_id IS NULL`)
376
+ .all();
377
+ if (Number(dangling.results[0]?.count ?? 0) !== 0)
378
+ throw new SchemaMismatchError('Taproot RDF ownership contains dangling rows');
379
+ const missingProjection = await db
380
+ .prepare(`SELECT COUNT(*) AS count
381
+ FROM taproot_rdf_ownership o
382
+ LEFT JOIN rdf_quads q
383
+ ON q.subject_key = o.subject_key
384
+ AND q.predicate_key = o.predicate_key
385
+ AND q.object_key = o.object_key
386
+ AND q.graph_key = o.graph_key
387
+ WHERE q.id IS NULL`)
388
+ .all();
389
+ if (Number(missingProjection.results[0]?.count ?? 0) !== 0)
390
+ throw new SchemaMismatchError('Taproot RDF ownership is missing its Diamond quad projection');
391
+ const rows = await db
392
+ .prepare(`SELECT entity_id, entity_json, deleted_at, redirect_to
393
+ FROM taproot_entities ORDER BY entity_id`)
394
+ .all();
395
+ const factory = new DataFactory();
396
+ for (const row of rows.results) {
397
+ const expected = lifecycleQuads(parseEntityJson(row.entity_json), row.deleted_at, row.redirect_to, baseIri, TAPROOT_RDF_VERSION, factory)
398
+ .map((quad) => [
399
+ encodeTerm(quad.subject).key,
400
+ encodeTerm(quad.predicate).key,
401
+ encodeTerm(quad.object).key,
402
+ encodeTerm(quad.graph).key,
403
+ ].join('\u0000'))
404
+ .sort();
405
+ const actual = await db
406
+ .prepare(`SELECT subject_key, predicate_key, object_key, graph_key
407
+ FROM taproot_rdf_ownership WHERE entity_id = ?
408
+ ORDER BY subject_key, predicate_key, object_key, graph_key`)
409
+ .bind(row.entity_id)
410
+ .all();
411
+ const keys = actual.results
412
+ .map(({ subject_key, predicate_key, object_key, graph_key }) => [subject_key, predicate_key, object_key, graph_key].join('\u0000'))
413
+ .sort();
414
+ if (JSON.stringify(keys) !== JSON.stringify(expected))
415
+ throw new SchemaMismatchError(`Taproot RDF ownership backfill is incomplete for ${row.entity_id}`);
416
+ }
417
+ }
418
+ export async function verifyTaprootPackageSeeds(db) {
419
+ const migrationSeeds = await db
420
+ .prepare(`SELECT COUNT(*) AS count FROM taproot_migrations
421
+ WHERE (version = 1 AND name = 'initial')
422
+ OR (version = 2 AND name = 'audit-and-operations')`)
423
+ .all();
424
+ const migrationSeedTotal = await db
425
+ .prepare(`SELECT COUNT(*) AS count FROM taproot_migrations`)
426
+ .all();
427
+ if (Number(migrationSeeds.results[0]?.count ?? 0) !== 2 ||
428
+ Number(migrationSeedTotal.results[0]?.count ?? 0) !== 2)
429
+ throw new SchemaMismatchError('Taproot package migration seeds are incomplete');
430
+ }
281
431
  async function hash(value) {
282
432
  const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));
283
433
  return [...new Uint8Array(digest)]
@@ -381,6 +531,52 @@ export async function inspectTaprootSchema(db) {
381
531
  errors,
382
532
  };
383
533
  }
534
+ /**
535
+ * Verify the exact package-owned catalog before adopting a current pre-ledger
536
+ * database. This is intentionally stricter than the operational inspection:
537
+ * names alone must never authorize stamping an arbitrary look-alike schema.
538
+ */
539
+ export async function isExactTaprootSchema(db) {
540
+ return matchesExactCatalog(db, taprootSchemaStatements);
541
+ }
542
+ export async function isExactTaprootUpgradeSchema(db) {
543
+ return matchesExactCatalog(db, taprootUpgradeCatalogStatements);
544
+ }
545
+ export async function isExactTaprootPreFinalizeSchema(db) {
546
+ return matchesExactCatalog(db, taprootPreFinalizeCatalogStatements);
547
+ }
548
+ async function matchesExactCatalog(db, statements) {
549
+ const expected = new Map();
550
+ for (const sql of statements) {
551
+ const match = /^\s*CREATE\s+(TABLE|INDEX|TRIGGER)\s+(?:IF\s+NOT\s+EXISTS\s+)?([a-z0-9_]+)/iu.exec(sql);
552
+ if (!match?.[1] || !match[2])
553
+ continue;
554
+ expected.set(`${match[1].toLowerCase()}:${match[2]}`, normalizeCatalogSql(sql));
555
+ }
556
+ const catalog = await db
557
+ .prepare(`SELECT type, name, sql FROM sqlite_schema
558
+ WHERE name LIKE 'taproot_%' AND type IN ('table', 'index', 'trigger')
559
+ ORDER BY type, name`)
560
+ .all();
561
+ if (catalog.results.length !== expected.size)
562
+ return false;
563
+ for (const entry of catalog.results) {
564
+ const expectedSql = expected.get(`${entry.type}:${entry.name}`);
565
+ if (expectedSql === undefined ||
566
+ entry.sql === null ||
567
+ normalizeCatalogSql(entry.sql) !== expectedSql)
568
+ return false;
569
+ }
570
+ return true;
571
+ }
572
+ function normalizeCatalogSql(sql) {
573
+ return sql
574
+ .replace(/\bIF\s+NOT\s+EXISTS\s+/giu, '')
575
+ .replace(/\s+/gu, ' ')
576
+ .replace(/;\s*$/u, '')
577
+ .trim()
578
+ .toLowerCase();
579
+ }
384
580
  export async function assertTaprootSchema(db) {
385
581
  const inspection = await inspectTaprootSchema(db);
386
582
  if (!inspection.valid) {
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
package/docs/api.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # API guide
2
2
 
3
+ ## Persistence and migrations
4
+
5
+ Taproot accepts Diamond's runtime-neutral `SqliteDatabaseLike`; the exported
6
+ `D1DatabaseLike` remains a structurally compatible name for existing Site
7
+ consumers. `initializeTaproot(db, { baseIri })` initializes Diamond first, then
8
+ Taproot, and records the canonical absolute HTTP(S) base IRI on first use.
9
+ Later initialization may omit it; supplying a different identity fails closed.
10
+
11
+ `planTaprootMigrations(db)` and `inspectTaprootPersistence(db)` are read-only.
12
+ `applyTaprootMigrations(db, { baseIri })` applies the package-owned checksummed
13
+ manifest in the `@gnolith/taproot` ledger namespace. Known version-one layouts
14
+ are inspected before adoption. Unknown, partial, out-of-order, or
15
+ checksum-drifted histories raise typed migration/schema errors.
16
+
3
17
  `TaprootRepository` is the primary API; equivalent top-level functions are
4
18
  exported for request-scoped use.
5
19
 
@@ -1,6 +1,6 @@
1
1
  # Architecture
2
2
 
3
- Taproot is the knowledge-domain layer between a Codex Site and Diamond. The
3
+ Taproot is the knowledge-domain layer between a D1-backed application and Diamond. The
4
4
  canonical source of truth is one Wikibase-shaped JSON document per Item or
5
5
  Property. Revisions are append-only snapshots. Search terms and RDF are
6
6
  rebuildable projections and never become a competing statement model.
@@ -28,3 +28,4 @@ Taproot owns Items, Properties, their values and lifecycle, revisions,
28
28
  attribution/audit history, deterministic projections, migration, integrity,
29
29
  and repair. It deliberately does not own authentication, authorization, MCP,
30
30
  agents, UI, wiki article bodies, media storage, or arbitrary SPARQL Update.
31
+ It also does not own Site assembly, provisioning, deployment, or acceptance.
@@ -3,21 +3,21 @@
3
3
  This audit covers the complete Taproot package boundary defined in
4
4
  `product-scope.md`, not merely CRUD.
5
5
 
6
- | Capability | Evidence |
7
- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
8
- | Canonical model | Item/Property types, strict validator, canonical serializer, statement/reference builders, JSON fixture |
9
- | Complete edits | Typed individual commands, `applyCommands`, optimistic revisions, all term/sitelink/statement/qualifier/reference/rank paths |
10
- | Lifecycle | Soft delete, restore, same-type acyclic redirects, bounded resolution, lifecycle snapshots in every revision/event |
11
- | Attribution/audit | Structured actors, legacy normalization, summaries, tags, request IDs, immutable events/revisions, SHA-256 parent chains |
12
- | D1 atomicity | One batch for current JSON, revision, audit, terms, RDF, and ownership; rollback and competing-edit Workerd tests |
13
- | RDF/SPARQL | Wikibase paths, truthy/best rank, all snak types, full values, standard statement/provenance types, mapping v2 fixtures |
14
- | Shared RDF safety | Per-entity quad ownership and behavioral regression covering a shared full-value node during another entity's edit |
15
- | Search/read scale | Entity/revision/audit keyset cursors, bounded search cursor, configured page limits |
16
- | Bulk/agent workflows | Multi-command single revision, bounded create/upsert import with indexed errors, NDJSON export, request correlation |
17
- | Migration | Versioned SQL, programmatic v1 hash/audit backfill, resumable v1-to-v2 RDF reprojection and ownership creation |
18
- | Integrity/repair | Schema inspection, audit-chain verification, JSON/revision/term/RDF comparison, cursor scan, audited reprojection repair |
19
- | Extension points | Required attribution, async host validators, isolated observations, injected clock and IDs |
20
- | Operations/release | Architecture/API/operations/scope/security/testing docs, Node 22/24 CI, packed consumer, license and release gates |
6
+ | Capability | Evidence |
7
+ | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
8
+ | Canonical model | Item/Property types, strict validator, canonical serializer, statement/reference builders, JSON fixture |
9
+ | Complete edits | Typed individual commands, `applyCommands`, optimistic revisions, all term/sitelink/statement/qualifier/reference/rank paths |
10
+ | Lifecycle | Soft delete, restore, same-type acyclic redirects, bounded resolution, lifecycle snapshots in every revision/event |
11
+ | Attribution/audit | Structured actors, legacy normalization, summaries, tags, request IDs, immutable events/revisions, SHA-256 parent chains |
12
+ | D1 atomicity | One batch for current JSON, revision, audit, terms, RDF, and ownership; rollback and competing-edit Workerd tests |
13
+ | RDF/SPARQL | Wikibase paths, truthy/best rank, all snak types, full values, standard statement/provenance types, mapping v2 fixtures |
14
+ | Shared RDF safety | Per-entity quad ownership and behavioral regression covering a shared full-value node during another entity's edit |
15
+ | Search/read scale | Entity/revision/audit keyset cursors, bounded search cursor, configured page limits |
16
+ | Bulk/agent workflows | Multi-command single revision, bounded create/upsert import with indexed errors, NDJSON export, request correlation |
17
+ | Migration | Versioned SQL, programmatic v1 hash/audit backfill, resumable v1-to-v2 RDF reprojection and ownership creation |
18
+ | Integrity/repair | Schema inspection, audit-chain verification, JSON/revision/term/RDF comparison, cursor scan, audited reprojection repair |
19
+ | Extension points | Required attribution, async host validators, isolated observations, injected clock and IDs |
20
+ | Package operations/release | Architecture/API/persistence/scope/security/testing docs, Node 22/24 CI, packed consumer, license and release gates |
21
21
 
22
22
  ## Reproduction
23
23
 
@@ -26,6 +26,12 @@ npm ci
26
26
  npm run check
27
27
  ```
28
28
 
29
- Diamond `0.3.2` or later supplies the registry-published composable patch API.
29
+ Diamond `0.4.0` supplies the composable patch API, neutral SQLite capability,
30
+ and package-owned migration primitives.
30
31
  The packed-consumer gate installs Taproot and Diamond without repository
31
32
  siblings or local paths and exercises a fresh Workerd D1 database.
33
+
34
+ This audit qualifies the Taproot package boundary only. It does not assemble,
35
+ provision, deploy, or accept a complete Gnolith Site. The Codex agent creating
36
+ a Site owns database binding, remote migration orchestration, route and auth
37
+ wiring, hosting configuration, deployment, and production acceptance.
@@ -2,16 +2,27 @@
2
2
 
3
3
  ## Initialize and migrate
4
4
 
5
- Run `initializeTaproot(db)` during deployment or startup. It is idempotent and
6
- initializes Diamond too. SQL migration users must still run the initializer
7
- after applying `0002`: legacy revision hashes require Web Crypto and cannot be
8
- correctly produced by SQLite alone.
5
+ Run `initializeTaproot(db, { baseIri })` before using a new database. The
6
+ absolute HTTP(S) base IRI is stored as permanent database identity and cannot
7
+ be replaced by a later hostname or runtime setting. Afterward,
8
+ `initializeTaproot(db)` is idempotent and initializes Diamond too. Do not apply
9
+ the historical numbered SQL files directly in 0.2; hosts orchestrate the
10
+ package-owned plan/apply/initialize APIs because legacy revision hashes and
11
+ adoption checks cannot be correctly produced by SQLite alone.
9
12
 
10
13
  The v1-to-v2 migration backfills SHA-256 content/parent chains and audit
11
14
  events, migrates RDF mapping v1 to v2, creates ownership records, and uses a
12
15
  durable migration marker so an interrupted reprojection resumes safely.
13
16
  `inspectTaprootSchema` checks tables, required columns, indexes, triggers, and
14
- format versions. Treat a failed inspection as a deployment failure.
17
+ format versions. A failed inspection means the database is not usable by this
18
+ package. The consuming application decides how that affects startup or rollout.
19
+
20
+ Hosts can call `planTaprootMigrations(db)`,
21
+ `inspectTaprootPersistence(db)`, and
22
+ `applyTaprootMigrations(db, { baseIri })`. Planning and inspection are
23
+ read-only. Taproot owns its schema, identity, and migration namespace; Seedbed
24
+ owns local CLI, file path, process lifecycle, and Docker assembly, while a
25
+ Codex Site host owns D1 and Site assembly.
15
26
 
16
27
  ## Integrity and repair
17
28
 
@@ -35,6 +46,11 @@ redirects, or audit history.
35
46
  After database restore, run schema inspection and paginated integrity checks.
36
47
  After JSON-only import, projections are generated during each import.
37
48
 
49
+ Taproot documents persistence semantics but does not select or provision a D1
50
+ database, run remote migrations, configure backups, deploy an application, or
51
+ accept a complete Gnolith Site. The Codex agent creating a Site owns those
52
+ operational decisions and checks.
53
+
38
54
  ## Limits and failure behavior
39
55
 
40
56
  Writes are atomic per entity. Bulk import is deliberately not a cross-entity
@@ -1,6 +1,6 @@
1
1
  # Product scope
2
2
 
3
- Taproot exists so a Codex Site can own a Wikibase-style knowledge graph in D1
3
+ Taproot exists so a D1-backed application can own a Wikibase-style knowledge graph
4
4
  and query it through Diamond without operating MediaWiki or another external
5
5
  knowledge service.
6
6
 
@@ -15,6 +15,11 @@ than missing Taproot implementation: MCP transport, agent orchestration,
15
15
  authentication/authorization, UI, wiki pages, media bytes, MediaWiki APIs,
16
16
  Lexeme/Form/Sense, MediaInfo, and EntitySchema entity storage.
17
17
 
18
+ Complete-Site assembly, resource provisioning, remote migration execution,
19
+ deployment, and production acceptance are also outside this package. The Codex
20
+ agent creating a Gnolith Site owns those responsibilities. Taproot qualifies
21
+ only its published package and supported local runtime contracts.
22
+
18
23
  Adding an extension entity type changes IDs, JSON, commands, RDF, migration,
19
24
  and compatibility fixtures. It must be designed and versioned as an explicit
20
25
  new domain rather than accepted as unvalidated JSON.