192 lines
5.2 KiB
Markdown
192 lines
5.2 KiB
Markdown
# 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()`:
|
|
```rust
|
|
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
|
|
```rust
|
|
// WRONG - just vector storage
|
|
store_chunk_l0(&l0_chunk);
|
|
store_memory_l1(&l1_memory);
|
|
```
|
|
|
|
Should: Extract entities + facts + edges
|
|
```rust
|
|
// 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:
|
|
```sql
|
|
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:
|
|
```rust
|
|
// 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
|
|
```bash
|
|
# 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.
|