Skip to content

feat(clients): hold the memclaw-client name as a truthful redirect shell (0.5.1) - #1646

Merged
erni-a merged 3 commits into
mainfrom
feat/memclaw-client-redirect-shell
Sep 20, 2026
Merged

erni-a merged 3 commits into
mainfrom
feat/memclaw-client-redirect-shell

Conversation

@erni-a

@erni-a erni-a commented Sep 20, 2026

Copy link
Copy Markdown
Contributor

Why

Every release of memclaw-client on 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 the caura-client page. 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 on caura-client>=1.0.3. README opens with the shared Caura header block, then says there is no memclaw_client module and no MemClaw class 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 pattern memclaw-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.
  • README.md, clients/python/README.md: rename notices describe the redirect shell instead of the yanked release.

What this does not do

It does not restore the memclaw_client import 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: repo caura-ai/caura, workflow publish-python-memclaw-client.yml, environment pypi. 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.
  • Wheel installed in a clean venv pulls caura-client 1.0.3; import memclaw_client fails 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 --check on it: clean.

…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>
@erni-a
erni-a requested a review from a team as a code owner September 20, 2026 04:38
@github-actions

Copy link
Copy Markdown
Contributor

Claude Code Review — skipped: PR author 'erni-a' is not a public member of the 'caura-ai' org

@erni-a

erni-a commented Sep 20, 2026

Copy link
Copy Markdown
Contributor Author

@Eldad-Caura Please approve

@github-actions

Copy link
Copy Markdown
Contributor

Claude Code Review — skipped: PR author 'erni-a' is not a public member of the 'caura-ai' org

@github-actions

Copy link
Copy Markdown
Contributor

Claude Code Review — skipped: PR author 'erni-a' is not a public member of the 'caura-ai' org

@erni-a
erni-a merged commit 5e2a3a9 into main Sep 20, 2026
15 checks passed
@erni-a
erni-a deleted the feat/memclaw-client-redirect-shell branch September 20, 2026 05:12
@caura-deploy-bot caura-deploy-bot Bot mentioned this pull request Sep 20, 2026
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 &lt;0.16,&gt;=0.15.4 to
&gt;=0.15.4,&lt;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 &gt;=7.1.8 to &gt;=7.2.0
([#1661](#1661))
([273ac33](273ac33))
* update google-cloud-aiplatform requirement from &lt;3,&gt;=2.1.0 to
&gt;=2.1.3,&lt;3
([#1660](#1660))
([140a67a](140a67a))
* update httpx requirement from &lt;1,&gt;=0.27 to &gt;=0.28.1,&lt;1
([#1566](#1566))
([b3bd76d](b3bd76d))
* update python-dateutil requirement from &lt;3,&gt;=2.8 to
&gt;=2.9.0.post0,&lt;3
([#1567](#1567))
([1871882](1871882))
* update sentry-sdk requirement from &lt;3,&gt;=2.69.1 to
&gt;=2.69.2,&lt;3
([#1662](#1662))
([bd4135e](bd4135e))
* update uvicorn requirement from &lt;1,&gt;=0.52.4 to &gt;=0.53.0,&lt;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>
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.

2 participants