Repository navigation
v19.1.0
·
19 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
A feature and fix release. The brain format (version: 8) and the reply schemas are unchanged; the search cache rebuilds once on first search or read. Upgrade with uv tool upgrade brain-framework (or update a brain's pin) and run bf skills DIR to refresh installed skills.
Added
- Assistant schedules accept wall-clock
at: "HH:MM"times with optional IANAtimezoneanddays(mon–sun) alongside intervaleveryschedules, passcontext.schedulein{{context}}for scheduled runs, and treat an empty scheduled or triggered reply without output metadata as a silent no-op that advances the schedule without writing an empty record. - Assistants with read-only harnesses can set
idempotent: trueto automatically retry pre-delivery harness failures and interruptions up to 5 attempts with exponential backoff (5sto300s), andbf queue ID --retryresets the retry budget. - Top-level
fields.<name>declarations inbf.yamlaccept an optional default JSON Pointerpath, used when a sensor does not specify an override insensors.<sensor>.fields.<name>. - Sensor, routine, assistant and channel
commandarguments support{{lines:relative/path.txt}}, expanding non-blank, non-#lines from a brain-relative UTF-8 file (up to 64 KiB and 500 lines) into separate arguments and checking the file duringbf validate. - Sensors can set
truncate_text: true(and optionalmax_text_bytesup to 1 MiB) to truncate oversizedrecord.texton a valid UTF-8 codepoint boundary, stampattributes.truncated: trueand log the record ID instead of failing the whole batch. bf.yamlaccepts a top-levelvalidate:policy (max_stale_days,warn_stale_days,index_note,required_statusandforbid_patterns) enforced bybf validate.bf updateruns up to four due sensors concurrently while returningwindowsin configuration order.- Section search passages include the note's filename stem (when distinct from its H1 title) and declared
aliasesin their lexical context, so multi-word queries combining a note's stem or alias with a section's body terms match that section directly. - Zero-result searches record up to 8 unmatched query tokens (up to 64 characters each) in local
usage.jsonl, andbf statussurfaces the top 10 recurringempty_termsin each usage window.
Fixed
- A channel input no longer stops when a provider edits a message it already admitted: the edit keeps the admitted version and starts no job, and the messages after it are admitted. Before, every poll failed with
a channel reused an event id with different contentuntil the edited event expired 35 days later. - Editing an assistant's
schedules,triggers,inputsorkeepno longer fails its queued jobs withassistant configuration changed, and once a harness has answered, only removing or disabling its assistant or changing an output channel stops its saved answer from being recorded. - A harness or channel
sendcommand that never started, such as one not onPATHunder a timer's shorterPATH, leaves its jobfailedinstead ofuncertain, and its delivery retries like an idempotent one instead of waiting asuncertain: nothing ran, so retrying is safe. - An unresolved
bf runno longer holds back the saved answer of a laterbf runof the same assistant: each manual run is its own slot. - With several brains selected, a read's
outlinerefs and a claim'starget_refarebf://addresses, likesections, so reading them no longer fails withreference exists in several brains. - A sensor or routine run that waited 120 seconds for a busy brain no longer waits another 120 seconds to record that failure.
bf registerleaves the registry file, and its inline comments, unchanged when the brain is already registered at the same path.bf channelrejects invalid arguments with exit code 2 before selecting a brain, as every other command does, andbf skillsreports its destination as an absolute path.- The example Calendar, Drive, Gmail, Git and GitHub sensors ignore a Git hook's repository variables, such as
GIT_DIR: started from a hook, the Git history sensor saved the hook's repository commits under every repository's name. - Search, the retrieval example and the link reference say that tags weigh more than body text and less than headings, as ranking does.
Changed
bf-use's guarded-write helper replaces a whole note only from--new-file FILEgiven alone and never reads standard input, which an agent's shell may hold open; its guide writes--old=TEXT --new=TEXTso a passage starting with-stays an argument. Runbf skills DIRto update installed skills.- The Assistants guide's complete example runs Claude Code with the prompt on standard input, as the page recommends for private messages, and Core concepts lists channels among a brain's programs.
- Development tools: uv 0.13.6, dprint 0.64.3 with the Markdown 0.27.1 plugin, trivy 0.76.1, ruff 0.17.3, ty 0.0.94, pytest 9.2.0, zensical 0.0.73, and the workflows pin mise 2026.10.21,
jdx/mise-actionv5.2.4 andpypa/gh-action-pypi-publishv1.14.3. The locked environment moves to starlette 1.10.0, sse-starlette 3.6.0, httpx2 and httpcore2 2.16.0 and pycparser 3.12.