fix: update deployment image to new riotpiao-poimen org path #45
@@ -0,0 +1,191 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user