Repository navigation
v15.0.0
·
61 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
Brain Framework 15 reshapes replies for agents: smaller, bounded, described by published JSON Schemas and easier to continue. It ranks sections by their note, collapses duplicate records across sources, pages relationships, adds graph settings and exports, and hardens collection and cache rebuilds. The brain storage format remains version: 6; the search cache rebuilds once after the upgrade.
Breaking changes
- Watch preferences now live in the optional
watchmapping inbf.yaml.settings/watch.yamlis no longer read, andbf schema --kind watchandwatch.schema.jsonare removed;bf schemaincludes watch preferences. Defaults and CLI precedence are unchanged. All commands loadingbf.yamlvalidate the section, even when CLI options override it. - Exact reads above 32 KiB return their note or record text in pages (
textorrecord.text, withoffset,next_offsetandtotal_characters; the first page adds the sectionoutlineand the graph context) instead of JSONchunkstrings. Every exact read addssha256(of the whole file) andmodified. - Backlink groups always name their
relation(linksfor untyped links) and preview their 5 newest items withref,title,time,kindandsource,statusortypeonly.bf read REF --rel ROLElists a whole group. - OKF
sourcesentries now claim the built-incitesrelationship instead of an untyped link: backlinks list them undercites.linksandcitesjointagged-withas reserved schema names. - With one selected brain, result and listing entries omit
brainanduri; records omittype, whichkindalready states. - Search
sourceslists the sources of returned records and those needing attention (failed,staleornever), withsources_omittedcounting the rest; replies without items andmemoriesscopes keep the full list. - Search shows one result per URL when several sources hold it, such as a Drive file and its catalog entry; the result's
alsolists up to five other refs, asbf://addresses when several brains are selected. One source's records, such as highlights of one document, stay separate. - Pages and searches end early near 32 KiB instead of 2 MiB, counting a page's summaries such as
changed; follownext_offset. Result and listing titles are previews of at most 200 characters ending in…, and homechangedandupcomingpreviews omit excerpts. - Period pages (
today,7d, dates) and homeupcomingomit records ofpriority: lowsources;sourcesandactivitykeep their counts, marked"priority":"low", with the page listing them. - Collection rejects a record whose fields other than
textexceed 2 MiB serialized, andbf validatereports such stored files, so every record reads back; keep bulky content intext. bf initwrites a much shorterAGENTS.md(about 280 words instead of about 960); authoring rules live in thebf-learnskill.- The
bf-actionhandoff check reportscharactersinstead ofreply_characters.
Manual upgrade:
- Stop the watcher, move the keys from
settings/watch.yamlbeneathwatch:in your existingbf.yaml(indent them two spaces), remove the old file, runbf validateand restart the watcher. Remove the emptysettings/directory only if nothing else uses it. Brains without custom watch preferences need no change. - Rename any
schemafield namedlinksorcites, then runbf validate. - Update scripts that parse replies: concatenate exact-read text pages while
next_offsetis present and require an unchangedsha256; list a backlink group withbf read REF --rel ROLEand explain a link withbf search 'IDENTITY'; read OKF sources undercites; buildbf://NAME/REFfrom the reply's brain when you need an address with one brain selected; followalsowhere you expected every copy of a URL; readmemories/SOURCE/PERIODto list a low-priority source's records. Validate parsed replies withbf schema --kind search-replyandbf schema --kind read-reply. - Re-copy the upstream
bf-use,bf-learnandbf-actionskills and any copied hook (examples/hooks/session-context.py), which read the new replies. - Optionally compare your brain's
AGENTS.mdwith a scratchbf initand keep what your brain still needs.
# https://fmind.github.io/brain-framework/docs/schedule/#watch-preferences
watch:
interval: 300
notifications: offAdded
- Role pages:
bf read REF --rel ROLE [--offset N]and MCPread(ref, rel, offset)list every item linking to a note, record or identity through one relationship, 50 per page; an undeclared role exits 2 naming the declared ones, and abf://address with an undeclared?rel=reports a problem. broader: ROLEon a relation field: the parent's role page also lists its narrower roles' items, each keeping its ownrelation.targets: [PREFIX, …]on a relation field: collection rejects mapped values and typed record links outside them without changing evidence, andbf validatereports stored records and note links outside them.bf validatelists non-failingwarningsfor identities that differ only by letter case;bf statuslistswarningsfor a record source or authored folder above 80% of the scan limit. Neither changes the exit code.bf build --reproject SENSOR [--dry-run]re-applies a sensor's current mappings to its stored records without running it or removing records.bf export edgesprints every claim of the selected brains as JSON Lines, offline, for DuckDB or networkx.sensors.NAME.priority: normal|lowinbf.yaml: low ranks a source at half weight in search and keeps its records out of period and home lists; applied at query time withoutbf build.bf evalreports each search case'srankand the run'smrr;bf eval --baseline FILElistsregressionsandimprovementsagainst a saved reply.- Published JSON Schemas for
bf searchandbf readreplies:bf schema --kind search-reply|read-reply,docs/search-reply.schema.jsonanddocs/read-reply.schema.json. The test suite validates every reply against them. - Typed claims carry the asserting item's
time. - MCP tools gain titles, and the server sends a title and instructions with the orient, find, verify and answer loop, role pages and completeness checks.
- Opt-in
examples/hooks/prompt-context.pyfor Claude Code and Codex lists up to three matching note refs per prompt, counts records without quoting them, and stays silent after 2 seconds or on incomplete retrieval. - The
bf-learnscripts/guarded-write.pyhelper replaces a note from stdin only while it still has thesha256of the agent's read. - Add an explicit
frefresh shortcut tobf watch(uremains an alias): reload configured sources and check due work now, retaining one follow-up request during an active update while respecting pause, selectors and retry timing. - Add a reviewed GitHub history sensor and backfill walkthrough: selected-branch commits (one year of
mainby example), all-age issues and pull requests, incremental refresh and bounded pagination that preserves evidence on failure.
Changed
- The 100,000-entry scan limit applies per source directory under
memories/and per authored folder, and its error names the crowded directory with a remedy. bf buildand automatic rebuilds fill.bf/index.sqlite.newbeside the live cache and replace it atomically: searches and collections continue meanwhile, and an interrupted build leaves the live cache intact. Readers hold a brief cache lock while connected, so a replaced cache never attaches the new one's write-ahead log.bf updateandbf watchrecover an interrupted record transaction before refreshing the cache; reads still refuse and namebf buildorbf update.- Rewording a schema field's
descriptionorexamplesno longer rebuilds the cache; addingbroaderortargetsdoes. - Rolling back an interrupted transaction syncs the source directory once instead of once per record.
- Mapping errors at collection name the record's zero-based position.
- The skills describe the new replies, role pages, low-priority sources, rank-aware evaluations, scan warnings and graph settings.
- Synchronize the project description across the README, documentation, package metadata, CLI help and GitHub About to “🧠 Brain Framework: from information to informed actions.”
Fixed
- A section now ranks under its note's title as well as its heading, so "Atlas next actions" finds Atlas's own Next actions before other notes that mention Atlas; a query matching only a note's title still returns the whole note.
- The snapshot shrink guard counted the catalog left by an interrupted commit, letting a truncated listing remove most records; recovery now runs first.
- A routine retried after its run history failed to save no longer writes a second action for the same day.
- Temporary
.write-*files left by killed writes are removed by the next transaction or recovery of their source. - Reject ambiguous GitHub pagination and PR details that move outside the requested window, preserving saved evidence instead of accepting an incomplete or out-of-scope collection.