Two design questions answered:
1. Web/news/Karakeep INTO long-term memory? Yes, but with per-source TTL.
docs/08 gains a "Memory sources & retention" section that pins TTLs:
memo/obsidian/karakeep = permanent, mail = 365d, mail_digest = 90d,
rss = 30d, web_search = 90d, system = 30d. Every Qdrant point carries
payload.expires_at; a daily prune workflow honours it. New commands
in docs/05: #nexa:learn --permanent, #nexa:forget, #nexa:retain,
#nexa:ask --web (SearXNG → crawl4ai-mcp → markitdown-mcp → embed).
Phase 2.4 added to roadmap.
2. Re-ask unanswered open questions. Backoff schedule (3d → 7d → 21d →
60d) tracked in GraphDB per question. Surface ONE question per day
in the morning digest, but only when the digest is otherwise short
(capacity guard < 800 chars). User reply parsed → question auto-
resolved → docs/11 diff proposed (Phase 6.4 hook). New commands in
docs/05: #nexa:digest, #nexa:remind, #nexa:answered. Phase 5.3 added.
UNAS Pro details from the UniFi Drive dashboard:
- It's a Ubiquiti UNAS Pro (UniFi Drive 4.1.16 on UniFi OS 5.0.17),
SFP+, RAID 6, 19.96 TiB raw, 2.05 TiB used. Recorded in CLAUDE.md.
- SMB native paths: smb://192.168.1.31/<share> (mac) / \\192.168.1.31\
<share> (win). UniFi recommends SMB as the modern path — matches our
decision to default Nexa volumes to SMB.
- ⚠️ Storage-pool snapshots NOT configured ("Click to Setup"). Added as
optimization #38: highest-leverage data-protection change in the
homelab right now. Daily + weekly UniFi Drive snapshot, native, no
agent. RAID 6 doesn't protect against rm -rf or accidental mass-
delete; snapshots do.
- #39: Nexa workflows that mutate large state can use the same native
snapshots for fast rollback (pre-snapshot → operate → verify).
Decision (Q15 resolved): start with text-only via TEI + bge-m3 in Phase 3.1,
prepare data shapes so Phase 3.2 (visual collection via infinity + jina-clip-v2)
is a pure additive operation — no rename, no schema migration, no n8n rewiring.
Concretely:
- Qdrant collection renamed nexa_knowledge → nexa_knowledge_text (1024-dim
for bge-m3) with modality-aware payload (modality, source_type, media_uri,
graph_iri, content_hash, context). Visual placeholder schema committed
alongside (qdrant_schema_visual.json, 768-dim, jina-clip-v2).
- Image attachments captured in 3.1 are recorded in GraphDB as nexa:Note with
nexa:modality "image" + nexa:pendingVisualIndex true; the 3.2 backfill
workflow picks them up and embeds. No data lost between phases — the queue
is the GraphDB itself.
- RDF schema (docs/08) gains nexa:modality, nexa:mediaUri,
nexa:vectorCollection, nexa:pendingVisualIndex from day one.
- docs/02 roadmap split: 3.1 = text RAG (Path A), 3.2 = visual collection
(Path C), 3.4 = Ontotext GraphDB.
- docs/09 grows a "Phase add-on: visual collection (Phase 3.2)" section with
the TEI→infinity swap, second collection create, LiteLLM second model
registration, and the SPARQL-driven backfill query.
- New open questions: Q16 (queue ergonomics + does SAIA already proxy an
embed model?), Q17 (reuse Immich's CLIP for photo-library queries?).
- docs/03 + CLAUDE.md updated so future runs use the new collection names
and don't re-decide the staging.
- Q1 → Ontotext GraphDB (SPARQL). docs/08 fully rewritten with RDF schema,
example SPARQL queries (transitive deps via property paths, time-windowed
topic counts, cross-pillar joins via nexa:vectorId).
- Q2 → reuse qdrant_scientific with nexa_* collection prefix; docs/09 step 2
now points there explicitly.
- Q3 → no OpenAI embeddings. Self-host on the docker host. Use TEI
(HuggingFace text-embeddings-inference) — single Rust binary, ~500 MB image,
OpenAI-compatible — instead of Ollama, since we only need embeddings.
- docs/09 Phase-3.4 add-on simplified to a single Ontotext compose snippet
(Neo4j option dropped) plus repo creation curl.
- docs/11 Q3 marked resolved; new Q15 picks the model (bge-m3 vs nomic-embed)
and adds the open question of whether SAIA already proxies an embedding
model that would let us skip TEI entirely.
- docs/03 + CLAUDE.md updated with the new decisions so future runs don't
re-litigate.