Repository navigation
Immutable
release. Only release title and notes can be modified.
A feature and review release. The brain format (version: 7) is unchanged; bf.yaml gains the optional silent_after and keep settings, which an older bf rejects, 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 all four skills, and copy the updated example weekly-review routine and gmail-headers sensor into your brain, preserving local adaptations.
Added
- A sensor's
silent_after(seconds) reports a scheduled source that keeps succeeding without a new or changed record:bf statusmarks it"silent": true, andattention, the home page andbf status --checklist it. Freshness proves a successful run, not new evidence: a filter or account drift used to look healthy.bf statusand thememoriespage give each source'schanged, the newest time this brain gained a new or changed record of it. keepbounds generated output. An action routine'skeep: Nremoves its actions older than the newest N while they still hold only theACTION.mdthis machine wrote: an edited report, a folder holding another file and an action written beforekeepstay. A prompt'skeep: Nremoves its oldest run records after each run, never another file of its folder, and never fails a recorded run. Replies count them asremoved.bf statusnames each brain'sruntime: theinstalledbf version and, read as data from the brain'suv.lock, thepinnedone. Agents compare their major versions instead of parsing the lock.bf validatereports an enabled prompt file above the 120,000-byte limit, which every run would reject.- A runnable offline prompt example,
examples/prompts/, usescatas a stand-in harness withrefresh: 0: a piped message becomes a record that search finds. The prompt guide starts with it, and troubleshooting covers failed prompts: JSON output withtext, the 120,000-byte limit on standard input too, skipped scheduled runs, harness sign-in and tool permissions. bf-maintaincovers prompts: declare one with an explicitrefresh(an enabled prompt runs every 30 minutes by default, unlike sensors and routines), atimeoutabove the harness's own limit and atextpointer; test it without a model throughcommand: [cat], then run it once withbf run PROMPT --stdin. It treatsmemories/NAME/records as model output and grants the harness only the tools it needs.- Reads return
backlinks_omitted, the number of relation groups beyond the 64 they preview, counted across the selected brains: more than 64 relations used to drop the rest silently.
Changed
- A program another process is running, such as a manual
bf collectduringbf watch, isskippedinbf updateinstead of failed: watch no longer alerts a failure that run history never records. bf runsuggests close prompt names too:unknown routine or prompt asistant; … did you mean assistant?.- A scheduled prompt that is not due when it takes its lock, because another process ran it or it waits to retry a failure, says so instead of claiming another run just succeeded.
- The four skills are 30% shorter (17,009 → 11,919 words) without dropping a procedure or safety rule: each shared rule lives once, references link the documentation for exact contracts, and long steps are split. They compare
runtime.pinnedwithruntime.installedinbf statusinstead of reading a brain'suv.lock. bf-actiondefines when an action is done: its Outcome is filled and its TODO has no open box. Discovery resumes only open actions, closing resolves every open task, and later work starts a new action linking the done one.- The documentation gives each rule one owner: timing and failure backoff in Watch and schedule, program names in the file formats, ranges in Limits, dry runs and status fields in Commands, scopes and incomplete answers in Retrieval. The README's Try it installs BF and links Getting started; the guides run copied example scripts as executables.
- The example weekly review lists scheduled programs that failed or are late, says when an empty week or coming week may come from a sensor needing attention, and writes a review when attention is its only content.
- Searches, reads and each MCP call no longer check every record file: the cache keeps each
memories/SOURCEfolder's fingerprint and lists only folders that changed, so on a brain of about 50,000 files a warm search checks its cache in about 16 ms instead of 170 ms (in-process timings on one Linux machine). Collection renames records into place, which always changes their folder; a record file edited in place, which collection never does, waits forbf build. Authored folders,bf buildandbf validatestill list every file. - The home page lists projects needing review first in the space
changedused to take:changednames only other notes, in brief (ref,kind,title,dateortime,modified,review), and the 32 KiB budget is measured on the reply as printed. A brain whosechangedlist repeated its projects used to show only one of the projects due for review. - Deep listing pages stop at their window: with one selected brain the offset is skipped in SQL, so a source page at offset 8,000 answers in about 65 ms instead of 300 ms on the same machine, and later pages of a large exact read no longer rebuild its backlinks.
Fixed
bf watchstops a collection whose start a cancellation interrupted, and signals its collection and prompt workers together, once each, so they stop in parallel.bf updatedates its due list once it holds the cycle lock: waiting for another update no longer leaves newly due programs for the next cycle.- A prompt answering a message and a scheduled run of the same prompt no longer overwrite each other's log entries.
- A prompt file above the limit reports
file exceeds 120000 bytesinstead of 120001. bf build --reproject --dry-runcounts changes without holding every reprojected record, and keeps only the failures its reply shows.- Programs no longer inherit
DOTNET_STARTUP_HOOKS,R_PROFILE_USER,LUA_PATHorLUA_CPATH, which load code before the program starts. - The contract check accepts a configuration value that stops listing its allowed values, which widens what files accept, as a minor change.
- Tests give cold interpreter starts the documented 120-second deadline and cap parallel workers at eight, so a loaded machine no longer fails the gate.
guarded-write.pyserializes the check, write and rename of one file among concurrent helpers with an advisory lock belowXDG_STATE_HOME(or~/.local/state), so of two sessions that read the same digest only one succeeds; before, both could report success while one edit was lost. An editor that takes no lock can still save between the helper's last check and its rename.evidence.py readkeeps thestaleandproblemsof every page of a large exact read, so a capture refuses, and a comparison reportsunknown, when a later page was incomplete.- The example Gmail headers sensor no longer misses messages received in the first or last fraction of a second of its window: it widens Gmail's whole-second search outward and filters exactly.
- The prompt guide's Claude Code command allows the read-only
bf readandbf searchcalls its prompt asks for, and the release checklist reads the workflows' mise pin despite its inline comment. - Documentation matches behavior:
--promptandupdate --kindrepeat, prompts get name suggestions, a prompt dry run appends to its own log, program names are unique across sensors, routines and prompts and neverbf,bf initcreates noprompts/folder, and an exportedBF_BRAINtakes precedence over the working directory. - A read of a note ref ending in a bare
#is invalid input (exit 2), like a scope: it read the whole note under a ref no backlink or reminder matched, so the note listed itself as a backlink and lost its tasks and review signals. An offset on the home page or thememoriesoverview exits 2 too. bf validateresolves an alias that a later note declares before checking links, instead of reporting a missing record that exact reads resolve.- Spelling
suggestionsfold Latin accents as promised (equipe, notéquipe), and a paged read without sections inside it omitsoutlineinstead of returningoutline: [].