release(v1.11.2): smoke esbuild check present-iff-declared; pi-studio 0.10.1
Lint / hadolint (push) Successful in 8s
Lint / skill-floor (push) Successful in 13s
Lint / doc-drift (push) Successful in 17s
Lint / actionlint (push) Successful in 30s
Publish Docker Image / lint-gate (push) Successful in 26s
Publish Docker Image / resolve-versions (push) Successful in 16s
Publish Docker Image / base-decide (push) Successful in 15s
Publish Docker Image / build-base (push) Has been skipped
Publish Docker Image / smoke (push) Successful in 5m25s
Publish Docker Image / smoke-studio (push) Successful in 8m40s
Publish Docker Image / build-variant (push) Successful in 16m48s
Publish Docker Image / update-description (push) Successful in 8s
Publish Docker Image / promote-base-latest (push) Successful in 9s
Publish Docker Image / build-variant-studio (push) Successful in 21m23s

v1.11.1 (run 724) was tagged and never published: the smoke assertion
"esbuild works at every install site" required esbuild to exist, and pi
1.2.0 dropped @earendil-works/chord, its only source. The image was right.

- smoke-test.sh: esbuild must be present iff an installed package root or
  /opt repo root declares it, and compile at every site. Body tested 8 ways
  (v1.11.0-studio ok; sites removed / natives pruned / residue / bare
  declarer fail; fixture decoy ignored; v1.11.2 candidates ok). Full smoke
  on local arm64 candidates with run 724's args: old script 102/1 (CI
  reproduced), new core 103/0, studio 106/0 (0.9.63 and 0.10.1).
- pi-studio v0.9.63 -> v0.10.1 (tagged 2026-10-14; CI takes the newest
  tag): devbox contract unchanged (manifest, client bundle, 11 tools, 6
  commands, --no-browser/--port/--listen-all, env vars); exercised under pi
  1.2.0 in headless Chromium (render, Run Prompt via ERDC, Files ->
  Document, port freed); in-image TUI starts with no extension issues.
- CHANGELOG v1.11.1 -> v1.11.2; Dockerfile.variant/workflow cycle notes.
  No base input changed: base-6f3b20266de1 (built by run 724) is reused.
This commit is contained in:
2026-10-14 07:28:38 +02:00
parent 4efa84bb42
commit bf265f6d54
4 changed files with 121 additions and 19 deletions
+80 -11
View File
@@ -11,15 +11,34 @@ Pre-v1.0.0 tags followed the pi npm version (`v{pi_version}[letter]`).
---
## v1.11.1 — 2026-10-14
## v1.11.2 — 2026-10-14
Patch release. Headlines: **pi 1.2.0**, **`pi -p` returns in seconds** on a
**v1.11.1 was tagged and never published.** Run 724 failed one smoke assertion
in each variant (`smoke` 102 passed / **1 failed**, `smoke-studio` 105 / **1**):
*esbuild works at every install site* reported "no esbuild install found at
all". The image was right and the assertion was wrong. esbuild was never a
direct pi dependency. It came through `@earendil-works/chord` (pi 1.1.0 → chord
→ esbuild 0.28.2, at the pi and pi-fork sites), and pi 1.2.0 dropped chord, so
a correct 1.2.0 image has no esbuild. pi 1.2.0's tree has no esbuild import;
1.1.0's chord bundle had one. This is the mistake the clipboard assertion made
at v1.10.0. Every publish job skipped, so no `v1.11.1`, `latest` or Hub
description was written. The one artefact pushed is the base `base-6f3b20266de1`.
It is content-addressed and this release reuses it, which is why
`Dockerfile.base`'s `BASE_REBUILD_DATE` comment still names v1.11.1: editing it
would change the hash and rebuild an identical base. **Everything below ships
here, with the assertion fixed** (*Fixed*, first entry). The tag moves rather
than being re-pointed, as at v1.10.2. One component moved between the two tags:
pi-studio published **v0.10.0 and v0.10.1** the same morning, CI builds the
newest pi-studio tag, and this release adopts 0.10.1 after testing it (*Changed*
below) rather than pinning 0.9.63.
Patch release. Headlines: **pi 1.2.0**, **pi-studio 0.10.1** (two editors, a
Prompt and a Document, by default), **`pi -p` returns in seconds** on a
devbox instead of idling for five minutes (mempalace-toolkit), **MCP servers use
pi's built-in support** (pi-extensions' `mcp-loader.ts` is retired), and **CI
now builds the pinned pi-observational-memory commit** instead of whatever its
`master` is that day. Unchanged upstream, re-checked 2026-10-14:
pi-observational-memory `022da5e`, pi-atelier `v0.15.0`, pi-studio `v0.9.63`,
pi-fork `e69725c`, pi-toolkit `3760d90`, mempalace `3.10.0`, Node 24 (v24.21.0
pi-observational-memory `022da5e`, pi-atelier `v0.15.0`, pi-fork `e69725c`, pi-toolkit `3760d90`, mempalace `3.10.0`, Node 24 (v24.21.0
LTS). The skillset moved (`96b840e` → `1e02b44`), but the vendored mempalace
`SKILL.md` is byte-identical, so the snapshot is not refreshed. The base image is
rebuilt (the rootfs skill floor and the mempalace-toolkit ref both changed), so
@@ -27,14 +46,33 @@ the base tools pinned to `latest` re-resolve too.
### Components that move with this release
| Component | Baked in v1.11.0 | v1.11.1 | Why |
| Component | Baked in v1.11.0 | v1.11.2 | Why |
|---|---|---|---|
| **pi** | `1.1.0` | **`1.2.0`** | audited, see *Changed* below |
| **pi-studio** (studio variant) | `v0.9.63` (`fae3ad3`) | **`v0.10.1`** (`76db01f`) | tagged 2026-10-14, tested under pi 1.2.0, see *Changed* below |
| pi-extensions | `a88fa99` | **`750b2a8`** (or later: CI resolves `main` at build time) | `mcp-loader.ts` retired; `install.sh` prunes stale links (below) |
| mempalace-toolkit | `975ab92` | **`d5a03f4`** (or later) | `pi -p` returns in seconds: `2f0edf5` clears the feed's leftover 5-min timer, `f590a3a` skips the feed in print/JSON mode, and `d5a03f4` skips the wake-up and mailbox poll there too (below). Also `a30af61`: the bridge's `RemoteMcpClient` is now the only copy, and `scripts/check-mcp-client-sync.sh` is removed (comment/README only) |
### Fixed
- **The smoke test's esbuild assertion is now "present iff something declares
it"**, like clipboard's. Because esbuild arrives transitively, "declared" is
not read from pi's `package.json`. It is derived from every installed package
root and every `/opt` repo root, counting dependencies, optional dependencies
and peer dependencies. Anchoring on package roots means a test fixture's
`package.json` cannot count. Both directions fail: declared but missing (the
prune removed function), and installed with nothing declaring it (residue).
The new body was run before tagging. On published v1.11.0-studio it reports
"declared (2 package(s)) and compiles at 2 site(s)". With every esbuild dir
removed it fails, naming both chord `package.json` files. With
`@esbuild/<platform>` pruned it fails with "esbuild broken at …". On the new
images it reports that nothing declares esbuild. It also fails a fake esbuild
dir that nothing declares, and a package root that declares esbuild with no
install, but ignores a test fixture's `package.json`. The whole
`smoke-test.sh` then ran against arm64 candidates, built locally with run
724's resolved build args on the same base. The old script reproduced CI's
102/1 on core. The new one passed core 103/0 and studio 106/0, with pi-studio
0.10.1 and with 0.9.63.
- **The pi-observational-memory pin now binds CI builds** (v1.11.0's known
issue). `resolve-versions` resolved the repo's `master` and passed it as
`--build-arg PI_OBSMEM_REF`, which overrides the Dockerfile's pinned default,
@@ -71,7 +109,7 @@ the base tools pinned to `latest` re-resolve too.
predates v1.11.0. `pi-task` and `fork` children run `--no-extensions` and
were never affected. `scripts/test-feed-exit.sh` in mempalace-toolkit pins
both changes, and each change's pre-fix source fails it. On images before
v1.11.1, scripts that call `pi -p` should keep their `timeout` or set
v1.11.2, scripts that call `pi -p` should keep their `timeout` or set
`MEMPALACE_FEED=0`.
- **`pi -p` no longer gets the palace wake-up.** In print and JSON mode the
mempalace bridge now skips the wake-up injection and the mid-session mailbox
@@ -114,11 +152,42 @@ the base tools pinned to `latest` re-resolve too.
reply was cut off at the model's output limit. That is text mode only;
`pi-task` and `fork` run `--mode json`. The first start after the upgrade
shows 1.2.0's What's New once. Read from the code, not reproduced: pi-studio
marks pi busy on `agent_start`, which 1.2.0 fires after the session already
counts as busy. A Studio request sent in that gap (the `before_agent_start`
handlers) gets pi's "Agent is already processing" error instead of Studio's
own "pi is busy". Before 1.2.0 the same request started a second run that
failed, so retrying is the answer either way.
(0.9.63 and 0.10.1 alike) marks pi busy on `agent_start`, which 1.2.0 fires
after the session already counts as busy. A request that reaches pi in that
gap (the `before_agent_start` handlers) gets pi's "Agent is already
processing" error instead of Studio's own "pi is busy". Before 1.2.0 the same
request started a second run that failed, so retrying is the answer either
way. From the browser it is hard to reach: three **Run Prompt** clicks 30 ms
and 150 ms apart produced exactly one run in 0.10.1.
- **pi-studio `v0.9.63` → `v0.10.1`** (studio variant). 0.10.0 is the largest
Studio change in a while. By default there are two editors: a **Prompt** for
what you send to pi and a **Document** for the file you are working on. You
can switch with `/studio --single` / `--dual` or from the footer. Unsaved text
survives reloads, and `/studio` reopens your last workspace (`--blank`,
`--last`); its state lives under `~/.pi/agent/pi-studio`, on the preserved
volume. There is a new **Files** pane, a two-row toolbar, and **Add to
Prompt**. 0.10.1 fixes the Run button flickering while a run starts. Upstream
typechecks against pi 1.2.0; its peers stay `*`.
- **What pi-devbox relies on is unchanged:** the package manifest
(`./index.ts`, `./themes`), the committed `client/studio-client.js`, the 11
`studio_*` tools, the 6 commands, and the `--no-browser`, `--port` and
`--listen-all` flags that `studio-expose` and the README use. The set of
environment variables read is identical.
- **Tested under pi 1.2.0 before tagging**, in a copy of tor-ms22's real
`~/.pi/agent` with 0.10.1 swapped in:
- pi starts with no extension issues, and `/studio --no-browser --port
18765` prints its token URL.
- In headless Chromium the new UI renders with no console errors.
- A prompt typed into the Prompt and sent with **Run Prompt** came back
through ERDC in both Studio and the terminal.
- The Files pane lists the workspace, and **Open in Document** loads a file.
- Quitting pi frees the port.
- **In the image:** the 0.10.1 studio candidate passes the full smoke test,
106/0. It is 11 MB smaller than with 0.9.63, because the npm package shrank.
Inside it, pi's TUI starts with pi-studio among the extensions and no
extension issues.
- **To go back**, if 0.10 does not suit: v1.11.0-studio still has 0.9.63.
Inside a container, `/studio --single` restores the one-editor layout.
- **MCP servers now use pi's built-in MCP support; pi-extensions'
`mcp-loader.ts` is retired.** pi has shipped MCP as a built-in extension
(`builtin:mcp`) since 0.99.0: servers go in `~/.pi/agent/mcp.json` or are