6.1 KiB
ADR-076: UOK Memory Integration for Autonomous Learning
Status: Accepted
Date: 2026-05-07
Supersedes: None
Related: ADR-0075 (UOK Gate Architecture), ADR-008 (SF Tools Over MCP)
Decision
SF's autonomous dispatch and UOK kernel integrate with the existing SQLite-backed memory system for pattern learning and context-aware decision-making. Memory operations use fire-and-forget async to never block dispatch.
Problem
SF's dispatch and UOK execution had no feedback loop for learning. Each unit executed independently without recording outcomes or learning from patterns. This prevented:
- Learning which unit types succeed or fail
- Understanding task dependencies
- Improving dispatch decisions over time
- Detecting recurring issues (gotchas)
Solution
Three Integration Points
Phase 1: Unit Outcome Recording
recordUnitOutcomeInMemory(unit, status, result)in unit-runtime.js- Records every unit completion as a learned pattern
- Success: 0.9 confidence (strong signal)
- Failure: 0.5 confidence (weaker signal, more variability)
- Fire-and-forget async; never blocks execution
Phase 2: Dispatch Ranking Enhancement
enhanceUnitRankingWithMemory(units, baseScores)in auto-dispatch.js- Queries memory for similar unit types
- Boosts matching candidates by up to 15% of pattern confidence
- Deterministic embeddings ensure consistent ranking
- Gracefully degrades if DB unavailable
Phase 3: Gate Context Enrichment
enrichGateResultWithMemory(gateResult, gateId)in gate-runner.js- Enriches gate failures with historical pattern diagnostics
- Pure diagnostic; never changes gate pass/fail decisions
- Helps operators understand recurring issues
Architecture
UOK Kernel (executes units)
↓ records outcomes via
Unit Runtime (recordUnitOutcomeInMemory)
↓ stores patterns in
Memory System (SQLite, Node 26 native)
↓ queried by
Dispatch (enhanceUnitRankingWithMemory)
↓ boosts scores for matching patterns
↓ selected unit executes
↓ outcome recorded → feedback loop
Memory Categories
pattern— Unit type completion patterns (success/failure)gotcha— Recurring issues discoveredarchitecture— Design decisionsconvention— Coding standardsenvironment— Configuration, setuppreference— Optimization decisions
Rationale
- Maximize kernel + DB — Single UOK kernel, memory as DB layer, no multiplication
- Fire-and-forget async — Memory never blocks critical path; safe degradation
- Existing infrastructure — SF already has 10 memory modules; no duplication
- Node 26 native SQLite — No external dependencies; efficient storage
- Confidence scoring — Learned patterns inform but don't dominate decisions
- Pure diagnostic gates — Gate failures become learning opportunities, not gate logic change
Consequences
Benefits
- Autonomous pattern discovery
- Better dispatch ranking over time
- Recurring issues visible to operators
- Fire-and-forget prevents latency impact
- Graceful degradation if DB unavailable
- No external service dependencies
Drawbacks
- Memory DB growth over time (mitigated by decay/supersession)
- Embeddings require compute (mitigated by deterministic hashing)
- Learning only visible over multiple runs
Implementation Details
Confidence Strategy
- Success patterns: 0.9 confidence (strong signal)
- Failure patterns: 0.5 confidence (weaker, more variability)
- Memory boost: Max 15% of pattern confidence (conservative to avoid over-fitting)
- Threshold: No minimum; filtering happens at query time via confidence scoring
Graceful Degradation
All memory operations fail silently without blocking:
- DB unavailable → dispatch continues without boost
- Memory lookup fails → continue with base scores
- Embedding computation fails → use default embedding
- Gate enrichment fails → return original result
Vector Strategy
- 128-dimensional deterministic embeddings
- Hash-based (character codes + sine waves)
- Normalized to unit length (cosine similarity)
- Recomputed per dispatch (acceptable latency <10ms)
Validation
Phase 1 Tests: 18 test cases (all passing ✅)
- Record success/failure patterns
- Confidence scoring (0.9 vs 0.5)
- Graceful DB degradation
- Category assignment
- Unit type extraction
Phase 2 Tests: 21 test cases (syntax correct, require Node 26.1)
- Memory-enhanced ranking
- Embedding computation
- Score boosting formula
- Multiple dispatch candidates
- Fallback chains
Phase 3 Tests: 17 test cases (all passing ✅)
- Gate enrichment with memory context
- Diagnostic-only (never changes gate decision)
- Similar failure detection
- Property preservation
- Graceful degradation
Total: 56 new tests validating integration
Alternatives Considered
- Vector database (e.g., Pinecone) — Rejected: adds external service, SF is client only
- New memory kernel — Rejected: SF has 10 complete memory modules already
- Block on memory operations — Rejected: fire-and-forget is safer for critical path
- Complex ML model — Rejected: simple confidence scoring sufficient for learning signal
Related Decisions
- ADR-0000: Purpose-to-Software Compiler (SF is autonomous learner)
- ADR-0075: UOK Gate Architecture (gates are pure functions, not learning)
- ADR-008: SF Tools Over MCP (memory is internal, not exposed as service)
Future Work
- Integrated dispatch rules — Use
enhanceUnitRankingWithMemory()in actual dispatch rules - Memory telemetry — Track which patterns influence decisions
- Pattern clustering — Auto-group similar memories
- Distributed learning — Share patterns across SF instances
- Performance tuning — Cache embeddings if reused repeatedly
Documentation
docs/dev/MEMORY-SYSTEM-ARCHITECTURE.md— Full architecture referencedocs/dev/MEMORY-SYSTEM-INTEGRATION-GUIDE.md— Quick-start guide for developerssrc/resources/extensions/sf/uok/unit-runtime.js— Phase 1 implementationsrc/resources/extensions/sf/auto-dispatch.js— Phase 2 implementationsrc/resources/extensions/sf/uok/gate-runner.js— Phase 3 implementation