Repository navigation
Release v0.22.0 - #681
Merged
Merged
Release v0.22.0#681
Conversation
Move the six version sites to 0.22.0, turn the Unreleased changelog entries into the dated v0.22.0 section, name v0.22.0 as the current release candidate in the control documents, and add the release notes with their pending state. The notes cover the agent output route that now refuses a blocked request, and the opt-in vectors for the chunks of notes, which are off by default and have no published measurement. The notes have a test that runs their claims: the endpoint rules, the opt-in values, the off-by-default import, the policy decision of each kind of request, and the v0.21.1 side of each comparison from an export of the tag. The earlier release notes tests move one changelog section down, the mutation manifest is re-pinned to the changed files, and the three documents that said the continuity page and the walkthrough were on main now say from v0.22.0.
…angelog The new test held its dash characters as literals. They are escapes now, as in the tests of the earlier notes. One changelog entry called a check by a word the repository keeps out of its own text, so it says check, and the manifest digests of the changelog are refreshed.
samrusani
marked this pull request as ready for review
October 26, 2026 11:40
This was referenced Oct 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Release prep for v0.22.0, a minor release on v0.21.1. It moves every version site to 0.22.0, dates the eight changelog entries that sit under Unreleased, adds the notes in their pending state and records the release candidate in the control documents. v0.21.1 stays the latest published release, and nothing here tags, publishes or dispatches anything.
What v0.22.0 contains (
git log --first-parent v0.21.1..origin/main, merged at912bcff5):POST /v0/vnext/agents/ingest-outputrefuses a request that its agent policy blocks, with the HTTP 403 thatPOST /v0/vnext/sourcesgives, and writes no source, chunk, artifact, provenance link or memory for it. Credential material there answers HTTP 400, where v0.21.1 answered HTTP 500. PostgreSQL stack only.ALICE_SOURCE_EMBEDDINGS=on, an endpoint on this machine only), andALICE_SEARCH_QUALITY=vectorsranks passages with the vectors. Off by default, SQLite only, no migration. No measurement of the vectors is published, and the notes say so and do not claim better retrieval.bracesexception), Compare every paired read budget on median CPU and smallest wall time #675 (read budget test timing).credential_floor.pyandlegacy_credential_check.py).24 files under
apps/api/srcdiffer from v0.21.1. The behaviour changes among them are #680, #671 and #673. No tool is added (default 3, full 12, legacy 74 and 77), no migration is added (apps/api/alembicis byte for byte the folder of the tag, PostgreSQL stays at20261011_0097), and the only new CLI flags are--sourcesand--dropofalice-memory reindex-embeddings. There are five new settings and one new value ofALICE_SEARCH_QUALITY.What moved
scripts/release_check.pyrequires:pyproject.toml,apps/web/package.json,packaging/mcpb/manifest.json,plugins/alice-memory/.claude-plugin/plugin.json, and the two command pins inplugins/alice-memory/.mcp.jsonandplugins/alice-memory/hooks/hooks.json. Every other0.21.1stays, because it names the latest published release, the baseline, the checksums or the marketplace pin (refv0.21.1 and its commit8d0bac27).Unreleased (on main, not in v0.21.1):entries lose the prefix and the eighth is already without it; all eight move under the dated v0.22.0 heading (2026-10-26, in the formrelease_check.pyrequires), and an empty## Unreleasedis above it. Two wording edits beyond the prefix: the embeddings entry said "Nothing reads the vectors yet", which the next entry contradicts, so it now says nothing reads them unlessALICE_SEARCH_QUALITY=vectorsis set (run: on a vault that holds vectors, with the opt-in on and the endpoint set, a recall without that value returns the same bytes as v0.21.1 and makes the same one request, the memory query); and one noun in thebracesentry, in two places, is changed to meet the wording rule for this repository.docs/alpha/mcp-tools.md,docs/benchmarks/showcase/harness.mdanddocs/benchmarks/showcase/what-changed-and-why.mdsaid "On main, not in v0.21.1". They say "From v0.22.0" now, as Release v0.21.0 #660 did for v0.21.0. The marker test of v0.21.1 only matched the form with "Unreleased"; the new test matches both.docs/release/v0.22.0-release-notes.md, 14.4 KB, statependingandpending, no checksums file. Sections: What to do after upgrading, The agent output route, Passage vectors (an opt-in), Other changes in the package, Behaviour changes an integrator will notice, Security, What this release does not claim, Install. The Security section opens with the same two sentences as the v0.21.1 notes and ends its first paragraph withAdvisory identifier: pending.docs/vnext/README.mdgain "v0.22.0is the current release candidate. It is not published." and keep v0.21.1 as the latest published release.CURRENT_STATE.mdgets a "Whatv0.22.0Targets" section above "Whatv0.21.1Shipped".docs/alpha/known-limitations.mdis unchanged (see "Not fixed here").Tests
tests/unit/test_v0220_release_notes.py, 27 tests, 54 cases, modelled on the v0.21.1 test as it was in Release v0.21.1 #667 before the tag. It pins the pending notes and no checksums file, the size ceiling (17,500; the notes are about 14,400) and the section order, the six version sites and the marketplace pin, the candidate lines, the dated heading and the empty Unreleased section, both forms of the old marker, the dash and security wording and the pending advisory identifier, the seven upgrade steps, the numbers that drift (tool counts, the revision, the vault cap, the cache limit, the timeout, the pause, the 32 character floor, the prefix), the five settings and the two flags (read from the v0.21.1 export and from this tree), the package contents rule, andrelease_checkon the real tree. It also runs the claims of the notes:1,true,yesand others leave it off);blockedtest before the service call, theVNextCaptureValidationErrorin theexcept, the refusal in the connector service, none of them at v0.21.1;import-markdown,doctorandreindex-embeddings --sources --dropagainst a loopback endpoint that records every text: nothing sent by default, thesearch_document:prefix when on, the table made and dropped, a127.1endpoint leaving every chunk pending, links only and too short chunks not sent, a dry run sending nothing;git archiveinto a temporary folder and run in a subprocess: a vault that never turned the opt-in on opens and exports, a vault with vectors opens but its export fails withexport_faileduntil--drop, a vault v0.21.1 wrote opens here,ALICE_SEARCH_QUALITY=vectorsraises where this tree accepts it, and the Alembic folders are identical.test_v0211_release_notes.py: the version site test no longer reads the version sites, which belong to the v0.22.0 test now, and is renamedtest_the_marketplace_pins_the_published_release_and_the_notes_carry_its_install_lines, as Release v0.21.1 #667 did for the v0.21.0 test. The release check test runs the pre-tag rule for0.21.1explicitly.tomllibimport removed with it.test_v0200_release_notes.py,test_v0202_release_notes.py,test_v0210_release_notes.py,test_v0211_release_notes.py,test_data_dir_guard.py,test_mcp_readonly_hints.py,test_claude_code_plugin.py.test_v0220_release_notes.py, each one applied to a clone of this head with an exact single-match replace (or a created file), the named tests run with a green baseline first, and the file restored from saved bytes: all 26 fail the test they name (title, state comment, a section, a plugin pin, the candidate line, an entry under Unreleased, the old marker in a doc, a dash, the pending identifier, an upgrade step, the vault cap default, a number in the notes,.localhostdropped from the endpoint rule,1accepted as the opt-in, the route guard, the service refusal, unknown agents allowed to write,--dropleaving the table, the bootstrap making the table, a migration file,scriptsadded to the packages, the stale sentence back, the document prefix, a new setting name, the links rule, the loopback rule). 14 more on the edited existing tests: the v0.22.0 heading redated against the seven tests that index the changelog by position, the v0.21.1 heading renamed, the old marker in a v0.21.1 entry, the marketplaceref,shaand install line, the v0.21.1 notes state and the checksums file against the renamed test. All 40 fail the test they name.scripts/derived_label_mutations.json:lineandsha256refreshed on the 97 edits that nameCHANGELOG.md(43),docs/alpha/mcp-tools.md(52) andCURRENT_STATE.md(2). Everybeforetext still occurs once. All 97 cases were replayed withscripts/verify_derived_label_mutations.py --only NAME --output DIRagainst head913d3225(97 names, 97 results): 97 of 97 killed by the test they name, with a green baseline. No case names a test file that this PR changes.test_derived_label_mutation_manifest_matches_tree.pypasses.Claim checks
Every sentence of the notes that states a behaviour was run against this branch and against an export of the v0.21.1 tag (
git archive v0.21.1), each with its ownPYTHONPATH, through the real entry points: the mounted ASGI application on the local PostgreSQL test database (a fresh database per test),alice-memory import-markdown,import-chatgpt,export,import,doctor,sourcesandreindex-embeddings, andalice-memory mcpover stdio (JSON-RPCtools/call). The embeddings endpoint was a small server on 127.0.0.1 (and one on::1) that records every text it receives. No other host was contacted. Verdicts below are v0.21.1 then this branch.POST /v0/vnext/agents/ingest-output,read_only_agentkeyagent.policy_blocked; ids in the body null, decisionblockedagent policy blocked this action; no row in those tables; eventspolicy.decision,agent.policy_blocked, 2agent.identity_upserted; +1agent_identitiespropose_memorymemory_proposal_agentkey;project_scoped_agentkey asking forhealthagent_idkiln-bot, no profileagent_idhermesoropenclaw; declaredadmin_agent;trusted_local_agentkeykiln-botdeclaringread_only_agenthermes)CaptureCredentialRefusedraised past the middleware), nothing writtenvNext agent output ingest request is invalid, token not repeated, nothing writtenPOST /v0/vnext/sourceswith the same read-only keyalice_vnext_ingest_agent_outputandalicebot vnext agents ingest-output, read-only profiletrusted_local_agentwritesalice-memoryhas no serve commandagent_outputwithmetadata_json.policy_decision.decisionblocked; artifactneeds_review; memorycandidateimport-markdownwith the endpoint variables set and no opt-inchunk_embeddingsin the receipt; no table;ALICE_SOURCE_EMBEDDINGSof1,true,yes: 0 textsALICE_SOURCE_EMBEDDINGS=onsearch_document: <title>...; tablesource_chunk_embeddingsmadelocalhost,embed.localhost,127.0.0.1,[::1]127.1,192.0.2.1, or127.0.0.1withhttp_proxysetendpoint_not_on_this_machinein 0.7 s# Tnote withok, a links only note;--dry-runskippedtoo_short1 andlink_only1; dry runreasondry_run, 0 sent--sensitivity confidentialalice_captureandimport-chatgpt, endpoint set and opt-in onchunk_embeddings, 0 texts sentchunk_embeddingsin the receipt, 1 text sent for each; with the opt-in off, nochunk_embeddingsand none sentalice-memory doctorsources delete,sources prune,import-markdown --supersedeon a vault with vectorschunk_vectors(2 deleted with a source of 2 chunks;prunecounts 0 after a supersede already removed them), andretained_datanames vectorsexportof a vault with vectorsexport_failed, exit 1importof that exportreindex-embeddings --sources --dropdoctor,brief,recall,import-markdownof v0.21.1 on a vault with vectorsdoctor,brief,export,alice_recallalice_recallwithALICE_SEARCH_QUALITY=vectorstool_request_failedretrieval.stages.sourcessourcevectors,vector.statusenabled, a second request with thesearch_query:prefixdisabled: source embeddings are off; same sources aspassagealice_recall, 5 queries,debugon, no new setting; and again on a vault with vectors with the opt-in on and the endpoint setalice_recallwithALICE_SEARCH_QUALITYunset orpassage, opt-in on, endpoint set, vault with vectorsvectorsthere are two, the second with thesearch_query:prefixrecall_source_rankingwithvectorson the PostgreSQL storepassage(unit test)git diff --stat v0.21.1 origin/main -- apps/api/alembic workerspython -m build --no-isolationscripts/orapps/web; the four new vector modules are in the wheelalice_vnext_ingest_agent_outputon a SQLite vaulttool_execution_failedtool_execution_failed(same)Three things the check turned up, which the notes handle:
_persist_vnext_deferred_embeddingsafter its commit, v0.21.1 called it with zero inputs for every case above (a candidate memory is not embedded), and this branch does not reach it for a blocked request. The notes say "memory" and make no claim about an embedding job; the changelog sentence is as merged.onturnsALICE_SOURCE_EMBEDDINGSon. The code reads it case-insensitively (ONcounts). The notes state only that1,trueandyesleave it off.Validation
Run on head
913d3225in a worktree, with the repository's own Python andPYTHONPATHset to the worktree'sapps/api/src.python scripts/release_check.pyand with--require-finalized-release-docs:Release check: PASS (alice-memory 0.22.0)for both.python scripts/check_control_doc_truth.py: PASS (16 documents verified).python scripts/check_commit_authors.py --base origin/main --head HEAD: PASS (3 commits).scripts/check_protected_paths.pycategorization of the 27 changed files: no protected area is touched.ruff checkon the changed Python files: clean.tests.yml, each run aspython -m pytest <selection> -q -p no:cacheprovideron this head, the five in parallel, from a clean tree with the logs outside it (the five lists name 658 files, which is everytests/unit/test_*.py, once each; the host home guard refused 0 path checks in each):test_[p-r]*,test_saved_p*,test_[t-w]*): 5,971 passed, 0 failed, 2 skippedtest_[0-9a-c]*,test_s[!aoq]*,test_saved_quotes_*): 4,227 passed, 0 failed, 11 skippedtest_[j-o]*,test_s[oq]*): 14,997 passed, 0 failed, 23 skippedtest_saved_quote_*): 488 passed, 0 failedtest_[d-i]*): 2,717 passed, 0 failed, 4 skippedpytest eval/longmemeval -q: 218 passed.pytest tests/integration/test_ingest_output_policy_postgres.pyagainst the local PostgreSQL 16: 22 passed on this head. The same file copied into an export of the v0.21.1 tag: 15 failed and 7 passed (the 7 are the key-bound-to-a-project cases and the allowed writes, which v0.21.1 already handled).913d3225.make release-check, the web tests, the real-host jobs, and thepublish-recheck-rehearsal.ymlrun itself. CI runs the required ones, and the rehearsal is dispatched on the merge commit before the tag.Not fixed here
docs/alpha/known-limitations.mdstill says v0.21.0, as it did after v0.21.1, and five tests pin its header to v0.21.0. It does not list the limit that remote embeddings endpoints are not supported for source text, which the notes,SECURITY.mdanddocs/alpha/mcp-tools.mdstate.docs/alpha/mcp-tools.mdsays only the valueoncounts forALICE_SOURCE_EMBEDDINGS; the code acceptsONtoo. 52 manifest cases cite that file, so a wording fix there belongs in its own change.What is left for after publication
The same mechanical change as after v0.21.1: add
docs/release/v0.22.0-checksums.txtand set the notes state topublishedandrecorded; fill in the advisory identifier where the notes sayAdvisory identifier: pending.and change the test that pins the sentence; move the statements that name the latest published release, the baseline and the checksums to v0.22.0 (README, ARCHITECTURE, PRODUCT_BRIEF, ROADMAP, RELEASING, CURRENT_STATE,docs/vnext/README.md) and drop the candidate lines; move the marketplacerefandshato the v0.22.0 tag commit and the sentences that name the v0.21.1 pin; move the install and checkout lines; add the v0.22.0 notes and changelog section totest_published_release_notes_stay_immutable.py; turn the pending-state tests oftest_v0220_release_notes.pyinto the published form; refreshlineandsha256in the manifest.Upgrade Overview
Protected Areas
None is touched.
scripts/check_protected_paths.pycategorizes none of the 27 changed files. The changes are version strings, documentation, tests and the mutation manifest.Compatibility Impact
No code change in this PR. The code v0.22.0 ships is the code on main. The package version moves from 0.21.1 to 0.22.0, and the MCPB manifest and the Claude Code plugin pins move with it. The marketplace file still pins the v0.21.1 tag commit until the post-publication change.
Migration / Rollout
No migration is added. PostgreSQL stays at revision
20261011_0097. A SQLite vault opens in v0.21.1 and v0.22.0 either way, except that a vault which holds chunk vectors has to be dropped withalice-memory reindex-embeddings --sources --dropbefore v0.21.1 can export it. Tagging, the release gate, the rehearsal run and publication are not part of this PR.Operator Action
None for this PR. Before the tag, dispatch
publish-recheck-rehearsal.ymlon the merge commit and confirm its run is on the SHA to be tagged.Validation
scripts/release_check.py(with and without--require-finalized-release-docs),scripts/check_control_doc_truth.py,scripts/check_commit_authors.py, the protected-path categorization,ruff checkon the changed Python files, the five unit shard selections oftests.yml,pytest eval/longmemeval, the route's PostgreSQL test file, and the manifest replays above.Rollback
Revert the merge commit. Nothing is tagged or published by this PR, so there is no external state to undo.
Commits after
913d3225c0f566b6Say which agent output requests the policy blocks. A sensitivity outside a key's labels does not block the request on its own: run on this branch against the local PostgreSQL 16, atrusted_local_agentkey and aproject_scoped_agentkey that ask forconfidentialorregulatedget HTTP 201, the decisionallowed_with_filtering(restricted_sensitivity_filtered), and one source and one artifact. The notes said that such a key is refused, in upgrade step 3 and under Security; both now name domains only, as the CHANGELOG entry does, and one sentence says that sensitivity alone does not block, as in v0.21.1. The release notes tests (776 in 25 files),release_check.pyplain and with--require-finalized-release-docs, andcheck_control_doc_truth.pypass.91dfdea7Find the package list without setuptools in the v0.22.0 notes test. CI's environment does not install setuptools, sotest_the_package_holds_none_of_the_bench_scripts_the_walkthrough_or_the_consolefailed in unit shard 1. The test now walks the packages itself and finds the same lists asfind_packagesforapps/api/src(10) andworkers(1). The file passes with setuptools hidden (54 passed), and ascriptspackage created underapps/api/srcfails the test.