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