Repository navigation
v17.0.0
·
60 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
A review release. The brain format (version: 7), bf.yaml and the search and read reply schemas are unchanged. The command line is stricter, so input that was silently misread now fails, and failures that took down a whole brain are now contained.
Breaking changes
- Routine input.
bf run ROUTINEpasses piped input only with--stdin. It used to read any open standard input and failed after 10 seconds in agent shells that hold it open.bf run --hook EVENTstill passes what Git pipes, such as the refs of a push. - Repeated options. An option that takes one value may appear once:
bf search launch --scope projects --scope concepts, a second--brain,--relor--hookexits 2 naming it. The last value used to win, so the answer silently ignored the others.--sensorand--routinestill repeat to select several programs. - Routine arguments.
bf runrejects an unknown option before--, such as--dryrun, with exit 2. It used to pass it to the routine, which then ran for real. - Read relations.
bf read PAGE --rel RELATIONis invalid input (exit 2), as a page is recognizable before any brain is read. - MCP arguments. Tool arguments are validated strictly: a
limitoftrueor"5"is an error instead of a coerced value. - Retrieval cases. A plain
expectorforbidref inbf evalnames a file of the evaluated brain. A related brain's note at the same path used to satisfy it; name that note by itsbf://NAME/...address.
Upgrade: run uv tool upgrade brain-framework (or update a brain's pin), then bf skills DIR; the skills now require Brain Framework 17. Add --stdin where a script pipes input into a direct bf run ROUTINE, and put -- before routine arguments that start with a dash. Re-copy the example git-history.py, prompt-context.py, session-context.py or weekly-review.py if your brain uses one. Then run bf validate and bf eval.
Added
bf statuslists each brain'sattention: the scheduled programs that failed or areoverdueorneversucceeded, as the home page does. A brain reported"healthy": falsewith"problems": []and left the reason to a scan of every source and routine.
Fixed
- Search keeps a function word written as an acronym.
EU AI Actsearched onlyact, andAI,ITorUSdropped from any query, because they spell French or English function words. Lowercase function words and the habitualANDandORstill drop. The exampleprompt-context.pyhook mirrors the rule. - Searching a note's title finds the note before a section that mentions it: a section's note title and parents rank below a heading.
Atlas next actionsstill finds that section. - One unreadable folder, such as a source restored with another owner, no longer fails every search, status, validation and build of the brain: it is skipped and reported, and
bf validatenames it as an unreadable folder. - Collection stops below the 100,000-entry scan limit of its source and fails like any other collection, so a growing window source can no longer make every search and read of the brain fail. A commit changing exactly as many records as the limit no longer leaves a pending transaction behind.
- An action routine's relative links and headings are checked before writing, like its metadata and relations: an action that
bf validaterejects, such as one linkingprojects/x.mdinstead of../../projects/x.md, is never written. bf validatereports every problem of a note, and links to a note it cannot parse are no longer reported as unresolved: one invalid date or undeclared relation hid the note's other problems and broke the links of other notes.- A far-future
stale_after, such as9999-12-31T23:00:00Z, no longer crashes the home and projects pages in timezones east of UTC. bf mcpstops at once on SIGTERM or Ctrl-C with exit 130, instead of waiting for another input line.- Reading a note alias named like a source, such as
jira:ATLbeside ajirasource, no longer fails on another malformed record of that source or while a writer holds the brain. - Filesystems reporting 64-bit hashed inode numbers, such as mergerfs, no longer fail every cache refresh with a traceback.
- A query starting with
bf:, such asbf: how to configure sensors, searches its words instead of failing as an invalid address. - The example
git-history.pyskips linked worktrees, which collected their repository's whole history again; records already collected stay. The example routine and session hook read a task's Markdown link as its label. - The meeting-notes recipe has the agent draft GitHub issues for review instead of creating them from calendar text that anyone who invites you can write.
Changed
- Packaged skills no longer carry
metadata.version, so a release changes a skill's files only when its content changes;.bf-skill.jsonstill records the installing version. - Adding
broaderortargetsto a relation no longer rebuilds the search cache: relation pages readbroaderat query time, and collection and validation checktargets. - The schedule preview suggests
--output ~/.config/bf-schedules, outside the brain, like the documentation: the generated files hold this machine's paths. - The documentation states exact reads across brains as they behave: while a brain is unavailable, a found ref returns with a
problemsentry and a missing one fails as incomplete.