datanotes 3.0.0 → 3.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.
Files changed (73) hide show
  1. package/README.md +1 -5
  2. package/dist/api/client.d.cts +37 -4
  3. package/dist/api/client.d.ts +37 -4
  4. package/dist/api/index.cjs +563 -60
  5. package/dist/api/index.d.cts +3 -2
  6. package/dist/api/index.d.ts +3 -2
  7. package/dist/api/index.js +563 -60
  8. package/dist/api/mcp.cjs +181 -11
  9. package/dist/api/mcp.js +181 -11
  10. package/dist/api/otlp.d.cts +63 -15
  11. package/dist/api/otlp.d.ts +63 -15
  12. package/dist/api/redact.d.cts +25 -0
  13. package/dist/api/redact.d.ts +25 -0
  14. package/dist/api/tokens.d.cts +5 -0
  15. package/dist/api/tokens.d.ts +5 -0
  16. package/dist/api/tracing.d.cts +107 -0
  17. package/dist/api/tracing.d.ts +107 -0
  18. package/dist/datanotes.cjs +9934 -2656
  19. package/dist/docs/administration/limits.md +96 -12
  20. package/dist/docs/administration/run-the-service.md +18 -0
  21. package/dist/docs/api/operations/add_column.md +1 -0
  22. package/dist/docs/api/operations/add_constraint.md +2 -0
  23. package/dist/docs/api/operations/alter_column.md +1 -1
  24. package/dist/docs/api/operations/alter_table.md +3 -2
  25. package/dist/docs/api/operations/check_table.md +1 -1
  26. package/dist/docs/api/operations/create_table.md +3 -1
  27. package/dist/docs/api/operations/describe_table.md +1 -1
  28. package/dist/docs/api/operations/graph_neighbors.md +4 -2
  29. package/dist/docs/api/operations/graph_path.md +3 -3
  30. package/dist/docs/api/operations/graph_traverse.md +2 -2
  31. package/dist/docs/api/operations/insert_row.md +2 -2
  32. package/dist/docs/api/operations/record_tool_call.md +1 -0
  33. package/dist/docs/api/operations/tags/queries.md +2 -2
  34. package/dist/docs/api/operations/tags/rows-dml.md +1 -1
  35. package/dist/docs/api.md +4 -4
  36. package/dist/docs/develop/concurrency.md +36 -1
  37. package/dist/docs/develop/http-api.md +11 -1
  38. package/dist/docs/develop/telemetry.md +224 -25
  39. package/dist/docs/guides/data-quality/check-constraints.md +14 -13
  40. package/dist/docs/guides/data-quality/hand-edits.md +10 -10
  41. package/dist/docs/guides/database-objects/bases.md +11 -11
  42. package/dist/docs/guides/database-objects/catalogs-and-schemas.md +16 -10
  43. package/dist/docs/guides/database-objects/columns.md +38 -38
  44. package/dist/docs/guides/database-objects/relations.md +173 -36
  45. package/dist/docs/guides/database-objects/tables.md +90 -109
  46. package/dist/docs/guides/database-objects/views.md +44 -44
  47. package/dist/docs/guides/history/back-up.md +12 -4
  48. package/dist/docs/guides/history/change-data-feed.md +34 -34
  49. package/dist/docs/guides/history/journal-and-undo.md +12 -12
  50. package/dist/docs/guides/history/restore.md +20 -20
  51. package/dist/docs/guides/history/table-history.md +31 -31
  52. package/dist/docs/guides/history/vacuum.md +1 -10
  53. package/dist/docs/guides/read-and-write/automatic-links.md +15 -15
  54. package/dist/docs/guides/read-and-write/import-notes.md +21 -21
  55. package/dist/docs/guides/read-and-write/joins-and-aggregates.md +7 -7
  56. package/dist/docs/guides/read-and-write/read-and-filter.md +10 -10
  57. package/dist/docs/guides/read-and-write/write-rows.md +10 -10
  58. package/dist/docs/guides/search/link-graph.md +95 -0
  59. package/dist/docs/guides/search/text.md +1 -1
  60. package/dist/docs/guides/security/who-did-what.md +2 -0
  61. package/dist/docs/reference/cli.md +10 -3
  62. package/dist/docs/reference/compatibility.md +33 -13
  63. package/dist/docs/reference/errors.md +1 -1
  64. package/dist/docs/reference/operations/auxiliary.md +2 -2
  65. package/dist/docs/reference/operations/queries.md +3 -3
  66. package/dist/docs/reference/operations/rows.md +1 -1
  67. package/dist/docs/reference/operations/schema.md +15 -11
  68. package/dist/docs/reference/operations.md +39 -39
  69. package/dist/docs/reference/settings.md +37 -25
  70. package/dist/docs/release-notes.md +145 -0
  71. package/dist/docs/start/how-it-works.md +35 -3
  72. package/dist/docs/start/quick-start.md +2 -0
  73. package/package.json +3 -2
@@ -41,7 +41,7 @@ Answer:
41
41
  "ok": true,
42
42
  "op": "create_view",
43
43
  "planned_texts": ["datanotes/metastore.yaml"],
44
- "migration_id": "20261012T071956-create_view-create-view-main-public-vw_rec"
44
+ "migration_id": "20261019T040648-create_view-create-view-main-public-vw_rec"
45
45
  }
46
46
  ```
47
47
 
@@ -65,16 +65,16 @@ Answer:
65
65
  "total": 2,
66
66
  "rows": [
67
67
  {
68
- "path": "datanotes/main/public/watch/2026-10-10T2030.md",
68
+ "path": "datanotes/main/public/watch/2026-10-17T2030.md",
69
69
  "film": "[[The Gold Rush]]",
70
- "occurred_at": "2026-10-10T20:30",
70
+ "occurred_at": "2026-10-17T20:30",
71
71
  "where": "home",
72
72
  "place": "my living room"
73
73
  },
74
74
  {
75
- "path": "datanotes/main/public/watch/2026-10-07T2115.md",
75
+ "path": "datanotes/main/public/watch/2026-10-14T2115.md",
76
76
  "film": "[[Charade]]",
77
- "occurred_at": "2026-10-07T21:15",
77
+ "occurred_at": "2026-10-14T21:15",
78
78
  "where": "home",
79
79
  "place": "my living room"
80
80
  }
@@ -156,7 +156,7 @@ Answer:
156
156
  "ok": true,
157
157
  "op": "create_view",
158
158
  "planned_texts": ["datanotes/metastore.yaml"],
159
- "migration_id": "20261012T071956-create_view-create-view-main-public-vw_rec-2"
159
+ "migration_id": "20261019T040648-create_view-create-view-main-public-vw_rec-2"
160
160
  }
161
161
  ```
162
162
 
@@ -194,7 +194,7 @@ Answer:
194
194
  "ok": true,
195
195
  "op": "create_view",
196
196
  "planned_texts": ["datanotes/metastore.yaml"],
197
- "migration_id": "20261012T071956-create_view-create-view-main-public-vw_las"
197
+ "migration_id": "20261019T040648-create_view-create-view-main-public-vw_las"
198
198
  }
199
199
  ```
200
200
 
@@ -214,59 +214,59 @@ Answer (65 lines)
214
214
  {
215
215
  "path": "datanotes/main/public/film/Night of the Living Dead.md",
216
216
  "title": "Night of the Living Dead",
217
- "watched_on": "2026-10-11",
217
+ "watched_on": "2026-10-18",
218
218
  "cast": [
219
219
  {
220
220
  "path": "datanotes/main/public/actor/Duane Jones.md",
221
221
  "table": "main.public.actor",
222
- "id": "01a12efb-7fd1-74b0-ad94-c0ee904521ad",
222
+ "id": "01a15257-301f-7673-a539-232f5503e508",
223
223
  "name": "Duane Jones",
224
224
  "born": "1937-04-02"
225
225
  }
226
226
  ],
227
227
  "viewing": [
228
- { "path": "datanotes/main/public/watch/2026-10-11T2200.md", "where": "cinema" }
228
+ { "path": "datanotes/main/public/watch/2026-10-18T2200.md", "where": "cinema" }
229
229
  ]
230
230
  },
231
231
  {
232
232
  "path": "datanotes/main/public/film/The Gold Rush.md",
233
233
  "title": "The Gold Rush",
234
- "watched_on": "2026-10-10",
234
+ "watched_on": "2026-10-17",
235
235
  "cast": [
236
236
  {
237
237
  "path": "datanotes/main/public/actor/Charlie Chaplin.md",
238
238
  "table": "main.public.actor",
239
- "id": "01a12efb-7fb2-7ee5-99d8-282dff2a79e5",
239
+ "id": "01a15257-2ffd-7cc9-a75d-33f2521017c5",
240
240
  "name": "Charlie Chaplin",
241
241
  "born": "1889-04-16"
242
242
  }
243
243
  ],
244
244
  "viewing": [
245
- { "path": "datanotes/main/public/watch/2026-10-10T2030.md", "where": "home" }
245
+ { "path": "datanotes/main/public/watch/2026-10-17T2030.md", "where": "home" }
246
246
  ]
247
247
  },
248
248
  {
249
249
  "path": "datanotes/main/public/film/Charade.md",
250
250
  "title": "Charade",
251
- "watched_on": "2026-10-07",
251
+ "watched_on": "2026-10-14",
252
252
  "cast": [
253
253
  {
254
254
  "path": "datanotes/main/public/actor/Cary Grant.md",
255
255
  "table": "main.public.actor",
256
- "id": "01a12efb-7fbf-77c3-888b-698d82923a6f",
256
+ "id": "01a15257-300c-734a-9890-e6fa77c91bc8",
257
257
  "name": "Cary Grant",
258
258
  "born": "1904-01-18"
259
259
  },
260
260
  {
261
261
  "path": "datanotes/main/public/actor/Audrey Hepburn.md",
262
262
  "table": "main.public.actor",
263
- "id": "01a12efb-7fca-74dd-b41c-fed458b65dc9",
263
+ "id": "01a15257-3019-7cfd-932d-a771c31e1661",
264
264
  "name": "Audrey Hepburn",
265
265
  "born": "1929-05-04"
266
266
  }
267
267
  ],
268
268
  "viewing": [
269
- { "path": "datanotes/main/public/watch/2026-10-07T2115.md", "where": "home" }
269
+ { "path": "datanotes/main/public/watch/2026-10-14T2115.md", "where": "home" }
270
270
  ]
271
271
  }
272
272
  ],
@@ -313,7 +313,7 @@ Answer:
313
313
  "ok": true,
314
314
  "op": "create_view",
315
315
  "planned_texts": ["datanotes/metastore.yaml"],
316
- "migration_id": "20261012T071956-create_view-create-view-main-public-vw_mos"
316
+ "migration_id": "20261019T040648-create_view-create-view-main-public-vw_mos"
317
317
  }
318
318
  ```
319
319
 
@@ -382,7 +382,7 @@ Answer:
382
382
  "ok": true,
383
383
  "op": "create_view",
384
384
  "planned_texts": ["datanotes/metastore.yaml"],
385
- "migration_id": "20261012T071956-create_view-create-view-main-public-vw_lat"
385
+ "migration_id": "20261019T040648-create_view-create-view-main-public-vw_lat"
386
386
  }
387
387
  ```
388
388
 
@@ -400,59 +400,59 @@ Answer (64 lines)
400
400
  "total": 4,
401
401
  "rows": [
402
402
  {
403
- "path": "datanotes/main/public/watch/2026-10-11T2200.md",
403
+ "path": "datanotes/main/public/watch/2026-10-18T2200.md",
404
404
  "film": {
405
405
  "path": "datanotes/main/public/film/Night of the Living Dead.md",
406
406
  "table": "main.public.film",
407
- "id": "01a12efb-801a-78dc-83af-7ff7ecf09dd4",
407
+ "id": "01a15257-305f-798e-9a2a-b41b9c77960d",
408
408
  "title": "Night of the Living Dead",
409
409
  "year": 1968,
410
410
  "minutes": 96,
411
411
  "status": "watched",
412
412
  "rating": 4,
413
- "watched_on": "2026-10-11",
413
+ "watched_on": "2026-10-18",
414
414
  "director": "George A. Romero",
415
415
  "cast": ["[[Duane Jones]]"]
416
416
  },
417
- "occurred_at": "2026-10-11T22:00",
417
+ "occurred_at": "2026-10-18T22:00",
418
418
  "where": "cinema",
419
419
  "_source": "watch"
420
420
  },
421
421
  {
422
- "path": "datanotes/main/public/watch/2026-10-10T2030.md",
422
+ "path": "datanotes/main/public/watch/2026-10-17T2030.md",
423
423
  "film": {
424
424
  "path": "datanotes/main/public/film/The Gold Rush.md",
425
425
  "table": "main.public.film",
426
- "id": "01a12efb-7ffa-7aa8-988d-eba752b6277e",
426
+ "id": "01a15257-3043-7342-b25e-e2dabd4b1268",
427
427
  "title": "The Gold Rush",
428
428
  "year": 1925,
429
429
  "minutes": 95,
430
430
  "status": "watched",
431
431
  "rating": 5,
432
- "watched_on": "2026-10-10",
432
+ "watched_on": "2026-10-17",
433
433
  "director": "Charlie Chaplin",
434
434
  "cast": ["[[Charlie Chaplin]]"]
435
435
  },
436
- "occurred_at": "2026-10-10T20:30",
436
+ "occurred_at": "2026-10-17T20:30",
437
437
  "where": "home",
438
438
  "_source": "watch"
439
439
  },
440
440
  {
441
- "path": "datanotes/main/public/watch/2026-10-07T2115.md",
441
+ "path": "datanotes/main/public/watch/2026-10-14T2115.md",
442
442
  "film": {
443
443
  "path": "datanotes/main/public/film/Charade.md",
444
444
  "table": "main.public.film",
445
- "id": "01a12efb-8012-7876-bcf6-ea1a58b2cdec",
445
+ "id": "01a15257-3058-76e4-b51b-456bd3a7ea31",
446
446
  "title": "Charade",
447
447
  "year": 1963,
448
448
  "minutes": 113,
449
449
  "status": "watched",
450
450
  "rating": 4,
451
- "watched_on": "2026-10-07",
451
+ "watched_on": "2026-10-14",
452
452
  "director": "Stanley Donen",
453
453
  "cast": ["[[Cary Grant]]", "[[Audrey Hepburn]]"]
454
454
  },
455
- "occurred_at": "2026-10-07T21:15",
455
+ "occurred_at": "2026-10-14T21:15",
456
456
  "where": "home",
457
457
  "_source": "watch"
458
458
  }
@@ -476,14 +476,14 @@ Answer:
476
476
  "ok": true,
477
477
  "op": "drop_view",
478
478
  "planned_texts": ["datanotes/metastore.yaml"],
479
- "migration_id": "20261012T071956-drop_view-drop-view-main-public-vw_most_"
479
+ "migration_id": "20261019T040648-drop_view-drop-view-main-public-vw_most_"
480
480
  }
481
481
  ```
482
482
 
483
483
  **`undo_migration`**
484
484
 
485
485
  ```json
486
- { "migration_id": "20261012T071956-drop_view-drop-view-main-public-vw_most_" }
486
+ { "migration_id": "20261019T040648-drop_view-drop-view-main-public-vw_most_" }
487
487
  ```
488
488
 
489
489
  Answer:
@@ -492,8 +492,8 @@ Answer:
492
492
  {
493
493
  "ok": true,
494
494
  "op": "undo_migration",
495
- "undoes": "20261012T071956-drop_view-drop-view-main-public-vw_most_",
496
- "migration_id": "20261012T071956-undo_migration-undo-20261012t071956-drop_view",
495
+ "undoes": "20261019T040648-drop_view-drop-view-main-public-vw_most_",
496
+ "migration_id": "20261019T040648-undo_migration-undo-20261019t040648-drop_view",
497
497
  "conflicts": [],
498
498
  "failed": []
499
499
  }
@@ -526,7 +526,7 @@ Answer:
526
526
  "ok": true,
527
527
  "op": "create_view",
528
528
  "planned_texts": ["datanotes/metastore.yaml"],
529
- "migration_id": "20261012T071956-create_view-create-view-main-reports-vw_wa"
529
+ "migration_id": "20261019T040648-create_view-create-view-main-reports-vw_wa"
530
530
  }
531
531
  ```
532
532
 
@@ -619,7 +619,7 @@ Answer:
619
619
  ```json
620
620
  {
621
621
  "ok": true,
622
- "migration_id": "20261012T071957-batch-views-for-film-and-actor-notes",
622
+ "migration_id": "20261019T040648-batch-views-for-film-and-actor-notes",
623
623
  "steps": [
624
624
  { "op": "create_view", "ok": true },
625
625
  { "op": "create_view", "ok": true },
@@ -645,13 +645,13 @@ Answer:
645
645
  "total": 2,
646
646
  "rows": [
647
647
  {
648
- "path": "datanotes/main/public/watch/2026-09-23T2100.md",
649
- "occurred_at": "2026-09-23T21:00",
648
+ "path": "datanotes/main/public/watch/2026-09-30T2100.md",
649
+ "occurred_at": "2026-09-30T21:00",
650
650
  "where": "home"
651
651
  },
652
652
  {
653
- "path": "datanotes/main/public/watch/2026-10-10T2030.md",
654
- "occurred_at": "2026-10-10T20:30",
653
+ "path": "datanotes/main/public/watch/2026-10-17T2030.md",
654
+ "occurred_at": "2026-10-17T20:30",
655
655
  "where": "home"
656
656
  }
657
657
  ],
@@ -679,9 +679,9 @@ Answer:
679
679
  "total": 1,
680
680
  "rows": [
681
681
  {
682
- "path": "datanotes/main/public/watch/2026-10-10T2030.md",
682
+ "path": "datanotes/main/public/watch/2026-10-17T2030.md",
683
683
  "film": "[[The Gold Rush]]",
684
- "occurred_at": "2026-10-10T20:30",
684
+ "occurred_at": "2026-10-17T20:30",
685
685
  "where": "home"
686
686
  }
687
687
  ],
@@ -766,7 +766,7 @@ The engine wrote this page’s views under `views:` in their schema, next to the
766
766
 
767
767
  ```yaml
768
768
  # Metastore (Datanotes): catalogs, schemas, tables, columns, views.
769
- id: 01a12efb-7f9b-7cd3-a1ae-d70e8a8d4ef4
769
+ id: 01a15257-2fe2-7692-8c87-67639c554380
770
770
  config:
771
771
  history: true
772
772
 
@@ -33,6 +33,8 @@ npx -y datanotes store backup --vault your_vault_folder \
33
33
 
34
34
  The command saves the setting, makes the store a git repository and pushes it once. A wrong address or a missing credential shows at once: the command then exits with code 1, and the engine retries later.
35
35
 
36
+ The command holds the store while it runs, so an engine you start meanwhile refuses to start.
37
+
36
38
  The first commit and push can take minutes on a large store, such as 3,400 files and 150 MB. The command prints each step and waits for it. The push may take up to 10 minutes, or `DATANOTES_GIT_NETWORK_TIMEOUT_S` seconds. A step that fails leaves no git lock behind, so you can run the command again.
37
39
 
38
40
  Run `datanotes store backup --vault your_vault_folder` to see the setting. Add `--off` to turn the backup off: the store’s repository stays as it is.
@@ -67,11 +69,13 @@ C:/Windows/System32/OpenSSH/ssh.exe -T git@github.com
67
69
 
68
70
  The backup looks at the store on a regular schedule, every 60 seconds by default. At each look:
69
71
 
70
- 1. If nothing changed in the store, it does nothing.
72
+ 1. If nothing changed in the store, it does nothing. The engine tells the backup which files it wrote, so this look runs no git at all.
71
73
  2. If something changed, it waits until the engine is idle: no operation running, and none for 3 seconds.
72
74
  3. It commits between two operations, then pushes.
73
75
 
74
- An operation writes several files of the store: a journal line, new table versions, sometimes blobs. A commit in the middle of one would save half of it. So the commit holds the engine’s write lock, like a short read lock, for `git add` and `git commit` only. An operation that arrives meanwhile waits for the commit, usually a fraction of a second. The push runs after the lock is released.
76
+ An operation writes several files of the store: a journal line, new table versions, sometimes blobs. A commit in the middle of one would save half of it. So the commit holds the engine’s write lock, like a short read lock, for `git add` and `git commit` only. A first `git add` runs before the lock, so the one under it stages only the folders written since. An operation that arrives meanwhile waits for the commit, usually a fraction of a second. The push runs after the lock is released.
77
+
78
+ The store’s repository keeps git’s cache of its folders (`core.untrackedCache` and `feature.manyFiles`), so git doesn’t read every folder again at each commit.
75
79
 
76
80
  When the engine stays busy, the backup tries again at the next look. After 5 busy looks in a row, the next one commits at the first gap between two operations anyway.
77
81
 
@@ -155,7 +159,9 @@ npx -y datanotes store restore --vault your_vault_folder \
155
159
  --from git@github.com:you/vault-store.git
156
160
  ```
157
161
 
158
- The command reads the database’s id in the vault’s `metastore.yaml`. It clones the backup into `<data home>/<database id>/` and checks that the backup belongs to that database. It then writes new settings, with a new owner token and the backup turned on.
162
+ The command reads the database’s id in the vault’s `metastore.yaml`. It clones the backup next to the store and checks that the backup belongs to that database. Only then does it put the clone in place, at `<data home>/<database id>/`. It then writes new settings, with a new owner token and the backup turned on.
163
+
164
+ The command holds the store while it runs, so an engine you start meanwhile refuses to start.
159
165
 
160
166
  Undo, history and time travel then work as before. Two things don’t come back, and you set them again:
161
167
 
@@ -175,6 +181,8 @@ Run one engine per backup repository. Two engines that push to the same reposito
175
181
 
176
182
  Git keeps every version of every file, so the repository only grows. `vacuum_table` deletes old history from the store, and the next commit records the deletion, but earlier commits still hold the files.
177
183
 
184
+ The transaction log is a few large files, called segments, instead of one file per version. Git then stores and compares far fewer files. [How the engine writes the log](https://datanotes.dev/start/how-it-works/#how-the-engine-writes-the-log) explains both formats.
185
+
178
186
  To start again with a small repository, keep the old one as an archive:
179
187
 
180
188
  1. Stop the engine.
@@ -187,7 +195,7 @@ The new repository starts from the store as it is now. Delete the old repository
187
195
 
188
196
  ## Keep each file under 95 MB
189
197
 
190
- GitHub refuses a push with a file over 100 MB, every time. So before each push, the backup looks for a file over 95 MB in the commits to push. When it finds one, it doesn’t push, and doesn’t try again until the file is gone. `datanotes status` shows the backup as failing, with the file and its size, and the fix in `hint`.
198
+ GitHub refuses a push with a file over 100 MB, every time. The engine never writes such a file itself: it splits each checkpoint of the transaction log into files of at most 4 MB of text. So before each push, the backup looks for a file over 95 MB in the commits to push, such as one a person copied into the store. When it finds one, it doesn’t push, and doesn’t try again until the file is gone. `datanotes status` shows the backup as failing, with the file and its size, and the fix in `hint`.
191
199
 
192
200
  To fix it:
193
201
 
@@ -23,56 +23,56 @@ Answer (74 lines)
23
23
  "events": [
24
24
  {
25
25
  "seq": 3,
26
- "at": "2026-10-12T07:20:04.624Z",
26
+ "at": "2026-10-19T04:06:55.908Z",
27
27
  "table": "main.public.film",
28
28
  "kind": "insert",
29
29
  "op": "insert_row",
30
30
  "path": "datanotes/main/public/film/Nosferatu.md",
31
- "row_id": "01a12efb-9f0c-7795-aacb-6e9601757026",
31
+ "row_id": "01a15257-4ea0-749e-bc45-1d36404958ac",
32
32
  "changes": {
33
- "id": { "after": "01a12efb-9f0c-7795-aacb-6e9601757026" },
33
+ "id": { "after": "01a15257-4ea0-749e-bc45-1d36404958ac" },
34
34
  "title": { "after": "Nosferatu" },
35
35
  "status": { "after": "to watch" }
36
36
  },
37
37
  "source": "engine",
38
38
  "row": {
39
- "id": "01a12efb-9f0c-7795-aacb-6e9601757026",
39
+ "id": "01a15257-4ea0-749e-bc45-1d36404958ac",
40
40
  "title": "Nosferatu",
41
41
  "status": "to watch"
42
42
  },
43
43
  "actor": { "session": "history", "harness": "docs-example", "auth": "owner" },
44
- "migration_id": "20261012T072004-insert_row-insert-into-film"
44
+ "migration_id": "20261019T040655-insert_row-insert-into-film"
45
45
  },
46
46
  {
47
47
  "seq": 4,
48
- "at": "2026-10-12T07:20:04.630Z",
48
+ "at": "2026-10-19T04:06:55.914Z",
49
49
  "table": "main.public.film",
50
50
  "kind": "insert",
51
51
  "op": "insert_row",
52
52
  "path": "datanotes/main/public/film/Metropolis.md",
53
- "row_id": "01a12efb-9f12-7afd-8545-4fec074ff1fb",
53
+ "row_id": "01a15257-4ea6-7caa-8cee-e372c1fec68a",
54
54
  "changes": {
55
- "id": { "after": "01a12efb-9f12-7afd-8545-4fec074ff1fb" },
55
+ "id": { "after": "01a15257-4ea6-7caa-8cee-e372c1fec68a" },
56
56
  "title": { "after": "Metropolis" },
57
57
  "status": { "after": "to watch" }
58
58
  },
59
59
  "source": "engine",
60
60
  "row": {
61
- "id": "01a12efb-9f12-7afd-8545-4fec074ff1fb",
61
+ "id": "01a15257-4ea6-7caa-8cee-e372c1fec68a",
62
62
  "title": "Metropolis",
63
63
  "status": "to watch"
64
64
  },
65
65
  "actor": { "session": "history", "harness": "docs-example", "auth": "owner" },
66
- "migration_id": "20261012T072004-insert_row-insert-into-film-2"
66
+ "migration_id": "20261019T040655-insert_row-insert-into-film-2"
67
67
  },
68
68
  {
69
69
  "seq": 5,
70
- "at": "2026-10-12T07:20:04.637Z",
70
+ "at": "2026-10-19T04:06:55.921Z",
71
71
  "table": "main.public.film",
72
72
  "kind": "update",
73
73
  "op": "update_row",
74
74
  "path": "datanotes/main/public/film/Nosferatu.md",
75
- "row_id": "01a12efb-9f0c-7795-aacb-6e9601757026",
75
+ "row_id": "01a15257-4ea0-749e-bc45-1d36404958ac",
76
76
  "changes": {
77
77
  "status": { "before": "to watch", "after": "watched" },
78
78
  "rating": { "after": 4 },
@@ -80,14 +80,14 @@ Answer (74 lines)
80
80
  },
81
81
  "source": "engine",
82
82
  "row": {
83
- "id": "01a12efb-9f0c-7795-aacb-6e9601757026",
83
+ "id": "01a15257-4ea0-749e-bc45-1d36404958ac",
84
84
  "title": "Nosferatu",
85
85
  "status": "watched",
86
86
  "rating": 4,
87
87
  "watched_on": "2026-10-03"
88
88
  },
89
89
  "actor": { "session": "history", "harness": "docs-example", "auth": "owner" },
90
- "migration_id": "20261012T072004-update_row-update-film"
90
+ "migration_id": "20261019T040655-update_row-update-film"
91
91
  }
92
92
  ],
93
93
  "last": 5,
@@ -116,25 +116,25 @@ Answer:
116
116
  "events": [
117
117
  {
118
118
  "seq": 14,
119
- "at": "2026-10-12T07:20:09.225Z",
119
+ "at": "2026-10-19T04:07:00.489Z",
120
120
  "table": "main.public.film",
121
121
  "kind": "insert",
122
122
  "op": "insert_row",
123
123
  "path": "datanotes/main/public/film/His Girl Friday.md",
124
- "row_id": "01a12efb-b104-7743-a725-fa938af1a57b",
124
+ "row_id": "01a15257-6086-7874-808c-ad022ba671e1",
125
125
  "changes": {
126
- "id": { "after": "01a12efb-b104-7743-a725-fa938af1a57b" },
126
+ "id": { "after": "01a15257-6086-7874-808c-ad022ba671e1" },
127
127
  "title": { "after": "His Girl Friday" },
128
128
  "status": { "after": "to watch" }
129
129
  },
130
130
  "source": "engine",
131
131
  "row": {
132
- "id": "01a12efb-b104-7743-a725-fa938af1a57b",
132
+ "id": "01a15257-6086-7874-808c-ad022ba671e1",
133
133
  "title": "His Girl Friday",
134
134
  "status": "to watch"
135
135
  },
136
136
  "actor": { "session": "history", "harness": "docs-example", "auth": "owner" },
137
- "migration_id": "20261012T072009-insert_row-insert-into-film"
137
+ "migration_id": "20261019T040700-insert_row-insert-into-film"
138
138
  }
139
139
  ],
140
140
  "last": 14,
@@ -149,19 +149,19 @@ Answer:
149
149
  **`create_webhook`**
150
150
 
151
151
  ```json
152
- { "url": "http://127.0.0.1:42525/datanotes-hook", "tables": ["film"] }
152
+ { "url": "http://127.0.0.1:46035/datanotes-hook", "tables": ["film"] }
153
153
  ```
154
154
 
155
155
  Answer:
156
156
 
157
157
  ```json
158
158
  {
159
- "id": "wh_c4b48fd54bb5",
160
- "url": "http://127.0.0.1:42525/datanotes-hook",
159
+ "id": "wh_ec4e37b04323",
160
+ "url": "http://127.0.0.1:46035/datanotes-hook",
161
161
  "tables": ["film"],
162
162
  "enabled": true,
163
163
  "cursor": 14,
164
- "created_at": "2026-10-12T07:20:09.229Z",
164
+ "created_at": "2026-10-19T04:07:00.494Z",
165
165
  "failures": 0,
166
166
  "status": "ok",
167
167
  "secret": "<shown once>"
@@ -183,28 +183,28 @@ The receiver got this request:
183
183
  ```json
184
184
  {
185
185
  "headers": {
186
- "x-datanotes-signature": "sha256=399f785d39d4a9f7d6aead97b64aad81a936cfb1fdeaf69843407a2549d6829d"
186
+ "x-datanotes-signature": "sha256=42e2f1b279304e507dc504eead14b0848c55dea078fad8cb58078598c1263936"
187
187
  },
188
188
  "body": {
189
- "webhook": "wh_c4b48fd54bb5",
189
+ "webhook": "wh_ec4e37b04323",
190
190
  "events": [
191
191
  {
192
192
  "seq": 15,
193
- "at": "2026-10-12T07:20:09.237Z",
193
+ "at": "2026-10-19T04:07:00.499Z",
194
194
  "table": "main.public.film",
195
195
  "kind": "update",
196
196
  "op": "update_row",
197
197
  "path": "datanotes/main/public/film/His Girl Friday.md",
198
- "row_id": "01a12efb-b104-7743-a725-fa938af1a57b",
198
+ "row_id": "01a15257-6086-7874-808c-ad022ba671e1",
199
199
  "changes": { "status": { "before": "to watch", "after": "watched" } },
200
200
  "source": "engine",
201
201
  "row": {
202
- "id": "01a12efb-b104-7743-a725-fa938af1a57b",
202
+ "id": "01a15257-6086-7874-808c-ad022ba671e1",
203
203
  "title": "His Girl Friday",
204
204
  "status": "watched"
205
205
  },
206
206
  "actor": { "session": "history", "harness": "docs-example", "auth": "owner" },
207
- "migration_id": "20261012T072009-update_row-update-film"
207
+ "migration_id": "20261019T040700-update_row-update-film"
208
208
  }
209
209
  ],
210
210
  "last": 15
@@ -220,13 +220,13 @@ Answer:
220
220
  {
221
221
  "webhooks": [
222
222
  {
223
- "id": "wh_c4b48fd54bb5",
224
- "url": "http://127.0.0.1:42525/datanotes-hook",
223
+ "id": "wh_ec4e37b04323",
224
+ "url": "http://127.0.0.1:46035/datanotes-hook",
225
225
  "tables": ["film"],
226
226
  "enabled": true,
227
227
  "cursor": 15,
228
- "created_at": "2026-10-12T07:20:09.229Z",
229
- "last_delivery": "2026-10-12T07:20:09.241Z",
228
+ "created_at": "2026-10-19T04:07:00.494Z",
229
+ "last_delivery": "2026-10-19T04:07:00.504Z",
230
230
  "failures": 0,
231
231
  "status": "ok"
232
232
  }
@@ -237,7 +237,7 @@ Answer:
237
237
  **`delete_webhook`**
238
238
 
239
239
  ```json
240
- { "id": "wh_c4b48fd54bb5" }
240
+ { "id": "wh_ec4e37b04323" }
241
241
  ```
242
242
 
243
243
  Answer:
@@ -87,11 +87,11 @@ Answer:
87
87
  "total": 13,
88
88
  "migrations": [
89
89
  {
90
- "migration_id": "20261012T071951-delete_rows-archive-1-rows-of-film",
90
+ "migration_id": "20261019T040643-delete_rows-archive-1-rows-of-film",
91
91
  "op": "delete_rows",
92
92
  "summary": "archive 1 rows of film",
93
93
  "table": "main.public.film",
94
- "executed_at": "2026-10-12T07:19:51.705Z",
94
+ "executed_at": "2026-10-19T04:06:43.206Z",
95
95
  "notes_changed": 0,
96
96
  "files_changed": 1,
97
97
  "undone": false,
@@ -99,11 +99,11 @@ Answer:
99
99
  "by": "docs-example"
100
100
  },
101
101
  {
102
- "migration_id": "20261012T071951-merge_rows-merge-2-rows-into-film",
102
+ "migration_id": "20261019T040643-merge_rows-merge-2-rows-into-film",
103
103
  "op": "merge_rows",
104
104
  "summary": "merge 2 rows into film",
105
105
  "table": "main.public.film",
106
- "executed_at": "2026-10-12T07:19:51.690Z",
106
+ "executed_at": "2026-10-19T04:06:43.194Z",
107
107
  "notes_changed": 1,
108
108
  "files_changed": 1,
109
109
  "undone": false,
@@ -111,11 +111,11 @@ Answer:
111
111
  "by": "docs-example"
112
112
  },
113
113
  {
114
- "migration_id": "20261012T071951-update_rows-update-film",
114
+ "migration_id": "20261019T040643-update_rows-update-film",
115
115
  "op": "update_rows",
116
116
  "summary": "update film",
117
117
  "table": "main.public.film",
118
- "executed_at": "2026-10-12T07:19:51.674Z",
118
+ "executed_at": "2026-10-19T04:06:43.181Z",
119
119
  "notes_changed": 3,
120
120
  "files_changed": 0,
121
121
  "undone": false,
@@ -129,7 +129,7 @@ Answer:
129
129
  **`undo_migration`**
130
130
 
131
131
  ```json
132
- { "migration_id": "20261012T071951-delete_rows-archive-1-rows-of-film" }
132
+ { "migration_id": "20261019T040643-delete_rows-archive-1-rows-of-film" }
133
133
  ```
134
134
 
135
135
  Answer:
@@ -138,8 +138,8 @@ Answer:
138
138
  {
139
139
  "ok": true,
140
140
  "op": "undo_migration",
141
- "undoes": "20261012T071951-delete_rows-archive-1-rows-of-film",
142
- "migration_id": "20261012T071951-undo_migration-undo-20261012t071951-delete_ro",
141
+ "undoes": "20261019T040643-delete_rows-archive-1-rows-of-film",
142
+ "migration_id": "20261019T040643-undo_migration-undo-20261019t040643-delete_ro",
143
143
  "conflicts": [],
144
144
  "failed": []
145
145
  }
@@ -197,7 +197,7 @@ Answer:
197
197
  }
198
198
  ],
199
199
  "commits": [{ "table": "main.public.film", "version": 14, "operation": "UPDATE" }],
200
- "migration_id": "20261012T071951-update_row-update-film-5"
200
+ "migration_id": "20261019T040643-update_row-update-film-5"
201
201
  }
202
202
  ```
203
203
 
@@ -216,7 +216,7 @@ Then someone changes the rating again:
216
216
  **`undo_migration`**
217
217
 
218
218
  ```json
219
- { "migration_id": "20261012T071951-update_row-update-film-5" }
219
+ { "migration_id": "20261019T040643-update_row-update-film-5" }
220
220
  ```
221
221
 
222
222
  Refused:
@@ -249,7 +249,7 @@ The undo of an insert trashes the new note only while it’s as the insert left
249
249
  **`undo_migration`**
250
250
 
251
251
  ```json
252
- { "migration_id": "20261012T071951-insert_row-insert-into-film-6" }
252
+ { "migration_id": "20261019T040643-insert_row-insert-into-film-6" }
253
253
  ```
254
254
 
255
255
  Refused: