fix: CRITICAL systemic VFS metadata bug across ALL storage adapters (v4.7.4)

CRITICAL BUG FIX - Workshop Team Unblocked!

This hotfix resolves a systemic bug affecting ALL 7 storage adapters that
caused VFS queries to return empty results even when data existed.

Bug Pattern: `if (!metadata) continue` in getNouns()/getVerbs()
Impact: VFS queries returned empty arrays despite 577 relationships existing
Root Cause: Storage adapters skipped entities if metadata file read returned null

Fixes:
- storage: Fix metadata skip bug in 12 locations across 7 adapters
  (TypeAware, Memory, FileSystem, GCS, S3, R2, OPFS, Azure)
- neural: Fix SmartExtractor weighted score threshold (28 failures → 4)
- neural: Fix PatternSignal priority ordering
- api: Fix Brainy.relate() weight parameter not returned

Test Results:
- TypeAwareStorageAdapter: 17/17 passing (was 7 failures)
- SmartExtractor: 42/46 passing (was 28 failures)
- Neural clustering: 3/3 passing
- Brainy.relate(): 20/20 passing

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
David Snelling 2025-10-27 14:23:46 -07:00
parent c75bbb9ba4
commit e06edb7d52
15 changed files with 287 additions and 144 deletions

View file

@ -556,8 +556,17 @@ export class SmartExtractor {
}
}
// Determine final confidence score
// FIX: When only one signal matches, use its original confidence instead of weighted score
// The weighted score is too low when only one signal matches (e.g., 0.8 * 0.2 = 0.16 < 0.60 threshold)
let finalConfidence = bestScore
if (bestSignals.length === 1) {
// Single signal: use its original confidence
finalConfidence = bestSignals[0].confidence
}
// Check minimum confidence threshold
if (!bestType || bestScore < this.options.minConfidence) {
if (!bestType || finalConfidence < this.options.minConfidence) {
return null
}
@ -572,7 +581,7 @@ export class SmartExtractor {
return {
type: bestType,
confidence: Math.min(bestScore, 1.0), // Cap at 1.0
confidence: Math.min(finalConfidence, 1.0), // Cap at 1.0
source: 'ensemble',
evidence,
metadata: {
@ -609,7 +618,9 @@ export class SmartExtractor {
const best = validResults[0]
if (best.weightedScore < this.options.minConfidence) {
// FIX: Use original confidence, not weighted score for threshold check
// Weighted score is for ranking signals, not for absolute threshold
if (best.confidence < this.options.minConfidence) {
return null
}