You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Changed
Semantic search is much faster on indexes embedded since 2.7. Each vector search used to re-check the whole vector index against the stored embeddings, which took about 17 seconds on a 17,600-chunk index; it now takes about 70 ms unscoped and less when scoped to a collection or filter. On that index gno vsearch and gno query --fast dropped from about 20 seconds to about 2 seconds as one-off commands (most of it model loading) and about 0.2 seconds through MCP or gno serve; balanced gno query went from about 78 seconds to about 6 seconds one-off and 2-3 seconds with models loaded. Results are unchanged: filters still apply before the top results are picked, and a stored vector is used only while it matches its chunk's current text and title.
The gno agents block (v4) and the gno skill now send any natural-language question to gno query --fast first, keep gno search for exact identifiers, quotes and error text, and retry with balanced gno query before diagnosing or falling back to grep. Run gno agents update and gno skill install --force to pick up the new guidance. The MCP gno_query, gno_search and gno_vsearch tool descriptions steer the same way, and the skill's timing table carries measured numbers.
Hybrid search (gno query, MCP gno_query, REST /api/query, SDK query) now fuses keyword and semantic results by document instead of by chunk. Keyword search ranks whole documents while semantic search ranks passages, so a document found first by both used to have its votes split across two weaker candidates; now each result list counts a document once, at the rank of its best passage. On GNO's judged retrieval cases with the real models this raised nDCG@10 from 0.973 to 0.990 and recall@5 from 0.956 to 1.000, with four cases better and none worse. --explain reports fused documents.
Answers from gno ask (and its MCP, REST and SDK forms, verified or not) are generated with today's date and each source's content date (its frontmatter or record date; never the file's modification time), so questions about time, recency or order can be answered from the sources.
Added
bun run bench:vector-search times one vector search (unscoped, collection-scoped, metadata-filtered) on a seeded synthetic index or a copy of a real index.
bun run eval:ranking-ablation compares ranking variants on the judged retrieval cases with real expansion, vector and rerank stages.
gno metadata lists the typed metadata keys your documents carry, with their types, how many documents carry each, and the most common values (--collection, --values). The same summary is MCP gno_list_metadata, REST GET /api/metadata and SDK listMetadata, so an agent can see which keys exist before writing a filter.
Fixed
A memory fact that a newer fact superseded no longer looks current outside recall. Search, vector search, hybrid query, get, multi-get, ask citations and Context Capsule evidence now carry supersededBy with the current fact's URI (text output prints a Superseded by: line; gno get prints it on stderr so piped content stays exact); the answer model is told not to present a superseded fact as current; and verifying a saved Capsule that cites a fact superseded since reports that evidence as stale (superseded).
gno ask --verify rejects a claim that misquotes its source. Every quoted passage (double or single quotes, even one word) must appear in the cited evidence (whitespace, quote style and case aside); otherwise the claim is uncertain with quote_not_in_evidence and the answer abstains, even when the semantic judge accepted it.
A collection whose folder is missing during a sync (an unmounted drive, an offline Google Drive or other sync folder, a network share that is down) no longer loses its documents. gno update, gno index, the gno serve / gno daemon watcher and targeted syncs used to treat the missing folder as empty and mark every document inactive, so search returned nothing for that collection until the folder came back; gno cleanup in that window could then remove their content. They now keep the documents and print [SOURCE_AVAILABILITY_UNKNOWN] Collection root could not be resolved (...) with the path and the original error, without needing --verbose. A folder that exists but is empty still counts as empty.
MCP tools reject argument names they do not declare and name the offending key. A misspelled key such as derived_from on gno_remember or colection on gno_search used to be dropped silently, so a remember could skip its receipt check and a search could run across every collection. Each tool's input schema now advertises additionalProperties: false.