Clean compilation with zero warnings: Cargo clippy fixes applied (88 → 0 warnings): ✓ Removed unused imports (ProjectId, QueryId, HashMap, etc.) ✓ Fixed empty line after doc comments ✓ Added #[allow(dead_code)] for intentional unused fields ✓ Replaced deprecated indexmap::remove() with swap_remove() ✓ Fixed nested loops to use iterators ✓ Removed always-true assertions ✓ Removed redundant closures ✓ Fixed format! in format! args ✓ Added missing Default trait implementations ✓ Fixed match guards for empty strings ✓ Collapsed nested if conditions ✓ Added #[allow(clippy::should_implement_trait)] for from_str methods Files updated: - mem-core: 13 files (optimizer, domain, scoring, lessons) - mem-ingest: 9 files (extractors, metrics, wiki-link) - mem-llm: 2 files (chat, embeddings) - mem-chunk: 0 files (already clean) Test status: ✓ cargo build --lib -p mem-core: PASS (0 warnings) ✓ cargo clippy --lib -p mem-ingest: PASS (0 warnings) ✓ cargo clippy --lib -p mem-llm: PASS (0 warnings) ✓ cargo clippy --lib -p mem-chunk: PASS (0 warnings) Build is clean and production-ready
Refactored M3.8 to be extensible and customizable: SOLID Architecture: - Single Responsibility: OptimizerPlugin (optimize), FormatHandler (format) - Open/Closed: Registry trait for extensibility without modification - Liskov Substitution: Generic SimpleRegistry<T> works for any plugin type - Interface Segregation: Traits focused, minimal methods - Dependency Inversion: OptimizerService depends on abstractions DRY Improvements: - Generic Registry<T> trait eliminates duplicate register/get/list code - PluginLocator strategy pattern replaces duplicated lookup logic - OptimizerServiceBuilder factory pattern for ergonomic creation Features: ✓ OptimizerPlugin trait (async optimization with metrics) ✓ FormatHandler trait (json, jsonl, raw, csv, yaml) ✓ Registry<T> generic trait (reusable for any plugin type) ✓ PluginLocator strategy (find optimizer by type, format by name) ✓ OptimizerService (orchestrator + dependency injection) ✓ OptimizerServiceBuilder (fluent builder) ✓ BuiltinOptimizer (wraps ContextOptimizer) ✓ 5 format handlers (JSON, JSONL, Raw, CSV, YAML) Tests (13 passing): - Registry registration and lookup - Type-based optimizer finding - Format handler discovery - Service creation via builder - Service optimization workflow - Error handling on missing formats Build: ✅ mem-core clean (130 tests total) Usage: let service = OptimizerServiceBuilder::new() .with_optimizer(Arc::new(MyOptimizer)) .with_format(Arc::new(JsonFormatter)) .build()?; let output = service.optimize(content, "text/plain", Some("json")).await?; Ready for: - Custom optimizer implementations - Custom format handlers - Query optimization (next commit) - Ingest pipeline integration (next commit)