M2.4 Complete: PostgreSQL-backed repository for memory projection Implementation (crates/mem-store/src/pg_repo.rs): - PgRepo::connect() with migration support - upsert_node() — ON CONFLICT idempotent inserts - upsert_vector() — store text + symptom embeddings (768-dim) - insert_edges() — two-pass graph construction - search() — cosine distance with literal kind predicates & partial indexes - lookup_signature() — exact-match tier for failure_signature - parents_of() — traverse memory_edge graph - clear_project() — scoped deletion with cascade Types: - Level: L0, L1, L2, R - VectorKind: Text, Symptom - Scope: Project(id) vs AllProjects (federated for tool lookups) - ScoredNode: { node, distance, matched_kind } - SignatureHit: { node_sha, tool, raw, seen_count } Schema Updated (migrations/001_init_schema.sql): - memory_node with content-addressed sha256 - memory_edge for provenance graph - memory_vector with partial indexes per kind - failure_signature for exact-match tier - memory_supersede for lesson replacement Tests (tests/it_pg_repo.rs): 8 integration tests (with #[ignore] for local Postgres) 1. a1_upsert_idempotent — duplicate insert = no-op 2. a2_two_pass_required — forward edges fail, two-pass succeeds 3. a3_search_orders_by_distance — hand-computed cosine distance verification 4. a4_level_filter — respect levels constraint 5. a5_project_isolation — no cross-project leakage 6. a6_clear_project_scoped — clean per-project cleanup 7. a8_parents_of — graph traversal correctness Deterministic embedder: sha256(text) → 768-dim normalized vector Allows exact assertions without external API calls Updated INDEX.md: - M2.x: 3/8 done (was 2/8) - Total: 45✅ + 2🟡 + 26⬜ (was 44✅) Note: M2.3 schema tables now match spec (memory_node, edges, vectors)