v0.1 is feature-complete against MY-DAEMON-SCAFFOLD.md's Phase 0–3 spec,
the M1–M4 adaptive-memory milestones, and the project-level acceptance
criteria. The end-to-end pipeline (ingest → retrieve → synthesize → log)
works against a real Obsidian vault, and the daemon envelope around it —
config resolution, atomic state writes, preflight checks, backup/restore,
supervisor, scheduling — is in place. The three background-agent writeback
jobs ship but are gated behind agent.enabled: false until you confirm
their thresholds with --dry-run.
- Phase 0 — Skeleton. Repo,
pyproject.toml, uv setup, ruff + pytest,config.py,models.py, sample test vault,docker-compose.yamlfor Qdrant. - Phase 1 — Ingest pipeline. Vault reader / parser / chunker with
tests; sentence-transformers embedder; Qdrant + NetworkX stores with
persistence;
daemon ingestanddaemon status. - Phase 2 — Retrieval + query. Seed / expand / orchestrator,
Anthropic client, synthesis prompt,
daemon query, SQLite feedback log. - Phase 3 — Incremental + polish. Manifest-based incremental ingest,
daemon graph stats(PageRank + tag degree), README, end-to-end test. - Hybrid retrieval (2026-05-16). Sparse BM42 vectors stored alongside
dense, fused server-side in Qdrant via RRF. Toggle with
embeddings.hybridinconfig.yaml. - Background-agent writeback (2026-05-16). Three new commands:
daemon extract,daemon link,daemon reflect. Shared safety discipline invault/writer.py. Defaults to Haiku 4.5 viallm.batch_model. Tkinter setup window with a Windows Task Scheduler checkbox for daily reflection. - NiceGUI chat (
daemon chat). Streaming responses, brand-aligned dark theme, lazy retrieval pipeline. - Setup window (
daemon setup). Vault picker + API-key persistence. - Adaptive memory loop, M1–M4 (2026-05-17). Adaptive edge weighting from feedback signals; the snapshot mechanism; structural-pattern analysis over frozen snapshots (Louvain communities, edge betweenness); and the observer LLM that reads those reports and writes the user-facing letter.
- Daemon envelope (2026-07-26). Config search order with loud
missing-config failure and config-dir-anchored paths, atomic graph and
manifest writes with an inter-process lock, embedded Qdrant as the default,
daemon doctor,backup/restore, and thedaemon runsupervisor plusdaemon schedule. - API key out of plaintext (2026-07-27). The key resolves environment → OS
credential store → legacy
.env, anddaemon setupwrites only to the credential store, migrating and stripping any plaintext copy it finds. See Getting Started.
In priority order:
- Multi-embedding spaces. A second embedding alongside the semantic one — emotional valence, entity-based, code-vs-prose. Hybrid retrieval already proves the multi-signal plumbing; this just adds another slot.
- Obsidian plugin / file watcher. Live ingest as you save.
daemon runalready watches the vault; the remaining work is the editor-side plugin. - Local LLM for synthesis. For users who want fully-offline operation
end-to-end. The streaming surface already abstracts the provider; a
local-model client implementing
synthesize/synthesize_streamslots in.
The open design question behind all of it: seeds dominate the candidate
pool and seed-picks currently reinforce nothing, so the learning loop closes
mechanically but has little to learn from. Deciding what "picking" should mean
comes before scaling any more learning machinery — see the AI Suggestions
section of PROJECT_MANAGEMENT.md.
- Heavy auth / multi-user. The daemon is intentionally a single-person tool that runs on your machine against your vault.
- A SaaS frontend. Same reason. The brand says "companion," not "service."
- Vault rewriting beyond
## Agent Notesand tags. The agent edits a bounded surface and snapshots before every change. Rewriting prose itself would cross the line from companion to ghostwriter.
From PROJECT_MANAGEMENT.md:
daemon select <feedback_id> <#>for candidate-selection feedback. One CLI flag away. Held back to nail down the signal shape first.daemon query "..." --skip <feedback_id>for "more like these." A second-three-results request. Useful in CLI but the eventual home is the GUI; may not be worth investing twice.daemon graph todosfrom dangling wikilinks. The graph already keeps dangling targets as placeholder nodes. A command that surfaces them is "notes you mean to write" — a feature, not a bug.- Seed the daemon's own vault with a "purpose" note. So when the daemon ingests its own vault, it can answer "why am I building this" in the user's voice.