videobook-engine 5.3.2 → 5.4.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 (74) hide show
  1. package/README.md +6 -0
  2. package/dist/catalog-metadata.d.ts +1 -1
  3. package/dist/catalog-metadata.js +1 -1
  4. package/dist/domain.js +15 -5
  5. package/dist/domain.js.map +1 -1
  6. package/dist/engine-types.d.ts +140 -1
  7. package/dist/engine-types.d.ts.map +1 -1
  8. package/dist/engine-types.js.map +1 -1
  9. package/dist/engine.d.ts +21 -0
  10. package/dist/engine.d.ts.map +1 -1
  11. package/dist/engine.js +3 -0
  12. package/dist/engine.js.map +1 -1
  13. package/dist/fork.d.ts +3 -4
  14. package/dist/fork.d.ts.map +1 -1
  15. package/dist/fork.js +4 -4
  16. package/dist/fork.js.map +1 -1
  17. package/dist/index.d.ts +5 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +4 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/merge-policy.d.ts +3 -4
  22. package/dist/merge-policy.d.ts.map +1 -1
  23. package/dist/merge-policy.js +5 -4
  24. package/dist/merge-policy.js.map +1 -1
  25. package/dist/migrate-tags-v24.d.ts +12 -0
  26. package/dist/migrate-tags-v24.d.ts.map +1 -0
  27. package/dist/migrate-tags-v24.js +40 -0
  28. package/dist/migrate-tags-v24.js.map +1 -0
  29. package/dist/mvp-contracts.d.ts +2 -2
  30. package/dist/mvp-contracts.js +1 -1
  31. package/dist/schema.d.ts +3 -2
  32. package/dist/schema.d.ts.map +1 -1
  33. package/dist/schema.js +59 -0
  34. package/dist/schema.js.map +1 -1
  35. package/dist/store.d.ts +6 -0
  36. package/dist/store.d.ts.map +1 -1
  37. package/dist/store.js +150 -54
  38. package/dist/store.js.map +1 -1
  39. package/dist/tag-merge.d.ts +4 -0
  40. package/dist/tag-merge.d.ts.map +1 -0
  41. package/dist/tag-merge.js +85 -0
  42. package/dist/tag-merge.js.map +1 -0
  43. package/dist/tag-queries.d.ts +30 -0
  44. package/dist/tag-queries.d.ts.map +1 -0
  45. package/dist/tag-queries.js +313 -0
  46. package/dist/tag-queries.js.map +1 -0
  47. package/dist/tag-rows.d.ts +36 -0
  48. package/dist/tag-rows.d.ts.map +1 -0
  49. package/dist/tag-rows.js +48 -0
  50. package/dist/tag-rows.js.map +1 -0
  51. package/dist/tag-transfer.d.ts +26 -0
  52. package/dist/tag-transfer.d.ts.map +1 -0
  53. package/dist/tag-transfer.js +341 -0
  54. package/dist/tag-transfer.js.map +1 -0
  55. package/dist/tag-validation.d.ts +15 -0
  56. package/dist/tag-validation.d.ts.map +1 -0
  57. package/dist/tag-validation.js +36 -0
  58. package/dist/tag-validation.js.map +1 -0
  59. package/dist/tag-values.d.ts +68 -0
  60. package/dist/tag-values.d.ts.map +1 -0
  61. package/dist/tag-values.js +107 -0
  62. package/dist/tag-values.js.map +1 -0
  63. package/dist/tags.d.ts +44 -0
  64. package/dist/tags.d.ts.map +1 -0
  65. package/dist/tags.js +488 -0
  66. package/dist/tags.js.map +1 -0
  67. package/docs/doltlite-staging.md +35 -15
  68. package/docs/edit-performance.md +2 -4
  69. package/docs/engine-layout.md +92 -4
  70. package/docs/mvp-prd.md +2 -1
  71. package/docs/release-evidence.md +74 -35
  72. package/docs/temporal-search-performance.md +4 -6
  73. package/fixtures/v5/contract-fixtures.json +3 -3
  74. package/package.json +7 -3
@@ -105,7 +105,7 @@ Notation used below:
105
105
  - `→` names the referenced column.
106
106
  - Defaults and checks are shown inline.
107
107
 
108
- There are 34 allowlisted semantic tables.
108
+ There are 36 allowlisted semantic tables.
109
109
 
110
110
  ### Catalog, artifacts, and content
111
111
 
@@ -136,6 +136,89 @@ There are 34 allowlisted semantic tables.
136
136
  | `runs` | `run_id TEXT`<br>`notebook_id TEXT`<br>`status TEXT`<br>`started_at INTEGER`<br>`completed_at INTEGER`<br>`cell_order_json TEXT`<br>`outputs_json TEXT`<br>`error TEXT?` | `run_id PK`; notebook `FK → notebooks ON DELETE CASCADE`; `status CHECK IN (completed, failed, aborted)`. Terminal, versioned notebook execution records. |
137
137
  | `generations` | `generation_id TEXT`<br>`notebook_id TEXT`<br>`cell_id TEXT`<br>`output_cell_id TEXT?`<br>`run_id TEXT?`<br>`status TEXT`<br>`tool TEXT`<br>`provider TEXT?`<br>`model TEXT?`<br>`prompt TEXT?`<br>`resolved_prompt TEXT?`<br>`provider_artifact_id TEXT?`<br>`output_artifact_id TEXT?`<br>`error TEXT?`<br>`created_at INTEGER`<br>`updated_at INTEGER` | `generation_id PK`; composite cell FK with cascade; `status CHECK IN (dispatched, awaiting_provider, completed, failed)`. One row per generation attempt; every transition is its own attributed semantic commit, so `dolt_history_generations` is the per-attempt timeline. |
138
138
 
139
+ ### Asset tags
140
+
141
+ Flat, book-local tags on artifacts. Semantic identity is the pair
142
+ (`facet`, `tag_key`) — never the display label alone — so the same word in
143
+ two facets stays two assignments. Manual and automatic assignments share
144
+ one table keyed by `origin`: replacing an automatic snapshot deletes and
145
+ reinserts only the `automatic` rows, so it can never add, drop or relabel
146
+ a manual row. Dismissals are a separate durable record of user intent that
147
+ outlives any snapshot, which is what stops re-analysis from resurrecting a
148
+ tag the user removed.
149
+
150
+ | Table | Columns | Keys, constraints, and purpose |
151
+ | --- | --- | --- |
152
+ | `artifact_tags` | `artifact_id TEXT`<br>`origin TEXT`<br>`facet TEXT`<br>`tag_key TEXT`<br>`label TEXT`<br>`entity_id TEXT?`<br>`created_at INTEGER` | `(artifact_id, origin, facet, tag_key) PK`; `artifact_id FK → artifacts.artifact_id ON DELETE CASCADE`; `entity_id FK → entities.entity_id ON DELETE RESTRICT`; `origin CHECK IN (manual, automatic)`; `facet CHECK IN (people, places, editing, custom)`. `tag_key` is the NFKC-normalized, whitespace-collapsed, lowercased key; `label` is the display form. A tag may carry an already-confirmed entity reference, and holding one keeps that entity alive (`engine.entities.delete` returns `IN_USE`). |
153
+ | `artifact_tag_dismissals` | `artifact_id TEXT`<br>`facet TEXT`<br>`tag_key TEXT`<br>`label TEXT`<br>`dismissed_at INTEGER` | `(artifact_id, facet, tag_key) PK`; `artifact_id FK → artifacts.artifact_id ON DELETE CASCADE`. One row per suppressed identity. Suppression is applied when tags are read, so the automatic row keeps the provenance that explains it while staying invisible. Adding the identity manually deletes the row; `engine.tags.restore` deletes it without claiming ownership. |
154
+ | `artifact_tag_snapshots` | `artifact_id TEXT`<br>`source_hash TEXT`<br>`generator TEXT`<br>`model TEXT?`<br>`extractor_version TEXT`<br>`tag_count INTEGER`<br>`generation INTEGER`<br>`analyzed_at INTEGER` | `artifact_id PK`; `artifact_id FK → artifacts.artifact_id ON DELETE CASCADE`; `tag_count CHECK >= 0`; `generation CHECK > 0`. The last successful automatic analysis. A row with `tag_count` 0 is a successful empty result; no row at all means no successful analysis. `extractor_version` includes the editorial tag-policy version so a policy change can drive selective refresh. `generation` is the per-artifact fence: a caller may pass `expectedGeneration` and a mismatch is refused with `STALE_REVISION`. |
155
+
156
+ `source_hash` is a content fingerprint, deliberately **not** an `objects`
157
+ foreign key and not a first-class `object_hash` column: tags neither pin
158
+ bytes against GC nor block forgetting. An automatic snapshot is stale once
159
+ that hash is no longer one of the artifact's `artifact_files` rows, and
160
+ stale automatic tags drop out of the effective set instead of describing
161
+ content that is gone.
162
+
163
+ Effective tags are every manual assignment plus every automatic assignment
164
+ that is neither dismissed nor stale, deduplicated on identity with the
165
+ manual label and ownership preferred. Documented limits: 64 Unicode code
166
+ points per label, 100 manual tags per artifact, 12 automatic tags per
167
+ snapshot, 500 dismissals per artifact. Exceeding one is refused with
168
+ `RESOURCE_EXHAUSTED` rather than silently dropping user intent.
169
+
170
+ Automatic analysis uses the `people`, `places`, and `editing` facets;
171
+ `custom` is reserved for manual tags. Writes check generation fences,
172
+ capacity, and no-op decisions inside the same serialized SQL transaction
173
+ as their mutation. Imports apply the same automatic metadata and size
174
+ validation, and count duplicate dismissals only once. The browser-safe
175
+ `videobook-engine/tag-values` subpath exposes normalization and limits.
176
+
177
+ `engine.tags.query` filters artifacts on that same effective set: `all`
178
+ (every identity), `any` (at least one), and `kinds`, with keyset paging and
179
+ a total that counts every match rather than the current page.
180
+ `engine.tags.candidates` returns the unpaged matching IDs so the
181
+ application can compose a tag filter with temporal or semantic search
182
+ before either applies a limit. `engine.tags.facets` counts distinct
183
+ matching artifacts per identity, and `engine.tags.suggest` completes known
184
+ keys by prefix and facet; both prefer the manual display label. The
185
+ effective-tag rule is written once as SQL in `src/tag-queries.ts` and once
186
+ in TypeScript in `src/tags.ts`, and `tests/tag-queries.test.ts` asserts the
187
+ two agree.
188
+
189
+ Tag rows are ordinary semantic rows, so history needs no special case:
190
+ `history.restore` reloads them from their `dolt_at_*` projections like
191
+ every other table, and an explicit restore may therefore rewind manual
192
+ edits that routine re-analysis never can. Restoring a revision recorded
193
+ under an older schema stays refused by the existing version guard.
194
+ `engine.tags.readAtRevision` reports the state a revision recorded; a
195
+ revision written before schema 25 has no tag state at all and yields an
196
+ empty snapshot rather than an error.
197
+
198
+ `engine.tags.export` produces a portable snapshot — manual tags,
199
+ dismissals, and automatic evidence only while it is still valid — and
200
+ `engine.tags.import` applies one to another artifact, in the same catalog
201
+ or a different engine. Import never trusts the source: labels are
202
+ re-normalized into destination-local identities, an entity reference
203
+ survives only when that entity exists in the destination, and automatic
204
+ evidence transfers only when the destination artifact carries the exact
205
+ analyzed hash. A hash-identical duplicate therefore inherits automatic
206
+ tags; a modified or generated derivative inherits only manual intent, with
207
+ `skippedAutomatic` saying so.
208
+ Re-importing unchanged, valid evidence is a no-op and leaves
209
+ `skippedAutomatic` false.
210
+
211
+ Merges treat an automatic snapshot and its tag rows as one unit. Competing
212
+ answers for the same artifact conflict even when their metadata agrees;
213
+ the engine never combines two automatic sets into an invented analysis.
214
+ Merges also reject combined manual or dismissal sets that exceed the
215
+ per-artifact limits, before changing the accepted catalog.
216
+
217
+ Query cost is fixed, not proportional to catalog size: `query` is three
218
+ statements (page, total, page tags), `candidates` one, and `facets` two
219
+ (counts, then preferred labels). `tests/tag-queries.test.ts` measures those
220
+ counts against a catalog ten times larger and asserts they do not move.
221
+
139
222
  ### Sequence timeline and media editing state
140
223
 
141
224
  Sequences are the single timeline model. `sequences`, `sequence_tracks`,
@@ -272,9 +355,9 @@ are the constraint-verification primitives.
272
355
  (`resolveObjectsRow` in `src/fork.ts`).
273
356
 
274
357
  DoltLite 0.50.6 fixes incremental staging and full-catalog URL cloning.
275
- Native merge still refuses a catalog containing ignored runtime tables,
276
- even with an empty semantic diff and, without a secondary runtime index,
277
- an empty `dolt_status`. `ve-wsu` retains this gate; see the reproductions in
358
+ The pinned `0.50.6-videobook.1` fork also fixes native merges with ignored
359
+ runtime tables. Clean-package verification exercises the complete catalog,
360
+ indexes, runtime rows, and job ID state; see
278
361
  [docs/doltlite-staging.md](doltlite-staging.md). The dedicated merge-back flow
279
362
  keeps its projection merge and application conflict policies.
280
363
 
@@ -361,6 +444,9 @@ schema additionally defines every index below.
361
444
  | `prompt_entries_lookup` | `prompt_entries(surface, created_at, prompt_id)` |
362
445
  | `messages_created` | `messages(created_at, message_id)` |
363
446
  | `generations_cell` | `generations(notebook_id, cell_id, created_at)` |
447
+ | `artifact_tags_identity` | `artifact_tags(facet, tag_key, artifact_id)` |
448
+ | `artifact_tags_entity` | `artifact_tags(entity_id)` |
449
+ | `artifact_tag_dismissals_identity` | `artifact_tag_dismissals(facet, tag_key, artifact_id)` |
364
450
 
365
451
  ## Local-only runtime schema
366
452
 
@@ -728,6 +814,8 @@ must reproduce a render.
728
814
  | Content-addressed object layout, remote keys, deletion | [`src/cas.ts`](../src/cas.ts) |
729
815
  | Object publication, deletion, GC, and catalog backup | [`src/storage.ts`](../src/storage.ts) |
730
816
  | Artifact mappings and workspace materialization | [`src/files.ts`](../src/files.ts) |
817
+ | Asset tag state, precedence, and snapshots | [`src/tags.ts`](../src/tags.ts), [`src/tag-values.ts`](../src/tag-values.ts) |
818
+ | Asset tag schema upgrade (24 to 25) | [`src/migrate-tags-v24.ts`](../src/migrate-tags-v24.ts) |
731
819
  | Sequence reads/structure and transactional edits | [`src/sequences.ts`](../src/sequences.ts), [`src/edits.ts`](../src/edits.ts) |
732
820
  | Public manifest, job, status, and similarity types | [`src/engine-types.ts`](../src/engine-types.ts) |
733
821
  | Entity/notebook graph types | [`src/notebook/types.ts`](../src/notebook/types.ts) |
package/docs/mvp-prd.md CHANGED
@@ -707,7 +707,8 @@ artifact/file mapping before it is relied on by history.
707
707
 
708
708
  ## 12. Performance and quality requirements
709
709
 
710
- The reference beta device is an Apple M2 Pro with 16 GB RAM and local SSD.
710
+ Performance measurements record the actual CPU, memory and storage of the
711
+ test machine. No specific device model is required.
711
712
  Quality thresholds use the frozen corpus defined in the application PRD.
712
713
 
713
714
  | ID | Area | Creator-beta requirement |
@@ -9,7 +9,48 @@ This is an assessment of the requirements in
9
9
  Beads contains the work assignments and current status; this report records
10
10
  the evidence and its limits at these revisions.
11
11
 
12
- ## Current patch candidate
12
+ ## Published 5.3.3 patch, September 7
13
+
14
+ [`videobook-engine@5.3.3`](https://www.npmjs.com/package/videobook-engine/v/5.3.3)
15
+ is published as npm `latest` from `039a4c21be706e4f12140a6b14b32e21eb573cdc`,
16
+ tagged `v5.3.3`. [Node 22/24 CI](https://github.com/justintanner/videobook-engine/actions/runs/34050088772)
17
+ passes. The downloaded registry archive is byte-identical to the tested build,
18
+ SHA256 `92a19b1ef6d5860b82774bd2175f6113569f66a49cc5d30e96e7710ec851f441`.
19
+ Its clean registry install passes the complete native catalog/sequence probe,
20
+ README/reopen, cached CLIP/CLAP inference, media decode, one Sharp resolution,
21
+ and zero production audit findings. The default engine suite passes 352 tests
22
+ with 12 optional skips, alongside typecheck, lint and build.
23
+
24
+ Consumer `91232cb9` vendors that exact published archive and remains version
25
+ 0.1.0. It passes 3,218 tests with six optional skips, lint, four test typechecks,
26
+ and dead-code checks. Its isolated install passes one native fork/Sharp
27
+ resolution, client/server builds, MCP create/list, client delivery, and graceful
28
+ shutdown. The full-catalog native regression fails on unpatched 0.50.6 and
29
+ passes on the fork, checking actual fast-forward and three-way HEAD changes.
30
+
31
+ Engine 5.3.3 pins the tested native fork `b3981dc9ed6b2e39c247b4d598b2691e19dd0b25`
32
+ with the published 0.50.6 Node wrapper. The fork package is
33
+ `0.50.6-videobook.1`, installed from a versioned GitHub release asset with
34
+ lockfile integrity. The complete native-source CI passed 69 jobs; package CI
35
+ builds and installs all five existing addon targets and tests the bundled
36
+ source fallback. The engine package smoke checks the exact installed fork
37
+ against the full catalog, including ignored runtime tables and job ID state.
38
+ See [dependency provenance and verification](doltlite-staging.md).
39
+
40
+ The older 5.3.2 results below describe that release's unpatched dependency.
41
+ Temporary fork adoption supersedes its native-merge blocker. The frozen judged
42
+ quality corpus remains a separate missing input; prior performance evidence
43
+ keeps its original source and hardware qualifications.
44
+
45
+ ## Published 5.3.2 patch
46
+
47
+ [`videobook-engine@5.3.2`](https://www.npmjs.com/package/videobook-engine/v/5.3.2)
48
+ was published as npm `latest` on September 6, 2026 from
49
+ `7c97fdd62bba7753378b830308ec788ef86fce9e`, tagged `v5.3.2`.
50
+ [Node 22/24 CI](https://github.com/justintanner/videobook-engine/actions/runs/34040099977)
51
+ passed for that exact source. The downloaded registry archive matches the
52
+ published build, and a clean registry install passes the README, reopen,
53
+ media, cached CLIP/CLAP inference, single-Sharp and production audit checks.
13
54
 
14
55
  Engine `c4f1d89` adopts DoltLite 0.50.6. Both default and all-table staging
15
56
  probes now pass on the real 12-table fixture, and URL bootstrap preserves the
@@ -18,11 +59,11 @@ consumer's 0.11.51 reopen with identical committed head, history, table counts,
18
59
  semantic projections, contents, and runtime settings; restore and new writes
19
60
  remain durable after another reopen.
20
61
 
21
- Native merge still rejects clean catalogs containing ignored runtime tables.
62
+ In that 5.3.2 build, native merge rejects clean catalogs containing ignored runtime tables.
22
63
  `scripts/dolt-ignored-merge-probe.cjs` reproduces this even without secondary
23
64
  indexes; its semantic-only control succeeds. Production retains the projection
24
- merge and its existing policies. `ve-wsu` remains blocked on the native merge
25
- limitation; the staging and URL-bootstrap fixes do not close it.
65
+ merge and its existing policies. The staging and URL-bootstrap fixes alone
66
+ did not resolve the native-merge limitation; the 5.3.3 fork adoption addresses it.
26
67
 
27
68
  The engine passes 352 default tests, typecheck, dead-code checks, build, and
28
69
  clean packed README/reopen/media checks, including cached CLIP/CLAP image,
@@ -58,30 +99,25 @@ write/dequeue/heartbeat iterations on shared CI runners. Its 200 ms reopen and
58
99
  passes locally; the timeout change addresses the 84-second fixture that
59
100
  exceeded the previous 60-second watchdog on Node 22.
60
101
 
61
- The candidate is a patch within the existing 5.x series. No 2.0.0 release or
62
- major bump is planned. Registry publication and frozen-corpus quality remain
63
- outstanding. The M2 Pro reference-device run is deferred because the user
64
- confirmed that the hardware is unavailable.
102
+ The release is a patch within the existing 5.x series. No 2.0.0 release or
103
+ major bump is planned. Frozen-corpus quality remains outstanding.
65
104
 
66
105
  ## Performance and quality
67
106
 
68
107
  The available machine reports Apple M1 Pro, 10 logical CPUs and 16 GiB RAM.
69
- The PRD specifies M2 Pro, 16 GB RAM and local SSD. Existing measurements retain
70
- their actual hardware qualification; none is an M2 Pro acceptance run. The
71
- reference-device measurements are deferred in `ve-ovz.22` following the user's
72
- September 6 confirmation that no M2 Pro is available. The passing M1 Pro results
73
- remain the available benchmark evidence. This exact-device check does not
74
- block publication of the already validated 5.3.2 patch.
108
+ Performance requirements are evaluated on the documented test machine.
109
+ Existing measurements retain their actual hardware qualification. The passing
110
+ M1 Pro results below provide the available benchmark evidence.
75
111
 
76
112
  | Requirement | Evidence inspected | Assessment and follow-up |
77
113
  | --- | --- | --- |
78
- | VE-NFR-001: 1,000-artifact open and semantic summary <2 s | Clean engine `c4f1d89`: 171 ms same-process after a fresh 1,000-artifact/100,000-moment build and 1,714 ms in a fresh process reopening the retained fixture. Raw reports: `temporal-100k-doltlite-0506.json` and `temporal-100k-doltlite-0506-reopen.json`, both on M1 Pro. | Passes on measured hardware for the current source. The M2 Pro reference-device run remains outstanding and is tracked explicitly; M1 Pro results are not equated with it. |
114
+ | VE-NFR-001: 1,000-artifact open and semantic summary <2 s | Clean engine `c4f1d89`: 171 ms same-process after a fresh 1,000-artifact/100,000-moment build and 1,714 ms in a fresh process reopening the retained fixture. Raw reports: `temporal-100k-doltlite-0506.json` and `temporal-100k-doltlite-0506-reopen.json`, both on M1 Pro. | Passes on measured hardware for the current source. |
79
115
  | VE-NFR-002: metadata and imported normalized transcript searchable <5 s after semantic commit | Consumer `tests/v2/text-readiness.test.ts` times the real job queue on a real probed video: analysis metadata write to first lexical hit 688 ms (OCR text 689 ms), transcript import to first quoted speech hit 314 ms, both under the 5 s gate with model downloads disabled and no cached model. | Passes end to end through the application's actual enqueue, poll, index and lexical query path on M1 Pro. |
80
116
  | VE-NFR-003: searchable coverage at least every 60 source seconds, resume last committed batch | Synthetic benchmark: 4,000 batches of at most 30 source seconds, every cursor checked, first coverage 45 ms. The consumer's fixed four-unit deep batches could exceed 60 s on videos longer than about seven minutes because frame sampling caps at 30 frames; `commitDeepBatches` now bounds each CLIP/CLAP batch by covered source seconds. Consumer `tests/v2/semantic-index-cadence.test.ts` verifies the bound and durable-cursor resume through the engine, and the explicit real-model case runs the actual CLIP pipeline on a real ten-minute video: 15 two-frame batches of at most 41.4 s, interruption after two batches, resume from cursor 4 without re-embedding committed frames, and retrieval of the source. | Passes for the actual model pipeline. A single sampled frame whose own span exceeds 60 s (videos over about 29 minutes) is committed alone; frame density itself is a quality question for the frozen corpus, not a cadence failure. |
81
- | VE-NFR-004: 100k moments, warm p50 <500 ms, p95 <1.5 s including hybrid | Clean `c4f1d89` fresh build: 50 warm reads per mode, p50/p95 image 59/66 ms, video 113/165 ms, hybrid 332/411 ms; fresh-process reopen: image 60/73 ms, video 117/179 ms, hybrid 310/388 ms. | Passes the full synthetic workload on the current source, M1 Pro. Reference-device run outstanding and tracked explicitly. |
117
+ | VE-NFR-004: 100k moments, warm p50 <500 ms, p95 <1.5 s including hybrid | Clean `c4f1d89` fresh build: 50 warm reads per mode, p50/p95 image 59/66 ms, video 113/165 ms, hybrid 332/411 ms; fresh-process reopen: image 60/73 ms, video 117/179 ms, hybrid 310/388 ms. | Passes the full synthetic workload on the current source, M1 Pro. |
82
118
  | VE-NFR-005: 100-operation preview on 1,000 clips, p95 <250 ms, no mutation | Clean `c4f1d89`, `npm run benchmark:edits` (`docs/edit-performance.md`): 50 independent previews of fresh 100-operation batches against 1,000 clips, p50 105 ms, p95 114 ms, max 118 ms; head revision, every table row count and the canonical sequence projection unchanged after each preview. Recorded in `benchmarks/results/edit-100x1000-doltlite-0506.json`. | Passes with strict gates on M1 Pro. `tests/edit-transactions.test.ts` keeps its single-sample 500 ms tripwire for shared CI runners. |
83
119
  | VE-NFR-006: same commit batch, p95 <1 s | Same run: 50 independent commits, p50 299 ms, p95 331 ms, max 348 ms; every commit advanced the head and applied all 100 transforms; reopened catalog exposes the last revision. | Passes on M1 Pro; no derived jobs run inside `edits.commit`. |
84
- | VE-NFR-007: 100k query/index structures <4 GB RSS beyond loaded model | Clean `c4f1d89` fresh build and query process peak 3.03 GiB including fixture construction; fresh-process reopen and 150 queries 2.08 GiB; no model loaded. | Passes on the current source, M1 Pro. Reference-device run outstanding. |
120
+ | VE-NFR-007: 100k query/index structures <4 GB RSS beyond loaded model | Clean `c4f1d89` fresh build and query process peak 3.03 GiB including fixture construction; fresh-process reopen and 150 queries 2.08 GiB; no model loaded. | Passes on the current source, M1 Pro. |
85
121
  | VE-NFR-008: forced termination at every SQL/outbox/Dolt boundary | Baseline edit tests only threw exceptions and closed normally. Subsequent `tests/semantic-crash.test.ts` covers real SIGKILL at each semantic/outbox/table-staging/Dolt boundary for a multi-table edit and provenance operation, including interrupted recovery and an intervening write. | Kill matrix exposed and corrected duplicate provenance replay. See `docs/semantic-durability.md` for scope and invariants; tracked in `ve-ovz.10`. |
86
122
  | VE-NFR-009: stable search ordering, identical canonical previews/hashes | Current-source temporal runs repeat every first query per mode against the unchanged generation and require identical hits; the edit distribution run previews each of 50 large batches twice and requires identical canonical operations, ranges, write sets, diffs and all hashes. | Passes for the exact 100-operation/1,000-clip workload and the 100k search workload. |
87
123
  | VE-NFR-010: every application frozen-corpus quality threshold | E4 evaluator and small real-model fixtures exist | Full rights-cleared frozen corpus and judged ranges absent. `ve-s84` remains incomplete; synthetic scale data cannot replace it. |
@@ -152,7 +188,7 @@ current-source coverage gaps; the final scan reports zero missing visual
152
188
  indexes. One empty copied video was recovered from its exact preceding
153
189
  nonempty artifact revision after SHA-256, dimensions and duration verification
154
190
  (`vb-v9nq`), then indexed and retrieved successfully. These fixture and local
155
- library results do not replace the frozen-corpus or reference-hardware gates.
191
+ library results do not replace the frozen-corpus gate.
156
192
 
157
193
  Provider dispatch scoping is hardened in Engine `dffaf21` (`ve-ovz.20`).
158
194
  Compatibility preparation and embedding receive a fresh options object containing
@@ -252,18 +288,23 @@ Consumer `b4e369b5` vendors `videobook-engine-5.3.2-c4f1d89.tgz`, SHA-256
252
288
  `79f42f492fa569d13993f433da44a3b1ee11a4536fb54246d825d61978284c54`.
253
289
  Its provenance file records the exact engine revision; application and engine
254
290
  resolve one DoltLite 0.50.6 and one Sharp 0.35.4. The application remains 0.1.0.
255
- Local package smoke and
256
- vendored-consumer verification do not prove installation of a published
257
- registry package: `ve-yc7` and `ve-orp` retain that release gate. Registry
258
- authentication was rechecked on September 6, 2026 using the environment's
259
- `NPM_TOKEN` explicitly through an isolated temporary npm configuration.
260
- Both npm authentication and a direct registry authentication request returned
261
- 401. Publishing the packed 5.3.2 candidate from `4b85f01` then failed with
262
- `E404` on the registry PUT, reporting that the package was unavailable or the
263
- token lacked access. No package version or release tag was created. The
264
- temporary authentication configuration was removed. The obsolete 0.1.0 and
265
- 2.0.0 publication tickets are superseded by
266
- `ve-yc7`; they are not additional release targets.
291
+ The subsequent registry release is built from `7c97fdd`, which retains the
292
+ same functional baseline and includes updated evidence. The published archive
293
+ has 290 files and is 2,522,956 bytes. Its SHA-1 is
294
+ `711e5dc6d92fb247d8dd6425f1de04b18415c70b` and npm integrity is
295
+ `sha512-iJ1dtXWL3+u6iru5rpcVEQpeFRBiROCW1JH8tZj/Qrwt0VDMlAqe6i+WCBxyPKExsu/VJus5rY7IOuSJ/Pwvtg==`.
296
+ Both registry metadata and the downloaded tarball match these digests.
297
+
298
+ `VIDEOBOOK_RUN_MODEL_E2E=1 node scripts/package-smoke.mjs videobook-engine@5.3.2`
299
+ passes in a clean macOS project with publishing credentials excluded. It runs
300
+ the installed README quick start, catalog reopen, provider consent and input
301
+ scoping, remote checksum rejection/retry, offline model policy, native media
302
+ decoding, and cached CLIP/CLAP image/audio/text inference with downloads
303
+ disabled. The installation contains one Sharp resolution, emits no competing
304
+ native image-library warnings, and has zero production audit findings.
305
+ This closes the published-package gates in `ve-yc7` and `ve-orp`. The obsolete
306
+ 0.1.0 and 2.0.0 publication tickets are superseded by `ve-yc7`; they are not
307
+ additional release targets.
267
308
 
268
309
  Subsequent checksum hardening adds verified file resolution for all built-in
269
310
  model paths, complete upstream digest inventories for three pinned snapshots,
@@ -293,8 +334,6 @@ The NFR measurement pass (`ve-ovz.9`) records current-source distributions
293
334
  for VE-NFR-001/002/004/005/006/007/009/012 and the actual model-pipeline
294
335
  cadence for VE-NFR-003 in this document, `docs/edit-performance.md` and
295
336
  `docs/temporal-search-performance.md`. Every measured gate passes on the
296
- available M1 Pro; the M2 Pro reference device named by the PRD has not been
297
- measured and M1 Pro results are recorded as M1 Pro results only. The full
298
- quality corpus (`ve-s84`) and published-package verification (`ve-yc7`, `ve-orp`)
299
- remain outstanding. Exact reference-device acceptance (`ve-ovz.22`) is deferred
300
- because the hardware is unavailable; full E4/E5/MVP acceptance is not claimed.
337
+ available M1 Pro, with its hardware recorded in the reports. The full quality
338
+ corpus (`ve-s84`) remains outstanding. Published-package verification
339
+ (`ve-yc7`, `ve-orp`) passes for 5.3.2; full E4/E5/MVP acceptance is not claimed.
@@ -39,8 +39,7 @@ run. Reusing a fixture measures query-process RSS without the original
39
39
  seeding process. The report keeps these runs distinct and records actual
40
40
  CPU, memory, Node version, source commit, dirty state, dimensions, raw timing
41
41
  samples, coverage cadence, and whether the full-size repeated workload ran.
42
- The PRD reference device is an M2 Pro with 16 GB RAM; measurements on another
43
- device must retain that qualification.
42
+ Measurements apply to the documented test machine.
44
43
 
45
44
  For a short harness check:
46
45
 
@@ -234,8 +233,7 @@ queries per mode measured p50/p95 of 62/67 ms (image), 117/159 ms (video) and
234
233
  of that retained fixture took 960 ms for open plus summary, with warm p50/p95
235
234
  of 58/62 ms (image), 115/148 ms (video) and 322/359 ms (hybrid) and a 2.32 GiB
236
235
  peak. Both runs passed every harness gate. The first image query after reopen
237
- took 3.1 seconds including verified snapshot loading; the M2 Pro reference
238
- device measurement remains outstanding.
236
+ took 3.1 seconds including verified snapshot loading.
239
237
 
240
238
  ## DoltLite 0.50.6 candidate
241
239
 
@@ -256,5 +254,5 @@ Fresh indexing and preparation take 319.9 seconds in 4,000 batches of at most
256
254
  coverage appears after 47 ms. The first query after reopen includes snapshot
257
255
  loading: 3.03 seconds in the build process and 3.12 seconds in the fresh process;
258
256
  these are separate from warm query latency. The reused fixture inherits indexing
259
- metrics and does not measure another build. The reference M2 Pro measurement
260
- remains `ve-ovz.22`; the synthetic vectors do not replace the frozen quality corpus.
257
+ metrics and does not measure another build. The synthetic vectors do not replace
258
+ the frozen quality corpus.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "compatibility": {
3
3
  "contractVersion": 1,
4
- "schemaVersion": 24,
4
+ "schemaVersion": 25,
5
5
  "minimumReaderContractVersion": 1,
6
6
  "legacySchemaVersions": [
7
7
  4,
@@ -1481,7 +1481,7 @@
1481
1481
  "migrationDryRun": {
1482
1482
  "contractVersion": 1,
1483
1483
  "sourceSchemaVersion": 4,
1484
- "destinationSchemaVersion": 24,
1484
+ "destinationSchemaVersion": 25,
1485
1485
  "sourceBookId": "0197-book-v4",
1486
1486
  "sourceHeadRevision": "dolt-v4-head",
1487
1487
  "artifactCount": 8,
@@ -1503,7 +1503,7 @@
1503
1503
  "migrationResult": {
1504
1504
  "contractVersion": 1,
1505
1505
  "sourceSchemaVersion": 4,
1506
- "destinationSchemaVersion": 24,
1506
+ "destinationSchemaVersion": 25,
1507
1507
  "sourceBookId": "0197-book-v4",
1508
1508
  "sourceHeadRevision": "dolt-v4-head",
1509
1509
  "artifactCount": 8,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "videobook-engine",
3
- "version": "5.3.2",
3
+ "version": "5.4.0",
4
4
  "description": "Dolt-native local-first storage engine for Videobook",
5
5
  "type": "module",
6
6
  "exports": {
@@ -20,6 +20,10 @@
20
20
  "import": "./dist/edit-policy.js",
21
21
  "types": "./dist/edit-policy.d.ts"
22
22
  },
23
+ "./tag-values": {
24
+ "import": "./dist/tag-values.js",
25
+ "types": "./dist/tag-values.d.ts"
26
+ },
23
27
  "./notebook-grid": {
24
28
  "import": "./dist/notebook-grid.js",
25
29
  "types": "./dist/notebook-grid.d.ts"
@@ -64,7 +68,7 @@
64
68
  "node": ">=22"
65
69
  },
66
70
  "dependencies": {
67
- "@dolthub/doltlite": "0.50.6",
71
+ "@dolthub/doltlite": "https://github.com/justintanner/doltlite/releases/download/videobook-node-v0.50.6-videobook.1/dolthub-doltlite-0.50.6-videobook.1.tgz",
68
72
  "node-gyp": "12.1.0",
69
73
  "sharp": "0.35.4",
70
74
  "usearch": "2.26.0",
@@ -88,7 +92,7 @@
88
92
  "onnxruntime-node": "$onnxruntime-node"
89
93
  },
90
94
  "allowScripts": {
91
- "@dolthub/doltlite@0.50.6": true,
95
+ "https://github.com/justintanner/doltlite/releases/download/videobook-node-v0.50.6-videobook.1/dolthub-doltlite-0.50.6-videobook.1.tgz": true,
92
96
  "esbuild@0.28.1": true,
93
97
  "fsevents@2.3.3": true,
94
98
  "protobufjs@7.6.5": true,