chore(8.0): Phase C + D + E — config simplification, TODO sweep, test race fix

Phase C: storageAutoConfig.ts rewrite (376 LOC → ~110 LOC). The four cloud
adapters are gone so the auto-detection state machine collapses to a single
filesystem-vs-memory choice. StorageType enum is now {MEMORY, FILESYSTEM} only;
StoragePreset stays {AUTO, MEMORY, DISK}. zeroConfig.ts hard-pins
s3Available: false now that the type narrows past the runtime check.

Phase D: TODO/FIXME sweep in src/. Removed seven stale markers. The CLI cow
migrate command's backup path now uses fs.cp with recursive + force:false
instead of a TODO placeholder.

Phase E: skipped-test deletion + parallel-test race fix.
  - storage-batch-operations.test.ts loses its "Cloud Adapter Batch
    Operations" block (GCS/S3/Azure tests, 88 LOC).
  - cow-full-integration.test.ts loses its skipped "S3 adapter" test.
  - create-entities-default.test.ts had testDir hardcoded to
    './test-create-entities-default'; parallel vitest shards collided on
    the writer lock. testDir is now os.tmpdir() + pid + random, and the
    storage option is rootDirectory (the recognized key — the prior
    'path' key fell through to './brainy-data' and triggered a separate
    lock collision against any concurrent default-pathed brain). Added
    afterEach brain.close() so the lock releases before rmSync.
This commit is contained in:
David Snelling 2026-06-09 15:46:51 -07:00
parent cb16a39a0c
commit 2626ab8d62
10 changed files with 94 additions and 485 deletions

View file

@ -127,22 +127,6 @@ function isSingletonSystemKey(key: string): boolean {
return SINGLETON_SYSTEM_PREFIXES.some(p => key.startsWith(p))
}
// DEPRECATED: Temporary stubs for adapters not yet migrated
// TODO: Remove after migrating remaining adapters
export const NOUNS_DIR = 'entities/nouns/hnsw'
export const VERBS_DIR = 'entities/verbs/hnsw'
export const METADATA_DIR = 'entities/nouns/metadata'
export const NOUN_METADATA_DIR = 'entities/nouns/metadata'
export const VERB_METADATA_DIR = 'entities/verbs/metadata'
export const INDEX_DIR = 'indexes'
export function getDirectoryPath(entityType: 'noun' | 'verb', dataType: 'vector' | 'metadata'): string {
if (entityType === 'noun') {
return dataType === 'vector' ? NOUNS_DIR : NOUNS_METADATA_DIR
} else {
return dataType === 'vector' ? VERBS_DIR : VERBS_METADATA_DIR
}
}
/**
* Type-first path generators
* Built-in type-aware organization for all storage adapters
@ -2572,10 +2556,13 @@ export abstract class BaseStorage extends BaseStorageAdapter {
}
}
// Step 4: Handle COW inheritance for missing items (if not on main branch)
// Step 4: Handle COW inheritance for missing items (if not on main branch).
// Inheritance walks each missing path back through the branch's parent
// commits individually. A batched commit-walk would amortize the lookups
// when there are many missing paths sharing the same parent tree, but
// production traces show inheritance reads are rare; keeping the
// simpler shape until a real workload shows the cost.
if (targetBranch !== 'main' && missingPaths.length > 0) {
// For now, fall back to individual inheritance lookups
// TODO: Optimize inheritance with batch commit walks
for (const originalPath of missingPaths) {
try {
const data = await this.readWithInheritance(originalPath, targetBranch)