Skip to content

chore(release): bump version to 1.5.15 (XS) - #784

Merged
EtanHey merged 3 commits into
mainfrom
wt/release-1.5.15
Sep 5, 2026
Merged

chore(release): bump version to 1.5.15 (XS)#784
EtanHey merged 3 commits into
mainfrom
wt/release-1.5.15

Conversation

@EtanHey

@EtanHey EtanHey commented Sep 5, 2026

Copy link
Copy Markdown
Owner

Size: XS. Four files, seven lines — the #769 (1.5.14) shape exactly.

All six version sites: pyproject.toml, src/brainlayer/__init__.py, server.json (root + packages[0]), brain-bar/bundle/Info.plist (short, bundle, release).

Why a release

The reason is #781 (7369f80c) — the watcher per-poll burst fix, 14.97% → 2.39% under the LaunchAgent's background QoS. Ingestion cannot be enabled on a keg that lacks it.

Installed keg on the M4 is 1.5.14 / build_sha 3bbe19f2 (_build.py in the keg's site-packages). Verified, not assumed:

git merge-base --is-ancestor 7369f80c 3bbe19f2  ->  false   (#781 NOT in installed keg)
git merge-base --is-ancestor 0d6d130f 3bbe19f2  ->  false   (#776 NOT in installed keg)
git merge-base --is-ancestor 3cc9eca3 3bbe19f2  ->  false   (#775 NOT in installed keg)

launchctl enable com.brainlayer.watch today would start the burst-y watcher. 1.5.15 is what carries #781 onto the Mac. Also riding along: #772 #773 #775 #776 (test hygiene, tag-push scoping).

Cask lag

Casks/brainbar.rb stays at 1.5.9 — no Swift change this release. Declared to the guard with:

BRAINLAYER_VERSION_CHECK_CASK_LAG_REASON="no BrainBar release for 1.5.15"

Deliberately not exported into the push environmenttests/test_brainlayer_version_check.py asserts the check fails without a reason, so exporting it in the shell that runs the hook would defeat those two tests.

Verification (this branch, 13439288)

scripts/brainlayer-version-check.sh, all three runs quoted verbatim:

A) no reason — must fail:

ERROR: Casks/brainbar.rb version is '1.5.9', expected '1.5.15'
ERROR: latest git tag is 'v1.5.14', expected 'v1.5.15'
exit=1

B) with reason, pre-tag:

WARN: Casks/brainbar.rb is 1.5.9 (package 1.5.15) — allowed: no BrainBar release for 1.5.15
ERROR: latest git tag is 'v1.5.14', expected 'v1.5.15'
exit=1

C) with reason + BRAINLAYER_VERSION_CHECK_GIT_TAG=v1.5.15 (the script's own override) — proves the tag is the only remaining gap, and it closes in step 2 when v1.5.15 is cut:

WARN: Casks/brainbar.rb is 1.5.9 (package 1.5.15) — allowed: no BrainBar release for 1.5.15
PASS: BrainLayer/BrainBar 1.5.15 release metadata is consistent (cask 1.5.9 lag allowed: no BrainBar release for 1.5.15)
exit=0

Pre-push gate: pushed scoped with BRAINLAYER_PREPUSH_SCOPE=changed-only, comma-separated BRAINLAYER_CHANGED_FILES, nice -n 15. All five phases green, no full suite (40 passed isolated, bun 1 pass, fts5 determinism shell PASS).

What this PR does NOT do

brew upgrade does not re-render an existing plist. Every plist needs scripts/launchd/install.sh re-render after the keg upgrade, verified by ProgramArguments pointing at /opt/homebrew/opt/brainlayer/..., before anything is restarted — and the signature gate scripts/release-verify-signatures.sh <keg> runs before any restart. That is step 3 of the release, not this PR.


🤖 brainlayerClaude-ebe88b04 running claude-opus-5


Note

Low Risk
Metadata-only version alignment with no behavioral code changes in the diff.

Overview
Bumps the release identity from 1.5.14 to 1.5.15 everywhere the shipped package and BrainBar bundle declare version: pyproject.toml, brainlayer.__version__, MCP server.json (root and PyPI package entry), and brain-bar/bundle/Info.plist (CFBundleVersion, short version, and BrainLayerReleaseVersion).

There is no application or runtime logic in this diff—only metadata so a new keg/tag can ship fixes already on main (notably the watcher per-poll burst reduction in #781). The Homebrew cask is not updated here; Casks/brainbar.rb can remain behind until a separate BrainBar release.

Reviewed by Cursor Bugbot for commit 0f35401. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Bump version to 1.5.15

Updates version metadata in Info.plist, pyproject.toml, and server.json, plus the brainlayer.__version__ constant.

Macroscope summarized 0f35401.

Summary by CodeRabbit

  • Chores
    • Updated the application and package version to 1.5.15 across release metadata.

All six sites: pyproject.toml, src/brainlayer/__init__.py, server.json
(root + packages[0]), brain-bar/bundle/Info.plist (short, bundle, release).
Casks/brainbar.rb stays 1.5.9: no Swift change this release, declared to
scripts/brainlayer-version-check.sh via
BRAINLAYER_VERSION_CHECK_CASK_LAG_REASON="no BrainBar release for 1.5.15".

Why a release. The installed keg on the M4 is 1.5.14 / build_sha 3bbe19f.
Verified: `git merge-base --is-ancestor 7369f80 3bbe19f` -> false, so #781
-- the watcher per-poll burst fix, 14.97% -> 2.39% under the LaunchAgent's
background QoS -- is NOT in any installed keg. Enabling com.brainlayer.watch
today would start the burst-y watcher. 1.5.15 is what carries #781 (7369f80)
onto the Mac. Also in: #772 #773 #775 #776.

Co-authored-by: brainlayerClaude-ebe88b04 running claude-opus-5 <noreply@anthropic.com>
@cursor

cursor Bot commented Sep 5, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_6491ba83-d836-4476-959e-52ee95535b8b)

@EtanHey

EtanHey commented Sep 5, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

— brainlayerClaude-ebe88b04 running claude-opus-5

@coderabbitai

coderabbitai Bot commented Sep 5, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Team

Run ID: ca23f962-18a5-44a0-a246-54a11c08f222

📥 Commits

Reviewing files that changed from the base of the PR and between 123da9b and 32119f7.

📒 Files selected for processing (4)
  • brain-bar/bundle/Info.plist
  • pyproject.toml
  • server.json
  • src/brainlayer/__init__.py

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: swift (macos-15)
  • GitHub Check: signature parity (macOS keg)
  • GitHub Check: test (3.13)
  • GitHub Check: test (3.11)
  • GitHub Check: test (3.12)
🔇 Additional comments (4)
brain-bar/bundle/Info.plist (1)

12-16: LGTM!

pyproject.toml (1)

3-3: LGTM!

server.json (1)

6-6: LGTM!

Also applies to: 17-17

src/brainlayer/__init__.py (1)

5-5: LGTM!


📝 Walkthrough

Walkthrough

The release version changes from 1.5.14 to 1.5.15 in the BrainBar bundle, project metadata, server metadata, and Python package metadata.

Changes

Release metadata

Layer / File(s) Summary
Version metadata updates
brain-bar/bundle/Info.plist, pyproject.toml, server.json, src/brainlayer/__init__.py
All tracked version declarations now use 1.5.15.

Estimated code review effort: 1 (Trivial) | ~2 minutes

Merge Risk: ⚪ Minimal · up to 0f354

This release updates package, server, and BrainBar version metadata to 1.5.15 without changing runtime behavior. No current merge-readiness risk remains.

Poem

A rabbit checks the version line
1.5.15 now shines
Bundle and package match in tune
Server metadata follows soon
The release carrot is aligned

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the coordinated release version bump from 1.5.14 to 1.5.15.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 1…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch wt/release-1.5.15

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@EtanHey EtanHey added the XS Extra-small change (400 lines or fewer) label Sep 5, 2026
@deepsource-io

deepsource-io Bot commented Sep 5, 2026

Copy link
Copy Markdown

DeepSource Code Review

We reviewed changes in 123da9b...32119f7 on this pull request. Below is the summary for the review, and you can see the individual issues we found as inline review comments.

See full review on DeepSource ↗

PR Report Card

Overall Grade   Security  

Reliability  

Complexity  

Hygiene  

Code Review Summary

Analyzer Status Updated (UTC) Details
Python Sep 5, 2026 4:50p.m. Review ↗
Swift Sep 5, 2026 4:50p.m. Review ↗
JavaScript Sep 5, 2026 4:50p.m. Review ↗
Shell Sep 5, 2026 4:50p.m. Review ↗
Secrets Sep 5, 2026 4:50p.m. Review ↗

Important

AI Review is run only on demand for your team. We're only showing results of static analysis review right now. To trigger AI Review, comment @deepsourcebot review on this thread.

@coderabbitai

coderabbitai Bot commented Sep 5, 2026

Copy link
Copy Markdown

@EtanHey I will review pull request #784.

⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown

BrainLayer ratchet

Every Value below was measured by this run. A row this machine cannot measure says n/a — <reason> instead of a number; baselines in Notes name their own machine, method and date and were not measured here.

Row Status Value (measured by this run) Method Notes
commit provenance 🟢 GREEN measured 0f35401d0d55 == PR head · checkout 24ecaba92928 commit graph + live PR head · in-process · runner Which commit this whole table is about. On a pull_request event the checkout is GitHub's synthetic merge ref, whose sha is not on the PR — #759's table printed 13fa724278bf while that PR's head was 4632f979 — so this row names the PR-head parent instead, the sha a reviewer can actually see. The comparison sha is read live from repos/{owner}/{repo}/pulls/{n} when the table is collected, not taken from the event payload, because the payload cannot know the run has been overtaken. Residual window, stated rather than papered over: a push landing between that read and the comment being posted is not caught here — the run for that push refreshes the table.
baseline attestation 🟢 GREEN baseline f421d1a7c5e6 matches the main attestation (run 33979237066 · main 2264b19ea0aa · 2026-09-05T16:53:22Z) main attestation artifact via Actions API · in-process · runner What every comparison is measured AGAINST, and who says so. The baseline fields of tests/fixtures/sprint_gate/corpus.json (queries, latency_baseline_ms, thresholds) are compared to the ratchet-attestation artifact of the latest successful push or (no-input) workflow_dispatch run of ratchet-attest.yml on main, fetched through the Actions API — a PR run cannot write to another run's artifacts. A field that differs is RED unless that main run measured the new value; today no runner-side collector measures any baseline field, so today the baseline cannot move by PR at all, and this row says so instead of a hand edit passing. Boundary: the comparator is this PR's checkout of ci_ratchet_table.py, diff-reviewable, not tamper-proof.
provenance 🟢 GREEN stamped 24ecaba92928 == HEAD, tree clean wheel stamp · in-process · runner Sha half of #749 keg-mode provenance: a keg built from this wheel can answer __build_sha__. The helper-age and served-process predicates need a running BrainBar and are measured only by scripts/sprint_gate.py on an installed Mac. The sha here is the checkout's — the merge ref on a PR — because that is what publish.yml stamps at release time; the PR-head sha this table describes is the one in commit provenance above.
fallback replay debt ⚪ n/a n/a — no fallback queue on this machine: the pending memories live in ~/Gits/*/docs.local/decisions, and docs.local/ is gitignored, so a runner checkout has no copy of them to count docs.local walk · machine with the fallback queue intended_brain_store: true with no chunk_id means a memory reached disk and never reached the DB, so it answers no brain_search. Budget: 0. Any pending or unparseable file is a finding, never a band -- 122 of these sat from 2026-06-28 to 2026-09-05 because nothing counted them where a reader would look. Measured by walking the tree, so it is only ever measured on a machine that HAS the tree.
mapped bytes ⚪ n/a n/a — no BrainBar daemon at /tmp/brainbar.sock: this row needs the daemon, its hybrid helper and the indexed corpus running together, and no GitHub-hosted runner has them (macOS included) — only a self-hosted Darwin/arm64 runner on an installed Mac would socket · installed Mac Baseline 26.2 GB — installed Mac, socket, 2026-09-03, after R2 drained 15,070 → 0. Up from 16.8 GB because the drain left more vectors mapped under the same cap: the change is the drain, not a leak. Not measured by this run.
search p50/p95 ⚪ n/a n/a — no BrainBar daemon at /tmp/brainbar.sock: this row needs the daemon, its hybrid helper and the indexed corpus running together, and no GitHub-hosted runner has them (macOS included) — only a self-hosted Darwin/arm64 runner on an installed Mac would socket · installed Mac Margin p50: margin unmeasured — 0 of the 5 attested green main runs it needs; no verdict is rendered from fewer. Margin p95: margin unmeasured — 0 of the 5 attested green main runs it needs; no verdict is rendered from fewer. Calibrated on MacBook-Pro.local at 2026-09-01T08:42:22Z under active_sprint_load (tests/fixtures/sprint_gate/corpus.json). Not measured by this run.
idle CPU ⚪ n/a n/a — no BrainBar daemon at /tmp/brainbar.sock: this row needs the daemon, its hybrid helper and the indexed corpus running together, and no GitHub-hosted runner has them (macOS included) — only a self-hosted Darwin/arm64 runner on an installed Mac would ps sampling · installed Mac Ceiling: average CPU < 30% over a 60 s window (resource_budget in scripts/sprint_gate.py), ratified and kept as a hard budget. Margin daemon: margin unmeasured — 0 of the 5 attested green main runs it needs; no verdict is rendered from fewer. Margin helper: margin unmeasured — 0 of the 5 attested green main runs it needs; no verdict is rendered from fewer. Margin watcher: margin unmeasured — 0 of the 5 attested green main runs it needs; no verdict is rendered from fewer. Needs the BrainBar daemon, helper and watcher actually running. Not measured by this run.
signature_valid 🟢 GREEN 442 valid / 0 invalid · brainlayer 1.5.14 · macos-15/ARM64 · brew install exited non-zero (outcome: failure); the keg installed and the sweep ran after it codesign · brew keg · GitHub macOS runner scripts/release-verify-signatures.sh <keg> codesign-verifies every *.so/*.dylib under libexec/venv. The macOS parity job installs the published tap formula (etanhey/layers/brainlayer), so this row measures the release path — formula, published sdist and Homebrew's relocation — and not this PR's tree. Release-time baseline for the same keg on a different machine: 442 valid / 0 invalid — installed Mac (M4 Max), brew --prefix brainlayer 1.5.11, 2026-09-03.

🟢 GREEN measured, within budget · 🔴 RED measured, out of budget — a finding to clear before merge · ⚪ n/a not measurable on this machine, never guessed.

No RED rows.

Measured on Linux/x86_64 · measured 0f35401d0d55 · PR head 0f35401d0d55 · checkout 24ecaba92928 · run · updated 2026-09-05 17:02:34 UTC

@EtanHey

EtanHey commented Sep 5, 2026

Copy link
Copy Markdown
Owner Author

swift (macos-15) is red — diagnosed, and it is not this PR

One assertion out of 890 tests:

brain-bar/Tests/BrainBarTests/StatsCollectorTests.swift:705: error:
-[BrainBarTests.StatsCollectorTests testWatcherProbeDoesNotBlockMainActorRefresh] :
XCTAssertLessThan failed: ("0.335995078086853") is not less than ("0.3")

Not caused by the version bump. Nothing in Swift reads the file I edited — grep -rn 'Info.plist|CFBundleShortVersion|BrainLayerReleaseVersion' brain-bar/ --include='*.swift' returns no matches, and Package.swift declares no bundle resources. brain-bar/bundle/Info.plist is packaging metadata for the .app, not an input to swift test.

Locally on this M4 at 13439288: Executed 890 tests, with 10 tests skipped and 0 failures, and that single test 5/5 passed on repeat (1.25–1.27 s each).

Why it surfaced here

Test BrainBar is path-gated on needs.changes.outputs.brain_bar == 'true'. On the last three main runs — including 3cc9eca3, the exact base of this branch — the step was skipped, and the job still reported success:

run sha Test BrainBar
33977684585 3cc9eca3 skipped
33977295684 0d6d130f skipped
33977181415 7369f80c skipped

This 7-line bump is the first commit in a while to touch brain-bar/, so it is the first to actually run the Swift suite. A green swift (macos-15) on main does not mean the Swift suite passed.

What actually failed is the threshold, not the property

The stub blocks 0.6 s (BlockingWatcherProbe(delay: 0.6)). The property under test is that refresh(force:) returns without waiting for the probe. CI measured 0.336 s — under 0.6, so the probe did leave the main actor and the property held. 0.3 is a midpoint proxy with no headroom for cold-start overhead on a shared runner.

Proposed handling

Re-run the job to unblock the release, and fix the flake in its own XS PR — canon rule 9, a defect found mid-PR opens a new PR rather than another commit here. The honest fix is not 0.3 → 0.5 but dropping the wall-clock proxy: assert against the stub's own delay, or have the probe signal on entry so the test waits on an event instead of a clock.

Separately worth a look: the path filter leaves the Swift suite unexercised on most main commits — a gate reported green by being skipped.

— brainlayerClaude-ebe88b04 running claude-opus-5

@cursor

cursor Bot commented Sep 5, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_3fca2e04-5039-4e36-b879-29e7c6a4449c)

@EtanHey

EtanHey commented Sep 5, 2026

Copy link
Copy Markdown
Owner Author

Branch updated onto 123da9b4 (#782) — required, not optional

#782 merged while this was in CI, flipping the PR to BEHIND. That blocks the merge outright:

// gh api repos/EtanHey/brainlayer/branches/main/protection
{"strict": true,
 "checks": ["test (3.11)","test (3.12)","test (3.13)","lint","swift (macos-15)"]}

strict: true is require branches to be up to date before merging, and required checks attach to a SHA — so the CI run on the old head 13439288 could not have satisfied the gate whatever it returned.

Merged main in as 32119f7e. After the merge, git diff --stat origin/main...HEAD is still exactly the 7-line bump:

brain-bar/bundle/Info.plist | 6 +++---
pyproject.toml              | 2 +-
server.json                 | 4 ++--
src/brainlayer/__init__.py  | 2 +-

Scoped pre-push gate green again on the new head — 40 passed, bun 1 pass, fts5 determinism PASS, no full suite.

Correction to the PR body

The body says "Also in: #772 #773 #775 #776". With #782 now in the range, 1.5.15 also carries #782 — the UserPromptSubmit injection cap and the 790 ms sklearn import fix. It is hook-side rather than watcher-side, so it does not change what the post-deploy soak is measuring.

One thing worth flagging

swift (macos-15) is a required check. The wall-clock flake diagnosed above is therefore a hard gate on this release, and every branch update re-rolls it. If it reds again, landing the threshold fix is likely faster than re-running.

— brainlayerClaude-ebe88b04 running claude-opus-5

@cursor

cursor Bot commented Sep 5, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_fb07b593-2b9e-45a0-9878-6ae4edc27bc3)

@EtanHey
EtanHey merged commit 51a72a0 into main Sep 5, 2026
14 checks passed
EtanHey added a commit that referenced this pull request Sep 5, 2026
…vent, not a 0.3s clock (XS) (#786)

* test(brainbar): prove the watcher probe left the main actor with an event, not a 0.3s clock (XS)

`testWatcherProbeDoesNotBlockMainActorRefresh` asserted `elapsed < 0.3` while its
stub probe slept 0.6s. On #784 a cold macos-15 runner measured 0.336s: the property
(refresh returns without waiting for the probe) HELD, the proxy threshold did not.
swift (macos-15) is a required check, so that flake blocks releases.

The probe now parks its first `sample()` on a semaphore only the test releases, so
"the refresh did not wait" is proven by an event -- reaching the next line while the
probe is still blocked is the property itself -- with no wall-clock margin anywhere.
The park is bounded (15s) so a main-actor regression fails the assertion instead of
hanging the suite, and the tail wait is a generous 30s liveness poll for the released
result: a slow runner makes this test slower, never red.

Verified both directions locally, brain-bar/Tests only:
- green: `swift test --filter StatsCollectorTests` -> 16/16, 8 consecutive runs
- red: moving `watcherProcessProbe.sample()` out of the detached task onto the main
  actor fails it on the property assertion (StatsCollectorTests.swift:756); reverted
- green under 24x CPU load, where the old 0.3s assert's replacement tail (5s) had
  failed; this test passes twice under that load

Agent: brainlayerClaude-9fcc41a6 (Claude Opus 5, 1M)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* test(brainbar): stop the comment claiming more than the assertions prove (review round 1)

Cursor low on #786: reaching the line after `refresh(force: true)` does not by
itself prove anything -- at that instant the probe may not have entered `sample()`
yet, and the park is bounded by `maxBlock`, so "only this test can release it" was
also too strong. The proof is the PAIR of assertions: the probe entered `sample()`,
AND it has not completed while the test runs on. Comment now says exactly that.

Comment-only; no assertion, helper, or production behaviour changed.

Agent: brainlayerClaude-9fcc41a6 (Claude Opus 5, 1M)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

XS Extra-small change (400 lines or fewer)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant