release(v1.11.0): pi 1.1.0, pi-obsmem 022da5e, pi-atelier v0.15.0, all floating refs at newest
Lint / hadolint (push) Successful in 10s
Lint / skill-floor (push) Successful in 11s
Lint / actionlint (push) Successful in 19s
Lint / doc-drift (push) Successful in 22s
Publish Docker Image / lint-gate (push) Successful in 23s
Publish Docker Image / resolve-versions (push) Successful in 17s
Publish Docker Image / base-decide (push) Successful in 11s
Publish Docker Image / build-base (push) Successful in 50m31s
Publish Docker Image / smoke (push) Successful in 5m26s
Publish Docker Image / smoke-studio (push) Successful in 11m35s
Publish Docker Image / build-variant (push) Successful in 17m18s
Publish Docker Image / update-description (push) Successful in 9s
Publish Docker Image / promote-base-latest (push) Successful in 8s
Publish Docker Image / build-variant-studio (push) Successful in 20m28s

- ARG PI_VERSION 1.0.0 -> 1.1.0. Audited against the npm tarballs: the only
  breaking change in 1.0.1..1.1.0 is 1.0.3's azure-openai-responses -> azure
  rename, which nothing here uses. pi-agent-core's finishTurn handling is
  byte-identical between 1.0.0 and 1.1.0.
- ARG PI_OBSMEM_REF 731c3d4 -> 022da5e (= master): #81 compaction keeps
  unobserved context, #93 prebuilt dist/index.ts. src/agents/ unchanged.
- ARG PI_ATELIER_REF/VERSION v0.13.0 -> v0.15.0. Sidebar Auto/Manual modes,
  Manual by default. README's sidebar section updated.
- SKILLSET_SNAPSHOT_REF e9e45f7 -> 96b840e via vendor-mempalace-skill.sh.
  The vendored bytes are unchanged.
- Dockerfile.base BASE_REBUILD_DATE marker refreshed, at no cost, because the
  base rebuilds anyway (rootfs + entrypoint-user.sh changed in 11e512e).
- CHANGELOG: Unreleased -> v1.11.0 with the audit. The CI bypass of the obsmem
  pin is recorded under Still open.

Exercised before tagging, with pi 1.1.0 from a temp prefix in a real pty
against -ne controls:
- obsmem turn cap: 11 turns uncapped, exactly 3 capped.
- atelier v0.15.0 paints in both renderers (controls 0/3, render-proofed).
- obsmem 022da5e registers /om:status and /om:view.
- All 11 pi-extensions a88fa99 extensions load.

Local gates: check-doc-drift (rc 0, check 9 names every moved component),
lint-shell, check-workflow-shell, test-link-pi-models (13/13),
check-dockerfile-directives, check-skill-floor, check-base-hash.
This commit is contained in:
2026-10-12 16:54:55 +02:00
parent 3f46f5fd29
commit 4ee94da523
4 changed files with 131 additions and 15 deletions
+70 -4
View File
@@ -11,15 +11,27 @@ Pre-v1.0.0 tags followed the pi npm version (`v{pi_version}[letter]`).
--- ---
## Unreleased ## v1.11.0 — 2026-10-12
### Components that move with the next build Minor release. Headlines: **pi 1.1.0**, **secret env values are kept out of
model context by default** (pi-extensions `secret-guard`), an opt-in **AWS SSO
keeper** for long Bedrock runs, and **`~/.pi/agent/models.json` linked to a
mounted shared file** at every start. Everything else moves to its newest
upstream: pi-observational-memory `022da5e`, pi-atelier `v0.15.0`, pi-studio
`v0.9.63`. The base image is rebuilt (rootfs and `entrypoint-user.sh` changed),
so the base tools pinned to `latest` re-resolve too.
| Component | Baked in v1.10.2 | Next build | Why | ### Components that move with this release
| Component | Baked in v1.10.2 | v1.11.0 | Why |
|---|---|---|---| |---|---|---|---|
| **pi** | `1.0.0` | **`1.1.0`** | audited, see *Changed* below |
| pi-obsmem | `731c3d4` | **`022da5e`** (pinned SHA, = `master`) | #81: compaction never drops unobserved context; #93: pi loads a prebuilt `dist/index.ts` (see *Changed*) |
| pi-atelier | `v0.13.0` (`34d26f1`) | **`v0.15.0`** (`3befe02`) | v0.14.0 Auto/Manual sidebar modes with auto-collapse; v0.15.0 starts in Manual, recolours panels, simpler Activity rows |
| skillset snapshot | `e9e45f7` | **`96b840e`** | provenance only: the vendored `SKILL.md` is byte-identical (sha256 `a1db86da…` at both refs) |
| pi-extensions | `143a214` | **`a88fa99`** (or later: CI resolves `main` at build time) | new `aws-sso.ts` (keeps the Bedrock SSO session alive) and `secret-guard.ts` (keeps secret env values out of model context); both below | | pi-extensions | `143a214` | **`a88fa99`** (or later: CI resolves `main` at build time) | new `aws-sso.ts` (keeps the Bedrock SSO session alive) and `secret-guard.ts` (keeps secret env values out of model context); both below |
| pi-toolkit | `9c87ee8` | **`3760d90`** (or later: CI resolves `main` at build time) | `pi-task`: optional model fallback when the primary model fails auth before acting (below) | | pi-toolkit | `9c87ee8` | **`3760d90`** (or later: CI resolves `main` at build time) | `pi-task`: optional model fallback when the primary model fails auth before acting (below) |
| pi-studio | `v0.9.61` (`641aa32`) | **`v0.9.63`** (`fae3ad3`) | upstream releases (v0.9.62, v0.9.63), picked up by CI's newest-tag resolution; `-studio` variant only; **not reviewed yet**: [compare](https://github.com/omaclaren/pi-studio/compare/641aa3288a6bfd4a7eb37a3a4847836de85e0593...fae3ad38d23c9666981bfc29f9a4e06d56f8de84) | | pi-studio | `v0.9.61` (`641aa32`) | **`v0.9.63`** (`fae3ad3`) | upstream releases (v0.9.62, v0.9.63), picked up by CI's newest-tag resolution; `-studio` variant only. Reviewed: browser-editor fixes only (WebKit cursor drift after re-wrap, re-layout after macOS autocorrect) plus `Ctrl+Shift+H` to toggle highlighting; peerDependencies unchanged: [compare](https://github.com/omaclaren/pi-studio/compare/641aa3288a6bfd4a7eb37a3a4847836de85e0593...fae3ad38d23c9666981bfc29f9a4e06d56f8de84) |
### Added ### Added
@@ -135,6 +147,51 @@ Pre-v1.0.0 tags followed the pi npm version (`v{pi_version}[letter]`).
providers"). Use providers"). Use
`docker exec -it -u developer -e PI_AWS_SSO_NTFY=… pi-devbox bash -lc pi`. `docker exec -it -u developer -e PI_AWS_SSO_NTFY=… pi-devbox bash -lc pi`.
### Changed
- **pi `1.0.0` → `1.1.0`.** Audited 2026-10-12 against the published npm
tarballs, by the same method as the v1.10.2 audit (the full note is above
`ARG PI_VERSION` in `Dockerfile.variant`):
- The only `### Breaking Changes` section in 1.0.1..1.1.0 is 1.0.3's rename
of the `azure-openai-responses` provider to `azure`. Nothing here uses it.
- `finishTurn` handling in pi-agent-core is byte-identical between 1.0.0 and
1.1.0. The six named `pi.*` APIs our extensions call (`registerTool`,
`registerCommand`, `registerFlag`, `getFlag`, `sendMessage`,
`sendUserMessage`) appear in the same dist files in both versions, and so do
the TUI internals atelier hooks. `engines.node` is unchanged.
- User-visible: `Home`/`End` now always move the editor cursor (fullscreen
transcript top/bottom moved to `Ctrl+Home`/`Ctrl+End`). Terminals that
support OSC 7501 now see pi's working/blocked/done status; set
`PI_PROGRAM_STATUS=0` to turn that off.
- Exercised before tagging with pi 1.1.0 from a temp prefix, in a real pty,
with `--no-extensions` controls:
- The obsmem turn cap held on the real 1.1.0 agent loop: uncapped ran 11
turns, capped stopped at exactly 3.
- atelier v0.15.0 painted in both renderers (controls 0/3, every arm
render-proofed).
- obsmem `022da5e` registered `/om:status` and `/om:view`.
- All 11 pi-extensions `a88fa99` extensions loaded without error.
- **pi-observational-memory `731c3d4` → `022da5e`**, still a full-SHA pin; no
tag newer than 3.1.4 exists.
- #81 changes compaction. Entries the observer has not reached yet are no
longer cut out of context, and memory workers yield to the session. New
settings (`compactionMaxRetainedTokens`, `consolidateWhenIdle`,
`piAutoCompactionEnabled`) all have defaults, so nothing needs setting.
- #93 makes pi load a committed `dist/index.ts` bundle instead of 32 TS
sources, which is faster to start.
- `src/agents/` is unchanged between the two SHAs, so the workers'
`finishTurn` migration is intact.
- **pi-atelier `v0.13.0` → `v0.15.0`.** The sidebar now starts in **Manual**
mode. `/atelier sidebar auto` collapses it when the terminal is narrow and
reopens it when there is room. `showSidebarOnStartup` keeps its key and its
default. README's sidebar section describes both modes.
- **Base rebuilt** (`base-<hash>` changes because `rootfs/` and
`entrypoint-user.sh` changed). The base tools pinned to `latest` re-resolve.
Upstream on 2026-10-12: uv 0.13.0 (its breaking change makes Python 3.15 the
default *download*; mempalace still installs with `uv tool install` on
Debian's python3.13, which uv prefers because it is already installed), nvim
0.12.6, fzf 0.74.5. `# BASE_REBUILD_DATE:` is updated while it is free.
### Still open ### Still open
- `remote` mode end to end (code → push → approve on the phone) is unit-tested and - `remote` mode end to end (code → push → approve on the phone) is unit-tested and
@@ -148,6 +205,15 @@ Pre-v1.0.0 tags followed the pi npm version (`v{pi_version}[letter]`).
a login then worked at once. a login then worked at once.
- The real fix is administrative: the IdC admin can raise the session length (up to - The real fix is administrative: the IdC admin can raise the session length (up to
90 days), after which the keeper has almost nothing to do. 90 days), after which the keeper has almost nothing to do.
- **The pi-obsmem pin does not bind CI builds.** `resolve-versions` in
`docker-publish.yml` still resolves `pi-observational-memory` from `master`
and passes it as `--build-arg PI_OBSMEM_REF`, which overrides the Dockerfile
default. This was verified on both sides with buildx: without the build-arg
the pin is baked, with it `master` is. The pin reached v1.9.5, v1.10.2 and
this release only because `master` equalled the pin at build time.
`check-doc-drift.sh` reads the ARG, so it would not notice a divergence. Fix
it by reading the pin from `Dockerfile.variant` in `resolve-versions`, the way
pi-atelier's tag already is.
--- ---
+1 -1
View File
@@ -14,7 +14,7 @@
# content-addressed over this file, so any byte change invalidates the # content-addressed over this file, so any byte change invalidates the
# cache. Recommended cadence: once per release for security updates. # cache. Recommended cadence: once per release for security updates.
# #
# BASE_REBUILD_DATE: 2026-09-22 (v1.9.4 — mempalace 3.9.0 -> 3.10.0 with ENV MEMPALACE_CONFIG_DIR pinning the layout, mempalace-toolkit 2167a1b explicit event_list order; previous marker 2026-09-19 / v1.9.3) # BASE_REBUILD_DATE: 2026-10-12 (v1.11.0 — rootfs gains link-pi-models.sh, entrypoint-user.sh links models.json; base tools re-resolve `latest` (upstream on 2026-10-12: uv 0.13.0, nvim 0.12.6, fzf 0.74.5); previous marker 2026-09-22 / v1.9.4)
# #
# ── Lineage note ───────────────────────────────────────────────────── # ── Lineage note ─────────────────────────────────────────────────────
# Adapted from opencode-devbox/Dockerfile.base (commit before v1.16.2). # Adapted from opencode-devbox/Dockerfile.base (commit before v1.16.2).
+52 -5
View File
@@ -231,7 +231,34 @@ ARG USER_NAME=developer
# is documented (README -> "Terminal UI mode"): `"tuiMode": "regular"` in # is documented (README -> "Terminal UI mode"): `"tuiMode": "regular"` in
# ~/.pi/agent/settings.json, `pi --tui-mode regular` for one session, or the # ~/.pi/agent/settings.json, `pi --tui-mode regular` for one session, or the
# same key in a project's .pi/settings.json. # same key in a project's .pi/settings.json.
ARG PI_VERSION=1.0.0 #
# v1.11.0: 1.0.0 -> 1.1.0. MEASURED 2026-10-12 against the published npm
# tarballs for 1.0.0 and 1.1.0, unpacked side by side, by the same method as
# the v1.10.2 audit above:
# 1. ONE `### Breaking Changes` section in 1.0.1..1.1.0: 1.0.3 renamed the
# provider `azure-openai-responses` -> `azure`. 0 uses here: grepped
# rootfs/, ~/.pi/agent/settings.json, pi-toolkit's settings.example.json
# and the fleet's shared models.json. Everything else is additive or a fix
# (OSC 7501 program status, `+name`/`-name` in --tools, `durationMs` and
# `outputPad` in the tool render context, `aborted` on agent_settled).
# Two user-visible changes: Home/End always move the editor cursor
# (fullscreen transcript top/bottom moved to Ctrl+Home/Ctrl+End, 1.0.3),
# and OSC 7501 status reporting (PI_PROGRAM_STATUS=0 turns it off, 1.1.0).
# 2. pi-agent-core 1.0.0 -> 1.1.0: the finishTurn context in dist is
# BYTE-IDENTICAL; the only agent-loop diff adds `durationMs`. The obsmem
# turn-cap probe drove the real 1.1.0 agentLoop: uncapped ran its chosen
# 11 turns, maxTurns=3 stopped at exactly 3 + agent_end.
# 3. The 6 named pi.* APIs (registerTool, registerCommand, registerFlag,
# getFlag, sendMessage, sendUserMessage) appear in the same number of dist
# files in 1.0.0 and 1.1.0. atelier's internals TuiMainScreen and
# renderLayoutFrame are both still in 1.1.0's dist.
# 4. engines.node is still `>=22.19.0`; the image ships 24.x.
# Exercised before tagging, from a temp prefix with pi 1.1.0 and a throwaway
# PI_CODING_AGENT_DIR, in a real pty, with -ne controls: atelier v0.15.0 paints
# ACTIVITY/READY/TOOLS in BOTH renderers (controls 0/3, every arm render-proofed);
# obsmem 022da5e registers /om:status and /om:view (control: none); and all 11
# pi-extensions a88fa99 extensions load with no error (control: no /aws-sso).
ARG PI_VERSION=1.1.0
ARG PI_TOOLKIT_REF=main ARG PI_TOOLKIT_REF=main
ARG PI_EXTENSIONS_REF=main ARG PI_EXTENSIONS_REF=main
# Repo URLs default to the canonical gitea origin but are overridable so a # Repo URLs default to the canonical gitea origin but are overridable so a
@@ -253,7 +280,18 @@ ARG PI_OBSMEM_REPO=https://github.com/elpapi42/pi-observational-memory.git
# 40-char match (SHA40), so a short pin would fall through to its # 40-char match (SHA40), so a short pin would fall through to its
# branch-or-tag lookup, fail, and downgrade that component's drift check to a # branch-or-tag lookup, fail, and downgrade that component's drift check to a
# silent SKIP — a pin that reads fine and is no longer verified. # silent SKIP — a pin that reads fine and is no longer verified.
ARG PI_OBSMEM_REF=731c3d49288580f4d79cabdbfbc0d16b34db0f41 # v1.11.0: 731c3d4 -> 022da5e (master, 2026-10-05; still no newer tag than
# 3.1.4). Two commits: #81 never drops unobserved context at compaction
# (new settings compactionMaxRetainedTokens, consolidateWhenIdle,
# piAutoCompactionEnabled, all defaulted), and #93 makes pi load a prebuilt
# dist/index.ts instead of 32 TS sources. The bundle is committed, so
# `npm install --omit=dev` below needs no build step. src/agents/ is
# UNCHANGED between the two SHAs, so the finishTurn migration is intact.
# KNOWN GAP, not fixed here: docker-publish.yml's resolve-versions still
# resolves obsmem from `master` and passes it as --build-arg, which overrides
# this default (verified two-sided on buildx 2026-10-12). CI builds therefore
# get the pin only while master == pin, as it is at this release.
ARG PI_OBSMEM_REF=022da5e5554d04dfdc876ed7dac4a42c6b83dfd4
# pi-atelier (TUI sidebar: ordered panels, split-pane, themes) is PINNED TO A # pi-atelier (TUI sidebar: ordered panels, split-pane, themes) is PINNED TO A
# TAG, which CI resolves to that tag's commit SHA — same treatment as # TAG, which CI resolves to that tag's commit SHA — same treatment as
# pi-studio, for reproducibility plus cache-busting. # pi-studio, for reproducibility plus cache-busting.
@@ -332,9 +370,18 @@ ARG PI_ATELIER_REPO=https://github.com/michaelmjhhhh/pi-atelier.git
# - Residual: v0.13.0 is SAME-DAY upstream (2026-10-02). Acceptance proves # - Residual: v0.13.0 is SAME-DAY upstream (2026-10-02). Acceptance proves
# the sidebar PAINTS with the two-sided check from 0.84.4/0.85.1 that can # the sidebar PAINTS with the two-sided check from 0.84.4/0.85.1 that can
# tell "loaded" from "silently absent" — "no crash" is not the test. # tell "loaded" from "silently absent" — "no crash" is not the test.
ARG PI_ATELIER_REF=v0.13.0 #
# v1.11.0: v0.13.0 -> v0.15.0 (v0.14.0 and v0.15.0 both 2026-10-03). The
# peerDependencies floor is unchanged (pi >=0.84.0), atelier still has zero
# runtime dependencies, and it still imports only the public package exports.
# Behaviour changes: v0.14.0 auto-collapses the Sidebar when the terminal is
# narrow (Auto/Manual modes). v0.15.0 starts in Manual mode, recolours the
# panels and simplifies the Activity rows. The startup preference is still
# `showSidebarOnStartup` (default true, src/config.ts:38). Painted in both
# renderers on pi 1.1.0 before tagging (see the PI_VERSION note).
ARG PI_ATELIER_REF=v0.15.0
# Human-readable tag PI_ATELIER_REF was resolved from; recorded as a label. # Human-readable tag PI_ATELIER_REF was resolved from; recorded as a label.
ARG PI_ATELIER_VERSION=v0.13.0 ARG PI_ATELIER_VERSION=v0.15.0
RUN set -e && \ RUN set -e && \
# git_fetch_ref: clone-equivalent helper that accepts EITHER a branch name # git_fetch_ref: clone-equivalent helper that accepts EITHER a branch name
@@ -659,7 +706,7 @@ ARG MEMPALACE_TOOLKIT_REF=main
# no ~67-minute base rebuild. (scripts/check-base-hash.sh scans only # no ~67-minute base rebuild. (scripts/check-base-hash.sh scans only
# Dockerfile.base, so no folding into the base hash is required — nor would # Dockerfile.base, so no folding into the base hash is required — nor would
# it be correct, since this ARG changes nothing about the base's contents.) # it be correct, since this ARG changes nothing about the base's contents.)
ARG SKILLSET_SNAPSHOT_REF=e9e45f7acdde490c3b5d24ce5f508bff8785c2c7 ARG SKILLSET_SNAPSHOT_REF=96b840ee43beca65a190772021a8ef370145cde1
# Dockerfile.base sets description="pi-devbox — base image (variant-independent)" # Dockerfile.base sets description="pi-devbox — base image (variant-independent)"
# and every variant INHERITS it, so both published images used to advertise # and every variant INHERITS it, so both published images used to advertise
+8 -5
View File
@@ -464,7 +464,10 @@ pin the order yourself.
The sidebar auto-hides below 92 terminal columns and keeps the main pane at The sidebar auto-hides below 92 terminal columns and keeps the main pane at
least 64 columns wide, so a narrow terminal degrades to the plain TUI rather least 64 columns wide, so a narrow terminal degrades to the plain TUI rather
than a squeezed one. than a squeezed one. That is **Manual** mode, the default since atelier v0.15.0.
`/atelier sidebar auto` switches to **Auto** mode, which collapses the sidebar
when space is tight (below 124 columns at the default width) and reopens it at
132. Manual width adjustment is disabled in Auto mode.
## docker-compose.yml — basic shape ## docker-compose.yml — basic shape
@@ -1195,7 +1198,7 @@ persisted volumes survived, and pi runtime wiring is intact:
```bash ```bash
./scripts/recreate-sanity-check.sh # auto-detects variant ./scripts/recreate-sanity-check.sh # auto-detects variant
./scripts/recreate-sanity-check.sh --expected-image-version 1.8.9 # assert the pi-devbox release tag ./scripts/recreate-sanity-check.sh --expected-image-version 1.8.9 # assert the pi-devbox release tag
./scripts/recreate-sanity-check.sh --expected-version 1.0.0 # assert the pi coding agent version ./scripts/recreate-sanity-check.sh --expected-version 1.1.0 # assert the pi coding agent version
``` ```
Those are **two different versions**, and the flags are not interchangeable: Those are **two different versions**, and the flags are not interchangeable:
@@ -1234,9 +1237,9 @@ resolved to `latest` at build time:
| Component | Pin | Where | | Component | Pin | Where |
|---|---|---| |---|---|---|
| pi | `1.0.0` | `ARG PI_VERSION` — `Dockerfile.variant` | | pi | `1.1.0` | `ARG PI_VERSION` — `Dockerfile.variant` |
| pi-obsmem | `731c3d49288580f4d79cabdbfbc0d16b34db0f41` | `ARG PI_OBSMEM_REF` — `Dockerfile.variant` | | pi-obsmem | `022da5e5554d04dfdc876ed7dac4a42c6b83dfd4` | `ARG PI_OBSMEM_REF` — `Dockerfile.variant` |
| pi-atelier | `v0.13.0` | `ARG PI_ATELIER_REF` — `Dockerfile.variant` | | pi-atelier | `v0.15.0` | `ARG PI_ATELIER_REF` — `Dockerfile.variant` |
| mempalace | `3.10.0` | `ARG MEMPALACE_VERSION` — `Dockerfile.base` | | mempalace | `3.10.0` | `ARG MEMPALACE_VERSION` — `Dockerfile.base` |
The objective is **not** to freeze versions. Bumping is routine — usually one The objective is **not** to freeze versions. Bumping is routine — usually one