release: v1.6.4 — fork tool actually loads, pi 0.83.0 audited clean
Publish Docker Image / resolve-versions (push) Successful in 5s
Lint / hadolint (push) Successful in 13s
Lint / actionlint (push) Successful in 15s
Publish Docker Image / base-decide (push) Successful in 7s
Publish Docker Image / build-base (push) Successful in 41m24s
Publish Docker Image / smoke-studio (push) Successful in 5m11s
Publish Docker Image / smoke (push) Successful in 12m23s
Publish Docker Image / build-variant-studio (push) Successful in 22m46s
Publish Docker Image / build-variant (push) Successful in 22m58s
Publish Docker Image / update-description (push) Successful in 6s
Publish Docker Image / promote-base-latest (push) Successful in 13s

Headline is the fork-guard fix (the `fork` tool had never loaded since v1.0.0
because the registration guard grepped the whole settings.json and matched the
pi-fork *config block* the template merge itself plants).

pi 0.82.1 -> 0.83.0 is a clean hop with no intermediates. 0.83.0 carries an
upstream Breaking Change (bundled TypeBox 1.1.38 -> 1.3.7, deprecated APIs
removed) that cannot reach us: pi-fork vendors @sinclair/typebox (a different
package name), obsmem's use is type-only, studio and atelier don't use TypeBox.
Verified from source rather than from the audit narrative: extension-facing
dist/core/extensions/*.d.ts declarations diff clean between the two versions,
all six CLI flags pi-fork passes to child processes are present, and
SESSION_VERSION is 3 in both so transcript tooling is unaffected. No PI_VERSION
pin needed.

Recorded for the release notes: the Bedrock poison pill is NOT fixed in pi-ai
0.83.0 (unsanitised input: c.arguments moved 634 -> 644), so pi-session-repair
stays the recovery path.
This commit is contained in:
2026-07-30 01:10:07 +02:00
parent fa04d2083d
commit e86e5df327
+57 -1
View File
@@ -11,7 +11,11 @@ Pre-v1.0.0 tags followed the pi npm version (`v{pi_version}[letter]`).
---
## Unreleased
## v1.6.4 — 2026-07-30
Patch release. Headline: **the `fork` tool has never once loaded since v1.0.0**
and now does — plus pi `0.82.1``0.83.0`, audited clean against every baked
extension.
### Fixed
@@ -54,6 +58,58 @@ Pre-v1.0.0 tags followed the pi npm version (`v{pi_version}[letter]`).
### Changed
- **pi `0.82.1``0.83.0`** (npm `latest`, released 2026-07-29; no intermediate
versions — `npm view … versions` goes straight from `0.82.1` to `0.83.0`).
Variant-only rebuild: pi is installed in `Dockerfile.variant`, so the
content-addressed `base-<hash>` is unaffected.
**0.83.0 ships a Breaking Change, and it cannot reach this image.** Upstream:
> Upgraded bundled TypeBox aliases to 1.3.7, removing deprecated APIs
> including `Type.Base`, `Type.Awaited`, `Type.Promise`, `Type.AsyncIterator`,
> `Type.Iterator`, `Type.Options`, and `Value.Mutate`, while fixing compiled
> validation of nullable array tool arguments. Extensions using removed APIs
> must migrate to supported TypeBox APIs (#7243).
Audited per baked extension: **`pi-fork`** vendors its own
`@sinclair/typebox@0.34.52` — a *differently named* package than the `typebox`
pi bundles (1.1.38 → 1.3.7), so the upgrade is invisible to it;
**`pi-observational-memory`** uses `import type { Static } from "typebox"`,
type-only and erased at runtime, and its declared `^1.1.38` admits 1.3.7;
**`pi-studio`** and **`pi-atelier`** use TypeBox not at all. A grep for
`Type.(Base|Awaited|Promise|AsyncIterator|Iterator|Options)|Value.Mutate`
across all four returns **zero hits**. Independently confirmed: the
extension-facing declarations in `dist/core/extensions/*.d.ts` are
**byte-identical** between 0.82.1 and 0.83.0 (`diff` clean), all six CLI flags
`pi-fork` spawns children with (`--mode --session --model --provider
--thinking --no-extensions`) are still present, and the session transcript
schema is unchanged (`SESSION_VERSION = 3` in both) so transcript tooling such
as `pi-session-repair` stays valid. **No `PI_VERSION` pin was needed.**
Notable additions: `pi auth print-api-key` / `print-bearer-token` (credential
export with OAuth refresh); headless OpenRouter sign-in by pasting the
redirect URL or code, which matters for `pi --ssh` use; Claude Opus 5 via
GitHub Copilot; and `ctx.scopedModels` exposed to extensions.
Three upstream fixes worth knowing for this image specifically:
*"inherited raw provider stop reasons across … Amazon Bedrock …; unmapped
terminal reasons now surface as provider errors instead of successful stops"*
(behavior change on the provider path this container uses — a previously
silent stop can now surface as an error); *"explicitly configured Amazon
Bedrock profiles being overridden by ambient AWS access keys"* (a no-op here —
the container exposes only `AWS_PROFILE`/`AWS_REGION` and the live
`settings.json` has no `providers.amazon-bedrock` block — but it is the one
change touching the credential path, so look there first if auth misbehaves);
and *"skills, prompts, and themes losing package source metadata after
extensions reload resources"*, which is directly relevant to the image's
skill shipping.
**Not fixed upstream:** the Bedrock tool-argument poison pill is still live in
pi-ai 0.83.0 — `toolUse: { toolUseId, name, input: c.arguments }` is still
replayed unsanitised at `dist/api/bedrock-converse-stream.js:644` (it was
line 634 in 0.82.1; the file still has zero empty-member-name sanitisation).
`pi-session-repair` (in `cli_utils`) remains the recovery path.
- **Settings template now defaults to Claude Opus 5** (`pi-toolkit` @ `926f738`).
`settings.example.json` — the file `entrypoint-user.sh` bootstraps
`~/.pi/agent/settings.json` from — moves `defaultModel` and the `pi-fork`