Skip to content

v2.8.3

Choose a tag to compare

@github-actions github-actions released this 27 Sep 22:54
8536cd4

Fixed

  • gno audit links, backlinks, gno links, gno impact and the link graph no longer read quoted prose such as \[-some clause -](see section 4 of the annex) as a link to a file named see section 4 of the annex. As in Obsidian, a [ escaped with a backslash opens no link, and a Markdown link destination with an unescaped space is plain text unless it is wrapped in angle brackets.
  • [x](<my note.md>) now links to my note.md; before, the angle brackets stayed in the target and the link was reported as unresolved. [x](my%20note.md) keeps working, and a link title such as [x](note.md "Title") no longer becomes part of the target.
  • Renaming or moving a note no longer rewrites an escaped \[text](note.md) or [text\](note.md), which are plain text. Link text with balanced brackets, such as [see [1]](note.md), is still updated.
  • The first gno update after upgrading re-reads existing notes once so these rules take effect.
  • A running gno serve or gno daemon now picks up collections added, removed or edited in the config file, by gno collection add/remove or by hand, without a restart. /api/status, MCP gno_status, the watcher and search follow the file before the next request, and an idle daemon picks up the change within about two seconds. Run gno update to index the files a new collection already holds. An unreadable config file now makes requests fail with an error instead of serving the old collections, and a config bound to another index is refused. Other settings, such as models and gateway options, still take effect on restart.
  • gno vec sync and gno vec rebuild failed with "No embeddings found … Run: gno embed" on any index embedded by 2.7 or later, and gno doctor listed no embedding fingerprint groups for such an index. All three read only the old vector table, which the vector partitions replaced. They now work on the active vector partition and report its counts. Indexes that were never re-embedded keep using the old table.
  • gno similar, MCP gno_similar and REST /api/doc/:id/similar now give the same scores for the same document. MCP averaged the vectors of all of a document's chunks, while the CLI, REST and graph similarity edges used the first chunk. All surfaces now use the first chunk, so MCP results for documents with several chunks change.
  • gno changes and the change journal no longer record link additions and removals for files that are not Markdown notes, such as Python scripts, text files or converted documents. GNO has read links only from Markdown notes since 2.8.2. Content changes to those files are still recorded.
  • An extensionless Markdown link such as [plan](Archive/Plan) to a note that exists in the vault but is not indexed is now an informational links.outside-index finding in gno audit links, the same as the wiki link [[Archive/Plan]]. Before, it was reported as a broken link. GNO only checks that the file exists. Markdown links still resolve only by exact path, so [plan](Archive/Plan) to an indexed Archive/Plan.md is still reported as unresolved; write the .md.
  • Indexing a large Excel workbook no longer runs away. A pivot-report workbook with one sheet of 23 columns by 40,439 rows made 2.8.2 run out of memory without writing anything, and 2.8.1 passed 30 GB on the same file. Excel conversion went through an HTML table that grew with the square of a sheet's rows and used about 20 KB per cell; it now builds each sheet's Markdown table directly from the sheet data, in time and memory proportional to its cells. The Markdown is the same as before: it was compared line for line on the test workbooks, including merged cells, hyperlinks, rich text and escaped characters. A generated workbook of the reported shape (930,000 cells, two 15 MB pivot caches) now indexes in about 6 s with a 1.7 GB peak, where 2.8.1 and 2.8.2 both passed a 6 GB cap without writing anything. 2.8.2's new code-span detection also ran the Markdown parser over converted documents, whose table handling slows with the square of a table's cells. Converted documents (PDF, Office, plain text, records) no longer go through the Markdown parser. A Markdown note with a table of more than 5,000 cells is parsed without GFM table rules, which keeps every other code rule; the one difference is that a code span crossing a table-cell pipe, such as `a | b` in a table row, stays whole.
  • A standalone bun build --compile executable can run gno update again. Every file failed with DOMMatrix is not defined (the PDF library cannot start without its native canvas binding), and gno init stopped earlier looking for the node-llama-cpp package. PDF, Word and PowerPoint files now fail on their own with a clear ADAPTER_FAILURE in such a build, while Markdown, text and Excel files index.
  • An unreadable .xlsx file is now recorded as CORRUPT, like a damaged PDF, and is not re-read on every update until it changes. It was a retryable ADAPTER_FAILURE before.

Added

  • Per-file indexing budget. Every file's conversion and the processing after it (metadata, code detection, change journal, chunking, links) now run in a worker under conversion.timeoutMs (default 60 s) and conversion.maxMemoryMb (GNO's resident memory; default half of physical memory, at least 2 GB). A file that overruns is stopped mid-step, recorded as TIMEOUT or MEMORY_LIMIT with the step it was on, and the rest of the collection still indexes; the next update tries it again. Before, the 60 s conversion timeout could not interrupt Office conversions at all. A file still being processed after 10 s is named on stderr by gno update and gno index, and stopped files are listed in gno update output, gno status and the gno audit freshness finding. Indexing 1,000 small notes takes about 5% longer. A standalone compiled executable, which cannot start the worker, does the same work in a child process of itself under the same limits; if neither can start, the file fails with ISOLATION_UNAVAILABLE instead of running without a budget. Stopping GNO (Ctrl-C, SIGTERM, a resident shutdown) stops that child too; on Linux even a SIGKILLed GNO takes it down. See Conversion budget.