Skip to content

fix(release): stabilize v0.8.52#2626

Merged
Hmbown merged 3 commits into
mainfrom
codex/v0.8.52-stabilization
Jun 3, 2026
Merged

fix(release): stabilize v0.8.52#2626
Hmbown merged 3 commits into
mainfrom
codex/v0.8.52-stabilization

Conversation

@Hmbown
Copy link
Copy Markdown
Owner

@Hmbown Hmbown commented Jun 3, 2026

Summary

This makes v0.8.52 the corrective release line after the partial/messy v0.8.51 cut. The important release truth is:

Changes in this PR:

  • fixes SiliconFlow-CN CLI/TUI/config/secrets coverage and keeps it in the shared siliconflow credential slot
  • exposes SiliconFlow-CN in the provider picker/docs and extends provider-registry drift checks for shared provider tables
  • adds stale sub-agent heartbeat auto-cancel with [subagents] heartbeat_timeout_secs defaulting to 300s
  • keeps the Work sidebar from losing checklist/strategy state during transient todo/plan lock misses, harvested narrowly from fix(tui): cache Work panel summary to survive transient mutex misses && fix compile error #2616 with co-author credit
  • hardens legacy SSE MCP reconnect retry when stale sessions surface as closed/reset POST /messages requests
  • carries v0.8.52 changelog/release notes with contributor credit for the reports and PRs involved

I also left maintainer notes on the PRs/issues most affected by the messy landing or this overnight triage: #2584, #2587, #2588, #2603, #2606, #2614, #2616, #2617, #2618, #2619, #2620, #2621, #2623, #2624, #2625, and #2627.

Release handling

  • Cargo: dry-run passes. After merge, publish 0.8.52 from main in workspace order.
  • npm: wait until the v0.8.52 GitHub release assets/checksums exist, then publish the npm wrapper so installs can download the matching binaries.
  • v0.8.51: treat as a partial/bad release line and point users to 0.8.52.

Validation

  • cargo fmt --all -- --check
  • python3 scripts/check-provider-registry.py
  • bash scripts/release/check-versions.sh
  • bash scripts/release/verify-workspace-version.sh 0.8.52
  • cmp -s CHANGELOG.md crates/tui/CHANGELOG.md
  • npm test in npm/codewhale (22/22)
  • cargo check --workspace --all-features --locked
  • cargo clippy --workspace --all-targets --all-features --locked -- -D warnings
  • cargo test -p codewhale-tui sidebar_work_summary --all-features --locked (4/4)
  • cargo test -p codewhale-tui work_panel --all-features --locked (4/4)
  • cargo test --workspace --all-features --locked (codewhale-tui: 3941 passed, 4 ignored; full workspace/doc tests passed)
  • bash scripts/release/publish-crates.sh dry-run

Notes

The dependent crates report package verification rather than full upload dry-run until their internal 0.8.52 dependencies exist on crates.io; the independent crates package, verify, and reach the dry-run upload step successfully.

Copy link
Copy Markdown
Contributor

@greptile-apps greptile-apps Bot left a comment

Choose a reason for hiding this comment

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

Hmbown has reached the 50-review limit for trial accounts. To continue receiving code reviews, upgrade your plan.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

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 bumps the project version to 0.8.52 and introduces a stale sub-agent heartbeat auto-cancellation mechanism to release concurrency slots when a child agent stops making progress. It also adds support for the SiliconFlow China region provider (siliconflow-CN) and ensures legacy SSE MCP reconnects are retryable. A critical issue was identified in the sub-agent auto-cancellation logic: aborting a sub-agent's task prevents a completion event from being sent, which can lead to a high-CPU busy loop or state desync in the engine's turn loop.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +1061 to 1074
() = tokio::time::sleep(self.config.subagent_heartbeat_timeout) => {
let auto_cancelled = {
let mut mgr = self.subagent_manager.write().await;
mgr.cleanup(std::time::Duration::from_secs(60 * 60))
};
if auto_cancelled > 0 {
let _ = self
.tx_event
.send(Event::status(format!(
"Auto-cancelled {auto_cancelled} stale sub-agent(s) after no progress"
)))
.await;
}
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

critical

Potential Busy Loop and State Desync on Sub-Agent Auto-Cancellation

When a stale sub-agent is auto-cancelled in cleanup, its task handle is aborted (handle.abort()). Because the task is terminated abruptly, the code at the end of run_subagent that sends the completion message to tx_subagent_completion is never executed.

As a result, the Engine's turn loop waiting in turn_loop.rs never receives a SubAgentCompletion for the cancelled sub-agent. Since completions remains empty and running_count() becomes 0, the inner wait loop breaks. However, because the turn state is never updated with a completion for this sub-agent, the outer 'turn_loop will continue to the next iteration in an inconsistent state. This can lead to:

  1. A high-CPU busy loop: Since should_hold_turn_for_subagents(0, 0) is false, it immediately breaks the wait loop and continues, spinning indefinitely on the CPU.
  2. A permanent hang/state desync: The engine still thinks the sub-agent is active/pending because it never received a completion.

Recommended Solution

  1. Modify cleanup in SubAgentManager to return the list of IDs of the auto-cancelled sub-agents (e.g., Vec<String>).
  2. In turn_loop.rs, when auto-cancelled sub-agents are detected, construct and push corresponding SubAgentCompletion objects into completions, and then break the inner loop so they are processed normally by the engine.
                            () = tokio::time::sleep(self.config.subagent_heartbeat_timeout) => {
                                let cancelled_ids = {
                                    let mut mgr = self.subagent_manager.write().await;
                                    mgr.cleanup_and_get_cancelled(std::time::Duration::from_secs(60 * 60))
                                };
                                if !cancelled_ids.is_empty() {
                                    let _ = self
                                        .tx_event
                                        .send(Event::status(format!(
                                            "Auto-cancelled {} stale sub-agent(s) after no progress",
                                            cancelled_ids.len()
                                        )))
                                        .await;
                                    for id in cancelled_ids {
                                        completions.push(SubAgentCompletion {
                                            agent_id: id,
                                            result: SubAgentResult::Cancelled, // Adjust to match actual SubAgentResult variants
                                        });
                                    }
                                    break;
                                }
                            }

Copy link
Copy Markdown
Contributor

@greptile-apps greptile-apps Bot left a comment

Choose a reason for hiding this comment

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

Hmbown has reached the 50-review limit for trial accounts. To continue receiving code reviews, upgrade your plan.

Co-authored-by: Hanmiao Li <894876246@qq.com>
Copy link
Copy Markdown
Contributor

@greptile-apps greptile-apps Bot left a comment

Choose a reason for hiding this comment

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

Hmbown has reached the 50-review limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@Hmbown Hmbown merged commit c8ce2b8 into main Jun 3, 2026
14 checks passed
@Hmbown Hmbown deleted the codex/v0.8.52-stabilization branch June 3, 2026 17:07
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