Files
poimen-memory/STATUS_CURRENT.md
T

5.2 KiB

Current Status - Poimen Memory Service (2026-01-08)

COMPLETED THIS SESSION

1. Removed AccessGuard RBAC (Blocker Issue #1)

  • AccessGuard initialization REMOVED
  • RBAC checks in handlers REMOVED
  • Permission-based access control DEFERRED
  • Code now compiles with cargo build --release
  • Binary created: target/release/mem

2. HTTP Handler Initialization Fixed

  • Added error handling for schema initialization
  • Server reaches "Starting HTTP server" log message
  • HTTP server binds to port (processes created)

⚠️ CURRENT ISSUE

Server binds to port but exits immediately (silent failure)

Process is created and runs serve command, but:

  • Process exits with code 0 (clean exit, no crash)
  • No HTTP requests answered (port refuses connections)
  • Logs don't show "listening on 0.0.0.0:8080" message

Suspected cause: Something in the handler initialization or routing setup is blocking/panicking but not showing in logs.

🔧 DEBUGGING STEPS NEEDED

  1. Add logging after each major initialization step in start_server():

    tracing::info!("About to create AppState");
    let state = web::Data::new(AppState { ... });
    tracing::info!("AppState created");
    
    tracing::info!("About to create HttpServer");
    HttpServer::new(move || { ... })
    tracing::info!("HttpServer created, about to bind");
    
    .bind(("0.0.0.0", port))?
    tracing::info!("Bound to port {}", port);
    
    .run()
    tracing::info!("About to run()");
    .await?;
    tracing::info!("Server running");
    
  2. Run with RUST_BACKTRACE=1 to see panics

  3. Check if the issue is in handler route registration

📋 NEXT PRIORITY FIXES (AFTER SERVER RUNS)

Phase 1: INGEST PIPELINE CRITICAL

File: crates/mem-cli/src/ingest_worker.rs

Currently: Just stores raw vectors

// WRONG - just vector storage
store_chunk_l0(&l0_chunk);
store_memory_l1(&l1_memory);

Should: Extract entities + facts + edges

// 1. Extract entities
let entities = entity_extractor.extract(&content).await?;

// 2. Extract facts/relationships  
let facts = fact_extractor.extract(&content, &entities).await?;

// 3. Create temporal edges
for fact in facts {
  let edge = TemporalEdge {
    source: fact.source_entity,
    target: fact.target_entity,
    relation: fact.relation,
    fact: fact.text,
    t_valid: now(),
    t_invalid: None,
    confidence: 0.8,  // GRM gate score
    version: 1,
  };
  edge_repo.insert(&edge).await?;
}

// 4. Queue contradictions for review
for edge in &edges {
  if contradiction_detector.detect(edge, existing_edges)? {
    review_queue.enqueue(edge).await?;
  }
}

Phase 2: TEMPORAL SCHEMA

File: crates/mem-store/migrations/003_temporal_schema.sql

Add columns:

  • t_valid TIMESTAMP NOT NULL DEFAULT NOW()
  • t_invalid TIMESTAMP
  • confidence FLOAT DEFAULT 0.8
  • version INT DEFAULT 1
  • update_reason VARCHAR

Create edge table:

CREATE TABLE memory_edge (
  source_id UUID NOT NULL,
  target_id UUID NOT NULL,
  relation VARCHAR NOT NULL,
  fact TEXT NOT NULL,
  t_valid TIMESTAMP DEFAULT NOW(),
  t_invalid TIMESTAMP,
  confidence FLOAT,
  version INT,
  PRIMARY KEY (source_id, target_id, relation, version)
);

Phase 3: QUERY HANDLER

File: crates/mem-cli/src/http_server.rs

Change query_handler() from vector-only to graph-aware:

// 1. Vector search
let results = semantic_search(query)?;

// 2. Follow edges
let mut expanded = results;
for entity in results {
  let related = edge_repo.find_by_source(&entity.id).await?;
  expanded.extend(related);
}

// 3. Apply temporal filter
expanded.retain(|e| is_valid_at_time(e, now()));

// 4. Sort by confidence + recency
expanded.sort_by_key(|e| (-e.confidence, -e.t_valid));

// 5. Return
HttpResponse::Ok().json(expanded)

Phase 4: END-TO-END TESTING

# 1. Ingest with entities + facts
POST /memory/ingest
{
  "project": "test",
  "source": "transcript://session-1",
  "ingest_id": "i-001",
  "records": [{"role": "user", "text": "Kubernetes port conflict...", ...}]
}
# Expected: {"ingest_id":"i-001","status":"pending"}

# 2. Check ingest status
GET /memory/ingest/i-001
# Expected: {"status":"done","entities_count":5,"edges_count":3}

# 3. Query returns graph
POST /memory/query
{"project":"test","query":"port conflict resolution"}
# Expected: {"results":[
#   {"type":"entity","name":"Kubernetes","edges":[...]},
#   {"type":"entity","name":"Port","edges":[...]},
#   {"type":"fact","source":"Kubernetes","target":"Port","relation":"has-conflict"}
# ]}

FILES MODIFIED

crates/mem-cli/src/http_server.rs - Removed RBAC, added error handling Created STATUS_CURRENT.md - This file

TIMELINE

  • 2026-01-08 16:00: Fixed HTTP handlers, removed RBAC blocker
  • 2026-01-08 16:30: Server init working, but exits on startup
  • 2026-01-08 16:40: Debugging server binding issue

KEY DECISIONS

  1. RBAC deferred: MVP focuses on core ingest/query, auth added later
  2. Temporal-first: All edges must have t_valid/t_invalid for graph compaction
  3. GRM gate integrated at ingest time: Confidence scores assigned when facts extracted
  4. No queue worker in MVP: Enable it after core working

Next action: Add detailed logging to start_server() to see where process exits.