Root causes of zero entity extraction:
1. IngestWorker used WikiLinkFallbackExtractor (wiki links only)
Fix: Use LlmEntityExtractor when LLM_ENDPOINT is set
2. ExtractedEntity.entity_type vs LLM returning "type"
Fix: serde alias "type" -> entity_type, default confidence
3. Reasoning models output <think>...</think> before JSON
Fix: strip_thinking_tags() extracts JSON from response
4. Reflection verification crashes pipeline on parse failure
Fix: graceful fallback, keep all entities if reflection fails
Tested with reasoning-predictor (qwen2.5:3b) via port-forward.
- Remove obsidian.yaml deployment
- Remove OBSIDIAN_URL from configmap
- Remove from kustomization.yaml
- obsidian_ref_source.rs kept as dead code (no callers)
- Reference docs now handled via memory graph entities
- Scaled obsidian-server to 0 in cluster
Triggers on:
- Push to main when crates/mem-store/migrations/*.sql changes
- Manual workflow_dispatch (runs ALL migrations)
On push: detects changed migration files, runs only those.
On dispatch: runs all migrations in order (idempotent).
Requires DB_USER + DB_PASSWORD secrets in Forgejo.
Connects to memory-db-rw.poimen.svc.cluster.local.
All migrations use IF NOT EXISTS / IF EXISTS guards.
deploy.yaml: add nodejs install (required for actions/checkout)
migrate.yaml: rewrite migration runner
- Use PGHOST/PGUSER/PGPASSWORD env vars (no inline -h/-U/-p flags)
- ON_ERROR_STOP=1 for strict error handling on push
- || true for dispatch (idempotent full replay)
- Verify schema after apply
- fetch-depth: 2 for diff detection
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Consolidate Phase 3 ingest pipeline improvements:
Ready for: DB provisioning test → E2E ingest → visualization verification
Issues resolved:
Entity extraction fixes: - clean_llm_response() strips <think> tags, markdown fences, extracts JSON - Handle array responses (wrap in {"entities": [...]}) - EntityType custom Deserialize: unknown variants map to Unknown (not crash) - Increase timeout to 90s for reasoning models - Increase max_tokens to 1500 for reasoning model overhead Fact extraction (new): - LlmFactExtractor: LLM-based relationship extraction between entities - Validates source/target against known entity list (no hallucinated edges) - Same clean_llm_response() for reasoning model + Ollama compatibility - Graceful fallback: returns empty on LLM error (no pipeline crash) - IngestWorker uses LlmFactExtractor when LLM_ENDPOINT set K8s deployment: - Add LLM_ENDPOINT, LLM_API_BASE, LLM_MODEL env vars - Points to in-cluster reasoning-predictor service Tested E2E with local Ollama (qwen2.5:3b): - 12 entities extracted (person, tool, concept, organization) - 5 edges with meaningful relationships and facts - 781 tests passAll components now emit target="observability" structured logs: chunk_optimizer: event=chunk_optimize: input, after_threshold_filter, after_dedup, dedup_removed, selected, budget_bytes result_compressor: event=result_compress: input_count, estimated_bytes, compressed_bytes, budget_bytes, strategy query_router: event=query_route: route, candidates, prefiltered, selected, latency_ms cache_alignment: event=cache_preload: preloaded, cache_hits, cache_misses, hit_ratio full_pipeline: event=full_pipeline_complete: query, candidates, prefiltered, optimized, dedup_removed, boosts_applied, cache_hit_ratio, budget_bytes, total_ms compaction: event=compaction_complete: mode, duration_ms, duplicate_edges_deleted, stale_facts_deleted, semantic_merged, llm_calls, bytes_freed 781 tests pass.View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.