docs: CHANGELOG for v1.8.2 — the silent transcript-feed failure and its guard
Publish Docker Image / resolve-versions (push) Successful in 25s
Lint / actionlint (push) Successful in 30s
Publish Docker Image / base-decide (push) Successful in 8s
Lint / hadolint (push) Successful in 46s
Publish Docker Image / build-base (push) Successful in 41m26s
Publish Docker Image / smoke (push) Successful in 4m45s
Publish Docker Image / smoke-studio (push) Successful in 5m11s
Publish Docker Image / build-variant-studio (push) Successful in 17m44s
Publish Docker Image / build-variant (push) Successful in 23m41s
Publish Docker Image / update-description (push) Successful in 6s
Publish Docker Image / promote-base-latest (push) Successful in 10s

This commit is contained in:
Joakim Persson
2026-08-16 00:53:46 +02:00
parent d8b745c164
commit ffd54750b9
+59
View File
@@ -11,6 +11,65 @@ Pre-v1.0.0 tags followed the pi npm version (`v{pi_version}[letter]`).
--- ---
## v1.8.2 — 2026-08-16
Patch release. **Ships the fix for a silent transcript-feed failure**, plus the
smoke assertion that stops it coming back. No image pins changed from v1.8.1
(pi `0.84.2`, pi-atelier `v0.8.1`); what moves is the baked `mempalace-toolkit`
ref and one new smoke check.
**The bug this closes** (found on the first boot of the v1.8.1 image, on
EMB-7KJ4VR4G, 2026-08-15): the container-start catch-up rsynced seven pi session
transcripts to the palace host correctly, then asked the server to mine
`/data/feed/<device>` — the feeder's default `MEMPALACE_PI_REMOTE_PATH`, which
assumes a *containerized* palace server. That fleet's primary runs **natively**
(a systemd user unit + uv tool), so it only ever sees host paths and the mine
died with `source directory not found`. rsync had already succeeded, so the
inbox looked healthy.
It stayed invisible because of the second half: the feeder decided success with
`'"error"' in body`. MCP answers a hard tool failure with HTTP 200 and a
JSON-RPC *result* whose `content[].text` carries the tool's own JSON as an
**escaped string** — the bytes are `\"error\"`, so the substring could never
match. `~/.pi/agent/mempalace-catchup.log` printed
`Done. Wing 'wing_conversations' updated.` directly beneath the error JSON and
exited 0. A feeder whose only artifact claims success is worse than one that
crashes: nothing in the container disagreed with it.
Shipped here:
- **`mempalace-toolkit``b609cf5`** baked (CI resolves the ref at build time):
`classify()` parses the MCP envelope instead of grepping it (JSON-RPC error,
MCP `isError`, inner `success=false`/`error`), and separates "verified ok"
from "unverified: no JSON tool payload" rather than assuming the good case.
A preflight warning fires when the rsync destination and
`MEMPALACE_PI_REMOTE_PATH` disagree — in *preflight*, so `--dry-run` and
`--prepare` surface it too. Remote mode also stops previewing NEW/SKIP from
the *local* palace, which had been reporting "6 already filed" about a palace
it was not feeding; the tags are now `[?]` and the summary names who decides.
- **New smoke assertion** — `mempalace-pi-session --self-test` run against the
**baked** toolkit. It replays six recorded MCP responses (fixture 1 is the
verbatim 2026-08-15 failure body) plus a regression guard asserting the old
substring check is blind to it. A stale or reverted `MEMPALACE_TOOLKIT_REF`
can therefore no longer ship a feeder that mines nothing while reporting
success.
- **`.env.example`** now spells out that `MEMPALACE_PI_REMOTE_PATH` is the path
the *server process* can open — the container path for a dockerized server,
identical to the ssh-target path for a native one — and that a mismatch fails
quietly, with rsync succeeding and only the mine failing.
**The `--self-test` assertion is deliberately bare** (`mempalace-pi-session
--self-test`, no `HOME=…` prefix). `run()` invokes
`docker run --entrypoint="" $IMAGE sh -c …` and no Dockerfile sets `USER` or
`ENV HOME`, so it executes with **no `HOME` at all** — the same condition that
made v1.8.0's stage assertion unsatisfiable. The feeder is `set -u` with
HOME-anchored defaults, so it used to die with `HOME: unbound variable` there;
`b609cf5` derives `HOME` from the passwd database (what python's `expanduser()`
falls back to) instead. Keeping the call bare means smoke also proves the feeder
runs in a bare container, rather than papering over it with an env prefix.
---
## v1.8.1 — 2026-08-15 ## v1.8.1 — 2026-08-15
Patch release. **Unblocks v1.8.0, which never shipped.** Its `smoke` and Patch release. **Unblocks v1.8.0, which never shipped.** Its `smoke` and