brainy/tests/unit/storage
David Snelling bfa1762107 feat: registered-blob family contract — declared index blobs are undeletable (ADR-004 Pass 2)
The class-killer for the lost-main.dkann incident (ADR-004 §7). A provider can
declare a derived-index blob FAMILY (a set of members that are load-bearing
together, e.g. vector-base = main.dkann + main.slotmap + main.slotrev). Once
declared:

- deleteBinaryBlob / removeRawPrefix REFUSE to remove a declared member, throwing
  the new ProtectedArtifactError — an in-process GC / sweeper is now INCAPABLE of
  deleting a load-bearing index file (COLD != DEAD). Intentional retirement is an
  explicit unregisterDerivedFamily(name) first.
- The declaration persists to _system/derived-artifacts.json, so protection
  survives a reopen; clear() resets it with the rest of the derived footprint.
- checkDerivedFamiliesPresent() names any member missing on open (the catch for an
  EXTERNAL deleter that bypasses the in-process refusal) → rebuild from canonical.
- Transients (*.tmp.*, *.rebuild-tmp, *.rotate-tmp) are never protected; a
  namespace family protects a growing prefix (seg-*).

New StorageAdapter surface (optional): registerDerivedFamily / unregisterDerivedFamily
/ listDerivedFamilies + DerivedFamilyDeclaration; new exported errors
ProtectedArtifactError / DerivedArtifactMissingError. Enforcement is inert until a
provider declares a family (no regression). Cor declares its 6 families + does the
atomic set-swap in 3.0.15 (M2); brainy builds the contract now. 8 tests.
2026-07-13 14:52:06 -07:00
..
blob-save-durability.test.ts fix: restore loadBinaryBlob fault-propagation (native column-store lockstep) 2026-07-13 12:09:55 -07:00
blobStorage.compression-policy.test.ts feat(8.0)!: delete fork/branch/commit/history/versions — superseded by the Db API 2026-06-10 15:22:47 -07:00
blobStorage.test.ts feat: temporal VFS — file content joins the Model-B immutability model 2026-07-10 16:43:48 -07:00
clear-native-footprint.test.ts fix: clear() wipes the full native/derived footprint, not a subset 2026-07-13 09:18:36 -07:00
getNouns-totalCount.test.ts fix(8.0): getNouns().totalCount reports true total, not page size (port of 7.32.1) 2026-06-17 14:10:06 -07:00
getVerbs-totalCount.test.ts fix(8.0): VFS path-cache instance-scoping + verb totalCount page-cap 2026-06-19 11:45:13 -07:00
registered-blob-contract.test.ts feat: registered-blob family contract — declared index blobs are undeletable (ADR-004 Pass 2) 2026-07-13 14:52:06 -07:00
sharding-new-installation-log.test.ts fix: count recovery scans the canonical layout; remove the dead 7.x hnsw sharding machinery 2026-07-08 15:49:19 -07:00
sharding.test.ts fix(8.0): accept application-supplied entity ids, not just UUIDs 2026-06-16 10:40:40 -07:00
stats-count-accuracy.test.ts fix(8.0): stats() per-type counts no longer inflate with HNSW re-saves 2026-06-17 17:07:58 -07:00
storage-path-resolution.test.ts feat(8.0): API simplification — remove neural()/Db.search, one storage path key, integration→0 2026-06-20 13:31:11 -07:00
verb-cursor-pagination.test.ts perf(8.0): cursor pagination for the verb walk — full edge pagination O(N²) → O(N) 2026-06-20 16:55:02 -07:00
vfs-mkdir-bug.test.ts chore(8.0): final pre-RC1 sweep — API consistency, named errors, orphans, zero-cast codebase 2026-06-11 14:51:00 -07:00