The lock-race and EPERM regression tests compared injection predicates
against the uncanonicalized temp config path, but the atomic writer
resolves it via realpath; on macOS /var -> /private/var made the mocks
never fire and both tests failed. Compared against the realpath instead.
Provider ids (ZenMux mirrors) and explicit compat.signingEndpoint spec
overrides on opaque proxies now qualify alongside URL-recognized signing
routes; stale-official compat and the Vertex/Copilot header exclusions
are preserved (#6717).
- Treated missing files separately from malformed or unreadable configs.
- Backed up malformed YAML and wrote settings atomically without dropping pending changes.
- Reported success only after saving, with regression tests for global and project configs.
- Recorded the scoop/no-bash startup fix (No bash shell found) in pi-utils
and pi-coding-agent 17.1.4 sections, which were finalized before the fix
commit landed on the release.
- Added resolveWindowsShell to locate Git Bash, scoop installs, and path binaries with a fallback to cmd.exe.
- Updated bash-executor to prevent wrapping user commands in cmd.exe when using fallback shell paths.
- Updated installation script to report optional shell status rather than failing when bash is absent.
- Excluded effective github-copilot URLs from the interleaved beta path so custom-provider and rerouted Copilot hosts don't send the rejected header.
- Covered a custom provider on a Copilot host omitting the beta.
Fixes#6717
- Classified known signing proxies from the resolved request URL instead of materialized model compat.
- Excluded Vertex rawPredict by URL regardless of provider id.
- Covered canonical-model reroutes and custom-provider Vertex routes.
Fixes#6717
- Sent the interleaved-thinking beta for adaptive models on recognized non-official signing endpoints.
- Covered signing and non-signing proxy header behavior.
- Documented the replay failure fix in the AI changelog.
Fixes#6717
Bump CACHE_SCHEMA_VERSION to 12 so upgrades drop cached kimi-code rows
carrying the pre-fix blanket maxTokens=32000. Without this, offline or
fresh-cache refreshes never re-run the discovery mapper, and the
discovery-only k3-256k (absent from the bundle) is not reconciled by
static-fingerprint handling, so the wrong cap persisted until a network
refresh.
Fixes#6711
kimi-code discovery mapModel and the bundled catalog hardcoded
maxTokens=32000 for every model, truncating k3/k3-256k output at ~4x
below their real 131072 ceiling and kimi-for-coding[-highspeed] below
32768. Add kimiCodeMaxTokens() (k3* -> 131072, kimi-for-coding* ->
32768, else fallback), wire it into the discovery mapper and the
generator cap policy, and correct the bundled kimi-code entries.
Fixes#6711
- Stopped dropping /usage limits[] entries with is_active: false. Anthropic marks only the currently binding limit active (an account pinned at a 100% Fable cap reports its 77% shared weekly row as inactive), so is_active signals severity, not bucket existence; filtering on it rendered real utilization as "not reported". Exhaustion gating unchanged: tier rows still hard-block only at confirmed 100% with a future reset.
- Moved the Claude Code fingerprint constants into the leaf module providers/claude-code-fingerprint (star re-exported from providers/anthropic, import paths unchanged). Fixes the providers/anthropic -> stream -> registry -> registry/oauth/anthropic init cycle that TDZ-crashed on claudeCodeVersion whenever providers/anthropic was the first module loaded, which blocked the covering test file.
- getShellConfig returned the module cache before validating customShellPath, so a broken configured shell was silently masked once any earlier caller resolved a shell in the same process; PR #6581's settings-manager tests exposed the ordering under the full suite.
- A differing valid customShellPath now rebuilds the cached config instead of being ignored.
setBeforeSteeringPoll/#beforeSteeringPoll had no callers anywhere at the PR
head (the pre-model-call gate moved to #6543, which does not reference it).
Restores hasSteeringMessages to its synchronous baseline form.
- PR #6513 strips status from sanitized replay items, which made buildResponsesDeltaInput's strict prefix compare treat raw response output items as history mutations and break previous_response_id chaining on every websocket continuation.
- Prefix identity now ignores the status field on both sides; regression covered by the existing openai-codex-stream websocket delta tests.