Repository navigation
Releases
Releases · Autopsias/brainiac
brainiac v0.20.49
Security
- An image that declares too many pixels is refused before it is decoded.
Pillow only raises at twice its own 89.5 M-pixel warning threshold, so a
~100 KB PNG could make ingest hold hundreds of MB. The image handler now
quarantines such a file asimage_too_many_pixels, and PowerPoint picture
OCR skips it. - Backups are owner-only from the first byte. The archive is created
with mode 0600, and an existing one is tightened; the default umask left a
plaintext copy of the whole vault readable by every local user. - The unattended update installs exactly the version it verified (A-03).
The nightly checked the attestation of one version, then ran a bare upgrade
that installed whatever PyPI served at that moment. Every PyPI channel (uv
tool, pipx, pip) now pins the verified version.brain updaterun by hand
is unchanged. - The golden check no longer gives Codex the vault folder or a shell
(public PR #36). Codex calls one fixed host tool that runs the scorer,
and its answer must equal the host's own measurement. - Bounded document work. A PDF has a page cap and a 120 s wall-clock
budget (an over-limit file is quarantined with the limit named, and OCR
stops between images once the budget is spent). A workbook that declares a
huge range is read at most 200 columns wide (a 4.8 KB file took 58 s, now
0.7 s). Capture-inbox drafts are read without following symlinks, and a
FIFO no longer hangs the remediation read. pypdffloor raised to 6.21.4. Accepted risks A-16 (Python 3.10 keeps
Pillow 12.3.0 and filelock 4.1.0) and A-17 (a sandbox draft keeps the
classification it declares) are recorded indocs/security-acceptances.md.
Fixed
- A draft whose title contains
---survives staging. - State files are written atomically through one helper.
- Failures that were swallowed silently are now logged.
- A blank small screenshot is retried once on a high-contrast copy within the
same time budget; recovered text is flagged for review (public PR #36). brain doctorreads the registry on a pipx install and follows a symlinked
launcher to its install channel (public PR #36).
Added
BRAIN_UPDATE_ENGINE_ONLY=1updates the engine only, for a Codex-only host
(public PR #36).
Changed
brainiac v0.20.48
Fixed
- Text too faint or too small to read is now flagged as hidden (pentest
VULN-3418). An HTML payload styledcolor:#ffffdd; font-size:2.7px
ingested with no flag: the colour test only caught text within 0x10 of its
ground on every channel, and the size floor was 2pt. Text now also counts
as hidden below a 1.2:1 contrast ratio with its ground (alpha included),
and the size floor is 3pt in every lane (HTML, email, Word, PowerPoint). The
text-level scan applies the same rules to an inlinestyle="", reads either
quote style, and treats a style it cannot parse as hiding instead of
raising. Measured on 1,055 real originals: 0 new quarantines, no detection
lost, new labels in 10 documents. - The weekly synthesis no longer fails on a note named after a whole
sentence. On 2026-10-25 the linking lane named 20 notes after sentences of
up to 208 characters; the id limit is 180, so none could be signed and the
run failed (rc=75). Before signing, the synthesis now shortens such an id to
its first words plus 8 hex characters of the old id, rewrites every
[[old-id]]link to it in the same run's notes, and asks the lane for ids
of at most 80 characters. The list of notes is split on newlines only, so a
crafted file name cannot become two entries. - AGENTS.md rule 2 names the ceiling a Cowork session actually reads at
(pentest VULN-3419). It described the signed VM clamp without saying it
binds onlybrain --role vm; through the host broker a Cowork session
reads at the broker entry's ceiling, so the agent reported a cap of
Internalit did not have. - The monthly retrieval watch measures again, and
brain alertsshows it.
Since August it crashed every month (it gave the comparison theeval/qrels
folder instead ofeval/qrels/qrels.json, and calledgate.pywithout
--scorecard) and reported each crash as "quality regressed" intohot.md
only. A crash or an undecidable gate now reads ERROR, never FAIL; the baseline
rolls forward after each PASS so vault growth cannot make it undecidable; and
the verdict lands in~/.brain/retrieval-watch-state.json, whichbrain alertsreads (FAIL, ERROR, or no run in 35 days) and shows as a banner,
never an untriaged line.
brainiac v0.20.47
Fixed
- The dependency audit checks the lock again.
pip-auditre-resolved
requirements.lockwith pip, which does not see the uv override that lifts
fastembed'spillow<13cap, so on 0.20.46 it stopped with
ResolutionImpossibleand audited nothing. It now reads the pinned versions
as written (--disable-pip), in CI and inmake audit. - The release check accepts a wheel CI built with a newer setuptools. The
check that compares the PyPI wheel with the local build ignores the
build-tool version line inWHEELand that file's row inRECORD. Any
other difference still stops the release.
brainiac v0.20.46
Security
- The parsers that open attachments carry no known vulnerability. Pillow
13.0.0 (37 advisories on 12.3.0, one a heap overflow in the FlashPix
decoder), pypdf 6.21.2 (11 on 6.19.0), filelock 4.2.4 and certifi
2026.10.23. Thepypdffloor in the package metadata is now>=6.21.2, so
an install moves off the vulnerable release. Pillow 13 needs Python 3.11;
on Python 3.10 the floor stays at 12.3.0.
Fixed
- The hidden-text scan reads a PDF in full again on pypdf 6.21. pypdf
moved its internal font class, the scan failed to load it, and every PDF
readincomplete. It now loads the class from either place. - Two writers at once no longer share one temp file. 24 atomic writes
used a fixed<name>.tmpbefore the rename; each now uses a unique name. - A pipe in the drop zone can no longer stop an ingest. The ingest reader
opens files without waiting, as the other safe-file readers already did.
brainiac v0.20.45
Changed
- Model work is capped machine-wide, so parallel searches no longer exhaust
memory. At most two processes load or run a model at once
($BRAIN_MODEL_SLOTS, default 2); a queued search waits before its rerank
budget starts, so it never loses its rerank. Tenbrain searchprocesses
at once had taken a 24 GB Mac to a forced reset; the same replay now peaks
at 5.7 GB in total. The reranker also scores in batches of 4
($BRAIN_RERANK_BATCH), so a long-lived process such as the MCP server
keeps 4.6 GB after 20 searches instead of 12 GB. Scores are unchanged. - The embedder and the reranker use 4 threads by default, not every core.
Measured on a 12-core Mac: the same wall time at about 40% of the CPU.
$BRAIN_EMBED_THREADSand$BRAIN_RERANK_THREADSstill override.
Fixed
brain updateno longer times out on a slow engine install. Every
install channel (uv, pipx, pip --user, venv wheel, editable) ran under the
120-second bound meant forclaude plugincalls. The 0.20.44 venv install
took 6m39s, so the update stopped before it re-staged any workspace. The
install now gets 30 minutes, the same bound as the workspace sync.
brainiac v0.20.44
Added
- A type-error ratchet in CI. The
quality-ratchetworkflow now runs
Astral'sty(pinned at 0.0.89) throughtools/check_types.py. Today's
diagnostics are recorded per file and rule in.type-exceptions; any new
one fails the job, and a fall asks for a re-record. The export re-records
the baseline on the public tree, so the public CI judges the files it has.
No existing type error is fixed in this release.
brainiac v0.20.43
Security
mcp1.30.0 or later (CVE-2026-59951). mcp 1.29.1 never reclaims
Streamable HTTP stateful sessions, so memory grows without bound. The
[mcp]extra's floor and the audited lockfile now require 1.30.0.
brain-mcpruns over stdio and never started Streamable HTTP, so no
install was exposed; a fresh install already resolved to 1.30.0.
Fixed
- The Claude Desktop doctor row counts servers, not wrappers. Desktop
runs eachbrain-mcpserver under a helper whose command line names the
same path, so 8 servers read "16 of 16 running process(es)". The helper is
skipped and the row counts server(s). - Plugins from a local-folder marketplace no longer read stale. Claude
Code reads a project or local copy straight from the marketplace folder,
andclaude plugin updatenever rewrites that copy's record. The doctor
read the old cache path from the record, so every plugin read stale after
a release with nothing left to update. Such copies now carry the folder's
version. - The pre-compact hook keeps one checkpoint marker in the handoff. It
appended a marker on every compaction and never removed the old ones; one
handoff held 19 markers and no state. brain updateno longer crashes on a plugin copy for a deleted project.
Claude Code keeps a project-scope plugin entry after its project folder is
gone. The doctor counted that copy as stale, andbrain updatethen ran
claude plugin updatefrom the missing folder and stopped with
FileNotFoundErrorbefore it re-staged anything. Such a copy is now
ignored, and the doctor row says how many it ignored.
brainiac v0.20.42
Changed
brain doctorsays whether Claude Desktop runs the current Brainiac.
A new row compares each runningbrain-mcpserver with the engine install
time: servers started before an update still serve the old code, and the
row says to quit and reopen Claude Desktop. The Cowork plugin-store rows
now compare the installed skill TEXT with the bundles staged for the
current version, so a plugin that Cowork's lagging marketplace labels with
an older version reads current when its text matches, and a real
difference names the skills and the steps.brainiac-managermissing from
Cowork is reported as optional. The release's last step prints only the
Desktop steps these rows ask for.
Fixed
- Spreadsheet tables no longer carry thousands of empty columns. A
sheet's used range can run far wider than its data (16,147 columns on one
real file), and every row carried the blank columns as| |padding: a
97K-character sheet became a 9 MB note. The shared table renderer for
xlsx, pptx and docx now drops a column that is blank in every row, as it
already dropped blank rows. Two real files measured 2,124,686 -> 352,631
and 1,258,807 -> 27,532 characters with identical non-empty cells. Notes
ingested before this release keep their padding; new and changed files
are compact.
brainiac v0.20.41
Added
- An opt-in Codex Sunday synthesis adapter for hosts without Claude CLI.
Structured proposals are locally validated, sanitized, signed, indexed and
published; cloud export requires explicit consent and defaults to Internal.
Seedocs/operations/codex-synthesis.mdfor scope and manual launchd setup.
(Proposed in public PR #35.)
Fixed
- An encrypted Office file is a terminal negative, not an extraction
error. A rights-protected.docx/.pptx/.xlsxis an OLE container
holding anEncryptedPackage, not a zip. Ingest now quarantines it as
office_encryptedonce and raises one owner-facing alert, instead of
reporting an extraction error on every run. The OLE directory walk follows
the DIFAT chain, so a large encrypted file is also recognised. .xlsmworkbooks ingest. They go through the.xlsxhandler (openpyxl
never runs macros), the encryption check covers them, and the originals
resolver accepts them. They used to sit inno_handler_for_extension.- Two false alerts are gone. The corpus-invariants entry no longer
changes its key with a live backlog count, so the weekly retro stops filing
duplicate findings; and the search self-test warms the embedder before it
times a query, sotrend:selftest_msno longer fires on a cold load. - Auto-PARA moves are filed before the hourly sync and never re-sign
changed bytes. The fold plans outside the writer lock, applies inside it,
and moves a note only when its bytes match what the audit chain signed at
the old path; anything else stays put and is reported. Invariants no
longer judge a moved note at its old path. - The owner interview asks better questions. The "still current?"
question never asks about, or appends to, araw/source; an orphan
question offers the project note whose title or alias names its topic
first; and a link option may name any note id up to 255 characters (a
133-character id refused a whole morning sheet). - Supersession edge cases. A deferred deliverable anchor consumes its
.supersedessidecar, so it cannot declare a supersession for the next
file of that name; and the MCP broker'sunsupersederefuses and names
brain unsupersedeon the host, because relatedness cannot guard an undo. - The Codex synthesis script runs when launchd starts it, and waits out the
hourly sync. As proposed it had no__main__entry point and exited 0
without working; it also gave up at once on a busy writer lock. It now
waits up to 15 minutes for the lock.
Security
pyjwt2.15.1,urllib32.8.0 andpypdf6.19.0 in bothuv.lockand the
hash-pinnedrequirements.lock, past the advisoriespip-auditreported
(23 findings in 3 packages on the old lock, 0 on the new one).
brainiac v0.20.40
Fixed
brain interviewasks questions again. The nightly interview asked
nothing from 2026-09-23 on: the stale-note finder sampled 10 notes and
found 9 undated ones, which it skips, and the orphan finder spent its
three-question budget on the first three notes with nowhere to link. Stale
now samples 60, and orphans count questions and searches separately. A dry
run on the reference vault asks 3 questions where it asked 0.- A linked picture no longer quarantines a whole
.pptx.python-pptx
raisesValueErrorfor a picture linked to an external file, and the
handler caught onlyAttributeError, so one linked shape quarantined a real
8-slide deck four nights running. The read now sits inside the per-picture
guard. brain updateupdates every project copy of a plugin, and a stopped
update fails the deploy. A plugin installed at project scope has one
registry entry per project;brain doctorread only the first and
brain updateranclaude plugin updateat user scope, which fails when no
user-scope copy exists. That stop happened before the workspaces were
re-staged, and the release deploy phase passed anyway because a stopped
update writes no before/after table (v0.20.39 left both workspaces on
0.20.38). The doctor now judges every copy and lists the stale ones, the
update runs once per stale copy from its project folder, and a report with
no before/after table fails the phase.
Changed
- Documentation overhaul (2026-09-26).
README.mdis a front door again
(what, why, one install path per surface, first search, update, where next)
with absolute links so the PyPI page renders them;docs/README.mdmaps every
shipped document by kind (how-to, reference, explanation, walk-through);
docs/install/README.mdis numbered steps per platform, with the explanation
moved todocs/install/new-owner.md. Fact fixes across the install set:
CLAUDE.mdimportsAGENTS-core.md, the maintenance task is named by its
label, the Chat tab wires throughbrain connector the.mcpb, seven links
to files the public export drops are gone, andCONTRIBUTING.mdcarries the
measured test count and a docs-with-the-change rule. The plugin manifests and
the marketplace carry short, current descriptions plushomepageand
repository; each plugin folder has a README that lists what it runs, sends
and fetches;/brainiac-healthresolves its script through
${CLAUDE_SKILL_DIR}so it works from a plugin install;pyproject.toml
carries project URLs. Two closed-stacks s07 walk records under
docs/operations/(the owner-run protocol and its relayed transcript) no
longer ship in the public export; the cutover-and-reversal runbook that
brain doctorcites still does.