Smaller fixes from the 2nd code-review pass on plan 21.
Backend / CLI / DB:
- memoryTools.ts: error-path fallback no longer hardcodes
retrievalStrategy:"exact"; uses DEFAULT_MEMORY_SETTINGS via
toMemoryRetrievalConfig (D16 / Bug #7).
- memory.mjs: applyLegacyTypeMap also runs on search / list / clear
(was only on add); legacy user/feedback/project/reference remap to
canonical types with a stderr warning (D17 / Bug #4).
- migrationRunner.ts: case "073" guards via
hasColumn(memories, needs_reindex) so an unmarked re-run of
073_memory_vec.sql is skipped cleanly (D27).
UI:
- MemoryEngineStatus: optional onConfigure callback; "Configurar →"
CTAs on the Embedding / Qdrant / Rerank rows when those components
are off or missing (matches §4.3 wireframe).
- EngineTab: scroll IDs on config cards + handleConfigure wired to
the status panel. Providers fetch moved from render body
(setState-during-render anti-pattern) into useEffect.
- RerankConfigCard: toggle is disabled when no provider has a key —
blocks turning rerank ON without a provider, still allows turning
it OFF (D13).
- MemoriesTab: Import validates each entry against the canonical
type enum before POST so invalid types are caught locally with a
clear skipped count.
Tooling:
- package.json: test:all includes test:vitest:ui so the UI suite
is no longer orphaned in CI.
Tests:
- cli-memory-commands: asserts updated for the new legacy->canonical
remap on search/clear.
- memory-embedding-resolve: drop always-true `|| reason.length > 0`
clauses that neutralized two assertions.
- memory-embedding-static-potion: model_load_failed test forces a
real load failure via MEMORY_STATIC_CACHE_DIR=/dev/null/<subdir>
and asserts EmbeddingError shape + reason + sanitized message
(replaces the previous `assert.ok(true)`).
- rerank-config-card.test.tsx: happy-path now uses a provider with
hasKey; new test covers the disabled-toggle guard.
Full memory suite green: 331/331 unit tests, 46/46 UI tests.
typecheck:core, typecheck:noimplicit:core, check:cycles clean.