<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Engrava Changelog</title><description>Published releases of Engrava, synced from the public GitHub Releases of sovantica/engrava.</description><link>https://engrava.ai/</link><language>en-us</language><item><title>v0.6.0</title><link>https://github.com/sovantica/engrava/releases/tag/v0.6.0</link><guid isPermaLink="true">https://github.com/sovantica/engrava/releases/tag/v0.6.0</guid><description>0.6.0 stops hybrid search from silently dropping its keyword arm, takes archived thoughts out of default retrieval, raises a typed error on a wrong-dimension query vector, and adds three opt-in extension points. It migrates the database schema (user_version 18 → 20), and if you w…</description><pubDate>Mon, 10 Aug 2026 22:49:48 GMT</pubDate><content:encoded>&lt;p&gt;0.6.0 stops hybrid search from silently dropping its keyword arm, takes archived thoughts out of
default retrieval, raises a typed error on a wrong-dimension query vector, and adds three opt-in
extension points. It migrates the database schema (&lt;code&gt;user_version&lt;/code&gt; 18 → 20), and if you wrote your
own embedding provider there is one thing to check: &lt;code&gt;dimension&lt;/code&gt; has to be public. Details below.&lt;/p&gt;
&lt;h3&gt;What changed for you&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Hybrid search keeps its keyword arm on hard queries.&lt;/strong&gt; A quoted phrase, a wildcard, or a bare
boolean operator used to produce an FTS5 &lt;code&gt;MATCH&lt;/code&gt; expression that failed, and the BM25 arm was
dropped without a signal — the query still returned vector results, so the loss was invisible. Those
expressions are now quoted or normalized, a failed first attempt is retried through bare-query
normalization before the arm is dropped at all, and every first-attempt failure increments
&lt;code&gt;fts_match_failure_count&lt;/code&gt;. This is a correctness fix to which arms run, not a change to how results
are ranked.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Archived thoughts leave default retrieval.&lt;/strong&gt; &lt;code&gt;search_similar&lt;/code&gt;, &lt;code&gt;search_fts&lt;/code&gt;, &lt;code&gt;search_hybrid&lt;/code&gt; and
&lt;code&gt;recall&lt;/code&gt; now exclude &lt;code&gt;LifecycleStatus.ARCHIVED&lt;/code&gt; rows unless you pass &lt;code&gt;include_archived=True&lt;/code&gt;.
&lt;code&gt;list_thoughts&lt;/code&gt; and &lt;code&gt;count_thoughts&lt;/code&gt; are unchanged. If your application relied on archived rows
coming back from &lt;code&gt;recall&lt;/code&gt;, account for that before you deploy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wrong-dimension query vectors fail loudly.&lt;/strong&gt; &lt;code&gt;search_similar&lt;/code&gt; and the vector arm raise
&lt;code&gt;VectorDimensionMismatchError&lt;/code&gt; instead of raising an incidental &lt;code&gt;ValueError&lt;/code&gt; or returning an empty
list. Empty, all-zero and non-finite vectors still return an empty result rather than raising, and
increment &lt;code&gt;vector_arm_degradation_count&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edges carry metadata.&lt;/strong&gt; &lt;code&gt;link_thoughts&lt;/code&gt; accepts an arbitrary metadata mapping and the edge reads
return it. Schema step 18 → 19; existing edges read back &lt;code&gt;metadata == {}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A second recency axis.&lt;/strong&gt; Recency can now score on transaction time with a caller-supplied &lt;code&gt;now&lt;/code&gt;,
alongside the existing cycle-based mode. Existing behaviour is the default; the new axis is opt-in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inverted validity intervals are rejected.&lt;/strong&gt; A &lt;code&gt;valid_from&lt;/code&gt; later than &lt;code&gt;valid_until&lt;/code&gt; is refused at
write time rather than stored, where it would quietly skew the as-of queries that read it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Memory hygiene archives less eagerly.&lt;/strong&gt; A thought must now be inactive for a minimum age before
it is eligible at all, and a run archives nothing unless the candidate pool carries actual evidence
of use — a read, a confirmation, or an action outcome. Cycle-recency and confidence do not count,
because they exist on every store: on a bulk import with no usage history they would let ingest
order alone decide what gets evicted. Permanently collecting a hygiene-archived thought also waits
out a wall-clock restore window (schema step 19 → 20 adds &lt;code&gt;thought.archived_at&lt;/code&gt;). If you enabled
hygiene on 0.5, omitted fields resolve to a seven-day minimum age and a 30-day
restore window — review them before the first 0.6 run. Rows archived before the upgrade have no
wall-clock stamp and fail closed: they are not auto-collected while the window is active.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Extension points.&lt;/strong&gt; Three, all opt-in. A &lt;strong&gt;derived-records&lt;/strong&gt; seam, where an extension produces
records from the thoughts you write, plus a &lt;code&gt;derive_existing()&lt;/code&gt; backfill so a store that already
holds data can be brought up to date rather than only deriving from here on. A &lt;strong&gt;structural split&lt;/strong&gt;
producer with two dependency-free modes — split on a configurable blank-line boundary (the default,
and the previous behaviour byte for byte), or fixed windows measured in characters or words with
optional overlap. And a &lt;strong&gt;cycle-provider&lt;/strong&gt; seam: you supply the cognitive-cycle counter the store
stamps records with, and the new &lt;code&gt;max_cycle()&lt;/code&gt; accessor reports the store&apos;s high-water mark across
thoughts and edges, so a consumer can resume its own counter after a restart. Migrating a store does
not enable any of them.&lt;/p&gt;
&lt;h3&gt;Upgrading from 0.5&lt;/h3&gt;
&lt;p&gt;This is a &lt;strong&gt;schema-changing minor upgrade&lt;/strong&gt;. Back up the database, stop the 0.5 workers, let one 0.6
process run &lt;code&gt;ensure_schema()&lt;/code&gt; (or &lt;code&gt;engrava migrate&lt;/code&gt;) to completion, then start the 0.6 workers. Do
not run 0.5 and 0.6 workers against one file across the migration. Both steps only add columns — no
table is dropped, and no value you wrote is rewritten.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An edge you set to &lt;code&gt;decay_multiplier = 0.0&lt;/code&gt; may already read &lt;code&gt;1.0&lt;/code&gt;.&lt;/strong&gt; On 0.5 the column stored the
value you wrote, but the decode tested it for truthiness and handed back the &lt;code&gt;1.0&lt;/code&gt; default — and
because &lt;code&gt;update_edge&lt;/code&gt; rebuilds the record from that read, any later change to such an edge, including
an &lt;code&gt;invalidate_edge&lt;/code&gt; closing its valid-time interval, persisted &lt;code&gt;1.0&lt;/code&gt; over the stored &lt;code&gt;0.0&lt;/code&gt;. 0.6
decodes on presence, so &lt;code&gt;0.0&lt;/code&gt; round-trips as written. &lt;strong&gt;The migration does not undo what 0.5 already
overwrote&lt;/strong&gt; — it only adds columns, as above; where a 0.5 update replaced a stored &lt;code&gt;0.0&lt;/code&gt;, the database
holds &lt;code&gt;1.0&lt;/code&gt; and 0.6 reads that back faithfully. If you set &lt;code&gt;0.0&lt;/code&gt; deliberately, re-check those edges
after upgrading. Full note:
&lt;a href=&quot;https://engrava.ai/docs/getting-started/upgrade-to-0-6/&quot;&gt;Upgrade to 0.6&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you wrote your own embedding provider, read this one.&lt;/strong&gt; &lt;code&gt;EmbeddingProviderProtocol&lt;/code&gt; has always
required a public &lt;code&gt;dimension&lt;/code&gt;, but 0.5 read it at exactly one site off the query path — so a
provider that kept the value privately (&lt;code&gt;self._dimension&lt;/code&gt;, no public property) worked for as long as
nothing called &lt;code&gt;verify_embedding_model()&lt;/code&gt;. 0.6 reads it before every vector search that has to ask
the provider — a &lt;code&gt;sqlite-vec&lt;/code&gt; backend is consulted first and takes the dimension from its own &lt;code&gt;vec0&lt;/code&gt;
table, so that configuration never reaches the provider read. Everywhere else, such a provider now
raises &lt;code&gt;EmbeddingProviderContractError&lt;/code&gt; naming the class and the missing member. The fix is a
property:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;@property
def dimension(self) -&amp;gt; int:
    return self._dimension
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The check is lazy — construction still succeeds, and a store that never searches by vector is
unaffected — so call &lt;code&gt;verify_embedding_model()&lt;/code&gt; after construction if you would rather fail at
startup. We hit this in one of our own integrations.&lt;/p&gt;
&lt;p&gt;Full notes, including both migration steps and the behaviour changes above:
&lt;a href=&quot;https://github.com/sovantica/engrava/blob/v0.6.0/docs/upgrade.md#05---06&quot;&gt;Upgrade guide, 0.5 → 0.6&lt;/a&gt;
· &lt;a href=&quot;https://github.com/sovantica/engrava/blob/v0.6.0/docs/known-limitations.md&quot;&gt;Known limitations&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;engrava-mcp&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;engrava-mcp&lt;/code&gt; 0.6.0 ships alongside this release and &lt;strong&gt;moves&lt;/strong&gt; its engrava range to
&lt;code&gt;&amp;gt;=0.6,&amp;lt;0.7&lt;/code&gt; — 0.5 is dropped, so upgrade both together. The server surface becomes 13 tools, 3
resources and 3 prompts: &lt;code&gt;get_edges&lt;/code&gt; and &lt;code&gt;list_edges&lt;/code&gt; close the write-but-can&apos;t-read asymmetry on
edges, &lt;code&gt;link_thoughts&lt;/code&gt; accepts edge &lt;code&gt;metadata&lt;/code&gt;, &lt;code&gt;search_memory&lt;/code&gt; accepts &lt;code&gt;recency_now&lt;/code&gt;, and
&lt;code&gt;metadata_equals&lt;/code&gt; / &lt;code&gt;metadata_in&lt;/code&gt; filters are available on the wire.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pip install --upgrade engrava&lt;/code&gt;&lt;/p&gt;&lt;h3&gt;Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;add derived-records extension seam (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/c9d55cb1cb6dbcbd980078994b59819f07daacca&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;core:&lt;/strong&gt; add derive_existing() backfill for the derived-records seam (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/1c79611490a179b9b141ca685a48e76c22a4c3b9&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;core:&lt;/strong&gt; add opt-in cycle-provider seam and max_cycle accessor (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/29d46e58afcbd371229654aeba9605ff3f6f88ea&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;edges:&lt;/strong&gt; add generic metadata carrier with schema v19 migration (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/08a4cb3c9923f304bce3011050c95846598308a1&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;extensions:&lt;/strong&gt; add zero-dependency split modes to StructuralSplitProducer (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/320b88e0cb9f66981f51abd5b48c4f389167ead8&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;hygiene:&lt;/strong&gt; add a wall-clock restore window before permanent GC (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/35c276997a47b1091e56a62425132329c8e5eca9&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;hygiene:&lt;/strong&gt; guard archival behind a minimum inactivity age and a usage-signal gate (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/0ce64b74e91d3ee270c9ecb4d480d6b621f7491d&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;search:&lt;/strong&gt; add transaction-time recency axis with caller-supplied now (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/49f8c9b8141bbff07f4fb6a7bbfb377d5f069abe&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;search:&lt;/strong&gt; exclude archived thoughts from default retrieval (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/963e60c32e222f52f2d05d9eb443fc2e4d214e87&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;search:&lt;/strong&gt; reject wrong-dimension query vectors and count vector-arm degradation (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/fe128f1161309d700ccb6e3860daaac489d521e4&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Bug Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;cli:&lt;/strong&gt; cover the expiry sweep and report an unreadable snapshot (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/4ab31e4a01aa174ecb1432d152ae22342d79c304&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;cli:&lt;/strong&gt; give an invalid --service name a distinct, clean error (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/5f5372d4408b7836ce72004e4f824e0d60cd2556&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;cli:&lt;/strong&gt; purge the vector index when gc collects a thought (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/44c6ffc956340387b675a431458c7863bf1106a3&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;cli:&lt;/strong&gt; validate a resolved empty or default service name (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/6318f98c564bd20a3cc1cf40be45fdc450aeedc1&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;cli:&lt;/strong&gt; validate snapshot-restore input against a typed model and restore atomically (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/d35dc5b4bd56635f766f10198b7cbfbb484ba679&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;close Free audit source follow-ups (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/d919d85e43de1eaae5fce953b684446aa97f58fd&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;config:&lt;/strong&gt; enforce uniform validation across sections and construction paths (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/97a9af7d0ddd31fe050e033bea5b7a23c4ffa2b5&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;config:&lt;/strong&gt; make the validated value the value that gets used (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/e1d7d003b4cb5bbebdc0d2a2e1801fdd1378d56f&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;config:&lt;/strong&gt; use assign-to-variable message in unknown-key rejection (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/69bce4e0b205cfa36c040def917296b573775097&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;core:&lt;/strong&gt; reject inverted valid_from/valid_until intervals (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/dd9305febd4e2d85a4c4c06f0f90d1fc504fa6b0&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;dreaming:&lt;/strong&gt; propagate real integrity failures during edge creation (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/79241c239f06f17a12430fa8097d467b20fad9a7&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;embeddings:&lt;/strong&gt; name the provider member a search needs instead of failing on it (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/5e461f65ae905c2ba2c56947834e41e4c5140790&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;infra:&lt;/strong&gt; harden core bootstrap and edge integrity classification (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/be054f665422580a032dc4b928d61ca73cd14add&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;infra:&lt;/strong&gt; keep foreign-key enforcement safe on every swap failure path (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/c39398044774293c6ce1ac34ce3bd74a656571b7&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;infra:&lt;/strong&gt; make the v11-&amp;gt;v12 child-table swap atomic via a savepoint (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/7b9a1d0603d69c99912569b0ca2c229952225169&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;infra:&lt;/strong&gt; write only the fields an update owns (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/9d721252d6408b6fc4e4eb64af1b05c28079dba4&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;journal:&lt;/strong&gt; reclaim per-connection append locks with a weak-key registry (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/412dcd8cca67bcff33fd3764cc765b0371fb0840&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;mindql:&lt;/strong&gt; build the passthrough guard on a value the module owns (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/6e8db02c1b98b8f30a76d205f016e114f836edb8&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;mindql:&lt;/strong&gt; validate identifiers where the query is executed (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/d4d811130cd1e0f3bd57ab2707164fc930a10be6&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;read-only:&lt;/strong&gt; capability-separate the read-only view from the core protocol (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/1033a2e8932d92d2944e305d819a1d46a0cd64cd&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;search:&lt;/strong&gt; keep FTS5 MATCH valid so quoted and wildcard queries never silently drop BM25 (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/5c99b88a5ec4582c099ed9e767b48b90038a65a0&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;search:&lt;/strong&gt; quote exposed FTS5 boolean operators so bare queries never lose BM25 (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/ad7ec8583e68ed4cba530aca3de31e6f2383302d&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;sqlite:&lt;/strong&gt; harden core migration registry (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/5c9ec9189f27f3a9a7996560ac839af66cae15ee&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;sqlite:&lt;/strong&gt; harden extension migration identity and statement splitting (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/cfc5e9533c869ab96e2c5b7dc701de6eaa1049dc&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title>v0.5.0</title><link>https://github.com/sovantica/engrava/releases/tag/v0.5.0</link><guid isPermaLink="true">https://github.com/sovantica/engrava/releases/tag/v0.5.0</guid><description>remove the in-tree MCP server (now the standalone engrava-mcp package) — action-outcome feedback loop and mutable action lifecycle — add opt-in deterministic memory-hygiene forgetting loop — batch/get-or-create write primitives and embed-failure visibility — opt-in typed provenan…</description><pubDate>Wed, 08 Jul 2026 21:19:31 GMT</pubDate><content:encoded>&lt;h3&gt;Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;remove the in-tree MCP server (now the standalone engrava-mcp package) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/1417e91&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;action-outcome feedback loop and mutable action lifecycle (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/2008a3f&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add opt-in deterministic memory-hygiene forgetting loop (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/9167948&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;batch/get-or-create write primitives and embed-failure visibility (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/e9c2021&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;opt-in typed provenance-context capture at create_thought (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/b8b8fa3&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;activate consolidation — reachable scoring + live access substrate (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/5114f81&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;opt-in asymmetric query/document prefixes (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/12e61fb&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;expose hash-chain verification via API, CLI, and on-open gate (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/b26f519&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;read-surface ergonomics — IN, boolean WHERE, ORDER BY, OFFSET, EXPLAIN, bound SELECT (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/eca5a74&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add collapse_key de-fragmentation to hybrid retrieval (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/6c80277&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add metadata and visibility filters to ranked retrieval (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/a56fcc7&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add opt-in per-unit retention depth for collapse backfill (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/e72cd22&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;batch read-path decode, inbound edge index, eviction visibility (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/0e1b81f&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Bug Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;use absolute GitHub links in README so PyPI does not 404 (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/acf56bf&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add opt-in cold-start clustering fallback (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/35aedab&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;make archived thoughts restorable to ACTIVE (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/88c2e3e&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;apply filters/visibility in the query-less fallback arm (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/2f0640e&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;correct the sqlite-vec backend — purge deleted vectors, fill top_k (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/d884052&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;neutral midpoint for the degenerate min-max fusion case (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/815f23b&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Maintenance&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;gitignore *.pem so publishing keys are never committable (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/dca2bf1&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;extend commitlint scope allowlist and sync docs/scopes.md (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/b83e544&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;bump actions/checkout from 5 to 7 (#32) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/53e5fcb&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;bump actions/create-github-app-token from 2 to 3 (#31) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/dfd213f&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;list Engrava on the official MCP Registry (server.json + OIDC publish) (#33) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/fbf6a18&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;remove the stale in-tree MCP registry artifacts (#42) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/1716c01&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;switch MCP Registry namespace to ai.sovantica (DNS auth) (#38) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/3511808&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;ignore the mcp-publisher binary (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/9412ce3&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;cover non-terminal verification no-op and mixed-mean exclusion (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/9fb0989&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;drop stale .consolidate phantom-guard entry (real since dreaming activation) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/77c0cd3&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;execute or behaviour-assert every example; register compile-only blocks (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/1531ed6&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;cover 6th-signal activation e2e and access-flush journal exclusion (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/537502e&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;cover access-buffer cap/FIFO-eviction invariants (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/df0f2e4&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;cover cold-start clusters under content-quality gating (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/49bc7bd&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;cover require_embedding on the update_thought re-embed path (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/66d1947&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;assert restore journals UPDATE_THOUGHT; document canonical path (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/fcb4f67&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;drop the SQLite-planner-formatting-dependent plan substring (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/520681c&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;cover empty-IN filter starvation end-to-end (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/27a0ef3&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;cover filter x reflection-cap composition (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/fb40cbc&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;cover scoped metadata-filtered retrieval (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/893e66e&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;strengthen collapse x reflection-cap backfill assertion (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/1ca1daf&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;pin cross-backend tie-break determinism at the backend boundary (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/22bac37&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;distinguish the UPDATE_ACTION journal string from the enum (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/a3c84ba&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;document dreaming activation — consolidate() and access tracking (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/49d673a&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;document the provenance-capture API (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/ba12027&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;fix post-0.5.0 drift — drop removed-MCP refs, correct scoped-retrieval claims (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/6cc8cbb&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;note UPDATE_ACTION in the journal append docstring (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/27c94bd&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;scope audit-trail and dreaming claims to their real boundaries (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/0612cb1&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;document restore_thought and scoped retrieval params (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/1345ded&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;curate 0.5.0 Unreleased block and mark MCP removal breaking (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/5cf3a78&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;remove the dead manual Unreleased section (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/ff70668&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;disclose that verify_journal cannot detect tail truncation (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/657c884&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;document the filtered vector-arm trade-off and clarify the bypass rationale (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/c9a2a82&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;align package description with the honest journal claim (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/de1fa58&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;quote extras in install commands so zsh does not glob (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/32584bb&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add the whole-turn assembly caller-side recipe (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/6c3339c&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;document scoped retrieval and the ranked-path filter (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/cf0ab8f&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;clarify resolve-test intent and batch-embed failure id (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/d066552&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;confine fallback filter SQL to a private method (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/465d076&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;filtered vector-arm performance note into v0.5.0 (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/a5cbdeb&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;scoped metadata-filtered ranked retrieval into v0.5.0 (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/8743c7e&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;exempt dependabot commits from commitlint body-length (#36) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/462d468&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;exempt dependabot commits from commitlint body-length (#36) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/2d391ee&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;cap numpy &amp;lt;2.3 to keep mypy --strict green at the 3.11 target (#34) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/91be8d4&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;cap numpy &amp;lt;2.3 to keep mypy --strict green at the 3.11 target (#34) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/dea6be6&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;the in-tree MCP server is removed from engrava. The engrava[mcp] optional-dependency extra, the in-engrava engrava-mcp console script, and the in-tree server module are gone; a plain &apos;pip install engrava&apos; is unaffected. The server moved to the standalone engrava-mcp package (uvx engrava-mcp), which consumes engrava&apos;s public API. Migrate per the docs/upgrade.md 0.4 -&amp;gt; 0.5 notes.&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title>v0.4.0</title><link>https://github.com/sovantica/engrava/releases/tag/v0.4.0</link><guid isPermaLink="true">https://github.com/sovantica/engrava/releases/tag/v0.4.0</guid><description>add bi-temporal valid-time to thoughts and edges — add temporal query predicates and invalidate primitive — reflections inherit temporal extent from members — add remember() and recall() convenience methods on the store — add delete_thought and delete_edge tools — add guided memo…</description><pubDate>Thu, 18 Jun 2026 20:07:18 GMT</pubDate><content:encoded>&lt;h3&gt;Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;add bi-temporal valid-time to thoughts and edges (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/456bcb6&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add temporal query predicates and invalidate primitive (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/86de77f&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;reflections inherit temporal extent from members (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/8fba769&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add remember() and recall() convenience methods on the store (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/be9b110&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add delete_thought and delete_edge tools (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/84b87f6&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add guided memory prompts (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/1f6fa36&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add MCP server with read tools (engrava[mcp] extra) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/68a8085&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add memory filters and pagination (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/57357b7&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add write tools, opt-in read-only mode, and per-tool safety annotations (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/79d7604&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;expose memory as resources (thought, stats, recent) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/c54dcf7&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;map known failures to typed, actionable tool errors (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/8b615cc&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add store-level execute_mindql entry point (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/1c8ffb4&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Bug Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;assert plan-shape invariant for temporal queries, not scan-vs-index (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/0e4e176&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;embed full thought content without duplication or silent truncation (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/36e08e7&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;keep quoted MindQL values as strings and reject malformed conditions (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/d88043d&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;let natural-language queries reach the full-text index (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/bb6b729&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;match exact table token in query-plan helpers (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/cd4ecc2&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;retry transient errors with bounded backoff (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/897c46f&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;keep query_memory parse errors FIND-only (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/5f4ea20&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;map write-tool errors and complete the 0.4.0 documentation (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/6794436&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Performance&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;tune sqlite pragmas and add hot-path indexes (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/1256303&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Maintenance&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;add secret scan + dependency audit; verify wheel data on publish (#22) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/7cfaec3&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;align branch-name guard allowed types with BRANCHING.md (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/a7f3e98&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;allow semantic-version release and hotfix branch names (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/26261b4&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;cache HuggingFace models and pip to stop HF 429 (#20) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/e43f3cc&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;use GitHub App token for semantic-release push to protected dev (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/1a282bd&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;ignore merge commits in commitlint via JS config (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/3d54f61&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;run CI on dev branch as well as main (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/d28ace2&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add bi-temporal model guide and 0.3 to 0.4 upgrade notes (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/036e225&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;bring architecture + CLI docs up to 0.4.0 (bi-temporal + MCP) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/cd5df19&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;capitalize the Engrava brand name in README prose (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/1254830&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;correct mindql, extensions, extension-hooks, and configuration examples (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/54149ef&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;correct README, quickstart, and api-reference examples to match shipped API (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/36cf61d&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;correct reflection_boost default to 1.0; add test verifying documented config defaults (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/d42a852&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;document percept/utterance/thought metadata helpers in api-reference (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/2e80d04&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;drop reference to non-existent purity-check script in CONTRIBUTING (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/59dcf5d&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;expand and correct the engrava documentation set (#17) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/2c3fa82&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;fix 0.4.0 drift found in the full doc audit (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/bb5dff1&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;fix quickstart cycle note — remember() takes no created_cycle; use ThoughtRecord for write-sid (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/8c00368&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;lead quickstart with remember()/recall() short path (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/edfe620&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;lead README Basic Usage with remember()/recall() (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/3f415e2&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;list all installable extras in README (mcp + ollama/hf embeddings); note dreaming needs no ext (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/c55f0ad&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;trim README Basic Usage to the core create-and-read example (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/b2bf7bf&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add MCP server guide and client-config examples (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/b2bc18b&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;align branching guide with dev release-trigger model (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/7619127&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;de-reference internal principle name in doc-test rationale (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/ed8b184&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;drop no-op &apos;dreaming&apos; extra (empty deps; dreaming is in the base install) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/c6fa946&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;raise pydantic floor to &amp;gt;=2.11 (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/d7eaff0&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add documentation-example test suite (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/75b977e&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;add functional contract suite for search behavior (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/862e7bc&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;bound temporal query overhead and confirm index use (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/035e860&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;isolate subprocess examples (offline, single-thread, no stdin) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/c3cf339&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;pin native thread pools session-wide to stop full-suite hang (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/3a0eaa3&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;execute the tutorial end-to-end and a search round-trip (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/730c2bb&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;back-merge main into dev after v0.3.0 release (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/4769d22&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;back-merge main into dev after v0.3.1 release (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/40e45b6&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;switch release-trigger branch from main to dev (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/cd2bb24&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;bump actions/cache from 4 to 5 (#25) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/c84fb8f&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;bump actions/setup-python from 5 to 6 (#26) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/0a69457&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title>v0.3.1</title><link>https://github.com/sovantica/engrava/releases/tag/v0.3.1</link><guid isPermaLink="true">https://github.com/sovantica/engrava/releases/tag/v0.3.1</guid><description>load sqlite-vec extension on the connection&apos;s worker thread — re-disable extension loading in finally after load attempt — point documentation url to engrava.ai/docs</description><pubDate>Tue, 02 Jun 2026 20:21:37 GMT</pubDate><content:encoded>&lt;h3&gt;Bug Fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;load sqlite-vec extension on the connection&apos;s worker thread (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/457d2f7&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;re-disable extension loading in finally after load attempt (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/e9ab267&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Maintenance&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;point documentation url to engrava.ai/docs (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/aeeb3cb&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title>v0.3.0</title><link>https://github.com/sovantica/engrava/releases/tag/v0.3.0</link><guid isPermaLink="true">https://github.com/sovantica/engrava/releases/tag/v0.3.0</guid><description>graph memory database — dreaming consolidation, hybrid search, audit trail — add on-demand smoke-gate workflow (#10) — automated release pipeline — quote semantic_version input to fix release workflow startup — skip branch-name guard for automated dependency PRs (#8) — skip upgra…</description><pubDate>Tue, 02 Jun 2026 09:01:03 GMT</pubDate><content:encoded>&lt;h3&gt;Features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;graph memory database — dreaming consolidation, hybrid search, audit trail (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/ed82259&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Maintenance&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;add on-demand smoke-gate workflow (#10) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/50e2bf2&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;automated release pipeline (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/18c1d68&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;quote semantic_version input to fix release workflow startup (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/2f3c9c3&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;skip branch-name guard for automated dependency PRs (#8) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/b14bb0a&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;skip upgrade smoke test when the baseline is not yet published (#9) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/cc05ed7&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;use semantic-release CLI directly to satisfy actions allowlist (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/0ebf9f1&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;merge dev into release/v0.3.0 (automated release pipeline) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/02d3f05&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;v0.3.0 — first public release (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/8bd705e&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;refresh stale FTS-upgrade fixture and public-export baseline (#11) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/46cab01&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;bump actions/checkout from 4 to 6 (#3) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/840ab88&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;bump actions/download-artifact from 4 to 8 (#7) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/c7ca7cf&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;bump actions/setup-node from 4 to 6 (#6) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/99acddc&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;bump actions/upload-artifact from 4 to 7 (#5) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/7ad3f2f&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;bump softprops/action-gh-release from 2 to 3 (#4) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/9eb3729&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Bump idna from 3.13 to 3.15 (#1) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/f402fd2&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;align metadata and docs with product tagline; add dependabot and issue config (#2) (&lt;a href=&quot;https://github.com/sovantica/engrava/commit/b3bb62d&quot;&gt;commit&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;</content:encoded></item></channel></rss>