Repository navigation
v18.3.0
·
47 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
A review and feature release. The brain format (version: 7) and bf.yaml are unchanged; the reply schemas only gain optional fields and the search cache rebuilds once. Upgrade with uv tool upgrade brain-framework (or update a brain's pin). Run bf skills DIR to update bf-use, and copy the updated example hooks, weekly-review routine and any new sensor into your brain.
Added
bf searchsuggests close words the brain holds for each misspelled word:"suggestions":{"retension":["retention"]}besideunmatched.- A claim names the note or record that owns its target, when exactly one item of its brain does, as
target_refandtarget_title: follow it without another search. bf collect --dry-runreports theadded,updated,unchangedandremovedcounts a collection would commit, and"removal_refused": truewhen the snapshot guard would refuse it, before you pass--allow-removal.bf watchwarns, likebf schedule, when its interval is at least the shortest selectedrefresh, which runs that program late and makesbf statusreport it overdue.- A mistyped
--brainname suggests close registered, enclosing or referenced brain names:did you mean work?. - The example
gmail-headers.pysensor collects Gmail senders, recipients, subjects, labels and dates throughgws, never message bodies, withperson:email/links, agmail-thread:link per conversation and an RFC 2392mid:alias.
Changed
- Writers also lock the brain folder itself: two processes with different
XDG_STATE_HOMEvalues, or two accounts sharing a brain, used to commit at once, and one's recovery could roll back the other's committed records. A filesystem that cannot lock a folder, such as NFS, keeps the state lock alone. - The
weekly-reviewroutine names the projects to review by ref instead of linking them: its links flagged every listed project with newer evidence, so each later review counted the earlier ones. bf initwrites its starter files from the package'sstarter/folder; the generatedAGENTS.mdnow holds one line per paragraph, so the refresh comparison shows every wrapped line once.- A search scoped to an authored folder no longer counts collected sources, and a cache is checked against the layout bf builds in one comparison. Tests run in parallel.
Fixed
bf evalranks expected refs among the first 50 results even when they span several reply pages: a search reply stops at its 32 KiB budget, so a ref at rank 46 among long results read as missing and MRR dropped.- An action's
projectsinclude projects itsACTION.mdlinks by entity, alias or BF address, as each project's backlinks already listed the action; only path links counted. - An identity whose BF address percent-encodes a format character, such as
bf://brain/people/bob%E2%80%8B, is invalid like its raw form: it looked like another subject's address. - A footnote-looking line inside a code fence no longer hides the sections after it: its indented lines closed the fence early.
- Period pages and scopes accept a trailing slash, such as
bf read 2026-09/or--scope 7d/, like folder and tag pages. - A file that failed to read for a reason other than permissions, such as an I/O error on a network mount, is read again on the next refresh instead of staying skipped until it changed; the search cache rebuilds once.
- A cache that another program locks, such as an open
sqlite3shell, names the lock instead of advising to check free space. bf statuslists programs nameddate,time,fieldsorattributeslike any other.bf init,bf skillsand other commands reject an argument that is not UTF-8 as invalid input before writing;initandskillsused to create every file, then fail.- Recovery clears an interrupted record transaction that left one temporary file beside a full journal; every later collection used to fail.
bf watchwaits for and stops its update when the terminal closed while it was stopping, instead of leaving it running.- The bf-use
guarded-write.pyhelper refuses a passage that occurs twice in overlapping positions, as it refuses other repeated passages. - The example hooks and the
weekly-reviewroutine escape control and invisible format characters, asbfreplies do: decoding the JSON restored them, so a shared note's title could reach the agent's context or a review action as hidden text. Copy the updated examples into your brain.