Skip to content

release: prepare 0.13.2 hotfix set - #4435

Merged
Yeachan-Heo merged 12 commits into
mainfrom
release/0.13.2
Aug 13, 2026
Merged

release: prepare 0.13.2 hotfix set#4435
Yeachan-Heo merged 12 commits into
mainfrom
release/0.13.2

Conversation

@Yeachan-Heo

@Yeachan-Heo Yeachan-Heo commented Aug 13, 2026

Copy link
Copy Markdown
Owner

Summary

Prepare the conservative 0.13.2 patch set from dev without importing the broad SDK/notification lifecycle architecture work.

Urgent fixes

  • hide the recurring Windows PowerShell console spawned by SDK process-incarnation probes
  • contain transient Windows Telegram heartbeat state/ownership-lock read failures and clean staged sidecars without terminating the daemon
  • move managed transcript publication off the event loop and reap per-session scrubbed remnants
  • cancel completed Bash foreground deadlines so print-mode shutdown does not wait for a losing timer
  • repair Anthropic clear-thinking replay signatures
  • omit ACP exact-config toolsOnly MCP managers from canonical subagents so delegation does not fail/retry during startup
  • answer coordinator MCP ping keepalives with the standard empty result so clients do not enter reconnect loops

Small usability fixes

  • avoid modifyOtherKeys in Apple Terminal (Hangul/CJK composition)
  • preserve prompt suggestions after cancelled selector/actions
  • correctly split coalesced multi-Escape input from tmux/SSH
  • add direct /theme <name> switching while keeping bare /theme selector behavior

Deliberately excluded

  • broad Telegram/SDK Router lifecycle and authority refactors
  • /credential and multi-account behavior changes
  • model-catalog/preset expansions with generated catalog churn
  • SDK wait-window fixes that require the later Router-based CLI architecture
  • the Windows absent-process fallback optimization that requires unrelated Discord/Slack generation state; the user-visible console flash is fixed independently

Verification

Passed:

  • focused Bun regression suites for SDK broker lifecycle, managed publication, Bash lifecycle, subagent MCP inheritance, coordinator MCP keepalive, Telegram heartbeat containment, interactive composer, slash commands, terminal keyboard protocol, stdin buffering, and Anthropic replay
  • cargo test -p pi-natives path_identity (20 passed)
  • Telegram daemon generation guard v43 against main
  • git diff --check main..HEAD
  • confirmed v0.13.2 is unused locally and on origin

Known baseline gate failures (reproduced on main, not introduced here):

  • ci:check:full: SDK author template imports exports absent from the current main SDK surface
  • coding-agent typecheck: existing NotificationControlServer native export and fixture signature drift
  • G002 gate: existing inline/local-tool registry drift

The release script remains intentionally unrun on this branch: it requires main, performs the final version/changelog mutation, tags v0.13.2, pushes atomically, and watches release CI after merge.

Dayoooun and others added 11 commits August 13, 2026 14:23
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>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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
@Yeachan-Heo
Yeachan-Heo merged commit 3211e0d into main Aug 13, 2026
34 of 47 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants