Special Thanks
Thanks to @andrunio, @dodoshell, @ozenyunus35, @fatherlinux, and @guamiao for their contributions, and to @3099404236 for reporting the bootstrap authorization issue.
Highlights
- Bootstrap reads preserve agent session state; the bootstrap tool requires write scope (GHSA-xhjp-vf97-77wf).
- Codex reports memory load and save activity through system messages.
- OpenCode inbox polling catches messages across polling boundaries without repeating delivered rows.
- Milvus memory searches work again, and hybrid health checks expose Cloudflare sync failures.
Added
- Codex lifecycle hooks report memory load and save status through
systemMessage, making successful hook activity visible in the session (#1648, dodoshell).
Fixed
- Bootstrap reads preserve agent session state (GHSA-xhjp-vf97-77wf).
get_bootstrap_profilenow requires write scope because it resets session
counters when a fresh start is due. Read-only clients can use
memory://agent/{agent_id}/bootstrap, which preserves the counter, timestamps,
sync events, and fresh-start signal. Counter lookup no longer writes access
metadata through semantic retrieval. Reported by @3099404236. - Dashboard toggle, sliders and checkboxes still used the old blue (#1548, ozenyunus35).
The checked toggle switch was hard-coded to#2563eb, and the range sliders and
checkboxes had noaccent-color, so the browser drew them in its default blue.
bodynow setsaccent-color: var(--primary), and the remaining#2563eb,
#3b82f6,#60a5faandrgba(59, 130, 246, …)values instyle.cssuse the
brand variables orrgba(25, 194, 218, …). - OpenCode inbox delivery across polling boundaries (#1636, guamiao). The inbox re-queries a configurable overlap window and drops previously delivered rows, so messages that arrive around a polling boundary are picked up without being shown twice.
- The hybrid health check said
syncingwhile every Cloudflare call failed (#1638).
It reportedcloudflare_sync: syncingwhenever the background sync loop was alive, so a
container with broken DNS synced nothing for 16 days without the health check noticing.
It now reportssync_failingwhen the sync service reports Cloudflare unreachable, and
exposescloudflare_availableandconsecutive_failuresnext to the status. memory_searchfailed on every call with the Milvus backend (#1650).
Since #1297 the MCP search handler passesagent_idtostorage.search_memories(),None
included, and Milvus is the only backend that overrides that method — its signature stopped
atstore, so each call raisedunexpected keyword argument 'agent_id'. Milvus now accepts
the keyword: without an agent the search runs as before, and a non-Noneagent_idreturns an
error result, asget_all_memoriesandcount_all_memoriesalready refuse it. The signature
conformance test now checksagent_idon every backend, alongsidestore.
Internal
- PR CI runs shorter (#1642). A push to a PR now cancels the run for the commit it
replaces; pushes to main keep one run per commit. The two Milvus legs run only when a
PR reaches code the Milvus suite imports (by package prefix), and always on main.
Each pip-installing job restores its own download cache, keyed onpyproject.toml. - CI installs dependencies with uv instead of pip (#1643). The test jobs build a venv
with a pinned uv from the runner's python3 and put it first on PATH; installs took
18-77 s per job with pip. The per-job download cache now holds~/.cache/uv. - Tests share the default ONNX InferenceSession across a run (#1644). The autouse
fixture that empties the embedding model cache after every test made each storage
setup create a new ONNX session for all-MiniLM-L6-v2, about 0.3 s each. A
session-scoped fixture now hands out one session per provider list for that model
file only; everything else still reaches the real constructor. Locally the ML extras
suite went from 537 s to 216 s and the default suite from 686 s to 228 s. - The ML extras job prints its 25 slowest tests and setups (#1645). It is the
longest CI job;--durations=25puts the data for the next speed-up in every run's log. - CI tests the default job against
uv.lock(#1647). No job read the lock, so a
Dependabot uv bump ran tests on exactly what main installed. Tests + Coverage and the
prove-fix job now install withuv sync --frozen; the ML extras and Milvus jobs keep
resolving frompyproject.tomlto catch upstream breakage. - Tests + Coverage and ML extras run in parallel with pytest-xdist (#1649). Both
jobs use-n auto, one worker per runner core; each worker gets its own temp test
database fromtests/conftest.py.