release: v1.2.3 — mempalace-mcp self-heal (toolkit e12b624)

Patch release. Headline: mempalace-mcp self-heals instead of latching
available=false permanently after a slow virtiofs cold-open. Base image
rebuilds via the mempalace-toolkit ref advancing to e12b624 (folded into
the base-decide hash). No pi/mempalace version change — pi npm latest is
still 0.80.2 (= v1.2.2). Also releases the queued yq (mikefarah Go yq) and
mempalace-skill temporal-grounding changes.
This commit is contained in:
pi
2026-06-27 18:45:24 +02:00
parent bff810c1eb
commit 133a76dfcd
+32
View File
@@ -13,8 +13,40 @@ Pre-v1.0.0 tags followed the pi npm version (`v{pi_version}[letter]`).
## Unreleased ## Unreleased
---
## v1.2.3 — 2026-06-27
Patch release. Headline: **mempalace-mcp now self-heals** instead of latching
`available=false` permanently after a slow cold-open. Also folds in the `yq`
and mempalace-skill changes that were sitting unreleased. **No pi/mempalace
version change** — pi npm `latest` is still `0.80.2` (= v1.2.2) and the
mempalace pin stays `3.5.0`; the base image rebuilds purely because the
`mempalace-toolkit` ref advances to pick up the self-heal extension.
### Fixed ### Fixed
- **mempalace-mcp self-heal — no more permanent `available=false` latch.**
The `mempalace.ts` pi extension (from `mempalace-toolkit`, bumped to
[`e12b624`](https://gitea.jordbo.se/joakimp/mempalace-toolkit/commit/e12b624))
previously tripped its per-request timeout on a slow virtiofs cold-open of
the palace, killed the child, and set `available=false` **forever** (no
respawn) — a pi restart was the only recovery.
- **Bounded respawn with capped exponential backoff** via `ensureAlive()`
(`MEMPALACE_MCP_MAX_RESPAWNS=2`, `MEMPALACE_MCP_RESPAWN_BACKOFF_MS=1000`;
set max to `0` to disable). Both `execute()` and initial startup route
through it. The respawn budget **resets on any successful JSON-RPC
response** (`onStdout`), so a healthy session can't slowly exhaust it.
- **Scoped init timeout** raised `120000 → 300000` ms (`MEMPALACE_MCP_INIT_TIMEOUT_MS`),
affecting **init only** — the per-call timeout stays `60000`
(`MEMPALACE_MCP_TIMEOUT_MS`) — so a genuine cold HNSW deserialize isn't
killed mid-open.
- **Concurrency hardening:** a generation counter prevents a late-exiting
killed process from clobbering a fresh respawn, and an explicit `healthy`
flag replaces the racy `proc != null` check.
- Note: the build-time `smoke-test.sh` verifies the extension is present and
deployed but does **not** exercise respawn behaviour — first live
validation is on a running container.
- **`yq` is now mikefarah's Go yq, not Debian's Python `yq`.** The base image - **`yq` is now mikefarah's Go yq, not Debian's Python `yq`.** The base image
previously apt-installed `yq`, which on Debian/Ubuntu is the unrelated previously apt-installed `yq`, which on Debian/Ubuntu is the unrelated
kislyuk/`yq` (a jq wrapper, v3.x) — incompatible with the mikefarah v4 syntax kislyuk/`yq` (a jq wrapper, v3.x) — incompatible with the mikefarah v4 syntax