From 2985d9ade82fec64b15712113a2a028120e76035 Mon Sep 17 00:00:00 2001 From: pi Date: Sat, 27 Jun 2026 18:45:24 +0200 Subject: [PATCH] =?UTF-8?q?release:=20v1.2.3=20=E2=80=94=20mempalace-mcp?= =?UTF-8?q?=20self-heal=20(toolkit=20e12b624)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- CHANGELOG.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e15fbda..cebbcce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,8 +13,40 @@ Pre-v1.0.0 tags followed the pi npm version (`v{pi_version}[letter]`). ## 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 +- **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 previously apt-installed `yq`, which on Debian/Ubuntu is the unrelated kislyuk/`yq` (a jq wrapper, v3.x) — incompatible with the mikefarah v4 syntax