release: prepare 0.13.2 hotfix set - #4435
Conversation
The broker's process-liveness probe spawned powershell.exe without windowsHide. On Windows 11, where console delegation defaults to Windows Terminal, every probe therefore opened a real terminal window that took focus. The PowerShell path runs whenever the native reader cannot bind the target pid, so a single dead or inaccessible pid turned ~2s liveness polling into a continuous window flash for the life of the broker. Every other internal spawn in the repo already passed windowsHide: true. Lore-id: 7c41e9a2 Confidence: high Scope-risk: narrow Reversibility: safe Tested: spawn options carry windowsHide when the native reader cannot bind the pid Not-tested: real Windows Terminal window suppression, which has no automatable seam
…session remnants A leaf subagent's managed output publication ran its whole staging chain (create/write/fsync/no-replace rename) synchronously on the agent's main thread. When rename(2) stalls in the kernel — oversized APFS directory namespaces on macOS — the resident event loop froze: orchestrator, sibling subagents, and every Bun.sleep-based subagent await timeout starved, so long orchestration runs hung silently with no error and no receipt (#4394). The async publishManagedFileNoReplace chain now runs on the libuv blocking pool through async FileHandle operations and two new native boundaries, renameNoReplacePathAsync/linkNoReplacePathAsync, that wrap the existing checked no-replace primitives in the crate's established blocking-task pool. A kernel-blocked rename now occupies one pool thread while timers and siblings keep running; a hung publication degrades to one unresolved receipt with the child .jsonl transcript still the source of truth. The same unbounded remnant growth that made the kernel hang probable is now bounded where it grows: scrubbed write-protocol remnants (zero-byte, single-link, age-gated, terminal prefixes only) are reaped inside per-session descendant directories by a throttled, serialized, batch- yielding best-effort reaper scheduled from each bound ManagedSessionDescendantStore before mutations — previously reaping ran only at managed scope resolution and never visited per-session dirs. Atomic no-replace semantics, staging identity verification, owner-only security checks, replacement cleanup receipts, and crash recovery are unchanged; the synchronous publication path is byte-identical. Lore-id: 4394a01 Constraint: preserve atomic no-replace, receipt, provenance, and crash-recovery guarantees Constraint: no redesign of the retained-authority (Linux) publication path Rejected: worker-thread publication | authority/security context cannot transfer cheaply; broad redesign Rejected: wall-clock watchdog only | cannot fire while the loop is blocked in a syscall Confidence: high Scope-risk: narrow Reversibility: revert-clean Tested: async publication parity/conflict/liveness, remnant reaper filters/boundedness/store scheduling, managed output generation end-to-end, neighboring session/task suites, cargo path_identity suite, check:rs Not-tested: macOS kernel-block repro (platform-gated; contract evidence is platform-independent)
Foreground managed Bash raced completion against an uncancellable Bun.sleep. When the command won, the losing sleep retained the compiled process until the full command timeout, making print and subagent sessions appear hung after completion. Use an owned timer and clear it at every race exit. Lore-id: bash-deadline-exit-4256 Constraint: preserve explicit and automatic background transitions Rejected: force process exit | masks other live resources and breaks embedders Confidence: high Scope-risk: narrow Reversibility: easy Tested: 3 repeated compiled print-mode Bash exits and 2 subagent-path exits
…ocks (#4247) clear_thinking_20251015 strips thinking text server-side but leaves the original signature in the persisted block. Replaying that block sends {thinking: "", signature: "<stale>"} which Anthropic rejects with `thinking ... cannot be modified` on every subsequent turn — a deterministic 400, not an intermittent one. Two complementary fixes: 1. transform-messages.ts: gate the signed-empty thinking preservation on API. Only keep signed-empty blocks for non-anthropic-messages APIs (OpenAI encrypted reasoning). For anthropic-messages, drop them so they never reach the wire. 2. anthropic.ts latestAssistantThinkingIsUnreplayable: treat signed-empty thinking as unreplayable on signing endpoints. This makes the pre-emptive local degrade fire for the latest assistant turn, avoiding a 400 round trip to discover the condition. The fix does not strip valid signed thinking (non-empty text + signature) or weaken provider constraints. Non-signing endpoints (DeepSeek, Z.AI) are unaffected. Regression tests cover: clear_thinking emptied historical blocks, signed-empty on latest turn, valid signatures preserved, malformed blocks (unsigned-empty, whitespace-only), non-Anthropic API preservation (OpenAI Responses encrypted reasoning), and non-signing endpoints. Lore-id: issue-4247 Constraint: must not strip valid signed thinking with non-empty text Constraint: must not affect non-signing endpoints (DeepSeek, Z.AI) Rejected: strip all signatures from empty thinking | would break OpenAI encrypted reasoning Rejected: fix only transform-messages | latest-message case would still 400 once before repair Confidence: high Scope-risk: narrow Reversibility: trivial Tested: transform-messages clear_thinking, anthropic unreplayable thinking, full ai test suite Not-tested: live CPA stack replay (no access) Supersedes: none
* fix(tui): avoid modifyOtherKeys in Apple Terminal Apple Terminal does not support the Kitty keyboard protocol fallback path, and enabling modifyOtherKeys there breaks Hangul IME composition. Keep the harmless capability query but preserve the terminal default keyboard mode. Lore-id: 4d820f25 Confidence: medium Scope-risk: narrow Reversibility: straightforward Tested: bun test packages/tui/test/keyboard-protocol-optout.test.ts; bun run --cwd=packages/tui check:types Not-tested: physical Apple Terminal.app Korean IME reproduction * test(tui): isolate Apple Terminal protocol coverage Clear inherited terminal identity between cases and record the user-visible IME compatibility fix in the package changelog. Lore-id: e7b66c45 Confidence: high Scope-risk: narrow Reversibility: straightforward Tested: bun test packages/tui/test/keyboard-protocol-optout.test.ts; bun run --cwd=packages/tui check:types --------- Co-authored-by: gaebal-gajae (clawdbot) <clawdbot@gaebal-gajae.local>
fix(tui): emit coalesced multi-Esc chunks as individual presses
The async publication backport depends on the structured reaper contract and shared filesystem diagnostics that landed earlier on dev. Preserve that contract on the 0.13.2 baseline so missing directories remain benign and real cleanup failures stay observable. Lore-id: release-0-13-2-remnant-reaper Confidence: high Scope-risk: narrow Reversibility: revert-clean Tested: bun test packages/coding-agent/test/managed-publication-event-loop.test.ts
ACP exact-config sessions own tools-only MCP managers that canonical sub-sessions explicitly reject. Filter those managers at both task spawn paths while preserving reusable plugin MCP inheritance. Co-authored-by: Chaehyeon Lee <chlee1001@naver.com>
handleJsonRpc handled initialize, tools/list, prompts/list,
resources/list and tools/call but had no branch for the MCP `ping`
method, so clients using ping as a liveness probe (e.g. Claude Code)
received `-32601 unknown_method:ping` and kept reconnecting.
Per the MCP spec, ping MUST return an empty result `{}`. The pump's
dispatch already routes ping as a control frame bypassing the
data-concurrency cap (and pump.test.ts already assumes ping returns an
empty result), but the handler never actually answered it.
Add the missing `ping` branch returning `{ result: {} }` and a focused
regression test against the real handleJsonRpc.
Co-authored-by: developjik <developjik@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 51b357ed75
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| - Custom OpenAI-compatible providers can opt into `/fast` forwarding with `compat.supportsServiceTier: true`; first-class OpenCodex discovery enables it automatically so client `service_tier: "priority"` reaches an OpenCodex proxy running in passthrough (`Auto`) mode. | ||
|
|
||
| ### Fixed | ||
| - Foreground Bash calls that finish before their auto-background deadline now cancel that deadline instead of leaving an uncancellable `Bun.sleep()` behind. In print mode the losing sleep kept the compiled CLI alive for the full command timeout after Bash and subagent work had already completed, which appeared as a shutdown hang with no active Node handles. |
There was a problem hiding this comment.
Move the Bash fix back under Unreleased
This new entry was inserted beneath the already released ## [0.13.1] heading, so the 0.13.2 release process will omit the Bash shutdown fix from its release notes while retroactively changing 0.13.1 history. Move it into the Unreleased Fixed section above the 0.13.1 heading.
AGENTS.md reference: AGENTS.md:L188-L188
Useful? React with 👍 / 👎.
A transient Windows sharing violation while reading daemon state or the ownership lock escaped steady heartbeat renewal and terminated Telegram notifications. Keep the owner alive unless authority loss is proven, and always remove the staged sidecar before retrying. Lore-id: release-0-13-2-telegram-heartbeat Confidence: high Scope-risk: narrow Reversibility: revert-clean Tested: notifications Telegram heartbeat containment and staging cleanup
Summary
Prepare the conservative 0.13.2 patch set from dev without importing the broad SDK/notification lifecycle architecture work.
Urgent fixes
toolsOnlyMCP managers from canonical subagents so delegation does not fail/retry during startuppingkeepalives with the standard empty result so clients do not enter reconnect loopsSmall usability fixes
modifyOtherKeysin Apple Terminal (Hangul/CJK composition)/theme <name>switching while keeping bare/themeselector behaviorDeliberately excluded
/credentialand multi-account behavior changesVerification
Passed:
cargo test -p pi-natives path_identity(20 passed)maingit diff --check main..HEADv0.13.2is unused locally and on originKnown baseline gate failures (reproduced on
main, not introduced here):ci:check:full: SDK author template imports exports absent from the current main SDK surfaceNotificationControlServernative export and fixture signature driftThe release script remains intentionally unrun on this branch: it requires
main, performs the final version/changelog mutation, tagsv0.13.2, pushes atomically, and watches release CI after merge.