Skip to content

chore(release): prepare maintained v0.29.0.3 - #14

Merged
swear01 merged 0 commit into
mainfrom
release/v0.29.0.3
Sep 2, 2026
Merged

chore(release): prepare maintained v0.29.0.3#14
swear01 merged 0 commit into
mainfrom
release/v0.29.0.3

Conversation

@swear01

@swear01 swear01 commented Sep 2, 2026

Copy link
Copy Markdown
Owner

Summary

Validation

  • bun typecheck: passed for every package
  • bun run test: 8,093 passed, 16 skipped, 0 failed
  • bun run test:cli:integration: 13 passed, 1 skipped
  • python3 -m unittest discover -s tools/maintenance/tests -p "test_*.py": 42 passed
  • full upstream-first isolated rehearsal: passed; replay tree matched 46f87665c718a05de7faccb1ebc67ccdfb3b2555
  • macOS Playwright run: 18 passed; 5 platform snapshot/clipboard failures reproduced unchanged at v0.29.0.2, so Linux GitHub CI remains the release gate

Do not tag until the latest exact head has clean GitHub review and CI.

@gemini-code-assist gemini-code-assist 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.

Code Review

This pull request introduces several significant changes, including the implementation of durable upgrade delegation for the runner, support for session-attached jobs, and native history rewind capabilities for Claude sessions. The code review highlights a critical concern regarding the reliability of process tree termination on Windows when using the new upgrade delegation mechanism, suggesting that the current approach might leave orphaned runner processes and lead to resource contention. I have kept this comment as it identifies a potential critical bug.

Comment on lines +123 to +135
const stopped = await killChild(options.child, true).catch(() => false)
let exitTimer: ReturnType<typeof setTimeout> | undefined
try {
await Promise.race([
exitPromise.catch(() => undefined),
new Promise<void>((resolve) => {
exitTimer = setTimeout(resolve, 3_000)
}),
])
} finally {
if (exitTimer) clearTimeout(exitTimer)
}
return { ready: false, safeToFallback: stopped }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

critical

On Windows, reliably killing a process tree, especially one spawned via a .cmd shim, is non-trivial. The detached: useProcessGroup option is not effective on Windows, so there's no guarantee that killChild (presumably killProcessByChildProcess) can terminate the entire process tree started by the upgrade delegate.

If killChild only terminates a wrapper process (like cmd.exe) but leaves the actual runner process orphaned, stopped could become true while the runner is still alive. This would lead to safeToFallback: true, causing the old CLI to start and resulting in multiple runner instances. This could lead to resource contention and unpredictable behavior.

Consider using a more robust method for process tree termination on Windows, such as spawning with taskkill /t /f on the child process's PID.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

This path already uses the proposed Windows mechanism. settleDurableDelegate defaults killChild to killProcessByChildProcess; on Windows that delegates to killProcess, whose killProcessWindows invokes taskkill /T /PID <pid> and prepends /F for this timeout call. It returns false on spawn failure or a nonzero result while the PID remains alive, so safeToFallback remains false in that case. See cli/src/utils/process.ts:72-100 and :206-221. No code change is needed for this finding.

@swear01

swear01 commented Sep 2, 2026

Copy link
Copy Markdown
Owner Author

/gemini review

@gemini-code-assist gemini-code-assist 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.

Code Review

This pull request introduces several major features and robustness improvements across the HAPI CLI and agent runtimes. Key additions include the implementation of a new job command and the session_job MCP tool to manage session-attached, long-running background tasks. It adds native conversation rewind and truncation support for Claude Code (v2.1.223+), along with robust local Claude session summary listing and transcript paging. For Codex and Copilot/Kimi, it introduces support for reasoning effort configuration, context management settings propagation, and live transcript usage scanning. It also hardens the agy hook carrier lifecycle by moving carriers under HAPI_HOME/agy-carriers and implementing boot-scoped, namespace-aware liveness sweeps to prevent over-deletion. Additionally, the PR implements RPC request cancellation via AbortController, structural model error classification for Cursor, and durable upgrade-target delegation with robust readiness checks. There are no review comments to provide feedback on.

@swear01
swear01 merged commit a6a0c03 into main Sep 2, 2026
2 of 3 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.

1 participant