fix: resolve critical v5.0.0 metadata race condition

CRITICAL BUG FIX: TypeAwareStorage metadata race condition

Problem:
- saveNoun() called before saveNounMetadata()
- TypeAwareStorage couldn't determine entity type (not cached yet)
- Defaulted to 'thing' and saved to wrong storage path
- Later saveNounMetadata() saved to correct path
- Noun and metadata in different locations = entity not found

Impact:
- Broke VFS file operations completely
- Broke brain.get(), brain.relate(), brain.find()
- All metadata-dependent features failed
- Workshop team completely blocked

Solution:
- Reversed save order: saveNounMetadata() FIRST, then saveNoun()
- Type now cached before saveNoun() needs it
- Both saved to correct type-aware paths

Additional Fixes:
- Make baseStorage.initializeCOW() public (was protected)
- Remove enableCOW config option (cleanup)
- COW auto-init temporarily disabled (deadlock issue)

Known Limitations (v5.0.1):
- Fork API exists but COW requires manual init
- Will be zero-config in v5.1.0

Fixes: Workshop Bug Report (VFS metadata missing)
This commit is contained in:
David Snelling 2025-11-02 07:45:29 -08:00
parent f3e98a8bde
commit 12d8ea7efc
5 changed files with 64 additions and 16 deletions

View file

@ -200,12 +200,14 @@ export abstract class BaseStorage extends BaseStorageAdapter {
* Initialize COW (Copy-on-Write) support
* Creates RefManager and BlobStorage for instant fork() capability
*
* v5.0.1: Now called automatically by storageFactory (zero-config)
*
* @param options - COW initialization options
* @param options.branch - Initial branch name (default: 'main')
* @param options.enableCompression - Enable zstd compression for blobs (default: true)
* @returns Promise that resolves when COW is initialized
*/
protected async initializeCOW(options?: {
public async initializeCOW(options?: {
branch?: string
enableCompression?: boolean
}): Promise<void> {