changelog(unreleased): secret-guard (pi-extensions a88fa99) and pi-task model fallback (pi-toolkit 3760d90)
Lint / hadolint (push) Successful in 12s
Lint / skill-floor (push) Successful in 10s
Lint / actionlint (push) Successful in 22s
Lint / doc-drift (push) Successful in 16s

Both arrive with the next build without a pin change, because CI resolves
pi-extensions and pi-toolkit main at build time. The components table now names
them: pi-extensions 143a214 -> a88fa99, and a new pi-toolkit row 9c87ee8 ->
3760d90. Both ids were checked against ls-remote, and the baked values against
/etc/pi-devbox/build-manifest.json on a v1.10.2 device.
This commit is contained in:
Joakim Persson
2026-10-12 16:28:28 +02:00
parent 11e512e497
commit 09ce100c92
+39 -1
View File
@@ -17,7 +17,8 @@ Pre-v1.0.0 tags followed the pi npm version (`v{pi_version}[letter]`).
| Component | Baked in v1.10.2 | Next build | Why | | Component | Baked in v1.10.2 | Next build | Why |
|---|---|---|---| |---|---|---|---|
| pi-extensions | `143a214` | **`f885199`** (or later: CI resolves `main` at build time) | new `aws-sso.ts` extension: keeps the Bedrock SSO session alive (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-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; **not reviewed yet**: [compare](https://github.com/omaclaren/pi-studio/compare/641aa3288a6bfd4a7eb37a3a4847836de85e0593...fae3ad38d23c9666981bfc29f9a4e06d56f8de84) |
### Added ### Added
@@ -51,6 +52,43 @@ Pre-v1.0.0 tags followed the pi npm version (`v{pi_version}[letter]`).
so removing the mount later is harmless (measured with pi 1.0.0). README: so removing the mount later is harmless (measured with pi 1.0.0). README:
"Custom model providers (`models.json`)". "Custom model providers (`models.json`)".
- **secret-guard (pi-extensions `secret-guard.ts`): secret env values never reach
the model, the session file or the palace feed.** It replaces the exact value
of every env var whose name says secret (`…TOKEN`, `…API_KEY`, `…PASSWORD`, …)
with `<redacted:NAME>`, the same rule and placeholder as mempalace-toolkit's
feed redactor. It applies to every tool result (MCP tools included), to the
context of each request (covering user `!` commands and older sessions), and it
blocks a `write`/`edit` that would write such a placeholder back over the real
value. `$NAME` still expands in commands; only the output coming back is
rewritten.
Measured motivation, 2026-10-12: an agent's own `sed` failed to redact
`MEMPALACE_REMOTE_TOKEN=…` from `env | grep` output. The raw value had been in
local session files for two months, so each of those sessions had sent it to
its model provider. The palace stayed clean only because the feed redactor
works.
Not covered:
- live streaming output while a tool runs;
- the stored entry of a user `!` command;
- secrets not in the environment;
- `pi-task` children, which run `--no-extensions`.
`PI_SECRET_GUARD=off` disables it.
- **`pi-task` model fallback (pi-toolkit `bin/pi-task`).** A
`pi-task.fallbackProfiles` block in `settings.json` (per effort tier:
provider/id/thinking) lets a task retry once on another model. The retry
happens only when the primary fails with an auth-class error (an expired SSO
token, an invalid key) **before** it has called a tool or changed a watched
file, and with at least 30 s of wall budget left. Both attempts are recorded in
`result.json` and the audit dir, and the result line is tagged `[FALLBACK]`.
Without the block, behaviour is unchanged. It was needed because pi reports
such a failure only inside its JSON stream: `stopReason=error`, rc 0. Before
this, an expired Bedrock session failed every task as "no fenced json
envelope". The `fork` tool does not read this key. Documented in pi-toolkit's
README.
- **Long Bedrock runs no longer die at "Token is expired" when the AWS SSO - **Long Bedrock runs no longer die at "Token is expired" when the AWS SSO
session ends: `/aws-sso` (pi-extensions `aws-sso.ts`) runs `aws sso login` for session ends: `/aws-sso` (pi-extensions `aws-sso.ts`) runs `aws sso login` for
you just after the session ends.** Off until `/aws-sso on` (or you just after the session ends.** Off until `/aws-sso on` (or