build(sandbox): pin Zed upstream catch-up (764 commits) + silent-agent watchdog - #2896
Merged
lukemarsden merged 2 commits intoJul 29, 2026
Merged
Conversation
Bumps ZED_COMMIT to d1dffb8116, which brings: - The 764-commit upstream Zed catch-up (fork was 41 days behind; now level with upstream/main at b9256fa8f0). Merged in four dated rounds, 12 conflicts resolved, all Helix critical fixes verified intact by a new mechanised drift sweep. - A watchdog for the 2026-07-29 production wedge, where claude-agent-acp accepted a session/prompt and went permanently silent — no Stopped, no error — leaving the Helix interaction in state=waiting forever with nothing surfaced in either UI. Also adds the incident write-up for that wedge. Zed-side validation: cargo check clean; acp_thread 127 pass / 1 documented ignore; external_websocket_sync 55 pass; drift sweep 28/28; dockerized E2E green on the final tree for BOTH agent rounds (17/17 phases each, store validation passed).
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
Collaborator
Author
|
Paired Zed PR: helixml/zed#73 Merge order (per |
…chup-and-silent-agent-watchdog
lukemarsden
deleted the
feat/zed-upstream-catchup-and-silent-agent-watchdog
branch
July 29, 2026 23:37
lukemarsden
added a commit
that referenced
this pull request
Jul 30, 2026
Re-pins to 473a1c7cc2 (helixml/zed main, merge of PR #74) rather than the intermediate branch commit the PR was opened with. The merge commit is content-identical to the tree the E2E validated (git diff f5c77cf39a..473a1c7cc2 is empty), so the validation transfers exactly. Carries, on top of the silence watchdog already pinned by #2896: - interrupt cancels are now targeted, so a cancel racing the creation loop can no longer kill a newer turn (root cause of intermittent Phase 17 failures, and of a user pressing stop-then-retype landing in a stuck interaction) - the silence watchdog judges by thread state rather than a tool-duration guess - three E2E observability repairs: broken grep -c counters, a missing turn-lifecycle/cancel-ordering dump, and a round filter that discarded real Helix interaction ids while reporting them as 'wrong agent'
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pins
ZED_COMMITto the Zed-side upstream catch-up + silent-agent watchdog, and adds the incident write-up.Paired Zed PR: (linked below once opened — opening this one first per the ordering rule in
CLAUDE.md, so CI can never end up pinned at a stale commit if the Zed PR merges first.)What's in the pinned Zed commit
1. 764-commit upstream catch-up. The fork had drifted 41 days behind (last fence
e45e42af6e, 2026-06-18). It is now level withupstream/mainatb9256fa8f0. Merged in four dated rounds rather than one jump, so every conflict is attributable to a bounded upstream window:e45e42af6e..4b7369481d4b7369481d..4a3e0af5324a3e0af532..d23aaeebead23aaeebea..b9256fa8f02. A fix for the 2026-07-29 production wedge (
spt_01kyq6qd8h4wqq2rfasc4b01e9):claude-agent-acpaccepted asession/promptand went permanently silent — noStopped, no error, so nomessage_completedand nochat_response_error. The Helix interaction sat instate=waitingindefinitely with nothing surfaced in either UI. Only a container restart recovered it.Nothing caught it: the
connection.prompt()await is unbounded, and the existing wedge recovery keys on anede_diagnosticerror string that a silent wedge never produces.The fix is a time-to-first-event watchdog, deliberately not a turn timeout — a blanket timeout false-positives on long tool calls, but "zero events since dispatch" is unambiguous. Once the agent emits anything it disarms for the rest of the turn. On expiry it raises a wedge error that feeds the existing force-close → reload → retry machinery rather than a new mechanism. It lives entirely in the Helix-owned crate, so the upstream diff stays at zero.
Validation
cargo check --package zed --features external_websocket_sync— cleancargo test -p acp_thread— 127 passed, 1 ignored (documented Critical Fix fix bug where sdxl finetune is running and base sdxl inference request hangs forever #8 divergence)cargo test -p external_websocket_sync— 55 passedTwo pre-existing breakages repaired (neither caused by this merge)
.gitignoreby an earlier merge — markers and all.cargo test -p acp_threadhad been red since 2026-06-18. An upstream compaction test asserts a displaced turn still delivers itsPromptResponse, which is mutually exclusive with Critical Fix fix bug where sdxl finetune is running and base sdxl inference request hangs forever #8 (cancel()dropssend_taskso a buggy ACP agent can't wedge the next turn). Confirmed failing identically on the pre-merge commit via a worktree, so not a regression. Marked#[ignore]with full rationale; Helix keeps Fix fix bug where sdxl finetune is running and base sdxl inference request hangs forever #8. It hid for six weeks because the rebase checklist only ever ran a single filtered test — the checklist now requires the full suites.Known gaps (documented, not fixed here)
threadIsWedged()insession_handlers.goonly classifiesState == error, so a hungwaitingturn is still invisible to it.e2e-test/run_e2e.shqueries the wrong npm scope for the agent version, so its attribution log line is alwaysunknown.🤖 Generated with Claude Code