v0.46.25.0
The backlog release: 62 community pull requests merged, ~50 maintainer fixes, and 87 open issues closed in one landing. Every pull request was individually trial-merged and tested before inclusion; every fix started from a reproduced bug and shipped with a failing-first test. The headline classes: embedding backfills can no longer quietly destroy vectors (probe-gated invalidation, honest counts, content-revision staleness, registry-aware writes end to end), sync can no longer delete the wrong page or be repointed by a foreign repo, search caching can no longer serve one source's rows to another or one query's rows to a different query, page timelines survive filesystem rebuilds, large piped CLI output is delivered to the last byte on every path, and the DB config plane is finally read at runtime.
Added
- Ops accept an explicit per-call
source_idonget_page/delete_page/restore_page— honored or rejected, never silently ignored. Destructive ops act only within the caller's write authority; federated read grants confer no delete access. gbrain migrate-enginenow copies the facts table and all config rows (minus engine-local keys, printed when skipped) with a per-table copied-count summary — a migrated brain arrives whole.- Doctor warns when
chat_fallback_chainis set but inert. Contributed by @Masashi-Ono0611.
Changed
- Embedding backfills and stale sweeps are honest end to end: a live embedder probe gates any invalidation, a run that nulls vectors but embeds zero fails loudly, updated pages re-embed on content change (not just signature), and
embed_skippages are never invalidated into a permanent hole. - The embedding write path, stale selectors, coverage counts, invalidation, and bootstrap verify all resolve the same active embedding column through the registry — multi-column brains no longer see false 0% coverage or phantom stale loops.
- The sole-non-default source shortcut only routes bare writes when the default corpus is empty, and says so on stderr when it declines — no more silent write hijacks.
Fixed
- 23 community fixes, each trial-merged in isolation and tested before landing: C# file-scoped namespace indexing (@gregario), a $HOME bootstrap guard and unknown-flag rejection on
config setand subagent-loop capability classification and DB-planeeval.*gating and doctor effective-date re-parsing and inert-fallback-chain warning and latest-model cache invalidation (@Masashi-Ono0611), chat probe token floor (@ethanbeard),models.dream.synthesizehonored in concept synthesis (@awilhite), recipe secret-name matching (@rayers), two unregisterable config keys (@JavanC), source-aware backlog drain hints and trigger-only skills dirs (@javieraldape), keyword-arm fail-open in hybrid search (@Jinstronda), wasm-embed check under pipefail and skillpack binary path resolution (@abhiramasonny), conversation-miner facts in verify and thin-client think routing (@mdcruz88), win32 resolve-ipc client gate (@oscampo), stub entity-page types from the active pack (@marmikcfc), image assets by source root and chronicle backfill source ids (@frxiaobei). - Facts fences and page writes now compute the identical target file, and an unresolvable target routes to a DB-only insert instead of being dropped — closing a fact-wipe class. Co-authored with @harjothkhara.
- A facts-only target brain refuses a destructive engine-migration overwrite instead of losing its memory.
Also landed (the full wave)
- 39 further community PRs beyond the first 23, each trial-merged and tested: contributions by @gregario, @Masashi-Ono0611, @ethanbeard, @awilhite, @rayers, @JavanC, @javieraldape, @Jinstronda, @abhiramasonny, @mdcruz88, @oscampo, @marmikcfc, @frxiaobei, @herove-successor accounts and more — every author is credited on their merged PR. The oldest open PR in the repo (June) landed in this pass.
- The remaining P0s: sync delete-by-approximation (a page with a trailing-hyphen path could delete a DIFFERENT page), cross-host page-lock stealing, and stranded manual timeline entries on filesystem-canonical brains.
- Retrieval correctness: the long-standing ranking inversion, a pre-fusion candidate floor so exact matches at rank >20 are reachable at default limits, per-source cache isolation, and a same-text guard so near-identical embeddings (worst in CJK) can't serve one query's cached rows to a different query.
- Serve hardening: per-request MCP transport teardown (multi-GB RSS growth gone), an opt-in event-loop stall watchdog, SIGTERM/SIGHUP cleanup, and default-deny CORS on the auth endpoints.
- Ops honesty:
jobs list/get --json, duplicate timeline entries reportskippedinstead of lyingok, doctor stops recommending a sunsetting reranker default, and CLI output over 64KiB is delivered to the last byte on every emission path — includingconsole.log-shaped--jsonhandlers. - Windows: git sync credentials, msys path healing, and resolve-IPC client gating.
To take advantage of v0.46.25.0
gbrain upgrade should do this automatically. If it didn't, or if gbrain doctor warns about a partial migration:
- Run the orchestrator manually:
gbrain apply-migrations --yes
- Migration v133 adds a content-revision stamp to chunks; no manual action needed. Existing embeddings are grandfathered and re-embed only when content actually changes.
- Verify the outcome:
gbrain doctor gbrain stats
- If any step fails or the numbers look wrong, please file an issue: https://github.com/garrytan/gbrain/issues with the output of
gbrain doctorand~/.gbrain/upgrade-errors.jsonlif it exists.