Two coupled changes that together restore non-empty post-migration graph
builds and remove the silent "succeeded but empty" outcome.
Root cause: Config defaulted EMBEDDING_MODEL to OpenAI text-embedding-3-small
(1536 dim), but Graphiti's Neo4j vector index is 1024 dim. With the
documented Dashscope LLM default, EMBEDDING_API_KEY/EMBEDDING_BASE_URL
fell back to LLM_*, producing either a 4xx (since #29 propagates as
Task.FAILED) or a write that landed metadata but no entities.
Changes:
- Flip Config defaults to local Ollama (mxbai-embed-large, 1024 dim,
http://localhost:11434/v1). Override semantics unchanged: explicit
EMBEDDING_* env vars continue to win, so existing OpenAI/Gemini setups
are not affected.
- Gate _build_graph_worker on a non-zero entity-node count before
complete_task. Mirrors the existing _recover_stuck_projects rule;
surfaces any residual silent failure as Task.FAILED with the new
progress.emptyGraphFailure locale key, instead of marking the project
GRAPH_COMPLETED on an empty graph.
- Update README, CLAUDE.md, and docker-compose.yml comments to reflect
Ollama as the active default and OpenAI/Gemini as commented fallbacks.
- The matching .env.example diff is recorded in
.kiro/specs/graph-build-empty-fix/HANDOFF.md for manual operator apply
(file is hook-protected from the assistant).
Spec: .kiro/specs/graph-build-empty-fix/
Closes#37