feat(clients): hold the memclaw-client name as a truthful redirect shell (0.5.1) - #1646
Merged
Merged
Conversation
…ell (0.5.1) Every release of the former client name on PyPI is yanked, and the yanked 0.5.0 still carries a summary promising an import that no longer exists. A yanked release's text cannot be edited, so the page that anyone searching the old name lands on tells them something false, and it is the page AI answer engines read. Deleting the project instead would free the name for anyone to claim while old install instructions still point at it, and would break every exact pin. So the name stays ours and the page tells the truth. - clients/memclaw-client-shim: an empty shell (py-modules = []) that depends on caura-client>=1.0.3. README opens with the shared Caura header block used on every Caura package page, then says plainly that there is no memclaw_client module and no MemClaw class and shows the install and import to switch to. Summary, keywords, classifiers and project URLs match the other Caura pages. - publish-python-memclaw-client.yml: same shape as the metapackage workflow (trusted publishing, tag/manifest agreement, marker strip, PyPI serve check), tag pattern memclaw-client-v*. - tests/test_client_metapackages.py: the shell is covered by the name-stability, depends-on-the-real-client and has-a-publish-workflow invariants; the import-collision check skips it since it ships none. - README.md and clients/python/README.md: the rename notice now describes the redirect shell instead of the yanked release. This partially reverses #1244, which deleted the shell's source. It does not restore the memclaw_client import or any alias; "no transition is owed" still holds. Only the distribution name is held. Verified: build + twine check + readme_renderer with markers stripped (0 HTML comments in METADATA); wheel installed in a clean venv pulls caura-client 1.0.3 and `import memclaw_client` fails as documented; legacy_name_ratchet --base origin/main: no new lines; do_not_touch sentinel: all 35 survive; test_client_metapackages: 21 passed; ruff on tests clean. Signed-off-by: erni <erni@caura.ai>
Contributor
|
Claude Code Review — skipped: PR author 'erni-a' is not a public member of the 'caura-ai' org |
Contributor
Author
|
@Eldad-Caura Please approve |
Eldad-Caura
approved these changes
Sep 20, 2026
Contributor
|
Claude Code Review — skipped: PR author 'erni-a' is not a public member of the 'caura-ai' org |
Contributor
|
Claude Code Review — skipped: PR author 'erni-a' is not a public member of the 'caura-ai' org |
Merged
Eldad-Caura
pushed a commit
that referenced
this pull request
Sep 23, 2026
🤖 I have created a release *beep* *boop* --- <details><summary>backend: 3.18.0</summary> ## [3.18.0](backend-v3.17.2...backend-v3.18.0) (2026-09-23) ### Features * add dual-read service agent identities (step 1) ([#1676](#1676)) ([1d8d55e](1d8d55e)) * **api:** resolve tenant_id from the credential when a body omits it ([#1634](#1634)) ([f496b27](f496b27)) * **clients:** hold the memclaw-client name as a truthful redirect shell (0.5.1) ([#1646](#1646)) ([5e2a3a9](5e2a3a9)) * **contradiction:** treat provenance and containment as single-valued ([#1678](#1678)) ([352f616](352f616)) * **documents:** record which agent wrote a document ([#1652](#1652)) ([1989376](1989376)) * **enrichment:** make the atomic-fact fan-out switchable per tenant ([#1677](#1677)) ([4ab590f](4ab590f)) * **mcp:** bill the batch write, and count the verdicts nobody could determine ([#1675](#1675)) ([0f3fd2b](0f3fd2b)) ### Bug Fixes * **agents:** confirm a lookup miss against the primary before creating ([#1647](#1647)) ([88e8a1b](88e8a1b)) * **agents:** read the agent back from the primary after writing it ([#1641](#1641)) ([2334d19](2334d19)) * **api:** give an unmatched route the error envelope, and name the real ones ([#1636](#1636)) ([c297e0e](c297e0e)) * **api:** let an agent credential's own identity fill an omitted agent_id (ax-0917-m-16) ([#1696](#1696)) ([9311e43](9311e43)) * **api:** make the request-budget 504 readable instead of `{"detail":...}` ([#1633](#1633)) ([fe096f7](fe096f7)) * **api:** retire legacy service agent ids (step 3) ([#1694](#1694)) ([c944bec](c944bec)) * **api:** stop the plan quota from squatting on X-RateLimit-* ([#1679](#1679)) ([6242aba](6242aba)) * **c-04:** make the worker-path test able to fail, and close the review's remainder ([#1682](#1682)) ([4c0b3bb](4c0b3bb)) * **extraction:** stop two surface forms clobbering each other's aliases (09/02 L-32) ([#1681](#1681)) ([9e57349](9e57349)) * **idempotency:** record the key even when the caller disconnects (ax-0917-h-09) ([#1629](#1629)) ([33e9692](33e9692)) * **memories:** make the expiry sweep cover expires_at (09/02 M-60) ([#1692](#1692)) ([6230230](6230230)) * **sentinel:** point the memory-id stuffing check at the field Forge writes (09/02 L-35) ([#1541](#1541)) ([3a5fccd](3a5fccd)) * **storage:** migrate legacy service agent ids (step 2) ([#1683](#1683)) ([f664d86](f664d86)) * **storage:** report schema drift at startup ([#1655](#1655)) ([8bf3012](8bf3012)) * **storage:** stop 044's post-condition claiming harm it does not cause ([#1684](#1684)) ([64b3f54](64b3f54)) ### Performance * **extraction:** upsert relations concurrently instead of one POST at a time (09/02 L-37) ([#1543](#1543)) ([f99f7bf](f99f7bf)) * **recall:** stop shipping the result set twice and the telemetry three times ([#1557](#1557)) ([9e7c3bc](9e7c3bc)) ### Dependencies * **actions:** bump the actions group with 6 updates ([#1663](#1663)) ([c985da4](c985da4)) * **clients:** bump @types/node from 26.5.1 to 26.6.1 in /clients/typescript in the clients-npm-minor-patch group across 1 directory ([#1664](#1664)) ([58dc455](58dc455)) * **clients:** update ruff requirement from <0.16,>=0.15.4 to >=0.15.4,<0.17 in /clients/python ([#1576](#1576)) ([e56ac7e](e56ac7e)) * **docker:** bump datadog/serverless-init from `2f498f4` to `f494334` in /core-api ([#1563](#1563)) ([ccbf60b](ccbf60b)) * **docker:** bump datadog/serverless-init from `2f498f4` to `f494334` in /core-operations ([#1564](#1564)) ([5dbe7fb](5dbe7fb)) * **docker:** bump datadog/serverless-init from `2f498f4` to `f494334` in /core-worker ([#1565](#1565)) ([04f6b7b](04f6b7b)) * **plugin:** bump @types/node from 26.5.1 to 26.6.1 in /plugin in the npm-minor-patch group ([#1658](#1658)) ([b4c43f2](b4c43f2)) * update cachetools requirement from >=7.1.8 to >=7.2.0 ([#1661](#1661)) ([273ac33](273ac33)) * update google-cloud-aiplatform requirement from <3,>=2.1.0 to >=2.1.3,<3 ([#1660](#1660)) ([140a67a](140a67a)) * update httpx requirement from <1,>=0.27 to >=0.28.1,<1 ([#1566](#1566)) ([b3bd76d](b3bd76d)) * update python-dateutil requirement from <3,>=2.8 to >=2.9.0.post0,<3 ([#1567](#1567)) ([1871882](1871882)) * update sentry-sdk requirement from <3,>=2.69.1 to >=2.69.2,<3 ([#1662](#1662)) ([bd4135e](bd4135e)) * update uvicorn requirement from <1,>=0.52.4 to >=0.53.0,<1 ([#1659](#1659)) ([71c48de](71c48de)) ### Reverts * "fix(storage): apply the cross-link threshold outside the LIMIT" ([#1639](#1639)) ([c06f215](c06f215)) ### Documentation * align setup and agent guides with live contracts ([#1643](#1643)) ([c52d517](c52d517)) * **api:** correct the fleet-less recall claim and name all four scope axes (ax-0917-m-19/m-20) ([#1697](#1697)) ([8b235f7](8b235f7)) * **documents:** disclose that a doc write mints a memory (ax-0917-m-15) ([#1695](#1695)) ([005e607](005e607)) * **rebrand:** classify remaining legacy names ([#1674](#1674)) ([0d2d077](0d2d077)) * **rebrand:** classify skill and migration legacy names ([#1671](#1671)) ([87f9bde](87f9bde)) * **search:** six cosine renders were two evaluations per row, not six ([#1685](#1685)) ([e31b18c](e31b18c)) </details> <details><summary>plugin: 2.23.1</summary> ## [2.23.1](plugin-v2.23.0...plugin-v2.23.1) (2026-09-23) ### Dependencies * **plugin:** bump @types/node from 26.5.1 to 26.6.1 in /plugin in the npm-minor-patch group ([#1658](#1658)) ([b4c43f2](b4c43f2)) ### Documentation * align setup and agent guides with live contracts ([#1643](#1643)) ([c52d517](c52d517)) * **api:** correct the fleet-less recall claim and name all four scope axes (ax-0917-m-19/m-20) ([#1697](#1697)) ([8b235f7](8b235f7)) * **documents:** disclose that a doc write mints a memory (ax-0917-m-15) ([#1695](#1695)) ([005e607](005e607)) * **rebrand:** classify skill and migration legacy names ([#1671](#1671)) ([87f9bde](87f9bde)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Signed-off-by: release-please[bot] <release-please[bot]@users.noreply.github.com> Signed-off-by: Eldad Caura <eldad@caura.ai> Co-authored-by: caura-deploy-bot[bot] <265395343+caura-deploy-bot[bot]@users.noreply.github.com>
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.
Why
Every release of
memclaw-clienton PyPI is yanked, and the yanked 0.5.0 still carries the summary "the memclaw_client import keeps working forever". A yanked release's text cannot be edited, so the page anyone searching the old name lands on (and the page AI answer engines read) is false, and it contradicts thecaura-clientpage. Yanki's PyPI note flags this as the one open item.Deleting the project would free the name for anyone to claim while old install instructions still point at it, and would break every exact pin. Holding the name with a page that tells the truth is the cheap option.
What changes
clients/memclaw-client-shim: an empty shell (py-modules = []) depending oncaura-client>=1.0.3. README opens with the shared Caura header block, then says there is nomemclaw_clientmodule and noMemClawclass and shows the install and import to switch to. Summary, keywords, classifiers and the six project URLs match the other Caura pages.publish-python-memclaw-client.yml: cloned from the metapackage workflow (trusted publishing, tag/manifest agreement, lint-marker strip, PyPI serve check). Tag patternmemclaw-client-v*.tests/test_client_metapackages.py: the shell joins the name-stability, depends-on-the-real-client and has-a-publish-workflow invariants. The import-collision check skips it because it ships no import package.What this does not do
It does not restore the
memclaw_clientimport or any alias. #1244's "no transition is owed" stands; only the deletion of the shell's source is reversed, and only so the distribution name stays ours. Heads-up to that PR's author is appropriate.Before tagging
PyPI has no trusted publisher for this project yet (0.5.0 was uploaded by hand). Before pushing
memclaw-client-v0.5.1, add one under the project's Publishing settings: repocaura-ai/caura, workflowpublish-python-memclaw-client.yml, environmentpypi. The workflow's header comment carries the same steps.Verification
python -m build+twine check dist/*+readme_renderer: PASSED, built METADATA has 0 HTML comments, first line is the header block, 11 classifiers, 6 URLs.caura-client 1.0.3;import memclaw_clientfails with ModuleNotFoundError, as the page says.scripts/legacy_name_ratchet.py --base origin/main: no new lines.scripts/do_not_touch_sentinel.py: all 35 protected strings survive.tests/test_client_metapackages.py: 21 passed.ruff check/ruff format --checkon it: clean.