Skip to content

v0.22.0 post-publication: digests, published state and marketplace pin - #683

Merged
samrusani merged 2 commits into
mainfrom
docs/v0.22.0-post-publication
Oct 27, 2026
Merged

samrusani merged 2 commits into
mainfrom
docs/v0.22.0-post-publication

Conversation

@samrusani

@samrusani samrusani commented Oct 27, 2026 •

Copy link
Copy Markdown
Owner

Summary

The post-publication change for v0.22.0, modelled on the one for v0.21.1 (#668) and on RELEASING.md "After Publication". Nothing here tags, publishes or dispatches anything. Two commits: the change, and the refresh of the mutation manifest.

  • docs/release/v0.22.0-checksums.txt records the published digests in the v0.21.1 file's exact format (header and layout identical, version replaced).
    • wheel 803f466454de8973ed64db47de9e3c366943fc8833ed3ae0b40fbd9a48018fdb (1,977,474 bytes)
    • sdist c2fe674d9d475ad04f6ed56df3ed4d55a1aef96209dbb1f8d86f07bf7634296a (1,736,968 bytes)
  • The v0.22.0 notes state is published and recorded (the only pair RELEASING.md and the immutability test allow after publication). Line 2 is the only tagged line that changes. Advisory identifier: pending. stays as tagged: the identifier is not assigned yet and a later dated update adds it.
  • Control documents name v0.22.0 as the latest published release and v0.21.1 as the immediately prior one (README, ARCHITECTURE, PRODUCT_BRIEF, ROADMAP, RELEASING, CURRENT_STATE, docs/vnext/README.md). Every v0.22.0 release-candidate line is gone. In CURRENT_STATE "What v0.22.0 Targets" is now "What v0.22.0 Shipped", the v0.21.1 section says it is the immediately prior published release, and the v0.21.0 section says it is an earlier one. The README and vNext README release-notes links point at the v0.22.0 notes.
  • .claude-plugin/marketplace.json moves the plugin entry's ref to v0.22.0 and sha to a6a5f49eebb7377f40b388f2ffe07290b05b85fb, the commit of the annotated tag (and the merge of Release v0.22.0 #681). Nothing else in the file changes. The copy inside the v0.22.0 tag still pins v0.21.1 and 8d0bac27, checked with git show.
  • Sentences that said the marketplace pins v0.21.1 now say v0.22.0 (README, docs/integrations/claude-code-plugin.md, plugins/alice-memory/README.md, CURRENT_STATE). The plugin page and CURRENT_STATE also say that the v0.22.0 tag carries the file, still pinned to the v0.21.1 tag commit.
  • Install and checkout lines that named v0.21.1 as current now name v0.22.0: README, docs/alpha/headless-ubuntu-install.md (two lines, --tag v0.22.0), docs/alpha/quickstart.md, docs/integrations/reference-paths.md.
  • docs/alpha/known-limitations.md now describes v0.22.0 (header, release notes link, the From marker sentence and the heading of the open list) and gains one bullet in the SQLite list: from v0.22.0, with ALICE_SOURCE_EMBEDDINGS=on (off by default), the chunks of imported and captured notes go only to an embeddings endpoint on this machine, nothing is sent to any other endpoint and the chunks stay pending, and memory embeddings still go to any endpoint you configure. The rule is the one in the "Only to this machine" section of the notes and in docs/alpha/mcp-tools.md. The bullet starts with From v0.22.0, and links mcp-tools.md#embeddings-of-source-chunks. The older From v0.21.0 clauses stay, because they still say what changed in v0.21.0 and the header names both markers. Nothing else on the page was reworded. The page is 10,908 characters (it was 10,493, the exact cap), so MAX_PAGE_CHARS moves to 10,908.
  • Dated Update (2026-10-27) paragraphs, in the blockquote form the earlier updates use. The date is the day of this change.
    • docs/release/v0.22.0-release-notes.md: 1 update beside upgrade step 7, which says the marketplace file on main pins the v0.21.1 tag commit until a change after the release moves it. The tagged sentence stays and the update says the change has been made. This is the one change to the notes beyond line 2; it can be dropped with its test (test_the_notes_say_beside_their_marketplace_step_that_main_now_pins_v0220) if line 2 alone is wanted.
    • A follow-up after each of the existing 2026-10-23 marketplace updates: 4 in docs/release/v0.19.2-release-notes.md, 3 in docs/release/v0.20.0-release-notes.md, 3 in docs/release/v0.20.2-release-notes.md, 1 in docs/release/v0.21.1-release-notes.md. Each says main now pins the v0.22.0 tag commit and which older tag still pins which commit.
    • No update is added to the v0.21.0 notes (they carry no marketplace statement) and no limitation update is added anywhere: nothing the earlier notes list as open changes in v0.22.0. CHANGELOG.md is not touched.
  • scripts/derived_label_mutations.json: 15 cases (16 edits) point at a file or line this change moved. line and sha256 are refreshed; the case retired-limitations-restores-the-graph-exception edits the heading of the open list, so its before and after text now say Open in v0.22.0. This is a separate commit.

Facts and where each was read

All read on 2026-10-26 and 2026-10-27, with GET requests only. No package file was downloaded.

  • PyPI version JSON (https://pypi.org/pypi/alice-memory/0.22.0/json): version 0.22.0, not yanked, Python >=3.12. Wheel 1,977,474 bytes, uploaded 2026-10-26T23:33:07Z; sdist 1,736,968 bytes, uploaded 2026-10-26T23:33:09Z; the digests are the two above. The simple index in JSON form lists the same digests, sizes and no yank. The first read of the project JSON was a cached copy that still said 0.21.1 (max-age=900); the next read and the simple index say 0.22.0.
  • PyPI integrity API (https://pypi.org/integrity/alice-memory/0.22.0/<file>/provenance), each file: one bundle, publisher GitHub, repository samrusani/AliceMemory, workflow publish-pypi.yml, environment pypi, one attestation whose subject is the file name and the digest above.
  • gh release view v0.22.0: not a draft, not a prerelease, published 2026-10-26T23:33:23Z, target a6a5f49eebb7377f40b388f2ffe07290b05b85fb. Assets: the wheel and the sdist with the same sizes and digests as PyPI, and SHA256SUMS (196 bytes, digest 3f9a31b1b6e9f7311d80b3b57955dd2a52aa2b21cb9db0055ab48a96f84989b7). The two lines <digest> <name> rebuilt locally from the digests above are 196 bytes and have exactly that SHA-256, so the asset lists both files. It was not downloaded.
  • gh run view 40412311129: Publish to PyPI, workflow_dispatch on the ref v0.22.0, head a6a5f49e, success. The verify, stage, publish and finalize jobs succeeded and the three recovery jobs were skipped.
  • Tag: refs/tags/v0.22.0 is the annotated tag object 2aa9e4442f7509eeb7cdf8b9b7dce43b489f909e (gh api repos/samrusani/AliceMemory/git/ref/tags/v0.22.0), which points at a6a5f49e (git rev-parse v0.22.0^{commit}).
  • The third source the checksums header names: on 2026-10-26, after publication, both files were downloaded fresh from the PyPI JSON urls and hashed locally: 803f466454de8973ed64db47de9e3c366943fc8833ed3ae0b40fbd9a48018fdb (1,977,474 bytes) and c2fe674d9d475ad04f6ed56df3ed4d55a1aef96209dbb1f8d86f07bf7634296a (1,736,968 bytes), equal to PyPI and to SHA256SUMS (shasum -a 256 -c SHA256SUMS: both OK). The wheel installed offline (pip install --no-deps --no-index --target) reports 0.22.0, and its routers/vnext_memories.py, vnext_connectors.py and source_embedding_policy.py are byte-identical to the tag's. The header sentence is therefore true for v0.22.0.

Tests

  • test_v0220_release_notes.py moves to the published state: 30 tests, 57 cases (it was 27 and 54).
    • the notes test requires published / recorded and the checksums file;
    • a new test pins the two digests, the file names and the format against the v0.21.1 file, and a new test pins the dated update beside step 7;
    • the version-site test requires the marketplace ref and the tag commit sha, and that the copy inside the v0.22.0 tag pins v0.21.1 and its commit (read with git show);
    • the control-document test and a new install-line test now live here: v0.22.0 latest, v0.21.1 prior, no v0.22.0 candidate line, the CURRENT_STATE headings and leads, and the tag history of the plugin pin;
    • the changelog test no longer asks for an empty Unreleased section;
    • the last test pins that release_check.py passes and that its pre-tag mode refuses the published tree for exactly three reasons, plus the one more reason an Unreleased entry on main adds.
  • Every comparison with v0.21.1 reads both sides from the tags. git archive exports apps/api/src and apps/api/alembic of v0.22.0 and of v0.21.1 into temporary folders (_export, two module fixtures), and the code of an export runs in a subprocess. This covers:
    • the Alembic folder: the folder at v0.22.0 is byte for byte the folder at v0.21.1;
    • the settings and flags: the names matching ALICE_ under apps/api/src and the flags of every alice-memory command, at each tag;
    • the numbers that drift: the tool counts (3, 12, 74, 77), the PostgreSQL head revision 20261011_0097 and the vector limits and defaults, all printed by the code of the v0.22.0 tag (one subprocess) or read from its folder;
    • the agent output route: the blocked test before the service call, the VNextCaptureValidationError in the except, the refusal in the connector service and in the MCP and CLI doors, read from the source at each tag with _tagged.
      Nothing else compared with v0.21.1 reads the working tree, so a migration edited on main later (to repair it for a stricter database owner, say), a new setting, a new tool or a change to the route does not fail a claim about what v0.22.0 shipped.
  • Still against the module in the working tree, as test_credential_marker_lengths.py does: the behaviour tests (the endpoint rules, the opt-in values, the policy decision of each request kind, the import against a loopback endpoint, the vault v0.21.1 opens), the version-site check and the packaging check of pyproject.toml. A later change to that behaviour has to update them.
  • test_v0211_release_notes.py, test_v0210_release_notes.py, test_v0202_release_notes.py, test_v0200_release_notes.py: the marketplace tests require v0.22.0 and its commit. The control-document and install-line tests of the v0.21.1 file are gone (they belong to the v0.22.0 file now); the step 6 test of the v0.21.1 notes pins both dated updates in order; the chains of the v0.20.2 notes shift by one paragraph and new tests pin the 4, 3 and 3 follow-ups of 2026-10-27, each after its 2026-10-23 follow-up.
  • test_claude_code_plugin.py pins the new README and plugin README wording and the plugin page's v0.22.0 tag history. test_readme_facts_live_in_the_docs.py follows the README checkout line. test_published_release_notes_stay_immutable.py now covers the notes and the changelog section of v0.22.0, so their tagged lines are held and only dated paragraphs can be added.
  • The limitations page: test_known_limitations_page_shape.py, test_unscheduled_promises_docs.py, test_hidden_ids_disclosure_docs.py, test_expired_memories_docs.py and test_known_limitations_current_facts.py follow the v0.22.0 header and heading. The last has a new test for the bullet: it runs source_embedding_settings (off for an empty environment, on only for on) and endpoint_is_loopback (accepts localhost, 127.0.0.1 and [::1]; refuses a remote name, 192.0.2.1 and 127.1), and pins the same rule in mcp-tools.md and in the notes.

Validation

All on the head of this branch, run with the development Python and PYTHONPATH set to this checkout's apps/api/src.

  • python scripts/release_check.py: PASS (alice-memory 0.22.0). python scripts/release_check.py --tag v0.22.0 fails on purpose, because --tag applies the pre-tag rule: both statuses must be pending before the tag, and the checksums file must not exist on the pre-publication tag. It reports those three reasons, and a fourth only because this head is not the tag commit.
  • python scripts/check_control_doc_truth.py: PASS.
  • python scripts/check_commit_authors.py --base origin/main --head HEAD: PASS (2 commits).
  • ruff check apps/api/src/alicebot_api scripts tests eval/longmemeval: clean. No file under apps/ changes, so mypy is not run.
  • tests/unit in the five shard selections of .github/workflows/tests.yml, each run as its own process (python -m pytest <selection> -q -p no:cacheprovider). The selections cover all 658 test files once (209, 214, 125, 11 and 99 files).
    • shard 1: 5,976 passed, 0 failed, 2 skipped
    • shard 2: 4,227 passed, 0 failed, 11 skipped
    • shard 3: 14,998 passed, 0 failed, 23 skipped
    • shard 4: 488 passed, 0 failed
    • shard 5: 2,717 passed, 0 failed, 4 skipped
    • Total 28,406 passed, 40 skipped.
  • pytest eval/longmemeval: 218 passed.
  • The 13 test files this change touches and the manifest test, run together: 295 passed, 2 skipped (the two Claude Code real-host checks, which run on Linux).
  • No protected path is touched: the 34 changed files, run through scripts/check_protected_paths.py with an event payload for this head, hit none. The added lines and the commit messages hold no em or en dash, home path, user name, e-mail address or process wording.

Mutations

Each applied alone to a clone of this head, with the selected tests run after a green baseline and the file restored from saved bytes (the digest compared after each).

  • The tag mutations the converted tests are for. A temporary tag in the clone, moved to a tree with one change (no commit, nothing pushed, the real tags checked unchanged afterwards):
    • one byte added to a migration at the v0.22.0 tag: test_no_migration_the_alembic_folder_at_v0220_is_the_one_at_v0211 fails;
    • the same at the v0.21.1 tag: the same test fails (so both sides are read from the tags);
    • a new migration file at the v0.22.0 tag: that test and the numbers test (head revision) fail;
    • a new ALICE_ name in config.py at the tag: the settings and flags test fails;
    • the blocked guard of the route changed at the tag: the route test fails;
    • DEFAULT_MAX_VECTORS changed at the tag: the numbers test fails.
  • The same kinds of change on the working tree, the tags untouched: a migration edited, a new migration file, a new ALICE_ name, the route guard changed, DEFAULT_MAX_VECTORS changed. The 57 cases of test_v0220_release_notes.py pass each time. The test as merged on main (a6a5f49e), run with an edited migration on the working tree, fails.
  • 43 content mutations, each with the 13 test files above, release_check.py and the truth check run: 43 of 43 killed, each by a test of those files. They cover the notes state either way (2), the checksums file deleted, a digest digit, a file name, the header version (4), the marketplace ref and one digit of sha (2), the candidate line back in README and ARCHITECTURE (2), the latest or prior release named wrongly in ARCHITECTURE, CURRENT_STATE (heading, lead, tag history, pin sentence), PRODUCT_BRIEF, ROADMAP, RELEASING and the vNext README (9), the three install lines and the README checkout line (4), the plugin README and plugin page pins (3), the step 7 update deleted or naming the wrong pin (2), a tagged line reworded, an undated sentence in the notes and in the changelog section (3), the follow-ups of the v0.19.2, v0.20.0, v0.20.2 and v0.21.1 notes (4), the limitations bullet (3), the page header, heading and notes link (3), planned for v0.22.0 beside an item (1), and endpoint_is_loopback accepting every endpoint (1). Of these, the truth check or the release check also failed for 16.
  • Immutability list entries are what hold the notes. With v0.22.0 taken out of the notes list of test_published_release_notes_stay_immutable.py, a reworded tagged line of the v0.22.0 notes passes it; with it out of the changelog list, an undated sentence added to the section passes it; with it in, both fail.
  • Manifest. The 15 refreshed cases were replayed with scripts/verify_derived_label_mutations.py --only <name> --output <dir> against the final head 28723254 (15 names, 15 results): 15 killed, 0 survived, each with a green baseline.
  • Not killed by design: nothing offline compares the digests in the checksums file with PyPI. A digest changed to another valid hex string is caught only by the test that holds both digests as constants.

Left open

  • real-host-ci.yml -f job=marketplace-check is to be dispatched on this branch and again on main after the merge. It is not dispatched from this PR. The step "Validate the committed marketplace" reads this branch's file and must show alice-memory@alicememory at 0.22.0. The later steps that add the marketplace from the HTTPS URL and the shorthand clone the default branch, so before the merge they read main's file, which still pins v0.21.1; they read green only on main after the merge.
    • gh workflow run real-host-ci.yml --ref docs/v0.22.0-post-publication -f job=marketplace-check
    • gh workflow run real-host-ci.yml --ref main -f job=marketplace-check
  • The advisory identifier is still pending in the notes. A later dated update adds it. The tagged sentence Advisory identifier: pending. stays as tagged and the notes test still pins it; the update will need its own test.
  • The third source of the checksums header (see "Facts") was not repeated here.
  • CI on this SHA
  • marketplace-check dispatched on the branch (first step) and on main after the merge (all steps)

Add docs/release/v0.22.0-checksums.txt with the published digests, set the
v0.22.0 notes to published and recorded, and pin the marketplace file to the
v0.22.0 tag commit. The control documents name v0.22.0 as the latest published
release and v0.21.1 as the one before it, and the install lines follow.

Dated 2026-10-27 updates say beside each marketplace statement of the older
notes that main now pins v0.22.0. The known limitations page describes v0.22.0
and states that source embeddings go only to an endpoint on this machine.

The v0.22.0 notes test reads both sides of every comparison with v0.21.1 from
the tags, so a later change to a migration, a setting or the agent output route
on main does not fail a claim about what v0.22.0 shipped.
Update line and sha256 of the cases that point at files this change edits, and
the heading text of the case that edits the open list of the limitations page.
@samrusani
samrusani marked this pull request as ready for review October 27, 2026 00:28
@samrusani
samrusani merged commit 115433f into main Oct 27, 2026
49 of 50 checks passed
@samrusani samrusani mentioned this pull request Oct 30, 2026
5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant