v0.2.0 — Runs unattended
v0.1.0 was read-first and human-gated, but it assumed a human at the keyboard: output was decorated text, a refused write still exited 0, configuration errors surfaced as tracebacks mid-run, and a half-finished ingest could not resume. This release makes the tool safe to hand to a cron job or an agent.
Breaking
kgprints JSON on stdout by default. Pass-H/--humanfor the previous output. Failures go to stderr and never appear on stdout as a success-shaped object.kg proposeenforces the group allow-list. A fact addressed to a groupgraph.groupsdoes not declare is refused with exit code2and is not queued. Reads always enforced this; the write path did not.server.transport: streamable-httprequiresserver.auth.token(16+ characters). An unauthenticated network transport exposed every configured group.- A known embedding model whose width disagrees with
embedder.dimensionsis now a configuration error — for examplenomic-embed-textwith1536. The mismatch was silent and corrupted every embedding it wrote. kg-ingestandkg-workspacealso default to JSON and accept-H.
Added
kg doctor [--offline]— preflight for configuration, workspace, backend, LLM and embedder. The embedder check calls the live endpoint and compares the real vector width against the configured one.kg verify [--offline]— asserts the six read tools are registered, that no write tool is exposed (a negative control), and that live retrieval works.kg export [group ...] [--output PATH]— a backend-independent JSONL snapshot written from the graphiti models. Embeddings are omitted because they are derived from the text, and restoring them under a different model would be silently wrong.reranker:configuration —passthrough(default, no extra model call),bge(local,uv sync --extra rerank),openai,gemini. Upstream ships these cross-encoders; there was no way to select one.config/ollama.example.yaml— a fully local profile: local model, local embedder, embedded Ladybug backend, no API key.- Resumable ingestion via a content-keyed ledger, so re-running a file ingests only what has not landed.
--no-resumeignores it. - Per-record fault isolation in ingestion: one failing episode no longer costs the batch.
--fail-fastrestores the old behaviour;--skip-invalidtolerates malformed lines.
Fixed
kg-workspace drainarchived a proposal even when its ingestion did not succeed, losing it. It now archives only what landed and leaves the rest approved for the next drain.- The proposal queue rejected group names that
graph.groupsaccepts (lowercase-only, no dots). A configurable group is now always proposable. kg doctorreports the resolved absolute Ladybug path.